diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000000..50a87fd83923 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,14 @@ +root = true + +[*] +insert_final_newline = false + +[{*.{c,cpp,cc,h,hpp},CMakeLists.txt,Kconfig}] +indent_style = tab +tab_width = 8 +# Not in the official standard, but supported by many editors +max_line_length = 120 + +[*.yaml] +indent_style = space +indent_size = 2 diff --git a/.gitmodules b/.gitmodules index e91cf2b63a14..e443da19a290 100644 --- a/.gitmodules +++ b/.gitmodules @@ -81,5 +81,5 @@ url = https://github.com/PX4/PX4-gazebo-models.git branch = main [submodule "boards/modalai/voxl2/libfc-sensor-api"] - path = src/modules/muorb/apps/libfc-sensor-api + path = boards/modalai/voxl2/libfc-sensor-api url = https://gitlab.com/voxl-public/voxl-sdk/core-libs/libfc-sensor-api.git diff --git a/Tools/astyle/files_to_check_code_style.sh b/Tools/astyle/files_to_check_code_style.sh index 486eac9464ce..734d6f5323d5 100755 --- a/Tools/astyle/files_to_check_code_style.sh +++ b/Tools/astyle/files_to_check_code_style.sh @@ -30,4 +30,5 @@ exec find boards msg src platforms test \ -path src/lib/cdrstream/cyclonedds -prune -o \ -path src/lib/cdrstream/rosidl -prune -o \ -path src/modules/zenoh/zenoh-pico -prune -o \ + -path boards/modalai/voxl2/libfc-sensor-api -prune -o \ -type f \( -name "*.c" -o -name "*.h" -o -name "*.cpp" -o -name "*.hpp" \) | grep $PATTERN diff --git a/Tools/msg/templates/uorb/msg.cpp.em b/Tools/msg/templates/uorb/msg.cpp.em index b77c013b91e1..4ffe4c38d14c 100644 --- a/Tools/msg/templates/uorb/msg.cpp.em +++ b/Tools/msg/templates/uorb/msg.cpp.em @@ -73,9 +73,16 @@ struct_size, padding_end_size = add_padding_bytes(sorted_fields, search_path) #include #include +@{ +queue_length = 1 +for constant in spec.constants: + if constant.name == 'ORB_QUEUE_LENGTH': + queue_length = constant.val +}@ + @[for topic in topics]@ static_assert(static_cast(ORB_ID::@topic) == @(all_topics.index(topic)), "ORB_ID index mismatch"); -ORB_DEFINE(@topic, struct @uorb_struct, @(struct_size-padding_end_size), @(message_hash)u, static_cast(ORB_ID::@topic)); +ORB_DEFINE(@topic, struct @uorb_struct, @(struct_size-padding_end_size), @(message_hash)u, static_cast(ORB_ID::@topic), @queue_length); @[end for] void print_message(const orb_metadata *meta, const @uorb_struct& message) diff --git a/Tools/simulation/gazebo-classic/sitl_gazebo-classic b/Tools/simulation/gazebo-classic/sitl_gazebo-classic index 33ac87a37676..da7206e05770 160000 --- a/Tools/simulation/gazebo-classic/sitl_gazebo-classic +++ b/Tools/simulation/gazebo-classic/sitl_gazebo-classic @@ -1 +1 @@ -Subproject commit 33ac87a37676fb597de110e926bbf0a080169ffe +Subproject commit da7206e057703cc645770f02437013358b71e1c0 diff --git a/Tools/simulation/gz b/Tools/simulation/gz index 222833656802..6b4ed09d1b49 160000 --- a/Tools/simulation/gz +++ b/Tools/simulation/gz @@ -1 +1 @@ -Subproject commit 222833656802532ec2271986a65fd198cfa48259 +Subproject commit 6b4ed09d1b495fbff663f098979cc046df013abd diff --git a/boards/ark/can-flow/firmware.prototype b/boards/ark/can-flow/firmware.prototype index a59e1adca629..fc0df258228e 100644 --- a/boards/ark/can-flow/firmware.prototype +++ b/boards/ark/can-flow/firmware.prototype @@ -4,7 +4,7 @@ "description": "Firmware for the ARK flow board", "image": "", "build_time": 0, - "summary": "ARFFLOW", + "summary": "ARKFLOW", "version": "0.1", "image_size": 0, "image_maxsize": 2080768, diff --git a/boards/ark/fmu-v6x/extras/px4_io-v2_default.bin b/boards/ark/fmu-v6x/extras/px4_io-v2_default.bin index 957f0f13a12e..5a0796406fc1 100755 Binary files a/boards/ark/fmu-v6x/extras/px4_io-v2_default.bin and b/boards/ark/fmu-v6x/extras/px4_io-v2_default.bin differ diff --git a/boards/ark/septentrio-gps/default.px4board b/boards/ark/septentrio-gps/default.px4board index 1480a0b4da05..b62a95d689d5 100644 --- a/boards/ark/septentrio-gps/default.px4board +++ b/boards/ark/septentrio-gps/default.px4board @@ -20,6 +20,7 @@ CONFIG_UAVCANNODE_RTK_DATA=y CONFIG_UAVCANNODE_SAFETY_BUTTON=y CONFIG_UAVCANNODE_STATIC_PRESSURE=y CONFIG_UAVCANNODE_STATIC_TEMPERATURE=y +CONFIG_MODULES_EKF2=y CONFIG_MODULES_GYRO_CALIBRATION=y CONFIG_MODULES_MAG_BIAS_ESTIMATOR=y CONFIG_MODULES_SENSORS=y diff --git a/boards/ark/septentrio-gps/init/rc.board_defaults b/boards/ark/septentrio-gps/init/rc.board_defaults index c50d81602629..0db1234ce96d 100644 --- a/boards/ark/septentrio-gps/init/rc.board_defaults +++ b/boards/ark/septentrio-gps/init/rc.board_defaults @@ -11,3 +11,5 @@ param set-default SENS_IMU_CLPNOTI 0 safety_button start tone_alarm start + +ekf2 start diff --git a/boards/ark/septentrio-gps/nuttx-config/canbootloader/defconfig b/boards/ark/septentrio-gps/nuttx-config/canbootloader/defconfig index 6b3c2c951842..0208af2cac25 100644 --- a/boards/ark/septentrio-gps/nuttx-config/canbootloader/defconfig +++ b/boards/ark/septentrio-gps/nuttx-config/canbootloader/defconfig @@ -50,6 +50,7 @@ CONFIG_STACK_COLORATION=y CONFIG_START_DAY=30 CONFIG_START_MONTH=11 CONFIG_STDIO_DISABLE_BUFFERING=y +CONFIG_STM32_FLASH_CONFIG_G=y CONFIG_STM32_NOEXT_VECTORS=y CONFIG_STM32_TIM8=y CONFIG_TASK_NAME_SIZE=0 diff --git a/boards/ark/septentrio-gps/nuttx-config/nsh/defconfig b/boards/ark/septentrio-gps/nuttx-config/nsh/defconfig index 81007d30a44f..176ae3eccc5b 100644 --- a/boards/ark/septentrio-gps/nuttx-config/nsh/defconfig +++ b/boards/ark/septentrio-gps/nuttx-config/nsh/defconfig @@ -123,6 +123,7 @@ CONFIG_STM32_ADC1=y CONFIG_STM32_DISABLE_IDLE_SLEEP_DURING_DEBUG=y CONFIG_STM32_DMA1=y CONFIG_STM32_DMA2=y +CONFIG_STM32_FLASH_CONFIG_G=y CONFIG_STM32_FLASH_PREFETCH=y CONFIG_STM32_FLOWCONTROL_BROKEN=y CONFIG_STM32_I2C1=y diff --git a/boards/ark/septentrio-gps/nuttx-config/scripts/canbootloader_script.ld b/boards/ark/septentrio-gps/nuttx-config/scripts/canbootloader_script.ld index cbf9fddc32dc..48a59fe92d0e 100644 --- a/boards/ark/septentrio-gps/nuttx-config/scripts/canbootloader_script.ld +++ b/boards/ark/septentrio-gps/nuttx-config/scripts/canbootloader_script.ld @@ -33,7 +33,7 @@ * ****************************************************************************/ -/* The STM32F412 has 512Kb of FLASH beginning at address 0x0800:0000 and +/* The STM32F412 has 1M of FLASH beginning at address 0x0800:0000 and * 256Kb of SRAM. SRAM is split up into three blocks: * * 1) 112Kb of SRAM beginning at address 0x2000:0000 diff --git a/boards/ark/septentrio-gps/nuttx-config/scripts/script.ld b/boards/ark/septentrio-gps/nuttx-config/scripts/script.ld index d8573d2bcdde..2f4769b8f5b4 100644 --- a/boards/ark/septentrio-gps/nuttx-config/scripts/script.ld +++ b/boards/ark/septentrio-gps/nuttx-config/scripts/script.ld @@ -33,7 +33,7 @@ * ****************************************************************************/ -/* The STM32F412 has 512Kb of FLASH beginning at address 0x0800:0000 and +/* The STM32F412 has 1M of FLASH beginning at address 0x0800:0000 and * 256Kb of SRAM. SRAM is split up into three blocks: * * 1) 112Kb of SRAM beginning at address 0x2000:0000 diff --git a/boards/atl/mantis-edu/src/board_config.h b/boards/atl/mantis-edu/src/board_config.h index 8b8a99b12e86..f589a6b728f8 100644 --- a/boards/atl/mantis-edu/src/board_config.h +++ b/boards/atl/mantis-edu/src/board_config.h @@ -64,9 +64,6 @@ // Hacks for MAVLink RC button input #define ATL_MANTIS_RC_INPUT_HACKS -// Hacks for MAVLink RC button input -#define ATL_MANTIS_RC_INPUT_HACKS - /* * ADC channels * diff --git a/boards/cubepilot/cubeorange/extras/cubepilot_io-v2_default.bin b/boards/cubepilot/cubeorange/extras/cubepilot_io-v2_default.bin index 4d29f3a04155..b7fcd9dab24c 100755 Binary files a/boards/cubepilot/cubeorange/extras/cubepilot_io-v2_default.bin and b/boards/cubepilot/cubeorange/extras/cubepilot_io-v2_default.bin differ diff --git a/boards/cubepilot/cubeyellow/extras/cubepilot_io-v2_default.bin b/boards/cubepilot/cubeyellow/extras/cubepilot_io-v2_default.bin index 4d29f3a04155..b7fcd9dab24c 100755 Binary files a/boards/cubepilot/cubeyellow/extras/cubepilot_io-v2_default.bin and b/boards/cubepilot/cubeyellow/extras/cubepilot_io-v2_default.bin differ diff --git a/boards/holybro/durandal-v1/extras/px4_io-v2_default.bin b/boards/holybro/durandal-v1/extras/px4_io-v2_default.bin index 957f0f13a12e..5a0796406fc1 100755 Binary files a/boards/holybro/durandal-v1/extras/px4_io-v2_default.bin and b/boards/holybro/durandal-v1/extras/px4_io-v2_default.bin differ diff --git a/boards/holybro/pix32v5/extras/px4_io-v2_default.bin b/boards/holybro/pix32v5/extras/px4_io-v2_default.bin index 957f0f13a12e..5a0796406fc1 100755 Binary files a/boards/holybro/pix32v5/extras/px4_io-v2_default.bin and b/boards/holybro/pix32v5/extras/px4_io-v2_default.bin differ diff --git a/boards/modalai/fc-v2/default.px4board b/boards/modalai/fc-v2/default.px4board index be01cfa93415..c4e7d3649597 100644 --- a/boards/modalai/fc-v2/default.px4board +++ b/boards/modalai/fc-v2/default.px4board @@ -60,7 +60,7 @@ CONFIG_MODULES_NAVIGATOR=y CONFIG_MODULES_RC_UPDATE=y CONFIG_MODULES_ROVER_POS_CONTROL=y CONFIG_MODULES_SENSORS=y -CONFIG_MODULES_SIMULATION_SIMULATOR_SIH=y +# CONFIG_MODULES_SIMULATION_SIMULATOR_SIH=y CONFIG_MODULES_TEMPERATURE_COMPENSATION=y CONFIG_MODULES_UXRCE_DDS_CLIENT=y CONFIG_MODULES_VTOL_ATT_CONTROL=y diff --git a/boards/modalai/voxl2-slpi/default.px4board b/boards/modalai/voxl2-slpi/default.px4board index 23cf292adedb..b6ce6133fcdf 100644 --- a/boards/modalai/voxl2-slpi/default.px4board +++ b/boards/modalai/voxl2-slpi/default.px4board @@ -4,6 +4,8 @@ CONFIG_DRIVERS_ACTUATORS_VOXL_ESC=y CONFIG_DRIVERS_BAROMETER_INVENSENSE_ICP101XX=y CONFIG_DRIVERS_DISTANCE_SENSOR_VL53L0X=y CONFIG_DRIVERS_DISTANCE_SENSOR_VL53L1X=y +CONFIG_DRIVERS_GPS=y +CONFIG_DRIVERS_IMU_INVENSENSE_ICM42688P=y CONFIG_DRIVERS_LIGHTS_RGBLED_NCP5623C=y CONFIG_DRIVERS_MAGNETOMETER_ISENTEK_IST8308=y CONFIG_DRIVERS_MAGNETOMETER_ISENTEK_IST8310=y @@ -29,3 +31,4 @@ CONFIG_MODULES_SIMULATION_PWM_OUT_SIM=y CONFIG_SYSTEMCMDS_UORB=y CONFIG_SYSTEMCMDS_PARAM=y CONFIG_ORB_COMMUNICATOR=y +CONFIG_PARAM_REMOTE=y diff --git a/boards/modalai/voxl2-slpi/src/CMakeLists.txt b/boards/modalai/voxl2-slpi/src/CMakeLists.txt index f23a75ebf115..bb35ef068a33 100644 --- a/boards/modalai/voxl2-slpi/src/CMakeLists.txt +++ b/boards/modalai/voxl2-slpi/src/CMakeLists.txt @@ -44,7 +44,6 @@ add_library(drivers_board ) # Add custom drivers for SLPI -# add_subdirectory(${PX4_BOARD_DIR}/src/drivers/icm42688p) add_subdirectory(${PX4_BOARD_DIR}/src/drivers/rc_controller) add_subdirectory(${PX4_BOARD_DIR}/src/drivers/mavlink_rc_in) # add_subdirectory(${PX4_BOARD_DIR}/src/drivers/spektrum_rc) diff --git a/boards/modalai/voxl2-slpi/src/drivers/dsp_hitl/dsp_hitl.cpp b/boards/modalai/voxl2-slpi/src/drivers/dsp_hitl/dsp_hitl.cpp index 37abacd66672..b26f56508216 100644 --- a/boards/modalai/voxl2-slpi/src/drivers/dsp_hitl/dsp_hitl.cpp +++ b/boards/modalai/voxl2-slpi/src/drivers/dsp_hitl/dsp_hitl.cpp @@ -62,6 +62,8 @@ #include #include #include +#include +#include #include #include @@ -88,21 +90,22 @@ static bool _is_running = false; volatile bool _task_should_exit = false; static px4_task_t _task_handle = -1; int _uart_fd = -1; -bool debug = false; +bool _debug = false; std::string port = "2"; int baudrate = 921600; const unsigned mode_flag_custom = 1; const unsigned mode_flag_armed = 128; -bool _send_gps = false; bool _send_mag = false; +bool _send_distance = false; uORB::Publication _battery_pub{ORB_ID(battery_status)}; uORB::PublicationMulti _sensor_gps_pub{ORB_ID(sensor_gps)}; -uORB::Publication _differential_pressure_pub{ORB_ID(differential_pressure)}; uORB::Publication _visual_odometry_pub{ORB_ID(vehicle_visual_odometry)}; uORB::Publication _mocap_odometry_pub{ORB_ID(vehicle_mocap_odometry)}; uORB::PublicationMulti _sensor_baro_pub{ORB_ID(sensor_baro)}; uORB::Publication _esc_status_pub{ORB_ID(esc_status)}; +uORB::Publication _distance_sensor_pub{ORB_ID(distance_sensor)}; +uORB::Publication _sensor_optical_flow_pub{ORB_ID(sensor_optical_flow)}; uORB::Subscription _battery_status_sub{ORB_ID(battery_status)}; int32_t _output_functions[actuator_outputs_s::NUM_ACTUATOR_OUTPUTS] {}; @@ -128,13 +131,42 @@ float x_gyro = 0; float y_gyro = 0; float z_gyro = 0; uint64_t gyro_accel_time = 0; -bool _use_software_mav_throttling{false}; -int heartbeat_counter = 0; -int imu_counter = 0; -int hil_sensor_counter = 0; -int vision_msg_counter = 0; -int gps_counter = 0; +// Status counters +uint32_t heartbeat_received_counter = 0; +uint32_t heartbeat_sent_counter = 0; +uint32_t imu_counter = 0; +uint32_t hil_sensor_counter = 0; +uint32_t mag_counter = 0; +uint32_t baro_counter = 0; +uint32_t actuator_sent_counter = 0; +uint32_t odometry_received_counter = 0; +uint32_t odometry_sent_counter = 0; +uint32_t gps_received_counter = 0; +uint32_t gps_sent_counter = 0; +uint32_t distance_received_counter = 0; +uint32_t distance_sent_counter = 0; +uint32_t flow_received_counter = 0; +uint32_t flow_sent_counter = 0; +uint32_t unknown_msg_received_counter = 0; + +enum class position_source {GPS, VIO, FLOW, NUM_POSITION_SOURCES}; + +struct position_source_data_s { + char label[8]; + bool send; + bool fail; + uint32_t failure_duration; + uint64_t failure_duration_start; +} position_source_data[(int) position_source::NUM_POSITION_SOURCES] = { + {"GPS", false, false, 0, 0}, + {"VIO", false, false, 0, 0}, + {"FLOW", false, false, 0, 0} +}; + +uint64_t first_sensor_msg_timestamp = 0; +uint64_t first_sensor_report_timestamp = 0; +uint64_t last_sensor_report_timestamp = 0; vehicle_status_s _vehicle_status{}; vehicle_control_mode_s _control_mode{}; @@ -144,7 +176,6 @@ battery_status_s _battery_status{}; sensor_accel_fifo_s accel_fifo{}; sensor_gyro_fifo_s gyro_fifo{}; - int openPort(const char *dev, speed_t speed); int closePort(); @@ -153,7 +184,8 @@ int writeResponse(void *buf, size_t len); int start(int argc, char *argv[]); int stop(); -int get_status(); +void print_status(); +void clear_status_counters(); bool isOpen() { return _uart_fd >= 0; }; void usage(); @@ -163,50 +195,65 @@ void *send_actuator(void *); void send_actuator_data(); void handle_message_hil_sensor_dsp(mavlink_message_t *msg); +void handle_message_hil_optical_flow(mavlink_message_t *msg); +void handle_message_distance_sensor(mavlink_message_t *msg); void handle_message_hil_gps_dsp(mavlink_message_t *msg); void handle_message_odometry_dsp(mavlink_message_t *msg); -void handle_message_vision_position_estimate_dsp(mavlink_message_t *msg); void handle_message_command_long_dsp(mavlink_message_t *msg); void handle_message_dsp(mavlink_message_t *msg); void actuator_controls_from_outputs_dsp(mavlink_hil_actuator_controls_t *msg); -void send_esc_telemetry_dsp(mavlink_hil_actuator_controls_t hil_act_control); +void send_esc_status(mavlink_hil_actuator_controls_t hil_act_control); void handle_message_dsp(mavlink_message_t *msg) { switch (msg->msgid) { case MAVLINK_MSG_ID_HIL_SENSOR: + hil_sensor_counter++; handle_message_hil_sensor_dsp(msg); break; case MAVLINK_MSG_ID_HIL_GPS: - if (_send_gps) { handle_message_hil_gps_dsp(msg); } + gps_received_counter++; - break; + if (position_source_data[(int) position_source::GPS].send) { handle_message_hil_gps_dsp(msg); } - case MAVLINK_MSG_ID_VISION_POSITION_ESTIMATE: - handle_message_vision_position_estimate_dsp(msg); break; case MAVLINK_MSG_ID_ODOMETRY: - handle_message_odometry_dsp(msg); - break; + odometry_received_counter++; + + if (position_source_data[(int) position_source::VIO].send) { handle_message_odometry_dsp(msg); } - case MAVLINK_MSG_ID_COMMAND_LONG: - handle_message_command_long_dsp(msg); break; case MAVLINK_MSG_ID_HEARTBEAT: - PX4_DEBUG("Heartbeat msg received"); + heartbeat_received_counter++; + + if (_debug) { PX4_INFO("Heartbeat msg received"); } + break; - case MAVLINK_MSG_ID_SYSTEM_TIME: - PX4_DEBUG("MAVLINK SYSTEM TIME"); + case MAVLINK_MSG_ID_HIL_OPTICAL_FLOW: + flow_received_counter++; + + if (position_source_data[(int) position_source::FLOW].send) { handle_message_hil_optical_flow(msg); } + + break; + + case MAVLINK_MSG_ID_DISTANCE_SENSOR: + distance_received_counter++; + + if (_send_distance) { handle_message_distance_sensor(msg); } + break; default: - PX4_DEBUG("Unknown msg ID: %d", msg->msgid); + unknown_msg_received_counter++; + + if (_debug) { PX4_INFO("Unknown msg ID: %d", msg->msgid); } + break; } } @@ -228,7 +275,6 @@ void send_actuator_data() bool first_sent = false; while (true) { - bool controls_updated = false; (void) orb_check(_vehicle_control_mode_sub_, &controls_updated); @@ -239,45 +285,50 @@ void send_actuator_data() bool actuator_updated = false; (void) orb_check(_actuator_outputs_sub, &actuator_updated); + uint8_t newBuf[512]; + uint16_t newBufLen = 0; + + mavlink_hil_actuator_controls_t hil_act_control; + actuator_controls_from_outputs_dsp(&hil_act_control); + + mavlink_message_t message{}; + mavlink_msg_hil_actuator_controls_encode(1, 1, &message, &hil_act_control); + if (actuator_updated) { orb_copy(ORB_ID(actuator_outputs), _actuator_outputs_sub, &_actuator_outputs); - px4_lockstep_wait_for_components(); if (_actuator_outputs.timestamp > 0) { - mavlink_hil_actuator_controls_t hil_act_control; - actuator_controls_from_outputs_dsp(&hil_act_control); - - mavlink_message_t message{}; - mavlink_msg_hil_actuator_controls_encode(1, 1, &message, &hil_act_control); previous_timestamp = _actuator_outputs.timestamp; previous_uorb_timestamp = _actuator_outputs.timestamp; - uint8_t newBuf[512]; - uint16_t newBufLen = 0; + newBufLen = mavlink_msg_to_send_buffer(newBuf, &message); int writeRetval = writeResponse(&newBuf, newBufLen); - PX4_DEBUG("Succesful write of actuator back to jMAVSim: %d at %llu", writeRetval, hrt_absolute_time()); + + actuator_sent_counter++; + + if (_debug) { PX4_INFO("Succesful write of actuator back to jMAVSim: %d at %llu", writeRetval, hrt_absolute_time()); } + first_sent = true; - send_esc_telemetry_dsp(hil_act_control); + + send_esc_status(hil_act_control); } - } else if (!actuator_updated && first_sent && differential > 4000) { - mavlink_hil_actuator_controls_t hil_act_control; - actuator_controls_from_outputs_dsp(&hil_act_control); + } else if (! actuator_updated && first_sent && differential > 4000) { previous_timestamp = hrt_absolute_time(); - mavlink_message_t message{}; - mavlink_msg_hil_actuator_controls_encode(1, 1, &message, &hil_act_control); - uint8_t newBuf[512]; - uint16_t newBufLen = 0; newBufLen = mavlink_msg_to_send_buffer(newBuf, &message); int writeRetval = writeResponse(&newBuf, newBufLen); - //PX4_INFO("Sending from NOT UPDTE AND TIMEOUT: %i", differential); - PX4_DEBUG("Succesful write of actuator back to jMAVSim: %d at %llu", writeRetval, hrt_absolute_time()); - send_esc_telemetry_dsp(hil_act_control); + actuator_sent_counter++; + + if (_debug) { PX4_INFO("Succesful write of actuator back to jMAVSim: %d at %llu", writeRetval, hrt_absolute_time()); } + + send_esc_status(hil_act_control); } differential = hrt_absolute_time() - previous_timestamp; + + px4_usleep(1000); } } @@ -287,14 +338,10 @@ void task_main(int argc, char *argv[]) int myoptind = 1; const char *myoptarg = nullptr; - while ((ch = px4_getopt(argc, argv, "vsdcmgp:b:", &myoptind, &myoptarg)) != EOF) { + while ((ch = px4_getopt(argc, argv, "odmghfp:b:", &myoptind, &myoptarg)) != EOF) { switch (ch) { - case 's': - _use_software_mav_throttling = true; - break; - case 'd': - debug = true; + _debug = true; break; case 'p': @@ -310,7 +357,19 @@ void task_main(int argc, char *argv[]) break; case 'g': - _send_gps = true; + position_source_data[(int) position_source::GPS].send = true; + break; + + case 'o': + position_source_data[(int) position_source::VIO].send = true; + break; + + case 'h': + _send_distance = true; + break; + + case 'f': + position_source_data[(int) position_source::FLOW].send = true; break; default: @@ -319,11 +378,13 @@ void task_main(int argc, char *argv[]) } const char *charport = port.c_str(); - int openRetval = openPort(charport, (speed_t) baudrate); - int open = isOpen(); + (void) openPort(charport, (speed_t) baudrate); - if (open) { - PX4_ERR("Port is open: %d", openRetval); + if ((_debug) && (isOpen())) { PX4_INFO("DSP HITL serial port initialized. Baudrate: %d", baudrate); } + + if (! isOpen()) { + PX4_ERR("DSP HITL failed to open serial port"); + return; } uint64_t last_heartbeat_timestamp = hrt_absolute_time(); @@ -342,14 +403,11 @@ void task_main(int argc, char *argv[]) pthread_attr_destroy(&sender_thread_attr); int _vehicle_status_sub = orb_subscribe(ORB_ID(vehicle_status)); - PX4_INFO("Got %d from orb_subscribe", _vehicle_status_sub); _is_running = true; while (!_task_should_exit) { - uint8_t rx_buf[1024]; - //rx_buf[511] = '\0'; uint64_t timestamp = hrt_absolute_time(); @@ -357,8 +415,8 @@ void task_main(int argc, char *argv[]) if (got_first_sensor_msg) { uint64_t delta_time = timestamp - last_imu_update_timestamp; - if (delta_time > 15000) { - PX4_ERR("Sending updates at %llu, delta %llu", timestamp, delta_time); + if ((imu_counter) && (delta_time > 15000)) { + PX4_WARN("Sending updates at %llu, delta %llu", timestamp, delta_time); } uint64_t _px4_gyro_accel_timestamp = hrt_absolute_time(); @@ -396,7 +454,7 @@ void task_main(int argc, char *argv[]) hb_newBufLen = mavlink_msg_to_send_buffer(hb_newBuf, &hb_message); (void) writeResponse(&hb_newBuf, hb_newBufLen); last_heartbeat_timestamp = timestamp; - heartbeat_counter++; + heartbeat_sent_counter++; } bool vehicle_updated = false; @@ -416,7 +474,7 @@ void task_main(int argc, char *argv[]) _is_running = false; } -void send_esc_telemetry_dsp(mavlink_hil_actuator_controls_t hil_act_control) +void send_esc_status(mavlink_hil_actuator_controls_t hil_act_control) { esc_status_s esc_status{}; esc_status.timestamp = hrt_absolute_time(); @@ -448,17 +506,13 @@ void send_esc_telemetry_dsp(mavlink_hil_actuator_controls_t hil_act_control) _esc_status_pub.publish(esc_status); } - void handle_message_command_long_dsp(mavlink_message_t *msg) { - /* command */ mavlink_command_long_t cmd_mavlink; mavlink_msg_command_long_decode(msg, &cmd_mavlink); - if (debug) { - PX4_INFO("Value of command_long.command: %d", cmd_mavlink.command); - } + if (_debug) { PX4_INFO("Value of command_long.command: %d", cmd_mavlink.command); } mavlink_command_ack_t ack = {}; ack.result = MAV_RESULT_UNSUPPORTED; @@ -470,46 +524,140 @@ handle_message_command_long_dsp(mavlink_message_t *msg) uint16_t acknewBufLen = 0; acknewBufLen = mavlink_msg_to_send_buffer(acknewBuf, &ack_message); int writeRetval = writeResponse(&acknewBuf, acknewBufLen); - PX4_INFO("Succesful write of ACK back over UART: %d at %llu", writeRetval, hrt_absolute_time()); + + if (_debug) { PX4_INFO("Succesful write of ACK back over UART: %d at %llu", writeRetval, hrt_absolute_time()); } } +int flow_debug_counter = 0; + void -handle_message_vision_position_estimate_dsp(mavlink_message_t *msg) +handle_message_hil_optical_flow(mavlink_message_t *msg) { - mavlink_vision_position_estimate_t vpe; - mavlink_msg_vision_position_estimate_decode(msg, &vpe); + mavlink_hil_optical_flow_t flow; + mavlink_msg_hil_optical_flow_decode(msg, &flow); - // fill vehicle_odometry from Mavlink VISION_POSITION_ESTIMATE - vehicle_odometry_s odom{}; - uint64_t timestamp = hrt_absolute_time(); - odom.timestamp_sample = timestamp; + if ((_debug) && (!(flow_debug_counter % 10))) { + PX4_INFO("optflow: time: %llu, quality %d", flow.time_usec, (int) flow.quality); + PX4_INFO("optflow: x: %.2f y: %.2f", (double) flow.integrated_x, (double) flow.integrated_y); + } + + flow_debug_counter++; - odom.pose_frame = vehicle_odometry_s::POSE_FRAME_NED; - odom.position[0] = vpe.x; - odom.position[1] = vpe.y; - odom.position[2] = vpe.z; + device::Device::DeviceId device_id; + device_id.devid_s.bus_type = device::Device::DeviceBusType::DeviceBusType_MAVLINK; + device_id.devid_s.bus = 1; + device_id.devid_s.address = msg->sysid; + device_id.devid_s.devtype = DRV_FLOW_DEVTYPE_SIM; - const matrix::Quatf q(matrix::Eulerf(vpe.roll, vpe.pitch, vpe.yaw)); - q.copyTo(odom.q); + sensor_optical_flow_s sensor_optical_flow{}; - // VISION_POSITION_ESTIMATE covariance - // Row-major representation of pose 6x6 cross-covariance matrix upper right triangle - // (states: x, y, z, roll, pitch, yaw; first six entries are the first ROW, next five entries are the second ROW, etc.). - // If unknown, assign NaN value to first element in the array. - odom.position_variance[0] = vpe.covariance[0]; // X row 0, col 0 - odom.position_variance[1] = vpe.covariance[6]; // Y row 1, col 1 - odom.position_variance[2] = vpe.covariance[11]; // Z row 2, col 2 + sensor_optical_flow.timestamp_sample = hrt_absolute_time(); + sensor_optical_flow.device_id = device_id.devid; - odom.orientation_variance[0] = vpe.covariance[15]; // R row 3, col 3 - odom.orientation_variance[1] = vpe.covariance[18]; // P row 4, col 4 - odom.orientation_variance[2] = vpe.covariance[20]; // Y row 5, col 5 + sensor_optical_flow.pixel_flow[0] = flow.integrated_x; + sensor_optical_flow.pixel_flow[1] = flow.integrated_y; - odom.reset_counter = vpe.reset_counter; + sensor_optical_flow.integration_timespan_us = flow.integration_time_us; + sensor_optical_flow.quality = flow.quality; - odom.timestamp = hrt_absolute_time(); + int index = (int) position_source::FLOW; - _visual_odometry_pub.publish(odom); - vision_msg_counter++; + if (position_source_data[index].fail) { + uint32_t duration = position_source_data[index].failure_duration; + hrt_abstime start = position_source_data[index].failure_duration_start; + + if (duration) { + if (hrt_elapsed_time(&start) > (duration * 1000000)) { + PX4_INFO("Optical flow failure ending"); + position_source_data[index].fail = false; + position_source_data[index].failure_duration = 0; + position_source_data[index].failure_duration_start = 0; + + } else { + sensor_optical_flow.quality = 0; + } + + } else { + sensor_optical_flow.quality = 0; + } + } + + const matrix::Vector3f integrated_gyro(flow.integrated_xgyro, flow.integrated_ygyro, flow.integrated_zgyro); + + if (integrated_gyro.isAllFinite()) { + integrated_gyro.copyTo(sensor_optical_flow.delta_angle); + sensor_optical_flow.delta_angle_available = true; + } + + sensor_optical_flow.max_flow_rate = NAN; + sensor_optical_flow.min_ground_distance = NAN; + sensor_optical_flow.max_ground_distance = NAN; + + // Use distance value for distance sensor topic + // if (PX4_ISFINITE(flow.distance) && (flow.distance >= 0.f)) { + // // Positive value (including zero): distance known. Negative value: Unknown distance. + // sensor_optical_flow.distance_m = flow.distance; + // sensor_optical_flow.distance_available = true; + // } + + // Emulate voxl-flow-server where distance comes in a separate + // distance sensor topic message + sensor_optical_flow.distance_m = 0.0f; + sensor_optical_flow.distance_available = false; + + sensor_optical_flow.timestamp = hrt_absolute_time(); + + _sensor_optical_flow_pub.publish(sensor_optical_flow); + + flow_sent_counter++; +} + +int distance_debug_counter = 0; + +void handle_message_distance_sensor(mavlink_message_t *msg) +{ + mavlink_distance_sensor_t dist_sensor; + mavlink_msg_distance_sensor_decode(msg, &dist_sensor); + + if ((_debug) && (!(distance_debug_counter % 10))) { + PX4_INFO("distance: time: %u, quality: %u, height: %u", + dist_sensor.time_boot_ms, dist_sensor.signal_quality, + dist_sensor.current_distance); + } + + distance_debug_counter++; + + distance_sensor_s ds{}; + + device::Device::DeviceId device_id; + device_id.devid_s.bus_type = device::Device::DeviceBusType::DeviceBusType_MAVLINK; + device_id.devid_s.bus = 1; + device_id.devid_s.address = msg->sysid; + device_id.devid_s.devtype = DRV_DIST_DEVTYPE_MAVLINK; + + ds.timestamp = hrt_absolute_time(); /* Use system time for now, don't trust sender to attach correct timestamp */ + ds.min_distance = static_cast(dist_sensor.min_distance) * 1e-2f; /* cm to m */ + ds.max_distance = static_cast(dist_sensor.max_distance) * 1e-2f; /* cm to m */ + ds.current_distance = static_cast(dist_sensor.current_distance) * 1e-2f; /* cm to m */ + ds.variance = dist_sensor.covariance * 1e-4f; /* cm^2 to m^2 */ + ds.h_fov = dist_sensor.horizontal_fov; + ds.v_fov = dist_sensor.vertical_fov; + ds.q[0] = dist_sensor.quaternion[0]; + ds.q[1] = dist_sensor.quaternion[1]; + ds.q[2] = dist_sensor.quaternion[2]; + ds.q[3] = dist_sensor.quaternion[3]; + ds.type = dist_sensor.type; + ds.device_id = device_id.devid; + ds.orientation = dist_sensor.orientation; + + // MAVLink DISTANCE_SENSOR signal_quality value of 0 means unset/unknown + // quality value. Also it comes normalised between 1 and 100 while the uORB + // signal quality is normalised between 0 and 100. + ds.signal_quality = dist_sensor.signal_quality == 0 ? -1 : 100 * (dist_sensor.signal_quality - 1) / 99; + + _distance_sensor_pub.publish(ds); + + distance_sent_counter++; } void @@ -518,6 +666,8 @@ handle_message_odometry_dsp(mavlink_message_t *msg) mavlink_odometry_t odom_in; mavlink_msg_odometry_decode(msg, &odom_in); + odometry_sent_counter++; + // fill vehicle_odometry from Mavlink ODOMETRY vehicle_odometry_s odom{}; uint64_t timestamp = hrt_absolute_time(); @@ -699,6 +849,28 @@ handle_message_odometry_dsp(mavlink_message_t *msg) odom.reset_counter = odom_in.reset_counter; odom.quality = odom_in.quality; + int index = (int) position_source::VIO; + + if (position_source_data[index].fail) { + uint32_t duration = position_source_data[index].failure_duration; + hrt_abstime start = position_source_data[index].failure_duration_start; + + if (duration) { + if (hrt_elapsed_time(&start) > (duration * 1000000)) { + PX4_INFO("VIO failure ending"); + position_source_data[index].fail = false; + position_source_data[index].failure_duration = 0; + position_source_data[index].failure_duration_start = 0; + + } else { + odom.quality = 0; + } + + } else { + odom.quality = 0; + } + } + switch (odom_in.estimator_type) { case MAV_ESTIMATOR_TYPE_UNKNOWN: // accept MAV_ESTIMATOR_TYPE_UNKNOWN for legacy support case MAV_ESTIMATOR_TYPE_NAIVE: @@ -745,10 +917,6 @@ void actuator_controls_from_outputs_dsp(mavlink_hil_actuator_controls_t *msg) msg->mode = mode_flag_custom; msg->mode |= (armed) ? mode_flag_armed : 0; msg->flags = 0; - -#if defined(ENABLE_LOCKSTEP_SCHEDULER) - msg->flags |= 1; -#endif } int openPort(const char *dev, speed_t speed) @@ -759,7 +927,8 @@ int openPort(const char *dev, speed_t speed) } _uart_fd = qurt_uart_open(dev, speed); - PX4_DEBUG("qurt_uart_opened"); + + if (_debug) { PX4_INFO("qurt_uart_opened"); } if (_uart_fd < 0) { PX4_ERR("Error opening port: %s (%i)", dev, errno); @@ -840,25 +1009,50 @@ int stop() void usage() { - PX4_INFO("Usage: dsp_hitl {start|info|status|stop}"); + PX4_INFO("Usage: dsp_hitl {start|status|clear|failure|stop}"); + PX4_INFO(" failure "); + PX4_INFO(" source: gps, vio, flow"); + PX4_INFO(" duration: 0 (toggle state), else seconds"); } -int get_status() +void print_status() { PX4_INFO("Running: %s", _is_running ? "yes" : "no"); - PX4_INFO("Status of IMU_Data counter: %i", imu_counter); - PX4_INFO("Value of current accel x, y, z data: %f, %f, %f", double(x_accel), double(y_accel), double(z_accel)); - PX4_INFO("Value of current gyro x, y, z data: %f, %f, %f", double(x_gyro), double(y_gyro), double(z_gyro)); - PX4_INFO("Value of HIL_Sensor counter: %i", hil_sensor_counter); - PX4_INFO("Value of Heartbeat counter: %i", heartbeat_counter); - PX4_INFO("Value of Vision data counter: %i", vision_msg_counter); - PX4_INFO("Value of GPS Data counter: %i", gps_counter); - return 0; + PX4_INFO("HIL Sensor received: %i", hil_sensor_counter); + PX4_INFO("IMU updates: %i", imu_counter); + PX4_INFO("\tCurrent accel x, y, z: %f, %f, %f", double(x_accel), double(y_accel), double(z_accel)); + PX4_INFO("\tCurrent gyro x, y, z: %f, %f, %f", double(x_gyro), double(y_gyro), double(z_gyro)); + PX4_INFO("Magnetometer sent: %i", mag_counter); + PX4_INFO("Barometer sent: %i", baro_counter); + PX4_INFO("Heartbeat received: %i, sent: %i", heartbeat_received_counter, heartbeat_sent_counter); + PX4_INFO("Odometry received: %i, sent: %i", odometry_received_counter, odometry_sent_counter); + PX4_INFO("GPS received: %i, sent: %i", gps_received_counter, gps_sent_counter); + PX4_INFO("Distance sensor received: %i, sent: %i", distance_received_counter, distance_sent_counter); + PX4_INFO("Optical flow received: %i, sent: %i", flow_received_counter, flow_sent_counter); + PX4_INFO("Actuator updates sent: %i", actuator_sent_counter); + PX4_INFO("Unknown messages received: %i", unknown_msg_received_counter); } -uint64_t first_sensor_msg_timestamp = 0; -uint64_t first_sensor_report_timestamp = 0; -uint64_t last_sensor_report_timestamp = 0; +void +clear_status_counters() +{ + heartbeat_received_counter = 0; + heartbeat_sent_counter = 0; + imu_counter = 0; + hil_sensor_counter = 0; + mag_counter = 0; + baro_counter = 0; + actuator_sent_counter = 0; + odometry_received_counter = 0; + odometry_sent_counter = 0; + gps_received_counter = 0; + gps_sent_counter = 0; + distance_received_counter = 0; + distance_sent_counter = 0; + flow_received_counter = 0; + flow_sent_counter = 0; + unknown_msg_received_counter = 0; +} void handle_message_hil_sensor_dsp(mavlink_message_t *msg) @@ -928,6 +1122,8 @@ handle_message_hil_sensor_dsp(mavlink_message_t *msg) } _px4_mag->update(gyro_accel_time, hil_sensor.xmag, hil_sensor.ymag, hil_sensor.zmag); + + mag_counter++; } } @@ -942,17 +1138,8 @@ handle_message_hil_sensor_dsp(mavlink_message_t *msg) sensor_baro.error_count = 0; sensor_baro.timestamp = hrt_absolute_time(); _sensor_baro_pub.publish(sensor_baro); - } - // differential pressure - if ((hil_sensor.fields_updated & SensorSource::DIFF_PRESS) == SensorSource::DIFF_PRESS) { - differential_pressure_s report{}; - report.timestamp_sample = gyro_accel_time; - report.device_id = 1377548; // 1377548: DRV_DIFF_PRESS_DEVTYPE_SIM, BUS: 1, ADDR: 5, TYPE: SIMULATION - report.temperature = hil_sensor.temperature; - report.differential_pressure_pa = hil_sensor.diff_pressure * 100.0f; // hPa to Pa - report.timestamp = hrt_absolute_time(); - _differential_pressure_pub.publish(report); + baro_counter++; } // battery status @@ -970,7 +1157,6 @@ handle_message_hil_sensor_dsp(mavlink_message_t *msg) _battery_pub.publish(hil_battery_status); } - hil_sensor_counter++; } void @@ -989,15 +1175,41 @@ handle_message_hil_gps_dsp(mavlink_message_t *msg) gps.device_id = device_id.devid; - gps.latitude_deg = hil_gps.lat; - gps.longitude_deg = hil_gps.lon; - gps.altitude_msl_m = hil_gps.alt; - gps.altitude_ellipsoid_m = hil_gps.alt; + gps.latitude_deg = hil_gps.lat * 1e-7; + gps.longitude_deg = hil_gps.lon * 1e-7; + gps.altitude_msl_m = hil_gps.alt * 1e-3; + gps.altitude_ellipsoid_m = hil_gps.alt * 1e-3; gps.s_variance_m_s = 0.25f; gps.c_variance_rad = 0.5f; + + gps.satellites_used = hil_gps.satellites_visible; gps.fix_type = hil_gps.fix_type; + int index = (int) position_source::GPS; + + if (position_source_data[index].fail) { + uint32_t duration = position_source_data[index].failure_duration; + hrt_abstime start = position_source_data[index].failure_duration_start; + + if (duration) { + if (hrt_elapsed_time(&start) > (duration * 1000000)) { + PX4_INFO("GPS failure ending"); + position_source_data[index].fail = false; + position_source_data[index].failure_duration = 0; + position_source_data[index].failure_duration_start = 0; + + } else { + gps.satellites_used = 1; + gps.fix_type = 0; + } + + } else { + gps.satellites_used = 1; + gps.fix_type = 0; + } + } + gps.eph = (float)hil_gps.eph * 1e-2f; // cm -> m gps.epv = (float)hil_gps.epv * 1e-2f; // cm -> m @@ -1021,7 +1233,6 @@ handle_message_hil_gps_dsp(mavlink_message_t *msg) gps.timestamp_time_relative = 0; gps.time_utc_usec = hil_gps.time_usec; - gps.satellites_used = hil_gps.satellites_visible; gps.heading = NAN; gps.heading_offset = NAN; @@ -1029,10 +1240,51 @@ handle_message_hil_gps_dsp(mavlink_message_t *msg) gps.timestamp = hrt_absolute_time(); _sensor_gps_pub.publish(gps); - gps_counter++; + + gps_sent_counter++; } +int +process_failure(dsp_hitl::position_source src, int duration) +{ + if (src >= position_source::NUM_POSITION_SOURCES) { + return 1; + } + + int index = (int) src; + + if (position_source_data[index].send) { + if (duration <= 0) { + // Toggle state + if (position_source_data[index].fail) { + PX4_INFO("Ending indefinite %s failure", position_source_data[index].label); + position_source_data[index].fail = false; + + } else { + PX4_INFO("Starting indefinite %s failure", position_source_data[index].label); + position_source_data[index].fail = true; + } + + position_source_data[index].failure_duration = 0; + position_source_data[index].failure_duration_start = 0; + + } else { + PX4_INFO("%s failure for %d seconds", position_source_data[index].label, duration); + position_source_data[index].fail = true; + position_source_data[index].failure_duration = duration; + position_source_data[index].failure_duration_start = hrt_absolute_time(); + } + + } else { + PX4_ERR("%s not active, cannot create failure", position_source_data[index].label); + return 1; + } + + return 0; } + +} // End dsp_hitl namespace + int dsp_hitl_main(int argc, char *argv[]) { int myoptind = 1; @@ -1044,20 +1296,47 @@ int dsp_hitl_main(int argc, char *argv[]) const char *verb = argv[myoptind]; - if (!strcmp(verb, "start")) { return dsp_hitl::start(argc - 1, argv + 1); - } - else if (!strcmp(verb, "stop")) { + } else if (!strcmp(verb, "stop")) { return dsp_hitl::stop(); - } - else if (!strcmp(verb, "status")) { - return dsp_hitl::get_status(); - } + } else if (!strcmp(verb, "status")) { + dsp_hitl::print_status(); + return 0; + + } else if (!strcmp(verb, "clear")) { + dsp_hitl::clear_status_counters(); + return 0; + + } else if (!strcmp(verb, "failure")) { + if (argc != 4) { + dsp_hitl::usage(); + return 1; + } + + const char *source = argv[myoptind + 1]; + int duration = atoi(argv[myoptind + 2]); + + if (!strcmp(source, "gps")) { + return dsp_hitl::process_failure(dsp_hitl::position_source::GPS, duration); + + } else if (!strcmp(source, "vio")) { + return dsp_hitl::process_failure(dsp_hitl::position_source::VIO, duration); + + } else if (!strcmp(source, "flow")) { + return dsp_hitl::process_failure(dsp_hitl::position_source::FLOW, duration); + + } else { + PX4_ERR("Unknown failure source %s, duration %d", source, duration); + dsp_hitl::usage(); + return 1; + } + + return 0; - else { + } else { dsp_hitl::usage(); return 1; } diff --git a/boards/modalai/voxl2-slpi/src/drivers/icm42688p/ICM42688P.cpp b/boards/modalai/voxl2-slpi/src/drivers/icm42688p/ICM42688P.cpp deleted file mode 100644 index 50c26171e3dc..000000000000 --- a/boards/modalai/voxl2-slpi/src/drivers/icm42688p/ICM42688P.cpp +++ /dev/null @@ -1,991 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2020 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#include "ICM42688P.hpp" - -bool hitl_mode = false; - -using namespace time_literals; - -static constexpr int16_t combine(uint8_t msb, uint8_t lsb) -{ - return (msb << 8u) | lsb; -} - -ICM42688P::ICM42688P(const I2CSPIDriverConfig &config) : - // SPI(DRV_IMU_DEVTYPE_ICM42688P, MODULE_NAME, bus, device, spi_mode, bus_frequency), - // I2CSPIDriver(MODULE_NAME, px4::device_bus_to_wq(get_device_id()), bus_option, bus), - // _drdy_gpio(drdy_gpio) - SPI(config), - I2CSPIDriver(config), - _drdy_gpio(config.drdy_gpio), - _px4_accel(get_device_id(), config.rotation), - _px4_gyro(get_device_id(), config.rotation) -{ - if (config.drdy_gpio != 0) { - _drdy_missed_perf = perf_alloc(PC_COUNT, MODULE_NAME": DRDY missed"); - } - - if (!hitl_mode) { - // _px4_accel = std::make_shared(get_device_id(), rotation); - // _px4_gyro = std::make_shared(get_device_id(), rotation); - ConfigureSampleRate(_px4_gyro.get_max_rate_hz()); - // _imu_server_pub.advertise(); - - } else { - ConfigureSampleRate(0); - } -} - -ICM42688P::~ICM42688P() -{ - perf_free(_bad_register_perf); - perf_free(_bad_transfer_perf); - perf_free(_fifo_empty_perf); - perf_free(_fifo_overflow_perf); - perf_free(_fifo_reset_perf); - perf_free(_drdy_missed_perf); - - // if (!hitl_mode){ - // _imu_server_pub.unadvertise(); - // } -} - -int ICM42688P::init() -{ - int ret = SPI::init(); - - if (ret != PX4_OK) { - DEVICE_DEBUG("SPI::init failed (%i)", ret); - return ret; - } - - return Reset() ? 0 : -1; -} - -bool ICM42688P::Reset() -{ - _state = STATE::RESET; - DataReadyInterruptDisable(); - ScheduleClear(); - ScheduleNow(); - return true; -} - -void ICM42688P::exit_and_cleanup() -{ - DataReadyInterruptDisable(); - I2CSPIDriverBase::exit_and_cleanup(); -} - -void ICM42688P::print_status() -{ - I2CSPIDriverBase::print_status(); - - PX4_INFO("FIFO empty interval: %d us (%.1f Hz)", _fifo_empty_interval_us, 1e6 / _fifo_empty_interval_us); - - perf_print_counter(_bad_register_perf); - perf_print_counter(_bad_transfer_perf); - perf_print_counter(_fifo_empty_perf); - perf_print_counter(_fifo_overflow_perf); - perf_print_counter(_fifo_reset_perf); - perf_print_counter(_drdy_missed_perf); -} - -int ICM42688P::probe() -{ - for (int i = 0; i < 3; i++) { - uint8_t whoami = RegisterRead(Register::BANK_0::WHO_AM_I); - - if (whoami == WHOAMI) { - PX4_INFO("ICM42688P::probe successful!"); - return PX4_OK; - - } else { - DEVICE_DEBUG("unexpected WHO_AM_I 0x%02x", whoami); - - uint8_t reg_bank_sel = RegisterRead(Register::BANK_0::REG_BANK_SEL); - int bank = reg_bank_sel >> 4; - - if (bank >= 1 && bank <= 3) { - DEVICE_DEBUG("incorrect register bank for WHO_AM_I REG_BANK_SEL:0x%02x, bank:%d", reg_bank_sel, bank); - // force bank selection and retry - SelectRegisterBank(REG_BANK_SEL_BIT::USER_BANK_0, true); - } - } - } - - return PX4_ERROR; -} - -void ICM42688P::RunImpl() -{ - PX4_INFO(">>> ICM42688P this: %p", this); - - const hrt_abstime now = hrt_absolute_time(); - - switch (_state) { - case STATE::RESET: - // DEVICE_CONFIG: Software reset configuration - RegisterWrite(Register::BANK_0::DEVICE_CONFIG, DEVICE_CONFIG_BIT::SOFT_RESET_CONFIG); - _reset_timestamp = now; - _failure_count = 0; - _state = STATE::WAIT_FOR_RESET; - ScheduleDelayed(2_ms); // to be safe wait 2 ms for soft reset to be effective - break; - - case STATE::WAIT_FOR_RESET: - if ((RegisterRead(Register::BANK_0::WHO_AM_I) == WHOAMI) - && (RegisterRead(Register::BANK_0::DEVICE_CONFIG) == 0x00) - && (RegisterRead(Register::BANK_0::INT_STATUS) & INT_STATUS_BIT::RESET_DONE_INT)) { - - _state = STATE::CONFIGURE; - ScheduleDelayed(10_ms); // 30 ms gyro startup time, 10 ms accel from sleep to valid data - - } else { - // RESET not complete - if (hrt_elapsed_time(&_reset_timestamp) > 1000_ms) { - PX4_DEBUG("Reset failed, retrying"); - _state = STATE::RESET; - ScheduleDelayed(100_ms); - - } else { - PX4_DEBUG("Reset not complete, check again in 10 ms"); - ScheduleDelayed(10_ms); - } - } - - break; - - case STATE::CONFIGURE: - - if (Configure()) { - - // Wakeup accel and gyro after configuring registers - ScheduleDelayed(1_ms); // add a delay here to be safe - RegisterWrite(Register::BANK_0::PWR_MGMT0, PWR_MGMT0_BIT::GYRO_MODE_LOW_NOISE | PWR_MGMT0_BIT::ACCEL_MODE_LOW_NOISE); - ScheduleDelayed(30_ms); // 30 ms gyro startup time, 10 ms accel from sleep to valid data - - // if configure succeeded then start reading from FIFO - _state = STATE::FIFO_READ; - - if (DataReadyInterruptConfigure()) { - _data_ready_interrupt_enabled = true; - - // backup schedule as a watchdog timeout - ScheduleDelayed(100_ms); - - } else { - PX4_ERR("ICM42688P::RunImpl interrupt configuration failed"); - - _data_ready_interrupt_enabled = false; - ScheduleOnInterval(_fifo_empty_interval_us, _fifo_empty_interval_us); - } - - FIFOReset(); - - } else { - - PX4_ERR("ICM42688P::RunImpl configuration failed"); - - // CONFIGURE not complete - if (hrt_elapsed_time(&_reset_timestamp) > 1000_ms) { - PX4_DEBUG("Configure failed, resetting"); - _state = STATE::RESET; - - } else { - PX4_DEBUG("Configure failed, retrying"); - } - - ScheduleDelayed(100_ms); - } - - break; - - case STATE::FIFO_READ: { -#ifndef __PX4_QURT - uint32_t samples = 0; - - if (_data_ready_interrupt_enabled) { - // scheduled from interrupt if _drdy_fifo_read_samples was set as expected - if (_drdy_fifo_read_samples.fetch_and(0) != _fifo_gyro_samples) { - perf_count(_drdy_missed_perf); - - } else { - samples = _fifo_gyro_samples; - } - - // push backup schedule back - ScheduleDelayed(_fifo_empty_interval_us * 2); - } - - if (samples == 0) { - // check current FIFO count - const uint16_t fifo_count = FIFOReadCount(); - - if (fifo_count >= FIFO::SIZE) { - FIFOReset(); - perf_count(_fifo_overflow_perf); - - } else if (fifo_count == 0) { - perf_count(_fifo_empty_perf); - - } else { - // FIFO count (size in bytes) - samples = (fifo_count / sizeof(FIFO::DATA)); - - if (samples > FIFO_MAX_SAMPLES) { - // not technically an overflow, but more samples than we expected or can publish - FIFOReset(); - perf_count(_fifo_overflow_perf); - samples = 0; - } - } - } - - bool success = false; - - if (samples >= 1) { - if (FIFORead(now, samples)) { - success = true; - - if (_failure_count > 0) { - _failure_count--; - } - } - } - - if (!success) { - _failure_count++; - - // full reset if things are failing consistently - if (_failure_count > 10) { - Reset(); - return; - } - } - - // check configuration registers periodically or immediately following any failure - if (RegisterCheck(_register_bank0_cfg[_checked_register_bank0]) - && RegisterCheck(_register_bank1_cfg[_checked_register_bank1]) - && RegisterCheck(_register_bank2_cfg[_checked_register_bank2]) - ) { - _last_config_check_timestamp = now; - _checked_register_bank0 = (_checked_register_bank0 + 1) % size_register_bank0_cfg; - _checked_register_bank1 = (_checked_register_bank1 + 1) % size_register_bank1_cfg; - _checked_register_bank2 = (_checked_register_bank2 + 1) % size_register_bank2_cfg; - - } else { - // register check failed, force reset - perf_count(_bad_register_perf); - Reset(); - } - -#endif - } - - break; - } -} - -void ICM42688P::ConfigureSampleRate(int sample_rate) -{ - if (sample_rate == 0) { - sample_rate = 800; // default to 800 Hz - } - - // round down to nearest FIFO sample dt - const float min_interval = FIFO_SAMPLE_DT; - _fifo_empty_interval_us = math::max(roundf((1e6f / (float)sample_rate) / min_interval) * min_interval, min_interval); - - _fifo_gyro_samples = roundf(math::min((float)_fifo_empty_interval_us / (1e6f / GYRO_RATE), (float)FIFO_MAX_SAMPLES)); - - // recompute FIFO empty interval (us) with actual gyro sample limit - _fifo_empty_interval_us = _fifo_gyro_samples * (1e6f / GYRO_RATE); - - ConfigureFIFOWatermark(_fifo_gyro_samples); -} - -void ICM42688P::ConfigureFIFOWatermark(uint8_t samples) -{ - // FIFO watermark threshold in number of bytes - const uint16_t fifo_watermark_threshold = samples * sizeof(FIFO::DATA); - - for (auto &r : _register_bank0_cfg) { - if (r.reg == Register::BANK_0::FIFO_CONFIG2) { - // FIFO_WM[7:0] FIFO_CONFIG2 - r.set_bits = fifo_watermark_threshold & 0xFF; - - } else if (r.reg == Register::BANK_0::FIFO_CONFIG3) { - // FIFO_WM[11:8] FIFO_CONFIG3 - r.set_bits = (fifo_watermark_threshold >> 8) & 0x0F; - } - } -} - -void ICM42688P::SelectRegisterBank(enum REG_BANK_SEL_BIT bank, bool force) -{ - if (bank != _last_register_bank || force) { - // select BANK_0 - uint8_t cmd_bank_sel[2] {}; - cmd_bank_sel[0] = static_cast(Register::BANK_0::REG_BANK_SEL); - cmd_bank_sel[1] = bank; - transfer(cmd_bank_sel, cmd_bank_sel, sizeof(cmd_bank_sel)); - - _last_register_bank = bank; - } -} - -bool ICM42688P::Configure() -{ - // first set and clear all configured register bits - for (const auto ®_cfg : _register_bank0_cfg) { - RegisterSetAndClearBits(reg_cfg.reg, reg_cfg.set_bits, reg_cfg.clear_bits); - } - - for (const auto ®_cfg : _register_bank1_cfg) { - RegisterSetAndClearBits(reg_cfg.reg, reg_cfg.set_bits, reg_cfg.clear_bits); - } - - for (const auto ®_cfg : _register_bank2_cfg) { - RegisterSetAndClearBits(reg_cfg.reg, reg_cfg.set_bits, reg_cfg.clear_bits); - } - - // now check that all are configured - bool success = true; - - for (const auto ®_cfg : _register_bank0_cfg) { - if (!RegisterCheck(reg_cfg)) { - success = false; - } - } - - for (const auto ®_cfg : _register_bank1_cfg) { - if (!RegisterCheck(reg_cfg)) { - success = false; - } - } - - for (const auto ®_cfg : _register_bank2_cfg) { - if (!RegisterCheck(reg_cfg)) { - success = false; - } - } - - // // 20-bits data format used - // // the only FSR settings that are operational are ±2000dps for gyroscope and ±16g for accelerometer - if (!hitl_mode) { - _px4_accel.set_range(16.f * CONSTANTS_ONE_G); - _px4_accel.set_scale(CONSTANTS_ONE_G / 8192.f); - _px4_gyro.set_range(math::radians(2000.f)); - _px4_gyro.set_scale(math::radians(1.f / 131.f)); - } - - return success; -} - -static bool interrupt_debug = false; -static uint32_t interrupt_debug_count = 0; -static const uint32_t interrupt_debug_trigger = 800; -static hrt_abstime last_interrupt_time = 0; -static hrt_abstime avg_interrupt_delta = 0; -static hrt_abstime max_interrupt_delta = 0; -static hrt_abstime min_interrupt_delta = 60 * 1000 * 1000; -static hrt_abstime cumulative_interrupt_delta = 0; - -int ICM42688P::DataReadyInterruptCallback(int irq, void *context, void *arg) -{ - hrt_abstime current_interrupt_time = hrt_absolute_time(); - - if (interrupt_debug) { - if (last_interrupt_time) { - hrt_abstime interrupt_delta_time = current_interrupt_time - last_interrupt_time; - - if (interrupt_delta_time > max_interrupt_delta) { max_interrupt_delta = interrupt_delta_time; } - - if (interrupt_delta_time < min_interrupt_delta) { min_interrupt_delta = interrupt_delta_time; } - - cumulative_interrupt_delta += interrupt_delta_time; - } - - last_interrupt_time = current_interrupt_time; - - interrupt_debug_count++; - - if (interrupt_debug_count == interrupt_debug_trigger) { - avg_interrupt_delta = cumulative_interrupt_delta / interrupt_debug_trigger; - PX4_INFO(">>> Max: %llu, Min: %llu, Avg: %llu", max_interrupt_delta, - min_interrupt_delta, avg_interrupt_delta); - interrupt_debug_count = 0; - cumulative_interrupt_delta = 0; - } - } - - static_cast(arg)->DataReady(); - - return 0; -} - -void ICM42688P::DataReady() -{ -#ifndef __PX4_QURT - uint32_t expected = 0; - - if (_drdy_fifo_read_samples.compare_exchange(&expected, _fifo_gyro_samples)) { - ScheduleNow(); - } - -#else - uint16_t fifo_byte_count = FIFOReadCount(); - - FIFORead(hrt_absolute_time(), fifo_byte_count / sizeof(FIFO::DATA)); -#endif -} - -bool ICM42688P::DataReadyInterruptConfigure() -{ - if (_drdy_gpio == 0) { - return false; - } - - // Setup data ready on falling edge - return px4_arch_gpiosetevent(_drdy_gpio, false, true, true, &DataReadyInterruptCallback, this) == 0; -} - -bool ICM42688P::DataReadyInterruptDisable() -{ - if (_drdy_gpio == 0) { - return false; - } - - return px4_arch_gpiosetevent(_drdy_gpio, false, false, false, nullptr, nullptr) == 0; -} - -template -bool ICM42688P::RegisterCheck(const T ®_cfg) -{ - bool success = true; - - const uint8_t reg_value = RegisterRead(reg_cfg.reg); - - if (reg_cfg.set_bits && ((reg_value & reg_cfg.set_bits) != reg_cfg.set_bits)) { - PX4_DEBUG("0x%02hhX: 0x%02hhX (0x%02hhX not set)", (uint8_t)reg_cfg.reg, reg_value, reg_cfg.set_bits); - success = false; - } - - if (reg_cfg.clear_bits && ((reg_value & reg_cfg.clear_bits) != 0)) { - PX4_DEBUG("0x%02hhX: 0x%02hhX (0x%02hhX not cleared)", (uint8_t)reg_cfg.reg, reg_value, reg_cfg.clear_bits); - success = false; - } - - return success; -} - -template -uint8_t ICM42688P::RegisterRead(T reg) -{ - uint8_t cmd[2] {}; - cmd[0] = static_cast(reg) | DIR_READ; - SelectRegisterBank(reg); - transfer(cmd, cmd, sizeof(cmd)); - return cmd[1]; -} - -template -void ICM42688P::RegisterWrite(T reg, uint8_t value) -{ - uint8_t cmd[2] { (uint8_t)reg, value }; - SelectRegisterBank(reg); - transfer(cmd, cmd, sizeof(cmd)); -} - -template -void ICM42688P::RegisterSetAndClearBits(T reg, uint8_t setbits, uint8_t clearbits) -{ - const uint8_t orig_val = RegisterRead(reg); - - uint8_t val = (orig_val & ~clearbits) | setbits; - - if (orig_val != val) { - RegisterWrite(reg, val); - } -} - -uint16_t ICM42688P::FIFOReadCount() -{ - // read FIFO count - uint8_t fifo_count_buf[3] {}; - fifo_count_buf[0] = static_cast(Register::BANK_0::FIFO_COUNTH) | DIR_READ; - SelectRegisterBank(REG_BANK_SEL_BIT::USER_BANK_0); - - if (transfer(fifo_count_buf, fifo_count_buf, sizeof(fifo_count_buf)) != PX4_OK) { - perf_count(_bad_transfer_perf); - return 0; - } - - return combine(fifo_count_buf[1], fifo_count_buf[2]); -} - -// static uint32_t debug_decimator = 0; -// static hrt_abstime last_sample_time = 0; -// static bool imu_debug = true; - -bool ICM42688P::FIFORead(const hrt_abstime ×tamp_sample, uint16_t samples) -{ - FIFOTransferBuffer buffer{}; - const size_t max_transfer_size = 10 * sizeof(FIFO::DATA) + 4; - const size_t transfer_size = math::min(samples * sizeof(FIFO::DATA) + 4, max_transfer_size); - SelectRegisterBank(REG_BANK_SEL_BIT::USER_BANK_0); - - if (transfer((uint8_t *)&buffer, (uint8_t *)&buffer, transfer_size) != PX4_OK) { - perf_count(_bad_transfer_perf); - return false; - } - - if (buffer.INT_STATUS & INT_STATUS_BIT::FIFO_FULL_INT) { - perf_count(_fifo_overflow_perf); - FIFOReset(); - return false; - } - - const uint16_t fifo_count_bytes = combine(buffer.FIFO_COUNTH, buffer.FIFO_COUNTL); - - if (fifo_count_bytes >= FIFO::SIZE) { - perf_count(_fifo_overflow_perf); - FIFOReset(); - return false; - } - - const uint16_t fifo_count_samples = fifo_count_bytes / sizeof(FIFO::DATA); - - if (fifo_count_samples == 0) { - perf_count(_fifo_empty_perf); - return false; - } - - // check FIFO header in every sample - uint16_t valid_samples = 0; - - // for (int i = 0; i < math::min(samples, fifo_count_samples); i++) { - for (int i = 0; i < math::min(samples, (uint16_t) 10); i++) { - bool valid = true; - - // With FIFO_ACCEL_EN and FIFO_GYRO_EN header should be 8’b_0110_10xx - const uint8_t FIFO_HEADER = buffer.f[i].FIFO_Header; - - if (FIFO_HEADER & FIFO::FIFO_HEADER_BIT::HEADER_MSG) { - // FIFO sample empty if HEADER_MSG set - valid = false; - - } else if (!(FIFO_HEADER & FIFO::FIFO_HEADER_BIT::HEADER_ACCEL)) { - // accel bit not set - valid = false; - - } else if (!(FIFO_HEADER & FIFO::FIFO_HEADER_BIT::HEADER_GYRO)) { - // gyro bit not set - valid = false; - - } else if (!(FIFO_HEADER & FIFO::FIFO_HEADER_BIT::HEADER_20)) { - // Packet does not contain a new and valid extended 20-bit data - valid = false; - - } else if (FIFO_HEADER & FIFO::FIFO_HEADER_BIT::HEADER_ODR_ACCEL) { - // accel ODR changed - valid = false; - - } else if (FIFO_HEADER & FIFO::FIFO_HEADER_BIT::HEADER_ODR_GYRO) { - // gyro ODR changed - valid = false; - } - - if (valid) { - valid_samples++; - - } else { - perf_count(_bad_transfer_perf); - break; - } - } - - // if (imu_debug) { - // debug_decimator++; - // if (debug_decimator == 801) { - // debug_decimator = 0; - // PX4_INFO("Initial: %u Next: %u Valid: %u Delta: %llu", samples, fifo_count_samples, valid_samples, timestamp_sample - last_sample_time); - // } - // last_sample_time = timestamp_sample; - // } - - if (valid_samples > 0) { - if (ProcessTemperature(buffer.f, valid_samples)) { - ProcessGyro(timestamp_sample, buffer.f, valid_samples); - ProcessAccel(timestamp_sample, buffer.f, valid_samples); - ProcessIMU(timestamp_sample, buffer.f, valid_samples); - return true; - } - } - - return false; -} - -void ICM42688P::FIFOReset() -{ - perf_count(_fifo_reset_perf); - - // SIGNAL_PATH_RESET: FIFO flush - RegisterSetBits(Register::BANK_0::SIGNAL_PATH_RESET, SIGNAL_PATH_RESET_BIT::FIFO_FLUSH); - - // reset while FIFO is disabled - _drdy_fifo_read_samples.store(0); -} - -static constexpr int32_t reassemble_20bit(const uint32_t a, const uint32_t b, const uint32_t c) -{ - // 0xXXXAABBC - uint32_t high = ((a << 12) & 0x000FF000); - uint32_t low = ((b << 4) & 0x00000FF0); - uint32_t lowest = (c & 0x0000000F); - - uint32_t x = high | low | lowest; - - if (a & Bit7) { - // sign extend - x |= 0xFFF00000u; - } - - return static_cast(x); -} - -void ICM42688P::ProcessIMU(const hrt_abstime ×tamp_sample, const FIFO::DATA fifo[], const uint8_t samples) -{ - float accel_x = 0.0, accel_y = 0.0, accel_z = 0.0; - float gyro_x = 0.0, gyro_y = 0.0, gyro_z = 0.0; - - for (int i = 0; i < samples; i++) { - _imu_server_decimator++; - - if (_imu_server_decimator == 8) { - _imu_server_decimator = 0; - // 20 bit hires mode - - // Sign extension + Accel [19:12] + Accel [11:4] + Accel [3:2] (20 bit extension byte) - // Accel data is 18 bit - int32_t temp_accel_x = reassemble_20bit(fifo[i].ACCEL_DATA_X1, fifo[i].ACCEL_DATA_X0, - fifo[i].Ext_Accel_X_Gyro_X & 0xF0 >> 4); - int32_t temp_accel_y = reassemble_20bit(fifo[i].ACCEL_DATA_Y1, fifo[i].ACCEL_DATA_Y0, - fifo[i].Ext_Accel_Y_Gyro_Y & 0xF0 >> 4); - int32_t temp_accel_z = reassemble_20bit(fifo[i].ACCEL_DATA_Z1, fifo[i].ACCEL_DATA_Z0, - fifo[i].Ext_Accel_Z_Gyro_Z & 0xF0 >> 4); - - // Gyro [19:12] + Gyro [11:4] + Gyro [3:0] (bottom 4 bits of 20 bit extension byte) - int32_t temp_gyro_x = reassemble_20bit(fifo[i].GYRO_DATA_X1, fifo[i].GYRO_DATA_X0, - fifo[i].Ext_Accel_X_Gyro_X & 0x0F); - int32_t temp_gyro_y = reassemble_20bit(fifo[i].GYRO_DATA_Y1, fifo[i].GYRO_DATA_Y0, - fifo[i].Ext_Accel_Y_Gyro_Y & 0x0F); - int32_t temp_gyro_z = reassemble_20bit(fifo[i].GYRO_DATA_Z1, fifo[i].GYRO_DATA_Z0, - fifo[i].Ext_Accel_Z_Gyro_Z & 0x0F); - - // accel samples invalid if -524288 - if (temp_accel_x != -524288 && temp_accel_y != -524288 && temp_accel_z != -524288) { - // shift accel by 2 (2 least significant bits are always 0) - accel_x = (float) temp_accel_x / 4.f; - accel_y = (float) temp_accel_y / 4.f; - accel_z = (float) temp_accel_z / 4.f; - - // shift gyro by 1 (least significant bit is always 0) - gyro_x = (float) temp_gyro_x / 2.f; - gyro_y = (float) temp_gyro_y / 2.f; - gyro_z = (float) temp_gyro_z / 2.f; - - // correct frame for publication - // sensor's frame is +x forward, +y left, +z up - // flip y & z to publish right handed with z down (x forward, y right, z down) - accel_y = -accel_y; - accel_z = -accel_z; - gyro_y = -gyro_y; - gyro_z = -gyro_z; - - // Scale everything appropriately - float accel_scale_factor = (CONSTANTS_ONE_G / 8192.f); - accel_x *= accel_scale_factor; - accel_y *= accel_scale_factor; - accel_z *= accel_scale_factor; - - float gyro_scale_factor = math::radians(1.f / 131.f); - gyro_x *= gyro_scale_factor; - gyro_y *= gyro_scale_factor; - gyro_z *= gyro_scale_factor; - - // Store the data in our array - _imu_server_data.accel_x[_imu_server_index] = accel_x; - _imu_server_data.accel_y[_imu_server_index] = accel_y; - _imu_server_data.accel_z[_imu_server_index] = accel_z; - _imu_server_data.gyro_x[_imu_server_index] = gyro_x; - _imu_server_data.gyro_y[_imu_server_index] = gyro_y; - _imu_server_data.gyro_z[_imu_server_index] = gyro_z; - _imu_server_data.ts[_imu_server_index] = timestamp_sample - (125 * (samples - 1 - i)); - _imu_server_index++; - - // If array is full, publish the data - if (_imu_server_index == 10) { - _imu_server_index = 0; - _imu_server_data.timestamp = hrt_absolute_time(); - _imu_server_data.temperature = 0; // Not used right now - _imu_server_pub.publish(_imu_server_data); - } - } - } - } -} - -void ICM42688P::ProcessAccel(const hrt_abstime ×tamp_sample, const FIFO::DATA fifo[], const uint8_t samples) -{ - sensor_accel_fifo_s accel{}; - accel.timestamp_sample = timestamp_sample; - accel.samples = 0; - accel.dt = FIFO_SAMPLE_DT; - - // 18-bits of accelerometer data - bool scale_20bit = false; - - // first pass - for (int i = 0; i < samples; i++) { - // 20 bit hires mode - // Sign extension + Accel [19:12] + Accel [11:4] + Accel [3:2] (20 bit extension byte) - // Accel data is 18 bit () - int32_t accel_x = reassemble_20bit(fifo[i].ACCEL_DATA_X1, fifo[i].ACCEL_DATA_X0, - fifo[i].Ext_Accel_X_Gyro_X & 0xF0 >> 4); - int32_t accel_y = reassemble_20bit(fifo[i].ACCEL_DATA_Y1, fifo[i].ACCEL_DATA_Y0, - fifo[i].Ext_Accel_Y_Gyro_Y & 0xF0 >> 4); - int32_t accel_z = reassemble_20bit(fifo[i].ACCEL_DATA_Z1, fifo[i].ACCEL_DATA_Z0, - fifo[i].Ext_Accel_Z_Gyro_Z & 0xF0 >> 4); - - // sample invalid if -524288 - if (accel_x != -524288 && accel_y != -524288 && accel_z != -524288) { - // check if any values are going to exceed int16 limits - static constexpr int16_t max_accel = INT16_MAX; - static constexpr int16_t min_accel = INT16_MIN; - - if (accel_x >= max_accel || accel_x <= min_accel) { - scale_20bit = true; - } - - if (accel_y >= max_accel || accel_y <= min_accel) { - scale_20bit = true; - } - - if (accel_z >= max_accel || accel_z <= min_accel) { - scale_20bit = true; - } - - // shift by 2 (2 least significant bits are always 0) - accel.x[accel.samples] = accel_x / 4; - accel.y[accel.samples] = accel_y / 4; - accel.z[accel.samples] = accel_z / 4; - accel.samples++; - } - } - - if (!scale_20bit) { - // if highres enabled accel data is always 8192 LSB/g - if (!hitl_mode) { - _px4_accel.set_scale(CONSTANTS_ONE_G / 8192.f); - } - - } else { - // 20 bit data scaled to 16 bit (2^4) - for (int i = 0; i < samples; i++) { - // 20 bit hires mode - // Sign extension + Accel [19:12] + Accel [11:4] + Accel [3:2] (20 bit extension byte) - // Accel data is 18 bit () - int16_t accel_x = combine(fifo[i].ACCEL_DATA_X1, fifo[i].ACCEL_DATA_X0); - int16_t accel_y = combine(fifo[i].ACCEL_DATA_Y1, fifo[i].ACCEL_DATA_Y0); - int16_t accel_z = combine(fifo[i].ACCEL_DATA_Z1, fifo[i].ACCEL_DATA_Z0); - - accel.x[i] = accel_x; - accel.y[i] = accel_y; - accel.z[i] = accel_z; - } - - if (!hitl_mode) { - _px4_accel.set_scale(CONSTANTS_ONE_G / 2048.f); - } - } - - // correct frame for publication - for (int i = 0; i < accel.samples; i++) { - // sensor's frame is +x forward, +y left, +z up - // flip y & z to publish right handed with z down (x forward, y right, z down) - accel.x[i] = accel.x[i]; - accel.y[i] = (accel.y[i] == INT16_MIN) ? INT16_MAX : -accel.y[i]; - accel.z[i] = (accel.z[i] == INT16_MIN) ? INT16_MAX : -accel.z[i]; - } - - if (!hitl_mode) { - _px4_accel.set_error_count(perf_event_count(_bad_register_perf) + perf_event_count(_bad_transfer_perf) + - perf_event_count(_fifo_empty_perf) + perf_event_count(_fifo_overflow_perf)); - } - - if (accel.samples > 0) { - if (!hitl_mode) { - _px4_accel.updateFIFO(accel); - } - } -} - -void ICM42688P::ProcessGyro(const hrt_abstime ×tamp_sample, const FIFO::DATA fifo[], const uint8_t samples) -{ - sensor_gyro_fifo_s gyro{}; - gyro.timestamp_sample = timestamp_sample; - gyro.samples = 0; - gyro.dt = FIFO_SAMPLE_DT; - - // 20-bits of gyroscope data - bool scale_20bit = false; - - // first pass - for (int i = 0; i < samples; i++) { - // 20 bit hires mode - // Gyro [19:12] + Gyro [11:4] + Gyro [3:0] (bottom 4 bits of 20 bit extension byte) - int32_t gyro_x = reassemble_20bit(fifo[i].GYRO_DATA_X1, fifo[i].GYRO_DATA_X0, fifo[i].Ext_Accel_X_Gyro_X & 0x0F); - int32_t gyro_y = reassemble_20bit(fifo[i].GYRO_DATA_Y1, fifo[i].GYRO_DATA_Y0, fifo[i].Ext_Accel_Y_Gyro_Y & 0x0F); - int32_t gyro_z = reassemble_20bit(fifo[i].GYRO_DATA_Z1, fifo[i].GYRO_DATA_Z0, fifo[i].Ext_Accel_Z_Gyro_Z & 0x0F); - - // check if any values are going to exceed int16 limits - static constexpr int16_t max_gyro = INT16_MAX; - static constexpr int16_t min_gyro = INT16_MIN; - - if (gyro_x >= max_gyro || gyro_x <= min_gyro) { - scale_20bit = true; - } - - if (gyro_y >= max_gyro || gyro_y <= min_gyro) { - scale_20bit = true; - } - - if (gyro_z >= max_gyro || gyro_z <= min_gyro) { - scale_20bit = true; - } - - gyro.x[gyro.samples] = gyro_x / 2; - gyro.y[gyro.samples] = gyro_y / 2; - gyro.z[gyro.samples] = gyro_z / 2; - gyro.samples++; - } - - if (!scale_20bit) { - // if highres enabled gyro data is always 131 LSB/dps - if (!hitl_mode) { - _px4_gyro.set_scale(math::radians(1.f / 131.f)); - } - - } else { - // 20 bit data scaled to 16 bit (2^4) - for (int i = 0; i < samples; i++) { - gyro.x[i] = combine(fifo[i].GYRO_DATA_X1, fifo[i].GYRO_DATA_X0); - gyro.y[i] = combine(fifo[i].GYRO_DATA_Y1, fifo[i].GYRO_DATA_Y0); - gyro.z[i] = combine(fifo[i].GYRO_DATA_Z1, fifo[i].GYRO_DATA_Z0); - } - - if (!hitl_mode) { - _px4_gyro.set_scale(math::radians(2000.f / 32768.f)); - } - } - - // correct frame for publication - for (int i = 0; i < gyro.samples; i++) { - // sensor's frame is +x forward, +y left, +z up - // flip y & z to publish right handed with z down (x forward, y right, z down) - gyro.x[i] = gyro.x[i]; - gyro.y[i] = (gyro.y[i] == INT16_MIN) ? INT16_MAX : -gyro.y[i]; - gyro.z[i] = (gyro.z[i] == INT16_MIN) ? INT16_MAX : -gyro.z[i]; - } - - if (!hitl_mode) { - _px4_gyro.set_error_count(perf_event_count(_bad_register_perf) + perf_event_count(_bad_transfer_perf) + - perf_event_count(_fifo_empty_perf) + perf_event_count(_fifo_overflow_perf)); - } - - if (gyro.samples > 0) { - if (!hitl_mode) { - _px4_gyro.updateFIFO(gyro); - } - } -} - -bool ICM42688P::ProcessTemperature(const FIFO::DATA fifo[], const uint8_t samples) -{ - int16_t temperature[FIFO_MAX_SAMPLES]; - float temperature_sum{0}; - - int valid_samples = 0; - - for (int i = 0; i < samples; i++) { - const int16_t t = combine(fifo[i].TEMP_DATA1, fifo[i].TEMP_DATA0); - - // sample invalid if -32768 - if (t != -32768) { - temperature_sum += t; - temperature[valid_samples] = t; - valid_samples++; - } - } - - if (valid_samples > 0) { - const float temperature_avg = temperature_sum / valid_samples; - - for (int i = 0; i < valid_samples; i++) { - // temperature changing wildly is an indication of a transfer error - if (fabsf(temperature[i] - temperature_avg) > 1000) { - perf_count(_bad_transfer_perf); - return false; - } - } - - // use average temperature reading - const float TEMP_degC = (temperature_avg / TEMPERATURE_SENSITIVITY) + TEMPERATURE_OFFSET; - - if (PX4_ISFINITE(TEMP_degC)) { - if (!hitl_mode) { - _px4_accel.set_temperature(TEMP_degC); - _px4_gyro.set_temperature(TEMP_degC); - return true; - } - - } else { - perf_count(_bad_transfer_perf); - } - } - - return false; -} diff --git a/boards/modalai/voxl2-slpi/src/drivers/icm42688p/ICM42688P.hpp b/boards/modalai/voxl2-slpi/src/drivers/icm42688p/ICM42688P.hpp deleted file mode 100644 index e5c63dd9f98a..000000000000 --- a/boards/modalai/voxl2-slpi/src/drivers/icm42688p/ICM42688P.hpp +++ /dev/null @@ -1,235 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2020 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file ICM42688P.hpp - * - * Driver for the Invensense ICM42688P connected via SPI. - * - */ - -#pragma once - -#include "InvenSense_ICM42688P_registers.hpp" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace InvenSense_ICM42688P; - -extern bool hitl_mode; - -class ICM42688P : public device::SPI, public I2CSPIDriver -{ -public: - // ICM42688P(I2CSPIBusOption bus_option, int bus, uint32_t device, enum Rotation rotation, int bus_frequency, - // spi_mode_e spi_mode, spi_drdy_gpio_t drdy_gpio); - ICM42688P(const I2CSPIDriverConfig &config); - ~ICM42688P() override; - - // static I2CSPIDriverBase *instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, - // int runtime_instance); - static void print_usage(); - - void RunImpl(); - - int init() override; - void print_status() override; - -private: - void exit_and_cleanup() override; - - // Sensor Configuration - static constexpr float IMU_ODR{8000.f}; // 8kHz accel & gyro ODR configured - static constexpr float FIFO_SAMPLE_DT{1e6f / IMU_ODR}; - static constexpr float GYRO_RATE{1e6f / FIFO_SAMPLE_DT}; - static constexpr float ACCEL_RATE{1e6f / FIFO_SAMPLE_DT}; - - // maximum FIFO samples per transfer is limited to the size of sensor_accel_fifo/sensor_gyro_fifo - // static constexpr uint32_t FIFO_MAX_SAMPLES{math::min(math::min(FIFO::SIZE / sizeof(FIFO::DATA), sizeof(sensor_gyro_fifo_s::x) / sizeof(sensor_gyro_fifo_s::x[0])), sizeof(sensor_accel_fifo_s::x) / sizeof(sensor_accel_fifo_s::x[0]) * (int)(GYRO_RATE / ACCEL_RATE))}; - static constexpr uint32_t FIFO_MAX_SAMPLES{10}; - - // Transfer data - struct FIFOTransferBuffer { - uint8_t cmd{static_cast(Register::BANK_0::INT_STATUS) | DIR_READ}; - uint8_t INT_STATUS{0}; - uint8_t FIFO_COUNTH{0}; - uint8_t FIFO_COUNTL{0}; - FIFO::DATA f[FIFO_MAX_SAMPLES] {}; - }; - // ensure no struct padding - static_assert(sizeof(FIFOTransferBuffer) == (4 + FIFO_MAX_SAMPLES *sizeof(FIFO::DATA)), - "Invalid FIFOTransferBuffer size"); - - struct register_bank0_config_t { - Register::BANK_0 reg; - uint8_t set_bits{0}; - uint8_t clear_bits{0}; - }; - - struct register_bank1_config_t { - Register::BANK_1 reg; - uint8_t set_bits{0}; - uint8_t clear_bits{0}; - }; - - struct register_bank2_config_t { - Register::BANK_2 reg; - uint8_t set_bits{0}; - uint8_t clear_bits{0}; - }; - - int probe() override; - - bool Reset(); - - bool Configure(); - void ConfigureSampleRate(int sample_rate); - void ConfigureFIFOWatermark(uint8_t samples); - - void SelectRegisterBank(enum REG_BANK_SEL_BIT bank, bool force = false); - void SelectRegisterBank(Register::BANK_0 reg) { SelectRegisterBank(REG_BANK_SEL_BIT::USER_BANK_0); } - void SelectRegisterBank(Register::BANK_1 reg) { SelectRegisterBank(REG_BANK_SEL_BIT::USER_BANK_1); } - void SelectRegisterBank(Register::BANK_2 reg) { SelectRegisterBank(REG_BANK_SEL_BIT::USER_BANK_2); } - - static int DataReadyInterruptCallback(int irq, void *context, void *arg); - void DataReady(); - bool DataReadyInterruptConfigure(); - bool DataReadyInterruptDisable(); - - template bool RegisterCheck(const T ®_cfg); - template uint8_t RegisterRead(T reg); - template void RegisterWrite(T reg, uint8_t value); - template void RegisterSetAndClearBits(T reg, uint8_t setbits, uint8_t clearbits); - template void RegisterSetBits(T reg, uint8_t setbits) { RegisterSetAndClearBits(reg, setbits, 0); } - template void RegisterClearBits(T reg, uint8_t clearbits) { RegisterSetAndClearBits(reg, 0, clearbits); } - - uint16_t FIFOReadCount(); - bool FIFORead(const hrt_abstime ×tamp_sample, uint16_t samples); - void FIFOReset(); - - void ProcessIMU(const hrt_abstime ×tamp_sample, const FIFO::DATA fifo[], const uint8_t samples); - void ProcessAccel(const hrt_abstime ×tamp_sample, const FIFO::DATA fifo[], const uint8_t samples); - void ProcessGyro(const hrt_abstime ×tamp_sample, const FIFO::DATA fifo[], const uint8_t samples); - bool ProcessTemperature(const FIFO::DATA fifo[], const uint8_t samples); - - const spi_drdy_gpio_t _drdy_gpio; - - // std::shared_ptr _px4_accel; - // std::shared_ptr _px4_gyro; - PX4Accelerometer _px4_accel; - PX4Gyroscope _px4_gyro; - - perf_counter_t _bad_register_perf{perf_alloc(PC_COUNT, MODULE_NAME": bad register")}; - perf_counter_t _bad_transfer_perf{perf_alloc(PC_COUNT, MODULE_NAME": bad transfer")}; - perf_counter_t _fifo_empty_perf{perf_alloc(PC_COUNT, MODULE_NAME": FIFO empty")}; - perf_counter_t _fifo_overflow_perf{perf_alloc(PC_COUNT, MODULE_NAME": FIFO overflow")}; - perf_counter_t _fifo_reset_perf{perf_alloc(PC_COUNT, MODULE_NAME": FIFO reset")}; - perf_counter_t _drdy_missed_perf{nullptr}; - - hrt_abstime _reset_timestamp{0}; - hrt_abstime _last_config_check_timestamp{0}; - hrt_abstime _temperature_update_timestamp{0}; - int _failure_count{0}; - - enum REG_BANK_SEL_BIT _last_register_bank {REG_BANK_SEL_BIT::USER_BANK_0}; - - px4::atomic _drdy_fifo_read_samples{0}; - bool _data_ready_interrupt_enabled{false}; - - enum class STATE : uint8_t { - RESET, - WAIT_FOR_RESET, - CONFIGURE, - FIFO_READ, - } _state{STATE::RESET}; - - uint16_t _fifo_empty_interval_us{1250}; // default 1250 us / 800 Hz transfer interval - uint32_t _fifo_gyro_samples{static_cast(_fifo_empty_interval_us / (1000000 / GYRO_RATE))}; - - uint8_t _checked_register_bank0{0}; - static constexpr uint8_t size_register_bank0_cfg{12}; - register_bank0_config_t _register_bank0_cfg[size_register_bank0_cfg] { - // Register | Set bits, Clear bits - { Register::BANK_0::INT_CONFIG, INT_CONFIG_BIT::INT1_MODE | INT_CONFIG_BIT::INT1_DRIVE_CIRCUIT, INT_CONFIG_BIT::INT1_POLARITY }, - { Register::BANK_0::FIFO_CONFIG, FIFO_CONFIG_BIT::FIFO_MODE_STOP_ON_FULL, 0 }, - { Register::BANK_0::GYRO_CONFIG0, GYRO_CONFIG0_BIT::GYRO_FS_SEL_2000_DPS | GYRO_CONFIG0_BIT::GYRO_ODR_8KHZ_SET, GYRO_CONFIG0_BIT::GYRO_ODR_8KHZ_CLEAR }, - { Register::BANK_0::ACCEL_CONFIG0, ACCEL_CONFIG0_BIT::ACCEL_FS_SEL_16G | ACCEL_CONFIG0_BIT::ACCEL_ODR_8KHZ_SET, ACCEL_CONFIG0_BIT::ACCEL_ODR_8KHZ_CLEAR }, - { Register::BANK_0::GYRO_CONFIG1, 0, GYRO_CONFIG1_BIT::GYRO_UI_FILT_ORD }, - { Register::BANK_0::GYRO_ACCEL_CONFIG0, 0, GYRO_ACCEL_CONFIG0_BIT::ACCEL_UI_FILT_BW | GYRO_ACCEL_CONFIG0_BIT::GYRO_UI_FILT_BW }, - { Register::BANK_0::ACCEL_CONFIG1, 0, ACCEL_CONFIG1_BIT::ACCEL_UI_FILT_ORD }, - { Register::BANK_0::FIFO_CONFIG1, FIFO_CONFIG1_BIT::FIFO_WM_GT_TH | FIFO_CONFIG1_BIT::FIFO_HIRES_EN | FIFO_CONFIG1_BIT::FIFO_TEMP_EN | FIFO_CONFIG1_BIT::FIFO_GYRO_EN | FIFO_CONFIG1_BIT::FIFO_ACCEL_EN, 0 }, - { Register::BANK_0::FIFO_CONFIG2, 0, 0 }, // FIFO_WM[7:0] set at runtime - { Register::BANK_0::FIFO_CONFIG3, 0, 0 }, // FIFO_WM[11:8] set at runtime - { Register::BANK_0::INT_CONFIG0, INT_CONFIG0_BIT::CLEAR_ON_FIFO_READ, 0 }, - { Register::BANK_0::INT_SOURCE0, INT_SOURCE0_BIT::FIFO_THS_INT1_EN, 0 }, - }; - - uint8_t _checked_register_bank1{0}; - static constexpr uint8_t size_register_bank1_cfg{4}; - register_bank1_config_t _register_bank1_cfg[size_register_bank1_cfg] { - // Register | Set bits, Clear bits - { Register::BANK_1::GYRO_CONFIG_STATIC2, 0, GYRO_CONFIG_STATIC2_BIT::GYRO_NF_DIS | GYRO_CONFIG_STATIC2_BIT::GYRO_AAF_DIS }, - { Register::BANK_1::GYRO_CONFIG_STATIC3, GYRO_CONFIG_STATIC3_BIT::GYRO_AAF_DELT_SET, GYRO_CONFIG_STATIC3_BIT::GYRO_AAF_DELT_CLEAR}, - { Register::BANK_1::GYRO_CONFIG_STATIC4, GYRO_CONFIG_STATIC4_BIT::GYRO_AAF_DELTSQR_LOW_SET, GYRO_CONFIG_STATIC4_BIT::GYRO_AAF_DELTSQR_LOW_CLEAR}, - { Register::BANK_1::GYRO_CONFIG_STATIC5, GYRO_CONFIG_STATIC5_BIT::GYRO_AAF_BITSHIFT_SET | GYRO_CONFIG_STATIC5_BIT::GYRO_AAF_DELTSQR_HIGH_SET, GYRO_CONFIG_STATIC5_BIT::GYRO_AAF_BITSHIFT_CLEAR | GYRO_CONFIG_STATIC5_BIT::GYRO_AAF_DELTSQR_HIGH_CLEAR}, - }; - - uint8_t _checked_register_bank2{0}; - static constexpr uint8_t size_register_bank2_cfg{3}; - register_bank2_config_t _register_bank2_cfg[size_register_bank2_cfg] { - // Register | Set bits, Clear bits - { Register::BANK_2::ACCEL_CONFIG_STATIC2, ACCEL_CONFIG_STATIC2_BIT::ACCEL_AAF_DELT_SET, ACCEL_CONFIG_STATIC2_BIT::ACCEL_AAF_DELT_CLEAR | ACCEL_CONFIG_STATIC2_BIT::ACCEL_AAF_DIS }, - { Register::BANK_2::ACCEL_CONFIG_STATIC3, ACCEL_CONFIG_STATIC3_BIT::ACCEL_AAF_DELTSQR_LOW_SET, ACCEL_CONFIG_STATIC3_BIT::ACCEL_AAF_DELTSQR_LOW_CLEAR }, - { Register::BANK_2::ACCEL_CONFIG_STATIC4, ACCEL_CONFIG_STATIC4_BIT::ACCEL_AAF_BITSHIFT_SET | ACCEL_CONFIG_STATIC4_BIT::ACCEL_AAF_DELTSQR_HIGH_SET, ACCEL_CONFIG_STATIC4_BIT::ACCEL_AAF_BITSHIFT_CLEAR | ACCEL_CONFIG_STATIC4_BIT::ACCEL_AAF_DELTSQR_HIGH_CLEAR }, - }; - - uint32_t _temperature_samples{0}; - - // Support for the IMU server - uint32_t _imu_server_index{0}; - uint32_t _imu_server_decimator{0}; - imu_server_s _imu_server_data; - uORB::Publication _imu_server_pub{ORB_ID(imu_server)}; - -}; diff --git a/boards/modalai/voxl2-slpi/src/drivers/icm42688p/InvenSense_ICM42688P_registers.hpp b/boards/modalai/voxl2-slpi/src/drivers/icm42688p/InvenSense_ICM42688P_registers.hpp deleted file mode 100644 index b3c020bd7619..000000000000 --- a/boards/modalai/voxl2-slpi/src/drivers/icm42688p/InvenSense_ICM42688P_registers.hpp +++ /dev/null @@ -1,430 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2020 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/** - * @file InvenSense_ICM42688P_registers.hpp - * - * Invensense ICM-42688-P registers. - * - */ - -#pragma once - -#include - -namespace InvenSense_ICM42688P -{ -// TODO: move to a central header -static constexpr uint8_t Bit0 = (1 << 0); -static constexpr uint8_t Bit1 = (1 << 1); -static constexpr uint8_t Bit2 = (1 << 2); -static constexpr uint8_t Bit3 = (1 << 3); -static constexpr uint8_t Bit4 = (1 << 4); -static constexpr uint8_t Bit5 = (1 << 5); -static constexpr uint8_t Bit6 = (1 << 6); -static constexpr uint8_t Bit7 = (1 << 7); - -static constexpr uint32_t SPI_SPEED = 24 * 1000 * 1000; // 24 MHz SPI -static constexpr uint8_t DIR_READ = 0x80; - -static constexpr uint8_t WHOAMI = 0x47; - -static constexpr float TEMPERATURE_SENSITIVITY = 132.48f; // LSB/C -static constexpr float TEMPERATURE_OFFSET = 25.f; // C - -namespace Register -{ - -enum class BANK_0 : uint8_t { - DEVICE_CONFIG = 0x11, - - INT_CONFIG = 0x14, - - FIFO_CONFIG = 0x16, - - TEMP_DATA1 = 0x1D, - TEMP_DATA0 = 0x1E, - - INT_STATUS = 0x2D, - FIFO_COUNTH = 0x2E, - FIFO_COUNTL = 0x2F, - FIFO_DATA = 0x30, - - SIGNAL_PATH_RESET = 0x4B, - INTF_CONFIG0 = 0x4C, - INTF_CONFIG1 = 0x4D, - PWR_MGMT0 = 0x4E, - GYRO_CONFIG0 = 0x4F, - ACCEL_CONFIG0 = 0x50, - GYRO_CONFIG1 = 0x51, - GYRO_ACCEL_CONFIG0 = 0x52, - ACCEL_CONFIG1 = 0x53, - - FIFO_CONFIG1 = 0x5F, - FIFO_CONFIG2 = 0x60, - FIFO_CONFIG3 = 0x61, - - INT_CONFIG0 = 0x63, - - INT_SOURCE0 = 0x65, - - SELF_TEST_CONFIG = 0x70, - - WHO_AM_I = 0x75, - REG_BANK_SEL = 0x76, -}; - -enum class BANK_1 : uint8_t { - GYRO_CONFIG_STATIC2 = 0x0B, - GYRO_CONFIG_STATIC3 = 0x0C, - GYRO_CONFIG_STATIC4 = 0x0D, - GYRO_CONFIG_STATIC5 = 0x0E, - INTF_CONFIG5 = 0x7B, -}; -enum class BANK_2 : uint8_t { - ACCEL_CONFIG_STATIC2 = 0x03, - ACCEL_CONFIG_STATIC3 = 0x04, - ACCEL_CONFIG_STATIC4 = 0x05, -}; - -}; - -//---------------- BANK0 Register bits - -// DEVICE_CONFIG -enum DEVICE_CONFIG_BIT : uint8_t { - SOFT_RESET_CONFIG = Bit0, // -}; - -// INT_CONFIG -enum INT_CONFIG_BIT : uint8_t { - INT1_MODE = Bit2, - INT1_DRIVE_CIRCUIT = Bit1, - INT1_POLARITY = Bit0, -}; - -// FIFO_CONFIG -enum FIFO_CONFIG_BIT : uint8_t { - // 7:6 FIFO_MODE - FIFO_MODE_STOP_ON_FULL = Bit7 | Bit6, // 11: STOP-on-FULL Mode -}; - -// INT_STATUS -enum INT_STATUS_BIT : uint8_t { - RESET_DONE_INT = Bit4, - DATA_RDY_INT = Bit3, - FIFO_THS_INT = Bit2, - FIFO_FULL_INT = Bit1, -}; - -// SIGNAL_PATH_RESET -enum SIGNAL_PATH_RESET_BIT : uint8_t { - ABORT_AND_RESET = Bit3, - FIFO_FLUSH = Bit1, -}; - -// PWR_MGMT0 -enum PWR_MGMT0_BIT : uint8_t { - GYRO_MODE_LOW_NOISE = Bit3 | Bit2, // 11: Places gyroscope in Low Noise (LN) Mode - ACCEL_MODE_LOW_NOISE = Bit1 | Bit0, // 11: Places accelerometer in Low Noise (LN) Mode -}; - -// GYRO_CONFIG0 -enum GYRO_CONFIG0_BIT : uint8_t { - // 7:5 GYRO_FS_SEL - GYRO_FS_SEL_2000_DPS = 0, // 0b000 = ±2000dps (default) - GYRO_FS_SEL_1000_DPS = Bit5, - GYRO_FS_SEL_500_DPS = Bit6, - GYRO_FS_SEL_250_DPS = Bit6 | Bit5, - GYRO_FS_SEL_125_DPS = Bit7, - - - // 3:0 GYRO_ODR - // 0001: 32kHz - GYRO_ODR_32KHZ_SET = Bit0, - GYRO_ODR_32KHZ_CLEAR = Bit3 | Bit2 | Bit0, - // 0010: 16kHz - GYRO_ODR_16KHZ_SET = Bit1, - GYRO_ODR_16KHZ_CLEAR = Bit3 | Bit2 | Bit0, - // 0011: 8kHz - GYRO_ODR_8KHZ_SET = Bit1 | Bit0, - GYRO_ODR_8KHZ_CLEAR = Bit3 | Bit2, - // 0110: 1kHz (default) - GYRO_ODR_1KHZ_SET = Bit2 | Bit1, - GYRO_ODR_1KHZ_CLEAR = Bit3 | Bit0, -}; - -// ACCEL_CONFIG0 -enum ACCEL_CONFIG0_BIT : uint8_t { - // 7:5 ACCEL_FS_SEL - ACCEL_FS_SEL_16G = 0, // 000: ±16g (default) - ACCEL_FS_SEL_8G = Bit5, - ACCEL_FS_SEL_4G = Bit6, - ACCEL_FS_SEL_2G = Bit6 | Bit5, - - - // 3:0 ACCEL_ODR - // 0001: 32kHz - ACCEL_ODR_32KHZ_SET = Bit0, - ACCEL_ODR_32KHZ_CLEAR = Bit3 | Bit2 | Bit0, - // 0010: 16kHz - ACCEL_ODR_16KHZ_SET = Bit1, - ACCEL_ODR_16KHZ_CLEAR = Bit3 | Bit2 | Bit0, - // 0011: 8kHz - ACCEL_ODR_8KHZ_SET = Bit1 | Bit0, - ACCEL_ODR_8KHZ_CLEAR = Bit3 | Bit2, - // 0110: 1kHz (default) - ACCEL_ODR_1KHZ_SET = Bit2 | Bit1, - ACCEL_ODR_1KHZ_CLEAR = Bit3 | Bit0, -}; - -// GYRO_CONFIG1 -enum GYRO_CONFIG1_BIT : uint8_t { - GYRO_UI_FILT_ORD = Bit3 | Bit2, // 00: 1st Order -}; - -// GYRO_ACCEL_CONFIG0 -enum GYRO_ACCEL_CONFIG0_BIT : uint8_t { - // 7:4 ACCEL_UI_FILT_BW - ACCEL_UI_FILT_BW = Bit7 | Bit6 | Bit5 | Bit4, // 0: BW=ODR/2 - - // 3:0 GYRO_UI_FILT_BW - GYRO_UI_FILT_BW = Bit3 | Bit2 | Bit1 | Bit0, // 0: BW=ODR/2 -}; - -// ACCEL_CONFIG1 -enum ACCEL_CONFIG1_BIT : uint8_t { - ACCEL_UI_FILT_ORD = Bit4 | Bit3, // 00: 1st Order -}; - -// FIFO_CONFIG1 -enum FIFO_CONFIG1_BIT : uint8_t { - FIFO_RESUME_PARTIAL_RD = Bit6, - FIFO_WM_GT_TH = Bit5, - FIFO_HIRES_EN = Bit4, - FIFO_TEMP_EN = Bit2, - FIFO_GYRO_EN = Bit1, - FIFO_ACCEL_EN = Bit0, -}; - -// INT_CONFIG0 -enum INT_CONFIG0_BIT : uint8_t { - // 3:2 FIFO_THS_INT_CLEAR - CLEAR_ON_FIFO_READ = Bit3, -}; - -// INT_SOURCE0 -enum INT_SOURCE0_BIT : uint8_t { - UI_FSYNC_INT1_EN = Bit6, - PLL_RDY_INT1_EN = Bit5, - RESET_DONE_INT1_EN = Bit4, - UI_DRDY_INT1_EN = Bit3, - FIFO_THS_INT1_EN = Bit2, // FIFO threshold interrupt routed to INT1 - FIFO_FULL_INT1_EN = Bit1, - UI_AGC_RDY_INT1_EN = Bit0, -}; - -// REG_BANK_SEL -enum REG_BANK_SEL_BIT : uint8_t { - USER_BANK_0 = 0, // 0: Select USER BANK 0. - USER_BANK_1 = Bit0, // 1: Select USER BANK 1. - USER_BANK_2 = Bit1, // 2: Select USER BANK 2. - USER_BANK_3 = Bit1 | Bit0, // 3: Select USER BANK 3. -}; - - -//---------------- BANK1 Register bits - -// GYRO_CONFIG_STATIC2 -enum GYRO_CONFIG_STATIC2_BIT : uint8_t { - GYRO_AAF_DIS = Bit1, - GYRO_NF_DIS = Bit0, -}; - -// GYRO_CONFIG_STATIC3 -enum GYRO_CONFIG_STATIC3_BIT : uint8_t { - - // 585 Hz - GYRO_AAF_DELT_SET = Bit3 | Bit2 | Bit0, //13 - GYRO_AAF_DELT_CLEAR = Bit5 | Bit4 | Bit1, - - // 213 Hz - // GYRO_AAF_DELT_SET = Bit2 | Bit0, //5 - // GYRO_AAF_DELT_CLEAR = Bit5 | Bit4 | Bit3 | Bit1, - - // 126 Hz - //GYRO_AAF_DELT_SET = Bit1 | Bit0, //3 - //GYRO_AAF_DELT_CLEAR = Bit5 | Bit4 | Bit3 | Bit2, - - // 42 Hz - // GYRO_AAF_DELT_SET = Bit0, //1 - // GYRO_AAF_DELT_CLEAR = Bit5 | Bit4 | Bit3 | Bit2 | Bit1, - -}; - -// GYRO_CONFIG_STATIC4 -enum GYRO_CONFIG_STATIC4_BIT : uint8_t { - - // 585 Hz - GYRO_AAF_DELTSQR_LOW_SET = Bit7 | Bit5 | Bit3 | Bit1, //170 - GYRO_AAF_DELTSQR_LOW_CLEAR = Bit6 | Bit4 | Bit2 | Bit0, - - // 213 Hz - // GYRO_AAF_DELTSQR_LOW_SET = Bit4 | Bit3 | Bit0, //25 - // GYRO_AAF_DELTSQR_LOW_CLEAR = Bit7 | Bit6 | Bit5 | Bit2 | Bit1, - - // 126 Hz - //GYRO_AAF_DELTSQR_LOW_SET = Bit3 | Bit0, //9 - //GYRO_AAF_DELTSQR_LOW_CLEAR = Bit7 | Bit6 | Bit5 | Bit4 | Bit2 | Bit1, - - // 42 Hz - // GYRO_AAF_DELTSQR_LOW_SET = Bit0, //1 - // GYRO_AAF_DELTSQR_LOW_CLEAR = Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1, -}; - -// GYRO_CONFIG_STATIC5 -enum GYRO_CONFIG_STATIC5_BIT : uint8_t { - - // 585 Hz - GYRO_AAF_DELTSQR_HIGH_SET = 0, - GYRO_AAF_DELTSQR_HIGH_CLEAR = Bit3 | Bit2 | Bit1 | Bit0, - GYRO_AAF_BITSHIFT_SET = Bit7, // 8 << 4 - GYRO_AAF_BITSHIFT_CLEAR = Bit6 | Bit5 | Bit4, - - // 213 Hz - // GYRO_AAF_DELTSQR_HIGH_SET = 0, - // GYRO_AAF_DELTSQR_HIGH_CLEAR = Bit3 | Bit2 | Bit1 | Bit0, - // GYRO_AAF_BITSHIFT_SET = Bit7 | Bit5, //10 - // GYRO_AAF_BITSHIFT_CLEAR = Bit6 | Bit4, - - // 126 Hz - // GYRO_AAF_BITSHIFT_SET = Bit7 | Bit6, //12 - // GYRO_AAF_BITSHIFT_CLEAR = Bit5 | Bit4, - - // 42 Hz - // GYRO_AAF_BITSHIFT_SET = Bit7 | Bit6 | Bit5 | Bit4, //15 - // GYRO_AAF_BITSHIFT_CLEAR = 0, - - -}; - - -//---------------- BANK2 Register bits - -// ACCEL_CONFIG_STATIC2 -enum ACCEL_CONFIG_STATIC2_BIT : uint8_t { - ACCEL_AAF_DIS = Bit0, - ACCEL_AAF_DELT = Bit3 | Bit1, - - // 213 Hz - ACCEL_AAF_DELT_SET = Bit3 | Bit1, //5 - ACCEL_AAF_DELT_CLEAR = Bit6 | Bit5 | Bit4 | Bit2, - - // 42 Hz - // ACCEL_AAF_DELT_SET = Bit1, //1 - // ACCEL_AAF_DELT_CLEAR = Bit6 | Bit5 | Bit4 | Bit3 | Bit2, -}; - -// ACCEL_CONFIG_STATIC3 -enum ACCEL_CONFIG_STATIC3_BIT : uint8_t { - ACCEL_AAF_DELTSQR_LOW = Bit4 | Bit3 | Bit0, - // 213 Hz - ACCEL_AAF_DELTSQR_LOW_SET = Bit4 | Bit3 | Bit0, //25 - ACCEL_AAF_DELTSQR_LOW_CLEAR = Bit7 | Bit6 | Bit5 | Bit2 | Bit1, - - // 42 Hz - // ACCEL_AAF_DELTSQR_LOW_SET = Bit0, //1 - // ACCEL_AAF_DELTSQR_LOW_CLEAR = Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1, - -}; - -// ACCEL_CONFIG_STATIC4 -enum ACCEL_CONFIG_STATIC4_BIT : uint8_t { - ACCEL_AAF_BITSHIFT = Bit7 | Bit5, - ACCEL_AAF_DELTSQR_HIGH = 0, - // 213 Hz - ACCEL_AAF_BITSHIFT_SET = Bit7 | Bit5, //10 - ACCEL_AAF_BITSHIFT_CLEAR = Bit6 | Bit4, - - // 42 Hz - // ACCEL_AAF_BITSHIFT_SET = Bit7 | Bit6 | Bit5 | Bit4, //15 - // ACCEL_AAF_BITSHIFT_CLEAR = 0, - - ACCEL_AAF_DELTSQR_HIGH_SET = 0, - ACCEL_AAF_DELTSQR_HIGH_CLEAR = Bit3 | Bit2 | Bit1 | Bit0, -}; - - -namespace FIFO -{ -static constexpr size_t SIZE = 2048; - -// FIFO_DATA layout when FIFO_CONFIG1 has FIFO_GYRO_EN and FIFO_ACCEL_EN set - -// Packet 4 -struct DATA { - uint8_t FIFO_Header; - uint8_t ACCEL_DATA_X1; // Accel X [19:12] - uint8_t ACCEL_DATA_X0; // Accel X [11:4] - uint8_t ACCEL_DATA_Y1; // Accel Y [19:12] - uint8_t ACCEL_DATA_Y0; // Accel Y [11:4] - uint8_t ACCEL_DATA_Z1; // Accel Z [19:12] - uint8_t ACCEL_DATA_Z0; // Accel Z [11:4] - uint8_t GYRO_DATA_X1; // Gyro X [19:12] - uint8_t GYRO_DATA_X0; // Gyro X [11:4] - uint8_t GYRO_DATA_Y1; // Gyro Y [19:12] - uint8_t GYRO_DATA_Y0; // Gyro Y [11:4] - uint8_t GYRO_DATA_Z1; // Gyro Z [19:12] - uint8_t GYRO_DATA_Z0; // Gyro Z [11:4] - uint8_t TEMP_DATA1; // Temperature[15:8] - uint8_t TEMP_DATA0; // Temperature[7:0] - uint8_t TimeStamp_h; // TimeStamp[15:8] - uint8_t TimeStamp_l; // TimeStamp[7:0] - uint8_t Ext_Accel_X_Gyro_X; // Accel X [3:0] Gyro X [3:0] - uint8_t Ext_Accel_Y_Gyro_Y; // Accel Y [3:0] Gyro Y [3:0] - uint8_t Ext_Accel_Z_Gyro_Z; // Accel Z [3:0] Gyro Z [3:0] -}; - -// With FIFO_ACCEL_EN and FIFO_GYRO_EN header should be 8’b_0110_10xx -enum FIFO_HEADER_BIT : uint8_t { - HEADER_MSG = Bit7, // 1: FIFO is empty - HEADER_ACCEL = Bit6, // 1: Packet is sized so that accel data have location in the packet, FIFO_ACCEL_EN must be 1 - HEADER_GYRO = Bit5, // 1: Packet is sized so that gyro data have location in the packet, FIFO_GYRO_EN must be1 - HEADER_20 = Bit4, // 1: Packet has a new and valid sample of extended 20-bit data for gyro and/or accel - HEADER_TIMESTAMP_FSYNC = Bit3 | Bit2, - HEADER_ODR_ACCEL = Bit1, // 1: The ODR for accel is different for this accel data packet compared to the previous accel packet - HEADER_ODR_GYRO = Bit0, // 1: The ODR for gyro is different for this gyro data packet compared to the previous gyro packet -}; - -} -} // namespace InvenSense_ICM42688P diff --git a/boards/modalai/voxl2-slpi/src/drivers/icm42688p/icm42688p_main.cpp b/boards/modalai/voxl2-slpi/src/drivers/icm42688p/icm42688p_main.cpp deleted file mode 100644 index 38deecdf57cb..000000000000 --- a/boards/modalai/voxl2-slpi/src/drivers/icm42688p/icm42688p_main.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/**************************************************************************** - * - * Copyright (c) 2020 PX4 Development Team. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name PX4 nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -#include "ICM42688P.hpp" - -#include -#include -#include - -void ICM42688P::print_usage() -{ - PRINT_MODULE_USAGE_NAME("icm42688p", "driver"); - PRINT_MODULE_USAGE_SUBCATEGORY("imu"); - PRINT_MODULE_USAGE_COMMAND("start"); - PRINT_MODULE_USAGE_PARAMS_I2C_SPI_DRIVER(false, true); - PRINT_MODULE_USAGE_PARAM_INT('R', 0, 0, 35, "Rotation", true); - PRINT_MODULE_USAGE_DEFAULT_COMMANDS(); -} - -// I2CSPIDriverBase *ICM42688P::instantiate(const BusCLIArguments &cli, const BusInstanceIterator &iterator, -// int runtime_instance) -// { -// ICM42688P *instance = new ICM42688P(iterator.configuredBusOption(), iterator.bus(), iterator.devid(), cli.rotation, -// cli.bus_frequency, cli.spi_mode, iterator.DRDYGPIO()); -// -// if (!instance) { -// PX4_ERR("alloc failed"); -// return nullptr; -// } -// -// if (OK != instance->init()) { -// delete instance; -// return nullptr; -// } -// -// return instance; -// } - -extern "C" int icm42688p_main(int argc, char *argv[]) -{ - - for (int i = 0; i <= argc - 1; i++) { - if (std::string(argv[i]) == "-h") { - argv[i] = 0; - hitl_mode = true; - break; - } - } - - int ch; - using ThisDriver = ICM42688P; - BusCLIArguments cli{false, true}; - cli.default_spi_frequency = SPI_SPEED; - - while ((ch = cli.getOpt(argc, argv, "R:")) != EOF) { - switch (ch) { - case 'R': - cli.rotation = (enum Rotation)atoi(cli.optArg()); - break; - } - } - - const char *verb = cli.optArg(); - - if (!verb) { - ThisDriver::print_usage(); - return -1; - } - - BusInstanceIterator iterator(MODULE_NAME, cli, DRV_IMU_DEVTYPE_ICM42688P); - - if (!strcmp(verb, "start")) { - return ThisDriver::module_start(cli, iterator); - } - - if (!strcmp(verb, "stop")) { - return ThisDriver::module_stop(iterator); - } - - if (!strcmp(verb, "status")) { - return ThisDriver::module_status(iterator); - } - - ThisDriver::print_usage(); - return -1; -} diff --git a/boards/modalai/voxl2/cmake/init.cmake b/boards/modalai/voxl2/cmake/init.cmake new file mode 100644 index 000000000000..e5a4daad5f8b --- /dev/null +++ b/boards/modalai/voxl2/cmake/init.cmake @@ -0,0 +1,34 @@ +############################################################################ +# +# Copyright (c) 2024 ModalAI, 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: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. Neither the name PX4 nor the names of its contributors may be +# used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +############################################################################ + +include_directories(${PX4_BOARD_DIR}/libfc-sensor-api/inc) \ No newline at end of file diff --git a/boards/modalai/voxl2/cmake/link_libraries.cmake b/boards/modalai/voxl2/cmake/link_libraries.cmake index f250f52e211b..e0b09beb7038 100644 --- a/boards/modalai/voxl2/cmake/link_libraries.cmake +++ b/boards/modalai/voxl2/cmake/link_libraries.cmake @@ -1,7 +1,7 @@ # Link against the public stub version of the proprietary fc sensor library target_link_libraries(px4 PRIVATE - ${PX4_SOURCE_DIR}/src//modules/muorb/apps/libfc-sensor-api/build/libfc_sensor.so + ${PX4_BOARD_DIR}/libfc-sensor-api/build/libfc_sensor.so px4_layer ${module_libraries} ) diff --git a/boards/modalai/voxl2/default.px4board b/boards/modalai/voxl2/default.px4board index bf42bff4c977..8ac31695723f 100644 --- a/boards/modalai/voxl2/default.px4board +++ b/boards/modalai/voxl2/default.px4board @@ -11,7 +11,6 @@ CONFIG_DRIVERS_VOXL2_IO=y CONFIG_MODULES_COMMANDER=y CONFIG_MODULES_CONTROL_ALLOCATOR=y CONFIG_MODULES_DATAMAN=y -CONFIG_MODULES_LOAD_MON=y CONFIG_MODULES_LOGGER=y CONFIG_MODULES_MAVLINK=y CONFIG_MODULES_MUORB_APPS=y @@ -26,3 +25,4 @@ CONFIG_SYSTEMCMDS_TOPIC_LISTENER=y CONFIG_SYSTEMCMDS_UORB=y CONFIG_SYSTEMCMDS_VER=y CONFIG_ORB_COMMUNICATOR=y +CONFIG_PARAM_PRIMARY=y diff --git a/src/modules/muorb/apps/libfc-sensor-api b/boards/modalai/voxl2/libfc-sensor-api similarity index 100% rename from src/modules/muorb/apps/libfc-sensor-api rename to boards/modalai/voxl2/libfc-sensor-api diff --git a/boards/modalai/voxl2/scripts/build-deps.sh b/boards/modalai/voxl2/scripts/build-deps.sh index b76cd0d7fa79..fe7f85486888 100755 --- a/boards/modalai/voxl2/scripts/build-deps.sh +++ b/boards/modalai/voxl2/scripts/build-deps.sh @@ -1,10 +1,9 @@ #!/bin/bash -cd src/modules/muorb/apps/libfc-sensor-api +cd boards/modalai/voxl2/libfc-sensor-api rm -fR build mkdir build cd build CC=/home/4.1.0.4/tools/linaro64/bin/aarch64-linux-gnu-gcc cmake .. make -cd ../../../../../.. - +cd ../../../../.. diff --git a/boards/modalai/voxl2/target/voxl-px4-hitl-start b/boards/modalai/voxl2/target/voxl-px4-hitl-start index d56f489e29de..45ef0b2ddf53 100755 --- a/boards/modalai/voxl2/target/voxl-px4-hitl-start +++ b/boards/modalai/voxl2/target/voxl-px4-hitl-start @@ -76,12 +76,13 @@ qshell flight_mode_manager start # Start all of the processing modules on the applications processor dataman start navigator start -load_mon start # Start microdds_client for ros2 offboard messages from agent over localhost microdds_client start -t udp -h 127.0.0.1 -p 8888 qshell pwm_out_sim start -m hil +# g = gps, m = mag, o = odometry (vio), h = distance sensor, f = optic flow +# qshell dsp_hitl start -g -m -o -h -f qshell dsp_hitl start -g -m # start the onboard fast link to connect to voxl-mavlink-server diff --git a/boards/modalai/voxl2/target/voxl-px4-start b/boards/modalai/voxl2/target/voxl-px4-start index e6bfc8b7b4ff..5a9149f225a2 100755 --- a/boards/modalai/voxl2/target/voxl-px4-start +++ b/boards/modalai/voxl2/target/voxl-px4-start @@ -207,7 +207,6 @@ qshell flight_mode_manager start # Start all of the processing modules on the applications processor dataman start navigator start -load_mon start # This bridge allows raw data packets to be sent over UART to the ESC voxl2_io_bridge start diff --git a/boards/mro/ctrl-zero-classic/default.px4board b/boards/mro/ctrl-zero-classic/default.px4board index f88c94880fda..d07a7c1fc9d4 100644 --- a/boards/mro/ctrl-zero-classic/default.px4board +++ b/boards/mro/ctrl-zero-classic/default.px4board @@ -1,9 +1,11 @@ CONFIG_BOARD_TOOLCHAIN="arm-none-eabi" CONFIG_BOARD_ARCHITECTURE="cortex-m7" -CONFIG_BOARD_SERIAL_GPS1="/dev/ttyS2" -CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS0" -CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS1" -CONFIG_BOARD_SERIAL_TEL3="/dev/ttyS4" +CONFIG_BOARD_SERIAL_GPS1="/dev/ttyS3" +CONFIG_BOARD_SERIAL_GPS2="/dev/ttyS4" +CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS1" +CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS2" +CONFIG_BOARD_SERIAL_TEL3="/dev/ttyS5" +CONFIG_BOARD_SERIAL_TEL4="/dev/ttyS0" CONFIG_DRIVERS_ADC_ADS1115=y CONFIG_DRIVERS_ADC_BOARD_ADC=y CONFIG_DRIVERS_BAROMETER_DPS310=y @@ -25,6 +27,7 @@ CONFIG_DRIVERS_PCA9685_PWM_OUT=y CONFIG_DRIVERS_POWER_MONITOR_INA226=y CONFIG_DRIVERS_PWM_OUT=y CONFIG_DRIVERS_RC_INPUT=y +CONFIG_DRIVERS_SAFETY_BUTTON=y CONFIG_DRIVERS_SMART_BATTERY_BATMON=y CONFIG_COMMON_TELEMETRY=y CONFIG_DRIVERS_TONE_ALARM=y @@ -46,7 +49,6 @@ CONFIG_MODULES_FW_POS_CONTROL=y CONFIG_MODULES_FW_RATE_CONTROL=y CONFIG_MODULES_GIMBAL=y CONFIG_MODULES_GYRO_CALIBRATION=y -CONFIG_MODULES_GYRO_FFT=y CONFIG_MODULES_LAND_DETECTOR=y CONFIG_MODULES_LANDING_TARGET_ESTIMATOR=y CONFIG_MODULES_LOAD_MON=y @@ -96,4 +98,3 @@ CONFIG_SYSTEMCMDS_UORB=y CONFIG_SYSTEMCMDS_USB_CONNECTED=y CONFIG_SYSTEMCMDS_VER=y CONFIG_SYSTEMCMDS_WORK_QUEUE=y -CONFIG_EXAMPLES_FAKE_GPS=y diff --git a/boards/mro/ctrl-zero-classic/init/rc.board_defaults b/boards/mro/ctrl-zero-classic/init/rc.board_defaults index 32117f4a5886..110c240ee8a0 100644 --- a/boards/mro/ctrl-zero-classic/init/rc.board_defaults +++ b/boards/mro/ctrl-zero-classic/init/rc.board_defaults @@ -6,4 +6,4 @@ param set-default BAT1_V_DIV 10.1 param set-default BAT1_A_PER_V 17 -safety_button start +param set-default TEL_FRSKY_CONFIG 103 diff --git a/boards/mro/ctrl-zero-classic/init/rc.board_sensors b/boards/mro/ctrl-zero-classic/init/rc.board_sensors index 111e3eb0440b..46f488794516 100644 --- a/boards/mro/ctrl-zero-classic/init/rc.board_sensors +++ b/boards/mro/ctrl-zero-classic/init/rc.board_sensors @@ -16,3 +16,5 @@ icm20948 -s -b 1 -R 8 -M start # Interal DPS310 (barometer) dps310 -s -b 2 start + +safety_button start diff --git a/boards/mro/ctrl-zero-classic/nuttx-config/bootloader/defconfig b/boards/mro/ctrl-zero-classic/nuttx-config/bootloader/defconfig index 1167e3eefa79..1160920a4eb3 100644 --- a/boards/mro/ctrl-zero-classic/nuttx-config/bootloader/defconfig +++ b/boards/mro/ctrl-zero-classic/nuttx-config/bootloader/defconfig @@ -15,7 +15,7 @@ CONFIG_ARCH_BOARD_CUSTOM_DIR="../../../../boards/mro/ctrl-zero-classic/nuttx-con CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y CONFIG_ARCH_BOARD_CUSTOM_NAME="px4" CONFIG_ARCH_CHIP="stm32h7" -CONFIG_ARCH_CHIP_STM32H743II=y +CONFIG_ARCH_CHIP_STM32H743ZI=y CONFIG_ARCH_CHIP_STM32H7=y CONFIG_ARCH_INTERRUPTSTACK=768 CONFIG_ARMV7M_BASEPRI_WAR=y diff --git a/boards/mro/ctrl-zero-classic/nuttx-config/include/board.h b/boards/mro/ctrl-zero-classic/nuttx-config/include/board.h index d5ffa2c5848e..52206cccd00f 100644 --- a/boards/mro/ctrl-zero-classic/nuttx-config/include/board.h +++ b/boards/mro/ctrl-zero-classic/nuttx-config/include/board.h @@ -222,6 +222,9 @@ /* UART/USART */ +#define GPIO_USART1_TX GPIO_USART1_TX_3 /* PB6 */ +#define GPIO_USART1_RX GPIO_USART1_RX_3 /* PB7 */ + #define GPIO_USART2_TX GPIO_USART2_TX_2 /* PD5 */ #define GPIO_USART2_RX GPIO_USART2_RX_2 /* PD6 */ #define GPIO_USART2_CTS GPIO_USART2_CTS_NSS_2 /* PD3 */ @@ -235,9 +238,6 @@ #define GPIO_UART4_TX GPIO_UART4_TX_2 /* PA0 */ #define GPIO_UART4_RX GPIO_UART4_RX_2 /* PA1 */ -#define GPIO_USART6_TX 0 /* USART6 is RX-only */ -#define GPIO_USART6_RX GPIO_USART6_RX_1 /* PC7 */ - #define GPIO_UART7_TX GPIO_UART7_TX_3 /* PE8 */ #define GPIO_UART7_RX GPIO_UART7_RX_3 /* PE7 */ @@ -268,13 +268,14 @@ #define GPIO_SPI5_MISO GPIO_SPI5_MISO_1 /* PF8 */ #define GPIO_SPI5_MOSI GPIO_SPI5_MOSI_2 /* PF9 */ +#define GPIO_SPI6_SCK ADJ_SLEW_RATE(GPIO_SPI6_SCK_1) /* PG13 */ +#define GPIO_SPI6_MISO GPIO_SPI6_MISO_1 /* PG12 */ +#define GPIO_SPI6_MOSI GPIO_SPI6_MOSI_1 /* PG14 */ + /* I2C */ #define GPIO_I2C1_SCL GPIO_I2C1_SCL_2 /* PB8 */ #define GPIO_I2C1_SDA GPIO_I2C1_SDA_2 /* PB9 */ -#define GPIO_I2C3_SCL GPIO_I2C3_SCL_2 /* PH7 */ -#define GPIO_I2C3_SDA GPIO_I2C3_SDA_2 /* PH8 */ - -#define GPIO_I2C4_SCL GPIO_I2C4_SCL_4 /* PB6 */ -#define GPIO_I2C4_SDA GPIO_I2C4_SDA_4 /* PB7 */ +#define GPIO_I2C4_SCL GPIO_I2C4_SCL_2 /* PF14 */ +#define GPIO_I2C4_SDA GPIO_I2C4_SDA_2 /* PF15 */ diff --git a/boards/mro/ctrl-zero-classic/nuttx-config/nsh/defconfig b/boards/mro/ctrl-zero-classic/nuttx-config/nsh/defconfig index 0811c67f0af1..7e56401723d0 100644 --- a/boards/mro/ctrl-zero-classic/nuttx-config/nsh/defconfig +++ b/boards/mro/ctrl-zero-classic/nuttx-config/nsh/defconfig @@ -56,7 +56,7 @@ CONFIG_ARCH_BOARD_CUSTOM_DIR="../../../../boards/mro/ctrl-zero-classic/nuttx-con CONFIG_ARCH_BOARD_CUSTOM_DIR_RELPATH=y CONFIG_ARCH_BOARD_CUSTOM_NAME="px4" CONFIG_ARCH_CHIP="stm32h7" -CONFIG_ARCH_CHIP_STM32H743II=y +CONFIG_ARCH_CHIP_STM32H743ZI=y CONFIG_ARCH_CHIP_STM32H7=y CONFIG_ARCH_INTERRUPTSTACK=768 CONFIG_ARCH_STACKDUMP=y @@ -192,7 +192,6 @@ CONFIG_STM32H7_DMA2=y CONFIG_STM32H7_DMACAPABLE=y CONFIG_STM32H7_FLOWCONTROL_BROKEN=y CONFIG_STM32H7_I2C1=y -CONFIG_STM32H7_I2C3=y CONFIG_STM32H7_I2C4=y CONFIG_STM32H7_I2C_DYNTIMEO=y CONFIG_STM32H7_I2C_DYNTIMEO_STARTSTOP=10 @@ -212,17 +211,20 @@ CONFIG_STM32H7_SPI2=y CONFIG_STM32H7_SPI5=y CONFIG_STM32H7_SPI5_DMA=y CONFIG_STM32H7_SPI5_DMA_BUFFER=1024 +CONFIG_STM32H7_SPI6=y +CONFIG_STM32H7_TIM15=y +CONFIG_STM32H7_TIM16=y CONFIG_STM32H7_TIM1=y CONFIG_STM32H7_TIM2=y CONFIG_STM32H7_TIM3=y CONFIG_STM32H7_TIM4=y CONFIG_STM32H7_TIM8=y +CONFIG_STM32H7_USART1=y +CONFIG_STM32H7_USART2=y +CONFIG_STM32H7_USART3=y CONFIG_STM32H7_UART4=y CONFIG_STM32H7_UART7=y CONFIG_STM32H7_UART8=y -CONFIG_STM32H7_USART2=y -CONFIG_STM32H7_USART3=y -CONFIG_STM32H7_USART6=y CONFIG_STM32H7_USART_BREAKS=y CONFIG_STM32H7_USART_INVERT=y CONFIG_STM32H7_USART_SINGLEWIRE=y @@ -252,9 +254,6 @@ CONFIG_USART3_IFLOWCONTROL=y CONFIG_USART3_OFLOWCONTROL=y CONFIG_USART3_RXBUFSIZE=600 CONFIG_USART3_TXBUFSIZE=3000 -CONFIG_USART6_BAUD=57600 -CONFIG_USART6_RXBUFSIZE=600 -CONFIG_USART6_TXBUFSIZE=1500 CONFIG_USBDEV=y CONFIG_USBDEV_BUSPOWERED=y CONFIG_USBDEV_MAXPOWER=500 diff --git a/boards/mro/ctrl-zero-classic/src/board_config.h b/boards/mro/ctrl-zero-classic/src/board_config.h index dfb0dfcb1a78..d40eb1e56ffc 100644 --- a/boards/mro/ctrl-zero-classic/src/board_config.h +++ b/boards/mro/ctrl-zero-classic/src/board_config.h @@ -45,95 +45,111 @@ #include /* LEDs are driven with push open drain to support Anode to 5V or 3.3V */ -#define GPIO_nLED_RED /* PB11 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN11) -#define GPIO_nLED_GREEN /* PB1 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN1) +#define GPIO_nLED_RED /* PB4 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN4) +#define GPIO_nLED_GREEN /* PB5 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN5) #define GPIO_nLED_BLUE /* PB3 */ (GPIO_OUTPUT|GPIO_OPENDRAIN|GPIO_SPEED_50MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN3) +#define GPIO_LED_SAFETY /* PE6 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN6) + #define BOARD_HAS_CONTROL_STATUS_LEDS 1 #define BOARD_OVERLOAD_LED LED_RED #define BOARD_ARMED_STATE_LED LED_BLUE /* ADC channels */ #define PX4_ADC_GPIO \ - /* PA2 */ GPIO_ADC12_INP14, \ + /* PC4 */ GPIO_ADC12_INP4, \ /* PA3 */ GPIO_ADC12_INP15, \ /* PA4 */ GPIO_ADC12_INP18, \ - /* PC1 */ GPIO_ADC123_INP11 + /* PC0 */ GPIO_ADC123_INP10, \ + /* PC5 */ GPIO_ADC12_INP8, \ + /* PB0 */ GPIO_ADC12_INP9, \ + /* PB1 */ GPIO_ADC12_INP5 /* Define Channel numbers must match above GPIO pins */ -#define ADC_BATTERY_VOLTAGE_CHANNEL 14 /* PA2 BATT_VOLT_SENS */ +#define ADC_BATTERY_VOLTAGE_CHANNEL 4 /* PC4 BATT_VOLT_SENS */ #define ADC_BATTERY_CURRENT_CHANNEL 15 /* PA3 BATT_CURRENT_SENS */ #define ADC_SCALED_V5_CHANNEL 18 /* PA4 VDD_5V_SENS */ -#define ADC_RC_RSSI_CHANNEL 11 /* PC1 */ +#define ADC_RC_RSSI_CHANNEL 10 /* PC0 */ +#define ADC_AIRSPEED_VOLTAGE_CHANNEL 8 /* PC5 */ +#define ADC_AUX1_VOLTAGE_CHANNEL 9 /* PB0 */ +#define ADC_AUX2_VOLTAGE_CHANNEL 5 /* PB1 */ #define ADC_CHANNELS \ ((1 << ADC_BATTERY_VOLTAGE_CHANNEL) | \ (1 << ADC_BATTERY_CURRENT_CHANNEL) | \ (1 << ADC_SCALED_V5_CHANNEL) | \ - (1 << ADC_RC_RSSI_CHANNEL)) + (1 << ADC_RC_RSSI_CHANNEL) | \ + (1 << ADC_AIRSPEED_VOLTAGE_CHANNEL) | \ + (1 << ADC_AUX1_VOLTAGE_CHANNEL) | \ + (1 << ADC_AUX2_VOLTAGE_CHANNEL)) /* HW has to large of R termination on ADC todo:change when HW value is chosen */ #define BOARD_ADC_OPEN_CIRCUIT_V (5.6f) /* CAN Silence: Silent mode control */ -#define GPIO_CAN1_SILENT_S0 /* PF5 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTF|GPIO_PIN5) -#define GPIO_CAN2_SILENT_S0 /* PF5 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTF|GPIO_PIN5) +#define GPIO_CAN1_SILENT_S0 /* PF11 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTF|GPIO_PIN11) +#define GPIO_CAN2_SILENT_S0 /* PF12 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTF|GPIO_PIN12) /* PWM */ #define DIRECT_PWM_OUTPUT_CHANNELS 12 /* Power supply control and monitoring GPIOs */ -#define GPIO_nPOWER_IN_A /* PB5 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTB|GPIO_PIN5) +#define GPIO_nPOWER_IN_A /* PC1 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN1) #define GPIO_VDD_BRICK1_VALID GPIO_nPOWER_IN_A /* Brick 1 Is Chosen */ #define BOARD_NUMBER_BRICKS 1 #define GPIO_VDD_3V3_SPEKTRUM_POWER_EN /* PE4 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN4) +#define GPIO_LEVEL_SHIFTER_OE /* PC13 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTC|GPIO_PIN13) + /* Define True logic Power Control in arch agnostic form */ #define VDD_3V3_SPEKTRUM_POWER_EN(on_true) px4_arch_gpiowrite(GPIO_VDD_3V3_SPEKTRUM_POWER_EN, (!on_true)) #define READ_VDD_3V3_SPEKTRUM_POWER_EN() (px4_arch_gpioread(GPIO_VDD_3V3_SPEKTRUM_POWER_EN) == 0) /* Tone alarm output */ -#define TONE_ALARM_TIMER 2 /* timer 2 */ -#define TONE_ALARM_CHANNEL 1 /* PA15 TIM2_CH1 */ +#define TONE_ALARM_TIMER 16 /* timer 16 */ +#define TONE_ALARM_CHANNEL 1 /* PF6 TIM16_CH1 */ -#define GPIO_BUZZER_1 /* PA15 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN15) +#define GPIO_BUZZER_1 /* PF6 */ (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTF|GPIO_PIN6) #define GPIO_TONE_ALARM_IDLE GPIO_BUZZER_1 -#define GPIO_TONE_ALARM GPIO_TIM2_CH1OUT_2 +#define GPIO_TONE_ALARM GPIO_TIM16_CH1OUT_2 /* USB OTG FS */ #define GPIO_OTGFS_VBUS /* PA9 */ (GPIO_INPUT|GPIO_PULLDOWN|GPIO_SPEED_100MHz|GPIO_PORTA|GPIO_PIN9) /* High-resolution timer */ #define HRT_TIMER 3 /* use timer3 for the HRT */ -#define HRT_TIMER_CHANNEL 1 /* use capture/compare channel 1 */ +#define HRT_TIMER_CHANNEL 2 /* use capture/compare channel 1 */ -#define HRT_PPM_CHANNEL /* T3C3 */ 3 /* use capture/compare channel 3 */ -#define GPIO_PPM_IN /* PB0 T3C3 */ GPIO_TIM3_CH3IN_1 +#define HRT_PPM_CHANNEL /* T3C2 */ 2 /* use capture/compare channel 2 */ +#define GPIO_PPM_IN /* PC7 T3C2 */ GPIO_TIM3_CH2IN_3 /* RC Serial port */ -#define RC_SERIAL_PORT "/dev/ttyS3" +#define RC_SERIAL_PORT "/dev/ttyS5" -#define GPIO_RSSI_IN /* PC1 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN1) +#define GPIO_RSSI_IN /* PC0 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN0) /* Safety Switch: Enable the FMU to control it if there is no px4io fixme:This should be BOARD_SAFETY_LED(__ontrue) */ -#define GPIO_SAFETY_SWITCH_IN /* PC4 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN4) -/* Enable the FMU to use the switch it if there is no px4io fixme:This should be BOARD_SAFTY_BUTTON() */ +#define GPIO_SAFETY_SWITCH_IN /* PA10 */ (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTA|GPIO_PIN10) +/* Enable the FMU to use the switch it if there is no px4io fixme:This should be BOARD_SAFETY_BUTTON() */ #define GPIO_BTN_SAFETY GPIO_SAFETY_SWITCH_IN /* Enable the FMU to control it if there is no px4io */ +/* No PX4IO processor present */ +#define PX4_MFT_HW_SUPPORTED_PX4_MFT_PX4IO 0 + /* Power switch controls ******************************************************/ #define SPEKTRUM_POWER(_on_true) VDD_3V3_SPEKTRUM_POWER_EN(_on_true) /* * Board has a separate RC_IN * - * GPIO PPM_IN on PB0 T3CH3 + * GPIO PPM_IN on PC7 T3CH2 * SPEKTRUM_RX (it's TX or RX in Bind) on UART6 PC7 * Inversion is possible in the UART and can drive GPIO_PPM_IN as an output */ -#define GPIO_PPM_IN_AS_OUT (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN0) +#define GPIO_PPM_IN_AS_OUT (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTC|GPIO_PIN7) #define SPEKTRUM_RX_AS_GPIO_OUTPUT() px4_arch_configgpio(GPIO_PPM_IN_AS_OUT) #define SPEKTRUM_RX_AS_UART() /* Can be left as uart */ #define SPEKTRUM_OUT(_one_true) px4_arch_gpiowrite(GPIO_PPM_IN_AS_OUT, (_one_true)) @@ -156,7 +172,7 @@ #define BOARD_HAS_STATIC_MANIFEST 1 -#define BOARD_NUM_IO_TIMERS 5 +#define BOARD_NUM_IO_TIMERS 6 #define BOARD_ENABLE_CONSOLE_BUFFER @@ -171,9 +187,12 @@ GPIO_CAN2_SILENT_S0, \ GPIO_nPOWER_IN_A, \ GPIO_VDD_3V3_SPEKTRUM_POWER_EN, \ + GPIO_LEVEL_SHIFTER_OE, \ GPIO_TONE_ALARM_IDLE, \ GPIO_SAFETY_SWITCH_IN, \ GPIO_OTGFS_VBUS, \ + GPIO_BTN_SAFETY, \ + GPIO_LED_SAFETY, \ } __BEGIN_DECLS diff --git a/boards/mro/ctrl-zero-classic/src/i2c.cpp b/boards/mro/ctrl-zero-classic/src/i2c.cpp index 1b8927c69939..49c9ea1c7efd 100644 --- a/boards/mro/ctrl-zero-classic/src/i2c.cpp +++ b/boards/mro/ctrl-zero-classic/src/i2c.cpp @@ -35,6 +35,5 @@ constexpr px4_i2c_bus_t px4_i2c_buses[I2C_BUS_MAX_BUS_ITEMS] = { initI2CBusExternal(1), - initI2CBusExternal(3), initI2CBusExternal(4), }; diff --git a/boards/mro/ctrl-zero-classic/src/spi.cpp b/boards/mro/ctrl-zero-classic/src/spi.cpp index 4a4c3502bbd9..674ae3f09b2f 100644 --- a/boards/mro/ctrl-zero-classic/src/spi.cpp +++ b/boards/mro/ctrl-zero-classic/src/spi.cpp @@ -37,7 +37,7 @@ constexpr px4_spi_bus_t px4_spi_buses[SPI_BUS_MAX_BUS_ITEMS] = { initSPIBus(SPI::Bus::SPI1, { - initSPIDevice(DRV_IMU_DEVTYPE_ICM20602, SPI::CS{GPIO::PortC, GPIO::Pin2}, SPI::DRDY{GPIO::PortD, GPIO::Pin15}), + initSPIDevice(DRV_IMU_DEVTYPE_ICM20602, SPI::CS{GPIO::PortG, GPIO::Pin3}, SPI::DRDY{GPIO::PortG, GPIO::Pin2}), initSPIDevice(DRV_IMU_DEVTYPE_ICM20948, SPI::CS{GPIO::PortE, GPIO::Pin15}, SPI::DRDY{GPIO::PortE, GPIO::Pin12}), }, {GPIO::PortE, GPIO::Pin3}), initSPIBus(SPI::Bus::SPI2, { @@ -46,7 +46,10 @@ constexpr px4_spi_bus_t px4_spi_buses[SPI_BUS_MAX_BUS_ITEMS] = { }), initSPIBus(SPI::Bus::SPI5, { initSPIDevice(DRV_GYR_DEVTYPE_BMI088, SPI::CS{GPIO::PortF, GPIO::Pin10}, SPI::DRDY{GPIO::PortF, GPIO::Pin3}), - initSPIDevice(DRV_ACC_DEVTYPE_BMI088, SPI::CS{GPIO::PortF, GPIO::Pin6}, SPI::DRDY{GPIO::PortF, GPIO::Pin1}), + initSPIDevice(DRV_ACC_DEVTYPE_BMI088, SPI::CS{GPIO::PortF, GPIO::Pin0}, SPI::DRDY{GPIO::PortF, GPIO::Pin1}), + }), + initSPIBusExternal(SPI::Bus::SPI6, { + initSPIConfigExternal(SPI::CS{GPIO::PortG, GPIO::Pin9}), }), }; diff --git a/boards/mro/ctrl-zero-classic/src/timer_config.cpp b/boards/mro/ctrl-zero-classic/src/timer_config.cpp index 23bb7a1decc7..50760e387bba 100644 --- a/boards/mro/ctrl-zero-classic/src/timer_config.cpp +++ b/boards/mro/ctrl-zero-classic/src/timer_config.cpp @@ -33,6 +33,28 @@ #include +/* Timer allocation + * + * TIM1_CH4 T FMU_CH1 + * TIM1_CH3 T FMU_CH2 + * TIM1_CH2 T FMU_CH3 + * TIM1_CH1 T FMU_CH4 + * + * TIM4_CH2 T FMU_CH5 + * TIM4_CH3 T FMU_CH6 + * TIM2_CH3 T FMU_CH7 + * TIM2_CH1 T FMU_CH8 + * + * TIM2_CH4 T FMU_CH9 + * TIM15_CH1 T FMU_CH10 + * + * TIM8_CH1 T FMU_CH11 + * + * TIM4_CH4 T FMU_CH12 + * + * TIM16_CH1 T BUZZER - Driven by other driver + */ + constexpr io_timers_t io_timers[MAX_IO_TIMERS] = { initIOTimer(Timer::Timer1, DMA{DMA::Index1}), initIOTimer(Timer::Timer4, DMA{DMA::Index1}), diff --git a/boards/mro/x21-777/extras/px4_io-v2_default.bin b/boards/mro/x21-777/extras/px4_io-v2_default.bin index 957f0f13a12e..5a0796406fc1 100755 Binary files a/boards/mro/x21-777/extras/px4_io-v2_default.bin and b/boards/mro/x21-777/extras/px4_io-v2_default.bin differ diff --git a/boards/mro/x21/extras/px4_io-v2_default.bin b/boards/mro/x21/extras/px4_io-v2_default.bin index 957f0f13a12e..5a0796406fc1 100755 Binary files a/boards/mro/x21/extras/px4_io-v2_default.bin and b/boards/mro/x21/extras/px4_io-v2_default.bin differ diff --git a/boards/px4/fmu-v2/extras/px4_io-v2_default.bin b/boards/px4/fmu-v2/extras/px4_io-v2_default.bin index 957f0f13a12e..5a0796406fc1 100755 Binary files a/boards/px4/fmu-v2/extras/px4_io-v2_default.bin and b/boards/px4/fmu-v2/extras/px4_io-v2_default.bin differ diff --git a/boards/px4/fmu-v3/extras/px4_io-v2_default.bin b/boards/px4/fmu-v3/extras/px4_io-v2_default.bin index 957f0f13a12e..5a0796406fc1 100755 Binary files a/boards/px4/fmu-v3/extras/px4_io-v2_default.bin and b/boards/px4/fmu-v3/extras/px4_io-v2_default.bin differ diff --git a/boards/px4/fmu-v4pro/extras/px4_io-v2_default.bin b/boards/px4/fmu-v4pro/extras/px4_io-v2_default.bin index 957f0f13a12e..5a0796406fc1 100755 Binary files a/boards/px4/fmu-v4pro/extras/px4_io-v2_default.bin and b/boards/px4/fmu-v4pro/extras/px4_io-v2_default.bin differ diff --git a/boards/px4/fmu-v5/extras/px4_io-v2_default.bin b/boards/px4/fmu-v5/extras/px4_io-v2_default.bin index 957f0f13a12e..5a0796406fc1 100755 Binary files a/boards/px4/fmu-v5/extras/px4_io-v2_default.bin and b/boards/px4/fmu-v5/extras/px4_io-v2_default.bin differ diff --git a/boards/px4/fmu-v5x/default.px4board b/boards/px4/fmu-v5x/default.px4board index e2b5833dfecb..2bede96763c0 100644 --- a/boards/px4/fmu-v5x/default.px4board +++ b/boards/px4/fmu-v5x/default.px4board @@ -81,7 +81,6 @@ CONFIG_MODULES_NAVIGATOR=y CONFIG_MODE_NAVIGATOR_VTOL_TAKEOFF=y CONFIG_MODULES_PAYLOAD_DELIVERER=y CONFIG_MODULES_RC_UPDATE=y -CONFIG_MODULES_ROVER_POS_CONTROL=y CONFIG_MODULES_SENSORS=y CONFIG_MODULES_SIMULATION_SIMULATOR_SIH=y CONFIG_MODULES_TEMPERATURE_COMPENSATION=y @@ -102,9 +101,7 @@ CONFIG_SYSTEMCMDS_NSHTERM=y CONFIG_SYSTEMCMDS_PARAM=y CONFIG_SYSTEMCMDS_PERF=y CONFIG_SYSTEMCMDS_REBOOT=y -CONFIG_SYSTEMCMDS_REFLECT=y CONFIG_SYSTEMCMDS_SD_BENCH=y -CONFIG_SYSTEMCMDS_SD_STRESS=y CONFIG_SYSTEMCMDS_SYSTEM_TIME=y CONFIG_SYSTEMCMDS_TOP=y CONFIG_SYSTEMCMDS_TOPIC_LISTENER=y diff --git a/boards/px4/fmu-v5x/extras/px4_io-v2_default.bin b/boards/px4/fmu-v5x/extras/px4_io-v2_default.bin index 957f0f13a12e..5a0796406fc1 100755 Binary files a/boards/px4/fmu-v5x/extras/px4_io-v2_default.bin and b/boards/px4/fmu-v5x/extras/px4_io-v2_default.bin differ diff --git a/boards/px4/fmu-v5x/init/rc.board_defaults b/boards/px4/fmu-v5x/init/rc.board_defaults index 83596bc9b209..30ff624b2f63 100644 --- a/boards/px4/fmu-v5x/init/rc.board_defaults +++ b/boards/px4/fmu-v5x/init/rc.board_defaults @@ -16,7 +16,7 @@ param set-default SENS_EN_INA238 0 param set-default SENS_EN_INA228 0 param set-default SENS_EN_INA226 1 -if ver hwbasecmp 008 009 00a 010 +if ver hwbasecmp 008 009 00a 010 011 then # Skynode: use the "custom participant" config for uxrce_dds_client param set-default UXRCE_DDS_PTCFG 2 diff --git a/boards/px4/fmu-v5x/init/rc.board_mavlink b/boards/px4/fmu-v5x/init/rc.board_mavlink index 8d1d7c1e38ab..1c85ceff4fe1 100644 --- a/boards/px4/fmu-v5x/init/rc.board_mavlink +++ b/boards/px4/fmu-v5x/init/rc.board_mavlink @@ -3,7 +3,7 @@ # board specific MAVLink startup script. #------------------------------------------------------------------------------ -if ver hwbasecmp 008 009 00a 010 +if ver hwbasecmp 008 009 00a 010 011 then # Start MAVLink on the UART connected to the mission computer mavlink start -d /dev/ttyS4 -b 3000000 -r 290000 -m onboard_low_bandwidth -x -z diff --git a/boards/px4/fmu-v5x/init/rc.board_sensors b/boards/px4/fmu-v5x/init/rc.board_sensors index e14364c9508e..1a0f426db6f4 100644 --- a/boards/px4/fmu-v5x/init/rc.board_sensors +++ b/boards/px4/fmu-v5x/init/rc.board_sensors @@ -49,7 +49,7 @@ then fi fi -if ver hwbasecmp 008 009 00a 010 +if ver hwbasecmp 008 009 00a 010 011 then #SKYNODE base fmu board orientation diff --git a/boards/px4/fmu-v6c/extras/px4_io-v2_default.bin b/boards/px4/fmu-v6c/extras/px4_io-v2_default.bin index 957f0f13a12e..5a0796406fc1 100755 Binary files a/boards/px4/fmu-v6c/extras/px4_io-v2_default.bin and b/boards/px4/fmu-v6c/extras/px4_io-v2_default.bin differ diff --git a/boards/px4/fmu-v6x/extras/px4_io-v2_default.bin b/boards/px4/fmu-v6x/extras/px4_io-v2_default.bin index 957f0f13a12e..5a0796406fc1 100755 Binary files a/boards/px4/fmu-v6x/extras/px4_io-v2_default.bin and b/boards/px4/fmu-v6x/extras/px4_io-v2_default.bin differ diff --git a/boards/px4/fmu-v6x/init/rc.board_defaults b/boards/px4/fmu-v6x/init/rc.board_defaults index 6500693173a5..95d873475b15 100644 --- a/boards/px4/fmu-v6x/init/rc.board_defaults +++ b/boards/px4/fmu-v6x/init/rc.board_defaults @@ -18,7 +18,7 @@ param set-default SENS_EN_INA238 0 param set-default SENS_EN_INA228 0 param set-default SENS_EN_INA226 0 -if ver hwbasecmp 009 010 +if ver hwbasecmp 009 010 011 then # Skynode: use the "custom participant" config for uxrce_dds_client param set-default UXRCE_DDS_PTCFG 2 diff --git a/boards/px4/fmu-v6x/init/rc.board_mavlink b/boards/px4/fmu-v6x/init/rc.board_mavlink index 4fef2264da97..713d7a41b72b 100644 --- a/boards/px4/fmu-v6x/init/rc.board_mavlink +++ b/boards/px4/fmu-v6x/init/rc.board_mavlink @@ -4,7 +4,7 @@ #------------------------------------------------------------------------------ # if skynode base board is detected start Mavlink on Telem2 -if ver hwbasecmp 009 010 +if ver hwbasecmp 009 010 011 then mavlink start -d /dev/ttyS4 -b 3000000 -r 290000 -m onboard_low_bandwidth -x -z diff --git a/boards/px4/fmu-v6x/init/rc.board_sensors b/boards/px4/fmu-v6x/init/rc.board_sensors index 077eb6f80ba2..f7b132af1117 100644 --- a/boards/px4/fmu-v6x/init/rc.board_sensors +++ b/boards/px4/fmu-v6x/init/rc.board_sensors @@ -56,7 +56,7 @@ then fi #Start Auterion Power Module selector for Skynode boards -if ver hwbasecmp 009 010 +if ver hwbasecmp 009 010 011 then pm_selector_auterion start else @@ -93,7 +93,7 @@ else icm20649 -s -R 6 start else # Internal SPI BMI088 - if ver hwbasecmp 009 010 + if ver hwbasecmp 009 010 011 then bmi088 -A -R 6 -s start bmi088 -G -R 6 -s start @@ -110,7 +110,7 @@ else fi # Internal SPI bus ICM42688p - if ver hwbasecmp 009 010 + if ver hwbasecmp 009 010 011 then icm42688p -R 12 -s start else @@ -127,7 +127,7 @@ else # Internal SPI bus ICM-42670-P (hard-mounted) icm42670p -R 10 -s start else - if ver hwbasecmp 009 010 + if ver hwbasecmp 009 010 011 then icm20602 -R 6 -s start else diff --git a/boards/px4/fmu-v6xrt/default.px4board b/boards/px4/fmu-v6xrt/default.px4board index b5e2e23af38c..f9961fd7bbfb 100644 --- a/boards/px4/fmu-v6xrt/default.px4board +++ b/boards/px4/fmu-v6xrt/default.px4board @@ -6,21 +6,30 @@ CONFIG_BOARD_SERIAL_GPS2="/dev/ttyS3" CONFIG_BOARD_SERIAL_TEL1="/dev/ttyS2" CONFIG_BOARD_SERIAL_TEL2="/dev/ttyS5" CONFIG_BOARD_SERIAL_TEL3="/dev/ttyS6" +CONFIG_DRIVERS_ADC_ADS1115=y CONFIG_DRIVERS_ADC_BOARD_ADC=y CONFIG_DRIVERS_BAROMETER_BMP388=y +CONFIG_DRIVERS_BAROMETER_INVENSENSE_ICP201XX=y CONFIG_DRIVERS_BAROMETER_MS5611=y CONFIG_DRIVERS_CAMERA_CAPTURE=y CONFIG_DRIVERS_CAMERA_TRIGGER=y -CONFIG_DRIVERS_DISTANCE_SENSOR_LIGHTWARE_LASER_I2C=y +CONFIG_COMMON_DIFFERENTIAL_PRESSURE=y +CONFIG_COMMON_DISTANCE_SENSOR=y CONFIG_DRIVERS_DSHOT=y CONFIG_DRIVERS_GPS=y +CONFIG_DRIVERS_IMU_ANALOG_DEVICES_ADIS16470=y CONFIG_DRIVERS_IMU_BOSCH_BMI088=y CONFIG_DRIVERS_IMU_INVENSENSE_ICM20602=y +CONFIG_DRIVERS_IMU_INVENSENSE_ICM20649=y +CONFIG_DRIVERS_IMU_INVENSENSE_ICM20948=y +CONFIG_DRIVERS_IMU_INVENSENSE_ICM42670P=y CONFIG_DRIVERS_IMU_INVENSENSE_ICM42688P=y +CONFIG_DRIVERS_IMU_INVENSENSE_ICM45686=y +CONFIG_DRIVERS_IMU_INVENSENSE_IIM42652=y +CONFIG_COMMON_INS=y CONFIG_COMMON_LIGHT=y -CONFIG_DRIVERS_MAGNETOMETER_BOSCH_BMM150=y -CONFIG_DRIVERS_MAGNETOMETER_HMC5883=y -CONFIG_DRIVERS_MAGNETOMETER_ISENTEK_IST8310=y +CONFIG_COMMON_MAGNETOMETER=y +CONFIG_DRIVERS_OSD_MSP_OSD=y CONFIG_DRIVERS_POWER_MONITOR_INA226=y CONFIG_DRIVERS_POWER_MONITOR_INA228=y CONFIG_DRIVERS_POWER_MONITOR_INA238=y @@ -32,14 +41,20 @@ CONFIG_COMMON_TELEMETRY=y CONFIG_DRIVERS_TONE_ALARM=y CONFIG_DRIVERS_UAVCAN=y CONFIG_COMMON_UWB=y +CONFIG_MODULES_AIRSPEED_SELECTOR=y CONFIG_MODULES_BATTERY_STATUS=y CONFIG_MODULES_CAMERA_FEEDBACK=y CONFIG_MODULES_COMMANDER=y CONFIG_MODULES_CONTROL_ALLOCATOR=y CONFIG_MODULES_DATAMAN=y CONFIG_MODULES_EKF2=y +CONFIG_MODULES_ESC_BATTERY=y CONFIG_MODULES_EVENTS=y CONFIG_MODULES_FLIGHT_MODE_MANAGER=y +CONFIG_MODULES_FW_ATT_CONTROL=y +CONFIG_MODULES_FW_AUTOTUNE_ATTITUDE_CONTROL=y +CONFIG_MODULES_FW_POS_CONTROL=y +CONFIG_MODULES_FW_RATE_CONTROL=y CONFIG_MODULES_GIMBAL=y CONFIG_MODULES_GYRO_CALIBRATION=y CONFIG_MODULES_GYRO_FFT=y @@ -57,11 +72,15 @@ CONFIG_MODULES_MC_HOVER_THRUST_ESTIMATOR=y CONFIG_MODULES_MC_POS_CONTROL=y CONFIG_MODULES_MC_RATE_CONTROL=y CONFIG_MODULES_NAVIGATOR=y +CONFIG_MODE_NAVIGATOR_VTOL_TAKEOFF=y CONFIG_MODULES_RC_UPDATE=y CONFIG_MODULES_ROVER_POS_CONTROL=y CONFIG_MODULES_SENSORS=y CONFIG_MODULES_TEMPERATURE_COMPENSATION=y +CONFIG_MODULES_UXRCE_DDS_CLIENT=y +CONFIG_MODULES_VTOL_ATT_CONTROL=y CONFIG_SYSTEMCMDS_ACTUATOR_TEST=y +CONFIG_SYSTEMCMDS_BSONDUMP=y CONFIG_SYSTEMCMDS_DMESG=y CONFIG_SYSTEMCMDS_DUMPFILE=y CONFIG_SYSTEMCMDS_HARDFAULT_LOG=y diff --git a/boards/px4/fmu-v6xrt/init/rc.board_mavlink b/boards/px4/fmu-v6xrt/init/rc.board_mavlink index 546949911863..5c1a00ff959d 100644 --- a/boards/px4/fmu-v6xrt/init/rc.board_mavlink +++ b/boards/px4/fmu-v6xrt/init/rc.board_mavlink @@ -4,7 +4,7 @@ #------------------------------------------------------------------------------ # if skynode base board is detected start Mavlink on Telem2 -if ver hwbasecmp 009 010 +if ver hwbasecmp 009 010 011 then mavlink start -d /dev/ttyS5 -b 3000000 -r 290000 -m onboard_low_bandwidth -x -z diff --git a/boards/px4/fmu-v6xrt/rover.px4board b/boards/px4/fmu-v6xrt/rover.px4board index 639bac90a099..2e75c9bdb47b 100644 --- a/boards/px4/fmu-v6xrt/rover.px4board +++ b/boards/px4/fmu-v6xrt/rover.px4board @@ -1,4 +1,9 @@ +CONFIG_MODULES_AIRSPEED_SELECTOR=n CONFIG_MODULES_FLIGHT_MODE_MANAGER=n +CONFIG_MODULES_FW_ATT_CONTROL=n +CONFIG_MODULES_FW_AUTOTUNE_ATTITUDE_CONTROL=n +CONFIG_MODULES_FW_POS_CONTROL=n +CONFIG_MODULES_FW_RATE_CONTROL=n CONFIG_MODULES_LANDING_TARGET_ESTIMATOR=n CONFIG_MODULES_LOCAL_POSITION_ESTIMATOR=n CONFIG_MODULES_MC_ATT_CONTROL=n @@ -6,6 +11,7 @@ CONFIG_MODULES_MC_AUTOTUNE_ATTITUDE_CONTROL=n CONFIG_MODULES_MC_HOVER_THRUST_ESTIMATOR=n CONFIG_MODULES_MC_POS_CONTROL=n CONFIG_MODULES_MC_RATE_CONTROL=n +CONFIG_MODULES_VTOL_ATT_CONTROL=n CONFIG_EKF2_AUX_GLOBAL_POSITION=y # CONFIG_EKF2_WIND is not set CONFIG_MODULES_DIFFERENTIAL_DRIVE=y diff --git a/msg/CMakeLists.txt b/msg/CMakeLists.txt index 62544cffc07b..c53402bd0f35 100644 --- a/msg/CMakeLists.txt +++ b/msg/CMakeLists.txt @@ -58,6 +58,7 @@ set(msg_files CameraCapture.msg CameraStatus.msg CameraTrigger.msg + CanInterfaceStatus.msg CellularStatus.msg CollisionConstraints.msg CollisionReport.msg @@ -99,6 +100,7 @@ set(msg_files FollowTargetStatus.msg GeneratorStatus.msg GeofenceResult.msg + GeofenceStatus.msg GimbalControls.msg GimbalDeviceAttitudeStatus.msg GimbalDeviceInformation.msg @@ -153,6 +155,10 @@ set(msg_files OrbTest.msg OrbTestLarge.msg OrbTestMedium.msg + ParameterResetRequest.msg + ParameterSetUsedRequest.msg + ParameterSetValueRequest.msg + ParameterSetValueResponse.msg ParameterUpdate.msg Ping.msg PositionControllerLandingStatus.msg @@ -284,6 +290,9 @@ foreach(msg_file ${msg_files}) list(APPEND uorb_json_files ${msg_source_out_path}/${msg}.json) endforeach() +# set parent scope msg_files for ROS +set(msg_files ${msg_files} PARENT_SCOPE) + # Generate uORB headers add_custom_command( OUTPUT diff --git a/msg/CanInterfaceStatus.msg b/msg/CanInterfaceStatus.msg new file mode 100644 index 000000000000..4129c8d56386 --- /dev/null +++ b/msg/CanInterfaceStatus.msg @@ -0,0 +1,6 @@ +uint64 timestamp # time since system start (microseconds) +uint8 interface + +uint64 io_errors +uint64 frames_tx +uint64 frames_rx diff --git a/msg/GeofenceStatus.msg b/msg/GeofenceStatus.msg new file mode 100644 index 000000000000..d32b9010c312 --- /dev/null +++ b/msg/GeofenceStatus.msg @@ -0,0 +1,7 @@ +uint64 timestamp # time since system start (microseconds) + +uint32 geofence_id # loaded geofence id +uint8 status # Current geofence status + +uint8 GF_STATUS_LOADING = 0 +uint8 GF_STATUS_READY = 1 diff --git a/msg/MissionResult.msg b/msg/MissionResult.msg index aaa840762d99..f70326be3b26 100644 --- a/msg/MissionResult.msg +++ b/msg/MissionResult.msg @@ -1,8 +1,8 @@ uint64 timestamp # time since system start (microseconds) -uint16 mission_id # Id for the mission for which the result was generated -uint16 geofence_id # Id for the corresponding geofence for which the result was generated (used for mission feasibility) -uint64 home_position_counter # Counter of the home position for which the result was generated (used for mission feasibility) +uint32 mission_id # Id for the mission for which the result was generated +uint32 geofence_id # Id for the corresponding geofence for which the result was generated (used for mission feasibility) +uint32 home_position_counter # Counter of the home position for which the result was generated (used for mission feasibility) int32 seq_reached # Sequence of the mission item which has been reached, default -1 uint16 seq_current # Sequence of the current mission item diff --git a/msg/OrbTestMedium.msg b/msg/OrbTestMedium.msg index b25ae1c8514b..43109d49d54e 100644 --- a/msg/OrbTestMedium.msg +++ b/msg/OrbTestMedium.msg @@ -4,4 +4,6 @@ int32 val uint8[64] junk +uint8 ORB_QUEUE_LENGTH = 16 + # TOPICS orb_test_medium orb_test_medium_multi orb_test_medium_wrap_around orb_test_medium_queue orb_test_medium_queue_poll diff --git a/msg/ParameterResetRequest.msg b/msg/ParameterResetRequest.msg new file mode 100644 index 000000000000..db08edb37961 --- /dev/null +++ b/msg/ParameterResetRequest.msg @@ -0,0 +1,8 @@ +# ParameterResetRequest : Used by the primary to reset one or all parameter value(s) on the remote + +uint64 timestamp +uint16 parameter_index + +bool reset_all # If this is true then ignore parameter_index + +uint8 ORB_QUEUE_LENGTH = 4 diff --git a/msg/ParameterSetUsedRequest.msg b/msg/ParameterSetUsedRequest.msg new file mode 100644 index 000000000000..ca97f9e9e7ff --- /dev/null +++ b/msg/ParameterSetUsedRequest.msg @@ -0,0 +1,6 @@ +# ParameterSetUsedRequest : Used by a remote to update the used flag for a parameter on the primary + +uint64 timestamp +uint16 parameter_index + +uint8 ORB_QUEUE_LENGTH = 64 diff --git a/msg/ParameterSetValueRequest.msg b/msg/ParameterSetValueRequest.msg new file mode 100644 index 000000000000..eaf650f24324 --- /dev/null +++ b/msg/ParameterSetValueRequest.msg @@ -0,0 +1,11 @@ +# ParameterSetValueRequest : Used by a remote or primary to update the value for a parameter at the other end + +uint64 timestamp +uint16 parameter_index + +int32 int_value # Optional value for an integer parameter +float32 float_value # Optional value for a float parameter + +uint8 ORB_QUEUE_LENGTH = 32 + +# TOPICS parameter_set_value_request parameter_remote_set_value_request parameter_primary_set_value_request diff --git a/msg/ParameterSetValueResponse.msg b/msg/ParameterSetValueResponse.msg new file mode 100644 index 000000000000..09f8e3084a80 --- /dev/null +++ b/msg/ParameterSetValueResponse.msg @@ -0,0 +1,9 @@ +# ParameterSetValueResponse : Response to a set value request by either primary or secondary + +uint64 timestamp +uint64 request_timestamp +uint16 parameter_index + +uint8 ORB_QUEUE_LENGTH = 4 + +# TOPICS parameter_set_value_response parameter_remote_set_value_response parameter_primary_set_value_response \ No newline at end of file diff --git a/msg/TransponderReport.msg b/msg/TransponderReport.msg index 6a1ca064186b..d5171cf3b303 100644 --- a/msg/TransponderReport.msg +++ b/msg/TransponderReport.msg @@ -47,4 +47,4 @@ uint16 ADSB_EMITTER_TYPE_SERVICE_SURFACE=18 uint16 ADSB_EMITTER_TYPE_POINT_OBSTACLE=19 uint16 ADSB_EMITTER_TYPE_ENUM_END=20 -uint8 ORB_QUEUE_LENGTH = 8 +uint8 ORB_QUEUE_LENGTH = 16 diff --git a/platforms/common/CMakeLists.txt b/platforms/common/CMakeLists.txt index a0bafe7d59de..cb0721fe6911 100644 --- a/platforms/common/CMakeLists.txt +++ b/platforms/common/CMakeLists.txt @@ -52,6 +52,7 @@ add_library(px4_platform STATIC shutdown.cpp spi.cpp pab_manifest.c + Serial.cpp ${SRCS} ) target_link_libraries(px4_platform prebuild_targets px4_work_queue) diff --git a/platforms/common/Serial.cpp b/platforms/common/Serial.cpp new file mode 100644 index 000000000000..2f93a66a6ebf --- /dev/null +++ b/platforms/common/Serial.cpp @@ -0,0 +1,138 @@ +/**************************************************************************** + * + * Copyright (C) 2023 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include + +namespace device +{ + +Serial::Serial(const char *port, uint32_t baudrate, ByteSize bytesize, Parity parity, StopBits stopbits, + FlowControl flowcontrol) : + _impl(port, baudrate, bytesize, parity, stopbits, flowcontrol) +{ + // If no baudrate was specified then set it to a reasonable default value + if (baudrate == 0) { + (void) _impl.setBaudrate(9600); + } +} + +Serial::~Serial() +{ +} + +bool Serial::open() +{ + return _impl.open(); +} + +bool Serial::isOpen() const +{ + return _impl.isOpen(); +} + +bool Serial::close() +{ + return _impl.close(); +} + +ssize_t Serial::read(uint8_t *buffer, size_t buffer_size) +{ + return _impl.read(buffer, buffer_size); +} + +ssize_t Serial::readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count, uint32_t timeout_us) +{ + return _impl.readAtLeast(buffer, buffer_size, character_count, timeout_us); +} + +ssize_t Serial::write(const void *buffer, size_t buffer_size) +{ + return _impl.write(buffer, buffer_size); +} + +uint32_t Serial::getBaudrate() const +{ + return _impl.getBaudrate(); +} + +bool Serial::setBaudrate(uint32_t baudrate) +{ + return _impl.setBaudrate(baudrate); +} + +ByteSize Serial::getBytesize() const +{ + return _impl.getBytesize(); +} + +bool Serial::setBytesize(ByteSize bytesize) +{ + return _impl.setBytesize(bytesize); +} + +Parity Serial::getParity() const +{ + return _impl.getParity(); +} + +bool Serial::setParity(Parity parity) +{ + return _impl.setParity(parity); +} + +StopBits Serial::getStopbits() const +{ + return _impl.getStopbits(); +} + +bool Serial::setStopbits(StopBits stopbits) +{ + return _impl.setStopbits(stopbits); +} + +FlowControl Serial::getFlowcontrol() const +{ + return _impl.getFlowcontrol(); +} + +bool Serial::setFlowcontrol(FlowControl flowcontrol) +{ + return _impl.setFlowcontrol(flowcontrol); +} + +const char *Serial::getPort() const +{ + return _impl.getPort(); +} + +} // namespace device diff --git a/platforms/common/include/px4_platform_common/Serial.hpp b/platforms/common/include/px4_platform_common/Serial.hpp new file mode 100644 index 000000000000..ce02b5ac6308 --- /dev/null +++ b/platforms/common/include/px4_platform_common/Serial.hpp @@ -0,0 +1,97 @@ +/**************************************************************************** + * + * Copyright (C) 2023 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#pragma once + +#include + +#include + +using device::SerialConfig::ByteSize; +using device::SerialConfig::Parity; +using device::SerialConfig::StopBits; +using device::SerialConfig::FlowControl; + +namespace device __EXPORT +{ + +class Serial +{ +public: + Serial(const char *port, uint32_t baudrate = 57600, + ByteSize bytesize = ByteSize::EightBits, Parity parity = Parity::None, + StopBits stopbits = StopBits::One, FlowControl flowcontrol = FlowControl::Disabled); + virtual ~Serial(); + + // Open sets up the port and gets it configured based on desired configuration + bool open(); + bool isOpen() const; + + bool close(); + + ssize_t read(uint8_t *buffer, size_t buffer_size); + ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_us = 0); + + ssize_t write(const void *buffer, size_t buffer_size); + + // If port is already open then the following configuration functions + // will reconfigure the port. If the port is not yet open then they will + // simply store the configuration in preparation for the port to be opened. + + uint32_t getBaudrate() const; + bool setBaudrate(uint32_t baudrate); + + ByteSize getBytesize() const; + bool setBytesize(ByteSize bytesize); + + Parity getParity() const; + bool setParity(Parity parity); + + StopBits getStopbits() const; + bool setStopbits(StopBits stopbits); + + FlowControl getFlowcontrol() const; + bool setFlowcontrol(FlowControl flowcontrol); + + const char *getPort() const; + +private: + // Disable copy constructors + Serial(const Serial &); + Serial &operator=(const Serial &); + + // platform implementation + SerialImpl _impl; +}; + +} // namespace device diff --git a/platforms/common/include/px4_platform_common/SerialCommon.hpp b/platforms/common/include/px4_platform_common/SerialCommon.hpp new file mode 100644 index 000000000000..bbe9be0ad9fe --- /dev/null +++ b/platforms/common/include/px4_platform_common/SerialCommon.hpp @@ -0,0 +1,70 @@ +/**************************************************************************** + * + * Copyright (C) 2023 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#pragma once + +namespace device +{ +namespace SerialConfig +{ + + +// ByteSize: number of data bits +enum class ByteSize { + FiveBits = 5, + SixBits = 6, + SevenBits = 7, + EightBits = 8, +}; + +// Parity: enable parity checking +enum class Parity { + None = 0, + Odd = 1, + Even = 2, +}; + +// StopBits: number of stop bits +enum class StopBits { + One = 1, + Two = 2 +}; + +// FlowControl: enable flow control +enum class FlowControl { + Disabled = 0, + Enabled = 1, +}; + +} // namespace SerialConfig +} // namespace device diff --git a/platforms/common/include/px4_platform_common/time.h b/platforms/common/include/px4_platform_common/time.h index 1b4d8a27560c..d61e23c75cfb 100644 --- a/platforms/common/include/px4_platform_common/time.h +++ b/platforms/common/include/px4_platform_common/time.h @@ -13,11 +13,21 @@ __END_DECLS #define px4_clock_gettime system_clock_gettime #endif -#if defined(ENABLE_LOCKSTEP_SCHEDULER) +#if defined(ENABLE_LOCKSTEP_SCHEDULER) || defined(__PX4_QURT) __BEGIN_DECLS __EXPORT int px4_clock_settime(clockid_t clk_id, const struct timespec *tp); +__END_DECLS + +#else + +#define px4_clock_settime system_clock_settime +#endif + +#if defined(ENABLE_LOCKSTEP_SCHEDULER) + +__BEGIN_DECLS __EXPORT int px4_usleep(useconds_t usec); __EXPORT unsigned int px4_sleep(unsigned int seconds); __EXPORT int px4_pthread_cond_timedwait(pthread_cond_t *cond, @@ -27,7 +37,6 @@ __END_DECLS #else -#define px4_clock_settime system_clock_settime #define px4_usleep system_usleep #define px4_sleep system_sleep #define px4_pthread_cond_timedwait system_pthread_cond_timedwait diff --git a/platforms/common/pab_manifest.c b/platforms/common/pab_manifest.c index aa2958631f2b..979bb5ecbc9b 100644 --- a/platforms/common/pab_manifest.c +++ b/platforms/common/pab_manifest.c @@ -294,11 +294,54 @@ static const px4_hw_mft_item_t base_configuration_9[] = { .connection = px4_hw_con_onboard, }, { - .id = PX4_MFT_PM2, + .id = PX4_MFT_ETHERNET, + .present = 1, + .mandatory = 1, + .connection = px4_hw_con_connector, + }, + { + .id = PX4_MFT_T100_ETH, .present = 1, .mandatory = 1, .connection = px4_hw_con_onboard, }, +}; + +// BASE ID 10 Skynode QS no USB Alaised to ID 9 +// BASE ID 16 Auterion Skynode RC10, RC11, RC12, RC13 Alaised to ID 0 + +// BASE ID 17 Auterion Skynode RC13 with many parts removed +static const px4_hw_mft_item_t base_configuration_17[] = { + { + .id = PX4_MFT_PX4IO, + .present = 0, + .mandatory = 0, + .connection = px4_hw_con_onboard, + }, + { + .id = PX4_MFT_USB, + .present = 1, + .mandatory = 1, + .connection = px4_hw_con_unknown, + }, + { + .id = PX4_MFT_CAN2, + .present = 0, + .mandatory = 0, + .connection = px4_hw_con_onboard, + }, + { + .id = PX4_MFT_CAN3, + .present = 0, + .mandatory = 0, + .connection = px4_hw_con_unknown, + }, + { + .id = PX4_MFT_PM2, + .present = 0, + .mandatory = 0, + .connection = px4_hw_con_onboard, + }, { .id = PX4_MFT_ETHERNET, .present = 1, @@ -313,9 +356,6 @@ static const px4_hw_mft_item_t base_configuration_9[] = { }, }; -// BASE ID 10 Skynode QS no USB Alaised to ID 9 -// BASE ID 16 Auterion Skynode RC10, RC11, RC12, RC13 Alaised to ID 0 - static px4_hw_mft_list_entry_t mft_lists[] = { // ver_rev @@ -329,6 +369,7 @@ static px4_hw_mft_list_entry_t mft_lists[] = { {HW_BASE_ID(9), base_configuration_9, arraySize(base_configuration_9)}, // Auterion Skynode ver 9 {HW_BASE_ID(10), base_configuration_9, arraySize(base_configuration_9)}, // Auterion Skynode ver 10 {HW_BASE_ID(16), base_configuration_0, arraySize(base_configuration_0)}, // Auterion Skynode ver 16 + {HW_BASE_ID(17), base_configuration_17, arraySize(base_configuration_17)}, // Auterion Skynode ver 17 }; /************************************************************************************ diff --git a/platforms/common/px4_log.cpp b/platforms/common/px4_log.cpp index a3d9b02338aa..73a3671c8982 100644 --- a/platforms/common/px4_log.cpp +++ b/platforms/common/px4_log.cpp @@ -74,7 +74,7 @@ void px4_log_initialize(void) log_message.severity = 6; // info strcpy((char *)log_message.text, "initialized uORB logging"); log_message.timestamp = hrt_absolute_time(); - orb_log_message_pub = orb_advertise_queue(ORB_ID(log_message), &log_message, log_message_s::ORB_QUEUE_LENGTH); + orb_log_message_pub = orb_advertise(ORB_ID(log_message), &log_message); } __EXPORT void px4_log_modulename(int level, const char *module_name, const char *fmt, ...) diff --git a/platforms/common/uORB/Publication.hpp b/platforms/common/uORB/Publication.hpp index 7547e3b7faf3..a0a7cc20cf71 100644 --- a/platforms/common/uORB/Publication.hpp +++ b/platforms/common/uORB/Publication.hpp @@ -48,24 +48,6 @@ namespace uORB { -template class DefaultQueueSize -{ -private: - template - static constexpr uint8_t get_queue_size(decltype(T::ORB_QUEUE_LENGTH) *) - { - return T::ORB_QUEUE_LENGTH; - } - - template static constexpr uint8_t get_queue_size(...) - { - return 1; - } - -public: - static constexpr unsigned value = get_queue_size(nullptr); -}; - class PublicationBase { public: @@ -97,7 +79,7 @@ class PublicationBase /** * uORB publication wrapper class */ -template::value> +template class Publication : public PublicationBase { public: @@ -113,7 +95,7 @@ class Publication : public PublicationBase bool advertise() { if (!advertised()) { - _handle = orb_advertise_queue(get_topic(), nullptr, ORB_QSIZE); + _handle = orb_advertise(get_topic(), nullptr); } return advertised(); diff --git a/platforms/common/uORB/PublicationMulti.hpp b/platforms/common/uORB/PublicationMulti.hpp index bc275940b604..6e8863b17d12 100644 --- a/platforms/common/uORB/PublicationMulti.hpp +++ b/platforms/common/uORB/PublicationMulti.hpp @@ -51,7 +51,7 @@ namespace uORB /** * Base publication multi wrapper class */ -template::value> +template class PublicationMulti : public PublicationBase { public: @@ -73,7 +73,7 @@ class PublicationMulti : public PublicationBase { if (!advertised()) { int instance = 0; - _handle = orb_advertise_multi_queue(get_topic(), nullptr, &instance, QSIZE); + _handle = orb_advertise_multi(get_topic(), nullptr, &instance); } return advertised(); diff --git a/platforms/common/uORB/SubscriptionBlocking.hpp b/platforms/common/uORB/SubscriptionBlocking.hpp index 7ec29e329b6e..5c5580d855cb 100644 --- a/platforms/common/uORB/SubscriptionBlocking.hpp +++ b/platforms/common/uORB/SubscriptionBlocking.hpp @@ -56,31 +56,6 @@ class SubscriptionBlocking : public SubscriptionCallback SubscriptionBlocking(const orb_metadata *meta, uint32_t interval_us = 0, uint8_t instance = 0) : SubscriptionCallback(meta, interval_us, instance) { - // pthread_mutexattr_init - pthread_mutexattr_t attr; - int ret_attr_init = pthread_mutexattr_init(&attr); - - if (ret_attr_init != 0) { - PX4_ERR("pthread_mutexattr_init failed, status=%d", ret_attr_init); - } - -#if defined(PTHREAD_PRIO_NONE) - // pthread_mutexattr_settype - // PTHREAD_PRIO_NONE not available on cygwin - int ret_mutexattr_settype = pthread_mutexattr_settype(&attr, PTHREAD_PRIO_NONE); - - if (ret_mutexattr_settype != 0) { - PX4_ERR("pthread_mutexattr_settype failed, status=%d", ret_mutexattr_settype); - } - -#endif // PTHREAD_PRIO_NONE - - // pthread_mutex_init - int ret_mutex_init = pthread_mutex_init(&_mutex, &attr); - - if (ret_mutex_init != 0) { - PX4_ERR("pthread_mutex_init failed, status=%d", ret_mutex_init); - } } virtual ~SubscriptionBlocking() diff --git a/platforms/common/uORB/uORB.cpp b/platforms/common/uORB/uORB.cpp index c91ac6bccec3..a68f3c5dc83c 100644 --- a/platforms/common/uORB/uORB.cpp +++ b/platforms/common/uORB/uORB.cpp @@ -118,22 +118,11 @@ orb_advert_t orb_advertise(const struct orb_metadata *meta, const void *data) return uORB::Manager::get_instance()->orb_advertise(meta, data); } -orb_advert_t orb_advertise_queue(const struct orb_metadata *meta, const void *data, unsigned int queue_size) -{ - return uORB::Manager::get_instance()->orb_advertise(meta, data, queue_size); -} - orb_advert_t orb_advertise_multi(const struct orb_metadata *meta, const void *data, int *instance) { return uORB::Manager::get_instance()->orb_advertise_multi(meta, data, instance); } -orb_advert_t orb_advertise_multi_queue(const struct orb_metadata *meta, const void *data, int *instance, - unsigned int queue_size) -{ - return uORB::Manager::get_instance()->orb_advertise_multi(meta, data, instance, queue_size); -} - int orb_unadvertise(orb_advert_t handle) { return uORB::Manager::get_instance()->orb_unadvertise(handle); @@ -227,6 +216,14 @@ const char *orb_get_c_type(unsigned char short_type) return nullptr; } +uint8_t orb_get_queue_size(const struct orb_metadata *meta) +{ + if (meta) { + return meta->o_queue; + } + + return 0; +} void orb_print_message_internal(const orb_metadata *meta, const void *data, bool print_topic_name) { diff --git a/platforms/common/uORB/uORB.h b/platforms/common/uORB/uORB.h index fc06a2da3cda..a8964b4d27cd 100644 --- a/platforms/common/uORB/uORB.h +++ b/platforms/common/uORB/uORB.h @@ -53,6 +53,8 @@ struct orb_metadata { const uint16_t o_size_no_padding; /**< object size w/o padding at the end (for logger) */ uint32_t message_hash; /**< Hash over all fields for message compatibility checks */ orb_id_size_t o_id; /**< ORB_ID enum */ + uint8_t o_queue; /**< queue size */ + }; typedef const struct orb_metadata *orb_id_t; @@ -102,14 +104,16 @@ typedef const struct orb_metadata *orb_id_t; * @param _size_no_padding Struct size w/o padding at the end * @param _message_hash 32 bit message hash over all fields * @param _orb_id_enum ORB ID enum e.g.: ORB_ID::vehicle_status + * @param _queue_size Queue size from topic definition */ -#define ORB_DEFINE(_name, _struct, _size_no_padding, _message_hash, _orb_id_enum) \ - const struct orb_metadata __orb_##_name = { \ - #_name, \ - sizeof(_struct), \ - _size_no_padding, \ - _message_hash, \ - _orb_id_enum \ +#define ORB_DEFINE(_name, _struct, _size_no_padding, _message_hash, _orb_id_enum, _queue_size) \ + const struct orb_metadata __orb_##_name = { \ + #_name, \ + sizeof(_struct), \ + _size_no_padding, \ + _message_hash, \ + _orb_id_enum, \ + _queue_size \ }; struct hack __BEGIN_DECLS @@ -135,23 +139,11 @@ typedef void *orb_advert_t; */ extern orb_advert_t orb_advertise(const struct orb_metadata *meta, const void *data) __EXPORT; -/** - * @see uORB::Manager::orb_advertise() - */ -extern orb_advert_t orb_advertise_queue(const struct orb_metadata *meta, const void *data, - unsigned int queue_size) __EXPORT; - /** * @see uORB::Manager::orb_advertise_multi() */ extern orb_advert_t orb_advertise_multi(const struct orb_metadata *meta, const void *data, int *instance) __EXPORT; -/** - * @see uORB::Manager::orb_advertise_multi() - */ -extern orb_advert_t orb_advertise_multi_queue(const struct orb_metadata *meta, const void *data, int *instance, - unsigned int queue_size) __EXPORT; - /** * @see uORB::Manager::orb_unadvertise() */ @@ -160,7 +152,7 @@ extern int orb_unadvertise(orb_advert_t handle) __EXPORT; /** * @see uORB::Manager::orb_publish() */ -extern int orb_publish(const struct orb_metadata *meta, orb_advert_t handle, const void *data) __EXPORT; +extern int orb_publish(const struct orb_metadata *meta, orb_advert_t handle, const void *data) __EXPORT; /** * Advertise as the publisher of a topic. @@ -241,6 +233,12 @@ extern int orb_get_interval(int handle, unsigned *interval) __EXPORT; */ const char *orb_get_c_type(unsigned char short_type); +/** + * Returns the queue size of a topic + * @param meta orb topic metadata + */ +extern uint8_t orb_get_queue_size(const struct orb_metadata *meta); + /** * Print a topic to console. Do not call this directly, use print_message() instead. * @param meta orb topic metadata diff --git a/platforms/common/uORB/uORBDeviceNode.cpp b/platforms/common/uORB/uORBDeviceNode.cpp index 112170de6b5b..fd4ef60e63e0 100644 --- a/platforms/common/uORB/uORBDeviceNode.cpp +++ b/platforms/common/uORB/uORBDeviceNode.cpp @@ -48,37 +48,10 @@ static uORB::SubscriptionInterval *filp_to_subscription(cdev::file_t *filp) { return static_cast(filp->f_priv); } -// round up to nearest power of two -// Such as 0 => 1, 1 => 1, 2 => 2 ,3 => 4, 10 => 16, 60 => 64, 65...255 => 128 -// Note: When the input value > 128, the output is always 128 -static inline uint8_t round_pow_of_two_8(uint8_t n) -{ - if (n == 0) { - return 1; - } - - // Avoid is already a power of 2 - uint8_t value = n - 1; - - // Fill 1 - value |= value >> 1U; - value |= value >> 2U; - value |= value >> 4U; - - // Unable to round-up, take the value of round-down - if (value == UINT8_MAX) { - value >>= 1U; - } - - return value + 1; -} - -uORB::DeviceNode::DeviceNode(const struct orb_metadata *meta, const uint8_t instance, const char *path, - uint8_t queue_size) : +uORB::DeviceNode::DeviceNode(const struct orb_metadata *meta, const uint8_t instance, const char *path) : CDev(strdup(path)), // success is checked in CDev::init _meta(meta), - _instance(instance), - _queue_size(round_pow_of_two_8(queue_size)) + _instance(instance) { } @@ -186,7 +159,7 @@ uORB::DeviceNode::write(cdev::file_t *filp, const char *buffer, size_t buflen) /* re-check size */ if (nullptr == _data) { - const size_t data_size = _meta->o_size * _queue_size; + const size_t data_size = _meta->o_size * _meta->o_queue; _data = (uint8_t *) px4_cache_aligned_alloc(data_size); if (_data) { @@ -217,7 +190,7 @@ uORB::DeviceNode::write(cdev::file_t *filp, const char *buffer, size_t buflen) /* wrap-around happens after ~49 days, assuming a publisher rate of 1 kHz */ unsigned generation = _generation.fetch_add(1); - memcpy(_data + (_meta->o_size * (generation % _queue_size)), buffer, _meta->o_size); + memcpy(_data + (_meta->o_size * (generation % _meta->o_queue)), buffer, _meta->o_size); // callbacks for (auto item : _callbacks) { @@ -254,13 +227,6 @@ uORB::DeviceNode::ioctl(cdev::file_t *filp, int cmd, unsigned long arg) *(uintptr_t *)arg = (uintptr_t)this; return PX4_OK; - case ORBIOCSETQUEUESIZE: { - lock(); - int ret = update_queue_size(arg); - unlock(); - return ret; - } - case ORBIOCGETINTERVAL: *(unsigned *)arg = filp_to_subscription(filp)->get_interval_us(); return PX4_OK; @@ -389,12 +355,11 @@ uORB::DeviceNode::print_statistics(int max_topic_length) const uint8_t instance = get_instance(); const int8_t sub_count = subscriber_count(); - const uint8_t queue_size = get_queue_size(); unlock(); PX4_INFO_RAW("%-*s %2i %4i %2i %4i %s\n", max_topic_length, get_meta()->o_name, (int)instance, (int)sub_count, - queue_size, get_meta()->o_size, get_devname()); + get_meta()->o_queue, get_meta()->o_size, get_devname()); return true; } @@ -447,7 +412,10 @@ int16_t uORB::DeviceNode::process_add_subscription() uORBCommunicator::IChannel *ch = uORB::Manager::get_instance()->get_uorb_communicator(); if (_data != nullptr && ch != nullptr) { // _data will not be null if there is a publisher. - ch->send_message(_meta->o_name, _meta->o_size, _data); + // Only send the most recent data to initialize the remote end. + if (_data_valid) { + ch->send_message(_meta->o_name, _meta->o_size, _data + (_meta->o_size * ((_generation.load() - 1) % _meta->o_queue))); + } } return PX4_OK; @@ -483,21 +451,6 @@ int16_t uORB::DeviceNode::process_received_message(int32_t length, uint8_t *data } #endif /* CONFIG_ORB_COMMUNICATOR */ -int uORB::DeviceNode::update_queue_size(unsigned int queue_size) -{ - if (_queue_size == queue_size) { - return PX4_OK; - } - - //queue size is limited to 255 for the single reason that we use uint8 to store it - if (_data || _queue_size > queue_size || queue_size > 255) { - return PX4_ERROR; - } - - _queue_size = round_pow_of_two_8(queue_size); - return PX4_OK; -} - unsigned uORB::DeviceNode::get_initial_generation() { ATOMIC_ENTER; diff --git a/platforms/common/uORB/uORBDeviceNode.hpp b/platforms/common/uORB/uORBDeviceNode.hpp index c5c5bb22c0c8..527c5ddf2b4f 100644 --- a/platforms/common/uORB/uORBDeviceNode.hpp +++ b/platforms/common/uORB/uORBDeviceNode.hpp @@ -62,7 +62,7 @@ class UnitTest; class uORB::DeviceNode : public cdev::CDev, public IntrusiveSortedListNode { public: - DeviceNode(const struct orb_metadata *meta, const uint8_t instance, const char *path, uint8_t queue_size = 1); + DeviceNode(const struct orb_metadata *meta, const uint8_t instance, const char *path); virtual ~DeviceNode(); // no copy, assignment, move, move assignment @@ -179,15 +179,6 @@ class uORB::DeviceNode : public cdev::CDev, public IntrusiveSortedListNodeo_queue; } int8_t subscriber_count() const { return _subscriber_count; } @@ -234,7 +225,7 @@ class uORB::DeviceNode : public cdev::CDev, public IntrusiveSortedListNodeo_queue == 1) { ATOMIC_ENTER; memcpy(dst, _data, _meta->o_size); generation = _generation.load(); @@ -253,12 +244,12 @@ class uORB::DeviceNode : public cdev::CDev, public IntrusiveSortedListNodeo_queue, generation, current_generation - 1)) { // Reader is too far behind: some messages are lost - generation = current_generation - _queue_size; + generation = current_generation - _meta->o_queue; } - memcpy(dst, _data + (_meta->o_size * (generation % _queue_size)), _meta->o_size); + memcpy(dst, _data + (_meta->o_size * (generation % _meta->o_queue)), _meta->o_size); ATOMIC_LEAVE; ++generation; @@ -295,7 +286,7 @@ class uORB::DeviceNode : public cdev::CDev, public IntrusiveSortedListNode 1) { - PX4_WARN("orb_advertise_multi: failed to set queue size"); - } - /* get the advertiser handle and close the node */ orb_advert_t advertiser; - result = px4_ioctl(fd, ORBIOCGADVERTISER, (unsigned long)&advertiser); + int result = px4_ioctl(fd, ORBIOCGADVERTISER, (unsigned long)&advertiser); px4_close(fd); if (result == PX4_ERROR) { @@ -602,6 +592,22 @@ int16_t uORB::Manager::process_remote_topic(const char *topic_name) { PX4_DEBUG("entering process_remote_topic: name: %s", topic_name); + // First make sure this is a valid topic + const struct orb_metadata *const *topic_list = orb_get_topics(); + orb_id_t topic_ptr = nullptr; + + for (size_t i = 0; i < orb_topics_count(); i++) { + if (strcmp(topic_list[i]->o_name, topic_name) == 0) { + topic_ptr = topic_list[i]; + break; + } + } + + if (! topic_ptr) { + PX4_ERR("process_remote_topic meta not found for %s\n", topic_name); + return -1; + } + // Look to see if we already have a node for this topic char nodepath[orb_maxpath]; int ret = uORB::Utils::node_mkpath(nodepath, topic_name); @@ -613,7 +619,7 @@ int16_t uORB::Manager::process_remote_topic(const char *topic_name) uORB::DeviceNode *node = device_master->getDeviceNode(nodepath); if (node) { - PX4_INFO("Marking DeviceNode(%s) as advertised in process_remote_topic", topic_name); + PX4_DEBUG("Marking DeviceNode(%s) as advertised in process_remote_topic", topic_name); node->mark_as_advertised(); _remote_topics.insert(topic_name); return 0; @@ -622,27 +628,9 @@ int16_t uORB::Manager::process_remote_topic(const char *topic_name) } // We didn't find a node so we need to create it via an advertisement - const struct orb_metadata *const *topic_list = orb_get_topics(); - orb_id_t topic_ptr = nullptr; - - for (size_t i = 0; i < orb_topics_count(); i++) { - if (strcmp(topic_list[i]->o_name, topic_name) == 0) { - topic_ptr = topic_list[i]; - break; - } - } - - if (topic_ptr) { - PX4_INFO("Advertising remote topic %s", topic_name); - _remote_topics.insert(topic_name); - // Add some queue depth when advertising remote topics. These - // topics may get aggregated and thus delivered in a batch that - // requires some buffering in a queue. - orb_advertise(topic_ptr, nullptr, 5); - - } else { - PX4_INFO("process_remote_topic meta not found for %s\n", topic_name); - } + PX4_DEBUG("Advertising remote topic %s", topic_name); + _remote_topics.insert(topic_name); + orb_advertise(topic_ptr, nullptr); return 0; } @@ -663,8 +651,11 @@ int16_t uORB::Manager::process_add_subscription(const char *messageName) PX4_DEBUG("DeviceNode(%s) not created yet", messageName); } else { - // node is present. - node->process_add_subscription(); + // node is present. But don't send any data to it if it + // is a node advertised by the remote side + if (_remote_topics.find(messageName) == false) { + node->process_add_subscription(); + } } } else { diff --git a/platforms/common/uORB/uORBManager.hpp b/platforms/common/uORB/uORBManager.hpp index 1c2870b1eecd..d5202b9236af 100644 --- a/platforms/common/uORB/uORBManager.hpp +++ b/platforms/common/uORB/uORBManager.hpp @@ -215,17 +215,15 @@ class uORB::Manager * @param data A pointer to the initial data to be published. * For topics updated by interrupt handlers, the advertisement * must be performed from non-interrupt context. - * @param queue_size Maximum number of buffered elements. If this is 1, no queuing is - * used. * @return nullptr on error, otherwise returns an object pointer * that can be used to publish to the topic. * If the topic in question is not known (due to an * ORB_DEFINE with no corresponding ORB_DECLARE) * this function will return nullptr and set errno to ENOENT. */ - orb_advert_t orb_advertise(const struct orb_metadata *meta, const void *data, unsigned int queue_size = 1) + orb_advert_t orb_advertise(const struct orb_metadata *meta, const void *data = nullptr) { - return orb_advertise_multi(meta, data, nullptr, queue_size); + return orb_advertise_multi(meta, data, nullptr); } /** @@ -250,16 +248,13 @@ class uORB::Manager * @param instance Pointer to an integer which will yield the instance ID (0-based) * of the publication. This is an output parameter and will be set to the newly * created instance, ie. 0 for the first advertiser, 1 for the next and so on. - * @param queue_size Maximum number of buffered elements. If this is 1, no queuing is - * used. * @return nullptr on error, otherwise returns a handle * that can be used to publish to the topic. * If the topic in question is not known (due to an * ORB_DEFINE with no corresponding ORB_DECLARE) * this function will return nullptr and set errno to ENOENT. */ - orb_advert_t orb_advertise_multi(const struct orb_metadata *meta, const void *data, int *instance, - unsigned int queue_size = 1); + orb_advert_t orb_advertise_multi(const struct orb_metadata *meta, const void *data, int *instance); /** * Unadvertise a topic. diff --git a/platforms/common/uORB/uORBManagerUsr.cpp b/platforms/common/uORB/uORBManagerUsr.cpp index af00dbb9ba58..e1a413e4c685 100644 --- a/platforms/common/uORB/uORBManagerUsr.cpp +++ b/platforms/common/uORB/uORBManagerUsr.cpp @@ -89,8 +89,7 @@ int uORB::Manager::orb_exists(const struct orb_metadata *meta, int instance) return data.ret; } -orb_advert_t uORB::Manager::orb_advertise_multi(const struct orb_metadata *meta, const void *data, int *instance, - unsigned int queue_size) +orb_advert_t uORB::Manager::orb_advertise_multi(const struct orb_metadata *meta, const void *data, int *instance) { /* open the node as an advertiser */ int fd = node_open(meta, true, instance); @@ -100,19 +99,10 @@ orb_advert_t uORB::Manager::orb_advertise_multi(const struct orb_metadata *meta, return nullptr; } - /* Set the queue size. This must be done before the first publication; thus it fails if - * this is not the first advertiser. - */ - int result = px4_ioctl(fd, ORBIOCSETQUEUESIZE, (unsigned long)queue_size); - - if (result < 0 && queue_size > 1) { - PX4_WARN("orb_advertise_multi: failed to set queue size"); - } - /* get the advertiser handle and close the node */ orb_advert_t advertiser; - result = px4_ioctl(fd, ORBIOCGADVERTISER, (unsigned long)&advertiser); + int result = px4_ioctl(fd, ORBIOCGADVERTISER, (unsigned long)&advertiser); px4_close(fd); if (result == PX4_ERROR) { diff --git a/platforms/common/uORB/uORB_tests/uORBTest_UnitTest.cpp b/platforms/common/uORB/uORB_tests/uORBTest_UnitTest.cpp index f8631fa04de0..b40b60ad4760 100644 --- a/platforms/common/uORB/uORB_tests/uORBTest_UnitTest.cpp +++ b/platforms/common/uORB/uORB_tests/uORBTest_UnitTest.cpp @@ -574,8 +574,8 @@ int uORBTest::UnitTest::test_wrap_around() bool updated{false}; // Advertise but not publish topics, only generate device_node, which is convenient for modifying DeviceNode::_generation - const int queue_size = 16; - ptopic = orb_advertise_queue(ORB_ID(orb_test_medium_wrap_around), nullptr, queue_size); + const int queue_size = orb_get_queue_size(ORB_ID(orb_test_medium_wrap_around)); + ptopic = orb_advertise(ORB_ID(orb_test_medium_wrap_around), nullptr); if (ptopic == nullptr) { return test_fail("advertise failed: %d", errno); @@ -828,9 +828,9 @@ int uORBTest::UnitTest::test_queue() return test_fail("subscribe failed: %d", errno); } - const int queue_size = 16; + const int queue_size = orb_get_queue_size(ORB_ID(orb_test_medium_queue)); orb_test_medium_s t{}; - ptopic = orb_advertise_queue(ORB_ID(orb_test_medium_queue), &t, queue_size); + ptopic = orb_advertise(ORB_ID(orb_test_medium_queue), &t); if (ptopic == nullptr) { return test_fail("advertise failed: %d", errno); @@ -935,9 +935,9 @@ int uORBTest::UnitTest::pub_test_queue_main() { orb_test_medium_s t{}; orb_advert_t ptopic{nullptr}; - const int queue_size = 50; + const int queue_size = orb_get_queue_size(ORB_ID(orb_test_medium_queue_poll)); - if ((ptopic = orb_advertise_queue(ORB_ID(orb_test_medium_queue_poll), &t, queue_size)) == nullptr) { + if ((ptopic = orb_advertise(ORB_ID(orb_test_medium_queue_poll), &t)) == nullptr) { _thread_should_exit = true; return test_fail("advertise failed: %d", errno); } diff --git a/platforms/nuttx/NuttX/apps b/platforms/nuttx/NuttX/apps index 616f7024a479..e37940d8535f 160000 --- a/platforms/nuttx/NuttX/apps +++ b/platforms/nuttx/NuttX/apps @@ -1 +1 @@ -Subproject commit 616f7024a479bf209eadce133bba5dc8820a7f99 +Subproject commit e37940d8535f603a16b8f6f21c21edaf584218aa diff --git a/platforms/nuttx/src/px4/common/SerialImpl.cpp b/platforms/nuttx/src/px4/common/SerialImpl.cpp new file mode 100644 index 000000000000..7490dd604cc4 --- /dev/null +++ b/platforms/nuttx/src/px4/common/SerialImpl.cpp @@ -0,0 +1,394 @@ +/**************************************************************************** + * + * Copyright (C) 2023 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include +#include // strncpy +#include +#include +#include +#include +#include +#include + +#define MODULE_NAME "SerialImpl" + +namespace device +{ + +SerialImpl::SerialImpl(const char *port, uint32_t baudrate, ByteSize bytesize, Parity parity, StopBits stopbits, + FlowControl flowcontrol) : + _baudrate(baudrate), + _bytesize(bytesize), + _parity(parity), + _stopbits(stopbits), + _flowcontrol(flowcontrol) +{ + if (port) { + strncpy(_port, port, sizeof(_port) - 1); + _port[sizeof(_port) - 1] = '\0'; + + } else { + _port[0] = 0; + } +} + +SerialImpl::~SerialImpl() +{ + if (isOpen()) { + close(); + } +} + +bool SerialImpl::validateBaudrate(uint32_t baudrate) +{ + return ((baudrate == 9600) || + (baudrate == 19200) || + (baudrate == 38400) || + (baudrate == 57600) || + (baudrate == 115200) || + (baudrate == 230400) || + (baudrate == 460800) || + (baudrate == 921600)); +} + +bool SerialImpl::configure() +{ + /* process baud rate */ + int speed; + + if (! validateBaudrate(_baudrate)) { + PX4_ERR("ERR: unknown baudrate: %lu", _baudrate); + return false; + } + + switch (_baudrate) { + case 9600: speed = B9600; break; + + case 19200: speed = B19200; break; + + case 38400: speed = B38400; break; + + case 57600: speed = B57600; break; + + case 115200: speed = B115200; break; + + case 230400: speed = B230400; break; + +#ifndef B460800 +#define B460800 460800 +#endif + + case 460800: speed = B460800; break; + +#ifndef B921600 +#define B921600 921600 +#endif + + case 921600: speed = B921600; break; + + default: + PX4_ERR("ERR: unknown baudrate: %lu", _baudrate); + return false; + } + + struct termios uart_config; + + int termios_state; + + /* fill the struct for the new configuration */ + if ((termios_state = tcgetattr(_serial_fd, &uart_config)) < 0) { + PX4_ERR("ERR: %d (tcgetattr)", termios_state); + return false; + } + + /* properly configure the terminal (see also https://en.wikibooks.org/wiki/Serial_Programming/termios ) */ + + // + // Input flags - Turn off input processing + // + // convert break to null byte, no CR to NL translation, + // no NL to CR translation, don't mark parity errors or breaks + // no input parity check, don't strip high bit off, + // no XON/XOFF software flow control + // + uart_config.c_iflag &= ~(IGNBRK | BRKINT | ICRNL | + INLCR | PARMRK | INPCK | ISTRIP | IXON); + + // + // Output flags - Turn off output processing + // + // no CR to NL translation, no NL to CR-NL translation, + // no NL to CR translation, no column 0 CR suppression, + // no Ctrl-D suppression, no fill characters, no case mapping, + // no local output processing + // + // config.c_oflag &= ~(OCRNL | ONLCR | ONLRET | + // ONOCR | ONOEOT| OFILL | OLCUC | OPOST); + uart_config.c_oflag = 0; + + // + // No line processing + // + // echo off, echo newline off, canonical mode off, + // extended input processing off, signal chars off + // + uart_config.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN | ISIG); + + /* no parity, one stop bit, disable flow control */ + uart_config.c_cflag &= ~(CSTOPB | PARENB | CRTSCTS); + + /* set baud rate */ + if ((termios_state = cfsetispeed(&uart_config, speed)) < 0) { + PX4_ERR("ERR: %d (cfsetispeed)", termios_state); + return false; + } + + if ((termios_state = cfsetospeed(&uart_config, speed)) < 0) { + PX4_ERR("ERR: %d (cfsetospeed)", termios_state); + return false; + } + + if ((termios_state = tcsetattr(_serial_fd, TCSANOW, &uart_config)) < 0) { + PX4_ERR("ERR: %d (tcsetattr)", termios_state); + return false; + } + + return true; +} + +bool SerialImpl::open() +{ + if (isOpen()) { + return true; + } + + // Open the serial port + int serial_fd = ::open(_port, O_RDWR | O_NOCTTY); + + if (serial_fd < 0) { + PX4_ERR("failed to open %s err: %d", _port, errno); + return false; + } + + _serial_fd = serial_fd; + + // Configure the serial port + if (! configure()) { + PX4_ERR("failed to configure %s err: %d", _port, errno); + return false; + } + + _open = true; + + return _open; +} + +bool SerialImpl::isOpen() const +{ + return _open; +} + +bool SerialImpl::close() +{ + + if (_serial_fd >= 0) { + ::close(_serial_fd); + } + + _serial_fd = -1; + _open = false; + + return true; +} + +ssize_t SerialImpl::read(uint8_t *buffer, size_t buffer_size) +{ + if (!_open) { + PX4_ERR("Cannot read from serial device until it has been opened"); + return -1; + } + + int ret = ::read(_serial_fd, buffer, buffer_size); + + if (ret < 0) { + PX4_DEBUG("%s read error %d", _port, ret); + } + + return ret; +} + +ssize_t SerialImpl::readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count, uint32_t timeout_us) +{ + if (!_open) { + PX4_ERR("Cannot readAtLeast from serial device until it has been opened"); + return -1; + } + + if (buffer_size < character_count) { + PX4_ERR("%s: Buffer not big enough to hold desired amount of read data", __FUNCTION__); + return -1; + } + + const hrt_abstime start_time_us = hrt_absolute_time(); + int total_bytes_read = 0; + + while ((total_bytes_read < (int) character_count) && (hrt_elapsed_time(&start_time_us) < timeout_us)) { + // Poll for incoming UART data. + pollfd fds[1]; + fds[0].fd = _serial_fd; + fds[0].events = POLLIN; + + hrt_abstime remaining_time = timeout_us - hrt_elapsed_time(&start_time_us); + + if (remaining_time <= 0) { break; } + + int ret = poll(fds, sizeof(fds) / sizeof(fds[0]), remaining_time); + + if (ret > 0) { + if (fds[0].revents & POLLIN) { + const unsigned sleeptime = character_count * 1000000 / (_baudrate / 10); + + int err = 0; + int bytes_available = 0; + err = ::ioctl(_serial_fd, FIONREAD, (unsigned long)&bytes_available); + + if (err != 0 || bytes_available < (int)character_count) { + px4_usleep(sleeptime); + } + + ret = read(&buffer[total_bytes_read], buffer_size - total_bytes_read); + + if (ret > 0) { + total_bytes_read += ret; + } + + } else { + PX4_ERR("Got a poll error"); + return -1; + } + } + } + + return total_bytes_read; +} + +ssize_t SerialImpl::write(const void *buffer, size_t buffer_size) +{ + if (!_open) { + PX4_ERR("Cannot write to serial device until it has been opened"); + return -1; + } + + int written = ::write(_serial_fd, buffer, buffer_size); + ::fsync(_serial_fd); + + if (written < 0) { + PX4_ERR("%s write error %d", _port, written); + } + + return written; +} + +const char *SerialImpl::getPort() const +{ + return _port; +} + +uint32_t SerialImpl::getBaudrate() const +{ + return _baudrate; +} + +bool SerialImpl::setBaudrate(uint32_t baudrate) +{ + if (! validateBaudrate(baudrate)) { + PX4_ERR("ERR: invalid baudrate: %lu", baudrate); + return false; + } + + // check if already configured + if ((baudrate == _baudrate) && _open) { + return true; + } + + _baudrate = baudrate; + + // process baud rate change now if port is already open + if (_open) { + return configure(); + } + + return true; +} + +ByteSize SerialImpl::getBytesize() const +{ + return _bytesize; +} + +bool SerialImpl::setBytesize(ByteSize bytesize) +{ + return bytesize == ByteSize::EightBits; +} + +Parity SerialImpl::getParity() const +{ + return _parity; +} + +bool SerialImpl::setParity(Parity parity) +{ + return parity == Parity::None; +} + +StopBits SerialImpl::getStopbits() const +{ + return _stopbits; +} + +bool SerialImpl::setStopbits(StopBits stopbits) +{ + return stopbits == StopBits::One; +} + +FlowControl SerialImpl::getFlowcontrol() const +{ + return _flowcontrol; +} + +bool SerialImpl::setFlowcontrol(FlowControl flowcontrol) +{ + return flowcontrol == FlowControl::Disabled; +} + +} // namespace device diff --git a/platforms/nuttx/src/px4/common/include/SerialImpl.hpp b/platforms/nuttx/src/px4/common/include/SerialImpl.hpp new file mode 100644 index 000000000000..58d41bf759c9 --- /dev/null +++ b/platforms/nuttx/src/px4/common/include/SerialImpl.hpp @@ -0,0 +1,104 @@ +/**************************************************************************** + * + * Copyright (C) 2023 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#pragma once + +#include +#include + +#include + +using device::SerialConfig::ByteSize; +using device::SerialConfig::Parity; +using device::SerialConfig::StopBits; +using device::SerialConfig::FlowControl; + +namespace device +{ + +class SerialImpl +{ +public: + + SerialImpl(const char *port, uint32_t baudrate, ByteSize bytesize, Parity parity, StopBits stopbits, + FlowControl flowcontrol); + virtual ~SerialImpl(); + + bool open(); + bool isOpen() const; + + bool close(); + + ssize_t read(uint8_t *buffer, size_t buffer_size); + ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_us = 0); + + ssize_t write(const void *buffer, size_t buffer_size); + + const char *getPort() const; + + uint32_t getBaudrate() const; + bool setBaudrate(uint32_t baudrate); + + ByteSize getBytesize() const; + bool setBytesize(ByteSize bytesize); + + Parity getParity() const; + bool setParity(Parity parity); + + StopBits getStopbits() const; + bool setStopbits(StopBits stopbits); + + FlowControl getFlowcontrol() const; + bool setFlowcontrol(FlowControl flowcontrol); + +private: + + int _serial_fd{-1}; + + bool _open{false}; + + char _port[32] {}; + + uint32_t _baudrate{0}; + + ByteSize _bytesize{ByteSize::EightBits}; + Parity _parity{Parity::None}; + StopBits _stopbits{StopBits::One}; + FlowControl _flowcontrol{FlowControl::Disabled}; + + bool validateBaudrate(uint32_t baudrate); + bool configure(); + +}; + +} // namespace device diff --git a/platforms/nuttx/src/px4/common/px4_layer.cmake b/platforms/nuttx/src/px4/common/px4_layer.cmake index 69fd1a007da9..9199a9528997 100644 --- a/platforms/nuttx/src/px4/common/px4_layer.cmake +++ b/platforms/nuttx/src/px4/common/px4_layer.cmake @@ -3,6 +3,8 @@ add_library(px4_layer ${KERNEL_SRCS} cdc_acm_check.cpp + ${PX4_SOURCE_DIR}/platforms/common/Serial.cpp + SerialImpl.cpp ) target_link_libraries(px4_layer diff --git a/platforms/nuttx/src/px4/common/px4_protected_layers.cmake b/platforms/nuttx/src/px4/common/px4_protected_layers.cmake index 9c57b488b6d3..a1c6ebc39175 100644 --- a/platforms/nuttx/src/px4/common/px4_protected_layers.cmake +++ b/platforms/nuttx/src/px4/common/px4_protected_layers.cmake @@ -15,6 +15,8 @@ add_library(px4_layer usr_board_ctrl.c usr_hrt.cpp usr_mcu_version.cpp + ${PX4_SOURCE_DIR}/platforms/common/Serial.cpp + SerialImpl.cpp ) target_link_libraries(px4_layer diff --git a/platforms/posix/include/SerialImpl.hpp b/platforms/posix/include/SerialImpl.hpp new file mode 100644 index 000000000000..efc95d7d517a --- /dev/null +++ b/platforms/posix/include/SerialImpl.hpp @@ -0,0 +1,103 @@ +/**************************************************************************** + * + * Copyright (C) 2023 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#pragma once + +#include +#include + +#include + +using device::SerialConfig::ByteSize; +using device::SerialConfig::Parity; +using device::SerialConfig::StopBits; +using device::SerialConfig::FlowControl; + +namespace device +{ + +class SerialImpl +{ +public: + + SerialImpl(const char *port, uint32_t baudrate, ByteSize bytesize, Parity parity, StopBits stopbits, + FlowControl flowcontrol); + virtual ~SerialImpl(); + + bool open(); + bool isOpen() const; + + bool close(); + + ssize_t read(uint8_t *buffer, size_t buffer_size); + ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_us = 0); + + ssize_t write(const void *buffer, size_t buffer_size); + + const char *getPort() const; + + uint32_t getBaudrate() const; + bool setBaudrate(uint32_t baudrate); + + ByteSize getBytesize() const; + bool setBytesize(ByteSize bytesize); + + Parity getParity() const; + bool setParity(Parity parity); + + StopBits getStopbits() const; + bool setStopbits(StopBits stopbits); + + FlowControl getFlowcontrol() const; + bool setFlowcontrol(FlowControl flowcontrol); + +private: + + int _serial_fd{-1}; + + bool _open{false}; + + char _port[32] {}; + + uint32_t _baudrate{0}; + + ByteSize _bytesize{ByteSize::EightBits}; + Parity _parity{Parity::None}; + StopBits _stopbits{StopBits::One}; + FlowControl _flowcontrol{FlowControl::Disabled}; + + bool validateBaudrate(uint32_t baudrate); + bool configure(); +}; + +} // namespace device diff --git a/platforms/posix/src/px4/common/CMakeLists.txt b/platforms/posix/src/px4/common/CMakeLists.txt index 34b65cdf44aa..90d4a77992bb 100644 --- a/platforms/posix/src/px4/common/CMakeLists.txt +++ b/platforms/posix/src/px4/common/CMakeLists.txt @@ -46,6 +46,8 @@ add_library(px4_layer drv_hrt.cpp cpuload.cpp print_load.cpp + ${PX4_SOURCE_DIR}/platforms/common/Serial.cpp + SerialImpl.cpp ) target_compile_definitions(px4_layer PRIVATE MODULE_NAME="px4") target_compile_options(px4_layer PRIVATE -Wno-cast-align) # TODO: fix and enable diff --git a/platforms/posix/src/px4/common/SerialImpl.cpp b/platforms/posix/src/px4/common/SerialImpl.cpp new file mode 100644 index 000000000000..79e3422aedf2 --- /dev/null +++ b/platforms/posix/src/px4/common/SerialImpl.cpp @@ -0,0 +1,387 @@ +/**************************************************************************** + * + * Copyright (C) 2023 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include +#include // strncpy +#include +#include +#include +#include +#include +#include + +namespace device +{ + +SerialImpl::SerialImpl(const char *port, uint32_t baudrate, ByteSize bytesize, Parity parity, StopBits stopbits, + FlowControl flowcontrol) : + _baudrate(baudrate), + _bytesize(bytesize), + _parity(parity), + _stopbits(stopbits), + _flowcontrol(flowcontrol) +{ + if (port) { + strncpy(_port, port, sizeof(_port) - 1); + _port[sizeof(_port) - 1] = '\0'; + + } else { + _port[0] = 0; + } +} + +SerialImpl::~SerialImpl() +{ + if (isOpen()) { + close(); + } +} + +bool SerialImpl::validateBaudrate(uint32_t baudrate) +{ + return ((baudrate == 9600) || + (baudrate == 19200) || + (baudrate == 38400) || + (baudrate == 57600) || + (baudrate == 115200) || + (baudrate == 230400) || + (baudrate == 460800) || + (baudrate == 921600)); +} + +bool SerialImpl::configure() +{ + /* process baud rate */ + int speed; + + if (! validateBaudrate(_baudrate)) { + PX4_ERR("ERR: unknown baudrate: %u", _baudrate); + return false; + } + + switch (_baudrate) { + case 9600: speed = B9600; break; + + case 19200: speed = B19200; break; + + case 38400: speed = B38400; break; + + case 57600: speed = B57600; break; + + case 115200: speed = B115200; break; + + case 230400: speed = B230400; break; + +#ifndef B460800 +#define B460800 460800 +#endif + + case 460800: speed = B460800; break; + +#ifndef B921600 +#define B921600 921600 +#endif + + case 921600: speed = B921600; break; + + default: + PX4_ERR("ERR: unknown baudrate: %d", _baudrate); + return false; + } + + struct termios uart_config; + + int termios_state; + + /* fill the struct for the new configuration */ + if ((termios_state = tcgetattr(_serial_fd, &uart_config)) < 0) { + PX4_ERR("ERR: %d (tcgetattr)", termios_state); + return false; + } + + /* properly configure the terminal (see also https://en.wikibooks.org/wiki/Serial_Programming/termios ) */ + + // + // Input flags - Turn off input processing + // + // convert break to null byte, no CR to NL translation, + // no NL to CR translation, don't mark parity errors or breaks + // no input parity check, don't strip high bit off, + // no XON/XOFF software flow control + // + uart_config.c_iflag &= ~(IGNBRK | BRKINT | ICRNL | + INLCR | PARMRK | INPCK | ISTRIP | IXON); + + // + // Output flags - Turn off output processing + // + // no CR to NL translation, no NL to CR-NL translation, + // no NL to CR translation, no column 0 CR suppression, + // no Ctrl-D suppression, no fill characters, no case mapping, + // no local output processing + // + // config.c_oflag &= ~(OCRNL | ONLCR | ONLRET | + // ONOCR | ONOEOT| OFILL | OLCUC | OPOST); + uart_config.c_oflag = 0; + + // + // No line processing + // + // echo off, echo newline off, canonical mode off, + // extended input processing off, signal chars off + // + uart_config.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN | ISIG); + + /* no parity, one stop bit, disable flow control */ + uart_config.c_cflag &= ~(CSTOPB | PARENB | CRTSCTS); + + /* set baud rate */ + if ((termios_state = cfsetispeed(&uart_config, speed)) < 0) { + PX4_ERR("ERR: %d (cfsetispeed)", termios_state); + return false; + } + + if ((termios_state = cfsetospeed(&uart_config, speed)) < 0) { + PX4_ERR("ERR: %d (cfsetospeed)", termios_state); + return false; + } + + if ((termios_state = tcsetattr(_serial_fd, TCSANOW, &uart_config)) < 0) { + PX4_ERR("ERR: %d (tcsetattr)", termios_state); + return false; + } + + return true; +} + +bool SerialImpl::open() +{ + if (isOpen()) { + return true; + } + + // Open the serial port + int serial_fd = ::open(_port, O_RDWR | O_NOCTTY); + + if (serial_fd < 0) { + PX4_ERR("failed to open %s err: %d", _port, errno); + return false; + } + + _serial_fd = serial_fd; + + // Configure the serial port + if (! configure()) { + PX4_ERR("failed to configure %s err: %d", _port, errno); + return false; + } + + _open = true; + + return _open; +} + +bool SerialImpl::isOpen() const +{ + return _open; +} + +bool SerialImpl::close() +{ + + if (_serial_fd >= 0) { + ::close(_serial_fd); + } + + _serial_fd = -1; + _open = false; + + return true; +} + +ssize_t SerialImpl::read(uint8_t *buffer, size_t buffer_size) +{ + if (!_open) { + PX4_ERR("Cannot read from serial device until it has been opened"); + return -1; + } + + int ret = ::read(_serial_fd, buffer, buffer_size); + + if (ret < 0) { + PX4_DEBUG("%s read error %d", _port, ret); + + } + + return ret; +} + +ssize_t SerialImpl::readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count, uint32_t timeout_us) +{ + if (!_open) { + PX4_ERR("Cannot readAtLeast from serial device until it has been opened"); + return -1; + } + + if (buffer_size < character_count) { + PX4_ERR("%s: Buffer not big enough to hold desired amount of read data", __FUNCTION__); + return -1; + } + + const hrt_abstime start_time_us = hrt_absolute_time(); + int total_bytes_read = 0; + + while ((total_bytes_read < (int) character_count) && (hrt_elapsed_time(&start_time_us) < timeout_us)) { + // Poll for incoming UART data. + pollfd fds[1]; + fds[0].fd = _serial_fd; + fds[0].events = POLLIN; + + hrt_abstime remaining_time = timeout_us - hrt_elapsed_time(&start_time_us); + + if (remaining_time <= 0) { break; } + + int ret = poll(fds, sizeof(fds) / sizeof(fds[0]), remaining_time); + + if (ret > 0) { + if (fds[0].revents & POLLIN) { + const unsigned sleeptime = character_count * 1000000 / (_baudrate / 10); + px4_usleep(sleeptime); + + ret = read(&buffer[total_bytes_read], buffer_size - total_bytes_read); + + if (ret > 0) { + total_bytes_read += ret; + } + + } else { + PX4_ERR("Got a poll error"); + return -1; + } + } + } + + return total_bytes_read; +} + +ssize_t SerialImpl::write(const void *buffer, size_t buffer_size) +{ + if (!_open) { + PX4_ERR("Cannot write to serial device until it has been opened"); + return -1; + } + + int written = ::write(_serial_fd, buffer, buffer_size); + ::fsync(_serial_fd); + + if (written < 0) { + PX4_ERR("%s write error %d", _port, written); + + } + + return written; +} + +const char *SerialImpl::getPort() const +{ + return _port; +} + +uint32_t SerialImpl::getBaudrate() const +{ + return _baudrate; +} + +bool SerialImpl::setBaudrate(uint32_t baudrate) +{ + if (! validateBaudrate(baudrate)) { + PX4_ERR("ERR: invalid baudrate: %u", baudrate); + return false; + } + + // check if already configured + if ((baudrate == _baudrate) && _open) { + return true; + } + + _baudrate = baudrate; + + // process baud rate change now if port is already open + if (_open) { + return configure(); + } + + return true; +} + +ByteSize SerialImpl::getBytesize() const +{ + return _bytesize; +} + +bool SerialImpl::setBytesize(ByteSize bytesize) +{ + return bytesize == ByteSize::EightBits; +} + +Parity SerialImpl::getParity() const +{ + return _parity; +} + +bool SerialImpl::setParity(Parity parity) +{ + return parity == Parity::None; +} + +StopBits SerialImpl::getStopbits() const +{ + return _stopbits; +} + +bool SerialImpl::setStopbits(StopBits stopbits) +{ + return stopbits == StopBits::One; +} + +FlowControl SerialImpl::getFlowcontrol() const +{ + return _flowcontrol; +} + +bool SerialImpl::setFlowcontrol(FlowControl flowcontrol) +{ + return flowcontrol == FlowControl::Disabled; +} + +} // namespace device diff --git a/platforms/posix/src/px4/common/drv_hrt.cpp b/platforms/posix/src/px4/common/drv_hrt.cpp index 9634511bf3fc..b510229bc0cf 100644 --- a/platforms/posix/src/px4/common/drv_hrt.cpp +++ b/platforms/posix/src/px4/common/drv_hrt.cpp @@ -51,6 +51,11 @@ #include #include "hrt_work.h" +// Voxl2 board specific API definitions to get time offset +#if defined(CONFIG_MUORB_APPS_SYNC_TIMESTAMP) +#include "fc_sensor.h" +#endif + #if defined(ENABLE_LOCKSTEP_SCHEDULER) #include static LockstepScheduler lockstep_scheduler {true}; @@ -107,6 +112,29 @@ hrt_abstime hrt_absolute_time() #else // defined(ENABLE_LOCKSTEP_SCHEDULER) struct timespec ts; px4_clock_gettime(CLOCK_MONOTONIC, &ts); + +# if defined(CONFIG_MUORB_APPS_SYNC_TIMESTAMP) + hrt_abstime temp_abstime = ts_to_abstime(&ts); + int apps_time_offset = fc_sensor_get_time_offset(); + + if (apps_time_offset < 0) { + hrt_abstime temp_offset = -apps_time_offset; + + if (temp_offset >= temp_abstime) { + temp_abstime = 0; + + } else { + temp_abstime -= temp_offset; + } + + } else { + temp_abstime += (hrt_abstime) apps_time_offset; + } + + ts.tv_sec = temp_abstime / 1000000; + ts.tv_nsec = (temp_abstime % 1000000) * 1000; +# endif // defined(CONFIG_MUORB_APPS_SYNC_TIMESTAMP) + return ts_to_abstime(&ts); #endif // defined(ENABLE_LOCKSTEP_SCHEDULER) } @@ -449,6 +477,7 @@ int px4_clock_gettime(clockid_t clk_id, struct timespec *tp) #endif // defined(ENABLE_LOCKSTEP_SCHEDULER) return system_clock_gettime(clk_id, tp); + } #if defined(ENABLE_LOCKSTEP_SCHEDULER) diff --git a/platforms/qurt/CMakeLists.txt b/platforms/qurt/CMakeLists.txt index d85f3fcb7bff..0e9757a5d1a9 100644 --- a/platforms/qurt/CMakeLists.txt +++ b/platforms/qurt/CMakeLists.txt @@ -50,5 +50,4 @@ add_library(px4 SHARED target_link_libraries(px4 modules__muorb__slpi ${module_libraries} - px4_layer ) diff --git a/platforms/qurt/include/SerialImpl.hpp b/platforms/qurt/include/SerialImpl.hpp new file mode 100644 index 000000000000..1b98d3bb401b --- /dev/null +++ b/platforms/qurt/include/SerialImpl.hpp @@ -0,0 +1,108 @@ +/**************************************************************************** + * + * Copyright (C) 2023 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#pragma once + +#include + +#include + +using device::SerialConfig::ByteSize; +using device::SerialConfig::Parity; +using device::SerialConfig::StopBits; +using device::SerialConfig::FlowControl; + +namespace device +{ + +class SerialImpl +{ +public: + + SerialImpl(const char *port, uint32_t baudrate, ByteSize bytesize, Parity parity, StopBits stopbits, + FlowControl flowcontrol); + virtual ~SerialImpl(); + + bool open(); + bool isOpen() const; + + bool close(); + + ssize_t read(uint8_t *buffer, size_t buffer_size); + ssize_t readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count = 1, uint32_t timeout_us = 0); + + ssize_t write(const void *buffer, size_t buffer_size); + + const char *getPort() const; + bool setPort(const char *port); + + uint32_t getBaudrate() const; + bool setBaudrate(uint32_t baudrate); + + ByteSize getBytesize() const; + bool setBytesize(ByteSize bytesize); + + Parity getParity() const; + bool setParity(Parity parity); + + StopBits getStopbits() const; + bool setStopbits(StopBits stopbits); + + FlowControl getFlowcontrol() const; + bool setFlowcontrol(FlowControl flowcontrol); + +private: + + int _serial_fd{-1}; + + bool _open{false}; + + char _port[32] {}; + + uint32_t _baudrate{0}; + + ByteSize _bytesize{ByteSize::EightBits}; + Parity _parity{Parity::None}; + StopBits _stopbits{StopBits::One}; + FlowControl _flowcontrol{FlowControl::Disabled}; + + bool validateBaudrate(uint32_t baudrate); + + // Mutex used to lock the read functions + //pthread_mutex_t read_mutex; + + // Mutex used to lock the write functions + //pthread_mutex_t write_mutex; +}; + +} // namespace device diff --git a/platforms/qurt/src/px4/CMakeLists.txt b/platforms/qurt/src/px4/CMakeLists.txt index e685b8d42acf..8a25322755a9 100644 --- a/platforms/qurt/src/px4/CMakeLists.txt +++ b/platforms/qurt/src/px4/CMakeLists.txt @@ -38,6 +38,7 @@ set(QURT_LAYER_SRCS px4_qurt_impl.cpp main.cpp qurt_log.cpp + SerialImpl.cpp ) add_library(px4_layer diff --git a/platforms/qurt/src/px4/SerialImpl.cpp b/platforms/qurt/src/px4/SerialImpl.cpp new file mode 100644 index 000000000000..ec0fb73fce3a --- /dev/null +++ b/platforms/qurt/src/px4/SerialImpl.cpp @@ -0,0 +1,326 @@ +/**************************************************************************** + * + * Copyright (C) 2023 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include +#include // strncpy +#include +#include +#include + +namespace device +{ + +SerialImpl::SerialImpl(const char *port, uint32_t baudrate, ByteSize bytesize, Parity parity, StopBits stopbits, + FlowControl flowcontrol) : + _baudrate(baudrate), + _bytesize(bytesize), + _parity(parity), + _stopbits(stopbits), + _flowcontrol(flowcontrol) +{ + if (port) { + strncpy(_port, port, sizeof(_port) - 1); + _port[sizeof(_port) - 1] = '\0'; + + } else { + _port[0] = 0; + } +} + +SerialImpl::~SerialImpl() +{ + if (isOpen()) { + close(); + } +} + +bool SerialImpl::validateBaudrate(uint32_t baudrate) +{ + if ((baudrate != 9600) && + (baudrate != 38400) && + (baudrate != 57600) && + (baudrate != 115200) && + (baudrate != 230400) && + (baudrate != 250000) && + (baudrate != 420000) && + (baudrate != 460800) && + (baudrate != 921600) && + (baudrate != 1000000) && + (baudrate != 1843200) && + (baudrate != 2000000)) { + return false; + } + + return true; +} + +bool SerialImpl::open() +{ + // There's no harm in calling open multiple times on the same port. + // In fact, that's the only way to change the baudrate + + _open = false; + _serial_fd = -1; + + if (! validateBaudrate(_baudrate)) { + PX4_ERR("Invalid baudrate: %u", _baudrate); + return false; + } + + if (_bytesize != ByteSize::EightBits) { + PX4_ERR("Qurt platform only supports ByteSize::EightBits"); + return false; + } + + if (_parity != Parity::None) { + PX4_ERR("Qurt platform only supports Parity::None"); + return false; + } + + if (_stopbits != StopBits::One) { + PX4_ERR("Qurt platform only supports StopBits::One"); + return false; + } + + if (_flowcontrol != FlowControl::Disabled) { + PX4_ERR("Qurt platform only supports FlowControl::Disabled"); + return false; + } + + // qurt_uart_open will check validity of port and baudrate + int serial_fd = qurt_uart_open(_port, _baudrate); + + if (serial_fd < 0) { + PX4_ERR("failed to open %s, fd returned: %d", _port, serial_fd); + return false; + + } else { + PX4_INFO("Successfully opened UART %s with baudrate %u", _port, _baudrate); + } + + _serial_fd = serial_fd; + _open = true; + + return _open; +} + +bool SerialImpl::isOpen() const +{ + return _open; +} + +bool SerialImpl::close() +{ + // No close defined for qurt uart yet + // if (_serial_fd >= 0) { + // qurt_uart_close(_serial_fd); + // } + + _serial_fd = -1; + _open = false; + + return true; +} + +ssize_t SerialImpl::read(uint8_t *buffer, size_t buffer_size) +{ + if (!_open) { + PX4_ERR("Cannot read from serial device until it has been opened"); + return -1; + } + + int ret_read = qurt_uart_read(_serial_fd, (char *) buffer, buffer_size, 500); + + if (ret_read < 0) { + PX4_DEBUG("%s read error %d", _port, ret_read); + + } + + return ret_read; +} + +ssize_t SerialImpl::readAtLeast(uint8_t *buffer, size_t buffer_size, size_t character_count, uint32_t timeout_us) +{ + if (!_open) { + PX4_ERR("Cannot readAtLeast from serial device until it has been opened"); + return -1; + } + + if (buffer_size < character_count) { + PX4_ERR("%s: Buffer not big enough to hold desired amount of read data", __FUNCTION__); + return -1; + } + + const hrt_abstime start_time_us = hrt_absolute_time(); + int total_bytes_read = 0; + + while (total_bytes_read < (int) character_count) { + + if (timeout_us > 0) { + const uint64_t elapsed_us = hrt_elapsed_time(&start_time_us); + + if (elapsed_us >= timeout_us) { + // If there was a partial read but not enough to satisfy the minimum then they will be lost + // but this really should never happen when everything is working normally. + // PX4_WARN("%s timeout %d bytes read (%llu us elapsed)", __FUNCTION__, total_bytes_read, elapsed_us); + // Or, instead of returning an error, should we return the number of bytes read (assuming it is greater than zero)? + return total_bytes_read; + } + } + + int current_bytes_read = read(&buffer[total_bytes_read], buffer_size - total_bytes_read); + + if (current_bytes_read < 0) { + // Again, if there was a partial read but not enough to satisfy the minimum then they will be lost + // but this really should never happen when everything is working normally. + PX4_ERR("%s failed to read uart", __FUNCTION__); + // Or, instead of returning an error, should we return the number of bytes read (assuming it is greater than zero)? + return -1; + } + + // Current bytes read could be zero + total_bytes_read += current_bytes_read; + + // If we have at least reached our desired minimum number of characters + // then we can return now + if (total_bytes_read >= (int) character_count) { + return total_bytes_read; + } + + // Wait a set amount of time before trying again or the remaining time + // until the timeout if we are getting close + const uint64_t elapsed_us = hrt_elapsed_time(&start_time_us); + int64_t time_until_timeout = timeout_us - elapsed_us; + uint64_t time_to_sleep = 5000; + + if ((time_until_timeout >= 0) && + (time_until_timeout < (int64_t) time_to_sleep)) { + time_to_sleep = time_until_timeout; + } + + px4_usleep(time_to_sleep); + } + + return -1; +} + +ssize_t SerialImpl::write(const void *buffer, size_t buffer_size) +{ + if (!_open) { + PX4_ERR("Cannot write to serial device until it has been opened"); + return -1; + } + + int ret_write = qurt_uart_write(_serial_fd, (const char *) buffer, buffer_size); + + if (ret_write < 0) { + PX4_ERR("%s write error %d", _port, ret_write); + + } + + return ret_write; +} + +const char *SerialImpl::getPort() const +{ + return _port; +} + +uint32_t SerialImpl::getBaudrate() const +{ + return _baudrate; +} + +bool SerialImpl::setBaudrate(uint32_t baudrate) +{ + if (! validateBaudrate(baudrate)) { + PX4_ERR("Invalid baudrate: %u", baudrate); + return false; + } + + // check if already configured + if (baudrate == _baudrate) { + return true; + } + + _baudrate = baudrate; + + // process baud rate change now if port is already open + if (_open) { + return open(); + } + + return true; +} + +ByteSize SerialImpl::getBytesize() const +{ + return _bytesize; +} + +bool SerialImpl::setBytesize(ByteSize bytesize) +{ + return bytesize == ByteSize::EightBits; +} + +Parity SerialImpl::getParity() const +{ + return _parity; +} + +bool SerialImpl::setParity(Parity parity) +{ + return parity == Parity::None; +} + +StopBits SerialImpl::getStopbits() const +{ + return _stopbits; +} + +bool SerialImpl::setStopbits(StopBits stopbits) +{ + return stopbits == StopBits::One; +} + +FlowControl SerialImpl::getFlowcontrol() const +{ + return _flowcontrol; +} + +bool SerialImpl::setFlowcontrol(FlowControl flowcontrol) +{ + return flowcontrol == FlowControl::Disabled; +} + +} // namespace device diff --git a/platforms/qurt/src/px4/drv_hrt.cpp b/platforms/qurt/src/px4/drv_hrt.cpp index 8bb9546a01db..2ef152083249 100644 --- a/platforms/qurt/src/px4/drv_hrt.cpp +++ b/platforms/qurt/src/px4/drv_hrt.cpp @@ -81,7 +81,7 @@ static void hrt_unlock() px4_sem_post(&_hrt_lock); } -int px4_clock_settime(clockid_t clk_id, struct timespec *tp) +int px4_clock_settime(clockid_t clk_id, const struct timespec *tp) { return 0; } diff --git a/platforms/ros2/include/uORB/Publication.hpp b/platforms/ros2/include/uORB/Publication.hpp index 3b53424e0b35..b7f1d0768d0b 100644 --- a/platforms/ros2/include/uORB/Publication.hpp +++ b/platforms/ros2/include/uORB/Publication.hpp @@ -45,28 +45,10 @@ namespace uORB { -template class DefaultQueueSize -{ -private: - template - static constexpr uint8_t get_queue_size(decltype(T::ORB_QUEUE_LENGTH) *) - { - return T::ORB_QUEUE_LENGTH; - } - - template static constexpr uint8_t get_queue_size(...) - { - return 1; - } - -public: - static constexpr unsigned value = get_queue_size(nullptr); -}; - /** * uORB publication wrapper class */ -template::value> +template class Publication { public: diff --git a/src/drivers/barometer/bmp388/bmp388.cpp b/src/drivers/barometer/bmp388/bmp388.cpp index 8178bc5785dd..50c40e0686f8 100644 --- a/src/drivers/barometer/bmp388/bmp388.cpp +++ b/src/drivers/barometer/bmp388/bmp388.cpp @@ -77,6 +77,7 @@ BMP388::init() if (_chip_id == BMP390_CHIP_ID) { _interface->set_device_type(DRV_BARO_DEVTYPE_BMP390); + this->_item_name = "bmp390"; } _chip_rev_id = _interface->get_reg(BMP3_REV_ID_ADDR); diff --git a/src/drivers/barometer/invensense/icp201xx/ICP201XX.cpp b/src/drivers/barometer/invensense/icp201xx/ICP201XX.cpp index 490aa8885784..4cc21739323a 100755 --- a/src/drivers/barometer/invensense/icp201xx/ICP201XX.cpp +++ b/src/drivers/barometer/invensense/icp201xx/ICP201XX.cpp @@ -251,7 +251,7 @@ ICP201XX::RunImpl() case STATE::CONFIG: { if (configure()) { _state = STATE::WAIT_READ; - ScheduleDelayed(30_ms); + ScheduleDelayed(50_ms); } else { if (hrt_elapsed_time(&_reset_timestamp) > 1000_ms) { diff --git a/src/drivers/camera_trigger/camera_trigger.cpp b/src/drivers/camera_trigger/camera_trigger.cpp index c03e63aca45a..4f49e5692baf 100644 --- a/src/drivers/camera_trigger/camera_trigger.cpp +++ b/src/drivers/camera_trigger/camera_trigger.cpp @@ -314,7 +314,7 @@ CameraTrigger::CameraTrigger() : // Advertise critical publishers here, because we cannot advertise in interrupt context camera_trigger_s trigger{}; - _trigger_pub = orb_advertise_queue(ORB_ID(camera_trigger), &trigger, camera_trigger_s::ORB_QUEUE_LENGTH); + _trigger_pub = orb_advertise(ORB_ID(camera_trigger), &trigger); } CameraTrigger::~CameraTrigger() diff --git a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_api.h b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_api.h index 44cdc921683d..3e30649ae104 100644 --- a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_api.h +++ b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_api.h @@ -160,6 +160,11 @@ status_t Argus_InitMode(argus_hnd_t *hnd, s2pi_slave_t spi_slave, argus_mode_t m * Also refer to #Argus_ReinitMode, which uses a specified measurement * mode instead of the currently active measurement mode. * + * @note If a full re-initialization is not desired, refer to the + * #Argus_RestoreDeviceState function that will only re-write the + * register map to the device to restore its state after an power + * cycle. + * * @param hnd The API handle; contains all internal states and data. * * @return Returns the \link #status_t status\endlink (#STATUS_OK on success). @@ -182,6 +187,11 @@ status_t Argus_Reinit(argus_hnd_t *hnd); * Also refer to #Argus_Reinit, which re-uses the currently active * measurement mode instead of an user specified measurement mode. * + * @note If a full re-initialization is not desired, refer to the + * #Argus_RestoreDeviceState function that will only re-write the + * register map to the device to restore its state after an power + * cycle. + * * @param hnd The API handle; contains all internal states and data. * * @param mode The specified measurement mode to be initialized. @@ -274,6 +284,69 @@ argus_hnd_t *Argus_CreateHandle(void); *****************************************************************************/ status_t Argus_DestroyHandle(argus_hnd_t *hnd); +/*!*************************************************************************** + * @brief Restores the device state with a re-write of all register values. + * + * @details The function invalidates and restores the device state by executing + * a re-write of the full register map. + * + * The purpose of this function is to recover from known external + * events like power cycles, for example due to sleep / wake-up + * functionality. This can be implemented by cutting off the external + * power supply of the device (e.g. via a MOSFET switch controlled by + * a GPIB pin). By calling this function, the expected state of the + * API is written to the device without the need to fully re-initialize + * the device. Thus, the API can resume where it has stopped as if + * there has never been a power cycle. + * + * The internal state machines like the dynamic configuration adaption + * (DCA) algorithm will not be reseted. The API/sensor will immediately + * resume at the last state that was optimized for the given + * environmental conditions. + * + * The use case of sleep / wake-up can be implemented as follows: + * + * 1. In case of ongoing measurements, stop the measurements via + * the #Argus_StopMeasurementTimer function (if started by the + * #Argus_StartMeasurementTimer function). + * + * 2. Shut down the device by removing the 5V power supply, e.g. + * via a GPIO pin that switches a MOSFET circuit. + * + * 3. After the desired sleep period, power the device by switching + * the 5V power supply on again. Wait until the power-on-reset + * (POR) is finished (approx. 1 ms) or just repeat step 4 until + * it succeeds. + * + * 4. Call the #Argus_RestoreDeviceState function to trigger the + * restoration of the device state in the API. Note that the + * function will return an error code if it fails. One can repeat + * the execution of that function a few times until it succeeds. + * + * 6. Continue with measurements via #Argus_StartMeasurementTimer + * of #Argus_TriggerMeasurement functions as desired. + * + * @note If a complete re-initialization (= soft-reset) is desired, see + * the #Argus_Reinit functionality. + * + * @note Changing a configuration or calibration parameter will always + * invalidate the device state as well as the state machine of the + * dynamic configuration adaption (DCA) algorithm. In that case, the + * device/API needs a few measurements to adopt to the present + * environmental conditions before the first valid measurement result + * can be obtained. This is almost similar to re-initializing the + * device (see #Argus_Reinit) which would also re-read the EEPROM. + * On the other hand, the #Argus_RestoreDeviceState does not reset + * or re-initialize anything. It just makes sure that the device + * register map (which has changed to its reset values after the + * power cycle) is what the API expects upon the next measurement. + * + * @param hnd The device handle object to be invalidated. + * + * @return Returns the \link #status_t status\endlink (#STATUS_OK on success). + *****************************************************************************/ +status_t Argus_RestoreDeviceState(argus_hnd_t *hnd); + /*!************************************************************************** * Generic API ****************************************************************************/ @@ -726,7 +799,7 @@ status_t Argus_ExecuteXtalkCalibrationSequence(argus_hnd_t *hnd); * After calibration has finished successfully, the obtained data is * applied immediately and can be read from the API using the * #Argus_GetCalibrationPixelRangeOffsets or - * #Argus_GetCalibrationGlobalRangeOffset function. + * #Argus_GetCalibrationGlobalRangeOffsets function. * * @param hnd The API handle; contains all internal states and data. * @return Returns the \link #status_t status\endlink (#STATUS_OK on success). @@ -775,7 +848,7 @@ status_t Argus_ExecuteRelativeRangeOffsetCalibrationSequence(argus_hnd_t *hnd); * After calibration has finished successfully, the obtained data is * applied immediately and can be read from the API using the * #Argus_GetCalibrationPixelRangeOffsets or - * #Argus_GetCalibrationGlobalRangeOffset function. + * #Argus_GetCalibrationGlobalRangeOffsets function. * * @param hnd The API handle; contains all internal states and data. * @param targetRange The absolute range between the reference plane and the @@ -1043,28 +1116,40 @@ status_t Argus_GetConfigurationUnambiguousRange(argus_hnd_t *hnd, ****************************************************************************/ /*!*************************************************************************** - * @brief Sets the global range offset value to a specified device. + * @brief Sets the global range offset values to a specified device. * - * @details The global range offset is subtracted from the raw range values. + * @details The global range offsets are subtracted from the raw range values. + * There are two distinct values that are applied in low or high + * power stage setting respectively. * * @param hnd The API handle; contains all internal states and data. - * @param value The new global range offset in meter and Q0.15 format. + * @param offset_low The new global range offset for the low power stage in + * meter and Q0.15 format. + * @param offset_high The new global range offset for the high power stage in + * meter and Q0.15 format. * @return Returns the \link #status_t status\endlink (#STATUS_OK on success). *****************************************************************************/ -status_t Argus_SetCalibrationGlobalRangeOffset(argus_hnd_t *hnd, - q0_15_t value); +status_t Argus_SetCalibrationGlobalRangeOffsets(argus_hnd_t *hnd, + q0_15_t offset_low, + q0_15_t offset_high); /*!*************************************************************************** - * @brief Gets the global range offset value from a specified device. + * @brief Gets the global range offset values from a specified device. * - * @details The global range offset is subtracted from the raw range values. + * @details The global range offsets are subtracted from the raw range values. + * There are two distinct values that are applied in low or high + * power stage setting respectively. * * @param hnd The API handle; contains all internal states and data. - * @param value The current global range offset in meter and Q0.15 format. + * @param offset_low The current range offset for the low power stage in + * meter and Q0.15 format. + * @param offset_high The current global range offset for the high power stage + * in meter and Q0.15 format. * @return Returns the \link #status_t status\endlink (#STATUS_OK on success). *****************************************************************************/ -status_t Argus_GetCalibrationGlobalRangeOffset(argus_hnd_t *hnd, - q0_15_t *value); +status_t Argus_GetCalibrationGlobalRangeOffsets(argus_hnd_t *hnd, + q0_15_t *offset_low, + q0_15_t *offset_high); /*!*************************************************************************** * @brief Sets the relative pixel offset table to a specified device. diff --git a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_dca.h b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_dca.h index 8f6b40bdc5b9..8d9a854b2cc1 100644 --- a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_dca.h +++ b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_dca.h @@ -210,9 +210,13 @@ typedef enum argus_dca_gain_t { * - [9]: #ARGUS_STATE_LASER_ERROR * - [10]: #ARGUS_STATE_HAS_DATA * - [11]: #ARGUS_STATE_HAS_AUX_DATA - * - [12]: #ARGUS_STATE_DCA_MAX + * - [12]: #ARGUS_STATE_SATURATED_PIXELS * - [13]: DCA Power Stage * - [14-15]: DCA Gain Stages + * - [16]: #ARGUS_STATE_DCA_MIN + * - [17]: #ARGUS_STATE_DCA_MAX + * - [18]: #ARGUS_STATE_DCA_RESET + * - [18-31]: not used * . *****************************************************************************/ typedef enum argus_state_t { @@ -229,36 +233,35 @@ typedef enum argus_state_t { * - 1: Enabled: measurement with detuned frequency. */ ARGUS_STATE_DUAL_FREQ_MODE = 1U << 1U, - /*! 0x0004: Measurement Frequency for Dual Frequency Mode + /*! 0x0004: Measurement Frequency for Dual Frequency Mode \n * (only if #ARGUS_STATE_DUAL_FREQ_MODE flag is set). * - 0: A-Frame w/ detuned frequency, * - 1: B-Frame w/ detuned frequency */ ARGUS_STATE_MEASUREMENT_FREQ = 1U << 2U, - /*! 0x0008: Debug Mode. If set, the range value of erroneous pixels + /*! 0x0008: Debug Mode. \n + * If set, the range value of erroneous pixels * are not cleared or reset. * - 0: Disabled (default). * - 1: Enabled. */ ARGUS_STATE_DEBUG_MODE = 1U << 3U, - /*! 0x0010: Weak Signal Flag. + /*! 0x0010: Weak Signal Flag. \n * Set whenever the Pixel Binning Algorithm is detecting a * weak signal, i.e. if the amplitude dies not reach its - * (absolute) threshold. If the Golden Pixel is enabled, - * this also indicates that the Pixel Binning Algorithm - * falls back to the Golden Pixel. + * (absolute) threshold. * - 0: Normal Signal. - * - 1: Weak Signal or Golden Pixel Mode. */ + * - 1: Weak Signal. */ ARGUS_STATE_WEAK_SIGNAL = 1U << 4U, - /*! 0x0020: Background Light Warning Flag. + /*! 0x0020: Background Light Warning Flag. \n * Set whenever the background light is very high and the * measurement data might be unreliable. * - 0: No Warning: Background Light is within valid range. * - 1: Warning: Background Light is very high. */ ARGUS_STATE_BGL_WARNING = 1U << 5U, - /*! 0x0040: Background Light Error Flag. + /*! 0x0040: Background Light Error Flag. \n * Set whenever the background light is too high and the * measurement data is unreliable or invalid. * - 0: No Error: Background Light is within valid range. @@ -270,7 +273,7 @@ typedef enum argus_state_t { * - 1: PLL locked at start of integration. */ ARGUS_STATE_PLL_LOCKED = 1U << 7U, - /*! 0x0100: Laser Failure Warning Flag. + /*! 0x0100: Laser Failure Warning Flag. \n * Set whenever the an invalid system condition is detected. * (i.e. DCA at max state but no amplitude on any (incl. reference) * pixel, not amplitude but any saturated pixel). @@ -279,7 +282,7 @@ typedef enum argus_state_t { * condition stays, a laser malfunction error is raised. */ ARGUS_STATE_LASER_WARNING = 1U << 8U, - /*! 0x0200: Laser Failure Error Flag. + /*! 0x0200: Laser Failure Error Flag. \n * Set whenever a laser malfunction error is raised and the * system is put into a safe state. * - 0: No Error: Laser is operating properly. @@ -297,13 +300,12 @@ typedef enum argus_state_t { * - 1: Auxiliary data is available and correctly evaluated. */ ARGUS_STATE_HAS_AUX_DATA = 1U << 11U, - /*! 0x1000: DCA Maximum State Flag. - * Set whenever the DCA has extended all its parameters to their - * maximum values and can not increase the integration energy any - * further. - * - 0: DCA has not yet reached its maximum state. - * - 1: DCA has reached its maximum state and can not increase any further. */ - ARGUS_STATE_DCA_MAX = 1U << 12U, + /*! 0x0100: Pixel Saturation Flag. \n + * Set whenever any pixel is saturated, i.e. its pixel state is + * #PIXEL_SAT + * - 0: No saturated pixels. + * - 1: Any saturated pixels. */ + ARGUS_STATE_SATURATED_PIXELS = 1U << 12U, /*! 0x2000: DCA is in high Optical Output Power stage. */ ARGUS_STATE_DCA_POWER_HIGH = DCA_POWER_HIGH << ARGUS_STATE_DCA_POWER_SHIFT, @@ -320,6 +322,31 @@ typedef enum argus_state_t { /*! 0xC000: DCA is in high Pixel Input Gain stage. */ ARGUS_STATE_DCA_GAIN_HIGH = DCA_GAIN_HIGH << ARGUS_STATE_DCA_GAIN_SHIFT, + /*! 0x10000: DCA Minimum State Flag. \n + * Set whenever the DCA has reduced all its parameters to their + * minimum values and it can not decrease the integration energy + * any further. + * - 0: DCA has not yet reached its minimum state. + * - 1: DCA has reached its minimum state and can not decrease + * its parameters any further. */ + ARGUS_STATE_DCA_MIN = 1U << 16U, + + /*! 0x20000: DCA Maximum State Flag. \n + * Set whenever the DCA has extended all its parameters to their + * maximum values and it can not increase the integration energy + * any further. + * - 0: DCA has not yet reached its maximum state. + * - 1: DCA has reached its maximum state and can not increase + * its parameters any further. */ + ARGUS_STATE_DCA_MAX = 1U << 17U, + + /*! 0x20000: DCA Reset State Flag. \n + * Set whenever the DCA is resetting all its parameters to their + * minimum values because it has detected too many saturated pixels. + * - 0: DCA is operating in normal mode. + * - 1: DCA is performing a reset. */ + ARGUS_STATE_DCA_RESET = 1U << 18U, + } argus_state_t; /*!*************************************************************************** diff --git a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_map.h b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_map.h index 4ffa55656ba2..22a85b9d3e24 100644 --- a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_map.h +++ b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_map.h @@ -58,6 +58,7 @@ extern "C" { *****************************************************************************/ #include "utility/int_math.h" +#include #include @@ -138,6 +139,13 @@ extern "C" { #define PIXEL_CH2N(c) (((((c) << 1U) ^ 0x1CU) & 0x1CU) | (((c) >> 3U) & 0x02U) | ((c) & 0x01U)) +/*!***************************************************************************** + * @brief Macro to create a pixel mask given by the pixels n-index. + * @param n n-index of the pixel. + * @return The pixel mask with only n-index pixel set. + ******************************************************************************/ +#define PIXELN_MASK(n) (0x01U << (n)) + /*!***************************************************************************** * @brief Macro to determine if a pixel given by the n-index is enabled in a pixel mask. * @param msk 32-bit pixel mask @@ -151,15 +159,22 @@ extern "C" { * @param msk 32-bit pixel mask * @param n n-index of the pixel to enable. ******************************************************************************/ -#define PIXELN_ENABLE(msk, n) ((msk) |= (0x01U << (n))) +#define PIXELN_ENABLE(msk, n) ((msk) |= (PIXELN_MASK(n))) /*!***************************************************************************** * @brief Macro disable a pixel given by the n-index in a pixel mask. * @param msk 32-bit pixel mask * @param n n-index of the pixel to disable. ******************************************************************************/ -#define PIXELN_DISABLE(msk, n) ((msk) &= (~(0x01U << (n)))) +#define PIXELN_DISABLE(msk, n) ((msk) &= (~PIXELN_MASK(n))) + +/*!***************************************************************************** + * @brief Macro to create a pixel mask given by the pixels ADC channel number. + * @param c The ADC channel number of the pixel. + * @return The 32-bit pixel mask with only pixel ADC channel set. + ******************************************************************************/ +#define PIXELCH_MASK(c) (0x01U << (PIXEL_CH2N(c))) /*!***************************************************************************** * @brief Macro to determine if an ADC pixel channel is enabled from a pixel mask. @@ -184,6 +199,14 @@ extern "C" { #define PIXELCH_DISABLE(msk, c) (PIXELN_DISABLE(msk, PIXEL_CH2N(c))) +/*!***************************************************************************** + * @brief Macro to create a pixel mask given by the pixel x-y-indices. + * @param x x-index of the pixel. + * @param y y-index of the pixel. + * @return The 32-bit pixel mask with only pixel ADC channel set. + ******************************************************************************/ +#define PIXELXY_MASK(x, y) (0x01U << (PIXEL_XY2N(x, y))) + /*!***************************************************************************** * @brief Macro to determine if a pixel given by the x-y-indices is enabled in a pixel mask. * @param msk 32-bit pixel mask @@ -337,10 +360,10 @@ static inline uint32_t ShiftSelectedPixels(const uint32_t pixel_mask, uint32_t shifted_mask = 0; - for (uint8_t x = 0; x < ARGUS_PIXELS_X; ++x) { - for (uint8_t y = 0; y < ARGUS_PIXELS_Y; ++y) { - int8_t x_src = x - dx; - int8_t y_src = y - dy; + for (int8_t x = 0; x < ARGUS_PIXELS_X; ++x) { + for (int8_t y = 0; y < ARGUS_PIXELS_Y; ++y) { + int8_t x_src = (int8_t)(x - dx); + int8_t y_src = (int8_t)(y - dy); if (dy & 0x1) { /* Compensate for hexagonal pixel shape. */ @@ -409,8 +432,8 @@ static inline uint32_t FillPixelMask(uint32_t pixel_mask, int8_t min_y = -1; /* Find nearest not selected pixel. */ - for (uint8_t x = 0; x < ARGUS_PIXELS_X; ++x) { - for (uint8_t y = 0; y < ARGUS_PIXELS_Y; ++y) { + for (int8_t x = 0; x < ARGUS_PIXELS_X; ++x) { + for (int8_t y = 0; y < ARGUS_PIXELS_Y; ++y) { if (!PIXELXY_ISENABLED(pixel_mask, x, y)) { int32_t distx = (x - center_x) << 1; @@ -423,8 +446,8 @@ static inline uint32_t FillPixelMask(uint32_t pixel_mask, if (dist < min_dist) { min_dist = dist; - min_x = x; - min_y = y; + min_x = (int8_t)x; + min_y = (int8_t)y; } } } @@ -438,6 +461,64 @@ static inline uint32_t FillPixelMask(uint32_t pixel_mask, return pixel_mask; } + +/*!***************************************************************************** + * @brief Fills a pixel mask with the direct neighboring pixels around a pixel. + * + * @details The pixel mask is iteratively filled with the direct neighbors of the + * specified center pixel. + * + * Note that the function is able to handle corner and edge pixels and + * also to handle odd/even lines (which have different layouts) + * + * @param x The selected pixel x-index. + * @param y The selected pixel y-index. + * @return The filled pixel mask with all direct neighbors of the selected pixel. + ******************************************************************************/ +static inline uint32_t GetAdjacentPixelsMask(const uint_fast8_t x, + const uint_fast8_t y) +{ + assert(x < ARGUS_PIXELS_X); + assert(y < ARGUS_PIXELS_Y); + + uint32_t mask = 0u; + + bool isXEdgeLow = (x == 0); + bool isXEdgeHigh = (x == (ARGUS_PIXELS_X - 1)); + bool isYEdgeLow = (y == 0); + bool isYEdgeHigh = (y == (ARGUS_PIXELS_Y - 1)); + + if (y % 2 == 0) { + if (!isYEdgeLow) { PIXELXY_ENABLE(mask, x, y - 1); } + + if ((!isXEdgeHigh) && (!isYEdgeLow)) { PIXELXY_ENABLE(mask, x + 1, y - 1); } + + if (!isXEdgeHigh) { PIXELXY_ENABLE(mask, x + 1, y); } + + if ((!isXEdgeHigh) && (!isYEdgeHigh)) { PIXELXY_ENABLE(mask, x + 1, y + 1); } + + if (!isYEdgeHigh) { PIXELXY_ENABLE(mask, x, y + 1); } + + if (!isXEdgeLow) { PIXELXY_ENABLE(mask, x - 1, y); } + + } else { + if ((!isXEdgeLow) && (!isYEdgeLow)) { PIXELXY_ENABLE(mask, x - 1, y - 1); } + + if (!isYEdgeLow) { PIXELXY_ENABLE(mask, x, y - 1); } + + if (!isXEdgeHigh) { PIXELXY_ENABLE(mask, x + 1, y); } + + if (!isYEdgeHigh) { PIXELXY_ENABLE(mask, x, y + 1); } + + if ((!isXEdgeLow) && (!isYEdgeHigh)) { PIXELXY_ENABLE(mask, x - 1, y + 1); } + + if (!isXEdgeLow) { PIXELXY_ENABLE(mask, x - 1, y); } + } + + return mask; +} + + /*! @} */ #ifdef __cplusplus } // extern "C" diff --git a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_msk.h b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_msk.h deleted file mode 100644 index 258fb3826092..000000000000 --- a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_msk.h +++ /dev/null @@ -1,170 +0,0 @@ -/*************************************************************************//** - * @file - * @brief This file is part of the AFBR-S50 API. - * @details Defines macros to work with pixel and ADC channel masks. - * - * @copyright - * - * Copyright (c) 2021, Broadcom 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: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - *****************************************************************************/ - -#ifndef ARGUS_MSK_H -#define ARGUS_MSK_H - -/*!*************************************************************************** - * @defgroup argusmap ADC Channel Mapping - * @ingroup argusres - * - * @brief Pixel ADC Channel (n) to x-y-Index Mapping - * - * @details The ADC Channels of each pixel or auxiliary channel on the device - * is numbered in a way that is convenient on the chip. The macros - * in this module are defined in order to obtain the x-y-indices of - * each channel and vice versa. - * - * @addtogroup argusmap - * @{ - *****************************************************************************/ - -#include "api/argus_def.h" -#include "utility/int_math.h" - -/*!***************************************************************************** - * @brief Macro to determine the channel number of an specified Pixel. - * @param x The x index of the pixel. - * @param y The y index of the pixel. - * @return The channel number n of the pixel. - ******************************************************************************/ -#define PIXEL_XY2N(x, y) ((((x) ^ 7) << 1) | ((y) & 2) << 3 | ((y) & 1)) - -/*!***************************************************************************** - * @brief Macro to determine the x index of an specified Pixel channel. - * @param n The channel number of the pixel. - * @return The x index number of the pixel. - ******************************************************************************/ -#define PIXEL_N2X(n) ((((n) >> 1U) & 7) ^ 7) - -/*!***************************************************************************** - * @brief Macro to determine the y index of an specified Pixel channel. - * @param n The channel number of the pixel. - * @return The y index number of the pixel. - ******************************************************************************/ -#define PIXEL_N2Y(n) (((n) & 1U) | (((n) >> 3) & 2U)) - -/*!***************************************************************************** - * @brief Macro to determine if a ADC Pixel channel was enabled from a pixel mask. - * @param msk The 32-bit pixel mask - * @param ch The channel number of the pixel. - * @return True if the pixel channel n was enabled, false elsewise. - ******************************************************************************/ -#define PIXELN_ISENABLED(msk, ch) (((msk) >> (ch)) & 0x01U) - -/*!***************************************************************************** - * @brief Macro enables an ADC Pixel channel in a pixel mask. - * @param msk The 32-bit pixel mask - * @param ch The channel number of the pixel. - ******************************************************************************/ -#define PIXELN_ENABLE(msk, ch) ((msk) |= (0x01U << (ch))) - -/*!***************************************************************************** - * @brief Macro disables an ADC Pixel channel in a pixel mask. - * @param msk The 32-bit pixel mask - * @param ch The channel number of the pixel. - ******************************************************************************/ -#define PIXELN_DISABLE(msk, ch) ((msk) &= (~(0x01U << (ch)))) - -/*!***************************************************************************** - * @brief Macro to determine if an ADC Pixel channel was enabled from a pixel mask. - * @param msk 32-bit pixel mask - * @param x x index of the pixel. - * @param y y index of the pixel. - * @return True if the pixel (x,y) was enabled, false elsewise. - ******************************************************************************/ -#define PIXELXY_ISENABLED(msk, x, y) (PIXELN_ISENABLED(msk, PIXEL_XY2N(x, y))) - -/*!***************************************************************************** - * @brief Macro enables an ADC Pixel channel in a pixel mask. - * @param msk 32-bit pixel mask - * @param x x index of the pixel. - * @param y y index of the pixel. - ******************************************************************************/ -#define PIXELXY_ENABLE(msk, x, y) (PIXELN_ENABLE(msk, PIXEL_XY2N(x, y))) - -/*!***************************************************************************** - * @brief Macro disables an ADC Pixel channel in a pixel mask. - * @param msk 32-bit pixel mask - * @param x x index of the pixel. - * @param y y index of the pixel. - ******************************************************************************/ -#define PIXELXY_DISABLE(msk, x, y) (PIXELN_DISABLE(msk, PIXEL_XY2N(x, y))) - -/*!***************************************************************************** - * @brief Macro to determine if a ADC channel was enabled from a channel mask. - * @param msk 32-bit channel mask - * @param ch channel number of the ADC channel. - * @return True if the ADC channel n was enabled, false elsewise. - ******************************************************************************/ -#define CHANNELN_ISENABLED(msk, ch) (((msk) >> ((ch) - 32U)) & 0x01U) - -/*!***************************************************************************** - * @brief Macro to determine if a ADC channel was enabled from a channel mask. - * @param msk 32-bit channel mask - * @param ch channel number of the ADC channel. - * @return True if the ADC channel n was enabled, false elsewise. - ******************************************************************************/ -#define CHANNELN_ENABLE(msk, ch) ((msk) |= (0x01U << ((ch) - 32U))) - -/*!***************************************************************************** - * @brief Macro to determine if a ADC channel was enabled from a channel mask. - * @param msk 32-bit channel mask - * @param ch channel number of the ADC channel. - * @return True if the ADC channel n was enabled, false elsewise. - ******************************************************************************/ -#define CHANNELN_DISABLE(msk, ch) ((msk) &= (~(0x01U << ((ch) - 32U)))) - - -/*!***************************************************************************** - * @brief Macro to determine the number of enabled pixel channels via a popcount - * algorithm. - * @param pxmsk 32-bit pixel mask - * @return The count of enabled pixel channels. - ******************************************************************************/ -#define PIXEL_COUNT(pxmsk) popcount(pxmsk) - -/*!***************************************************************************** - * @brief Macro to determine the number of enabled channels via a popcount - * algorithm. - * @param pxmsk 32-bit pixel mask - * @param chmsk 32-bit channel mask - * @return The count of enabled ADC channels. - ******************************************************************************/ -#define CHANNEL_COUNT(pxmsk, chmsk) (popcount(pxmsk) + popcount(chmsk)) - -/*! @} */ -#endif /* ARGUS_MSK_H */ diff --git a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_offset.h b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_offset.h index 7a41440f3976..3ef649d45b3b 100644 --- a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_offset.h +++ b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_offset.h @@ -36,6 +36,9 @@ #ifndef ARGUS_OFFSET_H #define ARGUS_OFFSET_H +#ifdef __cplusplus +extern "C" { +#endif /*!*************************************************************************** * @addtogroup argus_cal @@ -48,12 +51,26 @@ * @brief Pixel Range Offset Table. * @details Contains pixel range offset values for all 32 active pixels. *****************************************************************************/ -typedef struct argus_cal_offset_table_t { - /*! The offset values per pixel in meter and Q0.15 format. */ - q0_15_t Table[ARGUS_PIXELS_X][ARGUS_PIXELS_Y]; +typedef union argus_cal_offset_table_t { + struct { + /*! The offset values table for Low Power Stage of all 32 pixels. + * Unit: meter; Format: Q0.15 */ + q0_15_t LowPower[ARGUS_PIXELS_X][ARGUS_PIXELS_Y]; + + /*! The offset values table for High Power Stage of all 32 pixels. + * Unit: meter; Format: Q0.15 */ + q0_15_t HighPower[ARGUS_PIXELS_X][ARGUS_PIXELS_Y]; + }; + + /*! The offset values table for Low/High Power Stages of all 32 pixels. + * Unit: meter; Format: Q0.15 */ + q0_15_t Table[ARGUS_DCA_POWER_STAGE_COUNT][ARGUS_PIXELS_X][ARGUS_PIXELS_Y]; } argus_cal_offset_table_t; /*! @} */ +#ifdef __cplusplus +} // extern "C" +#endif #endif /* ARGUS_OFFSET_T */ diff --git a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_pba.h b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_pba.h index f28576500d11..f412229396a6 100644 --- a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_pba.h +++ b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_pba.h @@ -55,11 +55,11 @@ extern "C" { * information from the filtered pixels by averaging them in a * specified way. * - * The Pixel Binning Algorithm is a three-stage filter with a - * fallback value: + * Basically, the Pixel Binning Algorithm is a multi-stage filter: * * -# A fixed pre-filter mask is applied to statically disable * specified pixels. + * * -# A relative and absolute amplitude filter is applied in the * second stage. The relative filter is determined by a ratio * of the maximum amplitude off all available (i.e. not filtered @@ -75,12 +75,28 @@ extern "C" { * selected and considered for the final 1D distance. The * absolute threshold is used to dismiss pixels that are below * the noise level. The latter would be considered for the 1D - * result if the maximum amplitude is already very low. + * result if the maximum amplitude is already very low.\n + * Those threshold are implemented using a hysteresis behavior. + * For its configuration, see the following parameters: + * - #argus_cfg_pba_t::RelativeAmplitudeInclusion + * - #argus_cfg_pba_t::RelativeAmplitudeExclusion + * - #argus_cfg_pba_t::AbsoluteAmplitudeInclusion + * - #argus_cfg_pba_t::AbsoluteAmplitudeExclusion + * . + * * -# An absolute minimum distance filter is applied in addition * to the amplitude filter. This removes all pixel that have * a lower distance than the specified threshold. This is used * to remove invalid pixels that can be detected by a physically - * not correct negative distance. + * not correct negative distance.\n + * For its configuration, see the following parameters: + * - #PBA_ENABLE_MIN_DIST_SCOPE + * - #argus_cfg_pba_t::AbsoluteDistanceScopeInclusion + * - #argus_cfg_pba_t::AbsoluteDistanceScopeExclusion + * - #argus_cfg_pba_t::RelativeDistanceScopeInclusion + * - #argus_cfg_pba_t::RelativeDistanceScopeExclusion + * . + * * -# A distance filter is used to distinguish pixels that target * the actual object from pixels that see the brighter background, * e.g. white walls. Thus, the pixel with the minimum distance @@ -90,11 +106,31 @@ extern "C" { * determined by an relative (to the current minimum distance) * and an absolute value. The larger scope value is the * relevant one, i.e. the relative distance scope can be used - * to heed the increasing noise at larger distances. + * to heed the increasing noise at larger distances.\n + * For its configuration, see the following parameters: + * - #argus_cfg_pba_t::AbsoluteMinimumDistanceThreshold + * . + * * -# If all of the above filters fail to determine a single valid * pixel, the Golden Pixel is used as a fallback value. The * Golden Pixel is the pixel that sits right at the focus point - * of the optics at large distances. + * of the optics at large distances. Thus, it is expected to + * have the best signal at large distances.\n + * For its configuration, see the following parameters: + * - #PBA_ENABLE_GOLDPX_FALLBACK_MODE + * . + * + * -# In order to avoid unwanted effects from "out-of-focus" pixels + * in application that require a smaller focus, the Golden Pixel + * Priority Mode prioritizes a valid signal on the central + * Golden Pixel over other pixels. That is, while the Golden + * Pixel has a reasonable signal strength, it is the only pixel + * considered for the 1D result.\n + * For its configuration, see the following parameters: + * - #PBA_ENABLE_GOLDPX_FALLBACK_MODE + * - #argus_cfg_pba_t::GoldenPixelPriorityAmplitudeInclusion + * - #argus_cfg_pba_t::GoldenPixelPriorityAmplitudeExclusion + * . * . * * After filtering is done, there may be more than a single pixel @@ -113,14 +149,17 @@ extern "C" { * @brief Enable flags for the pixel binning algorithm. * * @details Determines the pixel binning algorithm feature enable status. + * * - [0]: #PBA_ENABLE: Enables the pixel binning feature. * - [1]: reserved * - [2]: reserved * - [3]: reserved - * - [4]: reserved - * - [5]: #PBA_ENABLE_GOLDPX: Enables the Golden Pixel feature. - * - [6]: #PBA_ENABLE_MIN_DIST_SCOPE: Enables the minimum distance scope - * feature. + * - [4]: #PBA_ENABLE_GOLDPX_PRIORITY_MODE: Enables the Golden Pixel + * priority mode feature. + * - [5]: #PBA_ENABLE_GOLDPX_FALLBACK_MODE: Enables the Golden Pixel + * fallback mode feature. + * - [6]: #PBA_ENABLE_MIN_DIST_SCOPE: Enables the minimum distance + * scope feature. * - [7]: reserved * . *****************************************************************************/ @@ -128,8 +167,17 @@ typedef enum argus_pba_flags_t { /*! Enables the pixel binning feature. */ PBA_ENABLE = 1U << 0U, - /*! Enables the Golden Pixel. */ - PBA_ENABLE_GOLDPX = 1U << 5U, + /*! Enables the Golden Pixel Priority Mode. + * If enabled, the Golden Pixel is prioritized over other Pixels as long + * as it has a good signal (determined by # */ + PBA_ENABLE_GOLDPX_PRIORITY_MODE = 1U << 4U, + + /*! Enables the Golden Pixel Fallback Mode. + * If enabled, the Golden Pixel is used as a last fallback pixel to obtain + * a valid signal from. This is recommended for all non-multi pixel + * devices whose TX field-of-view is aligned to target the Golden Pixel in + * factory calibration. */ + PBA_ENABLE_GOLDPX_FALLBACK_MODE = 1U << 5U, /*! Enables the minimum distance scope filter. */ PBA_ENABLE_MIN_DIST_SCOPE = 1U << 6U, @@ -168,65 +216,297 @@ typedef struct { * about the individual evaluation modes. */ argus_pba_averaging_mode_t AveragingMode; - /*! The Relative amplitude threshold value (in %) of the max. amplitude. + /*! The relative amplitude inclusion threshold (in %) of the max. amplitude. * - * Pixels with amplitude below this threshold value are dismissed. + * Pixels, whose amplitudes raise above this inclusion threshold, are + * added to the pixel binning. The amplitude must fall below the + * exclusion (#RelativeAmplitudeExclusion) threshold to be removed from + * the pixel binning again. * * All available values from the 8-bit representation are valid. * The actual percentage value is determined by 100%/256*x. * - * Use 0 to disable the relative amplitude threshold. */ - uq0_8_t RelAmplThreshold; + * Note: in addition to the relative criteria, there is also the absolute + * criteria (#AbsoluteAmplitudeInclusion, #AbsoluteAmplitudeExclusion). + * The pixels are added to the pixel binning if their respective amplitude + * is larger than the absolute AND relative inclusion values. On the other + * hand, they are removed if their amplitude falls below the absolute OR + * relative exclusion threshold. + * + * Must be greater than or equal to the #RelativeAmplitudeExclusion. + * + * Use #RelativeAmplitudeExclusion == #RelativeAmplitudeInclusion to + * disable the hysteresis behavior and use it as a threshold only. + * + * Use 0 (for both, #RelativeAmplitudeExclusion and + * #RelativeAmplitudeInclusion) to disable the relative amplitude + * hysteresis. */ + uq0_8_t RelativeAmplitudeInclusion; - /*! The relative minimum distance scope value in %. + /*! The relative amplitude exclusion threshold (in %) of the max. amplitude. * - * Pixels that have a range value within [x0, x0 + dx] are considered - * for the pixel binning, where x0 is the minimum distance of all - * amplitude picked pixels and dx is the minimum distance scope value. - * The minimum distance scope value will be the maximum of relative - * and absolute value. + * Pixels, whose amplitudes fall below this exclusion threshold, are + * removed from the pixel binning. The amplitude must raise above the + * inclusion (#RelativeAmplitudeInclusion) threshold to be added back + * to be pixel binning again. * * All available values from the 8-bit representation are valid. * The actual percentage value is determined by 100%/256*x. * - * Special values: - * - 0: Use 0 for absolute value only or to choose the pixel with the - * minimum distance only (of also the absolute value is 0)! */ - uq0_8_t RelMinDistanceScope; + * Note: in addition to the relative criteria, there is also the absolute + * criteria (#AbsoluteAmplitudeInclusion, #AbsoluteAmplitudeExclusion). + * The pixels are added to the pixel binning if their respective amplitude + * is larger than the absolute AND relative inclusion values. On the other + * hand, they are removed if their amplitude falls below the absolute OR + * relative exclusion threshold. + * + * Must be less than or equal to #RelativeAmplitudeInclusion. + * + * Use #RelativeAmplitudeExclusion == #RelativeAmplitudeInclusion to + * disable the hysteresis behavior and use it as a threshold only. + * + * Use 0 (for both, #RelativeAmplitudeExclusion and + * #RelativeAmplitudeInclusion) to disable the relative amplitude + * hysteresis. */ + uq0_8_t RelativeAmplitudeExclusion; + + /*! The absolute amplitude inclusion threshold in LSB. + * + * Pixels, whose amplitudes raise above this inclusion threshold, are + * added to the pixel binning. The amplitude must fall below the + * exclusion (#RelativeAmplitudeExclusion) threshold to be removed from + * the pixel binning again. + * + * The absolute amplitude hysteresis is only valid if the Golden Pixel + * mode is enabled. Otherwise, the thresholds are set to 0 LSB internally + * which disables the absolute criteria. + * + * All available values from the 16-bit representation are valid. + * The actual LSB value is determined by x/16. + * + * Note: in addition to the absolute criteria, there is also the relative + * criteria (#RelativeAmplitudeInclusion, #RelativeAmplitudeExclusion). + * The pixels are added to the pixel binning if their respective amplitude + * is larger than the absolute AND relative inclusion values. On the other + * hand, they are removed if their amplitude falls below the absolute OR + * relative exclusion threshold. + * + * Must be greater than or equal to #AbsoluteAmplitudeExclusion. + * + * Use #AbsoluteAmplitudeExclusion == #AbsoluteAmplitudeInclusion to + * disable the hysteresis behavior and use it as a threshold only. + * + * Use 0 (for both, #AbsoluteAmplitudeExclusion and + * #AbsoluteAmplitudeInclusion) to disable the absolute amplitude + * hysteresis. */ + uq12_4_t AbsoluteAmplitudeInclusion; + + /*! The absolute amplitude exclusion threshold in LSB. + * + * Pixels, whose amplitudes fall below this exclusion threshold, are + * removed from the pixel binning. The amplitude must raise above the + * inclusion (#RelativeAmplitudeInclusion) threshold to be added back + * to be pixel binning again. + * + * The absolute amplitude hysteresis is only valid if the Golden Pixel + * mode is enabled. Otherwise, the thresholds are set to 0 LSB internally + * which disables the absolute criteria. + * + * All available values from the 16-bit representation are valid. + * The actual LSB value is determined by x/16. + * + * Note: in addition to the absolute criteria, there is also the relative + * criteria (#RelativeAmplitudeInclusion, #RelativeAmplitudeExclusion). + * The pixels are added to the pixel binning if their respective amplitude + * is larger than the absolute AND relative inclusion values. On the other + * hand, they are removed if their amplitude falls below the absolute OR + * relative exclusion threshold. + * + * Must be less than or equal to #AbsoluteAmplitudeInclusion. + * + * Use #AbsoluteAmplitudeExclusion == #AbsoluteAmplitudeInclusion to + * disable the hysteresis behavior and use it as a threshold only. + * + * Use 0 (for both, #AbsoluteAmplitudeExclusion and + * #AbsoluteAmplitudeInclusion) to disable the absolute amplitude + * hysteresis. */ + uq12_4_t AbsoluteAmplitudeExclusion; + + /*! The Golden Pixel Priority Mode inclusion threshold in LSB. + * + * The Golden Pixel Priority Mode prioritizes a valid signal on the + * Golden Pixel over other pixel to avoid unwanted effects from + * "out-of-focus" pixels in application that require a smaller focus. + * + * If the Golden Pixel priority mode is enabled (see + * #PBA_ENABLE_GOLDPX_PRIORITY_MODE) and the Golden Pixel has a valid signal + * with amplitude higher than this inclusion threshold, its priority state + * is enabled and the binning exits early by dismissing all other pixels + * regardless of their respective amplitude or state. The Golden Pixel + * priority state is disabled if the Golden Pixel amplitude falls below + * the exclusion threshold (#GoldenPixelPriorityAmplitudeExclusion) or its + * state becomes invalid (e.g. #PIXEL_SAT). + * + * All available values from the 16-bit representation are valid. + * The actual LSB value is determined by x/16. + * + * Use 0 to disable the Golden Pixel priority mode hysteresis. */ + uq12_4_t GoldenPixelPriorityAmplitudeInclusion; - /*! The absolute amplitude threshold value in LSB. + /*! The Golden Pixel Priority Mode exclusion threshold in LSB. * - * Pixels with amplitude below this threshold value are dismissed. + * The Golden Pixel Priority Mode prioritizes a valid signal on the + * Golden Pixel over other pixel to avoid unwanted effects from + * "out-of-focus" pixels in application that require a smaller focus. * - * The absolute amplitude threshold is only valid if the Golden Pixel - * mode is enabled. Otherwise, the threshold is set to 0 LSB internally. + * If the Golden Pixel priority mode is enabled (see + * #PBA_ENABLE_GOLDPX_PRIORITY_MODE) and the Golden Pixel has a valid + * signal with amplitude higher than the exclusion threshold + * (#GoldenPixelPriorityAmplitudeInclusion), its priority state is enabled + * and the binning exits early by dismissing all other pixels regardless + * of their respective amplitude or state. The Golden Pixel priority state + * is disabled if the Golden Pixel amplitude falls below this exclusion + * threshold or its state becomes invalid (e.g. #PIXEL_SAT). * * All available values from the 16-bit representation are valid. * The actual LSB value is determined by x/16. * - * Use 0 to disable the absolute amplitude threshold. */ - uq12_4_t AbsAmplThreshold; + * Use 0 to disable the Golden Pixel priority mode hysteresis. */ + uq12_4_t GoldenPixelPriorityAmplitudeExclusion; + + /*! The relative minimum distance scope inclusion threshold (in %). + * + * Pixels, whose range is smaller than the minimum distance inclusion + * threshold (x_min + dx_incl) are added to the pixel binning. The + * range must raise above the exclusion + * (#RelativeDistanceScopeExclusion) threshold to be removed + * from the pixel binning again. The relative value is determined + * by multiplying the percentage with the minimum distance. + * + * The distance scope determines an interval within that pixels + * are considered valid, originating at the minimum distance (x_min). + * The width of the interval is specified by the relative and absolute + * minimum distance scope thresholds. The actual values it the + * maximum of both, the relative and absolute inclusion values + * (#AbsoluteDistanceScopeInclusion). + * + * All available values from the 8-bit representation are valid. + * The actual percentage value is determined by 100%/256*x. + * + * Must be smaller than or equal to the #RelativeDistanceScopeExclusion. + * + * Use #RelativeDistanceScopeExclusion == #RelativeDistanceScopeInclusion to + * disable the hysteresis behavior and use it as a threshold only. */ + uq0_8_t RelativeDistanceScopeInclusion; + + /*! The relative distance scope exclusion threshold (in %). + * + * Pixels, whose range is larger than the minimum distance exclusion + * threshold (x_min + dx_excl) are removed from the pixel binning. The + * range must fall below the inclusion + * (#RelativeDistanceScopeInclusion) threshold to be added + * to the pixel binning again. The relative value is determined + * by multiplying the percentage with the minimum distance. + * + * The distance scope determines an interval within that pixels + * are considered valid, originating at the minimum distance (x_min). + * The width of the interval is specified by the relative and absolute + * minimum distance scope thresholds. The actual values it the + * maximum of both, the relative and absolute exclusion values + * (#AbsoluteDistanceScopeExclusion). + * + * All available values from the 8-bit representation are valid. + * The actual percentage value is determined by 100%/256*x. + * + * Must be larger than or equal to the #RelativeDistanceScopeInclusion. + * + * Use #RelativeDistanceScopeExclusion == #RelativeDistanceScopeInclusion to + * disable the hysteresis behavior and use it as a threshold only. */ + uq0_8_t RelativeDistanceScopeExclusion; - /*! The absolute minimum distance scope value in m. + /*! The absolute minimum distance scope inclusion threshold (in m). * - * Pixels that have a range value within [x0, x0 + dx] are considered - * for the pixel binning, where x0 is the minimum distance of all - * amplitude picked pixels and dx is the minimum distance scope value. - * The minimum distance scope value will be the maximum of relative - * and absolute value. + * Pixels, whose range is smaller than the minimum distance inclusion + * threshold (x_min + dx_incl) are added to the pixel binning. The + * range must raise above the exclusion + * (#AbsoluteDistanceScopeExclusion) threshold to be added + * to the pixel binning again. + * + * The distance scope determines an interval within that pixels + * are considered valid, originating at the minimum distance (x_min). + * The width of the interval is specified by the relative and absolute + * minimum distance scope thresholds. The actual values it the + * maximum of both, the relative and absolute exclusion values + * (#RelativeDistanceScopeInclusion). + * + * All available values from the 16-bit representation are valid. + * The actual LSB value is determined by x/2^15. + * + * Must be smaller than or equal to the #AbsoluteDistanceScopeExclusion. + * + * Use #AbsoluteDistanceScopeExclusion == #AbsoluteDistanceScopeInclusion to + * disable the hysteresis behavior and use it as a threshold only. */ + uq1_15_t AbsoluteDistanceScopeInclusion; + + /*! The absolute minimum distance scope exclusion threshold (in m). + * + * Pixels, whose range is larger than the minimum distance exclusion + * threshold (x_min + dx_excl) are removed from the pixel binning. The + * range must fall below the inclusion + * (#AbsoluteDistanceScopeInclusion) threshold to be added + * to the pixel binning again. + * + * The distance scope determines an interval within that pixels + * are considered valid, originating at the minimum distance (x_min). + * The width of the interval is specified by the relative and absolute + * minimum distance scope thresholds. The actual values it the + * maximum of both, the relative and absolute exclusion values + * (#RelativeDistanceScopeExclusion). * * All available values from the 16-bit representation are valid. * The actual LSB value is determined by x/2^15. * - * Special values: - * - 0: Use 0 for relative value only or to choose the pixel with the - * minimum distance only (of also the relative value is 0)! */ - uq1_15_t AbsMinDistanceScope; + * Must be larger than or equal to the #AbsoluteDistanceScopeInclusion. + * + * Use #AbsoluteDistanceScopeExclusion == #AbsoluteDistanceScopeInclusion to + * disable the hysteresis behavior and use it as a threshold only. */ + uq1_15_t AbsoluteDistanceScopeExclusion; + + /*! The Golden Pixel Saturation Filter Pixel Threshold. + * + * The Golden Pixel Saturation Filter will evaluate the status of the + * Golden Pixel to #PIXEL_INVALID if a certain number of active pixels, + * i.e. pixels that are not removed by the static pre-filter mask + * (#PrefilterMask), are saturated (#PIXEL_SAT). + * + * The purpose of this filter is to avoid erroneous situations with highly + * reflective targets (e.g. retro-reflectors) that can invalidate the + * Golden Pixel such that it would not show the correct saturation state. + * In order to avoid using the Golden Pixel in that scenario, this filter + * mechanism can be used to remove the Golden Pixel if a specified number + * of other pixels show saturation state. + * + * Use 0 to disable the Golden Pixel Saturation Filter. */ + uint8_t GoldenPixelSaturationFilterPixelThreshold; + + /*! The Golden Pixel out-of-sync age limit for the GPPM. + * + * The Golden Pixel out-of-sync age is the number of consecutive frames + * where the Golden Pixel is out-of-sync. This parameters is the threshold + * to distinguish between temporary and permanent out-of-sync states. + * + * Temporary out-of-sync states happen when the target rapidly changes. In + * this case, the Golden Pixel Priority Mode (GPPM) is not exited. Only if + * the out-of-sync age exceeds the specified threshold, the Golden Pixel is + * considered erroneous and the GPPM is exited. + * + * Use 0 to disable the Golden Pixel out-of-sync aging (= infinity). */ + uint8_t GoldenPixelOutOfSyncAgeThreshold; /*! The absolute minimum distance threshold value in m. * * Pixels with distance below this threshold value are dismissed. */ - q9_22_t AbsMinDistanceThreshold; + q9_22_t AbsoluteMinimumDistanceThreshold; /*! The pre-filter pixel mask determines the pixel channels that are * statically excluded from the pixel binning (i.e. 1D distance) result. diff --git a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_px.h b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_px.h index a739cea7f367..3d4ef3d50ce4 100644 --- a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_px.h +++ b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_px.h @@ -55,6 +55,9 @@ extern "C" { * Also used as a special value to determine no object detected or infinity range. */ #define ARGUS_RANGE_MAX (Q9_22_MAX) +/*! Minimum range value in Q9.22 format. */ +#define ARGUS_RANGE_MIN (Q9_22_MIN) + /*!*************************************************************************** * @brief Status flags for the evaluated pixel structure. * diff --git a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_status.h b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_status.h index 77cd85641363..8f3fb09688f4 100644 --- a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_status.h +++ b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_status.h @@ -227,12 +227,19 @@ enum Status { /*! -114: AFBR-S50 Error: Register data integrity is lost (e.g. due to unexpected * power-on-reset cycle or invalid write cycle of SPI. System tries to - * reset the values. */ + * reset the values. + * + * @note If this error occurs after intentionally cycling the power supply + * of the device, use the #Argus_RestoreDeviceState API function to properly + * recover the current API state into the device to avoid that issue. */ ERROR_ARGUS_DATA_INTEGRITY_LOST = -114, /*! -115: AFBR-S50 Error: The range offsets calibration failed! */ ERROR_ARGUS_RANGE_OFFSET_CALIBRATION_FAILED = -115, + /*! -116: AFBR-S50 Error: The VSUB calibration failed! */ + ERROR_ARGUS_VSUB_CALIBRATION_FAILED = -116, + /*! -191: AFBR-S50 Error: The device is currently busy and cannot execute the * requested command. */ ERROR_ARGUS_BUSY = -191, diff --git a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_version.h b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_version.h index a1a2d878ac99..f58ba1bba74e 100644 --- a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_version.h +++ b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_version.h @@ -56,13 +56,13 @@ extern "C" { #define ARGUS_API_VERSION_MAJOR 1 /*! Minor version number of the AFBR-S50 API. */ -#define ARGUS_API_VERSION_MINOR 4 +#define ARGUS_API_VERSION_MINOR 5 /*! Bugfix version number of the AFBR-S50 API. */ -#define ARGUS_API_VERSION_BUGFIX 4 +#define ARGUS_API_VERSION_BUGFIX 6 /*! Build version number of the AFBR-S50 API. */ -#define ARGUS_API_VERSION_BUILD "20230327150535" +#define ARGUS_API_VERSION_BUILD "20240208081753" /*****************************************************************************/ diff --git a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_xtalk.h b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_xtalk.h index 6f3d40b49a42..284538a52bc9 100644 --- a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_xtalk.h +++ b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/api/argus_xtalk.h @@ -72,30 +72,28 @@ typedef struct xtalk_t { * @details Contains crosstalk vector values for all 32 active pixels, * separated for A/B-Frames. *****************************************************************************/ -typedef struct argus_cal_xtalk_table_t { - union { - struct { - /*! The crosstalk vector table for A-Frames. */ - xtalk_t FrameA[ARGUS_PIXELS_X][ARGUS_PIXELS_Y]; - - /*! The crosstalk vector table for B-Frames. */ - xtalk_t FrameB[ARGUS_PIXELS_X][ARGUS_PIXELS_Y]; - }; - - /*! The crosstalk vector table for A/B-Frames of all 32 pixels.*/ - xtalk_t Table[ARGUS_DFM_FRAME_COUNT][ARGUS_PIXELS_X][ARGUS_PIXELS_Y]; +typedef union argus_cal_xtalk_table_t { + struct { + /*! The crosstalk vector table for A-Frames. */ + xtalk_t FrameA[ARGUS_PIXELS_X][ARGUS_PIXELS_Y]; + + /*! The crosstalk vector table for B-Frames. */ + xtalk_t FrameB[ARGUS_PIXELS_X][ARGUS_PIXELS_Y]; }; + /*! The crosstalk vector table for A/B-Frames of all 32 pixels.*/ + xtalk_t Table[ARGUS_DFM_FRAME_COUNT][ARGUS_PIXELS_X][ARGUS_PIXELS_Y]; + } argus_cal_xtalk_table_t; /*!*************************************************************************** - * @brief Pixel-To-Pixel Crosstalk Compensation Parameters. - * @details Contains calibration data that belongs to the pixel-to-pixel - * crosstalk compensation feature. + * @brief Electrical Pixel-To-Pixel Crosstalk Compensation Parameters. + * @details Contains calibration data that belongs to the electrical + * pixel-to-pixel crosstalk compensation feature. *****************************************************************************/ -typedef struct argus_cal_p2pxtalk_t { - /*! Pixel-To-Pixel Compensation on/off. */ +typedef struct argus_cal_electrical_p2pxtalk_t { + /*! Electrical Pixel-To-Pixel Compensation on/off. */ bool Enabled; /*! The relative threshold determines when the compensation is active for @@ -134,8 +132,39 @@ typedef struct argus_cal_p2pxtalk_t { * Higher values determine more influence on the reference pixel signal. */ q3_12_t KcFactorCRefPx; -} argus_cal_p2pxtalk_t; +} argus_cal_electrical_p2pxtalk_t; + +/*!*************************************************************************** + * @brief Optical Pixel-To-Pixel Crosstalk Compensation Parameters. + * @details Contains calibration data that belongs to the optical + * pixel-to-pixel crosstalk compensation feature. + *****************************************************************************/ +typedef struct argus_cal_optical_p2pxtalk_t { + /*! Optical Pixel-To-Pixel Compensation on/off. */ + bool Enabled; + + /*! The sine component of the coupling coefficient that determines the amount + * of a neighbour pixel signal that influences the raw signal of certain pixel. + * Higher values determine more influence on the individual pixel signal. */ + q3_12_t CouplingCoeffS; + + /*! The cosine component of the coupling coefficient that determines the amount + * of a neighbour pixel signal that influences the raw signal of a certain pixel. + * Higher values determine more influence on the individual pixel signal. */ + q3_12_t CouplingCoeffC; + +} argus_cal_optical_p2pxtalk_t; + +/*!*************************************************************************** + * @brief Pixel-To-Pixel Crosstalk Compensation Parameters. + * @details Contains combined calibration data for electrical and + * optical pixel-to-pixel crosstalk compensation feature. + *****************************************************************************/ +typedef struct argus_cal_p2pxtalk_t { + argus_cal_electrical_p2pxtalk_t Electrical; + argus_cal_optical_p2pxtalk_t Optical; +} argus_cal_p2pxtalk_t; /*! @} */ #ifdef __cplusplus diff --git a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/utility/fp_div.h b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/utility/fp_div.h index 60b75a164a3e..09c6fdfdc3d7 100644 --- a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/utility/fp_div.h +++ b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/utility/fp_div.h @@ -61,7 +61,7 @@ extern "C" { * @details Algorithm to evaluate a/b, where b is in Q15.16 format, on a 32-bit * architecture with maximum precision. * The result is correctly rounded and given as the input format. - * Division by 0 yields max. values determined by signa of numerator. + * Division by 0 yields max. values determined by signs of numerator. * Too high/low results are truncated to max/min values. * * Depending on the architecture, the division is implemented with a 64-bit @@ -89,14 +89,14 @@ inline int32_t fp_div16(int32_t a, q15_16_t b) if (c > 0x80000000U) { return INT32_MIN; } - return -c; + return (int32_t) - c; } else { c = ((c / b) + (1 << 13U)) >> 14U; if (c > (int64_t)INT32_MAX) { return INT32_MAX; } - return c; + return (int32_t)c; } #else @@ -159,10 +159,16 @@ inline int32_t fp_div16(int32_t a, q15_16_t b) /* Figure out the sign of result */ if ((uint32_t)(a ^ b) & 0x80000000U) { - result = -result; + return (int32_t) - result; + + } else { + // fix 05.10.2023; the corner case, when result == INT32_MAX + 1: + // Catch the wraparound (to INT32_MIN) and truncate instead. + if (quotient > INT32_MAX) { return INT32_MAX; } + + return (int32_t)result; } - return (int32_t)result; #endif } diff --git a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/utility/fp_mul.h b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/utility/fp_mul.h index 78db5826445a..e0996d6d78a5 100644 --- a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/utility/fp_mul.h +++ b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/utility/fp_mul.h @@ -118,7 +118,7 @@ inline uint32_t fp_mulu(uint32_t u, uint32_t v, uint_fast8_t shift) assert(shift <= 32); #if USE_64BIT_MUL const uint64_t w = (uint64_t)u * (uint64_t)v; - return (w >> shift) + ((w >> (shift - 1)) & 1U); + return (uint32_t)((w >> shift) + ((w >> (shift - 1)) & 1U)); #else uint32_t tmp[2] = { 0 }; muldwu(tmp, u, v); @@ -158,15 +158,15 @@ inline int32_t fp_muls(int32_t u, int32_t v, uint_fast8_t shift) uint32_t u2, v2; - if (u < 0) { u2 = -u; sign = -sign; } else { u2 = u; } + if (u < 0) { u2 = (uint32_t) - u; sign = -sign; } else { u2 = (uint32_t)u; } - if (v < 0) { v2 = -v; sign = -sign; } else { v2 = v; } + if (v < 0) { v2 = (uint32_t) - v; sign = -sign; } else { v2 = (uint32_t)v; } const uint32_t res = fp_mulu(u2, v2, shift); assert(sign > 0 ? res <= 0x7FFFFFFFU : res <= 0x80000000U); - return sign > 0 ? res : -res; + return sign > 0 ? (int32_t)res : -(int32_t)res; } @@ -225,7 +225,9 @@ inline uint32_t fp_mul_u32_u16(uint32_t u, uint16_t v, uint_fast8_t shift) *****************************************************************************/ inline int32_t fp_mul_s32_u16(int32_t u, uint16_t v, uint_fast8_t shift) { - return u >= 0 ? fp_mul_u32_u16(u, v, shift) : - fp_mul_u32_u16(-u, v, shift); + return u >= 0 ? + (int32_t)fp_mul_u32_u16((uint32_t)u, v, shift) : + -(int32_t)fp_mul_u32_u16((uint32_t) - u, v, shift); } /*! @} */ diff --git a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/utility/fp_rnd.h b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/utility/fp_rnd.h index ad6f71e09cc6..056f2e027df2 100644 --- a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/utility/fp_rnd.h +++ b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/utility/fp_rnd.h @@ -80,7 +80,7 @@ inline uint32_t fp_rndu(uint32_t Q, uint_fast8_t n) *****************************************************************************/ inline int32_t fp_rnds(int32_t Q, uint_fast8_t n) { - return (Q < 0) ? -fp_rndu(-Q, n) : fp_rndu(Q, n); + return (Q < 0) ? -(int32_t)fp_rndu((uint32_t)(-Q), n) : (int32_t)fp_rndu((uint32_t)Q, n); } /*!*************************************************************************** @@ -108,7 +108,7 @@ inline uint32_t fp_truncu(uint32_t Q, uint_fast8_t n) *****************************************************************************/ inline int32_t fp_truncs(int32_t Q, uint_fast8_t n) { - return (Q < 0) ? -fp_truncu(-Q, n) : fp_truncu(Q, n); + return (Q < 0) ? -(int32_t)fp_truncu((uint32_t)(-Q), n) : (int32_t)fp_truncu((uint32_t)Q, n); } /*! @} */ diff --git a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/utility/int_math.h b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/utility/int_math.h index 27de8cc68897..b9b200414663 100644 --- a/src/drivers/distance_sensor/broadcom/afbrs50/Inc/utility/int_math.h +++ b/src/drivers/distance_sensor/broadcom/afbrs50/Inc/utility/int_math.h @@ -66,7 +66,7 @@ inline uint32_t log2i(uint32_t x) { assert(x != 0); #if 1 - return 31 - __builtin_clz(x); + return (uint32_t)(31 - __builtin_clz(x)); #else #define S(k) if (x >= (1 << k)) { i += k; x >>= k; } int i = 0; S(16); S(8); S(4); S(2); S(1); return i; diff --git a/src/drivers/distance_sensor/broadcom/afbrs50/Lib/libafbrs50_m4_fpu.a b/src/drivers/distance_sensor/broadcom/afbrs50/Lib/libafbrs50_m4_fpu.a index e4e6dc0c52cd..1cd0fe27e0df 100644 Binary files a/src/drivers/distance_sensor/broadcom/afbrs50/Lib/libafbrs50_m4_fpu.a and b/src/drivers/distance_sensor/broadcom/afbrs50/Lib/libafbrs50_m4_fpu.a differ diff --git a/src/drivers/distance_sensor/broadcom/afbrs50/Lib/libafbrs50_m4_fpu_os.a b/src/drivers/distance_sensor/broadcom/afbrs50/Lib/libafbrs50_m4_fpu_os.a index 23bcd6fbea11..a6e7c581d6d4 100644 Binary files a/src/drivers/distance_sensor/broadcom/afbrs50/Lib/libafbrs50_m4_fpu_os.a and b/src/drivers/distance_sensor/broadcom/afbrs50/Lib/libafbrs50_m4_fpu_os.a differ diff --git a/src/drivers/drv_hrt.h b/src/drivers/drv_hrt.h index 3e295abfc949..bb62da0189c3 100644 --- a/src/drivers/drv_hrt.h +++ b/src/drivers/drv_hrt.h @@ -162,7 +162,16 @@ static inline void abstime_to_ts(struct timespec *ts, hrt_abstime abstime) */ static inline hrt_abstime hrt_elapsed_time(const hrt_abstime *then) { - return hrt_absolute_time() - *then; + hrt_abstime now = hrt_absolute_time(); + + // Cannot allow a negative elapsed time as this would appear + // to be a huge positive elapsed time when represented as an + // unsigned value! + if (*then > now) { + return 0; + } + + return now - *then; } /** diff --git a/src/drivers/drv_orb_dev.h b/src/drivers/drv_orb_dev.h index 042dbe2097e1..42f361d43968 100644 --- a/src/drivers/drv_orb_dev.h +++ b/src/drivers/drv_orb_dev.h @@ -64,13 +64,10 @@ /** Get the priority for the topic */ #define ORBIOCGPRIORITY _ORBIOC(14) -/** Set the queue size of the topic */ -#define ORBIOCSETQUEUESIZE _ORBIOC(15) - /** Get the minimum interval at which the topic can be seen to be updated for this subscription */ -#define ORBIOCGETINTERVAL _ORBIOC(16) +#define ORBIOCGETINTERVAL _ORBIOC(15) /** Check whether the topic is advertised, sets *(unsigned long *)arg to 1 if advertised, 0 otherwise */ -#define ORBIOCISADVERTISED _ORBIOC(17) +#define ORBIOCISADVERTISED _ORBIOC(16) #endif /* _DRV_UORB_H */ diff --git a/src/drivers/gps/gps.cpp b/src/drivers/gps/gps.cpp index 4ed29a8c6e35..766be323d719 100644 --- a/src/drivers/gps/gps.cpp +++ b/src/drivers/gps/gps.cpp @@ -45,7 +45,6 @@ #include #endif -#include #include #include @@ -57,6 +56,8 @@ #include #include #include +#include +#include #include #include #include @@ -81,6 +82,7 @@ #include #endif /* __PX4_LINUX */ +using namespace device; using namespace time_literals; #define TIMEOUT_1HZ 1300 //!< Timeout time in mS, 1000 mS (1Hz) + 300 mS delta for error @@ -169,7 +171,10 @@ class GPS : public ModuleBase, public device::Device void reset_if_scheduled(); private: - int _serial_fd{-1}; ///< serial interface to GPS +#ifdef __PX4_LINUX + int _spi_fd {-1}; ///< SPI interface to GPS +#endif + Serial *_uart = nullptr; ///< UART interface to GPS unsigned _baudrate{0}; ///< current baudrate const unsigned _configured_baudrate{0}; ///< configured baudrate (0=auto-detect) char _port[20] {}; ///< device / serial port path @@ -329,8 +334,11 @@ GPS::GPS(const char *path, gps_driver_mode_t mode, GPSHelper::Interface interfac char c = _port[strlen(_port) - 1]; // last digit of path (eg /dev/ttyS2) set_device_bus(c - 48); // sub 48 to convert char to integer +#ifdef __PX4_LINUX + } else if (_interface == GPSHelper::Interface::SPI) { set_device_bus_type(device::Device::DeviceBusType::DeviceBusType_SPI); +#endif } if (_mode == gps_driver_mode_t::None) { @@ -403,10 +411,23 @@ int GPS::callback(GPSCallbackType type, void *data1, int data2, void *user) return num_read; } - case GPSCallbackType::writeDeviceData: - gps->dumpGpsData((uint8_t *)data1, (size_t)data2, gps_dump_comm_mode_t::Full, true); + case GPSCallbackType::writeDeviceData: { + gps->dumpGpsData((uint8_t *)data1, (size_t)data2, gps_dump_comm_mode_t::Full, true); + + int ret = 0; + + if (gps->_uart) { + ret = gps->_uart->write((void *) data1, (size_t) data2); + +#ifdef __PX4_LINUX + + } else if (gps->_spi_fd >= 0) { + ret = ::write(gps->_spi_fd, data1, (size_t)data2); +#endif + } - return ::write(gps->_serial_fd, data1, (size_t)data2); + return ret; + } case GPSCallbackType::setBaudrate: return gps->setBaudrate(data2); @@ -449,72 +470,64 @@ int GPS::callback(GPSCallbackType type, void *data1, int data2, void *user) int GPS::pollOrRead(uint8_t *buf, size_t buf_length, int timeout) { + int ret = 0; + const unsigned character_count = 32; // minimum bytes that we want to read + const int max_timeout = 50; + int timeout_adjusted = math::min(max_timeout, timeout); + handleInjectDataTopic(); -#if !defined(__PX4_QURT) + if ((_interface == GPSHelper::Interface::UART) && (_uart)) { + ret = _uart->readAtLeast(buf, buf_length, character_count, timeout_adjusted); - /* For non QURT, use the usual polling. */ +// SPI is only supported on LInux +#if defined(__PX4_LINUX) - //Poll only for the serial data. In the same thread we also need to handle orb messages, - //so ideally we would poll on both, the serial fd and orb subscription. Unfortunately the - //two pollings use different underlying mechanisms (at least under posix), which makes this - //impossible. Instead we limit the maximum polling interval and regularly check for new orb - //messages. - //FIXME: add a unified poll() API - const int max_timeout = 50; + } else if ((_interface == GPSHelper::Interface::SPI) && (_spi_fd >= 0)) { - pollfd fds[1]; - fds[0].fd = _serial_fd; - fds[0].events = POLLIN; - - int ret = poll(fds, sizeof(fds) / sizeof(fds[0]), math::min(max_timeout, timeout)); - - if (ret > 0) { - /* if we have new data from GPS, go handle it */ - if (fds[0].revents & POLLIN) { - /* - * We are here because poll says there is some data, so this - * won't block even on a blocking device. But don't read immediately - * by 1-2 bytes, wait for some more data to save expensive read() calls. - * If we have all requested data available, read it without waiting. - * If more bytes are available, we'll go back to poll() again. - */ - const unsigned character_count = 32; // minimum bytes that we want to read - unsigned baudrate = _baudrate == 0 ? 115200 : _baudrate; - const unsigned sleeptime = character_count * 1000000 / (baudrate / 10); + //Poll only for the SPI data. In the same thread we also need to handle orb messages, + //so ideally we would poll on both, the SPI fd and orb subscription. Unfortunately the + //two pollings use different underlying mechanisms (at least under posix), which makes this + //impossible. Instead we limit the maximum polling interval and regularly check for new orb + //messages. + //FIXME: add a unified poll() API -#ifdef __PX4_NUTTX - int err = 0; - int bytes_available = 0; - err = ::ioctl(_serial_fd, FIONREAD, (unsigned long)&bytes_available); + pollfd fds[1]; + fds[0].fd = _spi_fd; + fds[0].events = POLLIN; + + ret = poll(fds, sizeof(fds) / sizeof(fds[0]), timeout_adjusted); + + if (ret > 0) { + /* if we have new data from GPS, go handle it */ + if (fds[0].revents & POLLIN) { + /* + * We are here because poll says there is some data, so this + * won't block even on a blocking device. But don't read immediately + * by 1-2 bytes, wait for some more data to save expensive read() calls. + * If we have all requested data available, read it without waiting. + * If more bytes are available, we'll go back to poll() again. + */ + unsigned baudrate = _baudrate == 0 ? 115200 : _baudrate; + const unsigned sleeptime = character_count * 1000000 / (baudrate / 10); - if (err != 0 || bytes_available < (int)character_count) { px4_usleep(sleeptime); - } -#else - px4_usleep(sleeptime); -#endif + ret = ::read(_spi_fd, buf, buf_length); - ret = ::read(_serial_fd, buf, buf_length); + if (ret > 0) { + _num_bytes_read += ret; + } - if (ret > 0) { - _num_bytes_read += ret; + } else { + ret = -1; } - - } else { - ret = -1; } + +#endif } return ret; - -#else - /* For QURT, just use read for now, since this doesn't block, we need to slow it down - * just a bit. */ - px4_usleep(10000); - return ::read(_serial_fd, buf, buf_length); -#endif } void GPS::handleInjectDataTopic() @@ -583,105 +596,38 @@ bool GPS::injectData(uint8_t *data, size_t len) { dumpGpsData(data, len, gps_dump_comm_mode_t::Full, true); - size_t written = ::write(_serial_fd, data, len); - ::fsync(_serial_fd); - return written == len; -} - -int GPS::setBaudrate(unsigned baud) -{ - /* process baud rate */ - int speed; - - switch (baud) { - case 9600: speed = B9600; break; - - case 19200: speed = B19200; break; - - case 38400: speed = B38400; break; - - case 57600: speed = B57600; break; - - case 115200: speed = B115200; break; - - case 230400: speed = B230400; break; + size_t written = 0; -#ifndef B460800 -#define B460800 460800 -#endif + if ((_interface == GPSHelper::Interface::UART) && (_uart)) { + written = _uart->write((const void *) data, len); - case 460800: speed = B460800; break; +#ifdef __PX4_LINUX -#ifndef B921600 -#define B921600 921600 + } else if (_interface == GPSHelper::Interface::SPI) { + written = ::write(_spi_fd, data, len); + ::fsync(_spi_fd); #endif - - case 921600: speed = B921600; break; - - default: - PX4_ERR("ERR: unknown baudrate: %d", baud); - return -EINVAL; } - struct termios uart_config; - - int termios_state; - - /* fill the struct for the new configuration */ - tcgetattr(_serial_fd, &uart_config); - - /* properly configure the terminal (see also https://en.wikibooks.org/wiki/Serial_Programming/termios ) */ - - // - // Input flags - Turn off input processing - // - // convert break to null byte, no CR to NL translation, - // no NL to CR translation, don't mark parity errors or breaks - // no input parity check, don't strip high bit off, - // no XON/XOFF software flow control - // - uart_config.c_iflag &= ~(IGNBRK | BRKINT | ICRNL | - INLCR | PARMRK | INPCK | ISTRIP | IXON); - // - // Output flags - Turn off output processing - // - // no CR to NL translation, no NL to CR-NL translation, - // no NL to CR translation, no column 0 CR suppression, - // no Ctrl-D suppression, no fill characters, no case mapping, - // no local output processing - // - // config.c_oflag &= ~(OCRNL | ONLCR | ONLRET | - // ONOCR | ONOEOT| OFILL | OLCUC | OPOST); - uart_config.c_oflag = 0; - - // - // No line processing - // - // echo off, echo newline off, canonical mode off, - // extended input processing off, signal chars off - // - uart_config.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN | ISIG); - - /* no parity, one stop bit, disable flow control */ - uart_config.c_cflag &= ~(CSTOPB | PARENB | CRTSCTS); - - /* set baud rate */ - if ((termios_state = cfsetispeed(&uart_config, speed)) < 0) { - GPS_ERR("ERR: %d (cfsetispeed)", termios_state); - return -1; - } + return written == len; +} - if ((termios_state = cfsetospeed(&uart_config, speed)) < 0) { - GPS_ERR("ERR: %d (cfsetospeed)", termios_state); - return -1; - } +int GPS::setBaudrate(unsigned baud) +{ + if (_interface == GPSHelper::Interface::UART) { + if ((_uart) && (_uart->setBaudrate(baud))) { + return 0; + } + +#ifdef __PX4_LINUX - if ((termios_state = tcsetattr(_serial_fd, TCSANOW, &uart_config)) < 0) { - GPS_ERR("ERR: %d (tcsetattr)", termios_state); - return -1; + } else if (_interface == GPSHelper::Interface::SPI) { + // Can't set the baudrate on a SPI port but just return a success + return 0; +#endif } - return 0; + return -1; } void GPS::initializeCommunicationDump() @@ -840,31 +786,58 @@ GPS::run() _helper = nullptr; } - if (_serial_fd < 0) { - /* open the serial port */ - _serial_fd = ::open(_port, O_RDWR | O_NOCTTY); + if ((_interface == GPSHelper::Interface::UART) && (_uart == nullptr)) { + + // Create the UART port instance + _uart = new Serial(_port); + + if (_uart == nullptr) { + PX4_ERR("Error creating serial device %s", _port); + px4_sleep(1); + continue; + } + } + + if ((_interface == GPSHelper::Interface::UART) && (! _uart->isOpen())) { + // Configure the desired baudrate if one was specified by the user. + // Otherwise the default baudrate will be used. + if (_configured_baudrate) { + if (! _uart->setBaudrate(_configured_baudrate)) { + PX4_ERR("Error setting baudrate to %u on %s", _configured_baudrate, _port); + px4_sleep(1); + continue; + } + } - if (_serial_fd < 0) { - PX4_ERR("failed to open %s err: %d", _port, errno); + // Open the UART. If this is successful then the UART is ready to use. + if (! _uart->open()) { + PX4_ERR("Error opening serial device %s", _port); px4_sleep(1); continue; } #ifdef __PX4_LINUX - if (_interface == GPSHelper::Interface::SPI) { - int spi_speed = 1000000; // make sure the bus speed is not too high (required on RPi) - int status_value = ::ioctl(_serial_fd, SPI_IOC_WR_MAX_SPEED_HZ, &spi_speed); + } else if ((_interface == GPSHelper::Interface::SPI) && (_spi_fd < 0)) { + _spi_fd = ::open(_port, O_RDWR | O_NOCTTY); - if (status_value < 0) { - PX4_ERR("SPI_IOC_WR_MAX_SPEED_HZ failed for %s (%d)", _port, errno); - } + if (_spi_fd < 0) { + PX4_ERR("failed to open SPI port %s err: %d", _port, errno); + px4_sleep(1); + continue; + } - status_value = ::ioctl(_serial_fd, SPI_IOC_RD_MAX_SPEED_HZ, &spi_speed); + int spi_speed = 1000000; // make sure the bus speed is not too high (required on RPi) + int status_value = ::ioctl(_spi_fd, SPI_IOC_WR_MAX_SPEED_HZ, &spi_speed); - if (status_value < 0) { - PX4_ERR("SPI_IOC_RD_MAX_SPEED_HZ failed for %s (%d)", _port, errno); - } + if (status_value < 0) { + PX4_ERR("SPI_IOC_WR_MAX_SPEED_HZ failed for %s (%d)", _port, errno); + } + + status_value = ::ioctl(_spi_fd, SPI_IOC_RD_MAX_SPEED_HZ, &spi_speed); + + if (status_value < 0) { + PX4_ERR("SPI_IOC_RD_MAX_SPEED_HZ failed for %s (%d)", _port, errno); } #endif /* __PX4_LINUX */ @@ -1056,9 +1029,17 @@ GPS::run() } } - if (_serial_fd >= 0) { - ::close(_serial_fd); - _serial_fd = -1; + if ((_interface == GPSHelper::Interface::UART) && (_uart)) { + (void) _uart->close(); + delete _uart; + _uart = nullptr; + +#ifdef __PX4_LINUX + + } else if ((_interface == GPSHelper::Interface::SPI) && (_spi_fd >= 0)) { + ::close(_spi_fd); + _spi_fd = -1; +#endif } if (_mode_auto) { @@ -1406,7 +1387,7 @@ int GPS::task_spawn(int argc, char *argv[], Instance instance) entry_point, (char *const *)argv); if (task_id < 0) { - task_id = -1; + _task_id = -1; return -errno; } @@ -1477,12 +1458,12 @@ GPS *GPS::instantiate(int argc, char *argv[], Instance instance) break; case 'i': - if (!strcmp(myoptarg, "spi")) { - interface = GPSHelper::Interface::SPI; - - } else if (!strcmp(myoptarg, "uart")) { + if (!strcmp(myoptarg, "uart")) { interface = GPSHelper::Interface::UART; - +#ifdef __PX4_LINUX + } else if (!strcmp(myoptarg, "spi")) { + interface = GPSHelper::Interface::SPI; +#endif } else { PX4_ERR("unknown interface: %s", myoptarg); error_flag = true; @@ -1490,12 +1471,12 @@ GPS *GPS::instantiate(int argc, char *argv[], Instance instance) break; case 'j': - if (!strcmp(myoptarg, "spi")) { - interface_secondary = GPSHelper::Interface::SPI; - - } else if (!strcmp(myoptarg, "uart")) { + if (!strcmp(myoptarg, "uart")) { interface_secondary = GPSHelper::Interface::UART; - +#ifdef __PX4_LINUX + } else if (!strcmp(myoptarg, "spi")) { + interface_secondary = GPSHelper::Interface::SPI; +#endif } else { PX4_ERR("unknown interface for secondary: %s", myoptarg); error_flag = true; diff --git a/src/drivers/imu/invensense/icm42688p/ICM42688P.hpp b/src/drivers/imu/invensense/icm42688p/ICM42688P.hpp index f8c938a5cdc3..a2fc22a9f2e0 100644 --- a/src/drivers/imu/invensense/icm42688p/ICM42688P.hpp +++ b/src/drivers/imu/invensense/icm42688p/ICM42688P.hpp @@ -88,7 +88,7 @@ class ICM42688P : public device::SPI, public I2CSPIDriver FIFO::DATA f[FIFO_MAX_SAMPLES] {}; }; // ensure no struct padding - static_assert(sizeof(FIFOTransferBuffer) == (4 + FIFO_MAX_SAMPLES *sizeof(FIFO::DATA))); + static_assert(sizeof(FIFOTransferBuffer) == (4 + FIFO_MAX_SAMPLES *sizeof(FIFO::DATA)), "Invalid transfer buffer size"); struct register_bank0_config_t { Register::BANK_0 reg; diff --git a/src/drivers/px4io/px4io.cpp b/src/drivers/px4io/px4io.cpp index bd6b5d1f3192..e98a9c837d55 100644 --- a/src/drivers/px4io/px4io.cpp +++ b/src/drivers/px4io/px4io.cpp @@ -364,6 +364,13 @@ PX4IO::~PX4IO() bool PX4IO::updateOutputs(bool stop_motors, uint16_t outputs[MAX_ACTUATORS], unsigned num_outputs, unsigned num_control_groups_updated) { + for (size_t i = 0; i < num_outputs; i++) { + if (!_mixing_output.isFunctionSet(i)) { + // do not run any signal on disabled channels + outputs[i] = 0; + } + } + if (!_test_fmu_fail) { /* output to the servos */ io_reg_set(PX4IO_PAGE_DIRECT_PWM, 0, outputs, num_outputs); diff --git a/src/drivers/tone_alarm/ToneAlarm.cpp b/src/drivers/tone_alarm/ToneAlarm.cpp index 5893f9018f7e..256f218b76f8 100644 --- a/src/drivers/tone_alarm/ToneAlarm.cpp +++ b/src/drivers/tone_alarm/ToneAlarm.cpp @@ -45,8 +45,6 @@ using namespace time_literals; ToneAlarm::ToneAlarm() : ScheduledWorkItem(MODULE_NAME, px4::wq_configurations::hp_default) { - // ensure ORB_ID(tune_control) is advertised with correct queue depth - orb_advertise_queue(ORB_ID(tune_control), nullptr, tune_control_s::ORB_QUEUE_LENGTH); } ToneAlarm::~ToneAlarm() diff --git a/src/drivers/uavcan/CMakeLists.txt b/src/drivers/uavcan/CMakeLists.txt index 4146edab05b8..39a9bb3ff2ff 100644 --- a/src/drivers/uavcan/CMakeLists.txt +++ b/src/drivers/uavcan/CMakeLists.txt @@ -75,6 +75,7 @@ add_definitions( -DUAVCAN_${UAVCAN_DRIVER_UPPER}_${OS_UPPER}=1 -DUAVCAN_${UAVCAN_DRIVER_UPPER}_NUM_IFACES=${config_uavcan_num_ifaces} -DUAVCAN_${UAVCAN_DRIVER_UPPER}_TIMER_NUMBER=${UAVCAN_TIMER} + -DUAVCAN_NUM_IFACES=${config_uavcan_num_ifaces} -DUAVCAN_CPP_VERSION=UAVCAN_CPP03 -DUAVCAN_DRIVER=uavcan_${UAVCAN_DRIVER} -DUAVCAN_IMPLEMENT_PLACEMENT_NEW=1 diff --git a/src/drivers/uavcan/uavcan_main.cpp b/src/drivers/uavcan/uavcan_main.cpp index 277b2526ddd4..fbdc534a9c30 100644 --- a/src/drivers/uavcan/uavcan_main.cpp +++ b/src/drivers/uavcan/uavcan_main.cpp @@ -744,6 +744,41 @@ UavcanNode::Run() _node.spinOnce(); // expected to be non-blocking + // Publish status + constexpr hrt_abstime status_pub_interval = 100_ms; + + if (hrt_absolute_time() - _last_can_status_pub >= status_pub_interval) { + _last_can_status_pub = hrt_absolute_time(); + + for (int i = 0; i < _node.getDispatcher().getCanIOManager().getCanDriver().getNumIfaces(); i++) { + if (i > UAVCAN_NUM_IFACES) { + break; + } + + auto iface = _node.getDispatcher().getCanIOManager().getCanDriver().getIface(i); + + if (!iface) { + continue; + } + + auto iface_perf_cnt = _node.getDispatcher().getCanIOManager().getIfacePerfCounters(i); + can_interface_status_s status{ + .timestamp = hrt_absolute_time(), + .io_errors = iface_perf_cnt.errors, + .frames_tx = iface_perf_cnt.frames_tx, + .frames_rx = iface_perf_cnt.frames_rx, + .interface = static_cast(i), + }; + + if (_can_status_pub_handles[i] == nullptr) { + int instance{0}; + _can_status_pub_handles[i] = orb_advertise_multi(ORB_ID(can_interface_status), nullptr, &instance); + } + + (void)orb_publish(ORB_ID(can_interface_status), _can_status_pub_handles[i], &status); + } + } + // check for parameter updates if (_parameter_update_sub.updated()) { // clear update diff --git a/src/drivers/uavcan/uavcan_main.hpp b/src/drivers/uavcan/uavcan_main.hpp index 54119259ef16..5afa04ef672e 100644 --- a/src/drivers/uavcan/uavcan_main.hpp +++ b/src/drivers/uavcan/uavcan_main.hpp @@ -96,6 +96,7 @@ #include #include #include +#include #include #include #include @@ -309,6 +310,10 @@ class UavcanNode : public px4::ScheduledWorkItem, public ModuleParams uORB::Publication _param_response_pub{ORB_ID(uavcan_parameter_value)}; uORB::Publication _command_ack_pub{ORB_ID(vehicle_command_ack)}; + uORB::PublicationMulti _can_status_pub{ORB_ID(can_interface_status)}; + + hrt_abstime _last_can_status_pub{0}; + orb_advert_t _can_status_pub_handles[UAVCAN_NUM_IFACES] = {nullptr}; /* * The MAVLink parameter bridge needs to know the maximum parameter index diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 1d88b3b02256..4e20ce106ba8 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -67,6 +67,7 @@ add_subdirectory(pid_design EXCLUDE_FROM_ALL) add_subdirectory(rate_control EXCLUDE_FROM_ALL) add_subdirectory(rc EXCLUDE_FROM_ALL) add_subdirectory(ringbuffer EXCLUDE_FROM_ALL) +add_subdirectory(rtl EXCLUDE_FROM_ALL) add_subdirectory(sensor_calibration EXCLUDE_FROM_ALL) add_subdirectory(slew_rate EXCLUDE_FROM_ALL) add_subdirectory(systemlib EXCLUDE_FROM_ALL) diff --git a/src/lib/Kconfig b/src/lib/Kconfig new file mode 100644 index 000000000000..6353836988b2 --- /dev/null +++ b/src/lib/Kconfig @@ -0,0 +1 @@ +rsource "*/Kconfig" diff --git a/src/lib/adsb/AdsbConflict.h b/src/lib/adsb/AdsbConflict.h index 84ed38287dbb..b00d04f4dbd3 100644 --- a/src/lib/adsb/AdsbConflict.h +++ b/src/lib/adsb/AdsbConflict.h @@ -151,7 +151,7 @@ class AdsbConflict transponder_report_s tr{}; - orb_advert_t fake_traffic_report_publisher = orb_advertise_queue(ORB_ID(transponder_report), &tr, (unsigned int)20); + orb_advert_t fake_traffic_report_publisher = orb_advertise(ORB_ID(transponder_report), &tr); TRAFFIC_STATE _traffic_state_previous{TRAFFIC_STATE::NO_CONFLICT}; diff --git a/src/lib/dataman_client/DatamanClient.cpp b/src/lib/dataman_client/DatamanClient.cpp index a6b37defa931..c2c0ec995fcd 100644 --- a/src/lib/dataman_client/DatamanClient.cpp +++ b/src/lib/dataman_client/DatamanClient.cpp @@ -39,6 +39,8 @@ DatamanClient::DatamanClient() { + _sync_perf = perf_alloc(PC_ELAPSED, "DatamanClient: sync"); + _dataman_request_pub.advertise(); _dataman_response_sub = orb_subscribe(ORB_ID(dataman_response)); @@ -74,6 +76,8 @@ DatamanClient::DatamanClient() DatamanClient::~DatamanClient() { + perf_free(_sync_perf); + if (_dataman_response_sub >= 0) { orb_unsubscribe(_dataman_response_sub); } @@ -85,6 +89,7 @@ bool DatamanClient::syncHandler(const dataman_request_s &request, dataman_respon bool response_received = false; int32_t ret = 0; hrt_abstime time_elapsed = hrt_elapsed_time(&start_time); + perf_begin(_sync_perf); _dataman_request_pub.publish(request); while (!response_received && (time_elapsed < timeout)) { @@ -132,6 +137,8 @@ bool DatamanClient::syncHandler(const dataman_request_s &request, dataman_respon time_elapsed = hrt_elapsed_time(&start_time); } + perf_end(_sync_perf); + if (!response_received && ret >= 0) { PX4_ERR("timeout after %" PRIu32 " ms!", static_cast(timeout / 1000)); } diff --git a/src/lib/dataman_client/DatamanClient.hpp b/src/lib/dataman_client/DatamanClient.hpp index 636b41d142af..9d1b71fd2cc4 100644 --- a/src/lib/dataman_client/DatamanClient.hpp +++ b/src/lib/dataman_client/DatamanClient.hpp @@ -62,7 +62,7 @@ class DatamanClient * * @return true if data was read successfully within the timeout, false otherwise. */ - bool readSync(dm_item_t item, uint32_t index, uint8_t *buffer, uint32_t length, hrt_abstime timeout = 1000_ms); + bool readSync(dm_item_t item, uint32_t index, uint8_t *buffer, uint32_t length, hrt_abstime timeout = 5000_ms); /** * @brief Write data to the dataman synchronously. @@ -75,7 +75,7 @@ class DatamanClient * * @return True if the write operation succeeded, false otherwise. */ - bool writeSync(dm_item_t item, uint32_t index, uint8_t *buffer, uint32_t length, hrt_abstime timeout = 1000_ms); + bool writeSync(dm_item_t item, uint32_t index, uint8_t *buffer, uint32_t length, hrt_abstime timeout = 5000_ms); /** * @brief Clears the data in the specified dataman item. @@ -85,7 +85,7 @@ class DatamanClient * * @return True if the operation was successful, false otherwise. */ - bool clearSync(dm_item_t item, hrt_abstime timeout = 1000_ms); + bool clearSync(dm_item_t item, hrt_abstime timeout = 5000_ms); /** * @brief Initiates an asynchronous request to read the data from dataman for a specific item and index. @@ -185,6 +185,8 @@ class DatamanClient uint8_t _client_id{0}; + perf_counter_t _sync_perf{nullptr}; + static constexpr uint8_t CLIENT_ID_NOT_SET{0}; }; @@ -246,7 +248,7 @@ class DatamanCache * * @return True if the write operation succeeded, false otherwise. */ - bool writeWait(dm_item_t item, uint32_t index, uint8_t *buffer, uint32_t length, hrt_abstime timeout = 1000_ms); + bool writeWait(dm_item_t item, uint32_t index, uint8_t *buffer, uint32_t length, hrt_abstime timeout = 5000_ms); /** * @brief Updates the dataman cache by checking for responses from the DatamanClient and processing them. diff --git a/src/lib/events/enums.json b/src/lib/events/enums.json index fafe8c6e9bd4..8e86170951bf 100644 --- a/src/lib/events/enums.json +++ b/src/lib/events/enums.json @@ -364,7 +364,7 @@ }, "1": { "name": "manual_control_loss", - "description": "manual control loss" + "description": "Manual control loss" }, "2": { "name": "gcs_connection_loss", @@ -372,15 +372,19 @@ }, "3": { "name": "low_battery_level", - "description": "low battery level" + "description": "Low battery level" }, "4": { "name": "critical_battery_level", - "description": "critical battery level" + "description": "Critical battery level" }, "5": { "name": "emergency_battery_level", - "description": "emergency battery level" + "description": "Emergency battery level" + }, + "6": { + "name": "low_remaining_flight_time", + "description": "Remaining flight time low" } } }, @@ -398,19 +402,19 @@ }, "2": { "name": "fallback_posctrl", - "description": "fallback to position control" + "description": "Position mode" }, "3": { "name": "fallback_altctrl", - "description": "fallback to altitude control" + "description": "Altitude mode" }, "4": { "name": "fallback_stabilized", - "description": "fallback to stabilized" + "description": "Stabilized mode" }, "5": { "name": "hold", - "description": "hold" + "description": "Hold" }, "6": { "name": "rtl", @@ -418,11 +422,11 @@ }, "7": { "name": "land", - "description": "land" + "description": "Land" }, "8": { "name": "descend", - "description": "descend" + "description": "Descend" }, "9": { "name": "disarm", diff --git a/src/lib/events/events.cpp b/src/lib/events/events.cpp index c4d6867020c0..9bb215d3561f 100644 --- a/src/lib/events/events.cpp +++ b/src/lib/events/events.cpp @@ -61,7 +61,7 @@ void send(EventType &event) orb_publish(ORB_ID(event), orb_event_pub, &event); } else { - orb_event_pub = orb_advertise_queue(ORB_ID(event), &event, event_s::ORB_QUEUE_LENGTH); + orb_event_pub = orb_advertise(ORB_ID(event), &event); } pthread_mutex_unlock(&publish_event_mutex); diff --git a/src/lib/mathlib/math/Utilities.hpp b/src/lib/mathlib/math/Utilities.hpp index 9b8f7047c422..890346b9733c 100644 --- a/src/lib/mathlib/math/Utilities.hpp +++ b/src/lib/mathlib/math/Utilities.hpp @@ -1,6 +1,6 @@ /**************************************************************************** * - * Copyright (c) 2020-2022 PX4 Development Team. All rights reserved. + * Copyright (c) 2020-2024 PX4 Development Team. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -51,17 +51,18 @@ static constexpr float sq(float var) { return var * var; } // rot312(1) - Second rotation is a RH rotation about the X axis (rad) // rot312(2) - Third rotation is a RH rotation about the Y axis (rad) // See http://www.atacolorado.com/eulersequences.doc -inline matrix::Dcmf taitBryan312ToRotMat(const matrix::Vector3f &rot312) +template +inline matrix::Dcm taitBryan312ToRotMat(const matrix::Vector3 &rot312) { // Calculate the frame2 to frame 1 rotation matrix from a 312 Tait-Bryan rotation sequence - const float c2 = cosf(rot312(2)); // third rotation is pitch - const float s2 = sinf(rot312(2)); - const float s1 = sinf(rot312(1)); // second rotation is roll - const float c1 = cosf(rot312(1)); - const float s0 = sinf(rot312(0)); // first rotation is yaw - const float c0 = cosf(rot312(0)); - - matrix::Dcmf R; + const T c2 = cosf(rot312(2)); // third rotation is pitch + const T s2 = sinf(rot312(2)); + const T s1 = sinf(rot312(1)); // second rotation is roll + const T c1 = cosf(rot312(1)); + const T s0 = sinf(rot312(0)); // first rotation is yaw + const T c0 = cosf(rot312(0)); + + matrix::Dcm R; R(0, 0) = c0 * c2 - s0 * s1 * s2; R(1, 1) = c0 * c1; R(2, 2) = c2 * c1; @@ -75,20 +76,21 @@ inline matrix::Dcmf taitBryan312ToRotMat(const matrix::Vector3f &rot312) return R; } -inline matrix::Dcmf quatToInverseRotMat(const matrix::Quatf &quat) +template +inline matrix::Dcm quatToInverseRotMat(const matrix::Quaternion &quat) { - const float q00 = quat(0) * quat(0); - const float q11 = quat(1) * quat(1); - const float q22 = quat(2) * quat(2); - const float q33 = quat(3) * quat(3); - const float q01 = quat(0) * quat(1); - const float q02 = quat(0) * quat(2); - const float q03 = quat(0) * quat(3); - const float q12 = quat(1) * quat(2); - const float q13 = quat(1) * quat(3); - const float q23 = quat(2) * quat(3); - - matrix::Dcmf dcm; + const T q00 = quat(0) * quat(0); + const T q11 = quat(1) * quat(1); + const T q22 = quat(2) * quat(2); + const T q33 = quat(3) * quat(3); + const T q01 = quat(0) * quat(1); + const T q02 = quat(0) * quat(2); + const T q03 = quat(0) * quat(3); + const T q12 = quat(1) * quat(2); + const T q13 = quat(1) * quat(3); + const T q23 = quat(2) * quat(3); + + matrix::Dcm dcm; dcm(0, 0) = q00 + q11 - q22 - q33; dcm(1, 1) = q00 - q11 + q22 - q33; dcm(2, 2) = q00 - q11 - q22 + q33; @@ -105,40 +107,46 @@ inline matrix::Dcmf quatToInverseRotMat(const matrix::Quatf &quat) // We should use a 3-2-1 Tait-Bryan (yaw-pitch-roll) rotation sequence // when there is more roll than pitch tilt and a 3-1-2 rotation sequence // when there is more pitch than roll tilt to avoid gimbal lock. -inline bool shouldUse321RotationSequence(const matrix::Dcmf &R) +template +inline bool shouldUse321RotationSequence(const matrix::Dcm &R) { return fabsf(R(2, 0)) < fabsf(R(2, 1)); } -inline float getEuler321Yaw(const matrix::Dcmf &R) +template +inline float getEuler321Yaw(const matrix::Dcm &R) { return atan2f(R(1, 0), R(0, 0)); } -inline float getEuler312Yaw(const matrix::Dcmf &R) +template +inline float getEuler312Yaw(const matrix::Dcm &R) { return atan2f(-R(0, 1), R(1, 1)); } -inline float getEuler321Yaw(const matrix::Quatf &q) +template +inline T getEuler321Yaw(const matrix::Quaternion &q) { // Values from yaw_input_321.c file produced by // https://github.com/PX4/ecl/blob/master/matlab/scripts/Inertial%20Nav%20EKF/quat2yaw321.m - const float a = 2.f * (q(0) * q(3) + q(1) * q(2)); - const float b = sq(q(0)) + sq(q(1)) - sq(q(2)) - sq(q(3)); + const T a = static_cast(2.) * (q(0) * q(3) + q(1) * q(2)); + const T b = sq(q(0)) + sq(q(1)) - sq(q(2)) - sq(q(3)); return atan2f(a, b); } -inline float getEuler312Yaw(const matrix::Quatf &q) +template +inline T getEuler312Yaw(const matrix::Quaternion &q) { // Values from yaw_input_312.c file produced by // https://github.com/PX4/ecl/blob/master/matlab/scripts/Inertial%20Nav%20EKF/quat2yaw312.m - const float a = 2.f * (q(0) * q(3) - q(1) * q(2)); - const float b = sq(q(0)) - sq(q(1)) + sq(q(2)) - sq(q(3)); + const T a = static_cast(2.) * (q(0) * q(3) - q(1) * q(2)); + const T b = sq(q(0)) - sq(q(1)) + sq(q(2)) - sq(q(3)); return atan2f(a, b); } -inline float getEulerYaw(const matrix::Dcmf &R) +template +inline T getEulerYaw(const matrix::Dcm &R) { if (shouldUse321RotationSequence(R)) { return getEuler321Yaw(R); @@ -148,23 +156,32 @@ inline float getEulerYaw(const matrix::Dcmf &R) } } -inline matrix::Dcmf updateEuler321YawInRotMat(float yaw, const matrix::Dcmf &rot_in) +template +inline T getEulerYaw(const matrix::Quaternion &q) { - matrix::Eulerf euler321(rot_in); + return getEulerYaw(matrix::Dcm(q)); +} + +template +inline matrix::Dcm updateEuler321YawInRotMat(T yaw, const matrix::Dcm &rot_in) +{ + matrix::Euler euler321(rot_in); euler321(2) = yaw; - return matrix::Dcmf(euler321); + return matrix::Dcm(euler321); } -inline matrix::Dcmf updateEuler312YawInRotMat(float yaw, const matrix::Dcmf &rot_in) +template +inline matrix::Dcm updateEuler312YawInRotMat(T yaw, const matrix::Dcm &rot_in) { - const matrix::Vector3f rotVec312(yaw, // yaw - asinf(rot_in(2, 1)), // roll - atan2f(-rot_in(2, 0), rot_in(2, 2))); // pitch + const matrix::Vector3 rotVec312(yaw, // yaw + asinf(rot_in(2, 1)), // roll + atan2f(-rot_in(2, 0), rot_in(2, 2))); // pitch return taitBryan312ToRotMat(rotVec312); } // Checks which euler rotation sequence to use and update yaw in rotation matrix -inline matrix::Dcmf updateYawInRotMat(float yaw, const matrix::Dcmf &rot_in) +template +inline matrix::Dcm updateYawInRotMat(T yaw, const matrix::Dcm &rot_in) { if (shouldUse321RotationSequence(rot_in)) { return updateEuler321YawInRotMat(yaw, rot_in); diff --git a/src/lib/matrix/matrix/Matrix.hpp b/src/lib/matrix/matrix/Matrix.hpp index 33d2e6cbf0bc..14400683f0ef 100644 --- a/src/lib/matrix/matrix/Matrix.hpp +++ b/src/lib/matrix/matrix/Matrix.hpp @@ -162,6 +162,24 @@ class Matrix return res; } + // Using this function reduces the number of temporary variables needed to compute A * B.T + template + Matrix multiplyByTranspose(const Matrix &other) const + { + Matrix res; + const Matrix &self = *this; + + for (size_t i = 0; i < M; i++) { + for (size_t k = 0; k < P; k++) { + for (size_t j = 0; j < N; j++) { + res(i, k) += self(i, j) * other(k, j); + } + } + } + + return res; + } + // Element-wise multiplication Matrix emult(const Matrix &other) const { diff --git a/src/lib/mixer_module/mixer_module.cpp b/src/lib/mixer_module/mixer_module.cpp index dc5f791af22e..ee75bcf9fa0e 100644 --- a/src/lib/mixer_module/mixer_module.cpp +++ b/src/lib/mixer_module/mixer_module.cpp @@ -455,7 +455,8 @@ bool MixingOutput::update() } } - if (!all_disabled) { + // Send output if any function mapped or one last disabling sample + if (!all_disabled || !_was_all_disabled) { if (!_armed.armed && !_armed.manual_lockdown) { _actuator_test.overrideValues(outputs, _max_num_outputs); } @@ -463,6 +464,8 @@ bool MixingOutput::update() limitAndUpdateOutputs(outputs, has_updates); } + _was_all_disabled = all_disabled; + return true; } diff --git a/src/lib/mixer_module/mixer_module.hpp b/src/lib/mixer_module/mixer_module.hpp index c791feb10333..3deaa54aa42f 100644 --- a/src/lib/mixer_module/mixer_module.hpp +++ b/src/lib/mixer_module/mixer_module.hpp @@ -288,6 +288,7 @@ class MixingOutput : public ModuleParams hrt_abstime _lowrate_schedule_interval{300_ms}; ActuatorTest _actuator_test{_function_assignment}; uint32_t _reversible_mask{0}; ///< per-output bits. If set, the output is configured to be reversible (motors only) + bool _was_all_disabled{false}; uORB::SubscriptionCallbackWorkItem *_subscription_callback{nullptr}; ///< current scheduling callback diff --git a/src/lib/mixer_module/mixer_module_tests.cpp b/src/lib/mixer_module/mixer_module_tests.cpp index ef48f3e3f217..3901a1c85de9 100644 --- a/src/lib/mixer_module/mixer_module_tests.cpp +++ b/src/lib/mixer_module/mixer_module_tests.cpp @@ -191,11 +191,15 @@ TEST_F(MixerModuleTest, basic) mixing_output.setAllMaxValues(MAX_VALUE); EXPECT_EQ(test_module.num_updates, 0); - // all functions disabled: not expected to get an update + // all functions disabled: expect to get one single update to process disabling the output signal mixing_output.update(); mixing_output.updateSubscriptions(false); mixing_output.update(); - EXPECT_EQ(test_module.num_updates, 0); + EXPECT_EQ(test_module.num_updates, 1); + mixing_output.update(); + mixing_output.updateSubscriptions(false); + mixing_output.update(); + EXPECT_EQ(test_module.num_updates, 1); test_module.reset(); // configure motor, ensure all still disarmed diff --git a/src/lib/parameters/CMakeLists.txt b/src/lib/parameters/CMakeLists.txt index a68a6e38adfb..b87e652cad4f 100644 --- a/src/lib/parameters/CMakeLists.txt +++ b/src/lib/parameters/CMakeLists.txt @@ -156,7 +156,23 @@ add_custom_target(parameters_header DEPENDS px4_parameters.hpp) set(SRCS) -list(APPEND SRCS parameters.cpp atomic_transaction.cpp autosave.cpp) +list(APPEND SRCS + parameters.cpp + atomic_transaction.cpp + autosave.cpp +) + +if(CONFIG_PARAM_PRIMARY) +list(APPEND SRCS + parameters_primary.cpp +) +endif() + +if(CONFIG_PARAM_REMOTE) +list(APPEND SRCS + parameters_remote.cpp +) +endif() if(BUILD_TESTING) list(APPEND SRCS param_translation_unit_tests.cpp) diff --git a/src/lib/parameters/Kconfig b/src/lib/parameters/Kconfig new file mode 100644 index 000000000000..f296180d996f --- /dev/null +++ b/src/lib/parameters/Kconfig @@ -0,0 +1,11 @@ +menuconfig PARAM_PRIMARY + bool "parameter primary" + default n + ---help--- + Enable support for the parameter primary in distributed board architectures + +menuconfig PARAM_REMOTE + bool "parameter remote" + default n + ---help--- + Enable support for the parameter remote in distributed board architectures diff --git a/src/lib/parameters/param.h b/src/lib/parameters/param.h index dca29d4f212f..c8b8dbd79df9 100644 --- a/src/lib/parameters/param.h +++ b/src/lib/parameters/param.h @@ -267,6 +267,18 @@ __EXPORT void param_set_used(param_t param); */ __EXPORT int param_set_no_notification(param_t param, const void *val); +/** + * Set the value of a parameter, but do not update the remote system. This avoids + * a set loop between primary and remote. + * + * @param param A handle returned by param_find or passed by param_foreach. + * @param val The value to set; assumed to point to a variable of the parameter type. + * For structures, the pointer is assumed to point to a structure to be copied. + * @param notify Set this to true for the primary (to send out a param update) and false on client + * @return Zero if the parameter's value could be set from a scalar, nonzero otherwise. + */ +__EXPORT int param_set_no_remote_update(param_t param, const void *val, bool notify); + /** * Notify the system about parameter changes. Can be used for example after several calls to * param_set_no_notification() to avoid unnecessary system notifications. diff --git a/src/lib/parameters/parameters.cpp b/src/lib/parameters/parameters.cpp index 0b20bd0fe7c5..f8cd3d6fa3ea 100644 --- a/src/lib/parameters/parameters.cpp +++ b/src/lib/parameters/parameters.cpp @@ -105,8 +105,10 @@ static DynamicSparseLayer runtime_defaults{&firmware_defaults}; DynamicSparseLayer user_config{&runtime_defaults}; /** parameter update topic handle */ +#if not defined(CONFIG_PARAM_REMOTE) static orb_advert_t param_topic = nullptr; static unsigned int param_instance = 0; +#endif static perf_counter_t param_export_perf; static perf_counter_t param_find_perf; @@ -116,6 +118,14 @@ static perf_counter_t param_set_perf; static pthread_mutex_t file_mutex = PTHREAD_MUTEX_INITIALIZER; ///< this protects against concurrent param saves (file or flash access). +// Support for remote parameter node +#if defined(CONFIG_PARAM_PRIMARY) +# include "parameters_primary.h" +#endif // CONFIG_PARAM_PRIMARY +#if defined(CONFIG_PARAM_REMOTE) +# include "parameters_remote.h" +#endif // CONFIG_PARAM_REMOTE + void param_init() { @@ -128,14 +138,27 @@ param_init() px4_register_boardct_ioctl(_PARAMIOCBASE, param_ioctl); #endif +#if defined(CONFIG_PARAM_PRIMARY) + param_primary_init(); +#endif // CONFIG_PARAM_PRIMARY + +#if defined(CONFIG_PARAM_REMOTE) + param_remote_init(); +#endif // CONFIG_PARAM_REMOTE + +#if not defined(CONFIG_PARAM_REMOTE) autosave_instance = new ParamAutosave(); +#endif } void param_notify_changes() { - parameter_update_s pup{}; +// Don't send if this is a remote node. Only the primary +// sends out update notices +#if not defined(CONFIG_PARAM_REMOTE) + parameter_update_s pup {}; pup.instance = param_instance++; pup.get_count = perf_event_count(param_get_perf); pup.set_count = perf_event_count(param_set_perf); @@ -152,6 +175,8 @@ param_notify_changes() } else { orb_publish(ORB_ID(parameter_update), param_topic, &pup); } + +#endif } static param_t param_find_internal(const char *name, bool notification) @@ -372,7 +397,7 @@ param_control_autosave(bool enable) } static int -param_set_internal(param_t param, const void *val, bool mark_saved, bool notify_changes) +param_set_internal(param_t param, const void *val, bool mark_saved, bool notify_changes, bool update_remote = true) { if (!handle_in_range(param)) { PX4_ERR("set invalid param %d", param); @@ -421,6 +446,24 @@ param_set_internal(param_t param, const void *val, bool mark_saved, bool notify_ param_autosave(); } + // If this is the parameter server, make sure that the remote is updated +#if defined(CONFIG_PARAM_PRIMARY) + + if (param_changed && update_remote) { + param_primary_set_value(param, val); + } + +#endif + + // If this is the parameter remote, make sure that the primary is updated +#if defined(CONFIG_PARAM_REMOTE) + + if (param_changed && update_remote) { + param_remote_set_value(param, val); + } + +#endif + perf_end(param_set_perf); /* @@ -456,6 +499,11 @@ int param_set_no_notification(param_t param, const void *val) return param_set_internal(param, val, false, false); } +int param_set_no_remote_update(param_t param, const void *val, bool notify) +{ + return param_set_internal(param, val, false, notify, false); +} + bool param_used(param_t param) { if (handle_in_range(param)) { @@ -468,6 +516,14 @@ bool param_used(param_t param) void param_set_used(param_t param) { if (handle_in_range(param)) { +#if defined(CONFIG_PARAM_REMOTE) + + if (!param_used(param)) { + param_remote_set_used(param); + } + +#endif + params_active.set(param, true); } } @@ -544,6 +600,11 @@ int param_set_default_value(param_t param, const void *val) static int param_reset_internal(param_t param, bool notify = true, bool autosave = true) { +#if defined(CONFIG_PARAM_REMOTE) + // Remote doesn't support reset + return false; +#endif + bool param_found = user_config.contains(param); if (handle_in_range(param)) { @@ -558,6 +619,10 @@ static int param_reset_internal(param_t param, bool notify = true, bool autosave param_notify_changes(); } +#if defined(CONFIG_PARAM_PRIMARY) + param_primary_reset(param); +#endif + return param_found; } @@ -567,6 +632,11 @@ int param_reset_no_notification(param_t param) { return param_reset_internal(par static void param_reset_all_internal(bool auto_save) { +#if defined(CONFIG_PARAM_REMOTE) + // Remote doesn't support reset + return; +#endif + for (param_t param = 0; handle_in_range(param); param++) { param_reset_internal(param, false, false); } @@ -575,6 +645,10 @@ param_reset_all_internal(bool auto_save) param_autosave(); } +#if defined(CONFIG_PARAM_PRIMARY) + param_primary_reset_all(); +#endif + param_notify_changes(); } @@ -1280,4 +1354,27 @@ void param_print_status() perf_print_counter(param_find_perf); perf_print_counter(param_get_perf); perf_print_counter(param_set_perf); + +#if defined(CONFIG_PARAM_PRIMARY) + struct param_primary_counters counts; + param_primary_get_counters(&counts); + PX4_INFO("set value requests received: %" PRIu32 ", set value responses sent: %" PRIu32, + counts.set_value_request_received, counts.set_value_response_sent); + PX4_INFO("set value requests sent: %" PRIu32 ", set value responses received: %" PRIu32, + counts.set_value_request_sent, counts.set_value_response_received); + PX4_INFO("resets sent: %" PRIu32 ", set used requests received: %" PRIu32, + counts.reset_sent, counts.set_used_received); +#endif + +#if defined(CONFIG_PARAM_REMOTE) + struct param_remote_counters counts; + param_remote_get_counters(&counts); + PX4_INFO("set value requests received: %" PRIu32 ", set value responses sent: %" PRIu32, + counts.set_value_request_received, counts.set_value_response_sent); + PX4_INFO("set value requests sent: %" PRIu32 ", set value responses received: %" PRIu32, + counts.set_value_request_sent, counts.set_value_response_received); + PX4_INFO("resets received: %" PRIu32 ", set used requests sent: %" PRIu32, + counts.reset_received, counts.set_used_sent); +#endif + } diff --git a/src/lib/parameters/parameters_primary.cpp b/src/lib/parameters/parameters_primary.cpp new file mode 100644 index 000000000000..02de11e608d0 --- /dev/null +++ b/src/lib/parameters/parameters_primary.cpp @@ -0,0 +1,314 @@ +/**************************************************************************** + * + * Copyright (c) 2024 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include "parameters_primary.h" + +#include "uORB/uORBManager.hpp" + +#include +#include + +// uORB topics needed to keep parameter server and client in sync +#include +#include +#include +#include + +// Debug flag +static bool debug = false; + +static struct param_primary_counters param_primary_counters; + +#define TIMEOUT_WAIT 1000 +#define TIMEOUT_COUNT 50 + +static px4_task_t sync_thread_tid; +static const char *sync_thread_name = "param_primary_sync"; + +static orb_advert_t param_set_value_req_h = nullptr; +static orb_advert_t param_reset_req_h = nullptr; + +static int param_set_rsp_fd = PX4_ERROR; + +static int primary_sync_thread(int argc, char *argv[]) +{ + // Need to wait until the uORB and muORB are ready + // Check for uORB initialization with get_instance + while (uORB::Manager::get_instance() == nullptr) { px4_usleep(100); } + + // Check for muORB initialization with get_uorb_communicator + while (uORB::Manager::get_instance()->get_uorb_communicator() == nullptr) { px4_usleep(100); } + + orb_advert_t _set_value_rsp_h = nullptr; + + int _set_used_req_fd = orb_subscribe(ORB_ID(parameter_set_used_request)); + int _set_value_req_fd = orb_subscribe(ORB_ID(parameter_primary_set_value_request)); + + struct parameter_set_used_request_s _set_used_request; + struct parameter_set_value_request_s _set_value_request; + struct parameter_set_value_response_s _set_value_response; + + px4_pollfd_struct_t fds[2] = { { .fd = _set_used_req_fd, .events = POLLIN }, + { .fd = _set_value_req_fd, .events = POLLIN } + }; + + PX4_INFO("Starting parameter primary sync thread"); + + while (true) { + px4_poll(fds, 2, 1000); + + if (fds[0].revents & POLLIN) { + bool updated = true; + + while (updated) { + orb_copy(ORB_ID(parameter_set_used_request), _set_used_req_fd, &_set_used_request); + + if (debug) { + PX4_INFO("Got parameter_set_used_request for %s", param_name(_set_used_request.parameter_index)); + } + + param_primary_counters.set_used_received++; + + param_find(param_name(_set_used_request.parameter_index)); + + (void) orb_check(_set_used_req_fd, &updated); + } + + } + + if (fds[1].revents & POLLIN) { + bool updated = true; + + while (updated) { + orb_copy(ORB_ID(parameter_primary_set_value_request), _set_value_req_fd, &_set_value_request); + + if (debug) { + PX4_INFO("Got parameter_primary_set_value_request for %s", param_name(_set_value_request.parameter_index)); + } + + param_primary_counters.set_value_request_received++; + + param_t param = _set_value_request.parameter_index; + + switch (param_type(param)) { + case PARAM_TYPE_INT32: + param_set_no_remote_update(param, (const void *) &_set_value_request.int_value, true); + break; + + case PARAM_TYPE_FLOAT: + param_set_no_remote_update(param, (const void *) &_set_value_request.float_value, true); + break; + + default: + PX4_ERR("Parameter must be either int or float"); + break; + } + + _set_value_response.timestamp = hrt_absolute_time(); + _set_value_response.request_timestamp = _set_value_request.timestamp; + _set_value_response.parameter_index = _set_value_request.parameter_index; + + if (_set_value_rsp_h == nullptr) { + _set_value_rsp_h = orb_advertise(ORB_ID(parameter_primary_set_value_response), &_set_value_response); + + } else { + orb_publish(ORB_ID(parameter_primary_set_value_response), _set_value_rsp_h, &_set_value_response); + } + + param_primary_counters.set_value_response_sent++; + + (void) orb_check(_set_value_req_fd, &updated); + } + } + } + + return 0; +} + +void param_primary_init() +{ + + sync_thread_tid = px4_task_spawn_cmd(sync_thread_name, + SCHED_DEFAULT, + SCHED_PRIORITY_PARAMS, + (1024 * 4), + primary_sync_thread, + NULL); + +} + +// void param_primary_set_value(param_t param, const void *val, bool from_file) +void param_primary_set_value(param_t param, const void *val) +{ + bool send_request = true; + struct parameter_set_value_request_s req; + req.timestamp = hrt_absolute_time(); + req.parameter_index = param; + + switch (param_type(param)) { + case PARAM_TYPE_INT32: + req.int_value = *(int32_t *)val; + + if (debug) { + PX4_INFO("*** Setting %s to %d ***", param_name(req.parameter_index), req.int_value); + } + + break; + + case PARAM_TYPE_FLOAT: + req.float_value = *(float *)val; + + if (debug) { + PX4_INFO("*** Setting %s to %f ***", param_name(req.parameter_index), (double) req.float_value); + } + + break; + + default: + PX4_ERR("Parameter must be either int or float"); + send_request = false; + break; + } + + if (param_set_rsp_fd == PX4_ERROR) { + if (debug) { + PX4_INFO("Subscribing to parameter_client_set_value_response"); + } + + param_set_rsp_fd = orb_subscribe(ORB_ID(parameter_remote_set_value_response)); + + if (param_set_rsp_fd == PX4_ERROR) { + PX4_ERR("Subscription to parameter_remote_set_value_response failed"); + + } else { + if (debug) { + PX4_INFO("Subscription to parameter_client_set_value_response succeeded"); + } + } + } + + if (send_request) { + if (debug) { + PX4_INFO("Sending param set request to remote for %s", param_name(req.parameter_index)); + } + + if (param_set_value_req_h == nullptr) { + param_set_value_req_h = orb_advertise(ORB_ID(parameter_remote_set_value_request), nullptr); + } + + orb_publish(ORB_ID(parameter_remote_set_value_request), param_set_value_req_h, &req); + + param_primary_counters.set_value_request_sent++; + + // Wait for response + bool updated = false; + + if (debug) { + PX4_INFO("Waiting for parameter_client_set_value_response for %s", param_name(req.parameter_index)); + } + + px4_usleep(TIMEOUT_WAIT); + int count = TIMEOUT_COUNT; + + while (--count) { + (void) orb_check(param_set_rsp_fd, &updated); + + struct parameter_set_value_response_s rsp; + + while (updated) { + + orb_copy(ORB_ID(parameter_remote_set_value_response), param_set_rsp_fd, &rsp); + + if ((rsp.request_timestamp == req.timestamp) && (rsp.parameter_index == req.parameter_index)) { + if (debug) { + PX4_INFO("Got parameter_remote_set_value_response for %s", param_name(req.parameter_index)); + } + + param_primary_counters.set_value_response_received++; + return; + } + + (void) orb_check(param_set_rsp_fd, &updated); + } + + px4_usleep(TIMEOUT_WAIT); + } + + PX4_ERR("Timeout waiting for parameter_client_set_value_response for %s", param_name(req.parameter_index)); + } +} + +static void param_primary_reset_internal(param_t param, bool reset_all) +{ + if (debug) { + PX4_INFO("Param reset at primary"); + } + + struct parameter_reset_request_s req; + + req.timestamp = hrt_absolute_time(); + + req.reset_all = reset_all; + + if (reset_all == false) { + req.parameter_index = param; + } + + if (debug) { + PX4_INFO("Sending param reset request to remote"); + } + + if (param_reset_req_h == nullptr) { + param_reset_req_h = orb_advertise(ORB_ID(parameter_reset_request), &req); + + } else { + orb_publish(ORB_ID(parameter_reset_request), param_reset_req_h, &req); + } + + param_primary_counters.reset_sent++; +} + +void param_primary_reset(param_t param) +{ + param_primary_reset_internal(param, false); +} + +void param_primary_reset_all() +{ + param_primary_reset_internal(0, true); +} + +void param_primary_get_counters(struct param_primary_counters *cnt) +{ + *cnt = param_primary_counters; +} \ No newline at end of file diff --git a/src/lib/parameters/parameters_primary.h b/src/lib/parameters/parameters_primary.h new file mode 100644 index 000000000000..7994822d4c05 --- /dev/null +++ b/src/lib/parameters/parameters_primary.h @@ -0,0 +1,52 @@ +/**************************************************************************** + * + * Copyright (c) 2024 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#pragma once + +#include "param.h" + +struct param_primary_counters { + uint32_t set_value_request_received; + uint32_t set_value_response_sent; + uint32_t reset_sent; + uint32_t set_value_request_sent; + uint32_t set_value_response_received; + uint32_t set_used_received; +}; + +void param_primary_init(); +void param_primary_set_value(param_t param, const void *val); +void param_primary_reset(param_t param); +void param_primary_reset_all(); +void param_primary_get_counters(struct param_primary_counters *cnt); + diff --git a/src/lib/parameters/parameters_remote.cpp b/src/lib/parameters/parameters_remote.cpp new file mode 100644 index 000000000000..78b7ee153cf1 --- /dev/null +++ b/src/lib/parameters/parameters_remote.cpp @@ -0,0 +1,310 @@ +/**************************************************************************** + * + * Copyright (c) 2024 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#include "parameters_remote.h" + +#include "uORB/uORBManager.hpp" + +#include + +#include +#include + +// uORB topics needed to keep parameter server and client in sync +#include +#include +#include +#include + +// Debug flag +static bool debug = false; + +static struct param_remote_counters param_remote_counters; + +#define TIMEOUT_WAIT 1000 +#define TIMEOUT_COUNT 50 + +static orb_advert_t parameter_set_used_h = nullptr; +static orb_advert_t param_set_value_req_h = nullptr; + +static int param_set_rsp_fd = PX4_ERROR; + +static px4_task_t sync_thread_tid; +static const char *sync_thread_name = "param_remote_sync"; + +static int remote_sync_thread(int argc, char *argv[]) +{ + // This thread gets started by the remote side during PX4 initialization. + // We cannot send out the subscribe request immediately because the other + // side will not be ready to receive it on the muorb yet and it will get dropped. + // So, sleep a little bit to give other side a chance to finish initialization + // of the muorb. But don't wait too long otherwise a set request from the server + // side could be missed. + usleep(200000); + + orb_advert_t _set_value_rsp_h = nullptr; + + int _reset_req_fd = orb_subscribe(ORB_ID(parameter_reset_request)); + int _set_value_req_fd = orb_subscribe(ORB_ID(parameter_remote_set_value_request)); + + struct parameter_reset_request_s _reset_request; + struct parameter_set_value_request_s _set_value_request; + struct parameter_set_value_response_s _set_value_response; + + px4_pollfd_struct_t fds[2] = { { .fd = _reset_req_fd, .events = POLLIN }, + { .fd = _set_value_req_fd, .events = POLLIN } + }; + + PX4_INFO("Starting parameter remote sync thread"); + + while (true) { + px4_poll(fds, 2, 1000); + + if (fds[0].revents & POLLIN) { + bool updated = true; + + while (updated) { + orb_copy(ORB_ID(parameter_reset_request), _reset_req_fd, &_reset_request); + + if (debug) { + PX4_INFO("Got parameter_reset_request for %s", param_name(_reset_request.parameter_index)); + } + + param_remote_counters.reset_received++; + + if (_reset_request.reset_all) { + param_reset_all(); + + } else { + param_reset_no_notification(_reset_request.parameter_index); + + } + + (void) orb_check(_reset_req_fd, &updated); + } + } + + if (fds[1].revents & POLLIN) { + bool updated = true; + + while (updated) { + orb_copy(ORB_ID(parameter_primary_set_value_request), _set_value_req_fd, &_set_value_request); + + if (debug) { + PX4_INFO("Got parameter_remote_set_value_request for %s", param_name(_set_value_request.parameter_index)); + } + + param_remote_counters.set_value_request_received++; + + switch (param_type(_set_value_request.parameter_index)) { + case PARAM_TYPE_INT32: + param_set_no_remote_update(_set_value_request.parameter_index, + (const void *) &_set_value_request.int_value, + false); + break; + + case PARAM_TYPE_FLOAT: + param_set_no_remote_update(_set_value_request.parameter_index, + (const void *) &_set_value_request.float_value, + false); + break; + + default: + PX4_ERR("Parameter must be either int or float"); + break; + } + + _set_value_response.timestamp = hrt_absolute_time(); + _set_value_response.request_timestamp = _set_value_request.timestamp; + _set_value_response.parameter_index = _set_value_request.parameter_index; + + if (_set_value_rsp_h == nullptr) { + _set_value_rsp_h = orb_advertise(ORB_ID(parameter_remote_set_value_response), &_set_value_response); + + } else { + if (debug) { + PX4_INFO("Sending set value response for %s", param_name(_set_value_request.parameter_index)); + } + + orb_publish(ORB_ID(parameter_remote_set_value_response), _set_value_rsp_h, &_set_value_response); + } + + param_remote_counters.set_value_response_sent++; + + (void) orb_check(_set_value_req_fd, &updated); + } + } + } + + return 0; +} + +void param_remote_init() +{ + + sync_thread_tid = px4_task_spawn_cmd(sync_thread_name, + SCHED_DEFAULT, + SCHED_PRIORITY_PARAMS, + (1024 * 4), + remote_sync_thread, + NULL); + +} + +void param_remote_set_used(param_t param) +{ + // Notify the parameter server that this parameter has been marked as used + if (debug) { + PX4_INFO("Requesting server to mark %s as used", param_name(param)); + } + + struct parameter_set_used_request_s req; + + req.timestamp = hrt_absolute_time(); + + req.parameter_index = param; + + if (parameter_set_used_h == nullptr) { + parameter_set_used_h = orb_advertise(ORB_ID(parameter_set_used_request), &req); + + } else { + orb_publish(ORB_ID(parameter_set_used_request), parameter_set_used_h, &req); + } + + param_remote_counters.set_used_sent++; +} + +void param_remote_set_value(param_t param, const void *val) +{ + bool send_request = true; + struct parameter_set_value_request_s req; + req.timestamp = hrt_absolute_time(); + req.parameter_index = param; + + switch (param_type(param)) { + case PARAM_TYPE_INT32: + req.int_value = *(int32_t *)val; + + if (debug) { + PX4_INFO("*** Setting %s to %" PRIi32 " ***", param_name(req.parameter_index), req.int_value); + } + + break; + + case PARAM_TYPE_FLOAT: + req.float_value = *(float *)val; + + if (debug) { + PX4_INFO("*** Setting %s to %f ***", param_name(req.parameter_index), (double) req.float_value); + } + + break; + + default: + PX4_ERR("Parameter must be either int or float"); + send_request = false; + break; + } + + if (param_set_rsp_fd == PX4_ERROR) { + if (debug) { + PX4_INFO("Subscribing to parameter_primary_set_value_response"); + } + + param_set_rsp_fd = orb_subscribe(ORB_ID(parameter_primary_set_value_response)); + + if (param_set_rsp_fd == PX4_ERROR) { + PX4_ERR("Subscription to parameter_primary_set_value_response failed"); + + } else { + if (debug) { + PX4_INFO("Subscription to parameter_primary_set_value_response succeeded"); + } + } + } + + if (send_request) { + if (debug) { + PX4_INFO("Sending param set value request to primary for %s", param_name(req.parameter_index)); + } + + if (param_set_value_req_h == nullptr) { + param_set_value_req_h = orb_advertise(ORB_ID(parameter_primary_set_value_request), nullptr); + } + + orb_publish(ORB_ID(parameter_primary_set_value_request), param_set_value_req_h, &req); + + param_remote_counters.set_value_request_sent++; + + // Wait for response + bool updated = false; + + if (debug) { + PX4_INFO("Waiting for parameter_client_set_value_response for %s", param_name(req.parameter_index)); + } + + px4_usleep(TIMEOUT_WAIT); + int count = TIMEOUT_COUNT; + + while (--count) { + (void) orb_check(param_set_rsp_fd, &updated); + + struct parameter_set_value_response_s rsp; + + while (updated) { + + orb_copy(ORB_ID(parameter_primary_set_value_response), param_set_rsp_fd, &rsp); + + if ((rsp.request_timestamp == req.timestamp) && (rsp.parameter_index == req.parameter_index)) { + if (debug) { + PX4_INFO("Got parameter_primary_set_value_response for %s", param_name(req.parameter_index)); + } + + param_remote_counters.set_value_response_received++; + return; + } + + (void) orb_check(param_set_rsp_fd, &updated); + } + + px4_usleep(TIMEOUT_WAIT); + } + + PX4_ERR("Timeout waiting for parameter_primary_set_value_response for %s", param_name(req.parameter_index)); + } +} + +void param_remote_get_counters(struct param_remote_counters *cnt) +{ + *cnt = param_remote_counters; +} diff --git a/src/lib/parameters/parameters_remote.h b/src/lib/parameters/parameters_remote.h new file mode 100644 index 000000000000..7eba416643cf --- /dev/null +++ b/src/lib/parameters/parameters_remote.h @@ -0,0 +1,50 @@ +/**************************************************************************** + * + * Copyright (c) 2024 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +#pragma once + +#include "param.h" + +struct param_remote_counters { + uint32_t set_value_request_received; + uint32_t set_value_response_sent; + uint32_t reset_received; + uint32_t set_value_request_sent; + uint32_t set_value_response_received; + uint32_t set_used_sent; +}; + +void param_remote_init(); +void param_remote_set_used(param_t param); +void param_remote_set_value(param_t param, const void *val); +void param_remote_get_counters(struct param_remote_counters *cnt); diff --git a/boards/modalai/voxl2-slpi/src/drivers/icm42688p/CMakeLists.txt b/src/lib/rtl/CMakeLists.txt similarity index 81% rename from boards/modalai/voxl2-slpi/src/drivers/icm42688p/CMakeLists.txt rename to src/lib/rtl/CMakeLists.txt index 1f8e2102a5d9..4f3e7a3c5331 100644 --- a/boards/modalai/voxl2-slpi/src/drivers/icm42688p/CMakeLists.txt +++ b/src/lib/rtl/CMakeLists.txt @@ -1,6 +1,6 @@ ############################################################################ # -# Copyright (c) 2020 PX4 Development Team. All rights reserved. +# Copyright (c) 2024 PX4 Development Team. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions @@ -30,19 +30,5 @@ # POSSIBILITY OF SUCH DAMAGE. # ############################################################################ -px4_add_module( - MODULE drivers__imu__invensense__icm42688p - MAIN icm42688p - COMPILE_FLAGS - ${MAX_CUSTOM_OPT_LEVEL} - SRCS - icm42688p_main.cpp - ICM42688P.cpp - ICM42688P.hpp - InvenSense_ICM42688P_registers.hpp - DEPENDS - px4_work_queue - drivers_accelerometer - drivers_gyroscope - drivers__device - ) + +px4_add_library(rtl_time_estimator rtl_time_estimator.cpp) diff --git a/src/lib/rtl/rtl_time_estimator.cpp b/src/lib/rtl/rtl_time_estimator.cpp new file mode 100644 index 000000000000..055b62ccabca --- /dev/null +++ b/src/lib/rtl/rtl_time_estimator.cpp @@ -0,0 +1,267 @@ +/**************************************************************************** + * + * Copyright (C) 2024 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file rtl_time_estimator.cpp + * + * Helper class to calculate the remaining time estimate to go to RTL landing point. + * + */ + +#include "rtl_time_estimator.h" + +#include +#include + +#include +#include +#include + +RtlTimeEstimator::RtlTimeEstimator() : ModuleParams(nullptr) +{ + _param_mpc_z_v_auto_up = param_find("MPC_Z_V_AUTO_UP"); + _param_mpc_z_v_auto_dn = param_find("MPC_Z_V_AUTO_DN"); + _param_mpc_land_speed = param_find("MPC_LAND_SPEED"); + _param_fw_climb_rate = param_find("FW_T_CLMB_R_SP"); + _param_fw_sink_rate = param_find("FW_T_SINK_R_SP"); + _param_fw_airspeed_trim = param_find("FW_AIRSPD_TRIM"); + _param_mpc_xy_cruise = param_find("MPC_XY_CRUISE"); + _param_rover_cruise_speed = param_find("GND_SPEED_THR_SC"); +}; + +rtl_time_estimate_s RtlTimeEstimator::getEstimate() const +{ + rtl_time_estimate_s time_estimate{}; + + if (_is_valid && PX4_ISFINITE(_time_estimate)) { + time_estimate.valid = true; + time_estimate.time_estimate = _time_estimate; + // Use actual time estimate to compute the safer time estimate with additional scale factor and a margin + time_estimate.safe_time_estimate = _param_rtl_time_factor.get() * _time_estimate + _param_rtl_time_margin.get(); + + } else { + time_estimate.valid = false; + } + + time_estimate.timestamp = hrt_absolute_time(); + return time_estimate; +} + +void RtlTimeEstimator::update() +{ + _vehicle_status_sub.update(); + _wind_sub.update(); + + if (_parameter_update_sub.updated()) { + parameter_update_s param_update; + _parameter_update_sub.copy(¶m_update); + + // If any parameter updated, call updateParams() to check if + // this class attributes need updating (and do so). + updateParams(); + } +} + +void RtlTimeEstimator::addVertDistance(float alt) +{ + if (PX4_ISFINITE(alt)) { + _is_valid = true; + + _time_estimate += calcVertTimeEstimate(alt); + } +} + +void RtlTimeEstimator::addDistance(float hor_dist, const matrix::Vector2f &direction, float vert_dist) +{ + if (PX4_ISFINITE(hor_dist) && PX4_ISFINITE(vert_dist)) { + _is_valid = true; + + float hor_time_estimate{0.f}; + + if (hor_dist > FLT_EPSILON && PX4_ISFINITE(hor_dist)) { + hor_time_estimate = hor_dist / getCruiseGroundSpeed(direction.normalized()); + } + + float ver_time_estimate{calcVertTimeEstimate(vert_dist)}; + + _time_estimate += math::max(hor_time_estimate, ver_time_estimate); + + } +} + +void RtlTimeEstimator::addWait(float time_s) +{ + if (PX4_ISFINITE(time_s)) { + _is_valid = true; + + if (time_s > FLT_EPSILON) { + _time_estimate += time_s; + } + } +} + +void RtlTimeEstimator::addDescendMCLand(float alt) +{ + if (PX4_ISFINITE(alt)) { + _is_valid = true; + + if (alt < -FLT_EPSILON && PX4_ISFINITE(alt)) { + _time_estimate += -alt / getHoverLandSpeed(); + } + } +} + +float RtlTimeEstimator::getCruiseGroundSpeed(const matrix::Vector2f &direction_norm) +{ + float cruise_speed = getCruiseSpeed(); + + if (_vehicle_status_sub.get().vehicle_type == vehicle_status_s::VEHICLE_TYPE_FIXED_WING) { + matrix::Vector2f wind = get_wind(); + + const float wind_along_dir = wind.dot(direction_norm); + const float wind_across_dir = matrix::Vector2f(wind - direction_norm * wind_along_dir).norm(); + + // Note: use fminf so that we don't _rely_ on tailwind towards direction to make RTL more efficient + const float ground_speed = sqrtf(cruise_speed * cruise_speed - wind_across_dir * wind_across_dir) + fminf( + 0.f, wind_along_dir); + + cruise_speed = ground_speed; + } + + return cruise_speed; +} + +float RtlTimeEstimator::calcVertTimeEstimate(float alt) +{ + float vertical_rate{0.1f}; + float time_estimate{0.f}; + + if (alt > FLT_EPSILON) { + vertical_rate = getClimbRate(); + + } else { + vertical_rate = getDescendRate(); + } + + float abs_alt = fabsf(alt); + + if (abs_alt > FLT_EPSILON) { + time_estimate = abs_alt / vertical_rate; + } + + return time_estimate; +} + +float RtlTimeEstimator::getCruiseSpeed() +{ + float ret = 1e6f; + + if (_vehicle_status_sub.get().vehicle_type == vehicle_status_s::VEHICLE_TYPE_ROTARY_WING) { + if (_param_mpc_xy_cruise == PARAM_INVALID || param_get(_param_mpc_xy_cruise, &ret) != PX4_OK) { + ret = 1e6f; + } + + } else if (_vehicle_status_sub.get().vehicle_type == vehicle_status_s::VEHICLE_TYPE_FIXED_WING) { + if (_param_fw_airspeed_trim == PARAM_INVALID || param_get(_param_fw_airspeed_trim, &ret) != PX4_OK) { + ret = 1e6f; + } + + } else if (_vehicle_status_sub.get().vehicle_type == vehicle_status_s::VEHICLE_TYPE_ROVER) { + if (_param_rover_cruise_speed == PARAM_INVALID || param_get(_param_rover_cruise_speed, &ret) != PX4_OK) { + ret = 1e6f; + } + } + + return ret; +} + +float RtlTimeEstimator::getHoverLandSpeed() +{ + float ret = 1e6f; + + if (_param_mpc_land_speed == PARAM_INVALID || param_get(_param_mpc_land_speed, &ret) != PX4_OK) { + ret = 1e6f; + } + + return ret; +} + +matrix::Vector2f RtlTimeEstimator::get_wind() +{ + _wind_sub.update(); + matrix::Vector2f wind{}; + + if (hrt_absolute_time() - _wind_sub.get().timestamp < 1_s) { + wind(0) = _wind_sub.get().windspeed_north; + wind(1) = _wind_sub.get().windspeed_east; + } + + return wind; +} + +float RtlTimeEstimator::getClimbRate() +{ + float ret = 1e6f; + + if (_vehicle_status_sub.get().vehicle_type == vehicle_status_s::VEHICLE_TYPE_ROTARY_WING) { + if (_param_mpc_z_v_auto_up == PARAM_INVALID || param_get(_param_mpc_z_v_auto_up, &ret) != PX4_OK) { + ret = 1e6f; + } + + } else if (_vehicle_status_sub.get().vehicle_type == vehicle_status_s::VEHICLE_TYPE_FIXED_WING) { + + if (_param_fw_climb_rate == PARAM_INVALID || param_get(_param_fw_climb_rate, &ret) != PX4_OK) { + ret = 1e6f; + } + } + + return ret; +} + +float RtlTimeEstimator::getDescendRate() +{ + float ret = 1e6f; + + if (_vehicle_status_sub.get().vehicle_type == vehicle_status_s::VEHICLE_TYPE_ROTARY_WING) { + if (_param_mpc_z_v_auto_dn == PARAM_INVALID || param_get(_param_mpc_z_v_auto_dn, &ret) != PX4_OK) { + ret = 1e6f; + } + + } else if (_vehicle_status_sub.get().vehicle_type == vehicle_status_s::VEHICLE_TYPE_FIXED_WING) { + if (_param_fw_sink_rate == PARAM_INVALID || param_get(_param_fw_sink_rate, &ret) != PX4_OK) { + ret = 1e6f; + } + } + + return ret; +} diff --git a/src/lib/rtl/rtl_time_estimator.h b/src/lib/rtl/rtl_time_estimator.h new file mode 100644 index 000000000000..db0f8c234ea3 --- /dev/null +++ b/src/lib/rtl/rtl_time_estimator.h @@ -0,0 +1,146 @@ +/**************************************************************************** + * + * Copyright (C) 2024 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file rtl_time_estimator.h + * + * Helper class to calculate the remaining time estimate to go to RTL landing point. + * + */ + +#ifndef RTL_TIME_ESTIMATOR_H_ +#define RTL_TIME_ESTIMATOR_H_ + +#include + +#include +#include +#include +#include +#include +#include + +#include + +using namespace time_literals; + +class Navigator; + +class RtlTimeEstimator : public ModuleParams +{ +public: + RtlTimeEstimator(); + ~RtlTimeEstimator() = default; + + void update(); + void reset() { _time_estimate = 0.f; _is_valid = false;}; + rtl_time_estimate_s getEstimate() const; + void addDistance(float hor_dist, const matrix::Vector2f &hor_direction, float vert_dist); + void addVertDistance(float alt); + void addWait(float time_s); + void addDescendMCLand(float alt); + +private: + /** + * @brief Get the Cruise Ground Speed + * + * @param direction_norm normalized direction in which to fly + * @return Ground speed in cruise mode [m/s]. + */ + float getCruiseGroundSpeed(const matrix::Vector2f &direction_norm); + + /** + * @brief Get time estimate of vertical distance + * + */ + float calcVertTimeEstimate(float alt); + + /** + * @brief Get the climb rate + * + * @return Climb rate [m/s] + */ + float getClimbRate(); + + /** + * @brief Get the descend rate + * + * @return descend rate [m/s] + */ + float getDescendRate(); + + /** + * @brief Get the cruise speed + * + * @return cruise speed [m/s] + */ + float getCruiseSpeed(); + + /** + * @brief Get the Hover Land Speed + * + * @return Hover land speed [m/s] + */ + float getHoverLandSpeed(); + + /** + * @brief Get the horizontal wind velocity + * + * @return horizontal wind velocity. + */ + matrix::Vector2f get_wind(); + + float _time_estimate; /**< Accumulated time estimate [s] */ + bool _is_valid{false}; /**< Checks if time estimate is valid */ + + DEFINE_PARAMETERS( + (ParamFloat) _param_rtl_time_factor, /**< Safety factory for safe time estimate */ + (ParamInt) _param_rtl_time_margin /**< Safety margin for safe time estimate */ + ) + + param_t _param_mpc_z_v_auto_up{PARAM_INVALID}; /**< MC climb velocity parameter */ + param_t _param_mpc_z_v_auto_dn{PARAM_INVALID}; /**< MC descend velocity parameter */ + param_t _param_mpc_land_speed{PARAM_INVALID}; /**< MC land descend speed parameter */ + param_t _param_fw_climb_rate{PARAM_INVALID}; /**< FW climb speed parameter */ + param_t _param_fw_sink_rate{PARAM_INVALID}; /**< FW descend speed parameter */ + + param_t _param_fw_airspeed_trim{PARAM_INVALID}; /**< FW cruise airspeed parameter */ + param_t _param_mpc_xy_cruise{PARAM_INVALID}; /**< MC horizontal cruise speed parameter */ + param_t _param_rover_cruise_speed{PARAM_INVALID}; /**< Rover cruise speed parameter */ + + uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s}; /**< Parameter update topic */ + uORB::SubscriptionData _vehicle_status_sub{ORB_ID(vehicle_status)}; /**< vehicle status subscription */ + uORB::SubscriptionData _wind_sub{ORB_ID(wind)}; /**< wind topic */ +}; + +#endif /* RTL_TIME_ESTIMATOR_H_ */ diff --git a/src/lib/systemlib/mavlink_log.cpp b/src/lib/systemlib/mavlink_log.cpp index d31136f21530..94870af7ae12 100644 --- a/src/lib/systemlib/mavlink_log.cpp +++ b/src/lib/systemlib/mavlink_log.cpp @@ -73,6 +73,6 @@ __EXPORT void mavlink_vasprintf(int severity, orb_advert_t *mavlink_log_pub, con orb_publish(ORB_ID(mavlink_log), *mavlink_log_pub, &log_msg); } else { - *mavlink_log_pub = orb_advertise_queue(ORB_ID(mavlink_log), &log_msg, mavlink_log_s::ORB_QUEUE_LENGTH); + *mavlink_log_pub = orb_advertise(ORB_ID(mavlink_log), &log_msg); } } diff --git a/src/modules/commander/Commander.cpp b/src/modules/commander/Commander.cpp index f9fa07c257fe..444f5b0c8dba 100644 --- a/src/modules/commander/Commander.cpp +++ b/src/modules/commander/Commander.cpp @@ -598,6 +598,9 @@ transition_result_t Commander::arm(arm_disarm_reason_t calling_reason, bool run_ if (!_health_and_arming_checks.canArm(_vehicle_status.nav_state)) { tune_negative(true); + mavlink_log_critical(&_mavlink_log_pub, "Arming denied: Resolve system health failures first\t"); + events::send(events::ID("commander_arm_denied_resolve_failures"), {events::Log::Critical, events::LogInternal::Info}, + "Arming denied: Resolve system health failures first"); return TRANSITION_DENIED; } } @@ -2419,7 +2422,14 @@ void Commander::control_status_leds(bool changed, const uint8_t battery_warning) if (_cpuload_sub.copy(&cpuload)) { const float cpuload_percent = cpuload.load * 100.f; - bool overload = (cpuload_percent > _param_com_cpu_max.get()) || (cpuload.ram_usage > 0.99f); + bool overload = false; + + // Only check CPU load if it hasn't been disabled + if (!(_param_com_cpu_max.get() < FLT_EPSILON)) { + overload = (cpuload_percent > _param_com_cpu_max.get()); + } + + overload = overload || (cpuload.ram_usage > 0.99f); if (_overload_start == 0 && overload) { _overload_start = time_now_us; diff --git a/src/modules/commander/HealthAndArmingChecks/HealthAndArmingChecksTest.cpp b/src/modules/commander/HealthAndArmingChecks/HealthAndArmingChecksTest.cpp index bc919080bf56..912d3bb1293b 100644 --- a/src/modules/commander/HealthAndArmingChecks/HealthAndArmingChecksTest.cpp +++ b/src/modules/commander/HealthAndArmingChecks/HealthAndArmingChecksTest.cpp @@ -55,7 +55,7 @@ class ReporterTest : public ::testing::Test void SetUp() override { // ensure topic exists, otherwise we might lose first queued events - orb_advertise_queue(ORB_ID(event), nullptr, event_s::ORB_QUEUE_LENGTH); + orb_advertise(ORB_ID(event), nullptr); } }; diff --git a/src/modules/commander/HealthAndArmingChecks/checks/batteryCheck.cpp b/src/modules/commander/HealthAndArmingChecks/checks/batteryCheck.cpp index 460ed302ed7d..f13977199e7a 100644 --- a/src/modules/commander/HealthAndArmingChecks/checks/batteryCheck.cpp +++ b/src/modules/commander/HealthAndArmingChecks/checks/batteryCheck.cpp @@ -285,12 +285,16 @@ void BatteryChecks::rtlEstimateCheck(const Context &context, Report &reporter, f rtl_time_estimate_s rtl_time_estimate; // Compare estimate of RTL time to estimate of remaining flight time + // add hysterisis: if already in the condition, only get out of it if the remaining flight time is significantly higher again + const float hysteresis_factor = reporter.failsafeFlags().battery_low_remaining_time ? 1.1f : 1.0f; + reporter.failsafeFlags().battery_low_remaining_time = _rtl_time_estimate_sub.copy(&rtl_time_estimate) - && (hrt_absolute_time() - rtl_time_estimate.timestamp) < 2_s + && (hrt_absolute_time() - rtl_time_estimate.timestamp) < 3_s && rtl_time_estimate.valid && context.isArmed() && PX4_ISFINITE(worst_battery_time_s) - && rtl_time_estimate.safe_time_estimate >= worst_battery_time_s; + && rtl_time_estimate.safe_time_estimate * hysteresis_factor >= worst_battery_time_s; + if (reporter.failsafeFlags().battery_low_remaining_time) { /* EVENT diff --git a/src/modules/commander/HealthAndArmingChecks/checks/estimatorCheck.cpp b/src/modules/commander/HealthAndArmingChecks/checks/estimatorCheck.cpp index 9bb33f2bd24f..1cdd097b12aa 100644 --- a/src/modules/commander/HealthAndArmingChecks/checks/estimatorCheck.cpp +++ b/src/modules/commander/HealthAndArmingChecks/checks/estimatorCheck.cpp @@ -293,7 +293,9 @@ void EstimatorChecks::checkEstimatorStatus(const Context &context, Report &repor mavlink_log_warning(reporter.mavlink_log_pub(), "GNSS data fusion stopped\t"); } - events::send(events::ID("check_estimator_gnss_fusion_stopped"), {events::Log::Error, events::LogInternal::Info}, + // only report this failure as critical if not already in a local position invalid state + events::Log log_level = reporter.failsafeFlags().local_position_invalid ? events::Log::Info : events::Log::Error; + events::send(events::ID("check_estimator_gnss_fusion_stopped"), {log_level, events::LogInternal::Info}, "GNSS data fusion stopped"); } else if (!_gps_was_fused && ekf_gps_fusion) { diff --git a/src/modules/commander/commander_helper.cpp b/src/modules/commander/commander_helper.cpp index f642541fb74b..48c93982495a 100644 --- a/src/modules/commander/commander_helper.cpp +++ b/src/modules/commander/commander_helper.cpp @@ -153,7 +153,7 @@ int buzzer_init() tune_durations[tune_control_s::TUNE_ID_BATTERY_WARNING_SLOW] = 800000; tune_durations[tune_control_s::TUNE_ID_SINGLE_BEEP] = 300000; - tune_control_pub = orb_advertise_queue(ORB_ID(tune_control), &tune_control, tune_control_s::ORB_QUEUE_LENGTH); + tune_control_pub = orb_advertise(ORB_ID(tune_control), &tune_control); return PX4_OK; } @@ -330,7 +330,7 @@ int led_init() led_control.mode = led_control_s::MODE_OFF; led_control.priority = 0; led_control.timestamp = hrt_absolute_time(); - led_control_pub = orb_advertise_queue(ORB_ID(led_control), &led_control, led_control_s::ORB_QUEUE_LENGTH); + led_control_pub = orb_advertise(ORB_ID(led_control), &led_control); /* first open normal LEDs */ fd_leds = px4_open(LED0_DEVICE_PATH, O_RDWR); diff --git a/src/modules/commander/commander_params.c b/src/modules/commander/commander_params.c index e01b45276d5b..8f2c3d51ced0 100644 --- a/src/modules/commander/commander_params.c +++ b/src/modules/commander/commander_params.c @@ -1030,3 +1030,17 @@ PARAM_DEFINE_INT32(COM_THROW_EN, 0); * @unit m/s */ PARAM_DEFINE_FLOAT(COM_THROW_SPEED, 5); + +/** + * Remaining flight time low failsafe + * + * Action the system takes when the remaining flight time is below + * the estimated time it takes to reach the RTL destination. + * + * @group Commander + * @value 0 None + * @value 1 Warning + * @value 3 Return + * @increment 1 + */ +PARAM_DEFINE_INT32(COM_FLTT_LOW_ACT, 3); diff --git a/src/modules/commander/failsafe/failsafe.cpp b/src/modules/commander/failsafe/failsafe.cpp index 61cbff2beb39..9a9b1e7cad2c 100644 --- a/src/modules/commander/failsafe/failsafe.cpp +++ b/src/modules/commander/failsafe/failsafe.cpp @@ -365,6 +365,36 @@ FailsafeBase::ActionOptions Failsafe::fromHighWindLimitActParam(int param_value) return options; } +FailsafeBase::ActionOptions Failsafe::fromRemainingFlightTimeLowActParam(int param_value) +{ + ActionOptions options{}; + + options.allow_user_takeover = UserTakeoverAllowed::Auto; + options.cause = Cause::RemainingFlightTimeLow; + + switch (command_after_remaining_flight_time_low(param_value)) { + case command_after_remaining_flight_time_low::None: + options.action = Action::None; + break; + + case command_after_remaining_flight_time_low::Warning: + options.action = Action::Warn; + break; + + case command_after_remaining_flight_time_low::Return_mode: + options.action = Action::RTL; + options.clear_condition = ClearCondition::OnModeChangeOrDisarm; + break; + + default: + options.action = Action::None; + break; + + } + + return options; +} + void Failsafe::checkStateAndMode(const hrt_abstime &time_us, const State &state, const failsafe_flags_s &status_flags) { @@ -444,9 +474,10 @@ void Failsafe::checkStateAndMode(const hrt_abstime &time_us, const State &state, CHECK_FAILSAFE(status_flags, geofence_breached, fromGfActParam(_param_gf_action.get()).cannotBeDeferred()); - // Battery + // Battery flight time remaining failsafe + CHECK_FAILSAFE(status_flags, battery_low_remaining_time, - ActionOptions(Action::RTL).causedBy(Cause::BatteryLow).clearOn(ClearCondition::OnModeChangeOrDisarm)); + ActionOptions(fromRemainingFlightTimeLowActParam(_param_com_fltt_low_act.get()))); if ((_armed_time != 0) && (time_us < _armed_time + static_cast(_param_com_spoolup_time.get() * 1_s)) @@ -457,6 +488,7 @@ void Failsafe::checkStateAndMode(const hrt_abstime &time_us, const State &state, CHECK_FAILSAFE(status_flags, battery_unhealthy, Action::Warn); } + // Battery low failsafe switch (status_flags.battery_warning) { case battery_status_s::BATTERY_WARNING_LOW: _last_state_battery_warning_low = checkFailsafe(_caller_id_battery_warning_low, _last_state_battery_warning_low, diff --git a/src/modules/commander/failsafe/failsafe.h b/src/modules/commander/failsafe/failsafe.h index 26981eb75499..bb81dd02baeb 100644 --- a/src/modules/commander/failsafe/failsafe.h +++ b/src/modules/commander/failsafe/failsafe.h @@ -141,6 +141,12 @@ class Failsafe : public FailsafeBase Land_mode = 5 }; + enum class command_after_remaining_flight_time_low : int32_t { + None = 0, + Warning = 1, + Return_mode = 3 + }; + static ActionOptions fromNavDllOrRclActParam(int param_value); static ActionOptions fromGfActParam(int param_value); @@ -150,6 +156,7 @@ class Failsafe : public FailsafeBase static ActionOptions fromQuadchuteActParam(int param_value); static Action fromOffboardLossActParam(int param_value, uint8_t &user_intended_mode); static ActionOptions fromHighWindLimitActParam(int param_value); + static ActionOptions fromRemainingFlightTimeLowActParam(int param_value); const int _caller_id_mode_fallback{genCallerId()}; bool _last_state_mode_fallback{false}; @@ -182,7 +189,8 @@ class Failsafe : public FailsafeBase (ParamInt) _param_com_low_bat_act, (ParamInt) _param_com_obl_rc_act, (ParamInt) _param_com_qc_act, - (ParamInt) _param_com_wind_max_act + (ParamInt) _param_com_wind_max_act, + (ParamInt) _param_com_fltt_low_act ); }; diff --git a/src/modules/commander/failsafe/framework.cpp b/src/modules/commander/failsafe/framework.cpp index 88123548a76d..16a3678d81b5 100644 --- a/src/modules/commander/failsafe/framework.cpp +++ b/src/modules/commander/failsafe/framework.cpp @@ -195,7 +195,7 @@ void FailsafeBase::notifyUser(uint8_t user_intended_mode, Action action, Action events::send( events::ID("commander_failsafe_enter_generic_hold"), {events::Log::Critical, events::LogInternal::Warning}, - "Failsafe activated, triggering {2} in {3} seconds", mavlink_mode, failsafe_action, + "Failsafe, triggering {2} in {3} seconds", mavlink_mode, failsafe_action, (uint16_t) delay_s); } else { @@ -204,7 +204,7 @@ void FailsafeBase::notifyUser(uint8_t user_intended_mode, Action action, Action events::send( events::ID("commander_failsafe_enter_hold"), {events::Log::Critical, events::LogInternal::Warning}, - "Failsafe activated due to {4}, triggering {2} in {3} seconds", mavlink_mode, failsafe_action, + "{4}, triggering {2} in {3} seconds", mavlink_mode, failsafe_action, (uint16_t) delay_s, failsafe_cause); } @@ -231,7 +231,7 @@ void FailsafeBase::notifyUser(uint8_t user_intended_mode, Action action, Action events::send( events::ID("commander_failsafe_enter_generic"), {events::Log::Critical, events::LogInternal::Warning}, - "Failsafe activated, triggering {2}", mavlink_mode, failsafe_action); + "Failsafe, triggering {2}", mavlink_mode, failsafe_action); } } else { @@ -250,6 +250,11 @@ void FailsafeBase::notifyUser(uint8_t user_intended_mode, Action action, Action events::send(events::ID("commander_failsafe_enter_crit_low_bat_warn"), {events::Log::Emergency, events::LogInternal::Info}, "Emergency battery level, land immediately"); + } else if (cause == Cause::RemainingFlightTimeLow) { + events::send(events::ID("commander_failsafe_enter_low_flight_time_warn"), + {events::Log::Warning, events::LogInternal::Info}, + "Low remaining flight time, return advised"); + } else { /* EVENT * @description No action is triggered. @@ -267,7 +272,7 @@ void FailsafeBase::notifyUser(uint8_t user_intended_mode, Action action, Action events::send( events::ID("commander_failsafe_enter"), {events::Log::Critical, events::LogInternal::Warning}, - "Failsafe activated due to {3}, triggering {2}", mavlink_mode, failsafe_action, failsafe_cause); + "{3}, triggering {2}", mavlink_mode, failsafe_action, failsafe_cause); } } @@ -512,6 +517,8 @@ void FailsafeBase::getSelectedAction(const State &state, const failsafe_flags_s break; } + returned_state.cause = Cause::Generic; + // fallthrough case Action::FallbackAltCtrl: if (modeCanRun(status_flags, vehicle_status_s::NAVIGATION_STATE_ALTCTL)) { @@ -519,6 +526,8 @@ void FailsafeBase::getSelectedAction(const State &state, const failsafe_flags_s break; } + returned_state.cause = Cause::Generic; + // fallthrough case Action::FallbackStab: if (modeCanRun(status_flags, vehicle_status_s::NAVIGATION_STATE_STAB)) { @@ -526,6 +535,8 @@ void FailsafeBase::getSelectedAction(const State &state, const failsafe_flags_s break; } // else: fall through here as well. If stabilized isn't available, we most certainly end up in Terminate + returned_state.cause = Cause::Generic; + // fallthrough case Action::Hold: if (modeCanRun(status_flags, vehicle_status_s::NAVIGATION_STATE_AUTO_LOITER)) { @@ -533,6 +544,8 @@ void FailsafeBase::getSelectedAction(const State &state, const failsafe_flags_s break; } + returned_state.cause = Cause::Generic; + // fallthrough case Action::RTL: if (modeCanRun(status_flags, vehicle_status_s::NAVIGATION_STATE_AUTO_RTL)) { @@ -540,6 +553,8 @@ void FailsafeBase::getSelectedAction(const State &state, const failsafe_flags_s break; } + returned_state.cause = Cause::Generic; + // fallthrough case Action::Land: if (modeCanRun(status_flags, vehicle_status_s::NAVIGATION_STATE_AUTO_LAND)) { @@ -547,6 +562,8 @@ void FailsafeBase::getSelectedAction(const State &state, const failsafe_flags_s break; } + returned_state.cause = Cause::Generic; + // fallthrough case Action::Descend: if (modeCanRun(status_flags, vehicle_status_s::NAVIGATION_STATE_DESCEND)) { @@ -554,6 +571,8 @@ void FailsafeBase::getSelectedAction(const State &state, const failsafe_flags_s break; } + returned_state.cause = Cause::Generic; + // fallthrough case Action::Terminate: selected_action = Action::Terminate; diff --git a/src/modules/commander/failsafe/framework.h b/src/modules/commander/failsafe/framework.h index 2d7b36ee7a59..9f989582f7ce 100644 --- a/src/modules/commander/failsafe/framework.h +++ b/src/modules/commander/failsafe/framework.h @@ -83,6 +83,7 @@ class FailsafeBase: public ModuleParams BatteryLow, BatteryCritical, BatteryEmergency, + RemainingFlightTimeLow, Count }; @@ -146,7 +147,7 @@ class FailsafeBase: public ModuleParams bool rc_sticks_takeover_request, const failsafe_flags_s &status_flags); - bool inFailsafe() const { return _selected_action != Action::None; } + bool inFailsafe() const { return (_selected_action != Action::None && _selected_action != Action::Warn); } Action selectedAction() const { return _selected_action; } diff --git a/src/modules/commander/mag_calibration.cpp b/src/modules/commander/mag_calibration.cpp index 3fff697d4940..02ab015e0f17 100644 --- a/src/modules/commander/mag_calibration.cpp +++ b/src/modules/commander/mag_calibration.cpp @@ -1006,8 +1006,8 @@ int do_mag_calibration_quick(orb_advert_t *mavlink_log_pub, float heading_radian return PX4_ERROR; } - calibration_log_critical(mavlink_log_pub, "Assuming vehicle is facing heading %.1f degrees", - (double)math::radians(heading_radians)); + calibration_log_info(mavlink_log_pub, "Assuming vehicle is facing heading %.1f degrees", + (double)math::degrees(heading_radians)); matrix::Eulerf euler{matrix::Quatf{attitude.q}}; euler(2) = heading_radians; diff --git a/src/modules/ekf2/EKF/EKFGSF_yaw.h b/src/modules/ekf2/EKF/EKFGSF_yaw.h index 3719aec7cebd..7add1dedef7a 100644 --- a/src/modules/ekf2/EKF/EKFGSF_yaw.h +++ b/src/modules/ekf2/EKF/EKFGSF_yaw.h @@ -67,11 +67,11 @@ class EKFGSF_yaw void setTrueAirspeed(float true_airspeed) { _true_airspeed = true_airspeed; } - void setGyroBias(const Vector3f &imu_gyro_bias) + void setGyroBias(const Vector3f &imu_gyro_bias, const bool force = false) { // Initialise to gyro bias estimate from main filter because there could be a large // uncorrected rate gyro bias error about the gravity vector - if (!_ahrs_ekf_gsf_tilt_aligned || !_ekf_gsf_vel_fuse_started) { + if (!_ahrs_ekf_gsf_tilt_aligned || !_ekf_gsf_vel_fuse_started || force) { // init gyro bias for each model for (uint8_t model_index = 0; model_index < N_MODELS_EKFGSF; model_index++) { _ahrs_ekf_gsf[model_index].gyro_bias = imu_gyro_bias; diff --git a/src/modules/ekf2/EKF/covariance.cpp b/src/modules/ekf2/EKF/covariance.cpp index b1a4fff58df0..c6ba03f25622 100644 --- a/src/modules/ekf2/EKF/covariance.cpp +++ b/src/modules/ekf2/EKF/covariance.cpp @@ -166,11 +166,21 @@ void Ekf::predictCovariance(const imuSample &imu_delayed) if (_control_status.flags.mag) { // mag_I: add process noise float mag_I_sig = dt * math::constrain(_params.mage_p_noise, 0.f, 1.f); - P.slice(State::mag_I.idx, 0) += sq(mag_I_sig); + float mag_I_process_noise = sq(mag_I_sig); + + for (unsigned index = 0; index < State::mag_I.dof; index++) { + const unsigned i = State::mag_I.idx + index; + P(i, i) += mag_I_process_noise; + } // mag_B: add process noise float mag_B_sig = dt * math::constrain(_params.magb_p_noise, 0.f, 1.f); - P.slice(State::mag_B.idx, 0) += sq(mag_B_sig); + float mag_B_process_noise = sq(mag_B_sig); + + for (unsigned index = 0; index < State::mag_B.dof; index++) { + const unsigned i = State::mag_B.idx + index; + P(i, i) += mag_B_process_noise; + } } #endif // CONFIG_EKF2_MAGNETOMETER @@ -179,7 +189,12 @@ void Ekf::predictCovariance(const imuSample &imu_delayed) if (_control_status.flags.wind) { // wind vel: add process noise float wind_vel_nsd_scaled = math::constrain(_params.wind_vel_nsd, 0.f, 1.f) * (1.f + _params.wind_vel_nsd_scaler * fabsf(_height_rate_lpf)); - P.slice(State::wind_vel.idx, 0) += sq(wind_vel_nsd_scaled) * dt; + float wind_vel_process_noise = sq(wind_vel_nsd_scaled) * dt; + + for (unsigned index = 0; index < State::wind_vel.dof; index++) { + const unsigned i = State::wind_vel.idx + index; + P(i, i) += wind_vel_process_noise; + } } #endif // CONFIG_EKF2_WIND diff --git a/src/modules/ekf2/EKF/ekf.h b/src/modules/ekf2/EKF/ekf.h index 11b98f4173e6..bc087558e9eb 100644 --- a/src/modules/ekf2/EKF/ekf.h +++ b/src/modules/ekf2/EKF/ekf.h @@ -472,29 +472,44 @@ class Ekf final : public EstimatorInterface { clearInhibitedStateKalmanGains(K); +#if false + // Matrix implementation of the Joseph stabilized covariance update + // This is extremely expensive to compute. Use for debugging purposes only. + auto A = matrix::eye(); + A -= K.multiplyByTranspose(H); + P = A * P; + P = P.multiplyByTranspose(A); + + const VectorState KR = K * R; + P += KR.multiplyByTranspose(K); +#else // Efficient implementation of the Joseph stabilized covariance update // Based on "G. J. Bierman. Factorization Methods for Discrete Sequential Estimation. Academic Press, Dover Publications, New York, 1977, 2006" + // P = (I - K * H) * P * (I - K * H).T + K * R * K.T + // = P_temp * (I - H.T * K.T) + K * R * K.T + // = P_temp - P_temp * H.T * K.T + K * R * K.T // Step 1: conventional update - VectorState PH = P * H; + // Compute P_temp and store it in P to avoid allocating more memory + // P is symmetric, so PH == H.T * P.T == H.T * P. Taking the row is faster as matrices are row-major + VectorState PH = P * H; // H is stored as a column vector. H is in fact H.T for (unsigned i = 0; i < State::size; i++) { - for (unsigned j = 0; j <= i; j++) { - P(i, j) = P(i, j) - K(i) * PH(j); - P(j, i) = P(i, j); + for (unsigned j = 0; j < State::size; j++) { + P(i, j) -= K(i) * PH(j); // P is now not symmetrical if K is not optimal (e.g.: some gains have been zeroed) } } // Step 2: stabilized update - PH = P * H; + PH = P * H; // H is stored as a column vector. H is in fact H.T for (unsigned i = 0; i < State::size; i++) { for (unsigned j = 0; j <= i; j++) { - float s = .5f * (P(i, j) - PH(i) * K(j) + P(i, j) - PH(j) * K(i)); - P(i, j) = s + K(i) * R * K(j); + P(i, j) = P(i, j) - PH(i) * K(j) + K(i) * R * K(j); P(j, i) = P(i, j); } } +#endif constrainStateVariances(); diff --git a/src/modules/ekf2/EKF/ekf_helper.cpp b/src/modules/ekf2/EKF/ekf_helper.cpp index 3a030cf63222..bb9e901f5760 100644 --- a/src/modules/ekf2/EKF/ekf_helper.cpp +++ b/src/modules/ekf2/EKF/ekf_helper.cpp @@ -850,29 +850,47 @@ bool Ekf::fuseDirectStateMeasurement(const float innov, const float innov_var, c clearInhibitedStateKalmanGains(K); +#if false + // Matrix implementation of the Joseph stabilized covariance update + // This is extremely expensive to compute. Use for debugging purposes only. + auto A = matrix::eye(); + VectorState H; + H(state_index) = 1.f; + A -= K.multiplyByTranspose(H); + P = A * P; + P = P.multiplyByTranspose(A); + + const VectorState KR = K * R; + P += KR.multiplyByTranspose(K); +#else // Efficient implementation of the Joseph stabilized covariance update // Based on "G. J. Bierman. Factorization Methods for Discrete Sequential Estimation. Academic Press, Dover Publications, New York, 1977, 2006" + // P = (I - K * H) * P * (I - K * H).T + K * R * K.T + // = P_temp * (I - H.T * K.T) + K * R * K.T + // = P_temp - P_temp * H.T * K.T + K * R * K.T // Step 1: conventional update + // Compute P_temp and store it in P to avoid allocating more memory + // P is symmetric, so PH == H.T * P.T == H.T * P. Taking the row is faster as matrices are row-major VectorState PH = P.row(state_index); for (unsigned i = 0; i < State::size; i++) { - for (unsigned j = 0; j <= i; j++) { - P(i, j) = P(i, j) - K(i) * PH(j); - P(j, i) = P(i, j); + for (unsigned j = 0; j < State::size; j++) { + P(i, j) -= K(i) * PH(j); // P is now not symmetric if K is not optimal (e.g.: some gains have been zeroed) } } // Step 2: stabilized update - PH = P.row(state_index); + // P (or "P_temp") is not symmetric so we must take the column + PH = P.col(state_index); for (unsigned i = 0; i < State::size; i++) { for (unsigned j = 0; j <= i; j++) { - float s = .5f * (P(i, j) - PH(i) * K(j) + P(i, j) - PH(j) * K(i)); - P(i, j) = s + K(i) * R * K(j); + P(i, j) = P(i, j) - PH(i) * K(j) + K(i) * R * K(j); P(j, i) = P(i, j); } } +#endif constrainStateVariances(); diff --git a/src/modules/ekf2/EKF/gps_control.cpp b/src/modules/ekf2/EKF/gps_control.cpp index d86020815a8b..03cf0a326f28 100644 --- a/src/modules/ekf2/EKF/gps_control.cpp +++ b/src/modules/ekf2/EKF/gps_control.cpp @@ -47,7 +47,7 @@ void Ekf::controlGpsFusion(const imuSample &imu_delayed) } if (!gyro_bias_inhibited()) { - _yawEstimator.setGyroBias(getGyroBias()); + _yawEstimator.setGyroBias(getGyroBias(), _control_status.flags.vehicle_at_rest); } // run EKF-GSF yaw estimator once per imu_delayed update @@ -246,7 +246,7 @@ bool Ekf::tryYawEmergencyReset() bool success = false; /* A rapid reset to the yaw emergency estimate is performed if horizontal velocity innovation checks continuously - * fails while the difference between the yaw emergency estimator and the yas estimate is large. + * fails while the difference between the yaw emergency estimator and the yaw estimate is large. * This enables recovery from a bad yaw estimate. A reset is not performed if the fault condition was * present before flight to prevent triggering due to GPS glitches or other sensor errors. */ diff --git a/src/modules/ekf2/EKF/python/ekf_derivation/derivation.py b/src/modules/ekf2/EKF/python/ekf_derivation/derivation.py index 7e99388fce91..5cbe1a127f3b 100755 --- a/src/modules/ekf2/EKF/python/ekf_derivation/derivation.py +++ b/src/modules/ekf2/EKF/python/ekf_derivation/derivation.py @@ -390,70 +390,20 @@ def compute_mag_z_innov_var_and_h( return (innov_var, H.T) -def compute_yaw_321_innov_var_and_h( +def compute_yaw_innov_var_and_h( state: VState, P: MTangent, - R: sf.Scalar, - epsilon: sf.Scalar -) -> (sf.Scalar, VTangent): - - state = vstate_to_state(state) - R_to_earth = state["quat_nominal"].to_rotation_matrix() - # Fix the singularity at pi/2 by inserting epsilon - meas_pred = sf.atan2(R_to_earth[1,0], R_to_earth[0,0], epsilon=epsilon) - - H = sf.V1(meas_pred).jacobian(state) - innov_var = (H * P * H.T + R)[0,0] - - return (innov_var, H.T) - -def compute_yaw_321_innov_var_and_h_alternate( - state: VState, - P: MTangent, - R: sf.Scalar, - epsilon: sf.Scalar -) -> (sf.Scalar, VTangent): - - state = vstate_to_state(state) - R_to_earth = state["quat_nominal"].to_rotation_matrix() - # Alternate form that has a singularity at yaw 0 instead of pi/2 - meas_pred = sf.pi/2 - sf.atan2(R_to_earth[0,0], R_to_earth[1,0], epsilon=epsilon) - - H = sf.V1(meas_pred).jacobian(state) - innov_var = (H * P * H.T + R)[0,0] - - return (innov_var, H.T) - -def compute_yaw_312_innov_var_and_h( - state: VState, - P: MTangent, - R: sf.Scalar, - epsilon: sf.Scalar -) -> (sf.Scalar, VTangent): - - state = vstate_to_state(state) - R_to_earth = state["quat_nominal"].to_rotation_matrix() - # Alternate form to be used when close to pitch +-pi/2 - meas_pred = sf.atan2(-R_to_earth[0,1], R_to_earth[1,1], epsilon=epsilon) - - H = sf.V1(meas_pred).jacobian(state) - innov_var = (H * P * H.T + R)[0,0] - - return (innov_var, H.T) - -def compute_yaw_312_innov_var_and_h_alternate( - state: VState, - P: MTangent, - R: sf.Scalar, - epsilon: sf.Scalar + R: sf.Scalar ) -> (sf.Scalar, VTangent): state = vstate_to_state(state) - R_to_earth = state["quat_nominal"].to_rotation_matrix() - # Alternate form to be used when close to pitch +-pi/2 - meas_pred = sf.pi/2 - sf.atan2(-R_to_earth[1,1], R_to_earth[0,1], epsilon=epsilon) + q = sf.Quaternion.from_storage(state["quat_nominal"].to_storage()) + r = sf.Quaternion.symbolic('r') + delta_q = q * r.conj() # create a quaternion error of the measurement at the origin + delta_meas_pred = 2 * delta_q.z # Use small angle approximation to obtain a simpler jacobian - H = sf.V1(meas_pred).jacobian(state) + H = sf.V1(delta_meas_pred).jacobian(state) + H = H.subs({r.w: q.w, r.x: q.x, r.y: q.y, r.z: q.z}) # assume innovation is small innov_var = (H * P * H.T + R)[0,0] return (innov_var, H.T) @@ -678,10 +628,7 @@ def compute_gravity_z_innov_var_and_h( generate_px4_function(compute_sideslip_innov_and_innov_var, output_names=["innov", "innov_var"]) generate_px4_function(compute_wind_init_and_cov_from_airspeed, output_names=["wind", "P_wind"]) -generate_px4_function(compute_yaw_312_innov_var_and_h, output_names=["innov_var", "H"]) -generate_px4_function(compute_yaw_312_innov_var_and_h_alternate, output_names=["innov_var", "H"]) -generate_px4_function(compute_yaw_321_innov_var_and_h, output_names=["innov_var", "H"]) -generate_px4_function(compute_yaw_321_innov_var_and_h_alternate, output_names=["innov_var", "H"]) +generate_px4_function(compute_yaw_innov_var_and_h, output_names=["innov_var", "H"]) generate_px4_function(compute_flow_xy_innov_var_and_hx, output_names=["innov_var", "H"]) generate_px4_function(compute_flow_y_innov_var_and_h, output_names=["innov_var", "H"]) generate_px4_function(compute_gnss_yaw_pred_innov_var_and_h, output_names=["meas_pred", "innov_var", "H"]) diff --git a/src/modules/ekf2/EKF/python/ekf_derivation/generated/compute_yaw_312_innov_var_and_h.h b/src/modules/ekf2/EKF/python/ekf_derivation/generated/compute_yaw_312_innov_var_and_h.h deleted file mode 100644 index e6fd32157ef7..000000000000 --- a/src/modules/ekf2/EKF/python/ekf_derivation/generated/compute_yaw_312_innov_var_and_h.h +++ /dev/null @@ -1,76 +0,0 @@ -// ----------------------------------------------------------------------------- -// This file was autogenerated by symforce from template: -// function/FUNCTION.h.jinja -// Do NOT modify by hand. -// ----------------------------------------------------------------------------- - -#pragma once - -#include - -namespace sym { - -/** - * This function was autogenerated from a symbolic function. Do not modify by hand. - * - * Symbolic function: compute_yaw_312_innov_var_and_h - * - * Args: - * state: Matrix24_1 - * P: Matrix23_23 - * R: Scalar - * epsilon: Scalar - * - * Outputs: - * innov_var: Scalar - * H: Matrix23_1 - */ -template -void ComputeYaw312InnovVarAndH(const matrix::Matrix& state, - const matrix::Matrix& P, const Scalar R, - const Scalar epsilon, Scalar* const innov_var = nullptr, - matrix::Matrix* const H = nullptr) { - // Total ops: 53 - - // Input arrays - - // Intermediate terms (15) - const Scalar _tmp0 = 2 * state(0, 0); - const Scalar _tmp1 = -_tmp0 * state(3, 0); - const Scalar _tmp2 = 2 * state(1, 0); - const Scalar _tmp3 = _tmp2 * state(2, 0); - const Scalar _tmp4 = _tmp1 + _tmp3; - const Scalar _tmp5 = std::pow(state(3, 0), Scalar(2)); - const Scalar _tmp6 = std::pow(state(1, 0), Scalar(2)); - const Scalar _tmp7 = -2 * _tmp5 - 2 * _tmp6 + 1; - const Scalar _tmp8 = _tmp7 + epsilon * ((((_tmp7) > 0) - ((_tmp7) < 0)) + Scalar(0.5)); - const Scalar _tmp9 = std::pow(_tmp8, Scalar(2)); - const Scalar _tmp10 = _tmp4 / _tmp9; - const Scalar _tmp11 = Scalar(1.0) / (_tmp8); - const Scalar _tmp12 = _tmp9 / (std::pow(_tmp4, Scalar(2)) + _tmp9); - const Scalar _tmp13 = _tmp12 * (_tmp10 * (_tmp1 - _tmp3) - - _tmp11 * (_tmp5 - _tmp6 - std::pow(state(0, 0), Scalar(2)) + - std::pow(state(2, 0), Scalar(2)))); - const Scalar _tmp14 = _tmp12 * (_tmp10 * (-_tmp2 * state(0, 0) + 2 * state(2, 0) * state(3, 0)) - - _tmp11 * (_tmp0 * state(2, 0) + _tmp2 * state(3, 0))); - - // Output terms (2) - if (innov_var != nullptr) { - Scalar& _innov_var = (*innov_var); - - _innov_var = R + _tmp13 * (P(0, 2) * _tmp14 + P(2, 2) * _tmp13) + - _tmp14 * (P(0, 0) * _tmp14 + P(2, 0) * _tmp13); - } - - if (H != nullptr) { - matrix::Matrix& _h = (*H); - - _h.setZero(); - - _h(0, 0) = _tmp14; - _h(2, 0) = _tmp13; - } -} // NOLINT(readability/fn_size) - -// NOLINTNEXTLINE(readability/fn_size) -} // namespace sym diff --git a/src/modules/ekf2/EKF/python/ekf_derivation/generated/compute_yaw_312_innov_var_and_h_alternate.h b/src/modules/ekf2/EKF/python/ekf_derivation/generated/compute_yaw_312_innov_var_and_h_alternate.h deleted file mode 100644 index 07fd1091819a..000000000000 --- a/src/modules/ekf2/EKF/python/ekf_derivation/generated/compute_yaw_312_innov_var_and_h_alternate.h +++ /dev/null @@ -1,76 +0,0 @@ -// ----------------------------------------------------------------------------- -// This file was autogenerated by symforce from template: -// function/FUNCTION.h.jinja -// Do NOT modify by hand. -// ----------------------------------------------------------------------------- - -#pragma once - -#include - -namespace sym { - -/** - * This function was autogenerated from a symbolic function. Do not modify by hand. - * - * Symbolic function: compute_yaw_312_innov_var_and_h_alternate - * - * Args: - * state: Matrix24_1 - * P: Matrix23_23 - * R: Scalar - * epsilon: Scalar - * - * Outputs: - * innov_var: Scalar - * H: Matrix23_1 - */ -template -void ComputeYaw312InnovVarAndHAlternate(const matrix::Matrix& state, - const matrix::Matrix& P, const Scalar R, - const Scalar epsilon, Scalar* const innov_var = nullptr, - matrix::Matrix* const H = nullptr) { - // Total ops: 57 - - // Input arrays - - // Intermediate terms (15) - const Scalar _tmp0 = 2 * state(0, 0); - const Scalar _tmp1 = 2 * state(1, 0); - const Scalar _tmp2 = std::pow(state(3, 0), Scalar(2)); - const Scalar _tmp3 = std::pow(state(1, 0), Scalar(2)); - const Scalar _tmp4 = -2 * _tmp2 - 2 * _tmp3 + 1; - const Scalar _tmp5 = -_tmp0 * state(3, 0); - const Scalar _tmp6 = _tmp1 * state(2, 0); - const Scalar _tmp7 = _tmp5 + _tmp6; - const Scalar _tmp8 = _tmp7 + epsilon * ((((_tmp7) > 0) - ((_tmp7) < 0)) + Scalar(0.5)); - const Scalar _tmp9 = std::pow(_tmp8, Scalar(2)); - const Scalar _tmp10 = _tmp4 / _tmp9; - const Scalar _tmp11 = Scalar(1.0) / (_tmp8); - const Scalar _tmp12 = _tmp9 / (std::pow(_tmp4, Scalar(2)) + _tmp9); - const Scalar _tmp13 = _tmp12 * (_tmp10 * (_tmp0 * state(2, 0) + _tmp1 * state(3, 0)) - - _tmp11 * (-_tmp1 * state(0, 0) + 2 * state(2, 0) * state(3, 0))); - const Scalar _tmp14 = _tmp12 * (_tmp10 * (_tmp2 - _tmp3 - std::pow(state(0, 0), Scalar(2)) + - std::pow(state(2, 0), Scalar(2))) - - _tmp11 * (_tmp5 - _tmp6)); - - // Output terms (2) - if (innov_var != nullptr) { - Scalar& _innov_var = (*innov_var); - - _innov_var = R - _tmp13 * (-P(0, 0) * _tmp13 - P(2, 0) * _tmp14) - - _tmp14 * (-P(0, 2) * _tmp13 - P(2, 2) * _tmp14); - } - - if (H != nullptr) { - matrix::Matrix& _h = (*H); - - _h.setZero(); - - _h(0, 0) = -_tmp13; - _h(2, 0) = -_tmp14; - } -} // NOLINT(readability/fn_size) - -// NOLINTNEXTLINE(readability/fn_size) -} // namespace sym diff --git a/src/modules/ekf2/EKF/python/ekf_derivation/generated/compute_yaw_321_innov_var_and_h.h b/src/modules/ekf2/EKF/python/ekf_derivation/generated/compute_yaw_321_innov_var_and_h.h deleted file mode 100644 index 3677dbac87c3..000000000000 --- a/src/modules/ekf2/EKF/python/ekf_derivation/generated/compute_yaw_321_innov_var_and_h.h +++ /dev/null @@ -1,76 +0,0 @@ -// ----------------------------------------------------------------------------- -// This file was autogenerated by symforce from template: -// function/FUNCTION.h.jinja -// Do NOT modify by hand. -// ----------------------------------------------------------------------------- - -#pragma once - -#include - -namespace sym { - -/** - * This function was autogenerated from a symbolic function. Do not modify by hand. - * - * Symbolic function: compute_yaw_321_innov_var_and_h - * - * Args: - * state: Matrix24_1 - * P: Matrix23_23 - * R: Scalar - * epsilon: Scalar - * - * Outputs: - * innov_var: Scalar - * H: Matrix23_1 - */ -template -void ComputeYaw321InnovVarAndH(const matrix::Matrix& state, - const matrix::Matrix& P, const Scalar R, - const Scalar epsilon, Scalar* const innov_var = nullptr, - matrix::Matrix* const H = nullptr) { - // Total ops: 53 - - // Input arrays - - // Intermediate terms (15) - const Scalar _tmp0 = 2 * state(0, 0); - const Scalar _tmp1 = _tmp0 * state(3, 0); - const Scalar _tmp2 = 2 * state(1, 0); - const Scalar _tmp3 = _tmp2 * state(2, 0); - const Scalar _tmp4 = _tmp1 + _tmp3; - const Scalar _tmp5 = std::pow(state(3, 0), Scalar(2)); - const Scalar _tmp6 = std::pow(state(2, 0), Scalar(2)); - const Scalar _tmp7 = -2 * _tmp5 - 2 * _tmp6 + 1; - const Scalar _tmp8 = _tmp7 + epsilon * ((((_tmp7) > 0) - ((_tmp7) < 0)) + Scalar(0.5)); - const Scalar _tmp9 = std::pow(_tmp8, Scalar(2)); - const Scalar _tmp10 = _tmp4 / _tmp9; - const Scalar _tmp11 = Scalar(1.0) / (_tmp8); - const Scalar _tmp12 = _tmp9 / (std::pow(_tmp4, Scalar(2)) + _tmp9); - const Scalar _tmp13 = _tmp12 * (-_tmp10 * (-_tmp1 + _tmp3) + - _tmp11 * (-_tmp5 + _tmp6 + std::pow(state(0, 0), Scalar(2)) - - std::pow(state(1, 0), Scalar(2)))); - const Scalar _tmp14 = _tmp12 * (-_tmp10 * (-_tmp0 * state(2, 0) - _tmp2 * state(3, 0)) + - _tmp11 * (_tmp2 * state(0, 0) - 2 * state(2, 0) * state(3, 0))); - - // Output terms (2) - if (innov_var != nullptr) { - Scalar& _innov_var = (*innov_var); - - _innov_var = R + _tmp13 * (P(1, 2) * _tmp14 + P(2, 2) * _tmp13) + - _tmp14 * (P(1, 1) * _tmp14 + P(2, 1) * _tmp13); - } - - if (H != nullptr) { - matrix::Matrix& _h = (*H); - - _h.setZero(); - - _h(1, 0) = _tmp14; - _h(2, 0) = _tmp13; - } -} // NOLINT(readability/fn_size) - -// NOLINTNEXTLINE(readability/fn_size) -} // namespace sym diff --git a/src/modules/ekf2/EKF/python/ekf_derivation/generated/compute_yaw_321_innov_var_and_h_alternate.h b/src/modules/ekf2/EKF/python/ekf_derivation/generated/compute_yaw_321_innov_var_and_h_alternate.h deleted file mode 100644 index 3f1876623740..000000000000 --- a/src/modules/ekf2/EKF/python/ekf_derivation/generated/compute_yaw_321_innov_var_and_h_alternate.h +++ /dev/null @@ -1,76 +0,0 @@ -// ----------------------------------------------------------------------------- -// This file was autogenerated by symforce from template: -// function/FUNCTION.h.jinja -// Do NOT modify by hand. -// ----------------------------------------------------------------------------- - -#pragma once - -#include - -namespace sym { - -/** - * This function was autogenerated from a symbolic function. Do not modify by hand. - * - * Symbolic function: compute_yaw_321_innov_var_and_h_alternate - * - * Args: - * state: Matrix24_1 - * P: Matrix23_23 - * R: Scalar - * epsilon: Scalar - * - * Outputs: - * innov_var: Scalar - * H: Matrix23_1 - */ -template -void ComputeYaw321InnovVarAndHAlternate(const matrix::Matrix& state, - const matrix::Matrix& P, const Scalar R, - const Scalar epsilon, Scalar* const innov_var = nullptr, - matrix::Matrix* const H = nullptr) { - // Total ops: 57 - - // Input arrays - - // Intermediate terms (15) - const Scalar _tmp0 = 2 * state(2, 0); - const Scalar _tmp1 = 2 * state(1, 0); - const Scalar _tmp2 = 2 * state(0, 0) * state(3, 0); - const Scalar _tmp3 = _tmp1 * state(2, 0); - const Scalar _tmp4 = _tmp2 + _tmp3; - const Scalar _tmp5 = _tmp4 + epsilon * ((((_tmp4) > 0) - ((_tmp4) < 0)) + Scalar(0.5)); - const Scalar _tmp6 = Scalar(1.0) / (_tmp5); - const Scalar _tmp7 = std::pow(state(3, 0), Scalar(2)); - const Scalar _tmp8 = std::pow(state(2, 0), Scalar(2)); - const Scalar _tmp9 = -2 * _tmp7 - 2 * _tmp8 + 1; - const Scalar _tmp10 = std::pow(_tmp5, Scalar(2)); - const Scalar _tmp11 = _tmp9 / _tmp10; - const Scalar _tmp12 = _tmp10 / (_tmp10 + std::pow(_tmp9, Scalar(2))); - const Scalar _tmp13 = _tmp12 * (-_tmp11 * (-_tmp0 * state(3, 0) + _tmp1 * state(0, 0)) + - _tmp6 * (-_tmp0 * state(0, 0) - _tmp1 * state(3, 0))); - const Scalar _tmp14 = _tmp12 * (-_tmp11 * (-_tmp7 + _tmp8 + std::pow(state(0, 0), Scalar(2)) - - std::pow(state(1, 0), Scalar(2))) + - _tmp6 * (-_tmp2 + _tmp3)); - - // Output terms (2) - if (innov_var != nullptr) { - Scalar& _innov_var = (*innov_var); - - _innov_var = R - _tmp13 * (-P(1, 1) * _tmp13 - P(2, 1) * _tmp14) - - _tmp14 * (-P(1, 2) * _tmp13 - P(2, 2) * _tmp14); - } - - if (H != nullptr) { - matrix::Matrix& _h = (*H); - - _h.setZero(); - - _h(1, 0) = -_tmp13; - _h(2, 0) = -_tmp14; - } -} // NOLINT(readability/fn_size) - -// NOLINTNEXTLINE(readability/fn_size) -} // namespace sym diff --git a/src/modules/ekf2/EKF/python/ekf_derivation/generated/compute_yaw_innov_var_and_h.h b/src/modules/ekf2/EKF/python/ekf_derivation/generated/compute_yaw_innov_var_and_h.h new file mode 100644 index 000000000000..443fb0b03c5e --- /dev/null +++ b/src/modules/ekf2/EKF/python/ekf_derivation/generated/compute_yaw_innov_var_and_h.h @@ -0,0 +1,65 @@ +// ----------------------------------------------------------------------------- +// This file was autogenerated by symforce from template: +// function/FUNCTION.h.jinja +// Do NOT modify by hand. +// ----------------------------------------------------------------------------- + +#pragma once + +#include + +namespace sym { + +/** + * This function was autogenerated from a symbolic function. Do not modify by hand. + * + * Symbolic function: compute_yaw_innov_var_and_h + * + * Args: + * state: Matrix24_1 + * P: Matrix23_23 + * R: Scalar + * + * Outputs: + * innov_var: Scalar + * H: Matrix23_1 + */ +template +void ComputeYawInnovVarAndH(const matrix::Matrix& state, + const matrix::Matrix& P, const Scalar R, + Scalar* const innov_var = nullptr, + matrix::Matrix* const H = nullptr) { + // Total ops: 36 + + // Input arrays + + // Intermediate terms (5) + const Scalar _tmp0 = 2 * state(2, 0); + const Scalar _tmp1 = 2 * state(1, 0); + const Scalar _tmp2 = -_tmp0 * state(0, 0) + _tmp1 * state(3, 0); + const Scalar _tmp3 = _tmp0 * state(3, 0) + _tmp1 * state(0, 0); + const Scalar _tmp4 = std::pow(state(0, 0), Scalar(2)) - std::pow(state(1, 0), Scalar(2)) - + std::pow(state(2, 0), Scalar(2)) + std::pow(state(3, 0), Scalar(2)); + + // Output terms (2) + if (innov_var != nullptr) { + Scalar& _innov_var = (*innov_var); + + _innov_var = R + _tmp2 * (P(0, 0) * _tmp2 + P(1, 0) * _tmp3 + P(2, 0) * _tmp4) + + _tmp3 * (P(0, 1) * _tmp2 + P(1, 1) * _tmp3 + P(2, 1) * _tmp4) + + _tmp4 * (P(0, 2) * _tmp2 + P(1, 2) * _tmp3 + P(2, 2) * _tmp4); + } + + if (H != nullptr) { + matrix::Matrix& _h = (*H); + + _h.setZero(); + + _h(0, 0) = _tmp2; + _h(1, 0) = _tmp3; + _h(2, 0) = _tmp4; + } +} // NOLINT(readability/fn_size) + +// NOLINTNEXTLINE(readability/fn_size) +} // namespace sym diff --git a/src/modules/ekf2/EKF/python/tuning_tools/mc_wind_estimator/mc_wind_estimator_tuning.py b/src/modules/ekf2/EKF/python/tuning_tools/mc_wind_estimator/mc_wind_estimator_tuning.py index 61b746fb3886..c0047a00f3ed 100644 --- a/src/modules/ekf2/EKF/python/tuning_tools/mc_wind_estimator/mc_wind_estimator_tuning.py +++ b/src/modules/ekf2/EKF/python/tuning_tools/mc_wind_estimator/mc_wind_estimator_tuning.py @@ -45,14 +45,20 @@ import quaternion from scipy import optimize -def getAllData(logfile): +def getAllData(logfile, use_gnss): log = ULog(logfile) - v_local = np.matrix([getData(log, 'vehicle_local_position', 'vx'), - getData(log, 'vehicle_local_position', 'vy'), - getData(log, 'vehicle_local_position', 'vz')]) + if use_gnss: + v_local = np.array([getData(log, 'vehicle_gps_position', 'vel_n_m_s'), + getData(log, 'vehicle_gps_position', 'vel_e_m_s'), + getData(log, 'vehicle_gps_position', 'vel_d_m_s')]) + t_v_local = ms2s(getData(log, 'vehicle_gps_position', 'timestamp')) - t_v_local = ms2s(getData(log, 'vehicle_local_position', 'timestamp')) + else: + v_local = np.array([getData(log, 'vehicle_local_position', 'vx'), + getData(log, 'vehicle_local_position', 'vy'), + getData(log, 'vehicle_local_position', 'vz')]) + t_v_local = ms2s(getData(log, 'vehicle_local_position', 'timestamp')) accel = np.matrix([getData(log, 'sensor_combined', 'accelerometer_m_s2[0]'), getData(log, 'sensor_combined', 'accelerometer_m_s2[1]'), @@ -126,8 +132,8 @@ def getData(log, topic_name, variable_name, instance=0): def ms2s(time_ms): return time_ms * 1e-6 -def run(logfile): - (t, v_body, a_body) = getAllData(logfile) +def run(logfile, use_gnss): + (t, v_body, a_body) = getAllData(logfile, use_gnss) rho = 1.15 # air densitiy rho15 = 1.225 # air density at 15 degC @@ -197,8 +203,10 @@ def run(logfile): # Provide parameter file path and name parser.add_argument('logfile', help='Full ulog file path, name and extension', type=str) + parser.add_argument('--gnss', help='Use GNSS velocity instead of local velocity estimate', + action='store_true') args = parser.parse_args() logfile = os.path.abspath(args.logfile) # Convert to absolute path - run(logfile) + run(logfile, args.gnss) diff --git a/src/modules/ekf2/EKF/yaw_fusion.cpp b/src/modules/ekf2/EKF/yaw_fusion.cpp index e5f94938aa7b..80ce35210b14 100644 --- a/src/modules/ekf2/EKF/yaw_fusion.cpp +++ b/src/modules/ekf2/EKF/yaw_fusion.cpp @@ -33,8 +33,7 @@ #include "ekf.h" -#include -#include +#include #include @@ -42,7 +41,7 @@ bool Ekf::fuseYaw(estimator_aid_source1d_s &aid_src_status) { VectorState H_YAW; - computeYawInnovVarAndH(aid_src_status.observation_variance, aid_src_status.innovation_variance, H_YAW); + sym::ComputeYawInnovVarAndH(_state.vector(), P, aid_src_status.observation_variance, &aid_src_status.innovation_variance, &H_YAW); return fuseYaw(aid_src_status, H_YAW); } @@ -135,10 +134,5 @@ bool Ekf::fuseYaw(estimator_aid_source1d_s &aid_src_status, const VectorState &H void Ekf::computeYawInnovVarAndH(float variance, float &innovation_variance, VectorState &H_YAW) const { - if (shouldUse321RotationSequence(_R_to_earth)) { - sym::ComputeYaw321InnovVarAndH(_state.vector(), P, variance, FLT_EPSILON, &innovation_variance, &H_YAW); - - } else { - sym::ComputeYaw312InnovVarAndH(_state.vector(), P, variance, FLT_EPSILON, &innovation_variance, &H_YAW); - } + sym::ComputeYawInnovVarAndH(_state.vector(), P, variance, &innovation_variance, &H_YAW); } diff --git a/src/modules/ekf2/test/change_indication/ekf_gsf_reset.csv b/src/modules/ekf2/test/change_indication/ekf_gsf_reset.csv index 2fd39cd68ea8..17437ae7216c 100644 --- a/src/modules/ekf2/test/change_indication/ekf_gsf_reset.csv +++ b/src/modules/ekf2/test/change_indication/ekf_gsf_reset.csv @@ -1,391 +1,391 @@ Timestamp,state[0],state[1],state[2],state[3],state[4],state[5],state[6],state[7],state[8],state[9],state[10],state[11],state[12],state[13],state[14],state[15],state[16],state[17],state[18],state[19],state[20],state[21],state[22],state[23],variance[0],variance[1],variance[2],variance[3],variance[4],variance[5],variance[6],variance[7],variance[8],variance[9],variance[10],variance[11],variance[12],variance[13],variance[14],variance[15],variance[16],variance[17],variance[18],variance[19],variance[20],variance[21],variance[22],variance[23] 10000,1,-0.0094,-0.01,-3.2e-06,0.00023,7.3e-05,-0.011,7.2e-06,2.2e-06,-0.00045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.01,0.01,0.00018,25,25,10,1e+02,1e+02,1e+02,0.01,0.01,0.01,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 90000,1,-0.0094,-0.011,6.9e-05,-0.00047,0.0026,-0.026,-1.6e-05,0.00011,-0.0023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.01,0.01,0.00046,25,25,10,1e+02,1e+02,1e+02,0.01,0.01,0.01,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -190000,1,-0.0094,-0.011,2.8e-05,6.9e-05,0.004,-0.041,-5.9e-06,0.00043,-0.0044,-3e-11,-2.7e-12,5.9e-13,0,0,-5e-08,0,0,0,0,0,0,0,0,0.011,0.011,0.00093,25,25,10,1e+02,1e+02,1,0.01,0.01,0.01,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -290000,1,-0.0094,-0.011,6.3e-05,0.001,0.0064,-0.053,3.8e-05,0.00036,-0.007,9.1e-10,1e-10,-2.8e-11,0,0,-2.5e-06,0,0,0,0,0,0,0,0,0.012,0.011,0.00077,25,25,9.6,0.37,0.37,0.41,0.01,0.01,0.0052,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -390000,1,-0.0094,-0.011,7e-05,0.0024,0.0083,-0.059,0.00021,0.0011,-0.0094,-1.1e-08,2.8e-09,7.7e-11,0,0,-1.5e-05,0,0,0,0,0,0,0,0,0.012,0.012,0.0012,25,25,8.1,0.97,0.97,0.32,0.01,0.01,0.0052,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -490000,1,-0.0095,-0.012,2e-05,0.0039,0.0048,-0.06,0.00024,0.00049,-0.011,1.6e-06,-3.7e-07,1.4e-08,0,0,-4.1e-05,0,0,0,0,0,0,0,0,0.013,0.013,0.00073,7.8,7.8,5.9,0.34,0.34,0.31,0.01,0.01,0.0024,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -590000,1,-0.0095,-0.012,2.6e-05,0.006,0.0073,-0.059,0.00074,0.0011,-0.012,1.6e-06,-3.4e-07,1.4e-08,0,0,-7.3e-05,0,0,0,0,0,0,0,0,0.015,0.015,0.001,7.9,7.9,4.2,0.67,0.67,0.32,0.01,0.01,0.0024,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -690000,1,-0.0096,-0.012,8.6e-05,0.0063,0.0052,-0.059,0.0005,0.00055,-0.013,5.5e-06,-3.2e-06,1.1e-07,0,0,-0.00012,0,0,0,0,0,0,0,0,0.016,0.016,0.00062,2.7,2.7,2.8,0.26,0.26,0.29,0.01,0.01,0.0012,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -790000,1,-0.0097,-0.013,9.9e-05,0.0086,0.0073,-0.063,0.0012,0.0012,-0.014,5.4e-06,-3.1e-06,1.1e-07,0,0,-0.00016,0,0,0,0,0,0,0,0,0.018,0.018,0.00079,2.8,2.8,2,0.42,0.42,0.28,0.01,0.01,0.0012,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -890000,1,-0.0098,-0.013,0.00012,0.01,0.006,-0.077,0.00096,0.00072,-0.021,1.6e-05,-1.5e-05,3.3e-07,0,0,-0.00016,0,0,0,0,0,0,0,0,0.019,0.019,0.00053,1.3,1.3,2,0.2,0.2,0.43,0.0099,0.01,0.00068,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -990000,1,-0.0099,-0.013,0.00013,0.015,0.0064,-0.092,0.0022,0.0014,-0.029,1.6e-05,-1.5e-05,3.3e-07,0,0,-0.00016,0,0,0,0,0,0,0,0,0.021,0.021,0.00065,1.5,1.5,2,0.3,0.3,0.61,0.0099,0.01,0.00068,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -1090000,1,-0.01,-0.014,0.00012,0.016,0.0051,-0.11,0.0018,0.00086,-0.039,4.1e-05,-6.2e-05,9.3e-07,0,0,-0.00016,0,0,0,0,0,0,0,0,0.023,0.023,0.00046,0.93,0.93,2,0.17,0.17,0.84,0.0098,0.0098,0.00042,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -1190000,1,-0.01,-0.014,9.8e-05,0.02,0.0053,-0.12,0.0035,0.0014,-0.051,4.1e-05,-6.2e-05,9.3e-07,0,0,-0.00016,0,0,0,0,0,0,0,0,0.025,0.025,0.00054,1.1,1.1,2,0.24,0.24,1.1,0.0098,0.0098,0.00042,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -1290000,1,-0.01,-0.014,0.00015,0.02,0.0044,-0.14,0.0027,0.00088,-0.064,8.5e-05,-0.00019,2.3e-06,0,0,-0.00016,0,0,0,0,0,0,0,0,0.026,0.026,0.00041,0.89,0.89,2,0.15,0.15,1.4,0.0095,0.0095,0.00028,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -1390000,1,-0.01,-0.014,0.00016,0.026,0.0042,-0.15,0.0051,0.0013,-0.078,8.5e-05,-0.00019,2.3e-06,0,0,-0.00016,0,0,0,0,0,0,0,0,0.028,0.028,0.00047,1.2,1.2,2,0.21,0.21,1.7,0.0095,0.0095,0.00028,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -1490000,1,-0.01,-0.014,0.00014,0.024,0.0029,-0.16,0.0037,0.00083,-0.093,0.00015,-0.00045,4.5e-06,0,0,-0.00016,0,0,0,0,0,0,0,0,0.027,0.027,0.00036,0.96,0.96,2,0.14,0.14,2.1,0.0088,0.0089,0.0002,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -1590000,1,-0.01,-0.014,0.00013,0.03,0.0035,-0.18,0.0065,0.0012,-0.11,0.00015,-0.00045,4.5e-06,0,0,-0.00016,0,0,0,0,0,0,0,0,0.03,0.03,0.00042,1.3,1.3,2,0.21,0.21,2.6,0.0088,0.0089,0.0002,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -1690000,1,-0.011,-0.014,9.6e-05,0.028,-9.9e-05,-0.19,0.0045,0.00063,-0.13,0.0002,-0.00088,7.8e-06,0,0,-0.00017,0,0,0,0,0,0,0,0,0.026,0.026,0.00033,1,1,2,0.14,0.14,3,0.0078,0.0078,0.00015,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -1790000,1,-0.011,-0.014,6.5e-05,0.035,-0.002,-0.2,0.0076,0.00054,-0.15,0.0002,-0.00088,7.8e-06,0,0,-0.00017,0,0,0,0,0,0,0,0,0.028,0.028,0.00037,1.3,1.3,2,0.21,0.21,3.5,0.0078,0.0078,0.00015,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -1890000,1,-0.011,-0.015,4.4e-05,0.043,-0.0032,-0.22,0.011,0.00029,-0.17,0.0002,-0.00088,7.8e-06,0,0,-0.00017,0,0,0,0,0,0,0,0,0.031,0.031,0.00042,1.7,1.7,2,0.31,0.31,4.1,0.0078,0.0078,0.00015,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -1990000,1,-0.011,-0.014,3.6e-05,0.036,-0.0046,-0.23,0.0082,-0.00027,-0.19,0.00022,-0.0014,1.2e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.025,0.025,0.00033,1.3,1.3,2.1,0.2,0.2,4.7,0.0067,0.0067,0.00011,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -2090000,1,-0.011,-0.014,-4.3e-06,0.041,-0.0071,-0.24,0.012,-0.00085,-0.22,0.00022,-0.0014,1.2e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.027,0.027,0.00037,1.7,1.7,2.1,0.31,0.31,5.3,0.0067,0.0067,0.00011,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -2190000,1,-0.011,-0.014,-1.3e-05,0.033,-0.0068,-0.26,0.0079,-0.00096,-0.24,0.00017,-0.002,1.7e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.02,0.02,0.0003,1.2,1.2,2.1,0.2,0.2,6,0.0055,0.0055,8.8e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -2290000,1,-0.011,-0.014,-2.9e-05,0.039,-0.0093,-0.27,0.011,-0.0017,-0.27,0.00017,-0.002,1.7e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.022,0.022,0.00033,1.5,1.5,2.1,0.3,0.3,6.7,0.0055,0.0055,8.8e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -2390000,1,-0.011,-0.013,-3.1e-05,0.03,-0.0086,-0.29,0.0074,-0.0015,-0.3,9.1e-05,-0.0025,2.1e-05,0,0,-0.00018,0,0,0,0,0,0,0,0,0.017,0.017,0.00027,1,1,2.1,0.19,0.19,7.4,0.0046,0.0046,7e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -2490000,1,-0.011,-0.013,-5.3e-05,0.035,-0.011,-0.3,0.011,-0.0024,-0.32,9.1e-05,-0.0025,2.1e-05,0,0,-0.00018,0,0,0,0,0,0,0,0,0.018,0.018,0.0003,1.3,1.3,2.1,0.28,0.28,8.2,0.0046,0.0046,7e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -2590000,1,-0.011,-0.013,-5.6e-05,0.027,-0.009,-0.31,0.0068,-0.0018,-0.36,-1.2e-05,-0.0029,2.4e-05,0,0,-0.00018,0,0,0,0,0,0,0,0,0.014,0.014,0.00025,0.88,0.88,2.1,0.18,0.18,9.1,0.0038,0.0038,5.7e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -2690000,1,-0.011,-0.013,-6.4e-05,0.031,-0.01,-0.33,0.0097,-0.0028,-0.39,-1.2e-05,-0.0029,2.4e-05,0,0,-0.00018,0,0,0,0,0,0,0,0,0.015,0.015,0.00027,1.1,1.1,2.2,0.25,0.25,10,0.0038,0.0038,5.7e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -2790000,1,-0.011,-0.013,-8.5e-05,0.023,-0.0093,-0.34,0.0062,-0.0019,-0.42,-0.00012,-0.0033,2.7e-05,0,0,-0.00018,0,0,0,0,0,0,0,0,0.012,0.012,0.00023,0.76,0.76,2.2,0.16,0.16,11,0.0032,0.0032,4.7e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -2890000,1,-0.011,-0.013,-0.00014,0.027,-0.011,-0.35,0.0087,-0.0029,-0.46,-0.00012,-0.0033,2.7e-05,0,0,-0.00018,0,0,0,0,0,0,0,0,0.013,0.013,0.00025,0.94,0.94,2.2,0.23,0.23,12,0.0032,0.0032,4.7e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -2990000,1,-0.011,-0.013,-0.00011,0.022,-0.0095,-0.36,0.0057,-0.0021,-0.49,-0.00023,-0.0036,2.9e-05,0,0,-0.00018,0,0,0,0,0,0,0,0,0.01,0.01,0.00022,0.66,0.66,2.2,0.15,0.15,13,0.0027,0.0027,3.9e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -3090000,1,-0.011,-0.013,-0.00011,0.025,-0.011,-0.38,0.008,-0.0031,-0.53,-0.00023,-0.0036,2.9e-05,0,0,-0.00018,0,0,0,0,0,0,0,0,0.011,0.011,0.00023,0.82,0.82,2.2,0.22,0.22,14,0.0027,0.0027,3.9e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -3190000,1,-0.011,-0.013,-0.00018,0.02,-0.0086,-0.39,0.0053,-0.0021,-0.57,-0.00034,-0.0039,3.1e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.0089,0.0088,0.0002,0.59,0.59,2.3,0.14,0.14,15,0.0023,0.0023,3.3e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -3290000,1,-0.011,-0.013,-0.00014,0.023,-0.01,-0.4,0.0074,-0.0031,-0.61,-0.00034,-0.0039,3.1e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.0097,0.0097,0.00022,0.72,0.72,2.3,0.2,0.2,16,0.0023,0.0023,3.3e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -3390000,1,-0.011,-0.012,-0.00018,0.018,-0.0091,-0.42,0.005,-0.0021,-0.65,-0.00044,-0.0041,3.3e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.0079,0.0079,0.00019,0.53,0.53,2.3,0.14,0.14,18,0.002,0.002,2.8e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -3490000,1,-0.011,-0.013,-0.0002,0.022,-0.012,-0.43,0.007,-0.0031,-0.69,-0.00044,-0.0041,3.3e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.0086,0.0086,0.0002,0.65,0.65,2.3,0.19,0.19,19,0.002,0.002,2.8e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -3590000,1,-0.011,-0.012,-0.00018,0.017,-0.011,-0.44,0.0047,-0.0023,-0.73,-0.00055,-0.0044,3.5e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.0071,0.0071,0.00018,0.48,0.48,2.4,0.13,0.13,20,0.0017,0.0017,2.4e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -3690000,1,-0.011,-0.012,-6.8e-05,0.02,-0.014,-0.46,0.0066,-0.0035,-0.78,-0.00055,-0.0044,3.5e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.0077,0.0077,0.00019,0.59,0.59,2.4,0.18,0.18,22,0.0017,0.0017,2.4e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -3790000,1,-0.011,-0.012,-3.3e-05,0.016,-0.013,-0.47,0.0044,-0.0026,-0.82,-0.00067,-0.0046,3.6e-05,0,0,-0.00016,0,0,0,0,0,0,0,0,0.0064,0.0063,0.00017,0.44,0.44,2.4,0.12,0.12,23,0.0014,0.0014,2.1e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -3890000,1,-0.011,-0.012,-7.2e-05,0.017,-0.014,-0.48,0.0061,-0.004,-0.87,-0.00067,-0.0046,3.6e-05,0,0,-0.00016,0,0,0,0,0,0,0,0,0.0069,0.0069,0.00018,0.54,0.54,2.4,0.17,0.17,24,0.0014,0.0014,2.1e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -3990000,1,-0.011,-0.012,-7.4e-05,0.021,-0.016,-0.5,0.0079,-0.0055,-0.92,-0.00067,-0.0046,3.6e-05,0,0,-0.00016,0,0,0,0,0,0,0,0,0.0075,0.0075,0.00019,0.65,0.65,2.5,0.22,0.22,26,0.0014,0.0014,2.1e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -4090000,1,-0.011,-0.012,-8.9e-05,0.017,-0.014,-0.51,0.0057,-0.0041,-0.97,-0.00079,-0.0048,3.8e-05,0,0,-0.00016,0,0,0,0,0,0,0,0,0.0062,0.0062,0.00017,0.5,0.5,2.5,0.16,0.16,28,0.0012,0.0012,1.8e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -4190000,1,-0.011,-0.012,-0.00012,0.02,-0.016,-0.53,0.0076,-0.0056,-1,-0.00079,-0.0048,3.8e-05,0,0,-0.00016,0,0,0,0,0,0,0,0,0.0067,0.0067,0.00018,0.6,0.6,2.5,0.21,0.21,29,0.0012,0.0012,1.8e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -4290000,1,-0.01,-0.012,-0.00018,0.017,-0.012,-0.54,0.0055,-0.0041,-1.1,-0.00092,-0.0049,4e-05,0,0,-0.00016,0,0,0,0,0,0,0,0,0.0055,0.0054,0.00016,0.46,0.46,2.6,0.15,0.15,31,0.00096,0.00095,1.6e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -4390000,1,-0.01,-0.012,-0.00016,0.018,-0.013,-0.55,0.0072,-0.0054,-1.1,-0.00092,-0.0049,4e-05,0,0,-0.00016,0,0,0,0,0,0,0,0,0.0059,0.0059,0.00017,0.55,0.56,2.6,0.2,0.2,33,0.00096,0.00095,1.6e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -4490000,1,-0.01,-0.012,-0.00011,0.014,-0.0097,-0.57,0.0051,-0.0037,-1.2,-0.001,-0.0051,4.2e-05,0,0,-0.00015,0,0,0,0,0,0,0,0,0.0048,0.0048,0.00015,0.43,0.43,2.6,0.14,0.14,34,0.00078,0.00078,1.4e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -4590000,1,-0.01,-0.012,-8.6e-05,0.017,-0.011,-0.58,0.0067,-0.0047,-1.2,-0.001,-0.0051,4.2e-05,0,0,-0.00015,0,0,0,0,0,0,0,0,0.0052,0.0051,0.00016,0.51,0.51,2.7,0.19,0.19,36,0.00078,0.00078,1.4e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -4690000,1,-0.01,-0.012,-9.3e-05,0.014,-0.0095,-0.6,0.0048,-0.0033,-1.3,-0.0011,-0.0052,4.3e-05,0,0,-0.00015,0,0,0,0,0,0,0,0,0.0042,0.0042,0.00015,0.39,0.4,2.7,0.14,0.14,38,0.00063,0.00063,1.3e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -4790000,1,-0.01,-0.012,-0.00011,0.015,-0.011,-0.61,0.0062,-0.0044,-1.4,-0.0011,-0.0052,4.3e-05,0,0,-0.00015,0,0,0,0,0,0,0,0,0.0045,0.0045,0.00016,0.47,0.47,2.7,0.18,0.18,40,0.00063,0.00063,1.3e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -4890000,1,-0.01,-0.011,-0.00013,0.012,-0.0096,-0.63,0.0044,-0.0031,-1.4,-0.0012,-0.0053,4.5e-05,0,0,-0.00014,0,0,0,0,0,0,0,0,0.0036,0.0036,0.00014,0.36,0.37,2.8,0.13,0.13,42,0.0005,0.0005,1.1e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -4990000,1,-0.01,-0.011,-0.00016,0.014,-0.01,-0.64,0.0058,-0.0041,-1.5,-0.0012,-0.0053,4.5e-05,0,0,-0.00014,0,0,0,0,0,0,0,0,0.0039,0.0039,0.00015,0.43,0.43,2.8,0.17,0.17,44,0.0005,0.0005,1.1e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -5090000,1,-0.01,-0.011,-0.00012,0.011,-0.0079,-0.66,0.0041,-0.003,-1.6,-0.0013,-0.0054,4.6e-05,0,0,-0.00014,0,0,0,0,0,0,0,0,0.0031,0.0031,0.00013,0.34,0.34,2.8,0.12,0.12,47,0.0004,0.0004,1e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -5190000,1,-0.01,-0.011,-0.0001,0.012,-0.0092,-0.67,0.0053,-0.0038,-1.6,-0.0013,-0.0054,4.6e-05,0,0,-0.00014,0,0,0,0,0,0,0,0,0.0033,0.0033,0.00014,0.4,0.4,2.9,0.16,0.16,49,0.0004,0.0004,1e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -5290000,1,-0.0099,-0.011,-0.00012,0.0082,-0.0067,-0.68,0.0037,-0.0027,-1.7,-0.0013,-0.0055,4.7e-05,0,0,-0.00013,0,0,0,0,0,0,0,0,0.0027,0.0027,0.00013,0.31,0.31,2.9,0.12,0.12,51,0.00032,0.00032,9.1e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -5390000,1,-0.0099,-0.011,-6.8e-05,0.0076,-0.0075,-0.7,0.0045,-0.0034,-1.8,-0.0013,-0.0055,4.7e-05,0,0,-0.00013,0,0,0,0,0,0,0,0,0.0029,0.0029,0.00014,0.36,0.36,3,0.15,0.15,54,0.00032,0.00032,9.1e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -5490000,1,-0.0097,-0.011,-6.5e-05,0.005,-0.0056,-0.71,0.003,-0.0024,-1.8,-0.0014,-0.0056,4.7e-05,0,0,-0.00013,0,0,0,0,0,0,0,0,0.0023,0.0023,0.00012,0.28,0.28,3,0.11,0.11,56,0.00025,0.00025,8.3e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -5590000,1,-0.0097,-0.011,-9.1e-05,0.0056,-0.006,-0.73,0.0035,-0.003,-1.9,-0.0014,-0.0056,4.7e-05,0,0,-0.00013,0,0,0,0,0,0,0,0,0.0024,0.0024,0.00013,0.33,0.33,3,0.15,0.15,59,0.00025,0.00025,8.3e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -5690000,1,-0.0096,-0.011,-2.6e-05,0.0036,-0.0033,-0.74,0.0024,-0.0021,-2,-0.0014,-0.0056,4.8e-05,0,0,-0.00013,0,0,0,0,0,0,0,0,0.002,0.002,0.00012,0.26,0.26,3.1,0.11,0.11,61,0.0002,0.0002,7.5e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -5790000,1,-0.0095,-0.011,-3.6e-05,0.0038,-0.0022,-0.75,0.0027,-0.0023,-2,-0.0014,-0.0056,4.8e-05,0,0,-0.00013,0,0,0,0,0,0,0,0,0.0021,0.0021,0.00013,0.3,0.3,3.1,0.14,0.14,64,0.0002,0.0002,7.5e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -5890000,1,-0.0094,-0.011,-6.6e-05,0.0032,-0.00046,0.0028,0.0018,-0.0015,-3.7e+02,-0.0015,-0.0056,4.8e-05,0,0,-0.00013,0,0,0,0,0,0,0,0,0.0017,0.0017,0.00012,0.24,0.24,9.8,0.1,0.1,0.52,0.00016,0.00016,6.9e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -5990000,1,-0.0094,-0.011,-4.9e-05,0.0034,0.001,0.015,0.0021,-0.0014,-3.7e+02,-0.0015,-0.0056,4.8e-05,0,0,-0.00014,0,0,0,0,0,0,0,0,0.0018,0.0018,0.00012,0.28,0.28,8.8,0.13,0.13,0.33,0.00016,0.00016,6.9e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -6090000,1,-0.0094,-0.011,-7e-05,0.0044,0.0022,-0.011,0.0025,-0.0012,-3.7e+02,-0.0015,-0.0056,4.8e-05,0,0,-0.00013,0,0,0,0,0,0,0,0,0.0019,0.0019,0.00013,0.32,0.32,7,0.17,0.17,0.33,0.00016,0.00016,6.9e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -6190000,1,-0.0094,-0.011,-0.00015,0.0031,0.0046,-0.005,0.0018,-0.00035,-3.7e+02,-0.0015,-0.0057,4.9e-05,0,0,-0.00015,0,0,0,0,0,0,0,0,0.0016,0.0016,0.00012,0.25,0.25,4.9,0.13,0.13,0.32,0.00013,0.00013,6.3e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -6290000,1,-0.0094,-0.011,-0.00018,0.0043,0.0046,-0.012,0.0022,9.7e-05,-3.7e+02,-0.0015,-0.0057,4.9e-05,0,0,-0.00016,0,0,0,0,0,0,0,0,0.0016,0.0016,0.00012,0.29,0.29,3.2,0.16,0.16,0.3,0.00013,0.00013,6.3e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -6390000,0.77,-0.024,0.005,-0.63,-0.013,-0.0016,-0.05,0.0011,-0.0011,-3.7e+02,-0.0014,-0.0057,4.7e-05,0,0,-0.0001,-0.097,-0.021,0.51,-0.00013,-0.079,-0.061,0,0,0.0013,0.0013,0.064,0.21,0.21,2.3,0.12,0.12,0.29,0.0001,0.0001,5.8e-06,0.04,0.04,0.04,0.0014,0.00038,0.0014,0.001,0.0014,0.0014,1,1 -6490000,0.78,-0.025,0.0054,-0.63,-0.04,-0.012,-0.052,-0.002,-0.0045,-3.7e+02,-0.0013,-0.0057,4.3e-05,0,0,-0.00015,-0.1,-0.022,0.51,-0.0004,-0.084,-0.064,0,0,0.0013,0.0013,0.055,0.21,0.21,1.5,0.15,0.15,0.26,0.0001,0.0001,5.8e-06,0.04,0.04,0.04,0.0013,0.00022,0.0013,0.00092,0.0014,0.0013,1,1 -6590000,0.78,-0.025,0.0056,-0.63,-0.067,-0.022,-0.098,-0.0081,-0.009,-3.7e+02,-0.0012,-0.0057,4e-05,-2.5e-05,0.00016,2.8e-05,-0.1,-0.022,0.51,-0.00086,-0.085,-0.066,0,0,0.0013,0.0013,0.053,0.22,0.22,1.1,0.18,0.18,0.23,0.0001,0.0001,5.8e-06,0.04,0.04,0.04,0.0013,0.00017,0.0013,0.00089,0.0014,0.0013,1,1 -6690000,0.78,-0.025,0.0057,-0.63,-0.096,-0.036,-0.075,-0.018,-0.018,-3.7e+02,-0.001,-0.0057,3.4e-05,7.3e-05,0.00071,-0.00029,-0.1,-0.023,0.51,-0.001,-0.085,-0.067,0,0,0.0013,0.0013,0.051,0.23,0.23,0.78,0.22,0.22,0.21,0.0001,0.0001,5.8e-06,0.04,0.04,0.04,0.0013,0.00014,0.0013,0.00088,0.0013,0.0013,1,1 -6790000,0.78,-0.025,0.0058,-0.63,-0.12,-0.047,-0.11,-0.028,-0.027,-3.7e+02,-0.00087,-0.0057,3.1e-05,-6.3e-06,0.0011,-6e-05,-0.1,-0.023,0.5,-0.00099,-0.086,-0.067,0,0,0.0013,0.0013,0.05,0.25,0.25,0.6,0.26,0.26,0.2,0.0001,0.0001,5.8e-06,0.04,0.04,0.04,0.0013,0.00013,0.0013,0.00087,0.0013,0.0013,1,1 -6890000,0.78,-0.025,0.0059,-0.63,-0.15,-0.055,-0.12,-0.041,-0.034,-3.7e+02,-0.00082,-0.0057,3e-05,-5.4e-05,0.0012,-0.00011,-0.1,-0.023,0.5,-0.001,-0.086,-0.068,0,0,0.0013,0.0013,0.05,0.27,0.26,0.46,0.31,0.31,0.18,9.9e-05,9.9e-05,5.8e-06,0.04,0.04,0.04,0.0013,0.00012,0.0013,0.00087,0.0013,0.0013,1,1 -6990000,0.78,-0.025,0.0059,-0.63,-0.18,-0.067,-0.12,-0.062,-0.047,-3.7e+02,-0.00068,-0.0058,2.4e-05,0.00028,0.0017,-0.00041,-0.1,-0.023,0.5,-0.0011,-0.086,-0.068,0,0,0.0013,0.0013,0.049,0.29,0.28,0.36,0.36,0.36,0.16,9.9e-05,9.9e-05,5.8e-06,0.04,0.04,0.04,0.0013,0.00011,0.0013,0.00086,0.0013,0.0013,1,1 -7090000,0.78,-0.025,0.006,-0.63,-0.21,-0.08,-0.12,-0.088,-0.064,-3.7e+02,-0.00048,-0.0059,1.5e-05,0.00066,0.0023,-0.00077,-0.1,-0.023,0.5,-0.0012,-0.086,-0.068,0,0,0.0013,0.0013,0.049,0.31,0.31,0.29,0.42,0.42,0.16,9.8e-05,9.8e-05,5.8e-06,0.04,0.04,0.04,0.0013,0.0001,0.0013,0.00086,0.0013,0.0013,1,1 -7190000,0.78,-0.025,0.0061,-0.63,-0.24,-0.088,-0.14,-0.11,-0.075,-3.7e+02,-0.00042,-0.006,1.3e-05,0.00081,0.0025,-0.00055,-0.1,-0.023,0.5,-0.0012,-0.086,-0.068,0,0,0.0013,0.0013,0.049,0.34,0.34,0.24,0.48,0.48,0.15,9.6e-05,9.7e-05,5.8e-06,0.04,0.04,0.04,0.0013,9.9e-05,0.0013,0.00086,0.0013,0.0013,1,1 -7290000,0.78,-0.025,0.0061,-0.63,-0.27,-0.084,-0.14,-0.14,-0.071,-3.7e+02,-0.00065,-0.006,1.9e-05,0.00074,0.0018,-0.0012,-0.1,-0.023,0.5,-0.0011,-0.086,-0.068,0,0,0.0013,0.0014,0.049,0.37,0.37,0.2,0.55,0.55,0.14,9.5e-05,9.5e-05,5.8e-06,0.04,0.04,0.04,0.0013,9.5e-05,0.0013,0.00086,0.0013,0.0013,1,1 -7390000,0.78,-0.025,0.0061,-0.63,-0.29,-0.09,-0.16,-0.16,-0.077,-3.7e+02,-0.00069,-0.0059,2.1e-05,0.00064,0.0017,-0.0014,-0.1,-0.023,0.5,-0.0011,-0.086,-0.068,0,0,0.0014,0.0014,0.049,0.4,0.4,0.18,0.63,0.63,0.13,9.3e-05,9.4e-05,5.8e-06,0.04,0.04,0.039,0.0013,9.2e-05,0.0013,0.00086,0.0013,0.0013,1,1 -7490000,0.78,-0.025,0.0061,-0.63,-0.32,-0.1,-0.16,-0.2,-0.1,-3.7e+02,-0.00049,-0.0059,1.6e-05,0.00061,0.0023,-0.0021,-0.1,-0.023,0.5,-0.0012,-0.086,-0.068,0,0,0.0014,0.0014,0.048,0.44,0.43,0.15,0.71,0.71,0.12,9.1e-05,9.2e-05,5.8e-06,0.04,0.04,0.039,0.0013,9e-05,0.0013,0.00085,0.0013,0.0013,1,1 -7590000,0.78,-0.025,0.0061,-0.63,-0.34,-0.11,-0.16,-0.22,-0.1,-3.7e+02,-0.00058,-0.0058,2.1e-05,0.00026,0.0021,-0.003,-0.1,-0.023,0.5,-0.0011,-0.086,-0.068,0,0,0.0014,0.0014,0.048,0.48,0.47,0.14,0.81,0.8,0.12,8.8e-05,8.9e-05,5.8e-06,0.04,0.04,0.039,0.0013,8.7e-05,0.0013,0.00085,0.0013,0.0013,1,1 -7690000,0.78,-0.025,0.0061,-0.63,-0.37,-0.12,-0.16,-0.26,-0.12,-3.7e+02,-0.00046,-0.0058,1.7e-05,0.00023,0.0025,-0.005,-0.1,-0.023,0.5,-0.0011,-0.086,-0.068,0,0,0.0014,0.0014,0.048,0.52,0.52,0.13,0.91,0.9,0.11,8.6e-05,8.7e-05,5.8e-06,0.04,0.04,0.039,0.0013,8.6e-05,0.0013,0.00085,0.0013,0.0013,1,1 -7790000,0.78,-0.025,0.0063,-0.63,-0.41,-0.13,-0.16,-0.31,-0.14,-3.7e+02,-0.00041,-0.006,1.2e-05,0.00074,0.0028,-0.007,-0.1,-0.023,0.5,-0.0011,-0.086,-0.068,0,0,0.0014,0.0014,0.048,0.57,0.56,0.12,1,1,0.11,8.3e-05,8.4e-05,5.7e-06,0.04,0.04,0.038,0.0013,8.4e-05,0.0013,0.00085,0.0013,0.0013,1,1 -7890000,0.78,-0.025,0.0063,-0.63,-0.023,-0.0067,-0.15,-0.32,-0.15,-3.7e+02,-0.00037,-0.0059,1.3e-05,0.00085,0.003,-0.0095,-0.1,-0.023,0.5,-0.0012,-0.086,-0.068,0,0,0.0014,0.0015,0.048,25,25,0.11,1e+02,1e+02,0.1,7.9e-05,8.1e-05,5.7e-06,0.04,0.04,0.038,0.0013,8.3e-05,0.0013,0.00085,0.0013,0.0013,1,1 -7990000,0.78,-0.025,0.0062,-0.63,-0.05,-0.014,-0.16,-0.32,-0.15,-3.7e+02,-0.00039,-0.0059,1.5e-05,0.00085,0.003,-0.011,-0.1,-0.023,0.5,-0.0012,-0.086,-0.069,0,0,0.0015,0.0015,0.048,25,25,0.1,1e+02,1e+02,0.099,7.6e-05,7.8e-05,5.7e-06,0.04,0.04,0.038,0.0013,8.1e-05,0.0013,0.00085,0.0013,0.0013,1,1 -8090000,0.78,-0.025,0.0062,-0.63,-0.077,-0.021,-0.17,-0.33,-0.15,-3.7e+02,-0.00036,-0.0057,1.7e-05,0.00085,0.003,-0.011,-0.1,-0.023,0.5,-0.0012,-0.086,-0.069,0,0,0.0015,0.0015,0.048,25,25,0.1,51,51,0.097,7.3e-05,7.5e-05,5.7e-06,0.04,0.04,0.037,0.0013,8e-05,0.0013,0.00085,0.0013,0.0013,1,1 -8190000,0.78,-0.025,0.0063,-0.63,-0.1,-0.028,-0.17,-0.34,-0.15,-3.7e+02,-0.00038,-0.0059,1.5e-05,0.00085,0.003,-0.013,-0.1,-0.023,0.5,-0.0012,-0.086,-0.069,0,0,0.0015,0.0015,0.048,25,25,0.099,52,52,0.094,6.9e-05,7.2e-05,5.7e-06,0.04,0.04,0.037,0.0013,7.9e-05,0.0013,0.00085,0.0013,0.0013,1,1 -8290000,0.78,-0.025,0.0064,-0.63,-0.13,-0.034,-0.17,-0.34,-0.15,-3.7e+02,-0.00026,-0.0059,9.7e-06,0.00085,0.003,-0.017,-0.1,-0.023,0.5,-0.0011,-0.086,-0.069,0,0,0.0015,0.0015,0.048,25,25,0.097,35,35,0.092,6.6e-05,6.8e-05,5.7e-06,0.04,0.04,0.036,0.0013,7.8e-05,0.0013,0.00085,0.0013,0.0013,1,1 -8390000,0.78,-0.025,0.0063,-0.63,-0.16,-0.042,-0.17,-0.36,-0.16,-3.7e+02,-0.00025,-0.0058,1.3e-05,0.00085,0.003,-0.021,-0.1,-0.023,0.5,-0.0012,-0.086,-0.069,0,0,0.0015,0.0016,0.048,25,25,0.097,37,37,0.091,6.3e-05,6.5e-05,5.7e-06,0.04,0.04,0.035,0.0013,7.8e-05,0.0013,0.00085,0.0013,0.0013,1,1 -8490000,0.78,-0.025,0.0065,-0.63,-0.18,-0.048,-0.16,-0.36,-0.16,-3.7e+02,-0.00024,-0.0058,1.1e-05,0.00085,0.003,-0.025,-0.1,-0.023,0.5,-0.0012,-0.086,-0.069,0,0,0.0015,0.0016,0.048,24,24,0.096,28,28,0.089,5.9e-05,6.2e-05,5.7e-06,0.04,0.04,0.034,0.0013,7.7e-05,0.0013,0.00085,0.0013,0.0013,1,1 -8590000,0.78,-0.025,0.0064,-0.63,-0.21,-0.053,-0.16,-0.38,-0.16,-3.7e+02,-0.00049,-0.006,1.5e-05,0.00085,0.003,-0.029,-0.1,-0.023,0.5,-0.0012,-0.086,-0.069,0,0,0.0015,0.0016,0.048,24,24,0.095,30,30,0.088,5.6e-05,5.8e-05,5.7e-06,0.04,0.04,0.034,0.0013,7.6e-05,0.0013,0.00085,0.0013,0.0013,1,1 -8690000,0.78,-0.025,0.0063,-0.63,-0.23,-0.062,-0.16,-0.38,-0.16,-3.7e+02,-0.00047,-0.0058,1.8e-05,0.00085,0.003,-0.034,-0.1,-0.023,0.5,-0.0012,-0.086,-0.069,0,0,0.0015,0.0016,0.048,23,23,0.096,25,25,0.088,5.3e-05,5.5e-05,5.7e-06,0.04,0.04,0.033,0.0013,7.6e-05,0.0013,0.00085,0.0013,0.0013,1,1 -8790000,0.78,-0.025,0.0065,-0.63,-0.26,-0.068,-0.15,-0.41,-0.17,-3.7e+02,-0.00043,-0.0059,1.6e-05,0.00085,0.003,-0.04,-0.1,-0.023,0.5,-0.0011,-0.086,-0.069,0,0,0.0015,0.0016,0.048,23,23,0.096,27,27,0.087,5e-05,5.2e-05,5.7e-06,0.04,0.04,0.032,0.0013,7.5e-05,0.0013,0.00085,0.0013,0.0013,1,1 -8890000,0.78,-0.025,0.0065,-0.63,-0.27,-0.071,-0.15,-0.41,-0.17,-3.7e+02,-0.00043,-0.0059,1.4e-05,0.00085,0.003,-0.044,-0.1,-0.023,0.5,-0.0011,-0.085,-0.069,0,0,0.0015,0.0016,0.048,21,21,0.095,23,23,0.086,4.7e-05,4.9e-05,5.7e-06,0.04,0.04,0.03,0.0013,7.5e-05,0.0013,0.00085,0.0013,0.0013,1,1 -8990000,0.78,-0.025,0.0067,-0.63,-0.31,-0.075,-0.14,-0.44,-0.18,-3.7e+02,-0.00036,-0.006,9.8e-06,0.00085,0.003,-0.05,-0.1,-0.023,0.5,-0.0011,-0.085,-0.069,0,0,0.0016,0.0016,0.048,21,21,0.096,26,26,0.087,4.4e-05,4.6e-05,5.7e-06,0.04,0.04,0.029,0.0013,7.4e-05,0.0013,0.00085,0.0013,0.0013,1,1 -9090000,0.78,-0.025,0.0067,-0.63,-0.31,-0.075,-0.14,-0.44,-0.18,-3.7e+02,-0.00042,-0.0061,1e-05,0.00085,0.003,-0.052,-0.1,-0.023,0.5,-0.0011,-0.085,-0.069,0,0,0.0016,0.0016,0.048,19,19,0.095,23,23,0.086,4.1e-05,4.4e-05,5.7e-06,0.04,0.04,0.028,0.0013,7.4e-05,0.0013,0.00085,0.0013,0.0013,1,1 -9190000,0.78,-0.026,0.0065,-0.63,-0.34,-0.089,-0.14,-0.47,-0.19,-3.7e+02,-0.0004,-0.0058,1.5e-05,0.00085,0.003,-0.055,-0.1,-0.023,0.5,-0.0011,-0.085,-0.069,0,0,0.0016,0.0016,0.048,19,19,0.094,25,25,0.085,3.9e-05,4.1e-05,5.7e-06,0.04,0.04,0.027,0.0013,7.3e-05,0.0013,0.00085,0.0013,0.0013,1,1 -9290000,0.78,-0.026,0.0066,-0.63,-0.35,-0.092,-0.13,-0.47,-0.19,-3.7e+02,-0.00036,-0.0058,1.5e-05,0.00085,0.003,-0.06,-0.1,-0.023,0.5,-0.0011,-0.085,-0.069,0,0,0.0016,0.0016,0.048,17,17,0.093,22,22,0.085,3.6e-05,3.8e-05,5.7e-06,0.04,0.04,0.025,0.0013,7.3e-05,0.0013,0.00085,0.0013,0.0013,1,1 -9390000,0.78,-0.026,0.0067,-0.63,-0.38,-0.1,-0.13,-0.51,-0.2,-3.7e+02,-0.00031,-0.0058,1.4e-05,0.00085,0.003,-0.063,-0.1,-0.023,0.5,-0.0011,-0.085,-0.069,0,0,0.0016,0.0016,0.048,17,17,0.093,25,25,0.086,3.4e-05,3.6e-05,5.7e-06,0.04,0.04,0.024,0.0013,7.2e-05,0.0013,0.00085,0.0013,0.0013,1,1 -9490000,0.78,-0.026,0.0066,-0.63,-0.38,-0.11,-0.13,-0.5,-0.2,-3.7e+02,-0.00026,-0.0057,1.6e-05,0.00085,0.003,-0.067,-0.1,-0.023,0.5,-0.0012,-0.085,-0.069,0,0,0.0016,0.0016,0.048,15,15,0.091,22,22,0.085,3.2e-05,3.4e-05,5.7e-06,0.04,0.04,0.023,0.0013,7.2e-05,0.0013,0.00085,0.0013,0.0013,1,1 -9590000,0.78,-0.026,0.0064,-0.63,-0.41,-0.11,-0.12,-0.54,-0.21,-3.7e+02,-0.00039,-0.0056,2e-05,0.00085,0.003,-0.07,-0.1,-0.023,0.5,-0.0012,-0.085,-0.069,0,0,0.0016,0.0016,0.048,15,15,0.09,25,25,0.085,3e-05,3.2e-05,5.7e-06,0.04,0.04,0.022,0.0013,7.2e-05,0.0013,0.00085,0.0013,0.0013,1,1 -9690000,0.78,-0.026,0.0065,-0.63,-0.4,-0.11,-0.12,-0.52,-0.2,-3.7e+02,-0.00046,-0.0058,1.8e-05,0.00085,0.003,-0.075,-0.1,-0.023,0.5,-0.0012,-0.085,-0.069,0,0,0.0016,0.0016,0.048,13,13,0.089,22,22,0.086,2.8e-05,3e-05,5.7e-06,0.04,0.04,0.02,0.0013,7.1e-05,0.0013,0.00084,0.0013,0.0013,1,1 -9790000,0.78,-0.026,0.0065,-0.63,-0.43,-0.12,-0.1,-0.56,-0.21,-3.7e+02,-0.00043,-0.0057,2e-05,0.00085,0.003,-0.08,-0.1,-0.023,0.5,-0.0012,-0.085,-0.068,0,0,0.0015,0.0016,0.048,14,14,0.087,24,24,0.085,2.6e-05,2.8e-05,5.7e-06,0.04,0.04,0.019,0.0013,7.1e-05,0.0013,0.00084,0.0013,0.0013,1,1 -9890000,0.78,-0.026,0.0064,-0.63,-0.46,-0.13,-0.1,-0.61,-0.23,-3.7e+02,-0.0005,-0.0057,2.1e-05,0.00085,0.003,-0.083,-0.1,-0.023,0.5,-0.0012,-0.085,-0.068,0,0,0.0015,0.0016,0.048,14,14,0.084,27,27,0.085,2.5e-05,2.7e-05,5.7e-06,0.04,0.04,0.018,0.0013,7.1e-05,0.0013,0.00084,0.0013,0.0013,1,1 -9990000,0.78,-0.026,0.0065,-0.63,-0.45,-0.12,-0.096,-0.59,-0.22,-3.7e+02,-0.00052,-0.0058,2e-05,0.00085,0.003,-0.086,-0.1,-0.023,0.5,-0.0012,-0.085,-0.068,0,0,0.0015,0.0016,0.048,12,12,0.083,24,24,0.086,2.3e-05,2.5e-05,5.7e-06,0.04,0.04,0.017,0.0013,7.1e-05,0.0013,0.00084,0.0013,0.0013,1,1 -10090000,0.78,-0.026,0.0063,-0.63,-0.48,-0.13,-0.093,-0.63,-0.23,-3.7e+02,-0.0006,-0.0057,2.3e-05,0.00085,0.003,-0.089,-0.1,-0.023,0.5,-0.0012,-0.085,-0.068,0,0,0.0015,0.0016,0.048,12,12,0.08,27,27,0.085,2.2e-05,2.4e-05,5.7e-06,0.04,0.04,0.016,0.0013,7e-05,0.0013,0.00084,0.0013,0.0013,1,1 -10190000,0.78,-0.026,0.0066,-0.63,-0.47,-0.12,-0.093,-0.61,-0.22,-3.7e+02,-0.00061,-0.0059,2e-05,0.00085,0.003,-0.09,-0.1,-0.023,0.5,-0.0012,-0.086,-0.068,0,0,0.0015,0.0016,0.048,10,10,0.078,23,23,0.084,2.1e-05,2.2e-05,5.7e-06,0.04,0.04,0.015,0.0013,7e-05,0.0013,0.00084,0.0013,0.0013,1,1 -10290000,0.78,-0.025,0.0068,-0.63,-0.5,-0.12,-0.08,-0.66,-0.23,-3.7e+02,-0.00062,-0.006,1.8e-05,0.00085,0.003,-0.095,-0.1,-0.023,0.5,-0.0012,-0.086,-0.068,0,0,0.0015,0.0016,0.048,10,10,0.076,26,26,0.085,2e-05,2.1e-05,5.7e-06,0.04,0.04,0.014,0.0013,7e-05,0.0013,0.00084,0.0013,0.0013,1,1 -10390000,0.78,-0.025,0.0069,-0.63,-0.017,-0.026,0.0097,-0.00031,-0.0021,-3.7e+02,-0.00059,-0.006,1.7e-05,0.00076,0.0037,-0.098,-0.1,-0.023,0.5,-0.0012,-0.086,-0.068,0,0,0.0015,0.0016,0.048,0.25,0.25,0.56,0.25,0.25,0.078,1.8e-05,2e-05,5.7e-06,0.04,0.04,0.013,0.0013,7e-05,0.0013,0.00084,0.0013,0.0013,1,1 -10490000,0.78,-0.025,0.007,-0.63,-0.047,-0.033,0.023,-0.0035,-0.005,-3.7e+02,-0.0006,-0.0061,1.6e-05,0.0012,0.004,-0.1,-0.1,-0.023,0.5,-0.0012,-0.086,-0.068,0,0,0.0015,0.0016,0.048,0.26,0.26,0.55,0.26,0.26,0.08,1.7e-05,1.9e-05,5.7e-06,0.04,0.04,0.012,0.0013,6.9e-05,0.0013,0.00084,0.0013,0.0013,1,1 -10590000,0.78,-0.025,0.0067,-0.63,-0.044,-0.022,0.026,0.0012,-0.001,-3.7e+02,-0.00075,-0.006,2e-05,0.0014,0.0016,-0.1,-0.1,-0.023,0.5,-0.0011,-0.086,-0.068,0,0,0.0015,0.0016,0.048,0.13,0.13,0.27,0.13,0.13,0.073,1.6e-05,1.8e-05,5.7e-06,0.039,0.039,0.012,0.0013,6.9e-05,0.0013,0.00084,0.0013,0.0013,1,1 -10690000,0.78,-0.025,0.0067,-0.63,-0.073,-0.026,0.03,-0.0047,-0.0034,-3.7e+02,-0.00074,-0.0061,2e-05,0.0014,0.0018,-0.1,-0.1,-0.023,0.5,-0.0011,-0.086,-0.068,0,0,0.0015,0.0016,0.048,0.14,0.14,0.26,0.14,0.14,0.078,1.5e-05,1.7e-05,5.7e-06,0.039,0.039,0.011,0.0013,6.9e-05,0.0013,0.00084,0.0013,0.0013,1,1 -10790000,0.78,-0.025,0.0064,-0.63,-0.069,-0.021,0.024,-6.8e-05,-0.0014,-3.7e+02,-0.00079,-0.006,2.3e-05,0.0015,-0.001,-0.1,-0.1,-0.023,0.5,-0.0011,-0.086,-0.069,0,0,0.0015,0.0015,0.048,0.096,0.096,0.17,0.09,0.09,0.072,1.4e-05,1.6e-05,5.7e-06,0.039,0.039,0.011,0.0013,6.9e-05,0.0013,0.00084,0.0013,0.0013,1,1 -10890000,0.78,-0.025,0.0065,-0.63,-0.096,-0.027,0.02,-0.0083,-0.0039,-3.7e+02,-0.00079,-0.006,2.3e-05,0.0014,-0.001,-0.1,-0.1,-0.023,0.5,-0.0011,-0.086,-0.069,0,0,0.0014,0.0015,0.048,0.11,0.11,0.16,0.096,0.096,0.075,1.4e-05,1.5e-05,5.7e-06,0.039,0.039,0.011,0.0013,6.9e-05,0.0013,0.00084,0.0013,0.0013,1,1 -10990000,0.78,-0.024,0.0059,-0.63,-0.085,-0.022,0.015,-0.0037,-0.0021,-3.7e+02,-0.00081,-0.0059,2.7e-05,0.0013,-0.0058,-0.11,-0.1,-0.023,0.5,-0.00099,-0.086,-0.069,0,0,0.0014,0.0014,0.048,0.086,0.086,0.12,0.099,0.099,0.071,1.3e-05,1.4e-05,5.7e-06,0.038,0.038,0.011,0.0013,6.8e-05,0.0013,0.00083,0.0013,0.0013,1,1 -11090000,0.78,-0.024,0.0058,-0.63,-0.11,-0.029,0.019,-0.013,-0.0049,-3.7e+02,-0.00084,-0.0059,3e-05,0.00084,-0.0059,-0.11,-0.1,-0.023,0.5,-0.00097,-0.086,-0.069,0,0,0.0014,0.0014,0.048,0.1,0.1,0.11,0.11,0.11,0.074,1.2e-05,1.3e-05,5.7e-06,0.038,0.038,0.011,0.0013,6.8e-05,0.0013,0.00083,0.0013,0.0013,1,1 -11190000,0.78,-0.023,0.0051,-0.63,-0.094,-0.022,0.0084,-0.0051,-0.0018,-3.7e+02,-0.00093,-0.0059,3.3e-05,0.0015,-0.013,-0.11,-0.1,-0.023,0.5,-0.00092,-0.087,-0.069,0,0,0.0012,0.0013,0.047,0.083,0.084,0.084,0.11,0.11,0.069,1.1e-05,1.2e-05,5.7e-06,0.037,0.037,0.011,0.0013,6.8e-05,0.0013,0.00082,0.0013,0.0013,1,1 -11290000,0.78,-0.023,0.0052,-0.63,-0.12,-0.025,0.0083,-0.016,-0.0039,-3.7e+02,-0.00088,-0.006,3.1e-05,0.0018,-0.012,-0.11,-0.1,-0.023,0.5,-0.00097,-0.087,-0.069,0,0,0.0012,0.0013,0.047,0.098,0.099,0.078,0.12,0.12,0.072,1.1e-05,1.2e-05,5.7e-06,0.037,0.037,0.01,0.0013,6.8e-05,0.0013,0.00082,0.0013,0.0013,1,1 -11390000,0.78,-0.022,0.0046,-0.63,-0.1,-0.021,0.003,-0.0027,-0.00078,-3.7e+02,-0.00097,-0.006,3.3e-05,0.0018,-0.019,-0.11,-0.11,-0.023,0.5,-0.001,-0.087,-0.069,0,0,0.0011,0.0012,0.047,0.079,0.08,0.063,0.082,0.082,0.068,1e-05,1.1e-05,5.7e-06,0.036,0.036,0.01,0.0013,6.7e-05,0.0013,0.0008,0.0013,0.0013,1,1 -11490000,0.78,-0.022,0.0048,-0.63,-0.12,-0.022,0.0039,-0.014,-0.0025,-3.7e+02,-0.00093,-0.0061,3e-05,0.0021,-0.019,-0.11,-0.11,-0.023,0.5,-0.0011,-0.087,-0.069,0,0,0.0011,0.0012,0.047,0.094,0.095,0.058,0.089,0.089,0.069,9.7e-06,1.1e-05,5.7e-06,0.036,0.036,0.01,0.0013,6.7e-05,0.0013,0.0008,0.0013,0.0013,1,1 -11590000,0.78,-0.021,0.0041,-0.63,-0.1,-0.019,-0.0016,-0.0046,-0.00077,-3.7e+02,-0.00097,-0.0061,3.2e-05,0.0018,-0.025,-0.11,-0.11,-0.023,0.5,-0.0012,-0.088,-0.069,0,0,0.00099,0.001,0.047,0.078,0.078,0.049,0.068,0.068,0.066,9.2e-06,9.9e-06,5.7e-06,0.035,0.035,0.01,0.0012,6.6e-05,0.0013,0.00079,0.0013,0.0013,1,1 -11690000,0.78,-0.021,0.0042,-0.63,-0.12,-0.022,-0.0058,-0.016,-0.0027,-3.7e+02,-0.00092,-0.0062,3e-05,0.0018,-0.025,-0.11,-0.11,-0.023,0.5,-0.0012,-0.088,-0.069,0,0,0.00099,0.001,0.047,0.092,0.093,0.045,0.075,0.075,0.066,8.8e-06,9.5e-06,5.7e-06,0.035,0.035,0.01,0.0012,6.6e-05,0.0013,0.00079,0.0013,0.0013,1,1 -11790000,0.78,-0.02,0.0036,-0.63,-0.1,-0.014,-0.0072,-0.0085,0.00039,-3.7e+02,-0.00094,-0.0062,3.3e-05,0.0022,-0.031,-0.11,-0.11,-0.023,0.5,-0.0011,-0.089,-0.069,0,0,0.00088,0.0009,0.047,0.076,0.076,0.039,0.06,0.06,0.063,8.3e-06,8.9e-06,5.7e-06,0.034,0.034,0.01,0.0012,6.6e-05,0.0013,0.00077,0.0013,0.0013,1,1 -11890000,0.78,-0.02,0.0038,-0.63,-0.12,-0.015,-0.0079,-0.02,-0.00091,-3.7e+02,-0.00092,-0.0062,3.1e-05,0.0022,-0.031,-0.11,-0.11,-0.023,0.5,-0.0012,-0.089,-0.069,0,0,0.00088,0.0009,0.047,0.089,0.09,0.036,0.067,0.067,0.063,7.9e-06,8.5e-06,5.7e-06,0.034,0.034,0.01,0.0012,6.6e-05,0.0013,0.00077,0.0013,0.0013,1,1 -11990000,0.78,-0.02,0.003,-0.63,-0.096,-0.0097,-0.013,-0.011,0.0014,-3.7e+02,-0.001,-0.0062,3.6e-05,0.0022,-0.036,-0.11,-0.11,-0.023,0.5,-0.0011,-0.089,-0.069,0,0,0.00078,0.00079,0.046,0.073,0.074,0.033,0.055,0.055,0.061,7.5e-06,8.1e-06,5.7e-06,0.034,0.034,0.01,0.0012,6.5e-05,0.0013,0.00076,0.0013,0.0013,1,1 -12090000,0.78,-0.02,0.0029,-0.63,-0.11,-0.013,-0.018,-0.021,2.3e-05,-3.7e+02,-0.0011,-0.0061,3.9e-05,0.0024,-0.035,-0.11,-0.11,-0.023,0.5,-0.001,-0.089,-0.069,0,0,0.00078,0.0008,0.046,0.086,0.086,0.031,0.063,0.063,0.061,7.2e-06,7.8e-06,5.7e-06,0.034,0.034,0.01,0.0012,6.5e-05,0.0012,0.00076,0.0013,0.0013,1,1 -12190000,0.78,-0.019,0.0023,-0.63,-0.085,-0.013,-0.013,-0.011,0.00047,-3.7e+02,-0.0011,-0.0061,3.9e-05,0.0019,-0.041,-0.11,-0.11,-0.023,0.5,-0.0011,-0.09,-0.069,0,0,0.0007,0.00071,0.046,0.07,0.07,0.028,0.052,0.052,0.059,6.8e-06,7.4e-06,5.7e-06,0.033,0.033,0.01,0.0012,6.5e-05,0.0012,0.00074,0.0013,0.0012,1,1 -12290000,0.78,-0.019,0.0023,-0.63,-0.094,-0.015,-0.012,-0.02,-0.001,-3.7e+02,-0.001,-0.0061,3.9e-05,0.002,-0.041,-0.11,-0.11,-0.023,0.5,-0.001,-0.09,-0.069,0,0,0.0007,0.00071,0.046,0.081,0.081,0.027,0.06,0.06,0.059,6.6e-06,7.1e-06,5.7e-06,0.033,0.033,0.01,0.0012,6.5e-05,0.0012,0.00074,0.0013,0.0012,1,1 -12390000,0.78,-0.019,0.0019,-0.63,-0.074,-0.012,-0.0097,-0.0099,8.2e-05,-3.7e+02,-0.0011,-0.0061,3.9e-05,0.0015,-0.045,-0.11,-0.11,-0.024,0.5,-0.0012,-0.09,-0.069,0,0,0.00063,0.00064,0.046,0.066,0.066,0.026,0.05,0.05,0.057,6.3e-06,6.8e-06,5.7e-06,0.032,0.033,0.01,0.0012,6.5e-05,0.0012,0.00073,0.0013,0.0012,1,1 -12490000,0.78,-0.019,0.002,-0.63,-0.082,-0.013,-0.012,-0.018,-0.00095,-3.7e+02,-0.001,-0.0061,3.7e-05,0.0013,-0.045,-0.11,-0.11,-0.024,0.5,-0.0013,-0.09,-0.069,0,0,0.00064,0.00064,0.046,0.076,0.076,0.025,0.058,0.058,0.057,6e-06,6.5e-06,5.7e-06,0.032,0.033,0.0099,0.0012,6.4e-05,0.0012,0.00073,0.0013,0.0012,1,1 -12590000,0.78,-0.018,0.0017,-0.63,-0.074,-0.012,-0.018,-0.015,-0.00012,-3.7e+02,-0.0011,-0.0061,4e-05,0.0013,-0.047,-0.11,-0.11,-0.024,0.5,-0.0013,-0.09,-0.069,0,0,0.00058,0.00059,0.046,0.062,0.062,0.024,0.049,0.049,0.055,5.8e-06,6.3e-06,5.7e-06,0.032,0.032,0.0098,0.0012,6.4e-05,0.0012,0.00072,0.0013,0.0012,1,1 -12690000,0.78,-0.018,0.0017,-0.63,-0.08,-0.013,-0.021,-0.022,-0.0011,-3.7e+02,-0.0012,-0.0062,4.1e-05,0.0011,-0.046,-0.11,-0.11,-0.024,0.5,-0.0013,-0.09,-0.069,0,0,0.00059,0.00059,0.046,0.071,0.071,0.024,0.057,0.057,0.055,5.5e-06,6e-06,5.7e-06,0.032,0.032,0.0098,0.0012,6.4e-05,0.0012,0.00072,0.0013,0.0012,1,1 -12790000,0.78,-0.018,0.0015,-0.63,-0.073,-0.011,-0.024,-0.019,-0.00039,-3.7e+02,-0.0011,-0.0062,4.1e-05,0.0011,-0.048,-0.11,-0.11,-0.024,0.5,-0.0013,-0.09,-0.069,0,0,0.00054,0.00055,0.046,0.058,0.058,0.024,0.048,0.048,0.053,5.3e-06,5.8e-06,5.7e-06,0.032,0.032,0.0096,0.0012,6.4e-05,0.0012,0.00071,0.0013,0.0012,1,1 -12890000,0.78,-0.018,0.0016,-0.63,-0.081,-0.011,-0.023,-0.027,-0.0015,-3.7e+02,-0.0011,-0.0062,3.9e-05,0.0012,-0.049,-0.11,-0.11,-0.024,0.5,-0.0013,-0.09,-0.069,0,0,0.00055,0.00055,0.046,0.066,0.066,0.025,0.056,0.056,0.054,5.1e-06,5.6e-06,5.7e-06,0.032,0.032,0.0096,0.0012,6.4e-05,0.0012,0.00071,0.0013,0.0012,1,1 -12990000,0.78,-0.018,0.0012,-0.63,-0.065,-0.0098,-0.023,-0.02,-0.0012,-3.7e+02,-0.0011,-0.0061,4.1e-05,0.0013,-0.052,-0.12,-0.11,-0.024,0.5,-0.0012,-0.09,-0.069,0,0,0.00052,0.00052,0.046,0.058,0.058,0.024,0.058,0.058,0.052,4.9e-06,5.4e-06,5.7e-06,0.031,0.032,0.0094,0.0012,6.3e-05,0.0012,0.0007,0.0013,0.0012,1,1 -13090000,0.78,-0.018,0.0013,-0.63,-0.071,-0.0094,-0.023,-0.027,-0.0018,-3.7e+02,-0.0011,-0.0062,3.9e-05,0.00097,-0.052,-0.12,-0.11,-0.024,0.5,-0.0013,-0.09,-0.069,0,0,0.00052,0.00052,0.046,0.065,0.065,0.025,0.066,0.066,0.052,4.7e-06,5.2e-06,5.7e-06,0.031,0.032,0.0093,0.0012,6.3e-05,0.0012,0.0007,0.0013,0.0012,1,1 -13190000,0.78,-0.017,0.001,-0.63,-0.057,-0.0089,-0.02,-0.018,-0.0012,-3.7e+02,-0.0011,-0.0062,4e-05,0.00083,-0.054,-0.12,-0.11,-0.024,0.5,-0.0014,-0.091,-0.069,0,0,0.00049,0.0005,0.046,0.057,0.057,0.025,0.067,0.067,0.051,4.5e-06,5e-06,5.7e-06,0.031,0.032,0.0091,0.0012,6.3e-05,0.0012,0.0007,0.0013,0.0012,1,1 -13290000,0.78,-0.017,0.0011,-0.63,-0.062,-0.011,-0.016,-0.025,-0.0025,-3.7e+02,-0.001,-0.0061,3.9e-05,0.0012,-0.055,-0.12,-0.11,-0.024,0.5,-0.0013,-0.091,-0.069,0,0,0.0005,0.0005,0.046,0.063,0.064,0.026,0.077,0.077,0.051,4.4e-06,4.8e-06,5.7e-06,0.031,0.031,0.009,0.0012,6.3e-05,0.0012,0.0007,0.0013,0.0012,1,1 -13390000,0.78,-0.017,0.0009,-0.63,-0.051,-0.01,-0.012,-0.017,-0.0017,-3.7e+02,-0.0011,-0.0061,4e-05,0.0015,-0.056,-0.12,-0.11,-0.024,0.5,-0.0013,-0.091,-0.069,0,0,0.00048,0.00048,0.046,0.056,0.056,0.026,0.077,0.077,0.05,4.2e-06,4.7e-06,5.7e-06,0.031,0.031,0.0087,0.0012,6.3e-05,0.0012,0.00069,0.0013,0.0012,1,1 -13490000,0.78,-0.017,0.00088,-0.63,-0.054,-0.011,-0.011,-0.023,-0.0029,-3.7e+02,-0.001,-0.0061,4.1e-05,0.0017,-0.057,-0.12,-0.11,-0.024,0.5,-0.0012,-0.091,-0.069,0,0,0.00048,0.00048,0.046,0.061,0.062,0.027,0.088,0.088,0.05,4.1e-06,4.5e-06,5.7e-06,0.031,0.031,0.0087,0.0012,6.3e-05,0.0012,0.00069,0.0013,0.0012,1,1 -13590000,0.78,-0.017,0.00074,-0.63,-0.044,-0.01,-0.013,-0.015,-0.0017,-3.7e+02,-0.0011,-0.0061,4e-05,0.0014,-0.058,-0.12,-0.11,-0.024,0.5,-0.0013,-0.091,-0.069,0,0,0.00046,0.00046,0.046,0.054,0.054,0.027,0.087,0.087,0.05,3.9e-06,4.4e-06,5.7e-06,0.031,0.031,0.0083,0.0012,6.3e-05,0.0012,0.00069,0.0013,0.0012,1,1 -13690000,0.78,-0.017,0.00074,-0.63,-0.047,-0.013,-0.017,-0.02,-0.0031,-3.7e+02,-0.0011,-0.0061,4.1e-05,0.0017,-0.058,-0.12,-0.11,-0.024,0.5,-0.0012,-0.091,-0.069,0,0,0.00046,0.00046,0.046,0.059,0.059,0.028,0.098,0.098,0.05,3.8e-06,4.2e-06,5.7e-06,0.031,0.031,0.0082,0.0012,6.3e-05,0.0012,0.00069,0.0013,0.0012,1,1 -13790000,0.78,-0.017,0.00055,-0.63,-0.035,-0.012,-0.018,-0.007,-0.0028,-3.7e+02,-0.0011,-0.0061,4.2e-05,0.0014,-0.058,-0.12,-0.11,-0.024,0.5,-0.0013,-0.091,-0.069,0,0,0.00044,0.00045,0.046,0.045,0.045,0.028,0.072,0.072,0.049,3.7e-06,4.1e-06,5.7e-06,0.031,0.031,0.0079,0.0012,6.2e-05,0.0012,0.00068,0.0013,0.0012,1,1 -13890000,0.78,-0.017,0.00061,-0.63,-0.038,-0.013,-0.022,-0.011,-0.0042,-3.7e+02,-0.001,-0.0061,4.1e-05,0.0016,-0.059,-0.12,-0.11,-0.024,0.5,-0.0012,-0.091,-0.069,0,0,0.00045,0.00045,0.046,0.049,0.049,0.03,0.081,0.081,0.05,3.5e-06,4e-06,5.7e-06,0.031,0.031,0.0078,0.0012,6.2e-05,0.0012,0.00068,0.0013,0.0012,1,1 -13990000,0.78,-0.017,0.00046,-0.63,-0.03,-0.012,-0.022,-0.0037,-0.0039,-3.7e+02,-0.0011,-0.0061,4.1e-05,0.0015,-0.06,-0.12,-0.11,-0.024,0.5,-0.0012,-0.091,-0.069,0,0,0.00043,0.00043,0.046,0.04,0.04,0.029,0.063,0.063,0.049,3.4e-06,3.9e-06,5.7e-06,0.031,0.031,0.0074,0.0012,6.2e-05,0.0012,0.00068,0.0012,0.0012,1,1 -14090000,0.78,-0.017,0.0004,-0.63,-0.031,-0.014,-0.023,-0.0066,-0.0054,-3.7e+02,-0.0011,-0.006,4.3e-05,0.0018,-0.059,-0.12,-0.11,-0.024,0.5,-0.0012,-0.091,-0.069,0,0,0.00043,0.00044,0.046,0.043,0.043,0.03,0.07,0.07,0.05,3.3e-06,3.7e-06,5.7e-06,0.031,0.031,0.0073,0.0012,6.2e-05,0.0012,0.00068,0.0012,0.0012,1,1 -14190000,0.78,-0.017,0.00033,-0.63,-0.025,-0.012,-0.025,-0.00057,-0.0036,-3.7e+02,-0.0011,-0.006,4.4e-05,0.002,-0.06,-0.12,-0.11,-0.024,0.5,-0.0011,-0.091,-0.069,0,0,0.00043,0.00043,0.046,0.036,0.036,0.03,0.057,0.057,0.05,3.2e-06,3.6e-06,5.7e-06,0.03,0.031,0.0069,0.0012,6.2e-05,0.0012,0.00067,0.0012,0.0012,1,1 -14290000,0.78,-0.017,0.0003,-0.63,-0.027,-0.013,-0.024,-0.0031,-0.0048,-3.7e+02,-0.0011,-0.006,4.4e-05,0.0021,-0.06,-0.12,-0.11,-0.024,0.5,-0.0011,-0.091,-0.069,0,0,0.00043,0.00043,0.046,0.039,0.04,0.031,0.064,0.064,0.05,3.1e-06,3.5e-06,5.7e-06,0.03,0.031,0.0067,0.0012,6.2e-05,0.0012,0.00067,0.0012,0.0012,1,1 -14390000,0.78,-0.017,0.00025,-0.63,-0.022,-0.014,-0.026,0.0013,-0.0036,-3.7e+02,-0.0011,-0.006,4.5e-05,0.0025,-0.061,-0.12,-0.11,-0.024,0.5,-0.001,-0.091,-0.069,0,0,0.00042,0.00042,0.046,0.034,0.034,0.03,0.053,0.053,0.05,3e-06,3.4e-06,5.7e-06,0.03,0.031,0.0063,0.0012,6.2e-05,0.0012,0.00067,0.0012,0.0012,1,1 -14490000,0.78,-0.017,0.00033,-0.63,-0.023,-0.016,-0.029,-0.0013,-0.0051,-3.7e+02,-0.001,-0.006,4.4e-05,0.0025,-0.061,-0.12,-0.11,-0.024,0.5,-0.001,-0.091,-0.069,0,0,0.00042,0.00042,0.046,0.037,0.037,0.031,0.06,0.06,0.05,2.9e-06,3.3e-06,5.7e-06,0.03,0.031,0.0062,0.0012,6.2e-05,0.0012,0.00067,0.0012,0.0012,1,1 -14590000,0.78,-0.017,0.0004,-0.63,-0.024,-0.016,-0.03,-0.0018,-0.005,-3.7e+02,-0.001,-0.006,4.4e-05,0.0025,-0.062,-0.12,-0.11,-0.024,0.5,-0.001,-0.091,-0.069,0,0,0.00041,0.00042,0.046,0.032,0.032,0.031,0.051,0.051,0.05,2.8e-06,3.2e-06,5.7e-06,0.03,0.031,0.0058,0.0012,6.2e-05,0.0012,0.00067,0.0012,0.0012,1,1 -14690000,0.78,-0.017,0.00042,-0.63,-0.027,-0.015,-0.026,-0.0044,-0.0067,-3.7e+02,-0.001,-0.006,4.4e-05,0.0028,-0.062,-0.12,-0.11,-0.024,0.5,-0.00099,-0.091,-0.069,0,0,0.00041,0.00042,0.046,0.034,0.035,0.031,0.056,0.056,0.051,2.7e-06,3.1e-06,5.7e-06,0.03,0.031,0.0057,0.0012,6.1e-05,0.0012,0.00067,0.0012,0.0012,1,1 -14790000,0.78,-0.017,0.00044,-0.63,-0.026,-0.015,-0.023,-0.0042,-0.0064,-3.7e+02,-0.00099,-0.006,4.4e-05,0.0029,-0.062,-0.12,-0.11,-0.024,0.5,-0.00099,-0.091,-0.069,0,0,0.00041,0.00041,0.046,0.03,0.03,0.03,0.048,0.048,0.05,2.6e-06,3.1e-06,5.7e-06,0.03,0.031,0.0053,0.0012,6.1e-05,0.0012,0.00067,0.0012,0.0012,1,1 -14890000,0.78,-0.017,0.00045,-0.63,-0.029,-0.017,-0.026,-0.0071,-0.008,-3.7e+02,-0.00098,-0.006,4.5e-05,0.003,-0.063,-0.12,-0.11,-0.024,0.5,-0.00098,-0.091,-0.069,0,0,0.00041,0.00041,0.046,0.033,0.033,0.031,0.054,0.054,0.052,2.6e-06,3e-06,5.7e-06,0.03,0.031,0.0051,0.0012,6.1e-05,0.0012,0.00067,0.0012,0.0012,1,1 -14990000,0.78,-0.017,0.00049,-0.63,-0.027,-0.014,-0.022,-0.0053,-0.0062,-3.7e+02,-0.00098,-0.006,4.5e-05,0.003,-0.063,-0.12,-0.11,-0.024,0.5,-0.00097,-0.091,-0.069,0,0,0.00041,0.00041,0.046,0.029,0.029,0.03,0.047,0.047,0.051,2.5e-06,2.9e-06,5.7e-06,0.03,0.031,0.0048,0.0012,6.1e-05,0.0012,0.00067,0.0012,0.0012,1,1 -15090000,0.78,-0.017,0.00058,-0.63,-0.029,-0.015,-0.025,-0.0082,-0.0076,-3.7e+02,-0.00098,-0.006,4.5e-05,0.0029,-0.063,-0.12,-0.11,-0.024,0.5,-0.00097,-0.091,-0.069,0,0,0.00041,0.00041,0.046,0.031,0.031,0.03,0.052,0.052,0.052,2.4e-06,2.8e-06,5.7e-06,0.03,0.031,0.0046,0.0012,6.1e-05,0.0012,0.00067,0.0012,0.0012,1,1 -15190000,0.78,-0.016,0.00061,-0.63,-0.027,-0.014,-0.023,-0.0065,-0.0061,-3.7e+02,-0.00097,-0.006,4.5e-05,0.0029,-0.064,-0.12,-0.11,-0.024,0.5,-0.00096,-0.091,-0.069,0,0,0.0004,0.00041,0.046,0.027,0.028,0.03,0.046,0.046,0.051,2.3e-06,2.7e-06,5.7e-06,0.03,0.031,0.0043,0.0012,6.1e-05,0.0012,0.00066,0.0012,0.0012,1,1 -15290000,0.78,-0.017,0.00062,-0.63,-0.029,-0.016,-0.021,-0.0091,-0.0076,-3.7e+02,-0.00098,-0.006,4.6e-05,0.0031,-0.063,-0.13,-0.11,-0.024,0.5,-0.00097,-0.09,-0.069,0,0,0.0004,0.00041,0.046,0.029,0.03,0.03,0.051,0.051,0.052,2.3e-06,2.7e-06,5.7e-06,0.03,0.031,0.0042,0.0012,6.1e-05,0.0012,0.00066,0.0012,0.0012,1,1 -15390000,0.78,-0.017,0.00057,-0.63,-0.028,-0.016,-0.019,-0.0087,-0.0078,-3.7e+02,-0.00099,-0.006,4.9e-05,0.0035,-0.063,-0.13,-0.11,-0.024,0.5,-0.00093,-0.09,-0.069,0,0,0.0004,0.0004,0.046,0.028,0.029,0.029,0.054,0.054,0.051,2.2e-06,2.6e-06,5.7e-06,0.03,0.031,0.0039,0.0012,6.1e-05,0.0012,0.00066,0.0012,0.0012,1,1 -15490000,0.78,-0.016,0.00059,-0.63,-0.031,-0.016,-0.019,-0.012,-0.0091,-3.7e+02,-0.00099,-0.006,4.7e-05,0.0032,-0.063,-0.13,-0.11,-0.024,0.5,-0.00094,-0.09,-0.069,0,0,0.0004,0.00041,0.046,0.031,0.031,0.029,0.06,0.06,0.053,2.1e-06,2.5e-06,5.7e-06,0.03,0.031,0.0038,0.0012,6.1e-05,0.0012,0.00066,0.0012,0.0012,1,1 -15590000,0.78,-0.016,0.00062,-0.63,-0.029,-0.015,-0.018,-0.011,-0.0084,-3.7e+02,-0.001,-0.006,4.8e-05,0.003,-0.063,-0.13,-0.11,-0.024,0.5,-0.00093,-0.091,-0.069,0,0,0.0004,0.0004,0.046,0.029,0.03,0.028,0.062,0.062,0.052,2.1e-06,2.5e-06,5.7e-06,0.03,0.03,0.0035,0.0012,6.1e-05,0.0012,0.00066,0.0012,0.0012,1,1 -15690000,0.78,-0.016,0.0006,-0.63,-0.03,-0.015,-0.019,-0.014,-0.0098,-3.7e+02,-0.001,-0.006,4.8e-05,0.0029,-0.063,-0.13,-0.11,-0.024,0.5,-0.00093,-0.091,-0.069,0,0,0.0004,0.0004,0.046,0.031,0.032,0.028,0.069,0.069,0.052,2e-06,2.4e-06,5.7e-06,0.03,0.03,0.0034,0.0012,6.1e-05,0.0012,0.00066,0.0012,0.0012,1,1 -15790000,0.78,-0.016,0.00058,-0.63,-0.028,-0.014,-0.021,-0.0096,-0.0085,-3.7e+02,-0.001,-0.006,4.7e-05,0.0028,-0.063,-0.13,-0.11,-0.024,0.5,-0.00092,-0.091,-0.069,0,0,0.00039,0.0004,0.046,0.026,0.027,0.027,0.056,0.057,0.051,2e-06,2.3e-06,5.7e-06,0.03,0.03,0.0031,0.0012,6.1e-05,0.0012,0.00066,0.0012,0.0012,1,1 -15890000,0.78,-0.016,0.00061,-0.63,-0.029,-0.015,-0.02,-0.012,-0.0099,-3.7e+02,-0.001,-0.006,4.8e-05,0.0028,-0.063,-0.13,-0.11,-0.024,0.5,-0.00093,-0.091,-0.069,0,0,0.0004,0.0004,0.046,0.028,0.029,0.027,0.063,0.063,0.052,1.9e-06,2.3e-06,5.7e-06,0.03,0.03,0.003,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 -15990000,0.78,-0.016,0.00058,-0.63,-0.026,-0.015,-0.015,-0.009,-0.009,-3.7e+02,-0.001,-0.006,4.9e-05,0.0032,-0.063,-0.13,-0.11,-0.024,0.5,-0.00091,-0.091,-0.069,0,0,0.00039,0.0004,0.046,0.024,0.025,0.026,0.052,0.053,0.051,1.9e-06,2.2e-06,5.7e-06,0.03,0.03,0.0028,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 -16090000,0.78,-0.016,0.00051,-0.63,-0.029,-0.017,-0.012,-0.011,-0.011,-3.7e+02,-0.0011,-0.006,5.2e-05,0.0036,-0.063,-0.13,-0.11,-0.024,0.5,-0.0009,-0.091,-0.069,0,0,0.00039,0.0004,0.046,0.026,0.026,0.025,0.058,0.058,0.052,1.8e-06,2.2e-06,5.7e-06,0.03,0.03,0.0027,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 -16190000,0.78,-0.016,0.00048,-0.63,-0.026,-0.015,-0.011,-0.0086,-0.0084,-3.7e+02,-0.0011,-0.006,5.4e-05,0.0036,-0.063,-0.13,-0.11,-0.024,0.5,-0.00087,-0.091,-0.069,0,0,0.00039,0.0004,0.046,0.023,0.023,0.024,0.05,0.05,0.051,1.8e-06,2.1e-06,5.7e-06,0.03,0.03,0.0025,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 -16290000,0.78,-0.016,0.00042,-0.63,-0.029,-0.017,-0.012,-0.011,-0.01,-3.7e+02,-0.0011,-0.006,5.6e-05,0.004,-0.063,-0.13,-0.11,-0.024,0.5,-0.00085,-0.091,-0.069,0,0,0.00039,0.0004,0.046,0.024,0.025,0.024,0.055,0.055,0.052,1.7e-06,2.1e-06,5.7e-06,0.03,0.03,0.0024,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 -16390000,0.78,-0.016,0.00043,-0.63,-0.026,-0.013,-0.012,-0.0087,-0.008,-3.7e+02,-0.0011,-0.006,5.8e-05,0.0038,-0.062,-0.13,-0.11,-0.024,0.5,-0.00085,-0.091,-0.069,0,0,0.00039,0.0004,0.046,0.021,0.022,0.023,0.047,0.047,0.051,1.7e-06,2e-06,5.7e-06,0.03,0.03,0.0022,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 -16490000,0.78,-0.016,0.00039,-0.63,-0.025,-0.015,-0.015,-0.011,-0.0094,-3.7e+02,-0.0011,-0.006,5.8e-05,0.0038,-0.062,-0.13,-0.11,-0.024,0.5,-0.00085,-0.091,-0.069,0,0,0.00039,0.0004,0.046,0.023,0.023,0.023,0.052,0.052,0.052,1.6e-06,2e-06,5.7e-06,0.03,0.03,0.0022,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 -16590000,0.78,-0.016,0.00036,-0.63,-0.025,-0.011,-0.015,-0.011,-0.0056,-3.7e+02,-0.0011,-0.006,6.4e-05,0.0039,-0.062,-0.13,-0.11,-0.024,0.5,-0.00079,-0.091,-0.069,0,0,0.00039,0.0004,0.046,0.02,0.021,0.022,0.046,0.046,0.051,1.6e-06,1.9e-06,5.7e-06,0.03,0.03,0.002,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 -16690000,0.78,-0.016,0.0004,-0.63,-0.026,-0.011,-0.012,-0.014,-0.0065,-3.7e+02,-0.0011,-0.006,6.3e-05,0.0037,-0.062,-0.13,-0.11,-0.024,0.5,-0.0008,-0.091,-0.069,0,0,0.00039,0.0004,0.046,0.022,0.022,0.022,0.05,0.05,0.051,1.5e-06,1.9e-06,5.7e-06,0.03,0.03,0.0019,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 -16790000,0.78,-0.016,0.00044,-0.63,-0.026,-0.0081,-0.011,-0.013,-0.0033,-3.7e+02,-0.0011,-0.006,6.8e-05,0.0037,-0.062,-0.13,-0.11,-0.024,0.5,-0.00075,-0.091,-0.069,0,0,0.00039,0.00039,0.046,0.02,0.02,0.021,0.044,0.044,0.05,1.5e-06,1.9e-06,5.6e-06,0.03,0.03,0.0018,0.0012,6e-05,0.0012,0.00065,0.0012,0.0012,1,1 -16890000,0.78,-0.016,0.00043,-0.63,-0.026,-0.009,-0.0085,-0.016,-0.004,-3.7e+02,-0.0011,-0.006,6.7e-05,0.0036,-0.062,-0.13,-0.11,-0.024,0.5,-0.00076,-0.091,-0.069,0,0,0.00039,0.0004,0.046,0.021,0.022,0.021,0.049,0.049,0.051,1.5e-06,1.8e-06,5.6e-06,0.03,0.03,0.0017,0.0012,6e-05,0.0012,0.00065,0.0012,0.0012,1,1 -16990000,0.78,-0.016,0.00047,-0.63,-0.026,-0.0089,-0.0081,-0.014,-0.0041,-3.7e+02,-0.0011,-0.006,6.5e-05,0.0034,-0.062,-0.13,-0.11,-0.024,0.5,-0.00077,-0.091,-0.069,0,0,0.00038,0.00039,0.046,0.019,0.019,0.02,0.043,0.043,0.05,1.4e-06,1.8e-06,5.6e-06,0.03,0.03,0.0016,0.0012,6e-05,0.0012,0.00065,0.0012,0.0012,1,1 -17090000,0.78,-0.016,0.00047,-0.63,-0.027,-0.01,-0.0081,-0.017,-0.005,-3.7e+02,-0.0012,-0.006,6.5e-05,0.0034,-0.062,-0.13,-0.11,-0.024,0.5,-0.00078,-0.091,-0.069,0,0,0.00038,0.00039,0.046,0.02,0.021,0.02,0.048,0.048,0.05,1.4e-06,1.7e-06,5.6e-06,0.03,0.03,0.0016,0.0012,6e-05,0.0012,0.00065,0.0012,0.0012,1,1 -17190000,0.78,-0.016,0.00039,-0.63,-0.026,-0.013,-0.009,-0.015,-0.0054,-3.7e+02,-0.0012,-0.006,6.6e-05,0.0035,-0.062,-0.13,-0.11,-0.024,0.5,-0.00077,-0.091,-0.069,0,0,0.00038,0.00039,0.046,0.018,0.019,0.019,0.042,0.043,0.049,1.4e-06,1.7e-06,5.6e-06,0.03,0.03,0.0015,0.0012,6e-05,0.0012,0.00065,0.0012,0.0012,1,1 -17290000,0.78,-0.016,0.00043,-0.63,-0.028,-0.014,-0.0045,-0.017,-0.0064,-3.7e+02,-0.0012,-0.006,6.5e-05,0.0033,-0.061,-0.13,-0.11,-0.024,0.5,-0.00079,-0.091,-0.069,0,0,0.00038,0.00039,0.046,0.019,0.02,0.019,0.047,0.047,0.049,1.3e-06,1.7e-06,5.6e-06,0.03,0.03,0.0014,0.0012,6e-05,0.0012,0.00065,0.0012,0.0012,1,1 -17390000,0.78,-0.016,0.00035,-0.63,-0.026,-0.016,-0.0028,-0.015,-0.0068,-3.7e+02,-0.0012,-0.006,6.7e-05,0.0036,-0.061,-0.13,-0.11,-0.024,0.5,-0.00078,-0.091,-0.069,0,0,0.00038,0.00039,0.046,0.018,0.018,0.018,0.042,0.042,0.048,1.3e-06,1.6e-06,5.6e-06,0.03,0.03,0.0013,0.0012,6e-05,0.0012,0.00065,0.0012,0.0012,1,1 -17490000,0.78,-0.016,0.00037,-0.63,-0.028,-0.016,-0.0011,-0.018,-0.0084,-3.7e+02,-0.0012,-0.006,6.6e-05,0.0036,-0.062,-0.13,-0.11,-0.024,0.5,-0.00078,-0.091,-0.069,0,0,0.00038,0.00039,0.046,0.019,0.02,0.018,0.046,0.046,0.049,1.3e-06,1.6e-06,5.6e-06,0.03,0.03,0.0013,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 -17590000,0.78,-0.016,0.00038,-0.63,-0.026,-0.017,0.0043,-0.015,-0.0082,-3.7e+02,-0.0012,-0.006,6.7e-05,0.0036,-0.061,-0.13,-0.11,-0.024,0.5,-0.00077,-0.091,-0.069,0,0,0.00038,0.00039,0.046,0.017,0.018,0.017,0.041,0.041,0.048,1.2e-06,1.6e-06,5.6e-06,0.03,0.03,0.0012,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 -17690000,0.78,-0.016,0.00041,-0.63,-0.028,-0.019,0.0036,-0.018,-0.01,-3.7e+02,-0.0012,-0.006,6.8e-05,0.0037,-0.061,-0.13,-0.11,-0.024,0.5,-0.00077,-0.091,-0.069,0,0,0.00038,0.00039,0.046,0.018,0.019,0.017,0.045,0.045,0.048,1.2e-06,1.5e-06,5.6e-06,0.03,0.03,0.0012,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 -17790000,0.78,-0.016,0.00034,-0.63,-0.026,-0.019,0.0022,-0.016,-0.011,-3.7e+02,-0.0012,-0.006,7.5e-05,0.0041,-0.061,-0.13,-0.11,-0.024,0.5,-0.00073,-0.091,-0.069,0,0,0.00038,0.00039,0.046,0.018,0.019,0.016,0.048,0.048,0.048,1.2e-06,1.5e-06,5.6e-06,0.03,0.03,0.0011,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 -17890000,0.78,-0.016,0.00033,-0.63,-0.029,-0.021,0.0023,-0.019,-0.013,-3.7e+02,-0.0012,-0.006,7.6e-05,0.0042,-0.061,-0.13,-0.11,-0.024,0.5,-0.00073,-0.091,-0.069,0,0,0.00038,0.00039,0.046,0.019,0.02,0.016,0.052,0.053,0.048,1.2e-06,1.5e-06,5.6e-06,0.03,0.03,0.0011,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 -17990000,0.78,-0.016,0.00035,-0.63,-0.028,-0.018,0.0034,-0.017,-0.013,-3.7e+02,-0.0012,-0.006,7.8e-05,0.0041,-0.061,-0.13,-0.11,-0.024,0.5,-0.00071,-0.091,-0.068,0,0,0.00038,0.00039,0.046,0.019,0.02,0.016,0.055,0.055,0.047,1.1e-06,1.4e-06,5.6e-06,0.03,0.03,0.001,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 -18090000,0.78,-0.016,0.0004,-0.63,-0.029,-0.018,0.0057,-0.02,-0.014,-3.7e+02,-0.0012,-0.006,7.4e-05,0.0038,-0.061,-0.13,-0.11,-0.024,0.5,-0.00073,-0.091,-0.068,0,0,0.00038,0.00039,0.046,0.02,0.021,0.016,0.06,0.061,0.047,1.1e-06,1.4e-06,5.6e-06,0.03,0.03,0.00098,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 -18190000,0.78,-0.016,0.00039,-0.63,-0.026,-0.018,0.007,-0.015,-0.012,-3.7e+02,-0.0012,-0.006,7.9e-05,0.0039,-0.061,-0.13,-0.11,-0.024,0.5,-0.00069,-0.091,-0.068,0,0,0.00038,0.00039,0.046,0.018,0.018,0.015,0.051,0.051,0.046,1.1e-06,1.4e-06,5.5e-06,0.03,0.03,0.00093,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 -18290000,0.78,-0.016,0.00049,-0.63,-0.027,-0.018,0.0081,-0.018,-0.013,-3.7e+02,-0.0012,-0.006,7.8e-05,0.0038,-0.061,-0.13,-0.11,-0.024,0.5,-0.0007,-0.091,-0.068,0,0,0.00038,0.00039,0.046,0.019,0.02,0.015,0.056,0.056,0.046,1.1e-06,1.4e-06,5.5e-06,0.03,0.03,0.00089,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 -18390000,0.78,-0.016,0.00045,-0.63,-0.026,-0.019,0.0092,-0.014,-0.011,-3.7e+02,-0.0012,-0.006,8.4e-05,0.004,-0.061,-0.13,-0.11,-0.024,0.5,-0.00066,-0.091,-0.068,0,0,0.00038,0.00039,0.046,0.017,0.017,0.014,0.048,0.048,0.046,1e-06,1.3e-06,5.5e-06,0.03,0.03,0.00085,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 -18490000,0.78,-0.016,0.0004,-0.63,-0.026,-0.02,0.0088,-0.016,-0.013,-3.7e+02,-0.0012,-0.006,8.5e-05,0.004,-0.061,-0.13,-0.11,-0.024,0.5,-0.00066,-0.091,-0.068,0,0,0.00038,0.00039,0.046,0.018,0.019,0.014,0.052,0.053,0.046,1e-06,1.3e-06,5.5e-06,0.03,0.03,0.00082,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 -18590000,0.78,-0.016,0.00038,-0.63,-0.024,-0.02,0.0069,-0.013,-0.011,-3.7e+02,-0.0012,-0.006,9.4e-05,0.0042,-0.061,-0.13,-0.11,-0.024,0.5,-0.00061,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.016,0.017,0.014,0.046,0.046,0.045,9.8e-07,1.3e-06,5.5e-06,0.03,0.03,0.00078,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 -18690000,0.78,-0.016,0.00045,-0.63,-0.026,-0.02,0.0049,-0.016,-0.013,-3.7e+02,-0.0012,-0.006,9.2e-05,0.0041,-0.061,-0.13,-0.11,-0.024,0.5,-0.00061,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.017,0.018,0.013,0.05,0.05,0.045,9.6e-07,1.3e-06,5.5e-06,0.03,0.03,0.00076,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 -18790000,0.78,-0.016,0.00046,-0.63,-0.024,-0.019,0.0046,-0.014,-0.011,-3.7e+02,-0.0012,-0.006,9.6e-05,0.004,-0.061,-0.13,-0.11,-0.024,0.5,-0.00059,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.015,0.016,0.013,0.044,0.044,0.045,9.4e-07,1.2e-06,5.5e-06,0.03,0.03,0.00072,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 -18890000,0.78,-0.016,0.00037,-0.63,-0.025,-0.021,0.0051,-0.015,-0.014,-3.7e+02,-0.0012,-0.006,0.0001,0.0043,-0.06,-0.13,-0.11,-0.024,0.5,-0.00059,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.016,0.017,0.013,0.048,0.048,0.045,9.2e-07,1.2e-06,5.5e-06,0.03,0.03,0.0007,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 -18990000,0.78,-0.016,0.0003,-0.63,-0.021,-0.021,0.0037,-0.011,-0.012,-3.7e+02,-0.0013,-0.006,0.00011,0.0043,-0.06,-0.13,-0.11,-0.024,0.5,-0.00055,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.015,0.016,0.012,0.042,0.043,0.044,9e-07,1.2e-06,5.5e-06,0.03,0.03,0.00067,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 -19090000,0.78,-0.016,0.00029,-0.63,-0.021,-0.023,0.0067,-0.013,-0.014,-3.7e+02,-0.0013,-0.006,0.00011,0.0043,-0.06,-0.13,-0.11,-0.024,0.5,-0.00055,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.016,0.017,0.012,0.046,0.047,0.044,8.9e-07,1.2e-06,5.5e-06,0.03,0.03,0.00065,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 -19190000,0.78,-0.015,0.00024,-0.63,-0.017,-0.022,0.0067,-0.009,-0.012,-3.7e+02,-0.0013,-0.006,0.00011,0.0043,-0.059,-0.13,-0.11,-0.024,0.5,-0.00052,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.014,0.015,0.012,0.041,0.042,0.044,8.6e-07,1.1e-06,5.4e-06,0.03,0.03,0.00062,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 -19290000,0.78,-0.015,0.00024,-0.63,-0.018,-0.022,0.0094,-0.011,-0.014,-3.7e+02,-0.0013,-0.006,0.00011,0.0042,-0.059,-0.13,-0.11,-0.024,0.5,-0.00053,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.015,0.016,0.012,0.045,0.046,0.044,8.5e-07,1.1e-06,5.4e-06,0.03,0.03,0.0006,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 -19390000,0.78,-0.015,0.00027,-0.63,-0.017,-0.02,0.013,-0.0098,-0.013,-3.7e+02,-0.0013,-0.006,0.00012,0.0042,-0.059,-0.13,-0.11,-0.024,0.5,-0.00049,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.014,0.015,0.012,0.04,0.041,0.043,8.3e-07,1.1e-06,5.4e-06,0.03,0.03,0.00058,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 -19490000,0.78,-0.015,0.00022,-0.63,-0.017,-0.021,0.0095,-0.012,-0.015,-3.7e+02,-0.0013,-0.006,0.00012,0.0044,-0.059,-0.13,-0.11,-0.024,0.5,-0.00048,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.015,0.016,0.011,0.044,0.045,0.043,8.2e-07,1.1e-06,5.4e-06,0.03,0.03,0.00057,0.0012,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 -19590000,0.78,-0.015,0.00017,-0.63,-0.016,-0.02,0.0087,-0.0099,-0.014,-3.7e+02,-0.0013,-0.006,0.00014,0.0046,-0.059,-0.13,-0.11,-0.024,0.5,-0.00044,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.014,0.015,0.011,0.04,0.04,0.042,8e-07,1.1e-06,5.4e-06,0.03,0.03,0.00054,0.0012,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 -19690000,0.78,-0.015,0.00015,-0.63,-0.016,-0.018,0.01,-0.011,-0.015,-3.7e+02,-0.0013,-0.006,0.00013,0.0044,-0.059,-0.13,-0.11,-0.024,0.5,-0.00044,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.015,0.016,0.011,0.043,0.044,0.042,7.9e-07,1e-06,5.4e-06,0.03,0.03,0.00053,0.0012,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 -19790000,0.78,-0.015,0.00011,-0.63,-0.014,-0.016,0.011,-0.0094,-0.013,-3.7e+02,-0.0013,-0.006,0.00014,0.0044,-0.059,-0.13,-0.11,-0.024,0.5,-0.00042,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.014,0.015,0.011,0.039,0.039,0.042,7.7e-07,1e-06,5.3e-06,0.03,0.03,0.00051,0.0012,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -19890000,0.78,-0.015,0.00015,-0.63,-0.014,-0.018,0.012,-0.011,-0.016,-3.7e+02,-0.0013,-0.006,0.00015,0.0046,-0.059,-0.13,-0.11,-0.024,0.5,-0.0004,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.015,0.016,0.011,0.043,0.043,0.042,7.6e-07,1e-06,5.3e-06,0.03,0.03,0.0005,0.0012,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -19990000,0.78,-0.015,0.00014,-0.63,-0.012,-0.017,0.014,-0.0099,-0.015,-3.7e+02,-0.0013,-0.006,0.00016,0.0049,-0.059,-0.13,-0.11,-0.024,0.5,-0.00035,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.013,0.015,0.01,0.038,0.039,0.041,7.4e-07,9.8e-07,5.3e-06,0.03,0.03,0.00048,0.0012,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -20090000,0.78,-0.015,9.3e-05,-0.63,-0.012,-0.018,0.015,-0.011,-0.017,-3.7e+02,-0.0013,-0.006,0.00017,0.0052,-0.059,-0.13,-0.11,-0.024,0.5,-0.00034,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.014,0.016,0.01,0.042,0.043,0.042,7.3e-07,9.8e-07,5.3e-06,0.03,0.03,0.00047,0.0012,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -20190000,0.78,-0.015,5.7e-05,-0.63,-0.012,-0.016,0.017,-0.011,-0.016,-3.7e+02,-0.0013,-0.0059,0.00018,0.0053,-0.059,-0.13,-0.11,-0.024,0.5,-0.0003,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.013,0.015,0.01,0.038,0.039,0.041,7.1e-07,9.5e-07,5.3e-06,0.03,0.03,0.00045,0.0012,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -20290000,0.78,-0.015,6e-05,-0.63,-0.011,-0.016,0.015,-0.011,-0.017,-3.7e+02,-0.0013,-0.0059,0.00019,0.0054,-0.059,-0.13,-0.11,-0.024,0.5,-0.0003,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.014,0.016,0.0099,0.042,0.042,0.041,7e-07,9.4e-07,5.3e-06,0.03,0.03,0.00044,0.0012,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -20390000,0.78,-0.015,0.0001,-0.63,-0.011,-0.013,0.017,-0.011,-0.015,-3.7e+02,-0.0013,-0.006,0.00019,0.0053,-0.059,-0.13,-0.11,-0.024,0.5,-0.00027,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.013,0.014,0.0097,0.038,0.038,0.041,6.8e-07,9.2e-07,5.2e-06,0.03,0.03,0.00043,0.0012,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -20490000,0.78,-0.015,6e-05,-0.63,-0.011,-0.013,0.017,-0.012,-0.016,-3.7e+02,-0.0013,-0.006,0.00019,0.0052,-0.059,-0.13,-0.11,-0.024,0.5,-0.00027,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.014,0.015,0.0096,0.041,0.042,0.041,6.8e-07,9.1e-07,5.2e-06,0.03,0.03,0.00042,0.0012,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -20590000,0.78,-0.015,5.4e-05,-0.63,-0.01,-0.011,0.014,-0.011,-0.014,-3.7e+02,-0.0013,-0.006,0.00019,0.005,-0.059,-0.13,-0.11,-0.024,0.5,-0.00026,-0.091,-0.068,0,0,0.00037,0.00038,0.046,0.013,0.014,0.0093,0.037,0.038,0.04,6.6e-07,8.8e-07,5.2e-06,0.03,0.03,0.0004,0.0012,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -20690000,0.78,-0.015,1.6e-05,-0.63,-0.011,-0.011,0.015,-0.012,-0.015,-3.7e+02,-0.0013,-0.006,0.0002,0.0051,-0.059,-0.13,-0.11,-0.024,0.5,-0.00026,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.014,0.015,0.0093,0.041,0.042,0.04,6.5e-07,8.8e-07,5.2e-06,0.03,0.03,0.00039,0.0012,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -20790000,0.78,-0.015,-1.4e-05,-0.63,-0.0088,-0.01,0.015,-0.0099,-0.013,-3.7e+02,-0.0013,-0.006,0.0002,0.0051,-0.058,-0.13,-0.11,-0.024,0.5,-0.00023,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.013,0.014,0.0091,0.037,0.038,0.04,6.4e-07,8.5e-07,5.1e-06,0.03,0.03,0.00038,0.0012,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -20890000,0.78,-0.015,-3.1e-05,-0.63,-0.0092,-0.01,0.014,-0.011,-0.015,-3.7e+02,-0.0013,-0.006,0.00021,0.0052,-0.058,-0.13,-0.11,-0.024,0.5,-0.00023,-0.091,-0.068,0,0,0.00037,0.00038,0.046,0.014,0.015,0.009,0.041,0.042,0.04,6.3e-07,8.5e-07,5.1e-06,0.03,0.03,0.00037,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -20990000,0.78,-0.015,-5e-05,-0.63,-0.0076,-0.0082,0.015,-0.01,-0.015,-3.7e+02,-0.0013,-0.006,0.00021,0.0052,-0.058,-0.13,-0.11,-0.024,0.5,-0.00022,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.015,0.0088,0.043,0.044,0.039,6.2e-07,8.3e-07,5.1e-06,0.03,0.03,0.00036,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -21090000,0.78,-0.015,-5.4e-05,-0.63,-0.0088,-0.0078,0.015,-0.012,-0.017,-3.7e+02,-0.0013,-0.0059,0.00022,0.0053,-0.058,-0.13,-0.11,-0.024,0.5,-0.00021,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.015,0.016,0.0088,0.047,0.048,0.039,6.1e-07,8.3e-07,5.1e-06,0.03,0.03,0.00036,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -21190000,0.78,-0.015,-6.1e-05,-0.63,-0.0089,-0.0075,0.014,-0.012,-0.017,-3.7e+02,-0.0013,-0.006,0.00022,0.0053,-0.058,-0.13,-0.11,-0.024,0.5,-0.00021,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.015,0.016,0.0086,0.049,0.05,0.039,6e-07,8.1e-07,5.1e-06,0.03,0.03,0.00035,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -21290000,0.78,-0.015,-0.00015,-0.63,-0.0086,-0.0077,0.016,-0.013,-0.019,-3.7e+02,-0.0013,-0.0059,0.00023,0.0055,-0.058,-0.13,-0.11,-0.024,0.5,-0.0002,-0.091,-0.068,0,0,0.00037,0.00038,0.046,0.016,0.017,0.0085,0.053,0.055,0.039,5.9e-07,8e-07,5.1e-06,0.03,0.03,0.00034,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -21390000,0.78,-0.015,-0.00011,-0.63,-0.0077,-0.0035,0.016,-0.011,-0.014,-3.7e+02,-0.0013,-0.006,0.00023,0.0053,-0.058,-0.13,-0.11,-0.024,0.5,-0.00018,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.016,0.0084,0.046,0.047,0.039,5.8e-07,7.8e-07,5e-06,0.03,0.03,0.00033,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -21490000,0.78,-0.015,-0.00011,-0.63,-0.0085,-0.0042,0.016,-0.012,-0.015,-3.7e+02,-0.0013,-0.0059,0.00024,0.0054,-0.058,-0.13,-0.11,-0.024,0.5,-0.00017,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.015,0.017,0.0083,0.05,0.052,0.038,5.7e-07,7.7e-07,5e-06,0.03,0.03,0.00032,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -21590000,0.78,-0.015,-7.9e-05,-0.63,-0.0069,-0.0027,0.015,-0.01,-0.011,-3.7e+02,-0.0013,-0.006,0.00024,0.0052,-0.058,-0.13,-0.11,-0.024,0.5,-0.00015,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.013,0.015,0.0081,0.044,0.045,0.038,5.6e-07,7.5e-07,5e-06,0.03,0.03,0.00032,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -21690000,0.78,-0.015,-8.2e-05,-0.63,-0.0086,-0.0035,0.017,-0.012,-0.012,-3.7e+02,-0.0013,-0.0059,0.00025,0.0053,-0.059,-0.13,-0.11,-0.024,0.5,-0.00015,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.016,0.0081,0.048,0.049,0.038,5.5e-07,7.4e-07,4.9e-06,0.03,0.03,0.00031,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -21790000,0.78,-0.015,9e-06,-0.63,-0.0075,-0.0014,0.015,-0.01,-0.007,-3.7e+02,-0.0013,-0.006,0.00026,0.0051,-0.058,-0.13,-0.11,-0.024,0.5,-0.00011,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.013,0.014,0.008,0.042,0.043,0.038,5.4e-07,7.2e-07,4.9e-06,0.03,0.03,0.0003,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -21890000,0.78,-0.015,1.2e-05,-0.63,-0.0082,-0.0021,0.016,-0.011,-0.0073,-3.7e+02,-0.0013,-0.006,0.00026,0.0051,-0.058,-0.13,-0.11,-0.024,0.5,-0.00011,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.015,0.0079,0.046,0.047,0.038,5.3e-07,7.2e-07,4.9e-06,0.03,0.03,0.0003,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -21990000,0.78,-0.015,4.2e-05,-0.63,-0.008,0.00059,0.017,-0.01,-0.0036,-3.7e+02,-0.0013,-0.006,0.00027,0.005,-0.058,-0.13,-0.11,-0.024,0.5,-7.6e-05,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.013,0.014,0.0078,0.041,0.042,0.038,5.2e-07,7e-07,4.8e-06,0.03,0.03,0.00029,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -22090000,0.78,-0.015,2.6e-05,-0.63,-0.0078,-0.0008,0.015,-0.011,-0.0036,-3.7e+02,-0.0013,-0.006,0.00027,0.005,-0.058,-0.13,-0.11,-0.024,0.5,-7.6e-05,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.013,0.015,0.0078,0.044,0.046,0.037,5.2e-07,6.9e-07,4.8e-06,0.03,0.03,0.00029,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 -22190000,0.78,-0.015,3.4e-05,-0.63,-0.0063,-0.0016,0.015,-0.0092,-0.0033,-3.7e+02,-0.0013,-0.006,0.00027,0.005,-0.058,-0.13,-0.11,-0.024,0.5,-7.2e-05,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.012,0.014,0.0076,0.04,0.041,0.037,5.1e-07,6.7e-07,4.8e-06,0.03,0.03,0.00028,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 -22290000,0.78,-0.015,5.5e-06,-0.63,-0.006,-0.001,0.015,-0.01,-0.0033,-3.7e+02,-0.0013,-0.006,0.00027,0.0049,-0.058,-0.13,-0.11,-0.024,0.5,-7.1e-05,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.013,0.015,0.0076,0.043,0.045,0.037,5e-07,6.7e-07,4.8e-06,0.03,0.03,0.00027,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 -22390000,0.78,-0.015,-9.4e-06,-0.63,-0.0034,-0.0012,0.017,-0.008,-0.003,-3.7e+02,-0.0013,-0.006,0.00027,0.005,-0.058,-0.13,-0.11,-0.024,0.5,-7.5e-05,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.012,0.014,0.0075,0.039,0.04,0.037,4.9e-07,6.5e-07,4.7e-06,0.03,0.03,0.00027,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 -22490000,0.78,-0.015,-3.2e-05,-0.63,-0.0023,-0.0017,0.018,-0.0077,-0.003,-3.7e+02,-0.0013,-0.006,0.00027,0.005,-0.058,-0.13,-0.11,-0.024,0.5,-7.6e-05,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.013,0.015,0.0074,0.042,0.044,0.037,4.9e-07,6.5e-07,4.7e-06,0.03,0.03,0.00026,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 -22590000,0.78,-0.015,-3.9e-05,-0.63,-0.00047,-0.00053,0.017,-0.006,-0.0022,-3.7e+02,-0.0014,-0.006,0.00028,0.005,-0.058,-0.13,-0.11,-0.024,0.5,-7.3e-05,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.013,0.015,0.0073,0.045,0.046,0.036,4.8e-07,6.4e-07,4.7e-06,0.03,0.03,0.00026,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 -22690000,0.78,-0.015,-0.0001,-0.63,0.00093,-0.0016,0.018,-0.0057,-0.0028,-3.7e+02,-0.0014,-0.006,0.00029,0.0051,-0.058,-0.13,-0.11,-0.024,0.5,-7.5e-05,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.016,0.0073,0.048,0.05,0.036,4.8e-07,6.4e-07,4.7e-06,0.03,0.03,0.00026,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 -22790000,0.78,-0.015,-6.1e-05,-0.63,0.002,-0.0011,0.019,-0.0051,-0.0014,-3.7e+02,-0.0014,-0.006,0.00027,0.0049,-0.057,-0.13,-0.11,-0.024,0.5,-8.1e-05,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.016,0.0072,0.051,0.053,0.036,4.7e-07,6.3e-07,4.7e-06,0.03,0.03,0.00025,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 -22890000,0.78,-0.015,-5.2e-05,-0.63,0.0026,-0.0018,0.021,-0.0055,-0.0017,-3.7e+02,-0.0014,-0.006,0.00027,0.0049,-0.057,-0.13,-0.11,-0.024,0.5,-7.5e-05,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.015,0.017,0.0072,0.055,0.057,0.036,4.7e-07,6.2e-07,4.6e-06,0.03,0.03,0.00025,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 -22990000,0.78,-0.015,-4.6e-05,-0.63,0.0023,-0.0019,0.022,-0.0057,-0.0024,-3.7e+02,-0.0014,-0.006,0.00028,0.005,-0.058,-0.13,-0.11,-0.024,0.5,-7.1e-05,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.015,0.017,0.0071,0.057,0.06,0.036,4.6e-07,6.1e-07,4.6e-06,0.03,0.03,0.00024,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 -23090000,0.78,-0.015,1.8e-05,-0.63,0.0025,-0.0014,0.022,-0.0056,-0.0017,-3.7e+02,-0.0014,-0.006,0.00027,0.0049,-0.058,-0.13,-0.11,-0.024,0.5,-6.8e-05,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.016,0.018,0.007,0.062,0.065,0.036,4.6e-07,6.1e-07,4.6e-06,0.03,0.03,0.00024,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 -23190000,0.78,-0.015,6.8e-06,-0.63,0.0001,-0.00031,0.024,-0.0084,-0.0016,-3.7e+02,-0.0013,-0.006,0.00027,0.0048,-0.058,-0.13,-0.11,-0.024,0.5,-5.2e-05,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.015,0.018,0.0069,0.064,0.067,0.035,4.5e-07,6e-07,4.6e-06,0.03,0.03,0.00023,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 -23290000,0.78,-0.015,7.1e-05,-0.63,-0.00039,0.00019,0.024,-0.009,-0.0019,-3.7e+02,-0.0013,-0.006,0.00028,0.0048,-0.058,-0.13,-0.11,-0.024,0.5,-4.9e-05,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.016,0.019,0.0069,0.07,0.073,0.036,4.5e-07,6e-07,4.6e-06,0.03,0.03,0.00023,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 -23390000,0.78,-0.015,5.2e-05,-0.63,-0.0036,0.0004,0.022,-0.013,-0.0021,-3.7e+02,-0.0013,-0.006,0.00028,0.0048,-0.058,-0.13,-0.11,-0.024,0.5,-3.8e-05,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.016,0.018,0.0068,0.072,0.075,0.035,4.4e-07,5.8e-07,4.5e-06,0.03,0.03,0.00023,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 -23490000,0.78,-0.012,-0.0021,-0.63,0.0017,0.0013,-0.012,-0.014,-0.0029,-3.7e+02,-0.0013,-0.006,0.00029,0.0049,-0.058,-0.13,-0.11,-0.024,0.5,-4.6e-05,-0.091,-0.068,0,0,0.00036,0.00036,0.046,0.017,0.02,0.0068,0.078,0.082,0.035,4.3e-07,5.8e-07,4.5e-06,0.03,0.03,0.00022,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 -23590000,0.78,-0.004,-0.0064,-0.63,0.013,0.0046,-0.043,-0.012,-0.00077,-3.7e+02,-0.0013,-0.006,0.00029,0.0049,-0.059,-0.13,-0.11,-0.024,0.5,-4.2e-05,-0.091,-0.068,0,0,0.00035,0.00034,0.047,0.014,0.016,0.0067,0.062,0.064,0.035,4.2e-07,5.6e-07,4.4e-06,0.03,0.029,0.00022,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 -23690000,0.78,0.0017,-0.0054,-0.63,0.04,0.019,-0.094,-0.01,-1.4e-05,-3.7e+02,-0.0013,-0.006,0.00029,0.005,-0.059,-0.13,-0.11,-0.024,0.5,-0.0001,-0.091,-0.067,0,0,0.00034,0.00034,0.047,0.015,0.017,0.0067,0.066,0.069,0.035,4.2e-07,5.6e-07,4.4e-06,0.03,0.029,0.00022,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 -23790000,0.78,-0.0019,-0.0028,-0.63,0.061,0.036,-0.15,-0.0096,0.0009,-3.7e+02,-0.0013,-0.006,0.0003,0.0053,-0.06,-0.13,-0.11,-0.024,0.5,-0.00021,-0.09,-0.067,0,0,0.00034,0.00034,0.046,0.013,0.015,0.0066,0.055,0.057,0.035,4.1e-07,5.4e-07,4.3e-06,0.03,0.029,0.00021,0.0011,5.6e-05,0.0012,0.00063,0.0012,0.0012,1,1 -23890000,0.78,-0.0083,-0.00086,-0.63,0.075,0.048,-0.2,-0.0023,0.0052,-3.7e+02,-0.0013,-0.006,0.0003,0.0054,-0.06,-0.13,-0.11,-0.024,0.5,-0.00026,-0.09,-0.067,0,0,0.00034,0.00035,0.046,0.014,0.016,0.0066,0.059,0.061,0.035,4.1e-07,5.3e-07,4.3e-06,0.03,0.029,0.00021,0.0011,5.6e-05,0.0012,0.00063,0.0012,0.0012,1,1 -23990000,0.78,-0.013,7.2e-05,-0.63,0.07,0.048,-0.25,-0.0077,0.0037,-3.7e+02,-0.0013,-0.006,0.00029,0.0057,-0.061,-0.13,-0.11,-0.024,0.5,-0.00025,-0.09,-0.067,0,0,0.00035,0.00037,0.046,0.014,0.016,0.0066,0.061,0.064,0.035,4e-07,5.3e-07,4.3e-06,0.03,0.029,0.00021,0.0011,5.6e-05,0.0012,0.00063,0.0012,0.0012,1,1 -24090000,0.78,-0.012,-0.0011,-0.63,0.07,0.047,-0.3,-0.0017,0.0077,-3.7e+02,-0.0013,-0.006,0.0003,0.0057,-0.061,-0.13,-0.11,-0.024,0.5,-0.0003,-0.09,-0.067,0,0,0.00035,0.00036,0.046,0.015,0.018,0.0065,0.066,0.069,0.035,4e-07,5.2e-07,4.3e-06,0.03,0.029,0.00021,0.0011,5.6e-05,0.0012,0.00063,0.0012,0.0012,1,1 -24190000,0.78,-0.0095,-0.0018,-0.63,0.067,0.046,-0.35,-0.0088,0.0055,-3.7e+02,-0.0013,-0.0059,0.00029,0.0061,-0.062,-0.13,-0.11,-0.024,0.5,-0.00031,-0.09,-0.067,0,0,0.00035,0.00035,0.046,0.015,0.017,0.0065,0.068,0.071,0.034,4e-07,5.1e-07,4.3e-06,0.03,0.029,0.0002,0.0011,5.6e-05,0.0012,0.00063,0.0012,0.0012,1,1 -24290000,0.78,-0.0086,-0.0022,-0.63,0.075,0.051,-0.41,-0.0027,0.01,-3.7e+02,-0.0013,-0.006,0.00029,0.0062,-0.062,-0.13,-0.11,-0.024,0.5,-0.00032,-0.09,-0.067,0,0,0.00035,0.00035,0.046,0.016,0.019,0.0065,0.074,0.077,0.034,4e-07,5.1e-07,4.3e-06,0.03,0.029,0.0002,0.0011,5.6e-05,0.0012,0.00063,0.0012,0.0012,1,1 -24390000,0.78,-0.0091,-0.0023,-0.63,0.072,0.05,-0.46,-0.015,0.0037,-3.7e+02,-0.0012,-0.0059,0.00025,0.0069,-0.065,-0.13,-0.11,-0.024,0.5,-0.00033,-0.089,-0.067,0,0,0.00035,0.00035,0.046,0.016,0.018,0.0064,0.076,0.079,0.034,3.9e-07,5e-07,4.2e-06,0.03,0.029,0.0002,0.0011,5.6e-05,0.0012,0.00063,0.0012,0.0012,1,1 -24490000,0.78,-0.0049,-0.0027,-0.63,0.083,0.057,-0.51,-0.0072,0.0089,-3.7e+02,-0.0012,-0.0059,0.00025,0.007,-0.065,-0.13,-0.11,-0.024,0.5,-0.00035,-0.089,-0.067,0,0,0.00034,0.00034,0.046,0.017,0.02,0.0064,0.082,0.086,0.034,3.9e-07,5e-07,4.2e-06,0.03,0.029,0.0002,0.0011,5.6e-05,0.0012,0.00063,0.0012,0.0012,1,1 -24590000,0.78,-0.0015,-0.0028,-0.63,0.087,0.06,-0.56,-0.021,-0.00029,-3.7e+02,-0.0012,-0.0059,0.00024,0.0077,-0.067,-0.13,-0.11,-0.024,0.5,-0.00044,-0.089,-0.068,0,0,0.00034,0.00034,0.046,0.017,0.02,0.0063,0.084,0.088,0.034,3.8e-07,4.9e-07,4.2e-06,0.03,0.029,0.00019,0.0011,5.6e-05,0.0012,0.00062,0.0012,0.0012,1,1 -24690000,0.78,-0.00057,-0.0027,-0.63,0.11,0.076,-0.64,-0.011,0.0054,-3.7e+02,-0.0012,-0.0059,0.00025,0.0079,-0.067,-0.13,-0.11,-0.024,0.5,-0.00061,-0.089,-0.067,0,0,0.00034,0.00034,0.046,0.018,0.021,0.0063,0.09,0.095,0.034,3.8e-07,4.9e-07,4.2e-06,0.03,0.029,0.00019,0.0011,5.5e-05,0.0012,0.00062,0.0012,0.0012,1,1 -24790000,0.78,-0.0022,-0.0025,-0.63,0.11,0.085,-0.73,-0.031,0.00032,-3.7e+02,-0.0012,-0.0059,0.00022,0.0088,-0.07,-0.13,-0.11,-0.025,0.5,-0.00048,-0.089,-0.068,0,0,0.00034,0.00034,0.045,0.018,0.021,0.0062,0.092,0.097,0.034,3.8e-07,4.8e-07,4.1e-06,0.03,0.029,0.00019,0.0011,5.5e-05,0.0012,0.00062,0.0012,0.0012,1,1 -24890000,0.78,-0.00034,-0.004,-0.63,0.13,0.099,-0.75,-0.02,0.0096,-3.7e+02,-0.0012,-0.0059,0.00022,0.009,-0.07,-0.13,-0.11,-0.025,0.5,-0.00056,-0.088,-0.068,0,0,0.00034,0.00034,0.045,0.019,0.022,0.0062,0.099,0.1,0.034,3.7e-07,4.8e-07,4.1e-06,0.03,0.029,0.00019,0.0011,5.5e-05,0.0012,0.00061,0.0012,0.0012,1,1 -24990000,0.78,0.0013,-0.0056,-0.63,0.13,0.11,-0.81,-0.041,0.0027,-3.7e+02,-0.0011,-0.0059,0.00018,0.01,-0.074,-0.13,-0.11,-0.025,0.5,-0.00041,-0.087,-0.068,0,0,0.00033,0.00033,0.045,0.019,0.022,0.0062,0.1,0.11,0.034,3.7e-07,4.7e-07,4.1e-06,0.03,0.029,0.00019,0.0011,5.5e-05,0.0012,0.00061,0.0011,0.0012,1,1 -25090000,0.78,0.0007,-0.0059,-0.63,0.16,0.12,-0.86,-0.027,0.015,-3.7e+02,-0.0011,-0.0059,0.00017,0.01,-0.074,-0.13,-0.11,-0.025,0.5,-0.0004,-0.087,-0.068,0,0,0.00034,0.00033,0.045,0.02,0.023,0.0062,0.11,0.11,0.034,3.7e-07,4.7e-07,4.1e-06,0.03,0.029,0.00018,0.0011,5.5e-05,0.0012,0.00061,0.0011,0.0012,1,1 -25190000,0.78,-0.0015,-0.0054,-0.63,0.15,0.11,-0.91,-0.071,-0.0085,-3.7e+02,-0.0011,-0.0059,0.00013,0.013,-0.08,-0.13,-0.11,-0.025,0.5,-0.00045,-0.086,-0.069,0,0,0.00034,0.00033,0.044,0.02,0.023,0.0061,0.11,0.12,0.033,3.6e-07,4.6e-07,4e-06,0.029,0.029,0.00018,0.0011,5.4e-05,0.0012,0.00059,0.0011,0.0012,1,1 -25290000,0.78,0.0055,-0.0066,-0.63,0.17,0.13,-0.96,-0.055,0.0032,-3.7e+02,-0.0011,-0.0059,0.00013,0.013,-0.08,-0.13,-0.11,-0.025,0.5,-0.00056,-0.086,-0.069,0,0,0.00033,0.00034,0.044,0.021,0.025,0.0061,0.12,0.12,0.033,3.6e-07,4.6e-07,4e-06,0.029,0.029,0.00018,0.0011,5.4e-05,0.0012,0.00059,0.0011,0.0012,1,1 -25390000,0.78,0.011,-0.007,-0.63,0.17,0.13,-1,-0.1,-0.022,-3.7e+02,-0.001,-0.0058,8.5e-05,0.015,-0.087,-0.13,-0.11,-0.025,0.5,-0.00069,-0.085,-0.069,0,0,0.00033,0.00035,0.043,0.02,0.024,0.0061,0.12,0.12,0.033,3.6e-07,4.5e-07,4e-06,0.029,0.029,0.00018,0.0011,5.4e-05,0.0012,0.00058,0.0011,0.0012,1,1 -25490000,0.78,0.013,-0.0072,-0.63,0.21,0.16,-1.1,-0.084,-0.0084,-3.7e+02,-0.001,-0.0058,0.0001,0.015,-0.088,-0.13,-0.11,-0.025,0.5,-0.001,-0.084,-0.068,0,0,0.00033,0.00036,0.043,0.022,0.026,0.0061,0.13,0.13,0.033,3.6e-07,4.5e-07,4e-06,0.029,0.029,0.00018,0.0011,5.3e-05,0.0012,0.00058,0.0011,0.0012,1,1 -25590000,0.78,0.01,-0.007,-0.63,0.25,0.19,-1.1,-0.061,0.0083,-3.7e+02,-0.00099,-0.0058,0.00011,0.016,-0.088,-0.13,-0.12,-0.025,0.5,-0.0013,-0.083,-0.068,0,0,0.00033,0.00035,0.042,0.024,0.028,0.0061,0.14,0.14,0.033,3.6e-07,4.5e-07,3.9e-06,0.029,0.029,0.00017,0.0011,5.3e-05,0.0011,0.00057,0.0011,0.0011,1,1 -25690000,0.78,0.017,-0.0099,-0.63,0.29,0.21,-1.2,-0.035,0.027,-3.7e+02,-0.00099,-0.0058,0.00012,0.016,-0.089,-0.13,-0.12,-0.026,0.5,-0.0016,-0.082,-0.067,0,0,0.00033,0.00038,0.042,0.025,0.031,0.0061,0.14,0.15,0.033,3.6e-07,4.5e-07,3.9e-06,0.029,0.029,0.00017,0.001,5.2e-05,0.0011,0.00057,0.0011,0.0011,1,1 -25790000,0.78,0.024,-0.012,-0.63,0.35,0.25,-1.2,-0.003,0.048,-3.7e+02,-0.00099,-0.0058,0.00014,0.016,-0.089,-0.13,-0.12,-0.026,0.5,-0.0021,-0.081,-0.067,0,0,0.00034,0.00043,0.041,0.027,0.034,0.0061,0.15,0.16,0.033,3.6e-07,4.5e-07,3.9e-06,0.029,0.029,0.00017,0.001,5.1e-05,0.0011,0.00056,0.0011,0.0011,1,1 -25890000,0.77,0.024,-0.012,-0.63,0.41,0.28,-1.3,0.036,0.071,-3.7e+02,-0.00098,-0.0058,0.00017,0.017,-0.09,-0.13,-0.12,-0.026,0.5,-0.0028,-0.079,-0.066,0,0,0.00034,0.00043,0.04,0.029,0.037,0.0061,0.16,0.18,0.033,3.6e-07,4.5e-07,3.9e-06,0.029,0.029,0.00017,0.001,5e-05,0.0011,0.00055,0.001,0.0011,1,1 -25990000,0.77,0.021,-0.012,-0.63,0.47,0.32,-1.3,0.079,0.099,-3.7e+02,-0.00098,-0.0058,0.00018,0.017,-0.09,-0.13,-0.12,-0.027,0.5,-0.0031,-0.078,-0.065,0,0,0.00033,0.0004,0.04,0.031,0.04,0.0061,0.18,0.19,0.033,3.6e-07,4.6e-07,3.9e-06,0.029,0.029,0.00017,0.00098,4.9e-05,0.0011,0.00054,0.001,0.0011,1,1 -26090000,0.78,0.031,-0.015,-0.63,0.52,0.35,-1.3,0.13,0.13,-3.7e+02,-0.00098,-0.0058,0.00017,0.018,-0.091,-0.13,-0.12,-0.027,0.5,-0.003,-0.077,-0.064,0,0,0.00034,0.00049,0.038,0.033,0.044,0.0061,0.19,0.2,0.033,3.6e-07,4.6e-07,3.8e-06,0.029,0.029,0.00017,0.00096,4.8e-05,0.0011,0.00053,0.001,0.0011,1,1 -26190000,0.78,0.041,-0.017,-0.63,0.59,0.4,-1.3,0.18,0.17,-3.7e+02,-0.00097,-0.0058,0.00018,0.019,-0.092,-0.13,-0.13,-0.028,0.5,-0.0036,-0.074,-0.062,0,0,0.00036,0.00057,0.037,0.036,0.048,0.0061,0.2,0.22,0.033,3.6e-07,4.6e-07,3.8e-06,0.029,0.029,0.00017,0.00093,4.7e-05,0.001,0.00052,0.00097,0.001,1,1 -26290000,0.77,0.043,-0.018,-0.63,0.68,0.45,-1.3,0.24,0.21,-3.7e+02,-0.00096,-0.0058,0.00017,0.02,-0.093,-0.13,-0.13,-0.028,0.49,-0.0038,-0.071,-0.061,0,0,0.00036,0.00059,0.036,0.038,0.052,0.0061,0.21,0.23,0.033,3.6e-07,4.6e-07,3.8e-06,0.029,0.029,0.00016,0.0009,4.5e-05,0.001,0.00051,0.00094,0.001,1,1 -26390000,0.77,0.04,-0.017,-0.63,0.76,0.5,-1.3,0.32,0.26,-3.7e+02,-0.00096,-0.0058,0.00018,0.021,-0.093,-0.13,-0.13,-0.028,0.49,-0.0043,-0.069,-0.06,0,0,0.00035,0.00054,0.034,0.041,0.057,0.0061,0.23,0.25,0.033,3.6e-07,4.6e-07,3.8e-06,0.029,0.029,0.00016,0.00087,4.4e-05,0.00098,0.00049,0.00091,0.00098,1,1 -26490000,0.77,0.056,-0.024,-0.63,0.84,0.56,-1.3,0.39,0.31,-3.7e+02,-0.00096,-0.0058,0.00018,0.022,-0.094,-0.13,-0.13,-0.029,0.49,-0.0044,-0.067,-0.058,0,0,0.00037,0.00073,0.032,0.044,0.061,0.0061,0.24,0.27,0.033,3.6e-07,4.6e-07,3.7e-06,0.029,0.029,0.00016,0.00084,4.2e-05,0.00094,0.00047,0.00087,0.00094,1,1 -26590000,0.77,0.073,-0.029,-0.63,0.95,0.64,-1.3,0.48,0.37,-3.7e+02,-0.00095,-0.0058,0.00015,0.024,-0.095,-0.13,-0.13,-0.03,0.49,-0.004,-0.064,-0.056,0,0,0.00041,0.00096,0.03,0.047,0.068,0.0061,0.26,0.29,0.033,3.6e-07,4.6e-07,3.7e-06,0.029,0.029,0.00016,0.00079,4e-05,0.00089,0.00045,0.00082,0.00089,1,1 -26690000,0.77,0.076,-0.03,-0.64,1.1,0.71,-1.3,0.58,0.43,-3.7e+02,-0.00095,-0.0058,0.00016,0.025,-0.096,-0.13,-0.14,-0.031,0.49,-0.0049,-0.059,-0.052,0,0,0.00041,0.00095,0.028,0.051,0.074,0.0061,0.28,0.31,0.033,3.6e-07,4.6e-07,3.7e-06,0.029,0.029,0.00016,0.00074,3.7e-05,0.00083,0.00043,0.00077,0.00083,1,1 -26790000,0.77,0.07,-0.029,-0.64,1.2,0.79,-1.3,0.69,0.51,-3.7e+02,-0.00094,-0.0058,0.00014,0.027,-0.096,-0.13,-0.14,-0.031,0.48,-0.0047,-0.055,-0.049,0,0,0.00039,0.00082,0.026,0.054,0.08,0.0061,0.3,0.33,0.033,3.6e-07,4.6e-07,3.7e-06,0.029,0.029,0.00016,0.0007,3.5e-05,0.00079,0.0004,0.00072,0.00079,1,1 -26890000,0.76,0.093,-0.036,-0.64,1.3,0.87,-1.3,0.82,0.59,-3.7e+02,-0.00094,-0.0058,0.00014,0.028,-0.096,-0.13,-0.15,-0.032,0.48,-0.0053,-0.052,-0.047,0,0,0.00043,0.0011,0.024,0.057,0.086,0.0061,0.32,0.35,0.033,3.6e-07,4.6e-07,3.7e-06,0.029,0.029,0.00016,0.00066,3.3e-05,0.00075,0.00038,0.00068,0.00074,1,1 -26990000,0.76,0.12,-0.041,-0.64,1.5,0.98,-1.3,0.97,0.68,-3.7e+02,-0.00094,-0.0058,0.00013,0.03,-0.097,-0.13,-0.15,-0.034,0.48,-0.0056,-0.046,-0.043,0,0,0.00049,0.0014,0.021,0.06,0.092,0.0061,0.34,0.38,0.033,3.6e-07,4.6e-07,3.6e-06,0.029,0.029,0.00015,0.0006,3.1e-05,0.00067,0.00035,0.00062,0.00067,1,1 -27090000,0.76,0.12,-0.041,-0.64,1.7,1.1,-1.3,1.1,0.79,-3.7e+02,-0.00094,-0.0059,0.00011,0.032,-0.097,-0.13,-0.16,-0.035,0.47,-0.0056,-0.041,-0.038,0,0,0.00048,0.0013,0.018,0.064,0.099,0.0061,0.36,0.4,0.033,3.6e-07,4.6e-07,3.6e-06,0.029,0.029,0.00015,0.00054,2.8e-05,0.00061,0.00032,0.00056,0.0006,1,1 -27190000,0.76,0.11,-0.039,-0.64,1.9,1.2,-1.2,1.3,0.91,-3.7e+02,-0.00095,-0.0059,9e-05,0.034,-0.097,-0.13,-0.16,-0.035,0.47,-0.0053,-0.038,-0.035,0,0,0.00044,0.0011,0.017,0.067,0.11,0.0061,0.38,0.43,0.034,3.6e-07,4.7e-07,3.6e-06,0.029,0.029,0.00015,0.00051,2.6e-05,0.00056,0.0003,0.00052,0.00056,1,1 -27290000,0.76,0.093,-0.034,-0.64,2,1.3,-1.2,1.5,1,-3.7e+02,-0.00095,-0.0059,8.2e-05,0.034,-0.095,-0.13,-0.16,-0.036,0.47,-0.0055,-0.035,-0.033,0,0,0.0004,0.00082,0.015,0.069,0.11,0.0061,0.4,0.46,0.033,3.6e-07,4.7e-07,3.6e-06,0.029,0.029,0.00015,0.00048,2.5e-05,0.00053,0.00028,0.00049,0.00053,1,1 -27390000,0.76,0.077,-0.03,-0.64,2.1,1.4,-1.2,1.7,1.2,-3.7e+02,-0.00095,-0.0059,7.7e-05,0.035,-0.094,-0.13,-0.17,-0.036,0.47,-0.0054,-0.033,-0.032,0,0,0.00037,0.00063,0.014,0.07,0.11,0.0062,0.43,0.49,0.033,3.7e-07,4.7e-07,3.6e-06,0.029,0.029,0.00015,0.00045,2.4e-05,0.00051,0.00026,0.00047,0.00051,1,1 -27490000,0.76,0.061,-0.025,-0.64,2.2,1.4,-1.2,1.9,1.3,-3.7e+02,-0.00095,-0.0059,6.8e-05,0.035,-0.092,-0.13,-0.17,-0.037,0.47,-0.0052,-0.032,-0.032,0,0,0.00036,0.00051,0.012,0.071,0.11,0.0062,0.45,0.53,0.033,3.7e-07,4.7e-07,3.6e-06,0.029,0.029,0.00015,0.00044,2.3e-05,0.0005,0.00025,0.00046,0.0005,1,1 -27590000,0.77,0.048,-0.022,-0.64,2.3,1.5,-1.2,2.2,1.5,-3.7e+02,-0.00095,-0.0059,5.7e-05,0.036,-0.089,-0.13,-0.17,-0.037,0.47,-0.0048,-0.031,-0.031,0,0,0.00035,0.00045,0.011,0.072,0.11,0.0062,0.48,0.56,0.033,3.7e-07,4.7e-07,3.6e-06,0.029,0.029,0.00015,0.00043,2.3e-05,0.00049,0.00024,0.00045,0.00049,1,1 -27690000,0.77,0.047,-0.021,-0.64,2.3,1.5,-1.2,2.4,1.6,-3.7e+02,-0.00095,-0.0059,4.6e-05,0.036,-0.088,-0.13,-0.17,-0.037,0.47,-0.0045,-0.031,-0.031,0,0,0.00035,0.00043,0.011,0.072,0.11,0.0062,0.51,0.6,0.033,3.7e-07,4.7e-07,3.6e-06,0.029,0.029,0.00015,0.00043,2.2e-05,0.00049,0.00023,0.00044,0.00049,1,1 -27790000,0.77,0.049,-0.021,-0.64,2.3,1.6,-1.2,2.6,1.8,-3.7e+02,-0.00095,-0.0059,3.2e-05,0.037,-0.086,-0.13,-0.17,-0.037,0.47,-0.004,-0.03,-0.031,0,0,0.00035,0.00043,0.0097,0.073,0.11,0.0062,0.54,0.63,0.033,3.7e-07,4.7e-07,3.6e-06,0.029,0.029,0.00014,0.00042,2.2e-05,0.00049,0.00022,0.00044,0.00049,1,1 -27890000,0.77,0.047,-0.021,-0.64,2.4,1.6,-1.2,2.8,2,-3.7e+02,-0.00095,-0.0059,3.1e-05,0.037,-0.085,-0.13,-0.17,-0.037,0.47,-0.004,-0.03,-0.03,0,0,0.00035,0.00042,0.0092,0.074,0.11,0.0063,0.57,0.67,0.034,3.7e-07,4.7e-07,3.6e-06,0.029,0.029,0.00014,0.00041,2.1e-05,0.00048,0.00021,0.00043,0.00048,1,1 -27990000,0.77,0.043,-0.02,-0.64,2.4,1.6,-1.2,3.1,2.1,-3.7e+02,-0.00095,-0.0059,2.8e-05,0.037,-0.083,-0.13,-0.17,-0.037,0.47,-0.004,-0.03,-0.03,0,0,0.00035,0.00041,0.0086,0.075,0.11,0.0063,0.61,0.71,0.033,3.7e-07,4.7e-07,3.6e-06,0.029,0.029,0.00014,0.00041,2.1e-05,0.00048,0.00021,0.00043,0.00048,1,1 -28090000,0.77,0.057,-0.024,-0.64,2.4,1.6,-1.2,3.3,2.3,-3.7e+02,-0.00095,-0.0059,1.5e-05,0.037,-0.081,-0.13,-0.17,-0.037,0.47,-0.0035,-0.029,-0.03,0,0,0.00035,0.00044,0.0081,0.076,0.11,0.0063,0.64,0.76,0.033,3.7e-07,4.7e-07,3.6e-06,0.029,0.029,0.00014,0.0004,2.1e-05,0.00048,0.0002,0.00042,0.00048,1,1 -28190000,0.77,0.07,-0.028,-0.64,2.5,1.7,-0.93,3.5,2.5,-3.7e+02,-0.00095,-0.0059,1.3e-05,0.037,-0.08,-0.13,-0.17,-0.038,0.47,-0.0036,-0.029,-0.03,0,0,0.00036,0.00049,0.0076,0.077,0.11,0.0064,0.68,0.8,0.034,3.7e-07,4.7e-07,3.6e-06,0.029,0.029,0.00014,0.00039,2e-05,0.00047,0.0002,0.00041,0.00047,1,1 -28290000,0.77,0.053,-0.022,-0.64,2.5,1.7,-0.064,3.8,2.6,-3.7e+02,-0.00095,-0.0059,2.7e-06,0.038,-0.077,-0.13,-0.17,-0.038,0.46,-0.0033,-0.027,-0.029,0,0,0.00035,0.00042,0.0073,0.076,0.1,0.0065,0.72,0.85,0.034,3.7e-07,4.8e-07,3.6e-06,0.029,0.029,0.00014,0.00038,2e-05,0.00047,0.00019,0.00041,0.00047,1,1 -28390000,0.77,0.02,-0.0092,-0.64,2.5,1.7,0.8,4,2.8,-3.7e+02,-0.00095,-0.0059,-6.1e-06,0.038,-0.074,-0.13,-0.17,-0.038,0.46,-0.0032,-0.027,-0.029,0,0,0.00034,0.00036,0.007,0.075,0.1,0.0065,0.76,0.9,0.033,3.7e-07,4.8e-07,3.6e-06,0.029,0.029,0.00014,0.00038,2e-05,0.00047,0.00019,0.0004,0.00046,1,1 -28490000,0.77,0.0012,-0.0024,-0.64,2.4,1.7,1.1,4.3,3,-3.7e+02,-0.00096,-0.0058,-1.3e-05,0.038,-0.071,-0.13,-0.17,-0.038,0.46,-0.0032,-0.027,-0.029,0,0,0.00034,0.00036,0.0067,0.075,0.1,0.0066,0.8,0.95,0.034,3.6e-07,4.8e-07,3.6e-06,0.029,0.029,0.00014,0.00038,2e-05,0.00046,0.00019,0.0004,0.00046,1,1 -28590000,0.77,-0.0025,-0.00096,-0.64,2.4,1.6,0.99,4.5,3.1,-3.7e+02,-0.00096,-0.0058,-1.4e-05,0.037,-0.07,-0.13,-0.17,-0.038,0.46,-0.0032,-0.027,-0.029,0,0,0.00034,0.00036,0.0065,0.076,0.1,0.0066,0.83,1,0.034,3.6e-07,4.8e-07,3.5e-06,0.029,0.028,0.00014,0.00038,2e-05,0.00046,0.00018,0.0004,0.00046,1,1 -28690000,0.77,-0.0034,-0.00039,-0.64,2.3,1.6,0.99,4.8,3.3,-3.7e+02,-0.00097,-0.0058,-2.2e-05,0.037,-0.07,-0.12,-0.17,-0.038,0.46,-0.0031,-0.027,-0.029,0,0,0.00034,0.00036,0.0062,0.077,0.1,0.0066,0.87,1,0.034,3.6e-07,4.8e-07,3.5e-06,0.029,0.028,0.00013,0.00038,2e-05,0.00046,0.00018,0.0004,0.00046,1,1 -28790000,0.77,-0.0037,-0.00017,-0.63,2.2,1.6,1,5,3.5,-3.7e+02,-0.00097,-0.0058,-3e-05,0.037,-0.067,-0.12,-0.17,-0.038,0.46,-0.0029,-0.027,-0.029,0,0,0.00034,0.00037,0.006,0.078,0.1,0.0067,0.92,1.1,0.034,3.6e-07,4.8e-07,3.5e-06,0.029,0.028,0.00013,0.00037,2e-05,0.00046,0.00018,0.0004,0.00046,1,1 -28890000,0.77,-0.0034,-0.00018,-0.63,2.2,1.6,0.99,5.2,3.6,-3.7e+02,-0.00099,-0.0058,-3.7e-05,0.036,-0.066,-0.12,-0.17,-0.038,0.46,-0.0029,-0.027,-0.028,0,0,0.00034,0.00037,0.0058,0.079,0.1,0.0067,0.96,1.2,0.034,3.5e-07,4.8e-07,3.5e-06,0.029,0.028,0.00013,0.00037,2e-05,0.00045,0.00018,0.0004,0.00045,1,1 -28990000,0.77,-0.0029,-0.00037,-0.63,2.1,1.5,0.98,5.4,3.8,-3.7e+02,-0.001,-0.0058,-5e-05,0.036,-0.064,-0.12,-0.17,-0.038,0.46,-0.0027,-0.027,-0.028,0,0,0.00034,0.00037,0.0056,0.08,0.1,0.0068,1,1.2,0.034,3.5e-07,4.8e-07,3.5e-06,0.029,0.028,0.00013,0.00037,2e-05,0.00045,0.00017,0.0004,0.00045,1,1 -29090000,0.78,-0.0025,-0.00053,-0.63,2.1,1.5,0.98,5.7,4,-3.7e+02,-0.001,-0.0058,-5.8e-05,0.035,-0.062,-0.12,-0.17,-0.038,0.46,-0.0026,-0.027,-0.028,0,0,0.00034,0.00037,0.0055,0.081,0.11,0.0068,1.1,1.3,0.034,3.5e-07,4.8e-07,3.5e-06,0.029,0.028,0.00013,0.00037,2e-05,0.00045,0.00017,0.0004,0.00045,1,1 -29190000,0.77,-0.0021,-0.00061,-0.63,2,1.5,0.97,5.9,4.1,-3.7e+02,-0.001,-0.0058,-5.7e-05,0.035,-0.062,-0.12,-0.17,-0.038,0.46,-0.0026,-0.027,-0.028,0,0,0.00034,0.00037,0.0053,0.083,0.11,0.0069,1.1,1.3,0.034,3.5e-07,4.8e-07,3.5e-06,0.029,0.028,0.00013,0.00037,2e-05,0.00045,0.00017,0.0004,0.00045,1,1 -29290000,0.78,-0.0012,-0.00091,-0.63,1.9,1.4,1,6.1,4.2,-3.7e+02,-0.001,-0.0058,-6.5e-05,0.034,-0.06,-0.12,-0.17,-0.038,0.46,-0.0025,-0.027,-0.028,0,0,0.00033,0.00037,0.0052,0.084,0.11,0.0069,1.1,1.4,0.034,3.4e-07,4.9e-07,3.5e-06,0.029,0.027,0.00013,0.00037,1.9e-05,0.00045,0.00017,0.0004,0.00045,1,1 -29390000,0.78,0.00023,-0.0012,-0.63,1.9,1.4,1,6.2,4.4,-3.7e+02,-0.001,-0.0058,-7.8e-05,0.033,-0.058,-0.12,-0.17,-0.038,0.46,-0.0022,-0.027,-0.028,0,0,0.00033,0.00037,0.0051,0.086,0.11,0.0069,1.2,1.5,0.034,3.4e-07,4.9e-07,3.5e-06,0.029,0.027,0.00013,0.00037,1.9e-05,0.00044,0.00017,0.0004,0.00044,1,1 -29490000,0.78,0.0014,-0.0016,-0.63,1.8,1.4,1,6.4,4.5,-3.7e+02,-0.001,-0.0058,-8.2e-05,0.033,-0.056,-0.12,-0.17,-0.038,0.46,-0.0022,-0.027,-0.028,0,0,0.00033,0.00037,0.005,0.087,0.12,0.007,1.3,1.6,0.034,3.4e-07,4.9e-07,3.5e-06,0.029,0.027,0.00013,0.00037,1.9e-05,0.00044,0.00017,0.0004,0.00044,1,1 -29590000,0.78,0.0025,-0.0019,-0.63,1.8,1.4,1,6.6,4.7,-3.7e+02,-0.001,-0.0058,-8.7e-05,0.032,-0.054,-0.12,-0.17,-0.038,0.46,-0.0021,-0.027,-0.028,0,0,0.00033,0.00037,0.0049,0.089,0.12,0.007,1.3,1.6,0.034,3.4e-07,4.9e-07,3.5e-06,0.029,0.027,0.00012,0.00037,1.9e-05,0.00044,0.00017,0.0004,0.00044,1,1 -29690000,0.78,0.0033,-0.0021,-0.63,1.8,1.4,0.99,6.8,4.8,-3.7e+02,-0.001,-0.0058,-9.4e-05,0.031,-0.052,-0.12,-0.17,-0.038,0.46,-0.002,-0.028,-0.028,0,0,0.00033,0.00037,0.0048,0.091,0.12,0.007,1.4,1.7,0.034,3.4e-07,4.9e-07,3.5e-06,0.029,0.027,0.00012,0.00037,1.9e-05,0.00044,0.00016,0.0004,0.00044,1,1 -29790000,0.78,0.0038,-0.0024,-0.63,1.7,1.4,0.98,7,5,-3.7e+02,-0.001,-0.0058,-9.7e-05,0.03,-0.048,-0.12,-0.17,-0.038,0.46,-0.002,-0.028,-0.028,0,0,0.00033,0.00037,0.0047,0.093,0.13,0.007,1.4,1.8,0.034,3.4e-07,4.9e-07,3.5e-06,0.029,0.027,0.00012,0.00037,1.9e-05,0.00044,0.00016,0.0004,0.00044,1,1 -29890000,0.78,0.0042,-0.0025,-0.63,1.7,1.3,0.97,7.2,5.1,-3.7e+02,-0.001,-0.0058,-0.00011,0.029,-0.045,-0.12,-0.17,-0.038,0.46,-0.0019,-0.028,-0.028,0,0,0.00033,0.00038,0.0046,0.095,0.13,0.0071,1.5,1.9,0.034,3.3e-07,4.9e-07,3.5e-06,0.029,0.027,0.00012,0.00037,1.9e-05,0.00044,0.00016,0.0004,0.00044,1,1 -29990000,0.78,0.0043,-0.0025,-0.63,1.6,1.3,0.95,7.3,5.2,-3.7e+02,-0.0011,-0.0058,-0.00011,0.028,-0.042,-0.12,-0.17,-0.038,0.46,-0.0018,-0.028,-0.028,0,0,0.00033,0.00038,0.0046,0.097,0.14,0.0071,1.5,2,0.034,3.3e-07,4.9e-07,3.5e-06,0.029,0.026,0.00012,0.00037,1.9e-05,0.00044,0.00016,0.0004,0.00044,1,1 -30090000,0.78,0.0043,-0.0025,-0.63,1.6,1.3,0.94,7.5,5.4,-3.7e+02,-0.0011,-0.0058,-0.00012,0.027,-0.04,-0.12,-0.17,-0.038,0.46,-0.0016,-0.028,-0.028,0,0,0.00033,0.00038,0.0045,0.099,0.14,0.0071,1.6,2.1,0.034,3.3e-07,4.9e-07,3.5e-06,0.029,0.026,0.00012,0.00037,1.9e-05,0.00044,0.00016,0.00039,0.00044,1,1 -30190000,0.78,0.004,-0.0024,-0.63,1.6,1.3,0.93,7.7,5.5,-3.7e+02,-0.0011,-0.0058,-0.00011,0.026,-0.04,-0.12,-0.17,-0.038,0.46,-0.0017,-0.028,-0.028,0,0,0.00032,0.00038,0.0044,0.1,0.15,0.0071,1.7,2.2,0.034,3.3e-07,4.9e-07,3.5e-06,0.029,0.026,0.00012,0.00037,1.9e-05,0.00044,0.00016,0.00039,0.00044,1,1 -30290000,0.78,0.0039,-0.0024,-0.63,1.5,1.3,0.92,7.8,5.6,-3.7e+02,-0.0011,-0.0058,-0.00012,0.026,-0.038,-0.12,-0.17,-0.038,0.46,-0.0016,-0.028,-0.028,0,0,0.00032,0.00038,0.0044,0.1,0.15,0.0071,1.8,2.3,0.034,3.3e-07,4.9e-07,3.5e-06,0.029,0.026,0.00012,0.00036,1.9e-05,0.00044,0.00016,0.00039,0.00044,1,1 -30390000,0.78,0.0038,-0.0024,-0.63,1.5,1.3,0.9,8,5.8,-3.7e+02,-0.0011,-0.0058,-0.00012,0.025,-0.035,-0.12,-0.17,-0.038,0.46,-0.0015,-0.028,-0.027,0,0,0.00032,0.00038,0.0043,0.11,0.16,0.0071,1.8,2.4,0.034,3.2e-07,5e-07,3.5e-06,0.029,0.026,0.00012,0.00036,1.9e-05,0.00044,0.00016,0.00039,0.00043,1,1 -30490000,0.78,0.0036,-0.0024,-0.63,1.5,1.2,0.89,8.2,5.9,-3.7e+02,-0.0011,-0.0058,-0.00012,0.024,-0.033,-0.12,-0.17,-0.038,0.46,-0.0015,-0.028,-0.027,0,0,0.00032,0.00038,0.0043,0.11,0.16,0.0071,1.9,2.5,0.035,3.2e-07,5e-07,3.5e-06,0.029,0.026,0.00011,0.00036,1.9e-05,0.00043,0.00016,0.00039,0.00043,1,1 -30590000,0.78,0.0033,-0.0023,-0.63,1.5,1.2,0.85,8.3,6,-3.7e+02,-0.0011,-0.0058,-0.00012,0.023,-0.029,-0.12,-0.17,-0.038,0.46,-0.0015,-0.028,-0.027,0,0,0.00032,0.00038,0.0042,0.11,0.17,0.0071,2,2.6,0.035,3.2e-07,5e-07,3.5e-06,0.029,0.026,0.00011,0.00036,1.9e-05,0.00043,0.00016,0.00039,0.00043,1,1 -30690000,0.78,0.0031,-0.0022,-0.63,1.4,1.2,0.84,8.5,6.1,-3.7e+02,-0.0011,-0.0058,-0.00013,0.022,-0.026,-0.12,-0.17,-0.038,0.46,-0.0014,-0.028,-0.027,0,0,0.00032,0.00039,0.0042,0.11,0.18,0.0071,2.1,2.7,0.035,3.2e-07,5e-07,3.5e-06,0.029,0.025,0.00011,0.00036,1.9e-05,0.00043,0.00016,0.00039,0.00043,1,1 -30790000,0.78,0.0028,-0.0021,-0.63,1.4,1.2,0.83,8.6,6.2,-3.7e+02,-0.0011,-0.0058,-0.00013,0.021,-0.026,-0.12,-0.17,-0.038,0.46,-0.0013,-0.028,-0.027,0,0,0.00032,0.00039,0.0042,0.12,0.18,0.0071,2.1,2.8,0.035,3.2e-07,5e-07,3.5e-06,0.029,0.025,0.00011,0.00036,1.9e-05,0.00043,0.00016,0.00039,0.00043,1,1 -30890000,0.78,0.0024,-0.0021,-0.63,1.4,1.2,0.82,8.8,6.4,-3.7e+02,-0.0011,-0.0058,-0.00014,0.02,-0.023,-0.12,-0.17,-0.038,0.46,-0.0013,-0.028,-0.027,0,0,0.00031,0.00039,0.0041,0.12,0.19,0.0071,2.2,3,0.035,3.2e-07,5e-07,3.5e-06,0.029,0.025,0.00011,0.00036,1.9e-05,0.00043,0.00016,0.00039,0.00043,1,1 -30990000,0.78,0.002,-0.002,-0.63,1.3,1.2,0.81,8.9,6.5,-3.7e+02,-0.0011,-0.0058,-0.00014,0.019,-0.02,-0.12,-0.17,-0.038,0.46,-0.0012,-0.028,-0.027,0,0,0.00031,0.00039,0.0041,0.12,0.2,0.0071,2.3,3.1,0.035,3.2e-07,5e-07,3.5e-06,0.029,0.025,0.00011,0.00036,1.9e-05,0.00043,0.00016,0.00039,0.00043,1,1 -31090000,0.78,0.0016,-0.0019,-0.63,1.3,1.2,0.8,9,6.6,-3.7e+02,-0.0011,-0.0058,-0.00014,0.018,-0.017,-0.12,-0.17,-0.038,0.46,-0.0011,-0.028,-0.027,0,0,0.00031,0.00039,0.0041,0.12,0.2,0.0071,2.4,3.3,0.035,3.1e-07,5e-07,3.5e-06,0.029,0.025,0.00011,0.00036,1.9e-05,0.00043,0.00016,0.00039,0.00043,1,1 -31190000,0.78,0.0013,-0.0018,-0.63,1.3,1.1,0.79,9.2,6.7,-3.7e+02,-0.0011,-0.0058,-0.00014,0.016,-0.013,-0.12,-0.17,-0.038,0.46,-0.001,-0.029,-0.027,0,0,0.00031,0.00039,0.004,0.13,0.21,0.0071,2.5,3.4,0.035,3.1e-07,5e-07,3.5e-06,0.029,0.025,0.00011,0.00036,1.9e-05,0.00043,0.00016,0.00039,0.00043,1,1 -31290000,0.78,0.00086,-0.0016,-0.63,1.2,1.1,0.8,9.3,6.8,-3.7e+02,-0.0011,-0.0058,-0.00015,0.015,-0.01,-0.12,-0.17,-0.038,0.46,-0.00098,-0.029,-0.027,0,0,0.00031,0.0004,0.004,0.13,0.22,0.0071,2.6,3.6,0.035,3.1e-07,5e-07,3.5e-06,0.029,0.024,0.00011,0.00036,1.9e-05,0.00043,0.00016,0.00039,0.00043,1,1 -31390000,0.78,0.00028,-0.0014,-0.63,1.2,1.1,0.79,9.4,6.9,-3.7e+02,-0.0011,-0.0058,-0.00015,0.014,-0.0074,-0.12,-0.17,-0.038,0.46,-0.00091,-0.029,-0.027,0,0,0.00031,0.0004,0.004,0.13,0.23,0.007,2.7,3.7,0.035,3.1e-07,5e-07,3.5e-06,0.028,0.024,0.00011,0.00036,1.9e-05,0.00043,0.00016,0.00039,0.00043,1,1 -31490000,0.78,-0.00022,-0.0013,-0.63,1.2,1.1,0.79,9.6,7.1,-3.7e+02,-0.0011,-0.0058,-0.00016,0.013,-0.0047,-0.12,-0.17,-0.038,0.46,-0.00079,-0.029,-0.027,0,0,0.0003,0.0004,0.004,0.13,0.23,0.007,2.8,3.9,0.035,3.1e-07,5.1e-07,3.5e-06,0.028,0.024,0.0001,0.00036,1.9e-05,0.00043,0.00016,0.00039,0.00043,1,1 -31590000,0.78,-0.00052,-0.0013,-0.63,1.1,1.1,0.79,9.7,7.2,-3.7e+02,-0.0011,-0.0058,-0.00015,0.011,-0.0025,-0.12,-0.17,-0.038,0.46,-0.00074,-0.029,-0.027,0,0,0.0003,0.0004,0.0039,0.14,0.24,0.007,2.9,4.1,0.035,3.1e-07,5.1e-07,3.5e-06,0.028,0.024,0.0001,0.00036,1.9e-05,0.00043,0.00016,0.00039,0.00042,1,1 -31690000,0.78,-0.0011,-0.0011,-0.63,1.1,1.1,0.79,9.8,7.3,-3.7e+02,-0.0011,-0.0058,-0.00016,0.01,0.0001,-0.11,-0.17,-0.038,0.46,-0.00067,-0.029,-0.027,0,0,0.0003,0.0004,0.0039,0.14,0.25,0.007,3,4.3,0.035,3e-07,5.1e-07,3.5e-06,0.028,0.024,0.0001,0.00036,1.9e-05,0.00043,0.00016,0.00039,0.00042,1,1 -31790000,0.78,-0.0017,-0.00095,-0.63,1.1,1.1,0.79,10,7.4,-3.7e+02,-0.0011,-0.0058,-0.00016,0.0087,0.0031,-0.11,-0.17,-0.038,0.46,-0.0006,-0.029,-0.027,0,0,0.0003,0.0004,0.0039,0.14,0.26,0.007,3.1,4.5,0.035,3e-07,5.1e-07,3.5e-06,0.028,0.024,0.0001,0.00036,1.9e-05,0.00042,0.00016,0.00039,0.00042,1,1 -31890000,0.78,-0.0023,-0.00084,-0.63,1.1,1,0.79,10,7.5,-3.7e+02,-0.0012,-0.0058,-0.00016,0.0074,0.0063,-0.11,-0.17,-0.038,0.46,-0.00051,-0.029,-0.027,0,0,0.0003,0.00041,0.0039,0.14,0.27,0.0069,3.2,4.7,0.035,3e-07,5.1e-07,3.5e-06,0.028,0.023,0.0001,0.00036,1.9e-05,0.00042,0.00016,0.00039,0.00042,1,1 -31990000,0.78,-0.0027,-0.00074,-0.63,1,1,0.78,10,7.6,-3.7e+02,-0.0012,-0.0058,-0.00017,0.0059,0.0098,-0.11,-0.17,-0.038,0.46,-0.0004,-0.029,-0.027,0,0,0.0003,0.00041,0.0039,0.15,0.28,0.0069,3.3,4.9,0.035,3e-07,5.1e-07,3.5e-06,0.028,0.023,0.0001,0.00036,1.9e-05,0.00042,0.00016,0.00039,0.00042,1,1 -32090000,0.78,-0.0033,-0.00054,-0.63,1,1,0.79,10,7.7,-3.7e+02,-0.0012,-0.0058,-0.00017,0.0043,0.012,-0.11,-0.17,-0.038,0.46,-0.0003,-0.029,-0.027,0,0,0.00029,0.00041,0.0039,0.15,0.29,0.0069,3.4,5.1,0.035,3e-07,5.1e-07,3.5e-06,0.028,0.023,9.9e-05,0.00036,1.9e-05,0.00042,0.00016,0.00039,0.00042,1,1 -32190000,0.78,-0.0041,-0.00034,-0.63,0.97,1,0.79,10,7.8,-3.7e+02,-0.0012,-0.0058,-0.00018,0.0027,0.016,-0.11,-0.17,-0.038,0.46,-0.00015,-0.029,-0.027,0,0,0.00029,0.00041,0.0039,0.15,0.3,0.0069,3.5,5.3,0.035,3e-07,5.1e-07,3.5e-06,0.028,0.023,9.8e-05,0.00036,1.9e-05,0.00042,0.00016,0.00039,0.00042,1,1 -32290000,0.78,-0.0047,-0.00025,-0.63,0.94,0.98,0.78,11,7.9,-3.7e+02,-0.0012,-0.0058,-0.00018,0.001,0.02,-0.11,-0.17,-0.038,0.46,-4.8e-05,-0.03,-0.026,0,0,0.00029,0.00041,0.0038,0.15,0.31,0.0068,3.7,5.5,0.035,3e-07,5.1e-07,3.5e-06,0.028,0.023,9.8e-05,0.00036,1.9e-05,0.00042,0.00015,0.00039,0.00042,1,1 -32390000,0.78,-0.0052,-0.00016,-0.63,0.92,0.96,0.78,11,8,-3.7e+02,-0.0012,-0.0058,-0.00018,0.00013,0.022,-0.11,-0.17,-0.038,0.46,-1.2e-07,-0.03,-0.026,0,0,0.00029,0.00042,0.0038,0.16,0.32,0.0068,3.8,5.8,0.035,2.9e-07,5.1e-07,3.5e-06,0.028,0.023,9.7e-05,0.00036,1.9e-05,0.00042,0.00015,0.00039,0.00042,1,1 -32490000,0.78,-0.0054,-0.00011,-0.63,0.89,0.95,0.79,11,8.1,-3.7e+02,-0.0012,-0.0058,-0.00018,-0.0013,0.025,-0.11,-0.17,-0.038,0.46,8.5e-05,-0.03,-0.026,0,0,0.00029,0.00042,0.0038,0.16,0.33,0.0068,3.9,6,0.035,2.9e-07,5.1e-07,3.5e-06,0.028,0.022,9.6e-05,0.00036,1.9e-05,0.00042,0.00015,0.00039,0.00042,1,1 -32590000,0.78,-0.0056,-5.5e-05,-0.63,-1.6,-0.84,0.63,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00019,-0.0022,0.026,-0.11,-0.17,-0.038,0.46,0.00015,-0.03,-0.026,0,0,0.00028,0.00042,0.0038,0.25,0.25,0.56,0.25,0.25,0.037,2.9e-07,5.1e-07,3.5e-06,0.028,0.022,9.5e-05,0.00036,1.9e-05,0.00042,0.00015,0.00039,0.00041,1,1 -32690000,0.78,-0.0056,-9e-05,-0.63,-1.6,-0.85,0.61,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00019,-0.003,0.028,-0.11,-0.17,-0.038,0.46,0.00022,-0.03,-0.026,0,0,0.00028,0.00042,0.0038,0.25,0.25,0.55,0.26,0.26,0.048,2.9e-07,5.1e-07,3.5e-06,0.028,0.022,9.5e-05,0.00036,1.9e-05,0.00041,0.00015,0.00039,0.00041,1,1 -32790000,0.78,-0.0055,-0.00011,-0.63,-1.5,-0.83,0.62,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00019,-0.0038,0.029,-0.11,-0.17,-0.038,0.46,0.00028,-0.03,-0.026,0,0,0.00028,0.00042,0.0038,0.13,0.13,0.27,0.26,0.26,0.048,2.9e-07,5.1e-07,3.5e-06,0.028,0.022,9.4e-05,0.00036,1.9e-05,0.00041,0.00015,0.00039,0.00041,1,1 -32890000,0.78,-0.0053,-0.00023,-0.63,-1.6,-0.85,0.59,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.0002,-0.0047,0.031,-0.11,-0.17,-0.038,0.46,0.00037,-0.03,-0.026,0,0,0.00028,0.00042,0.0038,0.13,0.13,0.26,0.27,0.27,0.059,2.9e-07,5.2e-07,3.5e-06,0.028,0.022,9.4e-05,0.00036,1.9e-05,0.00041,0.00015,0.00039,0.00041,1,1 -32990000,0.78,-0.0052,-0.00035,-0.63,-1.5,-0.84,0.59,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00019,-0.0055,0.032,-0.11,-0.17,-0.038,0.46,0.0004,-0.03,-0.025,0,0,0.00028,0.00043,0.0038,0.084,0.085,0.17,0.27,0.27,0.057,2.9e-07,5.1e-07,3.5e-06,0.028,0.022,9.3e-05,0.00036,1.9e-05,0.00041,0.00015,0.00039,0.00041,1,1 -33090000,0.78,-0.0052,-0.00033,-0.63,-1.6,-0.86,0.58,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00019,-0.0059,0.033,-0.11,-0.17,-0.038,0.46,0.00041,-0.03,-0.025,0,0,0.00028,0.00043,0.0038,0.084,0.086,0.16,0.28,0.28,0.065,2.9e-07,5.2e-07,3.5e-06,0.028,0.022,9.3e-05,0.00036,1.9e-05,0.00041,0.00015,0.00039,0.00041,1,1 -33190000,0.78,-0.0039,-0.0036,-0.62,-1.5,-0.84,0.52,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00018,-0.0062,0.033,-0.11,-0.17,-0.038,0.46,0.00041,-0.03,-0.025,0,0,0.00028,0.00042,0.0038,0.063,0.065,0.11,0.28,0.28,0.062,2.8e-07,5.1e-07,3.5e-06,0.028,0.022,9.3e-05,0.00036,1.9e-05,0.00041,0.00015,0.00039,0.00041,1,1 -33290000,0.82,-0.0017,-0.015,-0.57,-1.5,-0.86,0.5,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00019,-0.0059,0.033,-0.11,-0.18,-0.038,0.46,0.00039,-0.03,-0.025,0,0,0.00028,0.00042,0.0037,0.064,0.066,0.11,0.29,0.29,0.067,2.8e-07,5.1e-07,3.5e-06,0.028,0.022,9.3e-05,0.00035,1.8e-05,0.00041,0.00015,0.00038,0.00041,1,1 -33390000,0.89,-0.002,-0.013,-0.46,-1.5,-0.85,0.7,-1e+06,1.2e+04,-3.7e+02,-0.0013,-0.0058,-0.00018,-0.011,0.031,-0.11,-0.18,-0.039,0.46,0.00098,-0.028,-0.025,0,0,0.00029,0.00041,0.0036,0.051,0.053,0.083,0.29,0.29,0.065,2.8e-07,5.1e-07,3.4e-06,0.028,0.021,9.3e-05,0.00033,1.7e-05,0.00041,0.00015,0.00035,0.00041,1,1 -33490000,0.95,-0.00046,-0.005,-0.31,-1.5,-0.86,0.71,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0002,-0.013,0.03,-0.11,-0.18,-0.04,0.46,0.0015,-0.02,-0.026,0,0,0.00032,0.00037,0.0033,0.052,0.055,0.075,0.3,0.3,0.068,2.8e-07,5.1e-07,3.4e-06,0.027,0.021,9.3e-05,0.00025,1.4e-05,0.00041,0.00013,0.00025,0.00041,1,1 -33590000,0.99,-0.0031,0.0018,-0.14,-1.5,-0.84,0.68,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00016,-0.013,0.03,-0.11,-0.19,-0.042,0.46,0.0024,-0.013,-0.026,0,0,0.00035,0.00032,0.0029,0.044,0.047,0.061,0.3,0.3,0.065,2.8e-07,5.1e-07,3.4e-06,0.027,0.021,9.3e-05,0.00017,9.8e-06,0.00041,9.4e-05,0.00016,0.00041,1,1 -33690000,1,-0.0065,0.0053,0.024,-1.6,-0.86,0.68,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00019,-0.013,0.03,-0.11,-0.19,-0.043,0.46,0.0017,-0.0093,-0.027,0,0,0.00037,0.00028,0.0026,0.045,0.05,0.056,0.31,0.31,0.068,2.8e-07,5.1e-07,3.3e-06,0.027,0.021,9.3e-05,0.00013,7.7e-06,0.0004,6.9e-05,0.0001,0.0004,1,1 -33790000,0.98,-0.0073,0.0072,0.19,-1.6,-0.86,0.67,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00016,-0.013,0.03,-0.11,-0.2,-0.043,0.46,0.0019,-0.0068,-0.027,0,0,0.00038,0.00026,0.0023,0.041,0.046,0.047,0.31,0.31,0.064,2.8e-07,5e-07,3.3e-06,0.027,0.021,9.3e-05,9.7e-05,6.3e-06,0.0004,4.8e-05,6.3e-05,0.0004,1,1 -33890000,0.94,-0.0075,0.0085,0.35,-1.7,-0.9,0.66,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00015,-0.013,0.03,-0.11,-0.2,-0.043,0.46,0.0018,-0.0055,-0.027,0,0,0.00037,0.00026,0.0022,0.044,0.051,0.043,0.32,0.32,0.065,2.8e-07,5e-07,3.3e-06,0.027,0.021,9.3e-05,8.1e-05,5.5e-06,0.0004,3.4e-05,4.2e-05,0.0004,1,1 -33990000,0.87,-0.0093,0.0059,0.49,-1.7,-0.91,0.64,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00015,-0.0092,0.03,-0.11,-0.2,-0.044,0.46,0.0013,-0.0043,-0.027,0,0,0.00033,0.00027,0.002,0.042,0.049,0.036,0.32,0.32,0.062,2.8e-07,4.9e-07,3.3e-06,0.027,0.021,9.3e-05,7.1e-05,5e-06,0.0004,2.6e-05,3e-05,0.0004,1,1 -34090000,0.81,-0.01,0.0046,0.59,-1.7,-0.97,0.65,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00015,0.00019,0.029,-0.11,-0.2,-0.044,0.46,0.00076,-0.0036,-0.027,0,0,0.0003,0.00028,0.002,0.048,0.058,0.033,0.33,0.33,0.063,2.8e-07,4.9e-07,3.3e-06,0.026,0.021,9.3e-05,6.6e-05,4.8e-06,0.0004,2.1e-05,2.4e-05,0.0004,1,1 -34190000,0.76,-0.0086,0.0049,0.65,-1.8,-1,0.65,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00015,0.0058,0.029,-0.11,-0.2,-0.044,0.46,0.00064,-0.0031,-0.027,0,0,0.00029,0.00029,0.0019,0.056,0.069,0.031,0.34,0.34,0.063,2.8e-07,5e-07,3.3e-06,0.026,0.021,9.3e-05,6.2e-05,4.6e-06,0.0004,1.7e-05,1.9e-05,0.0004,1,1 -34290000,0.72,-0.0056,0.0061,0.69,-1.8,-1.1,0.65,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00014,0.011,0.028,-0.11,-0.2,-0.044,0.46,0.0005,-0.0027,-0.027,0,0,0.00027,0.0003,0.0019,0.065,0.081,0.028,0.35,0.35,0.062,2.8e-07,5e-07,3.2e-06,0.025,0.021,9.3e-05,5.9e-05,4.4e-06,0.0004,1.4e-05,1.6e-05,0.0004,1,1 -34390000,0.7,-0.0027,0.0075,0.72,-1.9,-1.2,0.66,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00014,0.016,0.027,-0.11,-0.2,-0.044,0.46,0.00037,-0.0024,-0.027,0,0,0.00027,0.00031,0.0019,0.075,0.096,0.026,0.37,0.37,0.063,2.8e-07,5e-07,3.2e-06,0.025,0.021,9.3e-05,5.8e-05,4.4e-06,0.0004,1.3e-05,1.4e-05,0.0004,1,1 -34490000,0.68,-0.00065,0.0086,0.73,-1.9,-1.2,0.66,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00014,0.018,0.027,-0.11,-0.2,-0.044,0.46,0.00027,-0.0023,-0.027,0,0,0.00026,0.00032,0.0019,0.087,0.11,0.024,0.38,0.39,0.062,2.8e-07,5e-07,3.2e-06,0.024,0.021,9.3e-05,5.6e-05,4.3e-06,0.0004,1.1e-05,1.2e-05,0.0004,1,1 -34590000,0.67,0.00065,0.0094,0.74,-2,-1.3,0.66,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00014,0.021,0.028,-0.11,-0.2,-0.044,0.46,0.00012,-0.0022,-0.027,0,0,0.00026,0.00032,0.0018,0.1,0.13,0.022,0.4,0.41,0.061,2.8e-07,5e-07,3.2e-06,0.024,0.021,9.3e-05,5.5e-05,4.2e-06,0.0004,1e-05,1.1e-05,0.0004,1,1 -34690000,0.67,0.0015,0.0099,0.74,-2,-1.4,0.67,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00013,0.024,0.027,-0.11,-0.2,-0.044,0.46,0.00017,-0.002,-0.027,0,0,0.00025,0.00033,0.0018,0.12,0.15,0.02,0.42,0.43,0.06,2.8e-07,5e-07,3.2e-06,0.024,0.02,9.3e-05,5.4e-05,4.2e-06,0.0004,9.6e-06,1e-05,0.0004,1,1 -34790000,0.66,0.0021,0.01,0.75,-2.1,-1.4,0.67,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00012,0.024,0.025,-0.11,-0.2,-0.044,0.46,0.00028,-0.0019,-0.027,0,0,0.00025,0.00033,0.0018,0.13,0.17,0.018,0.44,0.46,0.059,2.8e-07,5e-07,3.2e-06,0.023,0.02,9.3e-05,5.3e-05,4.1e-06,0.0004,8.9e-06,9.2e-06,0.0004,1,1 -34890000,0.66,0.0022,0.01,0.75,-2.1,-1.5,0.67,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00012,0.025,0.025,-0.11,-0.2,-0.044,0.46,0.0002,-0.0019,-0.027,0,0,0.00025,0.00033,0.0018,0.15,0.2,0.017,0.47,0.49,0.058,2.8e-07,5e-07,3.2e-06,0.023,0.02,9.3e-05,5.2e-05,4.1e-06,0.0004,8.4e-06,8.5e-06,0.0004,1,1 -34990000,0.66,-0.0011,0.018,0.75,-3.1,-2.4,-0.14,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00013,0.025,0.025,-0.11,-0.2,-0.044,0.46,0.0003,-0.0019,-0.027,0,0,0.00025,0.00033,0.0018,0.19,0.26,0.016,0.5,0.53,0.057,2.8e-07,5e-07,3.2e-06,0.023,0.02,9.3e-05,5.1e-05,4.1e-06,0.0004,7.9e-06,8e-06,0.0004,1,1 -35090000,0.66,-0.0012,0.018,0.75,-3.2,-2.4,-0.19,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00013,0.025,0.025,-0.11,-0.2,-0.044,0.46,0.0003,-0.0019,-0.027,0,0,0.00025,0.00033,0.0018,0.21,0.3,0.015,0.54,0.58,0.056,2.8e-07,5e-07,3.2e-06,0.023,0.02,9.3e-05,5.1e-05,4e-06,0.0004,7.5e-06,7.5e-06,0.0004,1,1 -35190000,0.66,-0.0013,0.017,0.75,-3.3,-2.5,-0.18,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00013,0.025,0.025,-0.11,-0.2,-0.044,0.46,0.00033,-0.0018,-0.027,0,0,0.00025,0.00033,0.0018,0.24,0.33,0.014,0.58,0.63,0.055,2.8e-07,5e-07,3.2e-06,0.023,0.02,9.3e-05,5e-05,4e-06,0.0004,7.2e-06,7.1e-06,0.0004,1,1 -35290000,0.66,-0.0014,0.017,0.75,-3.3,-2.5,-0.17,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00013,0.025,0.025,-0.11,-0.2,-0.044,0.46,0.00038,-0.0018,-0.027,0,0,0.00024,0.00033,0.0018,0.26,0.37,0.014,0.63,0.7,0.053,2.8e-07,5e-07,3.2e-06,0.023,0.02,9.3e-05,5e-05,4e-06,0.0004,6.9e-06,6.7e-06,0.0004,1,1 -35390000,0.66,-0.0014,0.017,0.75,-3.3,-2.6,-0.16,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00014,0.025,0.025,-0.11,-0.2,-0.044,0.46,0.00045,-0.0018,-0.027,0,0,0.00024,0.00033,0.0018,0.29,0.4,0.013,0.68,0.77,0.053,2.8e-07,5.1e-07,3.2e-06,0.023,0.02,9.3e-05,4.9e-05,3.9e-06,0.0004,6.7e-06,6.4e-06,0.0004,1,1 -35490000,0.66,-0.0014,0.017,0.75,-3.4,-2.6,-0.16,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00014,0.025,0.025,-0.11,-0.2,-0.044,0.46,0.00051,-0.0019,-0.027,0,0,0.00024,0.00033,0.0018,0.32,0.44,0.012,0.74,0.85,0.052,2.9e-07,5.1e-07,3.2e-06,0.023,0.02,9.3e-05,4.9e-05,3.9e-06,0.0004,6.4e-06,6.1e-06,0.0004,1,1 -35590000,0.66,-0.0015,0.017,0.75,-3.4,-2.7,-0.15,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00014,0.025,0.025,-0.11,-0.2,-0.044,0.46,0.00047,-0.0018,-0.027,0,0,0.00024,0.00033,0.0018,0.35,0.48,0.012,0.81,0.95,0.05,2.9e-07,5.1e-07,3.2e-06,0.023,0.02,9.3e-05,4.8e-05,3.9e-06,0.0004,6.2e-06,5.9e-06,0.0004,1,1 -35690000,0.66,-0.0014,0.018,0.75,-3.4,-2.8,-0.14,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00014,0.025,0.023,-0.11,-0.2,-0.044,0.46,0.00053,-0.0018,-0.027,0,0,0.00024,0.00032,0.0018,0.38,0.52,0.011,0.89,1.1,0.05,2.9e-07,5.1e-07,3.2e-06,0.023,0.02,9.3e-05,4.8e-05,3.9e-06,0.0004,6.1e-06,5.7e-06,0.0004,1,1 -35790000,0.66,-0.0015,0.018,0.75,-3.5,-2.8,-0.13,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00014,0.025,0.023,-0.11,-0.2,-0.044,0.46,0.00054,-0.0018,-0.027,0,0,0.00024,0.00032,0.0018,0.41,0.57,0.011,0.98,1.2,0.049,2.9e-07,5.1e-07,3.2e-06,0.023,0.02,9.3e-05,4.7e-05,3.9e-06,0.0004,5.9e-06,5.5e-06,0.0004,1,1 -35890000,0.66,-0.0016,0.018,0.75,-3.5,-2.9,-0.13,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00015,0.026,0.023,-0.11,-0.2,-0.044,0.46,0.00055,-0.0018,-0.027,0,0,0.00024,0.00032,0.0018,0.45,0.61,0.01,1.1,1.3,0.048,2.9e-07,5.1e-07,3.2e-06,0.023,0.02,9.3e-05,4.7e-05,3.8e-06,0.0004,5.8e-06,5.3e-06,0.0004,1,1 -35990000,0.66,-0.0016,0.018,0.75,-3.5,-2.9,-0.12,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00014,0.027,0.022,-0.11,-0.2,-0.044,0.46,0.00051,-0.0018,-0.027,0,0,0.00023,0.00032,0.0018,0.48,0.66,0.01,1.2,1.5,0.047,2.9e-07,5.1e-07,3.2e-06,0.023,0.02,9.3e-05,4.7e-05,3.8e-06,0.0004,5.6e-06,5.1e-06,0.0004,1,1 -36090000,0.66,-0.0016,0.018,0.75,-3.6,-3,-0.11,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00015,0.027,0.022,-0.11,-0.2,-0.044,0.46,0.00054,-0.0018,-0.027,0,0,0.00023,0.00032,0.0018,0.52,0.71,0.0097,1.3,1.7,0.046,2.9e-07,5.1e-07,3.2e-06,0.023,0.02,9.3e-05,4.6e-05,3.8e-06,0.0004,5.5e-06,5e-06,0.0004,1,1 -36190000,0.66,-0.0016,0.018,0.75,-3.6,-3,-0.1,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00016,0.027,0.021,-0.11,-0.2,-0.044,0.46,0.00062,-0.0018,-0.027,0,0,0.00023,0.00032,0.0018,0.56,0.76,0.0094,1.5,1.9,0.045,2.9e-07,5.1e-07,3.2e-06,0.023,0.02,9.3e-05,4.6e-05,3.8e-06,0.0004,5.4e-06,4.8e-06,0.0004,1,1 -36290000,0.66,-0.0016,0.018,0.75,-3.7,-3.1,-0.09,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00017,0.028,0.019,-0.11,-0.2,-0.044,0.46,0.00064,-0.0018,-0.027,0,0,0.00023,0.00032,0.0018,0.6,0.81,0.0093,1.6,2.1,0.045,2.9e-07,5.1e-07,3.2e-06,0.023,0.019,9.3e-05,4.6e-05,3.8e-06,0.0004,5.3e-06,4.7e-06,0.0004,1,1 -36390000,0.66,-0.0017,0.018,0.75,-3.7,-3.2,-0.083,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00016,0.029,0.019,-0.11,-0.2,-0.044,0.46,0.00063,-0.0018,-0.027,0,0,0.00023,0.00031,0.0018,0.64,0.87,0.009,1.8,2.3,0.044,2.9e-07,5.1e-07,3.2e-06,0.023,0.019,9.3e-05,4.6e-05,3.8e-06,0.0004,5.2e-06,4.6e-06,0.0004,1,1 -36490000,0.66,-0.0018,0.018,0.75,-3.7,-3.2,-0.076,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00016,0.03,0.019,-0.11,-0.2,-0.044,0.46,0.0006,-0.0018,-0.027,0,0,0.00023,0.00031,0.0018,0.68,0.92,0.0088,2,2.6,0.044,2.9e-07,5.1e-07,3.2e-06,0.023,0.019,9.3e-05,4.5e-05,3.7e-06,0.0004,5.2e-06,4.5e-06,0.0004,1,1 -36590000,0.66,-0.0017,0.018,0.75,-3.8,-3.3,-0.066,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00017,0.031,0.018,-0.11,-0.2,-0.044,0.46,0.00064,-0.0017,-0.027,0,0,0.00023,0.00031,0.0018,0.72,0.98,0.0087,2.2,2.9,0.043,2.9e-07,5.1e-07,3.2e-06,0.023,0.019,9.4e-05,4.5e-05,3.7e-06,0.0004,5.1e-06,4.4e-06,0.0004,1,1 -36690000,0.66,-0.0018,0.018,0.75,-3.8,-3.4,-0.059,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00018,0.032,0.018,-0.11,-0.2,-0.044,0.46,0.00067,-0.0017,-0.027,0,0,0.00023,0.00031,0.0018,0.77,1,0.0086,2.4,3.2,0.042,3e-07,5.1e-07,3.2e-06,0.023,0.019,9.4e-05,4.5e-05,3.7e-06,0.0004,5e-06,4.3e-06,0.0004,1,1 -36790000,0.66,-0.0018,0.018,0.75,-3.8,-3.4,-0.049,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00019,0.032,0.016,-0.11,-0.2,-0.044,0.46,0.00071,-0.0018,-0.027,0,0,0.00022,0.00031,0.0018,0.81,1.1,0.0084,2.6,3.5,0.042,3e-07,5.1e-07,3.2e-06,0.023,0.019,9.4e-05,4.4e-05,3.7e-06,0.0004,5e-06,4.2e-06,0.0004,1,1 -36890000,0.66,-0.0018,0.018,0.75,-3.9,-3.5,-0.041,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0002,0.033,0.016,-0.11,-0.2,-0.044,0.46,0.00074,-0.0018,-0.027,0,0,0.00022,0.00031,0.0018,0.86,1.2,0.0083,2.9,3.9,0.041,3e-07,5.1e-07,3.2e-06,0.023,0.019,9.4e-05,4.4e-05,3.7e-06,0.0004,4.9e-06,4.1e-06,0.0004,1,1 -36990000,0.66,-0.0018,0.018,0.75,-3.9,-3.5,-0.034,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00021,0.033,0.016,-0.11,-0.2,-0.044,0.46,0.00076,-0.0017,-0.027,0,0,0.00022,0.00031,0.0018,0.91,1.2,0.0083,3.2,4.3,0.041,3e-07,5.1e-07,3.2e-06,0.023,0.019,9.4e-05,4.4e-05,3.7e-06,0.0004,4.9e-06,4e-06,0.0004,1,1 -37090000,0.66,-0.0018,0.018,0.75,-3.9,-3.6,-0.025,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00021,0.034,0.016,-0.11,-0.2,-0.044,0.46,0.00077,-0.0017,-0.027,0,0,0.00022,0.00031,0.0018,0.96,1.3,0.0082,3.5,4.8,0.04,3e-07,5.1e-07,3.2e-06,0.022,0.019,9.4e-05,4.4e-05,3.6e-06,0.00039,4.8e-06,3.9e-06,0.0004,1,1 -37190000,0.66,-0.0019,0.018,0.75,-4,-3.7,-0.017,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00021,0.035,0.016,-0.11,-0.2,-0.044,0.46,0.00076,-0.0017,-0.027,0,0,0.00022,0.0003,0.0018,1,1.4,0.0081,3.9,5.2,0.04,3e-07,5.1e-07,3.2e-06,0.022,0.019,9.4e-05,4.3e-05,3.6e-06,0.00039,4.8e-06,3.9e-06,0.0004,1,1 -37290000,0.66,-0.0019,0.018,0.76,-4,-3.7,-0.0098,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00021,0.036,0.015,-0.11,-0.2,-0.044,0.46,0.00077,-0.0017,-0.027,0,0,0.00022,0.0003,0.0018,1.1,1.4,0.0081,4.2,5.8,0.04,3e-07,5.1e-07,3.2e-06,0.022,0.018,9.4e-05,4.3e-05,3.6e-06,0.00039,4.8e-06,3.8e-06,0.0004,1,1 -37390000,0.66,-0.0019,0.019,0.76,-4.1,-3.8,-0.0027,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00022,0.036,0.014,-0.11,-0.2,-0.044,0.46,0.00079,-0.0017,-0.027,0,0,0.00022,0.0003,0.0018,1.1,1.5,0.0081,4.6,6.3,0.039,3e-07,5.1e-07,3.2e-06,0.022,0.018,9.4e-05,4.3e-05,3.6e-06,0.00039,4.7e-06,3.7e-06,0.0004,1,1 -37490000,0.66,-0.0018,0.019,0.76,-4.1,-3.9,0.0052,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00023,0.036,0.013,-0.11,-0.2,-0.044,0.46,0.00082,-0.0016,-0.027,0,0,0.00022,0.0003,0.0018,1.2,1.6,0.0081,5,6.9,0.039,3e-07,5.1e-07,3.2e-06,0.022,0.018,9.4e-05,4.2e-05,3.6e-06,0.00039,4.7e-06,3.7e-06,0.0004,1,1 -37590000,0.66,-0.0019,0.019,0.76,-4.1,-3.9,0.014,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00024,0.037,0.013,-0.11,-0.2,-0.044,0.46,0.00083,-0.0016,-0.027,0,0,0.00022,0.0003,0.0018,1.2,1.6,0.0081,5.5,7.5,0.039,3e-07,5.1e-07,3.2e-06,0.022,0.018,9.4e-05,4.2e-05,3.6e-06,0.00039,4.7e-06,3.6e-06,0.0004,1,1 -37690000,0.65,-0.002,0.019,0.76,-4.2,-4,0.023,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00025,0.038,0.012,-0.11,-0.2,-0.044,0.46,0.00085,-0.0016,-0.027,0,0,0.00021,0.0003,0.0018,1.3,1.7,0.0081,6,8.2,0.038,3e-07,5.1e-07,3.2e-06,0.022,0.018,9.4e-05,4.2e-05,3.6e-06,0.00039,4.6e-06,3.5e-06,0.0004,1,1 -37790000,0.65,-0.002,0.019,0.76,-4.2,-4.1,0.032,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00025,0.039,0.011,-0.11,-0.2,-0.044,0.46,0.00086,-0.0016,-0.027,0,0,0.00021,0.00029,0.0018,1.3,1.8,0.0081,6.5,8.9,0.038,3e-07,5e-07,3.1e-06,0.022,0.018,9.4e-05,4.2e-05,3.5e-06,0.00039,4.6e-06,3.5e-06,0.0004,1,1 -37890000,0.65,-0.0021,0.019,0.76,-4.2,-4.1,0.039,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00025,0.039,0.012,-0.11,-0.2,-0.044,0.46,0.00087,-0.0016,-0.027,0,0,0.00021,0.00029,0.0018,1.4,1.9,0.0081,7,9.7,0.038,3.1e-07,5e-07,3.1e-06,0.022,0.018,9.4e-05,4.1e-05,3.5e-06,0.00039,4.6e-06,3.4e-06,0.0004,1,1 -37990000,0.65,-0.0021,0.019,0.76,-4.3,-4.2,0.049,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00026,0.04,0.01,-0.11,-0.2,-0.044,0.46,0.00087,-0.0016,-0.027,0,0,0.00021,0.00029,0.0018,1.4,1.9,0.0081,7.6,11,0.038,3.1e-07,5e-07,3.1e-06,0.022,0.018,9.4e-05,4.1e-05,3.5e-06,0.00039,4.6e-06,3.4e-06,0.0004,1,1 -38090000,0.65,-0.0021,0.019,0.76,-4.3,-4.3,0.059,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00027,0.041,0.0092,-0.11,-0.2,-0.044,0.46,0.00089,-0.0016,-0.027,0,0,0.00021,0.00029,0.0018,1.5,2,0.0081,8.2,11,0.038,3.1e-07,5e-07,3.1e-06,0.022,0.018,9.4e-05,4.1e-05,3.5e-06,0.00039,4.6e-06,3.4e-06,0.0004,1,1 -38190000,0.65,-0.0021,0.019,0.76,-4.4,-4.3,0.067,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00027,0.041,0.009,-0.11,-0.2,-0.044,0.46,0.00089,-0.0016,-0.027,0,0,0.00021,0.00029,0.0018,1.6,2.1,0.0081,8.9,12,0.037,3.1e-07,5e-07,3.1e-06,0.022,0.018,9.4e-05,4.1e-05,3.5e-06,0.00039,4.5e-06,3.3e-06,0.0004,1,1 -38290000,0.65,-0.0021,0.019,0.76,-4.4,-4.4,0.074,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00027,0.041,0.0088,-0.11,-0.2,-0.044,0.46,0.00089,-0.0016,-0.027,0,0,0.00021,0.00028,0.0018,1.6,2.2,0.0082,9.6,13,0.037,3.1e-07,5e-07,3.1e-06,0.022,0.017,9.4e-05,4e-05,3.5e-06,0.00039,4.5e-06,3.3e-06,0.0004,1,1 -38390000,0.65,-0.0021,0.019,0.76,-4.4,-4.4,0.082,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00027,0.042,0.0078,-0.11,-0.2,-0.044,0.46,0.00089,-0.0016,-0.027,0,0,0.00021,0.00028,0.0018,1.7,2.2,0.0082,10,14,0.037,3.1e-07,5e-07,3.1e-06,0.022,0.017,9.4e-05,4e-05,3.5e-06,0.00039,4.5e-06,3.2e-06,0.0004,1,1 -38490000,0.65,-0.0021,0.019,0.76,-4.5,-4.5,0.088,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00027,0.042,0.0078,-0.11,-0.2,-0.044,0.46,0.0009,-0.0016,-0.027,0,0,0.00021,0.00028,0.0018,1.7,2.3,0.0082,11,15,0.037,3.1e-07,5e-07,3.1e-06,0.022,0.017,9.4e-05,4e-05,3.4e-06,0.00039,4.5e-06,3.2e-06,0.0004,1,1 -38590000,0.65,-0.002,0.019,0.76,-4.5,-4.6,0.094,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00027,0.042,0.0088,-0.11,-0.2,-0.044,0.46,0.00089,-0.0015,-0.027,0,0,0.0002,0.00028,0.0018,1.8,2.4,0.0082,12,17,0.037,3.1e-07,5e-07,3.1e-06,0.022,0.017,9.3e-05,4e-05,3.4e-06,0.00039,4.5e-06,3.2e-06,0.0004,1,1 -38690000,0.65,-0.0021,0.019,0.76,-4.5,-4.6,0.1,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00027,0.041,0.0093,-0.11,-0.2,-0.044,0.46,0.00089,-0.0015,-0.027,0,0,0.0002,0.00028,0.0018,1.9,2.5,0.0082,13,18,0.037,3.1e-07,4.9e-07,3.1e-06,0.022,0.017,9.3e-05,4e-05,3.4e-06,0.00039,4.5e-06,3.1e-06,0.0004,1,1 -38790000,0.65,-0.002,0.019,0.76,-4.6,-4.7,0.11,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00028,0.04,0.008,-0.11,-0.2,-0.044,0.46,0.0009,-0.0015,-0.027,0,0,0.0002,0.00027,0.0017,1.9,2.6,0.0083,14,19,0.037,3.1e-07,4.9e-07,3e-06,0.021,0.017,9.3e-05,3.9e-05,3.4e-06,0.00039,4.5e-06,3.1e-06,0.0004,1,1 -38890000,0.65,-0.0021,0.019,0.76,-4.6,-4.7,0.61,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00028,0.04,0.0083,-0.11,-0.2,-0.044,0.46,0.0009,-0.0015,-0.027,0,0,0.0002,0.00027,0.0017,2,2.6,0.0083,15,20,0.037,3.1e-07,4.9e-07,3e-06,0.021,0.017,9.3e-05,3.9e-05,3.4e-06,0.00039,4.5e-06,3.1e-06,0.0004,1,1 +190000,1,-0.0094,-0.011,2.8e-05,6.9e-05,0.004,-0.041,-5.9e-06,0.00043,-0.0044,-3e-11,-2.7e-12,5.6e-13,0,0,-5e-08,0,0,0,0,0,0,0,0,0.011,0.011,0.00093,25,25,10,1e+02,1e+02,1,0.01,0.01,0.01,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +290000,1,-0.0094,-0.011,6.3e-05,0.001,0.0064,-0.053,3.8e-05,0.00036,-0.007,9.1e-10,1e-10,-1.7e-11,0,0,-2.5e-06,0,0,0,0,0,0,0,0,0.012,0.012,0.00077,25,25,9.6,0.37,0.37,0.41,0.01,0.01,0.0052,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +390000,1,-0.0094,-0.011,7e-05,0.0024,0.0083,-0.059,0.00021,0.0011,-0.0094,-1.1e-08,2.8e-09,2.9e-10,0,0,-1.5e-05,0,0,0,0,0,0,0,0,0.012,0.012,0.0012,25,25,8.1,0.97,0.97,0.32,0.01,0.01,0.0052,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +490000,1,-0.0095,-0.012,2e-05,0.0039,0.0048,-0.06,0.00024,0.00049,-0.011,1.6e-06,-3.7e-07,-4.2e-08,0,0,-4.1e-05,0,0,0,0,0,0,0,0,0.013,0.013,0.00073,7.8,7.8,5.9,0.34,0.34,0.31,0.01,0.01,0.0024,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +590000,1,-0.0095,-0.012,2.6e-05,0.006,0.0073,-0.059,0.00074,0.0011,-0.012,1.6e-06,-3.4e-07,-4e-08,0,0,-7.3e-05,0,0,0,0,0,0,0,0,0.015,0.015,0.001,7.9,7.9,4.2,0.67,0.67,0.32,0.01,0.01,0.0024,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +690000,1,-0.0096,-0.012,8.6e-05,0.0063,0.0052,-0.059,0.0005,0.00055,-0.013,5.5e-06,-3.2e-06,-1.8e-07,0,0,-0.00012,0,0,0,0,0,0,0,0,0.016,0.016,0.00063,2.7,2.7,2.8,0.26,0.26,0.29,0.01,0.01,0.0012,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +790000,1,-0.0097,-0.013,9.9e-05,0.0086,0.0073,-0.063,0.0012,0.0012,-0.014,5.4e-06,-3.1e-06,-1.8e-07,0,0,-0.00016,0,0,0,0,0,0,0,0,0.018,0.018,0.0008,2.8,2.8,2,0.42,0.42,0.28,0.01,0.01,0.0012,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +890000,1,-0.0098,-0.013,0.00012,0.01,0.006,-0.077,0.00096,0.00072,-0.021,1.6e-05,-1.5e-05,-6.5e-07,0,0,-0.00016,0,0,0,0,0,0,0,0,0.019,0.019,0.00053,1.3,1.3,2,0.2,0.2,0.43,0.0099,0.01,0.00068,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +990000,1,-0.0099,-0.013,0.00013,0.015,0.0064,-0.092,0.0022,0.0014,-0.029,1.6e-05,-1.5e-05,-6.5e-07,0,0,-0.00016,0,0,0,0,0,0,0,0,0.021,0.021,0.00065,1.5,1.5,2,0.3,0.3,0.61,0.0099,0.01,0.00068,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +1090000,1,-0.01,-0.014,0.00013,0.016,0.0051,-0.11,0.0018,0.00086,-0.039,4.1e-05,-6.2e-05,-2.1e-06,0,0,-0.00016,0,0,0,0,0,0,0,0,0.023,0.023,0.00047,0.93,0.93,2,0.17,0.17,0.84,0.0098,0.0098,0.00042,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +1190000,1,-0.01,-0.014,0.0001,0.02,0.0053,-0.12,0.0035,0.0014,-0.051,4.1e-05,-6.2e-05,-2.1e-06,0,0,-0.00016,0,0,0,0,0,0,0,0,0.025,0.025,0.00055,1.1,1.1,2,0.24,0.24,1.1,0.0098,0.0098,0.00042,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +1290000,1,-0.01,-0.014,0.00016,0.02,0.0044,-0.14,0.0027,0.00089,-0.064,8.5e-05,-0.00019,-5.6e-06,0,0,-0.00016,0,0,0,0,0,0,0,0,0.026,0.026,0.00042,0.89,0.89,2,0.15,0.15,1.4,0.0095,0.0095,0.00029,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +1390000,1,-0.01,-0.014,0.00017,0.026,0.0042,-0.15,0.0051,0.0013,-0.078,8.5e-05,-0.00019,-5.6e-06,0,0,-0.00016,0,0,0,0,0,0,0,0,0.028,0.028,0.00048,1.2,1.2,2,0.21,0.21,1.7,0.0095,0.0095,0.00029,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +1490000,1,-0.01,-0.014,0.00015,0.024,0.0029,-0.16,0.0038,0.00083,-0.093,0.00015,-0.00045,-1.2e-05,0,0,-0.00016,0,0,0,0,0,0,0,0,0.027,0.027,0.00038,0.96,0.96,2,0.14,0.14,2.1,0.0088,0.0088,0.0002,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +1590000,1,-0.01,-0.014,0.00015,0.03,0.0035,-0.18,0.0065,0.0012,-0.11,0.00015,-0.00045,-1.2e-05,0,0,-0.00016,0,0,0,0,0,0,0,0,0.03,0.03,0.00043,1.3,1.3,2,0.2,0.2,2.6,0.0088,0.0088,0.0002,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +1690000,1,-0.011,-0.014,0.00012,0.028,-9.5e-05,-0.19,0.0045,0.00063,-0.13,0.0002,-0.00088,-2.2e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.026,0.026,0.00034,1,1,2,0.14,0.14,3,0.0078,0.0078,0.00015,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +1790000,1,-0.011,-0.014,9.5e-05,0.035,-0.0019,-0.2,0.0076,0.00054,-0.15,0.0002,-0.00088,-2.2e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.028,0.028,0.00038,1.3,1.3,2,0.2,0.2,3.5,0.0078,0.0078,0.00015,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +1890000,1,-0.011,-0.015,7.5e-05,0.043,-0.0032,-0.22,0.011,0.00029,-0.17,0.0002,-0.00088,-2.2e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.031,0.031,0.00043,1.7,1.7,2,0.31,0.31,4.1,0.0078,0.0078,0.00015,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +1990000,1,-0.011,-0.014,8.5e-05,0.036,-0.0046,-0.23,0.0082,-0.00027,-0.19,0.00022,-0.0014,-3.3e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.025,0.025,0.00034,1.3,1.3,2.1,0.2,0.2,4.7,0.0067,0.0067,0.00011,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +2090000,1,-0.011,-0.014,4.7e-05,0.041,-0.0071,-0.24,0.012,-0.00085,-0.22,0.00022,-0.0014,-3.3e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.027,0.027,0.00038,1.7,1.7,2.1,0.31,0.31,5.3,0.0067,0.0067,0.00011,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +2190000,1,-0.011,-0.014,5.8e-05,0.033,-0.0068,-0.26,0.0079,-0.00096,-0.24,0.00017,-0.002,-4.3e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.02,0.02,0.00031,1.2,1.2,2.1,0.2,0.2,6,0.0055,0.0055,8.9e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +2290000,1,-0.011,-0.014,4.5e-05,0.039,-0.0093,-0.27,0.011,-0.0017,-0.27,0.00017,-0.002,-4.3e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.022,0.022,0.00034,1.5,1.5,2.1,0.3,0.3,6.7,0.0055,0.0055,8.9e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +2390000,1,-0.011,-0.013,6.2e-05,0.03,-0.0087,-0.29,0.0074,-0.0015,-0.3,9e-05,-0.0025,-5.2e-05,0,0,-0.00018,0,0,0,0,0,0,0,0,0.017,0.017,0.00028,1,1,2.1,0.19,0.19,7.4,0.0046,0.0046,7.1e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +2490000,1,-0.011,-0.013,4.4e-05,0.035,-0.011,-0.3,0.011,-0.0024,-0.32,9e-05,-0.0025,-5.2e-05,0,0,-0.00018,0,0,0,0,0,0,0,0,0.018,0.018,0.00031,1.3,1.3,2.1,0.28,0.28,8.2,0.0046,0.0046,7.1e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +2590000,1,-0.011,-0.013,5.8e-05,0.026,-0.009,-0.31,0.0068,-0.0018,-0.36,-1.4e-05,-0.0029,-5.8e-05,0,0,-0.00018,0,0,0,0,0,0,0,0,0.014,0.014,0.00026,0.89,0.89,2.1,0.18,0.18,9.1,0.0038,0.0038,5.8e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +2690000,1,-0.011,-0.013,5.5e-05,0.03,-0.01,-0.33,0.0097,-0.0028,-0.39,-1.4e-05,-0.0029,-5.8e-05,0,0,-0.00018,0,0,0,0,0,0,0,0,0.015,0.015,0.00028,1.1,1.1,2.2,0.25,0.25,10,0.0038,0.0038,5.8e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +2790000,1,-0.011,-0.013,4.8e-05,0.023,-0.0093,-0.34,0.0062,-0.0019,-0.42,-0.00012,-0.0033,-6.3e-05,0,0,-0.00018,0,0,0,0,0,0,0,0,0.011,0.011,0.00024,0.77,0.77,2.2,0.16,0.16,11,0.0032,0.0032,4.8e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +2890000,1,-0.011,-0.013,-1.8e-06,0.027,-0.011,-0.35,0.0087,-0.0029,-0.46,-0.00012,-0.0033,-6.3e-05,0,0,-0.00018,0,0,0,0,0,0,0,0,0.013,0.013,0.00026,0.95,0.95,2.2,0.23,0.23,12,0.0032,0.0032,4.8e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +2990000,1,-0.011,-0.013,4.6e-05,0.022,-0.0095,-0.36,0.0057,-0.0021,-0.49,-0.00023,-0.0036,-6.7e-05,0,0,-0.00018,0,0,0,0,0,0,0,0,0.0099,0.0099,0.00022,0.67,0.67,2.2,0.15,0.15,13,0.0027,0.0027,4e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +3090000,1,-0.011,-0.013,4.8e-05,0.025,-0.011,-0.38,0.008,-0.0031,-0.53,-0.00023,-0.0036,-6.7e-05,0,0,-0.00018,0,0,0,0,0,0,0,0,0.011,0.011,0.00024,0.83,0.83,2.2,0.22,0.22,14,0.0027,0.0027,4e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +3190000,1,-0.011,-0.013,-8.9e-06,0.02,-0.0086,-0.39,0.0053,-0.0021,-0.57,-0.00034,-0.0039,-7e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.0087,0.0087,0.00021,0.59,0.59,2.3,0.14,0.14,15,0.0023,0.0023,3.4e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +3290000,1,-0.011,-0.013,3.1e-05,0.023,-0.01,-0.4,0.0074,-0.003,-0.61,-0.00034,-0.0039,-7e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.0096,0.0096,0.00022,0.73,0.73,2.3,0.2,0.2,16,0.0023,0.0023,3.4e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +3390000,1,-0.011,-0.012,2.5e-06,0.018,-0.0091,-0.42,0.0049,-0.0021,-0.65,-0.00044,-0.0041,-7.3e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.0078,0.0078,0.00019,0.53,0.53,2.3,0.14,0.14,18,0.002,0.002,2.9e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +3490000,1,-0.011,-0.013,-5e-06,0.022,-0.012,-0.43,0.0069,-0.0031,-0.69,-0.00044,-0.0041,-7.3e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.0086,0.0086,0.00021,0.66,0.66,2.3,0.19,0.19,19,0.002,0.002,2.9e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +3590000,1,-0.011,-0.012,1.8e-05,0.017,-0.011,-0.44,0.0047,-0.0023,-0.73,-0.00055,-0.0044,-7.5e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.007,0.007,0.00018,0.49,0.49,2.4,0.13,0.13,20,0.0017,0.0017,2.5e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +3690000,1,-0.011,-0.012,0.00014,0.019,-0.014,-0.46,0.0065,-0.0035,-0.78,-0.00055,-0.0044,-7.5e-05,0,0,-0.00017,0,0,0,0,0,0,0,0,0.0077,0.0077,0.00019,0.6,0.6,2.4,0.18,0.18,22,0.0017,0.0017,2.5e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +3790000,1,-0.011,-0.012,0.00019,0.016,-0.013,-0.47,0.0044,-0.0026,-0.82,-0.00067,-0.0046,-7.6e-05,0,0,-0.00016,0,0,0,0,0,0,0,0,0.0063,0.0063,0.00017,0.45,0.45,2.4,0.12,0.12,23,0.0014,0.0014,2.1e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +3890000,1,-0.011,-0.012,0.00015,0.017,-0.014,-0.48,0.006,-0.0039,-0.87,-0.00067,-0.0046,-7.6e-05,0,0,-0.00016,0,0,0,0,0,0,0,0,0.0069,0.0069,0.00018,0.55,0.55,2.4,0.17,0.17,24,0.0014,0.0014,2.1e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +3990000,1,-0.011,-0.012,0.00016,0.02,-0.016,-0.5,0.0079,-0.0055,-0.92,-0.00067,-0.0046,-7.6e-05,0,0,-0.00016,0,0,0,0,0,0,0,0,0.0075,0.0075,0.00019,0.67,0.67,2.5,0.23,0.23,26,0.0014,0.0014,2.1e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +4090000,1,-0.011,-0.012,0.00015,0.017,-0.014,-0.51,0.0056,-0.0041,-0.97,-0.00079,-0.0047,-7.7e-05,0,0,-0.00016,0,0,0,0,0,0,0,0,0.0062,0.0062,0.00017,0.51,0.51,2.5,0.16,0.16,28,0.0012,0.0012,1.9e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +4190000,1,-0.011,-0.012,0.00013,0.02,-0.016,-0.53,0.0075,-0.0056,-1,-0.00079,-0.0047,-7.7e-05,0,0,-0.00016,0,0,0,0,0,0,0,0,0.0067,0.0067,0.00018,0.61,0.61,2.5,0.21,0.21,29,0.0012,0.0012,1.9e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +4290000,1,-0.01,-0.012,8.2e-05,0.017,-0.012,-0.54,0.0054,-0.0041,-1.1,-0.00091,-0.0049,-7.7e-05,0,0,-0.00016,0,0,0,0,0,0,0,0,0.0056,0.0056,0.00016,0.47,0.47,2.6,0.15,0.15,31,0.00097,0.00097,1.6e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +4390000,1,-0.01,-0.012,0.0001,0.018,-0.013,-0.55,0.0071,-0.0053,-1.1,-0.00091,-0.0049,-7.7e-05,0,0,-0.00016,0,0,0,0,0,0,0,0,0.006,0.006,0.00017,0.56,0.56,2.6,0.2,0.2,33,0.00097,0.00097,1.6e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +4490000,1,-0.01,-0.012,0.00016,0.014,-0.0097,-0.57,0.0051,-0.0037,-1.2,-0.001,-0.005,-7.8e-05,0,0,-0.00015,0,0,0,0,0,0,0,0,0.0049,0.0049,0.00016,0.43,0.43,2.6,0.14,0.14,34,0.0008,0.0008,1.5e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +4590000,1,-0.01,-0.012,0.00019,0.017,-0.011,-0.58,0.0067,-0.0047,-1.2,-0.001,-0.005,-7.8e-05,0,0,-0.00015,0,0,0,0,0,0,0,0,0.0053,0.0053,0.00017,0.52,0.52,2.7,0.19,0.19,36,0.0008,0.0008,1.5e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +4690000,1,-0.01,-0.012,0.0002,0.014,-0.0096,-0.6,0.0048,-0.0033,-1.3,-0.0011,-0.0052,-7.8e-05,0,0,-0.00015,0,0,0,0,0,0,0,0,0.0044,0.0044,0.00015,0.4,0.4,2.7,0.14,0.14,38,0.00065,0.00065,1.3e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +4790000,1,-0.01,-0.012,0.00019,0.015,-0.011,-0.61,0.0062,-0.0043,-1.4,-0.0011,-0.0052,-7.8e-05,0,0,-0.00015,0,0,0,0,0,0,0,0,0.0047,0.0047,0.00016,0.48,0.48,2.7,0.18,0.18,40,0.00065,0.00065,1.3e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +4890000,1,-0.01,-0.011,0.00017,0.012,-0.0097,-0.63,0.0044,-0.0031,-1.4,-0.0012,-0.0053,-7.9e-05,0,0,-0.00014,0,0,0,0,0,0,0,0,0.0039,0.0039,0.00014,0.37,0.37,2.8,0.13,0.13,42,0.00053,0.00053,1.1e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +4990000,1,-0.01,-0.012,0.00015,0.015,-0.01,-0.64,0.0058,-0.0041,-1.5,-0.0012,-0.0053,-7.9e-05,0,0,-0.00014,0,0,0,0,0,0,0,0,0.0041,0.0041,0.00015,0.44,0.44,2.8,0.17,0.17,44,0.00053,0.00053,1.1e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +5090000,1,-0.01,-0.011,0.0002,0.011,-0.0081,-0.66,0.0041,-0.003,-1.6,-0.0013,-0.0054,-7.9e-05,0,0,-0.00014,0,0,0,0,0,0,0,0,0.0034,0.0034,0.00014,0.34,0.34,2.8,0.12,0.12,47,0.00043,0.00043,1e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +5190000,1,-0.01,-0.011,0.00022,0.013,-0.0095,-0.67,0.0053,-0.0039,-1.6,-0.0013,-0.0054,-7.9e-05,0,0,-0.00014,0,0,0,0,0,0,0,0,0.0036,0.0036,0.00014,0.4,0.4,2.9,0.16,0.16,49,0.00043,0.00043,1e-05,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +5290000,1,-0.0099,-0.011,0.00021,0.0086,-0.007,-0.68,0.0037,-0.0027,-1.7,-0.0013,-0.0055,-7.9e-05,0,0,-0.00014,0,0,0,0,0,0,0,0,0.003,0.003,0.00013,0.31,0.31,2.9,0.12,0.12,51,0.00034,0.00034,9.3e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +5390000,1,-0.0099,-0.011,0.00027,0.0081,-0.0078,-0.7,0.0045,-0.0035,-1.8,-0.0013,-0.0055,-7.9e-05,0,0,-0.00014,0,0,0,0,0,0,0,0,0.0032,0.0032,0.00014,0.36,0.36,3,0.16,0.16,54,0.00034,0.00034,9.3e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +5490000,1,-0.0098,-0.011,0.00028,0.0055,-0.0059,-0.71,0.0031,-0.0025,-1.8,-0.0014,-0.0055,-7.9e-05,0,0,-0.00013,0,0,0,0,0,0,0,0,0.0026,0.0026,0.00013,0.28,0.28,3,0.11,0.11,56,0.00028,0.00028,8.4e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +5590000,1,-0.0097,-0.011,0.00026,0.0061,-0.0063,-0.73,0.0036,-0.003,-1.9,-0.0014,-0.0055,-7.9e-05,0,0,-0.00013,0,0,0,0,0,0,0,0,0.0028,0.0028,0.00013,0.33,0.33,3,0.15,0.15,59,0.00028,0.00028,8.4e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +5690000,1,-0.0096,-0.011,0.00034,0.0041,-0.0036,-0.74,0.0025,-0.0021,-2,-0.0014,-0.0056,-7.9e-05,0,0,-0.00013,0,0,0,0,0,0,0,0,0.0023,0.0023,0.00012,0.26,0.26,3.1,0.11,0.11,61,0.00022,0.00022,7.6e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +5790000,1,-0.0095,-0.011,0.00033,0.0044,-0.0026,-0.75,0.0029,-0.0024,-2,-0.0014,-0.0056,-7.9e-05,0,0,-0.00013,0,0,0,0,0,0,0,0,0.0025,0.0025,0.00013,0.3,0.3,3.1,0.14,0.14,64,0.00022,0.00022,7.6e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +5890000,1,-0.0095,-0.011,0.00031,0.0038,-0.00081,0.0028,0.002,-0.0016,-3.7e+02,-0.0014,-0.0056,-7.9e-05,0,0,-0.00013,0,0,0,0,0,0,0,0,0.0021,0.0021,0.00012,0.23,0.23,9.8,0.1,0.1,0.52,0.00018,0.00018,6.9e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +5990000,1,-0.0094,-0.011,0.00033,0.0041,0.00065,0.015,0.0023,-0.0015,-3.7e+02,-0.0014,-0.0056,-7.9e-05,0,0,-0.00014,0,0,0,0,0,0,0,0,0.0022,0.0022,0.00012,0.27,0.27,8.8,0.13,0.13,0.33,0.00018,0.00018,6.9e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +6090000,1,-0.0094,-0.011,0.00032,0.0051,0.0018,-0.011,0.0028,-0.0014,-3.7e+02,-0.0014,-0.0056,-7.9e-05,0,0,-0.00013,0,0,0,0,0,0,0,0,0.0023,0.0023,0.00013,0.31,0.31,7,0.17,0.17,0.33,0.00018,0.00018,6.9e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +6190000,1,-0.0094,-0.011,0.00024,0.0038,0.0042,-0.005,0.002,-0.00048,-3.7e+02,-0.0015,-0.0056,-7.9e-05,0,0,-0.00015,0,0,0,0,0,0,0,0,0.0019,0.0019,0.00012,0.25,0.25,4.9,0.13,0.13,0.32,0.00015,0.00015,6.3e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +6290000,1,-0.0094,-0.011,0.00022,0.005,0.0042,-0.012,0.0025,-6.7e-05,-3.7e+02,-0.0015,-0.0056,-7.9e-05,0,0,-0.00016,0,0,0,0,0,0,0,0,0.002,0.002,0.00012,0.28,0.28,3.2,0.16,0.16,0.3,0.00015,0.00015,6.3e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +6390000,1,-0.0093,-0.011,0.00024,0.0043,0.0052,-0.05,0.0019,0.0004,-3.7e+02,-0.0015,-0.0057,-8e-05,0,0,-0.0001,0,0,0,0,0,0,0,0,0.0017,0.0017,0.00011,0.22,0.22,2.3,0.12,0.12,0.29,0.00012,0.00012,5.8e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +6490000,1,-0.0093,-0.011,0.00023,0.0049,0.0053,-0.052,0.0023,0.00093,-3.7e+02,-0.0015,-0.0057,-8e-05,0,0,-0.00015,0,0,0,0,0,0,0,0,0.0018,0.0018,0.00012,0.26,0.26,1.5,0.15,0.15,0.26,0.00012,0.00012,5.8e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +6590000,1,-0.0094,-0.011,0.00017,0.0037,0.0053,-0.099,0.0018,0.00099,-3.7e+02,-0.0015,-0.0057,-8e-05,0,0,2.9e-05,0,0,0,0,0,0,0,0,0.0015,0.0015,0.00011,0.2,0.2,1.1,0.12,0.12,0.23,9.7e-05,9.7e-05,5.3e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +6690000,1,-0.0093,-0.011,9.6e-05,0.0046,0.0047,-0.076,0.0022,0.0015,-3.7e+02,-0.0015,-0.0057,-8e-05,0,0,-0.00029,0,0,0,0,0,0,0,0,0.0016,0.0016,0.00011,0.23,0.23,0.78,0.14,0.14,0.21,9.7e-05,9.7e-05,5.3e-06,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +6790000,0.78,-0.024,0.0049,-0.63,-0.0056,0.0015,-0.11,0.0015,0.00055,-3.7e+02,-0.0014,-0.0057,-8.2e-05,0,0,-5.8e-05,-0.092,-0.02,0.51,-0.00081,-0.075,-0.061,0,0,0.0013,0.0013,0.072,0.18,0.18,0.6,0.11,0.11,0.2,8e-05,8e-05,4.9e-06,0.04,0.04,0.04,0.0014,0.0005,0.0014,0.0011,0.0015,0.0014,1,1 +6890000,0.78,-0.025,0.0057,-0.63,-0.03,-0.0077,-0.12,-9e-05,-0.0018,-3.7e+02,-0.0013,-0.0057,-8.3e-05,0,0,-0.00011,-0.1,-0.022,0.51,-0.0011,-0.083,-0.067,0,0,0.0013,0.0013,0.057,0.18,0.18,0.46,0.14,0.14,0.18,8e-05,8e-05,4.9e-06,0.04,0.04,0.04,0.0013,0.00024,0.0013,0.00094,0.0014,0.0013,1,1 +6990000,0.78,-0.025,0.0058,-0.63,-0.059,-0.018,-0.12,-0.0053,-0.0061,-3.7e+02,-0.0012,-0.0057,-8.7e-05,-2.7e-05,-6.9e-05,-0.00041,-0.1,-0.022,0.5,-0.0015,-0.084,-0.067,0,0,0.0013,0.0013,0.053,0.19,0.18,0.36,0.17,0.17,0.16,8e-05,8e-05,4.9e-06,0.04,0.04,0.04,0.0013,0.00018,0.0013,0.0009,0.0014,0.0013,1,1 +7090000,0.78,-0.025,0.0059,-0.63,-0.087,-0.028,-0.12,-0.014,-0.012,-3.7e+02,-0.0011,-0.0057,-9.1e-05,-8.3e-05,-0.00024,-0.00077,-0.1,-0.023,0.5,-0.0017,-0.085,-0.068,0,0,0.0013,0.0013,0.052,0.19,0.19,0.29,0.2,0.2,0.16,7.9e-05,7.9e-05,4.9e-06,0.04,0.04,0.04,0.0013,0.00015,0.0013,0.00089,0.0013,0.0013,1,1 +7190000,0.78,-0.025,0.006,-0.63,-0.11,-0.037,-0.15,-0.024,-0.018,-3.7e+02,-0.001,-0.0057,-9.3e-05,-7.7e-05,-0.00036,-0.00056,-0.1,-0.023,0.5,-0.0017,-0.085,-0.068,0,0,0.0013,0.0013,0.051,0.21,0.21,0.24,0.23,0.23,0.15,7.9e-05,7.9e-05,4.9e-06,0.04,0.04,0.04,0.0013,0.00013,0.0013,0.00088,0.0013,0.0013,1,1 +7290000,0.78,-0.025,0.0059,-0.63,-0.14,-0.04,-0.14,-0.035,-0.019,-3.7e+02,-0.0011,-0.0057,-9e-05,-4.6e-05,-0.00024,-0.0012,-0.1,-0.023,0.5,-0.0017,-0.085,-0.068,0,0,0.0013,0.0013,0.05,0.22,0.22,0.2,0.28,0.28,0.14,7.9e-05,7.9e-05,4.9e-06,0.04,0.04,0.04,0.0013,0.00012,0.0013,0.00087,0.0013,0.0013,1,1 +7390000,0.78,-0.025,0.0059,-0.63,-0.16,-0.048,-0.16,-0.049,-0.025,-3.7e+02,-0.0011,-0.0057,-9e-05,8.1e-07,-0.00028,-0.0014,-0.1,-0.023,0.5,-0.0017,-0.085,-0.068,0,0,0.0013,0.0013,0.05,0.24,0.24,0.18,0.32,0.32,0.13,7.8e-05,7.9e-05,4.9e-06,0.04,0.04,0.039,0.0013,0.00011,0.0013,0.00087,0.0013,0.0013,1,1 +7490000,0.78,-0.025,0.0059,-0.63,-0.19,-0.061,-0.16,-0.066,-0.038,-3.7e+02,-0.00093,-0.0057,-9.3e-05,1.6e-05,-0.0005,-0.0022,-0.1,-0.023,0.5,-0.0017,-0.085,-0.069,0,0,0.0013,0.0013,0.049,0.27,0.26,0.15,0.37,0.37,0.12,7.8e-05,7.8e-05,4.9e-06,0.04,0.04,0.039,0.0013,0.0001,0.0013,0.00086,0.0013,0.0013,1,1 +7590000,0.78,-0.025,0.0059,-0.63,-0.21,-0.067,-0.16,-0.082,-0.044,-3.7e+02,-0.00093,-0.0056,-9e-05,0.00011,-0.00047,-0.003,-0.1,-0.023,0.5,-0.0016,-0.085,-0.068,0,0,0.0013,0.0013,0.049,0.29,0.29,0.14,0.43,0.43,0.12,7.7e-05,7.7e-05,4.9e-06,0.04,0.04,0.039,0.0013,0.0001,0.0013,0.00086,0.0013,0.0013,1,1 +7690000,0.78,-0.025,0.0059,-0.63,-0.24,-0.079,-0.16,-0.1,-0.058,-3.7e+02,-0.00082,-0.0056,-9.3e-05,8.3e-05,-0.00057,-0.005,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0014,0.0014,0.049,0.32,0.32,0.13,0.49,0.49,0.11,7.6e-05,7.7e-05,4.9e-06,0.04,0.04,0.039,0.0013,9.6e-05,0.0013,0.00086,0.0013,0.0013,1,1 +7790000,0.78,-0.025,0.006,-0.63,-0.27,-0.088,-0.16,-0.14,-0.072,-3.7e+02,-0.00074,-0.0057,-9.9e-05,-0.00013,-0.00063,-0.007,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0014,0.0014,0.049,0.35,0.35,0.12,0.56,0.55,0.11,7.5e-05,7.5e-05,4.9e-06,0.04,0.04,0.038,0.0013,9.3e-05,0.0013,0.00086,0.0013,0.0013,1,1 +7890000,0.78,-0.025,0.006,-0.63,-0.29,-0.099,-0.15,-0.16,-0.086,-3.7e+02,-0.00067,-0.0056,-9.8e-05,-8.1e-05,-0.00064,-0.0095,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0014,0.0014,0.049,0.39,0.38,0.11,0.63,0.63,0.1,7.4e-05,7.4e-05,4.9e-06,0.04,0.04,0.038,0.0013,9e-05,0.0013,0.00086,0.0013,0.0013,1,1 +7990000,0.78,-0.025,0.006,-0.63,-0.32,-0.11,-0.16,-0.19,-0.098,-3.7e+02,-0.00064,-0.0056,-9.7e-05,2.6e-06,-0.00064,-0.011,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0014,0.0014,0.049,0.43,0.42,0.1,0.71,0.71,0.099,7.2e-05,7.3e-05,4.9e-06,0.04,0.04,0.038,0.0013,8.8e-05,0.0013,0.00086,0.0013,0.0013,1,1 +8090000,0.78,-0.025,0.006,-0.63,-0.34,-0.12,-0.17,-0.21,-0.11,-3.7e+02,-0.00058,-0.0054,-9.5e-05,0.00017,-0.00074,-0.011,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0014,0.0014,0.048,0.47,0.46,0.1,0.8,0.8,0.097,7e-05,7.1e-05,4.9e-06,0.04,0.04,0.037,0.0013,8.6e-05,0.0013,0.00086,0.0013,0.0013,1,1 +8190000,0.78,-0.025,0.0061,-0.63,-0.37,-0.13,-0.17,-0.25,-0.13,-3.7e+02,-0.00056,-0.0055,-9.8e-05,-2.7e-05,-0.00068,-0.013,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0014,0.0014,0.048,0.52,0.51,0.099,0.9,0.89,0.094,6.8e-05,6.9e-05,4.9e-06,0.04,0.04,0.037,0.0013,8.5e-05,0.0013,0.00085,0.0013,0.0013,1,1 +8290000,0.78,-0.025,0.0061,-0.63,-0.019,-0.0046,-0.17,-0.27,-0.13,-3.7e+02,-0.00042,-0.0056,-0.0001,-6.1e-05,-0.00064,-0.017,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0014,0.0015,0.048,25,25,0.097,1e+02,1e+02,0.091,6.6e-05,6.7e-05,4.9e-06,0.04,0.04,0.036,0.0013,8.3e-05,0.0013,0.00085,0.0013,0.0013,1,1 +8390000,0.78,-0.025,0.0061,-0.63,-0.046,-0.012,-0.17,-0.27,-0.13,-3.7e+02,-0.00038,-0.0055,-0.0001,-6.1e-05,-0.00064,-0.021,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0015,0.0015,0.048,25,25,0.097,1e+02,1e+02,0.091,6.4e-05,6.5e-05,4.9e-06,0.04,0.04,0.035,0.0013,8.2e-05,0.0013,0.00085,0.0013,0.0013,1,1 +8490000,0.78,-0.026,0.0062,-0.63,-0.073,-0.02,-0.17,-0.27,-0.13,-3.7e+02,-0.00033,-0.0055,-0.0001,-6.1e-05,-0.00064,-0.025,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0015,0.0015,0.048,25,25,0.096,51,51,0.089,6.2e-05,6.3e-05,4.9e-06,0.04,0.04,0.034,0.0013,8.1e-05,0.0013,0.00085,0.0013,0.0013,1,1 +8590000,0.78,-0.025,0.0062,-0.63,-0.099,-0.028,-0.16,-0.28,-0.14,-3.7e+02,-0.00051,-0.0056,-0.0001,-6.1e-05,-0.00064,-0.029,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0015,0.0015,0.048,25,25,0.095,52,52,0.088,5.9e-05,6.1e-05,4.9e-06,0.04,0.04,0.034,0.0013,8e-05,0.0013,0.00085,0.0013,0.0013,1,1 +8690000,0.78,-0.025,0.0061,-0.63,-0.12,-0.036,-0.16,-0.28,-0.14,-3.7e+02,-0.00047,-0.0055,-9.9e-05,-6.1e-05,-0.00064,-0.034,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0015,0.0015,0.048,24,24,0.096,35,35,0.088,5.7e-05,5.9e-05,4.9e-06,0.04,0.04,0.033,0.0013,7.9e-05,0.0013,0.00085,0.0013,0.0013,1,1 +8790000,0.78,-0.026,0.0062,-0.63,-0.15,-0.044,-0.15,-0.3,-0.14,-3.7e+02,-0.0004,-0.0055,-0.0001,-6.1e-05,-0.00064,-0.04,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0015,0.0015,0.048,25,25,0.096,37,37,0.087,5.5e-05,5.6e-05,4.9e-06,0.04,0.04,0.032,0.0013,7.8e-05,0.0013,0.00085,0.0013,0.0013,1,1 +8890000,0.78,-0.026,0.0063,-0.63,-0.18,-0.05,-0.15,-0.3,-0.14,-3.7e+02,-0.00037,-0.0056,-0.00011,-6.1e-05,-0.00064,-0.044,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0015,0.0016,0.048,24,24,0.095,28,28,0.086,5.2e-05,5.4e-05,4.9e-06,0.04,0.04,0.03,0.0013,7.7e-05,0.0013,0.00085,0.0013,0.0013,1,1 +8990000,0.78,-0.026,0.0064,-0.63,-0.21,-0.056,-0.14,-0.32,-0.15,-3.7e+02,-0.00029,-0.0057,-0.00011,-6.1e-05,-0.00064,-0.05,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0015,0.0016,0.048,24,24,0.096,30,30,0.087,5e-05,5.1e-05,4.9e-06,0.04,0.04,0.029,0.0013,7.7e-05,0.0013,0.00085,0.0013,0.0013,1,1 +9090000,0.78,-0.026,0.0065,-0.63,-0.23,-0.06,-0.14,-0.33,-0.15,-3.7e+02,-0.00033,-0.0057,-0.00011,-6.1e-05,-0.00064,-0.052,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0015,0.0016,0.048,23,23,0.095,25,25,0.086,4.7e-05,4.9e-05,4.9e-06,0.04,0.04,0.028,0.0013,7.6e-05,0.0013,0.00085,0.0013,0.0013,1,1 +9190000,0.78,-0.026,0.0063,-0.63,-0.25,-0.071,-0.14,-0.35,-0.16,-3.7e+02,-0.00029,-0.0055,-0.00011,-6.1e-05,-0.00064,-0.056,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0015,0.0016,0.048,23,23,0.094,27,27,0.085,4.5e-05,4.6e-05,4.9e-06,0.04,0.04,0.027,0.0013,7.5e-05,0.0013,0.00085,0.0013,0.0013,1,1 +9290000,0.78,-0.026,0.0063,-0.63,-0.27,-0.077,-0.13,-0.35,-0.16,-3.7e+02,-0.00023,-0.0055,-0.00011,-6.1e-05,-0.00064,-0.06,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0015,0.0016,0.048,21,21,0.093,23,23,0.085,4.2e-05,4.4e-05,4.9e-06,0.04,0.04,0.025,0.0013,7.5e-05,0.0013,0.00085,0.0013,0.0013,1,1 +9390000,0.78,-0.026,0.0065,-0.63,-0.3,-0.086,-0.13,-0.38,-0.17,-3.7e+02,-0.00018,-0.0055,-0.00011,-6.1e-05,-0.00064,-0.063,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0016,0.0016,0.048,21,21,0.093,25,25,0.086,4e-05,4.2e-05,4.9e-06,0.04,0.04,0.024,0.0013,7.4e-05,0.0013,0.00085,0.0013,0.0013,1,1 +9490000,0.78,-0.026,0.0064,-0.63,-0.31,-0.092,-0.13,-0.38,-0.17,-3.7e+02,-0.00011,-0.0054,-0.0001,-6.1e-05,-0.00064,-0.067,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0016,0.0016,0.048,19,19,0.091,22,22,0.085,3.8e-05,4e-05,4.9e-06,0.04,0.04,0.023,0.0013,7.4e-05,0.0013,0.00085,0.0013,0.0013,1,1 +9590000,0.78,-0.026,0.0063,-0.63,-0.34,-0.1,-0.12,-0.41,-0.18,-3.7e+02,-0.00024,-0.0053,-0.0001,-6.1e-05,-0.00064,-0.07,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0016,0.0016,0.048,19,19,0.09,25,25,0.085,3.6e-05,3.7e-05,4.9e-06,0.04,0.04,0.022,0.0013,7.3e-05,0.0013,0.00085,0.0013,0.0013,1,1 +9690000,0.78,-0.026,0.0063,-0.63,-0.34,-0.1,-0.12,-0.41,-0.17,-3.7e+02,-0.0003,-0.0055,-0.0001,-6.1e-05,-0.00064,-0.075,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0016,0.0016,0.048,17,17,0.089,22,22,0.086,3.4e-05,3.6e-05,4.9e-06,0.04,0.04,0.02,0.0013,7.3e-05,0.0013,0.00085,0.0013,0.0013,1,1 +9790000,0.78,-0.026,0.0063,-0.63,-0.38,-0.11,-0.1,-0.45,-0.19,-3.7e+02,-0.00026,-0.0054,-0.0001,-6.1e-05,-0.00064,-0.08,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0016,0.0016,0.048,17,17,0.087,24,24,0.085,3.2e-05,3.4e-05,4.9e-06,0.04,0.04,0.019,0.0013,7.3e-05,0.0013,0.00085,0.0013,0.0013,1,1 +9890000,0.78,-0.026,0.0063,-0.63,-0.4,-0.12,-0.1,-0.48,-0.2,-3.7e+02,-0.00033,-0.0054,-0.0001,-6.1e-05,-0.00064,-0.083,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0016,0.0016,0.048,17,17,0.084,28,28,0.085,3e-05,3.2e-05,4.9e-06,0.04,0.04,0.018,0.0013,7.2e-05,0.0013,0.00085,0.0013,0.0013,1,1 +9990000,0.78,-0.026,0.0063,-0.63,-0.4,-0.12,-0.096,-0.47,-0.19,-3.7e+02,-0.00035,-0.0055,-0.0001,-6.1e-05,-0.00064,-0.086,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0016,0.0016,0.048,15,15,0.083,24,24,0.086,2.8e-05,3e-05,4.9e-06,0.04,0.04,0.017,0.0013,7.2e-05,0.0013,0.00085,0.0013,0.0013,1,1 +10090000,0.78,-0.026,0.0062,-0.63,-0.43,-0.12,-0.092,-0.51,-0.2,-3.7e+02,-0.00043,-0.0055,-0.0001,-6.1e-05,-0.00064,-0.089,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0016,0.0016,0.048,15,15,0.081,27,27,0.085,2.7e-05,2.8e-05,4.9e-06,0.04,0.04,0.016,0.0013,7.2e-05,0.0013,0.00085,0.0013,0.0013,1,1 +10190000,0.78,-0.026,0.0065,-0.63,-0.43,-0.12,-0.092,-0.5,-0.2,-3.7e+02,-0.00044,-0.0057,-0.00011,-6.1e-05,-0.00064,-0.09,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0016,0.0016,0.048,14,13,0.078,24,24,0.084,2.5e-05,2.7e-05,4.9e-06,0.04,0.04,0.015,0.0013,7.1e-05,0.0013,0.00085,0.0013,0.0013,1,1 +10290000,0.78,-0.026,0.0067,-0.63,-0.46,-0.12,-0.08,-0.55,-0.21,-3.7e+02,-0.00045,-0.0058,-0.00011,-6.1e-05,-0.00064,-0.096,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0016,0.0016,0.048,14,14,0.076,27,27,0.085,2.4e-05,2.5e-05,4.9e-06,0.04,0.04,0.014,0.0013,7.1e-05,0.0013,0.00085,0.0013,0.0013,1,1 +10390000,0.78,-0.026,0.0068,-0.63,-0.017,-0.027,0.0097,-0.00031,-0.0021,-3.7e+02,-0.00042,-0.0058,-0.00011,-0.00013,-0.00061,-0.099,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0016,0.0016,0.048,0.25,0.25,0.56,0.25,0.25,0.078,2.2e-05,2.4e-05,4.9e-06,0.04,0.04,0.013,0.0013,7.1e-05,0.0013,0.00085,0.0013,0.0013,1,1 +10490000,0.78,-0.026,0.0069,-0.63,-0.047,-0.034,0.023,-0.0035,-0.0051,-3.7e+02,-0.00042,-0.0058,-0.00011,-0.00035,-0.00043,-0.1,-0.1,-0.023,0.5,-0.0016,-0.086,-0.069,0,0,0.0016,0.0016,0.048,0.26,0.26,0.55,0.26,0.26,0.08,2.1e-05,2.3e-05,4.9e-06,0.04,0.04,0.012,0.0013,7.1e-05,0.0013,0.00085,0.0013,0.0013,1,1 +10590000,0.78,-0.026,0.0066,-0.63,-0.045,-0.023,0.026,0.0012,-0.0011,-3.7e+02,-0.00059,-0.0058,-0.00011,-3.5e-05,-0.0011,-0.1,-0.1,-0.023,0.5,-0.0015,-0.086,-0.069,0,0,0.0015,0.0016,0.048,0.13,0.13,0.27,0.13,0.13,0.073,2e-05,2.1e-05,4.9e-06,0.04,0.04,0.012,0.0013,7e-05,0.0013,0.00085,0.0013,0.0013,1,1 +10690000,0.78,-0.026,0.0066,-0.63,-0.073,-0.029,0.03,-0.0048,-0.0037,-3.7e+02,-0.00059,-0.0059,-0.00011,-9.8e-05,-0.0011,-0.1,-0.1,-0.023,0.5,-0.0015,-0.086,-0.069,0,0,0.0015,0.0016,0.048,0.14,0.14,0.26,0.14,0.14,0.078,1.9e-05,2e-05,4.9e-06,0.04,0.04,0.011,0.0013,7e-05,0.0013,0.00085,0.0013,0.0013,1,1 +10790000,0.78,-0.025,0.0064,-0.63,-0.069,-0.024,0.024,-0.0001,-0.0015,-3.7e+02,-0.00063,-0.0058,-0.00011,0.00028,-0.0037,-0.1,-0.1,-0.023,0.5,-0.0015,-0.086,-0.069,0,0,0.0015,0.0016,0.048,0.096,0.096,0.17,0.09,0.09,0.072,1.8e-05,1.9e-05,4.8e-06,0.04,0.039,0.011,0.0013,7e-05,0.0013,0.00084,0.0013,0.0013,1,1 +10890000,0.78,-0.025,0.0064,-0.63,-0.097,-0.03,0.02,-0.0084,-0.0042,-3.7e+02,-0.00063,-0.0058,-0.00011,0.0003,-0.0037,-0.1,-0.1,-0.023,0.5,-0.0015,-0.086,-0.069,0,0,0.0015,0.0015,0.048,0.11,0.11,0.16,0.096,0.096,0.075,1.7e-05,1.8e-05,4.8e-06,0.039,0.039,0.011,0.0013,6.9e-05,0.0013,0.00084,0.0013,0.0013,1,1 +10990000,0.78,-0.025,0.0059,-0.63,-0.085,-0.024,0.014,-0.0037,-0.0024,-3.7e+02,-0.00066,-0.0058,-0.0001,0.0011,-0.009,-0.11,-0.1,-0.023,0.5,-0.0014,-0.086,-0.069,0,0,0.0014,0.0015,0.048,0.086,0.086,0.12,0.099,0.099,0.071,1.6e-05,1.7e-05,4.8e-06,0.039,0.039,0.011,0.0013,6.9e-05,0.0013,0.00083,0.0013,0.0013,1,1 +11090000,0.78,-0.025,0.0057,-0.63,-0.11,-0.032,0.019,-0.013,-0.0054,-3.7e+02,-0.00069,-0.0057,-9.6e-05,0.0013,-0.0089,-0.11,-0.1,-0.023,0.5,-0.0014,-0.086,-0.069,0,0,0.0014,0.0015,0.048,0.1,0.1,0.11,0.11,0.11,0.074,1.5e-05,1.6e-05,4.8e-06,0.039,0.039,0.011,0.0013,6.9e-05,0.0013,0.00083,0.0013,0.0013,1,1 +11190000,0.78,-0.024,0.0051,-0.63,-0.095,-0.025,0.0078,-0.0051,-0.0021,-3.7e+02,-0.00079,-0.0057,-9.3e-05,0.0019,-0.016,-0.11,-0.1,-0.023,0.5,-0.0013,-0.087,-0.069,0,0,0.0013,0.0013,0.048,0.084,0.084,0.084,0.11,0.11,0.069,1.4e-05,1.5e-05,4.8e-06,0.038,0.038,0.011,0.0013,6.8e-05,0.0013,0.00082,0.0013,0.0013,1,1 +11290000,0.78,-0.024,0.0052,-0.63,-0.12,-0.029,0.0076,-0.016,-0.0046,-3.7e+02,-0.00074,-0.0058,-9.7e-05,0.0016,-0.016,-0.11,-0.1,-0.023,0.5,-0.0013,-0.087,-0.069,0,0,0.0013,0.0013,0.048,0.099,0.099,0.078,0.12,0.12,0.072,1.3e-05,1.4e-05,4.8e-06,0.038,0.038,0.01,0.0013,6.8e-05,0.0013,0.00082,0.0013,0.0013,1,1 +11390000,0.78,-0.022,0.0045,-0.63,-0.1,-0.024,0.002,-0.0027,-0.00099,-3.7e+02,-0.00084,-0.0059,-9.5e-05,0.0015,-0.022,-0.11,-0.11,-0.023,0.5,-0.0013,-0.088,-0.069,0,0,0.0011,0.0012,0.047,0.08,0.08,0.063,0.082,0.082,0.068,1.2e-05,1.3e-05,4.8e-06,0.037,0.037,0.01,0.0013,6.8e-05,0.0013,0.0008,0.0013,0.0013,1,1 +11490000,0.78,-0.022,0.0047,-0.63,-0.12,-0.026,0.0029,-0.014,-0.0031,-3.7e+02,-0.0008,-0.006,-0.0001,0.0009,-0.022,-0.11,-0.11,-0.023,0.5,-0.0014,-0.088,-0.069,0,0,0.0011,0.0012,0.047,0.095,0.095,0.058,0.089,0.089,0.069,1.2e-05,1.3e-05,4.8e-06,0.037,0.037,0.01,0.0013,6.8e-05,0.0013,0.0008,0.0013,0.0013,1,1 +11590000,0.78,-0.022,0.0041,-0.63,-0.1,-0.022,-0.003,-0.0044,-0.00098,-3.7e+02,-0.00085,-0.006,-9.8e-05,0.00079,-0.029,-0.11,-0.11,-0.023,0.5,-0.0015,-0.088,-0.069,0,0,0.001,0.001,0.047,0.078,0.078,0.049,0.068,0.068,0.066,1.1e-05,1.2e-05,4.8e-06,0.036,0.036,0.01,0.0012,6.7e-05,0.0013,0.00079,0.0013,0.0013,1,1 +11690000,0.78,-0.022,0.0042,-0.63,-0.12,-0.026,-0.0074,-0.016,-0.0033,-3.7e+02,-0.00079,-0.006,-0.0001,0.00062,-0.03,-0.11,-0.11,-0.023,0.5,-0.0015,-0.088,-0.069,0,0,0.001,0.001,0.047,0.093,0.093,0.046,0.075,0.075,0.066,1.1e-05,1.1e-05,4.8e-06,0.036,0.036,0.01,0.0012,6.7e-05,0.0013,0.00079,0.0013,0.0013,1,1 +11790000,0.78,-0.021,0.0037,-0.63,-0.1,-0.017,-0.0092,-0.0082,0.00018,-3.7e+02,-0.00082,-0.006,-9.7e-05,0.0012,-0.036,-0.11,-0.11,-0.023,0.5,-0.0014,-0.089,-0.069,0,0,0.00089,0.00092,0.047,0.077,0.076,0.039,0.06,0.06,0.063,1e-05,1.1e-05,4.8e-06,0.035,0.035,0.01,0.0012,6.6e-05,0.0013,0.00077,0.0013,0.0013,1,1 +11890000,0.78,-0.021,0.0038,-0.63,-0.12,-0.019,-0.01,-0.019,-0.0015,-3.7e+02,-0.0008,-0.0061,-9.9e-05,0.00091,-0.036,-0.11,-0.11,-0.023,0.5,-0.0015,-0.089,-0.069,0,0,0.00089,0.00092,0.047,0.09,0.09,0.037,0.067,0.067,0.063,9.5e-06,1e-05,4.8e-06,0.035,0.035,0.01,0.0012,6.6e-05,0.0013,0.00077,0.0013,0.0013,1,1 +11990000,0.78,-0.02,0.003,-0.63,-0.095,-0.012,-0.015,-0.011,0.0012,-3.7e+02,-0.00095,-0.0061,-9.3e-05,0.0013,-0.04,-0.11,-0.11,-0.023,0.5,-0.0014,-0.089,-0.07,0,0,0.00079,0.00082,0.047,0.074,0.074,0.033,0.055,0.055,0.061,9e-06,9.7e-06,4.8e-06,0.034,0.034,0.01,0.0012,6.6e-05,0.0013,0.00076,0.0013,0.0013,1,1 +12090000,0.78,-0.02,0.0029,-0.63,-0.11,-0.016,-0.021,-0.021,-0.00045,-3.7e+02,-0.00099,-0.006,-9e-05,0.0018,-0.04,-0.11,-0.11,-0.023,0.5,-0.0013,-0.089,-0.07,0,0,0.00079,0.00082,0.047,0.087,0.086,0.031,0.063,0.063,0.061,8.6e-06,9.2e-06,4.8e-06,0.034,0.034,0.01,0.0012,6.6e-05,0.0013,0.00076,0.0013,0.0013,1,1 +12190000,0.78,-0.019,0.0023,-0.63,-0.084,-0.015,-0.016,-0.01,0.00028,-3.7e+02,-0.00098,-0.006,-8.9e-05,0.0016,-0.046,-0.11,-0.11,-0.023,0.5,-0.0013,-0.09,-0.07,0,0,0.00071,0.00073,0.046,0.071,0.071,0.028,0.052,0.052,0.059,8.1e-06,8.7e-06,4.8e-06,0.034,0.034,0.01,0.0012,6.5e-05,0.0012,0.00074,0.0013,0.0012,1,1 +12290000,0.78,-0.019,0.0024,-0.63,-0.092,-0.017,-0.015,-0.019,-0.0014,-3.7e+02,-0.00094,-0.006,-8.9e-05,0.0017,-0.046,-0.11,-0.11,-0.023,0.5,-0.0013,-0.09,-0.07,0,0,0.00071,0.00073,0.046,0.082,0.082,0.028,0.06,0.06,0.059,7.8e-06,8.4e-06,4.8e-06,0.034,0.034,0.01,0.0012,6.5e-05,0.0012,0.00074,0.0013,0.0012,1,1 +12390000,0.78,-0.019,0.0019,-0.63,-0.073,-0.014,-0.013,-0.0094,-0.00012,-3.7e+02,-0.00099,-0.006,-8.8e-05,0.0011,-0.05,-0.11,-0.11,-0.024,0.5,-0.0014,-0.09,-0.07,0,0,0.00064,0.00066,0.046,0.067,0.067,0.026,0.05,0.05,0.057,7.4e-06,8e-06,4.8e-06,0.033,0.033,0.01,0.0012,6.5e-05,0.0012,0.00073,0.0013,0.0012,1,1 +12490000,0.78,-0.019,0.0021,-0.63,-0.08,-0.016,-0.016,-0.017,-0.0014,-3.7e+02,-0.00096,-0.0061,-9.1e-05,0.00059,-0.05,-0.11,-0.11,-0.024,0.5,-0.0015,-0.09,-0.07,0,0,0.00064,0.00066,0.046,0.077,0.076,0.026,0.058,0.058,0.057,7.1e-06,7.6e-06,4.8e-06,0.033,0.033,0.01,0.0012,6.5e-05,0.0012,0.00073,0.0013,0.0012,1,1 +12590000,0.78,-0.018,0.0018,-0.63,-0.073,-0.014,-0.022,-0.014,-0.00033,-3.7e+02,-0.001,-0.0061,-8.8e-05,0.00072,-0.052,-0.11,-0.11,-0.024,0.5,-0.0015,-0.09,-0.07,0,0,0.00059,0.0006,0.046,0.063,0.063,0.025,0.049,0.049,0.055,6.8e-06,7.3e-06,4.8e-06,0.033,0.033,0.0099,0.0012,6.5e-05,0.0012,0.00072,0.0013,0.0012,1,1 +12690000,0.78,-0.018,0.0018,-0.63,-0.079,-0.015,-0.025,-0.021,-0.0015,-3.7e+02,-0.0011,-0.0061,-8.8e-05,0.00038,-0.051,-0.11,-0.11,-0.024,0.5,-0.0015,-0.09,-0.07,0,0,0.00059,0.0006,0.046,0.071,0.071,0.025,0.057,0.057,0.055,6.5e-06,7e-06,4.8e-06,0.033,0.033,0.0099,0.0012,6.4e-05,0.0012,0.00072,0.0013,0.0012,1,1 +12790000,0.78,-0.018,0.0016,-0.63,-0.072,-0.012,-0.028,-0.018,-0.0006,-3.7e+02,-0.0011,-0.0061,-8.7e-05,0.00058,-0.053,-0.11,-0.11,-0.024,0.5,-0.0015,-0.09,-0.07,0,0,0.00054,0.00056,0.046,0.059,0.058,0.024,0.048,0.048,0.053,6.2e-06,6.7e-06,4.8e-06,0.032,0.032,0.0097,0.0012,6.4e-05,0.0012,0.00071,0.0013,0.0012,1,1 +12890000,0.78,-0.018,0.0017,-0.63,-0.079,-0.013,-0.027,-0.026,-0.0019,-3.7e+02,-0.001,-0.0061,-8.9e-05,0.00062,-0.054,-0.11,-0.11,-0.024,0.5,-0.0015,-0.09,-0.07,0,0,0.00055,0.00056,0.046,0.066,0.066,0.025,0.056,0.056,0.054,6e-06,6.5e-06,4.8e-06,0.032,0.032,0.0097,0.0012,6.4e-05,0.0012,0.00071,0.0013,0.0012,1,1 +12990000,0.78,-0.018,0.0013,-0.63,-0.064,-0.012,-0.028,-0.019,-0.0015,-3.7e+02,-0.0011,-0.006,-8.6e-05,0.0009,-0.056,-0.11,-0.11,-0.024,0.5,-0.0014,-0.09,-0.07,0,0,0.00052,0.00053,0.046,0.059,0.058,0.025,0.058,0.058,0.052,5.7e-06,6.2e-06,4.8e-06,0.032,0.032,0.0094,0.0012,6.4e-05,0.0012,0.00071,0.0013,0.0012,1,1 +13090000,0.78,-0.018,0.0014,-0.63,-0.069,-0.011,-0.028,-0.026,-0.0023,-3.7e+02,-0.001,-0.0061,-8.9e-05,0.00025,-0.057,-0.11,-0.11,-0.024,0.5,-0.0015,-0.09,-0.07,0,0,0.00052,0.00053,0.046,0.065,0.065,0.025,0.066,0.066,0.052,5.5e-06,6e-06,4.8e-06,0.032,0.032,0.0094,0.0012,6.4e-05,0.0012,0.0007,0.0013,0.0012,1,1 +13190000,0.78,-0.018,0.0011,-0.63,-0.055,-0.011,-0.025,-0.017,-0.0015,-3.7e+02,-0.0011,-0.0061,-8.7e-05,-1.3e-05,-0.058,-0.11,-0.11,-0.024,0.5,-0.0016,-0.091,-0.07,0,0,0.00049,0.00051,0.046,0.058,0.058,0.025,0.067,0.067,0.051,5.2e-06,5.7e-06,4.8e-06,0.032,0.032,0.0091,0.0012,6.4e-05,0.0012,0.0007,0.0013,0.0012,1,1 +13290000,0.78,-0.018,0.0011,-0.63,-0.06,-0.013,-0.021,-0.024,-0.003,-3.7e+02,-0.001,-0.006,-8.8e-05,0.00039,-0.059,-0.12,-0.11,-0.024,0.5,-0.0015,-0.091,-0.07,0,0,0.00049,0.00051,0.046,0.064,0.064,0.027,0.077,0.077,0.051,5.1e-06,5.5e-06,4.8e-06,0.032,0.032,0.0091,0.0012,6.3e-05,0.0012,0.0007,0.0013,0.0012,1,1 +13390000,0.78,-0.017,0.00099,-0.63,-0.049,-0.012,-0.017,-0.016,-0.002,-3.7e+02,-0.001,-0.006,-8.5e-05,0.00065,-0.06,-0.12,-0.11,-0.024,0.5,-0.0014,-0.091,-0.07,0,0,0.00047,0.00049,0.046,0.056,0.056,0.026,0.077,0.077,0.05,4.9e-06,5.3e-06,4.8e-06,0.032,0.032,0.0088,0.0012,6.3e-05,0.0012,0.00069,0.0013,0.0012,1,1 +13490000,0.78,-0.017,0.00096,-0.63,-0.053,-0.013,-0.016,-0.022,-0.0034,-3.7e+02,-0.001,-0.006,-8.5e-05,0.00089,-0.061,-0.12,-0.11,-0.024,0.5,-0.0014,-0.091,-0.07,0,0,0.00047,0.00049,0.046,0.062,0.062,0.028,0.088,0.088,0.05,4.7e-06,5.1e-06,4.8e-06,0.031,0.032,0.0087,0.0012,6.3e-05,0.0012,0.00069,0.0013,0.0012,1,1 +13590000,0.78,-0.017,0.00083,-0.63,-0.043,-0.012,-0.018,-0.014,-0.002,-3.7e+02,-0.001,-0.006,-8.5e-05,0.00051,-0.062,-0.12,-0.11,-0.024,0.5,-0.0015,-0.091,-0.07,0,0,0.00046,0.00047,0.046,0.054,0.054,0.028,0.087,0.087,0.05,4.5e-06,5e-06,4.8e-06,0.031,0.032,0.0084,0.0012,6.3e-05,0.0012,0.00069,0.0013,0.0012,1,1 +13690000,0.78,-0.017,0.00081,-0.63,-0.046,-0.015,-0.022,-0.019,-0.0035,-3.7e+02,-0.001,-0.006,-8.4e-05,0.00095,-0.062,-0.12,-0.11,-0.024,0.5,-0.0014,-0.091,-0.07,0,0,0.00046,0.00047,0.046,0.06,0.06,0.029,0.098,0.098,0.05,4.3e-06,4.8e-06,4.8e-06,0.031,0.032,0.0083,0.0012,6.3e-05,0.0012,0.00069,0.0013,0.0012,1,1 +13790000,0.78,-0.017,0.00063,-0.63,-0.033,-0.013,-0.024,-0.0063,-0.003,-3.7e+02,-0.0011,-0.006,-8.3e-05,0.00068,-0.062,-0.12,-0.11,-0.024,0.5,-0.0014,-0.091,-0.07,0,0,0.00044,0.00045,0.046,0.045,0.045,0.029,0.072,0.072,0.049,4.2e-06,4.6e-06,4.8e-06,0.031,0.031,0.0079,0.0012,6.3e-05,0.0012,0.00068,0.0013,0.0012,1,1 +13890000,0.78,-0.017,0.00069,-0.63,-0.037,-0.015,-0.028,-0.01,-0.0045,-3.7e+02,-0.001,-0.006,-8.4e-05,0.00091,-0.063,-0.12,-0.11,-0.024,0.5,-0.0014,-0.091,-0.07,0,0,0.00044,0.00045,0.046,0.049,0.049,0.03,0.081,0.081,0.05,4e-06,4.5e-06,4.8e-06,0.031,0.031,0.0078,0.0012,6.3e-05,0.0012,0.00068,0.0013,0.0012,1,1 +13990000,0.78,-0.017,0.00054,-0.63,-0.029,-0.014,-0.027,-0.0032,-0.004,-3.7e+02,-0.0011,-0.006,-8.4e-05,0.00078,-0.064,-0.12,-0.11,-0.024,0.5,-0.0014,-0.091,-0.07,0,0,0.00043,0.00044,0.046,0.04,0.04,0.03,0.063,0.063,0.05,3.9e-06,4.3e-06,4.8e-06,0.031,0.031,0.0074,0.0012,6.2e-05,0.0012,0.00068,0.0013,0.0012,1,1 +14090000,0.78,-0.017,0.00048,-0.63,-0.03,-0.015,-0.028,-0.006,-0.0056,-3.7e+02,-0.0011,-0.006,-8.1e-05,0.0012,-0.063,-0.12,-0.11,-0.024,0.5,-0.0014,-0.091,-0.07,0,0,0.00043,0.00044,0.046,0.044,0.044,0.031,0.07,0.07,0.05,3.8e-06,4.2e-06,4.8e-06,0.031,0.031,0.0073,0.0012,6.2e-05,0.0012,0.00068,0.0013,0.0012,1,1 +14190000,0.78,-0.017,0.00041,-0.63,-0.024,-0.013,-0.03,-8.4e-05,-0.0036,-3.7e+02,-0.0011,-0.0059,-8e-05,0.0015,-0.064,-0.12,-0.11,-0.024,0.5,-0.0013,-0.091,-0.069,0,0,0.00042,0.00043,0.046,0.036,0.036,0.03,0.057,0.057,0.05,3.6e-06,4.1e-06,4.8e-06,0.031,0.031,0.0069,0.0012,6.2e-05,0.0012,0.00068,0.0012,0.0012,1,1 +14290000,0.78,-0.017,0.00037,-0.63,-0.025,-0.015,-0.029,-0.0025,-0.0051,-3.7e+02,-0.0011,-0.0059,-8e-05,0.0016,-0.064,-0.12,-0.11,-0.024,0.5,-0.0013,-0.091,-0.069,0,0,0.00042,0.00043,0.046,0.04,0.04,0.032,0.064,0.064,0.051,3.5e-06,3.9e-06,4.8e-06,0.031,0.031,0.0067,0.0012,6.2e-05,0.0012,0.00068,0.0012,0.0012,1,1 +14390000,0.78,-0.017,0.00033,-0.63,-0.02,-0.015,-0.031,0.0017,-0.0037,-3.7e+02,-0.0011,-0.0059,-7.8e-05,0.0021,-0.065,-0.12,-0.11,-0.024,0.5,-0.0012,-0.091,-0.069,0,0,0.00041,0.00042,0.046,0.034,0.034,0.031,0.053,0.053,0.05,3.4e-06,3.8e-06,4.8e-06,0.031,0.031,0.0063,0.0012,6.2e-05,0.0012,0.00068,0.0012,0.0012,1,1 +14490000,0.78,-0.017,0.0004,-0.63,-0.022,-0.018,-0.034,-0.00071,-0.0054,-3.7e+02,-0.001,-0.0059,-7.9e-05,0.0022,-0.066,-0.12,-0.11,-0.024,0.5,-0.0012,-0.091,-0.069,0,0,0.00041,0.00042,0.046,0.037,0.037,0.032,0.06,0.06,0.051,3.3e-06,3.7e-06,4.8e-06,0.031,0.031,0.0062,0.0012,6.2e-05,0.0012,0.00068,0.0012,0.0012,1,1 +14590000,0.78,-0.017,0.00048,-0.63,-0.023,-0.018,-0.034,-0.0013,-0.0052,-3.7e+02,-0.001,-0.0059,-8e-05,0.0021,-0.066,-0.12,-0.11,-0.024,0.5,-0.0012,-0.091,-0.069,0,0,0.00041,0.00042,0.046,0.032,0.032,0.031,0.051,0.051,0.051,3.2e-06,3.6e-06,4.8e-06,0.031,0.031,0.0058,0.0012,6.2e-05,0.0012,0.00067,0.0012,0.0012,1,1 +14690000,0.78,-0.017,0.0005,-0.63,-0.026,-0.017,-0.031,-0.0038,-0.0071,-3.7e+02,-0.00099,-0.0059,-7.9e-05,0.0024,-0.066,-0.12,-0.11,-0.024,0.5,-0.0012,-0.091,-0.069,0,0,0.00041,0.00042,0.046,0.035,0.035,0.032,0.056,0.056,0.051,3.1e-06,3.5e-06,4.8e-06,0.031,0.031,0.0057,0.0012,6.2e-05,0.0012,0.00067,0.0012,0.0012,1,1 +14790000,0.78,-0.017,0.00051,-0.63,-0.025,-0.016,-0.027,-0.0038,-0.0066,-3.7e+02,-0.00099,-0.0059,-7.9e-05,0.0023,-0.066,-0.12,-0.11,-0.024,0.5,-0.0012,-0.091,-0.069,0,0,0.0004,0.00041,0.046,0.03,0.03,0.031,0.049,0.049,0.051,3e-06,3.3e-06,4.8e-06,0.031,0.031,0.0053,0.0012,6.2e-05,0.0012,0.00067,0.0012,0.0012,1,1 +14890000,0.78,-0.017,0.00052,-0.63,-0.028,-0.019,-0.03,-0.0065,-0.0085,-3.7e+02,-0.00097,-0.0059,-7.8e-05,0.0025,-0.066,-0.12,-0.11,-0.024,0.5,-0.0012,-0.091,-0.069,0,0,0.0004,0.00041,0.046,0.033,0.033,0.031,0.054,0.054,0.052,2.9e-06,3.3e-06,4.8e-06,0.031,0.031,0.0051,0.0012,6.2e-05,0.0012,0.00067,0.0012,0.0012,1,1 +14990000,0.78,-0.017,0.00057,-0.63,-0.026,-0.016,-0.026,-0.0049,-0.0065,-3.7e+02,-0.00097,-0.0059,-7.8e-05,0.0024,-0.067,-0.12,-0.11,-0.024,0.5,-0.0012,-0.091,-0.069,0,0,0.0004,0.00041,0.046,0.029,0.029,0.03,0.047,0.047,0.051,2.8e-06,3.2e-06,4.8e-06,0.031,0.031,0.0048,0.0012,6.1e-05,0.0012,0.00067,0.0012,0.0012,1,1 +15090000,0.78,-0.017,0.00066,-0.63,-0.028,-0.017,-0.029,-0.0076,-0.0081,-3.7e+02,-0.00097,-0.0059,-7.9e-05,0.0022,-0.067,-0.12,-0.11,-0.024,0.5,-0.0012,-0.091,-0.069,0,0,0.0004,0.00041,0.046,0.031,0.031,0.031,0.052,0.052,0.052,2.7e-06,3.1e-06,4.8e-06,0.031,0.031,0.0046,0.0012,6.1e-05,0.0012,0.00067,0.0012,0.0012,1,1 +15190000,0.78,-0.017,0.00069,-0.63,-0.026,-0.016,-0.026,-0.006,-0.0064,-3.7e+02,-0.00096,-0.0059,-7.9e-05,0.0022,-0.067,-0.12,-0.11,-0.024,0.5,-0.0011,-0.091,-0.069,0,0,0.00039,0.00041,0.046,0.027,0.028,0.03,0.046,0.046,0.052,2.6e-06,3e-06,4.8e-06,0.031,0.031,0.0043,0.0012,6.1e-05,0.0012,0.00067,0.0012,0.0012,1,1 +15290000,0.78,-0.017,0.00069,-0.63,-0.028,-0.018,-0.024,-0.0086,-0.0082,-3.7e+02,-0.00097,-0.0059,-7.8e-05,0.0023,-0.067,-0.12,-0.11,-0.024,0.5,-0.0011,-0.09,-0.069,0,0,0.00039,0.00041,0.046,0.03,0.03,0.03,0.051,0.051,0.052,2.5e-06,2.9e-06,4.8e-06,0.031,0.031,0.0042,0.0012,6.1e-05,0.0012,0.00067,0.0012,0.0012,1,1 +15390000,0.78,-0.017,0.00064,-0.63,-0.027,-0.018,-0.022,-0.0082,-0.0083,-3.7e+02,-0.00099,-0.0059,-7.4e-05,0.0028,-0.067,-0.13,-0.11,-0.024,0.5,-0.0011,-0.09,-0.069,0,0,0.00039,0.00041,0.046,0.029,0.029,0.029,0.054,0.054,0.051,2.4e-06,2.8e-06,4.8e-06,0.031,0.031,0.0039,0.0012,6.1e-05,0.0012,0.00067,0.0012,0.0012,1,1 +15490000,0.78,-0.017,0.00066,-0.63,-0.03,-0.018,-0.022,-0.011,-0.0098,-3.7e+02,-0.00099,-0.0059,-7.6e-05,0.0024,-0.067,-0.12,-0.11,-0.024,0.5,-0.0011,-0.09,-0.069,0,0,0.00039,0.00041,0.046,0.031,0.031,0.029,0.06,0.06,0.053,2.4e-06,2.7e-06,4.8e-06,0.031,0.031,0.0037,0.0012,6.1e-05,0.0012,0.00067,0.0012,0.0012,1,1 +15590000,0.78,-0.017,0.0007,-0.63,-0.028,-0.017,-0.021,-0.01,-0.0091,-3.7e+02,-0.001,-0.006,-7.6e-05,0.0022,-0.067,-0.13,-0.11,-0.024,0.5,-0.0011,-0.091,-0.069,0,0,0.00039,0.0004,0.046,0.029,0.03,0.028,0.062,0.062,0.052,2.3e-06,2.7e-06,4.8e-06,0.031,0.031,0.0035,0.0012,6.1e-05,0.0012,0.00067,0.0012,0.0012,1,1 +15690000,0.78,-0.017,0.00067,-0.63,-0.029,-0.017,-0.021,-0.013,-0.011,-3.7e+02,-0.001,-0.006,-7.6e-05,0.0021,-0.067,-0.13,-0.11,-0.024,0.5,-0.0011,-0.091,-0.069,0,0,0.00039,0.0004,0.046,0.032,0.032,0.028,0.069,0.069,0.052,2.2e-06,2.6e-06,4.8e-06,0.03,0.031,0.0033,0.0012,6.1e-05,0.0012,0.00067,0.0012,0.0012,1,1 +15790000,0.78,-0.017,0.00067,-0.63,-0.026,-0.016,-0.024,-0.009,-0.009,-3.7e+02,-0.001,-0.006,-7.6e-05,0.002,-0.067,-0.12,-0.11,-0.024,0.5,-0.0011,-0.091,-0.069,0,0,0.00039,0.0004,0.046,0.026,0.027,0.027,0.056,0.057,0.051,2.2e-06,2.5e-06,4.8e-06,0.03,0.031,0.0031,0.0012,6.1e-05,0.0012,0.00066,0.0012,0.0012,1,1 +15890000,0.78,-0.017,0.00068,-0.63,-0.028,-0.017,-0.022,-0.012,-0.011,-3.7e+02,-0.001,-0.006,-7.6e-05,0.002,-0.067,-0.12,-0.11,-0.024,0.5,-0.0011,-0.091,-0.069,0,0,0.00039,0.0004,0.046,0.028,0.029,0.027,0.063,0.063,0.052,2.1e-06,2.5e-06,4.8e-06,0.03,0.031,0.003,0.0012,6.1e-05,0.0012,0.00066,0.0012,0.0012,1,1 +15990000,0.78,-0.017,0.00066,-0.63,-0.025,-0.017,-0.017,-0.0084,-0.0095,-3.7e+02,-0.001,-0.0059,-7.3e-05,0.0023,-0.067,-0.13,-0.11,-0.024,0.5,-0.0011,-0.091,-0.069,0,0,0.00038,0.0004,0.046,0.024,0.025,0.026,0.053,0.053,0.051,2e-06,2.4e-06,4.8e-06,0.03,0.031,0.0028,0.0012,6.1e-05,0.0012,0.00066,0.0012,0.0012,1,1 +16090000,0.78,-0.017,0.00058,-0.63,-0.027,-0.019,-0.014,-0.011,-0.012,-3.7e+02,-0.0011,-0.0059,-7.1e-05,0.0027,-0.067,-0.13,-0.11,-0.024,0.5,-0.0011,-0.091,-0.069,0,0,0.00038,0.0004,0.046,0.026,0.026,0.025,0.058,0.058,0.052,2e-06,2.3e-06,4.8e-06,0.03,0.031,0.0027,0.0012,6.1e-05,0.0012,0.00066,0.0012,0.0012,1,1 +16190000,0.78,-0.017,0.00056,-0.63,-0.025,-0.017,-0.013,-0.008,-0.009,-3.7e+02,-0.0011,-0.0059,-6.9e-05,0.0027,-0.067,-0.13,-0.11,-0.024,0.5,-0.001,-0.091,-0.069,0,0,0.00038,0.0004,0.046,0.023,0.023,0.025,0.05,0.05,0.051,1.9e-06,2.3e-06,4.8e-06,0.03,0.031,0.0025,0.0012,6.1e-05,0.0012,0.00066,0.0012,0.0012,1,1 +16290000,0.78,-0.017,0.00049,-0.63,-0.028,-0.019,-0.014,-0.011,-0.011,-3.7e+02,-0.0011,-0.0059,-6.7e-05,0.0031,-0.067,-0.13,-0.11,-0.024,0.5,-0.001,-0.091,-0.069,0,0,0.00038,0.0004,0.046,0.024,0.025,0.024,0.055,0.055,0.052,1.9e-06,2.2e-06,4.8e-06,0.03,0.031,0.0024,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 +16390000,0.78,-0.017,0.00051,-0.63,-0.024,-0.015,-0.013,-0.0081,-0.0086,-3.7e+02,-0.0011,-0.0059,-6.5e-05,0.003,-0.066,-0.13,-0.11,-0.024,0.5,-0.001,-0.091,-0.069,0,0,0.00038,0.0004,0.046,0.022,0.022,0.023,0.047,0.047,0.051,1.8e-06,2.1e-06,4.8e-06,0.03,0.031,0.0022,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 +16490000,0.78,-0.016,0.00047,-0.63,-0.024,-0.017,-0.016,-0.01,-0.01,-3.7e+02,-0.0011,-0.0059,-6.5e-05,0.003,-0.066,-0.13,-0.11,-0.024,0.5,-0.001,-0.091,-0.069,0,0,0.00038,0.0004,0.046,0.023,0.024,0.023,0.052,0.052,0.052,1.8e-06,2.1e-06,4.8e-06,0.03,0.031,0.0022,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 +16590000,0.78,-0.016,0.00043,-0.63,-0.024,-0.013,-0.017,-0.01,-0.0062,-3.7e+02,-0.0011,-0.0059,-5.9e-05,0.0031,-0.066,-0.13,-0.11,-0.024,0.5,-0.00095,-0.091,-0.069,0,0,0.00038,0.00039,0.046,0.021,0.021,0.022,0.046,0.046,0.051,1.7e-06,2e-06,4.8e-06,0.03,0.031,0.002,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 +16690000,0.78,-0.016,0.00048,-0.63,-0.025,-0.014,-0.013,-0.013,-0.0073,-3.7e+02,-0.0011,-0.0059,-6.1e-05,0.0028,-0.066,-0.13,-0.11,-0.024,0.5,-0.00096,-0.091,-0.069,0,0,0.00038,0.00039,0.046,0.022,0.023,0.022,0.05,0.051,0.051,1.7e-06,2e-06,4.8e-06,0.03,0.031,0.0019,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 +16790000,0.78,-0.016,0.00052,-0.63,-0.024,-0.01,-0.012,-0.013,-0.004,-3.7e+02,-0.0011,-0.006,-5.6e-05,0.0028,-0.066,-0.13,-0.11,-0.024,0.5,-0.0009,-0.091,-0.069,0,0,0.00038,0.00039,0.046,0.02,0.02,0.021,0.044,0.044,0.05,1.6e-06,2e-06,4.8e-06,0.03,0.031,0.0018,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 +16890000,0.78,-0.016,0.00051,-0.63,-0.025,-0.011,-0.0096,-0.015,-0.0049,-3.7e+02,-0.0011,-0.006,-5.7e-05,0.0027,-0.066,-0.13,-0.11,-0.024,0.5,-0.00091,-0.091,-0.069,0,0,0.00038,0.00039,0.046,0.021,0.022,0.021,0.049,0.049,0.051,1.6e-06,1.9e-06,4.8e-06,0.03,0.031,0.0017,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 +16990000,0.78,-0.016,0.00055,-0.63,-0.024,-0.011,-0.0091,-0.014,-0.0048,-3.7e+02,-0.0012,-0.006,-5.9e-05,0.0025,-0.066,-0.13,-0.11,-0.024,0.5,-0.00092,-0.091,-0.069,0,0,0.00038,0.00039,0.046,0.019,0.02,0.02,0.043,0.043,0.05,1.5e-06,1.9e-06,4.8e-06,0.03,0.031,0.0016,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 +17090000,0.78,-0.016,0.00054,-0.63,-0.025,-0.013,-0.009,-0.016,-0.0059,-3.7e+02,-0.0012,-0.006,-5.8e-05,0.0025,-0.066,-0.13,-0.11,-0.024,0.5,-0.00093,-0.091,-0.069,0,0,0.00038,0.00039,0.046,0.02,0.021,0.02,0.048,0.048,0.05,1.5e-06,1.8e-06,4.8e-06,0.03,0.031,0.0016,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 +17190000,0.78,-0.016,0.00048,-0.63,-0.024,-0.015,-0.0099,-0.014,-0.0062,-3.7e+02,-0.0012,-0.006,-5.7e-05,0.0026,-0.066,-0.13,-0.11,-0.024,0.5,-0.00092,-0.091,-0.069,0,0,0.00037,0.00039,0.046,0.018,0.019,0.019,0.042,0.043,0.049,1.5e-06,1.8e-06,4.8e-06,0.03,0.031,0.0015,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 +17290000,0.78,-0.016,0.00051,-0.63,-0.027,-0.017,-0.0054,-0.017,-0.0074,-3.7e+02,-0.0012,-0.006,-5.8e-05,0.0024,-0.065,-0.13,-0.11,-0.024,0.5,-0.00093,-0.091,-0.069,0,0,0.00037,0.00039,0.046,0.02,0.02,0.019,0.047,0.047,0.049,1.4e-06,1.7e-06,4.8e-06,0.03,0.031,0.0014,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 +17390000,0.78,-0.016,0.00044,-0.63,-0.024,-0.018,-0.0035,-0.014,-0.0076,-3.7e+02,-0.0012,-0.006,-5.6e-05,0.0026,-0.065,-0.13,-0.11,-0.024,0.5,-0.00093,-0.091,-0.069,0,0,0.00037,0.00039,0.046,0.018,0.018,0.018,0.042,0.042,0.048,1.4e-06,1.7e-06,4.8e-06,0.03,0.031,0.0013,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 +17490000,0.78,-0.016,0.00046,-0.63,-0.026,-0.019,-0.0018,-0.017,-0.0095,-3.7e+02,-0.0012,-0.006,-5.6e-05,0.0026,-0.066,-0.13,-0.11,-0.024,0.5,-0.00092,-0.091,-0.069,0,0,0.00037,0.00039,0.046,0.019,0.02,0.018,0.046,0.046,0.049,1.4e-06,1.7e-06,4.8e-06,0.03,0.031,0.0013,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 +17590000,0.78,-0.016,0.00047,-0.63,-0.024,-0.019,0.0036,-0.014,-0.0091,-3.7e+02,-0.0012,-0.006,-5.5e-05,0.0026,-0.065,-0.13,-0.11,-0.024,0.5,-0.00091,-0.091,-0.069,0,0,0.00037,0.00039,0.046,0.017,0.018,0.017,0.041,0.041,0.048,1.3e-06,1.6e-06,4.8e-06,0.03,0.031,0.0012,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 +17690000,0.78,-0.016,0.00049,-0.63,-0.026,-0.021,0.003,-0.017,-0.011,-3.7e+02,-0.0012,-0.006,-5.4e-05,0.0027,-0.065,-0.13,-0.11,-0.024,0.5,-0.00091,-0.091,-0.069,0,0,0.00037,0.00039,0.046,0.019,0.019,0.017,0.045,0.045,0.048,1.3e-06,1.6e-06,4.8e-06,0.03,0.031,0.0012,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 +17790000,0.78,-0.016,0.00043,-0.63,-0.024,-0.022,0.0016,-0.015,-0.012,-3.7e+02,-0.0012,-0.0059,-4.8e-05,0.0031,-0.065,-0.13,-0.11,-0.024,0.5,-0.00088,-0.091,-0.069,0,0,0.00037,0.00039,0.046,0.018,0.019,0.016,0.048,0.048,0.048,1.3e-06,1.6e-06,4.8e-06,0.03,0.031,0.0011,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 +17890000,0.78,-0.016,0.00042,-0.63,-0.027,-0.023,0.0017,-0.018,-0.015,-3.7e+02,-0.0012,-0.0059,-4.6e-05,0.0033,-0.065,-0.13,-0.11,-0.024,0.5,-0.00087,-0.091,-0.069,0,0,0.00037,0.00039,0.046,0.02,0.02,0.016,0.053,0.053,0.048,1.2e-06,1.5e-06,4.8e-06,0.03,0.031,0.0011,0.0012,6e-05,0.0012,0.00066,0.0012,0.0012,1,1 +17990000,0.78,-0.016,0.00045,-0.63,-0.026,-0.021,0.0029,-0.016,-0.015,-3.7e+02,-0.0012,-0.0059,-4.5e-05,0.0032,-0.066,-0.13,-0.11,-0.024,0.5,-0.00086,-0.091,-0.069,0,0,0.00037,0.00039,0.046,0.019,0.02,0.016,0.055,0.055,0.047,1.2e-06,1.5e-06,4.8e-06,0.03,0.031,0.001,0.0012,5.9e-05,0.0012,0.00066,0.0012,0.0012,1,1 +18090000,0.78,-0.016,0.00049,-0.63,-0.027,-0.021,0.0053,-0.019,-0.016,-3.7e+02,-0.0012,-0.006,-4.8e-05,0.0029,-0.066,-0.13,-0.11,-0.024,0.5,-0.00087,-0.091,-0.069,0,0,0.00037,0.00039,0.046,0.021,0.021,0.016,0.06,0.061,0.047,1.2e-06,1.5e-06,4.8e-06,0.03,0.031,0.00098,0.0012,5.9e-05,0.0012,0.00066,0.0012,0.0012,1,1 +18190000,0.78,-0.016,0.00049,-0.63,-0.024,-0.02,0.0066,-0.014,-0.013,-3.7e+02,-0.0012,-0.006,-4.2e-05,0.003,-0.066,-0.13,-0.11,-0.024,0.5,-0.00084,-0.091,-0.069,0,0,0.00037,0.00039,0.046,0.018,0.019,0.015,0.051,0.051,0.047,1.1e-06,1.4e-06,4.8e-06,0.03,0.03,0.00093,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 +18290000,0.78,-0.016,0.00059,-0.63,-0.025,-0.02,0.0078,-0.016,-0.015,-3.7e+02,-0.0012,-0.006,-4.4e-05,0.0029,-0.066,-0.13,-0.11,-0.024,0.5,-0.00084,-0.091,-0.069,0,0,0.00037,0.00039,0.046,0.019,0.02,0.015,0.056,0.056,0.046,1.1e-06,1.4e-06,4.8e-06,0.03,0.03,0.00089,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 +18390000,0.78,-0.016,0.00055,-0.63,-0.024,-0.021,0.009,-0.013,-0.012,-3.7e+02,-0.0012,-0.006,-3.8e-05,0.0031,-0.066,-0.13,-0.11,-0.024,0.5,-0.0008,-0.091,-0.069,0,0,0.00037,0.00039,0.046,0.017,0.018,0.014,0.048,0.048,0.046,1.1e-06,1.4e-06,4.7e-06,0.03,0.03,0.00085,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 +18490000,0.78,-0.016,0.00051,-0.63,-0.024,-0.023,0.0086,-0.015,-0.015,-3.7e+02,-0.0012,-0.006,-3.7e-05,0.0031,-0.066,-0.13,-0.11,-0.024,0.5,-0.0008,-0.091,-0.069,0,0,0.00037,0.00039,0.046,0.018,0.019,0.014,0.053,0.053,0.046,1.1e-06,1.3e-06,4.7e-06,0.03,0.03,0.00082,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 +18590000,0.78,-0.016,0.00049,-0.63,-0.022,-0.022,0.0067,-0.012,-0.013,-3.7e+02,-0.0013,-0.0059,-2.8e-05,0.0034,-0.066,-0.13,-0.11,-0.024,0.5,-0.00076,-0.091,-0.069,0,0,0.00037,0.00039,0.046,0.016,0.017,0.014,0.046,0.046,0.045,1e-06,1.3e-06,4.7e-06,0.03,0.03,0.00078,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 +18690000,0.78,-0.016,0.00055,-0.63,-0.024,-0.023,0.0048,-0.015,-0.015,-3.7e+02,-0.0012,-0.006,-3e-05,0.0033,-0.066,-0.13,-0.11,-0.024,0.5,-0.00076,-0.091,-0.069,0,0,0.00037,0.00039,0.046,0.017,0.018,0.013,0.05,0.05,0.045,1e-06,1.3e-06,4.7e-06,0.03,0.03,0.00076,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 +18790000,0.78,-0.016,0.00057,-0.63,-0.022,-0.021,0.0045,-0.012,-0.012,-3.7e+02,-0.0013,-0.006,-2.6e-05,0.0032,-0.066,-0.13,-0.11,-0.024,0.5,-0.00074,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.015,0.016,0.013,0.044,0.044,0.045,1e-06,1.2e-06,4.7e-06,0.03,0.03,0.00073,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 +18890000,0.78,-0.016,0.00048,-0.63,-0.022,-0.024,0.0051,-0.014,-0.015,-3.7e+02,-0.0013,-0.0059,-2.2e-05,0.0034,-0.066,-0.13,-0.11,-0.024,0.5,-0.00074,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.016,0.017,0.013,0.048,0.048,0.045,9.8e-07,1.2e-06,4.7e-06,0.03,0.03,0.0007,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 +18990000,0.78,-0.016,0.00042,-0.63,-0.019,-0.024,0.0037,-0.0098,-0.013,-3.7e+02,-0.0013,-0.0059,-1.5e-05,0.0035,-0.065,-0.13,-0.11,-0.024,0.5,-0.00071,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.015,0.016,0.012,0.043,0.043,0.044,9.5e-07,1.2e-06,4.7e-06,0.03,0.03,0.00067,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 +19090000,0.78,-0.016,0.00041,-0.63,-0.019,-0.025,0.0067,-0.011,-0.015,-3.7e+02,-0.0013,-0.0059,-1.5e-05,0.0035,-0.065,-0.13,-0.11,-0.024,0.5,-0.00071,-0.091,-0.068,0,0,0.00037,0.00039,0.046,0.016,0.017,0.012,0.046,0.047,0.044,9.4e-07,1.2e-06,4.7e-06,0.03,0.03,0.00065,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 +19190000,0.78,-0.016,0.00036,-0.63,-0.015,-0.024,0.0067,-0.0077,-0.013,-3.7e+02,-0.0013,-0.0059,-8.2e-06,0.0035,-0.065,-0.13,-0.11,-0.024,0.5,-0.00068,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.015,0.015,0.012,0.041,0.042,0.044,9.1e-07,1.2e-06,4.7e-06,0.03,0.03,0.00063,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 +19290000,0.78,-0.016,0.00037,-0.63,-0.016,-0.024,0.0094,-0.0095,-0.016,-3.7e+02,-0.0013,-0.006,-1.1e-05,0.0034,-0.065,-0.13,-0.11,-0.024,0.5,-0.00069,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.016,0.017,0.012,0.045,0.046,0.044,9e-07,1.1e-06,4.7e-06,0.03,0.03,0.00061,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 +19390000,0.78,-0.016,0.0004,-0.63,-0.015,-0.022,0.013,-0.0084,-0.014,-3.7e+02,-0.0013,-0.006,-2.4e-06,0.0035,-0.065,-0.13,-0.11,-0.024,0.5,-0.00065,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.015,0.012,0.04,0.041,0.043,8.8e-07,1.1e-06,4.6e-06,0.03,0.03,0.00058,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 +19490000,0.78,-0.016,0.00035,-0.63,-0.015,-0.024,0.0096,-0.01,-0.017,-3.7e+02,-0.0013,-0.0059,1.4e-06,0.0037,-0.065,-0.13,-0.11,-0.024,0.5,-0.00064,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.015,0.016,0.011,0.044,0.045,0.043,8.6e-07,1.1e-06,4.6e-06,0.03,0.03,0.00057,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 +19590000,0.78,-0.015,0.0003,-0.63,-0.013,-0.022,0.0088,-0.0085,-0.015,-3.7e+02,-0.0013,-0.0059,1.4e-05,0.0039,-0.065,-0.13,-0.11,-0.024,0.5,-0.0006,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.015,0.011,0.04,0.04,0.042,8.4e-07,1.1e-06,4.6e-06,0.03,0.03,0.00055,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 +19690000,0.78,-0.015,0.00028,-0.63,-0.014,-0.021,0.01,-0.0093,-0.017,-3.7e+02,-0.0013,-0.0059,1.1e-05,0.0037,-0.065,-0.13,-0.11,-0.024,0.5,-0.00061,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.015,0.016,0.011,0.043,0.044,0.042,8.3e-07,1.1e-06,4.6e-06,0.03,0.03,0.00053,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 +19790000,0.78,-0.015,0.00024,-0.63,-0.012,-0.018,0.011,-0.0079,-0.015,-3.7e+02,-0.0013,-0.006,1.8e-05,0.0037,-0.065,-0.13,-0.11,-0.024,0.5,-0.00058,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.015,0.011,0.039,0.039,0.042,8.1e-07,1e-06,4.6e-06,0.03,0.03,0.00051,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 +19890000,0.78,-0.015,0.00028,-0.63,-0.011,-0.02,0.012,-0.0096,-0.017,-3.7e+02,-0.0013,-0.0059,2.4e-05,0.004,-0.065,-0.13,-0.11,-0.024,0.5,-0.00056,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.015,0.016,0.011,0.043,0.043,0.042,8e-07,1e-06,4.6e-06,0.03,0.03,0.0005,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 +19990000,0.78,-0.016,0.00028,-0.63,-0.0096,-0.02,0.015,-0.0084,-0.016,-3.7e+02,-0.0013,-0.0059,3.9e-05,0.0043,-0.065,-0.13,-0.11,-0.024,0.5,-0.00051,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.015,0.01,0.039,0.039,0.041,7.7e-07,9.9e-07,4.6e-06,0.03,0.03,0.00048,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 +20090000,0.78,-0.016,0.00023,-0.63,-0.0096,-0.02,0.015,-0.0091,-0.019,-3.7e+02,-0.0013,-0.0059,4.7e-05,0.0046,-0.065,-0.13,-0.11,-0.024,0.5,-0.00051,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.015,0.016,0.01,0.042,0.043,0.042,7.7e-07,9.8e-07,4.6e-06,0.03,0.03,0.00047,0.0012,5.9e-05,0.0012,0.00065,0.0012,0.0012,1,1 +20190000,0.78,-0.016,0.00019,-0.63,-0.01,-0.019,0.017,-0.0092,-0.017,-3.7e+02,-0.0013,-0.0059,5.8e-05,0.0047,-0.065,-0.13,-0.11,-0.024,0.5,-0.00046,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.015,0.01,0.038,0.039,0.041,7.4e-07,9.5e-07,4.6e-06,0.03,0.03,0.00045,0.0012,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +20290000,0.78,-0.016,0.00019,-0.63,-0.0089,-0.019,0.015,-0.0096,-0.019,-3.7e+02,-0.0013,-0.0059,6.1e-05,0.0047,-0.065,-0.13,-0.11,-0.024,0.5,-0.00047,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.016,0.0099,0.042,0.042,0.041,7.4e-07,9.4e-07,4.6e-06,0.03,0.03,0.00044,0.0012,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +20390000,0.78,-0.016,0.00024,-0.63,-0.0085,-0.016,0.017,-0.0095,-0.017,-3.7e+02,-0.0013,-0.0059,6.8e-05,0.0047,-0.065,-0.13,-0.11,-0.024,0.5,-0.00043,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.013,0.014,0.0097,0.038,0.038,0.041,7.2e-07,9.2e-07,4.5e-06,0.03,0.03,0.00043,0.0012,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +20490000,0.78,-0.016,0.0002,-0.63,-0.0087,-0.016,0.017,-0.01,-0.018,-3.7e+02,-0.0013,-0.0059,6.5e-05,0.0046,-0.065,-0.13,-0.11,-0.024,0.5,-0.00043,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.015,0.0096,0.041,0.042,0.041,7.1e-07,9.1e-07,4.5e-06,0.03,0.03,0.00042,0.0012,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +20590000,0.78,-0.016,0.0002,-0.63,-0.0081,-0.014,0.014,-0.0089,-0.016,-3.7e+02,-0.0013,-0.0059,6.9e-05,0.0045,-0.065,-0.13,-0.11,-0.024,0.5,-0.00041,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.013,0.014,0.0093,0.038,0.038,0.04,6.9e-07,8.8e-07,4.5e-06,0.03,0.03,0.0004,0.0012,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +20690000,0.78,-0.016,0.00015,-0.63,-0.0089,-0.014,0.015,-0.0098,-0.017,-3.7e+02,-0.0013,-0.0059,7.2e-05,0.0045,-0.065,-0.13,-0.11,-0.024,0.5,-0.00041,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.015,0.0093,0.041,0.042,0.04,6.8e-07,8.8e-07,4.5e-06,0.03,0.03,0.0004,0.0012,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +20790000,0.78,-0.016,0.00013,-0.63,-0.0065,-0.013,0.016,-0.0082,-0.015,-3.7e+02,-0.0013,-0.0059,7.9e-05,0.0045,-0.065,-0.13,-0.11,-0.024,0.5,-0.00039,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.013,0.014,0.0091,0.037,0.038,0.04,6.6e-07,8.5e-07,4.5e-06,0.03,0.03,0.00038,0.0012,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +20890000,0.78,-0.016,0.00011,-0.63,-0.0067,-0.013,0.015,-0.0088,-0.017,-3.7e+02,-0.0013,-0.0059,8.5e-05,0.0047,-0.065,-0.13,-0.11,-0.024,0.5,-0.00039,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.015,0.009,0.041,0.041,0.04,6.6e-07,8.4e-07,4.5e-06,0.03,0.03,0.00038,0.0012,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +20990000,0.78,-0.016,9.5e-05,-0.63,-0.0051,-0.011,0.015,-0.0084,-0.018,-3.7e+02,-0.0013,-0.0059,9e-05,0.0047,-0.065,-0.13,-0.11,-0.024,0.5,-0.00038,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.015,0.0088,0.043,0.044,0.039,6.4e-07,8.3e-07,4.4e-06,0.03,0.03,0.00037,0.0012,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +21090000,0.78,-0.016,8.8e-05,-0.63,-0.0062,-0.011,0.016,-0.0094,-0.019,-3.7e+02,-0.0013,-0.0059,9.3e-05,0.0048,-0.065,-0.13,-0.11,-0.024,0.5,-0.00037,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.015,0.016,0.0088,0.047,0.048,0.039,6.4e-07,8.2e-07,4.4e-06,0.03,0.03,0.00036,0.0012,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +21190000,0.78,-0.016,8.4e-05,-0.63,-0.0063,-0.011,0.015,-0.0099,-0.019,-3.7e+02,-0.0013,-0.0059,9.4e-05,0.0047,-0.065,-0.13,-0.11,-0.024,0.5,-0.00036,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.015,0.016,0.0086,0.049,0.05,0.039,6.2e-07,8e-07,4.4e-06,0.03,0.03,0.00035,0.0012,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +21290000,0.78,-0.016,-6.5e-06,-0.63,-0.0059,-0.011,0.017,-0.0099,-0.021,-3.7e+02,-0.0013,-0.0059,0.0001,0.0049,-0.065,-0.13,-0.11,-0.024,0.5,-0.00035,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.016,0.017,0.0085,0.054,0.055,0.039,6.2e-07,8e-07,4.4e-06,0.03,0.03,0.00034,0.0012,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +21390000,0.78,-0.016,4.3e-05,-0.63,-0.0052,-0.0064,0.016,-0.0087,-0.016,-3.7e+02,-0.0013,-0.0059,0.00011,0.0048,-0.065,-0.13,-0.11,-0.024,0.5,-0.00032,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.015,0.0084,0.046,0.047,0.039,6e-07,7.7e-07,4.4e-06,0.03,0.03,0.00033,0.0012,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +21490000,0.78,-0.016,3.3e-05,-0.63,-0.0059,-0.0073,0.016,-0.0098,-0.017,-3.7e+02,-0.0013,-0.0059,0.00011,0.0049,-0.065,-0.13,-0.11,-0.024,0.5,-0.00032,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.015,0.016,0.0083,0.05,0.052,0.038,5.9e-07,7.6e-07,4.4e-06,0.03,0.03,0.00033,0.0012,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +21590000,0.78,-0.016,7.2e-05,-0.63,-0.0045,-0.0056,0.016,-0.0082,-0.013,-3.7e+02,-0.0013,-0.0059,0.00012,0.0048,-0.065,-0.13,-0.11,-0.024,0.5,-0.00029,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.015,0.0081,0.044,0.045,0.038,5.8e-07,7.4e-07,4.3e-06,0.03,0.03,0.00032,0.0012,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +21690000,0.78,-0.016,6.5e-05,-0.63,-0.0061,-0.0065,0.017,-0.0095,-0.015,-3.7e+02,-0.0013,-0.0059,0.00012,0.0048,-0.066,-0.13,-0.11,-0.024,0.5,-0.00028,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.016,0.0081,0.048,0.049,0.038,5.7e-07,7.4e-07,4.3e-06,0.03,0.03,0.00031,0.0012,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +21790000,0.78,-0.016,0.00016,-0.63,-0.0051,-0.0043,0.016,-0.0083,-0.0092,-3.7e+02,-0.0013,-0.0059,0.00013,0.0047,-0.065,-0.13,-0.11,-0.024,0.5,-0.00024,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.013,0.014,0.008,0.042,0.043,0.038,5.6e-07,7.1e-07,4.3e-06,0.03,0.03,0.00031,0.0012,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +21890000,0.78,-0.015,0.00016,-0.63,-0.0058,-0.005,0.016,-0.009,-0.0097,-3.7e+02,-0.0013,-0.0059,0.00013,0.0047,-0.065,-0.13,-0.11,-0.024,0.5,-0.00024,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.015,0.0079,0.046,0.047,0.038,5.5e-07,7.1e-07,4.3e-06,0.03,0.03,0.0003,0.0012,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +21990000,0.78,-0.015,0.00019,-0.63,-0.0057,-0.0022,0.017,-0.0084,-0.0057,-3.7e+02,-0.0013,-0.0059,0.00014,0.0046,-0.065,-0.13,-0.11,-0.024,0.5,-0.00021,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.013,0.014,0.0078,0.041,0.042,0.038,5.4e-07,6.9e-07,4.3e-06,0.03,0.03,0.00029,0.0011,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +22090000,0.78,-0.015,0.00018,-0.63,-0.0054,-0.0037,0.015,-0.0088,-0.006,-3.7e+02,-0.0013,-0.0059,0.00014,0.0046,-0.065,-0.13,-0.11,-0.024,0.5,-0.00021,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.015,0.0078,0.045,0.046,0.037,5.4e-07,6.9e-07,4.2e-06,0.03,0.03,0.00029,0.0011,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +22190000,0.78,-0.015,0.00019,-0.63,-0.004,-0.0043,0.016,-0.0073,-0.0054,-3.7e+02,-0.0013,-0.0059,0.00015,0.0046,-0.065,-0.13,-0.11,-0.024,0.5,-0.0002,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.013,0.014,0.0076,0.04,0.041,0.037,5.2e-07,6.7e-07,4.2e-06,0.03,0.03,0.00028,0.0011,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +22290000,0.78,-0.015,0.00016,-0.63,-0.0036,-0.0039,0.016,-0.008,-0.0057,-3.7e+02,-0.0013,-0.0059,0.00015,0.0046,-0.065,-0.13,-0.11,-0.024,0.5,-0.00019,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.013,0.015,0.0076,0.043,0.045,0.037,5.2e-07,6.6e-07,4.2e-06,0.03,0.03,0.00028,0.0011,5.8e-05,0.0012,0.00065,0.0012,0.0012,1,1 +22390000,0.78,-0.015,0.00015,-0.63,-0.0011,-0.0039,0.017,-0.0062,-0.0051,-3.7e+02,-0.0014,-0.0059,0.00015,0.0046,-0.065,-0.13,-0.11,-0.024,0.5,-0.00019,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.012,0.014,0.0075,0.039,0.04,0.037,5.1e-07,6.5e-07,4.2e-06,0.03,0.03,0.00027,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 +22490000,0.78,-0.015,0.00013,-0.63,7e-05,-0.0045,0.018,-0.0056,-0.0054,-3.7e+02,-0.0014,-0.0059,0.00015,0.0046,-0.065,-0.13,-0.11,-0.024,0.5,-0.0002,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.013,0.015,0.0074,0.042,0.044,0.037,5e-07,6.4e-07,4.2e-06,0.03,0.03,0.00027,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 +22590000,0.78,-0.015,0.00013,-0.63,0.0019,-0.0034,0.018,-0.0039,-0.0047,-3.7e+02,-0.0014,-0.0059,0.00016,0.0046,-0.065,-0.13,-0.11,-0.024,0.5,-0.00019,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.013,0.015,0.0073,0.045,0.046,0.036,4.9e-07,6.3e-07,4.1e-06,0.03,0.03,0.00026,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 +22690000,0.78,-0.015,6.1e-05,-0.63,0.0035,-0.0046,0.019,-0.0032,-0.0056,-3.7e+02,-0.0014,-0.0059,0.00016,0.0047,-0.065,-0.13,-0.11,-0.024,0.5,-0.00019,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.016,0.0073,0.048,0.05,0.036,4.9e-07,6.3e-07,4.1e-06,0.03,0.03,0.00026,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 +22790000,0.78,-0.015,0.0001,-0.63,0.0045,-0.004,0.02,-0.0026,-0.0042,-3.7e+02,-0.0014,-0.0059,0.00015,0.0045,-0.065,-0.13,-0.11,-0.024,0.5,-0.0002,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.014,0.016,0.0072,0.051,0.052,0.036,4.8e-07,6.2e-07,4.1e-06,0.03,0.03,0.00025,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 +22890000,0.78,-0.015,0.00011,-0.63,0.0052,-0.0049,0.021,-0.0028,-0.0048,-3.7e+02,-0.0014,-0.0059,0.00015,0.0045,-0.065,-0.13,-0.11,-0.024,0.5,-0.00019,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.015,0.017,0.0072,0.055,0.057,0.036,4.8e-07,6.2e-07,4.1e-06,0.03,0.03,0.00025,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 +22990000,0.78,-0.015,0.00012,-0.63,0.0049,-0.0049,0.022,-0.0029,-0.0055,-3.7e+02,-0.0014,-0.0059,0.00016,0.0046,-0.065,-0.13,-0.11,-0.024,0.5,-0.00018,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.015,0.017,0.0071,0.058,0.06,0.036,4.7e-07,6e-07,4.1e-06,0.03,0.03,0.00025,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 +23090000,0.78,-0.015,0.00018,-0.63,0.0051,-0.0046,0.023,-0.0027,-0.0052,-3.7e+02,-0.0014,-0.0059,0.00015,0.0045,-0.065,-0.13,-0.11,-0.024,0.5,-0.00018,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.016,0.018,0.007,0.062,0.065,0.036,4.7e-07,6e-07,4.1e-06,0.03,0.03,0.00024,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 +23190000,0.78,-0.015,0.00017,-0.63,0.0027,-0.0034,0.024,-0.0055,-0.005,-3.7e+02,-0.0014,-0.0059,0.00016,0.0045,-0.065,-0.13,-0.11,-0.024,0.5,-0.00015,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.016,0.017,0.0069,0.065,0.067,0.035,4.6e-07,5.9e-07,4e-06,0.03,0.03,0.00024,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 +23290000,0.78,-0.015,0.00023,-0.63,0.0023,-0.0031,0.025,-0.0058,-0.0057,-3.7e+02,-0.0014,-0.0059,0.00016,0.0045,-0.065,-0.13,-0.11,-0.024,0.5,-0.00015,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.017,0.019,0.0069,0.07,0.073,0.036,4.6e-07,5.9e-07,4e-06,0.03,0.03,0.00023,0.0011,5.8e-05,0.0012,0.00064,0.0012,0.0012,1,1 +23390000,0.78,-0.015,0.00021,-0.63,-0.0011,-0.0028,0.022,-0.01,-0.0058,-3.7e+02,-0.0014,-0.0059,0.00016,0.0045,-0.065,-0.13,-0.11,-0.024,0.5,-0.00013,-0.091,-0.068,0,0,0.00036,0.00038,0.046,0.016,0.018,0.0068,0.072,0.075,0.035,4.5e-07,5.7e-07,4e-06,0.03,0.03,0.00023,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 +23490000,0.78,-0.013,-0.0019,-0.63,0.0044,-0.0021,-0.011,-0.011,-0.007,-3.7e+02,-0.0013,-0.0059,0.00017,0.0045,-0.065,-0.13,-0.11,-0.024,0.5,-0.00014,-0.091,-0.068,0,0,0.00036,0.00036,0.046,0.017,0.019,0.0068,0.078,0.081,0.035,4.5e-07,5.7e-07,4e-06,0.03,0.03,0.00023,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 +23590000,0.78,-0.0042,-0.0062,-0.63,0.015,0.0017,-0.043,-0.0099,-0.0038,-3.7e+02,-0.0013,-0.0059,0.00017,0.0045,-0.066,-0.13,-0.11,-0.024,0.5,-0.00012,-0.091,-0.068,0,0,0.00035,0.00034,0.046,0.014,0.016,0.0067,0.062,0.064,0.035,4.3e-07,5.5e-07,3.9e-06,0.03,0.03,0.00022,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 +23690000,0.78,0.0014,-0.0052,-0.63,0.042,0.016,-0.093,-0.0075,-0.0033,-3.7e+02,-0.0013,-0.0059,0.00018,0.0046,-0.066,-0.13,-0.11,-0.024,0.5,-0.00019,-0.091,-0.068,0,0,0.00034,0.00034,0.046,0.015,0.017,0.0067,0.067,0.069,0.035,4.3e-07,5.5e-07,3.9e-06,0.03,0.03,0.00022,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 +23790000,0.78,-0.0022,-0.0027,-0.63,0.063,0.033,-0.15,-0.0074,-0.0017,-3.7e+02,-0.0013,-0.0059,0.00018,0.0049,-0.066,-0.13,-0.11,-0.024,0.5,-0.00028,-0.09,-0.067,0,0,0.00034,0.00034,0.046,0.014,0.015,0.0066,0.055,0.056,0.035,4.2e-07,5.3e-07,3.9e-06,0.03,0.03,0.00022,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 +23890000,0.78,-0.0085,-0.0007,-0.63,0.077,0.045,-0.2,2.8e-05,0.0023,-3.7e+02,-0.0013,-0.0059,0.00019,0.005,-0.066,-0.13,-0.11,-0.024,0.5,-0.00033,-0.09,-0.067,0,0,0.00034,0.00035,0.046,0.014,0.016,0.0066,0.059,0.061,0.035,4.2e-07,5.3e-07,3.9e-06,0.03,0.03,0.00021,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 +23990000,0.78,-0.013,0.00021,-0.63,0.072,0.045,-0.25,-0.0055,0.00083,-3.7e+02,-0.0013,-0.0059,0.00018,0.0052,-0.067,-0.13,-0.11,-0.024,0.5,-0.00029,-0.09,-0.067,0,0,0.00035,0.00037,0.046,0.015,0.016,0.0066,0.062,0.063,0.035,4.1e-07,5.2e-07,3.9e-06,0.03,0.03,0.00021,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 +24090000,0.78,-0.012,-0.00093,-0.63,0.072,0.044,-0.3,0.00081,0.0045,-3.7e+02,-0.0013,-0.0059,0.00019,0.0053,-0.067,-0.13,-0.11,-0.024,0.5,-0.00034,-0.09,-0.067,0,0,0.00035,0.00036,0.046,0.015,0.017,0.0065,0.066,0.069,0.035,4.1e-07,5.2e-07,3.8e-06,0.03,0.03,0.00021,0.0011,5.7e-05,0.0012,0.00064,0.0012,0.0012,1,1 +24190000,0.78,-0.0097,-0.0017,-0.63,0.069,0.043,-0.35,-0.0065,0.0022,-3.7e+02,-0.0013,-0.0059,0.00018,0.0056,-0.068,-0.13,-0.11,-0.024,0.5,-0.00031,-0.09,-0.067,0,0,0.00035,0.00035,0.046,0.015,0.017,0.0065,0.069,0.071,0.034,4.1e-07,5.1e-07,3.8e-06,0.03,0.03,0.00021,0.0011,5.6e-05,0.0012,0.00063,0.0012,0.0012,1,1 +24290000,0.78,-0.0089,-0.0021,-0.63,0.077,0.048,-0.4,-0.00011,0.0069,-3.7e+02,-0.0013,-0.0059,0.00018,0.0056,-0.068,-0.13,-0.11,-0.024,0.5,-0.00033,-0.09,-0.067,0,0,0.00035,0.00035,0.046,0.016,0.018,0.0065,0.074,0.077,0.034,4e-07,5.1e-07,3.8e-06,0.03,0.03,0.0002,0.0011,5.6e-05,0.0012,0.00063,0.0012,0.0012,1,1 +24390000,0.78,-0.0093,-0.0022,-0.63,0.074,0.047,-0.46,-0.013,0.00027,-3.7e+02,-0.0012,-0.0059,0.00015,0.0062,-0.069,-0.13,-0.11,-0.024,0.5,-0.0003,-0.089,-0.068,0,0,0.00035,0.00035,0.046,0.016,0.018,0.0064,0.076,0.079,0.034,4e-07,5e-07,3.8e-06,0.03,0.03,0.0002,0.0011,5.6e-05,0.0012,0.00063,0.0012,0.0012,1,1 +24490000,0.78,-0.0051,-0.0026,-0.63,0.085,0.054,-0.51,-0.0046,0.0052,-3.7e+02,-0.0012,-0.0059,0.00015,0.0063,-0.069,-0.13,-0.11,-0.024,0.5,-0.00033,-0.089,-0.068,0,0,0.00034,0.00034,0.046,0.017,0.02,0.0064,0.082,0.085,0.034,4e-07,5e-07,3.8e-06,0.03,0.03,0.0002,0.0011,5.6e-05,0.0012,0.00063,0.0012,0.0012,1,1 +24590000,0.78,-0.0016,-0.0027,-0.63,0.089,0.057,-0.56,-0.018,-0.0039,-3.7e+02,-0.0012,-0.0059,0.00014,0.0069,-0.071,-0.13,-0.11,-0.024,0.5,-0.00037,-0.089,-0.068,0,0,0.00034,0.00034,0.046,0.017,0.019,0.0063,0.084,0.088,0.034,3.9e-07,4.9e-07,3.7e-06,0.03,0.03,0.0002,0.0011,5.6e-05,0.0012,0.00063,0.0012,0.0012,1,1 +24690000,0.78,-0.00074,-0.0027,-0.63,0.11,0.073,-0.64,-0.0089,0.0014,-3.7e+02,-0.0012,-0.0059,0.00015,0.0072,-0.071,-0.13,-0.11,-0.024,0.5,-0.00055,-0.089,-0.068,0,0,0.00034,0.00034,0.045,0.018,0.021,0.0063,0.09,0.094,0.034,3.9e-07,4.9e-07,3.7e-06,0.03,0.03,0.00019,0.0011,5.6e-05,0.0012,0.00063,0.0012,0.0012,1,1 +24790000,0.78,-0.0023,-0.0024,-0.63,0.11,0.082,-0.73,-0.028,-0.0034,-3.7e+02,-0.0012,-0.0059,0.00013,0.0079,-0.073,-0.13,-0.11,-0.025,0.5,-0.00036,-0.088,-0.068,0,0,0.00034,0.00034,0.045,0.018,0.021,0.0062,0.093,0.096,0.034,3.8e-07,4.8e-07,3.7e-06,0.03,0.03,0.00019,0.0011,5.6e-05,0.0012,0.00062,0.0012,0.0012,1,1 +24890000,0.78,-0.00046,-0.004,-0.63,0.13,0.097,-0.75,-0.017,0.0055,-3.7e+02,-0.0012,-0.0059,0.00012,0.0081,-0.074,-0.13,-0.11,-0.025,0.5,-0.00045,-0.088,-0.068,0,0,0.00034,0.00034,0.045,0.019,0.022,0.0062,0.099,0.1,0.034,3.8e-07,4.8e-07,3.7e-06,0.03,0.03,0.00019,0.0011,5.5e-05,0.0012,0.00062,0.0012,0.0012,1,1 +24990000,0.78,0.0012,-0.0055,-0.63,0.13,0.1,-0.81,-0.039,-0.001,-3.7e+02,-0.0011,-0.0059,9e-05,0.0092,-0.076,-0.13,-0.11,-0.025,0.5,-0.00024,-0.087,-0.069,0,0,0.00034,0.00034,0.045,0.019,0.022,0.0062,0.1,0.11,0.034,3.8e-07,4.7e-07,3.7e-06,0.03,0.03,0.00019,0.0011,5.5e-05,0.0012,0.00061,0.0012,0.0012,1,1 +25090000,0.78,0.00063,-0.0059,-0.63,0.16,0.12,-0.86,-0.025,0.011,-3.7e+02,-0.0011,-0.0059,8.4e-05,0.0094,-0.076,-0.13,-0.11,-0.025,0.5,-0.00025,-0.087,-0.068,0,0,0.00034,0.00034,0.044,0.02,0.023,0.0062,0.11,0.11,0.034,3.8e-07,4.7e-07,3.7e-06,0.03,0.03,0.00019,0.0011,5.5e-05,0.0012,0.00061,0.0011,0.0012,1,1 +25190000,0.78,-0.0015,-0.0054,-0.62,0.15,0.11,-0.91,-0.069,-0.012,-3.7e+02,-0.0011,-0.0059,4.4e-05,0.011,-0.081,-0.13,-0.11,-0.025,0.5,-0.00022,-0.086,-0.069,0,0,0.00034,0.00033,0.044,0.02,0.023,0.0061,0.11,0.11,0.033,3.7e-07,4.6e-07,3.6e-06,0.03,0.03,0.00018,0.0011,5.5e-05,0.0012,0.0006,0.0011,0.0012,1,1 +25290000,0.78,0.0055,-0.0066,-0.62,0.17,0.13,-0.96,-0.053,-0.00075,-3.7e+02,-0.0011,-0.0059,4.8e-05,0.011,-0.081,-0.13,-0.11,-0.025,0.5,-0.00034,-0.086,-0.069,0,0,0.00033,0.00034,0.044,0.021,0.024,0.0061,0.12,0.12,0.033,3.7e-07,4.6e-07,3.6e-06,0.03,0.03,0.00018,0.0011,5.4e-05,0.0012,0.0006,0.0011,0.0012,1,1 +25390000,0.78,0.011,-0.0071,-0.62,0.18,0.13,-1,-0.1,-0.025,-3.7e+02,-0.001,-0.0058,8.1e-06,0.014,-0.086,-0.13,-0.11,-0.025,0.5,-0.00037,-0.085,-0.069,0,0,0.00033,0.00036,0.043,0.021,0.024,0.0061,0.12,0.12,0.033,3.6e-07,4.5e-07,3.6e-06,0.03,0.03,0.00018,0.0011,5.4e-05,0.0012,0.00059,0.0011,0.0012,1,1 +25490000,0.78,0.013,-0.0072,-0.63,0.22,0.16,-1.1,-0.082,-0.012,-3.7e+02,-0.001,-0.0058,2.3e-05,0.014,-0.087,-0.13,-0.11,-0.025,0.5,-0.00072,-0.084,-0.069,0,0,0.00033,0.00036,0.042,0.022,0.026,0.0061,0.13,0.13,0.033,3.6e-07,4.5e-07,3.6e-06,0.03,0.03,0.00018,0.0011,5.3e-05,0.0012,0.00058,0.0011,0.0012,1,1 +25590000,0.78,0.011,-0.007,-0.63,0.25,0.19,-1.1,-0.059,0.0041,-3.7e+02,-0.001,-0.0058,3.2e-05,0.014,-0.087,-0.13,-0.12,-0.025,0.5,-0.00098,-0.084,-0.068,0,0,0.00033,0.00035,0.042,0.024,0.028,0.0061,0.14,0.14,0.033,3.6e-07,4.5e-07,3.6e-06,0.03,0.03,0.00018,0.0011,5.3e-05,0.0011,0.00058,0.0011,0.0011,1,1 +25690000,0.78,0.018,-0.0099,-0.63,0.29,0.21,-1.2,-0.032,0.022,-3.7e+02,-0.001,-0.0058,4.3e-05,0.015,-0.088,-0.13,-0.12,-0.026,0.5,-0.0013,-0.082,-0.068,0,0,0.00034,0.00039,0.042,0.025,0.03,0.0061,0.14,0.15,0.033,3.6e-07,4.5e-07,3.6e-06,0.03,0.03,0.00017,0.001,5.2e-05,0.0011,0.00057,0.0011,0.0011,1,1 +25790000,0.78,0.024,-0.012,-0.63,0.35,0.25,-1.2,-0.00023,0.043,-3.7e+02,-0.00099,-0.0058,6.3e-05,0.015,-0.088,-0.13,-0.12,-0.026,0.5,-0.0019,-0.081,-0.067,0,0,0.00034,0.00043,0.041,0.027,0.033,0.0061,0.15,0.16,0.033,3.6e-07,4.5e-07,3.5e-06,0.03,0.03,0.00017,0.001,5.1e-05,0.0011,0.00057,0.0011,0.0011,1,1 +25890000,0.77,0.025,-0.012,-0.63,0.41,0.28,-1.3,0.039,0.066,-3.7e+02,-0.00099,-0.0058,8.6e-05,0.015,-0.089,-0.13,-0.12,-0.026,0.5,-0.0025,-0.079,-0.066,0,0,0.00034,0.00043,0.04,0.029,0.037,0.0061,0.17,0.17,0.033,3.6e-07,4.5e-07,3.5e-06,0.03,0.03,0.00017,0.001,5e-05,0.0011,0.00056,0.0011,0.0011,1,1 +25990000,0.77,0.021,-0.012,-0.63,0.47,0.31,-1.3,0.083,0.093,-3.7e+02,-0.00099,-0.0058,9.9e-05,0.015,-0.089,-0.13,-0.12,-0.027,0.5,-0.0029,-0.078,-0.065,0,0,0.00034,0.00041,0.04,0.032,0.04,0.0061,0.18,0.19,0.033,3.6e-07,4.5e-07,3.5e-06,0.03,0.03,0.00017,0.00099,5e-05,0.0011,0.00055,0.001,0.0011,1,1 +26090000,0.78,0.032,-0.016,-0.63,0.52,0.35,-1.3,0.13,0.13,-3.7e+02,-0.00098,-0.0058,8.8e-05,0.016,-0.089,-0.13,-0.12,-0.027,0.5,-0.0028,-0.077,-0.065,0,0,0.00035,0.00049,0.039,0.034,0.043,0.0061,0.19,0.2,0.033,3.6e-07,4.5e-07,3.5e-06,0.03,0.03,0.00017,0.00097,4.8e-05,0.0011,0.00054,0.001,0.0011,1,1 +26190000,0.78,0.041,-0.017,-0.63,0.6,0.4,-1.3,0.19,0.16,-3.7e+02,-0.00098,-0.0058,9.6e-05,0.018,-0.09,-0.13,-0.13,-0.028,0.5,-0.0035,-0.074,-0.063,0,0,0.00036,0.00058,0.037,0.036,0.047,0.0061,0.2,0.22,0.033,3.6e-07,4.5e-07,3.5e-06,0.03,0.03,0.00017,0.00093,4.7e-05,0.001,0.00053,0.00098,0.001,1,1 +26290000,0.78,0.044,-0.018,-0.63,0.68,0.45,-1.3,0.25,0.2,-3.7e+02,-0.00097,-0.0058,9.2e-05,0.019,-0.091,-0.13,-0.13,-0.028,0.49,-0.0037,-0.071,-0.061,0,0,0.00036,0.0006,0.036,0.039,0.052,0.0061,0.21,0.23,0.033,3.6e-07,4.5e-07,3.5e-06,0.03,0.03,0.00017,0.00091,4.6e-05,0.001,0.00052,0.00094,0.001,1,1 +26390000,0.77,0.04,-0.018,-0.63,0.76,0.5,-1.3,0.32,0.25,-3.7e+02,-0.00097,-0.0058,0.0001,0.02,-0.091,-0.13,-0.13,-0.028,0.49,-0.0042,-0.069,-0.06,0,0,0.00036,0.00055,0.034,0.042,0.056,0.0061,0.23,0.25,0.033,3.6e-07,4.5e-07,3.4e-06,0.03,0.03,0.00016,0.00088,4.4e-05,0.00098,0.0005,0.00091,0.00097,1,1 +26490000,0.77,0.056,-0.024,-0.63,0.84,0.55,-1.3,0.4,0.3,-3.7e+02,-0.00096,-0.0058,0.0001,0.02,-0.092,-0.13,-0.13,-0.029,0.49,-0.0043,-0.067,-0.058,0,0,0.00038,0.00075,0.033,0.044,0.061,0.0061,0.24,0.27,0.033,3.6e-07,4.5e-07,3.4e-06,0.03,0.03,0.00016,0.00084,4.2e-05,0.00094,0.00048,0.00088,0.00094,1,1 +26590000,0.77,0.073,-0.029,-0.63,0.95,0.63,-1.3,0.48,0.36,-3.7e+02,-0.00096,-0.0058,7.4e-05,0.023,-0.092,-0.13,-0.13,-0.03,0.49,-0.0039,-0.064,-0.057,0,0,0.00041,0.00098,0.031,0.048,0.067,0.0061,0.26,0.29,0.033,3.6e-07,4.5e-07,3.4e-06,0.03,0.03,0.00016,0.0008,4e-05,0.00089,0.00046,0.00083,0.00089,1,1 +26690000,0.77,0.076,-0.03,-0.64,1.1,0.71,-1.3,0.59,0.42,-3.7e+02,-0.00096,-0.0058,8.5e-05,0.024,-0.093,-0.13,-0.14,-0.031,0.49,-0.0049,-0.059,-0.052,0,0,0.00041,0.00097,0.028,0.052,0.073,0.0061,0.28,0.31,0.033,3.6e-07,4.5e-07,3.4e-06,0.03,0.03,0.00016,0.00074,3.8e-05,0.00083,0.00044,0.00077,0.00083,1,1 +26790000,0.77,0.07,-0.029,-0.64,1.2,0.79,-1.3,0.7,0.5,-3.7e+02,-0.00095,-0.0058,6.9e-05,0.025,-0.093,-0.13,-0.14,-0.032,0.48,-0.0047,-0.055,-0.049,0,0,0.00039,0.00084,0.026,0.055,0.079,0.0061,0.3,0.33,0.033,3.7e-07,4.5e-07,3.4e-06,0.03,0.03,0.00016,0.0007,3.6e-05,0.00079,0.00041,0.00073,0.00078,1,1 +26890000,0.76,0.093,-0.036,-0.64,1.3,0.86,-1.3,0.83,0.58,-3.7e+02,-0.00095,-0.0058,7.2e-05,0.026,-0.093,-0.13,-0.15,-0.032,0.48,-0.0052,-0.052,-0.047,0,0,0.00044,0.0011,0.024,0.058,0.085,0.0061,0.32,0.35,0.033,3.7e-07,4.6e-07,3.3e-06,0.03,0.03,0.00016,0.00066,3.4e-05,0.00074,0.00039,0.00068,0.00074,1,1 +26990000,0.76,0.12,-0.041,-0.64,1.5,0.97,-1.3,0.98,0.67,-3.7e+02,-0.00095,-0.0058,6.1e-05,0.029,-0.094,-0.13,-0.15,-0.034,0.48,-0.0055,-0.046,-0.043,0,0,0.00049,0.0014,0.021,0.061,0.091,0.0061,0.34,0.37,0.033,3.7e-07,4.6e-07,3.3e-06,0.03,0.03,0.00016,0.0006,3.1e-05,0.00067,0.00036,0.00062,0.00067,1,1 +27090000,0.76,0.12,-0.041,-0.64,1.7,1.1,-1.2,1.1,0.78,-3.7e+02,-0.00095,-0.0058,4.5e-05,0.03,-0.093,-0.13,-0.16,-0.035,0.47,-0.0055,-0.041,-0.038,0,0,0.00049,0.0013,0.018,0.065,0.098,0.0061,0.36,0.4,0.033,3.7e-07,4.6e-07,3.3e-06,0.03,0.03,0.00016,0.00055,2.8e-05,0.0006,0.00033,0.00056,0.0006,1,1 +27190000,0.76,0.11,-0.039,-0.64,1.9,1.2,-1.2,1.3,0.9,-3.7e+02,-0.00096,-0.0058,2.8e-05,0.032,-0.092,-0.13,-0.16,-0.035,0.47,-0.0053,-0.038,-0.035,0,0,0.00045,0.0011,0.017,0.068,0.1,0.0062,0.38,0.43,0.034,3.7e-07,4.6e-07,3.3e-06,0.03,0.03,0.00015,0.00051,2.6e-05,0.00056,0.00031,0.00052,0.00056,1,1 +27290000,0.76,0.093,-0.035,-0.64,2,1.3,-1.2,1.5,1,-3.7e+02,-0.00096,-0.0058,2.2e-05,0.032,-0.091,-0.13,-0.16,-0.036,0.47,-0.0054,-0.035,-0.033,0,0,0.00041,0.00083,0.015,0.07,0.11,0.0062,0.4,0.46,0.033,3.7e-07,4.6e-07,3.3e-06,0.03,0.03,0.00015,0.00048,2.5e-05,0.00053,0.00029,0.00049,0.00052,1,1 +27390000,0.76,0.077,-0.03,-0.64,2.1,1.4,-1.2,1.7,1.2,-3.7e+02,-0.00095,-0.0058,1.7e-05,0.033,-0.089,-0.13,-0.17,-0.036,0.47,-0.0054,-0.033,-0.032,0,0,0.00038,0.00064,0.014,0.071,0.11,0.0062,0.43,0.49,0.033,3.7e-07,4.6e-07,3.3e-06,0.029,0.03,0.00015,0.00046,2.4e-05,0.00051,0.00027,0.00047,0.00051,1,1 +27490000,0.76,0.061,-0.025,-0.64,2.2,1.4,-1.2,1.9,1.3,-3.7e+02,-0.00095,-0.0058,9e-06,0.033,-0.087,-0.13,-0.17,-0.037,0.47,-0.0052,-0.032,-0.032,0,0,0.00036,0.00052,0.012,0.072,0.11,0.0062,0.46,0.52,0.033,3.7e-07,4.6e-07,3.3e-06,0.029,0.03,0.00015,0.00044,2.3e-05,0.0005,0.00025,0.00046,0.0005,1,1 +27590000,0.77,0.049,-0.022,-0.64,2.3,1.5,-1.2,2.2,1.5,-3.7e+02,-0.00095,-0.0058,-8.8e-07,0.034,-0.084,-0.13,-0.17,-0.037,0.47,-0.0048,-0.031,-0.031,0,0,0.00035,0.00045,0.012,0.073,0.11,0.0062,0.48,0.55,0.033,3.7e-07,4.6e-07,3.3e-06,0.029,0.03,0.00015,0.00043,2.3e-05,0.00049,0.00024,0.00045,0.00049,1,1 +27690000,0.77,0.047,-0.021,-0.64,2.3,1.5,-1.2,2.4,1.6,-3.7e+02,-0.00095,-0.0058,-9.9e-06,0.034,-0.083,-0.13,-0.17,-0.037,0.47,-0.0044,-0.031,-0.031,0,0,0.00035,0.00044,0.011,0.073,0.11,0.0063,0.51,0.59,0.033,3.7e-07,4.6e-07,3.3e-06,0.029,0.03,0.00015,0.00043,2.2e-05,0.00049,0.00023,0.00045,0.00049,1,1 +27790000,0.77,0.049,-0.021,-0.64,2.3,1.5,-1.2,2.6,1.8,-3.7e+02,-0.00095,-0.0058,-2.3e-05,0.035,-0.081,-0.13,-0.17,-0.037,0.47,-0.0039,-0.03,-0.031,0,0,0.00035,0.00044,0.0098,0.074,0.1,0.0063,0.54,0.62,0.033,3.7e-07,4.6e-07,3.3e-06,0.029,0.03,0.00015,0.00042,2.2e-05,0.00049,0.00022,0.00044,0.00048,1,1 +27890000,0.77,0.047,-0.021,-0.64,2.4,1.6,-1.2,2.8,1.9,-3.7e+02,-0.00095,-0.0058,-2.4e-05,0.034,-0.079,-0.13,-0.17,-0.037,0.47,-0.0039,-0.03,-0.03,0,0,0.00035,0.00043,0.0093,0.075,0.1,0.0063,0.58,0.66,0.034,3.7e-07,4.6e-07,3.3e-06,0.029,0.03,0.00015,0.00041,2.2e-05,0.00048,0.00022,0.00044,0.00048,1,1 +27990000,0.77,0.043,-0.02,-0.64,2.4,1.6,-1.2,3.1,2.1,-3.7e+02,-0.00095,-0.0058,-2.7e-05,0.034,-0.078,-0.13,-0.17,-0.037,0.47,-0.0039,-0.03,-0.03,0,0,0.00035,0.00041,0.0087,0.076,0.1,0.0064,0.61,0.7,0.033,3.7e-07,4.7e-07,3.3e-06,0.029,0.03,0.00014,0.00041,2.1e-05,0.00048,0.00021,0.00043,0.00048,1,1 +28090000,0.77,0.057,-0.025,-0.64,2.4,1.6,-1.2,3.3,2.3,-3.7e+02,-0.00095,-0.0058,-3.8e-05,0.035,-0.076,-0.13,-0.17,-0.038,0.47,-0.0035,-0.029,-0.03,0,0,0.00035,0.00045,0.0081,0.077,0.1,0.0064,0.65,0.74,0.033,3.7e-07,4.7e-07,3.3e-06,0.029,0.03,0.00014,0.0004,2.1e-05,0.00048,0.00021,0.00042,0.00048,1,1 +28190000,0.77,0.071,-0.028,-0.63,2.5,1.6,-0.93,3.6,2.4,-3.7e+02,-0.00095,-0.0058,-4e-05,0.035,-0.074,-0.13,-0.17,-0.038,0.46,-0.0035,-0.029,-0.03,0,0,0.00036,0.00049,0.0077,0.078,0.1,0.0065,0.68,0.79,0.034,3.7e-07,4.7e-07,3.3e-06,0.029,0.03,0.00014,0.00039,2.1e-05,0.00047,0.0002,0.00042,0.00047,1,1 +28290000,0.77,0.053,-0.022,-0.64,2.5,1.7,-0.065,3.8,2.6,-3.7e+02,-0.00095,-0.0058,-4.9e-05,0.035,-0.071,-0.13,-0.17,-0.038,0.46,-0.0033,-0.028,-0.029,0,0,0.00035,0.00043,0.0074,0.077,0.1,0.0066,0.72,0.83,0.034,3.7e-07,4.7e-07,3.3e-06,0.029,0.03,0.00014,0.00038,2e-05,0.00046,0.0002,0.00041,0.00046,1,1 +28390000,0.77,0.02,-0.0094,-0.64,2.5,1.7,0.79,4,2.8,-3.7e+02,-0.00095,-0.0058,-5.7e-05,0.035,-0.068,-0.13,-0.17,-0.038,0.46,-0.0031,-0.027,-0.029,0,0,0.00035,0.00037,0.0071,0.076,0.1,0.0066,0.76,0.88,0.034,3.7e-07,4.7e-07,3.3e-06,0.029,0.03,0.00014,0.00038,2e-05,0.00046,0.00019,0.00041,0.00046,1,1 +28490000,0.77,0.0014,-0.0026,-0.64,2.4,1.7,1.1,4.3,3,-3.7e+02,-0.00096,-0.0058,-6.3e-05,0.035,-0.065,-0.13,-0.17,-0.038,0.46,-0.0031,-0.027,-0.029,0,0,0.00034,0.00036,0.0068,0.077,0.099,0.0067,0.8,0.93,0.034,3.7e-07,4.7e-07,3.3e-06,0.029,0.03,0.00014,0.00038,2e-05,0.00046,0.00019,0.00041,0.00046,1,1 +28590000,0.77,-0.0022,-0.0011,-0.64,2.4,1.6,0.99,4.5,3.1,-3.7e+02,-0.00096,-0.0058,-6.4e-05,0.034,-0.064,-0.12,-0.17,-0.038,0.46,-0.0031,-0.027,-0.029,0,0,0.00034,0.00036,0.0065,0.077,0.098,0.0067,0.84,0.98,0.034,3.7e-07,4.7e-07,3.3e-06,0.029,0.029,0.00014,0.00038,2e-05,0.00046,0.00019,0.00041,0.00046,1,1 +28690000,0.77,-0.0032,-0.00057,-0.64,2.3,1.6,0.99,4.8,3.3,-3.7e+02,-0.00097,-0.0058,-7.1e-05,0.034,-0.064,-0.12,-0.17,-0.038,0.46,-0.003,-0.027,-0.029,0,0,0.00034,0.00036,0.0063,0.078,0.098,0.0067,0.88,1,0.034,3.6e-07,4.7e-07,3.3e-06,0.029,0.029,0.00014,0.00038,2e-05,0.00046,0.00018,0.0004,0.00046,1,1 +28790000,0.77,-0.0034,-0.00035,-0.63,2.2,1.6,1,5,3.4,-3.7e+02,-0.00098,-0.0058,-7.9e-05,0.034,-0.061,-0.12,-0.17,-0.038,0.46,-0.0029,-0.027,-0.029,0,0,0.00034,0.00037,0.0061,0.079,0.098,0.0068,0.92,1.1,0.034,3.6e-07,4.7e-07,3.3e-06,0.029,0.029,0.00014,0.00038,2e-05,0.00045,0.00018,0.0004,0.00045,1,1 +28890000,0.77,-0.0032,-0.00036,-0.63,2.2,1.5,0.99,5.2,3.6,-3.7e+02,-0.00099,-0.0058,-8.6e-05,0.033,-0.06,-0.12,-0.17,-0.038,0.46,-0.0028,-0.027,-0.029,0,0,0.00034,0.00037,0.0059,0.08,0.1,0.0068,0.97,1.1,0.034,3.6e-07,4.7e-07,3.3e-06,0.029,0.029,0.00013,0.00038,2e-05,0.00045,0.00018,0.0004,0.00045,1,1 +28990000,0.77,-0.0027,-0.00054,-0.63,2.1,1.5,0.98,5.5,3.8,-3.7e+02,-0.001,-0.0058,-9.8e-05,0.033,-0.058,-0.12,-0.17,-0.038,0.46,-0.0026,-0.027,-0.028,0,0,0.00034,0.00037,0.0057,0.081,0.1,0.0069,1,1.2,0.034,3.6e-07,4.8e-07,3.3e-06,0.029,0.029,0.00013,0.00038,2e-05,0.00045,0.00018,0.0004,0.00045,1,1 +29090000,0.78,-0.0022,-0.0007,-0.63,2.1,1.5,0.97,5.7,3.9,-3.7e+02,-0.001,-0.0058,-0.0001,0.032,-0.056,-0.12,-0.17,-0.038,0.46,-0.0025,-0.027,-0.028,0,0,0.00034,0.00037,0.0055,0.083,0.1,0.0069,1.1,1.3,0.034,3.5e-07,4.8e-07,3.3e-06,0.029,0.029,0.00013,0.00037,2e-05,0.00045,0.00018,0.0004,0.00045,1,1 +29190000,0.77,-0.0019,-0.00078,-0.63,2,1.5,0.97,5.9,4.1,-3.7e+02,-0.001,-0.0058,-0.0001,0.032,-0.055,-0.12,-0.17,-0.038,0.46,-0.0025,-0.028,-0.028,0,0,0.00034,0.00037,0.0054,0.084,0.1,0.007,1.1,1.3,0.034,3.5e-07,4.8e-07,3.3e-06,0.029,0.028,0.00013,0.00037,2e-05,0.00045,0.00017,0.0004,0.00045,1,1 +29290000,0.78,-0.00093,-0.0011,-0.63,1.9,1.4,1,6.1,4.2,-3.7e+02,-0.001,-0.0058,-0.00011,0.031,-0.053,-0.12,-0.17,-0.038,0.46,-0.0024,-0.028,-0.028,0,0,0.00033,0.00037,0.0053,0.086,0.11,0.007,1.2,1.4,0.034,3.5e-07,4.8e-07,3.3e-06,0.029,0.028,0.00013,0.00037,2e-05,0.00045,0.00017,0.0004,0.00044,1,1 +29390000,0.78,0.00051,-0.0014,-0.63,1.9,1.4,1,6.3,4.4,-3.7e+02,-0.001,-0.0058,-0.00012,0.03,-0.051,-0.12,-0.17,-0.038,0.46,-0.0021,-0.027,-0.028,0,0,0.00033,0.00037,0.0051,0.087,0.11,0.007,1.2,1.4,0.034,3.5e-07,4.8e-07,3.3e-06,0.029,0.028,0.00013,0.00037,2e-05,0.00044,0.00017,0.0004,0.00044,1,1 +29490000,0.78,0.0017,-0.0018,-0.63,1.8,1.4,1,6.4,4.5,-3.7e+02,-0.001,-0.0058,-0.00013,0.03,-0.05,-0.12,-0.17,-0.038,0.46,-0.0021,-0.027,-0.028,0,0,0.00033,0.00037,0.005,0.089,0.11,0.0071,1.3,1.5,0.034,3.5e-07,4.8e-07,3.3e-06,0.029,0.028,0.00013,0.00037,2e-05,0.00044,0.00017,0.0004,0.00044,1,1 +29590000,0.78,0.0028,-0.002,-0.63,1.8,1.4,1,6.6,4.7,-3.7e+02,-0.001,-0.0058,-0.00013,0.028,-0.048,-0.12,-0.17,-0.038,0.46,-0.002,-0.028,-0.028,0,0,0.00033,0.00037,0.0049,0.091,0.12,0.0071,1.3,1.6,0.034,3.4e-07,4.8e-07,3.2e-06,0.029,0.028,0.00013,0.00037,2e-05,0.00044,0.00017,0.0004,0.00044,1,1 +29690000,0.78,0.0036,-0.0023,-0.63,1.8,1.4,0.99,6.8,4.8,-3.7e+02,-0.001,-0.0058,-0.00014,0.028,-0.045,-0.12,-0.17,-0.038,0.46,-0.0019,-0.028,-0.028,0,0,0.00033,0.00037,0.0049,0.093,0.12,0.0071,1.4,1.7,0.034,3.4e-07,4.8e-07,3.2e-06,0.029,0.028,0.00012,0.00037,2e-05,0.00044,0.00017,0.0004,0.00044,1,1 +29790000,0.78,0.0041,-0.0025,-0.63,1.7,1.3,0.98,7,4.9,-3.7e+02,-0.001,-0.0058,-0.00014,0.027,-0.042,-0.12,-0.17,-0.038,0.46,-0.0019,-0.028,-0.028,0,0,0.00033,0.00037,0.0048,0.095,0.12,0.0071,1.4,1.7,0.034,3.4e-07,4.8e-07,3.2e-06,0.029,0.028,0.00012,0.00037,2e-05,0.00044,0.00017,0.0004,0.00044,1,1 +29890000,0.78,0.0045,-0.0026,-0.63,1.7,1.3,0.97,7.2,5.1,-3.7e+02,-0.001,-0.0058,-0.00015,0.026,-0.038,-0.12,-0.17,-0.038,0.46,-0.0017,-0.028,-0.028,0,0,0.00033,0.00038,0.0047,0.097,0.13,0.0072,1.5,1.8,0.034,3.4e-07,4.8e-07,3.2e-06,0.029,0.027,0.00012,0.00037,1.9e-05,0.00044,0.00017,0.0004,0.00044,1,1 +29990000,0.78,0.0046,-0.0027,-0.63,1.7,1.3,0.95,7.3,5.2,-3.7e+02,-0.001,-0.0058,-0.00015,0.025,-0.035,-0.12,-0.17,-0.038,0.46,-0.0016,-0.028,-0.028,0,0,0.00033,0.00038,0.0046,0.099,0.13,0.0072,1.6,1.9,0.034,3.4e-07,4.8e-07,3.2e-06,0.029,0.027,0.00012,0.00037,1.9e-05,0.00044,0.00017,0.0004,0.00044,1,1 +30090000,0.78,0.0046,-0.0027,-0.63,1.6,1.3,0.94,7.5,5.3,-3.7e+02,-0.001,-0.0058,-0.00016,0.024,-0.033,-0.12,-0.17,-0.038,0.46,-0.0015,-0.028,-0.028,0,0,0.00032,0.00038,0.0046,0.1,0.14,0.0072,1.6,2,0.034,3.3e-07,4.9e-07,3.2e-06,0.029,0.027,0.00012,0.00037,1.9e-05,0.00044,0.00016,0.0004,0.00043,1,1 +30190000,0.78,0.0043,-0.0026,-0.63,1.6,1.3,0.93,7.7,5.5,-3.7e+02,-0.001,-0.0058,-0.00016,0.023,-0.033,-0.12,-0.17,-0.038,0.46,-0.0015,-0.028,-0.028,0,0,0.00032,0.00038,0.0045,0.1,0.14,0.0072,1.7,2.1,0.035,3.3e-07,4.9e-07,3.2e-06,0.029,0.027,0.00012,0.00037,1.9e-05,0.00044,0.00016,0.0004,0.00043,1,1 +30290000,0.78,0.0042,-0.0026,-0.63,1.5,1.3,0.92,7.8,5.6,-3.7e+02,-0.0011,-0.0058,-0.00016,0.022,-0.031,-0.12,-0.17,-0.038,0.46,-0.0014,-0.028,-0.028,0,0,0.00032,0.00038,0.0044,0.11,0.15,0.0072,1.8,2.2,0.035,3.3e-07,4.9e-07,3.2e-06,0.029,0.027,0.00012,0.00037,1.9e-05,0.00044,0.00016,0.0004,0.00043,1,1 +30390000,0.78,0.0041,-0.0026,-0.63,1.5,1.2,0.9,8,5.7,-3.7e+02,-0.0011,-0.0058,-0.00017,0.021,-0.028,-0.12,-0.17,-0.038,0.46,-0.0014,-0.028,-0.027,0,0,0.00032,0.00038,0.0044,0.11,0.15,0.0072,1.8,2.3,0.035,3.3e-07,4.9e-07,3.2e-06,0.029,0.027,0.00012,0.00037,1.9e-05,0.00043,0.00016,0.0004,0.00043,1,1 +30490000,0.78,0.0039,-0.0025,-0.63,1.5,1.2,0.89,8.2,5.8,-3.7e+02,-0.0011,-0.0058,-0.00017,0.02,-0.026,-0.12,-0.17,-0.038,0.46,-0.0013,-0.028,-0.027,0,0,0.00032,0.00038,0.0044,0.11,0.16,0.0072,1.9,2.4,0.035,3.3e-07,4.9e-07,3.2e-06,0.029,0.026,0.00012,0.00037,1.9e-05,0.00043,0.00016,0.0004,0.00043,1,1 +30590000,0.78,0.0036,-0.0025,-0.63,1.5,1.2,0.85,8.3,6,-3.7e+02,-0.0011,-0.0058,-0.00017,0.019,-0.022,-0.12,-0.17,-0.038,0.46,-0.0013,-0.028,-0.027,0,0,0.00032,0.00038,0.0043,0.11,0.16,0.0072,2,2.5,0.035,3.3e-07,4.9e-07,3.2e-06,0.029,0.026,0.00011,0.00037,1.9e-05,0.00043,0.00016,0.0004,0.00043,1,1 +30690000,0.78,0.0034,-0.0024,-0.63,1.4,1.2,0.84,8.5,6.1,-3.7e+02,-0.0011,-0.0058,-0.00017,0.018,-0.019,-0.12,-0.17,-0.038,0.46,-0.0013,-0.028,-0.027,0,0,0.00032,0.00039,0.0043,0.11,0.17,0.0072,2.1,2.6,0.035,3.2e-07,4.9e-07,3.2e-06,0.029,0.026,0.00011,0.00036,1.9e-05,0.00043,0.00016,0.0004,0.00043,1,1 +30790000,0.78,0.0031,-0.0023,-0.63,1.4,1.2,0.83,8.6,6.2,-3.7e+02,-0.0011,-0.0058,-0.00017,0.017,-0.018,-0.12,-0.17,-0.038,0.46,-0.0012,-0.028,-0.027,0,0,0.00031,0.00039,0.0042,0.12,0.18,0.0072,2.2,2.8,0.035,3.2e-07,4.9e-07,3.2e-06,0.029,0.026,0.00011,0.00036,1.9e-05,0.00043,0.00016,0.0004,0.00043,1,1 +30890000,0.78,0.0027,-0.0022,-0.63,1.4,1.2,0.82,8.8,6.3,-3.7e+02,-0.0011,-0.0058,-0.00018,0.016,-0.016,-0.12,-0.17,-0.038,0.46,-0.0011,-0.028,-0.027,0,0,0.00031,0.00039,0.0042,0.12,0.18,0.0072,2.2,2.9,0.035,3.2e-07,4.9e-07,3.2e-06,0.029,0.026,0.00011,0.00036,1.9e-05,0.00043,0.00016,0.0004,0.00043,1,1 +30990000,0.78,0.0023,-0.0022,-0.63,1.3,1.2,0.81,8.9,6.4,-3.7e+02,-0.0011,-0.0058,-0.00018,0.015,-0.012,-0.12,-0.17,-0.038,0.46,-0.0011,-0.028,-0.027,0,0,0.00031,0.00039,0.0042,0.12,0.19,0.0072,2.3,3,0.035,3.2e-07,4.9e-07,3.2e-06,0.029,0.026,0.00011,0.00036,1.9e-05,0.00043,0.00016,0.0004,0.00043,1,1 +31090000,0.78,0.0019,-0.0021,-0.63,1.3,1.1,0.8,9,6.6,-3.7e+02,-0.0011,-0.0058,-0.00018,0.014,-0.0094,-0.12,-0.17,-0.038,0.46,-0.00097,-0.029,-0.027,0,0,0.00031,0.00039,0.0041,0.12,0.2,0.0072,2.4,3.2,0.035,3.2e-07,4.9e-07,3.2e-06,0.029,0.025,0.00011,0.00036,1.9e-05,0.00043,0.00016,0.0004,0.00043,1,1 +31190000,0.78,0.0016,-0.002,-0.63,1.3,1.1,0.79,9.2,6.7,-3.7e+02,-0.0011,-0.0058,-0.00019,0.012,-0.0056,-0.12,-0.17,-0.038,0.46,-0.00088,-0.029,-0.027,0,0,0.00031,0.00039,0.0041,0.13,0.2,0.0072,2.5,3.3,0.035,3.2e-07,5e-07,3.2e-06,0.029,0.025,0.00011,0.00036,1.9e-05,0.00043,0.00016,0.0004,0.00043,1,1 +31290000,0.78,0.0012,-0.0018,-0.63,1.2,1.1,0.79,9.3,6.8,-3.7e+02,-0.0011,-0.0058,-0.00019,0.011,-0.0028,-0.12,-0.17,-0.038,0.46,-0.00081,-0.029,-0.027,0,0,0.00031,0.00039,0.0041,0.13,0.21,0.0071,2.6,3.5,0.035,3.2e-07,5e-07,3.2e-06,0.029,0.025,0.00011,0.00036,1.9e-05,0.00043,0.00016,0.0004,0.00043,1,1 +31390000,0.78,0.00059,-0.0016,-0.63,1.2,1.1,0.79,9.4,6.9,-3.7e+02,-0.0011,-0.0058,-0.00019,0.0099,0.0002,-0.12,-0.17,-0.038,0.46,-0.00074,-0.029,-0.027,0,0,0.0003,0.0004,0.0041,0.13,0.22,0.0071,2.7,3.6,0.035,3.1e-07,5e-07,3.2e-06,0.029,0.025,0.00011,0.00036,1.9e-05,0.00043,0.00016,0.0004,0.00042,1,1 +31490000,0.78,8.5e-05,-0.0015,-0.63,1.2,1.1,0.79,9.5,7,-3.7e+02,-0.0011,-0.0058,-0.0002,0.0086,0.0029,-0.12,-0.17,-0.038,0.46,-0.00061,-0.029,-0.027,0,0,0.0003,0.0004,0.004,0.14,0.23,0.0071,2.8,3.8,0.035,3.1e-07,5e-07,3.2e-06,0.029,0.025,0.00011,0.00036,1.9e-05,0.00043,0.00016,0.0004,0.00042,1,1 +31590000,0.78,-0.00021,-0.0014,-0.63,1.1,1.1,0.78,9.7,7.1,-3.7e+02,-0.0011,-0.0058,-0.0002,0.0073,0.005,-0.11,-0.17,-0.038,0.46,-0.00056,-0.029,-0.027,0,0,0.0003,0.0004,0.004,0.14,0.24,0.0071,2.9,3.9,0.035,3.1e-07,5e-07,3.2e-06,0.029,0.025,0.0001,0.00036,1.9e-05,0.00043,0.00016,0.0004,0.00042,1,1 +31690000,0.78,-0.00082,-0.0013,-0.63,1.1,1.1,0.79,9.8,7.2,-3.7e+02,-0.0011,-0.0058,-0.0002,0.006,0.0077,-0.11,-0.17,-0.038,0.46,-0.00049,-0.029,-0.027,0,0,0.0003,0.0004,0.004,0.14,0.24,0.007,3,4.1,0.035,3.1e-07,5e-07,3.2e-06,0.029,0.024,0.0001,0.00036,1.9e-05,0.00042,0.00016,0.00039,0.00042,1,1 +31790000,0.78,-0.0014,-0.0011,-0.63,1.1,1,0.79,9.9,7.3,-3.7e+02,-0.0011,-0.0058,-0.0002,0.0047,0.011,-0.11,-0.17,-0.038,0.46,-0.00042,-0.029,-0.027,0,0,0.0003,0.0004,0.004,0.14,0.25,0.007,3.1,4.3,0.035,3.1e-07,5e-07,3.2e-06,0.029,0.024,0.0001,0.00036,1.9e-05,0.00042,0.00016,0.00039,0.00042,1,1 +31890000,0.78,-0.002,-0.001,-0.63,1.1,1,0.78,10,7.4,-3.7e+02,-0.0011,-0.0058,-0.0002,0.0033,0.014,-0.11,-0.17,-0.038,0.46,-0.00033,-0.029,-0.027,0,0,0.0003,0.0004,0.004,0.15,0.26,0.007,3.2,4.5,0.035,3.1e-07,5e-07,3.2e-06,0.029,0.024,0.0001,0.00036,1.9e-05,0.00042,0.00016,0.00039,0.00042,1,1 +31990000,0.78,-0.0024,-0.0009,-0.63,1,1,0.78,10,7.6,-3.7e+02,-0.0011,-0.0058,-0.00021,0.0018,0.017,-0.11,-0.17,-0.038,0.46,-0.00022,-0.029,-0.027,0,0,0.00029,0.00041,0.004,0.15,0.27,0.007,3.3,4.7,0.035,3e-07,5e-07,3.2e-06,0.029,0.024,0.0001,0.00036,1.9e-05,0.00042,0.00016,0.00039,0.00042,1,1 +32090000,0.78,-0.003,-0.0007,-0.63,1,0.99,0.79,10,7.7,-3.7e+02,-0.0012,-0.0058,-0.00021,0.00019,0.02,-0.11,-0.17,-0.038,0.46,-0.00011,-0.029,-0.027,0,0,0.00029,0.00041,0.0039,0.15,0.28,0.007,3.5,4.9,0.035,3e-07,5e-07,3.2e-06,0.029,0.024,0.0001,0.00036,1.9e-05,0.00042,0.00016,0.00039,0.00042,1,1 +32190000,0.78,-0.0038,-0.00051,-0.63,0.97,0.98,0.78,10,7.8,-3.7e+02,-0.0012,-0.0058,-0.00022,-0.0015,0.024,-0.11,-0.18,-0.038,0.46,3.2e-05,-0.03,-0.027,0,0,0.00029,0.00041,0.0039,0.15,0.29,0.0069,3.6,5.1,0.035,3e-07,5e-07,3.2e-06,0.029,0.023,9.9e-05,0.00036,1.9e-05,0.00042,0.00016,0.00039,0.00042,1,1 +32290000,0.78,-0.0044,-0.00042,-0.63,0.94,0.96,0.78,11,7.9,-3.7e+02,-0.0012,-0.0058,-0.00022,-0.0032,0.028,-0.11,-0.18,-0.038,0.46,0.00014,-0.03,-0.026,0,0,0.00029,0.00041,0.0039,0.16,0.3,0.0069,3.7,5.4,0.035,3e-07,5e-07,3.2e-06,0.029,0.023,9.8e-05,0.00036,1.9e-05,0.00042,0.00016,0.00039,0.00042,1,1 +32390000,0.78,-0.0049,-0.00032,-0.63,0.91,0.94,0.78,11,8,-3.7e+02,-0.0012,-0.0058,-0.00022,-0.0041,0.03,-0.11,-0.18,-0.038,0.46,0.00019,-0.03,-0.026,0,0,0.00029,0.00041,0.0039,0.16,0.31,0.0069,3.8,5.6,0.035,3e-07,5e-07,3.2e-06,0.029,0.023,9.7e-05,0.00036,1.9e-05,0.00042,0.00016,0.00039,0.00042,1,1 +32490000,0.78,-0.0051,-0.00027,-0.63,0.88,0.92,0.78,11,8.1,-3.7e+02,-0.0012,-0.0058,-0.00022,-0.0056,0.032,-0.11,-0.18,-0.038,0.46,0.00028,-0.03,-0.026,0,0,0.00028,0.00042,0.0039,0.16,0.32,0.0068,4,5.8,0.035,3e-07,5e-07,3.2e-06,0.029,0.023,9.6e-05,0.00036,1.9e-05,0.00042,0.00016,0.00039,0.00041,1,1 +32590000,0.78,-0.0053,-0.00021,-0.63,-1.6,-0.84,0.63,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00023,-0.0064,0.033,-0.11,-0.18,-0.038,0.46,0.00034,-0.03,-0.026,0,0,0.00028,0.00042,0.0039,0.25,0.25,0.56,0.25,0.25,0.037,3e-07,5.1e-07,3.2e-06,0.029,0.023,9.6e-05,0.00036,1.9e-05,0.00042,0.00016,0.00039,0.00041,1,1 +32690000,0.78,-0.0053,-0.00025,-0.63,-1.6,-0.85,0.61,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00023,-0.0073,0.035,-0.11,-0.18,-0.038,0.46,0.00041,-0.03,-0.026,0,0,0.00028,0.00042,0.0039,0.25,0.25,0.55,0.26,0.26,0.048,2.9e-07,5.1e-07,3.2e-06,0.029,0.023,9.5e-05,0.00036,1.9e-05,0.00041,0.00016,0.00039,0.00041,1,1 +32790000,0.78,-0.0052,-0.00026,-0.63,-1.5,-0.83,0.62,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00023,-0.0081,0.036,-0.11,-0.18,-0.038,0.46,0.00047,-0.03,-0.026,0,0,0.00028,0.00042,0.0039,0.13,0.13,0.27,0.26,0.26,0.049,2.9e-07,5.1e-07,3.2e-06,0.029,0.022,9.4e-05,0.00036,1.9e-05,0.00041,0.00016,0.00039,0.00041,1,1 +32890000,0.78,-0.005,-0.00039,-0.63,-1.6,-0.85,0.59,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00024,-0.0089,0.038,-0.11,-0.18,-0.038,0.46,0.00057,-0.03,-0.026,0,0,0.00028,0.00042,0.0039,0.13,0.13,0.26,0.27,0.27,0.059,2.9e-07,5.1e-07,3.2e-06,0.029,0.022,9.4e-05,0.00036,1.9e-05,0.00041,0.00016,0.00039,0.00041,1,1 +32990000,0.78,-0.0049,-0.0005,-0.63,-1.5,-0.84,0.59,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00023,-0.0098,0.04,-0.11,-0.18,-0.038,0.46,0.00059,-0.03,-0.025,0,0,0.00028,0.00042,0.0038,0.084,0.085,0.17,0.27,0.27,0.057,2.9e-07,5.1e-07,3.2e-06,0.029,0.022,9.4e-05,0.00036,1.9e-05,0.00041,0.00016,0.00039,0.00041,1,1 +33090000,0.78,-0.005,-0.00048,-0.63,-1.6,-0.86,0.58,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00023,-0.01,0.04,-0.11,-0.18,-0.038,0.46,0.00061,-0.03,-0.025,0,0,0.00028,0.00042,0.0038,0.084,0.086,0.16,0.28,0.28,0.065,2.9e-07,5.1e-07,3.2e-06,0.029,0.022,9.4e-05,0.00036,1.9e-05,0.00041,0.00016,0.00039,0.00041,1,1 +33190000,0.78,-0.0036,-0.0037,-0.62,-1.5,-0.84,0.53,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00022,-0.01,0.041,-0.11,-0.18,-0.038,0.46,0.0006,-0.03,-0.025,0,0,0.00028,0.00042,0.0038,0.063,0.065,0.11,0.28,0.28,0.062,2.9e-07,5.1e-07,3.2e-06,0.029,0.022,9.3e-05,0.00036,1.9e-05,0.00041,0.00016,0.00039,0.00041,1,1 +33290000,0.82,-0.0015,-0.016,-0.57,-1.5,-0.86,0.5,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00023,-0.01,0.04,-0.11,-0.18,-0.039,0.46,0.00058,-0.03,-0.025,0,0,0.00027,0.00042,0.0038,0.064,0.066,0.11,0.29,0.29,0.067,2.9e-07,5.1e-07,3.2e-06,0.029,0.022,9.3e-05,0.00035,1.9e-05,0.00041,0.00016,0.00039,0.00041,1,1 +33390000,0.89,-0.0018,-0.013,-0.46,-1.5,-0.85,0.7,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00022,-0.015,0.038,-0.11,-0.18,-0.039,0.46,0.0012,-0.028,-0.025,0,0,0.00028,0.0004,0.0037,0.051,0.053,0.083,0.29,0.29,0.065,2.9e-07,5e-07,3.2e-06,0.028,0.022,9.3e-05,0.00033,1.7e-05,0.00041,0.00015,0.00035,0.00041,1,1 +33490000,0.95,-0.00026,-0.0052,-0.31,-1.5,-0.86,0.72,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00023,-0.018,0.037,-0.11,-0.18,-0.04,0.46,0.0017,-0.02,-0.025,0,0,0.00031,0.00036,0.0034,0.052,0.054,0.075,0.3,0.3,0.068,2.8e-07,5e-07,3.2e-06,0.028,0.022,9.3e-05,0.00025,1.4e-05,0.00041,0.00013,0.00026,0.00041,1,1 +33590000,0.99,-0.003,0.0015,-0.14,-1.5,-0.84,0.68,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.0002,-0.018,0.037,-0.11,-0.19,-0.042,0.46,0.0025,-0.013,-0.026,0,0,0.00035,0.00031,0.003,0.044,0.047,0.061,0.3,0.3,0.065,2.8e-07,5e-07,3.1e-06,0.028,0.022,9.3e-05,0.00017,1e-05,0.00041,9.5e-05,0.00016,0.0004,1,1 +33690000,1,-0.0064,0.005,0.024,-1.6,-0.86,0.68,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00022,-0.018,0.037,-0.11,-0.19,-0.043,0.46,0.0018,-0.0093,-0.026,0,0,0.00037,0.00028,0.0026,0.045,0.05,0.056,0.31,0.31,0.068,2.8e-07,5e-07,3.1e-06,0.028,0.022,9.3e-05,0.00013,7.8e-06,0.0004,6.9e-05,0.0001,0.0004,1,1 +33790000,0.98,-0.0073,0.0069,0.19,-1.6,-0.86,0.67,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0002,-0.018,0.037,-0.11,-0.2,-0.043,0.46,0.002,-0.0068,-0.027,0,0,0.00037,0.00026,0.0023,0.04,0.045,0.047,0.31,0.31,0.064,2.8e-07,4.9e-07,3.1e-06,0.028,0.022,9.3e-05,9.7e-05,6.4e-06,0.0004,4.8e-05,6.3e-05,0.0004,1,1 +33890000,0.94,-0.0075,0.0082,0.35,-1.7,-0.9,0.66,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00019,-0.018,0.037,-0.11,-0.2,-0.043,0.46,0.0019,-0.0054,-0.027,0,0,0.00036,0.00026,0.0022,0.044,0.051,0.043,0.32,0.32,0.065,2.8e-07,4.9e-07,3e-06,0.028,0.022,9.3e-05,8.1e-05,5.6e-06,0.0004,3.4e-05,4.2e-05,0.0004,1,1 +33990000,0.87,-0.0095,0.0057,0.49,-1.7,-0.91,0.64,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0002,-0.015,0.036,-0.11,-0.2,-0.044,0.46,0.0017,-0.004,-0.027,0,0,0.00032,0.00027,0.002,0.041,0.049,0.036,0.32,0.32,0.062,2.8e-07,4.8e-07,3e-06,0.028,0.022,9.3e-05,7.1e-05,5.1e-06,0.0004,2.6e-05,3e-05,0.0004,1,1 +34090000,0.81,-0.011,0.0044,0.59,-1.7,-0.97,0.65,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0002,-0.01,0.035,-0.11,-0.2,-0.044,0.46,0.0011,-0.0034,-0.027,0,0,0.0003,0.00028,0.002,0.047,0.057,0.034,0.33,0.33,0.063,2.8e-07,4.9e-07,3e-06,0.027,0.022,9.3e-05,6.6e-05,4.9e-06,0.0004,2.1e-05,2.4e-05,0.0004,1,1 +34190000,0.76,-0.0081,0.0029,0.65,-1.7,-0.97,0.66,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0002,-0.039,0.052,-0.11,-0.2,-0.044,0.46,0.0012,-0.0028,-0.027,0,0,0.00026,0.00028,0.0018,0.045,0.054,0.029,0.33,0.33,0.06,2.8e-07,4.7e-07,3e-06,0.026,0.021,9.3e-05,6e-05,4.6e-06,0.0004,1.7e-05,1.9e-05,0.0004,1,1 +34290000,0.72,-0.0052,0.0041,0.69,-1.7,-1,0.66,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0002,-0.038,0.051,-0.11,-0.2,-0.044,0.46,0.0011,-0.0024,-0.027,0,0,0.00025,0.00029,0.0018,0.053,0.064,0.027,0.34,0.34,0.06,2.8e-07,4.7e-07,3e-06,0.025,0.021,9.3e-05,5.7e-05,4.5e-06,0.0004,1.4e-05,1.6e-05,0.0004,1,1 +34390000,0.7,-0.0024,0.0054,0.71,-1.8,-1.1,0.66,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0002,-0.036,0.05,-0.11,-0.2,-0.044,0.46,0.00092,-0.0022,-0.027,0,0,0.00025,0.00029,0.0018,0.062,0.075,0.025,0.35,0.35,0.06,2.8e-07,4.8e-07,3e-06,0.025,0.02,9.3e-05,5.5e-05,4.4e-06,0.0004,1.3e-05,1.4e-05,0.0004,1,1 +34490000,0.69,-0.00036,0.0066,0.73,-1.8,-1.1,0.66,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0002,-0.035,0.049,-0.11,-0.2,-0.044,0.46,0.0008,-0.0021,-0.027,0,0,0.00024,0.0003,0.0017,0.073,0.088,0.023,0.36,0.36,0.06,2.8e-07,4.8e-07,3e-06,0.025,0.02,9.3e-05,5.4e-05,4.3e-06,0.0004,1.1e-05,1.2e-05,0.0004,1,1 +34590000,0.68,0.00092,0.0074,0.74,-1.9,-1.2,0.67,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0002,-0.034,0.05,-0.11,-0.2,-0.044,0.46,0.00064,-0.002,-0.027,0,0,0.00024,0.0003,0.0017,0.085,0.1,0.021,0.38,0.38,0.059,2.8e-07,4.8e-07,3e-06,0.025,0.02,9.3e-05,5.2e-05,4.3e-06,0.0004,1e-05,1.1e-05,0.0004,1,1 +34690000,0.67,0.0017,0.0079,0.74,-1.9,-1.2,0.67,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00019,-0.034,0.049,-0.11,-0.2,-0.044,0.46,0.00068,-0.0018,-0.027,0,0,0.00024,0.0003,0.0017,0.098,0.12,0.019,0.39,0.4,0.059,2.8e-07,4.8e-07,3e-06,0.025,0.02,9.3e-05,5.1e-05,4.2e-06,0.0004,9.6e-06,1e-05,0.0004,1,1 +34790000,0.67,0.0024,0.0081,0.75,-2,-1.3,0.67,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00019,-0.036,0.047,-0.11,-0.2,-0.044,0.46,0.00078,-0.0017,-0.027,0,0,0.00024,0.0003,0.0017,0.11,0.14,0.018,0.41,0.42,0.058,2.8e-07,4.8e-07,3e-06,0.025,0.02,9.3e-05,5.1e-05,4.2e-06,0.0004,8.9e-06,9.2e-06,0.0004,1,1 +34890000,0.66,0.0025,0.0082,0.75,-2,-1.3,0.67,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00019,-0.035,0.047,-0.11,-0.2,-0.044,0.46,0.00069,-0.0017,-0.027,0,0,0.00023,0.0003,0.0017,0.13,0.16,0.017,0.43,0.44,0.056,2.9e-07,4.8e-07,3e-06,0.025,0.02,9.3e-05,5e-05,4.1e-06,0.0004,8.4e-06,8.5e-06,0.0004,1,1 +34990000,0.66,-0.00086,0.016,0.75,-3,-2.2,-0.15,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00019,-0.035,0.047,-0.11,-0.2,-0.044,0.46,0.00079,-0.0017,-0.027,0,0,0.00024,0.00031,0.0017,0.16,0.22,0.016,0.46,0.47,0.056,2.9e-07,4.8e-07,3e-06,0.025,0.02,9.3e-05,4.9e-05,4.1e-06,0.0004,7.9e-06,8e-06,0.0004,1,1 +35090000,0.66,-0.00092,0.016,0.75,-3.1,-2.3,-0.2,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00019,-0.035,0.047,-0.11,-0.2,-0.044,0.46,0.00078,-0.0017,-0.027,0,0,0.00023,0.00031,0.0017,0.18,0.25,0.015,0.49,0.51,0.055,2.9e-07,4.8e-07,3e-06,0.025,0.02,9.3e-05,4.9e-05,4.1e-06,0.0004,7.5e-06,7.5e-06,0.0004,1,1 +35190000,0.66,-0.001,0.015,0.75,-3.1,-2.3,-0.19,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00019,-0.035,0.047,-0.11,-0.2,-0.044,0.46,0.00081,-0.0017,-0.027,0,0,0.00023,0.00031,0.0017,0.2,0.28,0.014,0.52,0.55,0.054,2.9e-07,4.8e-07,3e-06,0.025,0.02,9.3e-05,4.8e-05,4e-06,0.0004,7.2e-06,7.1e-06,0.0004,1,1 +35290000,0.66,-0.0012,0.015,0.75,-3.2,-2.3,-0.18,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00019,-0.035,0.047,-0.11,-0.2,-0.044,0.46,0.00084,-0.0017,-0.027,0,0,0.00023,0.00031,0.0017,0.23,0.31,0.013,0.56,0.6,0.052,2.9e-07,4.8e-07,3e-06,0.025,0.02,9.3e-05,4.8e-05,4e-06,0.0004,6.9e-06,6.7e-06,0.0004,1,1 +35390000,0.66,-0.0011,0.015,0.75,-3.2,-2.4,-0.17,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0002,-0.035,0.047,-0.11,-0.2,-0.044,0.46,0.00091,-0.0017,-0.027,0,0,0.00023,0.00031,0.0017,0.25,0.34,0.013,0.61,0.66,0.052,2.9e-07,4.8e-07,3e-06,0.025,0.02,9.3e-05,4.7e-05,4e-06,0.0004,6.6e-06,6.4e-06,0.0004,1,1 +35490000,0.66,-0.0012,0.016,0.75,-3.2,-2.4,-0.16,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0002,-0.035,0.047,-0.11,-0.2,-0.044,0.46,0.00097,-0.0017,-0.027,0,0,0.00023,0.0003,0.0017,0.28,0.37,0.012,0.66,0.73,0.051,2.9e-07,4.8e-07,3e-06,0.025,0.02,9.3e-05,4.7e-05,4e-06,0.0004,6.4e-06,6.2e-06,0.0004,1,1 +35590000,0.66,-0.0012,0.016,0.75,-3.3,-2.5,-0.16,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0002,-0.035,0.047,-0.11,-0.2,-0.044,0.46,0.00092,-0.0017,-0.027,0,0,0.00023,0.0003,0.0017,0.31,0.4,0.011,0.72,0.81,0.05,2.9e-07,4.8e-07,3e-06,0.025,0.02,9.3e-05,4.6e-05,4e-06,0.0004,6.2e-06,5.9e-06,0.0004,1,1 +35690000,0.66,-0.0011,0.016,0.75,-3.3,-2.5,-0.15,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0002,-0.035,0.046,-0.11,-0.2,-0.044,0.46,0.00098,-0.0017,-0.027,0,0,0.00023,0.0003,0.0017,0.33,0.44,0.011,0.79,0.9,0.049,2.9e-07,4.9e-07,3e-06,0.025,0.02,9.3e-05,4.6e-05,3.9e-06,0.0004,6.1e-06,5.7e-06,0.0004,1,1 +35790000,0.66,-0.0012,0.016,0.75,-3.3,-2.6,-0.14,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0002,-0.035,0.045,-0.11,-0.2,-0.044,0.46,0.00098,-0.0017,-0.027,0,0,0.00023,0.0003,0.0017,0.36,0.48,0.01,0.86,1,0.048,2.9e-07,4.9e-07,3e-06,0.025,0.02,9.3e-05,4.6e-05,3.9e-06,0.0004,5.9e-06,5.5e-06,0.0004,1,1 +35890000,0.66,-0.0013,0.016,0.75,-3.4,-2.6,-0.14,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0002,-0.035,0.045,-0.11,-0.2,-0.044,0.46,0.00098,-0.0017,-0.027,0,0,0.00022,0.0003,0.0017,0.4,0.52,0.01,0.95,1.1,0.047,2.9e-07,4.9e-07,3e-06,0.025,0.02,9.3e-05,4.5e-05,3.9e-06,0.0004,5.7e-06,5.3e-06,0.0004,1,1 +35990000,0.66,-0.0013,0.016,0.75,-3.4,-2.7,-0.13,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0002,-0.034,0.045,-0.11,-0.2,-0.044,0.46,0.00094,-0.0017,-0.027,0,0,0.00022,0.0003,0.0017,0.43,0.56,0.0097,1,1.2,0.047,2.9e-07,4.9e-07,3e-06,0.025,0.02,9.4e-05,4.5e-05,3.9e-06,0.0004,5.6e-06,5.1e-06,0.0004,1,1 +36090000,0.66,-0.0013,0.016,0.75,-3.4,-2.7,-0.12,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0002,-0.034,0.044,-0.11,-0.2,-0.044,0.46,0.00096,-0.0017,-0.027,0,0,0.00022,0.0003,0.0017,0.46,0.6,0.0093,1.2,1.4,0.046,2.9e-07,4.9e-07,3e-06,0.025,0.02,9.4e-05,4.5e-05,3.9e-06,0.0004,5.5e-06,5e-06,0.0004,1,1 +36190000,0.66,-0.0013,0.016,0.75,-3.5,-2.8,-0.11,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00022,-0.034,0.043,-0.11,-0.2,-0.044,0.46,0.001,-0.0017,-0.027,0,0,0.00022,0.0003,0.0017,0.5,0.65,0.009,1.3,1.5,0.045,3e-07,4.9e-07,3e-06,0.025,0.02,9.4e-05,4.4e-05,3.8e-06,0.0004,5.4e-06,4.8e-06,0.0004,1,1 +36290000,0.66,-0.0013,0.016,0.75,-3.5,-2.8,-0.1,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00022,-0.033,0.042,-0.11,-0.2,-0.044,0.46,0.001,-0.0017,-0.027,0,0,0.00022,0.0003,0.0017,0.53,0.69,0.0088,1.4,1.7,0.045,3e-07,4.9e-07,3e-06,0.025,0.02,9.4e-05,4.4e-05,3.8e-06,0.0004,5.3e-06,4.7e-06,0.0004,1,1 +36390000,0.66,-0.0013,0.016,0.75,-3.5,-2.9,-0.097,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00022,-0.033,0.042,-0.11,-0.2,-0.044,0.46,0.001,-0.0017,-0.027,0,0,0.00022,0.00029,0.0017,0.57,0.74,0.0086,1.6,1.9,0.044,3e-07,4.9e-07,3e-06,0.025,0.02,9.4e-05,4.4e-05,3.8e-06,0.0004,5.2e-06,4.6e-06,0.0004,1,1 +36490000,0.66,-0.0014,0.016,0.75,-3.6,-2.9,-0.09,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00021,-0.032,0.041,-0.11,-0.2,-0.044,0.46,0.00099,-0.0017,-0.027,0,0,0.00022,0.00029,0.0017,0.61,0.79,0.0083,1.7,2.1,0.043,3e-07,4.9e-07,3e-06,0.025,0.02,9.4e-05,4.3e-05,3.8e-06,0.0004,5.2e-06,4.5e-06,0.0004,1,1 +36590000,0.66,-0.0014,0.016,0.75,-3.6,-3,-0.08,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00022,-0.032,0.04,-0.11,-0.2,-0.044,0.46,0.001,-0.0016,-0.027,0,0,0.00022,0.00029,0.0017,0.65,0.84,0.0082,1.9,2.4,0.042,3e-07,4.9e-07,3e-06,0.025,0.02,9.4e-05,4.3e-05,3.8e-06,0.00039,5.1e-06,4.4e-06,0.0004,1,1 +36690000,0.66,-0.0014,0.016,0.75,-3.6,-3,-0.073,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00023,-0.031,0.04,-0.11,-0.2,-0.044,0.46,0.001,-0.0016,-0.027,0,0,0.00022,0.00029,0.0017,0.69,0.89,0.0081,2.1,2.6,0.042,3e-07,4.9e-07,3e-06,0.025,0.02,9.4e-05,4.3e-05,3.8e-06,0.00039,5e-06,4.3e-06,0.0004,1,1 +36790000,0.66,-0.0014,0.016,0.75,-3.7,-3.1,-0.063,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00024,-0.031,0.038,-0.11,-0.2,-0.044,0.46,0.0011,-0.0017,-0.027,0,0,0.00021,0.00029,0.0017,0.74,0.94,0.0079,2.3,2.9,0.041,3e-07,4.9e-07,3e-06,0.025,0.019,9.4e-05,4.3e-05,3.8e-06,0.00039,5e-06,4.2e-06,0.0004,1,1 +36890000,0.66,-0.0014,0.016,0.75,-3.7,-3.1,-0.056,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00025,-0.031,0.038,-0.11,-0.2,-0.044,0.46,0.0011,-0.0017,-0.027,0,0,0.00021,0.00029,0.0017,0.78,1,0.0078,2.6,3.2,0.041,3e-07,4.9e-07,3e-06,0.025,0.019,9.4e-05,4.2e-05,3.7e-06,0.00039,4.9e-06,4.1e-06,0.0004,1,1 +36990000,0.66,-0.0014,0.016,0.75,-3.7,-3.2,-0.049,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00025,-0.03,0.038,-0.11,-0.2,-0.044,0.46,0.0011,-0.0016,-0.027,0,0,0.00021,0.00029,0.0017,0.82,1.1,0.0077,2.8,3.6,0.04,3e-07,4.9e-07,3e-06,0.025,0.019,9.4e-05,4.2e-05,3.7e-06,0.00039,4.9e-06,4e-06,0.0004,1,1 +37090000,0.66,-0.0014,0.016,0.75,-3.8,-3.2,-0.041,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00025,-0.03,0.037,-0.11,-0.2,-0.044,0.46,0.0011,-0.0016,-0.027,0,0,0.00021,0.00029,0.0017,0.87,1.1,0.0076,3.1,4,0.04,3e-07,4.9e-07,3e-06,0.024,0.019,9.4e-05,4.2e-05,3.7e-06,0.00039,4.8e-06,3.9e-06,0.0004,1,1 +37190000,0.66,-0.0014,0.016,0.75,-3.8,-3.3,-0.033,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00025,-0.029,0.037,-0.11,-0.2,-0.044,0.46,0.0011,-0.0016,-0.027,0,0,0.00021,0.00029,0.0017,0.92,1.2,0.0076,3.4,4.4,0.039,3e-07,4.9e-07,3e-06,0.024,0.019,9.4e-05,4.2e-05,3.7e-06,0.00039,4.8e-06,3.9e-06,0.0004,1,1 +37290000,0.66,-0.0015,0.017,0.75,-3.8,-3.3,-0.026,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00025,-0.029,0.037,-0.11,-0.2,-0.044,0.46,0.0011,-0.0016,-0.027,0,0,0.00021,0.00028,0.0017,0.97,1.2,0.0075,3.7,4.8,0.039,3.1e-07,4.9e-07,2.9e-06,0.024,0.019,9.4e-05,4.1e-05,3.7e-06,0.00039,4.7e-06,3.8e-06,0.0004,1,1 +37390000,0.66,-0.0014,0.017,0.75,-3.9,-3.4,-0.019,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00026,-0.029,0.036,-0.11,-0.2,-0.044,0.46,0.0011,-0.0016,-0.027,0,0,0.00021,0.00028,0.0017,1,1.3,0.0075,4.1,5.3,0.039,3.1e-07,4.9e-07,2.9e-06,0.024,0.019,9.5e-05,4.1e-05,3.7e-06,0.00039,4.7e-06,3.7e-06,0.0004,1,1 +37490000,0.66,-0.0014,0.017,0.75,-3.9,-3.4,-0.011,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00027,-0.029,0.035,-0.11,-0.2,-0.044,0.46,0.0011,-0.0015,-0.027,0,0,0.00021,0.00028,0.0017,1.1,1.4,0.0074,4.4,5.8,0.038,3.1e-07,4.9e-07,2.9e-06,0.024,0.019,9.5e-05,4.1e-05,3.7e-06,0.00039,4.7e-06,3.7e-06,0.0004,1,1 +37590000,0.66,-0.0014,0.017,0.75,-3.9,-3.5,-0.0032,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00028,-0.028,0.034,-0.11,-0.2,-0.044,0.46,0.0012,-0.0015,-0.027,0,0,0.00021,0.00028,0.0017,1.1,1.4,0.0074,4.9,6.3,0.038,3.1e-07,4.9e-07,2.9e-06,0.024,0.019,9.5e-05,4.1e-05,3.7e-06,0.00039,4.6e-06,3.6e-06,0.0004,1,1 +37690000,0.66,-0.0015,0.017,0.75,-4,-3.5,0.0061,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00029,-0.027,0.033,-0.11,-0.2,-0.044,0.46,0.0012,-0.0015,-0.027,0,0,0.00021,0.00028,0.0017,1.2,1.5,0.0074,5.3,6.9,0.038,3.1e-07,4.9e-07,2.9e-06,0.024,0.019,9.5e-05,4.1e-05,3.6e-06,0.00039,4.6e-06,3.6e-06,0.0004,1,1 +37790000,0.66,-0.0016,0.017,0.75,-4,-3.6,0.015,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00029,-0.027,0.032,-0.11,-0.2,-0.044,0.46,0.0012,-0.0015,-0.027,0,0,0.0002,0.00028,0.0017,1.2,1.5,0.0074,5.8,7.5,0.037,3.1e-07,4.9e-07,2.9e-06,0.024,0.019,9.5e-05,4e-05,3.6e-06,0.00039,4.6e-06,3.5e-06,0.0004,1,1 +37890000,0.66,-0.0016,0.017,0.75,-4,-3.6,0.022,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00029,-0.027,0.032,-0.11,-0.2,-0.044,0.46,0.0012,-0.0015,-0.027,0,0,0.0002,0.00028,0.0017,1.3,1.6,0.0074,6.3,8.2,0.037,3.1e-07,4.8e-07,2.9e-06,0.024,0.019,9.5e-05,4e-05,3.6e-06,0.00039,4.6e-06,3.4e-06,0.0004,1,1 +37990000,0.66,-0.0016,0.017,0.75,-4.1,-3.7,0.031,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.00029,-0.026,0.031,-0.11,-0.2,-0.044,0.46,0.0012,-0.0015,-0.027,0,0,0.0002,0.00028,0.0017,1.3,1.7,0.0074,6.8,8.9,0.037,3.1e-07,4.8e-07,2.9e-06,0.024,0.019,9.5e-05,4e-05,3.6e-06,0.00039,4.6e-06,3.4e-06,0.0004,1,1 +38090000,0.66,-0.0017,0.017,0.75,-4.1,-3.8,0.041,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0003,-0.025,0.03,-0.11,-0.2,-0.044,0.46,0.0012,-0.0015,-0.027,0,0,0.0002,0.00027,0.0016,1.4,1.7,0.0074,7.4,9.6,0.037,3.1e-07,4.8e-07,2.9e-06,0.024,0.019,9.5e-05,4e-05,3.6e-06,0.00039,4.5e-06,3.4e-06,0.0004,1,1 +38190000,0.66,-0.0016,0.017,0.75,-4.2,-3.8,0.048,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0003,-0.025,0.03,-0.11,-0.2,-0.044,0.46,0.0012,-0.0015,-0.027,0,0,0.0002,0.00027,0.0016,1.4,1.8,0.0074,8,10,0.036,3.1e-07,4.8e-07,2.9e-06,0.024,0.019,9.5e-05,3.9e-05,3.6e-06,0.00039,4.5e-06,3.3e-06,0.0004,1,1 +38290000,0.66,-0.0017,0.017,0.75,-4.2,-3.9,0.056,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0003,-0.025,0.029,-0.11,-0.2,-0.044,0.46,0.0012,-0.0015,-0.027,0,0,0.0002,0.00027,0.0016,1.5,1.9,0.0074,8.6,11,0.037,3.1e-07,4.8e-07,2.9e-06,0.024,0.019,9.4e-05,3.9e-05,3.6e-06,0.00039,4.5e-06,3.3e-06,0.0004,1,1 +38390000,0.66,-0.0016,0.017,0.75,-4.2,-3.9,0.063,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0003,-0.024,0.028,-0.11,-0.2,-0.044,0.46,0.0012,-0.0015,-0.027,0,0,0.0002,0.00027,0.0016,1.6,2,0.0074,9.3,12,0.036,3.1e-07,4.8e-07,2.9e-06,0.024,0.018,9.4e-05,3.9e-05,3.6e-06,0.00039,4.5e-06,3.2e-06,0.0004,1,1 +38490000,0.66,-0.0016,0.017,0.75,-4.3,-4,0.07,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0003,-0.025,0.028,-0.11,-0.2,-0.044,0.46,0.0012,-0.0015,-0.027,0,0,0.0002,0.00027,0.0016,1.6,2,0.0074,10,13,0.036,3.1e-07,4.8e-07,2.9e-06,0.024,0.018,9.4e-05,3.9e-05,3.5e-06,0.00039,4.5e-06,3.2e-06,0.0004,1,1 +38590000,0.66,-0.0016,0.017,0.75,-4.3,-4,0.076,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0059,-0.0003,-0.024,0.029,-0.11,-0.2,-0.044,0.46,0.0012,-0.0015,-0.027,0,0,0.0002,0.00027,0.0016,1.7,2.1,0.0075,11,14,0.036,3.2e-07,4.8e-07,2.8e-06,0.024,0.018,9.4e-05,3.9e-05,3.5e-06,0.00039,4.5e-06,3.2e-06,0.0004,1,1 +38690000,0.66,-0.0016,0.017,0.75,-4.3,-4.1,0.082,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00031,-0.025,0.029,-0.11,-0.2,-0.044,0.46,0.0012,-0.0014,-0.027,0,0,0.0002,0.00027,0.0016,1.7,2.2,0.0075,12,15,0.036,3.2e-07,4.8e-07,2.8e-06,0.024,0.018,9.4e-05,3.8e-05,3.5e-06,0.00039,4.5e-06,3.1e-06,0.0004,1,1 +38790000,0.66,-0.0016,0.017,0.75,-4.4,-4.1,0.089,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00031,-0.025,0.028,-0.11,-0.2,-0.044,0.46,0.0012,-0.0015,-0.027,0,0,0.0002,0.00026,0.0016,1.8,2.3,0.0075,12,16,0.036,3.2e-07,4.8e-07,2.8e-06,0.024,0.018,9.4e-05,3.8e-05,3.5e-06,0.00039,4.4e-06,3.1e-06,0.0004,1,1 +38890000,0.66,-0.0017,0.017,0.75,-4.4,-4.1,0.59,-1e+06,1.2e+04,-3.7e+02,-0.0012,-0.0058,-0.00031,-0.025,0.028,-0.11,-0.2,-0.044,0.46,0.0012,-0.0015,-0.027,0,0,0.00019,0.00026,0.0016,1.9,2.3,0.0075,13,17,0.036,3.2e-07,4.8e-07,2.8e-06,0.024,0.018,9.4e-05,3.8e-05,3.5e-06,0.00039,4.4e-06,3.1e-06,0.0004,1,1 diff --git a/src/modules/ekf2/test/change_indication/iris_gps.csv b/src/modules/ekf2/test/change_indication/iris_gps.csv index 1bc97e889afb..6cb6d950815c 100644 --- a/src/modules/ekf2/test/change_indication/iris_gps.csv +++ b/src/modules/ekf2/test/change_indication/iris_gps.csv @@ -1,351 +1,351 @@ Timestamp,state[0],state[1],state[2],state[3],state[4],state[5],state[6],state[7],state[8],state[9],state[10],state[11],state[12],state[13],state[14],state[15],state[16],state[17],state[18],state[19],state[20],state[21],state[22],state[23],variance[0],variance[1],variance[2],variance[3],variance[4],variance[5],variance[6],variance[7],variance[8],variance[9],variance[10],variance[11],variance[12],variance[13],variance[14],variance[15],variance[16],variance[17],variance[18],variance[19],variance[20],variance[21],variance[22],variance[23] 10000,1,-0.011,-0.01,0.00023,0.00033,-0.00013,-0.01,1e-05,-3.9e-06,-0.00042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.01,0.01,0.00018,25,25,10,1e+02,1e+02,1e+02,0.01,0.01,0.01,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 90000,1,-0.011,-0.01,0.00033,-0.001,-0.0031,-0.024,-3.8e-05,-0.00013,-0.0021,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.01,0.01,0.00046,25,25,10,1e+02,1e+02,1e+02,0.01,0.01,0.01,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -190000,1,-0.012,-0.011,0.00044,-0.0023,-0.003,-0.037,-0.00017,-0.00043,-0.017,4.7e-10,-5e-10,-1.5e-11,0,0,-1.1e-06,0,0,0,0,0,0,0,0,0.011,0.011,0.00094,25,25,10,1e+02,1e+02,1,0.01,0.01,0.01,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -290000,1,-0.012,-0.011,0.00044,-0.0033,-0.0044,-0.046,-0.00024,-0.00025,-0.018,3.8e-09,-5.9e-09,-4.7e-10,0,0,-1e-05,0,0,0,0,0,0,0,0,0.011,0.012,0.00077,25,25,9.6,0.37,0.37,0.41,0.01,0.01,0.0052,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -390000,1,-0.012,-0.011,0.00049,-0.0025,-0.0059,-0.063,-0.00056,-0.00071,-0.013,-7.1e-09,-5.8e-09,-1.3e-09,0,0,2.2e-06,0,0,0,0,0,0,0,0,0.012,0.012,0.0012,25,25,8.1,0.97,0.97,0.32,0.01,0.01,0.0052,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -490000,1,-0.012,-0.012,0.00055,-0.0007,-0.0062,-0.069,-0.00015,-0.00046,-0.011,-1.2e-06,7.5e-07,-1.7e-07,0,0,-1e-06,0,0,0,0,0,0,0,0,0.013,0.013,0.00073,7.8,7.8,5.9,0.34,0.34,0.31,0.01,0.01,0.0024,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -590000,1,-0.012,-0.012,0.00057,-0.002,-0.009,-0.12,-0.00028,-0.0012,-0.029,-1.3e-06,7.8e-07,-1.8e-07,0,0,7.8e-05,0,0,0,0,0,0,0,0,0.015,0.015,0.001,7.9,7.9,4.2,0.67,0.67,0.32,0.01,0.01,0.0024,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -690000,1,-0.012,-0.012,0.0006,5.4e-05,-0.0088,-0.05,-8e-05,-0.00078,-0.0088,-5.6e-06,1.6e-06,-5.2e-07,0,0,-0.00016,0,0,0,0,0,0,0,0,0.016,0.016,0.00062,2.7,2.7,2.8,0.26,0.26,0.29,0.01,0.01,0.0012,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -790000,1,-0.012,-0.012,0.0006,0.0022,-0.01,-0.054,-2.3e-05,-0.0017,-0.011,-5.4e-06,1.6e-06,-5.1e-07,0,0,-0.0002,0,0,0,0,0,0,0,0,0.018,0.018,0.00079,2.8,2.8,1.9,0.42,0.42,0.27,0.01,0.01,0.0012,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -890000,1,-0.012,-0.013,0.00061,0.0031,-0.0084,-0.093,0.00015,-0.0011,-0.031,-2.1e-05,1.2e-06,-7.4e-07,0,0,-8.1e-05,0,0,0,0,0,0,0,0,0.019,0.019,0.00052,1.3,1.3,1.3,0.2,0.2,0.25,0.0099,0.0099,0.00067,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -990000,1,-0.012,-0.013,0.00058,0.006,-0.0097,-0.12,0.00062,-0.002,-0.046,-2.2e-05,1.2e-06,-7.4e-07,0,0,-2.6e-05,0,0,0,0,0,0,0,0,0.021,0.021,0.00064,1.5,1.5,0.95,0.3,0.3,0.23,0.0099,0.0099,0.00067,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -1090000,1,-0.012,-0.013,0.00054,0.011,-0.013,-0.13,0.00077,-0.0014,-0.062,-6e-05,-1.5e-05,-1.8e-07,0,0,1.1e-05,0,0,0,0,0,0,0,0,0.023,0.023,0.00045,0.93,0.92,0.69,0.17,0.17,0.2,0.0098,0.0098,0.00042,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -1190000,1,-0.012,-0.013,0.00047,0.015,-0.018,-0.11,0.0021,-0.003,-0.047,-5.7e-05,-1.3e-05,-2.2e-07,0,0,-0.00056,0,0,0,0,0,0,0,0,0.025,0.025,0.00053,1.1,1.1,0.54,0.24,0.24,0.19,0.0098,0.0098,0.00042,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -1290000,1,-0.012,-0.014,0.00041,0.019,-0.018,-0.11,0.002,-0.0024,-0.048,-0.00016,-9.4e-05,3e-06,0,0,-0.00083,0,0,0,0,0,0,0,0,0.025,0.026,0.0004,0.88,0.88,0.42,0.15,0.15,0.18,0.0095,0.0095,0.00028,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -1390000,1,-0.012,-0.014,0.00038,0.026,-0.023,-0.097,0.0043,-0.0044,-0.038,-0.00016,-9e-05,2.8e-06,0,0,-0.0015,0,0,0,0,0,0,0,0,0.028,0.028,0.00046,1.2,1.1,0.33,0.21,0.21,0.16,0.0095,0.0095,0.00028,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -1490000,1,-0.012,-0.014,0.00037,0.024,-0.02,-0.12,0.0034,-0.0033,-0.053,-0.00039,-0.00033,1.1e-05,0,0,-0.0013,0,0,0,0,0,0,0,0,0.027,0.027,0.00036,0.95,0.95,0.27,0.14,0.14,0.15,0.0088,0.0088,0.0002,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -1590000,1,-0.012,-0.014,0.00039,0.031,-0.024,-0.13,0.0061,-0.0055,-0.063,-0.00039,-0.00033,1.1e-05,0,0,-0.0015,0,0,0,0,0,0,0,0,0.029,0.029,0.00041,1.3,1.3,0.23,0.2,0.2,0.14,0.0088,0.0088,0.0002,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -1690000,1,-0.012,-0.014,0.00042,0.028,-0.019,-0.13,0.0044,-0.0037,-0.068,-0.00072,-0.00073,2.4e-05,0,0,-0.0019,0,0,0,0,0,0,0,0,0.025,0.026,0.00033,1,1,0.19,0.14,0.14,0.13,0.0078,0.0078,0.00015,0.04,0.04,0.039,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -1790000,1,-0.012,-0.014,0.00038,0.036,-0.024,-0.13,0.0076,-0.0059,-0.067,-0.00072,-0.00072,2.4e-05,0,0,-0.0029,0,0,0,0,0,0,0,0,0.028,0.028,0.00037,1.3,1.3,0.17,0.2,0.2,0.12,0.0078,0.0078,0.00015,0.04,0.04,0.039,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -1890000,1,-0.012,-0.014,0.00037,0.043,-0.025,-0.14,0.012,-0.0084,-0.075,-0.00071,-0.00071,2.4e-05,0,0,-0.0033,0,0,0,0,0,0,0,0,0.031,0.031,0.00041,1.7,1.7,0.15,0.31,0.31,0.12,0.0078,0.0078,0.00015,0.04,0.04,0.039,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -1990000,1,-0.011,-0.014,0.00036,0.035,-0.018,-0.14,0.0082,-0.0054,-0.074,-0.0011,-0.0012,3.8e-05,0,0,-0.0047,0,0,0,0,0,0,0,0,0.024,0.025,0.00033,1.3,1.3,0.13,0.2,0.2,0.11,0.0067,0.0067,0.00011,0.04,0.04,0.039,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -2090000,1,-0.011,-0.014,0.00039,0.042,-0.02,-0.14,0.012,-0.0074,-0.071,-0.0011,-0.0012,3.8e-05,0,0,-0.0066,0,0,0,0,0,0,0,0,0.027,0.027,0.00037,1.7,1.7,0.12,0.31,0.31,0.11,0.0067,0.0067,0.00011,0.04,0.04,0.039,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -2190000,1,-0.011,-0.014,0.00032,0.033,-0.014,-0.14,0.0081,-0.0044,-0.077,-0.0014,-0.0018,5.1e-05,0,0,-0.0076,0,0,0,0,0,0,0,0,0.02,0.02,0.0003,1.2,1.2,0.11,0.2,0.2,0.11,0.0055,0.0055,8.8e-05,0.04,0.04,0.038,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -2290000,1,-0.011,-0.014,0.00031,0.038,-0.014,-0.14,0.012,-0.0058,-0.075,-0.0014,-0.0018,5e-05,0,0,-0.0099,0,0,0,0,0,0,0,0,0.022,0.022,0.00033,1.5,1.5,0.11,0.3,0.3,0.1,0.0055,0.0055,8.8e-05,0.04,0.04,0.038,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -2390000,1,-0.011,-0.013,0.00031,0.03,-0.01,-0.14,0.0076,-0.0034,-0.072,-0.0017,-0.0023,5.9e-05,0,0,-0.013,0,0,0,0,0,0,0,0,0.017,0.017,0.00027,1,1,0.1,0.19,0.19,0.098,0.0046,0.0046,7e-05,0.04,0.04,0.037,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -2490000,1,-0.011,-0.014,0.00039,0.033,-0.009,-0.14,0.011,-0.0044,-0.079,-0.0017,-0.0023,5.9e-05,0,0,-0.014,0,0,0,0,0,0,0,0,0.018,0.018,0.0003,1.3,1.3,0.1,0.28,0.28,0.097,0.0046,0.0046,7e-05,0.04,0.04,0.037,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -2590000,1,-0.01,-0.013,0.00028,0.023,-0.0061,-0.15,0.0066,-0.0024,-0.084,-0.0018,-0.0027,6.4e-05,0,0,-0.015,0,0,0,0,0,0,0,0,0.014,0.014,0.00025,0.88,0.88,0.099,0.18,0.18,0.094,0.0038,0.0038,5.7e-05,0.04,0.04,0.036,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -2690000,1,-0.01,-0.013,0.00032,0.027,-0.0052,-0.15,0.0092,-0.003,-0.084,-0.0018,-0.0027,6.4e-05,0,0,-0.018,0,0,0,0,0,0,0,0,0.015,0.015,0.00027,1.1,1.1,0.097,0.25,0.25,0.091,0.0038,0.0038,5.7e-05,0.04,0.04,0.036,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -2790000,1,-0.01,-0.013,0.00025,0.022,-0.0029,-0.14,0.0059,-0.0017,-0.081,-0.0019,-0.003,6.7e-05,0,0,-0.022,0,0,0,0,0,0,0,0,0.012,0.012,0.00023,0.76,0.76,0.095,0.16,0.16,0.089,0.0032,0.0032,4.7e-05,0.04,0.04,0.035,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -2890000,1,-0.01,-0.013,0.00017,0.026,-0.0046,-0.14,0.0083,-0.0021,-0.081,-0.0019,-0.003,6.7e-05,0,0,-0.026,0,0,0,0,0,0,0,0,0.013,0.013,0.00025,0.94,0.94,0.096,0.23,0.23,0.089,0.0032,0.0032,4.7e-05,0.04,0.04,0.034,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -2990000,1,-0.01,-0.013,0.00017,0.02,-0.0035,-0.15,0.0054,-0.0013,-0.086,-0.002,-0.0033,6.8e-05,0,0,-0.028,0,0,0,0,0,0,0,0,0.01,0.01,0.00022,0.66,0.66,0.095,0.15,0.15,0.088,0.0027,0.0027,3.9e-05,0.04,0.04,0.033,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -3090000,1,-0.01,-0.013,0.00037,0.025,-0.0063,-0.15,0.0077,-0.0018,-0.087,-0.002,-0.0033,6.8e-05,0,0,-0.031,0,0,0,0,0,0,0,0,0.011,0.011,0.00023,0.81,0.81,0.095,0.22,0.22,0.086,0.0027,0.0027,3.9e-05,0.04,0.04,0.032,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -3190000,1,-0.01,-0.013,0.00041,0.02,-0.0061,-0.15,0.0052,-0.0013,-0.097,-0.0021,-0.0036,6.8e-05,0,0,-0.033,0,0,0,0,0,0,0,0,0.0089,0.0089,0.0002,0.58,0.58,0.096,0.14,0.14,0.087,0.0023,0.0023,3.3e-05,0.04,0.04,0.031,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -3290000,1,-0.01,-0.013,0.00042,0.023,-0.0061,-0.15,0.0074,-0.002,-0.11,-0.0021,-0.0036,6.8e-05,0,0,-0.035,0,0,0,0,0,0,0,0,0.0097,0.0097,0.00022,0.72,0.72,0.095,0.2,0.2,0.086,0.0023,0.0023,3.3e-05,0.04,0.04,0.03,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -3390000,1,-0.0097,-0.013,0.00043,0.019,-0.0031,-0.15,0.005,-0.0013,-0.1,-0.0021,-0.0038,6.9e-05,0,0,-0.04,0,0,0,0,0,0,0,0,0.0079,0.0079,0.00019,0.53,0.53,0.095,0.14,0.14,0.085,0.002,0.002,2.8e-05,0.04,0.04,0.029,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -3490000,1,-0.0097,-0.013,0.00041,0.025,-0.0017,-0.15,0.0073,-0.0015,-0.1,-0.0021,-0.0038,6.9e-05,0,0,-0.044,0,0,0,0,0,0,0,0,0.0086,0.0087,0.0002,0.64,0.64,0.095,0.19,0.19,0.086,0.002,0.002,2.8e-05,0.04,0.04,0.027,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -3590000,1,-0.0095,-0.012,0.00035,0.021,-0.0012,-0.15,0.0051,-0.0009,-0.11,-0.0022,-0.004,6.8e-05,0,0,-0.047,0,0,0,0,0,0,0,0,0.0071,0.0071,0.00018,0.48,0.48,0.094,0.13,0.13,0.086,0.0017,0.0017,2.4e-05,0.04,0.04,0.026,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -3690000,1,-0.0095,-0.013,0.00033,0.024,-0.00049,-0.15,0.0074,-0.001,-0.11,-0.0022,-0.004,6.8e-05,0,0,-0.052,0,0,0,0,0,0,0,0,0.0077,0.0077,0.00019,0.59,0.59,0.093,0.18,0.18,0.085,0.0017,0.0017,2.4e-05,0.04,0.04,0.025,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -3790000,1,-0.0094,-0.012,0.00034,0.02,0.0039,-0.15,0.0051,-0.00044,-0.11,-0.0022,-0.0043,6.6e-05,0,0,-0.055,0,0,0,0,0,0,0,0,0.0064,0.0064,0.00017,0.44,0.44,0.093,0.12,0.12,0.086,0.0014,0.0014,2.1e-05,0.04,0.04,0.024,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -3890000,1,-0.0093,-0.012,0.00042,0.021,0.0052,-0.14,0.0073,1.9e-05,-0.11,-0.0022,-0.0043,6.6e-05,0,0,-0.059,0,0,0,0,0,0,0,0,0.0069,0.0069,0.00018,0.54,0.54,0.091,0.17,0.17,0.086,0.0014,0.0014,2.1e-05,0.04,0.04,0.022,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -3990000,1,-0.0093,-0.013,0.00048,0.026,0.005,-0.14,0.0096,0.00047,-0.11,-0.0022,-0.0043,6.7e-05,0,0,-0.064,0,0,0,0,0,0,0,0,0.0075,0.0075,0.00019,0.65,0.65,0.089,0.22,0.22,0.085,0.0014,0.0014,2.1e-05,0.04,0.04,0.021,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -4090000,1,-0.0093,-0.012,0.00054,0.022,0.0043,-0.12,0.0071,0.00066,-0.098,-0.0022,-0.0045,6.4e-05,0,0,-0.072,0,0,0,0,0,0,0,0,0.0062,0.0062,0.00017,0.5,0.5,0.087,0.16,0.16,0.085,0.0012,0.0012,1.8e-05,0.04,0.04,0.02,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -4190000,1,-0.0094,-0.012,0.00049,0.024,0.0041,-0.12,0.0094,0.0011,-0.1,-0.0022,-0.0045,6.4e-05,0,0,-0.074,0,0,0,0,0,0,0,0,0.0067,0.0067,0.00018,0.6,0.6,0.086,0.21,0.21,0.086,0.0012,0.0012,1.8e-05,0.04,0.04,0.019,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -4290000,1,-0.0094,-0.012,0.0005,0.021,0.0039,-0.12,0.0068,0.00089,-0.11,-0.0021,-0.0047,6.2e-05,0,0,-0.077,0,0,0,0,0,0,0,0,0.0055,0.0055,0.00016,0.46,0.46,0.084,0.15,0.15,0.085,0.00096,0.00096,1.6e-05,0.04,0.04,0.017,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -4390000,1,-0.0094,-0.012,0.00045,0.025,0.0025,-0.11,0.0092,0.0011,-0.094,-0.0021,-0.0047,6.2e-05,0,0,-0.083,0,0,0,0,0,0,0,0,0.0059,0.0059,0.00017,0.55,0.55,0.081,0.2,0.2,0.084,0.00096,0.00096,1.6e-05,0.04,0.04,0.016,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -4490000,1,-0.0094,-0.012,0.0005,0.021,0.0041,-0.11,0.0068,0.00092,-0.095,-0.0021,-0.0048,5.9e-05,0,0,-0.086,0,0,0,0,0,0,0,0,0.0048,0.0048,0.00015,0.42,0.42,0.08,0.14,0.14,0.085,0.00078,0.00078,1.4e-05,0.04,0.04,0.015,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -4590000,1,-0.0094,-0.012,0.00056,0.023,0.003,-0.11,0.009,0.0013,-0.098,-0.0021,-0.0048,5.9e-05,0,0,-0.088,0,0,0,0,0,0,0,0,0.0052,0.0052,0.00016,0.51,0.51,0.077,0.19,0.19,0.084,0.00078,0.00078,1.4e-05,0.04,0.04,0.014,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -4690000,1,-0.0094,-0.012,0.00049,0.017,0.0031,-0.1,0.0065,0.00094,-0.09,-0.0021,-0.005,5.7e-05,0,0,-0.093,0,0,0,0,0,0,0,0,0.0042,0.0042,0.00015,0.39,0.39,0.074,0.14,0.14,0.083,0.00063,0.00063,1.3e-05,0.04,0.04,0.013,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -4790000,1,-0.0093,-0.012,0.00058,0.015,0.0054,-0.099,0.0081,0.0014,-0.092,-0.0021,-0.005,5.7e-05,0,0,-0.095,0,0,0,0,0,0,0,0,0.0045,0.0045,0.00016,0.47,0.47,0.072,0.18,0.18,0.084,0.00063,0.00063,1.3e-05,0.04,0.04,0.012,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -4890000,1,-0.0092,-0.012,0.00061,0.01,0.0028,-0.093,0.0054,0.0011,-0.088,-0.0021,-0.0052,5.5e-05,0,0,-0.099,0,0,0,0,0,0,0,0,0.0036,0.0036,0.00014,0.36,0.36,0.07,0.13,0.13,0.083,0.0005,0.0005,1.1e-05,0.04,0.04,0.011,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -4990000,1,-0.0092,-0.012,0.00059,0.013,0.0035,-0.085,0.0066,0.0014,-0.083,-0.0021,-0.0052,5.5e-05,0,0,-0.1,0,0,0,0,0,0,0,0,0.0039,0.0039,0.00015,0.43,0.43,0.067,0.17,0.17,0.082,0.0005,0.0005,1.1e-05,0.04,0.04,0.011,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -5090000,1,-0.0091,-0.011,0.00066,0.01,0.0037,-0.082,0.0045,0.001,-0.082,-0.002,-0.0053,5.3e-05,0,0,-0.1,0,0,0,0,0,0,0,0,0.0031,0.0031,0.00013,0.33,0.33,0.065,0.12,0.12,0.082,0.0004,0.0004,1e-05,0.04,0.04,0.0098,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -5190000,1,-0.009,-0.012,0.0007,0.0098,0.0072,-0.08,0.0055,0.0016,-0.079,-0.002,-0.0053,5.3e-05,0,0,-0.11,0,0,0,0,0,0,0,0,0.0034,0.0034,0.00014,0.39,0.39,0.062,0.16,0.16,0.081,0.0004,0.0004,1e-05,0.04,0.04,0.0091,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -5290000,1,-0.0089,-0.011,0.00075,0.0081,0.0072,-0.068,0.0038,0.0014,-0.072,-0.002,-0.0053,5.1e-05,0,0,-0.11,0,0,0,0,0,0,0,0,0.0027,0.0027,0.00013,0.31,0.31,0.06,0.12,0.12,0.08,0.00032,0.00032,9.1e-06,0.04,0.04,0.0084,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -5390000,1,-0.0088,-0.011,0.00074,0.0076,0.011,-0.065,0.0046,0.0022,-0.067,-0.002,-0.0053,5.1e-05,0,0,-0.11,0,0,0,0,0,0,0,0,0.0029,0.0029,0.00014,0.36,0.36,0.057,0.15,0.15,0.079,0.00032,0.00032,9.1e-06,0.04,0.04,0.0078,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -5490000,1,-0.0089,-0.011,0.00074,0.0071,0.012,-0.06,0.0031,0.002,-0.065,-0.002,-0.0054,5e-05,0,0,-0.11,0,0,0,0,0,0,0,0,0.0023,0.0023,0.00012,0.28,0.28,0.056,0.11,0.11,0.079,0.00025,0.00025,8.3e-06,0.04,0.04,0.0073,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -5590000,1,-0.0089,-0.011,0.00066,0.0083,0.015,-0.053,0.004,0.0034,-0.058,-0.002,-0.0054,5e-05,0,0,-0.12,0,0,0,0,0,0,0,0,0.0025,0.0025,0.00013,0.33,0.33,0.053,0.15,0.15,0.078,0.00025,0.00025,8.3e-06,0.04,0.04,0.0068,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -5690000,1,-0.0089,-0.011,0.00055,0.0077,0.015,-0.052,0.0028,0.003,-0.055,-0.0019,-0.0054,4.8e-05,0,0,-0.12,0,0,0,0,0,0,0,0,0.002,0.002,0.00012,0.26,0.26,0.051,0.11,0.11,0.076,0.0002,0.0002,7.5e-06,0.04,0.04,0.0063,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -5790000,1,-0.0088,-0.011,0.0005,0.009,0.017,-0.049,0.0037,0.0046,-0.053,-0.0019,-0.0054,4.8e-05,0,0,-0.12,0,0,0,0,0,0,0,0,0.0021,0.0021,0.00013,0.3,0.3,0.049,0.14,0.14,0.077,0.0002,0.0002,7.5e-06,0.04,0.04,0.0059,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -5890000,1,-0.0089,-0.011,0.00053,0.0096,0.015,-0.048,0.0028,0.0037,-0.056,-0.0018,-0.0055,4.6e-05,0,0,-0.12,0,0,0,0,0,0,0,0,0.0017,0.0017,0.00012,0.24,0.24,0.047,0.1,0.1,0.075,0.00016,0.00016,6.8e-06,0.04,0.04,0.0055,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -5990000,1,-0.0089,-0.012,0.00049,0.011,0.016,-0.041,0.0038,0.0052,-0.05,-0.0018,-0.0055,4.6e-05,0,0,-0.12,0,0,0,0,0,0,0,0,0.0018,0.0018,0.00012,0.27,0.27,0.045,0.13,0.13,0.074,0.00016,0.00016,6.8e-06,0.04,0.04,0.0051,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -6090000,1,-0.0088,-0.011,0.0003,0.011,0.017,-0.039,0.005,0.0069,-0.048,-0.0018,-0.0055,4.6e-05,0,0,-0.12,0,0,0,0,0,0,0,0,0.0019,0.0019,0.00013,0.31,0.31,0.044,0.17,0.17,0.074,0.00016,0.00016,6.8e-06,0.04,0.04,0.0048,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -6190000,1,-0.009,-0.011,0.0003,0.009,0.016,-0.038,0.0039,0.0055,-0.047,-0.0018,-0.0055,4.4e-05,0,0,-0.12,0,0,0,0,0,0,0,0,0.0016,0.0016,0.00012,0.25,0.25,0.042,0.13,0.13,0.073,0.00013,0.00013,6.3e-06,0.04,0.04,0.0044,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -6290000,1,-0.0089,-0.011,0.00032,0.0083,0.018,-0.041,0.0047,0.0072,-0.053,-0.0018,-0.0055,4.4e-05,0,0,-0.12,0,0,0,0,0,0,0,0,0.0017,0.0017,0.00012,0.29,0.29,0.04,0.16,0.16,0.072,0.00013,0.00013,6.3e-06,0.04,0.04,0.0041,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 -6390000,-0.29,0.026,-0.0063,0.96,-0.0093,0.0087,-0.042,0.0042,0.005,-0.056,-0.0017,-0.0055,4.3e-05,0,0,-0.12,-0.094,-0.021,0.51,0.072,-0.027,-0.063,0,0,0.0013,0.0013,0.066,0.21,0.21,0.039,0.12,0.12,0.072,0.0001,0.0001,5.8e-06,0.04,0.04,0.0039,0.0014,0.00036,0.0014,0.0014,0.0011,0.0014,1,1 -6490000,-0.29,0.026,-0.0063,0.96,-0.029,0.0026,-0.039,0.0049,0.0043,-0.053,-0.0016,-0.0054,4.3e-05,0,0,-0.13,-0.099,-0.022,0.51,0.076,-0.028,-0.067,0,0,0.0013,0.0013,0.056,0.21,0.21,0.037,0.15,0.15,0.07,0.0001,0.0001,5.8e-06,0.04,0.04,0.0036,0.0013,0.00021,0.0013,0.0013,0.00097,0.0013,1,1 -6590000,-0.29,0.027,-0.0063,0.96,-0.05,-0.0074,-0.041,0.0039,0.0026,-0.056,-0.0016,-0.0053,4.3e-05,-0.00018,8.8e-05,-0.13,-0.1,-0.022,0.51,0.077,-0.029,-0.068,0,0,0.0013,0.0013,0.053,0.21,0.21,0.036,0.18,0.18,0.069,0.0001,0.0001,5.8e-06,0.04,0.04,0.0034,0.0013,0.00016,0.0013,0.0013,0.00094,0.0013,1,1 -6690000,-0.29,0.027,-0.0062,0.96,-0.071,-0.017,-0.043,-0.00011,-0.00017,-0.057,-0.0015,-0.0052,4.2e-05,-0.0003,0.00018,-0.13,-0.1,-0.022,0.5,0.077,-0.029,-0.068,0,0,0.0013,0.0013,0.052,0.22,0.22,0.034,0.22,0.22,0.068,0.0001,0.0001,5.8e-06,0.04,0.04,0.0032,0.0013,0.00014,0.0013,0.0013,0.00093,0.0013,1,1 -6790000,-0.29,0.027,-0.0063,0.96,-0.093,-0.027,-0.04,-0.0032,-0.0049,-0.057,-0.0015,-0.0051,4.2e-05,-0.00065,0.00033,-0.13,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0013,0.0013,0.051,0.22,0.22,0.033,0.26,0.26,0.068,0.0001,0.0001,5.8e-06,0.04,0.04,0.003,0.0013,0.00013,0.0013,0.0013,0.00092,0.0013,1,1 -6890000,-0.29,0.027,-0.0061,0.96,-0.12,-0.034,-0.036,-0.011,-0.0093,-0.054,-0.0014,-0.005,4.2e-05,-0.00078,0.00034,-0.13,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0013,0.0013,0.051,0.24,0.23,0.032,0.3,0.3,0.067,0.0001,0.0001,5.8e-06,0.04,0.04,0.0028,0.0013,0.00011,0.0013,0.0013,0.00092,0.0013,1,1 -6990000,-0.29,0.027,-0.006,0.96,-0.14,-0.042,-0.034,-0.02,-0.014,-0.054,-0.0014,-0.0049,4.3e-05,-0.00095,0.00036,-0.13,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0013,0.0013,0.05,0.25,0.25,0.031,0.35,0.35,0.066,0.0001,9.9e-05,5.8e-06,0.04,0.04,0.0026,0.0013,0.00011,0.0013,0.0013,0.00091,0.0013,1,1 -7090000,-0.29,0.027,-0.0059,0.96,-0.16,-0.053,-0.035,-0.034,-0.019,-0.055,-0.0014,-0.0049,4.3e-05,-0.00097,0.00032,-0.13,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0014,0.0013,0.05,0.27,0.26,0.03,0.41,0.41,0.066,9.9e-05,9.8e-05,5.8e-06,0.04,0.04,0.0025,0.0013,0.0001,0.0013,0.0013,0.00091,0.0013,1,1 -7190000,-0.29,0.027,-0.0059,0.96,-0.19,-0.064,-0.033,-0.048,-0.028,-0.057,-0.0013,-0.0048,4.2e-05,-0.0011,0.0005,-0.13,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0014,0.0013,0.05,0.28,0.28,0.029,0.46,0.46,0.065,9.7e-05,9.7e-05,5.8e-06,0.04,0.04,0.0023,0.0013,9.8e-05,0.0013,0.0013,0.00091,0.0013,1,1 -7290000,-0.29,0.027,-0.0059,0.96,-0.21,-0.073,-0.03,-0.07,-0.034,-0.053,-0.0013,-0.0048,4.3e-05,-0.00096,0.00032,-0.13,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0014,0.0014,0.05,0.31,0.3,0.028,0.52,0.52,0.064,9.6e-05,9.5e-05,5.8e-06,0.04,0.04,0.0022,0.0013,9.4e-05,0.0013,0.0013,0.00091,0.0013,1,1 -7390000,-0.29,0.027,-0.0057,0.96,-0.24,-0.08,-0.028,-0.095,-0.039,-0.051,-0.0014,-0.0049,4.3e-05,-0.00079,0.00014,-0.13,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0014,0.0014,0.049,0.33,0.33,0.027,0.59,0.59,0.064,9.4e-05,9.4e-05,5.8e-06,0.04,0.04,0.0021,0.0013,9.2e-05,0.0013,0.0013,0.00091,0.0013,1,1 -7490000,-0.29,0.027,-0.0057,0.96,-0.26,-0.089,-0.022,-0.11,-0.047,-0.044,-0.0014,-0.0047,4.7e-05,-0.0012,-4.9e-05,-0.13,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0014,0.0014,0.049,0.36,0.35,0.026,0.66,0.66,0.063,9.2e-05,9.1e-05,5.7e-06,0.04,0.04,0.0019,0.0013,8.9e-05,0.0013,0.0013,0.00091,0.0013,1,1 -7590000,-0.29,0.027,-0.0057,0.96,-0.29,-0.1,-0.018,-0.13,-0.057,-0.039,-0.0014,-0.0046,4.8e-05,-0.0014,-9.2e-05,-0.13,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0014,0.0014,0.049,0.39,0.38,0.025,0.73,0.73,0.062,9e-05,8.9e-05,5.7e-06,0.04,0.04,0.0018,0.0013,8.7e-05,0.0013,0.0013,0.00091,0.0013,1,1 -7690000,-0.29,0.027,-0.0057,0.96,-0.31,-0.11,-0.017,-0.16,-0.071,-0.034,-0.0013,-0.0046,4.8e-05,-0.0015,-5.2e-05,-0.13,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0015,0.0014,0.049,0.42,0.41,0.025,0.82,0.81,0.062,8.7e-05,8.6e-05,5.7e-06,0.04,0.04,0.0017,0.0013,8.5e-05,0.0013,0.0013,0.0009,0.0013,1,1 -7790000,-0.29,0.028,-0.0057,0.96,-0.026,-0.0088,-0.019,-0.16,-0.074,-0.039,-0.0012,-0.0043,4.7e-05,-0.0015,1.4e-05,-0.13,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0015,0.0014,0.049,25,25,0.024,1e+02,1e+02,0.061,8.4e-05,8.3e-05,5.7e-06,0.04,0.04,0.0017,0.0013,8.4e-05,0.0013,0.0013,0.0009,0.0013,1,1 -7890000,-0.29,0.028,-0.0057,0.96,-0.052,-0.019,-0.02,-0.17,-0.075,-0.042,-0.0012,-0.0043,4.6e-05,-0.0015,1.4e-05,-0.13,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0015,0.0015,0.049,25,25,0.023,1e+02,1e+02,0.06,8.1e-05,8e-05,5.7e-06,0.04,0.04,0.0016,0.0013,8.2e-05,0.0013,0.0013,0.0009,0.0013,1,1 -7990000,-0.29,0.028,-0.0056,0.96,-0.079,-0.028,-0.016,-0.17,-0.077,-0.039,-0.0012,-0.0044,4.6e-05,-0.0015,1.4e-05,-0.13,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0015,0.0015,0.049,25,25,0.022,51,51,0.059,7.8e-05,7.7e-05,5.7e-06,0.04,0.04,0.0015,0.0013,8.1e-05,0.0013,0.0013,0.0009,0.0013,1,1 -8090000,-0.29,0.028,-0.0056,0.96,-0.11,-0.038,-0.016,-0.18,-0.08,-0.041,-0.0011,-0.0045,4e-05,-0.0015,1.4e-05,-0.13,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0015,0.0015,0.049,25,25,0.022,52,52,0.059,7.5e-05,7.4e-05,5.7e-06,0.04,0.04,0.0014,0.0013,8e-05,0.0013,0.0013,0.0009,0.0013,1,1 -8190000,-0.29,0.028,-0.0058,0.96,-0.14,-0.049,-0.011,-0.18,-0.082,-0.034,-0.00097,-0.0045,3.6e-05,-0.0015,1.4e-05,-0.13,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0016,0.0015,0.049,25,25,0.021,35,35,0.058,7.2e-05,7e-05,5.7e-06,0.04,0.04,0.0013,0.0013,7.9e-05,0.0013,0.0013,0.0009,0.0013,1,1 -8290000,-0.29,0.028,-0.0058,0.96,-0.16,-0.059,-0.01,-0.2,-0.087,-0.034,-0.0011,-0.0048,3.4e-05,-0.0015,1.4e-05,-0.13,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0016,0.0015,0.049,25,25,0.02,37,37,0.057,6.8e-05,6.6e-05,5.7e-06,0.04,0.04,0.0013,0.0013,7.8e-05,0.0013,0.0013,0.0009,0.0013,1,1 -8390000,-0.29,0.028,-0.0058,0.96,-0.18,-0.065,-0.0093,-0.2,-0.089,-0.032,-0.0011,-0.0049,3.2e-05,-0.0015,1.4e-05,-0.13,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0016,0.0015,0.049,24,24,0.02,28,28,0.057,6.5e-05,6.3e-05,5.7e-06,0.04,0.04,0.0012,0.0013,7.7e-05,0.0013,0.0013,0.0009,0.0013,1,1 -8490000,-0.29,0.027,-0.0055,0.96,-0.21,-0.076,-0.01,-0.22,-0.096,-0.037,-0.0012,-0.005,3.5e-05,-0.0015,1.4e-05,-0.13,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0016,0.0015,0.049,24,24,0.019,30,30,0.056,6.1e-05,6e-05,5.7e-06,0.04,0.04,0.0012,0.0013,7.7e-05,0.0013,0.0013,0.0009,0.0013,1,1 -8590000,-0.29,0.028,-0.0056,0.96,-0.23,-0.083,-0.0052,-0.23,-0.098,-0.032,-0.0011,-0.0049,3.4e-05,-0.0015,1.4e-05,-0.13,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0016,0.0016,0.049,23,23,0.019,25,25,0.055,5.8e-05,5.6e-05,5.7e-06,0.04,0.04,0.0011,0.0013,7.6e-05,0.0013,0.0013,0.0009,0.0013,1,1 -8690000,-0.29,0.028,-0.0056,0.96,-0.26,-0.092,-0.0071,-0.25,-0.11,-0.033,-0.0012,-0.005,3.4e-05,-0.0015,1.4e-05,-0.13,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0016,0.0016,0.049,23,23,0.018,27,27,0.055,5.5e-05,5.3e-05,5.7e-06,0.04,0.04,0.0011,0.0013,7.5e-05,0.0013,0.0013,0.0009,0.0013,1,1 -8790000,-0.29,0.028,-0.0056,0.96,-0.27,-0.095,-0.0068,-0.25,-0.11,-0.03,-0.0011,-0.0051,3e-05,-0.0015,1.4e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0016,0.0016,0.049,21,21,0.018,23,23,0.055,5.2e-05,5e-05,5.7e-06,0.04,0.04,0.001,0.0013,7.5e-05,0.0013,0.0013,0.0009,0.0013,1,1 -8890000,-0.29,0.028,-0.0056,0.96,-0.3,-0.11,-0.0022,-0.28,-0.12,-0.024,-0.0012,-0.005,3.4e-05,-0.0015,1.4e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0016,0.0016,0.049,21,21,0.017,26,26,0.054,4.9e-05,4.7e-05,5.7e-06,0.04,0.04,0.00098,0.0013,7.4e-05,0.0013,0.0013,0.0009,0.0013,1,1 -8990000,-0.29,0.028,-0.0054,0.96,-0.31,-0.12,-0.0011,-0.28,-0.12,-0.027,-0.0012,-0.0048,3.9e-05,-0.0015,1.4e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.069,0,0,0.0016,0.0016,0.049,19,19,0.017,23,23,0.054,4.6e-05,4.4e-05,5.7e-06,0.04,0.04,0.00094,0.0013,7.4e-05,0.0013,0.0013,0.0009,0.0013,1,1 -9090000,-0.29,0.028,-0.0052,0.96,-0.33,-0.13,-0.0023,-0.31,-0.13,-0.027,-0.0014,-0.005,4.2e-05,-0.0015,1.4e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0017,0.0016,0.049,19,19,0.016,25,25,0.053,4.3e-05,4.2e-05,5.7e-06,0.04,0.04,0.0009,0.0013,7.3e-05,0.0013,0.0013,0.0009,0.0013,1,1 -9190000,-0.29,0.028,-0.005,0.96,-0.34,-0.13,-0.0016,-0.31,-0.13,-0.027,-0.0015,-0.005,4.5e-05,-0.0015,1.4e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.069,0,0,0.0017,0.0016,0.049,17,17,0.016,22,22,0.052,4e-05,3.9e-05,5.7e-06,0.04,0.04,0.00087,0.0013,7.3e-05,0.0013,0.0013,0.0009,0.0013,1,1 -9290000,-0.29,0.028,-0.0049,0.96,-0.37,-0.15,0.00027,-0.34,-0.15,-0.024,-0.0015,-0.0049,4.6e-05,-0.0015,1.4e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.069,0,0,0.0017,0.0016,0.049,17,17,0.016,25,25,0.052,3.8e-05,3.6e-05,5.7e-06,0.04,0.04,0.00083,0.0013,7.3e-05,0.0013,0.0013,0.0009,0.0013,1,1 -9390000,-0.29,0.028,-0.005,0.96,-0.38,-0.14,0.0016,-0.34,-0.14,-0.024,-0.0013,-0.0049,4.2e-05,-0.0015,1.4e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.068,0,0,0.0017,0.0016,0.049,15,15,0.015,22,22,0.052,3.6e-05,3.4e-05,5.7e-06,0.04,0.04,0.0008,0.0013,7.2e-05,0.0013,0.0013,0.0009,0.0013,1,1 -9490000,-0.29,0.028,-0.0049,0.96,-0.4,-0.15,0.0032,-0.37,-0.15,-0.022,-0.0014,-0.005,4.2e-05,-0.0015,1.4e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.069,0,0,0.0017,0.0016,0.049,15,15,0.015,25,25,0.051,3.4e-05,3.2e-05,5.7e-06,0.04,0.04,0.00077,0.0013,7.2e-05,0.0013,0.0013,0.0009,0.0013,1,1 -9590000,-0.29,0.028,-0.0053,0.96,-0.39,-0.14,0.0033,-0.36,-0.15,-0.023,-0.0012,-0.0051,3.4e-05,-0.0015,1.4e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.069,0,0,0.0017,0.0016,0.049,13,13,0.015,22,22,0.05,3.1e-05,3e-05,5.7e-06,0.04,0.04,0.00075,0.0013,7.2e-05,0.0013,0.0013,0.0009,0.0013,1,1 -9690000,-0.29,0.028,-0.0053,0.96,-0.42,-0.15,0.0064,-0.4,-0.16,-0.021,-0.0012,-0.0051,3.2e-05,-0.0015,1.4e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.069,0,0,0.0017,0.0016,0.049,14,14,0.014,24,24,0.05,3e-05,2.8e-05,5.7e-06,0.04,0.04,0.00072,0.0013,7.1e-05,0.0013,0.0013,0.0009,0.0013,1,1 -9790000,-0.29,0.028,-0.0056,0.96,-0.45,-0.15,0.005,-0.44,-0.17,-0.022,-0.0011,-0.0053,2.5e-05,-0.0015,1.4e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.069,0,0,0.0017,0.0016,0.049,14,14,0.014,27,27,0.05,2.8e-05,2.7e-05,5.7e-06,0.04,0.04,0.0007,0.0013,7.1e-05,0.0013,0.0013,0.0009,0.0013,1,1 -9890000,-0.29,0.028,-0.0055,0.96,-0.45,-0.15,0.0065,-0.43,-0.16,-0.022,-0.0011,-0.0052,2.7e-05,-0.0015,1.4e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.069,0,0,0.0016,0.0016,0.049,12,12,0.014,24,24,0.049,2.6e-05,2.5e-05,5.7e-06,0.04,0.04,0.00067,0.0013,7.1e-05,0.0013,0.0013,0.0009,0.0013,1,1 -9990000,-0.29,0.028,-0.0057,0.96,-0.47,-0.15,0.0072,-0.47,-0.17,-0.024,-0.001,-0.0053,2.1e-05,-0.0015,1.4e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.069,0,0,0.0016,0.0016,0.049,12,12,0.013,27,27,0.049,2.5e-05,2.4e-05,5.7e-06,0.04,0.04,0.00065,0.0013,7.1e-05,0.0013,0.0013,0.0009,0.0013,1,1 -10090000,-0.29,0.028,-0.0059,0.96,-0.47,-0.14,0.0084,-0.45,-0.16,-0.022,-0.00088,-0.0054,1.6e-05,-0.0015,1.4e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.069,0,0,0.0016,0.0016,0.049,10,10,0.013,23,23,0.049,2.3e-05,2.2e-05,5.7e-06,0.04,0.04,0.00063,0.0013,7e-05,0.0013,0.0013,0.0009,0.0013,1,1 -10190000,-0.29,0.028,-0.0062,0.96,-0.5,-0.14,0.0094,-0.5,-0.17,-0.023,-0.00073,-0.0054,1.1e-05,-0.0015,1.4e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.069,0,0,0.0016,0.0016,0.049,10,10,0.013,26,26,0.048,2.2e-05,2.1e-05,5.7e-06,0.04,0.04,0.00061,0.0013,7e-05,0.0013,0.0013,0.0009,0.0013,1,1 -10290000,-0.29,0.028,-0.0061,0.96,-0.49,-0.14,0.0084,-0.47,-0.17,-0.022,-0.00077,-0.0053,1.3e-05,-0.0015,1.4e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.069,0,0,0.0016,0.0016,0.049,8.9,8.9,0.013,23,23,0.048,2.1e-05,2e-05,5.7e-06,0.04,0.04,0.0006,0.0013,7e-05,0.0013,0.0013,0.0009,0.0013,1,1 -10390000,-0.29,0.028,-0.0061,0.96,-0.012,-0.0088,-0.0026,-0.00011,-0.00031,-0.022,-0.0008,-0.0053,1.5e-05,-0.002,-0.00021,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.069,0,0,0.0016,0.0015,0.049,0.25,0.25,0.56,0.25,0.25,0.048,1.9e-05,1.9e-05,5.7e-06,0.04,0.04,0.00058,0.0013,7e-05,0.0013,0.0013,0.0009,0.0013,1,1 -10490000,-0.29,0.028,-0.0062,0.96,-0.042,-0.016,0.0064,-0.0028,-0.0015,-0.017,-0.00072,-0.0053,1.1e-05,-0.0018,0.00035,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.069,0,0,0.0016,0.0015,0.049,0.26,0.26,0.55,0.26,0.26,0.058,1.8e-05,1.7e-05,5.7e-06,0.04,0.04,0.00057,0.0013,6.9e-05,0.0013,0.0013,0.0009,0.0013,1,1 -10590000,-0.29,0.028,-0.006,0.96,-0.053,-0.015,0.012,-0.0033,-0.0011,-0.016,-0.00079,-0.0053,1.4e-05,-0.0011,-0.00025,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.069,0,0,0.0016,0.0015,0.049,0.13,0.13,0.27,0.26,0.26,0.056,1.7e-05,1.6e-05,5.7e-06,0.039,0.04,0.00056,0.0013,6.9e-05,0.0013,0.0013,0.0009,0.0013,1,1 -10690000,-0.29,0.028,-0.0061,0.96,-0.083,-0.02,0.015,-0.01,-0.0028,-0.013,-0.00076,-0.0053,1.3e-05,-0.0012,-5.1e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.069,0,0,0.0016,0.0015,0.049,0.14,0.14,0.26,0.27,0.27,0.065,1.6e-05,1.6e-05,5.7e-06,0.039,0.039,0.00055,0.0013,6.9e-05,0.0013,0.0013,0.0009,0.0013,1,1 -10790000,-0.29,0.027,-0.006,0.96,-0.081,-0.023,0.013,8.3e-07,-0.0018,-0.011,-0.00078,-0.0053,1.1e-05,0.0012,-0.0013,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.069,0,0,0.0015,0.0015,0.049,0.096,0.096,0.17,0.13,0.13,0.062,1.5e-05,1.5e-05,5.7e-06,0.039,0.039,0.00054,0.0013,6.9e-05,0.0013,0.0013,0.00089,0.0013,1,1 -10890000,-0.29,0.027,-0.0058,0.96,-0.11,-0.033,0.0089,-0.0094,-0.0047,-0.015,-0.00087,-0.0053,1.5e-05,0.0011,-0.0019,-0.14,-0.1,-0.022,0.5,0.078,-0.029,-0.069,0,0,0.0015,0.0015,0.049,0.11,0.11,0.16,0.14,0.14,0.068,1.5e-05,1.4e-05,5.7e-06,0.039,0.039,0.00053,0.0013,6.8e-05,0.0013,0.0013,0.00089,0.0013,1,1 -10990000,-0.29,0.027,-0.0058,0.96,-0.097,-0.034,0.015,-0.0034,-0.0023,-0.009,-0.00089,-0.0055,1.1e-05,0.0064,-0.0033,-0.14,-0.1,-0.023,0.5,0.079,-0.029,-0.069,0,0,0.0014,0.0014,0.048,0.084,0.085,0.12,0.091,0.091,0.065,1.4e-05,1.3e-05,5.7e-06,0.038,0.038,0.00053,0.0013,6.8e-05,0.0013,0.0013,0.00088,0.0013,1,1 -11090000,-0.29,0.027,-0.0062,0.96,-0.12,-0.042,0.019,-0.015,-0.0059,-0.0052,-0.00078,-0.0054,7.9e-06,0.0061,-0.0027,-0.14,-0.1,-0.023,0.5,0.079,-0.03,-0.069,0,0,0.0014,0.0014,0.048,0.098,0.099,0.11,0.097,0.097,0.069,1.3e-05,1.2e-05,5.7e-06,0.038,0.038,0.00052,0.0013,6.8e-05,0.0013,0.0013,0.00088,0.0013,1,1 -11190000,-0.29,0.025,-0.0063,0.96,-0.1,-0.037,0.026,-0.0065,-0.0032,0.0011,-0.00077,-0.0056,2.6e-06,0.013,-0.0046,-0.14,-0.1,-0.023,0.5,0.079,-0.03,-0.069,0,0,0.0013,0.0013,0.048,0.081,0.081,0.083,0.072,0.072,0.066,1.2e-05,1.2e-05,5.7e-06,0.037,0.037,0.00052,0.0013,6.8e-05,0.0013,0.0013,0.00087,0.0013,1,1 -11290000,-0.29,0.025,-0.0064,0.96,-0.13,-0.04,0.025,-0.018,-0.007,0.0011,-0.00077,-0.0056,1.3e-06,0.014,-0.0046,-0.14,-0.1,-0.023,0.5,0.079,-0.03,-0.069,0,0,0.0013,0.0013,0.048,0.096,0.096,0.077,0.078,0.078,0.069,1.2e-05,1.1e-05,5.7e-06,0.037,0.037,0.00052,0.0013,6.7e-05,0.0013,0.0013,0.00087,0.0013,1,1 -11390000,-0.29,0.024,-0.0063,0.96,-0.11,-0.034,0.016,-0.0099,-0.0042,-0.0078,-0.00081,-0.0057,-1.9e-06,0.021,-0.0066,-0.14,-0.1,-0.023,0.5,0.08,-0.03,-0.069,0,0,0.0012,0.0011,0.048,0.079,0.08,0.062,0.062,0.062,0.066,1.1e-05,1e-05,5.6e-06,0.036,0.036,0.00051,0.0013,6.7e-05,0.0013,0.0012,0.00086,0.0013,1,1 -11490000,-0.29,0.024,-0.0062,0.96,-0.13,-0.038,0.02,-0.022,-0.0079,-0.0018,-0.0008,-0.0057,-1.6e-06,0.02,-0.0066,-0.14,-0.1,-0.023,0.5,0.08,-0.03,-0.069,0,0,0.0012,0.0011,0.048,0.094,0.095,0.057,0.069,0.069,0.067,1e-05,9.9e-06,5.7e-06,0.036,0.036,0.00051,0.0013,6.7e-05,0.0013,0.0012,0.00086,0.0013,1,1 -11590000,-0.29,0.023,-0.0063,0.96,-0.11,-0.031,0.019,-0.012,-0.0048,-0.0032,-0.00083,-0.0058,-5.1e-06,0.027,-0.0087,-0.14,-0.1,-0.023,0.5,0.08,-0.03,-0.069,0,0,0.001,0.001,0.048,0.078,0.079,0.048,0.056,0.056,0.065,9.8e-06,9.3e-06,5.6e-06,0.035,0.035,0.0005,0.0012,6.6e-05,0.0013,0.0012,0.00084,0.0013,1,1 -11690000,-0.29,0.022,-0.0063,0.96,-0.12,-0.038,0.019,-0.024,-0.0082,-0.0046,-0.00085,-0.0059,-4.8e-06,0.027,-0.0087,-0.14,-0.1,-0.023,0.5,0.08,-0.03,-0.069,0,0,0.001,0.001,0.048,0.093,0.093,0.044,0.063,0.063,0.066,9.3e-06,8.9e-06,5.6e-06,0.035,0.035,0.0005,0.0012,6.6e-05,0.0013,0.0012,0.00084,0.0013,1,1 -11790000,-0.29,0.021,-0.0062,0.96,-0.097,-0.035,0.02,-0.014,-0.0068,-0.0018,-0.00093,-0.0059,-6e-06,0.033,-0.011,-0.14,-0.1,-0.023,0.5,0.081,-0.03,-0.07,0,0,0.00091,0.00088,0.047,0.076,0.076,0.037,0.053,0.053,0.063,8.8e-06,8.4e-06,5.6e-06,0.034,0.034,0.00049,0.0012,6.6e-05,0.0013,0.0012,0.00083,0.0013,1,1 -11890000,-0.29,0.021,-0.0063,0.96,-0.11,-0.039,0.018,-0.024,-0.01,-0.0011,-0.00091,-0.0059,-7.3e-06,0.033,-0.011,-0.14,-0.1,-0.023,0.5,0.081,-0.03,-0.07,0,0,0.00091,0.00088,0.047,0.089,0.09,0.034,0.06,0.06,0.063,8.4e-06,8e-06,5.6e-06,0.034,0.034,0.00049,0.0012,6.6e-05,0.0013,0.0012,0.00083,0.0013,1,1 -11990000,-0.29,0.02,-0.0065,0.96,-0.091,-0.03,0.016,-0.017,-0.0068,-0.0048,-0.00092,-0.006,-9e-06,0.039,-0.012,-0.14,-0.11,-0.023,0.5,0.082,-0.03,-0.07,0,0,0.00081,0.00079,0.047,0.077,0.077,0.03,0.062,0.062,0.061,8e-06,7.6e-06,5.6e-06,0.034,0.034,0.00049,0.0012,6.5e-05,0.0012,0.0012,0.00082,0.0013,1,1 -12090000,-0.29,0.02,-0.0065,0.96,-0.1,-0.032,0.019,-0.027,-0.0098,0.0013,-0.00089,-0.006,-9.7e-06,0.039,-0.012,-0.14,-0.11,-0.023,0.5,0.082,-0.03,-0.07,0,0,0.00081,0.00079,0.047,0.089,0.089,0.027,0.071,0.071,0.06,7.6e-06,7.3e-06,5.6e-06,0.034,0.034,0.00049,0.0012,6.5e-05,0.0012,0.0012,0.00081,0.0012,1,1 -12190000,-0.29,0.019,-0.0065,0.96,-0.083,-0.02,0.018,-0.014,-0.0035,0.0032,-0.00085,-0.006,-1.3e-05,0.044,-0.013,-0.14,-0.11,-0.023,0.5,0.082,-0.03,-0.07,0,0,0.00072,0.0007,0.047,0.071,0.071,0.024,0.057,0.057,0.058,7.3e-06,6.9e-06,5.6e-06,0.033,0.033,0.00049,0.0012,6.5e-05,0.0012,0.0012,0.0008,0.0012,1,1 -12290000,-0.29,0.019,-0.0067,0.96,-0.09,-0.019,0.017,-0.023,-0.0053,0.0042,-0.00082,-0.006,-1.4e-05,0.044,-0.014,-0.14,-0.11,-0.023,0.5,0.082,-0.03,-0.07,0,0,0.00072,0.00071,0.047,0.081,0.082,0.022,0.065,0.065,0.058,7e-06,6.7e-06,5.6e-06,0.033,0.033,0.00049,0.0012,6.5e-05,0.0012,0.0012,0.0008,0.0012,1,1 -12390000,-0.29,0.019,-0.0067,0.96,-0.073,-0.014,0.015,-0.013,-0.003,-0.0017,-0.00081,-0.006,-1.7e-05,0.048,-0.015,-0.14,-0.11,-0.023,0.5,0.082,-0.031,-0.07,0,0,0.00065,0.00064,0.047,0.066,0.066,0.02,0.054,0.054,0.056,6.7e-06,6.4e-06,5.6e-06,0.033,0.032,0.00048,0.0012,6.4e-05,0.0012,0.0012,0.00079,0.0012,1,1 -12490000,-0.29,0.019,-0.0067,0.96,-0.08,-0.015,0.02,-0.021,-0.0044,0.00042,-0.00079,-0.006,-1.7e-05,0.048,-0.015,-0.14,-0.11,-0.023,0.5,0.082,-0.031,-0.07,0,0,0.00065,0.00064,0.047,0.075,0.075,0.018,0.062,0.062,0.055,6.4e-06,6.1e-06,5.6e-06,0.033,0.032,0.00048,0.0012,6.4e-05,0.0012,0.0012,0.00079,0.0012,1,1 -12590000,-0.29,0.018,-0.0066,0.96,-0.065,-0.013,0.021,-0.01,-0.0041,0.0023,-0.00079,-0.006,-2e-05,0.05,-0.017,-0.14,-0.11,-0.023,0.5,0.083,-0.031,-0.07,0,0,0.0006,0.00059,0.047,0.061,0.061,0.017,0.052,0.052,0.054,6.2e-06,5.9e-06,5.6e-06,0.032,0.032,0.00048,0.0012,6.4e-05,0.0012,0.0012,0.00078,0.0012,1,1 -12690000,-0.29,0.018,-0.0066,0.96,-0.072,-0.011,0.021,-0.017,-0.0053,0.004,-0.00078,-0.006,-2.1e-05,0.05,-0.017,-0.14,-0.11,-0.023,0.5,0.083,-0.031,-0.07,0,0,0.0006,0.00059,0.046,0.069,0.07,0.015,0.059,0.059,0.053,5.9e-06,5.6e-06,5.6e-06,0.032,0.032,0.00048,0.0012,6.4e-05,0.0012,0.0012,0.00078,0.0012,1,1 -12790000,-0.29,0.018,-0.0064,0.96,-0.056,-0.017,0.023,-0.01,-0.0082,0.0062,-0.00083,-0.006,-2.1e-05,0.053,-0.018,-0.14,-0.11,-0.023,0.5,0.083,-0.031,-0.07,0,0,0.00056,0.00056,0.046,0.061,0.061,0.014,0.061,0.061,0.051,5.7e-06,5.4e-06,5.6e-06,0.032,0.032,0.00048,0.0012,6.4e-05,0.0012,0.0012,0.00077,0.0012,1,1 -12890000,-0.29,0.018,-0.0064,0.96,-0.061,-0.018,0.024,-0.016,-0.01,0.0093,-0.00085,-0.006,-2e-05,0.053,-0.018,-0.14,-0.11,-0.023,0.5,0.083,-0.031,-0.07,0,0,0.00056,0.00056,0.046,0.069,0.069,0.013,0.07,0.07,0.051,5.5e-06,5.2e-06,5.6e-06,0.032,0.032,0.00048,0.0012,6.4e-05,0.0012,0.0012,0.00077,0.0012,1,1 -12990000,-0.29,0.017,-0.0064,0.96,-0.05,-0.014,0.024,-0.008,-0.0069,0.011,-0.00089,-0.006,-1.9e-05,0.054,-0.018,-0.14,-0.11,-0.023,0.5,0.083,-0.031,-0.07,0,0,0.00052,0.00052,0.046,0.055,0.055,0.012,0.057,0.057,0.05,5.3e-06,5e-06,5.6e-06,0.032,0.031,0.00048,0.0012,6.3e-05,0.0012,0.0012,0.00076,0.0012,1,1 -13090000,-0.29,0.017,-0.0064,0.96,-0.054,-0.016,0.022,-0.013,-0.0087,0.0096,-0.00091,-0.0059,-1.7e-05,0.055,-0.018,-0.14,-0.11,-0.023,0.5,0.083,-0.031,-0.07,0,0,0.00052,0.00052,0.046,0.062,0.062,0.011,0.065,0.065,0.049,5.1e-06,4.8e-06,5.6e-06,0.032,0.031,0.00048,0.0012,6.3e-05,0.0012,0.0012,0.00076,0.0012,1,1 -13190000,-0.29,0.017,-0.0063,0.96,-0.045,-0.016,0.021,-0.0098,-0.0095,0.01,-0.00093,-0.0059,-1.8e-05,0.056,-0.019,-0.14,-0.11,-0.023,0.5,0.083,-0.031,-0.07,0,0,0.0005,0.0005,0.046,0.055,0.055,0.011,0.066,0.066,0.047,4.9e-06,4.6e-06,5.6e-06,0.032,0.031,0.00048,0.0012,6.3e-05,0.0012,0.0012,0.00076,0.0012,1,1 -13290000,-0.29,0.017,-0.0063,0.96,-0.049,-0.016,0.019,-0.015,-0.011,0.0098,-0.00092,-0.0059,-1.8e-05,0.056,-0.019,-0.14,-0.11,-0.023,0.5,0.083,-0.031,-0.07,0,0,0.0005,0.0005,0.046,0.061,0.061,0.01,0.075,0.075,0.047,4.8e-06,4.5e-06,5.6e-06,0.032,0.031,0.00048,0.0012,6.3e-05,0.0012,0.0012,0.00076,0.0012,1,1 -13390000,-0.29,0.017,-0.0063,0.96,-0.04,-0.012,0.019,-0.0075,-0.0073,0.011,-0.0009,-0.0059,-1.9e-05,0.057,-0.019,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.07,0,0,0.00048,0.00048,0.046,0.049,0.049,0.0094,0.06,0.06,0.046,4.6e-06,4.3e-06,5.6e-06,0.031,0.031,0.00047,0.0012,6.3e-05,0.0012,0.0012,0.00075,0.0012,1,1 -13490000,-0.29,0.017,-0.0063,0.96,-0.043,-0.015,0.018,-0.012,-0.0087,0.0069,-0.0009,-0.0059,-1.9e-05,0.057,-0.019,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.07,0,0,0.00048,0.00048,0.046,0.054,0.054,0.009,0.068,0.068,0.045,4.5e-06,4.1e-06,5.6e-06,0.031,0.031,0.00047,0.0012,6.3e-05,0.0012,0.0012,0.00075,0.0012,1,1 -13590000,-0.29,0.017,-0.0063,0.96,-0.035,-0.011,0.02,-0.0037,-0.0059,0.0055,-0.00088,-0.0059,-2.1e-05,0.059,-0.02,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.07,0,0,0.00046,0.00046,0.046,0.044,0.044,0.0086,0.055,0.055,0.044,4.3e-06,4e-06,5.6e-06,0.031,0.031,0.00047,0.0012,6.2e-05,0.0012,0.0012,0.00075,0.0012,1,1 -13690000,-0.29,0.017,-0.0063,0.96,-0.037,-0.01,0.02,-0.0072,-0.0071,0.0084,-0.00089,-0.0059,-2e-05,0.059,-0.02,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.07,0,0,0.00046,0.00046,0.046,0.049,0.049,0.0082,0.063,0.063,0.044,4.2e-06,3.9e-06,5.6e-06,0.031,0.031,0.00047,0.0012,6.2e-05,0.0012,0.0012,0.00074,0.0012,1,1 -13790000,-0.29,0.016,-0.0063,0.96,-0.029,-0.0077,0.02,0.00048,-0.0037,0.008,-0.00088,-0.0059,-2.1e-05,0.06,-0.02,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.07,0,0,0.00045,0.00045,0.046,0.041,0.041,0.0078,0.052,0.052,0.042,4.1e-06,3.7e-06,5.6e-06,0.031,0.031,0.00047,0.0012,6.2e-05,0.0012,0.0012,0.00074,0.0012,1,1 -13890000,-0.29,0.016,-0.0062,0.96,-0.031,-0.0092,0.022,-0.0024,-0.0047,0.01,-0.00091,-0.006,-1.9e-05,0.059,-0.02,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.07,0,0,0.00045,0.00045,0.046,0.045,0.045,0.0076,0.059,0.059,0.042,4e-06,3.6e-06,5.6e-06,0.031,0.031,0.00047,0.0012,6.2e-05,0.0012,0.0012,0.00074,0.0012,1,1 -13990000,-0.29,0.016,-0.0062,0.96,-0.03,-0.013,0.021,-0.00087,-0.005,0.0094,-0.00093,-0.0059,-1.9e-05,0.06,-0.02,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.07,0,0,0.00044,0.00044,0.046,0.038,0.038,0.0073,0.05,0.05,0.041,3.8e-06,3.5e-06,5.6e-06,0.031,0.031,0.00047,0.0012,6.2e-05,0.0012,0.0012,0.00074,0.0012,1,1 -14090000,-0.29,0.016,-0.0063,0.96,-0.031,-0.0068,0.022,-0.0042,-0.0056,0.006,-0.00087,-0.0059,-2.3e-05,0.06,-0.021,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.07,0,0,0.00044,0.00044,0.046,0.042,0.042,0.0072,0.057,0.057,0.041,3.7e-06,3.4e-06,5.6e-06,0.031,0.031,0.00047,0.0012,6.2e-05,0.0012,0.0012,0.00074,0.0012,1,1 -14190000,-0.29,0.016,-0.0064,0.96,-0.025,-0.0052,0.022,-0.0011,-0.0043,0.0064,-0.00083,-0.0059,-2.5e-05,0.061,-0.022,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.07,0,0,0.00043,0.00043,0.046,0.036,0.036,0.007,0.049,0.049,0.04,3.6e-06,3.3e-06,5.6e-06,0.031,0.031,0.00047,0.0012,6.2e-05,0.0012,0.0012,0.00073,0.0012,1,1 -14290000,-0.29,0.016,-0.0063,0.96,-0.028,-0.0057,0.02,-0.0037,-0.0048,0.011,-0.00082,-0.0059,-2.5e-05,0.061,-0.022,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.07,0,0,0.00043,0.00043,0.046,0.039,0.04,0.0069,0.055,0.055,0.039,3.5e-06,3.2e-06,5.6e-06,0.031,0.031,0.00047,0.0012,6.2e-05,0.0012,0.0012,0.00073,0.0012,1,1 -14390000,-0.29,0.016,-0.0063,0.96,-0.026,-0.005,0.022,-0.0011,-0.0051,0.015,-0.00083,-0.0059,-2.5e-05,0.061,-0.022,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.07,0,0,0.00042,0.00043,0.046,0.034,0.034,0.0067,0.048,0.048,0.039,3.4e-06,3.1e-06,5.6e-06,0.031,0.03,0.00047,0.0012,6.1e-05,0.0012,0.0012,0.00073,0.0012,1,1 -14490000,-0.29,0.016,-0.0065,0.96,-0.026,-0.0044,0.026,-0.0038,-0.0053,0.018,-0.0008,-0.0059,-2.7e-05,0.061,-0.022,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.07,0,0,0.00042,0.00043,0.046,0.037,0.037,0.0066,0.054,0.054,0.038,3.3e-06,3e-06,5.6e-06,0.031,0.03,0.00047,0.0012,6.1e-05,0.0012,0.0012,0.00073,0.0012,1,1 -14590000,-0.29,0.016,-0.0066,0.96,-0.028,-0.0059,0.024,-0.004,-0.0056,0.014,-0.00078,-0.0059,-2.8e-05,0.062,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.07,0,0,0.00042,0.00042,0.046,0.032,0.032,0.0065,0.047,0.047,0.038,3.2e-06,2.9e-06,5.6e-06,0.031,0.03,0.00047,0.0012,6.1e-05,0.0012,0.0012,0.00073,0.0012,1,1 -14690000,-0.29,0.016,-0.0066,0.96,-0.029,-0.0062,0.024,-0.0069,-0.0063,0.015,-0.00078,-0.0059,-2.8e-05,0.062,-0.022,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.07,0,0,0.00042,0.00042,0.046,0.035,0.035,0.0065,0.052,0.052,0.037,3.1e-06,2.8e-06,5.6e-06,0.031,0.03,0.00047,0.0012,6.1e-05,0.0012,0.0012,0.00073,0.0012,1,1 -14790000,-0.29,0.016,-0.0067,0.96,-0.03,-0.0033,0.024,-0.0053,-0.0017,0.017,-0.0008,-0.0058,-2.3e-05,0.063,-0.022,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.07,0,0,0.00041,0.00042,0.046,0.03,0.031,0.0064,0.046,0.046,0.036,3e-06,2.7e-06,5.6e-06,0.031,0.03,0.00047,0.0012,6.1e-05,0.0012,0.0012,0.00073,0.0012,1,1 -14890000,-0.29,0.016,-0.0066,0.96,-0.032,-0.0015,0.028,-0.0087,-0.0022,0.019,-0.00081,-0.0058,-2.2e-05,0.064,-0.022,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.07,0,0,0.00041,0.00042,0.046,0.033,0.033,0.0064,0.052,0.052,0.036,3e-06,2.6e-06,5.6e-06,0.031,0.03,0.00047,0.0012,6.1e-05,0.0012,0.0012,0.00073,0.0012,1,1 -14990000,-0.29,0.016,-0.0067,0.96,-0.03,-0.0032,0.031,-0.0069,-0.0032,0.021,-0.00081,-0.0057,-2.2e-05,0.064,-0.022,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.069,0,0,0.00041,0.00041,0.046,0.029,0.029,0.0064,0.045,0.045,0.036,2.9e-06,2.5e-06,5.6e-06,0.031,0.03,0.00047,0.0012,6.1e-05,0.0012,0.0012,0.00072,0.0012,1,1 -15090000,-0.29,0.016,-0.0066,0.96,-0.032,-0.0044,0.035,-0.01,-0.0035,0.024,-0.00081,-0.0057,-2.2e-05,0.064,-0.022,-0.14,-0.11,-0.024,0.5,0.084,-0.031,-0.069,0,0,0.00041,0.00041,0.046,0.031,0.031,0.0064,0.051,0.051,0.035,2.8e-06,2.5e-06,5.6e-06,0.031,0.03,0.00047,0.0012,6.1e-05,0.0012,0.0012,0.00072,0.0012,1,1 -15190000,-0.29,0.016,-0.0068,0.96,-0.03,-0.0024,0.036,-0.0081,-0.0028,0.025,-0.0008,-0.0057,-2.3e-05,0.065,-0.023,-0.14,-0.11,-0.024,0.5,0.084,-0.031,-0.069,0,0,0.0004,0.00041,0.046,0.027,0.028,0.0064,0.045,0.045,0.035,2.7e-06,2.4e-06,5.6e-06,0.031,0.03,0.00047,0.0012,6.1e-05,0.0012,0.0012,0.00072,0.0012,1,1 -15290000,-0.29,0.016,-0.0068,0.96,-0.033,-0.0025,0.035,-0.012,-0.0034,0.023,-0.00081,-0.0057,-2.2e-05,0.065,-0.022,-0.14,-0.11,-0.024,0.5,0.084,-0.031,-0.069,0,0,0.00041,0.00041,0.046,0.03,0.03,0.0065,0.05,0.05,0.035,2.7e-06,2.3e-06,5.6e-06,0.031,0.03,0.00047,0.0012,6.1e-05,0.0012,0.0012,0.00072,0.0012,1,1 -15390000,-0.29,0.016,-0.0069,0.96,-0.032,-0.0042,0.035,-0.0093,-0.0028,0.023,-0.00081,-0.0057,-2.3e-05,0.066,-0.023,-0.14,-0.11,-0.024,0.5,0.084,-0.031,-0.069,0,0,0.0004,0.00041,0.046,0.026,0.026,0.0064,0.044,0.044,0.034,2.6e-06,2.3e-06,5.6e-06,0.031,0.03,0.00046,0.0012,6.1e-05,0.0012,0.0012,0.00072,0.0012,1,1 -15490000,-0.29,0.016,-0.0069,0.96,-0.034,-0.0018,0.035,-0.013,-0.0031,0.024,-0.00081,-0.0057,-2.2e-05,0.066,-0.023,-0.14,-0.11,-0.024,0.5,0.084,-0.031,-0.069,0,0,0.0004,0.00041,0.046,0.028,0.028,0.0065,0.05,0.05,0.034,2.5e-06,2.2e-06,5.6e-06,0.031,0.03,0.00046,0.0012,6e-05,0.0012,0.0012,0.00072,0.0012,1,1 -15590000,-0.29,0.016,-0.0069,0.96,-0.03,-0.006,0.035,-0.0078,-0.0062,0.023,-0.00083,-0.0057,-2.6e-05,0.066,-0.023,-0.14,-0.11,-0.024,0.5,0.084,-0.031,-0.069,0,0,0.0004,0.00041,0.046,0.025,0.025,0.0065,0.044,0.044,0.034,2.4e-06,2.1e-06,5.6e-06,0.031,0.03,0.00046,0.0012,6e-05,0.0012,0.0012,0.00072,0.0012,1,1 -15690000,-0.29,0.016,-0.0068,0.96,-0.032,-0.0041,0.036,-0.01,-0.0068,0.025,-0.00087,-0.0058,-2.4e-05,0.065,-0.022,-0.14,-0.11,-0.024,0.5,0.084,-0.031,-0.069,0,0,0.0004,0.00041,0.046,0.027,0.027,0.0066,0.049,0.049,0.034,2.4e-06,2.1e-06,5.6e-06,0.031,0.03,0.00046,0.0012,6e-05,0.0012,0.0012,0.00072,0.0012,1,1 -15790000,-0.29,0.016,-0.0068,0.96,-0.028,-0.0027,0.035,-0.008,-0.0058,0.026,-0.0009,-0.0058,-2.2e-05,0.065,-0.022,-0.14,-0.11,-0.024,0.5,0.084,-0.031,-0.069,0,0,0.0004,0.0004,0.046,0.024,0.024,0.0066,0.043,0.043,0.033,2.3e-06,2e-06,5.6e-06,0.031,0.03,0.00046,0.0012,6e-05,0.0012,0.0012,0.00072,0.0012,1,1 -15890000,-0.29,0.016,-0.0069,0.96,-0.029,-0.004,0.036,-0.011,-0.0059,0.026,-0.00088,-0.0058,-2.4e-05,0.065,-0.022,-0.14,-0.11,-0.024,0.5,0.084,-0.031,-0.069,0,0,0.0004,0.00041,0.046,0.025,0.026,0.0067,0.049,0.049,0.034,2.3e-06,2e-06,5.6e-06,0.031,0.03,0.00046,0.0012,6e-05,0.0012,0.0012,0.00072,0.0012,1,1 -15990000,-0.29,0.016,-0.0068,0.96,-0.027,-0.0034,0.033,-0.0093,-0.005,0.026,-0.00087,-0.0057,-2.5e-05,0.065,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.069,0,0,0.0004,0.0004,0.046,0.023,0.023,0.0068,0.043,0.043,0.033,2.2e-06,1.9e-06,5.6e-06,0.031,0.03,0.00046,0.0012,6e-05,0.0012,0.0012,0.00071,0.0012,1,1 -16090000,-0.29,0.016,-0.0068,0.96,-0.029,-0.0021,0.031,-0.012,-0.0051,0.026,-0.00086,-0.0057,-2.6e-05,0.065,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.069,0,0,0.0004,0.0004,0.046,0.024,0.025,0.0069,0.048,0.048,0.033,2.2e-06,1.9e-06,5.6e-06,0.031,0.03,0.00045,0.0012,6e-05,0.0012,0.0012,0.00071,0.0012,1,1 -16190000,-0.29,0.016,-0.0068,0.96,-0.026,-0.0019,0.03,-0.011,-0.0042,0.023,-0.00084,-0.0057,-2.8e-05,0.065,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.069,0,0,0.0004,0.0004,0.046,0.022,0.022,0.0069,0.043,0.043,0.033,2.1e-06,1.8e-06,5.6e-06,0.031,0.03,0.00045,0.0012,6e-05,0.0012,0.0012,0.00071,0.0012,1,1 -16290000,-0.29,0.016,-0.0068,0.96,-0.029,-0.00095,0.03,-0.014,-0.0044,0.024,-0.00085,-0.0057,-2.7e-05,0.065,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.069,0,0,0.0004,0.0004,0.046,0.023,0.024,0.007,0.048,0.048,0.033,2.1e-06,1.8e-06,5.6e-06,0.031,0.03,0.00045,0.0012,6e-05,0.0012,0.0012,0.00071,0.0012,1,1 -16390000,-0.29,0.016,-0.0067,0.96,-0.028,-0.0013,0.03,-0.011,-0.0042,0.025,-0.00086,-0.0057,-2.7e-05,0.066,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.069,0,0,0.00039,0.0004,0.046,0.021,0.021,0.007,0.042,0.042,0.033,2e-06,1.7e-06,5.6e-06,0.031,0.03,0.00045,0.0012,6e-05,0.0012,0.0012,0.00071,0.0012,1,1 -16490000,-0.29,0.016,-0.0069,0.96,-0.033,-0.0003,0.033,-0.015,-0.0042,0.029,-0.00085,-0.0057,-2.7e-05,0.066,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.069,0,0,0.00039,0.0004,0.046,0.022,0.023,0.0072,0.047,0.047,0.033,2e-06,1.7e-06,5.6e-06,0.03,0.03,0.00045,0.0012,6e-05,0.0012,0.0011,0.00071,0.0012,1,1 -16590000,-0.29,0.016,-0.0069,0.96,-0.036,0.00018,0.037,-0.012,-0.0035,0.029,-0.00085,-0.0057,-2.8e-05,0.066,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.069,0,0,0.00039,0.0004,0.046,0.02,0.02,0.0072,0.042,0.042,0.033,1.9e-06,1.6e-06,5.6e-06,0.03,0.03,0.00044,0.0012,6e-05,0.0012,0.0011,0.00071,0.0012,1,1 -16690000,-0.29,0.016,-0.0069,0.96,-0.039,0.0038,0.037,-0.016,-0.0035,0.03,-0.00087,-0.0057,-2.7e-05,0.066,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.069,0,0,0.00039,0.0004,0.046,0.021,0.022,0.0073,0.047,0.047,0.033,1.9e-06,1.6e-06,5.6e-06,0.03,0.03,0.00044,0.0012,6e-05,0.0012,0.0011,0.00071,0.0012,1,1 -16790000,-0.29,0.016,-0.0068,0.96,-0.039,0.0037,0.036,-0.013,-0.0031,0.03,-0.00089,-0.0057,-2.8e-05,0.066,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.069,0,0,0.00039,0.0004,0.046,0.019,0.02,0.0073,0.042,0.042,0.033,1.8e-06,1.6e-06,5.6e-06,0.03,0.03,0.00044,0.0012,6e-05,0.0012,0.0011,0.00071,0.0012,1,1 -16890000,-0.29,0.016,-0.0067,0.96,-0.04,0.0032,0.037,-0.017,-0.0032,0.029,-0.00091,-0.0057,-2.5e-05,0.066,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.069,0,0,0.00039,0.0004,0.046,0.021,0.021,0.0074,0.046,0.046,0.033,1.8e-06,1.5e-06,5.6e-06,0.03,0.03,0.00043,0.0012,5.9e-05,0.0012,0.0011,0.00071,0.0012,1,1 -16990000,-0.29,0.016,-0.0068,0.96,-0.037,0.0037,0.037,-0.016,-0.0034,0.028,-0.00092,-0.0057,-2.7e-05,0.066,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.031,-0.069,0,0,0.00039,0.00039,0.046,0.02,0.021,0.0074,0.049,0.049,0.033,1.8e-06,1.5e-06,5.6e-06,0.03,0.03,0.00043,0.0012,5.9e-05,0.0012,0.0011,0.00071,0.0012,1,1 -17090000,-0.29,0.016,-0.0069,0.96,-0.042,0.0056,0.036,-0.02,-0.0029,0.028,-0.00091,-0.0057,-2.8e-05,0.066,-0.023,-0.14,-0.11,-0.023,0.5,0.085,-0.031,-0.069,0,0,0.00039,0.0004,0.046,0.022,0.022,0.0075,0.054,0.054,0.033,1.7e-06,1.5e-06,5.6e-06,0.03,0.03,0.00043,0.0012,5.9e-05,0.0012,0.0011,0.00071,0.0012,1,1 -17190000,-0.29,0.016,-0.0069,0.96,-0.04,0.0074,0.038,-0.019,-0.0046,0.031,-0.00091,-0.0057,-3.7e-05,0.066,-0.023,-0.14,-0.11,-0.023,0.5,0.085,-0.032,-0.069,0,0,0.00039,0.00039,0.046,0.021,0.022,0.0075,0.056,0.057,0.033,1.7e-06,1.4e-06,5.6e-06,0.03,0.03,0.00042,0.0012,5.9e-05,0.0012,0.0011,0.00071,0.0012,1,1 -17290000,-0.29,0.016,-0.007,0.96,-0.043,0.008,0.037,-0.023,-0.0035,0.031,-0.0009,-0.0057,-3.9e-05,0.066,-0.023,-0.14,-0.11,-0.023,0.5,0.085,-0.032,-0.069,0,0,0.00039,0.0004,0.046,0.023,0.023,0.0076,0.062,0.063,0.033,1.7e-06,1.4e-06,5.6e-06,0.03,0.03,0.00042,0.0012,5.9e-05,0.0012,0.0011,0.00071,0.0012,1,1 -17390000,-0.28,0.016,-0.0069,0.96,-0.033,0.013,0.037,-0.014,-0.002,0.031,-0.00092,-0.0058,-3.9e-05,0.065,-0.023,-0.14,-0.11,-0.023,0.5,0.085,-0.032,-0.069,0,0,0.00039,0.00039,0.046,0.019,0.02,0.0076,0.052,0.052,0.033,1.6e-06,1.3e-06,5.6e-06,0.03,0.03,0.00041,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 -17490000,-0.28,0.016,-0.0069,0.96,-0.033,0.014,0.037,-0.018,-0.00052,0.033,-0.00092,-0.0058,-3.9e-05,0.065,-0.023,-0.14,-0.11,-0.023,0.5,0.085,-0.032,-0.069,0,0,0.00039,0.00039,0.046,0.021,0.021,0.0077,0.057,0.058,0.033,1.6e-06,1.3e-06,5.6e-06,0.03,0.03,0.00041,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 -17590000,-0.28,0.016,-0.0069,0.96,-0.033,0.012,0.036,-0.016,-0.00076,0.03,-0.00093,-0.0058,-4.3e-05,0.065,-0.023,-0.14,-0.11,-0.023,0.5,0.085,-0.032,-0.069,0,0,0.00039,0.00039,0.046,0.018,0.019,0.0077,0.049,0.049,0.033,1.5e-06,1.3e-06,5.6e-06,0.03,0.03,0.00041,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 -17690000,-0.28,0.016,-0.007,0.96,-0.034,0.013,0.037,-0.02,0.00034,0.033,-0.00093,-0.0057,-4.2e-05,0.065,-0.023,-0.14,-0.11,-0.023,0.5,0.085,-0.032,-0.069,0,0,0.00039,0.00039,0.046,0.019,0.02,0.0078,0.054,0.054,0.033,1.5e-06,1.3e-06,5.6e-06,0.03,0.03,0.0004,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 -17790000,-0.28,0.016,-0.0071,0.96,-0.034,0.013,0.037,-0.019,0.0011,0.038,-0.00094,-0.0057,-4.3e-05,0.065,-0.023,-0.14,-0.11,-0.023,0.5,0.085,-0.032,-0.069,0,0,0.00039,0.00039,0.046,0.019,0.02,0.0078,0.056,0.057,0.033,1.5e-06,1.2e-06,5.6e-06,0.03,0.03,0.0004,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 -17890000,-0.28,0.016,-0.007,0.96,-0.038,0.015,0.037,-0.022,0.0023,0.042,-0.00095,-0.0058,-4.1e-05,0.065,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.032,-0.069,0,0,0.00039,0.00039,0.046,0.02,0.021,0.0079,0.062,0.062,0.033,1.5e-06,1.2e-06,5.6e-06,0.03,0.03,0.00039,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 -17990000,-0.28,0.016,-0.007,0.96,-0.037,0.016,0.036,-0.018,0.0047,0.043,-0.00095,-0.0057,-4e-05,0.065,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.032,-0.069,0,0,0.00039,0.00039,0.046,0.018,0.018,0.0078,0.052,0.052,0.033,1.4e-06,1.2e-06,5.5e-06,0.03,0.03,0.00039,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 -18090000,-0.28,0.016,-0.0071,0.96,-0.039,0.016,0.036,-0.022,0.0062,0.041,-0.00095,-0.0057,-3.9e-05,0.065,-0.023,-0.14,-0.11,-0.024,0.5,0.084,-0.032,-0.069,0,0,0.00039,0.00039,0.046,0.019,0.019,0.0079,0.057,0.057,0.034,1.4e-06,1.2e-06,5.5e-06,0.03,0.03,0.00039,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 -18190000,-0.28,0.016,-0.007,0.96,-0.035,0.014,0.036,-0.017,0.0041,0.039,-0.00098,-0.0057,-4.1e-05,0.065,-0.022,-0.14,-0.11,-0.023,0.5,0.084,-0.032,-0.069,0,0,0.00039,0.00039,0.046,0.016,0.017,0.0079,0.049,0.049,0.034,1.4e-06,1.1e-06,5.5e-06,0.03,0.03,0.00038,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 -18290000,-0.28,0.016,-0.007,0.96,-0.039,0.014,0.035,-0.021,0.0052,0.038,-0.00098,-0.0057,-4e-05,0.066,-0.022,-0.14,-0.11,-0.024,0.5,0.084,-0.032,-0.069,0,0,0.00039,0.00039,0.046,0.018,0.018,0.008,0.053,0.054,0.034,1.3e-06,1.1e-06,5.5e-06,0.03,0.03,0.00038,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 -18390000,-0.28,0.016,-0.007,0.96,-0.034,0.013,0.035,-0.015,0.0044,0.037,-0.00099,-0.0057,-4.7e-05,0.065,-0.022,-0.14,-0.11,-0.023,0.5,0.084,-0.032,-0.069,0,0,0.00039,0.00039,0.046,0.016,0.016,0.0079,0.046,0.046,0.034,1.3e-06,1.1e-06,5.5e-06,0.03,0.03,0.00037,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 -18490000,-0.28,0.016,-0.007,0.96,-0.039,0.013,0.034,-0.019,0.0053,0.039,-0.001,-0.0057,-4.4e-05,0.065,-0.022,-0.14,-0.11,-0.023,0.5,0.084,-0.032,-0.069,0,0,0.00039,0.00039,0.046,0.017,0.018,0.008,0.05,0.051,0.034,1.3e-06,1.1e-06,5.5e-06,0.03,0.03,0.00037,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 -18590000,-0.28,0.015,-0.0068,0.96,-0.036,0.013,0.033,-0.016,0.0047,0.042,-0.001,-0.0057,-5.1e-05,0.065,-0.022,-0.14,-0.11,-0.024,0.5,0.084,-0.032,-0.069,0,0,0.00039,0.00039,0.046,0.015,0.016,0.0079,0.044,0.045,0.034,1.3e-06,1e-06,5.5e-06,0.03,0.03,0.00036,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 -18690000,-0.28,0.015,-0.0068,0.96,-0.036,0.012,0.032,-0.019,0.0056,0.04,-0.001,-0.0058,-4.8e-05,0.065,-0.022,-0.14,-0.11,-0.024,0.5,0.084,-0.032,-0.069,0,0,0.00039,0.00039,0.046,0.016,0.017,0.008,0.048,0.049,0.034,1.2e-06,1e-06,5.5e-06,0.03,0.03,0.00036,0.0012,5.8e-05,0.0012,0.0011,0.0007,0.0012,1,1 -18790000,-0.28,0.015,-0.0068,0.96,-0.033,0.011,0.031,-0.015,0.0048,0.038,-0.001,-0.0058,-5.3e-05,0.064,-0.022,-0.14,-0.11,-0.024,0.5,0.084,-0.032,-0.069,0,0,0.00039,0.00038,0.046,0.015,0.016,0.0079,0.043,0.043,0.034,1.2e-06,9.9e-07,5.5e-06,0.03,0.03,0.00035,0.0012,5.8e-05,0.0012,0.0011,0.00069,0.0012,1,1 -18890000,-0.28,0.015,-0.0067,0.96,-0.034,0.012,0.029,-0.019,0.0061,0.034,-0.001,-0.0058,-5.4e-05,0.064,-0.022,-0.14,-0.11,-0.023,0.5,0.084,-0.032,-0.069,0,0,0.00039,0.00038,0.046,0.016,0.017,0.008,0.047,0.047,0.034,1.2e-06,9.8e-07,5.5e-06,0.03,0.03,0.00035,0.0012,5.8e-05,0.0012,0.0011,0.00069,0.0012,1,1 -18990000,-0.28,0.015,-0.0067,0.96,-0.031,0.012,0.03,-0.016,0.0053,0.038,-0.0011,-0.0058,-5.8e-05,0.064,-0.022,-0.14,-0.11,-0.023,0.5,0.084,-0.032,-0.069,0,0,0.00039,0.00038,0.046,0.014,0.015,0.0079,0.042,0.042,0.034,1.2e-06,9.5e-07,5.4e-06,0.03,0.03,0.00034,0.0012,5.8e-05,0.0012,0.0011,0.00069,0.0012,1,1 -19090000,-0.28,0.015,-0.0068,0.96,-0.031,0.013,0.03,-0.019,0.006,0.034,-0.0011,-0.0058,-5.5e-05,0.064,-0.021,-0.14,-0.11,-0.023,0.5,0.084,-0.032,-0.069,0,0,0.00039,0.00038,0.046,0.015,0.016,0.0079,0.045,0.046,0.035,1.1e-06,9.4e-07,5.4e-06,0.03,0.03,0.00034,0.0012,5.8e-05,0.0012,0.0011,0.00069,0.0012,1,1 -19190000,-0.28,0.015,-0.0067,0.96,-0.028,0.013,0.03,-0.016,0.0059,0.033,-0.0011,-0.0058,-6.5e-05,0.064,-0.021,-0.14,-0.11,-0.023,0.5,0.085,-0.032,-0.069,0,0,0.00039,0.00038,0.046,0.014,0.015,0.0078,0.041,0.041,0.034,1.1e-06,9.1e-07,5.4e-06,0.03,0.03,0.00033,0.0012,5.8e-05,0.0012,0.0011,0.00069,0.0012,1,1 -19290000,-0.28,0.015,-0.0067,0.96,-0.029,0.014,0.03,-0.019,0.0071,0.032,-0.0011,-0.0058,-6.5e-05,0.064,-0.022,-0.14,-0.11,-0.023,0.5,0.085,-0.032,-0.069,0,0,0.00039,0.00038,0.046,0.015,0.016,0.0079,0.044,0.045,0.034,1.1e-06,9e-07,5.4e-06,0.03,0.03,0.00033,0.0011,5.8e-05,0.0012,0.0011,0.00069,0.0012,1,1 -19390000,-0.28,0.015,-0.0068,0.96,-0.027,0.012,0.031,-0.017,0.007,0.031,-0.0011,-0.0058,-6.9e-05,0.063,-0.021,-0.14,-0.11,-0.023,0.5,0.085,-0.032,-0.069,0,0,0.00039,0.00038,0.046,0.014,0.015,0.0078,0.04,0.04,0.035,1.1e-06,8.8e-07,5.4e-06,0.03,0.03,0.00032,0.0011,5.8e-05,0.0012,0.0011,0.00069,0.0012,1,1 -19490000,-0.28,0.015,-0.0069,0.96,-0.03,0.013,0.031,-0.021,0.0084,0.031,-0.0011,-0.0058,-7.2e-05,0.064,-0.022,-0.14,-0.11,-0.023,0.5,0.085,-0.032,-0.069,0,0,0.00039,0.00038,0.046,0.015,0.016,0.0078,0.043,0.044,0.035,1.1e-06,8.7e-07,5.4e-06,0.03,0.03,0.00032,0.0011,5.8e-05,0.0012,0.0011,0.00069,0.0012,1,1 -19590000,-0.28,0.015,-0.0068,0.96,-0.026,0.014,0.033,-0.018,0.0066,0.031,-0.0011,-0.0058,-8.3e-05,0.064,-0.022,-0.14,-0.11,-0.023,0.5,0.085,-0.032,-0.069,0,0,0.00038,0.00038,0.046,0.014,0.015,0.0077,0.039,0.039,0.034,1e-06,8.5e-07,5.4e-06,0.03,0.03,0.00031,0.0011,5.8e-05,0.0012,0.0011,0.00069,0.0012,1,1 -19690000,-0.28,0.015,-0.0068,0.96,-0.027,0.013,0.031,-0.021,0.0074,0.03,-0.0011,-0.0058,-8e-05,0.064,-0.021,-0.14,-0.11,-0.023,0.5,0.085,-0.032,-0.069,0,0,0.00039,0.00038,0.046,0.015,0.016,0.0077,0.043,0.043,0.035,1e-06,8.3e-07,5.4e-06,0.03,0.03,0.00031,0.0011,5.8e-05,0.0012,0.0011,0.00069,0.0012,1,1 -19790000,-0.28,0.015,-0.0069,0.96,-0.024,0.012,0.029,-0.02,0.008,0.026,-0.0011,-0.0058,-8.7e-05,0.063,-0.021,-0.14,-0.11,-0.023,0.5,0.085,-0.033,-0.069,0,0,0.00039,0.00038,0.046,0.015,0.016,0.0077,0.045,0.046,0.035,1e-06,8.2e-07,5.3e-06,0.03,0.03,0.0003,0.0011,5.8e-05,0.0012,0.0011,0.00069,0.0012,1,1 -19890000,-0.28,0.015,-0.0069,0.96,-0.025,0.013,0.029,-0.023,0.0092,0.025,-0.0011,-0.0058,-8.8e-05,0.063,-0.022,-0.13,-0.11,-0.023,0.5,0.085,-0.033,-0.069,0,0,0.00039,0.00038,0.046,0.016,0.017,0.0077,0.049,0.05,0.035,9.9e-07,8.1e-07,5.3e-06,0.03,0.03,0.0003,0.0011,5.8e-05,0.0012,0.0011,0.00069,0.0012,1,1 -19990000,-0.28,0.015,-0.0069,0.96,-0.022,0.013,0.027,-0.018,0.0085,0.022,-0.0011,-0.0058,-9.1e-05,0.063,-0.021,-0.13,-0.11,-0.023,0.5,0.085,-0.033,-0.069,0,0,0.00039,0.00038,0.046,0.014,0.015,0.0076,0.043,0.044,0.035,9.6e-07,7.8e-07,5.3e-06,0.03,0.03,0.00029,0.0011,5.8e-05,0.0012,0.0011,0.00069,0.0012,1,1 -20090000,-0.28,0.015,-0.0069,0.96,-0.025,0.016,0.027,-0.02,0.0099,0.025,-0.0011,-0.0058,-9e-05,0.063,-0.021,-0.13,-0.11,-0.023,0.5,0.085,-0.033,-0.069,0,0,0.00039,0.00038,0.046,0.015,0.017,0.0076,0.047,0.048,0.035,9.5e-07,7.8e-07,5.3e-06,0.03,0.03,0.00029,0.0011,5.8e-05,0.0012,0.0011,0.00069,0.0012,1,1 -20190000,-0.28,0.015,-0.0069,0.96,-0.025,0.014,0.028,-0.022,0.01,0.025,-0.0011,-0.0058,-9.9e-05,0.063,-0.021,-0.13,-0.11,-0.023,0.5,0.085,-0.033,-0.069,0,0,0.00039,0.00038,0.046,0.015,0.017,0.0075,0.049,0.05,0.035,9.3e-07,7.6e-07,5.3e-06,0.03,0.03,0.00029,0.0011,5.8e-05,0.0012,0.0011,0.00068,0.0012,1,1 -20290000,-0.28,0.015,-0.0069,0.96,-0.024,0.016,0.028,-0.024,0.012,0.025,-0.0011,-0.0058,-9.9e-05,0.063,-0.021,-0.13,-0.11,-0.023,0.5,0.085,-0.033,-0.069,0,0,0.00039,0.00038,0.046,0.016,0.018,0.0075,0.054,0.055,0.035,9.2e-07,7.5e-07,5.3e-06,0.03,0.03,0.00028,0.0011,5.8e-05,0.0012,0.0011,0.00068,0.0012,1,1 -20390000,-0.28,0.015,-0.0068,0.96,-0.022,0.014,0.028,-0.024,0.011,0.026,-0.0011,-0.0058,-0.0001,0.063,-0.021,-0.13,-0.11,-0.023,0.5,0.085,-0.033,-0.069,0,0,0.00039,0.00038,0.046,0.016,0.018,0.0075,0.056,0.057,0.035,9e-07,7.3e-07,5.2e-06,0.03,0.03,0.00028,0.0011,5.8e-05,0.0012,0.0011,0.00068,0.0012,1,1 -20490000,-0.28,0.015,-0.0068,0.96,-0.02,0.016,0.028,-0.027,0.012,0.024,-0.0011,-0.0058,-0.0001,0.063,-0.021,-0.13,-0.11,-0.023,0.5,0.085,-0.033,-0.068,0,0,0.00039,0.00038,0.046,0.017,0.019,0.0075,0.061,0.063,0.035,8.9e-07,7.3e-07,5.2e-06,0.03,0.03,0.00027,0.0011,5.8e-05,0.0012,0.0011,0.00068,0.0012,1,1 -20590000,-0.28,0.015,-0.0067,0.96,-0.02,0.016,0.027,-0.027,0.011,0.022,-0.0011,-0.0058,-0.0001,0.063,-0.021,-0.13,-0.11,-0.023,0.5,0.085,-0.033,-0.068,0,0,0.00039,0.00038,0.046,0.017,0.018,0.0074,0.064,0.065,0.035,8.7e-07,7.1e-07,5.2e-06,0.03,0.03,0.00027,0.0011,5.8e-05,0.0012,0.0011,0.00068,0.0012,1,1 -20690000,-0.28,0.015,-0.0067,0.96,-0.019,0.016,0.028,-0.028,0.013,0.023,-0.0011,-0.0058,-0.0001,0.063,-0.021,-0.13,-0.11,-0.023,0.5,0.085,-0.033,-0.068,0,0,0.00039,0.00038,0.046,0.018,0.02,0.0074,0.069,0.071,0.035,8.7e-07,7e-07,5.2e-06,0.03,0.03,0.00027,0.0011,5.8e-05,0.0012,0.0011,0.00068,0.0012,1,1 -20790000,-0.28,0.015,-0.006,0.96,-0.013,0.012,0.013,-0.021,0.0095,0.021,-0.0011,-0.0058,-0.00011,0.063,-0.021,-0.13,-0.11,-0.023,0.5,0.085,-0.033,-0.068,0,0,0.00039,0.00037,0.046,0.015,0.017,0.0073,0.056,0.057,0.035,8.3e-07,6.8e-07,5.2e-06,0.03,0.03,0.00026,0.0011,5.7e-05,0.0012,0.0011,0.00068,0.0012,1,1 -20890000,-0.28,0.01,0.0026,0.96,-0.0084,0.0014,-0.11,-0.024,0.01,0.015,-0.0011,-0.0058,-0.00011,0.063,-0.021,-0.13,-0.11,-0.023,0.5,0.085,-0.033,-0.068,0,0,0.00038,0.00035,0.046,0.016,0.018,0.0073,0.061,0.062,0.035,8.3e-07,6.7e-07,5.2e-06,0.03,0.03,0.00026,0.0011,5.7e-05,0.0012,0.0011,0.00068,0.0012,1,1 -20990000,-0.28,0.0066,0.0056,0.96,0.0065,-0.015,-0.25,-0.019,0.0077,-6.8e-05,-0.0011,-0.0058,-0.00012,0.063,-0.021,-0.13,-0.11,-0.024,0.5,0.085,-0.033,-0.068,0,0,0.00036,0.00035,0.046,0.014,0.016,0.0072,0.051,0.052,0.034,8e-07,6.5e-07,5.1e-06,0.03,0.03,0.00025,0.0011,5.7e-05,0.0012,0.0011,0.00068,0.0012,1,1 -21090000,-0.28,0.0072,0.0041,0.96,0.02,-0.028,-0.36,-0.018,0.0057,-0.031,-0.0011,-0.0058,-0.00013,0.063,-0.021,-0.13,-0.11,-0.023,0.5,0.085,-0.033,-0.068,0,0,0.00036,0.00035,0.046,0.016,0.017,0.0072,0.056,0.057,0.035,8e-07,6.5e-07,5.1e-06,0.03,0.03,0.00025,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 -21190000,-0.28,0.0091,0.0014,0.96,0.026,-0.033,-0.49,-0.015,0.0044,-0.067,-0.0011,-0.0057,-0.00012,0.064,-0.022,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.068,0,0,0.00037,0.00035,0.046,0.014,0.016,0.0071,0.048,0.049,0.035,7.7e-07,6.3e-07,5.1e-06,0.03,0.03,0.00025,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 -21290000,-0.28,0.011,-0.00064,0.96,0.024,-0.035,-0.62,-0.013,0.0019,-0.13,-0.0011,-0.0058,-0.00013,0.064,-0.022,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.068,0,0,0.00037,0.00035,0.045,0.015,0.017,0.0071,0.052,0.053,0.035,7.7e-07,6.3e-07,5.1e-06,0.03,0.03,0.00024,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 -21390000,-0.28,0.011,-0.0021,0.96,0.018,-0.028,-0.75,-0.015,0.0053,-0.19,-0.0011,-0.0058,-0.0001,0.064,-0.023,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.068,0,0,0.00037,0.00035,0.045,0.015,0.017,0.007,0.054,0.055,0.035,7.5e-07,6.1e-07,5e-06,0.03,0.03,0.00024,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 -21490000,-0.28,0.012,-0.0029,0.96,0.011,-0.026,-0.88,-0.013,0.0025,-0.28,-0.0011,-0.0058,-0.0001,0.064,-0.023,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.068,0,0,0.00037,0.00036,0.045,0.016,0.018,0.007,0.059,0.06,0.035,7.5e-07,6.1e-07,5e-06,0.03,0.03,0.00024,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 -21590000,-0.28,0.012,-0.0035,0.96,-0.00068,-0.019,-1,-0.017,0.0075,-0.37,-0.0011,-0.0058,-7e-05,0.064,-0.024,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.068,0,0,0.00037,0.00035,0.045,0.017,0.018,0.0069,0.061,0.063,0.034,7.3e-07,5.9e-07,5e-06,0.03,0.03,0.00023,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 -21690000,-0.28,0.012,-0.0038,0.96,-0.0062,-0.015,-1.1,-0.017,0.0052,-0.48,-0.0011,-0.0058,-6.5e-05,0.064,-0.024,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.068,0,0,0.00037,0.00036,0.045,0.018,0.02,0.0069,0.066,0.068,0.035,7.2e-07,5.9e-07,5e-06,0.03,0.03,0.00023,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 -21790000,-0.28,0.012,-0.0042,0.96,-0.012,-0.0067,-1.3,-0.019,0.012,-0.6,-0.0011,-0.0058,-3.1e-05,0.063,-0.025,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.068,0,0,0.00037,0.00035,0.045,0.018,0.02,0.0069,0.069,0.07,0.034,7.1e-07,5.8e-07,5e-06,0.03,0.03,0.00023,0.0011,5.7e-05,0.0012,0.0011,0.00066,0.0012,1,1 -21890000,-0.28,0.012,-0.0045,0.96,-0.018,-0.002,-1.4,-0.02,0.012,-0.74,-0.0011,-0.0058,-3.5e-05,0.063,-0.025,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.068,0,0,0.00037,0.00036,0.045,0.019,0.021,0.0068,0.074,0.076,0.034,7e-07,5.7e-07,4.9e-06,0.03,0.03,0.00023,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 -21990000,-0.28,0.013,-0.0053,0.96,-0.024,0.0063,-1.4,-0.027,0.019,-0.88,-0.001,-0.0058,-5.4e-06,0.063,-0.027,-0.13,-0.11,-0.024,0.5,0.084,-0.031,-0.068,0,0,0.00037,0.00035,0.045,0.018,0.02,0.0068,0.076,0.079,0.034,6.8e-07,5.6e-07,4.9e-06,0.03,0.03,0.00022,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 -22090000,-0.28,0.013,-0.0059,0.96,-0.027,0.0097,-1.4,-0.028,0.019,-1,-0.001,-0.0058,2e-06,0.063,-0.027,-0.13,-0.11,-0.024,0.5,0.084,-0.031,-0.068,0,0,0.00037,0.00036,0.045,0.019,0.022,0.0068,0.082,0.085,0.034,6.8e-07,5.6e-07,4.9e-06,0.03,0.03,0.00022,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 -22190000,-0.28,0.014,-0.0064,0.96,-0.034,0.016,-1.4,-0.032,0.027,-1.2,-0.001,-0.0058,2.9e-05,0.063,-0.027,-0.13,-0.11,-0.024,0.5,0.084,-0.031,-0.068,0,0,0.00037,0.00036,0.045,0.019,0.021,0.0067,0.085,0.087,0.034,6.6e-07,5.4e-07,4.9e-06,0.029,0.029,0.00022,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 -22290000,-0.28,0.014,-0.0071,0.96,-0.042,0.021,-1.4,-0.037,0.029,-1.3,-0.001,-0.0058,2.8e-05,0.063,-0.027,-0.13,-0.11,-0.024,0.5,0.084,-0.031,-0.068,0,0,0.00037,0.00036,0.045,0.02,0.022,0.0067,0.091,0.094,0.034,6.6e-07,5.4e-07,4.8e-06,0.029,0.029,0.00021,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 -22390000,-0.28,0.014,-0.0074,0.96,-0.049,0.028,-1.4,-0.043,0.033,-1.4,-0.001,-0.0058,2.6e-05,0.063,-0.028,-0.13,-0.11,-0.024,0.5,0.084,-0.031,-0.068,0,0,0.00037,0.00036,0.045,0.019,0.021,0.0066,0.093,0.096,0.034,6.4e-07,5.3e-07,4.8e-06,0.029,0.029,0.00021,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 -22490000,-0.29,0.015,-0.0075,0.96,-0.055,0.034,-1.4,-0.049,0.037,-1.6,-0.001,-0.0058,2.3e-05,0.062,-0.028,-0.13,-0.11,-0.024,0.5,0.084,-0.031,-0.068,0,0,0.00037,0.00036,0.045,0.02,0.023,0.0066,0.1,0.1,0.034,6.4e-07,5.2e-07,4.8e-06,0.029,0.029,0.00021,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 -22590000,-0.28,0.015,-0.0074,0.96,-0.06,0.04,-1.4,-0.049,0.04,-1.7,-0.001,-0.0058,3e-05,0.062,-0.027,-0.13,-0.11,-0.024,0.5,0.084,-0.031,-0.068,0,0,0.00037,0.00036,0.045,0.02,0.022,0.0065,0.1,0.11,0.034,6.2e-07,5.1e-07,4.7e-06,0.029,0.029,0.00021,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 -22690000,-0.29,0.015,-0.0073,0.96,-0.065,0.044,-1.4,-0.056,0.044,-1.9,-0.001,-0.0058,2.8e-05,0.062,-0.027,-0.13,-0.11,-0.024,0.5,0.084,-0.031,-0.068,0,0,0.00037,0.00036,0.045,0.021,0.023,0.0065,0.11,0.11,0.034,6.2e-07,5.1e-07,4.7e-06,0.029,0.029,0.0002,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 -22790000,-0.28,0.016,-0.0072,0.96,-0.071,0.049,-1.4,-0.062,0.047,-2,-0.001,-0.0058,1.7e-05,0.062,-0.027,-0.13,-0.11,-0.024,0.5,0.084,-0.031,-0.068,0,0,0.00037,0.00035,0.045,0.02,0.022,0.0065,0.11,0.11,0.034,6.1e-07,5e-07,4.7e-06,0.029,0.029,0.0002,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 -22890000,-0.28,0.016,-0.0073,0.96,-0.076,0.053,-1.4,-0.069,0.051,-2.2,-0.001,-0.0058,2.6e-05,0.062,-0.027,-0.13,-0.11,-0.024,0.5,0.084,-0.031,-0.068,0,0,0.00037,0.00036,0.045,0.021,0.023,0.0065,0.12,0.12,0.034,6e-07,4.9e-07,4.7e-06,0.029,0.029,0.0002,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 -22990000,-0.28,0.017,-0.0071,0.96,-0.079,0.053,-1.4,-0.071,0.049,-2.3,-0.0011,-0.0058,2e-05,0.061,-0.026,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.068,0,0,0.00037,0.00035,0.045,0.02,0.023,0.0064,0.12,0.12,0.034,5.9e-07,4.8e-07,4.6e-06,0.029,0.029,0.0002,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 -23090000,-0.28,0.017,-0.0071,0.96,-0.085,0.057,-1.4,-0.079,0.055,-2.5,-0.0011,-0.0058,2.2e-05,0.061,-0.026,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.068,0,0,0.00038,0.00035,0.045,0.021,0.024,0.0064,0.13,0.13,0.034,5.9e-07,4.8e-07,4.6e-06,0.029,0.029,0.00019,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 -23190000,-0.28,0.017,-0.007,0.96,-0.086,0.052,-1.4,-0.078,0.051,-2.6,-0.0011,-0.0058,-7.4e-06,0.061,-0.025,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.067,0,0,0.00038,0.00035,0.045,0.02,0.023,0.0063,0.13,0.13,0.033,5.7e-07,4.7e-07,4.6e-06,0.029,0.029,0.00019,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 -23290000,-0.28,0.017,-0.0074,0.96,-0.093,0.056,-1.4,-0.087,0.055,-2.7,-0.0011,-0.0058,-2.9e-06,0.061,-0.025,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.067,0,0,0.00038,0.00035,0.045,0.021,0.024,0.0063,0.14,0.14,0.034,5.7e-07,4.7e-07,4.6e-06,0.029,0.029,0.00019,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 -23390000,-0.28,0.017,-0.0073,0.96,-0.092,0.058,-1.4,-0.081,0.057,-2.9,-0.0011,-0.0058,-2.5e-05,0.06,-0.025,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.067,0,0,0.00038,0.00035,0.045,0.021,0.023,0.0063,0.14,0.14,0.033,5.6e-07,4.6e-07,4.5e-06,0.029,0.029,0.00019,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 -23490000,-0.28,0.017,-0.0074,0.96,-0.099,0.058,-1.4,-0.092,0.061,-3,-0.0011,-0.0058,-1.6e-05,0.06,-0.025,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.067,0,0,0.00038,0.00035,0.045,0.022,0.024,0.0063,0.15,0.15,0.033,5.6e-07,4.6e-07,4.5e-06,0.029,0.029,0.00019,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 -23590000,-0.28,0.017,-0.0075,0.96,-0.097,0.052,-1.4,-0.087,0.051,-3.2,-0.0011,-0.0058,-4.8e-05,0.06,-0.024,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.067,0,0,0.00038,0.00035,0.045,0.021,0.023,0.0062,0.15,0.15,0.033,5.4e-07,4.5e-07,4.5e-06,0.029,0.029,0.00018,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 -23690000,-0.28,0.018,-0.0081,0.96,-0.096,0.054,-1.3,-0.097,0.056,-3.3,-0.0011,-0.0058,-3.8e-05,0.06,-0.024,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.067,0,0,0.00038,0.00036,0.045,0.022,0.024,0.0062,0.16,0.16,0.033,5.4e-07,4.5e-07,4.5e-06,0.029,0.029,0.00018,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 -23790000,-0.28,0.021,-0.0096,0.96,-0.081,0.05,-0.95,-0.086,0.051,-3.4,-0.0011,-0.0058,-5.3e-05,0.059,-0.023,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.067,0,0,0.00039,0.00037,0.045,0.02,0.023,0.0061,0.16,0.16,0.033,5.3e-07,4.4e-07,4.4e-06,0.029,0.029,0.00018,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 -23890000,-0.28,0.025,-0.012,0.96,-0.075,0.051,-0.52,-0.094,0.055,-3.5,-0.0011,-0.0058,-4.8e-05,0.059,-0.023,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.067,0,0,0.00042,0.00039,0.045,0.021,0.023,0.0061,0.17,0.17,0.033,5.3e-07,4.3e-07,4.4e-06,0.029,0.029,0.00018,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 -23990000,-0.28,0.028,-0.014,0.96,-0.066,0.049,-0.13,-0.081,0.05,-3.6,-0.0012,-0.0058,-6.9e-05,0.059,-0.023,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.066,0,0,0.00044,0.00041,0.045,0.02,0.022,0.0061,0.17,0.17,0.033,5.2e-07,4.3e-07,4.4e-06,0.029,0.029,0.00018,0.0011,5.6e-05,0.0012,0.0011,0.00065,0.0012,1,1 -24090000,-0.28,0.027,-0.014,0.96,-0.072,0.056,0.1,-0.087,0.055,-3.6,-0.0012,-0.0058,-6.8e-05,0.059,-0.023,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.066,0,0,0.00043,0.0004,0.045,0.021,0.023,0.0061,0.18,0.18,0.033,5.2e-07,4.3e-07,4.3e-06,0.029,0.029,0.00017,0.0011,5.6e-05,0.0012,0.0011,0.00065,0.0012,1,1 -24190000,-0.28,0.023,-0.011,0.96,-0.076,0.053,0.091,-0.074,0.042,-3.6,-0.0012,-0.0058,-9.7e-05,0.059,-0.024,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.066,0,0,0.0004,0.00038,0.045,0.02,0.022,0.006,0.18,0.18,0.033,5.1e-07,4.2e-07,4.3e-06,0.029,0.029,0.00017,0.0011,5.6e-05,0.0012,0.0011,0.00065,0.0012,1,1 -24290000,-0.28,0.019,-0.0094,0.96,-0.081,0.055,0.069,-0.081,0.047,-3.6,-0.0012,-0.0058,-9.3e-05,0.059,-0.024,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.066,0,0,0.00038,0.00036,0.045,0.021,0.023,0.006,0.19,0.19,0.033,5.1e-07,4.2e-07,4.3e-06,0.029,0.029,0.00017,0.0011,5.6e-05,0.0012,0.0011,0.00065,0.0012,1,1 -24390000,-0.28,0.018,-0.0086,0.96,-0.064,0.048,0.085,-0.063,0.038,-3.6,-0.0012,-0.0058,-0.00011,0.059,-0.025,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.066,0,0,0.00038,0.00036,0.045,0.02,0.022,0.006,0.19,0.19,0.033,4.9e-07,4.1e-07,4.2e-06,0.029,0.029,0.00017,0.0011,5.6e-05,0.0012,0.0011,0.00065,0.0012,1,1 -24490000,-0.28,0.018,-0.0088,0.96,-0.059,0.045,0.083,-0.069,0.041,-3.6,-0.0012,-0.0058,-9.5e-05,0.06,-0.025,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.066,0,0,0.00038,0.00036,0.045,0.021,0.024,0.006,0.2,0.2,0.033,4.9e-07,4.1e-07,4.2e-06,0.029,0.029,0.00017,0.0011,5.6e-05,0.0012,0.0011,0.00065,0.0012,1,1 -24590000,-0.28,0.018,-0.0095,0.96,-0.048,0.043,0.079,-0.05,0.035,-3.6,-0.0013,-0.0058,-0.00012,0.06,-0.026,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.066,0,0,0.00038,0.00036,0.045,0.02,0.023,0.0059,0.2,0.2,0.033,4.8e-07,4e-07,4.2e-06,0.029,0.029,0.00017,0.0011,5.6e-05,0.0012,0.0011,0.00065,0.0012,1,1 -24690000,-0.28,0.018,-0.01,0.96,-0.046,0.042,0.078,-0.055,0.039,-3.5,-0.0013,-0.0058,-0.00011,0.06,-0.026,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.066,0,0,0.00038,0.00037,0.045,0.021,0.024,0.0059,0.21,0.21,0.033,4.8e-07,4e-07,4.2e-06,0.029,0.029,0.00016,0.0011,5.6e-05,0.0012,0.0011,0.00065,0.0012,1,1 -24790000,-0.28,0.017,-0.01,0.96,-0.039,0.04,0.07,-0.042,0.031,-3.5,-0.0013,-0.0058,-0.00013,0.06,-0.026,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.065,0,0,0.00038,0.00037,0.045,0.02,0.023,0.0059,0.21,0.21,0.032,4.7e-07,4e-07,4.1e-06,0.029,0.029,0.00016,0.0011,5.6e-05,0.0012,0.0011,0.00065,0.0012,1,1 -24890000,-0.28,0.017,-0.0099,0.96,-0.038,0.043,0.059,-0.046,0.034,-3.5,-0.0013,-0.0058,-0.00012,0.06,-0.026,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.065,0,0,0.00037,0.00037,0.045,0.021,0.024,0.0059,0.22,0.22,0.032,4.7e-07,3.9e-07,4.1e-06,0.029,0.029,0.00016,0.0011,5.6e-05,0.0012,0.0011,0.00065,0.0012,1,1 -24990000,-0.28,0.016,-0.0097,0.96,-0.026,0.044,0.052,-0.031,0.029,-3.5,-0.0013,-0.0058,-0.00014,0.06,-0.027,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.065,0,0,0.00037,0.00036,0.045,0.02,0.023,0.0058,0.22,0.22,0.032,4.7e-07,3.9e-07,4.1e-06,0.029,0.029,0.00016,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -25090000,-0.28,0.017,-0.01,0.96,-0.021,0.043,0.049,-0.032,0.033,-3.5,-0.0013,-0.0058,-0.00014,0.06,-0.027,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.065,0,0,0.00037,0.00037,0.045,0.021,0.024,0.0058,0.23,0.23,0.032,4.6e-07,3.9e-07,4.1e-06,0.029,0.029,0.00016,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -25190000,-0.28,0.016,-0.01,0.96,-0.011,0.039,0.049,-0.016,0.023,-3.5,-0.0013,-0.0058,-0.00017,0.06,-0.027,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.065,0,0,0.00037,0.00037,0.045,0.02,0.023,0.0058,0.23,0.23,0.032,4.6e-07,3.8e-07,4e-06,0.029,0.029,0.00016,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -25290000,-0.28,0.016,-0.011,0.96,-0.0066,0.042,0.044,-0.017,0.027,-3.5,-0.0013,-0.0058,-0.00018,0.06,-0.028,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.065,0,0,0.00037,0.00037,0.045,0.021,0.024,0.0058,0.24,0.24,0.032,4.6e-07,3.8e-07,4e-06,0.029,0.029,0.00016,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -25390000,-0.28,0.016,-0.011,0.96,0.0024,0.04,0.043,-0.0072,0.022,-3.5,-0.0013,-0.0058,-0.00019,0.06,-0.028,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.065,0,0,0.00037,0.00037,0.045,0.021,0.023,0.0057,0.24,0.24,0.032,4.5e-07,3.8e-07,4e-06,0.029,0.029,0.00016,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -25490000,-0.28,0.015,-0.011,0.96,0.0067,0.041,0.042,-0.0076,0.025,-3.5,-0.0013,-0.0058,-0.00019,0.06,-0.028,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.065,0,0,0.00037,0.00037,0.045,0.021,0.024,0.0058,0.25,0.25,0.032,4.5e-07,3.8e-07,4e-06,0.029,0.029,0.00015,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -25590000,-0.28,0.015,-0.011,0.96,0.012,0.036,0.043,7.2e-05,0.011,-3.5,-0.0013,-0.0058,-0.00022,0.06,-0.028,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.065,0,0,0.00037,0.00037,0.045,0.021,0.023,0.0057,0.25,0.25,0.032,4.4e-07,3.7e-07,3.9e-06,0.029,0.029,0.00015,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -25690000,-0.28,0.015,-0.01,0.96,0.013,0.035,0.033,0.0013,0.014,-3.5,-0.0013,-0.0058,-0.00022,0.06,-0.028,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.065,0,0,0.00036,0.00037,0.045,0.021,0.024,0.0057,0.26,0.26,0.032,4.4e-07,3.7e-07,3.9e-06,0.029,0.029,0.00015,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -25790000,-0.28,0.014,-0.01,0.96,0.023,0.03,0.032,0.009,0.0043,-3.5,-0.0013,-0.0058,-0.00024,0.06,-0.028,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.065,0,0,0.00036,0.00036,0.045,0.021,0.023,0.0057,0.26,0.26,0.032,4.3e-07,3.6e-07,3.9e-06,0.029,0.029,0.00015,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -25890000,-0.28,0.014,-0.01,0.96,0.029,0.03,0.035,0.012,0.0079,-3.5,-0.0013,-0.0058,-0.00025,0.06,-0.028,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.065,0,0,0.00036,0.00037,0.045,0.021,0.024,0.0057,0.27,0.27,0.032,4.3e-07,3.6e-07,3.9e-06,0.029,0.029,0.00015,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -25990000,-0.28,0.014,-0.01,0.96,0.032,0.024,0.028,0.0089,-0.0031,-3.5,-0.0014,-0.0058,-0.00027,0.06,-0.029,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.065,0,0,0.00036,0.00037,0.045,0.021,0.023,0.0057,0.27,0.27,0.032,4.2e-07,3.6e-07,3.8e-06,0.029,0.029,0.00015,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -26090000,-0.28,0.014,-0.01,0.96,0.036,0.025,0.027,0.012,-0.0012,-3.5,-0.0014,-0.0058,-0.00026,0.06,-0.029,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.065,0,0,0.00036,0.00036,0.045,0.022,0.024,0.0057,0.28,0.28,0.032,4.2e-07,3.6e-07,3.8e-06,0.029,0.029,0.00015,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -26190000,-0.28,0.015,-0.0098,0.96,0.041,0.015,0.022,0.016,-0.017,-3.5,-0.0014,-0.0058,-0.00027,0.06,-0.029,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.065,0,0,0.00037,0.00036,0.045,0.021,0.023,0.0056,0.27,0.28,0.032,4.2e-07,3.5e-07,3.8e-06,0.029,0.029,0.00015,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -26290000,-0.28,0.015,-0.0098,0.96,0.041,0.015,0.016,0.019,-0.015,-3.5,-0.0014,-0.0058,-0.00028,0.06,-0.029,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.065,0,0,0.00037,0.00036,0.045,0.022,0.024,0.0056,0.29,0.29,0.032,4.2e-07,3.5e-07,3.8e-06,0.029,0.029,0.00015,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -26390000,-0.28,0.015,-0.0092,0.96,0.039,0.0058,0.02,0.011,-0.029,-3.5,-0.0014,-0.0058,-0.0003,0.061,-0.029,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.065,0,0,0.00037,0.00036,0.045,0.021,0.023,0.0056,0.28,0.29,0.032,4.1e-07,3.5e-07,3.7e-06,0.029,0.029,0.00014,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -26490000,-0.28,0.015,-0.009,0.96,0.042,0.0035,0.03,0.015,-0.029,-3.5,-0.0014,-0.0058,-0.0003,0.061,-0.029,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.065,0,0,0.00037,0.00036,0.045,0.022,0.024,0.0056,0.3,0.3,0.032,4.1e-07,3.5e-07,3.7e-06,0.029,0.029,0.00014,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -26590000,-0.28,0.015,-0.0084,0.96,0.041,-0.0065,0.03,0.015,-0.041,-3.5,-0.0014,-0.0058,-0.00032,0.061,-0.029,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00037,0.00036,0.045,0.021,0.023,0.0056,0.29,0.3,0.032,4e-07,3.4e-07,3.7e-06,0.029,0.029,0.00014,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -26690000,-0.28,0.015,-0.0083,0.96,0.042,-0.01,0.028,0.019,-0.042,-3.5,-0.0014,-0.0058,-0.00033,0.061,-0.029,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00037,0.00036,0.045,0.022,0.024,0.0056,0.31,0.31,0.032,4e-07,3.4e-07,3.7e-06,0.029,0.029,0.00014,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -26790000,-0.28,0.014,-0.0082,0.96,0.045,-0.017,0.028,0.017,-0.055,-3.5,-0.0014,-0.0058,-0.00035,0.061,-0.03,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00037,0.00036,0.045,0.021,0.023,0.0055,0.3,0.31,0.031,3.9e-07,3.4e-07,3.6e-06,0.029,0.029,0.00014,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -26890000,-0.28,0.014,-0.0075,0.96,0.051,-0.019,0.023,0.022,-0.057,-3.5,-0.0014,-0.0058,-0.00034,0.061,-0.03,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00037,0.00035,0.045,0.022,0.024,0.0056,0.32,0.32,0.032,3.9e-07,3.4e-07,3.6e-06,0.029,0.029,0.00014,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -26990000,-0.28,0.015,-0.0069,0.96,0.052,-0.025,0.023,0.015,-0.064,-3.5,-0.0014,-0.0058,-0.00035,0.061,-0.03,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00037,0.00035,0.045,0.021,0.023,0.0055,0.31,0.32,0.031,3.9e-07,3.3e-07,3.6e-06,0.029,0.029,0.00014,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -27090000,-0.28,0.015,-0.0067,0.96,0.054,-0.032,0.026,0.02,-0.066,-3.5,-0.0014,-0.0058,-0.00035,0.061,-0.03,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00038,0.00035,0.045,0.022,0.024,0.0055,0.33,0.33,0.031,3.9e-07,3.3e-07,3.6e-06,0.029,0.029,0.00014,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -27190000,-0.28,0.015,-0.0068,0.96,0.055,-0.036,0.028,0.011,-0.069,-3.5,-0.0014,-0.0058,-0.00035,0.061,-0.03,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00037,0.00035,0.045,0.021,0.023,0.0055,0.32,0.33,0.031,3.8e-07,3.3e-07,3.5e-06,0.029,0.029,0.00014,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -27290000,-0.28,0.016,-0.0069,0.96,0.062,-0.04,0.14,0.016,-0.073,-3.5,-0.0014,-0.0058,-0.00035,0.061,-0.03,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00038,0.00035,0.045,0.021,0.024,0.0055,0.33,0.34,0.031,3.8e-07,3.3e-07,3.5e-06,0.029,0.029,0.00014,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 -27390000,-0.28,0.019,-0.0081,0.96,0.066,-0.033,0.47,0.0037,-0.026,-3.5,-0.0014,-0.0058,-0.00032,0.061,-0.031,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00039,0.00036,0.045,0.015,0.017,0.0055,0.15,0.15,0.031,3.7e-07,3.2e-07,3.5e-06,0.029,0.029,0.00014,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 -27490000,-0.28,0.021,-0.0093,0.96,0.071,-0.037,0.78,0.011,-0.029,-3.5,-0.0014,-0.0058,-0.00033,0.061,-0.031,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00041,0.00037,0.045,0.015,0.018,0.0055,0.15,0.15,0.031,3.7e-07,3.2e-07,3.5e-06,0.029,0.029,0.00014,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 -27590000,-0.28,0.02,-0.0094,0.96,0.063,-0.039,0.87,0.0055,-0.02,-3.4,-0.0014,-0.0058,-0.00031,0.06,-0.031,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.0004,0.00037,0.045,0.013,0.015,0.0054,0.096,0.097,0.031,3.7e-07,3.2e-07,3.4e-06,0.029,0.029,0.00013,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 -27690000,-0.28,0.017,-0.0084,0.96,0.057,-0.036,0.78,0.011,-0.024,-3.3,-0.0014,-0.0058,-0.00031,0.06,-0.031,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00038,0.00036,0.045,0.014,0.016,0.0055,0.1,0.1,0.031,3.7e-07,3.2e-07,3.4e-06,0.029,0.029,0.00013,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 -27790000,-0.28,0.015,-0.0072,0.96,0.054,-0.034,0.77,0.0093,-0.019,-3.2,-0.0013,-0.0058,-0.0003,0.06,-0.031,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00037,0.00035,0.045,0.013,0.015,0.0054,0.073,0.074,0.031,3.6e-07,3.2e-07,3.4e-06,0.029,0.029,0.00013,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 -27890000,-0.28,0.015,-0.0069,0.96,0.06,-0.039,0.81,0.015,-0.023,-3.2,-0.0013,-0.0058,-0.0003,0.06,-0.031,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00038,0.00035,0.045,0.014,0.016,0.0054,0.076,0.077,0.031,3.7e-07,3.2e-07,3.4e-06,0.029,0.029,0.00013,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 -27990000,-0.28,0.015,-0.0073,0.96,0.06,-0.042,0.8,0.017,-0.025,-3.1,-0.0013,-0.0058,-0.00029,0.06,-0.031,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00038,0.00035,0.045,0.014,0.016,0.0054,0.079,0.079,0.031,3.6e-07,3.1e-07,3.4e-06,0.029,0.029,0.00013,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 -28090000,-0.28,0.015,-0.0075,0.96,0.064,-0.042,0.81,0.024,-0.03,-3,-0.0013,-0.0058,-0.00028,0.06,-0.031,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00038,0.00035,0.045,0.015,0.017,0.0054,0.082,0.083,0.031,3.6e-07,3.1e-07,3.4e-06,0.029,0.029,0.00013,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 -28190000,-0.28,0.016,-0.0069,0.96,0.061,-0.041,0.81,0.025,-0.032,-2.9,-0.0013,-0.0058,-0.00027,0.059,-0.031,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00038,0.00035,0.045,0.015,0.017,0.0054,0.084,0.086,0.031,3.6e-07,3.1e-07,3.3e-06,0.029,0.029,0.00013,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 -28290000,-0.28,0.016,-0.0064,0.96,0.065,-0.044,0.81,0.03,-0.037,-2.9,-0.0013,-0.0058,-0.00026,0.06,-0.031,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00038,0.00035,0.045,0.015,0.018,0.0054,0.088,0.09,0.031,3.6e-07,3.1e-07,3.3e-06,0.029,0.029,0.00013,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 -28390000,-0.28,0.016,-0.0063,0.96,0.066,-0.045,0.81,0.033,-0.037,-2.8,-0.0013,-0.0058,-0.00024,0.059,-0.03,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00039,0.00035,0.045,0.015,0.018,0.0054,0.091,0.092,0.031,3.5e-07,3.1e-07,3.3e-06,0.029,0.029,0.00013,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 -28490000,-0.28,0.017,-0.0066,0.96,0.069,-0.049,0.81,0.04,-0.042,-2.7,-0.0013,-0.0058,-0.00024,0.059,-0.031,-0.12,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00039,0.00035,0.045,0.016,0.019,0.0054,0.095,0.097,0.031,3.5e-07,3.1e-07,3.3e-06,0.029,0.029,0.00013,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 -28590000,-0.28,0.017,-0.0066,0.96,0.061,-0.049,0.81,0.041,-0.045,-2.6,-0.0013,-0.0058,-0.00022,0.059,-0.03,-0.12,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00039,0.00035,0.045,0.016,0.018,0.0053,0.098,0.1,0.031,3.5e-07,3e-07,3.2e-06,0.029,0.029,0.00013,0.0011,5.4e-05,0.0012,0.0011,0.00064,0.0012,1,1 -28690000,-0.28,0.016,-0.0065,0.96,0.06,-0.049,0.81,0.046,-0.05,-2.6,-0.0013,-0.0058,-0.00023,0.059,-0.031,-0.12,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00039,0.00035,0.045,0.017,0.019,0.0054,0.1,0.1,0.031,3.5e-07,3e-07,3.2e-06,0.029,0.029,0.00013,0.0011,5.4e-05,0.0012,0.0011,0.00064,0.0012,1,1 -28790000,-0.28,0.016,-0.0058,0.96,0.058,-0.048,0.81,0.048,-0.048,-2.5,-0.0013,-0.0058,-0.0002,0.059,-0.03,-0.12,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00039,0.00035,0.045,0.016,0.019,0.0053,0.11,0.11,0.031,3.4e-07,3e-07,3.2e-06,0.029,0.029,0.00013,0.0011,5.4e-05,0.0012,0.0011,0.00064,0.0012,1,1 -28890000,-0.28,0.016,-0.0057,0.96,0.061,-0.05,0.81,0.053,-0.054,-2.4,-0.0013,-0.0058,-0.00019,0.059,-0.031,-0.12,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00039,0.00035,0.045,0.017,0.02,0.0053,0.11,0.11,0.031,3.4e-07,3e-07,3.2e-06,0.029,0.029,0.00013,0.0011,5.4e-05,0.0012,0.0011,0.00064,0.0012,1,1 -28990000,-0.28,0.016,-0.0054,0.96,0.06,-0.047,0.81,0.055,-0.053,-2.3,-0.0013,-0.0058,-0.00018,0.059,-0.031,-0.12,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00039,0.00035,0.045,0.017,0.019,0.0053,0.11,0.12,0.031,3.4e-07,3e-07,3.2e-06,0.029,0.029,0.00013,0.0011,5.4e-05,0.0012,0.0011,0.00064,0.0012,1,1 -29090000,-0.28,0.016,-0.0053,0.96,0.063,-0.049,0.81,0.062,-0.058,-2.3,-0.0013,-0.0058,-0.00018,0.059,-0.031,-0.12,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00039,0.00035,0.045,0.018,0.02,0.0053,0.12,0.12,0.031,3.4e-07,2.9e-07,3.1e-06,0.029,0.029,0.00013,0.0011,5.4e-05,0.0012,0.0011,0.00064,0.0012,1,1 -29190000,-0.28,0.016,-0.0052,0.96,0.063,-0.048,0.81,0.063,-0.057,-2.2,-0.0013,-0.0058,-0.00015,0.058,-0.031,-0.12,-0.11,-0.024,0.5,0.084,-0.033,-0.066,0,0,0.00039,0.00035,0.045,0.017,0.02,0.0053,0.12,0.12,0.031,3.3e-07,2.9e-07,3.1e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00064,0.0012,1,1 -29290000,-0.28,0.016,-0.0055,0.96,0.068,-0.053,0.81,0.072,-0.061,-2.1,-0.0013,-0.0058,-0.00015,0.058,-0.031,-0.12,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00039,0.00035,0.045,0.018,0.021,0.0053,0.13,0.13,0.031,3.3e-07,2.9e-07,3.1e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00064,0.0012,1,1 -29390000,-0.27,0.015,-0.006,0.96,0.064,-0.05,0.81,0.07,-0.058,-2,-0.0013,-0.0058,-0.00012,0.058,-0.031,-0.12,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00039,0.00035,0.045,0.018,0.02,0.0053,0.13,0.13,0.031,3.3e-07,2.9e-07,3.1e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 -29490000,-0.27,0.015,-0.006,0.96,0.067,-0.051,0.81,0.077,-0.064,-2,-0.0013,-0.0058,-0.00011,0.058,-0.031,-0.12,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00039,0.00035,0.045,0.019,0.021,0.0053,0.14,0.14,0.031,3.3e-07,2.9e-07,3.1e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 -29590000,-0.27,0.015,-0.0058,0.96,0.064,-0.049,0.81,0.075,-0.062,-1.9,-0.0013,-0.0058,-8e-05,0.058,-0.031,-0.12,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00039,0.00035,0.045,0.018,0.021,0.0053,0.14,0.14,0.031,3.3e-07,2.8e-07,3e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 -29690000,-0.27,0.015,-0.0059,0.96,0.068,-0.047,0.81,0.082,-0.067,-1.8,-0.0013,-0.0058,-7.1e-05,0.057,-0.031,-0.12,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00039,0.00035,0.045,0.019,0.022,0.0053,0.14,0.15,0.031,3.3e-07,2.8e-07,3e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 -29790000,-0.27,0.015,-0.0057,0.96,0.066,-0.041,0.81,0.08,-0.063,-1.7,-0.0013,-0.0058,-3.9e-05,0.057,-0.031,-0.12,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00039,0.00035,0.045,0.019,0.021,0.0053,0.15,0.15,0.031,3.2e-07,2.8e-07,3e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 -29890000,-0.27,0.016,-0.0051,0.96,0.067,-0.042,0.8,0.087,-0.067,-1.7,-0.0013,-0.0058,-3.2e-05,0.057,-0.031,-0.12,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00039,0.00035,0.044,0.019,0.022,0.0053,0.15,0.16,0.031,3.2e-07,2.8e-07,3e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 -29990000,-0.27,0.016,-0.0053,0.96,0.062,-0.04,0.8,0.082,-0.066,-1.6,-0.0013,-0.0058,-1.6e-05,0.057,-0.031,-0.12,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00039,0.00035,0.044,0.019,0.021,0.0052,0.16,0.16,0.03,3.2e-07,2.8e-07,2.9e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 -30090000,-0.27,0.016,-0.0054,0.96,0.063,-0.039,0.8,0.089,-0.069,-1.5,-0.0013,-0.0058,-3.3e-05,0.057,-0.032,-0.12,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00039,0.00035,0.044,0.02,0.022,0.0052,0.16,0.17,0.03,3.2e-07,2.8e-07,2.9e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 -30190000,-0.27,0.016,-0.0054,0.96,0.059,-0.033,0.8,0.084,-0.06,-1.5,-0.0013,-0.0058,-1.9e-05,0.057,-0.032,-0.12,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00039,0.00035,0.044,0.019,0.022,0.0052,0.17,0.17,0.031,3.1e-07,2.8e-07,2.9e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 -30290000,-0.27,0.016,-0.0055,0.96,0.058,-0.033,0.8,0.09,-0.063,-1.4,-0.0013,-0.0058,-1.8e-05,0.057,-0.032,-0.12,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00039,0.00035,0.044,0.02,0.023,0.0052,0.17,0.18,0.03,3.1e-07,2.8e-07,2.9e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 -30390000,-0.27,0.016,-0.0055,0.96,0.056,-0.027,0.8,0.089,-0.057,-1.3,-0.0012,-0.0058,1.6e-05,0.057,-0.032,-0.12,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00039,0.00035,0.044,0.019,0.022,0.0052,0.17,0.18,0.03,3.1e-07,2.7e-07,2.8e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 -30490000,-0.27,0.016,-0.0055,0.96,0.059,-0.027,0.8,0.096,-0.06,-1.2,-0.0012,-0.0058,2.3e-05,0.057,-0.032,-0.12,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00039,0.00035,0.044,0.02,0.023,0.0052,0.18,0.19,0.031,3.1e-07,2.7e-07,2.8e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 -30590000,-0.27,0.016,-0.0057,0.96,0.058,-0.025,0.8,0.092,-0.056,-1.2,-0.0012,-0.0058,4.9e-05,0.057,-0.033,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.00039,0.00035,0.044,0.019,0.022,0.0052,0.18,0.19,0.03,3.1e-07,2.7e-07,2.8e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 -30690000,-0.27,0.016,-0.0061,0.96,0.055,-0.024,0.8,0.097,-0.058,-1.1,-0.0012,-0.0058,4.7e-05,0.057,-0.033,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.00039,0.00035,0.044,0.02,0.023,0.0052,0.19,0.2,0.03,3.1e-07,2.7e-07,2.8e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 -30790000,-0.27,0.016,-0.0059,0.96,0.049,-0.014,0.8,0.09,-0.046,-1,-0.0012,-0.0058,7.5e-05,0.057,-0.033,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.00039,0.00035,0.044,0.02,0.022,0.0052,0.19,0.2,0.03,3e-07,2.7e-07,2.8e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 -30890000,-0.27,0.016,-0.0053,0.96,0.048,-0.01,0.79,0.093,-0.047,-0.95,-0.0012,-0.0058,6.3e-05,0.057,-0.034,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.00039,0.00035,0.044,0.02,0.023,0.0052,0.2,0.21,0.03,3e-07,2.7e-07,2.7e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 -30990000,-0.27,0.016,-0.0054,0.96,0.043,-0.0084,0.8,0.089,-0.046,-0.88,-0.0012,-0.0058,6.7e-05,0.057,-0.034,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.00039,0.00035,0.044,0.02,0.022,0.0052,0.2,0.21,0.03,3e-07,2.7e-07,2.7e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00062,0.0012,1,1 -31090000,-0.27,0.016,-0.0056,0.96,0.042,-0.007,0.79,0.093,-0.046,-0.81,-0.0012,-0.0058,5.9e-05,0.057,-0.034,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.00039,0.00035,0.044,0.021,0.023,0.0052,0.21,0.22,0.03,3e-07,2.7e-07,2.7e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00062,0.0012,1,1 -31190000,-0.27,0.016,-0.0058,0.96,0.039,-0.0035,0.8,0.087,-0.042,-0.74,-0.0012,-0.0058,8.4e-05,0.057,-0.034,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.00039,0.00035,0.044,0.02,0.022,0.0052,0.21,0.22,0.03,3e-07,2.6e-07,2.7e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00062,0.0012,1,1 -31290000,-0.27,0.016,-0.006,0.96,0.036,-0.0016,0.8,0.09,-0.043,-0.67,-0.0012,-0.0058,9e-05,0.058,-0.034,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.00039,0.00035,0.044,0.021,0.023,0.0052,0.22,0.23,0.03,3e-07,2.6e-07,2.7e-06,0.029,0.029,0.00012,0.0011,5.4e-05,0.0012,0.0011,0.00062,0.0012,1,1 -31390000,-0.27,0.016,-0.0058,0.96,0.032,0.0033,0.8,0.084,-0.039,-0.59,-0.0012,-0.0058,8.9e-05,0.058,-0.035,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.00039,0.00035,0.044,0.02,0.022,0.0051,0.22,0.23,0.03,2.9e-07,2.6e-07,2.6e-06,0.029,0.029,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00062,0.0012,1,1 -31490000,-0.27,0.016,-0.0055,0.96,0.033,0.0067,0.8,0.089,-0.038,-0.52,-0.0012,-0.0058,8.6e-05,0.058,-0.035,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.00039,0.00035,0.044,0.021,0.023,0.0052,0.23,0.24,0.03,2.9e-07,2.6e-07,2.6e-06,0.029,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 -31590000,-0.27,0.016,-0.0053,0.96,0.034,0.0086,0.8,0.086,-0.035,-0.45,-0.0012,-0.0058,9.9e-05,0.058,-0.035,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.00039,0.00035,0.043,0.02,0.022,0.0051,0.23,0.24,0.03,2.9e-07,2.6e-07,2.6e-06,0.029,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 -31690000,-0.27,0.017,-0.0053,0.96,0.037,0.0099,0.8,0.091,-0.034,-0.38,-0.0012,-0.0058,0.00011,0.057,-0.035,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.0004,0.00035,0.043,0.021,0.023,0.0051,0.24,0.25,0.03,2.9e-07,2.6e-07,2.6e-06,0.029,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 -31790000,-0.27,0.017,-0.0055,0.96,0.031,0.015,0.8,0.087,-0.025,-0.3,-0.0012,-0.0058,0.00013,0.057,-0.035,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.0004,0.00035,0.043,0.02,0.022,0.0051,0.24,0.25,0.03,2.9e-07,2.6e-07,2.5e-06,0.029,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 -31890000,-0.27,0.017,-0.0053,0.96,0.03,0.018,0.8,0.091,-0.023,-0.23,-0.0012,-0.0058,0.00013,0.057,-0.036,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.0004,0.00035,0.043,0.021,0.023,0.0051,0.25,0.26,0.03,2.9e-07,2.6e-07,2.5e-06,0.029,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 -31990000,-0.27,0.017,-0.0056,0.96,0.026,0.019,0.79,0.088,-0.018,-0.17,-0.0012,-0.0058,0.00013,0.057,-0.036,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.0004,0.00035,0.043,0.02,0.022,0.0051,0.25,0.26,0.03,2.8e-07,2.5e-07,2.5e-06,0.029,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 -32090000,-0.27,0.016,-0.006,0.96,0.027,0.023,0.8,0.092,-0.015,-0.094,-0.0012,-0.0058,0.00013,0.057,-0.036,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.00039,0.00035,0.043,0.021,0.023,0.0051,0.26,0.27,0.03,2.8e-07,2.5e-07,2.5e-06,0.029,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 -32190000,-0.27,0.016,-0.0062,0.96,0.024,0.03,0.8,0.087,-0.0067,-0.026,-0.0012,-0.0058,0.00014,0.058,-0.036,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.00039,0.00035,0.043,0.02,0.022,0.0051,0.26,0.27,0.03,2.8e-07,2.5e-07,2.5e-06,0.029,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 -32290000,-0.27,0.017,-0.0061,0.96,0.024,0.033,0.8,0.09,-0.0036,0.044,-0.0012,-0.0058,0.00014,0.058,-0.036,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.0004,0.00035,0.043,0.021,0.023,0.0051,0.27,0.28,0.03,2.8e-07,2.5e-07,2.5e-06,0.029,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 -32390000,-0.27,0.017,-0.0063,0.96,0.021,0.035,0.8,0.086,-0.00041,0.12,-0.0012,-0.0058,0.00014,0.058,-0.037,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.0004,0.00035,0.043,0.02,0.022,0.0051,0.27,0.28,0.03,2.8e-07,2.5e-07,2.4e-06,0.029,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 -32490000,-0.27,0.015,-0.0093,0.96,-0.019,0.094,-0.076,0.084,0.008,0.12,-0.0012,-0.0058,0.00013,0.058,-0.037,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.00038,0.00036,0.043,0.022,0.025,0.0051,0.28,0.29,0.03,2.8e-07,2.5e-07,2.4e-06,0.029,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 -32590000,-0.27,0.015,-0.0093,0.96,-0.016,0.092,-0.079,0.085,-0.00026,0.1,-0.0012,-0.0058,0.00012,0.058,-0.037,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.00038,0.00035,0.043,0.021,0.024,0.0051,0.28,0.29,0.03,2.8e-07,2.5e-07,2.4e-06,0.029,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 -32690000,-0.27,0.015,-0.0093,0.96,-0.012,0.099,-0.08,0.084,0.0093,0.089,-0.0012,-0.0058,0.00012,0.058,-0.037,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.00038,0.00035,0.043,0.022,0.025,0.0051,0.29,0.3,0.03,2.8e-07,2.5e-07,2.4e-06,0.029,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 -32790000,-0.27,0.015,-0.0091,0.96,-0.0079,0.097,-0.081,0.085,0.0006,0.074,-0.0012,-0.0058,0.00011,0.058,-0.037,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.00038,0.00035,0.043,0.021,0.023,0.0051,0.29,0.3,0.03,2.7e-07,2.5e-07,2.3e-06,0.029,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 -32890000,-0.27,0.015,-0.0091,0.96,-0.0083,0.1,-0.083,0.084,0.01,0.059,-0.0012,-0.0058,0.00011,0.058,-0.037,-0.12,-0.11,-0.024,0.5,0.082,-0.033,-0.066,0,0,0.00038,0.00035,0.043,0.021,0.024,0.0051,0.3,0.31,0.03,2.7e-07,2.5e-07,2.3e-06,0.029,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 -32990000,-0.27,0.015,-0.0089,0.96,-0.0043,0.097,-0.082,0.085,-0.0039,0.046,-0.0012,-0.0058,0.0001,0.058,-0.037,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00037,0.00035,0.043,0.02,0.023,0.0051,0.3,0.31,0.03,2.7e-07,2.5e-07,2.3e-06,0.029,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 -33090000,-0.27,0.015,-0.0089,0.96,-0.00045,0.1,-0.079,0.084,0.006,0.038,-0.0012,-0.0058,0.0001,0.058,-0.037,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00037,0.00035,0.043,0.021,0.024,0.0051,0.31,0.32,0.03,2.7e-07,2.5e-07,2.3e-06,0.029,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 -33190000,-0.27,0.015,-0.0087,0.96,0.004,0.098,-0.078,0.085,-0.0098,0.031,-0.0012,-0.0058,6.9e-05,0.059,-0.035,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00037,0.00035,0.043,0.02,0.023,0.0051,0.31,0.32,0.03,2.7e-07,2.4e-07,2.3e-06,0.029,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 -33290000,-0.27,0.015,-0.0088,0.96,0.0081,0.1,-0.078,0.087,-0.0003,0.023,-0.0012,-0.0058,8.6e-05,0.058,-0.035,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00037,0.00035,0.043,0.021,0.024,0.0051,0.32,0.33,0.03,2.7e-07,2.4e-07,2.3e-06,0.029,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 -33390000,-0.27,0.015,-0.0087,0.96,0.012,0.097,-0.076,0.086,-0.0093,0.014,-0.0013,-0.0058,7.4e-05,0.059,-0.034,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00037,0.00035,0.043,0.02,0.022,0.0051,0.32,0.33,0.03,2.7e-07,2.4e-07,2.2e-06,0.028,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 -33490000,-0.27,0.015,-0.0087,0.96,0.018,0.1,-0.075,0.089,0.00059,0.0042,-0.0013,-0.0058,8.3e-05,0.059,-0.034,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00037,0.00035,0.043,0.021,0.023,0.0051,0.33,0.34,0.03,2.7e-07,2.4e-07,2.2e-06,0.028,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 -33590000,-0.27,0.015,-0.0085,0.96,0.021,0.098,-0.072,0.088,-0.013,-0.0037,-0.0013,-0.0058,7.5e-05,0.059,-0.033,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00037,0.00035,0.042,0.02,0.022,0.0051,0.33,0.34,0.03,2.6e-07,2.4e-07,2.2e-06,0.028,0.029,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00061,0.0012,1,1 -33690000,-0.27,0.015,-0.0085,0.96,0.025,0.1,-0.073,0.089,-0.0034,-0.012,-0.0013,-0.0058,8e-05,0.06,-0.033,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00037,0.00035,0.042,0.021,0.023,0.0051,0.34,0.35,0.03,2.7e-07,2.4e-07,2.2e-06,0.028,0.029,0.00011,0.0011,5.3e-05,0.0012,0.001,0.00061,0.0012,1,1 -33790000,-0.27,0.015,-0.0084,0.96,0.027,0.098,-0.068,0.086,-0.017,-0.019,-0.0013,-0.0058,5.8e-05,0.061,-0.033,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00037,0.00034,0.042,0.02,0.022,0.0051,0.34,0.35,0.03,2.6e-07,2.4e-07,2.2e-06,0.028,0.029,0.00011,0.0011,5.3e-05,0.0012,0.001,0.00061,0.0012,1,1 -33890000,-0.27,0.015,-0.0084,0.96,0.032,0.1,-0.067,0.089,-0.0074,-0.025,-0.0013,-0.0057,7.3e-05,0.06,-0.032,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00037,0.00034,0.042,0.021,0.023,0.0051,0.35,0.36,0.03,2.6e-07,2.4e-07,2.2e-06,0.028,0.029,0.00011,0.0011,5.3e-05,0.0012,0.001,0.00061,0.0012,1,1 -33990000,-0.27,0.015,-0.0083,0.96,0.034,0.098,-0.064,0.088,-0.016,-0.029,-0.0013,-0.0057,5.7e-05,0.061,-0.032,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00037,0.00034,0.042,0.02,0.022,0.0051,0.35,0.36,0.03,2.6e-07,2.4e-07,2.1e-06,0.028,0.029,0.00011,0.0011,5.2e-05,0.0012,0.001,0.00061,0.0012,1,1 -34090000,-0.27,0.015,-0.0082,0.96,0.037,0.1,-0.062,0.091,-0.0063,-0.033,-0.0013,-0.0057,6.1e-05,0.061,-0.032,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00037,0.00034,0.042,0.02,0.023,0.0051,0.36,0.37,0.03,2.6e-07,2.4e-07,2.1e-06,0.028,0.029,0.00011,0.0011,5.2e-05,0.0012,0.001,0.00061,0.0012,1,1 -34190000,-0.27,0.015,-0.0082,0.96,0.039,0.099,-0.059,0.086,-0.018,-0.037,-0.0013,-0.0057,5.2e-05,0.062,-0.031,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00037,0.00034,0.042,0.02,0.022,0.0051,0.36,0.37,0.03,2.6e-07,2.4e-07,2.1e-06,0.028,0.029,0.00011,0.0011,5.2e-05,0.0012,0.001,0.00061,0.0012,1,1 -34290000,-0.27,0.015,-0.008,0.96,0.04,0.1,-0.058,0.09,-0.0081,-0.042,-0.0013,-0.0057,6.3e-05,0.062,-0.031,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00037,0.00034,0.042,0.02,0.023,0.0051,0.37,0.38,0.03,2.6e-07,2.4e-07,2.1e-06,0.028,0.029,0.00011,0.0011,5.2e-05,0.0012,0.001,0.00061,0.0012,1,1 -34390000,-0.27,0.015,-0.0079,0.96,0.041,0.098,-0.053,0.086,-0.02,-0.047,-0.0013,-0.0057,5.1e-05,0.063,-0.031,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00037,0.00034,0.042,0.02,0.022,0.0051,0.37,0.38,0.03,2.6e-07,2.4e-07,2.1e-06,0.028,0.029,0.00011,0.0011,5.2e-05,0.0012,0.001,0.00061,0.0012,1,1 -34490000,-0.27,0.015,-0.008,0.96,0.044,0.1,-0.052,0.089,-0.01,-0.049,-0.0013,-0.0057,6.4e-05,0.063,-0.031,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00037,0.00034,0.042,0.02,0.023,0.0051,0.38,0.39,0.03,2.6e-07,2.4e-07,2.1e-06,0.028,0.029,0.00011,0.0011,5.2e-05,0.0012,0.001,0.00061,0.0012,1,1 -34590000,-0.27,0.015,-0.0079,0.96,0.047,0.095,0.74,0.085,-0.024,-0.021,-0.0013,-0.0057,5e-05,0.064,-0.03,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00036,0.00034,0.042,0.019,0.021,0.005,0.38,0.38,0.03,2.6e-07,2.4e-07,2.1e-06,0.028,0.028,0.0001,0.0011,5.2e-05,0.0012,0.001,0.00061,0.0012,1,1 -34690000,-0.27,0.015,-0.0079,0.96,0.054,0.096,1.7,0.089,-0.015,0.098,-0.0013,-0.0057,5.6e-05,0.064,-0.03,-0.12,-0.11,-0.024,0.5,0.082,-0.035,-0.066,0,0,0.00036,0.00034,0.042,0.019,0.021,0.0051,0.39,0.4,0.03,2.6e-07,2.4e-07,2.1e-06,0.028,0.028,0.0001,0.0011,5.2e-05,0.0012,0.001,0.00061,0.0012,1,1 -34790000,-0.27,0.014,-0.0078,0.96,0.058,0.088,2.7,0.083,-0.028,0.28,-0.0013,-0.0057,4.5e-05,0.064,-0.03,-0.12,-0.11,-0.024,0.5,0.082,-0.035,-0.066,0,0,0.00036,0.00034,0.042,0.019,0.02,0.005,0.39,0.39,0.03,2.6e-07,2.3e-07,2e-06,0.028,0.028,0.0001,0.0011,5.2e-05,0.0012,0.001,0.00061,0.0012,1,1 -34890000,-0.27,0.014,-0.0078,0.96,0.065,0.089,3.7,0.089,-0.019,0.57,-0.0013,-0.0057,5.1e-05,0.064,-0.03,-0.12,-0.11,-0.024,0.5,0.082,-0.035,-0.066,0,0,0.00036,0.00034,0.042,0.02,0.022,0.005,0.4,0.41,0.03,2.6e-07,2.4e-07,2e-06,0.028,0.028,0.0001,0.0011,5.2e-05,0.0012,0.001,0.00061,0.0012,1,1 +190000,1,-0.012,-0.011,0.00044,-0.0023,-0.003,-0.037,-0.00017,-0.00043,-0.017,4.7e-10,-5e-10,-2.1e-11,0,0,-1.1e-06,0,0,0,0,0,0,0,0,0.011,0.011,0.00094,25,25,10,1e+02,1e+02,1,0.01,0.01,0.01,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +290000,1,-0.012,-0.011,0.00044,-0.0033,-0.0044,-0.046,-0.00024,-0.00025,-0.018,3.8e-09,-5.9e-09,-2.1e-10,0,0,-1e-05,0,0,0,0,0,0,0,0,0.012,0.012,0.00077,25,25,9.6,0.37,0.37,0.41,0.01,0.01,0.0052,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +390000,1,-0.012,-0.011,0.00049,-0.0025,-0.0059,-0.063,-0.00056,-0.00071,-0.013,-7.1e-09,-5.8e-09,1.5e-11,0,0,2.2e-06,0,0,0,0,0,0,0,0,0.012,0.012,0.0012,25,25,8.1,0.97,0.97,0.32,0.01,0.01,0.0052,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +490000,1,-0.012,-0.012,0.00055,-0.0007,-0.0062,-0.069,-0.00015,-0.00046,-0.011,-1.2e-06,7.4e-07,4.1e-08,0,0,-1e-06,0,0,0,0,0,0,0,0,0.013,0.013,0.00073,7.8,7.8,5.9,0.34,0.34,0.31,0.01,0.01,0.0024,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +590000,1,-0.012,-0.012,0.00057,-0.002,-0.009,-0.12,-0.00028,-0.0012,-0.029,-1.3e-06,7.7e-07,4.5e-08,0,0,7.8e-05,0,0,0,0,0,0,0,0,0.015,0.015,0.001,7.9,7.9,4.2,0.67,0.67,0.32,0.01,0.01,0.0024,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +690000,1,-0.012,-0.012,0.0006,5.4e-05,-0.0088,-0.05,-8e-05,-0.00078,-0.0088,-5.6e-06,1.6e-06,1.6e-07,0,0,-0.00016,0,0,0,0,0,0,0,0,0.016,0.016,0.00063,2.7,2.7,2.8,0.26,0.26,0.29,0.01,0.01,0.0012,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +790000,1,-0.012,-0.012,0.0006,0.0022,-0.01,-0.054,-2.3e-05,-0.0017,-0.011,-5.4e-06,1.6e-06,1.5e-07,0,0,-0.0002,0,0,0,0,0,0,0,0,0.018,0.018,0.0008,2.8,2.8,1.9,0.42,0.42,0.27,0.01,0.01,0.0012,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +890000,1,-0.012,-0.013,0.00061,0.0031,-0.0084,-0.093,0.00015,-0.0011,-0.031,-2.1e-05,1e-06,4.9e-07,0,0,-8.1e-05,0,0,0,0,0,0,0,0,0.019,0.019,0.00054,1.3,1.3,1.3,0.2,0.2,0.25,0.0099,0.0099,0.00068,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +990000,1,-0.012,-0.013,0.00058,0.006,-0.0097,-0.12,0.00062,-0.002,-0.046,-2.2e-05,1e-06,5e-07,0,0,-2.6e-05,0,0,0,0,0,0,0,0,0.021,0.021,0.00066,1.5,1.5,0.95,0.3,0.3,0.23,0.0099,0.0099,0.00068,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +1090000,1,-0.012,-0.013,0.00054,0.011,-0.013,-0.13,0.00077,-0.0014,-0.062,-6e-05,-1.5e-05,9.9e-07,0,0,1.1e-05,0,0,0,0,0,0,0,0,0.023,0.023,0.00047,0.93,0.93,0.69,0.17,0.17,0.2,0.0098,0.0098,0.00043,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +1190000,1,-0.012,-0.013,0.00047,0.015,-0.018,-0.11,0.0021,-0.003,-0.047,-5.8e-05,-1.3e-05,9.7e-07,0,0,-0.00056,0,0,0,0,0,0,0,0,0.025,0.025,0.00056,1.1,1.1,0.54,0.24,0.24,0.19,0.0098,0.0098,0.00043,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +1290000,1,-0.012,-0.014,0.00042,0.019,-0.018,-0.11,0.0019,-0.0024,-0.048,-0.00017,-9.7e-05,1.5e-06,0,0,-0.00083,0,0,0,0,0,0,0,0,0.026,0.026,0.00042,0.89,0.89,0.42,0.15,0.15,0.18,0.0095,0.0095,0.00029,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +1390000,1,-0.012,-0.014,0.00038,0.026,-0.023,-0.097,0.0043,-0.0044,-0.038,-0.00016,-9.2e-05,1.5e-06,0,0,-0.0015,0,0,0,0,0,0,0,0,0.028,0.028,0.00049,1.2,1.2,0.33,0.21,0.21,0.16,0.0095,0.0095,0.00029,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +1490000,1,-0.012,-0.014,0.00038,0.024,-0.02,-0.12,0.0034,-0.0032,-0.053,-0.00039,-0.00033,1.3e-06,0,0,-0.0013,0,0,0,0,0,0,0,0,0.027,0.027,0.00038,0.96,0.96,0.27,0.14,0.14,0.15,0.0088,0.0088,0.0002,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +1590000,1,-0.012,-0.014,0.00039,0.031,-0.024,-0.13,0.0061,-0.0055,-0.063,-0.00039,-0.00033,1.3e-06,0,0,-0.0015,0,0,0,0,0,0,0,0,0.03,0.03,0.00043,1.3,1.3,0.23,0.2,0.2,0.14,0.0088,0.0088,0.0002,0.04,0.04,0.04,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +1690000,1,-0.012,-0.014,0.00044,0.028,-0.019,-0.13,0.0043,-0.0037,-0.068,-0.00073,-0.00074,-7.7e-08,0,0,-0.0019,0,0,0,0,0,0,0,0,0.026,0.026,0.00034,1,1,0.19,0.14,0.14,0.13,0.0078,0.0078,0.00015,0.04,0.04,0.039,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +1790000,1,-0.012,-0.014,0.0004,0.035,-0.024,-0.13,0.0076,-0.0059,-0.067,-0.00073,-0.00073,-3.3e-08,0,0,-0.0029,0,0,0,0,0,0,0,0,0.028,0.028,0.00039,1.3,1.3,0.17,0.2,0.2,0.12,0.0078,0.0078,0.00015,0.04,0.04,0.039,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +1890000,1,-0.012,-0.014,0.00039,0.043,-0.025,-0.14,0.011,-0.0083,-0.075,-0.00072,-0.00072,-7e-09,0,0,-0.0033,0,0,0,0,0,0,0,0,0.031,0.031,0.00043,1.7,1.7,0.15,0.31,0.31,0.12,0.0078,0.0078,0.00015,0.04,0.04,0.039,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +1990000,1,-0.011,-0.014,0.0004,0.035,-0.018,-0.14,0.0082,-0.0053,-0.074,-0.0011,-0.0013,-3.1e-06,0,0,-0.0047,0,0,0,0,0,0,0,0,0.025,0.025,0.00035,1.3,1.3,0.13,0.2,0.2,0.11,0.0067,0.0067,0.00011,0.04,0.04,0.039,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +2090000,1,-0.011,-0.014,0.00043,0.042,-0.02,-0.14,0.012,-0.0073,-0.071,-0.0011,-0.0012,-3e-06,0,0,-0.0066,0,0,0,0,0,0,0,0,0.027,0.027,0.00039,1.7,1.7,0.12,0.31,0.31,0.11,0.0067,0.0067,0.00011,0.04,0.04,0.039,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +2190000,1,-0.011,-0.014,0.00039,0.033,-0.013,-0.14,0.0081,-0.0043,-0.077,-0.0014,-0.0018,-7.8e-06,0,0,-0.0076,0,0,0,0,0,0,0,0,0.02,0.02,0.00031,1.2,1.2,0.11,0.2,0.2,0.11,0.0055,0.0055,9e-05,0.04,0.04,0.038,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +2290000,1,-0.011,-0.014,0.00038,0.038,-0.014,-0.14,0.012,-0.0057,-0.075,-0.0014,-0.0018,-7.6e-06,0,0,-0.0099,0,0,0,0,0,0,0,0,0.022,0.022,0.00034,1.5,1.5,0.11,0.3,0.3,0.1,0.0055,0.0055,9e-05,0.04,0.04,0.038,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +2390000,1,-0.011,-0.013,0.0004,0.029,-0.0098,-0.14,0.0075,-0.0033,-0.072,-0.0017,-0.0023,-1.3e-05,0,0,-0.013,0,0,0,0,0,0,0,0,0.017,0.017,0.00028,1,1,0.1,0.19,0.19,0.098,0.0046,0.0046,7.1e-05,0.04,0.04,0.037,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +2490000,1,-0.011,-0.014,0.00047,0.033,-0.0088,-0.14,0.011,-0.0042,-0.079,-0.0017,-0.0023,-1.3e-05,0,0,-0.014,0,0,0,0,0,0,0,0,0.018,0.018,0.00031,1.3,1.3,0.1,0.28,0.28,0.097,0.0046,0.0046,7.1e-05,0.04,0.04,0.037,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +2590000,1,-0.01,-0.013,0.00039,0.023,-0.0059,-0.15,0.0066,-0.0023,-0.084,-0.0018,-0.0027,-1.9e-05,0,0,-0.015,0,0,0,0,0,0,0,0,0.014,0.014,0.00026,0.89,0.89,0.099,0.18,0.18,0.094,0.0038,0.0038,5.8e-05,0.04,0.04,0.036,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +2690000,1,-0.01,-0.013,0.00043,0.027,-0.0051,-0.15,0.0091,-0.0029,-0.084,-0.0018,-0.0027,-1.8e-05,0,0,-0.018,0,0,0,0,0,0,0,0,0.015,0.015,0.00028,1.1,1.1,0.097,0.25,0.25,0.091,0.0038,0.0038,5.8e-05,0.04,0.04,0.036,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +2790000,1,-0.01,-0.013,0.00037,0.022,-0.0029,-0.14,0.0059,-0.0016,-0.081,-0.0019,-0.003,-2.3e-05,0,0,-0.022,0,0,0,0,0,0,0,0,0.011,0.011,0.00024,0.77,0.77,0.095,0.16,0.16,0.089,0.0032,0.0032,4.8e-05,0.04,0.04,0.035,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +2890000,1,-0.01,-0.013,0.0003,0.026,-0.0046,-0.14,0.0082,-0.002,-0.081,-0.0019,-0.003,-2.3e-05,0,0,-0.026,0,0,0,0,0,0,0,0,0.013,0.013,0.00026,0.95,0.95,0.096,0.23,0.23,0.089,0.0032,0.0032,4.8e-05,0.04,0.04,0.034,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +2990000,1,-0.01,-0.013,0.00031,0.02,-0.0035,-0.15,0.0054,-0.0012,-0.086,-0.002,-0.0033,-2.8e-05,0,0,-0.028,0,0,0,0,0,0,0,0,0.0099,0.0099,0.00022,0.67,0.67,0.095,0.15,0.15,0.088,0.0027,0.0027,4e-05,0.04,0.04,0.033,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +3090000,1,-0.01,-0.013,0.00052,0.025,-0.0063,-0.15,0.0077,-0.0018,-0.087,-0.002,-0.0033,-2.8e-05,0,0,-0.031,0,0,0,0,0,0,0,0,0.011,0.011,0.00024,0.83,0.83,0.095,0.22,0.22,0.086,0.0027,0.0027,4e-05,0.04,0.04,0.032,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +3190000,1,-0.01,-0.013,0.00056,0.02,-0.0061,-0.15,0.0051,-0.0013,-0.097,-0.002,-0.0036,-3.2e-05,0,0,-0.033,0,0,0,0,0,0,0,0,0.0088,0.0088,0.00021,0.59,0.59,0.096,0.14,0.14,0.087,0.0023,0.0023,3.4e-05,0.04,0.04,0.031,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +3290000,1,-0.01,-0.013,0.00059,0.023,-0.0062,-0.15,0.0073,-0.002,-0.11,-0.002,-0.0036,-3.2e-05,0,0,-0.035,0,0,0,0,0,0,0,0,0.0096,0.0096,0.00022,0.73,0.73,0.095,0.2,0.2,0.086,0.0023,0.0023,3.4e-05,0.04,0.04,0.03,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +3390000,1,-0.0098,-0.013,0.0006,0.019,-0.0032,-0.15,0.0049,-0.0013,-0.1,-0.0021,-0.0038,-3.5e-05,0,0,-0.04,0,0,0,0,0,0,0,0,0.0078,0.0078,0.00019,0.53,0.53,0.095,0.14,0.14,0.085,0.002,0.002,2.9e-05,0.04,0.04,0.029,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +3490000,1,-0.0097,-0.013,0.00058,0.025,-0.0018,-0.15,0.0072,-0.0016,-0.1,-0.0021,-0.0038,-3.5e-05,0,0,-0.044,0,0,0,0,0,0,0,0,0.0086,0.0086,0.00021,0.66,0.66,0.095,0.19,0.19,0.086,0.002,0.002,2.9e-05,0.04,0.04,0.027,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +3590000,1,-0.0095,-0.012,0.00054,0.021,-0.0014,-0.15,0.0051,-0.00091,-0.11,-0.0022,-0.004,-3.9e-05,0,0,-0.047,0,0,0,0,0,0,0,0,0.007,0.0071,0.00018,0.49,0.49,0.094,0.13,0.13,0.086,0.0017,0.0017,2.5e-05,0.04,0.04,0.026,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +3690000,1,-0.0095,-0.013,0.00052,0.024,-0.00063,-0.15,0.0074,-0.0011,-0.11,-0.0022,-0.004,-3.9e-05,0,0,-0.052,0,0,0,0,0,0,0,0,0.0077,0.0077,0.00019,0.6,0.6,0.093,0.18,0.18,0.085,0.0017,0.0017,2.5e-05,0.04,0.04,0.025,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +3790000,1,-0.0094,-0.012,0.00055,0.019,0.0038,-0.15,0.0051,-0.00046,-0.11,-0.0022,-0.0043,-4.3e-05,0,0,-0.055,0,0,0,0,0,0,0,0,0.0064,0.0064,0.00017,0.45,0.45,0.093,0.12,0.12,0.086,0.0014,0.0014,2.2e-05,0.04,0.04,0.024,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +3890000,1,-0.0094,-0.013,0.00063,0.021,0.005,-0.14,0.0072,-1.9e-05,-0.11,-0.0022,-0.0042,-4.3e-05,0,0,-0.059,0,0,0,0,0,0,0,0,0.0069,0.0069,0.00018,0.55,0.55,0.091,0.17,0.17,0.086,0.0014,0.0014,2.2e-05,0.04,0.04,0.022,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +3990000,1,-0.0094,-0.013,0.0007,0.026,0.0048,-0.14,0.0096,0.00041,-0.11,-0.0022,-0.0042,-4.3e-05,0,0,-0.064,0,0,0,0,0,0,0,0,0.0075,0.0075,0.00019,0.66,0.66,0.089,0.23,0.23,0.085,0.0014,0.0014,2.2e-05,0.04,0.04,0.021,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +4090000,1,-0.0093,-0.012,0.00076,0.022,0.0042,-0.12,0.0071,0.0006,-0.098,-0.0022,-0.0044,-4.8e-05,0,0,-0.072,0,0,0,0,0,0,0,0,0.0062,0.0062,0.00017,0.5,0.5,0.087,0.16,0.16,0.085,0.0012,0.0012,1.9e-05,0.04,0.04,0.02,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +4190000,1,-0.0094,-0.012,0.00073,0.024,0.0039,-0.12,0.0094,0.001,-0.1,-0.0022,-0.0044,-4.8e-05,0,0,-0.074,0,0,0,0,0,0,0,0,0.0068,0.0068,0.00018,0.61,0.61,0.086,0.21,0.21,0.086,0.0012,0.0012,1.9e-05,0.04,0.04,0.019,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +4290000,1,-0.0095,-0.012,0.00074,0.021,0.0037,-0.12,0.0068,0.00083,-0.11,-0.0021,-0.0046,-5.3e-05,0,0,-0.077,0,0,0,0,0,0,0,0,0.0056,0.0056,0.00016,0.47,0.47,0.084,0.15,0.15,0.085,0.00097,0.00097,1.7e-05,0.04,0.04,0.017,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +4390000,1,-0.0094,-0.012,0.0007,0.025,0.0023,-0.11,0.0091,0.0011,-0.094,-0.0021,-0.0046,-5.2e-05,0,0,-0.083,0,0,0,0,0,0,0,0,0.006,0.006,0.00017,0.56,0.56,0.081,0.2,0.2,0.084,0.00097,0.00097,1.7e-05,0.04,0.04,0.016,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +4490000,1,-0.0094,-0.012,0.00076,0.021,0.004,-0.11,0.0067,0.00086,-0.095,-0.0021,-0.0048,-5.7e-05,0,0,-0.086,0,0,0,0,0,0,0,0,0.005,0.005,0.00016,0.43,0.43,0.08,0.14,0.14,0.085,0.0008,0.0008,1.5e-05,0.04,0.04,0.015,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +4590000,1,-0.0094,-0.012,0.00083,0.023,0.0029,-0.11,0.0089,0.0012,-0.098,-0.0021,-0.0048,-5.7e-05,0,0,-0.088,0,0,0,0,0,0,0,0,0.0054,0.0054,0.00016,0.52,0.52,0.077,0.19,0.19,0.084,0.0008,0.0008,1.5e-05,0.04,0.04,0.014,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +4690000,1,-0.0094,-0.012,0.00076,0.017,0.0031,-0.1,0.0064,0.00089,-0.09,-0.0021,-0.005,-6.1e-05,0,0,-0.093,0,0,0,0,0,0,0,0,0.0044,0.0044,0.00015,0.4,0.4,0.074,0.14,0.14,0.083,0.00065,0.00065,1.3e-05,0.04,0.04,0.013,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +4790000,1,-0.0093,-0.012,0.00086,0.015,0.0053,-0.099,0.008,0.0014,-0.092,-0.0021,-0.005,-6.1e-05,0,0,-0.095,0,0,0,0,0,0,0,0,0.0047,0.0047,0.00016,0.47,0.47,0.073,0.18,0.18,0.084,0.00065,0.00065,1.3e-05,0.04,0.04,0.012,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +4890000,1,-0.0092,-0.012,0.0009,0.01,0.0028,-0.093,0.0053,0.001,-0.088,-0.0021,-0.0051,-6.5e-05,0,0,-0.099,0,0,0,0,0,0,0,0,0.0039,0.0039,0.00014,0.36,0.36,0.07,0.13,0.13,0.083,0.00053,0.00053,1.2e-05,0.04,0.04,0.011,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +4990000,1,-0.0092,-0.012,0.00089,0.013,0.0035,-0.085,0.0065,0.0014,-0.083,-0.0021,-0.0051,-6.5e-05,0,0,-0.1,0,0,0,0,0,0,0,0,0.0042,0.0042,0.00015,0.43,0.43,0.067,0.17,0.17,0.082,0.00053,0.00053,1.2e-05,0.04,0.04,0.011,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +5090000,1,-0.0091,-0.011,0.00096,0.01,0.0038,-0.082,0.0045,0.001,-0.082,-0.002,-0.0052,-6.8e-05,0,0,-0.1,0,0,0,0,0,0,0,0,0.0034,0.0034,0.00014,0.33,0.33,0.065,0.12,0.12,0.082,0.00043,0.00043,1e-05,0.04,0.04,0.0098,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +5190000,1,-0.0089,-0.012,0.001,0.0099,0.0074,-0.08,0.0055,0.0015,-0.079,-0.002,-0.0052,-6.8e-05,0,0,-0.11,0,0,0,0,0,0,0,0,0.0037,0.0037,0.00014,0.39,0.39,0.063,0.16,0.16,0.081,0.00043,0.00043,1e-05,0.04,0.04,0.0091,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +5290000,1,-0.0089,-0.011,0.0011,0.0082,0.0074,-0.068,0.0038,0.0014,-0.072,-0.002,-0.0053,-7e-05,0,0,-0.11,0,0,0,0,0,0,0,0,0.003,0.003,0.00013,0.3,0.3,0.06,0.12,0.12,0.08,0.00035,0.00035,9.3e-06,0.04,0.04,0.0084,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +5390000,1,-0.0088,-0.011,0.0011,0.0077,0.011,-0.065,0.0046,0.0022,-0.067,-0.002,-0.0053,-7e-05,0,0,-0.11,0,0,0,0,0,0,0,0,0.0032,0.0032,0.00014,0.36,0.36,0.057,0.16,0.16,0.079,0.00035,0.00035,9.3e-06,0.04,0.04,0.0078,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +5490000,1,-0.0088,-0.011,0.0011,0.0072,0.012,-0.06,0.0031,0.0021,-0.065,-0.002,-0.0054,-7.2e-05,0,0,-0.11,0,0,0,0,0,0,0,0,0.0027,0.0027,0.00013,0.28,0.28,0.056,0.11,0.11,0.079,0.00028,0.00028,8.4e-06,0.04,0.04,0.0073,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +5590000,1,-0.0088,-0.012,0.00099,0.0083,0.016,-0.053,0.004,0.0035,-0.058,-0.002,-0.0054,-7.2e-05,0,0,-0.12,0,0,0,0,0,0,0,0,0.0028,0.0028,0.00013,0.33,0.33,0.053,0.15,0.15,0.078,0.00028,0.00028,8.4e-06,0.04,0.04,0.0067,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +5690000,1,-0.0089,-0.011,0.00089,0.0077,0.016,-0.052,0.0028,0.003,-0.055,-0.0019,-0.0054,-7.5e-05,0,0,-0.12,0,0,0,0,0,0,0,0,0.0024,0.0024,0.00012,0.25,0.25,0.051,0.11,0.11,0.076,0.00023,0.00023,7.6e-06,0.04,0.04,0.0063,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +5790000,1,-0.0088,-0.011,0.00085,0.0089,0.018,-0.049,0.0036,0.0047,-0.053,-0.0019,-0.0054,-7.5e-05,0,0,-0.12,0,0,0,0,0,0,0,0,0.0025,0.0025,0.00013,0.3,0.3,0.05,0.14,0.14,0.077,0.00023,0.00023,7.6e-06,0.04,0.04,0.0059,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +5890000,1,-0.0088,-0.011,0.00088,0.0095,0.015,-0.048,0.0027,0.0038,-0.056,-0.0019,-0.0055,-7.7e-05,0,0,-0.12,0,0,0,0,0,0,0,0,0.0021,0.0021,0.00012,0.23,0.23,0.047,0.1,0.1,0.075,0.00018,0.00018,6.9e-06,0.04,0.04,0.0054,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +5990000,1,-0.0088,-0.012,0.00086,0.011,0.017,-0.041,0.0038,0.0054,-0.05,-0.0019,-0.0055,-7.7e-05,0,0,-0.12,0,0,0,0,0,0,0,0,0.0022,0.0022,0.00012,0.27,0.27,0.045,0.13,0.13,0.074,0.00018,0.00018,6.9e-06,0.04,0.04,0.005,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +6090000,1,-0.0088,-0.011,0.00067,0.011,0.018,-0.039,0.0049,0.0072,-0.047,-0.0019,-0.0055,-7.7e-05,0,0,-0.12,0,0,0,0,0,0,0,0,0.0023,0.0023,0.00013,0.31,0.31,0.044,0.17,0.17,0.074,0.00018,0.00018,6.9e-06,0.04,0.04,0.0047,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +6190000,1,-0.0089,-0.011,0.00068,0.0087,0.017,-0.038,0.0038,0.0057,-0.047,-0.0018,-0.0055,-8e-05,0,0,-0.12,0,0,0,0,0,0,0,0,0.002,0.002,0.00012,0.24,0.24,0.042,0.13,0.13,0.073,0.00015,0.00015,6.3e-06,0.04,0.04,0.0044,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +6290000,1,-0.0089,-0.011,0.00071,0.008,0.019,-0.041,0.0046,0.0075,-0.053,-0.0018,-0.0055,-8e-05,0,0,-0.12,0,0,0,0,0,0,0,0,0.0021,0.0021,0.00012,0.28,0.28,0.04,0.16,0.16,0.072,0.00015,0.00015,6.3e-06,0.04,0.04,0.0041,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +6390000,1,-0.0089,-0.011,0.00072,0.0082,0.016,-0.042,0.0034,0.006,-0.056,-0.0017,-0.0056,-8.2e-05,0,0,-0.12,0,0,0,0,0,0,0,0,0.0017,0.0017,0.00011,0.22,0.22,0.039,0.12,0.12,0.072,0.00012,0.00012,5.8e-06,0.04,0.04,0.0039,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +6490000,1,-0.0089,-0.011,0.00062,0.0057,0.016,-0.039,0.0041,0.0076,-0.053,-0.0017,-0.0056,-8.2e-05,0,0,-0.13,0,0,0,0,0,0,0,0,0.0018,0.0018,0.00012,0.25,0.25,0.038,0.15,0.15,0.07,0.00012,0.00012,5.8e-06,0.04,0.04,0.0036,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +6590000,1,-0.009,-0.011,0.00055,0.0039,0.015,-0.042,0.0029,0.0058,-0.056,-0.0017,-0.0056,-8.5e-05,0,0,-0.13,0,0,0,0,0,0,0,0,0.0016,0.0016,0.00011,0.2,0.2,0.036,0.12,0.12,0.069,9.8e-05,9.8e-05,5.3e-06,0.04,0.04,0.0034,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +6690000,1,-0.0089,-0.011,0.0005,0.0022,0.018,-0.044,0.0032,0.0075,-0.057,-0.0017,-0.0056,-8.5e-05,0,0,-0.13,0,0,0,0,0,0,0,0,0.0016,0.0016,0.00011,0.23,0.23,0.035,0.14,0.14,0.068,9.8e-05,9.8e-05,5.3e-06,0.04,0.04,0.0031,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +6790000,1,-0.009,-0.011,0.00047,0.003,0.015,-0.042,0.0021,0.0059,-0.058,-0.0016,-0.0056,-8.6e-05,0,0,-0.13,0,0,0,0,0,0,0,0,0.0014,0.0014,0.00011,0.18,0.18,0.034,0.11,0.11,0.068,8e-05,8.1e-05,4.9e-06,0.04,0.04,0.003,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +6890000,1,-0.0088,-0.011,0.00039,0.0023,0.015,-0.039,0.0024,0.0074,-0.055,-0.0016,-0.0056,-8.6e-05,0,0,-0.13,0,0,0,0,0,0,0,0,0.0015,0.0015,0.00011,0.21,0.21,0.032,0.14,0.14,0.067,8e-05,8.1e-05,4.9e-06,0.04,0.04,0.0028,0.0025,0.0025,0.0025,0.0025,0.0025,0.0025,1,1 +6990000,-0.29,0.024,-0.0065,0.96,-0.0055,0.0091,-0.037,0.0023,0.0053,-0.055,-0.0016,-0.0056,-8.7e-05,0,0,-0.13,-0.092,-0.02,0.51,0.069,-0.028,-0.058,0,0,0.0012,0.0012,0.072,0.16,0.16,0.031,0.11,0.11,0.066,6.6e-05,6.6e-05,4.6e-06,0.04,0.04,0.0026,0.0014,0.00048,0.0014,0.0014,0.0012,0.0014,1,1 +7090000,-0.28,0.025,-0.0064,0.96,-0.026,-0.00083,-0.037,0.0022,0.0052,-0.056,-0.0015,-0.0055,-8.7e-05,0,0,-0.13,-0.099,-0.021,0.51,0.075,-0.029,-0.065,0,0,0.0012,0.0012,0.058,0.16,0.16,0.03,0.13,0.13,0.066,6.6e-05,6.6e-05,4.6e-06,0.04,0.04,0.0024,0.0013,0.00025,0.0013,0.0013,0.00099,0.0013,1,1 +7190000,-0.28,0.026,-0.0064,0.96,-0.047,-0.0082,-0.036,0.00063,0.0038,-0.058,-0.0015,-0.0055,-8.6e-05,3.9e-05,-1e-05,-0.13,-0.1,-0.022,0.51,0.077,-0.03,-0.067,0,0,0.0012,0.0012,0.054,0.17,0.17,0.029,0.16,0.16,0.065,6.6e-05,6.6e-05,4.6e-06,0.04,0.04,0.0023,0.0013,0.00018,0.0013,0.0013,0.00094,0.0013,1,1 +7290000,-0.28,0.026,-0.0064,0.96,-0.07,-0.017,-0.033,-0.0034,0.0023,-0.054,-0.0015,-0.0054,-8.5e-05,0.00011,-5e-06,-0.13,-0.1,-0.022,0.51,0.077,-0.03,-0.067,0,0,0.0012,0.0012,0.053,0.18,0.18,0.028,0.19,0.19,0.064,6.6e-05,6.6e-05,4.6e-06,0.04,0.04,0.0022,0.0013,0.00015,0.0013,0.0013,0.00093,0.0013,1,1 +7390000,-0.28,0.026,-0.0062,0.96,-0.091,-0.024,-0.031,-0.0098,-8.5e-05,-0.052,-0.0015,-0.0054,-8.4e-05,0.00016,-4e-06,-0.13,-0.1,-0.022,0.51,0.077,-0.03,-0.067,0,0,0.0012,0.0012,0.052,0.19,0.19,0.027,0.22,0.22,0.064,6.6e-05,6.6e-05,4.6e-06,0.04,0.04,0.002,0.0013,0.00013,0.0013,0.0013,0.00092,0.0013,1,1 +7490000,-0.28,0.026,-0.0062,0.96,-0.11,-0.032,-0.025,-0.015,-0.0034,-0.046,-0.0015,-0.0053,-8.1e-05,0.00033,7.2e-07,-0.13,-0.1,-0.022,0.5,0.077,-0.03,-0.068,0,0,0.0012,0.0012,0.051,0.2,0.2,0.026,0.26,0.26,0.063,6.6e-05,6.6e-05,4.6e-06,0.04,0.04,0.0019,0.0013,0.00012,0.0013,0.0013,0.00091,0.0013,1,1 +7590000,-0.28,0.026,-0.0063,0.96,-0.13,-0.041,-0.021,-0.024,-0.0083,-0.04,-0.0015,-0.0052,-8e-05,0.00045,-2.7e-05,-0.13,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0012,0.0012,0.051,0.22,0.21,0.025,0.3,0.3,0.062,6.6e-05,6.5e-05,4.6e-06,0.04,0.04,0.0018,0.0013,0.00011,0.0013,0.0013,0.00091,0.0013,1,1 +7690000,-0.28,0.026,-0.0063,0.96,-0.16,-0.051,-0.02,-0.034,-0.015,-0.036,-0.0014,-0.0051,-7.9e-05,0.00056,-6.8e-05,-0.13,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0013,0.0012,0.05,0.23,0.23,0.025,0.34,0.34,0.062,6.5e-05,6.5e-05,4.6e-06,0.04,0.04,0.0017,0.0013,0.0001,0.0013,0.0013,0.0009,0.0013,1,1 +7790000,-0.28,0.026,-0.0062,0.96,-0.18,-0.061,-0.022,-0.041,-0.025,-0.041,-0.0014,-0.005,-7.8e-05,0.00088,-0.00023,-0.13,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0013,0.0012,0.05,0.26,0.25,0.024,0.39,0.39,0.061,6.5e-05,6.5e-05,4.6e-06,0.04,0.04,0.0016,0.0013,9.8e-05,0.0013,0.0013,0.0009,0.0013,1,1 +7890000,-0.28,0.026,-0.0062,0.96,-0.2,-0.071,-0.022,-0.057,-0.033,-0.044,-0.0013,-0.0049,-7.7e-05,0.00099,-0.00028,-0.13,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0013,0.0013,0.05,0.28,0.28,0.023,0.45,0.45,0.06,6.4e-05,6.4e-05,4.6e-06,0.04,0.04,0.0015,0.0013,9.4e-05,0.0013,0.0013,0.0009,0.0013,1,1 +7990000,-0.28,0.026,-0.0061,0.96,-0.22,-0.078,-0.018,-0.08,-0.039,-0.04,-0.0013,-0.0049,-7.7e-05,0.00089,-0.00023,-0.13,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0013,0.0013,0.05,0.3,0.3,0.022,0.51,0.51,0.059,6.3e-05,6.3e-05,4.6e-06,0.04,0.04,0.0015,0.0013,9.1e-05,0.0013,0.0013,0.0009,0.0013,1,1 +8090000,-0.28,0.026,-0.006,0.96,-0.25,-0.09,-0.019,-0.1,-0.053,-0.043,-0.0013,-0.0049,-8e-05,0.00093,-0.00038,-0.13,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0013,0.0013,0.05,0.33,0.33,0.022,0.57,0.57,0.059,6.2e-05,6.2e-05,4.6e-06,0.04,0.04,0.0014,0.0013,8.9e-05,0.0013,0.0013,0.0009,0.0013,1,1 +8190000,-0.28,0.026,-0.0061,0.96,-0.27,-0.1,-0.014,-0.12,-0.069,-0.036,-0.0012,-0.0048,-8.2e-05,0.00096,-0.0005,-0.13,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0013,0.0013,0.049,0.36,0.36,0.021,0.64,0.64,0.058,6.1e-05,6.1e-05,4.6e-06,0.04,0.04,0.0013,0.0013,8.7e-05,0.0013,0.0013,0.0009,0.0013,1,1 +8290000,-0.28,0.026,-0.0061,0.96,-0.3,-0.11,-0.013,-0.16,-0.077,-0.036,-0.0012,-0.005,-8.4e-05,0.0007,-0.00042,-0.13,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0013,0.0013,0.049,0.4,0.39,0.02,0.72,0.72,0.057,6e-05,6e-05,4.6e-06,0.04,0.04,0.0013,0.0013,8.5e-05,0.0013,0.0013,0.0009,0.0013,1,1 +8390000,-0.28,0.026,-0.0061,0.96,-0.33,-0.12,-0.011,-0.2,-0.089,-0.034,-0.0012,-0.005,-8.5e-05,0.00063,-0.00041,-0.13,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0014,0.0013,0.049,0.43,0.43,0.02,0.81,0.8,0.057,5.9e-05,5.9e-05,4.6e-06,0.04,0.04,0.0012,0.0013,8.3e-05,0.0013,0.0013,0.00089,0.0013,1,1 +8490000,-0.28,0.026,-0.0059,0.96,-0.35,-0.12,-0.012,-0.23,-0.094,-0.039,-0.0013,-0.005,-8.2e-05,0.00062,-0.00029,-0.13,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0014,0.0013,0.049,0.47,0.46,0.019,0.9,0.9,0.056,5.8e-05,5.7e-05,4.6e-06,0.04,0.04,0.0011,0.0013,8.2e-05,0.0013,0.0013,0.00089,0.0013,1,1 +8590000,-0.28,0.027,-0.0059,0.96,-0.38,-0.14,-0.0073,-0.26,-0.12,-0.034,-0.0012,-0.0049,-8.2e-05,0.00079,-0.00042,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0014,0.0013,0.049,0.51,0.51,0.019,1,1,0.055,5.6e-05,5.5e-05,4.6e-06,0.04,0.04,0.0011,0.0013,8.1e-05,0.0013,0.0013,0.00089,0.0013,1,1 +8690000,-0.28,0.027,-0.0059,0.96,-0.4,-0.14,-0.0089,-0.3,-0.13,-0.035,-0.0012,-0.0049,-8.2e-05,0.00071,-0.00035,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0014,0.0014,0.049,0.56,0.55,0.018,1.1,1.1,0.055,5.5e-05,5.4e-05,4.6e-06,0.04,0.04,0.001,0.0013,8e-05,0.0013,0.0013,0.00089,0.0013,1,1 +8790000,-0.28,0.027,-0.0059,0.96,-0.43,-0.15,-0.0084,-0.35,-0.14,-0.032,-0.0012,-0.005,-8.5e-05,0.00052,-0.0004,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0014,0.0014,0.049,0.61,0.6,0.018,1.2,1.2,0.055,5.3e-05,5.2e-05,4.6e-06,0.04,0.04,0.00099,0.0013,7.9e-05,0.0013,0.0013,0.00089,0.0013,1,1 +8890000,-0.28,0.027,-0.0059,0.96,-0.46,-0.16,-0.0039,-0.38,-0.16,-0.026,-0.0012,-0.0049,-8.1e-05,0.00064,-0.00031,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0014,0.0014,0.049,0.66,0.65,0.017,1.4,1.4,0.054,5.1e-05,5e-05,4.5e-06,0.04,0.04,0.00095,0.0013,7.8e-05,0.0013,0.0013,0.00089,0.0013,1,1 +8990000,-0.28,0.027,-0.0058,0.96,-0.47,-0.17,-0.0028,-0.41,-0.17,-0.029,-0.0013,-0.0047,-7.5e-05,0.001,-0.0003,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0014,0.0014,0.049,0.72,0.7,0.017,1.5,1.5,0.054,4.9e-05,4.8e-05,4.5e-06,0.04,0.04,0.00091,0.0013,7.7e-05,0.0013,0.0013,0.00089,0.0013,1,1 +9090000,-0.28,0.027,-0.0056,0.96,-0.5,-0.18,-0.0038,-0.47,-0.17,-0.029,-0.0014,-0.0048,-7.2e-05,0.00081,-2.1e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0015,0.0014,0.049,0.77,0.76,0.016,1.7,1.7,0.053,4.7e-05,4.6e-05,4.5e-06,0.04,0.04,0.00087,0.0013,7.6e-05,0.0013,0.0013,0.00089,0.0013,1,1 +9190000,-0.28,0.027,-0.0055,0.96,-0.53,-0.18,-0.0029,-0.52,-0.18,-0.029,-0.0015,-0.0048,-6.9e-05,0.0008,0.00012,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0015,0.0014,0.049,0.84,0.82,0.016,1.9,1.9,0.052,4.5e-05,4.4e-05,4.5e-06,0.04,0.04,0.00084,0.0013,7.6e-05,0.0013,0.0013,0.00089,0.0013,1,1 +9290000,-0.28,0.027,-0.0054,0.96,-0.56,-0.19,-0.0011,-0.56,-0.21,-0.026,-0.0014,-0.0047,-6.7e-05,0.00094,9e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0015,0.0014,0.049,0.9,0.88,0.016,2.1,2.1,0.052,4.3e-05,4.2e-05,4.5e-06,0.04,0.04,0.0008,0.0013,7.5e-05,0.0013,0.0013,0.00089,0.0013,1,1 +9390000,-0.28,0.027,-0.0054,0.96,-0.023,-0.0084,0.0003,-0.57,-0.21,-0.026,-0.0013,-0.0047,-7.1e-05,0.00094,9e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0015,0.0014,0.049,25,25,0.015,1e+02,1e+02,0.052,4.2e-05,4e-05,4.5e-06,0.04,0.04,0.00077,0.0013,7.4e-05,0.0013,0.0013,0.00089,0.0013,1,1 +9490000,-0.28,0.027,-0.0053,0.96,-0.049,-0.017,0.0021,-0.58,-0.21,-0.023,-0.0014,-0.0048,-7.1e-05,0.00094,9e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0015,0.0014,0.049,25,25,0.015,1e+02,1e+02,0.051,4e-05,3.8e-05,4.5e-06,0.04,0.04,0.00074,0.0013,7.4e-05,0.0013,0.0013,0.00089,0.0013,1,1 +9590000,-0.28,0.027,-0.0056,0.96,-0.076,-0.023,0.0023,-0.58,-0.21,-0.024,-0.0012,-0.0048,-8e-05,0.00094,9e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0015,0.0014,0.049,25,25,0.015,51,51,0.05,3.8e-05,3.7e-05,4.5e-06,0.04,0.04,0.00072,0.0013,7.3e-05,0.0013,0.0013,0.00089,0.0013,1,1 +9690000,-0.28,0.027,-0.0057,0.96,-0.1,-0.031,0.0054,-0.59,-0.21,-0.023,-0.0012,-0.0048,-8.2e-05,0.00094,9e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0015,0.0015,0.049,25,25,0.014,52,52,0.05,3.6e-05,3.5e-05,4.5e-06,0.04,0.04,0.00069,0.0013,7.3e-05,0.0013,0.0013,0.00089,0.0013,1,1 +9790000,-0.28,0.027,-0.0059,0.96,-0.13,-0.038,0.0041,-0.59,-0.22,-0.023,-0.001,-0.005,-9.1e-05,0.00094,9e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0015,0.0015,0.049,25,25,0.014,35,35,0.05,3.4e-05,3.3e-05,4.5e-06,0.04,0.04,0.00067,0.0013,7.3e-05,0.0013,0.0013,0.00089,0.0013,1,1 +9890000,-0.28,0.027,-0.0058,0.96,-0.16,-0.047,0.0057,-0.61,-0.22,-0.023,-0.0011,-0.0049,-8.9e-05,0.00094,9e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0015,0.0015,0.049,25,25,0.014,37,37,0.049,3.2e-05,3.1e-05,4.5e-06,0.04,0.04,0.00064,0.0013,7.2e-05,0.0013,0.0013,0.00089,0.0013,1,1 +9990000,-0.28,0.027,-0.006,0.96,-0.18,-0.051,0.0065,-0.61,-0.22,-0.025,-0.00096,-0.005,-9.6e-05,0.00094,9e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0015,0.0015,0.049,24,24,0.014,28,28,0.049,3.1e-05,3e-05,4.5e-06,0.04,0.04,0.00062,0.0013,7.2e-05,0.0013,0.0013,0.00089,0.0013,1,1 +10090000,-0.28,0.027,-0.0061,0.96,-0.21,-0.054,0.0078,-0.63,-0.23,-0.023,-0.00084,-0.0051,-0.0001,0.00094,9e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0015,0.0015,0.049,24,24,0.013,30,30,0.049,2.9e-05,2.8e-05,4.5e-06,0.04,0.04,0.0006,0.0013,7.1e-05,0.0013,0.0013,0.00089,0.0013,1,1 +10190000,-0.28,0.027,-0.0064,0.96,-0.23,-0.056,0.0087,-0.64,-0.23,-0.024,-0.00067,-0.005,-0.00011,0.00094,9e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0015,0.0015,0.049,23,23,0.013,25,25,0.048,2.8e-05,2.7e-05,4.5e-06,0.04,0.04,0.00058,0.0013,7.1e-05,0.0013,0.0013,0.00089,0.0013,1,1 +10290000,-0.28,0.027,-0.0064,0.96,-0.26,-0.065,0.0079,-0.66,-0.23,-0.023,-0.00072,-0.005,-0.00011,0.00094,9e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0015,0.0015,0.049,23,23,0.013,27,27,0.048,2.6e-05,2.5e-05,4.5e-06,0.04,0.04,0.00057,0.0013,7.1e-05,0.0013,0.0013,0.00089,0.0013,1,1 +10390000,-0.28,0.028,-0.0063,0.96,-0.012,-0.0081,-0.0025,-7.9e-05,-0.00028,-0.023,-0.00074,-0.0049,-0.0001,0.001,0.00015,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0015,0.0015,0.049,0.25,0.25,0.56,0.25,0.25,0.049,2.5e-05,2.4e-05,4.5e-06,0.04,0.04,0.00055,0.0013,7.1e-05,0.0013,0.0013,0.00089,0.0013,1,1 +10490000,-0.28,0.027,-0.0064,0.96,-0.041,-0.014,0.0066,-0.0027,-0.0013,-0.018,-0.00066,-0.005,-0.00011,0.00082,2.7e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0015,0.0015,0.049,0.26,0.26,0.55,0.26,0.26,0.058,2.4e-05,2.3e-05,4.5e-06,0.04,0.04,0.00054,0.0013,7e-05,0.0013,0.0013,0.00089,0.0013,1,1 +10590000,-0.28,0.027,-0.0063,0.96,-0.052,-0.013,0.012,-0.0032,-0.00096,-0.016,-0.00073,-0.005,-0.0001,0.0014,7.7e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0015,0.0015,0.049,0.13,0.13,0.27,0.26,0.26,0.056,2.2e-05,2.1e-05,4.5e-06,0.04,0.04,0.00052,0.0013,7e-05,0.0013,0.0013,0.00089,0.0013,1,1 +10690000,-0.28,0.027,-0.0063,0.96,-0.081,-0.018,0.015,-0.0099,-0.0025,-0.013,-0.0007,-0.005,-0.00011,0.0014,2.4e-05,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.068,0,0,0.0015,0.0015,0.049,0.14,0.14,0.26,0.27,0.27,0.065,2.1e-05,2e-05,4.5e-06,0.04,0.04,0.00052,0.0013,7e-05,0.0013,0.0013,0.00089,0.0013,1,1 +10790000,-0.28,0.027,-0.0062,0.96,-0.079,-0.021,0.013,-7.5e-06,-0.0018,-0.012,-0.00072,-0.005,-0.00011,0.0035,-0.0011,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.069,0,0,0.0015,0.0014,0.049,0.095,0.095,0.17,0.13,0.13,0.062,2e-05,1.9e-05,4.5e-06,0.039,0.039,0.00051,0.0013,6.9e-05,0.0013,0.0013,0.00088,0.0013,1,1 +10890000,-0.28,0.027,-0.006,0.96,-0.11,-0.03,0.0093,-0.0092,-0.0044,-0.015,-0.00083,-0.005,-0.0001,0.0036,-0.00084,-0.14,-0.1,-0.022,0.5,0.078,-0.03,-0.069,0,0,0.0015,0.0014,0.049,0.11,0.11,0.16,0.14,0.14,0.068,1.9e-05,1.8e-05,4.5e-06,0.039,0.039,0.0005,0.0013,6.9e-05,0.0013,0.0013,0.00088,0.0013,1,1 +10990000,-0.28,0.026,-0.006,0.96,-0.096,-0.031,0.016,-0.0034,-0.0023,-0.0093,-0.00085,-0.0052,-0.00011,0.0077,-0.0021,-0.14,-0.1,-0.023,0.5,0.078,-0.03,-0.069,0,0,0.0014,0.0013,0.049,0.083,0.083,0.12,0.091,0.091,0.065,1.8e-05,1.7e-05,4.5e-06,0.039,0.039,0.0005,0.0013,6.9e-05,0.0013,0.0013,0.00088,0.0013,1,1 +11090000,-0.28,0.027,-0.0064,0.96,-0.12,-0.039,0.019,-0.014,-0.0055,-0.0055,-0.00072,-0.0052,-0.00011,0.0078,-0.0025,-0.14,-0.1,-0.023,0.5,0.078,-0.03,-0.069,0,0,0.0014,0.0013,0.049,0.096,0.097,0.11,0.097,0.097,0.069,1.7e-05,1.6e-05,4.5e-06,0.039,0.039,0.00049,0.0013,6.9e-05,0.0013,0.0013,0.00088,0.0013,1,1 +11190000,-0.28,0.025,-0.0065,0.96,-0.1,-0.034,0.026,-0.0065,-0.0031,0.00085,-0.00071,-0.0053,-0.00011,0.014,-0.0046,-0.14,-0.1,-0.023,0.5,0.079,-0.031,-0.069,0,0,0.0013,0.0012,0.049,0.079,0.079,0.083,0.072,0.072,0.066,1.6e-05,1.5e-05,4.5e-06,0.038,0.038,0.00049,0.0013,6.8e-05,0.0013,0.0012,0.00087,0.0013,1,1 +11290000,-0.28,0.025,-0.0066,0.96,-0.13,-0.038,0.025,-0.018,-0.0066,0.00091,-0.00071,-0.0054,-0.00012,0.014,-0.0046,-0.14,-0.1,-0.023,0.5,0.079,-0.031,-0.069,0,0,0.0013,0.0012,0.049,0.094,0.094,0.077,0.078,0.078,0.069,1.5e-05,1.4e-05,4.5e-06,0.038,0.038,0.00049,0.0013,6.8e-05,0.0013,0.0012,0.00087,0.0013,1,1 +11390000,-0.28,0.024,-0.0065,0.96,-0.11,-0.032,0.016,-0.01,-0.004,-0.008,-0.00075,-0.0055,-0.00012,0.021,-0.0065,-0.14,-0.1,-0.023,0.5,0.079,-0.031,-0.069,0,0,0.0012,0.0011,0.048,0.078,0.078,0.062,0.062,0.062,0.066,1.4e-05,1.4e-05,4.5e-06,0.037,0.037,0.00048,0.0013,6.8e-05,0.0013,0.0012,0.00085,0.0013,1,1 +11490000,-0.28,0.024,-0.0064,0.96,-0.13,-0.036,0.021,-0.022,-0.0074,-0.002,-0.00075,-0.0055,-0.00012,0.021,-0.0065,-0.14,-0.1,-0.023,0.5,0.079,-0.031,-0.069,0,0,0.0012,0.0011,0.048,0.093,0.093,0.057,0.069,0.069,0.067,1.3e-05,1.3e-05,4.5e-06,0.037,0.037,0.00048,0.0013,6.7e-05,0.0013,0.0012,0.00085,0.0013,1,1 +11590000,-0.28,0.023,-0.0065,0.96,-0.11,-0.029,0.019,-0.013,-0.0046,-0.0033,-0.00079,-0.0056,-0.00012,0.027,-0.0085,-0.14,-0.1,-0.023,0.5,0.08,-0.031,-0.069,0,0,0.001,0.00098,0.048,0.077,0.077,0.048,0.056,0.056,0.065,1.3e-05,1.2e-05,4.5e-06,0.036,0.036,0.00048,0.0012,6.7e-05,0.0013,0.0012,0.00084,0.0013,1,1 +11690000,-0.28,0.022,-0.0065,0.96,-0.12,-0.035,0.019,-0.024,-0.0078,-0.0047,-0.00081,-0.0057,-0.00012,0.027,-0.0083,-0.14,-0.1,-0.023,0.5,0.08,-0.031,-0.069,0,0,0.001,0.00099,0.048,0.092,0.092,0.044,0.063,0.063,0.066,1.2e-05,1.2e-05,4.5e-06,0.036,0.036,0.00048,0.0012,6.7e-05,0.0013,0.0012,0.00084,0.0013,1,1 +11790000,-0.28,0.021,-0.0063,0.96,-0.097,-0.033,0.02,-0.014,-0.0064,-0.0019,-0.0009,-0.0057,-0.00012,0.033,-0.01,-0.14,-0.1,-0.023,0.5,0.081,-0.031,-0.069,0,0,0.00091,0.00087,0.048,0.076,0.076,0.037,0.053,0.053,0.063,1.1e-05,1.1e-05,4.5e-06,0.035,0.035,0.00047,0.0012,6.6e-05,0.0013,0.0012,0.00083,0.0013,1,1 +11890000,-0.28,0.021,-0.0065,0.96,-0.11,-0.037,0.018,-0.024,-0.0097,-0.0012,-0.00088,-0.0058,-0.00012,0.033,-0.01,-0.14,-0.1,-0.023,0.5,0.081,-0.031,-0.07,0,0,0.00091,0.00087,0.048,0.089,0.089,0.034,0.06,0.06,0.063,1.1e-05,1e-05,4.5e-06,0.035,0.035,0.00047,0.0012,6.6e-05,0.0013,0.0012,0.00083,0.0013,1,1 +11990000,-0.28,0.02,-0.0066,0.96,-0.091,-0.028,0.015,-0.017,-0.0064,-0.005,-0.0009,-0.0059,-0.00012,0.039,-0.011,-0.14,-0.11,-0.023,0.5,0.081,-0.031,-0.07,0,0,0.00081,0.00078,0.047,0.076,0.076,0.03,0.062,0.062,0.061,1e-05,9.8e-06,4.5e-06,0.034,0.034,0.00047,0.0012,6.6e-05,0.0013,0.0012,0.00082,0.0013,1,1 +12090000,-0.28,0.02,-0.0066,0.96,-0.1,-0.03,0.019,-0.027,-0.0092,0.0011,-0.00086,-0.0058,-0.00012,0.039,-0.012,-0.14,-0.11,-0.023,0.5,0.081,-0.031,-0.07,0,0,0.00081,0.00078,0.047,0.089,0.088,0.027,0.071,0.071,0.06,9.8e-06,9.3e-06,4.5e-06,0.034,0.034,0.00047,0.0012,6.6e-05,0.0013,0.0012,0.00081,0.0013,1,1 +12190000,-0.28,0.019,-0.0067,0.96,-0.084,-0.018,0.018,-0.014,-0.0032,0.0029,-0.00082,-0.0059,-0.00012,0.045,-0.013,-0.14,-0.11,-0.023,0.5,0.082,-0.031,-0.07,0,0,0.00072,0.0007,0.047,0.07,0.07,0.024,0.057,0.057,0.058,9.2e-06,8.8e-06,4.5e-06,0.033,0.033,0.00047,0.0012,6.5e-05,0.0012,0.0012,0.0008,0.0012,1,1 +12290000,-0.28,0.019,-0.0068,0.96,-0.09,-0.017,0.017,-0.023,-0.0048,0.004,-0.00079,-0.0059,-0.00012,0.045,-0.014,-0.14,-0.11,-0.023,0.5,0.082,-0.031,-0.07,0,0,0.00072,0.0007,0.047,0.081,0.081,0.022,0.065,0.065,0.058,8.9e-06,8.5e-06,4.5e-06,0.033,0.033,0.00047,0.0012,6.5e-05,0.0012,0.0012,0.0008,0.0012,1,1 +12390000,-0.28,0.019,-0.0068,0.96,-0.073,-0.012,0.015,-0.013,-0.0027,-0.002,-0.00078,-0.0059,-0.00012,0.048,-0.015,-0.14,-0.11,-0.023,0.5,0.082,-0.031,-0.07,0,0,0.00066,0.00063,0.047,0.066,0.065,0.02,0.054,0.054,0.056,8.4e-06,8e-06,4.5e-06,0.033,0.033,0.00047,0.0012,6.5e-05,0.0012,0.0012,0.00079,0.0012,1,1 +12490000,-0.28,0.019,-0.0069,0.96,-0.081,-0.013,0.019,-0.021,-0.004,9.6e-05,-0.00076,-0.0059,-0.00013,0.048,-0.016,-0.14,-0.11,-0.023,0.5,0.082,-0.032,-0.07,0,0,0.00066,0.00064,0.047,0.075,0.075,0.018,0.062,0.062,0.055,8.1e-06,7.7e-06,4.5e-06,0.033,0.033,0.00047,0.0012,6.5e-05,0.0012,0.0012,0.00079,0.0012,1,1 +12590000,-0.28,0.018,-0.0068,0.96,-0.065,-0.011,0.021,-0.01,-0.0039,0.0019,-0.00076,-0.0059,-0.00013,0.051,-0.018,-0.14,-0.11,-0.023,0.5,0.082,-0.032,-0.07,0,0,0.0006,0.00058,0.047,0.061,0.061,0.017,0.052,0.052,0.054,7.7e-06,7.4e-06,4.5e-06,0.032,0.032,0.00047,0.0012,6.4e-05,0.0012,0.0012,0.00078,0.0012,1,1 +12690000,-0.28,0.018,-0.0067,0.96,-0.072,-0.0098,0.02,-0.017,-0.0049,0.0035,-0.00075,-0.0059,-0.00013,0.051,-0.018,-0.14,-0.11,-0.023,0.5,0.082,-0.032,-0.07,0,0,0.0006,0.00059,0.047,0.069,0.069,0.015,0.059,0.059,0.053,7.4e-06,7e-06,4.5e-06,0.032,0.032,0.00047,0.0012,6.4e-05,0.0012,0.0012,0.00078,0.0012,1,1 +12790000,-0.28,0.018,-0.0065,0.96,-0.056,-0.015,0.022,-0.01,-0.0078,0.0057,-0.00082,-0.0059,-0.00013,0.054,-0.019,-0.14,-0.11,-0.023,0.5,0.082,-0.032,-0.07,0,0,0.00056,0.00055,0.047,0.061,0.061,0.014,0.061,0.061,0.051,7.1e-06,6.7e-06,4.5e-06,0.032,0.032,0.00046,0.0012,6.4e-05,0.0012,0.0012,0.00078,0.0012,1,1 +12890000,-0.28,0.018,-0.0065,0.96,-0.061,-0.016,0.023,-0.016,-0.0096,0.0088,-0.00084,-0.0059,-0.00012,0.054,-0.019,-0.14,-0.11,-0.023,0.5,0.082,-0.032,-0.07,0,0,0.00056,0.00055,0.047,0.069,0.069,0.013,0.07,0.07,0.051,6.8e-06,6.5e-06,4.5e-06,0.032,0.032,0.00046,0.0012,6.4e-05,0.0012,0.0012,0.00077,0.0012,1,1 +12990000,-0.28,0.017,-0.0065,0.96,-0.05,-0.013,0.023,-0.008,-0.0066,0.01,-0.00088,-0.0059,-0.00012,0.056,-0.019,-0.14,-0.11,-0.023,0.5,0.083,-0.032,-0.07,0,0,0.00053,0.00052,0.047,0.055,0.055,0.012,0.056,0.056,0.05,6.5e-06,6.2e-06,4.5e-06,0.032,0.032,0.00046,0.0012,6.4e-05,0.0012,0.0012,0.00077,0.0012,1,1 +13090000,-0.28,0.017,-0.0064,0.96,-0.054,-0.015,0.021,-0.013,-0.0083,0.0089,-0.00091,-0.0059,-0.00012,0.056,-0.018,-0.14,-0.11,-0.023,0.5,0.083,-0.032,-0.07,0,0,0.00053,0.00052,0.046,0.062,0.062,0.011,0.065,0.065,0.049,6.3e-06,5.9e-06,4.5e-06,0.032,0.032,0.00046,0.0012,6.4e-05,0.0012,0.0012,0.00077,0.0012,1,1 +13190000,-0.28,0.017,-0.0063,0.96,-0.046,-0.015,0.02,-0.0097,-0.0091,0.0096,-0.00094,-0.0059,-0.00012,0.058,-0.019,-0.14,-0.11,-0.023,0.5,0.083,-0.032,-0.07,0,0,0.00051,0.00049,0.046,0.055,0.055,0.011,0.066,0.066,0.047,6e-06,5.7e-06,4.5e-06,0.031,0.031,0.00046,0.0012,6.3e-05,0.0012,0.0012,0.00076,0.0012,1,1 +13290000,-0.28,0.017,-0.0064,0.96,-0.049,-0.015,0.017,-0.015,-0.011,0.009,-0.00092,-0.0058,-0.00012,0.058,-0.019,-0.14,-0.11,-0.023,0.5,0.083,-0.032,-0.07,0,0,0.00051,0.00049,0.046,0.061,0.061,0.01,0.075,0.075,0.047,5.8e-06,5.5e-06,4.5e-06,0.031,0.031,0.00046,0.0012,6.3e-05,0.0012,0.0012,0.00076,0.0012,1,1 +13390000,-0.28,0.017,-0.0064,0.96,-0.04,-0.011,0.017,-0.0074,-0.007,0.0097,-0.0009,-0.0059,-0.00012,0.059,-0.02,-0.14,-0.11,-0.023,0.5,0.083,-0.032,-0.07,0,0,0.00048,0.00047,0.046,0.049,0.049,0.0094,0.06,0.06,0.046,5.6e-06,5.2e-06,4.5e-06,0.031,0.031,0.00046,0.0012,6.3e-05,0.0012,0.0012,0.00076,0.0012,1,1 +13490000,-0.28,0.017,-0.0064,0.96,-0.044,-0.014,0.017,-0.012,-0.0083,0.006,-0.0009,-0.0059,-0.00012,0.059,-0.02,-0.14,-0.11,-0.023,0.5,0.083,-0.032,-0.07,0,0,0.00048,0.00047,0.046,0.054,0.054,0.009,0.068,0.068,0.045,5.4e-06,5e-06,4.5e-06,0.031,0.031,0.00046,0.0012,6.3e-05,0.0012,0.0012,0.00076,0.0012,1,1 +13590000,-0.28,0.017,-0.0064,0.96,-0.035,-0.01,0.018,-0.0035,-0.0057,0.0045,-0.00088,-0.0059,-0.00012,0.061,-0.02,-0.14,-0.11,-0.023,0.5,0.083,-0.032,-0.07,0,0,0.00047,0.00045,0.046,0.045,0.045,0.0085,0.055,0.055,0.044,5.2e-06,4.9e-06,4.5e-06,0.031,0.031,0.00046,0.0012,6.3e-05,0.0012,0.0012,0.00075,0.0012,1,1 +13690000,-0.28,0.017,-0.0063,0.96,-0.037,-0.0095,0.019,-0.0071,-0.0067,0.0072,-0.00089,-0.0059,-0.00012,0.061,-0.02,-0.14,-0.11,-0.023,0.5,0.083,-0.032,-0.07,0,0,0.00047,0.00046,0.046,0.049,0.049,0.0082,0.063,0.063,0.044,5e-06,4.7e-06,4.5e-06,0.031,0.031,0.00046,0.0012,6.3e-05,0.0012,0.0012,0.00075,0.0012,1,1 +13790000,-0.28,0.016,-0.0064,0.96,-0.029,-0.0071,0.019,0.00061,-0.0035,0.0068,-0.00089,-0.0059,-0.00012,0.062,-0.021,-0.14,-0.11,-0.023,0.5,0.083,-0.032,-0.07,0,0,0.00045,0.00044,0.046,0.041,0.041,0.0078,0.052,0.052,0.042,4.8e-06,4.5e-06,4.5e-06,0.031,0.031,0.00046,0.0012,6.3e-05,0.0012,0.0012,0.00075,0.0012,1,1 +13890000,-0.28,0.016,-0.0063,0.96,-0.031,-0.0086,0.02,-0.0022,-0.0044,0.0091,-0.00092,-0.0059,-0.00012,0.061,-0.02,-0.14,-0.11,-0.023,0.5,0.083,-0.032,-0.07,0,0,0.00045,0.00044,0.046,0.045,0.045,0.0076,0.059,0.059,0.042,4.7e-06,4.4e-06,4.5e-06,0.031,0.031,0.00046,0.0012,6.2e-05,0.0012,0.0012,0.00075,0.0012,1,1 +13990000,-0.28,0.016,-0.0062,0.96,-0.03,-0.012,0.018,-0.00073,-0.0048,0.008,-0.00094,-0.0059,-0.00012,0.062,-0.02,-0.14,-0.11,-0.023,0.5,0.083,-0.032,-0.07,0,0,0.00044,0.00043,0.046,0.039,0.039,0.0073,0.05,0.05,0.041,4.5e-06,4.2e-06,4.5e-06,0.031,0.031,0.00046,0.0012,6.2e-05,0.0012,0.0012,0.00074,0.0012,1,1 +14090000,-0.28,0.016,-0.0064,0.96,-0.031,-0.0062,0.02,-0.004,-0.0053,0.0046,-0.00087,-0.0059,-0.00012,0.062,-0.021,-0.14,-0.11,-0.023,0.5,0.083,-0.032,-0.07,0,0,0.00044,0.00043,0.046,0.042,0.042,0.0072,0.057,0.057,0.041,4.4e-06,4e-06,4.5e-06,0.031,0.031,0.00046,0.0012,6.2e-05,0.0012,0.0012,0.00074,0.0012,1,1 +14190000,-0.28,0.016,-0.0064,0.96,-0.025,-0.0047,0.02,-0.00094,-0.004,0.0049,-0.00082,-0.0059,-0.00013,0.063,-0.022,-0.14,-0.11,-0.023,0.5,0.083,-0.032,-0.07,0,0,0.00043,0.00042,0.046,0.036,0.036,0.007,0.049,0.049,0.04,4.2e-06,3.9e-06,4.5e-06,0.031,0.03,0.00046,0.0012,6.2e-05,0.0012,0.0012,0.00074,0.0012,1,1 +14290000,-0.28,0.016,-0.0064,0.96,-0.028,-0.0051,0.018,-0.0036,-0.0044,0.0092,-0.00082,-0.0059,-0.00013,0.063,-0.022,-0.14,-0.11,-0.023,0.5,0.083,-0.032,-0.07,0,0,0.00043,0.00042,0.046,0.04,0.04,0.0069,0.055,0.055,0.039,4.1e-06,3.8e-06,4.5e-06,0.031,0.03,0.00046,0.0012,6.2e-05,0.0012,0.0012,0.00074,0.0012,1,1 +14390000,-0.28,0.016,-0.0064,0.96,-0.026,-0.0045,0.019,-0.00096,-0.0049,0.014,-0.00083,-0.0059,-0.00012,0.064,-0.022,-0.14,-0.11,-0.023,0.5,0.083,-0.032,-0.07,0,0,0.00042,0.00041,0.046,0.034,0.034,0.0067,0.048,0.048,0.039,4e-06,3.6e-06,4.5e-06,0.031,0.03,0.00046,0.0012,6.2e-05,0.0012,0.0012,0.00074,0.0012,1,1 +14490000,-0.28,0.016,-0.0066,0.96,-0.026,-0.0039,0.023,-0.0037,-0.005,0.016,-0.00079,-0.0059,-0.00013,0.064,-0.023,-0.14,-0.11,-0.023,0.5,0.083,-0.032,-0.07,0,0,0.00042,0.00042,0.046,0.037,0.037,0.0066,0.054,0.054,0.038,3.8e-06,3.5e-06,4.5e-06,0.031,0.03,0.00046,0.0012,6.2e-05,0.0012,0.0012,0.00074,0.0012,1,1 +14590000,-0.28,0.016,-0.0067,0.96,-0.028,-0.0054,0.021,-0.0038,-0.0053,0.012,-0.00078,-0.0058,-0.00013,0.064,-0.023,-0.14,-0.11,-0.023,0.5,0.083,-0.032,-0.07,0,0,0.00042,0.00041,0.046,0.032,0.032,0.0065,0.047,0.047,0.038,3.7e-06,3.4e-06,4.5e-06,0.03,0.03,0.00046,0.0012,6.2e-05,0.0012,0.0012,0.00074,0.0012,1,1 +14690000,-0.28,0.016,-0.0067,0.96,-0.029,-0.0058,0.021,-0.0067,-0.006,0.012,-0.00078,-0.0058,-0.00013,0.064,-0.023,-0.14,-0.11,-0.023,0.5,0.083,-0.032,-0.07,0,0,0.00042,0.00041,0.046,0.035,0.035,0.0065,0.053,0.053,0.037,3.6e-06,3.3e-06,4.5e-06,0.03,0.03,0.00046,0.0012,6.2e-05,0.0012,0.0012,0.00074,0.0012,1,1 +14790000,-0.28,0.016,-0.0068,0.96,-0.03,-0.003,0.021,-0.0052,-0.0014,0.015,-0.0008,-0.0058,-0.00012,0.065,-0.023,-0.14,-0.11,-0.023,0.5,0.083,-0.032,-0.07,0,0,0.00041,0.0004,0.046,0.031,0.031,0.0064,0.046,0.046,0.036,3.5e-06,3.2e-06,4.5e-06,0.03,0.03,0.00046,0.0012,6.1e-05,0.0012,0.0012,0.00073,0.0012,1,1 +14890000,-0.28,0.016,-0.0067,0.96,-0.032,-0.0012,0.026,-0.0086,-0.002,0.016,-0.00081,-0.0057,-0.00012,0.066,-0.022,-0.14,-0.11,-0.024,0.5,0.083,-0.032,-0.07,0,0,0.00041,0.00041,0.046,0.033,0.033,0.0064,0.052,0.052,0.036,3.4e-06,3.1e-06,4.5e-06,0.03,0.03,0.00046,0.0012,6.1e-05,0.0012,0.0012,0.00073,0.0012,1,1 +14990000,-0.28,0.016,-0.0067,0.96,-0.031,-0.003,0.028,-0.0069,-0.003,0.018,-0.00081,-0.0057,-0.00012,0.067,-0.023,-0.14,-0.11,-0.024,0.5,0.083,-0.032,-0.07,0,0,0.00041,0.0004,0.046,0.029,0.029,0.0064,0.045,0.045,0.036,3.3e-06,3e-06,4.5e-06,0.03,0.03,0.00046,0.0012,6.1e-05,0.0012,0.0012,0.00073,0.0012,1,1 +15090000,-0.28,0.016,-0.0067,0.96,-0.032,-0.0042,0.032,-0.01,-0.0033,0.021,-0.00081,-0.0057,-0.00012,0.067,-0.023,-0.14,-0.11,-0.024,0.5,0.083,-0.032,-0.07,0,0,0.00041,0.0004,0.046,0.032,0.032,0.0064,0.051,0.051,0.035,3.2e-06,2.9e-06,4.5e-06,0.03,0.03,0.00046,0.0012,6.1e-05,0.0012,0.0012,0.00073,0.0012,1,1 +15190000,-0.28,0.016,-0.0068,0.96,-0.03,-0.0022,0.033,-0.008,-0.0026,0.023,-0.0008,-0.0057,-0.00012,0.068,-0.023,-0.14,-0.11,-0.024,0.5,0.083,-0.032,-0.07,0,0,0.0004,0.0004,0.046,0.028,0.028,0.0064,0.045,0.045,0.035,3.1e-06,2.8e-06,4.5e-06,0.03,0.03,0.00046,0.0012,6.1e-05,0.0012,0.0012,0.00073,0.0012,1,1 +15290000,-0.28,0.016,-0.0069,0.96,-0.034,-0.0024,0.032,-0.012,-0.0032,0.02,-0.00081,-0.0057,-0.00012,0.068,-0.023,-0.14,-0.11,-0.024,0.5,0.083,-0.032,-0.07,0,0,0.0004,0.0004,0.046,0.03,0.03,0.0065,0.05,0.05,0.035,3e-06,2.7e-06,4.5e-06,0.03,0.03,0.00046,0.0012,6.1e-05,0.0012,0.0012,0.00073,0.0012,1,1 +15390000,-0.28,0.016,-0.0069,0.96,-0.032,-0.0042,0.032,-0.0092,-0.0026,0.02,-0.00081,-0.0057,-0.00012,0.068,-0.023,-0.14,-0.11,-0.024,0.5,0.083,-0.032,-0.07,0,0,0.0004,0.00039,0.046,0.026,0.027,0.0064,0.044,0.044,0.034,2.9e-06,2.6e-06,4.5e-06,0.03,0.03,0.00046,0.0012,6.1e-05,0.0012,0.0012,0.00073,0.0012,1,1 +15490000,-0.28,0.016,-0.007,0.96,-0.034,-0.0018,0.032,-0.012,-0.003,0.021,-0.00082,-0.0057,-0.00012,0.068,-0.023,-0.14,-0.11,-0.024,0.5,0.083,-0.032,-0.07,0,0,0.0004,0.0004,0.046,0.028,0.029,0.0065,0.05,0.05,0.034,2.8e-06,2.5e-06,4.5e-06,0.03,0.03,0.00045,0.0012,6.1e-05,0.0012,0.0012,0.00073,0.0012,1,1 +15590000,-0.28,0.016,-0.0069,0.96,-0.03,-0.006,0.032,-0.0077,-0.0061,0.02,-0.00085,-0.0057,-0.00012,0.069,-0.023,-0.14,-0.11,-0.024,0.5,0.083,-0.032,-0.07,0,0,0.0004,0.00039,0.046,0.025,0.025,0.0065,0.044,0.044,0.034,2.7e-06,2.5e-06,4.5e-06,0.03,0.03,0.00045,0.0012,6.1e-05,0.0012,0.0012,0.00073,0.0012,1,1 +15690000,-0.28,0.016,-0.0068,0.96,-0.032,-0.0041,0.032,-0.01,-0.0067,0.021,-0.00089,-0.0057,-0.00012,0.068,-0.023,-0.14,-0.11,-0.024,0.5,0.083,-0.032,-0.07,0,0,0.0004,0.00039,0.046,0.027,0.027,0.0066,0.049,0.049,0.034,2.7e-06,2.4e-06,4.5e-06,0.03,0.03,0.00045,0.0012,6.1e-05,0.0012,0.0012,0.00073,0.0012,1,1 +15790000,-0.28,0.016,-0.0068,0.96,-0.028,-0.0028,0.032,-0.0077,-0.0057,0.023,-0.00092,-0.0057,-0.00012,0.068,-0.022,-0.14,-0.11,-0.024,0.5,0.083,-0.032,-0.07,0,0,0.0004,0.00039,0.046,0.024,0.024,0.0066,0.043,0.044,0.033,2.6e-06,2.3e-06,4.5e-06,0.03,0.03,0.00045,0.0012,6.1e-05,0.0012,0.0012,0.00073,0.0012,1,1 +15890000,-0.28,0.016,-0.0069,0.96,-0.029,-0.0041,0.033,-0.011,-0.0058,0.023,-0.00089,-0.0057,-0.00012,0.068,-0.023,-0.14,-0.11,-0.024,0.5,0.083,-0.032,-0.07,0,0,0.0004,0.00039,0.046,0.026,0.026,0.0067,0.049,0.049,0.034,2.5e-06,2.3e-06,4.5e-06,0.03,0.03,0.00045,0.0012,6.1e-05,0.0012,0.0012,0.00073,0.0012,1,1 +15990000,-0.28,0.016,-0.0068,0.96,-0.027,-0.0035,0.03,-0.0091,-0.0049,0.022,-0.00089,-0.0057,-0.00012,0.068,-0.023,-0.14,-0.11,-0.024,0.5,0.084,-0.032,-0.07,0,0,0.00039,0.00039,0.046,0.023,0.023,0.0068,0.043,0.043,0.033,2.4e-06,2.2e-06,4.5e-06,0.03,0.03,0.00045,0.0012,6.1e-05,0.0012,0.0012,0.00072,0.0012,1,1 +16090000,-0.28,0.016,-0.0068,0.96,-0.028,-0.0023,0.028,-0.012,-0.005,0.022,-0.00087,-0.0057,-0.00012,0.069,-0.023,-0.14,-0.11,-0.024,0.5,0.084,-0.032,-0.07,0,0,0.00039,0.00039,0.046,0.025,0.025,0.0069,0.048,0.048,0.033,2.4e-06,2.1e-06,4.5e-06,0.03,0.03,0.00045,0.0012,6e-05,0.0012,0.0012,0.00072,0.0012,1,1 +16190000,-0.28,0.016,-0.0068,0.96,-0.026,-0.002,0.027,-0.011,-0.0041,0.019,-0.00086,-0.0057,-0.00012,0.069,-0.023,-0.14,-0.11,-0.024,0.5,0.084,-0.032,-0.07,0,0,0.00039,0.00038,0.046,0.022,0.022,0.0069,0.043,0.043,0.033,2.3e-06,2.1e-06,4.5e-06,0.03,0.03,0.00044,0.0012,6e-05,0.0012,0.0012,0.00072,0.0012,1,1 +16290000,-0.28,0.016,-0.0068,0.96,-0.028,-0.0011,0.027,-0.014,-0.0043,0.021,-0.00087,-0.0057,-0.00012,0.069,-0.023,-0.14,-0.11,-0.024,0.5,0.084,-0.032,-0.07,0,0,0.00039,0.00039,0.046,0.024,0.024,0.007,0.048,0.048,0.033,2.3e-06,2e-06,4.5e-06,0.03,0.03,0.00044,0.0012,6e-05,0.0012,0.0012,0.00072,0.0012,1,1 +16390000,-0.28,0.016,-0.0068,0.96,-0.028,-0.0015,0.027,-0.011,-0.0041,0.021,-0.00087,-0.0057,-0.00012,0.07,-0.023,-0.14,-0.11,-0.024,0.5,0.084,-0.032,-0.07,0,0,0.00039,0.00038,0.046,0.021,0.021,0.007,0.042,0.042,0.033,2.2e-06,1.9e-06,4.5e-06,0.03,0.03,0.00044,0.0012,6e-05,0.0012,0.0012,0.00072,0.0012,1,1 +16490000,-0.28,0.016,-0.0069,0.96,-0.033,-0.00051,0.029,-0.014,-0.0041,0.025,-0.00086,-0.0057,-0.00012,0.07,-0.023,-0.14,-0.11,-0.024,0.5,0.084,-0.032,-0.07,0,0,0.00039,0.00038,0.046,0.023,0.023,0.0072,0.047,0.047,0.033,2.2e-06,1.9e-06,4.5e-06,0.03,0.03,0.00044,0.0012,6e-05,0.0012,0.0012,0.00072,0.0012,1,1 +16590000,-0.28,0.016,-0.0069,0.96,-0.036,1.4e-05,0.033,-0.012,-0.0035,0.025,-0.00087,-0.0057,-0.00012,0.07,-0.023,-0.14,-0.11,-0.024,0.5,0.084,-0.032,-0.069,0,0,0.00039,0.00038,0.046,0.02,0.021,0.0072,0.042,0.042,0.033,2.1e-06,1.8e-06,4.5e-06,0.03,0.03,0.00043,0.0012,6e-05,0.0012,0.0012,0.00072,0.0012,1,1 +16690000,-0.28,0.016,-0.0069,0.96,-0.039,0.0036,0.033,-0.016,-0.0035,0.026,-0.00089,-0.0057,-0.00012,0.07,-0.023,-0.14,-0.11,-0.024,0.5,0.084,-0.032,-0.069,0,0,0.00039,0.00038,0.046,0.022,0.022,0.0073,0.047,0.047,0.033,2e-06,1.8e-06,4.5e-06,0.03,0.03,0.00043,0.0012,6e-05,0.0012,0.0012,0.00072,0.0012,1,1 +16790000,-0.28,0.016,-0.0068,0.96,-0.039,0.0034,0.032,-0.013,-0.0031,0.026,-0.00091,-0.0057,-0.00012,0.07,-0.023,-0.14,-0.11,-0.024,0.5,0.084,-0.032,-0.069,0,0,0.00039,0.00038,0.046,0.02,0.02,0.0073,0.042,0.042,0.033,2e-06,1.7e-06,4.5e-06,0.03,0.03,0.00043,0.0012,6e-05,0.0012,0.0012,0.00072,0.0012,1,1 +16890000,-0.28,0.016,-0.0067,0.96,-0.039,0.0029,0.033,-0.017,-0.0032,0.025,-0.00093,-0.0057,-0.00012,0.07,-0.023,-0.14,-0.11,-0.024,0.5,0.084,-0.032,-0.069,0,0,0.00039,0.00038,0.046,0.021,0.021,0.0074,0.046,0.046,0.033,1.9e-06,1.7e-06,4.5e-06,0.03,0.03,0.00042,0.0012,6e-05,0.0012,0.0012,0.00072,0.0012,1,1 +16990000,-0.28,0.016,-0.0067,0.96,-0.036,0.0033,0.033,-0.015,-0.0034,0.024,-0.00094,-0.0057,-0.00012,0.07,-0.023,-0.14,-0.11,-0.024,0.5,0.084,-0.032,-0.069,0,0,0.00039,0.00038,0.046,0.021,0.021,0.0074,0.049,0.049,0.033,1.9e-06,1.7e-06,4.5e-06,0.03,0.03,0.00042,0.0012,6e-05,0.0012,0.0012,0.00072,0.0012,1,1 +17090000,-0.28,0.016,-0.0068,0.96,-0.041,0.0053,0.033,-0.019,-0.0029,0.023,-0.00093,-0.0057,-0.00012,0.07,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.032,-0.069,0,0,0.00039,0.00038,0.046,0.022,0.022,0.0075,0.054,0.054,0.033,1.9e-06,1.6e-06,4.5e-06,0.03,0.03,0.00042,0.0012,6e-05,0.0012,0.0012,0.00072,0.0012,1,1 +17190000,-0.28,0.016,-0.0069,0.96,-0.039,0.0071,0.034,-0.018,-0.0046,0.026,-0.00093,-0.0057,-0.00013,0.07,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00039,0.00038,0.046,0.022,0.022,0.0076,0.057,0.057,0.033,1.8e-06,1.6e-06,4.5e-06,0.03,0.03,0.00041,0.0012,6e-05,0.0012,0.0012,0.00072,0.0012,1,1 +17290000,-0.28,0.016,-0.0069,0.96,-0.042,0.0077,0.034,-0.022,-0.0035,0.026,-0.00092,-0.0057,-0.00013,0.07,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00039,0.00038,0.046,0.023,0.024,0.0077,0.062,0.063,0.033,1.8e-06,1.5e-06,4.5e-06,0.03,0.03,0.00041,0.0012,6e-05,0.0012,0.0012,0.00072,0.0012,1,1 +17390000,-0.28,0.016,-0.0069,0.96,-0.032,0.013,0.033,-0.014,-0.002,0.026,-0.00095,-0.0057,-0.00013,0.07,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00039,0.00038,0.046,0.02,0.02,0.0076,0.052,0.052,0.033,1.7e-06,1.5e-06,4.5e-06,0.03,0.03,0.00041,0.0012,6e-05,0.0012,0.0012,0.00072,0.0012,1,1 +17490000,-0.28,0.016,-0.0069,0.96,-0.032,0.014,0.033,-0.017,-0.00051,0.028,-0.00094,-0.0057,-0.00013,0.07,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00039,0.00038,0.046,0.021,0.022,0.0078,0.058,0.058,0.033,1.7e-06,1.5e-06,4.5e-06,0.03,0.03,0.0004,0.0012,6e-05,0.0012,0.0012,0.00072,0.0012,1,1 +17590000,-0.28,0.016,-0.0069,0.96,-0.032,0.012,0.032,-0.016,-0.00075,0.026,-0.00095,-0.0057,-0.00013,0.07,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00038,0.046,0.018,0.019,0.0077,0.049,0.049,0.033,1.6e-06,1.4e-06,4.4e-06,0.03,0.03,0.0004,0.0012,6e-05,0.0012,0.0012,0.00071,0.0012,1,1 +17690000,-0.28,0.016,-0.007,0.96,-0.033,0.012,0.033,-0.019,0.0003,0.028,-0.00096,-0.0057,-0.00013,0.07,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00038,0.046,0.02,0.02,0.0078,0.054,0.054,0.033,1.6e-06,1.4e-06,4.4e-06,0.03,0.03,0.00039,0.0012,6e-05,0.0012,0.0012,0.00071,0.0012,1,1 +17790000,-0.28,0.016,-0.007,0.96,-0.033,0.013,0.033,-0.018,0.0011,0.033,-0.00097,-0.0057,-0.00013,0.07,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00038,0.046,0.019,0.02,0.0078,0.057,0.057,0.033,1.6e-06,1.4e-06,4.4e-06,0.03,0.03,0.00039,0.0012,5.9e-05,0.0012,0.0012,0.00071,0.0012,1,1 +17890000,-0.28,0.016,-0.0069,0.96,-0.037,0.014,0.033,-0.021,0.0022,0.038,-0.00098,-0.0057,-0.00013,0.07,-0.023,-0.14,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00038,0.046,0.021,0.021,0.0079,0.062,0.062,0.033,1.5e-06,1.3e-06,4.4e-06,0.03,0.03,0.00039,0.0012,5.9e-05,0.0012,0.0012,0.00071,0.0012,1,1 +17990000,-0.28,0.016,-0.0069,0.96,-0.035,0.015,0.033,-0.017,0.0047,0.038,-0.00098,-0.0057,-0.00013,0.071,-0.023,-0.14,-0.11,-0.024,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00037,0.046,0.018,0.018,0.0079,0.052,0.052,0.033,1.5e-06,1.3e-06,4.4e-06,0.03,0.03,0.00038,0.0012,5.9e-05,0.0012,0.0012,0.00071,0.0012,1,1 +18090000,-0.28,0.016,-0.007,0.96,-0.037,0.016,0.032,-0.021,0.0061,0.037,-0.00098,-0.0057,-0.00013,0.071,-0.023,-0.14,-0.11,-0.024,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00037,0.046,0.019,0.02,0.008,0.057,0.057,0.034,1.5e-06,1.3e-06,4.4e-06,0.03,0.03,0.00038,0.0012,5.9e-05,0.0012,0.0012,0.00071,0.0012,1,1 +18190000,-0.28,0.016,-0.007,0.96,-0.034,0.013,0.033,-0.016,0.004,0.035,-0.001,-0.0057,-0.00013,0.071,-0.023,-0.14,-0.11,-0.024,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00037,0.046,0.017,0.017,0.0079,0.049,0.049,0.034,1.4e-06,1.2e-06,4.4e-06,0.03,0.03,0.00037,0.0012,5.9e-05,0.0012,0.0011,0.00071,0.0012,1,1 +18290000,-0.28,0.016,-0.007,0.96,-0.037,0.013,0.031,-0.02,0.005,0.033,-0.001,-0.0057,-0.00013,0.071,-0.023,-0.14,-0.11,-0.024,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00037,0.046,0.018,0.019,0.008,0.053,0.054,0.034,1.4e-06,1.2e-06,4.4e-06,0.03,0.03,0.00037,0.0012,5.9e-05,0.0012,0.0011,0.00071,0.0012,1,1 +18390000,-0.28,0.016,-0.0069,0.96,-0.033,0.013,0.031,-0.014,0.0042,0.033,-0.001,-0.0057,-0.00013,0.071,-0.023,-0.14,-0.11,-0.024,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00037,0.046,0.016,0.017,0.0079,0.046,0.047,0.034,1.4e-06,1.2e-06,4.4e-06,0.03,0.03,0.00036,0.0012,5.9e-05,0.0012,0.0011,0.00071,0.0012,1,1 +18490000,-0.28,0.016,-0.0069,0.96,-0.037,0.012,0.03,-0.018,0.005,0.034,-0.001,-0.0057,-0.00013,0.072,-0.022,-0.14,-0.11,-0.024,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00037,0.046,0.017,0.018,0.008,0.051,0.051,0.034,1.3e-06,1.2e-06,4.4e-06,0.03,0.03,0.00036,0.0012,5.9e-05,0.0012,0.0011,0.00071,0.0012,1,1 +18590000,-0.28,0.016,-0.0068,0.96,-0.035,0.012,0.03,-0.015,0.0045,0.037,-0.001,-0.0057,-0.00014,0.071,-0.022,-0.14,-0.11,-0.024,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00037,0.046,0.015,0.016,0.0079,0.044,0.045,0.034,1.3e-06,1.1e-06,4.4e-06,0.03,0.03,0.00035,0.0012,5.9e-05,0.0012,0.0011,0.00071,0.0012,1,1 +18690000,-0.28,0.016,-0.0067,0.96,-0.035,0.011,0.028,-0.017,0.0053,0.035,-0.0011,-0.0058,-0.00013,0.071,-0.022,-0.14,-0.11,-0.024,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00037,0.046,0.016,0.017,0.008,0.048,0.049,0.034,1.3e-06,1.1e-06,4.4e-06,0.03,0.03,0.00035,0.0012,5.9e-05,0.0012,0.0011,0.00071,0.0012,1,1 +18790000,-0.28,0.015,-0.0067,0.96,-0.031,0.011,0.028,-0.014,0.0046,0.033,-0.0011,-0.0058,-0.00014,0.071,-0.022,-0.14,-0.11,-0.024,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00037,0.046,0.015,0.016,0.0079,0.043,0.043,0.034,1.2e-06,1.1e-06,4.4e-06,0.03,0.03,0.00034,0.0012,5.9e-05,0.0012,0.0011,0.00071,0.0012,1,1 +18890000,-0.28,0.015,-0.0067,0.96,-0.032,0.011,0.026,-0.017,0.0057,0.029,-0.0011,-0.0058,-0.00014,0.071,-0.022,-0.14,-0.11,-0.024,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00037,0.046,0.016,0.017,0.008,0.047,0.047,0.034,1.2e-06,1.1e-06,4.4e-06,0.03,0.03,0.00034,0.0012,5.9e-05,0.0012,0.0011,0.00071,0.0012,1,1 +18990000,-0.28,0.015,-0.0066,0.96,-0.029,0.011,0.027,-0.015,0.005,0.033,-0.0011,-0.0058,-0.00014,0.071,-0.022,-0.14,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00037,0.046,0.015,0.015,0.0079,0.042,0.042,0.034,1.2e-06,1e-06,4.4e-06,0.03,0.03,0.00033,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 +19090000,-0.28,0.015,-0.0067,0.96,-0.029,0.012,0.027,-0.017,0.0056,0.029,-0.0011,-0.0058,-0.00014,0.071,-0.022,-0.14,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00037,0.046,0.016,0.016,0.0079,0.045,0.046,0.035,1.2e-06,1e-06,4.4e-06,0.03,0.03,0.00033,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 +19190000,-0.28,0.016,-0.0066,0.96,-0.026,0.013,0.027,-0.015,0.0056,0.028,-0.0011,-0.0058,-0.00015,0.071,-0.022,-0.14,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00037,0.046,0.014,0.015,0.0079,0.041,0.041,0.034,1.1e-06,9.8e-07,4.4e-06,0.03,0.03,0.00032,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 +19290000,-0.28,0.016,-0.0066,0.96,-0.027,0.013,0.027,-0.018,0.0067,0.027,-0.0011,-0.0058,-0.00015,0.071,-0.022,-0.14,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00037,0.046,0.015,0.016,0.0079,0.044,0.045,0.034,1.1e-06,9.7e-07,4.4e-06,0.03,0.03,0.00032,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 +19390000,-0.28,0.015,-0.0067,0.96,-0.025,0.011,0.028,-0.016,0.0067,0.026,-0.0011,-0.0058,-0.00015,0.071,-0.022,-0.14,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00037,0.046,0.014,0.015,0.0078,0.04,0.04,0.035,1.1e-06,9.4e-07,4.3e-06,0.03,0.03,0.00032,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 +19490000,-0.28,0.015,-0.0068,0.96,-0.028,0.012,0.028,-0.019,0.008,0.026,-0.0011,-0.0058,-0.00015,0.071,-0.022,-0.14,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00037,0.046,0.015,0.016,0.0078,0.043,0.044,0.035,1.1e-06,9.3e-07,4.3e-06,0.03,0.03,0.00031,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 +19590000,-0.28,0.015,-0.0067,0.96,-0.024,0.013,0.03,-0.016,0.0063,0.026,-0.0011,-0.0058,-0.00016,0.071,-0.022,-0.14,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00036,0.046,0.014,0.015,0.0077,0.039,0.04,0.035,1.1e-06,9e-07,4.3e-06,0.03,0.03,0.00031,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 +19690000,-0.28,0.016,-0.0067,0.96,-0.024,0.011,0.028,-0.019,0.007,0.026,-0.0011,-0.0058,-0.00016,0.072,-0.022,-0.13,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00037,0.046,0.015,0.016,0.0078,0.043,0.043,0.035,1e-06,8.9e-07,4.3e-06,0.03,0.03,0.0003,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 +19790000,-0.28,0.015,-0.0068,0.96,-0.021,0.011,0.026,-0.019,0.0075,0.022,-0.0011,-0.0058,-0.00016,0.072,-0.022,-0.13,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00037,0.046,0.015,0.016,0.0077,0.045,0.046,0.035,1e-06,8.7e-07,4.3e-06,0.03,0.03,0.0003,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 +19890000,-0.28,0.016,-0.0068,0.96,-0.023,0.011,0.027,-0.021,0.0087,0.02,-0.0011,-0.0058,-0.00016,0.072,-0.022,-0.13,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00037,0.046,0.016,0.017,0.0077,0.049,0.05,0.035,1e-06,8.6e-07,4.3e-06,0.03,0.03,0.00029,0.0012,5.9e-05,0.0012,0.0011,0.0007,0.0012,1,1 +19990000,-0.28,0.016,-0.0068,0.96,-0.02,0.012,0.024,-0.016,0.0081,0.017,-0.0011,-0.0058,-0.00016,0.072,-0.022,-0.13,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00036,0.046,0.014,0.015,0.0076,0.043,0.044,0.035,9.7e-07,8.3e-07,4.3e-06,0.03,0.03,0.00029,0.0012,5.8e-05,0.0012,0.0011,0.0007,0.0012,1,1 +20090000,-0.28,0.016,-0.0068,0.96,-0.022,0.015,0.024,-0.018,0.0093,0.02,-0.0011,-0.0058,-0.00016,0.072,-0.022,-0.13,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00036,0.046,0.015,0.017,0.0076,0.047,0.048,0.035,9.7e-07,8.2e-07,4.3e-06,0.03,0.03,0.00029,0.0012,5.8e-05,0.0012,0.0011,0.0007,0.0012,1,1 +20190000,-0.28,0.016,-0.0068,0.96,-0.023,0.013,0.025,-0.019,0.0097,0.02,-0.0011,-0.0058,-0.00017,0.072,-0.022,-0.13,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00036,0.046,0.015,0.017,0.0075,0.05,0.05,0.035,9.4e-07,8e-07,4.3e-06,0.03,0.03,0.00028,0.0012,5.8e-05,0.0012,0.0011,0.0007,0.0012,1,1 +20290000,-0.28,0.016,-0.0068,0.96,-0.021,0.015,0.025,-0.022,0.011,0.021,-0.0011,-0.0058,-0.00017,0.072,-0.022,-0.13,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00036,0.046,0.016,0.018,0.0075,0.054,0.055,0.035,9.3e-07,7.9e-07,4.3e-06,0.03,0.03,0.00028,0.0012,5.8e-05,0.0012,0.0011,0.0007,0.0012,1,1 +20390000,-0.28,0.016,-0.0067,0.96,-0.019,0.013,0.025,-0.022,0.01,0.022,-0.0011,-0.0058,-0.00017,0.072,-0.022,-0.13,-0.11,-0.023,0.5,0.084,-0.034,-0.069,0,0,0.00038,0.00036,0.046,0.016,0.018,0.0075,0.056,0.057,0.035,9.1e-07,7.7e-07,4.3e-06,0.03,0.03,0.00027,0.0012,5.8e-05,0.0012,0.0011,0.0007,0.0012,1,1 +20490000,-0.28,0.016,-0.0067,0.96,-0.017,0.015,0.025,-0.024,0.011,0.02,-0.0011,-0.0058,-0.00017,0.072,-0.022,-0.13,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00036,0.046,0.017,0.019,0.0075,0.061,0.063,0.035,9e-07,7.7e-07,4.3e-06,0.03,0.03,0.00027,0.0012,5.8e-05,0.0012,0.0011,0.0007,0.0012,1,1 +20590000,-0.28,0.016,-0.0066,0.96,-0.017,0.014,0.025,-0.024,0.01,0.018,-0.0011,-0.0058,-0.00017,0.072,-0.022,-0.13,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00038,0.00036,0.046,0.017,0.019,0.0074,0.064,0.065,0.035,8.8e-07,7.5e-07,4.2e-06,0.03,0.03,0.00026,0.0012,5.8e-05,0.0012,0.0011,0.00069,0.0012,1,1 +20690000,-0.28,0.016,-0.0066,0.96,-0.016,0.014,0.026,-0.025,0.012,0.019,-0.0011,-0.0058,-0.00017,0.072,-0.022,-0.13,-0.11,-0.023,0.5,0.084,-0.034,-0.069,0,0,0.00038,0.00036,0.046,0.018,0.02,0.0074,0.069,0.071,0.035,8.7e-07,7.4e-07,4.2e-06,0.03,0.03,0.00026,0.0012,5.8e-05,0.0012,0.0011,0.00069,0.0012,1,1 +20790000,-0.28,0.016,-0.006,0.96,-0.01,0.01,0.01,-0.019,0.0088,0.017,-0.0012,-0.0058,-0.00018,0.072,-0.021,-0.13,-0.11,-0.023,0.5,0.084,-0.034,-0.069,0,0,0.00038,0.00036,0.046,0.016,0.017,0.0073,0.057,0.057,0.035,8.4e-07,7.1e-07,4.2e-06,0.03,0.03,0.00026,0.0012,5.8e-05,0.0012,0.0011,0.00069,0.0012,1,1 +20890000,-0.28,0.011,0.0027,0.96,-0.0058,-5.9e-05,-0.11,-0.021,0.0092,0.011,-0.0012,-0.0058,-0.00018,0.072,-0.022,-0.13,-0.11,-0.023,0.5,0.084,-0.033,-0.069,0,0,0.00037,0.00034,0.046,0.017,0.018,0.0073,0.061,0.062,0.035,8.3e-07,7.1e-07,4.2e-06,0.03,0.03,0.00025,0.0012,5.8e-05,0.0012,0.0011,0.00069,0.0012,1,1 +20990000,-0.28,0.0071,0.0057,0.96,0.0086,-0.017,-0.25,-0.017,0.007,-0.004,-0.0011,-0.0058,-0.00019,0.072,-0.022,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.068,0,0,0.00036,0.00034,0.046,0.015,0.016,0.0072,0.052,0.052,0.034,8e-07,6.9e-07,4.2e-06,0.03,0.03,0.00025,0.0012,5.8e-05,0.0012,0.0011,0.00069,0.0012,1,1 +21090000,-0.28,0.0076,0.0042,0.96,0.022,-0.029,-0.37,-0.016,0.005,-0.035,-0.0011,-0.0058,-0.00019,0.072,-0.022,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.068,0,0,0.00036,0.00034,0.046,0.016,0.017,0.0072,0.056,0.057,0.035,8e-07,6.8e-07,4.2e-06,0.03,0.03,0.00025,0.0011,5.8e-05,0.0012,0.0011,0.00069,0.0012,1,1 +21190000,-0.28,0.0095,0.0015,0.96,0.028,-0.035,-0.49,-0.013,0.0038,-0.071,-0.0011,-0.0058,-0.00018,0.072,-0.022,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.068,0,0,0.00036,0.00034,0.046,0.014,0.016,0.0071,0.048,0.049,0.035,7.7e-07,6.6e-07,4.1e-06,0.03,0.03,0.00024,0.0011,5.8e-05,0.0012,0.0011,0.00068,0.0012,1,1 +21290000,-0.28,0.011,-0.00054,0.96,0.026,-0.037,-0.62,-0.011,0.0011,-0.13,-0.0011,-0.0058,-0.00019,0.072,-0.023,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.068,0,0,0.00036,0.00034,0.046,0.015,0.017,0.0071,0.052,0.053,0.035,7.7e-07,6.5e-07,4.1e-06,0.03,0.03,0.00024,0.0011,5.8e-05,0.0012,0.0011,0.00068,0.0012,1,1 +21390000,-0.28,0.012,-0.002,0.96,0.019,-0.029,-0.75,-0.013,0.0046,-0.19,-0.0011,-0.0058,-0.00017,0.072,-0.024,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.068,0,0,0.00037,0.00034,0.046,0.016,0.017,0.007,0.054,0.055,0.035,7.5e-07,6.4e-07,4.1e-06,0.03,0.03,0.00024,0.0011,5.8e-05,0.0012,0.0011,0.00068,0.0012,1,1 +21490000,-0.28,0.012,-0.0028,0.96,0.013,-0.027,-0.88,-0.011,0.0015,-0.28,-0.0011,-0.0058,-0.00017,0.072,-0.024,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.068,0,0,0.00037,0.00034,0.046,0.017,0.018,0.007,0.059,0.06,0.035,7.4e-07,6.3e-07,4.1e-06,0.03,0.03,0.00023,0.0011,5.7e-05,0.0012,0.0011,0.00068,0.0012,1,1 +21590000,-0.28,0.012,-0.0034,0.96,0.0009,-0.021,-1,-0.015,0.0065,-0.37,-0.0011,-0.0058,-0.00014,0.072,-0.025,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.068,0,0,0.00036,0.00034,0.045,0.017,0.018,0.0069,0.061,0.063,0.034,7.3e-07,6.2e-07,4.1e-06,0.03,0.029,0.00023,0.0011,5.7e-05,0.0012,0.0011,0.00068,0.0012,1,1 +21690000,-0.28,0.012,-0.0037,0.96,-0.0046,-0.017,-1.1,-0.015,0.004,-0.48,-0.0011,-0.0058,-0.00014,0.072,-0.025,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.068,0,0,0.00036,0.00034,0.045,0.018,0.02,0.0069,0.066,0.068,0.035,7.2e-07,6.1e-07,4.1e-06,0.03,0.029,0.00023,0.0011,5.7e-05,0.0012,0.0011,0.00068,0.0012,1,1 +21790000,-0.28,0.012,-0.0041,0.96,-0.011,-0.0087,-1.3,-0.017,0.01,-0.6,-0.0011,-0.0058,-0.00011,0.072,-0.026,-0.13,-0.11,-0.024,0.5,0.083,-0.032,-0.068,0,0,0.00036,0.00034,0.045,0.018,0.019,0.0069,0.069,0.07,0.034,7e-07,6e-07,4.1e-06,0.03,0.029,0.00022,0.0011,5.7e-05,0.0012,0.0011,0.00068,0.0012,1,1 +21890000,-0.28,0.013,-0.0044,0.96,-0.017,-0.0041,-1.4,-0.018,0.01,-0.74,-0.0011,-0.0058,-0.00011,0.072,-0.026,-0.13,-0.11,-0.024,0.5,0.083,-0.032,-0.068,0,0,0.00036,0.00034,0.045,0.019,0.021,0.0068,0.074,0.076,0.034,7e-07,6e-07,4.1e-06,0.03,0.029,0.00022,0.0011,5.7e-05,0.0012,0.0011,0.00068,0.0012,1,1 +21990000,-0.28,0.013,-0.0052,0.96,-0.022,0.0043,-1.4,-0.024,0.018,-0.88,-0.0011,-0.0058,-8.8e-05,0.072,-0.027,-0.13,-0.11,-0.024,0.5,0.083,-0.032,-0.068,0,0,0.00036,0.00034,0.045,0.018,0.02,0.0068,0.077,0.079,0.034,6.8e-07,5.8e-07,4e-06,0.03,0.029,0.00022,0.0011,5.7e-05,0.0012,0.0011,0.00068,0.0012,1,1 +22090000,-0.28,0.014,-0.0058,0.96,-0.025,0.0075,-1.4,-0.025,0.018,-1,-0.0011,-0.0058,-8.2e-05,0.072,-0.027,-0.13,-0.11,-0.024,0.5,0.083,-0.032,-0.068,0,0,0.00036,0.00035,0.045,0.019,0.021,0.0068,0.083,0.085,0.034,6.8e-07,5.8e-07,4e-06,0.03,0.029,0.00022,0.0011,5.7e-05,0.0012,0.0011,0.00068,0.0012,1,1 +22190000,-0.28,0.014,-0.0063,0.96,-0.032,0.014,-1.4,-0.03,0.025,-1.2,-0.0011,-0.0058,-5.9e-05,0.072,-0.028,-0.13,-0.11,-0.024,0.5,0.083,-0.032,-0.068,0,0,0.00036,0.00035,0.045,0.019,0.021,0.0067,0.085,0.087,0.034,6.6e-07,5.6e-07,4e-06,0.029,0.029,0.00021,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +22290000,-0.28,0.014,-0.007,0.96,-0.04,0.019,-1.4,-0.034,0.027,-1.3,-0.0011,-0.0058,-6e-05,0.072,-0.028,-0.13,-0.11,-0.024,0.5,0.083,-0.032,-0.068,0,0,0.00036,0.00035,0.045,0.02,0.022,0.0067,0.091,0.094,0.034,6.6e-07,5.6e-07,4e-06,0.029,0.029,0.00021,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +22390000,-0.28,0.015,-0.0073,0.96,-0.047,0.026,-1.4,-0.04,0.031,-1.5,-0.0011,-0.0058,-6.1e-05,0.072,-0.028,-0.13,-0.11,-0.024,0.5,0.083,-0.032,-0.068,0,0,0.00036,0.00035,0.045,0.019,0.021,0.0066,0.094,0.096,0.034,6.4e-07,5.5e-07,4e-06,0.029,0.029,0.00021,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +22490000,-0.28,0.015,-0.0074,0.96,-0.053,0.032,-1.4,-0.045,0.034,-1.6,-0.0011,-0.0058,-6.4e-05,0.072,-0.028,-0.13,-0.11,-0.024,0.5,0.083,-0.032,-0.068,0,0,0.00037,0.00035,0.045,0.02,0.022,0.0066,0.1,0.1,0.034,6.4e-07,5.4e-07,4e-06,0.029,0.029,0.00021,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +22590000,-0.28,0.016,-0.0073,0.96,-0.058,0.038,-1.4,-0.046,0.038,-1.7,-0.0011,-0.0058,-5.7e-05,0.072,-0.028,-0.13,-0.11,-0.024,0.5,0.083,-0.032,-0.068,0,0,0.00037,0.00035,0.045,0.02,0.022,0.0065,0.1,0.11,0.034,6.2e-07,5.3e-07,3.9e-06,0.029,0.029,0.0002,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +22690000,-0.28,0.016,-0.0072,0.96,-0.062,0.042,-1.4,-0.053,0.042,-1.9,-0.0011,-0.0058,-5.8e-05,0.072,-0.028,-0.13,-0.11,-0.024,0.5,0.083,-0.032,-0.068,0,0,0.00037,0.00035,0.045,0.021,0.023,0.0065,0.11,0.11,0.034,6.2e-07,5.3e-07,3.9e-06,0.029,0.029,0.0002,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +22790000,-0.28,0.016,-0.0071,0.96,-0.069,0.047,-1.4,-0.059,0.045,-2,-0.0011,-0.0058,-6.6e-05,0.072,-0.028,-0.13,-0.11,-0.024,0.5,0.083,-0.032,-0.068,0,0,0.00037,0.00035,0.045,0.02,0.022,0.0065,0.11,0.11,0.034,6e-07,5.1e-07,3.9e-06,0.029,0.029,0.0002,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +22890000,-0.28,0.017,-0.0072,0.96,-0.074,0.051,-1.4,-0.065,0.048,-2.2,-0.0011,-0.0058,-5.8e-05,0.072,-0.028,-0.13,-0.11,-0.024,0.5,0.083,-0.032,-0.068,0,0,0.00037,0.00035,0.045,0.021,0.023,0.0065,0.12,0.12,0.034,6e-07,5.1e-07,3.9e-06,0.029,0.029,0.0002,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +22990000,-0.28,0.017,-0.007,0.96,-0.076,0.051,-1.4,-0.068,0.047,-2.3,-0.0011,-0.0058,-6.3e-05,0.072,-0.027,-0.13,-0.11,-0.024,0.5,0.083,-0.032,-0.068,0,0,0.00037,0.00034,0.045,0.02,0.022,0.0064,0.12,0.12,0.034,5.8e-07,5e-07,3.9e-06,0.029,0.029,0.00019,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +23090000,-0.28,0.017,-0.007,0.96,-0.082,0.055,-1.4,-0.075,0.053,-2.5,-0.0011,-0.0058,-6.1e-05,0.072,-0.027,-0.13,-0.11,-0.024,0.5,0.083,-0.032,-0.068,0,0,0.00037,0.00035,0.045,0.021,0.023,0.0064,0.13,0.13,0.034,5.8e-07,5e-07,3.9e-06,0.029,0.029,0.00019,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +23190000,-0.28,0.017,-0.0069,0.96,-0.084,0.05,-1.4,-0.074,0.049,-2.6,-0.0011,-0.0058,-8.4e-05,0.072,-0.026,-0.13,-0.11,-0.024,0.5,0.083,-0.032,-0.068,0,0,0.00037,0.00034,0.045,0.021,0.023,0.0063,0.13,0.13,0.033,5.7e-07,4.9e-07,3.8e-06,0.029,0.029,0.00019,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +23290000,-0.28,0.018,-0.0073,0.96,-0.09,0.054,-1.4,-0.083,0.053,-2.7,-0.0011,-0.0058,-8e-05,0.072,-0.026,-0.13,-0.11,-0.024,0.5,0.083,-0.032,-0.068,0,0,0.00037,0.00035,0.045,0.022,0.024,0.0063,0.14,0.14,0.034,5.6e-07,4.8e-07,3.8e-06,0.029,0.029,0.00019,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +23390000,-0.28,0.018,-0.0073,0.96,-0.089,0.056,-1.4,-0.077,0.055,-2.9,-0.0011,-0.0058,-9.8e-05,0.071,-0.026,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.068,0,0,0.00037,0.00034,0.045,0.021,0.023,0.0063,0.14,0.14,0.033,5.5e-07,4.7e-07,3.8e-06,0.029,0.029,0.00018,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +23490000,-0.28,0.018,-0.0073,0.96,-0.096,0.057,-1.4,-0.088,0.059,-3,-0.0011,-0.0058,-9e-05,0.071,-0.026,-0.13,-0.11,-0.024,0.5,0.084,-0.032,-0.068,0,0,0.00037,0.00035,0.045,0.022,0.024,0.0063,0.15,0.15,0.033,5.5e-07,4.7e-07,3.8e-06,0.029,0.029,0.00018,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +23590000,-0.28,0.018,-0.0074,0.96,-0.094,0.051,-1.4,-0.083,0.049,-3.2,-0.0011,-0.0058,-0.00011,0.071,-0.025,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.068,0,0,0.00037,0.00034,0.045,0.021,0.023,0.0062,0.15,0.15,0.033,5.4e-07,4.6e-07,3.8e-06,0.029,0.029,0.00018,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +23690000,-0.28,0.019,-0.008,0.96,-0.093,0.053,-1.3,-0.092,0.053,-3.3,-0.0011,-0.0058,-0.00011,0.071,-0.025,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.068,0,0,0.00037,0.00035,0.045,0.022,0.024,0.0062,0.16,0.16,0.033,5.4e-07,4.6e-07,3.8e-06,0.029,0.029,0.00018,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +23790000,-0.28,0.021,-0.0095,0.96,-0.077,0.049,-0.95,-0.082,0.049,-3.4,-0.0012,-0.0058,-0.00012,0.071,-0.025,-0.13,-0.11,-0.024,0.5,0.084,-0.033,-0.068,0,0,0.00039,0.00036,0.045,0.021,0.022,0.0061,0.16,0.16,0.033,5.2e-07,4.5e-07,3.7e-06,0.029,0.029,0.00018,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +23890000,-0.28,0.026,-0.012,0.96,-0.071,0.05,-0.52,-0.089,0.053,-3.5,-0.0012,-0.0058,-0.00011,0.071,-0.025,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.067,0,0,0.00042,0.00038,0.045,0.021,0.023,0.0061,0.17,0.17,0.033,5.2e-07,4.5e-07,3.7e-06,0.029,0.029,0.00018,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +23990000,-0.28,0.028,-0.014,0.96,-0.061,0.048,-0.13,-0.077,0.048,-3.6,-0.0012,-0.0058,-0.00013,0.071,-0.025,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.067,0,0,0.00043,0.0004,0.045,0.02,0.022,0.0061,0.17,0.17,0.033,5.1e-07,4.4e-07,3.7e-06,0.029,0.029,0.00017,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +24090000,-0.28,0.027,-0.014,0.96,-0.067,0.055,0.1,-0.082,0.053,-3.6,-0.0012,-0.0058,-0.00013,0.071,-0.025,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.067,0,0,0.00043,0.0004,0.045,0.021,0.023,0.0061,0.18,0.18,0.033,5.1e-07,4.4e-07,3.7e-06,0.029,0.029,0.00017,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +24190000,-0.28,0.023,-0.011,0.96,-0.071,0.052,0.089,-0.069,0.04,-3.6,-0.0012,-0.0058,-0.00015,0.072,-0.026,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.0004,0.00037,0.045,0.02,0.022,0.006,0.18,0.18,0.033,5e-07,4.3e-07,3.6e-06,0.029,0.029,0.00017,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +24290000,-0.28,0.02,-0.0093,0.96,-0.076,0.055,0.068,-0.076,0.045,-3.6,-0.0012,-0.0058,-0.00015,0.072,-0.026,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00038,0.00036,0.045,0.021,0.023,0.006,0.19,0.19,0.033,5e-07,4.3e-07,3.6e-06,0.029,0.029,0.00017,0.0011,5.7e-05,0.0012,0.0011,0.00067,0.0012,1,1 +24390000,-0.28,0.018,-0.0085,0.96,-0.059,0.048,0.084,-0.058,0.036,-3.6,-0.0013,-0.0058,-0.00016,0.073,-0.027,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00038,0.00035,0.045,0.02,0.022,0.006,0.19,0.19,0.033,4.9e-07,4.2e-07,3.6e-06,0.029,0.029,0.00017,0.0011,5.6e-05,0.0012,0.0011,0.00067,0.0012,1,1 +24490000,-0.28,0.019,-0.0087,0.96,-0.054,0.044,0.081,-0.063,0.039,-3.6,-0.0013,-0.0058,-0.00014,0.073,-0.027,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00038,0.00035,0.045,0.021,0.023,0.006,0.2,0.2,0.033,4.9e-07,4.2e-07,3.6e-06,0.029,0.029,0.00017,0.0011,5.6e-05,0.0012,0.0011,0.00067,0.0012,1,1 +24590000,-0.28,0.019,-0.0094,0.96,-0.043,0.042,0.077,-0.045,0.033,-3.6,-0.0013,-0.0058,-0.00016,0.074,-0.028,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00038,0.00036,0.045,0.021,0.022,0.0059,0.2,0.2,0.033,4.8e-07,4.1e-07,3.6e-06,0.029,0.029,0.00016,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +24690000,-0.28,0.019,-0.0099,0.96,-0.041,0.041,0.076,-0.049,0.037,-3.5,-0.0013,-0.0058,-0.00016,0.074,-0.028,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00038,0.00036,0.045,0.021,0.024,0.0059,0.21,0.21,0.033,4.8e-07,4.1e-07,3.6e-06,0.029,0.029,0.00016,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +24790000,-0.28,0.018,-0.01,0.96,-0.034,0.04,0.068,-0.037,0.029,-3.5,-0.0013,-0.0058,-0.00017,0.074,-0.029,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00037,0.00036,0.045,0.021,0.023,0.0059,0.21,0.21,0.032,4.7e-07,4.1e-07,3.5e-06,0.029,0.029,0.00016,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +24890000,-0.28,0.017,-0.0099,0.96,-0.033,0.042,0.058,-0.04,0.032,-3.5,-0.0013,-0.0058,-0.00016,0.074,-0.029,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00037,0.00036,0.045,0.022,0.024,0.0059,0.22,0.22,0.032,4.7e-07,4e-07,3.5e-06,0.029,0.029,0.00016,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +24990000,-0.28,0.017,-0.0097,0.96,-0.021,0.043,0.05,-0.026,0.027,-3.5,-0.0013,-0.0058,-0.00018,0.074,-0.03,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00037,0.00036,0.045,0.021,0.023,0.0058,0.22,0.22,0.032,4.6e-07,4e-07,3.5e-06,0.029,0.029,0.00016,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +25090000,-0.28,0.017,-0.01,0.96,-0.016,0.043,0.048,-0.027,0.031,-3.5,-0.0013,-0.0058,-0.00018,0.074,-0.03,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00037,0.00036,0.045,0.022,0.024,0.0058,0.23,0.23,0.032,4.6e-07,4e-07,3.5e-06,0.029,0.029,0.00016,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +25190000,-0.28,0.017,-0.01,0.96,-0.006,0.038,0.048,-0.011,0.021,-3.5,-0.0013,-0.0059,-0.0002,0.075,-0.03,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00037,0.00036,0.045,0.021,0.023,0.0058,0.23,0.23,0.032,4.5e-07,3.9e-07,3.5e-06,0.029,0.029,0.00016,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +25290000,-0.28,0.016,-0.01,0.96,-0.0013,0.041,0.043,-0.012,0.026,-3.5,-0.0013,-0.0059,-0.00021,0.075,-0.03,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00037,0.00036,0.045,0.022,0.024,0.0058,0.24,0.24,0.032,4.5e-07,3.9e-07,3.5e-06,0.029,0.029,0.00015,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +25390000,-0.28,0.016,-0.011,0.96,0.0076,0.039,0.041,-0.0022,0.02,-3.5,-0.0013,-0.0059,-0.00022,0.075,-0.031,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00036,0.00036,0.045,0.021,0.023,0.0058,0.24,0.24,0.032,4.4e-07,3.8e-07,3.4e-06,0.029,0.029,0.00015,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +25490000,-0.28,0.016,-0.011,0.96,0.012,0.04,0.041,-0.0021,0.024,-3.5,-0.0013,-0.0059,-0.00022,0.075,-0.031,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00036,0.00036,0.045,0.022,0.024,0.0058,0.25,0.25,0.032,4.4e-07,3.8e-07,3.4e-06,0.029,0.029,0.00015,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +25590000,-0.28,0.016,-0.011,0.96,0.017,0.035,0.042,0.0049,0.0094,-3.5,-0.0014,-0.0058,-0.00024,0.075,-0.031,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00036,0.00036,0.045,0.021,0.023,0.0057,0.25,0.25,0.032,4.3e-07,3.8e-07,3.4e-06,0.029,0.029,0.00015,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +25690000,-0.28,0.015,-0.01,0.96,0.018,0.034,0.031,0.0066,0.013,-3.5,-0.0014,-0.0058,-0.00024,0.075,-0.031,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00036,0.00036,0.045,0.022,0.024,0.0057,0.26,0.26,0.032,4.3e-07,3.8e-07,3.4e-06,0.029,0.029,0.00015,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +25790000,-0.28,0.015,-0.01,0.96,0.028,0.029,0.031,0.014,0.0031,-3.5,-0.0014,-0.0058,-0.00025,0.075,-0.031,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00036,0.00036,0.045,0.021,0.023,0.0057,0.26,0.26,0.032,4.2e-07,3.7e-07,3.4e-06,0.029,0.029,0.00015,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +25890000,-0.28,0.015,-0.01,0.96,0.034,0.029,0.033,0.017,0.0067,-3.5,-0.0014,-0.0058,-0.00026,0.075,-0.031,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00036,0.00036,0.045,0.022,0.024,0.0057,0.27,0.27,0.032,4.2e-07,3.7e-07,3.3e-06,0.029,0.029,0.00015,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +25990000,-0.28,0.015,-0.01,0.96,0.036,0.024,0.027,0.013,-0.004,-3.5,-0.0014,-0.0058,-0.00028,0.075,-0.031,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00036,0.00036,0.045,0.021,0.023,0.0057,0.27,0.27,0.032,4.2e-07,3.6e-07,3.3e-06,0.029,0.029,0.00015,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +26090000,-0.28,0.015,-0.0099,0.96,0.041,0.024,0.025,0.017,-0.0023,-3.5,-0.0014,-0.0058,-0.00027,0.075,-0.031,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00036,0.00036,0.045,0.022,0.024,0.0057,0.28,0.28,0.032,4.2e-07,3.6e-07,3.3e-06,0.029,0.029,0.00015,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +26190000,-0.28,0.015,-0.0098,0.96,0.046,0.015,0.021,0.02,-0.018,-3.5,-0.0014,-0.0058,-0.00028,0.075,-0.032,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00036,0.00036,0.045,0.021,0.023,0.0056,0.27,0.28,0.032,4.1e-07,3.6e-07,3.3e-06,0.029,0.029,0.00014,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +26290000,-0.28,0.016,-0.0098,0.96,0.046,0.014,0.015,0.024,-0.016,-3.5,-0.0014,-0.0058,-0.00029,0.075,-0.032,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00037,0.00036,0.045,0.022,0.024,0.0056,0.29,0.29,0.032,4.1e-07,3.6e-07,3.3e-06,0.029,0.029,0.00014,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +26390000,-0.28,0.016,-0.0092,0.96,0.043,0.0051,0.019,0.015,-0.03,-3.5,-0.0014,-0.0058,-0.0003,0.075,-0.032,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00037,0.00036,0.045,0.021,0.023,0.0056,0.28,0.29,0.032,4e-07,3.5e-07,3.3e-06,0.029,0.029,0.00014,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +26490000,-0.28,0.016,-0.009,0.96,0.046,0.0028,0.028,0.02,-0.03,-3.5,-0.0014,-0.0058,-0.00031,0.075,-0.032,-0.13,-0.11,-0.024,0.5,0.083,-0.033,-0.066,0,0,0.00037,0.00036,0.045,0.022,0.024,0.0056,0.3,0.3,0.032,4e-07,3.5e-07,3.2e-06,0.029,0.029,0.00014,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +26590000,-0.28,0.016,-0.0084,0.96,0.045,-0.0071,0.029,0.019,-0.042,-3.5,-0.0014,-0.0058,-0.00032,0.075,-0.032,-0.13,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00037,0.00035,0.045,0.021,0.023,0.0056,0.29,0.3,0.032,4e-07,3.5e-07,3.2e-06,0.029,0.029,0.00014,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +26690000,-0.28,0.016,-0.0083,0.96,0.047,-0.011,0.027,0.023,-0.042,-3.5,-0.0014,-0.0058,-0.00033,0.075,-0.032,-0.13,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00037,0.00035,0.045,0.022,0.024,0.0056,0.31,0.31,0.032,4e-07,3.5e-07,3.2e-06,0.029,0.029,0.00014,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +26790000,-0.27,0.015,-0.0081,0.96,0.049,-0.017,0.027,0.02,-0.055,-3.5,-0.0014,-0.0058,-0.00035,0.075,-0.032,-0.13,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00037,0.00035,0.045,0.021,0.023,0.0055,0.3,0.31,0.031,3.9e-07,3.4e-07,3.2e-06,0.029,0.029,0.00014,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +26890000,-0.27,0.015,-0.0074,0.96,0.055,-0.02,0.022,0.026,-0.057,-3.5,-0.0014,-0.0058,-0.00034,0.075,-0.032,-0.13,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00037,0.00035,0.045,0.022,0.024,0.0056,0.32,0.32,0.032,3.9e-07,3.4e-07,3.2e-06,0.029,0.029,0.00014,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +26990000,-0.27,0.016,-0.0069,0.96,0.056,-0.026,0.021,0.018,-0.064,-3.5,-0.0014,-0.0058,-0.00035,0.075,-0.032,-0.13,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00037,0.00035,0.045,0.021,0.023,0.0055,0.31,0.32,0.031,3.8e-07,3.4e-07,3.1e-06,0.029,0.029,0.00014,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +27090000,-0.27,0.016,-0.0067,0.96,0.058,-0.033,0.025,0.024,-0.067,-3.5,-0.0014,-0.0058,-0.00035,0.075,-0.032,-0.13,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00037,0.00035,0.045,0.022,0.024,0.0055,0.33,0.33,0.031,3.8e-07,3.4e-07,3.1e-06,0.029,0.029,0.00014,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +27190000,-0.27,0.016,-0.0068,0.96,0.058,-0.036,0.027,0.014,-0.069,-3.5,-0.0014,-0.0058,-0.00034,0.075,-0.032,-0.13,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00037,0.00035,0.045,0.021,0.023,0.0055,0.32,0.33,0.031,3.8e-07,3.3e-07,3.1e-06,0.029,0.029,0.00014,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +27290000,-0.27,0.017,-0.0069,0.96,0.066,-0.041,0.14,0.02,-0.073,-3.5,-0.0014,-0.0058,-0.00035,0.075,-0.033,-0.13,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00038,0.00035,0.045,0.022,0.024,0.0055,0.33,0.34,0.031,3.8e-07,3.3e-07,3.1e-06,0.029,0.029,0.00014,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +27390000,-0.27,0.019,-0.0081,0.96,0.07,-0.034,0.46,0.0048,-0.026,-3.5,-0.0014,-0.0058,-0.00032,0.075,-0.033,-0.13,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00039,0.00035,0.045,0.015,0.017,0.0055,0.15,0.15,0.031,3.7e-07,3.3e-07,3.1e-06,0.029,0.029,0.00013,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +27490000,-0.27,0.021,-0.0093,0.96,0.076,-0.037,0.78,0.012,-0.029,-3.5,-0.0014,-0.0058,-0.00033,0.075,-0.033,-0.13,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.0004,0.00036,0.045,0.016,0.017,0.0055,0.15,0.15,0.031,3.7e-07,3.3e-07,3.1e-06,0.029,0.029,0.00013,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +27590000,-0.27,0.02,-0.0093,0.96,0.067,-0.039,0.87,0.0064,-0.02,-3.4,-0.0014,-0.0058,-0.00032,0.074,-0.034,-0.13,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.0004,0.00036,0.045,0.014,0.015,0.0055,0.096,0.097,0.031,3.7e-07,3.2e-07,3e-06,0.029,0.029,0.00013,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +27690000,-0.27,0.017,-0.0084,0.96,0.061,-0.036,0.78,0.013,-0.024,-3.3,-0.0014,-0.0058,-0.00031,0.075,-0.034,-0.13,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00038,0.00035,0.045,0.014,0.016,0.0055,0.1,0.1,0.031,3.7e-07,3.2e-07,3e-06,0.029,0.029,0.00013,0.0011,5.6e-05,0.0012,0.0011,0.00066,0.0012,1,1 +27790000,-0.27,0.016,-0.0072,0.96,0.058,-0.034,0.77,0.01,-0.019,-3.2,-0.0014,-0.0058,-0.0003,0.074,-0.033,-0.13,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00037,0.00035,0.045,0.013,0.015,0.0054,0.073,0.074,0.031,3.6e-07,3.2e-07,3e-06,0.029,0.029,0.00013,0.0011,5.6e-05,0.0012,0.0011,0.00065,0.0012,1,1 +27890000,-0.27,0.016,-0.0068,0.96,0.064,-0.04,0.81,0.016,-0.023,-3.2,-0.0014,-0.0058,-0.0003,0.074,-0.033,-0.13,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00037,0.00035,0.045,0.014,0.016,0.0055,0.076,0.077,0.031,3.6e-07,3.2e-07,3e-06,0.029,0.029,0.00013,0.0011,5.6e-05,0.0012,0.0011,0.00065,0.0012,1,1 +27990000,-0.27,0.016,-0.0072,0.96,0.064,-0.042,0.8,0.019,-0.026,-3.1,-0.0014,-0.0058,-0.00029,0.074,-0.033,-0.13,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00038,0.00035,0.045,0.014,0.016,0.0054,0.079,0.079,0.031,3.6e-07,3.2e-07,3e-06,0.029,0.029,0.00013,0.0011,5.6e-05,0.0012,0.0011,0.00065,0.0012,1,1 +28090000,-0.27,0.016,-0.0075,0.96,0.068,-0.043,0.8,0.026,-0.03,-3,-0.0014,-0.0058,-0.00028,0.074,-0.033,-0.13,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00038,0.00035,0.045,0.015,0.017,0.0054,0.082,0.083,0.031,3.6e-07,3.1e-07,3e-06,0.029,0.029,0.00013,0.0011,5.6e-05,0.0012,0.0011,0.00065,0.0012,1,1 +28190000,-0.27,0.016,-0.0069,0.96,0.065,-0.041,0.81,0.027,-0.032,-2.9,-0.0013,-0.0058,-0.00028,0.074,-0.033,-0.13,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00038,0.00035,0.045,0.015,0.017,0.0054,0.085,0.085,0.031,3.5e-07,3.1e-07,2.9e-06,0.029,0.029,0.00013,0.0011,5.6e-05,0.0012,0.0011,0.00065,0.0012,1,1 +28290000,-0.27,0.017,-0.0064,0.96,0.069,-0.044,0.81,0.033,-0.037,-2.9,-0.0013,-0.0058,-0.00027,0.074,-0.033,-0.13,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00038,0.00035,0.045,0.016,0.018,0.0054,0.089,0.09,0.031,3.5e-07,3.1e-07,2.9e-06,0.029,0.029,0.00013,0.0011,5.6e-05,0.0012,0.0011,0.00065,0.0012,1,1 +28390000,-0.27,0.017,-0.0063,0.96,0.07,-0.046,0.81,0.035,-0.038,-2.8,-0.0013,-0.0058,-0.00025,0.074,-0.033,-0.13,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00039,0.00035,0.045,0.015,0.017,0.0054,0.091,0.092,0.031,3.5e-07,3.1e-07,2.9e-06,0.029,0.029,0.00013,0.0011,5.6e-05,0.0012,0.0011,0.00065,0.0012,1,1 +28490000,-0.27,0.018,-0.0066,0.96,0.073,-0.049,0.81,0.043,-0.042,-2.7,-0.0013,-0.0058,-0.00025,0.074,-0.033,-0.13,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00039,0.00035,0.045,0.016,0.018,0.0054,0.095,0.097,0.031,3.5e-07,3.1e-07,2.9e-06,0.029,0.029,0.00013,0.0011,5.6e-05,0.0012,0.0011,0.00065,0.0012,1,1 +28590000,-0.27,0.018,-0.0066,0.96,0.065,-0.049,0.81,0.043,-0.045,-2.6,-0.0013,-0.0058,-0.00023,0.073,-0.033,-0.13,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00039,0.00035,0.045,0.016,0.018,0.0054,0.098,0.099,0.031,3.4e-07,3e-07,2.9e-06,0.029,0.029,0.00013,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 +28690000,-0.27,0.017,-0.0064,0.96,0.064,-0.05,0.81,0.05,-0.05,-2.6,-0.0013,-0.0058,-0.00024,0.073,-0.033,-0.12,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00039,0.00035,0.045,0.017,0.019,0.0054,0.1,0.1,0.031,3.4e-07,3e-07,2.9e-06,0.029,0.029,0.00013,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 +28790000,-0.27,0.017,-0.0058,0.96,0.062,-0.049,0.81,0.051,-0.049,-2.5,-0.0013,-0.0058,-0.00021,0.073,-0.033,-0.12,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00038,0.00034,0.045,0.017,0.019,0.0053,0.11,0.11,0.031,3.4e-07,3e-07,2.9e-06,0.029,0.029,0.00013,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 +28890000,-0.27,0.016,-0.0056,0.96,0.065,-0.051,0.81,0.057,-0.054,-2.4,-0.0013,-0.0058,-0.00021,0.073,-0.033,-0.12,-0.11,-0.024,0.5,0.083,-0.034,-0.066,0,0,0.00038,0.00034,0.045,0.017,0.02,0.0054,0.11,0.11,0.031,3.4e-07,3e-07,2.8e-06,0.029,0.029,0.00013,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 +28990000,-0.27,0.016,-0.0054,0.96,0.063,-0.048,0.81,0.058,-0.054,-2.3,-0.0013,-0.0058,-0.00019,0.073,-0.033,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00039,0.00034,0.045,0.017,0.019,0.0053,0.11,0.12,0.031,3.4e-07,3e-07,2.8e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 +29090000,-0.27,0.017,-0.0052,0.96,0.067,-0.05,0.81,0.066,-0.059,-2.3,-0.0013,-0.0058,-0.00019,0.073,-0.033,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00039,0.00034,0.045,0.018,0.02,0.0053,0.12,0.12,0.031,3.4e-07,3e-07,2.8e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 +29190000,-0.27,0.017,-0.0051,0.96,0.067,-0.049,0.8,0.067,-0.058,-2.2,-0.0013,-0.0058,-0.00017,0.073,-0.033,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00039,0.00034,0.045,0.018,0.02,0.0053,0.12,0.12,0.031,3.3e-07,2.9e-07,2.8e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 +29290000,-0.27,0.017,-0.0054,0.96,0.071,-0.054,0.81,0.076,-0.062,-2.1,-0.0013,-0.0058,-0.00017,0.073,-0.033,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00039,0.00034,0.045,0.018,0.021,0.0053,0.13,0.13,0.031,3.3e-07,2.9e-07,2.8e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 +29390000,-0.27,0.016,-0.0059,0.96,0.067,-0.051,0.81,0.074,-0.059,-2,-0.0013,-0.0058,-0.00014,0.073,-0.033,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00038,0.00034,0.045,0.018,0.02,0.0053,0.13,0.13,0.031,3.3e-07,2.9e-07,2.8e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 +29490000,-0.27,0.016,-0.0059,0.96,0.07,-0.052,0.81,0.081,-0.065,-2,-0.0013,-0.0058,-0.00013,0.073,-0.033,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00038,0.00034,0.045,0.019,0.021,0.0053,0.14,0.14,0.031,3.3e-07,2.9e-07,2.7e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 +29590000,-0.27,0.016,-0.0058,0.96,0.068,-0.05,0.81,0.08,-0.063,-1.9,-0.0013,-0.0058,-0.00011,0.072,-0.033,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00038,0.00034,0.044,0.018,0.021,0.0053,0.14,0.14,0.031,3.2e-07,2.9e-07,2.7e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00065,0.0012,1,1 +29690000,-0.27,0.016,-0.0058,0.96,0.072,-0.049,0.81,0.087,-0.068,-1.8,-0.0013,-0.0058,-9.8e-05,0.072,-0.033,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00038,0.00034,0.044,0.019,0.022,0.0053,0.15,0.15,0.031,3.2e-07,2.9e-07,2.7e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 +29790000,-0.27,0.016,-0.0056,0.96,0.069,-0.042,0.8,0.084,-0.064,-1.7,-0.0013,-0.0058,-6.9e-05,0.072,-0.033,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00039,0.00034,0.044,0.019,0.021,0.0053,0.15,0.15,0.031,3.2e-07,2.8e-07,2.7e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 +29890000,-0.27,0.016,-0.005,0.96,0.07,-0.044,0.8,0.092,-0.069,-1.7,-0.0013,-0.0058,-6.2e-05,0.072,-0.033,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00039,0.00034,0.044,0.02,0.022,0.0053,0.15,0.16,0.031,3.2e-07,2.8e-07,2.7e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 +29990000,-0.27,0.016,-0.0052,0.96,0.065,-0.041,0.8,0.087,-0.068,-1.6,-0.0013,-0.0058,-4.8e-05,0.072,-0.034,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00039,0.00034,0.044,0.019,0.021,0.0052,0.16,0.16,0.03,3.2e-07,2.8e-07,2.6e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 +30090000,-0.27,0.017,-0.0053,0.96,0.067,-0.041,0.8,0.094,-0.07,-1.5,-0.0013,-0.0058,-6.2e-05,0.072,-0.034,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00039,0.00034,0.044,0.02,0.022,0.0052,0.16,0.17,0.03,3.2e-07,2.8e-07,2.6e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 +30190000,-0.27,0.016,-0.0054,0.96,0.062,-0.034,0.8,0.089,-0.061,-1.5,-0.0013,-0.0058,-5e-05,0.072,-0.034,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00039,0.00034,0.044,0.019,0.021,0.0052,0.17,0.17,0.031,3.1e-07,2.8e-07,2.6e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 +30290000,-0.27,0.016,-0.0054,0.96,0.062,-0.034,0.8,0.096,-0.065,-1.4,-0.0013,-0.0058,-4.9e-05,0.072,-0.034,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00039,0.00034,0.044,0.02,0.022,0.0052,0.17,0.18,0.03,3.1e-07,2.8e-07,2.6e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 +30390000,-0.27,0.016,-0.0054,0.96,0.059,-0.029,0.8,0.095,-0.059,-1.3,-0.0013,-0.0058,-1.9e-05,0.072,-0.035,-0.12,-0.11,-0.024,0.5,0.082,-0.034,-0.066,0,0,0.00039,0.00034,0.044,0.019,0.022,0.0052,0.18,0.18,0.03,3.1e-07,2.7e-07,2.6e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 +30490000,-0.27,0.016,-0.0054,0.96,0.063,-0.028,0.8,0.1,-0.062,-1.2,-0.0013,-0.0058,-1.2e-05,0.072,-0.035,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.066,0,0,0.00039,0.00034,0.044,0.02,0.023,0.0052,0.18,0.19,0.031,3.1e-07,2.7e-07,2.6e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 +30590000,-0.27,0.017,-0.0056,0.96,0.061,-0.026,0.8,0.097,-0.058,-1.2,-0.0013,-0.0058,1.2e-05,0.072,-0.035,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00039,0.00034,0.044,0.02,0.022,0.0052,0.18,0.19,0.03,3e-07,2.7e-07,2.5e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 +30690000,-0.27,0.017,-0.006,0.96,0.058,-0.026,0.8,0.1,-0.061,-1.1,-0.0013,-0.0058,1.1e-05,0.072,-0.035,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00039,0.00035,0.044,0.02,0.023,0.0052,0.19,0.2,0.03,3e-07,2.7e-07,2.5e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 +30790000,-0.27,0.016,-0.0058,0.96,0.052,-0.016,0.8,0.095,-0.049,-1,-0.0012,-0.0058,3.6e-05,0.072,-0.035,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00039,0.00034,0.044,0.02,0.022,0.0052,0.19,0.2,0.03,3e-07,2.7e-07,2.5e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 +30890000,-0.27,0.016,-0.0052,0.96,0.051,-0.012,0.79,0.099,-0.05,-0.95,-0.0012,-0.0058,2.6e-05,0.072,-0.036,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00039,0.00034,0.044,0.021,0.023,0.0052,0.2,0.21,0.03,3e-07,2.7e-07,2.5e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 +30990000,-0.27,0.016,-0.0054,0.96,0.046,-0.01,0.79,0.095,-0.048,-0.88,-0.0012,-0.0058,3e-05,0.073,-0.036,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00039,0.00034,0.044,0.02,0.022,0.0052,0.2,0.21,0.03,3e-07,2.7e-07,2.5e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 +31090000,-0.27,0.016,-0.0055,0.96,0.045,-0.0087,0.79,0.099,-0.049,-0.81,-0.0012,-0.0058,2.2e-05,0.073,-0.036,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00039,0.00034,0.044,0.021,0.023,0.0052,0.21,0.22,0.03,3e-07,2.7e-07,2.5e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 +31190000,-0.27,0.017,-0.0057,0.96,0.042,-0.0051,0.8,0.093,-0.044,-0.74,-0.0012,-0.0058,4.6e-05,0.073,-0.036,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00039,0.00034,0.044,0.02,0.022,0.0052,0.21,0.22,0.03,2.9e-07,2.6e-07,2.4e-06,0.029,0.029,0.00012,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 +31290000,-0.27,0.017,-0.0059,0.96,0.039,-0.0033,0.8,0.096,-0.045,-0.67,-0.0012,-0.0058,5.2e-05,0.073,-0.037,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00039,0.00034,0.044,0.021,0.023,0.0052,0.22,0.23,0.03,2.9e-07,2.6e-07,2.4e-06,0.029,0.029,0.00011,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 +31390000,-0.27,0.016,-0.0057,0.96,0.035,0.0017,0.8,0.09,-0.042,-0.59,-0.0012,-0.0058,5.1e-05,0.073,-0.037,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00039,0.00034,0.044,0.02,0.022,0.0051,0.22,0.23,0.03,2.9e-07,2.6e-07,2.4e-06,0.029,0.029,0.00011,0.0011,5.5e-05,0.0012,0.0011,0.00064,0.0012,1,1 +31490000,-0.27,0.017,-0.0054,0.96,0.036,0.0051,0.8,0.095,-0.041,-0.52,-0.0012,-0.0058,4.8e-05,0.073,-0.037,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00039,0.00034,0.044,0.021,0.023,0.0052,0.23,0.24,0.03,2.9e-07,2.6e-07,2.4e-06,0.029,0.029,0.00011,0.0011,5.5e-05,0.0012,0.0011,0.00063,0.0012,1,1 +31590000,-0.27,0.017,-0.0052,0.96,0.036,0.007,0.8,0.092,-0.037,-0.45,-0.0012,-0.0058,6.1e-05,0.073,-0.037,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00039,0.00034,0.044,0.02,0.022,0.0051,0.23,0.24,0.03,2.9e-07,2.6e-07,2.4e-06,0.029,0.029,0.00011,0.0011,5.5e-05,0.0012,0.0011,0.00063,0.0012,1,1 +31690000,-0.27,0.017,-0.0052,0.96,0.04,0.0082,0.8,0.097,-0.037,-0.38,-0.0012,-0.0058,7.1e-05,0.073,-0.037,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.0004,0.00034,0.043,0.021,0.023,0.0051,0.24,0.25,0.03,2.9e-07,2.6e-07,2.4e-06,0.029,0.029,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +31790000,-0.27,0.018,-0.0054,0.96,0.034,0.014,0.8,0.093,-0.027,-0.3,-0.0012,-0.0058,9e-05,0.073,-0.038,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.0004,0.00034,0.043,0.02,0.022,0.0051,0.24,0.25,0.03,2.9e-07,2.6e-07,2.3e-06,0.029,0.029,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +31890000,-0.27,0.018,-0.0052,0.96,0.032,0.016,0.8,0.097,-0.025,-0.23,-0.0012,-0.0058,9.4e-05,0.073,-0.038,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.0004,0.00034,0.043,0.021,0.023,0.0051,0.25,0.26,0.03,2.9e-07,2.6e-07,2.3e-06,0.029,0.029,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +31990000,-0.27,0.017,-0.0055,0.96,0.029,0.017,0.79,0.094,-0.02,-0.17,-0.0012,-0.0058,9.2e-05,0.073,-0.038,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.0004,0.00034,0.043,0.02,0.022,0.0051,0.25,0.26,0.03,2.8e-07,2.5e-07,2.3e-06,0.029,0.029,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +32090000,-0.27,0.017,-0.0059,0.96,0.03,0.021,0.8,0.098,-0.018,-0.096,-0.0012,-0.0058,9.2e-05,0.073,-0.038,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00039,0.00034,0.043,0.021,0.023,0.0051,0.26,0.27,0.03,2.8e-07,2.5e-07,2.3e-06,0.029,0.029,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +32190000,-0.27,0.017,-0.0061,0.96,0.027,0.029,0.8,0.093,-0.0092,-0.027,-0.0012,-0.0058,9.7e-05,0.074,-0.039,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00039,0.00034,0.043,0.02,0.022,0.0051,0.26,0.27,0.03,2.8e-07,2.5e-07,2.3e-06,0.029,0.029,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +32290000,-0.27,0.017,-0.006,0.96,0.027,0.031,0.8,0.096,-0.0063,0.042,-0.0012,-0.0058,0.0001,0.074,-0.039,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.0004,0.00034,0.043,0.021,0.023,0.0051,0.27,0.28,0.03,2.8e-07,2.5e-07,2.3e-06,0.029,0.029,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +32390000,-0.27,0.017,-0.0062,0.96,0.023,0.033,0.79,0.092,-0.0029,0.12,-0.0012,-0.0058,0.0001,0.074,-0.039,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.0004,0.00034,0.043,0.02,0.022,0.0051,0.27,0.28,0.03,2.8e-07,2.5e-07,2.2e-06,0.029,0.029,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +32490000,-0.27,0.016,-0.0092,0.96,-0.017,0.092,-0.077,0.091,0.0054,0.12,-0.0012,-0.0058,9.6e-05,0.074,-0.039,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00038,0.00035,0.043,0.022,0.025,0.0051,0.28,0.29,0.03,2.8e-07,2.5e-07,2.2e-06,0.029,0.029,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +32590000,-0.27,0.016,-0.0092,0.96,-0.014,0.09,-0.08,0.091,-0.0025,0.1,-0.0012,-0.0058,8.5e-05,0.074,-0.039,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00038,0.00035,0.043,0.021,0.023,0.0051,0.28,0.29,0.03,2.8e-07,2.5e-07,2.2e-06,0.029,0.029,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +32690000,-0.27,0.016,-0.0092,0.96,-0.01,0.097,-0.081,0.09,0.0069,0.088,-0.0012,-0.0058,8.5e-05,0.074,-0.039,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00038,0.00035,0.043,0.022,0.024,0.0051,0.29,0.3,0.03,2.8e-07,2.5e-07,2.2e-06,0.029,0.029,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +32790000,-0.27,0.016,-0.009,0.96,-0.0062,0.095,-0.082,0.092,-0.0016,0.073,-0.0012,-0.0058,7.5e-05,0.074,-0.039,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00037,0.00035,0.043,0.021,0.023,0.0051,0.29,0.3,0.03,2.7e-07,2.5e-07,2.2e-06,0.029,0.029,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +32890000,-0.27,0.016,-0.009,0.96,-0.0066,0.1,-0.084,0.09,0.0078,0.058,-0.0012,-0.0058,8.1e-05,0.074,-0.039,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00038,0.00035,0.043,0.022,0.024,0.0051,0.3,0.31,0.03,2.7e-07,2.5e-07,2.2e-06,0.029,0.029,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +32990000,-0.27,0.016,-0.0088,0.96,-0.0026,0.095,-0.083,0.091,-0.006,0.044,-0.0012,-0.0058,6.8e-05,0.074,-0.039,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00037,0.00035,0.043,0.021,0.023,0.0051,0.3,0.31,0.03,2.7e-07,2.5e-07,2.1e-06,0.029,0.029,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +33090000,-0.27,0.016,-0.0088,0.96,0.0013,0.1,-0.08,0.091,0.0037,0.037,-0.0012,-0.0058,6.8e-05,0.074,-0.039,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00037,0.00035,0.043,0.021,0.024,0.0051,0.31,0.32,0.03,2.7e-07,2.5e-07,2.1e-06,0.029,0.029,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +33190000,-0.27,0.016,-0.0086,0.96,0.0057,0.096,-0.079,0.092,-0.012,0.029,-0.0012,-0.0058,4e-05,0.074,-0.038,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00037,0.00035,0.043,0.021,0.023,0.0051,0.31,0.32,0.03,2.7e-07,2.4e-07,2.1e-06,0.029,0.029,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +33290000,-0.27,0.016,-0.0087,0.96,0.0098,0.099,-0.079,0.093,-0.0027,0.021,-0.0013,-0.0058,5.7e-05,0.074,-0.038,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.066,0,0,0.00037,0.00035,0.043,0.021,0.024,0.0051,0.32,0.33,0.03,2.7e-07,2.4e-07,2.1e-06,0.029,0.029,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +33390000,-0.27,0.016,-0.0086,0.96,0.014,0.095,-0.077,0.092,-0.012,0.012,-0.0013,-0.0058,4.6e-05,0.075,-0.037,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.066,0,0,0.00037,0.00034,0.043,0.021,0.023,0.0051,0.32,0.33,0.03,2.7e-07,2.4e-07,2.1e-06,0.029,0.028,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +33490000,-0.27,0.016,-0.0086,0.96,0.02,0.099,-0.076,0.095,-0.0019,0.0028,-0.0013,-0.0058,5.4e-05,0.075,-0.037,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.066,0,0,0.00037,0.00034,0.043,0.021,0.024,0.0051,0.33,0.34,0.03,2.7e-07,2.4e-07,2.1e-06,0.029,0.028,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +33590000,-0.27,0.016,-0.0084,0.96,0.023,0.096,-0.073,0.094,-0.015,-0.0051,-0.0013,-0.0058,4.8e-05,0.075,-0.036,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.067,0,0,0.00037,0.00034,0.043,0.02,0.023,0.005,0.33,0.34,0.03,2.6e-07,2.4e-07,2e-06,0.029,0.028,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +33690000,-0.27,0.016,-0.0084,0.96,0.026,0.099,-0.074,0.095,-0.0061,-0.013,-0.0013,-0.0058,5.3e-05,0.075,-0.036,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.066,0,0,0.00037,0.00034,0.043,0.021,0.024,0.0051,0.34,0.35,0.03,2.7e-07,2.4e-07,2e-06,0.029,0.028,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +33790000,-0.27,0.016,-0.0083,0.96,0.029,0.096,-0.068,0.092,-0.02,-0.02,-0.0013,-0.0058,3.3e-05,0.076,-0.036,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.066,0,0,0.00037,0.00034,0.043,0.02,0.023,0.005,0.34,0.35,0.03,2.6e-07,2.4e-07,2e-06,0.029,0.028,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +33890000,-0.27,0.016,-0.0083,0.96,0.033,0.097,-0.068,0.095,-0.01,-0.027,-0.0013,-0.0058,4.8e-05,0.076,-0.036,-0.12,-0.11,-0.024,0.5,0.081,-0.034,-0.066,0,0,0.00037,0.00034,0.043,0.021,0.024,0.0051,0.35,0.36,0.03,2.6e-07,2.4e-07,2e-06,0.029,0.028,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +33990000,-0.27,0.016,-0.0082,0.96,0.036,0.095,-0.064,0.094,-0.019,-0.03,-0.0013,-0.0057,3.3e-05,0.076,-0.035,-0.12,-0.11,-0.024,0.5,0.081,-0.035,-0.066,0,0,0.00037,0.00034,0.043,0.02,0.023,0.005,0.35,0.36,0.03,2.6e-07,2.4e-07,2e-06,0.029,0.028,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +34090000,-0.27,0.016,-0.0081,0.96,0.039,0.1,-0.063,0.097,-0.0094,-0.035,-0.0013,-0.0057,3.6e-05,0.076,-0.035,-0.12,-0.11,-0.024,0.5,0.081,-0.035,-0.066,0,0,0.00037,0.00034,0.043,0.021,0.024,0.0051,0.36,0.37,0.03,2.6e-07,2.4e-07,2e-06,0.029,0.028,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +34190000,-0.27,0.016,-0.0081,0.96,0.04,0.096,-0.06,0.092,-0.021,-0.038,-0.0013,-0.0057,3e-05,0.077,-0.035,-0.12,-0.11,-0.024,0.5,0.081,-0.035,-0.067,0,0,0.00037,0.00034,0.043,0.02,0.022,0.005,0.36,0.36,0.03,2.6e-07,2.4e-07,2e-06,0.028,0.028,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +34290000,-0.26,0.016,-0.0079,0.96,0.041,0.1,-0.059,0.096,-0.012,-0.044,-0.0013,-0.0057,4e-05,0.077,-0.035,-0.12,-0.11,-0.024,0.5,0.08,-0.035,-0.066,0,0,0.00037,0.00034,0.043,0.021,0.023,0.005,0.37,0.38,0.03,2.6e-07,2.4e-07,2e-06,0.028,0.028,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00063,0.0012,1,1 +34390000,-0.26,0.016,-0.0078,0.96,0.043,0.095,-0.054,0.091,-0.023,-0.048,-0.0013,-0.0057,3e-05,0.077,-0.034,-0.12,-0.11,-0.024,0.5,0.08,-0.035,-0.067,0,0,0.00037,0.00034,0.042,0.02,0.022,0.005,0.37,0.37,0.03,2.6e-07,2.4e-07,1.9e-06,0.028,0.028,0.00011,0.0011,5.4e-05,0.0012,0.0011,0.00062,0.0012,1,1 +34490000,-0.26,0.016,-0.0079,0.96,0.046,0.099,-0.052,0.095,-0.014,-0.051,-0.0013,-0.0057,4.2e-05,0.077,-0.034,-0.12,-0.11,-0.024,0.5,0.08,-0.035,-0.067,0,0,0.00037,0.00034,0.042,0.021,0.023,0.005,0.38,0.39,0.03,2.6e-07,2.4e-07,1.9e-06,0.028,0.028,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 +34590000,-0.26,0.016,-0.0078,0.96,0.049,0.092,0.74,0.09,-0.028,-0.022,-0.0013,-0.0057,3e-05,0.078,-0.034,-0.12,-0.11,-0.024,0.5,0.08,-0.035,-0.067,0,0,0.00036,0.00034,0.042,0.02,0.022,0.005,0.38,0.38,0.03,2.6e-07,2.4e-07,1.9e-06,0.028,0.028,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 +34690000,-0.26,0.015,-0.0078,0.96,0.058,0.092,1.7,0.095,-0.019,0.097,-0.0013,-0.0057,3.5e-05,0.078,-0.034,-0.12,-0.11,-0.024,0.5,0.08,-0.035,-0.067,0,0,0.00036,0.00034,0.042,0.02,0.022,0.0051,0.39,0.4,0.03,2.6e-07,2.4e-07,1.9e-06,0.028,0.028,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 +34790000,-0.26,0.015,-0.0077,0.96,0.063,0.086,2.7,0.088,-0.032,0.28,-0.0013,-0.0057,2.6e-05,0.078,-0.034,-0.12,-0.11,-0.024,0.5,0.08,-0.035,-0.067,0,0,0.00036,0.00034,0.042,0.02,0.021,0.005,0.39,0.39,0.03,2.6e-07,2.4e-07,1.9e-06,0.028,0.028,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 +34890000,-0.26,0.015,-0.0077,0.96,0.071,0.086,3.7,0.094,-0.023,0.57,-0.0013,-0.0057,3.2e-05,0.079,-0.034,-0.12,-0.11,-0.024,0.5,0.08,-0.035,-0.067,0,0,0.00036,0.00034,0.042,0.021,0.023,0.005,0.4,0.41,0.03,2.6e-07,2.4e-07,1.9e-06,0.028,0.028,0.00011,0.0011,5.3e-05,0.0012,0.0011,0.00062,0.0012,1,1 diff --git a/src/modules/ekf2/test/sensor_simulator/ekf_wrapper.cpp b/src/modules/ekf2/test/sensor_simulator/ekf_wrapper.cpp index 513e6d057b3d..fe2c3a88ff7c 100644 --- a/src/modules/ekf2/test/sensor_simulator/ekf_wrapper.cpp +++ b/src/modules/ekf2/test/sensor_simulator/ekf_wrapper.cpp @@ -314,3 +314,13 @@ float EkfWrapper::getMagHeadingNoise() const { return _ekf_params->mag_heading_noise; } + +void EkfWrapper::enableGyroBiasEstimation() +{ + _ekf_params->imu_ctrl |= static_cast(ImuCtrl::GyroBias); +} + +void EkfWrapper::disableGyroBiasEstimation() +{ + _ekf_params->imu_ctrl &= ~static_cast(ImuCtrl::GyroBias); +} diff --git a/src/modules/ekf2/test/sensor_simulator/ekf_wrapper.h b/src/modules/ekf2/test/sensor_simulator/ekf_wrapper.h index 43753e9bc548..e1d35f093408 100644 --- a/src/modules/ekf2/test/sensor_simulator/ekf_wrapper.h +++ b/src/modules/ekf2/test/sensor_simulator/ekf_wrapper.h @@ -128,6 +128,9 @@ class EkfWrapper float getMagHeadingNoise() const; + void enableGyroBiasEstimation(); + void disableGyroBiasEstimation(); + private: std::shared_ptr _ekf; diff --git a/src/modules/ekf2/test/test_EKF_gps_yaw.cpp b/src/modules/ekf2/test/test_EKF_gps_yaw.cpp index 42737306eae3..2c3afc655ac4 100644 --- a/src/modules/ekf2/test/test_EKF_gps_yaw.cpp +++ b/src/modules/ekf2/test/test_EKF_gps_yaw.cpp @@ -81,9 +81,10 @@ class EkfGpsHeadingTest : public ::testing::Test void EkfGpsHeadingTest::runConvergenceScenario(float yaw_offset_rad, float antenna_offset_rad) { // GIVEN: an initial GPS yaw, not aligned with the current one - float gps_heading = matrix::wrap_pi(_ekf_wrapper.getYawAngle() + yaw_offset_rad); + // The yaw antenna offset has already been corrected in the driver + float gps_heading = matrix::wrap_pi(_ekf_wrapper.getYawAngle()); - _sensor_simulator._gps.setYaw(gps_heading); + _sensor_simulator._gps.setYaw(gps_heading); // used to remove the correction to fuse the real measurement _sensor_simulator._gps.setYawOffset(antenna_offset_rad); // WHEN: the GPS yaw fusion is activated @@ -91,7 +92,7 @@ void EkfGpsHeadingTest::runConvergenceScenario(float yaw_offset_rad, float anten _sensor_simulator.runSeconds(5); // THEN: the estimate is reset and stays close to the measurement - checkConvergence(gps_heading, 0.05f); + checkConvergence(gps_heading, 0.01f); } void EkfGpsHeadingTest::checkConvergence(float truth, float tolerance_deg) diff --git a/src/modules/ekf2/test/test_EKF_initialization.cpp b/src/modules/ekf2/test/test_EKF_initialization.cpp index 6e2dae1b9eba..142a4ea3ef73 100644 --- a/src/modules/ekf2/test/test_EKF_initialization.cpp +++ b/src/modules/ekf2/test/test_EKF_initialization.cpp @@ -191,6 +191,32 @@ TEST_F(EkfInitializationTest, initializeWithZeroTiltNotAtRest) learningCorrectAccelBias(); } +TEST_F(EkfInitializationTest, initializeWithTiltNoGyroBiasEstimate) +{ + const float pitch = math::radians(30.0f); + const float roll = math::radians(-20.0f); + const Eulerf euler_angles_sim(roll, pitch, 0.0f); + const Quatf quat_sim(euler_angles_sim); + + _ekf_wrapper.disableGyroBiasEstimation(); + _sensor_simulator.simulateOrientation(quat_sim); + + _sensor_simulator.runSeconds(_init_tilt_period); + + EXPECT_TRUE(_ekf->control_status_flags().tilt_align); + + initializedOrienationIsMatchingGroundTruth(quat_sim); + quaternionVarianceBigEnoughAfterOrientationInitialization(0.00001f); + + velocityAndPositionCloseToZero(); + + positionVarianceBigEnoughAfterOrientationInitialization(0.00001f); // Fake position fusion obs var when at rest sq(0.5f) + velocityVarianceBigEnoughAfterOrientationInitialization(0.0001f); + + _sensor_simulator.runSeconds(1.f); + learningCorrectAccelBias(); +} + TEST_F(EkfInitializationTest, gyroBias) { // GIVEN: a healthy filter @@ -320,7 +346,7 @@ TEST_F(EkfInitializationTest, initializeWithTiltNotAtRest) _ekf->set_vehicle_at_rest(false); _sensor_simulator.simulateOrientation(quat_sim); //_sensor_simulator.runSeconds(_init_tilt_period); - _sensor_simulator.runSeconds(7); + _sensor_simulator.runSeconds(10); EXPECT_TRUE(_ekf->control_status_flags().tilt_align); diff --git a/src/modules/ekf2/test/test_EKF_yaw_fusion_generated.cpp b/src/modules/ekf2/test/test_EKF_yaw_fusion_generated.cpp index ab02fd3cacf8..7e536e62bb79 100644 --- a/src/modules/ekf2/test/test_EKF_yaw_fusion_generated.cpp +++ b/src/modules/ekf2/test/test_EKF_yaw_fusion_generated.cpp @@ -35,60 +35,16 @@ #include "EKF/ekf.h" #include "test_helper/comparison_helper.h" -#include "../EKF/python/ekf_derivation/generated/compute_yaw_321_innov_var_and_h.h" -#include "../EKF/python/ekf_derivation/generated/compute_yaw_321_innov_var_and_h_alternate.h" -#include "../EKF/python/ekf_derivation/generated/compute_yaw_312_innov_var_and_h.h" -#include "../EKF/python/ekf_derivation/generated/compute_yaw_312_innov_var_and_h_alternate.h" +#include "../EKF/python/ekf_derivation/generated/compute_yaw_innov_var_and_h.h" using namespace matrix; -TEST(YawFusionGenerated, singularityYawEquivalence) +Vector3f getRotVarNed(const Quatf &q, const SquareMatrixState &P) { - // GIVEN: an attitude that should give a singularity when transforming the - // rotation matrix to Euler yaw - StateSample state{}; - state.quat_nominal = Eulerf(M_PI_F, 0.f, M_PI_F); - - const float R = sq(radians(10.f)); - SquareMatrixState P = createRandomCovarianceMatrix(); - - VectorState H_a; - VectorState H_b; - float innov_var_a; - float innov_var_b; - - // WHEN: computing the innovation variance and H using two different - // alternate forms (one is singular at pi/2 and the other one at 0) - sym::ComputeYaw321InnovVarAndH(state.vector(), P, R, FLT_EPSILON, &innov_var_a, &H_a); - sym::ComputeYaw321InnovVarAndHAlternate(state.vector(), P, R, FLT_EPSILON, &innov_var_b, &H_b); - - // THEN: Even at the singularity point, the result is still correct, thanks to epsilon - EXPECT_TRUE(isEqual(H_a, H_b)); - EXPECT_NEAR(innov_var_a, innov_var_b, 1e-5f); - EXPECT_TRUE(innov_var_a < 50.f && innov_var_a > R) << "innov_var = " << innov_var_a; -} - -TEST(YawFusionGenerated, gimbalLock321vs312) -{ - // GIVEN: an attitude at gimbal lock position - StateSample state{}; - state.quat_nominal = Eulerf(0.f, -M_PI_F / 2.f, M_PI_F); - - const float R = sq(radians(10.f)); - SquareMatrixState P = createRandomCovarianceMatrix(); - - VectorState H_321; - VectorState H_312; - float innov_var_321; - float innov_var_312; - sym::ComputeYaw321InnovVarAndH(state.vector(), P, R, FLT_EPSILON, &innov_var_321, &H_321); - - sym::ComputeYaw312InnovVarAndH(state.vector(), P, R, FLT_EPSILON, &innov_var_312, &H_312); - - // THEN: both computation are not equivalent, 321 is undefined but 312 is valid - EXPECT_FALSE(isEqual(H_321, H_312)); - EXPECT_GT(fabsf(innov_var_321 - innov_var_312), 1e6f); - EXPECT_TRUE(innov_var_312 < 50.f && innov_var_312 > R) << "innov_var = " << innov_var_312; + constexpr auto S = State::quat_nominal; + matrix::SquareMatrix3f rot_cov_body = P.slice(S.idx, S.idx); + auto R_to_earth = Dcmf(q); + return matrix::SquareMatrix(R_to_earth * rot_cov_body * R_to_earth.T()).diag(); } TEST(YawFusionGenerated, positiveVarianceAllOrientations) @@ -99,19 +55,14 @@ TEST(YawFusionGenerated, positiveVarianceAllOrientations) VectorState H; float innov_var; - // GIVEN: all orientations (90 deg steps) - for (float yaw = 0.f; yaw < 2.f * M_PI_F; yaw += M_PI_F / 2.f) { - for (float pitch = 0.f; pitch < 2.f * M_PI_F; pitch += M_PI_F / 2.f) { - for (float roll = 0.f; roll < 2.f * M_PI_F; roll += M_PI_F / 2.f) { + // GIVEN: all orientations + for (float yaw = 0.f; yaw < 2.f * M_PI_F; yaw += M_PI_F / 4.f) { + for (float pitch = 0.f; pitch < 2.f * M_PI_F; pitch += M_PI_F / 4.f) { + for (float roll = 0.f; roll < 2.f * M_PI_F; roll += M_PI_F / 4.f) { StateSample state{}; state.quat_nominal = Eulerf(roll, pitch, yaw); - if (shouldUse321RotationSequence(Dcmf(state.quat_nominal))) { - sym::ComputeYaw321InnovVarAndH(state.vector(), P, R, FLT_EPSILON, &innov_var, &H); - - } else { - sym::ComputeYaw312InnovVarAndH(state.vector(), P, R, FLT_EPSILON, &innov_var, &H); - } + sym::ComputeYawInnovVarAndH(state.vector(), P, R, &innov_var, &H); // THEN: the innovation variance must be positive and finite EXPECT_TRUE(innov_var < 100.f && innov_var > R) @@ -119,6 +70,18 @@ TEST(YawFusionGenerated, positiveVarianceAllOrientations) << " pitch = " << degrees(pitch) << " roll = " << degrees(roll) << " innov_var = " << innov_var; + + // AND: it should be the same as the "true" innovation variance obtained by summing + // the Z rotation variance in NED and the measurement variance + const float innov_var_true = getRotVarNed(state.quat_nominal, P)(2) + R; + EXPECT_NEAR(innov_var, innov_var_true, 1e-5f) + << "yaw = " << degrees(yaw) + << " pitch = " << degrees(pitch) + << " roll = " << degrees(roll) + << " innov_var = " << innov_var + << " innov_var_true = " << innov_var_true; + + EXPECT_TRUE(H.isAllFinite()); } } } diff --git a/src/modules/fw_pos_control/FixedwingPositionControl.cpp b/src/modules/fw_pos_control/FixedwingPositionControl.cpp index 8b79e1ee4d02..4bb1d5ee3188 100644 --- a/src/modules/fw_pos_control/FixedwingPositionControl.cpp +++ b/src/modules/fw_pos_control/FixedwingPositionControl.cpp @@ -512,25 +512,27 @@ float FixedwingPositionControl::getCorrectedNpfgRollSetpoint() float new_roll_setpoint(_npfg.getRollSetpoint()); const float can_run_factor(constrain(_npfg.canRun(_local_pos, _wind_valid), 0.f, 1.f)); - // If the npfg was not running before, reset the user warning variables. hrt_abstime now{hrt_absolute_time()}; - if ((now - _time_since_last_npfg_call) > 2_s) { + // Warn the user when the scale is less than 90% for at least 2 seconds (disable in transition) + + // If the npfg was not running before, reset the user warning variables. + if ((now - _time_since_last_npfg_call) > ROLL_WARNING_TIMEOUT) { _need_report_npfg_uncertain_condition = true; _time_since_first_reduced_roll = 0U; } - // Warn the user when the scale is less than 90% for at least 2 seconds. - if ((1.f - can_run_factor) < 0.1f) { + if (_vehicle_status.in_transition_mode || can_run_factor > ROLL_WARNING_CAN_RUN_THRESHOLD || _landed) { + // NPFG reports a good condition or we are in transition, reset the user warning variables. _need_report_npfg_uncertain_condition = true; _time_since_first_reduced_roll = 0U; } else if (_need_report_npfg_uncertain_condition) { if (_time_since_first_reduced_roll == 0U) { - _time_since_first_reduced_roll = hrt_absolute_time(); + _time_since_first_reduced_roll = now; } - if ((now - _time_since_first_reduced_roll) > 2_s) { + if ((now - _time_since_first_reduced_roll) > ROLL_WARNING_TIMEOUT) { _need_report_npfg_uncertain_condition = false; events::send(events::ID("npfg_roll_command_uncertain"), events::Log::Warning, "Roll command reduced due to uncertain velocity/wind estimates!"); @@ -2199,7 +2201,6 @@ FixedwingPositionControl::control_manual_position(const float control_interval, } void FixedwingPositionControl::control_backtransition(const float control_interval, const Vector2f &ground_speed, - const position_setpoint_s &pos_sp_prev, const position_setpoint_s &pos_sp_curr) { float target_airspeed = adapt_airspeed_setpoint(control_interval, pos_sp_curr.cruising_speed, @@ -2211,22 +2212,14 @@ void FixedwingPositionControl::control_backtransition(const float control_interv _npfg.setAirspeedNom(target_airspeed * _eas2tas); _npfg.setAirspeedMax(_performance_model.getMaximumCalibratedAirspeed() * _eas2tas); - - if (_position_setpoint_previous_valid) { - Vector2f prev_wp_local = _global_local_proj_ref.project(pos_sp_prev.lat, pos_sp_prev.lon); - navigateLine(prev_wp_local, curr_wp_local, curr_pos_local, ground_speed, _wind_vel); - - } else { - - // if we don't have a previous waypoint for line following, then create one using the current position at the - // start of the transition - if (!_lpos_where_backtrans_started.isAllFinite()) { - _lpos_where_backtrans_started = curr_pos_local; - } - - navigateLine(_lpos_where_backtrans_started, curr_wp_local, curr_pos_local, ground_speed, _wind_vel); + // Set the position where the backtransition started the first ime we pass through here. + // Will get reset if not in transition anymore. + if (!_lpos_where_backtrans_started.isAllFinite()) { + _lpos_where_backtrans_started = curr_pos_local; } + navigateLine(_lpos_where_backtrans_started, curr_wp_local, curr_pos_local, ground_speed, _wind_vel); + _att_sp.roll_body = getCorrectedNpfgRollSetpoint(); target_airspeed = _npfg.getAirspeedRef() / _eas2tas; @@ -2450,6 +2443,7 @@ FixedwingPositionControl::Run() if (_vehicle_status_sub.update(&_vehicle_status)) { if (!_vehicle_status.in_transition_mode) { + // reset position of backtransition start if not in transition _lpos_where_backtrans_started = Vector2f(NAN, NAN); } } @@ -2549,8 +2543,7 @@ FixedwingPositionControl::Run() } case FW_POSCTRL_MODE_TRANSITON: { - control_backtransition(control_interval, ground_speed, _pos_sp_triplet.previous, - _pos_sp_triplet.current); + control_backtransition(control_interval, ground_speed, _pos_sp_triplet.current); break; } } diff --git a/src/modules/fw_pos_control/FixedwingPositionControl.hpp b/src/modules/fw_pos_control/FixedwingPositionControl.hpp index 43887707c8be..5089021685da 100644 --- a/src/modules/fw_pos_control/FixedwingPositionControl.hpp +++ b/src/modules/fw_pos_control/FixedwingPositionControl.hpp @@ -169,6 +169,13 @@ static constexpr float POST_TOUCHDOWN_CLAMP_TIME = 0.5f; // [m/s] maximum reference altitude rate threshhold static constexpr float MAX_ALT_REF_RATE_FOR_LEVEL_FLIGHT = 0.1f; +// [s] Timeout that has to pass in roll-constraining failsafe before warning is triggered +static constexpr uint64_t ROLL_WARNING_TIMEOUT = 2_s; + +// [-] Can-run threshold needed to trigger the roll-constraining failsafe warning +static constexpr float ROLL_WARNING_CAN_RUN_THRESHOLD = 0.9f; + + class FixedwingPositionControl final : public ModuleBase, public ModuleParams, public px4::WorkItem { @@ -703,11 +710,9 @@ class FixedwingPositionControl final : public ModuleBase(), #endif // SYS_STATUS_HPP create_stream_list_item(), -#if defined(SMART_BATTERY_INFO_HPP) - create_stream_list_item(), -#endif // SMART_BATTERY_INFO_HPP +#if defined(BATTERY_INFO_HPP) + create_stream_list_item(), +#endif // BATTERY_INFO_HPP #if defined(HIGHRES_IMU_HPP) create_stream_list_item(), #endif // HIGHRES_IMU_HPP diff --git a/src/modules/mavlink/streams/SMART_BATTERY_INFO.hpp b/src/modules/mavlink/streams/BATTERY_INFO.hpp similarity index 67% rename from src/modules/mavlink/streams/SMART_BATTERY_INFO.hpp rename to src/modules/mavlink/streams/BATTERY_INFO.hpp index 3476db3a02b2..fd72acce45ed 100644 --- a/src/modules/mavlink/streams/SMART_BATTERY_INFO.hpp +++ b/src/modules/mavlink/streams/BATTERY_INFO.hpp @@ -31,30 +31,30 @@ * ****************************************************************************/ -#ifndef SMART_BATTERY_INFO_HPP -#define SMART_BATTERY_INFO_HPP +#ifndef BATTERY_INFO_HPP +#define BATTERY_INFO_HPP #include -class MavlinkStreamSmartBatteryInfo : public MavlinkStream +class MavlinkStreamBatteryInfo : public MavlinkStream { public: - static MavlinkStream *new_instance(Mavlink *mavlink) { return new MavlinkStreamSmartBatteryInfo(mavlink); } + static MavlinkStream *new_instance(Mavlink *mavlink) { return new MavlinkStreamBatteryInfo(mavlink); } - static constexpr const char *get_name_static() { return "SMART_BATTERY_INFO"; } - static constexpr uint16_t get_id_static() { return MAVLINK_MSG_ID_SMART_BATTERY_INFO; } + static constexpr const char *get_name_static() { return "BATTERY_INFO"; } + static constexpr uint16_t get_id_static() { return MAVLINK_MSG_ID_BATTERY_INFO; } const char *get_name() const override { return get_name_static(); } uint16_t get_id() override { return get_id_static(); } unsigned get_size() override { - static constexpr unsigned size_per_battery = MAVLINK_MSG_ID_SMART_BATTERY_INFO_LEN + MAVLINK_NUM_NON_PAYLOAD_BYTES; + static constexpr unsigned size_per_battery = MAVLINK_MSG_ID_BATTERY_INFO_LEN + MAVLINK_NUM_NON_PAYLOAD_BYTES; return size_per_battery * _battery_status_subs.advertised_count(); } private: - explicit MavlinkStreamSmartBatteryInfo(Mavlink *mavlink) : MavlinkStream(mavlink) {} + explicit MavlinkStreamBatteryInfo(Mavlink *mavlink) : MavlinkStream(mavlink) {} uORB::SubscriptionMultiArray _battery_status_subs{ORB_ID::battery_status}; @@ -67,36 +67,50 @@ class MavlinkStreamSmartBatteryInfo : public MavlinkStream if (battery_sub.update(&battery_status)) { if (battery_status.serial_number == 0) { - // This is not smart battery + // Required to emit continue; } - mavlink_smart_battery_info_t msg{}; + mavlink_battery_info_t msg{}; msg.id = battery_status.id - 1; - msg.capacity_full_specification = battery_status.capacity; - msg.capacity_full = (int32_t)((float)(battery_status.state_of_health * battery_status.capacity) / 100.f); + msg.design_capacity = (float)(battery_status.capacity * 1000); + msg.full_charge_capacity = (float)(battery_status.state_of_health * battery_status.capacity * 1000.f) / 100.f; msg.cycle_count = battery_status.cycle_count; if (battery_status.manufacture_date) { uint16_t day = battery_status.manufacture_date % 32; uint16_t month = (battery_status.manufacture_date >> 5) % 16; - uint16_t year = (80 + (battery_status.manufacture_date >> 9)) % 100; + uint16_t year = (80 + (battery_status.manufacture_date >> 9)); + uint16_t year2dig = year % 100; + //Formatted as 'ddmmyyyy' (maxed 9 chars) + snprintf(msg.manufacture_date, sizeof(msg.manufacture_date), "%d%d%d", day, month, year); //Formatted as 'dd/mm/yy-123456' (maxed 15 + 1 chars) - snprintf(msg.serial_number, sizeof(msg.serial_number), "%d/%d/%d-%d", day, month, year, battery_status.serial_number); + snprintf(msg.serial_number, sizeof(msg.serial_number), "%d/%d/%d-%d", day, month, year2dig, + battery_status.serial_number); } else { + snprintf(msg.serial_number, sizeof(msg.serial_number), "%d", battery_status.serial_number); } - //msg.device_name = ?? - msg.weight = -1; - msg.discharge_minimum_voltage = -1; - msg.charging_minimum_voltage = -1; - msg.resting_minimum_voltage = -1; - - mavlink_msg_smart_battery_info_send_struct(_mavlink->get_channel(), &msg); + // Not supported by PX4 (not in battery_status uorb topic) + /* + msg.name = 0; // char[50] + msg.weight = 0; + msg.discharge_minimum_voltage = 0; + msg.charging_minimum_voltage = 0; + msg.resting_minimum_voltage = 0; + msg.charging_maximum_voltage = 0; + msg.charging_maximum_current = 0; + msg.discharge_maximum_current = 0; + msg.discharge_maximum_burst_current = 0; + msg.cells_in_series = 0; + msg.nominal_voltage = 0; + */ + + mavlink_msg_battery_info_send_struct(_mavlink->get_channel(), &msg); updated = true; } } @@ -105,4 +119,4 @@ class MavlinkStreamSmartBatteryInfo : public MavlinkStream } }; -#endif // SMART_BATTERY_INFO_HPP +#endif // BATTERY_INFO_HPP diff --git a/src/modules/mavlink/streams/OPEN_DRONE_ID_SYSTEM.hpp b/src/modules/mavlink/streams/OPEN_DRONE_ID_SYSTEM.hpp index bcc7e0f1452e..9467df81e955 100644 --- a/src/modules/mavlink/streams/OPEN_DRONE_ID_SYSTEM.hpp +++ b/src/modules/mavlink/streams/OPEN_DRONE_ID_SYSTEM.hpp @@ -86,7 +86,8 @@ class MavlinkStreamOpenDroneIdSystem : public MavlinkStream msg.area_floor = -1000; msg.category_eu = MAV_ODID_CATEGORY_EU_UNDECLARED; msg.class_eu = MAV_ODID_CLASS_EU_UNDECLARED; - msg.operator_altitude_geo = home_position.alt; + float wgs84_amsl_offset = vehicle_gps_position.altitude_ellipsoid_m - vehicle_gps_position.altitude_msl_m; + msg.operator_altitude_geo = home_position.alt + wgs84_amsl_offset; // timestamp: 32 bit Unix Timestamp in seconds since 00:00:00 01/01/2019. static uint64_t utc_offset_s = 1'546'300'800; // UTC seconds since 00:00:00 01/01/2019 diff --git a/src/modules/mc_pos_control/MulticopterPositionControl.cpp b/src/modules/mc_pos_control/MulticopterPositionControl.cpp index ca8360c80452..90928921835d 100644 --- a/src/modules/mc_pos_control/MulticopterPositionControl.cpp +++ b/src/modules/mc_pos_control/MulticopterPositionControl.cpp @@ -167,6 +167,7 @@ void MulticopterPositionControl::parameters_update(bool force) Vector3f(_param_mpc_xy_vel_i_acc.get(), _param_mpc_xy_vel_i_acc.get(), _param_mpc_z_vel_i_acc.get()), Vector3f(_param_mpc_xy_vel_d_acc.get(), _param_mpc_xy_vel_d_acc.get(), _param_mpc_z_vel_d_acc.get())); _control.setHorizontalThrustMargin(_param_mpc_thr_xy_marg.get()); + _control.decoupleHorizontalAndVecticalAcceleration(_param_mpc_acc_decouple.get()); _goto_control.setParamMpcAccHor(_param_mpc_acc_hor.get()); _goto_control.setParamMpcAccDownMax(_param_mpc_acc_down_max.get()); _goto_control.setParamMpcAccUpMax(_param_mpc_acc_up_max.get()); diff --git a/src/modules/mc_pos_control/MulticopterPositionControl.hpp b/src/modules/mc_pos_control/MulticopterPositionControl.hpp index b1f88fde57d3..3dac59bc1b89 100644 --- a/src/modules/mc_pos_control/MulticopterPositionControl.hpp +++ b/src/modules/mc_pos_control/MulticopterPositionControl.hpp @@ -146,6 +146,7 @@ class MulticopterPositionControl : public ModuleBase (ParamFloat) _param_mpc_tiltmax_air, (ParamFloat) _param_mpc_thr_hover, (ParamBool) _param_mpc_use_hte, + (ParamBool) _param_mpc_acc_decouple, // Takeoff / Land (ParamFloat) _param_com_spoolup_time, /**< time to let motors spool up after arming */ diff --git a/src/modules/mc_pos_control/PositionControl/PositionControl.cpp b/src/modules/mc_pos_control/PositionControl/PositionControl.cpp index 955f3f4b44a7..0cf632c04359 100644 --- a/src/modules/mc_pos_control/PositionControl/PositionControl.cpp +++ b/src/modules/mc_pos_control/PositionControl/PositionControl.cpp @@ -204,13 +204,20 @@ void PositionControl::_velocityControl(const float dt) void PositionControl::_accelerationControl() { // Assume standard acceleration due to gravity in vertical direction for attitude generation - Vector3f body_z = Vector3f(-_acc_sp(0), -_acc_sp(1), CONSTANTS_ONE_G).normalized(); + float z_specific_force = -CONSTANTS_ONE_G; + + if (!_decouple_horizontal_and_vertical_acceleration) { + // Include vertical acceleration setpoint for better horizontal acceleration tracking + z_specific_force += _acc_sp(2); + } + + Vector3f body_z = Vector3f(-_acc_sp(0), -_acc_sp(1), -z_specific_force).normalized(); ControlMath::limitTilt(body_z, Vector3f(0, 0, 1), _lim_tilt); - // Scale thrust assuming hover thrust produces standard gravity - float collective_thrust = _acc_sp(2) * (_hover_thrust / CONSTANTS_ONE_G) - _hover_thrust; + // Convert to thrust assuming hover thrust produces standard gravity + const float thrust_ned_z = _acc_sp(2) * (_hover_thrust / CONSTANTS_ONE_G) - _hover_thrust; // Project thrust to planned body attitude - collective_thrust /= (Vector3f(0, 0, 1).dot(body_z)); - collective_thrust = math::min(collective_thrust, -_lim_thr_min); + const float cos_ned_body = (Vector3f(0, 0, 1).dot(body_z)); + const float collective_thrust = math::min(thrust_ned_z / cos_ned_body, -_lim_thr_min); _thr_sp = body_z * collective_thrust; } diff --git a/src/modules/mc_pos_control/PositionControl/PositionControl.hpp b/src/modules/mc_pos_control/PositionControl/PositionControl.hpp index 4eb909e1fa3e..85af876cd136 100644 --- a/src/modules/mc_pos_control/PositionControl/PositionControl.hpp +++ b/src/modules/mc_pos_control/PositionControl/PositionControl.hpp @@ -163,6 +163,11 @@ class PositionControl */ void resetIntegral() { _vel_int.setZero(); } + /** + * If set, the tilt setpoint is computed by assuming no vertical acceleration + */ + void decoupleHorizontalAndVecticalAcceleration(bool val) { _decouple_horizontal_and_vertical_acceleration = val; } + /** * Get the controllers output local position setpoint * These setpoints are the ones which were executed on including PID output and feed-forward. @@ -211,6 +216,7 @@ class PositionControl float _lim_tilt{}; ///< Maximum tilt from level the output attitude is allowed to have float _hover_thrust{}; ///< Thrust [HOVER_THRUST_MIN, HOVER_THRUST_MAX] with which the vehicle hovers not accelerating down or up with level orientation + bool _decouple_horizontal_and_vertical_acceleration{true}; ///< Ignore vertical acceleration setpoint to remove its effect on the tilt setpoint // States matrix::Vector3f _pos; /**< current position */ diff --git a/src/modules/mc_pos_control/multicopter_position_control_limits_params.c b/src/modules/mc_pos_control/multicopter_position_control_limits_params.c index a60732cfa8c2..91039f04ea6d 100644 --- a/src/modules/mc_pos_control/multicopter_position_control_limits_params.c +++ b/src/modules/mc_pos_control/multicopter_position_control_limits_params.c @@ -138,3 +138,13 @@ PARAM_DEFINE_FLOAT(MPC_THR_MIN, 0.12f); * @group Multicopter Position Control */ PARAM_DEFINE_FLOAT(MPC_THR_MAX, 1.f); + +/** + * Acceleration to tilt coupling + * + * Set to decouple tilt from vertical acceleration. + * + * @boolean + * @group Multicopter Position Control + */ +PARAM_DEFINE_INT32(MPC_ACC_DECOUPLE, 1); diff --git a/src/modules/muorb/apps/CMakeLists.txt b/src/modules/muorb/apps/CMakeLists.txt index 5a608bec5301..532ada62413b 100644 --- a/src/modules/muorb/apps/CMakeLists.txt +++ b/src/modules/muorb/apps/CMakeLists.txt @@ -39,7 +39,7 @@ px4_add_module( INCLUDES ../test ../aggregator - libfc-sensor-api/inc + ${PX4_BOARD_DIR}/libfc-sensor-api/inc SRCS uORBAppsProtobufChannel.cpp muorb_main.cpp diff --git a/src/modules/muorb/apps/Kconfig b/src/modules/muorb/apps/Kconfig index 21969d591d13..f0afac8b6204 100644 --- a/src/modules/muorb/apps/Kconfig +++ b/src/modules/muorb/apps/Kconfig @@ -4,3 +4,11 @@ menuconfig MODULES_MUORB_APPS depends on PLATFORM_POSIX ---help--- Enable support for muorb apps + + + config MUORB_APPS_SYNC_TIMESTAMP + bool "Sync timestamp with external processor" + depends on MODULES_MUORB_APPS + default y + help + causes HRT timestamp to use an externally calculated offset for synchronization diff --git a/src/modules/navigator/CMakeLists.txt b/src/modules/navigator/CMakeLists.txt index b996566defc2..c55cae3f07b9 100644 --- a/src/modules/navigator/CMakeLists.txt +++ b/src/modules/navigator/CMakeLists.txt @@ -69,4 +69,5 @@ px4_add_module( geofence_breach_avoidance motion_planning mission_feasibility_checker + rtl_time_estimator ) diff --git a/src/modules/navigator/MissionFeasibility/FeasibilityChecker.cpp b/src/modules/navigator/MissionFeasibility/FeasibilityChecker.cpp index ef829d62f594..b27ef969aaeb 100644 --- a/src/modules/navigator/MissionFeasibility/FeasibilityChecker.cpp +++ b/src/modules/navigator/MissionFeasibility/FeasibilityChecker.cpp @@ -46,13 +46,6 @@ FeasibilityChecker::FeasibilityChecker() : void FeasibilityChecker::reset() { - - _is_landed = false; - _home_alt_msl = NAN; - _home_lat_lon = matrix::Vector2d((double)NAN, (double)NAN); - _current_position_lat_lon = matrix::Vector2d((double)NAN, (double)NAN); - _vehicle_type = VehicleType::RotaryWing; - _mission_validity_failed = false; _takeoff_failed = false; _land_pattern_validity_failed = false; @@ -86,10 +79,16 @@ void FeasibilityChecker::updateData() if (home.valid_hpos) { _home_lat_lon = matrix::Vector2d(home.lat, home.lon); + + } else { + _home_lat_lon = matrix::Vector2d((double)NAN, (double)NAN); } if (home.valid_alt) { _home_alt_msl = home.alt; + + } else { + _home_alt_msl = NAN; } } diff --git a/src/modules/navigator/MissionFeasibility/FeasibilityCheckerTest.cpp b/src/modules/navigator/MissionFeasibility/FeasibilityCheckerTest.cpp index fa5882690537..0de54f33766c 100644 --- a/src/modules/navigator/MissionFeasibility/FeasibilityCheckerTest.cpp +++ b/src/modules/navigator/MissionFeasibility/FeasibilityCheckerTest.cpp @@ -65,6 +65,18 @@ class TestFeasibilityChecker : public FeasibilityChecker orb_publish(ORB_ID(home_position), home_pub, &home); } + void publishInvalidHome() + { + home_position_s home = {}; + home.alt = 0.f; + home.valid_alt = false; + home.lat = 0.; + home.lon = 0.; + home.valid_hpos = false; + orb_advert_t home_pub = orb_advertise(ORB_ID(home_position), &home); + orb_publish(ORB_ID(home_position), home_pub, &home); + } + void publishCurrentPosition(double lat, double lon) { vehicle_global_position_s gpos = {}; @@ -122,6 +134,7 @@ TEST_F(FeasibilityCheckerTest, mission_item_validity) ASSERT_EQ(ret, false); checker.reset(); + checker.publishInvalidHome(); mission_item.nav_cmd = NAV_CMD_TAKEOFF; mission_item.altitude_is_relative = true; ret = checker.processNextItem(mission_item, 0, 5); @@ -190,6 +203,7 @@ TEST_F(FeasibilityCheckerTest, check_below_home) // this is done to invalidate the home position checker.reset(); + checker.publishInvalidHome(); checker.publishLanded(true); checker.processNextItem(mission_item, 0, 1); diff --git a/src/modules/navigator/geofence.cpp b/src/modules/navigator/geofence.cpp index 4f48d768a57d..55917331a614 100644 --- a/src/modules/navigator/geofence.cpp +++ b/src/modules/navigator/geofence.cpp @@ -81,6 +81,8 @@ Geofence::Geofence(Navigator *navigator) : if (_navigator != nullptr) { updateFence(); } + + _geofence_status_pub.advertise(); } Geofence::~Geofence() @@ -101,6 +103,14 @@ void Geofence::run() if (_initiate_fence_updated) { _initiate_fence_updated = false; _dataman_state = DatamanState::Read; + + geofence_status_s status; + status.timestamp = hrt_absolute_time(); + status.geofence_id = _opaque_id; + status.status = geofence_status_s::GF_STATUS_LOADING; + + _geofence_status_pub.publish(status); + } break; @@ -147,6 +157,14 @@ void Geofence::run() } else { _dataman_state = DatamanState::UpdateRequestWait; + _fence_updated = true; + + geofence_status_s status; + status.timestamp = hrt_absolute_time(); + status.geofence_id = _opaque_id; + status.status = geofence_status_s::GF_STATUS_READY; + + _geofence_status_pub.publish(status); } } @@ -160,6 +178,13 @@ void Geofence::run() _dataman_state = DatamanState::UpdateRequestWait; _updateFence(); _fence_updated = true; + + geofence_status_s status; + status.timestamp = hrt_absolute_time(); + status.geofence_id = _opaque_id; + status.status = geofence_status_s::GF_STATUS_READY; + + _geofence_status_pub.publish(status); } break; diff --git a/src/modules/navigator/geofence.h b/src/modules/navigator/geofence.h index f2f057dc9a77..71d0a6bdf7ec 100644 --- a/src/modules/navigator/geofence.h +++ b/src/modules/navigator/geofence.h @@ -49,6 +49,7 @@ #include #include #include +#include #include #include #include @@ -171,7 +172,7 @@ class Geofence : public ModuleParams mission_stats_entry_s _stats; DatamanState _dataman_state{DatamanState::UpdateRequestWait}; DatamanState _error_state{DatamanState::UpdateRequestWait}; - DatamanCache _dataman_cache{"geofence_dm_cache_miss", 4}; + DatamanCache _dataman_cache{"geofence_dm_cache_miss", 0}; DatamanClient &_dataman_client = _dataman_cache.client(); float _altitude_min{0.0f}; @@ -185,6 +186,8 @@ class Geofence : public ModuleParams bool _fence_updated{true}; ///< flag indicating if fence are updated to dataman cache bool _initiate_fence_updated{true}; ///< flag indicating if fence updated is needed + uORB::Publication _geofence_status_pub{ORB_ID(geofence_status)}; + /** * implementation of updateFence() */ diff --git a/src/modules/navigator/mission.cpp b/src/modules/navigator/mission.cpp index 9899d751f25b..06b4151bdb9b 100644 --- a/src/modules/navigator/mission.cpp +++ b/src/modules/navigator/mission.cpp @@ -86,6 +86,8 @@ Mission::on_activation() { _need_mission_save = true; + check_mission_valid(true); + MissionBase::on_activation(); } diff --git a/src/modules/navigator/mission_base.cpp b/src/modules/navigator/mission_base.cpp index 360ed16ad469..026cefaba2c5 100644 --- a/src/modules/navigator/mission_base.cpp +++ b/src/modules/navigator/mission_base.cpp @@ -52,38 +52,22 @@ MissionBase::MissionBase(Navigator *navigator, int32_t dataman_cache_size_signed _dataman_cache_size_signed(dataman_cache_size_signed) { _dataman_cache.resize(abs(dataman_cache_size_signed)); - _is_current_planned_mission_item_valid = (initMission() == PX4_OK); - updateDatamanCache(); + // Reset _mission here, and listen on changes on the uorb topic instead of initialize from dataman. + _mission.mission_dataman_id = DM_KEY_WAYPOINTS_OFFBOARD_0; + _mission.fence_dataman_id = DM_KEY_FENCE_POINTS_0; + _mission.safepoint_dataman_id = DM_KEY_SAFE_POINTS_0; + _mission.count = 0; + _mission.current_seq = 0; + _mission.land_start_index = -1; + _mission.land_index = -1; + _mission.mission_id = 0; + _mission.geofence_id = 0; + _mission.safe_points_id = 0; _mission_pub.advertise(); } -int MissionBase::initMission() -{ - mission_s mission; - int ret_val{PX4_ERROR}; - - bool success = _dataman_client.readSync(DM_KEY_MISSION_STATE, 0, reinterpret_cast(&mission), - sizeof(mission_s)); - - if (success) { - if (isMissionValid(mission)) { - _mission = mission; - ret_val = PX4_OK; - - } else { - resetMission(); - } - - } else { - PX4_ERR("Could not initialize Mission: Dataman read failed"); - resetMission(); - } - - return ret_val; -} - void MissionBase::updateDatamanCache() { @@ -118,31 +102,35 @@ void MissionBase::updateMavlinkMission() static_cast(new_mission.count) - 1); } - _mission = new_mission; + if (new_mission.geofence_id != _mission.geofence_id) { + // New geofence data, need to check mission again. + _mission_checked = false; + } - _is_current_planned_mission_item_valid = isMissionValid(_mission); + _mission = new_mission; /* Relevant mission items updated externally*/ if (mission_data_changed) { onMissionUpdate(mission_items_changed); } + + _is_current_planned_mission_item_valid = isMissionValid(); } } void MissionBase::onMissionUpdate(bool has_mission_items_changed) { - _is_current_planned_mission_item_valid = _mission.count > 0; - if (has_mission_items_changed) { _dataman_cache.invalidate(); _load_mission_index = -1; - check_mission_valid(); + if (canRunMissionFeasibility()) { + _mission_checked = true; + check_mission_valid(); - // only warn if the check failed on merit - if ((!_navigator->get_mission_result()->valid) && _mission.count > 0U) { - PX4_WARN("mission check failed"); + } else { + _mission_checked = false; } } @@ -168,15 +156,17 @@ MissionBase::on_inactive() _land_detected_sub.update(); _vehicle_status_sub.update(); _global_pos_sub.update(); + _geofence_status_sub.update(); parameters_update(); updateMavlinkMission(); - /* Need to check the initialized mission once, have to do it here, since we need to wait for the home position. */ - if (_navigator->home_global_position_valid() && !_initialized_mission_checked) { + /* Check the mission */ + if (!_mission_checked && canRunMissionFeasibility()) { + _mission_checked = true; check_mission_valid(); - _initialized_mission_checked = true; + _is_current_planned_mission_item_valid = isMissionValid(); } if (_vehicle_status_sub.get().arming_state != vehicle_status_s::ARMING_STATE_ARMED) { @@ -217,8 +207,6 @@ MissionBase::on_activation() _mission_has_been_activated = true; _system_disarmed_while_inactive = false; - check_mission_valid(); - update_mission(); // reset the cache and fill it with the items up to the previous item. The cache contains @@ -259,11 +247,22 @@ MissionBase::on_active() _land_detected_sub.update(); _vehicle_status_sub.update(); _global_pos_sub.update(); + _geofence_status_sub.update(); parameters_update(); updateMavlinkMission(); updateDatamanCache(); + updateMissionAltAfterHomeChanged(); + + /* Check the mission */ + if (!_mission_checked && canRunMissionFeasibility()) { + _mission_checked = true; + check_mission_valid(); + _is_current_planned_mission_item_valid = isMissionValid(); + update_mission(); + set_mission_items(); + } // check if heading alignment is necessary, and add it to the current mission item if necessary if (_align_heading_necessary && is_mission_item_reached_or_completed()) { @@ -678,7 +677,7 @@ MissionBase::checkMissionRestart() && ((_mission.current_seq + 1) == _mission.count)) { setMissionIndex(0); _inactivation_index = -1; // reset - _is_current_planned_mission_item_valid = isMissionValid(_mission); + _is_current_planned_mission_item_valid = isMissionValid(); resetMissionJumpCounter(); _navigator->reset_cruising_speed(); _navigator->reset_vroi(); @@ -687,11 +686,13 @@ MissionBase::checkMissionRestart() } void -MissionBase::check_mission_valid() +MissionBase::check_mission_valid(bool forced) { - if ((_navigator->get_mission_result()->mission_id != _mission.mission_id) - || (_navigator->get_mission_result()->geofence_id != _mission.geofence_id) - || (_navigator->get_mission_result()->home_position_counter != _navigator->get_home_position()->update_count)) { + // Allow forcing it, since we currently not rechecking if parameters have changed. + if (forced || + (_navigator->get_mission_result()->mission_id != _mission.mission_id) || + (_navigator->get_mission_result()->geofence_id != _mission.geofence_id) || + (_navigator->get_mission_result()->home_position_counter != _navigator->get_home_position()->update_count)) { _navigator->get_mission_result()->mission_id = _mission.mission_id; _navigator->get_mission_result()->geofence_id = _mission.geofence_id; @@ -704,6 +705,12 @@ MissionBase::check_mission_valid() _navigator->get_mission_result()->failure = false; set_mission_result(); + + // only warn if the check failed on merit + if ((!_navigator->get_mission_result()->valid) && _mission.count > 0U) { + PX4_WARN("mission check failed"); + } + } } @@ -876,16 +883,16 @@ void MissionBase::publish_navigator_mission_item() _navigator_mission_item_pub.publish(navigator_mission_item); } -bool MissionBase::isMissionValid(mission_s &mission) const +bool MissionBase::isMissionValid() const { bool ret_val{false}; - if (((mission.current_seq < mission.count) || (mission.count == 0U && mission.current_seq <= 0)) && - (mission.mission_dataman_id == DM_KEY_WAYPOINTS_OFFBOARD_0 - || mission.mission_dataman_id == DM_KEY_WAYPOINTS_OFFBOARD_1) && - (mission.timestamp != 0u)) { + if (((_mission.current_seq < _mission.count) || (_mission.count == 0U && _mission.current_seq <= 0)) && + (_mission.mission_dataman_id == DM_KEY_WAYPOINTS_OFFBOARD_0 || + _mission.mission_dataman_id == DM_KEY_WAYPOINTS_OFFBOARD_1) && + (_mission.timestamp != 0u) && + (_navigator->get_mission_result()->valid)) { ret_val = true; - } return ret_val; @@ -1141,7 +1148,7 @@ int MissionBase::setMissionToClosestItem(double lat, double lon, float alt, floa void MissionBase::resetMission() { /* we do not need to reset mission if is already.*/ - if (_mission.count == 0u && isMissionValid(_mission)) { + if (_mission.count == 0u) { return; } @@ -1360,3 +1367,38 @@ bool MissionBase::checkMissionDataChanged(mission_s new_mission) (new_mission.mission_id != _mission.mission_id) || (new_mission.current_seq != _mission.current_seq)); } + +bool MissionBase::canRunMissionFeasibility() +{ + return _navigator->home_global_position_valid() && // Need to have a home position checked + _navigator->get_global_position()->timestamp > 0 && // Need to have a position, for first waypoint check + (_geofence_status_sub.get().timestamp > 0) && // Geofence data must be loaded + (_geofence_status_sub.get().geofence_id == _mission.geofence_id) && + (_geofence_status_sub.get().status == geofence_status_s::GF_STATUS_READY); +} + +void MissionBase::updateMissionAltAfterHomeChanged() +{ + if (_navigator->get_home_position()->update_count > _home_update_counter) { + float new_alt = get_absolute_altitude_for_item(_mission_item); + float altitude_diff = new_alt - _navigator->get_position_setpoint_triplet()->current.alt; + + if (_navigator->get_position_setpoint_triplet()->previous.valid + && PX4_ISFINITE(_navigator->get_position_setpoint_triplet()->previous.alt)) { + _navigator->get_position_setpoint_triplet()->previous.alt = _navigator->get_position_setpoint_triplet()->previous.alt + + altitude_diff; + } + + _navigator->get_position_setpoint_triplet()->current.alt = _navigator->get_position_setpoint_triplet()->current.alt + + altitude_diff; + + if (_navigator->get_position_setpoint_triplet()->next.valid + && PX4_ISFINITE(_navigator->get_position_setpoint_triplet()->next.alt)) { + _navigator->get_position_setpoint_triplet()->next.alt = _navigator->get_position_setpoint_triplet()->next.alt + + altitude_diff; + } + + _navigator->set_position_setpoint_triplet_updated(); + _home_update_counter = _navigator->get_home_position()->update_count; + } +} diff --git a/src/modules/navigator/mission_base.h b/src/modules/navigator/mission_base.h index 660c918686f2..1b788106f4a3 100644 --- a/src/modules/navigator/mission_base.h +++ b/src/modules/navigator/mission_base.h @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -122,7 +123,7 @@ class MissionBase : public MissionBlock, public ModuleParams * @return true If mission has a land start of land item and a land item * @return false otherwise */ - bool hasMissionLandStart() const { return _mission.land_start_index > 0 && _mission.land_index > 0;}; + bool hasMissionLandStart() const { return _mission.land_start_index >= 0 && _mission.land_index >= 0;}; /** * @brief Go to next Mission Item * Go to next non jump mission item @@ -207,13 +208,18 @@ class MissionBase : public MissionBlock, public ModuleParams int getNonJumpItem(int32_t &mission_index, mission_item_s &mission, bool execute_jump, bool write_jumps, bool mission_direction_backward = false); /** - * @brief Is Mission Parameters Valid + * @brief Is Mission Valid * - * @param mission Mission struct - * @return true is mission parameters are valid + * @return true is mission is valid * @return false otherwise */ - bool isMissionValid(mission_s &mission) const; + bool isMissionValid() const; + + /** + * @brief Check whether a mission is ready to go + * @param[in] forced flag if the check has to be run irregardles of any updates. + */ + void check_mission_valid(bool forced = false); /** * On mission update @@ -309,12 +315,15 @@ class MissionBase : public MissionBlock, public ModuleParams bool _is_current_planned_mission_item_valid{false}; /**< Flag indicating if the currently loaded mission item is valid*/ bool _mission_has_been_activated{false}; /**< Flag indicating if the mission has been activated*/ - bool _initialized_mission_checked{false}; /**< Flag indicating if the initialized mission has been checked by the mission validator*/ + bool _mission_checked{false}; /**< Flag indicating if the mission has been checked by the mission validator*/ bool _system_disarmed_while_inactive{false}; /**< Flag indicating if the system has been disarmed while mission is inactive*/ mission_s _mission; /**< Currently active mission*/ float _mission_init_climb_altitude_amsl{NAN}; /**< altitude AMSL the vehicle will climb to when mission starts */ int _inactivation_index{-1}; // index of mission item at which the mission was paused. Used to resume survey missions at previous waypoint to not lose images. + int32_t _load_mission_index{-1}; /**< Mission inted of loaded mission items in dataman cache*/ + int32_t _dataman_cache_size_signed; /**< Size of the dataman cache. A negativ value indicates that previous mission items should be loaded, a positiv value the next mission items*/ + DatamanCache _dataman_cache{"mission_dm_cache_miss", 10}; /**< Dataman cache of mission items*/ DatamanClient &_dataman_client = _dataman_cache.client(); /**< Dataman client*/ @@ -334,18 +343,13 @@ class MissionBase : public MissionBlock, public ModuleParams * @brief Update Dataman cache * */ - void updateDatamanCache(); + virtual void updateDatamanCache(); /** * @brief Update mission subscription * */ void updateMavlinkMission(); - /** - * Check whether a mission is ready to go - */ - void check_mission_valid(); - /** * Reset mission */ @@ -444,8 +448,15 @@ class MissionBase : public MissionBlock, public ModuleParams */ bool checkMissionDataChanged(mission_s new_mission); - int32_t _load_mission_index{-1}; /**< Mission inted of loaded mission items in dataman cache*/ - int32_t _dataman_cache_size_signed; /**< Size of the dataman cache. A negativ value indicates that previous mission items should be loaded, a positiv value the next mission items*/ + /** + * @brief update current mission altitude after the home position has changed. + */ + + void updateMissionAltAfterHomeChanged(); + + bool canRunMissionFeasibility(); + + uint32_t _home_update_counter = 0; /**< Variable to store the previous value for home change detection.*/ bool _align_heading_necessary{false}; // if true, heading of vehicle needs to be aligned with heading of next waypoint. Used to create new mission items for heading alignment. @@ -461,4 +472,5 @@ class MissionBase : public MissionBlock, public ModuleParams ) uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s}; + uORB::SubscriptionData _geofence_status_sub{ORB_ID(geofence_status)}; }; diff --git a/src/modules/navigator/navigator_main.cpp b/src/modules/navigator/navigator_main.cpp index 30cf417c48f3..8e2f24e1574c 100644 --- a/src/modules/navigator/navigator_main.cpp +++ b/src/modules/navigator/navigator_main.cpp @@ -783,17 +783,7 @@ void Navigator::run() _pos_sp_triplet_published_invalid_once = false; } -#if CONFIG_MODE_NAVIGATOR_VTOL_TAKEOFF - - // If we are in VTOL takeoff, do not switch until it is finished. - if (_navigation_mode == &_vtol_takeoff && !get_mission_result()->finished) { - navigation_mode_new = &_vtol_takeoff; - - } else -#endif //CONFIG_MODE_NAVIGATOR_VTOL_TAKEOFF - { - navigation_mode_new = &_rtl; - } + navigation_mode_new = &_rtl; break; diff --git a/src/modules/navigator/rtl.cpp b/src/modules/navigator/rtl.cpp index db20f8cf7475..bfa5d486be45 100644 --- a/src/modules/navigator/rtl.cpp +++ b/src/modules/navigator/rtl.cpp @@ -202,38 +202,43 @@ void RTL::on_inactive() break; } - // Limit inactive calculation to 1Hz + // Limit inactive calculation to 0.5Hz hrt_abstime now{hrt_absolute_time()}; - if ((now - _destination_check_time) > 1_s) { + if ((now - _destination_check_time) > 2_s) { _destination_check_time = now; setRtlTypeAndDestination(); + publishRemainingTimeEstimate(); + } - const bool global_position_recently_updated = _global_pos_sub.get().timestamp > 0 - && hrt_elapsed_time(&_global_pos_sub.get().timestamp) < 10_s; +} - rtl_time_estimate_s estimated_time{}; - estimated_time.valid = false; +void RTL::publishRemainingTimeEstimate() +{ + const bool global_position_recently_updated = _global_pos_sub.get().timestamp > 0 + && hrt_elapsed_time(&_global_pos_sub.get().timestamp) < 10_s; - if (_navigator->home_global_position_valid() && global_position_recently_updated) { - switch (_rtl_type) { - case RtlType::RTL_DIRECT: - estimated_time = _rtl_direct.calc_rtl_time_estimate(); - break; + rtl_time_estimate_s estimated_time{}; + estimated_time.valid = false; - case RtlType::RTL_DIRECT_MISSION_LAND: - case RtlType::RTL_MISSION_FAST: - case RtlType::RTL_MISSION_FAST_REVERSE: - estimated_time = _rtl_mission_type_handle->calc_rtl_time_estimate(); - break; + if (_navigator->home_global_position_valid() && global_position_recently_updated) { + switch (_rtl_type) { + case RtlType::RTL_DIRECT: + estimated_time = _rtl_direct.calc_rtl_time_estimate(); + break; - default: - break; - } - } + case RtlType::RTL_DIRECT_MISSION_LAND: + case RtlType::RTL_MISSION_FAST: + case RtlType::RTL_MISSION_FAST_REVERSE: + estimated_time = _rtl_mission_type_handle->calc_rtl_time_estimate(); + break; - _rtl_time_estimate_pub.publish(estimated_time); + default: + break; + } } + + _rtl_time_estimate_pub.publish(estimated_time); } void RTL::on_activation() @@ -287,6 +292,14 @@ void RTL::on_active() default: break; } + + // Keep publishing remaining time estimates every 2 seconds + hrt_abstime now{hrt_absolute_time()}; + + if ((now - _destination_check_time) > 2_s) { + _destination_check_time = now; + publishRemainingTimeEstimate(); + } } void RTL::setRtlTypeAndDestination() @@ -604,7 +617,7 @@ void RTL::parameters_update() bool RTL::hasMissionLandStart() const { - return _mission_sub.get().land_start_index > 0; + return _mission_sub.get().land_start_index >= 0 && _mission_sub.get().land_index >= 0; } bool RTL::hasVtolLandApproach(const PositionYawSetpoint &rtl_position) const diff --git a/src/modules/navigator/rtl.h b/src/modules/navigator/rtl.h index ab61aebe2931..ac6a5a75d774 100644 --- a/src/modules/navigator/rtl.h +++ b/src/modules/navigator/rtl.h @@ -106,6 +106,12 @@ class RTL : public NavigatorMode, public ModuleParams void setRtlTypeAndDestination(); + /** + * @brief Publish the remaining time estimate to go to the RTL landing point. + * + */ + void publishRemainingTimeEstimate(); + /** * @brief Find RTL destination. * diff --git a/src/modules/navigator/rtl_direct.cpp b/src/modules/navigator/rtl_direct.cpp index 275cf011e231..d2936986db9a 100644 --- a/src/modules/navigator/rtl_direct.cpp +++ b/src/modules/navigator/rtl_direct.cpp @@ -1,6 +1,6 @@ /**************************************************************************** * - * Copyright (c) 2013-2020 PX4 Development Team. All rights reserved. + * Copyright (c) 2013-2024 PX4 Development Team. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -59,15 +59,6 @@ RtlDirect::RtlDirect(Navigator *navigator) : _land_approach.lat = static_cast(NAN); _land_approach.lon = static_cast(NAN); _land_approach.height_m = NAN; - - _param_mpc_z_v_auto_up = param_find("MPC_Z_V_AUTO_UP"); - _param_mpc_z_v_auto_dn = param_find("MPC_Z_V_AUTO_DN"); - _param_mpc_land_speed = param_find("MPC_LAND_SPEED"); - _param_fw_climb_rate = param_find("FW_T_CLMB_R_SP"); - _param_fw_sink_rate = param_find("FW_T_SINK_R_SP"); - _param_fw_airspeed_trim = param_find("FW_AIRSPD_TRIM"); - _param_mpc_xy_cruise = param_find("MPC_XY_CRUISE"); - _param_rover_cruise_speed = param_find("GND_SPEED_THR_SC"); } void RtlDirect::on_inactivation() @@ -130,7 +121,6 @@ void RtlDirect::setRtlPosition(PositionYawSetpoint rtl_position, loiter_point_s // Only allow to set a new approach if the mode is not activated yet. if (!isActive()) { - _land_approach = loiter_pos; _destination = rtl_position; _force_heading = false; @@ -148,24 +138,12 @@ void RtlDirect::setRtlPosition(PositionYawSetpoint rtl_position, loiter_point_s _destination.alt = _home_pos_sub.get().alt; } - if (!PX4_ISFINITE(_land_approach.lat) || !PX4_ISFINITE(_land_approach.lon)) { - _land_approach.lat = _destination.lat; - _land_approach.lon = _destination.lon; - - } else { - const float dist_to_destination{get_distance_to_next_waypoint(_land_approach.lat, _land_approach.lon, _destination.lat, _destination.lon)}; - - if (dist_to_destination > _navigator->get_acceptance_radius()) { - _force_heading = true; - } - } + _land_approach = sanitizeLandApproach(loiter_pos); - if (!PX4_ISFINITE(_land_approach.height_m)) { - _land_approach.height_m = _destination.alt + _param_rtl_descend_alt.get(); - } + const float dist_to_destination{get_distance_to_next_waypoint(_land_approach.lat, _land_approach.lon, _destination.lat, _destination.lon)}; - if (!PX4_ISFINITE(_land_approach.loiter_radius_m) || fabsf(_land_approach.loiter_radius_m) <= FLT_EPSILON) { - _land_approach.loiter_radius_m = _param_rtl_loiter_rad.get(); + if (dist_to_destination > _navigator->get_acceptance_radius()) { + _force_heading = true; } } } @@ -287,7 +265,7 @@ void RtlDirect::set_rtl_item() // location and land location after exiting the loiter circle pos_sp_triplet->previous.lat = _land_approach.lat; pos_sp_triplet->previous.lon = _land_approach.lon; - pos_sp_triplet->previous.alt = _mission_item.altitude; + pos_sp_triplet->previous.alt = get_absolute_altitude_for_item(_mission_item); pos_sp_triplet->previous.valid = true; _rtl_state = RTLState::TRANSITION_TO_MC; @@ -379,8 +357,9 @@ RtlDirect::RTLState RtlDirect::getActivationLandState() rtl_time_estimate_s RtlDirect::calc_rtl_time_estimate() { _global_pos_sub.update(); + _rtl_time_estimator.update(); - rtl_time_estimate_s rtl_time_estimate{}; + _rtl_time_estimator.reset(); RTLState start_state_for_estimate; @@ -391,34 +370,31 @@ rtl_time_estimate_s RtlDirect::calc_rtl_time_estimate() start_state_for_estimate = getActivationLandState(); } - // Calculate RTL time estimate only when there is a valid home position + // Calculate RTL time estimate only when there is a valid destination // TODO: Also check if vehicle position is valid - if (!_navigator->home_global_position_valid()) { - rtl_time_estimate.valid = false; + if (PX4_ISFINITE(_destination.lat) && PX4_ISFINITE(_destination.lon) && PX4_ISFINITE(_destination.alt)) { - } else { - rtl_time_estimate.valid = true; - rtl_time_estimate.time_estimate = 0.f; + loiter_point_s land_approach = sanitizeLandApproach(_land_approach); - const float loiter_altitude = min(_land_approach.height_m, _rtl_alt); + const float loiter_altitude = min(land_approach.height_m, _rtl_alt); // Sum up time estimate for various segments of the landing procedure switch (start_state_for_estimate) { case RTLState::CLIMBING: { // Climb segment is only relevant if the drone is below return altitude - const float climb_dist = _global_pos_sub.get().alt < _rtl_alt ? (_rtl_alt - _global_pos_sub.get().alt) : 0; - - if (climb_dist > FLT_EPSILON) { - rtl_time_estimate.time_estimate += climb_dist / getClimbRate(); + if ((_global_pos_sub.get().alt < _rtl_alt) || _enforce_rtl_alt) { + _rtl_time_estimator.addVertDistance(_rtl_alt - _global_pos_sub.get().alt); } } // FALLTHROUGH - case RTLState::MOVE_TO_LOITER: - - // Add cruise segment to home - rtl_time_estimate.time_estimate += get_distance_to_next_waypoint( - _land_approach.lat, _land_approach.lon, _global_pos_sub.get().lat, _global_pos_sub.get().lon) / getCruiseGroundSpeed(); + case RTLState::MOVE_TO_LOITER: { + matrix::Vector2f direction{}; + get_vector_to_next_waypoint(_global_pos_sub.get().lat, _global_pos_sub.get().lon, land_approach.lat, + land_approach.lon, &direction(0), &direction(1)); + _rtl_time_estimator.addDistance(get_distance_to_next_waypoint(_global_pos_sub.get().lat, _global_pos_sub.get().lon, + land_approach.lat, land_approach.lon), direction, 0.f); + } // FALLTHROUGH case RTLState::LOITER_DOWN: { @@ -434,15 +410,18 @@ rtl_time_estimate_s RtlDirect::calc_rtl_time_estimate() initial_altitude = _rtl_alt; // CLIMB and RETURN } - // Add descend segment (first landing phase: return alt to loiter alt) - rtl_time_estimate.time_estimate += fabsf(initial_altitude - loiter_altitude) / getDescendRate(); + _rtl_time_estimator.addVertDistance(loiter_altitude - initial_altitude); } // FALLTHROUGH case RTLState::LOITER_HOLD: // Add land delay (the short pause for deploying landing gear) - // TODO: Check if landing gear is deployed or not - rtl_time_estimate.time_estimate += _param_rtl_land_delay.get(); + _rtl_time_estimator.addWait(_param_rtl_land_delay.get()); + + if (_param_rtl_land_delay.get() < -FLT_EPSILON) { // Set to loiter infinitely and not land. Stop calculation here + break; + } + // FALLTHROUGH case RTLState::MOVE_TO_LAND: @@ -450,19 +429,22 @@ rtl_time_estimate_s RtlDirect::calc_rtl_time_estimate() case RTLState::MOVE_TO_LAND_HOVER: { // Add cruise segment to home float move_to_land_dist{0.f}; + matrix::Vector2f direction{}; if (start_state_for_estimate >= RTLState::MOVE_TO_LAND) { move_to_land_dist = get_distance_to_next_waypoint( - _destination.lat, _destination.lon, _global_pos_sub.get().lat, _global_pos_sub.get().lon); + _global_pos_sub.get().lat, _global_pos_sub.get().lon, _destination.lat, _destination.lon); + get_vector_to_next_waypoint(_global_pos_sub.get().lat, _global_pos_sub.get().lon, _destination.lat, _destination.lon, + &direction(0), &direction(1)); } else { move_to_land_dist = get_distance_to_next_waypoint( - _destination.lat, _destination.lon, _land_approach.lat, _land_approach.lon); + land_approach.lat, land_approach.lon, _destination.lat, _destination.lon); + get_vector_to_next_waypoint(land_approach.lat, land_approach.lon, _destination.lat, _destination.lon, &direction(0), + &direction(1)); } - if (move_to_land_dist > FLT_EPSILON) { - rtl_time_estimate.time_estimate += move_to_land_dist / getCruiseGroundSpeed(); - } + _rtl_time_estimator.addDistance(move_to_land_dist, direction, 0.f); } // FALLTHROUGH @@ -482,10 +464,7 @@ rtl_time_estimate_s RtlDirect::calc_rtl_time_estimate() initial_altitude = loiter_altitude; } - // Prevent negative times when close to the ground - if (initial_altitude > _destination.alt) { - rtl_time_estimate.time_estimate += (initial_altitude - _destination.alt) / getHoverLandSpeed(); - } + _rtl_time_estimator.addDescendMCLand(_destination.alt - initial_altitude); } break; @@ -494,142 +473,40 @@ rtl_time_estimate_s RtlDirect::calc_rtl_time_estimate() // Remaining time is 0 break; } - - // Prevent negative durations as phyiscally they make no sense. These can - // occur during the last phase of landing when close to the ground. - rtl_time_estimate.time_estimate = math::max(0.f, rtl_time_estimate.time_estimate); - - // Use actual time estimate to compute the safer time estimate with additional scale factor and a margin - rtl_time_estimate.safe_time_estimate = _param_rtl_time_factor.get() * rtl_time_estimate.time_estimate - + _param_rtl_time_margin.get(); - } - - // return message - rtl_time_estimate.timestamp = hrt_absolute_time(); - - return rtl_time_estimate; -} - -float RtlDirect::getCruiseSpeed() -{ - float ret = 1e6f; - - if (_navigator->get_vstatus()->vehicle_type == vehicle_status_s::VEHICLE_TYPE_ROTARY_WING) { - if (_param_mpc_xy_cruise == PARAM_INVALID || param_get(_param_mpc_xy_cruise, &ret) != PX4_OK) { - ret = 1e6f; - } - - } else if (_navigator->get_vstatus()->vehicle_type == vehicle_status_s::VEHICLE_TYPE_FIXED_WING) { - if (_param_fw_airspeed_trim == PARAM_INVALID || param_get(_param_fw_airspeed_trim, &ret) != PX4_OK) { - ret = 1e6f; - } - - } else if (_navigator->get_vstatus()->vehicle_type == vehicle_status_s::VEHICLE_TYPE_ROVER) { - if (_param_rover_cruise_speed == PARAM_INVALID || param_get(_param_rover_cruise_speed, &ret) != PX4_OK) { - ret = 1e6f; - } } - return ret; + return _rtl_time_estimator.getEstimate(); } -float RtlDirect::getHoverLandSpeed() -{ - float ret = 1e6f; - - if (_param_mpc_land_speed == PARAM_INVALID || param_get(_param_mpc_land_speed, &ret) != PX4_OK) { - ret = 1e6f; - } - - return ret; -} - -matrix::Vector2f RtlDirect::get_wind() +void RtlDirect::parameters_update() { - _wind_sub.update(); - matrix::Vector2f wind; + if (_parameter_update_sub.updated()) { + parameter_update_s param_update; + _parameter_update_sub.copy(¶m_update); - if (hrt_absolute_time() - _wind_sub.get().timestamp < 1_s) { - wind(0) = _wind_sub.get().windspeed_north; - wind(1) = _wind_sub.get().windspeed_east; + // If any parameter updated, call updateParams() to check if + // this class attributes need updating (and do so). + updateParams(); } - - return wind; } -float RtlDirect::getClimbRate() +loiter_point_s RtlDirect::sanitizeLandApproach(loiter_point_s land_approach) const { - float ret = 1e6f; + loiter_point_s sanitized_land_approach{land_approach}; - if (_navigator->get_vstatus()->vehicle_type == vehicle_status_s::VEHICLE_TYPE_ROTARY_WING) { - if (_param_mpc_z_v_auto_up == PARAM_INVALID || param_get(_param_mpc_z_v_auto_up, &ret) != PX4_OK) { - ret = 1e6f; - } - - } else if (_navigator->get_vstatus()->vehicle_type == vehicle_status_s::VEHICLE_TYPE_FIXED_WING) { + if (!PX4_ISFINITE(land_approach.lat) || !PX4_ISFINITE(land_approach.lon)) { + sanitized_land_approach.lat = _destination.lat; + sanitized_land_approach.lon = _destination.lon; - if (_param_fw_climb_rate == PARAM_INVALID || param_get(_param_fw_climb_rate, &ret) != PX4_OK) { - ret = 1e6f; - } } - return ret; -} - -float RtlDirect::getDescendRate() -{ - float ret = 1e6f; - - if (_navigator->get_vstatus()->vehicle_type == vehicle_status_s::VEHICLE_TYPE_ROTARY_WING) { - if (_param_mpc_z_v_auto_dn == PARAM_INVALID || param_get(_param_mpc_z_v_auto_dn, &ret) != PX4_OK) { - ret = 1e6f; - } - - } else if (_navigator->get_vstatus()->vehicle_type == vehicle_status_s::VEHICLE_TYPE_FIXED_WING) { - if (_param_fw_sink_rate == PARAM_INVALID || param_get(_param_fw_sink_rate, &ret) != PX4_OK) { - ret = 1e6f; - } + if (!PX4_ISFINITE(land_approach.height_m)) { + sanitized_land_approach.height_m = _destination.alt + _param_rtl_descend_alt.get(); } - return ret; -} - -float RtlDirect::getCruiseGroundSpeed() -{ - float cruise_speed = getCruiseSpeed(); - - if (_navigator->get_vstatus()->vehicle_type == vehicle_status_s::VEHICLE_TYPE_FIXED_WING) { - const vehicle_global_position_s &global_position = *_navigator->get_global_position(); - matrix::Vector2f wind = get_wind(); - - matrix::Vector2f to_destination_vec; - get_vector_to_next_waypoint(global_position.lat, global_position.lon, _destination.lat, _destination.lon, - &to_destination_vec(0), &to_destination_vec(1)); - - const matrix::Vector2f to_home_dir = to_destination_vec.unit_or_zero(); - - const float wind_towards_home = wind.dot(to_home_dir); - const float wind_across_home = matrix::Vector2f(wind - to_home_dir * wind_towards_home).norm(); - - - // Note: use fminf so that we don't _rely_ on wind towards home to make RTL more efficient - const float ground_speed = sqrtf(cruise_speed * cruise_speed - wind_across_home * wind_across_home) + fminf( - 0.f, wind_towards_home); - - cruise_speed = ground_speed; + if (!PX4_ISFINITE(land_approach.loiter_radius_m) || fabsf(land_approach.loiter_radius_m) <= FLT_EPSILON) { + sanitized_land_approach.loiter_radius_m = _param_rtl_loiter_rad.get(); } - return cruise_speed; -} - -void RtlDirect::parameters_update() -{ - if (_parameter_update_sub.updated()) { - parameter_update_s param_update; - _parameter_update_sub.copy(¶m_update); - - // If any parameter updated, call updateParams() to check if - // this class attributes need updating (and do so). - updateParams(); - } + return sanitized_land_approach; } diff --git a/src/modules/navigator/rtl_direct.h b/src/modules/navigator/rtl_direct.h index 9dc89e42fcdc..211b2779eae0 100644 --- a/src/modules/navigator/rtl_direct.h +++ b/src/modules/navigator/rtl_direct.h @@ -54,6 +54,7 @@ #include #include +#include #include "mission_block.h" #include "navigation.h" #include "safe_point_land.hpp" @@ -119,13 +120,6 @@ class RtlDirect : public MissionBlock, public ModuleParams } _rtl_state{RTLState::IDLE}; /*< Current state in the state machine.*/ private: - /** - * @brief Get the horizontal wind velocity - * - * @return horizontal wind velocity. - */ - matrix::Vector2f get_wind(); - /** * @brief Set the return to launch control setpoint. * @@ -133,39 +127,10 @@ class RtlDirect : public MissionBlock, public ModuleParams void set_rtl_item(); /** - * @brief Get the Cruise Ground Speed - * - * @return Ground speed in cruise mode [m/s]. - */ - float getCruiseGroundSpeed(); - - /** - * @brief Get the climb rate - * - * @return Climb rate [m/s] - */ - float getClimbRate(); - - /** - * @brief Get the descend rate - * - * @return descend rate [m/s] - */ - float getDescendRate(); - - /** - * @brief Get the cruise speed + * @brief sanitize land_approach * - * @return cruise speed [m/s] */ - float getCruiseSpeed(); - - /** - * @brief Get the Hover Land Speed - * - * @return Hover land speed [m/s] - */ - float getHoverLandSpeed(); + loiter_point_s sanitizeLandApproach(loiter_point_s land_approach) const; /** * Check for parameter changes and update them if needed. @@ -178,6 +143,7 @@ class RtlDirect : public MissionBlock, public ModuleParams bool _enforce_rtl_alt{false}; bool _force_heading{false}; + RtlTimeEstimator _rtl_time_estimator; PositionYawSetpoint _destination; ///< the RTL position to fly to loiter_point_s _land_approach; @@ -190,23 +156,11 @@ class RtlDirect : public MissionBlock, public ModuleParams (ParamFloat) _param_rtl_min_dist, (ParamInt) _param_rtl_pld_md, (ParamFloat) _param_rtl_loiter_rad, - (ParamFloat) _param_rtl_time_factor, - (ParamInt) _param_rtl_time_margin, // external params (ParamBool) _param_wv_en ) - param_t _param_mpc_z_v_auto_up{PARAM_INVALID}; - param_t _param_mpc_z_v_auto_dn{PARAM_INVALID}; - param_t _param_mpc_land_speed{PARAM_INVALID}; - param_t _param_fw_climb_rate{PARAM_INVALID}; - param_t _param_fw_sink_rate{PARAM_INVALID}; - - param_t _param_fw_airspeed_trim{PARAM_INVALID}; - param_t _param_mpc_xy_cruise{PARAM_INVALID}; - param_t _param_rover_cruise_speed{PARAM_INVALID}; - uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s}; uORB::SubscriptionData _global_pos_sub{ORB_ID(vehicle_global_position)}; /**< global position subscription */ uORB::SubscriptionData _home_pos_sub{ORB_ID(home_position)}; /**< home position subscription */ diff --git a/src/modules/navigator/rtl_direct_mission_land.cpp b/src/modules/navigator/rtl_direct_mission_land.cpp index a8620f2bb78d..df6674e34ad8 100644 --- a/src/modules/navigator/rtl_direct_mission_land.cpp +++ b/src/modules/navigator/rtl_direct_mission_land.cpp @@ -52,6 +52,42 @@ RtlDirectMissionLand::RtlDirectMissionLand(Navigator *navigator) : } +void +RtlDirectMissionLand::updateDatamanCache() +{ + int32_t start_index; + + start_index = math::min(_mission.land_start_index, static_cast(_mission.count)); + + if ((start_index >= 0) && (_mission.count > 0) && hasMissionLandStart() && (start_index != _load_mission_index)) { + + int32_t end_index = static_cast(_mission.count); + + // Check that we load all data into the cache + if (end_index - start_index > _dataman_cache_size_signed) { + _dataman_cache.invalidate(); + _dataman_cache_size_signed = end_index - start_index; + _dataman_cache.resize(_dataman_cache_size_signed); + } + + for (int32_t index = start_index; index != end_index; index += math::signNoZero(_dataman_cache_size_signed)) { + + _dataman_cache.load(static_cast(_mission.mission_dataman_id), index); + } + + _load_mission_index = start_index; + } + + _dataman_cache.update(); +} + +void RtlDirectMissionLand::on_inactive() +{ + MissionBase::on_inactive(); + + updateDatamanCache(); +} + void RtlDirectMissionLand::on_activation() { _land_detected_sub.update(); @@ -62,13 +98,7 @@ void RtlDirectMissionLand::on_activation() if (hasMissionLandStart()) { _is_current_planned_mission_item_valid = (goToItem(_mission.land_start_index, false) == PX4_OK); - if ((_global_pos_sub.get().alt < _rtl_alt) || _enforce_rtl_alt) { - - // If lower than return altitude, climb up first. - // If enforce_rtl_alt is true then forcing altitude change even if above. - _needs_climbing = true; - - } + _needs_climbing = checkNeedsToClimb(); } else { _is_current_planned_mission_item_valid = false; @@ -202,9 +232,171 @@ void RtlDirectMissionLand::setActiveMissionItems() rtl_time_estimate_s RtlDirectMissionLand::calc_rtl_time_estimate() { - rtl_time_estimate_s time_estimate; - time_estimate.valid = false; - time_estimate.timestamp = hrt_absolute_time(); + _rtl_time_estimator.update(); + _rtl_time_estimator.reset(); + + if (_mission.count > 0 && hasMissionLandStart()) { + int32_t start_item_index{-1}; + bool is_in_climbing_submode{false}; + + if (isActive()) { + start_item_index = math::max(_mission.current_seq, _mission.land_start_index); + is_in_climbing_submode = _needs_climbing; + + } else { + start_item_index = _mission.land_start_index; + is_in_climbing_submode = checkNeedsToClimb(); + } + + if (start_item_index >= 0 && start_item_index < static_cast(_mission.count)) { + float altitude_at_calculation_point; + matrix::Vector2d hor_position_at_calculation_point{_global_pos_sub.get().lat, _global_pos_sub.get().lon}; + + if (is_in_climbing_submode) { + if (_enforce_rtl_alt) { + _rtl_time_estimator.addVertDistance(_rtl_alt - _global_pos_sub.get().alt); + altitude_at_calculation_point = _rtl_alt; + + } else { + if (_global_pos_sub.get().alt < _rtl_alt) { + _rtl_time_estimator.addVertDistance(_rtl_alt - _global_pos_sub.get().alt); + } + + altitude_at_calculation_point = math::max(_rtl_alt, _global_pos_sub.get().alt); + } + + } else { + altitude_at_calculation_point = _global_pos_sub.get().alt; + } + + while (start_item_index < _mission.count && start_item_index >= 0) { + int32_t next_mission_item_index; + size_t num_found_items{0U}; + getNextPositionItems(start_item_index, &next_mission_item_index, num_found_items, 1U); + + if (num_found_items > 0U) { + mission_item_s next_position_mission_item; + const dm_item_t dataman_id = static_cast(_mission.mission_dataman_id); + bool success = _dataman_cache.loadWait(dataman_id, next_mission_item_index, + reinterpret_cast(&next_position_mission_item), sizeof(next_position_mission_item), MAX_DATAMAN_LOAD_WAIT); + + if (!success) { + // Could not load the mission item, mark time estimate as invalid. + _rtl_time_estimator.reset(); + break; + } + + switch (next_position_mission_item.nav_cmd) { + case NAV_CMD_LOITER_UNLIMITED: { + _rtl_time_estimator.reset(); + break; + } + + case NAV_CMD_LOITER_TIME_LIMIT: { + // Go to loiter + matrix::Vector2f direction{}; + get_vector_to_next_waypoint(hor_position_at_calculation_point(0), hor_position_at_calculation_point(1), + next_position_mission_item.lat, next_position_mission_item.lon, &direction(0), &direction(1)); + + float hor_dist = get_distance_to_next_waypoint(hor_position_at_calculation_point(0), + hor_position_at_calculation_point(1), next_position_mission_item.lat, next_position_mission_item.lon); + + _rtl_time_estimator.addDistance(hor_dist, direction, 0.f); + + // add time + _rtl_time_estimator.addWait(next_position_mission_item.time_inside); + break; + } + + case NAV_CMD_LOITER_TO_ALT: { + // Go to point horizontally + matrix::Vector2f direction{}; + get_vector_to_next_waypoint(hor_position_at_calculation_point(0), hor_position_at_calculation_point(1), + next_position_mission_item.lat, next_position_mission_item.lon, &direction(0), &direction(1)); + + float hor_dist = get_distance_to_next_waypoint(hor_position_at_calculation_point(0), + hor_position_at_calculation_point(1), next_position_mission_item.lat, next_position_mission_item.lon); + + _rtl_time_estimator.addDistance(hor_dist, direction, 0.f); + + // Add the vertical loiter + _rtl_time_estimator.addVertDistance(get_absolute_altitude_for_item(next_position_mission_item) - + altitude_at_calculation_point); + + break; + } + + case NAV_CMD_LAND: // Fallthrough + case NAV_CMD_VTOL_LAND: { + + matrix::Vector2f direction{}; + get_vector_to_next_waypoint(hor_position_at_calculation_point(0), hor_position_at_calculation_point(1), + next_position_mission_item.lat, next_position_mission_item.lon, &direction(0), &direction(1)); + + float hor_dist = get_distance_to_next_waypoint(hor_position_at_calculation_point(0), + hor_position_at_calculation_point(1), next_position_mission_item.lat, next_position_mission_item.lon); + + // For fixed wing, add diagonal line + if ((_vehicle_status_sub.get().vehicle_type != vehicle_status_s::VEHICLE_TYPE_FIXED_WING) + && (!_vehicle_status_sub.get().is_vtol)) { + + + _rtl_time_estimator.addDistance(hor_dist, direction, + get_absolute_altitude_for_item(next_position_mission_item) - altitude_at_calculation_point); + + } else { + // For VTOL, Rotary, go there horizontally first, then land + _rtl_time_estimator.addDistance(hor_dist, direction, 0.f); + + _rtl_time_estimator.addDescendMCLand(get_absolute_altitude_for_item(next_position_mission_item) - + altitude_at_calculation_point); + } + + break; + } + + default: { + // Default assume can go to the location directly + matrix::Vector2f direction{}; + get_vector_to_next_waypoint(hor_position_at_calculation_point(0), hor_position_at_calculation_point(1), + next_position_mission_item.lat, next_position_mission_item.lon, &direction(0), &direction(1)); + + float hor_dist = get_distance_to_next_waypoint(hor_position_at_calculation_point(0), + hor_position_at_calculation_point(1), next_position_mission_item.lat, next_position_mission_item.lon); + + _rtl_time_estimator.addDistance(hor_dist, direction, + get_absolute_altitude_for_item(next_position_mission_item) - altitude_at_calculation_point); + break; + } + } + + start_item_index = next_mission_item_index + 1; + hor_position_at_calculation_point(0) = next_position_mission_item.lat; + hor_position_at_calculation_point(1) = next_position_mission_item.lon; + altitude_at_calculation_point = get_absolute_altitude_for_item(next_position_mission_item); + + + } else { + start_item_index = -1; + } + } + } + } + + return _rtl_time_estimator.getEstimate(); +} + +bool RtlDirectMissionLand::checkNeedsToClimb() +{ + bool needs_climbing{false}; + + if ((_global_pos_sub.get().alt < _rtl_alt) || _enforce_rtl_alt) { + + // If lower than return altitude, climb up first. + // If enforce_rtl_alt is true then forcing altitude change even if above. + needs_climbing = true; + + } - return time_estimate; + return needs_climbing; } diff --git a/src/modules/navigator/rtl_direct_mission_land.h b/src/modules/navigator/rtl_direct_mission_land.h index 5edeafc71e5d..9bfdd620c4a4 100644 --- a/src/modules/navigator/rtl_direct_mission_land.h +++ b/src/modules/navigator/rtl_direct_mission_land.h @@ -43,6 +43,8 @@ #include "rtl_base.h" +#include + #include #include #include @@ -56,6 +58,7 @@ class RtlDirectMissionLand : public RtlBase ~RtlDirectMissionLand() = default; void on_activation() override; + void on_inactive() override; rtl_time_estimate_s calc_rtl_time_estimate() override; @@ -65,8 +68,12 @@ class RtlDirectMissionLand : public RtlBase private: bool setNextMissionItem() override; void setActiveMissionItems() override; + void updateDatamanCache() override; + bool checkNeedsToClimb(); bool _needs_climbing{false}; //< Flag if climbing is required at the start bool _enforce_rtl_alt{false}; float _rtl_alt{0.0f}; ///< AMSL altitude at which the vehicle should return to the land position + + RtlTimeEstimator _rtl_time_estimator; }; diff --git a/src/modules/px4iofirmware/mixer.cpp b/src/modules/px4iofirmware/mixer.cpp index 9fc40dcbde5c..db6e14844a29 100644 --- a/src/modules/px4iofirmware/mixer.cpp +++ b/src/modules/px4iofirmware/mixer.cpp @@ -180,15 +180,19 @@ mixer_tick() * Run the mixers. */ if (source == MIX_FAILSAFE) { - /* copy failsafe values to the servo outputs */ + // Set failsafe value if the PWM output isn't disabled for (unsigned i = 0; i < PX4IO_SERVO_COUNT; i++) { - r_page_servos[i] = r_page_servo_failsafe[i]; + if (r_page_servos[i] != 0) { + r_page_servos[i] = r_page_servo_failsafe[i]; + } } } else if (source == MIX_DISARMED) { - /* copy disarmed values to the servo outputs */ + // Set disarmed value if the PWM output isn't disabled for (unsigned i = 0; i < PX4IO_SERVO_COUNT; i++) { - r_page_servos[i] = r_page_servo_disarmed[i]; + if (r_page_servos[i] != 0) { + r_page_servos[i] = r_page_servo_disarmed[i]; + } } } diff --git a/src/modules/sensors/vehicle_acceleration/VehicleAcceleration.cpp b/src/modules/sensors/vehicle_acceleration/VehicleAcceleration.cpp index 05373e0e22d4..938e926a616f 100644 --- a/src/modules/sensors/vehicle_acceleration/VehicleAcceleration.cpp +++ b/src/modules/sensors/vehicle_acceleration/VehicleAcceleration.cpp @@ -231,9 +231,12 @@ void VehicleAcceleration::Run() } // process all outstanding messages + int sensor_sub_updates = 0; sensor_accel_s sensor_data; - while (_sensor_sub.update(&sensor_data)) { + while ((sensor_sub_updates < sensor_accel_s::ORB_QUEUE_LENGTH) && _sensor_sub.update(&sensor_data)) { + sensor_sub_updates++; + const Vector3f accel_raw{sensor_data.x, sensor_data.y, sensor_data.z}; if (accel_raw.isAllFinite()) { diff --git a/src/modules/sensors/vehicle_air_data/VehicleAirData.cpp b/src/modules/sensors/vehicle_air_data/VehicleAirData.cpp index d8654c4071ad..c18d670cfc44 100644 --- a/src/modules/sensors/vehicle_air_data/VehicleAirData.cpp +++ b/src/modules/sensors/vehicle_air_data/VehicleAirData.cpp @@ -163,9 +163,11 @@ void VehicleAirData::Run() } if (_advertised[uorb_index]) { + int sensor_sub_updates = 0; sensor_baro_s report; - while (_sensor_sub[uorb_index].update(&report)) { + while ((sensor_sub_updates < sensor_baro_s::ORB_QUEUE_LENGTH) && _sensor_sub[uorb_index].update(&report)) { + sensor_sub_updates++; if (_calibration[uorb_index].device_id() != report.device_id) { _calibration[uorb_index].set_device_id(report.device_id); diff --git a/src/modules/sensors/vehicle_angular_velocity/VehicleAngularVelocity.cpp b/src/modules/sensors/vehicle_angular_velocity/VehicleAngularVelocity.cpp index f2b0d3540b7d..b1eac451529a 100644 --- a/src/modules/sensors/vehicle_angular_velocity/VehicleAngularVelocity.cpp +++ b/src/modules/sensors/vehicle_angular_velocity/VehicleAngularVelocity.cpp @@ -822,9 +822,12 @@ void VehicleAngularVelocity::Run() if (_fifo_available) { // process all outstanding fifo messages + int sensor_sub_updates = 0; sensor_gyro_fifo_s sensor_fifo_data; - while (_sensor_gyro_fifo_sub.update(&sensor_fifo_data)) { + while ((sensor_sub_updates < sensor_gyro_fifo_s::ORB_QUEUE_LENGTH) && _sensor_gyro_fifo_sub.update(&sensor_fifo_data)) { + sensor_sub_updates++; + const float inverse_dt_s = 1e6f / sensor_fifo_data.dt; const int N = sensor_fifo_data.samples; static constexpr int FIFO_SIZE_MAX = sizeof(sensor_fifo_data.x) / sizeof(sensor_fifo_data.x[0]); @@ -863,9 +866,12 @@ void VehicleAngularVelocity::Run() } else { // process all outstanding messages + int sensor_sub_updates = 0; sensor_gyro_s sensor_data; - while (_sensor_sub.update(&sensor_data)) { + while ((sensor_sub_updates < sensor_gyro_s::ORB_QUEUE_LENGTH) && _sensor_sub.update(&sensor_data)) { + sensor_sub_updates++; + if (Vector3f(sensor_data.x, sensor_data.y, sensor_data.z).isAllFinite()) { if (_timestamp_sample_last == 0 || (sensor_data.timestamp_sample <= _timestamp_sample_last)) { diff --git a/src/modules/sensors/vehicle_imu/VehicleIMU.cpp b/src/modules/sensors/vehicle_imu/VehicleIMU.cpp index 2e50a9460852..f5b73434969d 100644 --- a/src/modules/sensors/vehicle_imu/VehicleIMU.cpp +++ b/src/modules/sensors/vehicle_imu/VehicleIMU.cpp @@ -194,7 +194,12 @@ void VehicleIMU::Run() // reset data gap monitor _data_gap = false; - while (_sensor_gyro_sub.updated() || _sensor_accel_sub.updated()) { + int sensor_sub_updates = 0; + + while ((_sensor_gyro_sub.updated() || _sensor_accel_sub.updated()) + && (sensor_sub_updates < math::max(sensor_accel_s::ORB_QUEUE_LENGTH, sensor_gyro_s::ORB_QUEUE_LENGTH))) { + sensor_sub_updates++; + bool updated = false; bool consume_all_gyro = !_intervals_configured || _data_gap; @@ -222,11 +227,16 @@ void VehicleIMU::Run() // update accel until integrator ready and caught up to gyro + int sensor_accel_sub_updates = 0; + while (_sensor_accel_sub.updated() + && (sensor_accel_sub_updates < sensor_accel_s::ORB_QUEUE_LENGTH) && (!_accel_integrator.integral_ready() || !_intervals_configured || _data_gap || (_accel_timestamp_sample_last < (_gyro_timestamp_sample_last - 0.5f * _accel_interval_us))) ) { + sensor_accel_sub_updates++; + if (UpdateAccel()) { updated = true; } diff --git a/src/modules/sensors/vehicle_magnetometer/VehicleMagnetometer.cpp b/src/modules/sensors/vehicle_magnetometer/VehicleMagnetometer.cpp index 6bb7c5ef5b2c..df90ffdf9006 100644 --- a/src/modules/sensors/vehicle_magnetometer/VehicleMagnetometer.cpp +++ b/src/modules/sensors/vehicle_magnetometer/VehicleMagnetometer.cpp @@ -461,9 +461,11 @@ void VehicleMagnetometer::Run() } if (_advertised[uorb_index]) { + int sensor_mag_updates = 0; sensor_mag_s report; - while (_sensor_sub[uorb_index].update(&report)) { + while ((sensor_mag_updates < sensor_mag_s::ORB_QUEUE_LENGTH) && _sensor_sub[uorb_index].update(&report)) { + sensor_mag_updates++; if (_calibration[uorb_index].device_id() != report.device_id) { _calibration[uorb_index].set_device_id(report.device_id); diff --git a/src/modules/uxrce_dds_client/dds_topics.h.em b/src/modules/uxrce_dds_client/dds_topics.h.em index c664d87a9f7d..cade47b5fdce 100644 --- a/src/modules/uxrce_dds_client/dds_topics.h.em +++ b/src/modules/uxrce_dds_client/dds_topics.h.em @@ -168,7 +168,7 @@ bool RcvTopicsPubs::init(uxrSession *session, uxrStreamId reliable_out_stream_id { @[ for idx, sub in enumerate(subscriptions + subscriptions_multi)]@ { - uint16_t queue_depth = uORB::DefaultQueueSize<@(sub['simple_base_type'])_s>::value * 2; // use a bit larger queue size than internal + uint16_t queue_depth = orb_get_queue_size(ORB_ID(@(sub['simple_base_type']))) * 2; // use a bit larger queue size than internal create_data_reader(session, reliable_out_stream_id, best_effort_in_stream_id, participant_id, @(idx), client_namespace, "@(sub['topic_simple'])", "@(sub['dds_type'])", queue_depth); } @[ end for]@ diff --git a/src/modules/uxrce_dds_client/uxrce_dds_client.cpp b/src/modules/uxrce_dds_client/uxrce_dds_client.cpp index 43a391de1131..1412414b6300 100644 --- a/src/modules/uxrce_dds_client/uxrce_dds_client.cpp +++ b/src/modules/uxrce_dds_client/uxrce_dds_client.cpp @@ -49,10 +49,6 @@ #include #include -#if defined(CONFIG_NET) || defined(__PX4_POSIX) -# define UXRCE_DDS_CLIENT_UDP 1 -#endif - #define STREAM_HISTORY 4 #define BUFFER_SIZE (UXR_CONFIG_SERIAL_TRANSPORT_MTU * STREAM_HISTORY) // MTU==512 by default @@ -60,8 +56,8 @@ using namespace time_literals; -void on_time(uxrSession *session, int64_t current_time, int64_t received_timestamp, int64_t transmit_timestamp, - int64_t originate_timestamp, void *args) +static void on_time(uxrSession *session, int64_t current_time, int64_t received_timestamp, int64_t transmit_timestamp, + int64_t originate_timestamp, void *args) { // latest round trip time (RTT) int64_t rtt = current_time - originate_timestamp; @@ -80,21 +76,15 @@ void on_time(uxrSession *session, int64_t current_time, int64_t received_timesta } } -void on_time_no_sync(uxrSession *session, int64_t current_time, int64_t received_timestamp, int64_t transmit_timestamp, - int64_t originate_timestamp, void *args) +static void on_time_no_sync(uxrSession *session, int64_t current_time, int64_t received_timestamp, + int64_t transmit_timestamp, + int64_t originate_timestamp, void *args) { session->time_offset = 0; } - -void on_request( - uxrSession *session, - uxrObjectId object_id, - uint16_t request_id, - SampleIdentity *sample_id, - ucdrBuffer *ub, - uint16_t length, - void *args) +static void on_request(uxrSession *session, uxrObjectId object_id, uint16_t request_id, SampleIdentity *sample_id, + ucdrBuffer *ub, uint16_t length, void *args) { (void) request_id; (void) length; @@ -110,66 +100,115 @@ void on_request( UxrceddsClient::UxrceddsClient(Transport transport, const char *device, int baudrate, const char *agent_ip, const char *port, const char *client_namespace) : ModuleParams(nullptr), + _transport(transport), + _baudrate(baudrate), _client_namespace(client_namespace) { - if (transport == Transport::Serial) { + if (device) { + // store serial port name */ + strncpy(_device, device, sizeof(_device) - 1); + } - int fd = -1; +#if defined(UXRCE_DDS_CLIENT_UDP) - for (int attempt = 0; attempt < 3; attempt++) { - fd = open(device, O_RDWR | O_NOCTTY | O_NONBLOCK); + if (agent_ip) { + strncpy(_agent_ip, agent_ip, sizeof(_agent_ip) - 1); + } - if (fd < 0) { - PX4_ERR("open %s failed (%i)", device, errno); - // sleep before trying again - px4_usleep(1_s); + if (port) { + strncpy(_port, port, sizeof(_port) - 1); + } - } else { - break; - } +#endif // UXRCE_DDS_CLIENT_UDP +} + +bool UxrceddsClient::init() +{ + deinit(); + + if (_transport == Transport::Serial) { + int fd = open(_device, O_RDWR | O_NOCTTY | O_NONBLOCK); + + if (fd < 0) { + PX4_ERR("open %s failed (%i)", _device, errno); + return false; } _transport_serial = new uxrSerialTransport(); - if (fd >= 0 && setBaudrate(fd, baudrate) == 0 && _transport_serial) { - // TODO: - uint8_t remote_addr = 0; // Identifier of the Agent in the connection - uint8_t local_addr = 1; // Identifier of the Client in the serial connection + // TODO: + uint8_t remote_addr = 0; // Identifier of the Agent in the connection + uint8_t local_addr = 1; // Identifier of the Client in the serial connection - if (uxr_init_serial_transport(_transport_serial, fd, remote_addr, local_addr)) { - _comm = &_transport_serial->comm; - _fd = fd; + if (_transport_serial + && setBaudrate(fd, _baudrate) + && uxr_init_serial_transport(_transport_serial, fd, remote_addr, local_addr) + ) { + PX4_INFO("init serial %s @ %d baud", _device, _baudrate); - } else { - PX4_ERR("uxr_init_serial_transport failed"); - } + _comm = &_transport_serial->comm; + _fd = fd; + + return true; } - } else if (transport == Transport::Udp) { + PX4_ERR("init serial %s @ %d baud failed", _device, _baudrate); + close(fd); + + delete _transport_serial; + _transport_serial = nullptr; + + return false; + } #if defined(UXRCE_DDS_CLIENT_UDP) + + if (_transport == Transport::Udp) { _transport_udp = new uxrUDPTransport(); - strncpy(_port, port, PORT_MAX_LENGTH - 1); - strncpy(_agent_ip, agent_ip, AGENT_IP_MAX_LENGTH - 1); - if (_transport_udp) { - if (uxr_init_udp_transport(_transport_udp, UXR_IPv4, _agent_ip, _port)) { - _comm = &_transport_udp->comm; - _fd = _transport_udp->platform.poll_fd.fd; + if (_transport_udp && uxr_init_udp_transport(_transport_udp, UXR_IPv4, _agent_ip, _port)) { - } else { - PX4_ERR("uxr_init_udp_transport failed"); - } + PX4_INFO("init UDP agent IP:%s, port:%s", _agent_ip, _port); + + _comm = &_transport_udp->comm; + _fd = _transport_udp->platform.poll_fd.fd; + + return true; + + } else { + PX4_ERR("init UDP agent IP:%s, port:%s failed", _agent_ip, _port); } + } +#endif // UXRCE_DDS_CLIENT_UDP -#else - PX4_ERR("UDP not supported"); -#endif + return false; +} + +void UxrceddsClient::deinit() +{ + if (_fd >= 0) { + close(_fd); + _fd = -1; + } + + if (_transport_serial) { + uxr_close_serial_transport(_transport_serial); + delete _transport_serial; + _transport_serial = nullptr; } - _participant_config = static_cast(_param_uxrce_dds_ptcfg.get()); - _synchronize_timestamps = _param_uxrce_dds_synct.get() > 0; +#if defined(UXRCE_DDS_CLIENT_UDP) + + if (_transport_udp) { + uxr_close_udp_transport(_transport_udp); + delete _transport_udp; + _transport_udp = nullptr; + } + +#endif // UXRCE_DDS_CLIENT_UDP + + _comm = nullptr; } UxrceddsClient::~UxrceddsClient() @@ -184,10 +223,17 @@ UxrceddsClient::~UxrceddsClient() delete _transport_serial; } + perf_free(_loop_perf); + perf_free(_loop_interval_perf); + +#if defined(UXRCE_DDS_CLIENT_UDP) + if (_transport_udp) { uxr_close_udp_transport(_transport_udp); delete _transport_udp; } + +#endif // UXRCE_DDS_CLIENT_UDP } static void fillMessageFormatResponse(const message_format_request_s &message_format_request, @@ -286,11 +332,6 @@ void UxrceddsClient::syncSystemClock(uxrSession *session) void UxrceddsClient::run() { - if (!_comm) { - PX4_ERR("init failed"); - return; - } - _subs = new SendTopicsSubs(); _pubs = new RcvTopicsPubs(); @@ -300,6 +341,17 @@ void UxrceddsClient::run() } while (!should_exit()) { + + while (!should_exit() && !_comm) { + if (!init()) { + // sleep before trying again + px4_usleep(1'000'000); + } + } + + _participant_config = static_cast(_param_uxrce_dds_ptcfg.get()); + _synchronize_timestamps = (_param_uxrce_dds_synct.get() > 0); + bool got_response = false; while (!should_exit() && !got_response) { @@ -419,9 +471,9 @@ void UxrceddsClient::run() } // create VehicleCommand replier - if (num_of_repliers < MAX_NUM_REPLIERS) { + if (_num_of_repliers < MAX_NUM_REPLIERS) { if (add_replier(new VehicleCommandSrv(&session, reliable_out, reliable_in, participant_id, _client_namespace, - num_of_repliers))) { + _num_of_repliers))) { PX4_ERR("replier init failed"); return; } @@ -451,7 +503,7 @@ void UxrceddsClient::run() break; } - px4_usleep(10_ms); + px4_usleep(10'000); } hrt_abstime last_sync_session = 0; @@ -467,45 +519,48 @@ void UxrceddsClient::run() while (!should_exit() && _connected) { - /* Wait for topic updates for max 1000 ms (1sec) */ - int poll = px4_poll(&_subs->fds[0], (sizeof(_subs->fds) / sizeof(_subs->fds[0])), 1000); + perf_begin(_loop_perf); + perf_count(_loop_interval_perf); - /* Handle the poll results */ - if (poll == 0) { - /* Timeout, no updates in selected uorbs */ - continue; - - } else if (poll < 0) { - /* Error */ - if (poll_error_counter < 10 || poll_error_counter % 50 == 0) { - /* Prevent flooding */ - PX4_ERR("ERROR while polling uorbs: %d", poll); - } + int orb_poll_timeout_ms = 10; + + int bytes_available = 0; - poll_error_counter++; - continue; + if (ioctl(_fd, FIONREAD, (unsigned long)&bytes_available) == OK) { + if (bytes_available > 10) { + orb_poll_timeout_ms = 0; + } } - _subs->update(&session, reliable_out, best_effort_out, participant_id, _client_namespace); + /* Wait for topic updates for max 10 ms */ + int poll = px4_poll(_subs->fds, (sizeof(_subs->fds) / sizeof(_subs->fds[0])), orb_poll_timeout_ms); - // check if there are available replies - process_replies(); + /* Handle the poll results */ + if (poll > 0) { + _subs->update(&session, reliable_out, best_effort_out, participant_id, _client_namespace); - // Run the session until we receive no more data or up to a maximum number of iterations. - // The maximum observed number of iterations was 6 (SITL). If we were to run only once, data starts to get - // delayed, causing registered flight modes to time out. - for (int i = 0; i < 10; ++i) { - const uint32_t prev_num_payload_received = _pubs->num_payload_received; - uxr_run_session_timeout(&session, 0); + } else { + if (poll < 0) { + // poll error + if (poll_error_counter < 10 || poll_error_counter % 50 == 0) { + // prevent flooding + PX4_ERR("ERROR while polling uorbs: %d", poll); + } - if (_pubs->num_payload_received == prev_num_payload_received) { - break; + poll_error_counter++; } } + // run session with 0 timeout (non-blocking) + uxr_run_session_timeout(&session, 0); + + // check if there are available replies + process_replies(); + // time sync session if (_synchronize_timestamps && hrt_elapsed_time(&last_sync_session) > 1_s) { - if (uxr_sync_session(&session, 100) && _timesync.sync_converged()) { + + if (uxr_sync_session(&session, 10) && _timesync.sync_converged()) { //PX4_INFO("synchronized with time offset %-5" PRId64 "ns", session.time_offset); last_sync_session = hrt_absolute_time(); @@ -513,6 +568,15 @@ void UxrceddsClient::run() syncSystemClock(&session); } } + + if (!_timesync_converged && _timesync.sync_converged()) { + PX4_INFO("time sync converged"); + + } else if (_timesync_converged && !_timesync.sync_converged()) { + PX4_WARN("time sync no longer converged"); + } + + _timesync_converged = _timesync.sync_converged(); } handleMessageFormatRequest(); @@ -534,27 +598,38 @@ void UxrceddsClient::run() last_status_update = now; } - // Handle ping - if (now - last_ping > 500_ms) { + // Handle ping, unless we're actively sending & receiving payloads successfully + if ((_last_payload_tx_rate > 0) && (_last_payload_rx_rate > 0)) { + _connected = true; + num_pings_missed = 0; last_ping = now; - if (had_ping_reply) { - num_pings_missed = 0; + } else { + if (hrt_elapsed_time(&last_ping) > 1_s) { + last_ping = now; - } else { - ++num_pings_missed; - } + if (had_ping_reply) { + num_pings_missed = 0; + + } else { + ++num_pings_missed; + } - uxr_ping_agent_session(&session, 0, 1); + int timeout_ms = 1'000; // 1 second + uint8_t attempts = 1; + uxr_ping_agent_session(&session, timeout_ms, attempts); - had_ping_reply = false; - } + had_ping_reply = false; + } - if (num_pings_missed > 2) { - PX4_INFO("No ping response, disconnecting"); - _connected = false; + if (num_pings_missed >= 3) { + PX4_INFO("No ping response, disconnecting"); + _connected = false; + } } + perf_end(_loop_perf); + } delete_repliers(); @@ -567,7 +642,7 @@ void UxrceddsClient::run() } } -int UxrceddsClient::setBaudrate(int fd, unsigned baud) +bool UxrceddsClient::setBaudrate(int fd, unsigned baud) { int speed; @@ -640,7 +715,7 @@ int UxrceddsClient::setBaudrate(int fd, unsigned baud) default: PX4_ERR("ERR: unknown baudrate: %d", baud); - return -EINVAL; + return false; } struct termios uart_config; @@ -688,28 +763,28 @@ int UxrceddsClient::setBaudrate(int fd, unsigned baud) /* set baud rate */ if ((termios_state = cfsetispeed(&uart_config, speed)) < 0) { PX4_ERR("ERR: %d (cfsetispeed)", termios_state); - return -1; + return false; } if ((termios_state = cfsetospeed(&uart_config, speed)) < 0) { PX4_ERR("ERR: %d (cfsetospeed)", termios_state); - return -1; + return false; } if ((termios_state = tcsetattr(fd, TCSANOW, &uart_config)) < 0) { PX4_ERR("ERR: %d (tcsetattr)", termios_state); - return -1; + return false; } - return 0; + return true; } bool UxrceddsClient::add_replier(SrvBase *replier) { - if (num_of_repliers < MAX_NUM_REPLIERS) { - repliers_[num_of_repliers] = replier; + if (_num_of_repliers < MAX_NUM_REPLIERS) { + _repliers[_num_of_repliers] = replier; - num_of_repliers++; + _num_of_repliers++; } return false; @@ -718,11 +793,12 @@ bool UxrceddsClient::add_replier(SrvBase *replier) void UxrceddsClient::process_requests(uxrObjectId object_id, SampleIdentity *sample_id, ucdrBuffer *ub, const int64_t time_offset_us) { - for (uint8_t i = 0; i < num_of_repliers; i++) { - if (object_id.id == repliers_[i]->replier_id_.id - && object_id.type == repliers_[i]->replier_id_.type) { - repliers_[i]->process_request(ub, time_offset_us); - memcpy(&(repliers_[i]->sample_id_), sample_id, sizeof(repliers_[i]->sample_id_)); + for (uint8_t i = 0; i < _num_of_repliers; i++) { + if (object_id.id == _repliers[i]->replier_id_.id + && object_id.type == _repliers[i]->replier_id_.type) { + + _repliers[i]->process_request(ub, time_offset_us); + memcpy(&(_repliers[i]->sample_id_), sample_id, sizeof(_repliers[i]->sample_id_)); break; } } @@ -730,18 +806,19 @@ void UxrceddsClient::process_requests(uxrObjectId object_id, SampleIdentity *sam void UxrceddsClient::process_replies() { - for (uint8_t i = 0; i < num_of_repliers; i++) { - repliers_[i]->process_reply(); + for (uint8_t i = 0; i < _num_of_repliers; i++) { + _repliers[i]->process_reply(); } } void UxrceddsClient::delete_repliers() { - for (uint8_t i = 0; i < num_of_repliers; i++) { - delete (repliers_[i]); + for (uint8_t i = 0; i < _num_of_repliers; i++) { + delete (_repliers[i]); + _repliers[i] = nullptr; } - num_of_repliers = 0; + _num_of_repliers = 0; } int UxrceddsClient::custom_command(int argc, char *argv[]) @@ -790,6 +867,11 @@ int UxrceddsClient::print_status() PX4_INFO("Payload rx: %i B/s", _last_payload_rx_rate); } + PX4_INFO("timesync converged: %s", _timesync.sync_converged() ? "true" : "false"); + + perf_print_counter(_loop_perf); + perf_print_counter(_loop_interval_perf); + return 0; } diff --git a/src/modules/uxrce_dds_client/uxrce_dds_client.h b/src/modules/uxrce_dds_client/uxrce_dds_client.h index b8f38ee76c66..a0c563b27963 100644 --- a/src/modules/uxrce_dds_client/uxrce_dds_client.h +++ b/src/modules/uxrce_dds_client/uxrce_dds_client.h @@ -44,6 +44,12 @@ #include +#include + +#if defined(CONFIG_NET) || defined(__PX4_POSIX) +# define UXRCE_DDS_CLIENT_UDP 1 +#endif + #include "srv_base.h" #define MAX_NUM_REPLIERS 5 @@ -108,7 +114,11 @@ class UxrceddsClient : public ModuleBase, public ModuleParams void delete_repliers(); private: - int setBaudrate(int fd, unsigned baud); + + bool init(); + void deinit(); + + bool setBaudrate(int fd, unsigned baud); void handleMessageFormatRequest(); @@ -118,6 +128,12 @@ class UxrceddsClient : public ModuleBase, public ModuleParams /** Synchronizes the system clock if the time is off by more than 5 seconds */ void syncSystemClock(uxrSession *session); + Transport _transport{}; + + uxrSerialTransport *_transport_serial{nullptr}; + char _device[32] {}; + int _baudrate{}; + const char *_client_namespace; enum class ParticipantConfig { @@ -130,22 +146,22 @@ class UxrceddsClient : public ModuleBase, public ModuleParams // max port characters (5+'\0') static const uint8_t PORT_MAX_LENGTH = 6; + // max agent ip characters (15+'\0') static const uint8_t AGENT_IP_MAX_LENGTH = 16; -#if defined(CONFIG_NET) || defined(__PX4_POSIX) - char _port[PORT_MAX_LENGTH]; - char _agent_ip[AGENT_IP_MAX_LENGTH]; -#endif +#if defined(UXRCE_DDS_CLIENT_UDP) + char _port[PORT_MAX_LENGTH] {}; + char _agent_ip[AGENT_IP_MAX_LENGTH] {}; + uxrUDPTransport *_transport_udp{nullptr}; +#endif // UXRCE_DDS_CLIENT_UDP SendTopicsSubs *_subs{nullptr}; RcvTopicsPubs *_pubs{nullptr}; - SrvBase *repliers_[MAX_NUM_REPLIERS]; - uint8_t num_of_repliers{0}; + SrvBase *_repliers[MAX_NUM_REPLIERS]; + uint8_t _num_of_repliers{0}; - uxrSerialTransport *_transport_serial{nullptr}; - uxrUDPTransport *_transport_udp{nullptr}; uxrCommunication *_comm{nullptr}; int _fd{-1}; @@ -153,8 +169,13 @@ class UxrceddsClient : public ModuleBase, public ModuleParams int _last_payload_rx_rate{}; ///< in B/s bool _connected{false}; + bool _timesync_converged{false}; + Timesync _timesync{timesync_status_s::SOURCE_PROTOCOL_DDS}; + perf_counter_t _loop_perf{perf_alloc(PC_ELAPSED, MODULE_NAME": cycle")}; + perf_counter_t _loop_interval_perf{perf_alloc(PC_INTERVAL, MODULE_NAME": cycle interval")}; + DEFINE_PARAMETERS( (ParamInt) _param_uxrce_dds_dom_id, (ParamInt) _param_uxrce_key, diff --git a/src/modules/uxrce_dds_client/vehicle_command_srv.cpp b/src/modules/uxrce_dds_client/vehicle_command_srv.cpp index aac0bd2c5857..c25d6757d4a9 100644 --- a/src/modules/uxrce_dds_client/vehicle_command_srv.cpp +++ b/src/modules/uxrce_dds_client/vehicle_command_srv.cpp @@ -39,8 +39,7 @@ VehicleCommandSrv::VehicleCommandSrv(uxrSession *session, uxrStreamId reliable_o uxrStreamId input_stream_id, uxrObjectId participant_id, const char *client_namespace, const uint8_t index) : SrvBase(session, reliable_out_stream_id, input_stream_id, participant_id) { - uint16_t queue_depth = uORB::DefaultQueueSize::value * - 2; // use a bit larger queue size than internal + uint16_t queue_depth = orb_get_queue_size(ORB_ID(vehicle_command)) * 2; // use a bit larger queue size than internal create_replier(input_stream_id, participant_id, index, client_namespace, "vehicle_command", "VehicleCommand", queue_depth); }; diff --git a/src/modules/vtol_att_control/standard_params.c b/src/modules/vtol_att_control/standard_params.c index 51b75a159b06..f46f644f181d 100644 --- a/src/modules/vtol_att_control/standard_params.c +++ b/src/modules/vtol_att_control/standard_params.c @@ -48,6 +48,7 @@ * Fixed-wing forward actuators refers to puller/pusher (standard VTOL), or forward-tilt (tiltrotor VTOL). * Only active if demanded down pitch is below VT_PITCH_MIN. * Use VT_FWD_THRUST_SC to tune it. + * Descend mode is treated as Landing too. * * Only active (if enabled) in Altitude, Position and Auto modes, not in Stabilized. * diff --git a/src/modules/vtol_att_control/tiltrotor.cpp b/src/modules/vtol_att_control/tiltrotor.cpp index 6e023da689e3..0956e1003698 100644 --- a/src/modules/vtol_att_control/tiltrotor.cpp +++ b/src/modules/vtol_att_control/tiltrotor.cpp @@ -245,10 +245,8 @@ void Tiltrotor::update_transition_state() if (_param_fw_use_airspd.get() && PX4_ISFINITE(_airspeed_validated->calibrated_airspeed_m_s) && _airspeed_validated->calibrated_airspeed_m_s >= getBlendAirspeed()) { - const float weight = 1.0f - (_airspeed_validated->calibrated_airspeed_m_s - getBlendAirspeed()) / - (getTransitionAirspeed() - getBlendAirspeed()); - _mc_roll_weight = weight; - _mc_yaw_weight = weight; + _mc_roll_weight = 1.0f - (_airspeed_validated->calibrated_airspeed_m_s - getBlendAirspeed()) / + (getTransitionAirspeed() - getBlendAirspeed()); } // without airspeed do timed weight changes @@ -256,7 +254,6 @@ void Tiltrotor::update_transition_state() _time_since_trans_start > getMinimumFrontTransitionTime()) { _mc_roll_weight = 1.0f - (_time_since_trans_start - getMinimumFrontTransitionTime()) / (getOpenLoopFrontTransitionTime() - getMinimumFrontTransitionTime()); - _mc_yaw_weight = _mc_roll_weight; } // add minimum throttle for front transition diff --git a/src/modules/vtol_att_control/vtol_att_control_main.cpp b/src/modules/vtol_att_control/vtol_att_control_main.cpp index eccdf783058c..b464793c99ce 100644 --- a/src/modules/vtol_att_control/vtol_att_control_main.cpp +++ b/src/modules/vtol_att_control/vtol_att_control_main.cpp @@ -206,45 +206,41 @@ void VtolAttitudeControl::quadchute(QuadchuteReason reason) { if (!_vtol_vehicle_status.fixed_wing_system_failure) { + // only publish generic warning through mavlink to safe flash + mavlink_log_critical(&_mavlink_log_pub, "Quad-chute triggered\t"); + switch (reason) { case QuadchuteReason::TransitionTimeout: - mavlink_log_critical(&_mavlink_log_pub, "Quadchute: transition timeout\t"); events::send(events::ID("vtol_att_ctrl_quadchute_tout"), events::Log::Critical, "Quad-chute triggered due to transition timeout"); break; case QuadchuteReason::ExternalCommand: - mavlink_log_critical(&_mavlink_log_pub, "Quadchute: external command\t"); events::send(events::ID("vtol_att_ctrl_quadchute_ext_cmd"), events::Log::Critical, "Quad-chute triggered due to external command"); break; case QuadchuteReason::MinimumAltBreached: - mavlink_log_critical(&_mavlink_log_pub, "Quadchute: minimum altitude breached\t"); events::send(events::ID("vtol_att_ctrl_quadchute_min_alt"), events::Log::Critical, "Quad-chute triggered due to minimum altitude breach"); break; case QuadchuteReason::UncommandedDescent: - mavlink_log_critical(&_mavlink_log_pub, "Quadchute: Uncommanded descent detected\t"); events::send(events::ID("vtol_att_ctrl_quadchute_alt_loss"), events::Log::Critical, "Quad-chute triggered due to uncommanded descent detection"); break; case QuadchuteReason::TransitionAltitudeLoss: - mavlink_log_critical(&_mavlink_log_pub, "Quadchute: loss of altitude during transition\t"); events::send(events::ID("vtol_att_ctrl_quadchute_trans_alt_err"), events::Log::Critical, "Quad-chute triggered due to loss of altitude during transition"); break; case QuadchuteReason::MaximumPitchExceeded: - mavlink_log_critical(&_mavlink_log_pub, "Quadchute: maximum pitch exceeded\t"); events::send(events::ID("vtol_att_ctrl_quadchute_max_pitch"), events::Log::Critical, "Quad-chute triggered due to maximum pitch angle exceeded"); break; case QuadchuteReason::MaximumRollExceeded: - mavlink_log_critical(&_mavlink_log_pub, "Quadchute: maximum roll exceeded\t"); events::send(events::ID("vtol_att_ctrl_quadchute_max_roll"), events::Log::Critical, "Quad-chute triggered due to maximum roll angle exceeded"); break; diff --git a/src/modules/vtol_att_control/vtol_type.cpp b/src/modules/vtol_att_control/vtol_type.cpp index 45f655101d83..808c9c03c2a9 100644 --- a/src/modules/vtol_att_control/vtol_type.cpp +++ b/src/modules/vtol_att_control/vtol_type.cpp @@ -444,16 +444,21 @@ float VtolType::pusher_assist() } + // the vehicle is "landing" if it is in auto mode and the type is set to LAND, and + // "descending" if it is in auto and climb rate controlled but not altitude controlled + const bool vehicle_is_landing_or_descending = _v_control_mode->flag_control_auto_enabled + && ((_attc->get_pos_sp_triplet()->current.valid + && _attc->get_pos_sp_triplet()->current.type == position_setpoint_s::SETPOINT_TYPE_LAND) || + (_v_control_mode->flag_control_climb_rate_enabled && !_v_control_mode->flag_control_altitude_enabled)); + // disable pusher assist depending on setting of forward_thrust_enable_mode: switch (_param_vt_fwd_thrust_en.get()) { case DISABLE: // disable in all modes return 0.0f; break; - case ENABLE_WITHOUT_LAND: // disable in land mode - if (_attc->get_pos_sp_triplet()->current.valid - && _attc->get_pos_sp_triplet()->current.type == position_setpoint_s::SETPOINT_TYPE_LAND - && _v_control_mode->flag_control_auto_enabled) { + case ENABLE_WITHOUT_LAND: // disable in land/descend mode + if (vehicle_is_landing_or_descending) { return 0.0f; } @@ -473,10 +478,8 @@ float VtolType::pusher_assist() break; - case ENABLE_ABOVE_MPC_LAND_ALT1_WITHOUT_LAND: // disable if below MPC_LAND_ALT1 or in land mode - if ((_attc->get_pos_sp_triplet()->current.valid - && _attc->get_pos_sp_triplet()->current.type == position_setpoint_s::SETPOINT_TYPE_LAND - && _v_control_mode->flag_control_auto_enabled) || + case ENABLE_ABOVE_MPC_LAND_ALT1_WITHOUT_LAND: // disable if below MPC_LAND_ALT1 or in land/descend mode + if (vehicle_is_landing_or_descending || (!PX4_ISFINITE(dist_to_ground) || (dist_to_ground < _param_mpc_land_alt1.get()))) { return 0.0f; } @@ -484,9 +487,7 @@ float VtolType::pusher_assist() break; case ENABLE_ABOVE_MPC_LAND_ALT2_WITHOUT_LAND: // disable if below MPC_LAND_ALT2 or in land mode - if ((_attc->get_pos_sp_triplet()->current.valid - && _attc->get_pos_sp_triplet()->current.type == position_setpoint_s::SETPOINT_TYPE_LAND - && _v_control_mode->flag_control_auto_enabled) || + if (vehicle_is_landing_or_descending || (!PX4_ISFINITE(dist_to_ground) || (dist_to_ground < _param_mpc_land_alt2.get()))) { return 0.0f; } @@ -494,10 +495,9 @@ float VtolType::pusher_assist() break; } - // if the thrust scale param is zero or the drone is not in some position or altitude control mode, + // if the thrust scale param is zero or the drone is not in a climb rate controlled mode, // then the pusher-for-pitch strategy is disabled and we can return - if (_param_vt_fwd_thrust_sc.get() < FLT_EPSILON || !(_v_control_mode->flag_control_position_enabled - || _v_control_mode->flag_control_altitude_enabled)) { + if (_param_vt_fwd_thrust_sc.get() < FLT_EPSILON || !(_v_control_mode->flag_control_climb_rate_enabled)) { return 0.0f; } diff --git a/src/modules/zenoh/subscribers/uorb_subscriber.hpp b/src/modules/zenoh/subscribers/uorb_subscriber.hpp index bd16b64398fd..550c1a3f4584 100644 --- a/src/modules/zenoh/subscribers/uorb_subscriber.hpp +++ b/src/modules/zenoh/subscribers/uorb_subscriber.hpp @@ -55,7 +55,7 @@ class uORB_Zenoh_Subscriber : public Zenoh_Subscriber _cdr_ops(ops) { int instance = 0; - _uorb_pub_handle = orb_advertise_multi_queue(_uorb_meta, nullptr, &instance, 1); //FIXME template magic qsize + _uorb_pub_handle = orb_advertise_multi(_uorb_meta, nullptr, &instance); }; ~uORB_Zenoh_Subscriber() override = default; diff --git a/src/systemcmds/netman/netman.cpp b/src/systemcmds/netman/netman.cpp index 1405aca4b17a..b9e653bdfeb1 100644 --- a/src/systemcmds/netman/netman.cpp +++ b/src/systemcmds/netman/netman.cpp @@ -201,7 +201,7 @@ class net_params struct ipv4cfg_s ipcfg; int rv = ipcfg_read(netdev, (FAR struct ipcfg_s *) &ipcfg, AF_INET); - if (rv == -EINVAL || + if (rv == -EINVAL || rv == -ENOENT || (rv == OK && (ipcfg.proto > IPv4PROTO_FALLBACK || ipcfg.ipaddr == 0xffffffff))) { // Build a default ipcfg.ipaddr = HTONL(DEFAULT_IP); diff --git a/src/systemcmds/sd_bench/sd_bench.cpp b/src/systemcmds/sd_bench/sd_bench.cpp index 990932432162..edfaff4f5062 100644 --- a/src/systemcmds/sd_bench/sd_bench.cpp +++ b/src/systemcmds/sd_bench/sd_bench.cpp @@ -50,6 +50,8 @@ #include +#define MAX(a,b) ((a) > (b) ? (a) : (b)) + typedef struct sdb_config { int num_runs; ///< number of runs int run_duration; ///< duration of a single run [ms] @@ -202,6 +204,7 @@ void write_test(int fd, sdb_config_t *cfg, uint8_t *block, int block_size) unsigned int total_blocks = 0; cfg->total_blocks_written = 0; unsigned int *blocknumber = (unsigned int *)(void *)&block[0]; + unsigned int max_max_write_time = 0; for (int run = 0; run < cfg->num_runs; ++run) { hrt_abstime start = hrt_absolute_time(); @@ -245,10 +248,12 @@ void write_test(int fd, sdb_config_t *cfg, uint8_t *block, int block_size) total_elapsed += elapsed; total_blocks += num_blocks; + max_max_write_time = MAX(max_max_write_time, max_write_time); } cfg->total_blocks_written = total_blocks; PX4_INFO(" Avg : %8.2lf KB/s", (double)block_size * total_blocks / total_elapsed / 1024.); + PX4_INFO(" Overall max write time: %i ms", max_max_write_time); } int read_test(int fd, sdb_config_t *cfg, uint8_t *block, int block_size)