diff --git a/.github/workflows/cygwin_build.yml b/.github/workflows/cygwin_build.yml index f836b9c09a..c2e00b051c 100644 --- a/.github/workflows/cygwin_build.yml +++ b/.github/workflows/cygwin_build.yml @@ -202,6 +202,7 @@ jobs: PATH: /usr/bin:$(cygpath ${SYSTEMROOT})/system32 shell: C:\cygwin\bin\bash.exe -eo pipefail '{0}' run: >- + git config --global --add safe.directory /cygdrive/d/a/${GITHUB_REPOSITORY#$GITHUB_REPOSITORY_OWNER/}/${GITHUB_REPOSITORY#$GITHUB_REPOSITORY_OWNER/} && export PATH=/usr/local/bin:/usr/bin:$(cygpath ${SYSTEMROOT})/system32 && source ~/ccache.conf && Tools/scripts/cygwin_build.sh && diff --git a/.github/workflows/macos_build.yml b/.github/workflows/macos_build.yml index 7dba405b03..dd9dc96483 100644 --- a/.github/workflows/macos_build.yml +++ b/.github/workflows/macos_build.yml @@ -188,5 +188,7 @@ jobs: echo $PATH ./waf configure --board ${{matrix.config}} ./waf + ./waf configure --board ${{matrix.config}} --debug + ./waf ccache -s ccache -z diff --git a/.github/workflows/qurt_build.yml b/.github/workflows/qurt_build.yml new file mode 100644 index 0000000000..debf75c7f3 --- /dev/null +++ b/.github/workflows/qurt_build.yml @@ -0,0 +1,172 @@ +name: QURT Build + +on: + push: + paths-ignore: + # remove other vehicles + - 'AntennaTracker/**' + - 'Blimp/**' + # remove non SITL HAL + - 'libraries/AP_HAL_ChibiOS/**' + - 'libraries/AP_HAL_ESP32/**' + # remove non SITL directories + - 'Tools/AP_Bootloader/**' + - 'Tools/AP_Periph/**' + - 'Tools/CHDK-Script/**' + - 'Tools/CPUInfo/**' + - 'Tools/CodeStyle/**' + - 'Tools/FilterTestTool/**' + - 'Tools/Frame_params/**' + - 'Tools/GIT_Test/**' + - 'Tools/Hello/**' + - 'Tools/IO_Firmware/**' + - 'Tools/Linux_HAL_Essentials/**' + - 'Tools/LogAnalyzer/**' + - 'Tools/Pozyx/**' + - 'Tools/PrintVersion.py' + - 'Tools/Replay/**' + - 'Tools/UDP_Proxy/**' + - 'Tools/Vicon/**' + - 'Tools/bootloaders/**' + - 'Tools/completion/**' + - 'Tools/debug/**' + - 'Tools/environment_install/**' + - 'Tools/geotag/**' + - 'Tools/gittools/**' + - 'Tools/mavproxy_modules/**' + - 'Tools/simulink/**' + - 'Tools/vagrant/**' + # Discard python file from Tools/scripts as not used + - 'Tools/scripts/**.py' + - 'Tools/scripts/build_sizes/**' + - 'Tools/scripts/build_tests/**' + - 'Tools/scripts/CAN/**' + - 'Tools/scripts/signing/**' + # Remove autotest + - 'Tools/autotest/**' + # Remove markdown files as irrelevant + - '**.md' + # Remove dotfile at root directory + - './.dir-locals.el' + - './.dockerignore' + - './.editorconfig' + - './.flake8' + - './.gitattributes' + - './.github' + - './.gitignore' + - './.pre-commit-config.yaml' + - './.pydevproject' + - './.valgrind-suppressions' + - './.valgrindrc' + - 'Dockerfile' + - 'Vagrantfile' + - 'Makefile' + # Remove some directories check + - '.vscode/**' + - '.github/ISSUE_TEMPLATE/**' + # Remove change on other workflows + - '.github/workflows/test_environment.yml' + + pull_request: + paths-ignore: + # remove other vehicles + - 'AntennaTracker/**' + - 'Blimp/**' + # remove non SITL HAL + - 'libraries/AP_HAL_ChibiOS/**' + - 'libraries/AP_HAL_ESP32/**' + # remove non SITL directories + - 'Tools/AP_Bootloader/**' + - 'Tools/AP_Periph/**' + - 'Tools/bootloaders/**' + - 'Tools/CHDK-Script/**' + - 'Tools/CodeStyle/**' + - 'Tools/completion/**' + - 'Tools/CPUInfo/**' + - 'Tools/debug/**' + - 'Tools/environment_install/**' + - 'Tools/FilterTestTool/**' + - 'Tools/Frame_params/**' + - 'Tools/geotag/**' + - 'Tools/GIT_Test/**' + - 'Tools/gittools/**' + - 'Tools/Hello/**' + - 'Tools/IO_Firmware/**' + - 'Tools/Linux_HAL_Essentials/**' + - 'Tools/LogAnalyzer/**' + - 'Tools/mavproxy_modules/**' + - 'Tools/Pozyx/**' + - 'Tools/PrintVersion.py' + - 'Tools/Replay/**' + - 'Tools/simulink/**' + - 'Tools/UDP_Proxy/**' + - 'Tools/vagrant/**' + - 'Tools/Vicon/**' + # Discard python file from Tools/scripts as not used + - 'Tools/scripts/**.py' + - 'Tools/scripts/build_sizes/**' + - 'Tools/scripts/build_tests/**' + - 'Tools/scripts/CAN/**' + - 'Tools/scripts/signing/**' + # Remove autotest + - 'Tools/autotest/**' + # Remove markdown files as irrelevant + - '**.md' + # Remove dotfile at root directory + - './.dir-locals.el' + - './.dockerignore' + - './.editorconfig' + - './.flake8' + - './.gitattributes' + - './.github' + - './.gitignore' + - './.pre-commit-config.yaml' + - './.pydevproject' + - './.valgrind-suppressions' + - './.valgrindrc' + - 'Dockerfile' + - 'Vagrantfile' + - 'Makefile' + # Remove some directories check + - '.vscode/**' + - '.github/ISSUE_TEMPLATE/**' + # Remove change on other workflows + - '.github/workflows/test_environment.yml' + + workflow_dispatch: + +concurrency: + group: ci-${{github.workflow}}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + if: github.repository == 'ArduPilot/ardupilot' + runs-on: 'ardupilot-qurt' + steps: + - uses: actions/checkout@v4 + with: + submodules: 'recursive' + + - name: Build QURT + run: | + ./waf configure --board QURT + ./waf copter + ./waf plane + ./waf rover + cp -a build/QURT/bin/arducopter build/QURT/ArduPilot.so + cp -a build/QURT/bin/arducopter build/QURT/ArduPilot_Copter.so + cp -a build/QURT/bin/arduplane build/QURT/ArduPilot_Plane.so + cp -a build/QURT/bin/ardurover build/QURT/ArduPilot_Rover.so + + - name: Archive build + uses: actions/upload-artifact@v3 + with: + name: qurt-binaries + path: | + build/QURT/ardupilot + build/QURT/ArduPilot_Copter.so + build/QURT/ArduPilot_Plane.so + build/QURT/ArduPilot_Rover.so + build/QURT/ArduPilot.so + retention-days: 7 diff --git a/.github/workflows/test_environment.yml b/.github/workflows/test_environment.yml index 2d5d520509..1442f2baa8 100644 --- a/.github/workflows/test_environment.yml +++ b/.github/workflows/test_environment.yml @@ -79,7 +79,7 @@ jobs: with: submodules: 'recursive' - name: test install environment ${{matrix.os}}.${{matrix.name}} - timeout-minutes: 45 + timeout-minutes: 60 env: DISABLE_MAVNATIVE: True DEBIAN_FRONTEND: noninteractive @@ -103,7 +103,7 @@ jobs: *"archlinux"*) cp /etc/skel/.bashrc /root cp /etc/skel/.bashrc /github/home - git config --global --add safe.directory /__w/ardupilot/ardupilot + git config --global --add safe.directory ${GITHUB_WORKSPACE} Tools/environment_install/install-prereqs-arch.sh -qy ;; esac @@ -123,6 +123,7 @@ jobs: ./waf rover - name: test build Chibios ${{matrix.os}}.${{matrix.name}} + if: matrix.os != 'alpine' env: DISABLE_MAVNATIVE: True DEBIAN_FRONTEND: noninteractive @@ -141,3 +142,38 @@ jobs: git config --global --add safe.directory /__w/ardupilot/ardupilot ./waf configure --board CubeOrange ./waf plane + + build-alpine: # special case for alpine as it doesn't have bash by default + runs-on: ubuntu-22.04 + container: + image: alpine:latest + options: --privileged + steps: + - name: Install Git + timeout-minutes: 30 + env: + DEBIAN_FRONTEND: noninteractive + TZ: Europe/Paris + run: | + apk update && apk add --no-cache git + - uses: actions/checkout@v4 + with: + submodules: 'recursive' + - name: test install environment alpine + timeout-minutes: 60 + env: + DISABLE_MAVNATIVE: True + TZ: Europe/Paris + SKIP_AP_GIT_CHECK: 1 + run: | + PATH="/github/home/.local/bin:$PATH" + Tools/environment_install/install-prereqs-alpine.sh + - name: test build STIL alpine + env: + DISABLE_MAVNATIVE: True + TZ: Europe/Paris + run: | + git config --global --add safe.directory ${GITHUB_WORKSPACE} + git config --global --add safe.directory /__w/ardupilot/ardupilot + ./waf configure + ./waf rover \ No newline at end of file diff --git a/.github/workflows/test_scripts.yml b/.github/workflows/test_scripts.yml index b2e0c7bc6d..94559a422a 100644 --- a/.github/workflows/test_scripts.yml +++ b/.github/workflows/test_scripts.yml @@ -30,4 +30,5 @@ jobs: CI_BUILD_TARGET: ${{matrix.config}} shell: bash run: | + git config --global --add safe.directory ${GITHUB_WORKSPACE} Tools/scripts/build_ci.sh diff --git a/AntennaTracker/GCS_Mavlink.cpp b/AntennaTracker/GCS_Mavlink.cpp index c99d22bb0d..2a7a6745f3 100644 --- a/AntennaTracker/GCS_Mavlink.cpp +++ b/AntennaTracker/GCS_Mavlink.cpp @@ -289,7 +289,9 @@ static const ap_message STREAM_RAW_CONTROLLER_msgs[] = { }; static const ap_message STREAM_RC_CHANNELS_msgs[] = { MSG_RC_CHANNELS, +#if AP_MAVLINK_MSG_RC_CHANNELS_RAW_ENABLED MSG_RC_CHANNELS_RAW, // only sent on a mavlink1 connection +#endif }; static const ap_message STREAM_EXTRA1_msgs[] = { MSG_ATTITUDE, diff --git a/AntennaTracker/ReleaseNotes.txt b/AntennaTracker/ReleaseNotes.txt index bd8fbaa308..21161d33da 100644 --- a/AntennaTracker/ReleaseNotes.txt +++ b/AntennaTracker/ReleaseNotes.txt @@ -1,5 +1,53 @@ Antenna Tracker Release Notes: ------------------------------- +------------------------------------------------------------------ +Release 4.5.5 1st Aug 2024 + +No changes from 4.5.5-beta2 +------------------------------------------------------------------ +Release 4.5.5-beta2 27 July 2024 + +Changes from 4.5.5-beta1 + +1) Board specific enhancements and bug fixes + +- CubeRed's second core disabled at boot to avoid spurious writes to RAM +- CubeRed bootloader's dual endpoint update method fixed +------------------------------------------------------------------ +Release 4.5.5-beta1 1st July 2024 + +Changes from 4.5.4 + +1) Board specific enhancements and bug fixes + +- fixed IOMCU transmission errors when using bdshot +- update relay parameter names on various boards +- add ASP5033 airspeed in minimal builds +- added RadiolinkPIX6 +- fix Aocoda-RC H743Dual motor issue +- use ICM45686 as an ICM20649 alternative in CubeRedPrimary + +2) System level minor enhancements and bug fixes + +- correct use-after-free in script statistics +- added arming check for eeprom full +- fixed a block logging issue which caused log messages to be dropped +- enable Socket SO_REUSEADDR on LwIP +- removed IST8310 overrun message +- added Siyi ZT6 support +- added BTFL sidebar symbols to the OSD +- added CRSF extended link stats to the OSD +- use the ESC with the highest RPM in the OSD when only one can be displayed +- support all Tramp power levels on high power VTXs +- emit jump count in missions even if no limit +- improve the bitmask indicating persistent parameters on bootloader flash +- fix duplicate error condition in the MicroStrain7 + +5) Other minor enhancements and bug fixes + +- specify pymonocypher version in more places +- added DroneCAN dependencies to custom builds + +------------------------------------------------------------------ Release 4.5.4 12th June 2024 Changes from 4.5.3 diff --git a/AntennaTracker/config.h b/AntennaTracker/config.h index fd2932550d..0875e1d8d9 100644 --- a/AntennaTracker/config.h +++ b/AntennaTracker/config.h @@ -3,14 +3,6 @@ #include "defines.h" -// Just so that it's completely clear... -#define ENABLED 1 -#define DISABLED 0 - -// this avoids a very common config error -#define ENABLE ENABLED -#define DISABLE DISABLED - #ifndef MAV_SYSTEM_ID // use 2 for antenna tracker by default # define MAV_SYSTEM_ID 2 diff --git a/ArduCopter/APM_Config.h b/ArduCopter/APM_Config.h index 3049e75818..0f1bee348f 100644 --- a/ArduCopter/APM_Config.h +++ b/ArduCopter/APM_Config.h @@ -4,8 +4,6 @@ //#define LOGGING_ENABLED DISABLED // disable logging to save 11K of flash space //#define MOUNT DISABLED // disable the camera gimbal to save 8K of flash space //#define AUTOTUNE_ENABLED DISABLED // disable the auto tune functionality to save 7k of flash -//#define RANGEFINDER_ENABLED DISABLED // disable rangefinder to save 1k of flash -//#define PARACHUTE DISABLED // disable parachute release to save 1k of flash //#define NAV_GUIDED DISABLED // disable external navigation computer ability to control vehicle through MAV_CMD_NAV_GUIDED mission commands //#define MODE_ACRO_ENABLED DISABLED // disable acrobatic mode support //#define MODE_AUTO_ENABLED DISABLED // disable auto mode support diff --git a/ArduCopter/AP_Arming.cpp b/ArduCopter/AP_Arming.cpp index e233180d34..eecef0394c 100644 --- a/ArduCopter/AP_Arming.cpp +++ b/ArduCopter/AP_Arming.cpp @@ -238,11 +238,15 @@ bool AP_Arming_Copter::parameter_checks(bool display_failure) } #else - if (copter.g2.frame_class.get() == AP_Motors::MOTOR_FRAME_HELI_QUAD || - copter.g2.frame_class.get() == AP_Motors::MOTOR_FRAME_HELI_DUAL || - copter.g2.frame_class.get() == AP_Motors::MOTOR_FRAME_HELI) { + switch (copter.g2.frame_class.get()) { + case AP_Motors::MOTOR_FRAME_HELI_QUAD: + case AP_Motors::MOTOR_FRAME_HELI_DUAL: + case AP_Motors::MOTOR_FRAME_HELI: check_failed(ARMING_CHECK_PARAMETERS, display_failure, "Invalid MultiCopter FRAME_CLASS"); return false; + + default: + break; } #endif // HELI_FRAME @@ -257,6 +261,7 @@ bool AP_Arming_Copter::parameter_checks(bool display_failure) return false; break; case AC_WPNav::TerrainSource::TERRAIN_FROM_RANGEFINDER: +#if AP_RANGEFINDER_ENABLED if (!copter.rangefinder_state.enabled || !copter.rangefinder.has_orientation(ROTATION_PITCH_270)) { check_failed(ARMING_CHECK_PARAMETERS, display_failure, failure_template, "no rangefinder"); return false; @@ -266,6 +271,9 @@ bool AP_Arming_Copter::parameter_checks(bool display_failure) check_failed(ARMING_CHECK_PARAMETERS, display_failure, failure_template, "RTL_ALT>RNGFND_MAX_CM"); return false; } +#else + check_failed(ARMING_CHECK_PARAMETERS, display_failure, failure_template, "rangefinder not in firmware"); +#endif break; case AC_WPNav::TerrainSource::TERRAIN_FROM_TERRAINDATABASE: // these checks are done in AP_Arming @@ -337,10 +345,10 @@ bool AP_Arming_Copter::gps_checks(bool display_failure) { // check if fence requires GPS bool fence_requires_gps = false; - #if AP_FENCE_ENABLED +#if AP_FENCE_ENABLED // if circular or polygon fence is enabled we need GPS fence_requires_gps = (copter.fence.get_enabled_fences() & (AC_FENCE_TYPE_CIRCLE | AC_FENCE_TYPE_POLYGON)) > 0; - #endif +#endif // check if flight mode requires GPS bool mode_requires_gps = copter.flightmode->requires_GPS() || fence_requires_gps || (copter.simple_mode == Copter::SimpleMode::SUPERSIMPLE); @@ -439,12 +447,12 @@ bool AP_Arming_Copter::mandatory_gps_checks(bool display_failure) // check if fence requires GPS bool fence_requires_gps = false; - #if AP_FENCE_ENABLED +#if AP_FENCE_ENABLED // if circular or polygon fence is enabled we need GPS fence_requires_gps = (copter.fence.get_enabled_fences() & (AC_FENCE_TYPE_CIRCLE | AC_FENCE_TYPE_POLYGON)) > 0; - #endif +#endif - if (mode_requires_gps) { + if (mode_requires_gps || copter.option_is_enabled(Copter::FlightOption::REQUIRE_POSITION_FOR_ARMING)) { if (!copter.position_ok()) { // vehicle level position estimate checks check_failed(display_failure, "Need Position Estimate"); @@ -597,11 +605,11 @@ bool AP_Arming_Copter::arm_checks(AP_Arming::Method method) // check throttle if (check_enabled(ARMING_CHECK_RC)) { - #if FRAME_CONFIG == HELI_FRAME +#if FRAME_CONFIG == HELI_FRAME const char *rc_item = "Collective"; - #else +#else const char *rc_item = "Throttle"; - #endif +#endif // check throttle is not too high - skips checks if arming from GCS/scripting in Guided,Guided_NoGPS or Auto if (!((AP_Arming::method_is_GCS(method) || method == AP_Arming::Method::SCRIPTING) && (copter.flightmode->mode_number() == Mode::Number::GUIDED || copter.flightmode->mode_number() == Mode::Number::GUIDED_NOGPS || copter.flightmode->mode_number() == Mode::Number::AUTO))) { // above top of deadband is too always high @@ -610,12 +618,12 @@ bool AP_Arming_Copter::arm_checks(AP_Arming::Method method) return false; } // in manual modes throttle must be at zero - #if FRAME_CONFIG != HELI_FRAME +#if FRAME_CONFIG != HELI_FRAME if ((copter.flightmode->has_manual_throttle() || copter.flightmode->mode_number() == Mode::Number::DRIFT) && copter.channel_throttle->get_control_in() > 0) { check_failed(ARMING_CHECK_RC, true, "%s too high", rc_item); return false; } - #endif +#endif } } @@ -801,12 +809,8 @@ bool AP_Arming_Copter::disarm(const AP_Arming::Method method, bool do_disarm_che } #if AUTOTUNE_ENABLED == ENABLED - // save auto tuned parameters - if (copter.flightmode == &copter.mode_autotune) { - copter.mode_autotune.save_tuning_gains(); - } else { - copter.mode_autotune.reset(); - } + // Possibly save auto tuned parameters + copter.mode_autotune.autotune.disarmed(copter.flightmode == &copter.mode_autotune); #endif // we are not in the air diff --git a/ArduCopter/Copter.cpp b/ArduCopter/Copter.cpp index 38aabd23db..56f73753a0 100644 --- a/ArduCopter/Copter.cpp +++ b/ArduCopter/Copter.cpp @@ -164,7 +164,7 @@ const AP_Scheduler::Task Copter::scheduler_tasks[] = { #endif SCHED_TASK(auto_disarm_check, 10, 50, 27), SCHED_TASK(auto_trim, 10, 75, 30), -#if RANGEFINDER_ENABLED == ENABLED +#if AP_RANGEFINDER_ENABLED SCHED_TASK(read_rangefinder, 20, 100, 33), #endif #if HAL_PROXIMITY_ENABLED @@ -446,15 +446,41 @@ bool Copter::has_ekf_failsafed() const return failsafe.ekf; } +// get target location (for use by scripting) +bool Copter::get_target_location(Location& target_loc) +{ + return flightmode->get_wp(target_loc); +} + +/* + update_target_location() acts as a wrapper for set_target_location + */ +bool Copter::update_target_location(const Location &old_loc, const Location &new_loc) +{ + /* + by checking the caller has provided the correct old target + location we prevent a race condition where the user changes mode + or commands a different target in the controlling lua script + */ + Location next_WP_loc; + flightmode->get_wp(next_WP_loc); + if (!old_loc.same_loc_as(next_WP_loc) || + old_loc.get_alt_frame() != new_loc.get_alt_frame()) { + return false; + } + + return set_target_location(new_loc); +} + #endif // AP_SCRIPTING_ENABLED -// returns true if vehicle is landing. Only used by Lua scripts +// returns true if vehicle is landing. bool Copter::is_landing() const { return flightmode->is_landing(); } -// returns true if vehicle is taking off. Only used by Lua scripts +// returns true if vehicle is taking off. bool Copter::is_taking_off() const { return flightmode->is_taking_off(); @@ -552,14 +578,17 @@ void Copter::ten_hz_logging_loop() if (!should_log(MASK_LOG_ATTITUDE_FAST)) { Log_Write_EKF_POS(); } - if (should_log(MASK_LOG_MOTBATT)) { + if ((FRAME_CONFIG == HELI_FRAME) || should_log(MASK_LOG_MOTBATT)) { + // always write motors log if we are a heli motors->Log_Write(); } if (should_log(MASK_LOG_RCIN)) { logger.Write_RCIN(); +#if AP_RSSI_ENABLED if (rssi.enabled()) { logger.Write_RSSI(); } +#endif } if (should_log(MASK_LOG_RCOUT)) { logger.Write_RCOUT(); @@ -579,9 +608,6 @@ void Copter::ten_hz_logging_loop() g2.beacon.log(); #endif } -#if FRAME_CONFIG == HELI_FRAME - Log_Write_Heli(); -#endif #if AP_WINCH_ENABLED if (should_log(MASK_LOG_ANY)) { g2.winch.write_log(); @@ -631,7 +657,7 @@ void Copter::three_hz_loop() // check for deadreckoning failsafe failsafe_deadreckon_check(); - // update ch6 in flight tuning + //update transmitter based in flight tuning tuning(); // check if avoidance should be enabled based on alt diff --git a/ArduCopter/Copter.h b/ArduCopter/Copter.h index eded72ca43..11ea29a1f3 100644 --- a/ArduCopter/Copter.h +++ b/ArduCopter/Copter.h @@ -121,7 +121,7 @@ #if AP_TERRAIN_AVAILABLE # include #endif -#if RANGEFINDER_ENABLED == ENABLED +#if AP_RANGEFINDER_ENABLED # include #endif @@ -258,6 +258,7 @@ private: // helper function to get inertially interpolated rangefinder height. bool get_rangefinder_height_interpolated_cm(int32_t& ret) const; +#if AP_RANGEFINDER_ENABLED class SurfaceTracking { public: @@ -292,6 +293,7 @@ private: bool valid_for_logging; // true if we have a desired target altitude bool reset_target; // true if target should be reset because of change in surface being tracked } surface_tracking; +#endif #if AP_RPM_ENABLED AP_RPM rpm_sensor; @@ -519,7 +521,7 @@ private: #endif // Parachute release -#if PARACHUTE == ENABLED +#if HAL_PARACHUTE_ENABLED AP_Parachute parachute; #endif @@ -626,6 +628,7 @@ private: DISABLE_THRUST_LOSS_CHECK = (1<<0), // 1 DISABLE_YAW_IMBALANCE_WARNING = (1<<1), // 2 RELEASE_GRIPPER_ON_THRUST_LOSS = (1<<2), // 4 + REQUIRE_POSITION_FOR_ARMING = (1<<3), // 8 }; // returns true if option is enabled for this vehicle bool option_is_enabled(FlightOption option) const { @@ -670,6 +673,8 @@ private: #if AP_SCRIPTING_ENABLED #if MODE_GUIDED_ENABLED == ENABLED bool start_takeoff(float alt) override; + bool get_target_location(Location& target_loc) override; + bool update_target_location(const Location &old_loc, const Location &new_loc) override; bool set_target_pos_NED(const Vector3f& target_pos, bool use_yaw, float yaw_deg, bool use_yaw_rate, float yaw_rate_degs, bool yaw_relative, bool terrain_alt) override; bool set_target_posvel_NED(const Vector3f& target_pos, const Vector3f& target_vel) override; bool set_target_posvelaccel_NED(const Vector3f& target_pos, const Vector3f& target_vel, const Vector3f& target_accel, bool use_yaw, float yaw_deg, bool use_yaw_rate, float yaw_rate_degs, bool yaw_relative) override; @@ -825,6 +830,29 @@ private: void set_land_complete(bool b); void set_land_complete_maybe(bool b); void update_throttle_mix(); + bool get_force_flying() const; +#if HAL_LOGGING_ENABLED + enum class LandDetectorLoggingFlag : uint16_t { + LANDED = 1U << 0, + LANDED_MAYBE = 1U << 1, + LANDING = 1U << 2, + STANDBY_ACTIVE = 1U << 3, + WOW = 1U << 4, + RANGEFINDER_BELOW_2M = 1U << 5, + DESCENT_RATE_LOW = 1U << 6, + ACCEL_STATIONARY = 1U << 7, + LARGE_ANGLE_ERROR = 1U << 8, + LARGE_ANGLE_REQUEST = 1U << 8, + MOTOR_AT_LOWER_LIMIT = 1U << 9, + THROTTLE_MIX_AT_MIN = 1U << 10, + }; + struct { + uint32_t last_logged_ms; + uint32_t last_logged_count; + uint16_t last_logged_flags; + } land_detector; + void Log_LDET(uint16_t logging_flags, uint32_t land_detector_count); +#endif #if AP_LANDINGGEAR_ENABLED // landing_gear.cpp @@ -854,9 +882,6 @@ private: void Log_Write_Data(LogDataID id, float value); void Log_Write_Parameter_Tuning(uint8_t param, float tuning_val, float tune_min, float tune_max); void Log_Video_Stabilisation(); -#if FRAME_CONFIG == HELI_FRAME - void Log_Write_Heli(void); -#endif void Log_Write_Guided_Position_Target(ModeGuided::SubMode submode, const Vector3f& pos_target, bool terrain_alt, const Vector3f& vel_target, const Vector3f& accel_target); void Log_Write_Guided_Attitude_Target(ModeGuided::SubMode target_type, float roll, float pitch, float yaw, const Vector3f &ang_vel, float thrust, float climb_rate); void Log_Write_SysID_Setup(uint8_t systemID_axis, float waveform_magnitude, float frequency_start, float frequency_stop, float time_fade_in, float time_const_freq, float time_record, float time_fade_out); diff --git a/ArduCopter/GCS_Copter.cpp b/ArduCopter/GCS_Copter.cpp index 2a5f776b5e..67b49e7cb2 100644 --- a/ArduCopter/GCS_Copter.cpp +++ b/ArduCopter/GCS_Copter.cpp @@ -91,7 +91,7 @@ void GCS_Copter::update_vehicle_sensor_status_flags(void) } #endif -#if RANGEFINDER_ENABLED == ENABLED +#if AP_RANGEFINDER_ENABLED const RangeFinder *rangefinder = RangeFinder::get_singleton(); if (rangefinder && rangefinder->has_orientation(ROTATION_PITCH_270)) { control_sensors_present |= MAV_SYS_STATUS_SENSOR_LASER_POSITION; diff --git a/ArduCopter/GCS_Mavlink.cpp b/ArduCopter/GCS_Mavlink.cpp index 1946f95068..a81ed5a46e 100644 --- a/ArduCopter/GCS_Mavlink.cpp +++ b/ArduCopter/GCS_Mavlink.cpp @@ -531,7 +531,9 @@ static const ap_message STREAM_POSITION_msgs[] = { static const ap_message STREAM_RC_CHANNELS_msgs[] = { MSG_SERVO_OUTPUT_RAW, MSG_RC_CHANNELS, +#if AP_MAVLINK_MSG_RC_CHANNELS_RAW_ENABLED MSG_RC_CHANNELS_RAW, // only sent on a mavlink1 connection +#endif }; static const ap_message STREAM_EXTRA1_msgs[] = { MSG_ATTITUDE, @@ -793,7 +795,7 @@ MAV_RESULT GCS_MAVLINK_Copter::handle_command_int_packet(const mavlink_command_i case MAV_CMD_NAV_VTOL_TAKEOFF: return handle_MAV_CMD_NAV_TAKEOFF(packet); -#if PARACHUTE == ENABLED +#if HAL_PARACHUTE_ENABLED case MAV_CMD_DO_PARACHUTE: return handle_MAV_CMD_DO_PARACHUTE(packet); #endif @@ -971,7 +973,7 @@ MAV_RESULT GCS_MAVLINK_Copter::handle_MAV_CMD_MISSION_START(const mavlink_comman -#if PARACHUTE == ENABLED +#if HAL_PARACHUTE_ENABLED MAV_RESULT GCS_MAVLINK_Copter::handle_MAV_CMD_DO_PARACHUTE(const mavlink_command_int_t &packet) { // configure or release parachute @@ -1217,6 +1219,7 @@ void GCS_MAVLINK_Copter::handle_message_set_attitude_target(const mavlink_messag // ensure thrust field is not ignored if (throttle_ignore) { + // The throttle input is not defined return; } @@ -1235,6 +1238,18 @@ void GCS_MAVLINK_Copter::handle_message_set_attitude_target(const mavlink_messag } } + Vector3f ang_vel_body; + if (!roll_rate_ignore && !pitch_rate_ignore && !yaw_rate_ignore) { + ang_vel_body.x = packet.body_roll_rate; + ang_vel_body.y = packet.body_pitch_rate; + ang_vel_body.z = packet.body_yaw_rate; + } else if (!(roll_rate_ignore && pitch_rate_ignore && yaw_rate_ignore)) { + // The body rates are ill-defined + // input is not valid so stop + copter.mode_guided.init(true); + return; + } + // check if the message's thrust field should be interpreted as a climb rate or as thrust const bool use_thrust = copter.mode_guided.set_attitude_target_provides_thrust(); @@ -1256,18 +1271,7 @@ void GCS_MAVLINK_Copter::handle_message_set_attitude_target(const mavlink_messag } } - Vector3f ang_vel; - if (!roll_rate_ignore) { - ang_vel.x = packet.body_roll_rate; - } - if (!pitch_rate_ignore) { - ang_vel.y = packet.body_pitch_rate; - } - if (!yaw_rate_ignore) { - ang_vel.z = packet.body_yaw_rate; - } - - copter.mode_guided.set_angle(attitude_quat, ang_vel, + copter.mode_guided.set_angle(attitude_quat, ang_vel_body, climb_rate_or_thrust, use_thrust); } diff --git a/ArduCopter/Log.cpp b/ArduCopter/Log.cpp index d1d530ca13..f191a8a395 100644 --- a/ArduCopter/Log.cpp +++ b/ArduCopter/Log.cpp @@ -39,11 +39,15 @@ void Copter::Log_Write_Control_Tuning() target_climb_rate_cms = pos_control->get_vel_target_z_cms(); } - // get surface tracking alts float desired_rangefinder_alt; +#if AP_RANGEFINDER_ENABLED if (!surface_tracking.get_target_dist_for_logging(desired_rangefinder_alt)) { desired_rangefinder_alt = AP::logger().quiet_nan(); } +#else + // get surface tracking alts + desired_rangefinder_alt = AP::logger().quiet_nan(); +#endif struct log_Control_Tuning pkt = { LOG_PACKET_HEADER_INIT(LOG_CONTROL_TUNING_MSG), @@ -56,7 +60,11 @@ void Copter::Log_Write_Control_Tuning() inav_alt : inertial_nav.get_position_z_up_cm() * 0.01f, baro_alt : baro_alt, desired_rangefinder_alt : desired_rangefinder_alt, +#if AP_RANGEFINDER_ENABLED rangefinder_alt : surface_tracking.get_dist_for_logging(), +#else + rangefinder_alt : AP::logger().quiet_nanf(), +#endif terr_alt : terr_alt, target_climb_rate : target_climb_rate_cms, climb_rate : int16_t(inertial_nav.get_velocity_z_up_cms()) // float -> int16_t @@ -301,31 +309,6 @@ void Copter::Log_Write_SysID_Setup(uint8_t systemID_axis, float waveform_magnitu #endif } -#if FRAME_CONFIG == HELI_FRAME -struct PACKED log_Heli { - LOG_PACKET_HEADER; - uint64_t time_us; - float desired_rotor_speed; - float main_rotor_speed; - float governor_output; - float control_output; -}; - -// Write an helicopter packet -void Copter::Log_Write_Heli() -{ - struct log_Heli pkt_heli = { - LOG_PACKET_HEADER_INIT(LOG_HELI_MSG), - time_us : AP_HAL::micros64(), - desired_rotor_speed : motors->get_desired_rotor_speed(), - main_rotor_speed : motors->get_main_rotor_speed(), - governor_output : motors->get_governor_output(), - control_output : motors->get_control_output(), - }; - logger.WriteBlock(&pkt_heli, sizeof(pkt_heli)); -} -#endif - // guided position target logging struct PACKED log_Guided_Position_Target { LOG_PACKET_HEADER; @@ -481,18 +464,6 @@ const struct LogStructure Copter::log_structure[] = { "DU32", "QBI", "TimeUS,Id,Value", "s--", "F--" }, { LOG_DATA_FLOAT_MSG, sizeof(log_Data_Float), "DFLT", "QBf", "TimeUS,Id,Value", "s--", "F--" }, - -// @LoggerMessage: HELI -// @Description: Helicopter related messages -// @Field: TimeUS: Time since system startup -// @Field: DRRPM: Desired rotor speed -// @Field: ERRPM: Estimated rotor speed -// @Field: Gov: Governor Output -// @Field: Throt: Throttle output -#if FRAME_CONFIG == HELI_FRAME - { LOG_HELI_MSG, sizeof(log_Heli), - "HELI", "Qffff", "TimeUS,DRRPM,ERRPM,Gov,Throt", "s----", "F----" , true }, -#endif // @LoggerMessage: SIDD // @Description: System ID data diff --git a/ArduCopter/Parameters.cpp b/ArduCopter/Parameters.cpp index 72c8b01f48..f0e3d6f725 100644 --- a/ArduCopter/Parameters.cpp +++ b/ArduCopter/Parameters.cpp @@ -453,7 +453,7 @@ const AP_Param::Info Copter::var_info[] = { GOBJECT(relay, "RELAY", AP_Relay), #endif -#if PARACHUTE == ENABLED +#if HAL_PARACHUTE_ENABLED // @Group: CHUTE_ // @Path: ../libraries/AP_Parachute/AP_Parachute.cpp GOBJECT(parachute, "CHUTE_", AP_Parachute), @@ -634,11 +634,13 @@ const AP_Param::Info Copter::var_info[] = { GOBJECTN(mode_auto.mission, mission, "MIS_", AP_Mission), #endif +#if AP_RSSI_ENABLED // @Group: RSSI_ // @Path: ../libraries/AP_RSSI/AP_RSSI.cpp GOBJECT(rssi, "RSSI_", AP_RSSI), - -#if RANGEFINDER_ENABLED == ENABLED +#endif + +#if AP_RANGEFINDER_ENABLED // @Group: RNGFND // @Path: ../libraries/AP_RangeFinder/AP_RangeFinder.cpp GOBJECT(rangefinder, "RNGFND", RangeFinder), @@ -1000,11 +1002,11 @@ const AP_Param::GroupInfo ParametersG2::var_info[] = { // @Param: FLIGHT_OPTIONS // @DisplayName: Flight mode options // @Description: Flight mode specific options - // @Bitmask: 0:Disable thrust loss check, 1:Disable yaw imbalance warning, 2:Release gripper on thrust loss + // @Bitmask: 0:Disable thrust loss check, 1:Disable yaw imbalance warning, 2:Release gripper on thrust loss, 3:Require position for arming // @User: Advanced AP_GROUPINFO("FLIGHT_OPTIONS", 44, ParametersG2, flight_options, 0), -#if RANGEFINDER_ENABLED == ENABLED +#if AP_RANGEFINDER_ENABLED // @Param: RNGFND_FILT // @DisplayName: Rangefinder filter // @Description: Rangefinder filter to smooth distance. Set to zero to disable filtering @@ -1028,6 +1030,7 @@ const AP_Param::GroupInfo ParametersG2::var_info[] = { // ACRO_PR_RATE (47), ACRO_Y_RATE (48), PILOT_Y_RATE (49) and PILOT_Y_EXPO (50) moved to command model class +#if AP_RANGEFINDER_ENABLED // @Param: SURFTRAK_MODE // @DisplayName: Surface Tracking Mode // @Description: set which surface to track in surface tracking @@ -1035,6 +1038,7 @@ const AP_Param::GroupInfo ParametersG2::var_info[] = { // @User: Advanced // @RebootRequired: True AP_GROUPINFO("SURFTRAK_MODE", 51, ParametersG2, surftrak_mode, (uint8_t)Copter::SurfaceTracking::Surface::GROUND), +#endif // @Param: FS_DR_ENABLE // @DisplayName: DeadReckon Failsafe Action diff --git a/ArduCopter/Parameters.h b/ArduCopter/Parameters.h index 0e3d8920aa..087c6f9e3d 100644 --- a/ArduCopter/Parameters.h +++ b/ArduCopter/Parameters.h @@ -652,7 +652,7 @@ public: AP_Int32 flight_options; -#if RANGEFINDER_ENABLED == ENABLED +#if AP_RANGEFINDER_ENABLED AP_Float rangefinder_filt; #endif diff --git a/ArduCopter/RC_Channel.cpp b/ArduCopter/RC_Channel.cpp index 02bc8d7bcf..0ae33562a8 100644 --- a/ArduCopter/RC_Channel.cpp +++ b/ArduCopter/RC_Channel.cpp @@ -76,7 +76,8 @@ void RC_Channel_Copter::init_aux_function(const AUX_FUNC ch_option, const AuxSwi // the following functions do not need to be initialised: case AUX_FUNC::ALTHOLD: case AUX_FUNC::AUTO: - case AUX_FUNC::AUTOTUNE: + case AUX_FUNC::AUTOTUNE_MODE: + case AUX_FUNC::AUTOTUNE_TEST_GAINS: case AUX_FUNC::BRAKE: case AUX_FUNC::CIRCLE: case AUX_FUNC::DRIFT: @@ -128,6 +129,7 @@ void RC_Channel_Copter::init_aux_function(const AUX_FUNC ch_option, const AuxSwi case AUX_FUNC::FORCEFLYING: case AUX_FUNC::CUSTOM_CONTROLLER: case AUX_FUNC::WEATHER_VANE_ENABLE: + case AUX_FUNC::TRANSMITTER_TUNING: run_aux_function(ch_option, ch_flag, AuxFuncTriggerSource::INIT); break; default: @@ -258,7 +260,7 @@ bool RC_Channel_Copter::do_aux_function(const AUX_FUNC ch_option, const AuxSwitc break; #endif -#if RANGEFINDER_ENABLED == ENABLED +#if AP_RANGEFINDER_ENABLED case AUX_FUNC::RANGEFINDER: // enable or disable the rangefinder if ((ch_flag == AuxSwitchPos::HIGH) && @@ -290,9 +292,12 @@ bool RC_Channel_Copter::do_aux_function(const AUX_FUNC ch_option, const AuxSwitc #endif #if AUTOTUNE_ENABLED == ENABLED - case AUX_FUNC::AUTOTUNE: + case AUX_FUNC::AUTOTUNE_MODE: do_aux_function_change_mode(Mode::Number::AUTOTUNE, ch_flag); break; + case AUX_FUNC::AUTOTUNE_TEST_GAINS: + copter.mode_autotune.autotune.do_aux_function(ch_flag); + break; #endif case AUX_FUNC::LAND: @@ -311,7 +316,7 @@ bool RC_Channel_Copter::do_aux_function(const AUX_FUNC ch_option, const AuxSwitc do_aux_function_change_mode(Mode::Number::FOLLOW, ch_flag); break; -#if PARACHUTE == ENABLED +#if HAL_PARACHUTE_ENABLED case AUX_FUNC::PARACHUTE_ENABLE: // Parachute enable/disable copter.parachute.enabled(ch_flag == AuxSwitchPos::HIGH); @@ -544,6 +549,7 @@ bool RC_Channel_Copter::do_aux_function(const AUX_FUNC ch_option, const AuxSwitc break; } +#if AP_RANGEFINDER_ENABLED case AUX_FUNC::SURFACE_TRACKING: switch (ch_flag) { case AuxSwitchPos::LOW: @@ -557,6 +563,7 @@ bool RC_Channel_Copter::do_aux_function(const AUX_FUNC ch_option, const AuxSwitc break; } break; +#endif case AUX_FUNC::FLIGHTMODE_PAUSE: switch (ch_flag) { @@ -646,6 +653,9 @@ bool RC_Channel_Copter::do_aux_function(const AUX_FUNC ch_option, const AuxSwitc break; } #endif + case AUX_FUNC::TRANSMITTER_TUNING: + // do nothing, used in tuning.cpp for transmitter based tuning + break; default: return RC_Channel::do_aux_function(ch_option, ch_flag); diff --git a/ArduCopter/ReleaseNotes.txt b/ArduCopter/ReleaseNotes.txt index d7a213d86b..905156cf15 100644 --- a/ArduCopter/ReleaseNotes.txt +++ b/ArduCopter/ReleaseNotes.txt @@ -1,5 +1,61 @@ ArduPilot Copter Release Notes: -------------------------------- +------------------------------------------------------------------ +Release 4.5.5 1st Aug 2024 + +No changes from 4.5.5-beta2 +------------------------------------------------------------------ +Release 4.5.5-beta2 27 July 2024 + +Changes from 4.5.5-beta1 + +1) Board specific enhancements and bug fixes + +- CubeRed's second core disabled at boot to avoid spurious writes to RAM +- CubeRed bootloader's dual endpoint update method fixed +------------------------------------------------------------------ +Release 4.5.5-beta1 1st July 2024 + +Changes from 4.5.4 + +1) Board specific enhancements and bug fixes + +- fixed IOMCU transmission errors when using bdshot +- update relay parameter names on various boards +- add ASP5033 airspeed in minimal builds +- added RadiolinkPIX6 +- fix Aocoda-RC H743Dual motor issue +- use ICM45686 as an ICM20649 alternative in CubeRedPrimary + +2) System level minor enhancements and bug fixes + +- correct use-after-free in script statistics +- added arming check for eeprom full +- fixed a block logging issue which caused log messages to be dropped +- enable Socket SO_REUSEADDR on LwIP +- removed IST8310 overrun message +- added Siyi ZT6 support +- added BTFL sidebar symbols to the OSD +- added CRSF extended link stats to the OSD +- use the ESC with the highest RPM in the OSD when only one can be displayed +- support all Tramp power levels on high power VTXs +- emit jump count in missions even if no limit +- improve the bitmask indicating persistent parameters on bootloader flash +- fix duplicate error condition in the MicroStrain7 + +3) AHRS / EKF fixes + +- fix infinite climb bug when using EK3_OGN_HGT_MASK + +4) Copter specific changes + +- fix MAV_CMD_CONDITION_YAW with relative angle + +5) Other minor enhancements and bug fixes + +- specify pymonocypher version in more places +- added DroneCAN dependencies to custom builds + +------------------------------------------------------------------ Release 4.5.4 12th June 2024 Changes from 4.5.3 diff --git a/ArduCopter/config.h b/ArduCopter/config.h index 6e177a4b86..17b0564c99 100644 --- a/ArduCopter/config.h +++ b/ArduCopter/config.h @@ -70,10 +70,6 @@ // Rangefinder // -#ifndef RANGEFINDER_ENABLED - # define RANGEFINDER_ENABLED ENABLED -#endif - #ifndef RANGEFINDER_FILT_DEFAULT # define RANGEFINDER_FILT_DEFAULT 0.5f // filter for rangefinder distance #endif @@ -124,12 +120,6 @@ # define AUTOTUNE_ENABLED ENABLED #endif -////////////////////////////////////////////////////////////////////////////// -// Parachute release -#ifndef PARACHUTE - # define PARACHUTE HAL_PARACHUTE_ENABLED -#endif - ////////////////////////////////////////////////////////////////////////////// // Nav-Guided - allows external nav computer to control vehicle #ifndef AC_NAV_GUIDED diff --git a/ArduCopter/crash_check.cpp b/ArduCopter/crash_check.cpp index 5fcd4a41ad..ad3383723e 100644 --- a/ArduCopter/crash_check.cpp +++ b/ArduCopter/crash_check.cpp @@ -36,13 +36,13 @@ void Copter::crash_check() } // exit immediately if in force flying - if (force_flying && !flightmode->is_landing()) { + if (get_force_flying() && !flightmode->is_landing()) { crash_counter = 0; return; } // return immediately if we are not in an angle stabilize flight mode or we are flipping - if (flightmode->mode_number() == Mode::Number::ACRO || flightmode->mode_number() == Mode::Number::FLIP) { + if (!flightmode->crash_check_enabled()) { crash_counter = 0; return; } @@ -229,7 +229,7 @@ void Copter::yaw_imbalance_check() } } -#if PARACHUTE == ENABLED +#if HAL_PARACHUTE_ENABLED // Code to detect a crash main ArduCopter code #define PARACHUTE_CHECK_TRIGGER_SEC 1 // 1 second of loss of control triggers the parachute @@ -273,7 +273,7 @@ void Copter::parachute_check() } // return immediately if we are not in an angle stabilize flight mode or we are flipping - if (flightmode->mode_number() == Mode::Number::ACRO || flightmode->mode_number() == Mode::Number::FLIP) { + if (!flightmode->crash_check_enabled()) { control_loss_count = 0; return; } @@ -369,4 +369,4 @@ void Copter::parachute_manual_release() parachute_release(); } -#endif // PARACHUTE == ENABLED +#endif // HAL_PARACHUTE_ENABLED diff --git a/ArduCopter/fence.cpp b/ArduCopter/fence.cpp index 3bfe085c2b..2685f89431 100644 --- a/ArduCopter/fence.cpp +++ b/ArduCopter/fence.cpp @@ -10,8 +10,10 @@ void Copter::fence_check() { const uint8_t orig_breaches = fence.get_breaches(); + bool is_landing_or_landed = flightmode->is_landing() || ap.land_complete || !motors->armed(); + // check for new breaches; new_breaches is bitmask of fence types breached - const uint8_t new_breaches = fence.check(); + const uint8_t new_breaches = fence.check(is_landing_or_landed); // we still don't do anything when disarmed, but we do check for fence breaches. // fence pre-arm check actually checks if any fence has been breached @@ -24,7 +26,7 @@ void Copter::fence_check() if (new_breaches) { if (!copter.ap.land_complete) { - GCS_SEND_TEXT(MAV_SEVERITY_NOTICE, "Fence Breached"); + fence.print_fence_message("breached", new_breaches); } // if the user wants some kind of response and motors are armed @@ -81,7 +83,10 @@ void Copter::fence_check() LOGGER_WRITE_ERROR(LogErrorSubsystem::FAILSAFE_FENCE, LogErrorCode(new_breaches)); - } else if (orig_breaches) { + } else if (orig_breaches && fence.get_breaches() == 0) { + if (!copter.ap.land_complete) { + GCS_SEND_TEXT(MAV_SEVERITY_NOTICE, "Fence breach cleared"); + } // record clearing of breach LOGGER_WRITE_ERROR(LogErrorSubsystem::FAILSAFE_FENCE, LogErrorCode::ERROR_RESOLVED); } diff --git a/ArduCopter/heli.cpp b/ArduCopter/heli.cpp index 0be2f610b3..5d4f562a71 100644 --- a/ArduCopter/heli.cpp +++ b/ArduCopter/heli.cpp @@ -42,11 +42,13 @@ void Copter::check_dynamic_flight(void) moving = (motors->get_throttle() > 0.8f || ahrs.pitch_sensor < -1500); } +#if AP_RANGEFINDER_ENABLED if (!moving && rangefinder_state.enabled && rangefinder.status_orient(ROTATION_PITCH_270) == RangeFinder::Status::Good) { // when we are more than 2m from the ground with good // rangefinder lock consider it to be dynamic flight moving = (rangefinder.distance_cm_orient(ROTATION_PITCH_270) > 200); } +#endif if (moving) { // if moving for 2 seconds, set the dynamic flight flag @@ -104,8 +106,9 @@ void Copter::update_heli_control_dynamics(void) bool Copter::should_use_landing_swash() const { if (flightmode->has_manual_throttle() || - flightmode->mode_number() == Mode::Number::DRIFT) { - // manual modes always uses full swash range + flightmode->mode_number() == Mode::Number::DRIFT || + attitude_control->get_inverted_flight()) { + // manual modes or modes using inverted flight uses full swash range return false; } if (flightmode->is_landing()) { diff --git a/ArduCopter/land_detector.cpp b/ArduCopter/land_detector.cpp index c075e6c9b8..234888420e 100644 --- a/ArduCopter/land_detector.cpp +++ b/ArduCopter/land_detector.cpp @@ -22,7 +22,7 @@ void Copter::update_land_and_crash_detectors() update_land_detector(); -#if PARACHUTE == ENABLED +#if HAL_PARACHUTE_ENABLED // check parachute parachute_check(); #endif @@ -44,6 +44,13 @@ void Copter::update_land_detector() // range finder : tend to be problematic at very short distances // input throttle : in slow land the input throttle may be only slightly less than hover +#if HAL_LOGGING_ENABLED + uint16_t logging_flags = 0; +#define SET_LOG_FLAG(condition, flag) if (condition) { logging_flags |= (uint16_t)flag; } +#else +#define SET_LOG_FLAG(condition, flag) +#endif + if (!motors->armed()) { // if disarmed, always landed. set_land_complete(true); @@ -74,11 +81,12 @@ void Copter::update_land_detector() // check if landing const bool landing = flightmode->is_landing(); + SET_LOG_FLAG(landing, LandDetectorLoggingFlag::LANDING); bool motor_at_lower_limit = (flightmode->has_manual_throttle() && (motors->get_below_land_min_coll() || heli_flags.coll_stk_low) && fabsf(ahrs.get_roll()) < M_PI/2.0f) #if MODE_AUTOROTATE_ENABLED == ENABLED || (flightmode->mode_number() == Mode::Number::AUTOROTATE && motors->get_below_land_min_coll()) #endif - || ((!force_flying || landing) && motors->limit.throttle_lower && pos_control->get_vel_desired_cms().z < 0.0f); + || ((!get_force_flying() || landing) && motors->limit.throttle_lower && pos_control->get_vel_desired_cms().z < 0.0f); bool throttle_mix_at_min = true; #else // check that the average throttle output is near minimum (less than 12.5% hover throttle) @@ -91,6 +99,8 @@ void Copter::update_land_detector() throttle_mix_at_min = true; } #endif + SET_LOG_FLAG(motor_at_lower_limit, LandDetectorLoggingFlag::MOTOR_AT_LOWER_LIMIT); + SET_LOG_FLAG(throttle_mix_at_min, LandDetectorLoggingFlag::THROTTLE_MIX_AT_MIN); uint8_t land_detector_scalar = 1; #if AP_LANDINGGEAR_ENABLED @@ -103,19 +113,24 @@ void Copter::update_land_detector() // check for aggressive flight requests - requested roll or pitch angle below 15 degrees const Vector3f angle_target = attitude_control->get_att_target_euler_cd(); bool large_angle_request = angle_target.xy().length() > LAND_CHECK_LARGE_ANGLE_CD; + SET_LOG_FLAG(large_angle_request, LandDetectorLoggingFlag::LARGE_ANGLE_REQUEST); // check for large external disturbance - angle error over 30 degrees const float angle_error = attitude_control->get_att_error_angle_deg(); bool large_angle_error = (angle_error > LAND_CHECK_ANGLE_ERROR_DEG); + SET_LOG_FLAG(large_angle_error, LandDetectorLoggingFlag::LARGE_ANGLE_ERROR); // check that the airframe is not accelerating (not falling or braking after fast forward flight) bool accel_stationary = (land_accel_ef_filter.get().length() <= LAND_DETECTOR_ACCEL_MAX * land_detector_scalar); + SET_LOG_FLAG(accel_stationary, LandDetectorLoggingFlag::ACCEL_STATIONARY); // check that vertical speed is within 1m/s of zero bool descent_rate_low = fabsf(inertial_nav.get_velocity_z_up_cms()) < 100.0 * LAND_DETECTOR_VEL_Z_MAX * land_detector_scalar; + SET_LOG_FLAG(descent_rate_low, LandDetectorLoggingFlag::DESCENT_RATE_LOW); // if we have a healthy rangefinder only allow landing detection below 2 meters bool rangefinder_check = (!rangefinder_alt_ok() || rangefinder_state.alt_cm_filt.get() < LAND_RANGEFINDER_MIN_ALT_CM); + SET_LOG_FLAG(rangefinder_check, LandDetectorLoggingFlag::RANGEFINDER_BELOW_2M); // if we have weight on wheels (WoW) or ambiguous unknown. never no WoW #if AP_LANDINGGEAR_ENABLED @@ -123,6 +138,7 @@ void Copter::update_land_detector() #else const bool WoW_check = true; #endif + SET_LOG_FLAG(WoW_check, LandDetectorLoggingFlag::WOW); if (motor_at_lower_limit && throttle_mix_at_min && !large_angle_request && !large_angle_error && accel_stationary && descent_rate_low && rangefinder_check && WoW_check) { // landed criteria met - increment the counter and check if we've triggered @@ -138,8 +154,53 @@ void Copter::update_land_detector() } set_land_complete_maybe(ap.land_complete || (land_detector_count >= LAND_DETECTOR_MAYBE_TRIGGER_SEC*scheduler.get_loop_rate_hz())); + +#if HAL_LOGGING_ENABLED +// @LoggerMessage: LDET +// @Description: Land Detector State +// @Field: TimeUS: Time since system startup +// @Field: Flags: boolean state flags +// @FieldBitmaskEnum: Flags: Copter::LandDetectorLoggingFlag +// @Field: Count: landing_detector pass count + SET_LOG_FLAG(ap.land_complete, LandDetectorLoggingFlag::LANDED); + SET_LOG_FLAG(ap.land_complete_maybe, LandDetectorLoggingFlag::LANDED_MAYBE); + SET_LOG_FLAG(standby_active, LandDetectorLoggingFlag::STANDBY_ACTIVE); + Log_LDET(logging_flags, land_detector_count); +#undef SET_LOG_FLAG +#endif } +#if HAL_LOGGING_ENABLED +void Copter::Log_LDET(uint16_t logging_flags, uint32_t detector_count) +{ + // do not log if no change: + if (logging_flags == land_detector.last_logged_flags && + detector_count == land_detector.last_logged_count) { + return; + } + // do not log more than 50Hz: + const auto now = AP_HAL::millis(); + if (now - land_detector.last_logged_ms < 20) { + return; + } + + land_detector.last_logged_count = detector_count; + land_detector.last_logged_flags = logging_flags; + land_detector.last_logged_ms = now; + + AP::logger().WriteStreaming( + "LDET", + "TimeUS," "Flags," "Count", + "s" "-" "-", + "F" "-" "-", + "Q" "H" "I", + AP_HAL::micros64(), + logging_flags, + land_detector_count + ); +} +#endif + // set land_complete flag and disarm motors if disarm-on-land is configured void Copter::set_land_complete(bool b) { @@ -251,7 +312,7 @@ void Copter::update_throttle_mix() // check if landing const bool landing = flightmode->is_landing(); - if (((large_angle_request || force_flying) && !landing) || large_angle_error || accel_moving || descent_not_demanded) { + if (((large_angle_request || get_force_flying()) && !landing) || large_angle_error || accel_moving || descent_not_demanded) { attitude_control->set_throttle_mix_max(pos_control->get_vel_z_control_ratio()); } else { attitude_control->set_throttle_mix_min(); @@ -259,3 +320,14 @@ void Copter::update_throttle_mix() } #endif } + +// helper function for force flying flag +bool Copter::get_force_flying() const +{ +#if FRAME_CONFIG == HELI_FRAME + if (attitude_control->get_inverted_flight()) { + return true; + } +#endif + return force_flying; +} diff --git a/ArduCopter/landing_gear.cpp b/ArduCopter/landing_gear.cpp index 2aec67d2b2..5c77b8231f 100644 --- a/ArduCopter/landing_gear.cpp +++ b/ArduCopter/landing_gear.cpp @@ -14,6 +14,7 @@ void Copter::landinggear_update() int32_t height_cm = flightmode->get_alt_above_ground_cm(); // use rangefinder if available +#if AP_RANGEFINDER_ENABLED switch (rangefinder.status_orient(ROTATION_PITCH_270)) { case RangeFinder::Status::NotConnected: case RangeFinder::Status::NoData: @@ -31,6 +32,7 @@ void Copter::landinggear_update() height_cm = rangefinder_state.alt_cm_filt.get(); break; } +#endif // AP_RANGEFINDER_ENABLED landinggear.update(height_cm * 0.01f); // convert cm->m for update call } diff --git a/ArduCopter/mode.cpp b/ArduCopter/mode.cpp index c4e8068982..3a851eee91 100644 --- a/ArduCopter/mode.cpp +++ b/ArduCopter/mode.cpp @@ -347,6 +347,20 @@ bool Copter::set_mode(Mode::Number mode, ModeReason reason) return false; } +#if AP_FENCE_ENABLED + // may not be allowed to change mode if recovering from fence breach + if (!ignore_checks && + fence.enabled() && + fence.option_enabled(AC_Fence::OPTIONS::DISABLE_MODE_CHANGE) && + fence.get_breaches() && + motors->armed() && + get_control_mode_reason() == ModeReason::FENCE_BREACHED && + !ap.land_complete) { + mode_change_failed(new_flightmode, "in fence recovery"); + return false; + } +#endif + if (!new_flightmode->init(ignore_checks)) { mode_change_failed(new_flightmode, "init failed"); return false; @@ -371,10 +385,12 @@ bool Copter::set_mode(Mode::Number mode, ModeReason reason) #endif #if AP_FENCE_ENABLED - // pilot requested flight mode change during a fence breach indicates pilot is attempting to manually recover - // this flight mode change could be automatic (i.e. fence, battery, GPS or GCS failsafe) - // but it should be harmless to disable the fence temporarily in these situations as well - fence.manual_recovery_start(); + if (fence.get_action() != AC_FENCE_ACTION_REPORT_ONLY) { + // pilot requested flight mode change during a fence breach indicates pilot is attempting to manually recover + // this flight mode change could be automatic (i.e. fence, battery, GPS or GCS failsafe) + // but it should be harmless to disable the fence temporarily in these situations as well + fence.manual_recovery_start(); + } #endif #if AP_CAMERA_ENABLED @@ -420,7 +436,10 @@ bool Copter::set_mode(const uint8_t new_mode, const ModeReason reason) // called at 100hz or more void Copter::update_flight_mode() { +#if AP_RANGEFINDER_ENABLED surface_tracking.invalidate_for_logging(); // invalidate surface tracking alt, flight mode will set to true if used +#endif + attitude_control->landed_gain_reduction(copter.ap.land_complete); // Adjust gains when landed to attenuate ground oscillation flightmode->run(); } diff --git a/ArduCopter/mode.h b/ArduCopter/mode.h index e50f045b67..0c8bc6b058 100644 --- a/ArduCopter/mode.h +++ b/ArduCopter/mode.h @@ -128,6 +128,7 @@ public: virtual bool allows_save_trim() const { return false; } virtual bool allows_autotune() const { return false; } virtual bool allows_flip() const { return false; } + virtual bool crash_check_enabled() const { return true; } #if FRAME_CONFIG == HELI_FRAME virtual bool allows_inverted() const { return false; }; @@ -185,6 +186,9 @@ public: virtual bool pause() { return false; }; virtual bool resume() { return false; }; + // handle situations where the vehicle is on the ground waiting for takeoff + void make_safe_ground_handling(bool force_throttle_unlimited = false); + // true if weathervaning is allowed in the current mode #if WEATHERVANE_ENABLED == ENABLED virtual bool allows_weathervaning() const { return false; } @@ -196,7 +200,6 @@ protected: bool is_disarmed_or_landed() const; void zero_throttle_and_relax_ac(bool spool_up = false); void zero_throttle_and_hold_attitude(); - void make_safe_ground_handling(bool force_throttle_unlimited = false); // Return stopping point as a location with above origin alt frame Location get_stopping_point() const; @@ -418,6 +421,7 @@ public: void air_mode_aux_changed(); bool allows_save_trim() const override { return true; } bool allows_flip() const override { return true; } + bool crash_check_enabled() const override { return false; } protected: @@ -471,7 +475,9 @@ public: } bool allows_autotune() const override { return true; } bool allows_flip() const override { return true; } - +#if FRAME_CONFIG == HELI_FRAME + bool allows_inverted() const override { return true; }; +#endif protected: const char *name() const override { return "ALT_HOLD"; } @@ -499,6 +505,9 @@ public: bool allows_arming(AP_Arming::Method method) const override; bool is_autopilot() const override { return true; } bool in_guided_mode() const override { return _mode == SubMode::NAVGUIDED || _mode == SubMode::NAV_SCRIPT_TIME; } +#if FRAME_CONFIG == HELI_FRAME + bool allows_inverted() const override { return true; }; +#endif // Auto modes enum class SubMode : uint8_t { @@ -589,12 +598,13 @@ protected: private: - enum class Options : int32_t { + enum class Option : int32_t { AllowArming = (1 << 0U), AllowTakeOffWithoutRaisingThrottle = (1 << 1U), IgnorePilotYaw = (1 << 2U), AllowWeatherVaning = (1 << 7U), }; + bool option_is_enabled(Option option) const; // Enter auto rtl pseudo mode bool enter_auto_rtl(ModeReason reason); @@ -643,7 +653,7 @@ private: void do_set_home(const AP_Mission::Mission_Command& cmd); void do_roi(const AP_Mission::Mission_Command& cmd); void do_mount_control(const AP_Mission::Mission_Command& cmd); -#if PARACHUTE == ENABLED +#if HAL_PARACHUTE_ENABLED void do_parachute(const AP_Mission::Mission_Command& cmd); #endif #if AP_WINCH_ENABLED @@ -786,18 +796,12 @@ public: bool allows_arming(AP_Arming::Method method) const override { return false; } bool is_autopilot() const override { return false; } - void save_tuning_gains(); - void reset(); + AutoTune autotune; protected: const char *name() const override { return "AUTOTUNE"; } const char *name4() const override { return "ATUN"; } - -private: - - AutoTune autotune; - }; #endif @@ -903,6 +907,7 @@ public: bool has_manual_throttle() const override { return false; } bool allows_arming(AP_Arming::Method method) const override { return false; }; bool is_autopilot() const override { return false; } + bool crash_check_enabled() const override { return false; } protected: @@ -1250,6 +1255,10 @@ public: bool has_user_takeoff(bool must_navigate) const override { return true; } bool allows_autotune() const override { return true; } +#if FRAME_CONFIG == HELI_FRAME + bool allows_inverted() const override { return true; }; +#endif + #if AC_PRECLAND_ENABLED void set_precision_loiter_enabled(bool value) { _precision_loiter_enabled = value; } #endif @@ -1529,6 +1538,10 @@ private: // point while following our path home. If we take too long we // may choose to land the vehicle. uint32_t path_follow_last_pop_fail_ms; + + // backup last popped point so that it can be restored to the path + // if vehicle exits SmartRTL mode before reaching home. invalid if zero + Vector3f dest_NED_backup; }; diff --git a/ArduCopter/mode_althold.cpp b/ArduCopter/mode_althold.cpp index 91c7943867..09e5ad0a88 100644 --- a/ArduCopter/mode_althold.cpp +++ b/ArduCopter/mode_althold.cpp @@ -87,8 +87,10 @@ void ModeAltHold::run() // get avoidance adjusted climb rate target_climb_rate = get_avoidance_adjusted_climbrate(target_climb_rate); +#if AP_RANGEFINDER_ENABLED // update the vertical offset based on the surface measurement copter.surface_tracking.update_surface_offset(); +#endif // Send the commanded climb rate to the position controller pos_control->set_pos_target_z_from_climb_rate_cm(target_climb_rate); diff --git a/ArduCopter/mode_auto.cpp b/ArduCopter/mode_auto.cpp index 3733093544..08f41f06c7 100644 --- a/ArduCopter/mode_auto.cpp +++ b/ArduCopter/mode_auto.cpp @@ -202,15 +202,23 @@ void ModeAuto::set_submode(SubMode new_submode) } } +bool ModeAuto::option_is_enabled(Option option) const +{ + return ((copter.g2.auto_options & (uint32_t)option) != 0); +} + bool ModeAuto::allows_arming(AP_Arming::Method method) const { - return ((copter.g2.auto_options & (uint32_t)Options::AllowArming) != 0) && !auto_RTL; -}; + if (auto_RTL) { + return false; + } + return option_is_enabled(Option::AllowArming); +} #if WEATHERVANE_ENABLED == ENABLED bool ModeAuto::allows_weathervaning() const { - return (copter.g2.auto_options & (uint32_t)Options::AllowWeatherVaning) != 0; + return option_is_enabled(Option::AllowWeatherVaning); } #endif @@ -480,11 +488,6 @@ void ModeAuto::land_start() copter.landinggear.deploy_for_landing(); #endif -#if AP_FENCE_ENABLED - // disable the fence on landing - copter.fence.auto_disable_fence_for_landing(); -#endif - // reset flag indicating if pilot has applied roll or pitch inputs during landing copter.ap.land_repo_active = false; @@ -638,7 +641,7 @@ void PayloadPlace::start_descent() // returns true if pilot's yaw input should be used to adjust vehicle's heading bool ModeAuto::use_pilot_yaw(void) const { - const bool allow_yaw_option = (copter.g2.auto_options.get() & uint32_t(Options::IgnorePilotYaw)) == 0; + const bool allow_yaw_option = !option_is_enabled(Option::IgnorePilotYaw); const bool rtl_allow_yaw = (_mode == SubMode::RTL) && copter.mode_rtl.use_pilot_yaw(); const bool landing = _mode == SubMode::LAND; return allow_yaw_option || rtl_allow_yaw || landing; @@ -779,18 +782,6 @@ bool ModeAuto::start_command(const AP_Mission::Mission_Command& cmd) // point the camera to a specified angle do_mount_control(cmd); break; - - case MAV_CMD_DO_FENCE_ENABLE: -#if AP_FENCE_ENABLED - if (cmd.p1 == 0) { //disable - copter.fence.enable(false); - gcs().send_text(MAV_SEVERITY_INFO, "Fence Disabled"); - } else { //enable fence - copter.fence.enable(true); - gcs().send_text(MAV_SEVERITY_INFO, "Fence Enabled"); - } -#endif //AP_FENCE_ENABLED - break; #if AC_NAV_GUIDED == ENABLED case MAV_CMD_DO_GUIDED_LIMITS: // 220 accept guided mode limits @@ -1039,7 +1030,7 @@ void ModeAuto::takeoff_run() { // if the user doesn't want to raise the throttle we can set it automatically // note that this can defeat the disarm check on takeoff - if ((copter.g2.auto_options & (int32_t)Options::AllowTakeOffWithoutRaisingThrottle) != 0) { + if (option_is_enabled(Option::AllowTakeOffWithoutRaisingThrottle)) { copter.set_auto_armed(true); } auto_takeoff.run(); @@ -1197,8 +1188,10 @@ void ModeAuto::loiter_to_alt_run() // get avoidance adjusted climb rate target_climb_rate = get_avoidance_adjusted_climbrate(target_climb_rate); +#if AP_RANGEFINDER_ENABLED // update the vertical offset based on the surface measurement copter.surface_tracking.update_surface_offset(); +#endif // Send the commanded climb rate to the position controller pos_control->set_pos_target_z_from_climb_rate_cm(target_climb_rate); @@ -1253,13 +1246,21 @@ void PayloadPlace::run() const uint32_t descent_thrust_cal_duration_ms = 2000; // milliseconds const uint32_t placed_check_duration_ms = 500; // how long we have to be below a throttle threshold before considering placed - // Vertical thrust is taken from the attitude controller before angle boost is added + auto &g2 = copter.g2; + const auto &g = copter.g; + auto &inertial_nav = copter.inertial_nav; auto *attitude_control = copter.attitude_control; + const auto &pos_control = copter.pos_control; + const auto &wp_nav = copter.wp_nav; + + // Vertical thrust is taken from the attitude controller before angle boost is added const float thrust_level = attitude_control->get_throttle_in(); const uint32_t now_ms = AP_HAL::millis(); + // relax position target if we might be landed // if we discover we've landed then immediately release the load: if (copter.ap.land_complete || copter.ap.land_complete_maybe) { + pos_control->soften_for_landing_xy(); switch (state) { case State::FlyToLocation: // this is handled in wp_run() @@ -1287,7 +1288,9 @@ void PayloadPlace::run() switch (state) { case State::FlyToLocation: case State::Descent_Start: - gcs().send_text(MAV_SEVERITY_INFO, "%s Manual release", prefix_str); + gcs().send_text(MAV_SEVERITY_INFO, "%s Abort: Gripper Open", prefix_str); + // Descent_Start has not run so we must also initalise descent_start_altitude_cm + descent_start_altitude_cm = inertial_nav.get_position_z_up_cm(); state = State::Done; break; case State::Descent: @@ -1305,12 +1308,6 @@ void PayloadPlace::run() } #endif - auto &inertial_nav = copter.inertial_nav; - auto &g2 = copter.g2; - const auto &g = copter.g; - const auto &wp_nav = copter.wp_nav; - const auto &pos_control = copter.pos_control; - switch (state) { case State::FlyToLocation: if (copter.wp_nav->reached_wp_destination()) { @@ -1442,8 +1439,7 @@ void PayloadPlace::run() copter.flightmode->land_run_horizontal_control(); // update altitude target and call position controller pos_control->land_at_climb_rate_cm(-descent_speed_cms, true); - pos_control->update_z_controller(); - return; + break; case State::Release: case State::Releasing: case State::Delay: @@ -1451,8 +1447,7 @@ void PayloadPlace::run() copter.flightmode->land_run_horizontal_control(); // update altitude target and call position controller pos_control->land_at_climb_rate_cm(0.0, false); - pos_control->update_z_controller(); - return; + break; case State::Ascent: case State::Done: float vel = 0.0; @@ -1460,6 +1455,7 @@ void PayloadPlace::run() pos_control->input_pos_vel_accel_z(descent_start_altitude_cm, vel, 0.0); break; } + pos_control->update_z_controller(); } #endif @@ -1921,15 +1917,20 @@ void ModeAuto::do_yaw(const AP_Mission::Mission_Command& cmd) void ModeAuto::do_change_speed(const AP_Mission::Mission_Command& cmd) { if (cmd.content.speed.target_ms > 0) { - if (cmd.content.speed.speed_type == 2) { + switch (cmd.content.speed.speed_type) { + case SPEED_TYPE_CLIMB_SPEED: copter.wp_nav->set_speed_up(cmd.content.speed.target_ms * 100.0f); desired_speed_override.up = cmd.content.speed.target_ms; - } else if (cmd.content.speed.speed_type == 3) { + break; + case SPEED_TYPE_DESCENT_SPEED: copter.wp_nav->set_speed_down(cmd.content.speed.target_ms * 100.0f); desired_speed_override.down = cmd.content.speed.target_ms; - } else { + break; + case SPEED_TYPE_AIRSPEED: + case SPEED_TYPE_GROUNDSPEED: copter.wp_nav->set_speed_xy(cmd.content.speed.target_ms * 100.0f); desired_speed_override.xy = cmd.content.speed.target_ms; + break; } } } diff --git a/ArduCopter/mode_autotune.cpp b/ArduCopter/mode_autotune.cpp index 0a7da76b07..04a2b88bda 100644 --- a/ArduCopter/mode_autotune.cpp +++ b/ArduCopter/mode_autotune.cpp @@ -38,30 +38,20 @@ void AutoTune::run() // apply SIMPLE mode transform to pilot inputs copter.update_simple_mode(); - // reset target lean angles and heading while landed - if (copter.ap.land_complete) { - // we are landed, shut down - float target_climb_rate = get_pilot_desired_climb_rate_cms(); - - // set motors to spin-when-armed if throttle below deadzone, otherwise full range (but motors will only spin at min throttle) - if (target_climb_rate < 0.0f) { - copter.motors->set_desired_spool_state(AP_Motors::DesiredSpoolState::GROUND_IDLE); - } else { - copter.motors->set_desired_spool_state(AP_Motors::DesiredSpoolState::THROTTLE_UNLIMITED); - } - copter.attitude_control->reset_rate_controller_I_terms_smoothly(); - copter.attitude_control->reset_yaw_target_and_rate(); - - float target_roll, target_pitch, target_yaw_rate; - get_pilot_desired_rp_yrate_cd(target_roll, target_pitch, target_yaw_rate); - - copter.attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(target_roll, target_pitch, target_yaw_rate); - copter.pos_control->relax_z_controller(0.0f); - copter.pos_control->update_z_controller(); - } else { - // run autotune mode - AC_AutoTune::run(); + // disarm when the landing detector says we've landed and spool state is ground idle + if (copter.ap.land_complete && motors->get_spool_state() == AP_Motors::SpoolState::GROUND_IDLE) { + copter.arming.disarm(AP_Arming::Method::LANDED); } + + // if not armed set throttle to zero and exit immediately + if (copter.ap.land_complete) { + copter.flightmode->make_safe_ground_handling(); + return; + } + + // run autotune mode + AC_AutoTune::run(); + } @@ -128,19 +118,9 @@ void ModeAutoTune::run() autotune.run(); } -void ModeAutoTune::save_tuning_gains() -{ - autotune.save_tuning_gains(); -} - void ModeAutoTune::exit() { autotune.stop(); } -void ModeAutoTune::reset() -{ - autotune.reset(); -} - #endif // AUTOTUNE_ENABLED == ENABLED diff --git a/ArduCopter/mode_circle.cpp b/ArduCopter/mode_circle.cpp index 2c31f8d0a3..5c1d243ed1 100644 --- a/ArduCopter/mode_circle.cpp +++ b/ArduCopter/mode_circle.cpp @@ -68,7 +68,7 @@ void ModeCircle::run() } // update the orbicular rate target based on pilot roll stick inputs - // skip if using CH6 tuning knob for circle rate + // skip if using transmitter based tuning knob for circle rate if (g.radio_tuning != TUNING_CIRCLE_RATE) { const float roll_stick = channel_roll->norm_input_dz(); // roll stick normalized -1 to 1 @@ -114,8 +114,10 @@ void ModeCircle::run() // set motors to full range motors->set_desired_spool_state(AP_Motors::DesiredSpoolState::THROTTLE_UNLIMITED); +#if AP_RANGEFINDER_ENABLED // update the vertical offset based on the surface measurement copter.surface_tracking.update_surface_offset(); +#endif copter.failsafe_terrain_set_status(copter.circle_nav->update(target_climb_rate)); pos_control->update_z_controller(); diff --git a/ArduCopter/mode_flowhold.cpp b/ArduCopter/mode_flowhold.cpp index 24ab8806be..1e53107c6b 100644 --- a/ArduCopter/mode_flowhold.cpp +++ b/ArduCopter/mode_flowhold.cpp @@ -302,8 +302,10 @@ void ModeFlowHold::run() // get avoidance adjusted climb rate target_climb_rate = get_avoidance_adjusted_climbrate(target_climb_rate); +#if AP_RANGEFINDER_ENABLED // update the vertical offset based on the surface measurement copter.surface_tracking.update_surface_offset(); +#endif // Send the commanded climb rate to the position controller pos_control->set_pos_target_z_from_climb_rate_cm(target_climb_rate); diff --git a/ArduCopter/mode_guided.cpp b/ArduCopter/mode_guided.cpp index 660c94eef1..f22501e47f 100644 --- a/ArduCopter/mode_guided.cpp +++ b/ArduCopter/mode_guided.cpp @@ -15,7 +15,7 @@ static uint32_t update_time_ms; // system time of last target update struct { uint32_t update_time_ms; Quaternion attitude_quat; - Vector3f ang_vel; + Vector3f ang_vel_body; float yaw_rate_cds; float climb_rate_cms; // climb rate in cms. Used if use_thrust is false float thrust; // thrust from -1 to 1. Used if use_thrust is true @@ -128,6 +128,7 @@ bool ModeGuided::do_user_takeoff_start(float takeoff_alt_cm) // calculate target altitude and frame (either alt-above-ekf-origin or alt-above-terrain) int32_t alt_target_cm; bool alt_target_terrain = false; +#if AP_RANGEFINDER_ENABLED if (wp_nav->rangefinder_used_and_healthy() && wp_nav->get_terrain_source() == AC_WPNav::TerrainSource::TERRAIN_FROM_RANGEFINDER && takeoff_alt_cm < copter.rangefinder.max_distance_cm_orient(ROTATION_PITCH_270)) { @@ -138,7 +139,9 @@ bool ModeGuided::do_user_takeoff_start(float takeoff_alt_cm) // provide target altitude as alt-above-terrain alt_target_cm = takeoff_alt_cm; alt_target_terrain = true; - } else { + } else +#endif + { // interpret altitude as alt-above-home Location target_loc = copter.current_loc; target_loc.set_alt_cm(takeoff_alt_cm, Location::AltFrame::ABOVE_HOME); @@ -320,7 +323,7 @@ void ModeGuided::angle_control_start() // initialise targets guided_angle_state.update_time_ms = millis(); guided_angle_state.attitude_quat.from_euler(Vector3f(0.0, 0.0, attitude_control->get_att_target_euler_rad().z)); - guided_angle_state.ang_vel.zero(); + guided_angle_state.ang_vel_body.zero(); guided_angle_state.climb_rate_cms = 0.0f; guided_angle_state.yaw_rate_cds = 0.0f; guided_angle_state.use_yaw_rate = false; @@ -638,13 +641,13 @@ bool ModeGuided::use_wpnav_for_position_control() const } // Sets guided's angular target submode: Using a rotation quaternion, angular velocity, and climbrate or thrust (depends on user option) -// attitude_quat: IF zero: ang_vel (angular velocity) must be provided even if all zeroes -// IF non-zero: attitude_control is performed using both the attitude quaternion and angular velocity -// ang_vel: angular velocity (rad/s) +// attitude_quat: IF zero: ang_vel_body (body frame angular velocity) must be provided even if all zeroes +// IF non-zero: attitude_control is performed using both the attitude quaternion and body frame angular velocity +// ang_vel_body: body frame angular velocity (rad/s) // climb_rate_cms_or_thrust: represents either the climb_rate (cm/s) or thrust scaled from [0, 1], unitless // use_thrust: IF true: climb_rate_cms_or_thrust represents thrust // IF false: climb_rate_cms_or_thrust represents climb_rate (cm/s) -void ModeGuided::set_angle(const Quaternion &attitude_quat, const Vector3f &ang_vel, float climb_rate_cms_or_thrust, bool use_thrust) +void ModeGuided::set_angle(const Quaternion &attitude_quat, const Vector3f &ang_vel_body, float climb_rate_cms_or_thrust, bool use_thrust) { // check we are in velocity control mode if (guided_mode != SubMode::Angle) { @@ -652,7 +655,7 @@ void ModeGuided::set_angle(const Quaternion &attitude_quat, const Vector3f &ang_ } guided_angle_state.attitude_quat = attitude_quat; - guided_angle_state.ang_vel = ang_vel; + guided_angle_state.ang_vel_body = ang_vel_body; guided_angle_state.use_thrust = use_thrust; if (use_thrust) { @@ -671,7 +674,7 @@ void ModeGuided::set_angle(const Quaternion &attitude_quat, const Vector3f &ang_ #if HAL_LOGGING_ENABLED // log target - copter.Log_Write_Guided_Attitude_Target(guided_mode, roll_rad, pitch_rad, yaw_rad, ang_vel, guided_angle_state.thrust, guided_angle_state.climb_rate_cms * 0.01); + copter.Log_Write_Guided_Attitude_Target(guided_mode, roll_rad, pitch_rad, yaw_rad, ang_vel_body, guided_angle_state.thrust, guided_angle_state.climb_rate_cms * 0.01); #endif } @@ -682,6 +685,9 @@ void ModeGuided::takeoff_run() auto_takeoff.run(); if (auto_takeoff.complete && !takeoff_complete) { takeoff_complete = true; +#if AP_FENCE_ENABLED + copter.fence.auto_enable_fence_after_takeoff(); +#endif #if AP_LANDINGGEAR_ENABLED // optionally retract landing gear copter.landinggear.retract_after_takeoff(); @@ -946,7 +952,7 @@ void ModeGuided::angle_control_run() uint32_t tnow = millis(); if (tnow - guided_angle_state.update_time_ms > get_timeout_ms()) { guided_angle_state.attitude_quat.from_euler(Vector3f(0.0, 0.0, attitude_control->get_att_target_euler_rad().z)); - guided_angle_state.ang_vel.zero(); + guided_angle_state.ang_vel_body.zero(); climb_rate_cms = 0.0f; if (guided_angle_state.use_thrust) { // initialise vertical velocity controller @@ -985,9 +991,9 @@ void ModeGuided::angle_control_run() // call attitude controller if (guided_angle_state.attitude_quat.is_zero()) { - attitude_control->input_rate_bf_roll_pitch_yaw(ToDeg(guided_angle_state.ang_vel.x) * 100.0f, ToDeg(guided_angle_state.ang_vel.y) * 100.0f, ToDeg(guided_angle_state.ang_vel.z) * 100.0f); + attitude_control->input_rate_bf_roll_pitch_yaw(ToDeg(guided_angle_state.ang_vel_body.x) * 100.0f, ToDeg(guided_angle_state.ang_vel_body.y) * 100.0f, ToDeg(guided_angle_state.ang_vel_body.z) * 100.0f); } else { - attitude_control->input_quaternion(guided_angle_state.attitude_quat, guided_angle_state.ang_vel); + attitude_control->input_quaternion(guided_angle_state.attitude_quat, guided_angle_state.ang_vel_body); } // call position controller diff --git a/ArduCopter/mode_land.cpp b/ArduCopter/mode_land.cpp index 1f34e20fbf..2b5b6e8879 100644 --- a/ArduCopter/mode_land.cpp +++ b/ArduCopter/mode_land.cpp @@ -41,11 +41,6 @@ bool ModeLand::init(bool ignore_checks) copter.landinggear.deploy_for_landing(); #endif -#if AP_FENCE_ENABLED - // disable the fence on landing - copter.fence.auto_disable_fence_for_landing(); -#endif - #if AC_PRECLAND_ENABLED // initialise precland state machine copter.precland_statemachine.init(); diff --git a/ArduCopter/mode_loiter.cpp b/ArduCopter/mode_loiter.cpp index 1b76c41430..7acb8c19ba 100644 --- a/ArduCopter/mode_loiter.cpp +++ b/ArduCopter/mode_loiter.cpp @@ -191,8 +191,10 @@ void ModeLoiter::run() // get avoidance adjusted climb rate target_climb_rate = get_avoidance_adjusted_climbrate(target_climb_rate); +#if AP_RANGEFINDER_ENABLED // update the vertical offset based on the surface measurement copter.surface_tracking.update_surface_offset(); +#endif // Send the commanded climb rate to the position controller pos_control->set_pos_target_z_from_climb_rate_cm(target_climb_rate); diff --git a/ArduCopter/mode_poshold.cpp b/ArduCopter/mode_poshold.cpp index c90e36a18e..08e65cfa09 100644 --- a/ArduCopter/mode_poshold.cpp +++ b/ArduCopter/mode_poshold.cpp @@ -158,8 +158,10 @@ void ModePosHold::run() // get avoidance adjusted climb rate target_climb_rate = get_avoidance_adjusted_climbrate(target_climb_rate); +#if AP_RANGEFINDER_ENABLED // update the vertical offset based on the surface measurement copter.surface_tracking.update_surface_offset(); +#endif // Send the commanded climb rate to the position controller pos_control->set_pos_target_z_from_climb_rate_cm(target_climb_rate); diff --git a/ArduCopter/mode_rtl.cpp b/ArduCopter/mode_rtl.cpp index d3250e4265..cfee04ff72 100644 --- a/ArduCopter/mode_rtl.cpp +++ b/ArduCopter/mode_rtl.cpp @@ -255,11 +255,6 @@ void ModeRTL::descent_start() // optionally deploy landing gear copter.landinggear.deploy_for_landing(); #endif - -#if AP_FENCE_ENABLED - // disable the fence on landing - copter.fence.auto_disable_fence_for_landing(); -#endif } // rtl_descent_run - implements the final descent to the RTL_ALT @@ -347,11 +342,6 @@ void ModeRTL::land_start() // optionally deploy landing gear copter.landinggear.deploy_for_landing(); #endif - -#if AP_FENCE_ENABLED - // disable the fence on landing - copter.fence.auto_disable_fence_for_landing(); -#endif } bool ModeRTL::is_landing() const diff --git a/ArduCopter/mode_smart_rtl.cpp b/ArduCopter/mode_smart_rtl.cpp index dacd7cc5f2..8c2b1988c3 100644 --- a/ArduCopter/mode_smart_rtl.cpp +++ b/ArduCopter/mode_smart_rtl.cpp @@ -35,6 +35,14 @@ bool ModeSmartRTL::init(bool ignore_checks) // perform cleanup required when leaving smart_rtl void ModeSmartRTL::exit() { + // restore last point if we hadn't reached it + if (smart_rtl_state == SubMode::PATH_FOLLOW && !dest_NED_backup.is_zero()) { + if (!g2.smart_rtl.add_point(dest_NED_backup)) { + GCS_SEND_TEXT(MAV_SEVERITY_ERROR, "SmartRTL: lost one point"); + } + } + dest_NED_backup.zero(); + g2.smart_rtl.cancel_request_for_thorough_cleanup(); } @@ -83,10 +91,16 @@ void ModeSmartRTL::path_follow_run() { // if we are close to current target point, switch the next point to be our target. if (wp_nav->reached_wp_destination()) { - Vector3f dest_NED; + + // clear destination backup so that it cannot be restored + dest_NED_backup.zero(); + // this pop_point can fail if the IO task currently has the // path semaphore. + Vector3f dest_NED; if (g2.smart_rtl.pop_point(dest_NED)) { + // backup destination in case we exit smart_rtl mode and need to restore it to the path + dest_NED_backup = dest_NED; path_follow_last_pop_fail_ms = 0; if (g2.smart_rtl.get_num_points() == 0) { // this is the very last point, add 2m to the target alt and move to pre-land state diff --git a/ArduCopter/mode_sport.cpp b/ArduCopter/mode_sport.cpp index 7647e4973c..44f3935a82 100644 --- a/ArduCopter/mode_sport.cpp +++ b/ArduCopter/mode_sport.cpp @@ -108,8 +108,10 @@ void ModeSport::run() // get avoidance adjusted climb rate target_climb_rate = get_avoidance_adjusted_climbrate(target_climb_rate); +#if AP_RANGEFINDER_ENABLED // update the vertical offset based on the surface measurement copter.surface_tracking.update_surface_offset(); +#endif // Send the commanded climb rate to the position controller pos_control->set_pos_target_z_from_climb_rate_cm(target_climb_rate); diff --git a/ArduCopter/mode_stabilize_heli.cpp b/ArduCopter/mode_stabilize_heli.cpp index e9caa4212b..db9471616e 100644 --- a/ArduCopter/mode_stabilize_heli.cpp +++ b/ArduCopter/mode_stabilize_heli.cpp @@ -77,8 +77,8 @@ void ModeStabilize_Heli::run() // call attitude controller attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(target_roll, target_pitch, target_yaw_rate); - // output pilot's throttle - note that TradHeli does not used angle-boost - attitude_control->set_throttle_out(pilot_throttle_scaled, false, g.throttle_filt); + // output pilot's throttle + attitude_control->set_throttle_out(pilot_throttle_scaled, true, g.throttle_filt); } #endif //HELI_FRAME diff --git a/ArduCopter/mode_zigzag.cpp b/ArduCopter/mode_zigzag.cpp index 3887f1bd52..135ad32cc9 100644 --- a/ArduCopter/mode_zigzag.cpp +++ b/ArduCopter/mode_zigzag.cpp @@ -244,9 +244,11 @@ void ModeZigZag::return_to_manual_control(bool maintain_target) if (maintain_target) { const Vector3f& wp_dest = wp_nav->get_wp_destination(); loiter_nav->init_target(wp_dest.xy()); +#if AP_RANGEFINDER_ENABLED if (wp_nav->origin_and_destination_are_terrain_alt()) { copter.surface_tracking.set_target_alt_cm(wp_dest.z); } +#endif } else { loiter_nav->init_target(); } @@ -377,8 +379,10 @@ void ModeZigZag::manual_control() // get avoidance adjusted climb rate target_climb_rate = get_avoidance_adjusted_climbrate(target_climb_rate); +#if AP_RANGEFINDER_ENABLED // update the vertical offset based on the surface measurement copter.surface_tracking.update_surface_offset(); +#endif // Send the commanded climb rate to the position controller pos_control->set_pos_target_z_from_climb_rate_cm(target_climb_rate); @@ -454,9 +458,11 @@ bool ModeZigZag::calculate_next_dest(Destination ab_dest, bool use_wpnav_alt, Ve // if we have a downward facing range finder then use terrain altitude targets terrain_alt = copter.rangefinder_alt_ok() && wp_nav->rangefinder_used_and_healthy(); if (terrain_alt) { +#if AP_RANGEFINDER_ENABLED if (!copter.surface_tracking.get_target_alt_cm(next_dest.z)) { next_dest.z = copter.rangefinder_state.alt_cm_filt.get(); } +#endif } else { next_dest.z = pos_control->is_active_z() ? pos_control->get_pos_target_z_cm() : inertial_nav.get_position_z_up_cm(); } @@ -506,9 +512,11 @@ bool ModeZigZag::calculate_side_dest(Vector3f& next_dest, bool& terrain_alt) con // if we have a downward facing range finder then use terrain altitude targets terrain_alt = copter.rangefinder_alt_ok() && wp_nav->rangefinder_used_and_healthy(); if (terrain_alt) { +#if AP_RANGEFINDER_ENABLED if (!copter.surface_tracking.get_target_alt_cm(next_dest.z)) { next_dest.z = copter.rangefinder_state.alt_cm_filt.get(); } +#endif } else { next_dest.z = pos_control->is_active_z() ? pos_control->get_pos_target_z_cm() : inertial_nav.get_position_z_up_cm(); } diff --git a/ArduCopter/sensors.cpp b/ArduCopter/sensors.cpp index 8cb09dcd93..f83a1c25e3 100644 --- a/ArduCopter/sensors.cpp +++ b/ArduCopter/sensors.cpp @@ -8,9 +8,9 @@ void Copter::read_barometer(void) baro_alt = barometer.get_altitude() * 100.0f; } +#if AP_RANGEFINDER_ENABLED void Copter::init_rangefinder(void) { -#if RANGEFINDER_ENABLED == ENABLED && AP_RANGEFINDER_ENABLED rangefinder.set_log_rfnd_bit(MASK_LOG_CTUN); rangefinder.init(ROTATION_PITCH_270); rangefinder_state.alt_cm_filt.set_cutoff_frequency(g2.rangefinder_filt); @@ -19,13 +19,11 @@ void Copter::init_rangefinder(void) // upward facing range finder rangefinder_up_state.alt_cm_filt.set_cutoff_frequency(g2.rangefinder_filt); rangefinder_up_state.enabled = rangefinder.has_orientation(ROTATION_PITCH_90); -#endif } // return rangefinder altitude in centimeters void Copter::read_rangefinder(void) { -#if RANGEFINDER_ENABLED == ENABLED && AP_RANGEFINDER_ENABLED rangefinder.update(); rangefinder_state.update(); @@ -36,9 +34,8 @@ void Copter::read_rangefinder(void) g2.proximity.set_rangefinder_alt(rangefinder_state.enabled, rangefinder_state.alt_healthy, rangefinder_state.alt_cm_filt.get()); } #endif - -#endif } +#endif // AP_RANGEFINDER_ENABLED // return true if rangefinder_alt can be used bool Copter::rangefinder_alt_ok() const @@ -73,7 +70,7 @@ void Copter::update_rangefinder_terrain_offset() // helper function to get inertially interpolated rangefinder height. bool Copter::get_rangefinder_height_interpolated_cm(int32_t& ret) const { -#if RANGEFINDER_ENABLED == ENABLED && AP_RANGEFINDER_ENABLED +#if AP_RANGEFINDER_ENABLED return rangefinder_state.get_rangefinder_height_interpolated_cm(ret); #else return false; diff --git a/ArduCopter/surface_tracking.cpp b/ArduCopter/surface_tracking.cpp index 57ceda03ef..ecb6a397d3 100644 --- a/ArduCopter/surface_tracking.cpp +++ b/ArduCopter/surface_tracking.cpp @@ -1,10 +1,11 @@ #include "Copter.h" +#if AP_RANGEFINDER_ENABLED + // update_surface_offset - manages the vertical offset of the position controller to follow the measured ground or ceiling // level measured using the range finder. void Copter::SurfaceTracking::update_surface_offset() { -#if RANGEFINDER_ENABLED == ENABLED // check for timeout const uint32_t now_ms = millis(); const bool timeout = (now_ms - last_update_ms) > SURFACE_TRACKING_TIMEOUT_MS; @@ -41,10 +42,6 @@ void Copter::SurfaceTracking::update_surface_offset() reset_target = true; } } -#else - copter.pos_control->set_pos_offset_z_cm(0); - copter.pos_control->set_pos_offset_target_z_cm(0); -#endif } @@ -111,3 +108,5 @@ void Copter::SurfaceTracking::set_surface(Surface new_surface) surface = new_surface; reset_target = true; } + +#endif // AP_RANGEFINDER_ENABLED diff --git a/ArduCopter/system.cpp b/ArduCopter/system.cpp index 40534a68cc..1d133932fa 100644 --- a/ArduCopter/system.cpp +++ b/ArduCopter/system.cpp @@ -27,9 +27,11 @@ void Copter::init_ardupilot() // initialise battery monitor battery.init(); +#if AP_RSSI_ENABLED // Init RSSI rssi.init(); - +#endif + barometer.init(); // setup telem slots with serial ports @@ -52,9 +54,11 @@ void Copter::init_ardupilot() init_rc_in(); // sets up rc channels from radio +#if AP_RANGEFINDER_ENABLED // initialise surface to be tracked in SurfaceTracking // must be before rc init to not override initial switch position surface_tracking.init((SurfaceTracking::Surface)copter.g2.surftrak_mode.get()); +#endif // allocate the motors class allocate_motors(); @@ -133,7 +137,7 @@ void Copter::init_ardupilot() barometer.set_log_baro_bit(MASK_LOG_IMU); barometer.calibrate(); -#if RANGEFINDER_ENABLED == ENABLED +#if AP_RANGEFINDER_ENABLED // initialise rangefinder init_rangefinder(); #endif diff --git a/ArduCopter/terrain.cpp b/ArduCopter/terrain.cpp index 5933de460e..ae02aab3b5 100644 --- a/ArduCopter/terrain.cpp +++ b/ArduCopter/terrain.cpp @@ -8,7 +8,7 @@ void Copter::terrain_update() // tell the rangefinder our height, so it can go into power saving // mode if available -#if RANGEFINDER_ENABLED == ENABLED +#if AP_RANGEFINDER_ENABLED float height; if (terrain.height_above_terrain(height, true)) { rangefinder.set_estimated_terrain_height(height); diff --git a/ArduCopter/toy_mode.cpp b/ArduCopter/toy_mode.cpp index ee5c7f9f33..1e2d631640 100644 --- a/ArduCopter/toy_mode.cpp +++ b/ArduCopter/toy_mode.cpp @@ -431,7 +431,7 @@ void ToyMode::update() if (set_and_remember_mode(Mode::Number::ALT_HOLD, ModeReason::TOY_MODE)) { gcs().send_text(MAV_SEVERITY_INFO, "Tmode: ALT_HOLD update arm"); #if AP_FENCE_ENABLED - copter.fence.enable(false); + copter.fence.enable(false, AC_FENCE_ALL_FENCES); #endif if (!copter.arming.arm(AP_Arming::Method::MAVLINK)) { // go back to LOITER @@ -460,7 +460,7 @@ void ToyMode::update() #endif } else if (copter.position_ok() && set_and_remember_mode(Mode::Number::LOITER, ModeReason::TOY_MODE)) { #if AP_FENCE_ENABLED - copter.fence.enable(true); + copter.fence.enable(true, AC_FENCE_ALL_FENCES); #endif gcs().send_text(MAV_SEVERITY_INFO, "Tmode: LOITER update"); } @@ -644,14 +644,14 @@ void ToyMode::update() if (new_mode != copter.flightmode->mode_number()) { load_test.running = false; #if AP_FENCE_ENABLED - copter.fence.enable(false); + copter.fence.enable(false, AC_FENCE_ALL_FENCES); #endif if (set_and_remember_mode(new_mode, ModeReason::TOY_MODE)) { gcs().send_text(MAV_SEVERITY_INFO, "Tmode: mode %s", copter.flightmode->name4()); // force fence on in all GPS flight modes #if AP_FENCE_ENABLED if (copter.flightmode->requires_GPS()) { - copter.fence.enable(true); + copter.fence.enable(true, AC_FENCE_ALL_FENCES); } #endif } else { @@ -662,7 +662,7 @@ void ToyMode::update() set_and_remember_mode(Mode::Number::LAND, ModeReason::TOY_MODE); #if AP_FENCE_ENABLED if (copter.landing_with_GPS()) { - copter.fence.enable(true); + copter.fence.enable(true, AC_FENCE_ALL_FENCES); } #endif } @@ -801,7 +801,7 @@ void ToyMode::action_arm(void) if (needs_gps && copter.arming.gps_checks(false)) { #if AP_FENCE_ENABLED // we want GPS and checks are passing, arm and enable fence - copter.fence.enable(true); + copter.fence.enable(true, AC_FENCE_ALL_FENCES); #endif copter.arming.arm(AP_Arming::Method::RUDDER); if (!copter.motors->armed()) { @@ -817,7 +817,7 @@ void ToyMode::action_arm(void) } else { #if AP_FENCE_ENABLED // non-GPS mode - copter.fence.enable(false); + copter.fence.enable(false, AC_FENCE_ALL_FENCES); #endif copter.arming.arm(AP_Arming::Method::RUDDER); if (!copter.motors->armed()) { diff --git a/ArduCopter/tuning.cpp b/ArduCopter/tuning.cpp index c2cea3c72f..5bca6e61f7 100644 --- a/ArduCopter/tuning.cpp +++ b/ArduCopter/tuning.cpp @@ -1,33 +1,34 @@ #include "Copter.h" /* - * Function to update various parameters in flight using the ch6 tuning knob + * Function to update various parameters in flight using the TRANSMITTER_TUNING channel knob * This should not be confused with the AutoTune feature which can be found in control_autotune.cpp */ -// tuning - updates parameters based on the ch6 tuning knob's position +// tuning - updates parameters based on the ch6 TRANSMITTER_TUNING channel knob's position // should be called at 3.3hz void Copter::tuning() { - const RC_Channel *rc6 = rc().channel(CH_6); + const RC_Channel *rc_tuning = rc().find_channel_for_option(RC_Channel::AUX_FUNC::TRANSMITTER_TUNING); + // exit immediately if tuning channel is not set + if (rc_tuning == nullptr) { + return; + } + // exit immediately if the tuning function is not set or min and max are both zero if ((g.radio_tuning <= 0) || (is_zero(g2.tuning_min.get()) && is_zero(g2.tuning_max.get()))) { return; } // exit immediately when radio failsafe is invoked or transmitter has not been turned on - if (failsafe.radio || failsafe.radio_counter != 0 || rc6->get_radio_in() == 0) { + if (failsafe.radio || failsafe.radio_counter != 0 || rc_tuning->get_radio_in() == 0) { return; } - // exit immediately if a function is assigned to channel 6 - if ((RC_Channel::AUX_FUNC)rc6->option.get() != RC_Channel::AUX_FUNC::DO_NOTHING) { - return; - } - - const uint16_t radio_in = rc6->get_radio_in(); - float tuning_value = linear_interpolate(g2.tuning_min, g2.tuning_max, radio_in, rc6->get_radio_min(), rc6->get_radio_max()); + const uint16_t radio_in = rc_tuning->get_radio_in(); + float tuning_value = linear_interpolate(g2.tuning_min, g2.tuning_max, radio_in, rc_tuning->get_radio_min(), rc_tuning->get_radio_max()); + #if HAL_LOGGING_ENABLED Log_Write_Parameter_Tuning(g.radio_tuning, tuning_value, g2.tuning_min, g2.tuning_max); #endif @@ -36,70 +37,70 @@ void Copter::tuning() // Roll, Pitch tuning case TUNING_STABILIZE_ROLL_PITCH_KP: - attitude_control->get_angle_roll_p().kP(tuning_value); - attitude_control->get_angle_pitch_p().kP(tuning_value); + attitude_control->get_angle_roll_p().set_kP(tuning_value); + attitude_control->get_angle_pitch_p().set_kP(tuning_value); break; case TUNING_RATE_ROLL_PITCH_KP: - attitude_control->get_rate_roll_pid().kP(tuning_value); - attitude_control->get_rate_pitch_pid().kP(tuning_value); + attitude_control->get_rate_roll_pid().set_kP(tuning_value); + attitude_control->get_rate_pitch_pid().set_kP(tuning_value); break; case TUNING_RATE_ROLL_PITCH_KI: - attitude_control->get_rate_roll_pid().kI(tuning_value); - attitude_control->get_rate_pitch_pid().kI(tuning_value); + attitude_control->get_rate_roll_pid().set_kI(tuning_value); + attitude_control->get_rate_pitch_pid().set_kI(tuning_value); break; case TUNING_RATE_ROLL_PITCH_KD: - attitude_control->get_rate_roll_pid().kD(tuning_value); - attitude_control->get_rate_pitch_pid().kD(tuning_value); + attitude_control->get_rate_roll_pid().set_kD(tuning_value); + attitude_control->get_rate_pitch_pid().set_kD(tuning_value); break; // Yaw tuning case TUNING_STABILIZE_YAW_KP: - attitude_control->get_angle_yaw_p().kP(tuning_value); + attitude_control->get_angle_yaw_p().set_kP(tuning_value); break; case TUNING_YAW_RATE_KP: - attitude_control->get_rate_yaw_pid().kP(tuning_value); + attitude_control->get_rate_yaw_pid().set_kP(tuning_value); break; case TUNING_YAW_RATE_KD: - attitude_control->get_rate_yaw_pid().kD(tuning_value); + attitude_control->get_rate_yaw_pid().set_kD(tuning_value); break; // Altitude and throttle tuning case TUNING_ALTITUDE_HOLD_KP: - pos_control->get_pos_z_p().kP(tuning_value); + pos_control->get_pos_z_p().set_kP(tuning_value); break; case TUNING_THROTTLE_RATE_KP: - pos_control->get_vel_z_pid().kP(tuning_value); + pos_control->get_vel_z_pid().set_kP(tuning_value); break; case TUNING_ACCEL_Z_KP: - pos_control->get_accel_z_pid().kP(tuning_value); + pos_control->get_accel_z_pid().set_kP(tuning_value); break; case TUNING_ACCEL_Z_KI: - pos_control->get_accel_z_pid().kI(tuning_value); + pos_control->get_accel_z_pid().set_kI(tuning_value); break; case TUNING_ACCEL_Z_KD: - pos_control->get_accel_z_pid().kD(tuning_value); + pos_control->get_accel_z_pid().set_kD(tuning_value); break; // Loiter and navigation tuning case TUNING_LOITER_POSITION_KP: - pos_control->get_pos_xy_p().kP(tuning_value); + pos_control->get_pos_xy_p().set_kP(tuning_value); break; case TUNING_VEL_XY_KP: - pos_control->get_vel_xy_pid().kP(tuning_value); + pos_control->get_vel_xy_pid().set_kP(tuning_value); break; case TUNING_VEL_XY_KI: - pos_control->get_vel_xy_pid().kI(tuning_value); + pos_control->get_vel_xy_pid().set_kI(tuning_value); break; case TUNING_WP_SPEED: @@ -126,15 +127,15 @@ void Copter::tuning() break; case TUNING_RATE_PITCH_FF: - attitude_control->get_rate_pitch_pid().ff(tuning_value); + attitude_control->get_rate_pitch_pid().set_ff(tuning_value); break; case TUNING_RATE_ROLL_FF: - attitude_control->get_rate_roll_pid().ff(tuning_value); + attitude_control->get_rate_roll_pid().set_ff(tuning_value); break; case TUNING_RATE_YAW_FF: - attitude_control->get_rate_yaw_pid().ff(tuning_value); + attitude_control->get_rate_yaw_pid().set_ff(tuning_value); break; #endif @@ -153,27 +154,27 @@ void Copter::tuning() break; case TUNING_RATE_PITCH_KP: - attitude_control->get_rate_pitch_pid().kP(tuning_value); + attitude_control->get_rate_pitch_pid().set_kP(tuning_value); break; case TUNING_RATE_PITCH_KI: - attitude_control->get_rate_pitch_pid().kI(tuning_value); + attitude_control->get_rate_pitch_pid().set_kI(tuning_value); break; case TUNING_RATE_PITCH_KD: - attitude_control->get_rate_pitch_pid().kD(tuning_value); + attitude_control->get_rate_pitch_pid().set_kD(tuning_value); break; case TUNING_RATE_ROLL_KP: - attitude_control->get_rate_roll_pid().kP(tuning_value); + attitude_control->get_rate_roll_pid().set_kP(tuning_value); break; case TUNING_RATE_ROLL_KI: - attitude_control->get_rate_roll_pid().kI(tuning_value); + attitude_control->get_rate_roll_pid().set_kI(tuning_value); break; case TUNING_RATE_ROLL_KD: - attitude_control->get_rate_roll_pid().kD(tuning_value); + attitude_control->get_rate_roll_pid().set_kD(tuning_value); break; #if FRAME_CONFIG != HELI_FRAME @@ -183,7 +184,7 @@ void Copter::tuning() #endif case TUNING_RATE_YAW_FILT: - attitude_control->get_rate_yaw_pid().filt_E_hz(tuning_value); + attitude_control->get_rate_yaw_pid().set_filt_E_hz(tuning_value); break; case TUNING_SYSTEM_ID_MAGNITUDE: diff --git a/ArduPlane/AP_Arming.cpp b/ArduPlane/AP_Arming.cpp index a774b778f5..643f93a6c1 100644 --- a/ArduPlane/AP_Arming.cpp +++ b/ArduPlane/AP_Arming.cpp @@ -370,12 +370,8 @@ bool AP_Arming_Plane::disarm(const AP_Arming::Method method, bool do_disarm_chec change_arm_state(); #if QAUTOTUNE_ENABLED - //save qautotune gains if enabled and success - if (plane.control_mode == &plane.mode_qautotune) { - plane.quadplane.qautotune.save_tuning_gains(); - } else { - plane.quadplane.qautotune.reset(); - } + // Possibly save auto tuned parameters + plane.quadplane.qautotune.disarmed(plane.control_mode == &plane.mode_qautotune); #endif // re-initialize speed variable used in AUTO and GUIDED for diff --git a/ArduPlane/ArduPlane.cpp b/ArduPlane/ArduPlane.cpp index 59e65dc343..92da0c41d1 100644 --- a/ArduPlane/ArduPlane.cpp +++ b/ArduPlane/ArduPlane.cpp @@ -31,7 +31,7 @@ All entries in this table must be ordered by priority. - This table is interleaved with the table presnet in each of the + This table is interleaved with the table present in each of the vehicles to determine the order in which tasks are run. Convenience methods SCHED_TASK and SCHED_TASK_CLASS are provided to build entries in this structure: @@ -81,7 +81,9 @@ const AP_Scheduler::Task Plane::scheduler_tasks[] = { SCHED_TASK_CLASS(AP_ServoRelayEvents, &plane.ServoRelayEvents, update_events, 50, 150, 63), #endif SCHED_TASK_CLASS(AP_BattMonitor, &plane.battery, read, 10, 300, 66), +#if AP_RANGEFINDER_ENABLED SCHED_TASK(read_rangefinder, 50, 100, 78), +#endif #if AP_ICENGINE_ENABLED SCHED_TASK_CLASS(AP_ICEngine, &plane.g2.ice_control, update, 10, 100, 81), #endif @@ -557,7 +559,7 @@ void Plane::update_alt() // low pass the sink rate to take some of the noise out auto_state.sink_rate = 0.8f * auto_state.sink_rate + 0.2f*sink_rate; -#if PARACHUTE == ENABLED +#if HAL_PARACHUTE_ENABLED parachute.set_sink_rate(auto_state.sink_rate); #endif @@ -750,7 +752,9 @@ float Plane::tecs_hgt_afe(void) float hgt_afe; if (flight_stage == AP_FixedWing::FlightStage::LAND) { hgt_afe = height_above_target(); +#if AP_RANGEFINDER_ENABLED hgt_afe -= rangefinder_correction(); +#endif } else { // when in normal flight we pass the hgt_afe as relative // altitude to home @@ -829,7 +833,7 @@ bool Plane::set_target_location(const Location &target_loc) #endif //AP_SCRIPTING_ENABLED || AP_EXTERNAL_CONTROL_ENABLED #if AP_SCRIPTING_ENABLED -// set target location (for use by scripting) +// get target location (for use by scripting) bool Plane::get_target_location(Location& target_loc) { switch (control_mode->mode_number()) { @@ -967,7 +971,11 @@ bool Plane::flight_option_enabled(FlightOptions flight_option) const void Plane::precland_update(void) { // alt will be unused if we pass false through as the second parameter: +#if AP_RANGEFINDER_ENABLED return g2.precland.update(rangefinder_state.height_estimate*100, rangefinder_state.in_range); +#else + return g2.precland.update(0, false); +#endif } #endif diff --git a/ArduPlane/Attitude.cpp b/ArduPlane/Attitude.cpp index 0996a50b72..788fe97dba 100644 --- a/ArduPlane/Attitude.cpp +++ b/ArduPlane/Attitude.cpp @@ -448,6 +448,10 @@ void Plane::stabilize() } +/* + * Set the throttle output. + * This is called by TECS-enabled flight modes, e.g. AUTO, GUIDED, etc. +*/ void Plane::calc_throttle() { if (aparm.throttle_cruise <= 1) { @@ -458,6 +462,7 @@ void Plane::calc_throttle() return; } + // Read the TECS throttle output and set it to the throttle channel. float commanded_throttle = TECS_controller.get_throttle_demand(); SRV_Channels::set_output_scaled(SRV_Channel::k_throttle, commanded_throttle); } diff --git a/ArduPlane/GCS_Mavlink.cpp b/ArduPlane/GCS_Mavlink.cpp index 8ffa3f8297..799a3db5e4 100644 --- a/ArduPlane/GCS_Mavlink.cpp +++ b/ArduPlane/GCS_Mavlink.cpp @@ -645,7 +645,9 @@ static const ap_message STREAM_RAW_CONTROLLER_msgs[] = { static const ap_message STREAM_RC_CHANNELS_msgs[] = { MSG_SERVO_OUTPUT_RAW, MSG_RC_CHANNELS, +#if AP_MAVLINK_MSG_RC_CHANNELS_RAW_ENABLED MSG_RC_CHANNELS_RAW, // only sent on a mavlink1 connection +#endif }; static const ap_message STREAM_EXTRA1_msgs[] = { MSG_ATTITUDE, @@ -841,6 +843,14 @@ MAV_RESULT GCS_MAVLINK_Plane::handle_command_int_do_reposition(const mavlink_com return MAV_RESULT_DENIED; } +#if AP_FENCE_ENABLED + // reject destination if outside the fence + if (!plane.fence.check_destination_within_fence(requested_position)) { + LOGGER_WRITE_ERROR(LogErrorSubsystem::NAVIGATION, LogErrorCode::DEST_OUTSIDE_FENCE); + return MAV_RESULT_DENIED; + } +#endif + // location is valid load and set if (((int32_t)packet.param2 & MAV_DO_REPOSITION_FLAGS_CHANGE_MODE) || (plane.control_mode == &plane.mode_guided)) { @@ -864,12 +874,11 @@ MAV_RESULT GCS_MAVLINK_Plane::handle_command_int_do_reposition(const mavlink_com return MAV_RESULT_FAILED; } +#if AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED // these are GUIDED mode commands that are RATE or slew enabled, so you can have more powerful control than default controls. MAV_RESULT GCS_MAVLINK_Plane::handle_command_int_guided_slew_commands(const mavlink_command_int_t &packet) { switch(packet.command) { - -#if OFFBOARD_GUIDED == ENABLED case MAV_CMD_GUIDED_CHANGE_SPEED: { // command is only valid in guided mode if (plane.control_mode != &plane.mode_guided) { @@ -998,14 +1007,11 @@ MAV_RESULT GCS_MAVLINK_Plane::handle_command_int_guided_slew_commands(const mavl plane.guided_state.target_heading_time_ms = AP_HAL::millis(); return MAV_RESULT_ACCEPTED; } -#endif // OFFBOARD_GUIDED == ENABLED - - } // anything else ... return MAV_RESULT_UNSUPPORTED; - } +#endif // AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED MAV_RESULT GCS_MAVLINK_Plane::handle_command_int_packet(const mavlink_command_int_t &packet, const mavlink_message_t &msg) { @@ -1017,11 +1023,13 @@ MAV_RESULT GCS_MAVLINK_Plane::handle_command_int_packet(const mavlink_command_in case MAV_CMD_DO_REPOSITION: return handle_command_int_do_reposition(packet); +#if AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED // special 'slew-enabled' guided commands here... for speed,alt, and direction commands case MAV_CMD_GUIDED_CHANGE_SPEED: case MAV_CMD_GUIDED_CHANGE_ALTITUDE: case MAV_CMD_GUIDED_CHANGE_HEADING: return handle_command_int_guided_slew_commands(packet); +#endif #if AP_SCRIPTING_ENABLED && AP_FOLLOW_ENABLED case MAV_CMD_DO_FOLLOW: @@ -1044,7 +1052,7 @@ MAV_RESULT GCS_MAVLINK_Plane::handle_command_int_packet(const mavlink_command_in case MAV_CMD_DO_CHANGE_SPEED: return handle_command_DO_CHANGE_SPEED(packet); -#if PARACHUTE == ENABLED +#if HAL_PARACHUTE_ENABLED case MAV_CMD_DO_PARACHUTE: return handle_MAV_CMD_DO_PARACHUTE(packet); #endif @@ -1083,6 +1091,12 @@ MAV_RESULT GCS_MAVLINK_Plane::handle_command_int_packet(const mavlink_command_in plane.set_mode(plane.mode_rtl, ModeReason::GCS_COMMAND); return MAV_RESULT_ACCEPTED; +#if AP_MAVLINK_MAV_CMD_SET_HAGL_ENABLED + case MAV_CMD_SET_HAGL: + plane.handle_external_hagl(packet); + return MAV_RESULT_ACCEPTED; +#endif + default: return GCS_MAVLINK::handle_command_int_packet(packet, msg); } @@ -1166,7 +1180,7 @@ MAV_RESULT GCS_MAVLINK_Plane::handle_MAV_CMD_DO_AUTOTUNE_ENABLE(const mavlink_co return MAV_RESULT_ACCEPTED; } -#if PARACHUTE == ENABLED +#if HAL_PARACHUTE_ENABLED MAV_RESULT GCS_MAVLINK_Plane::handle_MAV_CMD_DO_PARACHUTE(const mavlink_command_int_t &packet) { // configure or release parachute diff --git a/ArduPlane/GCS_Plane.cpp b/ArduPlane/GCS_Plane.cpp index 39989dba93..baf2cd9c92 100644 --- a/ArduPlane/GCS_Plane.cpp +++ b/ArduPlane/GCS_Plane.cpp @@ -114,6 +114,7 @@ void GCS_Plane::update_vehicle_sensor_status_flags(void) } #endif +#if AP_RANGEFINDER_ENABLED const RangeFinder *rangefinder = RangeFinder::get_singleton(); if (rangefinder && rangefinder->has_orientation(ROTATION_PITCH_270)) { control_sensors_present |= MAV_SYS_STATUS_SENSOR_LASER_POSITION; @@ -124,4 +125,5 @@ void GCS_Plane::update_vehicle_sensor_status_flags(void) control_sensors_health |= MAV_SYS_STATUS_SENSOR_LASER_POSITION; } } +#endif } diff --git a/ArduPlane/Log.cpp b/ArduPlane/Log.cpp index a73c6dc552..c9fdd0783b 100644 --- a/ArduPlane/Log.cpp +++ b/ArduPlane/Log.cpp @@ -121,7 +121,7 @@ void Plane::Log_Write_Control_Tuning() logger.WriteBlock(&pkt, sizeof(pkt)); } -#if OFFBOARD_GUIDED == ENABLED +#if AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED struct PACKED log_OFG_Guided { LOG_PACKET_HEADER; uint64_t time_us; @@ -255,15 +255,17 @@ void Plane::Log_Write_RC(void) { logger.Write_RCIN(); logger.Write_RCOUT(); +#if AP_RSSI_ENABLED if (rssi.enabled()) { logger.Write_RSSI(); } +#endif Log_Write_AETR(); } void Plane::Log_Write_Guided(void) { -#if OFFBOARD_GUIDED == ENABLED +#if AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED if (control_mode != &mode_guided) { return; } @@ -275,7 +277,7 @@ void Plane::Log_Write_Guided(void) if ( is_positive(guided_state.target_alt) || is_positive(guided_state.target_airspeed_cm) ) { Log_Write_OFG_Guided(); } -#endif // OFFBOARD_GUIDED == ENABLED +#endif // AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED } // incoming-to-vehicle mavlink COMMAND_INT can be logged @@ -431,7 +433,7 @@ const struct LogStructure Plane::log_structure[] = { // @LoggerMessage: TSIT // @Description: tailsitter speed scailing values // @Field: TimeUS: Time since system startup -// @Field: Ts: throttle scailing used for tilt motors +// @Field: Ts: throttle scaling used for tilt motors // @Field: Ss: speed scailing used for control surfaces method from Q_TAILSIT_GSCMSK // @Field: Tmin: minimum output throttle caculated from disk thoery gain scale with Q_TAILSIT_MIN_VO #if HAL_QUADPLANE_ENABLED @@ -481,7 +483,7 @@ const struct LogStructure Plane::log_structure[] = { { LOG_AETR_MSG, sizeof(log_AETR), "AETR", "Qfffffff", "TimeUS,Ail,Elev,Thr,Rudd,Flap,Steer,SS", "s-------", "F-------" , true }, -#if OFFBOARD_GUIDED == ENABLED +#if AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED // @LoggerMessage: OFG // @Description: OFfboard-Guided - an advanced version of GUIDED for companion computers that includes rate/s. // @Field: TimeUS: Time since system startup diff --git a/ArduPlane/Parameters.cpp b/ArduPlane/Parameters.cpp index 4da8435d3a..2c4d9cfed6 100644 --- a/ArduPlane/Parameters.cpp +++ b/ArduPlane/Parameters.cpp @@ -142,12 +142,28 @@ const AP_Param::Info Plane::var_info[] = { // @Param: TKOFF_THR_MAX_T // @DisplayName: Takeoff throttle maximum time - // @Description: This sets the time that maximum throttle will be forced during a fixed wing takeoff without an airspeed sensor. If an airspeed sensor is being used then the throttle is set to maximum until the takeoff airspeed is reached. + // @Description: This sets the time that maximum throttle will be forced during a fixed wing takeoff. // @Units: s // @Range: 0 10 // @Increment: 0.5 // @User: Standard ASCALAR(takeoff_throttle_max_t, "TKOFF_THR_MAX_T", 4), + + // @Param: TKOFF_THR_MIN + // @DisplayName: Takeoff minimum throttle + // @Description: The minimum throttle to use in takeoffs in AUTO and TAKEOFF flight modes, when TKOFF_OPTIONS bit 0 is set. Also, the minimum throttle to use in a quadpane forward transition. This can be useful to ensure faster takeoffs or transitions on aircraft where the normal throttle control leads to a slow takeoff or transition. It is used when it is larger than THR_MIN, otherwise THR_MIN is used instead. + // @Units: % + // @Range: 0 100 + // @Increment: 1 + // @User: Standard + ASCALAR(takeoff_throttle_min, "TKOFF_THR_MIN", 60), + + // @Param: TKOFF_OPTIONS + // @DisplayName: Takeoff options + // @Description: This selects the mode of the takeoff in AUTO and TAKEOFF flight modes. + // @Bitmask: 0: When unset the maximum allowed throttle is always used (THR_MAX or TKOFF_THR_MAX) during takeoff. When set TECS is allowed to operate between a minimum (THR_MIN or TKOFF_THR_MIN) and a maximum (THR_MAX or TKOFF_THR_MAX) limit. Applicable only when using an airspeed sensor. + // @User: Advanced + ASCALAR(takeoff_options, "TKOFF_OPTIONS", 0), // @Param: TKOFF_TDRAG_ELEV // @DisplayName: Takeoff tail dragger elevator @@ -296,6 +312,14 @@ const AP_Param::Info Plane::var_info[] = { // @User: Standard ASCALAR(airspeed_max, "AIRSPEED_MAX", AIRSPEED_FBW_MAX), + // @Param: AIRSPEED_STALL + // @DisplayName: Stall airspeed + // @Description: If stall prevention is enabled this speed is used to calculate the minimum airspeed while banking. If this is set to 0 then the stall speed is assumed to be the minimum airspeed speed. Typically set slightly higher then true stall speed. Value is as an indicated (calibrated/apparent) airspeed. + // @Units: m/s + // @Range: 5 75 + // @User: Standard + ASCALAR(airspeed_stall, "AIRSPEED_STALL", 0), + // @Param: FBWB_ELEV_REV // @DisplayName: Fly By Wire elevator reverse // @Description: Reverse sense of elevator in FBWB and CRUISE modes. When set to 0 up elevator (pulling back on the stick) means to lower altitude. When set to 1, up elevator means to raise altitude. @@ -758,12 +782,13 @@ const AP_Param::Info Plane::var_info[] = { GOBJECT(relay, "RELAY", AP_Relay), #endif -#if PARACHUTE == ENABLED +#if HAL_PARACHUTE_ENABLED // @Group: CHUTE_ // @Path: ../libraries/AP_Parachute/AP_Parachute.cpp GOBJECT(parachute, "CHUTE_", AP_Parachute), #endif +#if AP_RANGEFINDER_ENABLED // @Group: RNGFND // @Path: ../libraries/AP_RangeFinder/AP_RangeFinder.cpp GOBJECT(rangefinder, "RNGFND", RangeFinder), @@ -774,6 +799,7 @@ const AP_Param::Info Plane::var_info[] = { // @Values: 0:Disabled,1:Enabled // @User: Standard GSCALAR(rangefinder_landing, "RNGFND_LANDING", 0), +#endif #if AP_TERRAIN_AVAILABLE // @Group: TERRAIN_ @@ -965,9 +991,11 @@ const AP_Param::Info Plane::var_info[] = { GOBJECT(rpm_sensor, "RPM", AP_RPM), #endif +#if AP_RSSI_ENABLED // @Group: RSSI_ // @Path: ../libraries/AP_RSSI/AP_RSSI.cpp GOBJECT(rssi, "RSSI_", AP_RSSI), +#endif // @Group: NTF_ // @Path: ../libraries/AP_Notify/AP_Notify.cpp @@ -1084,6 +1112,7 @@ const AP_Param::GroupInfo ParametersG2::var_info[] = { // @Bitmask: 11: Disable suppression of fixed wing rate gains in ground mode // @Bitmask: 12: Enable FBWB style loiter altitude control // @Bitmask: 13: Indicate takeoff waiting for neutral rudder with flight control surfaces + // @Bitmask: 14: In AUTO - climb to next waypoint altitude immediately instead of linear climb // @User: Advanced AP_GROUPINFO("FLIGHT_OPTIONS", 13, ParametersG2, flight_options, 0), @@ -1189,11 +1218,11 @@ const AP_Param::GroupInfo ParametersG2::var_info[] = { // @User: Standard AP_GROUPINFO("RTL_CLIMB_MIN", 27, ParametersG2, rtl_climb_min, 0), -#if OFFBOARD_GUIDED == ENABLED +#if AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED // @Group: GUIDED_ // @Path: ../libraries/AC_PID/AC_PID.cpp AP_SUBGROUPINFO(guidedHeading, "GUIDED_", 28, ParametersG2, AC_PID), -#endif // OFFBOARD_GUIDED == ENABLED +#endif // AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED // @Param: MAN_EXPO_ROLL // @DisplayName: Manual control expo for roll diff --git a/ArduPlane/Parameters.h b/ArduPlane/Parameters.h index ba89c45772..38801d9963 100644 --- a/ArduPlane/Parameters.h +++ b/ArduPlane/Parameters.h @@ -343,6 +343,7 @@ public: k_param_mixing_offset, k_param_dspoiler_rud_rate, + k_param_airspeed_stall, k_param_logger = 253, // Logging Group @@ -356,6 +357,8 @@ public: k_param_acro_yaw_rate, k_param_takeoff_throttle_max_t, k_param_autotune_options, + k_param_takeoff_throttle_min, + k_param_takeoff_options, }; AP_Int16 format_version; @@ -552,7 +555,7 @@ public: } fwd_batt_cmp; -#if OFFBOARD_GUIDED == ENABLED +#if AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED // guided yaw heading PID AC_PID guidedHeading{5000.0, 0.0, 0.0, 0 , 10.0, 5.0, 5.0 , 5.0 , 0.0}; #endif diff --git a/ArduPlane/Plane.h b/ArduPlane/Plane.h index 613cc25a9b..52d9b0f8c9 100644 --- a/ArduPlane/Plane.h +++ b/ArduPlane/Plane.h @@ -39,7 +39,7 @@ #include // interface and maths for accelerometer calibration #include // ArduPilot Mega DCM Library #include -#include // Range finder library +#include // Range finder library #include // Filter library #include // Photo or video camera #include @@ -206,7 +206,23 @@ private: AP_Int8 *flight_modes = &g.flight_mode1; const uint8_t num_flight_modes = 6; +#if AP_RANGEFINDER_ENABLED AP_FixedWing::Rangefinder_State rangefinder_state; +#endif + +#if AP_MAVLINK_MAV_CMD_SET_HAGL_ENABLED + struct { + // allow for external height above ground estimate + float hagl; + uint32_t last_update_ms; + uint32_t timeout_ms; + } external_hagl; + bool get_external_HAGL(float &height_agl); + void handle_external_hagl(const mavlink_command_int_t &packet); +#endif // AP_MAVLINK_MAV_CMD_SET_HAGL_ENABLED + + float get_landing_height(bool &using_rangefinder); + #if AP_RPM_ENABLED AP_RPM rpm_sensor; @@ -350,19 +366,20 @@ private: uint32_t AFS_last_valid_rc_ms; } failsafe; - enum Landing_ApproachStage { - RTL, - LOITER_TO_ALT, - ENSURE_RADIUS, - WAIT_FOR_BREAKOUT, - APPROACH_LINE, - VTOL_LANDING, - }; - #if HAL_QUADPLANE_ENABLED // Landing - struct { - enum Landing_ApproachStage approach_stage; + class VTOLApproach { + public: + enum class Stage { + RTL, + LOITER_TO_ALT, + ENSURE_RADIUS, + WAIT_FOR_BREAKOUT, + APPROACH_LINE, + VTOL_LANDING, + }; + + Stage approach_stage; float approach_direction_deg; } vtol_approach_s; #endif @@ -537,7 +554,7 @@ private: float forced_throttle; uint32_t last_forced_throttle_ms; -#if OFFBOARD_GUIDED == ENABLED +#if AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED // airspeed adjustments float target_airspeed_cm = -1; // don't default to zero here, as zero is a valid speed. float target_airspeed_accel; @@ -556,7 +573,7 @@ private: uint32_t target_heading_time_ms; guided_heading_type_t target_heading_type; bool target_heading_limit; -#endif // OFFBOARD_GUIDED == ENABLED +#endif // AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED } guided_state; #if AP_LANDINGGEAR_ENABLED @@ -633,7 +650,7 @@ private: FUNCTOR_BIND_MEMBER(&Plane::exit_mission_callback, void)}; -#if PARACHUTE == ENABLED +#if HAL_PARACHUTE_ENABLED AP_Parachute parachute; #endif @@ -865,9 +882,11 @@ private: float mission_alt_offset(void); float height_above_target(void); float lookahead_adjustment(void); +#if AP_RANGEFINDER_ENABLED float rangefinder_correction(void); void rangefinder_height_update(void); void rangefinder_terrain_correction(float &height); +#endif void stabilize(); void calc_throttle(); void calc_nav_roll(); @@ -1074,8 +1093,10 @@ private: bool rc_throttle_value_ok(void) const; bool rc_failsafe_active(void) const; +#if AP_RANGEFINDER_ENABLED // sensors.cpp void read_rangefinder(void); +#endif // system.cpp void init_ardupilot() override; @@ -1094,6 +1115,7 @@ private: bool auto_takeoff_check(void); void takeoff_calc_roll(void); void takeoff_calc_pitch(void); + void takeoff_calc_throttle(const bool use_max_throttle=false); int8_t takeoff_tail_hold(void); int16_t get_takeoff_pitch_min_cd(void); void landing_gear_update(void); @@ -1134,7 +1156,7 @@ private: // parachute.cpp void parachute_check(); -#if PARACHUTE == ENABLED +#if HAL_PARACHUTE_ENABLED void do_parachute(const AP_Mission::Mission_Command& cmd); void parachute_release(); bool parachute_manual_release(); diff --git a/ArduPlane/RC_Channel.cpp b/ArduPlane/RC_Channel.cpp index 9230792084..424c861c7f 100644 --- a/ArduPlane/RC_Channel.cpp +++ b/ArduPlane/RC_Channel.cpp @@ -95,9 +95,9 @@ void RC_Channel_Plane::do_aux_function_crow_mode(AuxSwitchPos ch_flag) } } +#if HAL_SOARING_ENABLED void RC_Channel_Plane::do_aux_function_soaring_3pos(AuxSwitchPos ch_flag) { -#if HAL_SOARING_ENABLED SoaringController::ActiveStatus desired_state = SoaringController::ActiveStatus::SOARING_DISABLED; switch (ch_flag) { @@ -113,8 +113,8 @@ void RC_Channel_Plane::do_aux_function_soaring_3pos(AuxSwitchPos ch_flag) } plane.g2.soaring_controller.set_pilot_desired_state(desired_state); -#endif } +#endif void RC_Channel_Plane::do_aux_function_flare(AuxSwitchPos ch_flag) { @@ -169,6 +169,9 @@ void RC_Channel_Plane::init_aux_function(const RC_Channel::AUX_FUNC ch_option, case AUX_FUNC::FW_AUTOTUNE: case AUX_FUNC::VFWD_THR_OVERRIDE: case AUX_FUNC::PRECISION_LOITER: +#if QAUTOTUNE_ENABLED + case AUX_FUNC::AUTOTUNE_TEST_GAINS: +#endif break; case AUX_FUNC::SOARING: @@ -275,9 +278,11 @@ bool RC_Channel_Plane::do_aux_function(const AUX_FUNC ch_option, const AuxSwitch } #endif +#if HAL_SOARING_ENABLED case AUX_FUNC::SOARING: do_aux_function_soaring_3pos(ch_flag); break; +#endif case AUX_FUNC::FLAP: case AUX_FUNC::FBWA_TAILDRAGGER: @@ -333,8 +338,8 @@ bool RC_Channel_Plane::do_aux_function(const AUX_FUNC ch_option, const AuxSwitch break; #endif - case AUX_FUNC::ARSPD_CALIBRATE: #if AP_AIRSPEED_AUTOCAL_ENABLE + case AUX_FUNC::ARSPD_CALIBRATE: switch (ch_flag) { case AuxSwitchPos::HIGH: plane.airspeed.set_calibration_enabled(true); @@ -345,20 +350,20 @@ bool RC_Channel_Plane::do_aux_function(const AUX_FUNC ch_option, const AuxSwitch plane.airspeed.set_calibration_enabled(false); break; } -#endif break; +#endif case AUX_FUNC::LANDING_FLARE: do_aux_function_flare(ch_flag); break; +#if HAL_PARACHUTE_ENABLED case AUX_FUNC::PARACHUTE_RELEASE: -#if PARACHUTE == ENABLED if (ch_flag == AuxSwitchPos::HIGH) { plane.parachute_manual_release(); } -#endif break; +#endif case AUX_FUNC::MODE_SWITCH_RESET: rc().reset_mode_switch(); @@ -439,6 +444,12 @@ bool RC_Channel_Plane::do_aux_function(const AUX_FUNC ch_option, const AuxSwitch // handled by lua scripting, just ignore here break; +#if QAUTOTUNE_ENABLED + case AUX_FUNC::AUTOTUNE_TEST_GAINS: + plane.quadplane.qautotune.do_aux_function(ch_flag); + break; +#endif + default: return RC_Channel::do_aux_function(ch_option, ch_flag); } diff --git a/ArduPlane/ReleaseNotes.txt b/ArduPlane/ReleaseNotes.txt index 6f32ba304b..84674f8abc 100644 --- a/ArduPlane/ReleaseNotes.txt +++ b/ArduPlane/ReleaseNotes.txt @@ -1,5 +1,64 @@ ArduPilot Plane Release Notes: ------------------------------- +------------------------------------------------------------------ +Release 4.5.5 1st Aug 2024 + +No changes from 4.5.5-beta2 +------------------------------------------------------------------ +Release 4.5.5-beta2 27 July 2024 + +Changes from 4.5.5-beta1 + +1) Board specific enhancements and bug fixes + +- CubeRed's second core disabled at boot to avoid spurious writes to RAM +- CubeRed bootloader's dual endpoint update method fixed +------------------------------------------------------------------ +Release 4.5.5-beta1 1st July 2024 + +Changes from 4.5.4 + +1) Board specific enhancements and bug fixes + +- fixed IOMCU transmission errors when using bdshot +- update relay parameter names on various boards +- add ASP5033 airspeed in minimal builds +- added RadiolinkPIX6 +- fix Aocoda-RC H743Dual motor issue +- use ICM45686 as an ICM20649 alternative in CubeRedPrimary + +2) System level minor enhancements and bug fixes + +- correct use-after-free in script statistics +- added arming check for eeprom full +- fixed a block logging issue which caused log messages to be dropped +- enable Socket SO_REUSEADDR on LwIP +- removed IST8310 overrun message +- added Siyi ZT6 support +- added BTFL sidebar symbols to the OSD +- added CRSF extended link stats to the OSD +- use the ESC with the highest RPM in the OSD when only one can be displayed +- support all Tramp power levels on high power VTXs +- emit jump count in missions even if no limit +- improve the bitmask indicating persistent parameters on bootloader flash +- fix duplicate error condition in the MicroStrain7 + +3) AHRS / EKF fixes + +- fix infinite climb bug when using EK3_OGN_HGT_MASK + +4) Plane specific changes + +- fix rangefinder correction when terrain following is off +- correct description of MIN_GROUNDSPEED parameter +- correct Q_TRIM_PITCH description +- ensure the dshot type gets set at startup + +5) Other minor enhancements and bug fixes + +- specify pymonocypher version in more places +- added DroneCAN dependencies to custom builds + +------------------------------------------------------------------ Release 4.5.4 12th June 2024 Changes from 4.5.3 diff --git a/ArduPlane/altitude.cpp b/ArduPlane/altitude.cpp index d30fc76566..5b845f38a8 100644 --- a/ArduPlane/altitude.cpp +++ b/ArduPlane/altitude.cpp @@ -81,6 +81,13 @@ void Plane::setup_glide_slope(void) break; case Mode::Number::AUTO: + + //climb without doing glide slope if option is enabled + if (!above_location_current(next_WP_loc) && plane.flight_option_enabled(FlightOptions::IMMEDIATE_CLIMB_IN_AUTO)) { + reset_offset_altitude(); + break; + } + // we only do glide slide handling in AUTO when above 20m or // when descending. The 20 meter threshold is arbitrary, and // is basically to prevent situations where we try to slowly @@ -115,11 +122,21 @@ int32_t Plane::get_RTL_altitude_cm() const */ float Plane::relative_ground_altitude(bool use_rangefinder_if_available, bool use_terrain_if_available) { +#if AP_MAVLINK_MAV_CMD_SET_HAGL_ENABLED + float height_AGL; + // use external HAGL if available + if (get_external_HAGL(height_AGL)) { + return height_AGL; + } +#endif // AP_MAVLINK_MAV_CMD_SET_HAGL_ENABLED + +#if AP_RANGEFINDER_ENABLED if (use_rangefinder_if_available && rangefinder_state.in_range) { return rangefinder_state.height_estimate; } +#endif -#if HAL_QUADPLANE_ENABLED +#if HAL_QUADPLANE_ENABLED && AP_RANGEFINDER_ENABLED if (use_rangefinder_if_available && quadplane.in_vtol_land_final() && rangefinder.status_orient(ROTATION_PITCH_270) == RangeFinder::Status::OutOfRangeLow) { // a special case for quadplane landing when rangefinder goes @@ -252,8 +269,10 @@ int32_t Plane::relative_target_altitude_cm(void) target_altitude.lookahead = lookahead_adjustment(); relative_home_height += target_altitude.lookahead; +#if AP_RANGEFINDER_ENABLED // correct for rangefinder data relative_home_height += rangefinder_correction(); +#endif // we are following terrain, and have terrain data for the // current location. Use it. @@ -262,7 +281,9 @@ int32_t Plane::relative_target_altitude_cm(void) #endif int32_t relative_alt = target_altitude.amsl_cm - home.alt; relative_alt += mission_alt_offset()*100; +#if AP_RANGEFINDER_ENABLED relative_alt += rangefinder_correction() * 100; +#endif return relative_alt; } @@ -499,9 +520,9 @@ int32_t Plane::adjusted_altitude_cm(void) } /* - return home-relative altitude adjusted for ALT_OFFSET This is useful + return home-relative altitude adjusted for ALT_OFFSET. This is useful during long flights to account for barometer changes from the GCS, - or to adjust the flying height of a long mission + or to adjust the flying height of a long mission. */ int32_t Plane::adjusted_relative_altitude_cm(void) { @@ -608,6 +629,7 @@ float Plane::lookahead_adjustment(void) } +#if AP_RANGEFINDER_ENABLED /* correct target altitude using rangefinder data. Returns offset in meters to correct target altitude. A positive number means we need @@ -747,6 +769,7 @@ void Plane::rangefinder_height_update(void) } } +#endif // AP_RANGEFINDER_ENABLED /* determine if Non Auto Terrain Disable is active and allowed in present control mode @@ -802,3 +825,67 @@ bool Plane::terrain_enabled_in_mode(Mode::Number num) const return false; } #endif + +#if AP_MAVLINK_MAV_CMD_SET_HAGL_ENABLED +/* + handle a MAV_CMD_SET_HAGL request. The accuracy is ignored + */ +void Plane::handle_external_hagl(const mavlink_command_int_t &packet) +{ + auto &hagl = plane.external_hagl; + hagl.hagl = packet.param1; + hagl.last_update_ms = AP_HAL::millis(); + hagl.timeout_ms = uint32_t(packet.param3 * 1000); +} + +/* + get HAGL from external source if current + */ +bool Plane::get_external_HAGL(float &height_agl) +{ + auto &hagl = plane.external_hagl; + if (hagl.last_update_ms != 0) { + const uint32_t now_ms = AP_HAL::millis(); + if (now_ms - hagl.last_update_ms <= hagl.timeout_ms) { + height_agl = hagl.hagl; + return true; + } + hagl.last_update_ms = 0; + } + return false; +} +#endif // AP_MAVLINK_MAV_CMD_SET_HAGL_ENABLED + +/* + get height for landing. Set using_rangefinder to true if a rangefinder + or external HAGL source is active + */ +float Plane::get_landing_height(bool &rangefinder_active) +{ + float height; + +#if AP_MAVLINK_MAV_CMD_SET_HAGL_ENABLED + // if external HAGL is active use that + if (get_external_HAGL(height)) { + // ensure no terrain correction is applied - that is the job + // of the external system if it is wanted + auto_state.terrain_correction = 0; + + // an external HAGL is considered to be a type of rangefinder + rangefinder_active = true; + return height; + } +#endif + + // get basic height above target + height = height_above_target(); + rangefinder_active = false; + +#if AP_RANGEFINDER_ENABLED + // possibly correct with rangefinder + height -= rangefinder_correction(); + rangefinder_active = g.rangefinder_landing && rangefinder_state.in_range; +#endif + + return height; +} diff --git a/ArduPlane/commands_logic.cpp b/ArduPlane/commands_logic.cpp index 728ff97ad9..9fff6923ef 100644 --- a/ArduPlane/commands_logic.cpp +++ b/ArduPlane/commands_logic.cpp @@ -144,21 +144,6 @@ bool Plane::start_command(const AP_Mission::Mission_Command& cmd) case MAV_CMD_DO_LAND_START: break; - case MAV_CMD_DO_FENCE_ENABLE: -#if AP_FENCE_ENABLED - if (cmd.p1 == 0) { // disable fence - plane.fence.enable(false); - gcs().send_text(MAV_SEVERITY_INFO, "Fence disabled"); - } else if (cmd.p1 == 1) { // enable fence - plane.fence.enable(true); - gcs().send_text(MAV_SEVERITY_INFO, "Fence enabled"); - } else if (cmd.p1 == 2) { // disable fence floor only - plane.fence.disable_floor(); - gcs().send_text(MAV_SEVERITY_INFO, "Fence floor disabled"); - } -#endif - break; - case MAV_CMD_DO_AUTOTUNE_ENABLE: autotune_enable(cmd.p1); break; @@ -255,14 +240,16 @@ bool Plane::verify_command(const AP_Mission::Mission_Command& cmd) // Ret } else { // use rangefinder to correct if possible - float height = height_above_target() - rangefinder_correction(); + bool rangefinder_active = false; + float height = plane.get_landing_height(rangefinder_active); + // for flare calculations we don't want to use the terrain // correction as otherwise we will flare early on rising // ground height -= auto_state.terrain_correction; return landing.verify_land(prev_WP_loc, next_WP_loc, current_loc, height, auto_state.sink_rate, auto_state.wp_proportion, auto_state.last_flying_ms, arming.is_armed(), is_flying(), - g.rangefinder_landing && rangefinder_state.in_range); + rangefinder_active); } case MAV_CMD_NAV_LOITER_UNLIM: @@ -389,7 +376,7 @@ void Plane::do_takeoff(const AP_Mission::Mission_Command& cmd) next_WP_loc.lat = home.lat + 10; next_WP_loc.lng = home.lng + 10; auto_state.takeoff_speed_time_ms = 0; - auto_state.takeoff_complete = false; // set flag to use gps ground course during TO. IMU will be doing yaw drift correction + auto_state.takeoff_complete = false; // set flag to use gps ground course during TO. IMU will be doing yaw drift correction. auto_state.height_below_takeoff_to_level_off_cm = 0; // Flag also used to override "on the ground" throttle disable @@ -421,8 +408,10 @@ void Plane::do_land(const AP_Mission::Mission_Command& cmd) auto_state.takeoff_pitch_cd = 1000; } +#if AP_RANGEFINDER_ENABLED // zero rangefinder state, start to accumulate good samples now memset(&rangefinder_state, 0, sizeof(rangefinder_state)); +#endif landing.do_land(cmd, relative_altitude); @@ -430,10 +419,6 @@ void Plane::do_land(const AP_Mission::Mission_Command& cmd) // if we were in an abort we need to explicitly move out of the abort state, as it's sticky set_flight_stage(AP_FixedWing::FlightStage::LAND); } - -#if AP_FENCE_ENABLED - plane.fence.auto_disable_fence_for_landing(); -#endif } #if HAL_QUADPLANE_ENABLED @@ -444,7 +429,7 @@ void Plane::do_landing_vtol_approach(const AP_Mission::Mission_Command& cmd) loc.sanitize(current_loc); set_next_WP(loc); - vtol_approach_s.approach_stage = LOITER_TO_ALT; + vtol_approach_s.approach_stage = VTOLApproach::Stage::LOITER_TO_ALT; } #endif @@ -1031,7 +1016,7 @@ bool Plane::verify_landing_vtol_approach(const AP_Mission::Mission_Command &cmd) loiter.direction = direction; switch (vtol_approach_s.approach_stage) { - case RTL: + case VTOLApproach::Stage::RTL: { // fly home and loiter at RTL alt nav_controller->update_loiter(cmd.content.location, abs_radius, direction); @@ -1039,11 +1024,11 @@ bool Plane::verify_landing_vtol_approach(const AP_Mission::Mission_Command &cmd) // decend to Q RTL alt plane.do_RTL(plane.home.alt + plane.quadplane.qrtl_alt*100UL); plane.loiter_angle_reset(); - vtol_approach_s.approach_stage = LOITER_TO_ALT; + vtol_approach_s.approach_stage = VTOLApproach::Stage::LOITER_TO_ALT; } break; } - case LOITER_TO_ALT: + case VTOLApproach::Stage::LOITER_TO_ALT: { nav_controller->update_loiter(cmd.content.location, abs_radius, direction); @@ -1051,11 +1036,11 @@ bool Plane::verify_landing_vtol_approach(const AP_Mission::Mission_Command &cmd) Vector3f wind = ahrs.wind_estimate(); vtol_approach_s.approach_direction_deg = degrees(atan2f(-wind.y, -wind.x)); gcs().send_text(MAV_SEVERITY_INFO, "Selected an approach path of %.1f", (double)vtol_approach_s.approach_direction_deg); - vtol_approach_s.approach_stage = ENSURE_RADIUS; + vtol_approach_s.approach_stage = VTOLApproach::Stage::ENSURE_RADIUS; } break; } - case ENSURE_RADIUS: + case VTOLApproach::Stage::ENSURE_RADIUS: { // validate that the vehicle is at least the expected distance away from the loiter point // require an angle total of at least 2 centidegrees, due to special casing of 1 centidegree @@ -1065,10 +1050,10 @@ bool Plane::verify_landing_vtol_approach(const AP_Mission::Mission_Command &cmd) nav_controller->update_loiter(cmd.content.location, abs_radius, direction); break; } - vtol_approach_s.approach_stage = WAIT_FOR_BREAKOUT; + vtol_approach_s.approach_stage = VTOLApproach::Stage::WAIT_FOR_BREAKOUT; FALLTHROUGH; } - case WAIT_FOR_BREAKOUT: + case VTOLApproach::Stage::WAIT_FOR_BREAKOUT: { nav_controller->update_loiter(cmd.content.location, radius, direction); @@ -1077,7 +1062,7 @@ bool Plane::verify_landing_vtol_approach(const AP_Mission::Mission_Command &cmd) // breakout when within 5 degrees of the opposite direction if (fabsF(wrap_PI(ahrs.get_yaw() - breakout_direction_rad)) < radians(5.0f)) { gcs().send_text(MAV_SEVERITY_INFO, "Starting VTOL land approach path"); - vtol_approach_s.approach_stage = APPROACH_LINE; + vtol_approach_s.approach_stage = VTOLApproach::Stage::APPROACH_LINE; set_next_WP(cmd.content.location); // fallthrough } else { @@ -1085,7 +1070,7 @@ bool Plane::verify_landing_vtol_approach(const AP_Mission::Mission_Command &cmd) } FALLTHROUGH; } - case APPROACH_LINE: + case VTOLApproach::Stage::APPROACH_LINE: { // project an apporach path Location start = cmd.content.location; @@ -1114,7 +1099,7 @@ bool Plane::verify_landing_vtol_approach(const AP_Mission::Mission_Command &cmd) } if (past_finish_line && (lined_up || half_radius)) { - vtol_approach_s.approach_stage = VTOL_LANDING; + vtol_approach_s.approach_stage = VTOLApproach::Stage::VTOL_LANDING; quadplane.do_vtol_land(cmd); // fallthrough } else { @@ -1122,7 +1107,7 @@ bool Plane::verify_landing_vtol_approach(const AP_Mission::Mission_Command &cmd) } FALLTHROUGH; } - case VTOL_LANDING: + case VTOLApproach::Stage::VTOL_LANDING: // nothing to do here, we should be into the quadplane landing code return true; } diff --git a/ArduPlane/config.h b/ArduPlane/config.h index 08917cbe58..52a54c4673 100644 --- a/ArduPlane/config.h +++ b/ArduPlane/config.h @@ -2,14 +2,6 @@ #include "defines.h" -// Just so that it's completely clear... -#define ENABLED 1 -#define DISABLED 0 - -// this avoids a very common config error -#define ENABLE ENABLED -#define DISABLE DISABLED - ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // HARDWARE CONFIGURATION AND CONNECTIONS @@ -213,14 +205,8 @@ # define FENCE_TRIGGERED_PIN -1 #endif -////////////////////////////////////////////////////////////////////////////// -// Parachute release -#ifndef PARACHUTE -#define PARACHUTE HAL_PARACHUTE_ENABLED -#endif - -#ifndef OFFBOARD_GUIDED - #define OFFBOARD_GUIDED 1 +#ifndef AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED + #define AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED 1 #endif ////////////////////////////////////////////////////////////////////////////// diff --git a/ArduPlane/defines.h b/ArduPlane/defines.h index f4a8f9fc45..b2939557ad 100644 --- a/ArduPlane/defines.h +++ b/ArduPlane/defines.h @@ -168,6 +168,7 @@ enum FlightOptions { DISABLE_GROUND_PID_SUPPRESSION = (1<<11), ENABLE_LOITER_ALT_CONTROL = (1<<12), INDICATE_WAITING_FOR_RUDDER_NEUTRAL = (1<<13), + IMMEDIATE_CLIMB_IN_AUTO = (1<<14), }; enum CrowFlapOptions { diff --git a/ArduPlane/events.cpp b/ArduPlane/events.cpp index 12abb98e3b..64127c633c 100644 --- a/ArduPlane/events.cpp +++ b/ArduPlane/events.cpp @@ -138,7 +138,7 @@ void Plane::failsafe_long_on_event(enum failsafe_state fstype, ModeReason reason break; } if(g.fs_action_long == FS_ACTION_LONG_PARACHUTE) { -#if PARACHUTE == ENABLED +#if HAL_PARACHUTE_ENABLED parachute_release(); #endif } else if (g.fs_action_long == FS_ACTION_LONG_GLIDE) { @@ -187,7 +187,7 @@ void Plane::failsafe_long_on_event(enum failsafe_state fstype, ModeReason reason case Mode::Number::GUIDED: if(g.fs_action_long == FS_ACTION_LONG_PARACHUTE) { -#if PARACHUTE == ENABLED +#if HAL_PARACHUTE_ENABLED parachute_release(); #endif } else if (g.fs_action_long == FS_ACTION_LONG_GLIDE) { @@ -311,7 +311,7 @@ void Plane::handle_battery_failsafe(const char *type_str, const int8_t action) break; case Failsafe_Action_Parachute: -#if PARACHUTE == ENABLED +#if HAL_PARACHUTE_ENABLED parachute_release(); #endif break; diff --git a/ArduPlane/fence.cpp b/ArduPlane/fence.cpp index 33062460df..1890e709d2 100644 --- a/ArduPlane/fence.cpp +++ b/ArduPlane/fence.cpp @@ -8,9 +8,32 @@ void Plane::fence_check() { const uint8_t orig_breaches = fence.get_breaches(); + const bool armed = arming.is_armed(); + + uint16_t mission_id = plane.mission.get_current_nav_cmd().id; + bool landing_or_landed = plane.flight_stage == AP_FixedWing::FlightStage::LAND + || !armed +#if HAL_QUADPLANE_ENABLED + || control_mode->mode_number() == Mode::Number::QLAND + || quadplane.in_vtol_land_descent() +#endif + || (plane.is_land_command(mission_id) && plane.mission.state() == AP_Mission::MISSION_RUNNING); // check for new breaches; new_breaches is bitmask of fence types breached - const uint8_t new_breaches = fence.check(); + const uint8_t new_breaches = fence.check(landing_or_landed); + + /* + if we are either disarmed or we are currently not in breach and + we are not flying then clear the state associated with the + previous mode breach handling. This allows the fence state + machine to reset at the end of a fence breach action such as an + RTL and autoland + */ + if (plane.previous_mode_reason == ModeReason::FENCE_BREACHED) { + if (!armed || ((new_breaches == 0 && orig_breaches == 0) && !plane.is_flying())) { + plane.previous_mode_reason = ModeReason::UNKNOWN; + } + } if (!fence.enabled()) { // Switch back to the chosen control mode if still in @@ -34,7 +57,7 @@ void Plane::fence_check() // we still don't do anything when disarmed, but we do check for fence breaches. // fence pre-arm check actually checks if any fence has been breached // that's not ever going to be true if we don't call check on AP_Fence while disarmed - if (!arming.is_armed()) { + if (!armed) { return; } @@ -50,7 +73,7 @@ void Plane::fence_check() } if (new_breaches) { - GCS_SEND_TEXT(MAV_SEVERITY_NOTICE, "Fence Breached"); + fence.print_fence_message("breached", new_breaches); // if the user wants some kind of response and motors are armed const uint8_t fence_act = fence.get_action(); @@ -115,7 +138,8 @@ void Plane::fence_check() } LOGGER_WRITE_ERROR(LogErrorSubsystem::FAILSAFE_FENCE, LogErrorCode(new_breaches)); - } else if (orig_breaches) { + } else if (orig_breaches && fence.get_breaches() == 0) { + GCS_SEND_TEXT(MAV_SEVERITY_NOTICE, "Fence breach cleared"); // record clearing of breach LOGGER_WRITE_ERROR(LogErrorSubsystem::FAILSAFE_FENCE, LogErrorCode::ERROR_RESOLVED); } diff --git a/ArduPlane/is_flying.cpp b/ArduPlane/is_flying.cpp index 979a640a69..7118f352fe 100644 --- a/ArduPlane/is_flying.cpp +++ b/ArduPlane/is_flying.cpp @@ -162,7 +162,7 @@ void Plane::update_is_flying_5Hz(void) #if HAL_ADSB_ENABLED adsb.set_is_flying(new_is_flying); #endif -#if PARACHUTE == ENABLED +#if HAL_PARACHUTE_ENABLED parachute.set_is_flying(new_is_flying); #endif #if AP_STATS_ENABLED diff --git a/ArduPlane/mode.cpp b/ArduPlane/mode.cpp index 0a4415ff8b..a74d7c1a93 100644 --- a/ArduPlane/mode.cpp +++ b/ArduPlane/mode.cpp @@ -54,7 +54,7 @@ bool Mode::enter() plane.guided_state.last_forced_rpy_ms.zero(); plane.guided_state.last_forced_throttle_ms = 0; -#if OFFBOARD_GUIDED == ENABLED +#if AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED plane.guided_state.target_heading = -4; // radians here are in range -3.14 to 3.14, so a default value needs to be outside that range plane.guided_state.target_heading_type = GUIDED_HEADING_NONE; plane.guided_state.target_airspeed_cm = -1; // same as above, although an airspeed of -1 is rare on plane. @@ -168,7 +168,9 @@ void Mode::update_target_altitude() plane.set_target_altitude_location(plane.next_WP_loc); } else if (plane.landing.is_on_approach()) { plane.landing.setup_landing_glide_slope(plane.prev_WP_loc, plane.next_WP_loc, plane.current_loc, plane.target_altitude.offset_cm); +#if AP_RANGEFINDER_ENABLED plane.landing.adjust_landing_slope_for_rangefinder_bump(plane.rangefinder_state, plane.prev_WP_loc, plane.next_WP_loc, plane.current_loc, plane.auto_state.wp_distance, plane.target_altitude.offset_cm); +#endif } else if (plane.landing.get_target_altitude_location(target_location)) { plane.set_target_altitude_location(target_location); #if HAL_SOARING_ENABLED diff --git a/ArduPlane/mode.h b/ArduPlane/mode.h index cfe306813b..955a66bbc8 100644 --- a/ArduPlane/mode.h +++ b/ArduPlane/mode.h @@ -816,6 +816,12 @@ protected: Location start_loc; bool _enter() override; + +private: + + // flag that we have already called autoenable fences once in MODE TAKEOFF + bool have_autoenabled_fences; + }; #if HAL_SOARING_ENABLED diff --git a/ArduPlane/mode_guided.cpp b/ArduPlane/mode_guided.cpp index 86a3bf60c1..4fef88ee3c 100644 --- a/ArduPlane/mode_guided.cpp +++ b/ArduPlane/mode_guided.cpp @@ -42,7 +42,7 @@ void ModeGuided::update() plane.nav_roll_cd = constrain_int32(plane.guided_state.forced_rpy_cd.x, -plane.roll_limit_cd, plane.roll_limit_cd); plane.update_load_factor(); -#if OFFBOARD_GUIDED == ENABLED +#if AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED // guided_state.target_heading is radians at this point between -pi and pi ( defaults to -4 ) // This function is used in Guided and AvoidADSB, check for guided } else if ((plane.control_mode == &plane.mode_guided) && (plane.guided_state.target_heading_type != GUIDED_HEADING_NONE) ) { @@ -70,7 +70,7 @@ void ModeGuided::update() plane.nav_roll_cd = constrain_int32(desired, -bank_limit, bank_limit); plane.update_load_factor(); -#endif // OFFBOARD_GUIDED == ENABLED +#endif // AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED } else { plane.calc_nav_roll(); } @@ -128,7 +128,7 @@ void ModeGuided::set_radius_and_direction(const float radius, const bool directi void ModeGuided::update_target_altitude() { -#if OFFBOARD_GUIDED == ENABLED +#if AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED if (((plane.guided_state.target_alt_time_ms != 0) || plane.guided_state.target_alt > -0.001 )) { // target_alt now defaults to -1, and _time_ms defaults to zero. // offboard altitude demanded uint32_t now = AP_HAL::millis(); @@ -148,7 +148,7 @@ void ModeGuided::update_target_altitude() plane.guided_state.last_target_alt = temp.alt; plane.set_target_altitude_location(temp); } else -#endif // OFFBOARD_GUIDED == ENABLED +#endif // AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED { Mode::update_target_altitude(); } diff --git a/ArduPlane/mode_qland.cpp b/ArduPlane/mode_qland.cpp index 4205960f87..f3a08aabde 100644 --- a/ArduPlane/mode_qland.cpp +++ b/ArduPlane/mode_qland.cpp @@ -16,9 +16,6 @@ bool ModeQLand::_enter() #if AP_LANDINGGEAR_ENABLED plane.g2.landing_gear.deploy_for_landing(); #endif -#if AP_FENCE_ENABLED - plane.fence.auto_disable_fence_for_landing(); -#endif return true; } diff --git a/ArduPlane/mode_rtl.cpp b/ArduPlane/mode_rtl.cpp index 15d9728006..b0d8cfbfd6 100644 --- a/ArduPlane/mode_rtl.cpp +++ b/ArduPlane/mode_rtl.cpp @@ -7,7 +7,7 @@ bool ModeRTL::_enter() plane.do_RTL(plane.get_RTL_altitude_cm()); plane.rtl.done_climb = false; #if HAL_QUADPLANE_ENABLED - plane.vtol_approach_s.approach_stage = Plane::Landing_ApproachStage::RTL; + plane.vtol_approach_s.approach_stage = Plane::VTOLApproach::Stage::RTL; // Quadplane specific checks if (plane.quadplane.available()) { @@ -83,7 +83,7 @@ void ModeRTL::navigate() AP_Mission::Mission_Command cmd; cmd.content.location = plane.next_WP_loc; plane.verify_landing_vtol_approach(cmd); - if (plane.vtol_approach_s.approach_stage == Plane::Landing_ApproachStage::VTOL_LANDING) { + if (plane.vtol_approach_s.approach_stage == Plane::VTOLApproach::Stage::VTOL_LANDING) { plane.set_mode(plane.mode_qrtl, ModeReason::RTL_COMPLETE_SWITCHING_TO_VTOL_LAND_RTL); } return; diff --git a/ArduPlane/mode_takeoff.cpp b/ArduPlane/mode_takeoff.cpp index 37d0203fcf..cf51814571 100644 --- a/ArduPlane/mode_takeoff.cpp +++ b/ArduPlane/mode_takeoff.cpp @@ -22,11 +22,11 @@ const AP_Param::GroupInfo ModeTakeoff::var_info[] = { // @Increment: 1 // @Units: m // @User: Standard - AP_GROUPINFO("LVL_ALT", 2, ModeTakeoff, level_alt, 5), + AP_GROUPINFO("LVL_ALT", 2, ModeTakeoff, level_alt, 10), // @Param: LVL_PITCH // @DisplayName: Takeoff mode altitude initial pitch - // @Description: This is the target pitch for the initial climb to TKOFF_LVL_ALT + // @Description: This is the target pitch during the takeoff. // @Range: 0 30 // @Increment: 1 // @Units: deg @@ -63,6 +63,7 @@ ModeTakeoff::ModeTakeoff() : bool ModeTakeoff::_enter() { takeoff_mode_setup = false; + have_autoenabled_fences = false; return true; } @@ -148,19 +149,22 @@ void ModeTakeoff::update() if (plane.flight_stage == AP_FixedWing::FlightStage::TAKEOFF) { //below TAKOFF_LVL_ALT - SRV_Channels::set_output_scaled(SRV_Channel::k_throttle, 100.0); plane.takeoff_calc_roll(); plane.takeoff_calc_pitch(); + plane.takeoff_calc_throttle(true); } else { - if ((altitude_cm >= alt * 100 - 200)) { //within 2m of TKOFF_ALT ,or above and loitering + if ((altitude_cm >= alt * 100 - 200)) { //within 2m of TKOFF_ALT, or above and loitering #if AP_FENCE_ENABLED - plane.fence.auto_enable_fence_after_takeoff(); + if (!have_autoenabled_fences) { + plane.fence.auto_enable_fence_after_takeoff(); + have_autoenabled_fences = true; + } #endif plane.calc_nav_roll(); plane.calc_nav_pitch(); plane.calc_throttle(); } else { // still climbing to TAKEOFF_ALT; may be loitering - plane.calc_throttle(); + plane.takeoff_calc_throttle(); plane.takeoff_calc_roll(); plane.takeoff_calc_pitch(); } diff --git a/ArduPlane/navigation.cpp b/ArduPlane/navigation.cpp index 6a78965871..e3297f8943 100644 --- a/ArduPlane/navigation.cpp +++ b/ArduPlane/navigation.cpp @@ -116,8 +116,8 @@ float Plane::mode_auto_target_airspeed_cm() { #if HAL_QUADPLANE_ENABLED if (quadplane.landing_with_fixed_wing_spiral_approach() && - ((vtol_approach_s.approach_stage == Landing_ApproachStage::APPROACH_LINE) || - (vtol_approach_s.approach_stage == Landing_ApproachStage::VTOL_LANDING))) { + ((vtol_approach_s.approach_stage == VTOLApproach::Stage::APPROACH_LINE) || + (vtol_approach_s.approach_stage == VTOLApproach::Stage::VTOL_LANDING))) { const float land_airspeed = TECS_controller.get_land_airspeed(); if (is_positive(land_airspeed)) { return land_airspeed * 100; @@ -187,7 +187,7 @@ void Plane::calc_airspeed_errors() target_airspeed_cm = ((int32_t)(aparm.airspeed_max - aparm.airspeed_min) * get_throttle_input()) + ((int32_t)aparm.airspeed_min * 100); } -#if OFFBOARD_GUIDED == ENABLED +#if AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED } else if (control_mode == &mode_guided && guided_state.target_airspeed_cm > 0.0) { // if offboard guided speed change cmd not set, then this section is skipped // offboard airspeed demanded uint32_t now = AP_HAL::millis(); @@ -203,7 +203,7 @@ void Plane::calc_airspeed_errors() target_airspeed_cm = constrain_float(MAX(guided_state.target_airspeed_cm, target_airspeed_cm), aparm.airspeed_min *100, aparm.airspeed_max *100); } -#endif // OFFBOARD_GUIDED == ENABLED +#endif // AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED #if HAL_SOARING_ENABLED } else if (g2.soaring_controller.is_active() && g2.soaring_controller.get_throttle_suppressed()) { @@ -256,7 +256,7 @@ void Plane::calc_airspeed_errors() } // when using the special GUIDED mode features for slew control, don't allow airspeed nudging as it doesn't play nicely. -#if OFFBOARD_GUIDED == ENABLED +#if AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED if (control_mode == &mode_guided && !is_zero(guided_state.target_airspeed_cm) && (airspeed_nudge_cm != 0)) { airspeed_nudge_cm = 0; //airspeed_nudge_cm forced to zero } diff --git a/ArduPlane/parachute.cpp b/ArduPlane/parachute.cpp index 61cec7ae0a..7023d33711 100644 --- a/ArduPlane/parachute.cpp +++ b/ArduPlane/parachute.cpp @@ -6,13 +6,13 @@ */ void Plane::parachute_check() { -#if PARACHUTE == ENABLED +#if HAL_PARACHUTE_ENABLED parachute.update(); parachute.check_sink_rate(); #endif } -#if PARACHUTE == ENABLED +#if HAL_PARACHUTE_ENABLED /* parachute_release - trigger the release of the parachute diff --git a/ArduPlane/quadplane.cpp b/ArduPlane/quadplane.cpp index d2f74a5b55..0bb00459ee 100644 --- a/ArduPlane/quadplane.cpp +++ b/ArduPlane/quadplane.cpp @@ -150,7 +150,7 @@ const AP_Param::GroupInfo QuadPlane::var_info[] = { AP_GROUPINFO("TRAN_PIT_MAX", 29, QuadPlane, transition_pitch_max, 3), // frame class was moved from 30 when consolidating AP_Motors classes -#define FRAME_CLASS_OLD_IDX 30 + // @Param: FRAME_CLASS // @DisplayName: Frame Class // @Description: Controls major frame class for multicopter component @@ -279,7 +279,7 @@ const AP_Param::GroupInfo QuadPlane::var_info[] = { // @Bitmask: 19: CompleteTransition-to fixed wing if Q_TRANS_FAIL timer times out instead of QLAND // @Bitmask: 20: Force RTL mode-forces RTL mode on rc failsafe in VTOL modes overriding bit 5(USE_QRTL) // @Bitmask: 21: Tilt rotor-tilt motors up when disarmed in FW modes (except manual) to prevent ground strikes. - // @Bitmask: 22: Scale FF by the ratio of VTOL/plane angle P gains in VTOL modes rather than reducing VTOL angle P based on airspeed. + // @Bitmask: 22: Scale FF by the ratio of VTOL to plane angle P gains in Position 1 phase of transition into VTOL flight as well as reducing VTOL angle P based on airspeed. AP_GROUPINFO("OPTIONS", 58, QuadPlane, options, 0), AP_SUBGROUPEXTENSION("",59, QuadPlane, var_info2), @@ -671,34 +671,6 @@ bool QuadPlane::setup(void) return false; } - /* - cope with upgrade from old AP_Motors values for frame_class - */ - AP_Int8 old_class; - const AP_Param::ConversionInfo cinfo { Parameters::k_param_quadplane, FRAME_CLASS_OLD_IDX, AP_PARAM_INT8, nullptr }; - if (AP_Param::find_old_parameter(&cinfo, &old_class) && !frame_class.load()) { - uint8_t new_value = 0; - // map from old values to new values - switch (old_class.get()) { - case 0: - new_value = AP_Motors::MOTOR_FRAME_QUAD; - break; - case 1: - new_value = AP_Motors::MOTOR_FRAME_HEXA; - break; - case 2: - new_value = AP_Motors::MOTOR_FRAME_OCTA; - break; - case 3: - new_value = AP_Motors::MOTOR_FRAME_OCTAQUAD; - break; - case 4: - new_value = AP_Motors::MOTOR_FRAME_Y6; - break; - } - frame_class.set_and_save(new_value); - } - if (hal.util->available_memory() < 4096 + sizeof(*motors) + sizeof(*attitude_control) + sizeof(*pos_control) + sizeof(*wp_nav) + sizeof(*ahrs_view) + sizeof(*loiter_nav) + sizeof(*weathervane)) { AP_BoardConfig::config_error("Not enough memory for quadplane"); @@ -3127,8 +3099,6 @@ void QuadPlane::takeoff_controller(void) if (no_navigation) { pos_control->relax_velocity_controller_xy(); } else { - pos_control->set_accel_desired_xy_cmss(zero); - pos_control->set_vel_desired_xy_cms(vel); pos_control->input_vel_accel_xy(vel, zero); // nav roll and pitch are controller by position controller @@ -3554,9 +3524,6 @@ bool QuadPlane::verify_vtol_land(void) poscontrol.pilot_correction_done = false; pos_control->set_lean_angle_max_cd(0); poscontrol.xy_correction.zero(); -#if AP_FENCE_ENABLED - plane.fence.auto_disable_fence_for_landing(); -#endif #if AP_LANDINGGEAR_ENABLED plane.g2.landing_gear.deploy_for_landing(); #endif @@ -3777,7 +3744,11 @@ float QuadPlane::forward_throttle_pct() // approach the landing point when landing below the takeoff point vel_forward.last_pct = vel_forward.integrator; } else if ((in_vtol_land_final() && motors->limit.throttle_lower) || +#if AP_RANGEFINDER_ENABLED (plane.g.rangefinder_landing && (plane.rangefinder.status_orient(ROTATION_PITCH_270) == RangeFinder::Status::OutOfRangeLow))) { +#else + false) { +#endif // we're in the settling phase of landing or using a rangefinder that is out of range low, disable fwd motor vel_forward.last_pct = 0; vel_forward.integrator = 0; @@ -3981,7 +3952,7 @@ bool QuadPlane::is_vtol_land(uint16_t id) const { if (id == MAV_CMD_NAV_VTOL_LAND || id == MAV_CMD_NAV_PAYLOAD_PLACE) { if (landing_with_fixed_wing_spiral_approach()) { - return plane.vtol_approach_s.approach_stage == Plane::Landing_ApproachStage::VTOL_LANDING; + return plane.vtol_approach_s.approach_stage == Plane::VTOLApproach::Stage::VTOL_LANDING; } else { return true; } diff --git a/ArduPlane/sensors.cpp b/ArduPlane/sensors.cpp index 91d3ed5b77..a0aebe06b8 100644 --- a/ArduPlane/sensors.cpp +++ b/ArduPlane/sensors.cpp @@ -2,6 +2,7 @@ #include #include +#if AP_RANGEFINDER_ENABLED /* read the rangefinder and update height estimate */ @@ -33,3 +34,5 @@ void Plane::read_rangefinder(void) rangefinder_height_update(); } + +#endif // AP_RANGEFINDER_ENABLED diff --git a/ArduPlane/servos.cpp b/ArduPlane/servos.cpp index cc4d4dde10..aa2c7ce373 100644 --- a/ArduPlane/servos.cpp +++ b/ArduPlane/servos.cpp @@ -78,7 +78,7 @@ bool Plane::suppress_throttle(void) return false; } -#if PARACHUTE == ENABLED +#if HAL_PARACHUTE_ENABLED if (control_mode->does_auto_throttle() && parachute.release_initiated()) { // throttle always suppressed in auto-throttle modes after parachute release initiated throttle_suppressed = true; @@ -499,47 +499,84 @@ void Plane::throttle_watt_limiter(int8_t &min_throttle, int8_t &max_throttle) #endif // #if AP_BATTERY_WATT_MAX_ENABLED /* - Apply min/max limits to throttle + Apply min/max safety limits to throttle. */ float Plane::apply_throttle_limits(float throttle_in) { - // convert 0 to 100% (or -100 to +100) into PWM + // Pull the base throttle limits. + // These are usually set to map the ESC operating range. int8_t min_throttle = aparm.throttle_min.get(); int8_t max_throttle = aparm.throttle_max.get(); #if AP_ICENGINE_ENABLED - // apply idle governor + // Apply idle governor. g2.ice_control.update_idle_governor(min_throttle); #endif + // If reverse thrust is enabled not allowed right now, the minimum throttle must not fall below 0. if (min_throttle < 0 && !allow_reverse_thrust()) { // reverse thrust is available but inhibited. min_throttle = 0; } - const bool use_takeoff_throttle_max = -#if HAL_QUADPLANE_ENABLED - quadplane.in_transition() || -#endif + // Query the conditions where TKOFF_THR_MAX applies. + const bool use_takeoff_throttle = (flight_stage == AP_FixedWing::FlightStage::TAKEOFF) || (flight_stage == AP_FixedWing::FlightStage::ABORT_LANDING); - if (use_takeoff_throttle_max) { + // Handle throttle limits for takeoff conditions. + if (use_takeoff_throttle) { if (aparm.takeoff_throttle_max != 0) { + // Replace max throttle with the takeoff max throttle setting. + // This is typically done to protect against long intervals of large power draw. + // Or (in contrast) to give some extra throttle during the initial climb. max_throttle = aparm.takeoff_throttle_max.get(); } + // Do not allow min throttle to go below a lower threshold. + // This is typically done to protect against premature stalls close to the ground. + const bool use_throttle_range = (aparm.takeoff_options & (uint32_t)AP_FixedWing::TakeoffOption::THROTTLE_RANGE); + if (!use_throttle_range || !ahrs.using_airspeed_sensor()) { + // Use a constant max throttle throughout the takeoff or when airspeed readings are not available. + if (aparm.takeoff_throttle_max.get() == 0) { + min_throttle = MAX(min_throttle, aparm.throttle_max.get()); + } else { + min_throttle = MAX(min_throttle, aparm.takeoff_throttle_max.get()); + } + } else if (use_throttle_range) { // Use a throttle range through the takeoff. + if (aparm.takeoff_throttle_min.get() != 0) { // This is enabled by TKOFF_MODE==1. + min_throttle = MAX(min_throttle, aparm.takeoff_throttle_min.get()); + } + } } else if (landing.is_flaring()) { + // Allow throttle cutoff when flaring. + // This is to allow the aircraft to bleed speed faster and land with a shut off thruster. min_throttle = 0; } - // compensate for battery voltage drop + // Handle throttle limits for transition conditions. +#if HAL_QUADPLANE_ENABLED + if (quadplane.in_transition()) { + if (aparm.takeoff_throttle_max != 0) { + max_throttle = aparm.takeoff_throttle_max.get(); + } + } +#endif + + // Compensate the limits for battery voltage drop. + // This relaxes the limits when the battery is getting depleted. g2.fwd_batt_cmp.apply_min_max(min_throttle, max_throttle); #if AP_BATTERY_WATT_MAX_ENABLED - // apply watt limiter + // Ensure that the power draw limits are not exceeded. throttle_watt_limiter(min_throttle, max_throttle); #endif + // Do a sanity check on them. Constrain down if necessary. + min_throttle = MIN(min_throttle, max_throttle); + + // Let TECS know about the updated throttle limits. + TECS_controller.set_throttle_min(0.01f*min_throttle); + TECS_controller.set_throttle_max(0.01f*max_throttle); return constrain_float(throttle_in, min_throttle, max_throttle); } diff --git a/ArduPlane/system.cpp b/ArduPlane/system.cpp index 47a1bd7796..d27491ff21 100644 --- a/ArduPlane/system.cpp +++ b/ArduPlane/system.cpp @@ -36,14 +36,18 @@ void Plane::init_ardupilot() // init baro barometer.init(); +#if AP_RANGEFINDER_ENABLED // initialise rangefinder rangefinder.set_log_rfnd_bit(MASK_LOG_SONAR); rangefinder.init(ROTATION_PITCH_270); +#endif // initialise battery monitoring battery.init(); +#if AP_RSSI_ENABLED rssi.init(); +#endif #if AP_RPM_ENABLED rpm_sensor.init(); @@ -53,7 +57,7 @@ void Plane::init_ardupilot() gcs().setup_uarts(); -#if OSD_ENABLED == ENABLED +#if OSD_ENABLED osd.init(); #endif diff --git a/ArduPlane/takeoff.cpp b/ArduPlane/takeoff.cpp index faa220412f..e6c26076a5 100644 --- a/ArduPlane/takeoff.cpp +++ b/ArduPlane/takeoff.cpp @@ -219,7 +219,30 @@ void Plane::takeoff_calc_pitch(void) } /* - * get the pitch min used during takeoff. This matches the mission pitch until near the end where it allows it to levels off + * Set the throttle limits to run at during a takeoff. + */ +void Plane::takeoff_calc_throttle(const bool use_max_throttle) { + // This setting will take effect at the next run of TECS::update_pitch_throttle(). + + // Set the maximum throttle limit. + if (aparm.takeoff_throttle_max != 0) { + TECS_controller.set_throttle_max(0.01f*aparm.takeoff_throttle_max); + } + + // Set the minimum throttle limit. + const bool use_throttle_range = (aparm.takeoff_options & (uint32_t)AP_FixedWing::TakeoffOption::THROTTLE_RANGE); + if (!use_throttle_range || !ahrs.using_airspeed_sensor() || use_max_throttle) { // Traditional takeoff throttle limit. + float min_throttle = (aparm.takeoff_throttle_max != 0) ? 0.01f*aparm.takeoff_throttle_max : 0.01f*aparm.throttle_max; + TECS_controller.set_throttle_min(min_throttle); + } else { // TKOFF_MODE == 1, allow for a throttle range. + if (aparm.takeoff_throttle_min != 0) { // Override THR_MIN. + TECS_controller.set_throttle_min(0.01f*aparm.takeoff_throttle_min); + } + } + calc_throttle(); +} + +/* get the pitch min used during takeoff. This matches the mission pitch until near the end where it allows it to levels off */ int16_t Plane::get_takeoff_pitch_min_cd(void) { diff --git a/ArduSub/AP_Arming_Sub.cpp b/ArduSub/AP_Arming_Sub.cpp index c3749c3f0c..6c1c0504c4 100644 --- a/ArduSub/AP_Arming_Sub.cpp +++ b/ArduSub/AP_Arming_Sub.cpp @@ -149,6 +149,14 @@ bool AP_Arming_Sub::arm(AP_Arming::Method method, bool do_arming_checks) // flag exiting this function in_arm_motors = false; + // if we do not have an ekf origin then we can't use the WMM tables + if (!sub.ensure_ekf_origin()) { + gcs().send_text(MAV_SEVERITY_WARNING, "Compass performance degraded"); + if (check_enabled(ARMING_CHECK_PARAMETERS)) { + check_failed(ARMING_CHECK_PARAMETERS, true, "No world position, check ORIGIN_* parameters"); + return false; + } + } // return success return true; } diff --git a/ArduSub/ArduSub.cpp b/ArduSub/ArduSub.cpp index c3ba73b891..cf1c6f9abc 100644 --- a/ArduSub/ArduSub.cpp +++ b/ArduSub/ArduSub.cpp @@ -158,10 +158,7 @@ void Sub::fifty_hz_loop() failsafe_sensors_check(); - // Update rc input/output rc().read_input(); - SRV_Channels::calc_pwm(); - SRV_Channels::output_ch_all(); } // update_batt_compass - read battery and compass @@ -271,6 +268,9 @@ void Sub::three_hz_loop() // one_hz_loop - runs at 1Hz void Sub::one_hz_loop() { + // sync MAVLink system ID + mavlink_system.sysid = g.sysid_this_mav; + bool arm_check = arming.pre_arm_checks(false); ap.pre_arm_check = arm_check; AP_Notify::flags.pre_arm_check = arm_check; @@ -429,4 +429,51 @@ float Sub::get_alt_msl() const return -posD; } +bool Sub::ensure_ekf_origin() +{ + Location ekf_origin; + if (ahrs.get_origin(ekf_origin)) { + // ekf origin is set + return true; + } + + if (gps.num_sensors() > 0) { + // wait for the gps sensor to set the origin + // alert the pilot to poor compass performance + return false; + } + + auto backup_origin = Location(static_cast(sub.g2.backup_origin_lat * 1e7), + static_cast(sub.g2.backup_origin_lon * 1e7), + static_cast(sub.g2.backup_origin_alt * 100), + Location::AltFrame::ABSOLUTE); + + if (backup_origin.lat == 0 || backup_origin.lng == 0) { + gcs().send_text(MAV_SEVERITY_WARNING, "Backup location parameters are missing or zero"); + return false; + } + + if (!check_latlng(backup_origin.lat, backup_origin.lng)) { + gcs().send_text(MAV_SEVERITY_WARNING, "Backup location parameters are not valid"); + return false; + } + + if (!ahrs.set_origin(backup_origin)) { + // a possible problem is that ek3_srcn_posxy is set to 3 (gps) + gcs().send_text(MAV_SEVERITY_WARNING, "Failed to set origin, check EK3_SRC parameters"); + return false; + } + + gcs().send_text(MAV_SEVERITY_INFO, "Using backup location"); + +#if HAL_LOGGING_ENABLED + ahrs.Log_Write_Home_And_Origin(); +#endif + + // send ekf origin to GCS + gcs().send_message(MSG_ORIGIN); + + return true; +} + AP_HAL_MAIN_CALLBACKS(&sub); diff --git a/ArduSub/GCS_Mavlink.cpp b/ArduSub/GCS_Mavlink.cpp index c89771e18c..576de91217 100644 --- a/ArduSub/GCS_Mavlink.cpp +++ b/ArduSub/GCS_Mavlink.cpp @@ -381,7 +381,9 @@ static const ap_message STREAM_POSITION_msgs[] = { static const ap_message STREAM_RC_CHANNELS_msgs[] = { MSG_SERVO_OUTPUT_RAW, MSG_RC_CHANNELS, +#if AP_MAVLINK_MSG_RC_CHANNELS_RAW_ENABLED MSG_RC_CHANNELS_RAW, // only sent on a mavlink1 connection +#endif }; static const ap_message STREAM_EXTRA1_msgs[] = { MSG_ATTITUDE, @@ -483,6 +485,46 @@ MAV_RESULT GCS_MAVLINK_Sub::handle_command_do_set_roi(const Location &roi_loc) return MAV_RESULT_ACCEPTED; } +MAV_RESULT GCS_MAVLINK_Sub::handle_command_int_do_reposition(const mavlink_command_int_t &packet) +{ + const bool change_modes = ((int32_t)packet.param2 & MAV_DO_REPOSITION_FLAGS_CHANGE_MODE) == MAV_DO_REPOSITION_FLAGS_CHANGE_MODE; + if (!sub.flightmode->in_guided_mode() && !change_modes) { + return MAV_RESULT_DENIED; + } + + // sanity check location + if (!check_latlng(packet.x, packet.y)) { + return MAV_RESULT_DENIED; + } + + Location request_location; + if (!location_from_command_t(packet, request_location)) { + return MAV_RESULT_DENIED; + } + + if (request_location.sanitize(sub.current_loc)) { + // if the location wasn't already sane don't load it + return MAV_RESULT_DENIED; // failed as the location is not valid + } + + // we need to do this first, as we don't want to change the flight mode unless we can also set the target + if (!sub.mode_guided.guided_set_destination(request_location)) { + return MAV_RESULT_FAILED; + } + + if (!sub.flightmode->in_guided_mode()) { + if (!sub.set_mode(Mode::Number::GUIDED, ModeReason::GCS_COMMAND)) { + return MAV_RESULT_FAILED; + } + // the position won't have been loaded if we had to change the flight mode, so load it again + if (!sub.mode_guided.guided_set_destination(request_location)) { + return MAV_RESULT_FAILED; + } + } + + return MAV_RESULT_ACCEPTED; +} + MAV_RESULT GCS_MAVLINK_Sub::handle_command_int_packet(const mavlink_command_int_t &packet, const mavlink_message_t &msg) { switch(packet.command) { @@ -496,6 +538,9 @@ MAV_RESULT GCS_MAVLINK_Sub::handle_command_int_packet(const mavlink_command_int_ case MAV_CMD_DO_MOTOR_TEST: return handle_MAV_CMD_DO_MOTOR_TEST(packet); + case MAV_CMD_DO_REPOSITION: + return handle_command_int_do_reposition(packet); + case MAV_CMD_MISSION_START: return handle_MAV_CMD_MISSION_START(packet); diff --git a/ArduSub/GCS_Mavlink.h b/ArduSub/GCS_Mavlink.h index 4ca41e1d8c..c38ec3f4ab 100644 --- a/ArduSub/GCS_Mavlink.h +++ b/ArduSub/GCS_Mavlink.h @@ -22,6 +22,7 @@ protected: MAV_RESULT _handle_command_preflight_calibration(const mavlink_command_int_t &packet, const mavlink_message_t &msg) override; MAV_RESULT handle_command_int_packet(const mavlink_command_int_t &packet, const mavlink_message_t &msg) override; + MAV_RESULT handle_command_int_do_reposition(const mavlink_command_int_t &packet); // override sending of scaled_pressure3 to send on-board temperature: void send_scaled_pressure3() override; diff --git a/ArduSub/GCS_Sub.cpp b/ArduSub/GCS_Sub.cpp index b57839c9bc..bd99d9b080 100644 --- a/ArduSub/GCS_Sub.cpp +++ b/ArduSub/GCS_Sub.cpp @@ -73,7 +73,7 @@ void GCS_Sub::update_vehicle_sensor_status_flags() } #endif -#if RANGEFINDER_ENABLED == ENABLED +#if AP_RANGEFINDER_ENABLED const RangeFinder *rangefinder = RangeFinder::get_singleton(); if (sub.rangefinder_state.enabled) { control_sensors_present |= MAV_SYS_STATUS_SENSOR_LASER_POSITION; diff --git a/ArduSub/Parameters.cpp b/ArduSub/Parameters.cpp index caebfe820a..d76a352144 100644 --- a/ArduSub/Parameters.cpp +++ b/ArduSub/Parameters.cpp @@ -78,6 +78,14 @@ const AP_Param::Info Sub::var_info[] = { // @User: Standard GSCALAR(failsafe_gcs, "FS_GCS_ENABLE", FS_GCS_DISARM), + // @Param: FS_GCS_TIMEOUT + // @DisplayName: GCS failsafe timeout + // @Description: Timeout before triggering the GCS failsafe + // @Units: s + // @Increment: 1 + // @User: Standard + GSCALAR(failsafe_gcs_timeout, "FS_GCS_TIMEOUT", FS_GCS_TIMEOUT_S), + // @Param: FS_LEAK_ENABLE // @DisplayName: Leak Failsafe Enable // @Description: Controls what action to take if a leak is detected. @@ -628,7 +636,7 @@ const AP_Param::Info Sub::var_info[] = { // @Path: ../libraries/AP_Mission/AP_Mission.cpp GOBJECT(mission, "MIS_", AP_Mission), -#if RANGEFINDER_ENABLED == ENABLED +#if AP_RANGEFINDER_ENABLED // @Group: RNGFND // @Path: ../libraries/AP_RangeFinder/AP_RangeFinder.cpp GOBJECT(rangefinder, "RNGFND", RangeFinder), @@ -706,7 +714,26 @@ const AP_Param::GroupInfo ParametersG2::var_info[] = { // 18 was scripting - // 19 was airspeed + // @Param: ORIGIN_LAT + // @DisplayName: Backup latitude for EKF origin + // @Description: Backup EKF origin latitude used when not using a positioning system. + // @Units: deg + // @User: Standard + AP_GROUPINFO("ORIGIN_LAT", 19, ParametersG2, backup_origin_lat, 0), + + // @Param: ORIGIN_LON + // @DisplayName: Backup longitude for EKF origin + // @Description: Backup EKF origin longitude used when not using a positioning system. + // @Units: deg + // @User: Standard + AP_GROUPINFO("ORIGIN_LON", 20, ParametersG2, backup_origin_lon, 0), + + // @Param: ORIGIN_ALT + // @DisplayName: Backup altitude (MSL) for EKF origin + // @Description: Backup EKF origin altitude (MSL) used when not using a positioning system. + // @Units: m + // @User: Standard + AP_GROUPINFO("ORIGIN_ALT", 21, ParametersG2, backup_origin_alt, 0), AP_GROUPEND }; diff --git a/ArduSub/Parameters.h b/ArduSub/Parameters.h index 6854c93328..fe176e400e 100644 --- a/ArduSub/Parameters.h +++ b/ArduSub/Parameters.h @@ -185,6 +185,7 @@ public: k_param_fs_batt_voltage, // unused - moved to AP_BattMonitor k_param_failsafe_pilot_input, k_param_failsafe_pilot_input_timeout, + k_param_failsafe_gcs_timeout, // Misc Sub settings @@ -243,7 +244,7 @@ public: AP_Float throttle_filt; -#if RANGEFINDER_ENABLED == ENABLED +#if AP_RANGEFINDER_ENABLED AP_Int8 rangefinder_signal_min; // minimum signal quality for good rangefinder readings AP_Float surftrak_depth; // surftrak will try to keep sub below this depth #endif @@ -257,6 +258,7 @@ public: AP_Int8 failsafe_terrain; AP_Int8 failsafe_pilot_input; // pilot input failsafe behavior AP_Float failsafe_pilot_input_timeout; + AP_Float failsafe_gcs_timeout; // ground station failsafe timeout (seconds) AP_Int8 xtrack_angle_limit; @@ -366,6 +368,9 @@ public: // control over servo output ranges SRV_Channels servo_channels; + AP_Float backup_origin_lat; + AP_Float backup_origin_lon; + AP_Float backup_origin_alt; }; extern const AP_Param::Info var_info[]; diff --git a/ArduSub/Sub.h b/ArduSub/Sub.h index 6aba8c7186..909a28c517 100644 --- a/ArduSub/Sub.h +++ b/ArduSub/Sub.h @@ -232,7 +232,18 @@ private: } failsafe; bool any_failsafe_triggered() const { - return (failsafe.pilot_input || battery.has_failsafed() || failsafe.gcs || failsafe.ekf || failsafe.terrain); + return ( + failsafe.pilot_input + || battery.has_failsafed() + || failsafe.gcs + || failsafe.ekf + || failsafe.terrain + || failsafe.leak + || failsafe.internal_pressure + || failsafe.internal_temperature + || failsafe.crash + || failsafe.sensor_health + ); } // sensor health for logging @@ -428,6 +439,8 @@ private: float get_alt_rel() const WARN_IF_UNUSED; float get_alt_msl() const WARN_IF_UNUSED; void exit_mission(); + void set_origin(const Location& loc); + bool ensure_ekf_origin(); bool verify_loiter_unlimited(); bool verify_loiter_time(); bool verify_wait_delay(); @@ -614,10 +627,10 @@ public: // For Lua scripting, so index is 1..4, not 0..3 uint8_t get_and_clear_button_count(uint8_t index); -#if RANGEFINDER_ENABLED == ENABLED +#if AP_RANGEFINDER_ENABLED float get_rangefinder_target_cm() const WARN_IF_UNUSED { return mode_surftrak.get_rangefinder_target_cm(); } bool set_rangefinder_target_cm(float new_target_cm) { return mode_surftrak.set_rangefinder_target_cm(new_target_cm); } -#endif // RANGEFINDER_ENABLED +#endif // AP_RANGEFINDER_ENABLED #endif // AP_SCRIPTING_ENABLED }; diff --git a/ArduSub/config.h b/ArduSub/config.h index 673cd17ae8..3fab9bafaa 100644 --- a/ArduSub/config.h +++ b/ArduSub/config.h @@ -46,10 +46,6 @@ // Rangefinder // -#ifndef RANGEFINDER_ENABLED -# define RANGEFINDER_ENABLED ENABLED -#endif - #ifndef RANGEFINDER_HEALTH_MAX # define RANGEFINDER_HEALTH_MAX 3 // number of good reads that indicates a healthy rangefinder #endif diff --git a/ArduSub/defines.h b/ArduSub/defines.h index 87e45820bc..49dcde32fd 100644 --- a/ArduSub/defines.h +++ b/ArduSub/defines.h @@ -79,8 +79,8 @@ enum LoggingParameters { #ifndef FS_GCS # define FS_GCS DISABLED #endif -#ifndef FS_GCS_TIMEOUT_MS -# define FS_GCS_TIMEOUT_MS 2500 // gcs failsafe triggers after this number of milliseconds with no GCS heartbeat +#ifndef FS_GCS_TIMEOUT_S +# define FS_GCS_TIMEOUT_S 5.0 // gcs failsafe triggers after this number of seconds with no GCS heartbeat #endif // missing terrain data failsafe diff --git a/ArduSub/failsafe.cpp b/ArduSub/failsafe.cpp index 80c74ed458..7807daed14 100644 --- a/ArduSub/failsafe.cpp +++ b/ArduSub/failsafe.cpp @@ -321,7 +321,8 @@ void Sub::failsafe_gcs_check() uint32_t tnow = AP_HAL::millis(); // Check if we have gotten a GCS heartbeat recently (GCS sysid must match SYSID_MYGCS parameter) - if (tnow - gcs_last_seen_ms < FS_GCS_TIMEOUT_MS) { + const uint32_t gcs_timeout_ms = uint32_t(constrain_float(g.failsafe_gcs_timeout * 1000.0f, 0.0f, UINT32_MAX)); + if (tnow - gcs_last_seen_ms < gcs_timeout_ms) { // Log event if we are recovering from previous gcs failsafe if (failsafe.gcs) { LOGGER_WRITE_ERROR(LogErrorSubsystem::FAILSAFE_GCS, LogErrorCode::FAILSAFE_RESOLVED); diff --git a/ArduSub/joystick.cpp b/ArduSub/joystick.cpp index 4d25b433a2..5e12c0eeae 100644 --- a/ArduSub/joystick.cpp +++ b/ArduSub/joystick.cpp @@ -190,7 +190,7 @@ void Sub::handle_jsbutton_press(uint8_t _button, bool shift, bool held) case JSButton::button_function_t::k_mode_poshold: set_mode(Mode::Number::POSHOLD, ModeReason::RC_COMMAND); break; -#if RANGEFINDER_ENABLED == ENABLED +#if AP_RANGEFINDER_ENABLED case JSButton::button_function_t::k_mode_surftrak: set_mode(Mode::Number::SURFTRAK, ModeReason::RC_COMMAND); break; diff --git a/ArduSub/mode.h b/ArduSub/mode.h index 4228d03273..11a6447167 100644 --- a/ArduSub/mode.h +++ b/ArduSub/mode.h @@ -320,6 +320,7 @@ public: bool has_manual_throttle() const override { return false; } bool allows_arming(bool from_gcs) const override { return true; } bool is_autopilot() const override { return true; } + bool in_guided_mode() const override { return true; } bool guided_limit_check(); void guided_limit_init_time_and_pos(); void guided_set_angle(const Quaternion &q, float climb_rate_cms, bool use_yaw_rate, float yaw_rate_rads); diff --git a/ArduSub/mode_auto.cpp b/ArduSub/mode_auto.cpp index 57e0861189..39aabc69eb 100644 --- a/ArduSub/mode_auto.cpp +++ b/ArduSub/mode_auto.cpp @@ -426,6 +426,7 @@ void ModeAuto::set_auto_yaw_roi(const Location &roi_location) // Return true if it is possible to recover from a rangefinder failure bool ModeAuto::auto_terrain_recover_start() { +#if AP_RANGEFINDER_ENABLED // Check rangefinder status to see if recovery is possible switch (sub.rangefinder.status_orient(ROTATION_PITCH_270)) { @@ -462,6 +463,9 @@ bool ModeAuto::auto_terrain_recover_start() gcs().send_text(MAV_SEVERITY_WARNING, "Attempting auto failsafe recovery"); return true; +#else + return false; +#endif } // Attempt recovery from terrain failsafe @@ -470,7 +474,6 @@ bool ModeAuto::auto_terrain_recover_start() void ModeAuto::auto_terrain_recover_run() { float target_climb_rate = 0; - static uint32_t rangefinder_recovery_ms = 0; // if not armed set throttle to zero and exit immediately if (!motors.armed()) { @@ -483,6 +486,8 @@ void ModeAuto::auto_terrain_recover_run() return; } +#if AP_RANGEFINDER_ENABLED + static uint32_t rangefinder_recovery_ms = 0; switch (sub.rangefinder.status_orient(ROTATION_PITCH_270)) { case RangeFinder::Status::OutOfRangeLow: @@ -529,6 +534,10 @@ void ModeAuto::auto_terrain_recover_run() rangefinder_recovery_ms = 0; return; } +#else + gcs().send_text(MAV_SEVERITY_CRITICAL, "Terrain failsafe recovery failure: No Rangefinder!"); + sub.failsafe_terrain_act(); +#endif // exit on failure (timeout) if (AP_HAL::millis() > sub.fs_terrain_recover_start_ms + FS_TERRAIN_RECOVER_TIMEOUT_MS) { diff --git a/ArduSub/mode_surftrak.cpp b/ArduSub/mode_surftrak.cpp index 23f90271c5..0bdc562f39 100644 --- a/ArduSub/mode_surftrak.cpp +++ b/ArduSub/mode_surftrak.cpp @@ -39,8 +39,10 @@ bool ModeSurftrak::init(bool ignore_checks) if (!sub.rangefinder_alt_ok()) { sub.gcs().send_text(MAV_SEVERITY_INFO, "waiting for a rangefinder reading"); +#if AP_RANGEFINDER_ENABLED } else if (sub.inertial_nav.get_position_z_up_cm() >= sub.g.surftrak_depth) { sub.gcs().send_text(MAV_SEVERITY_WARNING, "descend below %f meters to hold range", sub.g.surftrak_depth * 0.01f); +#endif } return true; @@ -60,6 +62,7 @@ bool ModeSurftrak::set_rangefinder_target_cm(float target_cm) { bool success = false; +#if AP_RANGEFINDER_ENABLED if (sub.control_mode != Number::SURFTRAK) { sub.gcs().send_text(MAV_SEVERITY_WARNING, "wrong mode, rangefinder target not set"); } else if (sub.inertial_nav.get_position_z_up_cm() >= sub.g.surftrak_depth) { @@ -84,6 +87,7 @@ bool ModeSurftrak::set_rangefinder_target_cm(float target_cm) } else { reset(); } +#endif return success; } @@ -141,6 +145,7 @@ void ModeSurftrak::control_range() { */ void ModeSurftrak::update_surface_offset() { +#if AP_RANGEFINDER_ENABLED if (sub.rangefinder_alt_ok()) { // Get the latest terrain offset float rangefinder_terrain_offset_cm = sub.rangefinder_state.rangefinder_terrain_offset_cm; @@ -162,4 +167,5 @@ void ModeSurftrak::update_surface_offset() sub.pos_control.set_pos_offset_target_z_cm(rangefinder_terrain_offset_cm); } } +#endif // AP_RANGEFINDER_ENABLED } diff --git a/ArduSub/motors.cpp b/ArduSub/motors.cpp index 895ade8c8c..5d45a2c00f 100644 --- a/ArduSub/motors.cpp +++ b/ArduSub/motors.cpp @@ -18,7 +18,11 @@ void Sub::motors_output() verify_motor_test(); } else { motors.set_interlock(true); + SRV_Channels::cork(); + SRV_Channels::calc_pwm(); + SRV_Channels::output_ch_all(); motors.output(); + SRV_Channels::push(); } } diff --git a/ArduSub/sensors.cpp b/ArduSub/sensors.cpp index a8cb75c7fd..d9a491de3f 100644 --- a/ArduSub/sensors.cpp +++ b/ArduSub/sensors.cpp @@ -17,7 +17,7 @@ void Sub::read_barometer() void Sub::init_rangefinder() { -#if RANGEFINDER_ENABLED == ENABLED +#if AP_RANGEFINDER_ENABLED rangefinder.set_log_rfnd_bit(MASK_LOG_CTUN); rangefinder.init(ROTATION_PITCH_270); rangefinder_state.alt_cm_filt.set_cutoff_frequency(RANGEFINDER_WPNAV_FILT_HZ); @@ -28,7 +28,7 @@ void Sub::init_rangefinder() // return rangefinder altitude in centimeters void Sub::read_rangefinder() { -#if RANGEFINDER_ENABLED == ENABLED +#if AP_RANGEFINDER_ENABLED rangefinder.update(); // signal quality ranges from 0 (worst) to 100 (perfect), -1 means n/a diff --git a/ArduSub/system.cpp b/ArduSub/system.cpp index a41524e7e6..95e7ecd383 100644 --- a/ArduSub/system.cpp +++ b/ArduSub/system.cpp @@ -129,7 +129,7 @@ void Sub::init_ardupilot() last_pilot_heading = ahrs.yaw_sensor; // initialise rangefinder -#if RANGEFINDER_ENABLED == ENABLED +#if AP_RANGEFINDER_ENABLED init_rangefinder(); #endif @@ -166,6 +166,7 @@ void Sub::startup_INS_ground() // initialise ahrs (may push imu calibration into the mpu6000 if using that device). ahrs.init(); ahrs.set_vehicle_class(AP_AHRS::VehicleClass::SUBMARINE); + ahrs.set_fly_forward(false); // Warm up and calibrate gyro offsets ins.init(scheduler.get_loop_rate_hz()); diff --git a/ArduSub/terrain.cpp b/ArduSub/terrain.cpp index 50249ade7b..217728b8e8 100644 --- a/ArduSub/terrain.cpp +++ b/ArduSub/terrain.cpp @@ -8,7 +8,7 @@ void Sub::terrain_update() // tell the rangefinder our height, so it can go into power saving // mode if available -#if RANGEFINDER_ENABLED == ENABLED +#if AP_RANGEFINDER_ENABLED float height; if (terrain.height_above_terrain(height, true)) { rangefinder.set_estimated_terrain_height(height); diff --git a/Blimp/Blimp.cpp b/Blimp/Blimp.cpp index 1273636c26..83f8e62073 100644 --- a/Blimp/Blimp.cpp +++ b/Blimp/Blimp.cpp @@ -165,9 +165,11 @@ void Blimp::ten_hz_logging_loop() } if (should_log(MASK_LOG_RCIN)) { logger.Write_RCIN(); +#if AP_RSSI_ENABLED if (rssi.enabled()) { logger.Write_RSSI(); } +#endif } if (should_log(MASK_LOG_RCOUT)) { logger.Write_RCOUT(); diff --git a/Blimp/GCS_Mavlink.cpp b/Blimp/GCS_Mavlink.cpp index ff52827562..320807e618 100644 --- a/Blimp/GCS_Mavlink.cpp +++ b/Blimp/GCS_Mavlink.cpp @@ -40,6 +40,9 @@ MAV_STATE GCS_MAVLINK_Blimp::vehicle_system_status() const if (blimp.ap.land_complete) { return MAV_STATE_STANDBY; } + if (!blimp.ap.initialised) { + return MAV_STATE_BOOT; + } return MAV_STATE_ACTIVE; } @@ -340,7 +343,9 @@ static const ap_message STREAM_POSITION_msgs[] = { static const ap_message STREAM_RC_CHANNELS_msgs[] = { MSG_SERVO_OUTPUT_RAW, MSG_RC_CHANNELS, +#if AP_MAVLINK_MSG_RC_CHANNELS_RAW_ENABLED MSG_RC_CHANNELS_RAW, // only sent on a mavlink1 connection +#endif }; static const ap_message STREAM_EXTRA1_msgs[] = { MSG_ATTITUDE, diff --git a/Blimp/Parameters.cpp b/Blimp/Parameters.cpp index 91a1cc017e..7a1d34c239 100644 --- a/Blimp/Parameters.cpp +++ b/Blimp/Parameters.cpp @@ -382,9 +382,11 @@ const AP_Param::Info Blimp::var_info[] = { GOBJECTN(ahrs.EKF3, NavEKF3, "EK3_", NavEKF3), #endif +#if AP_RSSI_ENABLED // @Group: RSSI_ // @Path: ../libraries/AP_RSSI/AP_RSSI.cpp GOBJECT(rssi, "RSSI_", AP_RSSI), +#endif // @Group: NTF_ // @Path: ../libraries/AP_Notify/AP_Notify.cpp diff --git a/Blimp/defines.h b/Blimp/defines.h index 0a73072a1a..619547d2fd 100644 --- a/Blimp/defines.h +++ b/Blimp/defines.h @@ -2,14 +2,6 @@ #include -// Just so that it's completely clear... -#define ENABLED 1 -#define DISABLED 0 - -// this avoids a very common config error -#define ENABLE ENABLED -#define DISABLE DISABLED - // bit options for DEV_OPTIONS parameter enum DevOptions { DevOptionADSBMAVLink = 1, diff --git a/Blimp/system.cpp b/Blimp/system.cpp index e32fa10a04..9c1df237c8 100644 --- a/Blimp/system.cpp +++ b/Blimp/system.cpp @@ -21,8 +21,10 @@ void Blimp::init_ardupilot() // initialise battery monitor battery.init(); +#if AP_RSSI_ENABLED // Init RSSI rssi.init(); +#endif barometer.init(); diff --git a/README.md b/README.md index 2121f8f21f..67f28a75bc 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,7 @@ for reviewing patches on their specific area. - ***Vehicle***: Rover - [Willian Galvani](https://github.com/williangalvani): - ***Vehicle***: Sub + - ***Board***: Navigator - [Michael du Breuil](https://github.com/WickedShell): - ***Subsystem***: Batteries - ***Subsystem***: GPS diff --git a/Rover/GCS_Mavlink.cpp b/Rover/GCS_Mavlink.cpp index 6189b2d281..ff34f55601 100644 --- a/Rover/GCS_Mavlink.cpp +++ b/Rover/GCS_Mavlink.cpp @@ -142,7 +142,12 @@ void GCS_MAVLINK_Rover::send_servo_out() 0, 0, 0, - receiver_rssi()); +#if AP_RSSI_ENABLED + receiver_rssi() +#else + 255 +#endif + ); } int16_t GCS_MAVLINK_Rover::vfr_hud_throttle() const @@ -555,7 +560,9 @@ static const ap_message STREAM_RAW_CONTROLLER_msgs[] = { static const ap_message STREAM_RC_CHANNELS_msgs[] = { MSG_SERVO_OUTPUT_RAW, MSG_RC_CHANNELS, +#if AP_MAVLINK_MSG_RC_CHANNELS_RAW_ENABLED MSG_RC_CHANNELS_RAW, // only sent on a mavlink1 connection +#endif }; static const ap_message STREAM_EXTRA1_msgs[] = { MSG_ATTITUDE, @@ -851,10 +858,14 @@ void GCS_MAVLINK_Rover::handle_set_position_target_local_ned(const mavlink_messa } // check for supported coordinate frames - if (packet.coordinate_frame != MAV_FRAME_LOCAL_NED && - packet.coordinate_frame != MAV_FRAME_LOCAL_OFFSET_NED && - packet.coordinate_frame != MAV_FRAME_BODY_NED && - packet.coordinate_frame != MAV_FRAME_BODY_OFFSET_NED) { + switch (packet.coordinate_frame) { + case MAV_FRAME_LOCAL_NED: + case MAV_FRAME_LOCAL_OFFSET_NED: + case MAV_FRAME_BODY_NED: + case MAV_FRAME_BODY_OFFSET_NED: + break; + + default: return; } @@ -970,14 +981,19 @@ void GCS_MAVLINK_Rover::handle_set_position_target_global_int(const mavlink_mess return; } // check for supported coordinate frames - if (packet.coordinate_frame != MAV_FRAME_GLOBAL && - packet.coordinate_frame != MAV_FRAME_GLOBAL_INT && - packet.coordinate_frame != MAV_FRAME_GLOBAL_RELATIVE_ALT && - packet.coordinate_frame != MAV_FRAME_GLOBAL_RELATIVE_ALT_INT && - packet.coordinate_frame != MAV_FRAME_GLOBAL_TERRAIN_ALT && - packet.coordinate_frame != MAV_FRAME_GLOBAL_TERRAIN_ALT_INT) { + switch (packet.coordinate_frame) { + case MAV_FRAME_GLOBAL: + case MAV_FRAME_GLOBAL_INT: + case MAV_FRAME_GLOBAL_RELATIVE_ALT: + case MAV_FRAME_GLOBAL_RELATIVE_ALT_INT: + case MAV_FRAME_GLOBAL_TERRAIN_ALT: + case MAV_FRAME_GLOBAL_TERRAIN_ALT_INT: + break; + + default: return; } + bool pos_ignore = packet.type_mask & MAVLINK_SET_POS_TYPE_MASK_POS_IGNORE; bool vel_ignore = packet.type_mask & MAVLINK_SET_POS_TYPE_MASK_VEL_IGNORE; bool acc_ignore = packet.type_mask & MAVLINK_SET_POS_TYPE_MASK_ACC_IGNORE; diff --git a/Rover/GCS_Rover.cpp b/Rover/GCS_Rover.cpp index 9ad82f7e32..0ed6c863f6 100644 --- a/Rover/GCS_Rover.cpp +++ b/Rover/GCS_Rover.cpp @@ -58,6 +58,7 @@ void GCS_Rover::update_vehicle_sensor_status_flags(void) } #endif +#if AP_RANGEFINDER_ENABLED const RangeFinder *rangefinder = RangeFinder::get_singleton(); if (rangefinder && rangefinder->num_sensors() > 0) { control_sensors_present |= MAV_SYS_STATUS_SENSOR_LASER_POSITION; @@ -67,4 +68,5 @@ void GCS_Rover::update_vehicle_sensor_status_flags(void) control_sensors_health |= MAV_SYS_STATUS_SENSOR_LASER_POSITION; } } +#endif } diff --git a/Rover/Log.cpp b/Rover/Log.cpp index 97bee976df..3490e2a703 100644 --- a/Rover/Log.cpp +++ b/Rover/Log.cpp @@ -29,6 +29,7 @@ void Rover::Log_Write_Attitude() } } +#if AP_RANGEFINDER_ENABLED // Write a range finder depth message void Rover::Log_Write_Depth() { @@ -83,6 +84,7 @@ void Rover::Log_Write_Depth() gcs().send_message(MSG_WATER_DEPTH); #endif } +#endif // guided mode logging struct PACKED log_GuidedTarget { @@ -235,9 +237,11 @@ void Rover::Log_Write_RC(void) { logger.Write_RCIN(); logger.Write_RCOUT(); +#if AP_RSSI_ENABLED if (rssi.enabled()) { logger.Write_RSSI(); } +#endif } void Rover::Log_Write_Vehicle_Startup_Messages() diff --git a/Rover/Parameters.cpp b/Rover/Parameters.cpp index 966785f699..0eb2480343 100644 --- a/Rover/Parameters.cpp +++ b/Rover/Parameters.cpp @@ -275,9 +275,11 @@ const AP_Param::Info Rover::var_info[] = { // AP_SerialManager was here +#if AP_RANGEFINDER_ENABLED // @Group: RNGFND // @Path: ../libraries/AP_RangeFinder/AP_RangeFinder.cpp GOBJECT(rangefinder, "RNGFND", RangeFinder), +#endif // @Group: INS // @Path: ../libraries/AP_InertialSensor/AP_InertialSensor.cpp @@ -356,9 +358,11 @@ const AP_Param::Info Rover::var_info[] = { // @Path: ../libraries/AP_Mission/AP_Mission.cpp GOBJECTN(mode_auto.mission, mission, "MIS_", AP_Mission), +#if AP_RSSI_ENABLED // @Group: RSSI_ // @Path: ../libraries/AP_RSSI/AP_RSSI.cpp GOBJECT(rssi, "RSSI_", AP_RSSI), +#endif // @Group: NTF_ // @Path: ../libraries/AP_Notify/AP_Notify.cpp @@ -414,7 +418,7 @@ const AP_Param::GroupInfo ParametersG2::var_info[] = { // @Path: ../libraries/RC_Channel/RC_Channels_VarInfo.h AP_SUBGROUPINFO(rc_channels, "RC", 4, ParametersG2, RC_Channels_Rover), -#if ADVANCED_FAILSAFE == ENABLED +#if AP_ROVER_ADVANCED_FAILSAFE_ENABLED // @Group: AFS_ // @Path: ../libraries/AP_AdvancedFailsafe/AP_AdvancedFailsafe.cpp AP_SUBGROUPINFO(afs, "AFS_", 5, ParametersG2, AP_AdvancedFailsafe), @@ -521,7 +525,7 @@ const AP_Param::GroupInfo ParametersG2::var_info[] = { // @Param: FRAME_TYPE // @DisplayName: Frame Type // @Description: Frame Type - // @Values: 0:Undefined,1:Omni3,2:OmniX,3:OmniPlus + // @Values: 0:Undefined,1:Omni3,2:OmniX,3:OmniPlus,4:Omni3Mecanum // @User: Standard // @RebootRequired: True AP_GROUPINFO("FRAME_TYPE", 24, ParametersG2, frame_type, 0), @@ -663,7 +667,7 @@ const AP_Param::GroupInfo ParametersG2::var_info[] = { // @User: Advanced AP_GROUPINFO("MANUAL_OPTIONS", 53, ParametersG2, manual_options, 0), -#if MODE_DOCK_ENABLED == ENABLED +#if MODE_DOCK_ENABLED // @Group: DOCK // @Path: mode_dock.cpp AP_SUBGROUPPTR(mode_dock_ptr, "DOCK", 54, ParametersG2, ModeDock), @@ -725,7 +729,7 @@ const AP_Param::GroupInfo ParametersG2::var_info[] = { ParametersG2::ParametersG2(void) : -#if ADVANCED_FAILSAFE == ENABLED +#if AP_ROVER_ADVANCED_FAILSAFE_ENABLED afs(), #endif #if AP_BEACON_ENABLED @@ -735,7 +739,7 @@ ParametersG2::ParametersG2(void) wheel_rate_control(wheel_encoder), attitude_control(), smart_rtl(), -#if MODE_DOCK_ENABLED == ENABLED +#if MODE_DOCK_ENABLED mode_dock_ptr(&rover.mode_dock), #endif #if HAL_PROXIMITY_ENABLED diff --git a/Rover/Parameters.h b/Rover/Parameters.h index e2d8d9849c..8a19324bfa 100644 --- a/Rover/Parameters.h +++ b/Rover/Parameters.h @@ -301,7 +301,7 @@ public: // control over servo output ranges SRV_Channels servo_channels; -#if ADVANCED_FAILSAFE == ENABLED +#if AP_ROVER_ADVANCED_FAILSAFE_ENABLED // advanced failsafe library AP_AdvancedFailsafe_Rover afs; #endif @@ -340,7 +340,7 @@ public: AP_Proximity proximity; #endif -#if MODE_DOCK_ENABLED == ENABLED +#if MODE_DOCK_ENABLED // we need a pointer to the mode for the G2 table class ModeDock *mode_dock_ptr; #endif diff --git a/Rover/RC_Channel.cpp b/Rover/RC_Channel.cpp index 4e17ec7769..75cd088a75 100644 --- a/Rover/RC_Channel.cpp +++ b/Rover/RC_Channel.cpp @@ -215,7 +215,7 @@ bool RC_Channel_Rover::do_aux_function(const AUX_FUNC ch_option, const AuxSwitch do_aux_function_change_mode(rover.mode_loiter, ch_flag); break; -#if MODE_FOLLOW_ENABLED == ENABLED +#if MODE_FOLLOW_ENABLED // Set mode to Follow case AUX_FUNC::FOLLOW: do_aux_function_change_mode(rover.mode_follow, ch_flag); diff --git a/Rover/ReleaseNotes.txt b/Rover/ReleaseNotes.txt index 3134750e57..eae250a33c 100644 --- a/Rover/ReleaseNotes.txt +++ b/Rover/ReleaseNotes.txt @@ -1,5 +1,53 @@ Rover Release Notes: --------------------- +------------------------------------------------------------------ +Release 4.5.5 1st Aug 2024 + +No changes from 4.5.5-beta2 +------------------------------------------------------------------ +Release 4.5.5-beta2 27 July 2024 + +Changes from 4.5.5-beta1 + +1) Board specific enhancements and bug fixes + +- CubeRed's second core disabled at boot to avoid spurious writes to RAM +- CubeRed bootloader's dual endpoint update method fixed +------------------------------------------------------------------ +Release 4.5.5-beta1 1st July 2024 + +Changes from 4.5.4 + +1) Board specific enhancements and bug fixes + +- fixed IOMCU transmission errors when using bdshot +- update relay parameter names on various boards +- add ASP5033 airspeed in minimal builds +- added RadiolinkPIX6 +- fix Aocoda-RC H743Dual motor issue +- use ICM45686 as an ICM20649 alternative in CubeRedPrimary + +2) System level minor enhancements and bug fixes + +- correct use-after-free in script statistics +- added arming check for eeprom full +- fixed a block logging issue which caused log messages to be dropped +- enable Socket SO_REUSEADDR on LwIP +- removed IST8310 overrun message +- added Siyi ZT6 support +- added BTFL sidebar symbols to the OSD +- added CRSF extended link stats to the OSD +- use the ESC with the highest RPM in the OSD when only one can be displayed +- support all Tramp power levels on high power VTXs +- emit jump count in missions even if no limit +- improve the bitmask indicating persistent parameters on bootloader flash +- fix duplicate error condition in the MicroStrain7 + +5) Other minor enhancements and bug fixes + +- specify pymonocypher version in more places +- added DroneCAN dependencies to custom builds + +------------------------------------------------------------------ Release 4.5.4 12th June 2024 Changes from 4.5.3 diff --git a/Rover/Rover.cpp b/Rover/Rover.cpp index 3bf4c1f274..a8fc94074d 100644 --- a/Rover/Rover.cpp +++ b/Rover/Rover.cpp @@ -70,7 +70,9 @@ const AP_Scheduler::Task Rover::scheduler_tasks[] = { // Function name, Hz, us, SCHED_TASK(read_radio, 50, 200, 3), SCHED_TASK(ahrs_update, 400, 400, 6), +#if AP_RANGEFINDER_ENABLED SCHED_TASK(read_rangefinders, 50, 200, 9), +#endif #if AP_OPTICALFLOW_ENABLED SCHED_TASK_CLASS(AP_OpticalFlow, &rover.optflow, update, 200, 160, 11), #endif @@ -132,7 +134,7 @@ const AP_Scheduler::Task Rover::scheduler_tasks[] = { #endif SCHED_TASK(crash_check, 10, 200, 123), SCHED_TASK(cruise_learn_update, 50, 200, 126), -#if ADVANCED_FAILSAFE == ENABLED +#if AP_ROVER_ADVANCED_FAILSAFE_ENABLED SCHED_TASK(afs_fs_check, 10, 200, 129), #endif }; @@ -293,17 +295,6 @@ void Rover::nav_script_time_done(uint16_t id) } #endif // AP_SCRIPTING_ENABLED -#if AP_STATS_ENABLED -/* - update AP_Stats -*/ -void Rover::stats_update(void) -{ - AP::stats()->set_flying(g2.motors.active()); -} -#endif - - // update AHRS system void Rover::ahrs_update() { @@ -468,6 +459,11 @@ void Rover::one_second_loop(void) g2.wp_nav.set_turn_params(g2.turn_radius, g2.motors.have_skid_steering()); g2.pos_control.set_turn_params(g2.turn_radius, g2.motors.have_skid_steering()); g2.wheel_rate_control.set_notch_sample_rate(AP::scheduler().get_filtered_loop_rate_hz()); + +#if AP_STATS_ENABLED + // Update stats "flying" time + AP::stats()->set_flying(g2.motors.active()); +#endif } void Rover::update_current_mode(void) diff --git a/Rover/Rover.h b/Rover/Rover.h index 0db95d23b3..93c7c5c64c 100644 --- a/Rover/Rover.h +++ b/Rover/Rover.h @@ -60,7 +60,7 @@ // Local modules #include "AP_Arming.h" #include "sailboat.h" -#if ADVANCED_FAILSAFE == ENABLED +#if AP_ROVER_ADVANCED_FAILSAFE_ENABLED #include "afs_rover.h" #endif #include "Parameters.h" @@ -81,7 +81,7 @@ public: friend class ParametersG2; friend class AP_Rally_Rover; friend class AP_Arming_Rover; -#if ADVANCED_FAILSAFE == ENABLED +#if AP_ROVER_ADVANCED_FAILSAFE_ENABLED friend class AP_AdvancedFailsafe_Rover; #endif #if AP_EXTERNAL_CONTROL_ENABLED @@ -99,11 +99,11 @@ public: friend class ModeManual; friend class ModeRTL; friend class ModeSmartRTL; -#if MODE_FOLLOW_ENABLED == ENABLED +#if MODE_FOLLOW_ENABLED friend class ModeFollow; #endif friend class ModeSimple; -#if MODE_DOCK_ENABLED == ENABLED +#if MODE_DOCK_ENABLED friend class ModeDock; #endif @@ -206,8 +206,10 @@ private: // true if we have a position estimate from AHRS bool have_position; +#if AP_RANGEFINDER_ENABLED // range finder last update for each instance (used for DPTH logging) uint32_t rangefinder_last_reading_ms[RANGEFINDER_MAX_INSTANCES]; +#endif // Ground speed // The amount current ground speed is below min ground speed. meters per second @@ -251,11 +253,11 @@ private: ModeSteering mode_steering; ModeRTL mode_rtl; ModeSmartRTL mode_smartrtl; -#if MODE_FOLLOW_ENABLED == ENABLED +#if MODE_FOLLOW_ENABLED ModeFollow mode_follow; #endif ModeSimple mode_simple; -#if MODE_DOCK_ENABLED == ENABLED +#if MODE_DOCK_ENABLED ModeDock mode_dock; #endif @@ -285,7 +287,6 @@ private: bool nav_script_time(uint16_t &id, uint8_t &cmd, float &arg1, float &arg2, int16_t &arg3, int16_t &arg4) override; void nav_script_time_done(uint16_t id) override; #endif // AP_SCRIPTING_ENABLED - void stats_update(); void ahrs_update(); void gcs_failsafe_check(void); void update_logging1(void); @@ -321,7 +322,7 @@ private: // failsafe.cpp void failsafe_trigger(uint8_t failsafe_type, const char* type_str, bool on); void handle_battery_failsafe(const char* type_str, const int8_t action); -#if ADVANCED_FAILSAFE == ENABLED +#if AP_ROVER_ADVANCED_FAILSAFE_ENABLED void afs_fs_check(void); #endif @@ -373,7 +374,9 @@ private: void update_compass(void); void compass_save(void); void update_wheel_encoder(); +#if AP_RANGEFINDER_ENABLED void read_rangefinders(void); +#endif // Steering.cpp void set_servos(void); diff --git a/Rover/afs_rover.cpp b/Rover/afs_rover.cpp index 4265a20887..29e1f12da1 100644 --- a/Rover/afs_rover.cpp +++ b/Rover/afs_rover.cpp @@ -4,7 +4,7 @@ #include "Rover.h" -#if ADVANCED_FAILSAFE == ENABLED +#if AP_ROVER_ADVANCED_FAILSAFE_ENABLED /* Setup radio_out values for all channels to termination values @@ -32,6 +32,6 @@ AP_AdvancedFailsafe::control_mode AP_AdvancedFailsafe_Rover::afs_mode(void) //to force entering auto mode when datalink loss void AP_AdvancedFailsafe_Rover::set_mode_auto(void) { - over.set_mode(rover.mode_auto,ModeReason::GCS_FAILSAFE); + rover.set_mode(rover.mode_auto,ModeReason::GCS_FAILSAFE); } -#endif // ADVANCED_FAILSAFE +#endif // AP_ROVER_ADVANCED_FAILSAFE_ENABLED diff --git a/Rover/afs_rover.h b/Rover/afs_rover.h index aa3473ddc3..f8b291eeda 100644 --- a/Rover/afs_rover.h +++ b/Rover/afs_rover.h @@ -18,7 +18,7 @@ advanced failsafe support for rover */ -#if ADVANCED_FAILSAFE == ENABLED +#if AP_ROVER_ADVANCED_FAILSAFE_ENABLED #include /* diff --git a/Rover/config.h b/Rover/config.h index f1f07a71f0..7685a875b8 100644 --- a/Rover/config.h +++ b/Rover/config.h @@ -72,6 +72,6 @@ #define RESET_SWITCH_CHAN_PWM 1750 #endif -#ifndef ADVANCED_FAILSAFE - #define ADVANCED_FAILSAFE DISABLED +#ifndef AP_ROVER_ADVANCED_FAILSAFE_ENABLED + #define AP_ROVER_ADVANCED_FAILSAFE_ENABLED 0 #endif diff --git a/Rover/defines.h b/Rover/defines.h index 5fd45c2a2c..150afba023 100644 --- a/Rover/defines.h +++ b/Rover/defines.h @@ -3,14 +3,6 @@ // Internal defines, don't edit and expect things to work // ------------------------------------------------------- -// Just so that it's completely clear... -#define ENABLED 1 -#define DISABLED 0 - -// this avoids a very common config error -#define ENABLE ENABLED -#define DISABLE DISABLED - #define SERVO_MAX 4500.0 // This value represents 45 degrees and is just an arbitrary representation of servo max travel. // types of failsafe events diff --git a/Rover/failsafe.cpp b/Rover/failsafe.cpp index da877c2bb7..3aabdfbacf 100644 --- a/Rover/failsafe.cpp +++ b/Rover/failsafe.cpp @@ -84,17 +84,17 @@ void Rover::failsafe_trigger(uint8_t failsafe_type, const char* type_str, bool o case FailsafeAction::None: break; case FailsafeAction::SmartRTL: - if (set_mode(mode_smartrtl, ModeReason::BATTERY_FAILSAFE)) { + if (set_mode(mode_smartrtl, ModeReason::FAILSAFE)) { break; } FALLTHROUGH; case FailsafeAction::RTL: - if (set_mode(mode_rtl, ModeReason::BATTERY_FAILSAFE)) { + if (set_mode(mode_rtl, ModeReason::FAILSAFE)) { break; } FALLTHROUGH; case FailsafeAction::Hold: - set_mode(mode_hold, ModeReason::BATTERY_FAILSAFE); + set_mode(mode_hold, ModeReason::FAILSAFE); break; case FailsafeAction::SmartRTL_Hold: if (!set_mode(mode_smartrtl, ModeReason::FAILSAFE)) { @@ -133,18 +133,18 @@ void Rover::handle_battery_failsafe(const char* type_str, const int8_t action) } break; case FailsafeAction::Terminate: -#if ADVANCED_FAILSAFE == ENABLED +#if AP_ROVER_ADVANCED_FAILSAFE_ENABLED char battery_type_str[17]; snprintf(battery_type_str, 17, "%s battery", type_str); g2.afs.gcs_terminate(true, battery_type_str); #else arming.disarm(AP_Arming::Method::BATTERYFAILSAFE); -#endif // ADVANCED_FAILSAFE == ENABLED +#endif // AP_ROVER_ADVANCED_FAILSAFE_ENABLED break; } } -#if ADVANCED_FAILSAFE == ENABLED +#if AP_ROVER_ADVANCED_FAILSAFE_ENABLED /* check for AFS failsafe check */ diff --git a/Rover/fence.cpp b/Rover/fence.cpp index 4c29b48d24..2706bf91d3 100644 --- a/Rover/fence.cpp +++ b/Rover/fence.cpp @@ -25,17 +25,17 @@ void Rover::fence_check() case FailsafeAction::None: break; case FailsafeAction::SmartRTL: - if (set_mode(mode_smartrtl, ModeReason::BATTERY_FAILSAFE)) { + if (set_mode(mode_smartrtl, ModeReason::FENCE_BREACHED)) { break; } FALLTHROUGH; case FailsafeAction::RTL: - if (set_mode(mode_rtl, ModeReason::BATTERY_FAILSAFE)) { + if (set_mode(mode_rtl, ModeReason::FENCE_BREACHED)) { break; } FALLTHROUGH; case FailsafeAction::Hold: - set_mode(mode_hold, ModeReason::BATTERY_FAILSAFE); + set_mode(mode_hold, ModeReason::FENCE_BREACHED); break; case FailsafeAction::SmartRTL_Hold: if (!set_mode(mode_smartrtl, ModeReason::FENCE_BREACHED)) { diff --git a/Rover/mode.cpp b/Rover/mode.cpp index b5800acb34..2b626ca4bb 100644 --- a/Rover/mode.cpp +++ b/Rover/mode.cpp @@ -531,7 +531,7 @@ Mode *Rover::mode_from_mode_num(const enum Mode::Number num) case Mode::Number::LOITER: ret = &mode_loiter; break; -#if MODE_FOLLOW_ENABLED == ENABLED +#if MODE_FOLLOW_ENABLED case Mode::Number::FOLLOW: ret = &mode_follow; break; @@ -557,7 +557,7 @@ Mode *Rover::mode_from_mode_num(const enum Mode::Number num) case Mode::Number::INITIALISING: ret = &mode_initializing; break; -#if MODE_DOCK_ENABLED == ENABLED +#if MODE_DOCK_ENABLED case Mode::Number::DOCK: ret = (Mode *)g2.mode_dock_ptr; break; diff --git a/Rover/mode.h b/Rover/mode.h index 9507914bee..c338d8cea2 100644 --- a/Rover/mode.h +++ b/Rover/mode.h @@ -19,7 +19,7 @@ public: LOITER = 5, FOLLOW = 6, SIMPLE = 7, -#if MODE_DOCK_ENABLED == ENABLED +#if MODE_DOCK_ENABLED DOCK = 8, #endif CIRCLE = 9, @@ -457,6 +457,12 @@ protected: // initialise mode bool _enter() override; + // Update position controller targets driving to the circle edge + void update_drive_to_radius(); + + // Update position controller targets while circling + void update_circling(); + // initialise target_yaw_rad using the vehicle's position and yaw // if there is no current position estimate target_yaw_rad is set to vehicle yaw void init_target_yaw_rad(); @@ -802,7 +808,7 @@ protected: bool _enter() override { return false; }; }; -#if MODE_FOLLOW_ENABLED == ENABLED +#if MODE_FOLLOW_ENABLED class ModeFollow : public Mode { public: @@ -862,7 +868,7 @@ private: float _desired_heading_cd; // latest desired heading (in centi-degrees) from pilot }; -#if MODE_DOCK_ENABLED == ENABLED +#if MODE_DOCK_ENABLED class ModeDock : public Mode { public: diff --git a/Rover/mode_auto.cpp b/Rover/mode_auto.cpp index fa1ea8ece2..6e97b0a1d2 100644 --- a/Rover/mode_auto.cpp +++ b/Rover/mode_auto.cpp @@ -593,18 +593,6 @@ bool ModeAuto::start_command(const AP_Mission::Mission_Command& cmd) do_set_reverse(cmd); break; - case MAV_CMD_DO_FENCE_ENABLE: -#if AP_FENCE_ENABLED - if (cmd.p1 == 0) { //disable - rover.fence.enable(false); - gcs().send_text(MAV_SEVERITY_INFO, "Fence Disabled"); - } else { //enable fence - rover.fence.enable(true); - gcs().send_text(MAV_SEVERITY_INFO, "Fence Enabled"); - } -#endif - break; - case MAV_CMD_DO_GUIDED_LIMITS: do_guided_limits(cmd); break; diff --git a/Rover/mode_circle.cpp b/Rover/mode_circle.cpp index 0610995248..7bac1e9f50 100644 --- a/Rover/mode_circle.cpp +++ b/Rover/mode_circle.cpp @@ -144,19 +144,50 @@ void ModeCircle::update() return; } - // check if vehicle has reached edge of circle + // Update distance to destination and distance to edge const Vector2f center_to_veh = curr_pos - config.center_pos; _distance_to_destination = center_to_veh.length(); dist_to_edge_m = fabsf(_distance_to_destination - config.radius); + + // Update depending on stage if (!reached_edge) { - const float dist_thresh_m = MAX(g2.turn_radius, AR_CIRCLE_REACHED_EDGE_DIST); - reached_edge = dist_to_edge_m <= dist_thresh_m; + update_drive_to_radius(); + + } else { + update_circling(); } + g2.pos_control.update(rover.G_Dt); + + // get desired speed and turn rate from pos_control + const float desired_speed = g2.pos_control.get_desired_speed(); + const float desired_turn_rate = g2.pos_control.get_desired_turn_rate_rads(); + + // run steering and throttle controllers + calc_steering_from_turn_rate(desired_turn_rate); + calc_throttle(desired_speed, true); +} + +void ModeCircle::update_drive_to_radius() +{ + // check if vehicle has reached edge of circle + const float dist_thresh_m = MAX(g2.turn_radius, AR_CIRCLE_REACHED_EDGE_DIST); + reached_edge |= dist_to_edge_m <= dist_thresh_m; + + // calculate target point's position, velocity and acceleration + target.pos = config.center_pos.topostype(); + target.pos.offset_bearing(degrees(target.yaw_rad), config.radius); + + g2.pos_control.input_pos_target(target.pos, rover.G_Dt); +} + +// Update position controller targets while circling +void ModeCircle::update_circling() +{ + // accelerate speed up to desired speed - const float speed_max = reached_edge ? config.speed : 0.0; const float speed_change_max = (g2.pos_control.get_accel_max() * 0.5 * rover.G_Dt); - const float accel_fb = constrain_float(speed_max - target.speed, -speed_change_max, speed_change_max); + const float accel_fb = constrain_float(config.speed - target.speed, -speed_change_max, speed_change_max); target.speed += accel_fb; // calculate angular rate and update target angle @@ -179,15 +210,7 @@ void ModeCircle::update() target.accel.rotate(target.yaw_rad); g2.pos_control.set_pos_vel_accel_target(target.pos, target.vel, target.accel); - g2.pos_control.update(rover.G_Dt); - // get desired speed and turn rate from pos_control - const float desired_speed = g2.pos_control.get_desired_speed(); - const float desired_turn_rate = g2.pos_control.get_desired_turn_rate_rads(); - - // run steering and throttle controllers - calc_steering_from_turn_rate(desired_turn_rate); - calc_throttle(desired_speed, true); } // return desired heading (in degrees) and cross track error (in meters) for reporting to ground station (NAV_CONTROLLER_OUTPUT message) diff --git a/Rover/mode_dock.cpp b/Rover/mode_dock.cpp index 89f8d89af7..09d727fce0 100644 --- a/Rover/mode_dock.cpp +++ b/Rover/mode_dock.cpp @@ -1,6 +1,6 @@ #include "Rover.h" -#if MODE_DOCK_ENABLED == ENABLED +#if MODE_DOCK_ENABLED const AP_Param::GroupInfo ModeDock::var_info[] = { // @Param: _SPEED diff --git a/Rover/sensors.cpp b/Rover/sensors.cpp index aa9f791891..793fa4b726 100644 --- a/Rover/sensors.cpp +++ b/Rover/sensors.cpp @@ -87,6 +87,7 @@ void Rover::update_wheel_encoder() #endif } +#if AP_RANGEFINDER_ENABLED // read the rangefinders void Rover::read_rangefinders(void) { @@ -95,3 +96,4 @@ void Rover::read_rangefinders(void) Log_Write_Depth(); #endif } +#endif diff --git a/Rover/system.cpp b/Rover/system.cpp index 4c45b7796a..51d9bd079d 100644 --- a/Rover/system.cpp +++ b/Rover/system.cpp @@ -18,7 +18,9 @@ void Rover::init_ardupilot() rpm_sensor.init(); #endif +#if AP_RSSI_ENABLED rssi.init(); +#endif g2.windvane.init(serial_manager); @@ -28,7 +30,7 @@ void Rover::init_ardupilot() // setup telem slots with serial ports gcs().setup_uarts(); -#if OSD_ENABLED == ENABLED +#if OSD_ENABLED osd.init(); #endif @@ -40,9 +42,11 @@ void Rover::init_ardupilot() airspeed.set_log_bit(MASK_LOG_IMU); #endif +#if AP_RANGEFINDER_ENABLED // initialise rangefinder rangefinder.set_log_rfnd_bit(MASK_LOG_RANGEFINDER); rangefinder.init(ROTATION_NONE); +#endif #if HAL_PROXIMITY_ENABLED // init proximity sensor @@ -197,7 +201,7 @@ bool Rover::gcs_mode_enabled(const Mode::Number mode_num) const (uint8_t)Mode::Number::RTL, (uint8_t)Mode::Number::SMART_RTL, (uint8_t)Mode::Number::GUIDED, -#if MODE_DOCK_ENABLED == ENABLED +#if MODE_DOCK_ENABLED (uint8_t)Mode::Number::DOCK #endif }; diff --git a/Tools/AP_Bootloader/AP_Bootloader.cpp b/Tools/AP_Bootloader/AP_Bootloader.cpp index 79fdb759b0..5c1efea998 100644 --- a/Tools/AP_Bootloader/AP_Bootloader.cpp +++ b/Tools/AP_Bootloader/AP_Bootloader.cpp @@ -74,7 +74,7 @@ int main(void) flash_init(); -#ifdef STM32H7 +#if defined(STM32H7) && CH_CFG_USE_HEAP check_ecc_errors(); #endif diff --git a/Tools/AP_Bootloader/board_types.txt b/Tools/AP_Bootloader/board_types.txt index dfaacdea61..fadf54a13a 100644 --- a/Tools/AP_Bootloader/board_types.txt +++ b/Tools/AP_Bootloader/board_types.txt @@ -72,6 +72,9 @@ EXT_HW_RADIOLINK_MINI_PIX 3 # Do not allocate IDs in the range 1000 to 19999 except via a PR # against this file in https://github.com/ArduPilot/ardupilot/tree/master/Tools/AP_Bootloader/board_types.txt +# if you want to reserve a block of IDs, please limit that allocation +# to 10 IDs at a time. + # values starting with AP_ are implemented in the ArduPilot bootloader # https://github.com/ArduPilot/ardupilot/tree/master/Tools/AP_Bootloader # the values come from the APJ_BOARD_ID in the hwdef files here: @@ -283,12 +286,16 @@ AP_HW_JHEMCUF405WING 1169 AP_HW_MatekG474 1170 AP_HW_PhenixH7_lite 1171 AP_HW_PhenixH7_Pro 1172 +AP_HW_2RAWH743 1173 AP_HW_FlywooF405HD_AIOv2 1180 +AP_HW_FlywooH743Pro 1181 AP_HW_ESP32_PERIPH 1205 AP_HW_ESP32S3_PERIPH 1206 +AP_HW_CBUnmanned-CM405-FC 1301 + AP_HW_KHA_ETH 1315 AP_HW_CUBEORANGE_PERIPH 1400 @@ -311,6 +318,11 @@ AP_HW_LongbowF405 1422 AP_HW_MountainEagleH743 1444 +AP_HW_StellarF4 1500 +AP_HW_GEPRCF745BTHD 1501 + +AP_HW_MFT-SEMA100 2000 + AP_HW_SakuraRC-H743 2714 # IDs 4200-4220 reserved for HAKRC @@ -351,18 +363,22 @@ AP_HW_Holybro-PMU-F4 5401 AP_HW_Holybro-UM982-G4 5402 AP_HW_Holybro-UM960-H7 5403 AP_HW_Holybro-PERIPH-H7 5404 +AP_HW_Holybro-KakuteF4-Wing 5405 #IDs 5501-5599 reserved for MATEKSYS AP_HW_MATEKH743SE 5501 - #IDs 5600-5699 reserved for ZeroOne AP_HW_ZeroOne_X6 5600 +AP_HW_ZeroOne_PMU 5601 +AP_HW_ZeroOne_GNSS 5602 # IDs 6000-6099 reserved for SpektreWorks # IDs 6600-6699 reserved for Eagle Eye Drones +# IDs 6900-6909 reserved for Easy Aerial + # IDs 7000-7099 reserved for CUAV AP_HW_CUAV-7-NANO 7000 diff --git a/Tools/AP_Bootloader/can.cpp b/Tools/AP_Bootloader/can.cpp index 0026ffc9c5..5e8515dc71 100644 --- a/Tools/AP_Bootloader/can.cpp +++ b/Tools/AP_Bootloader/can.cpp @@ -139,7 +139,7 @@ static uint32_t get_random_range(uint16_t range) static void handle_get_node_info(CanardInstance* ins, CanardRxTransfer* transfer) { - uint8_t buffer[UAVCAN_PROTOCOL_GETNODEINFO_RESPONSE_MAX_SIZE] {}; + uint8_t buffer[UAVCAN_PROTOCOL_GETNODEINFO_RESPONSE_MAX_SIZE]; uavcan_protocol_GetNodeInfoResponse pkt {}; node_status.uptime_sec = AP_HAL::millis() / 1000U; @@ -747,7 +747,7 @@ bool can_check_update(void) bool ret = false; #if HAL_RAM_RESERVE_START >= 256 struct app_bootloader_comms *comms = (struct app_bootloader_comms *)HAL_RAM0_START; - if (comms->magic == APP_BOOTLOADER_COMMS_MAGIC) { + if (comms->magic == APP_BOOTLOADER_COMMS_MAGIC && comms->my_node_id != 0) { can_set_node_id(comms->my_node_id); fw_update.node_id = comms->server_node_id; for (uint8_t i=0; i otg2_serial_deadline_ms); + return (AP_HAL::millis() < otg2_serial_deadline_ms); } #endif @@ -533,32 +533,40 @@ void port_setbaud(uint32_t baudrate) } #endif // BOOTLOADER_DEV_LIST -#ifdef STM32H7 +#if defined(STM32H7) && CH_CFG_USE_HEAP /* check if flash has any ECC errors and if it does then erase all of flash */ +#define ECC_CHECK_CHUNK_SIZE (32*sizeof(uint32_t)) void check_ecc_errors(void) { __disable_fault_irq(); + // stm32_flash_corrupt(0x8043200); auto *dma = dmaStreamAlloc(STM32_DMA_STREAM_ID(1, 1), 0, nullptr, nullptr); - uint32_t buf[32]; + + uint32_t *buf = (uint32_t*)malloc_dma(ECC_CHECK_CHUNK_SIZE); + + if (buf == nullptr) { + // DMA'ble memory not available + return; + } uint32_t ofs = 0; while (ofs < BOARD_FLASH_SIZE*1024) { - if (FLASH->SR1 != 0) { + if (FLASH->SR1 & (FLASH_SR_SNECCERR | FLASH_SR_DBECCERR)) { break; } #if BOARD_FLASH_SIZE > 1024 - if (FLASH->SR2 != 0) { + if (FLASH->SR2 & (FLASH_SR_SNECCERR | FLASH_SR_DBECCERR)) { break; } #endif dmaStartMemCopy(dma, STM32_DMA_CR_PL(0) | STM32_DMA_CR_PSIZE_BYTE | STM32_DMA_CR_MSIZE_BYTE, - ofs+(uint8_t*)FLASH_BASE, buf, sizeof(buf)); + ofs+(uint8_t*)FLASH_BASE, buf, ECC_CHECK_CHUNK_SIZE); dmaWaitCompletion(dma); - ofs += sizeof(buf); + ofs += ECC_CHECK_CHUNK_SIZE; } dmaStreamFree(dma); @@ -572,5 +580,5 @@ void check_ecc_errors(void) } __enable_fault_irq(); } -#endif // STM32H7 +#endif // defined(STM32H7) && CH_CFG_USE_HEAP diff --git a/Tools/AP_Bootloader/support.h b/Tools/AP_Bootloader/support.h index 5dda7a38b2..8928ff9442 100644 --- a/Tools/AP_Bootloader/support.h +++ b/Tools/AP_Bootloader/support.h @@ -51,7 +51,9 @@ void thread_sleep_ms(uint32_t ms); void custom_startup(void); +#if defined(STM32H7) && CH_CFG_USE_HEAP void check_ecc_errors(void); +#endif // printf to debug uart (or USB) extern "C" { diff --git a/Tools/AP_Periph/AP_Periph.cpp b/Tools/AP_Periph/AP_Periph.cpp index 976dbc5834..b952d7ae24 100644 --- a/Tools/AP_Periph/AP_Periph.cpp +++ b/Tools/AP_Periph/AP_Periph.cpp @@ -608,7 +608,9 @@ void AP_Periph_FW::prepare_reboot() // delay to give the ACK a chance to get out, the LEDs to flash, // the IO board safety to be forced on, the parameters to flush, + hal.scheduler->expect_delay_ms(100); hal.scheduler->delay(40); + hal.scheduler->expect_delay_ms(0); } /* diff --git a/Tools/AP_Periph/Parameters.cpp b/Tools/AP_Periph/Parameters.cpp index 61e42c29f3..79eed58f74 100644 --- a/Tools/AP_Periph/Parameters.cpp +++ b/Tools/AP_Periph/Parameters.cpp @@ -407,6 +407,15 @@ const AP_Param::Info AP_Periph_FW::var_info[] = { // @Path: ../libraries/SRV_Channel/SRV_Channels.cpp GOBJECT(servo_channels, "OUT", SRV_Channels), + // @Param: ESC_RATE + // @DisplayName: ESC Update Rate + // @Description: Rate in Hz that ESC PWM outputs (function is MotorN) will update at + // @Units: Hz + // @Range: 50 400 + // @Increment: 1 + // @User: Advanced + GSCALAR(esc_rate, "ESC_RATE", 400), // effective Copter and QuadPlane default after clamping + // @Param: ESC_PWM_TYPE // @DisplayName: Output PWM type // @Description: This selects the output PWM type, allowing for normal PWM continuous output, OneShot, brushed or DShot motor output diff --git a/Tools/AP_Periph/Parameters.h b/Tools/AP_Periph/Parameters.h index d68e38f7b4..03730a5ff4 100644 --- a/Tools/AP_Periph/Parameters.h +++ b/Tools/AP_Periph/Parameters.h @@ -95,6 +95,7 @@ public: k_param_rangefinder_port1, k_param_options, k_param_rpm_msg_rate, + k_param_esc_rate, }; AP_Int16 format_version; @@ -174,6 +175,7 @@ public: #endif #ifdef HAL_PERIPH_ENABLE_RC_OUT + AP_Int16 esc_rate; AP_Int8 esc_pwm_type; AP_Int16 esc_command_timeout_ms; #if HAL_WITH_ESC_TELEM && !HAL_GCS_ENABLED diff --git a/Tools/AP_Periph/Web/scripts/pppgw_webui.lua b/Tools/AP_Periph/Web/scripts/pppgw_webui.lua index 9c458c7e07..58cf3590ba 100644 --- a/Tools/AP_Periph/Web/scripts/pppgw_webui.lua +++ b/Tools/AP_Periph/Web/scripts/pppgw_webui.lua @@ -221,6 +221,7 @@ local DYNAMIC_PAGES = { IP Netmask Gateway + MCU Temperature ]] } diff --git a/Tools/AP_Periph/adsb.cpp b/Tools/AP_Periph/adsb.cpp index 1a1229826b..917beffb91 100644 --- a/Tools/AP_Periph/adsb.cpp +++ b/Tools/AP_Periph/adsb.cpp @@ -138,7 +138,7 @@ void AP_Periph_FW::can_send_ADSB(struct __mavlink_adsb_vehicle_t &msg) pkt.vertical_velocity_valid = (msg.flags & 0x0080) != 0; pkt.baro_valid = (msg.flags & 0x0100) != 0; - uint8_t buffer[ARDUPILOT_EQUIPMENT_TRAFFICMONITOR_TRAFFICREPORT_MAX_SIZE] {}; + uint8_t buffer[ARDUPILOT_EQUIPMENT_TRAFFICMONITOR_TRAFFICREPORT_MAX_SIZE]; uint16_t total_size = ardupilot_equipment_trafficmonitor_TrafficReport_encode(&pkt, buffer, !periph.canfdout()); canard_broadcast(ARDUPILOT_EQUIPMENT_TRAFFICMONITOR_TRAFFICREPORT_SIGNATURE, diff --git a/Tools/AP_Periph/airspeed.cpp b/Tools/AP_Periph/airspeed.cpp index 579b1f04bc..71cc910c66 100644 --- a/Tools/AP_Periph/airspeed.cpp +++ b/Tools/AP_Periph/airspeed.cpp @@ -72,7 +72,7 @@ void AP_Periph_FW::can_airspeed_update(void) } #endif - uint8_t buffer[UAVCAN_EQUIPMENT_AIR_DATA_RAWAIRDATA_MAX_SIZE] {}; + uint8_t buffer[UAVCAN_EQUIPMENT_AIR_DATA_RAWAIRDATA_MAX_SIZE]; uint16_t total_size = uavcan_equipment_air_data_RawAirData_encode(&pkt, buffer, !periph.canfdout()); canard_broadcast(UAVCAN_EQUIPMENT_AIR_DATA_RAWAIRDATA_SIGNATURE, diff --git a/Tools/AP_Periph/baro.cpp b/Tools/AP_Periph/baro.cpp index a1b1bc35bc..61c296cd13 100644 --- a/Tools/AP_Periph/baro.cpp +++ b/Tools/AP_Periph/baro.cpp @@ -34,7 +34,7 @@ void AP_Periph_FW::can_baro_update(void) pkt.static_pressure = press; pkt.static_pressure_variance = 0; // should we make this a parameter? - uint8_t buffer[UAVCAN_EQUIPMENT_AIR_DATA_STATICPRESSURE_MAX_SIZE] {}; + uint8_t buffer[UAVCAN_EQUIPMENT_AIR_DATA_STATICPRESSURE_MAX_SIZE]; uint16_t total_size = uavcan_equipment_air_data_StaticPressure_encode(&pkt, buffer, !periph.canfdout()); canard_broadcast(UAVCAN_EQUIPMENT_AIR_DATA_STATICPRESSURE_SIGNATURE, @@ -49,7 +49,7 @@ void AP_Periph_FW::can_baro_update(void) pkt.static_temperature = C_TO_KELVIN(temp); pkt.static_temperature_variance = 0; // should we make this a parameter? - uint8_t buffer[UAVCAN_EQUIPMENT_AIR_DATA_STATICTEMPERATURE_MAX_SIZE] {}; + uint8_t buffer[UAVCAN_EQUIPMENT_AIR_DATA_STATICTEMPERATURE_MAX_SIZE]; uint16_t total_size = uavcan_equipment_air_data_StaticTemperature_encode(&pkt, buffer, !periph.canfdout()); canard_broadcast(UAVCAN_EQUIPMENT_AIR_DATA_STATICTEMPERATURE_SIGNATURE, diff --git a/Tools/AP_Periph/battery.cpp b/Tools/AP_Periph/battery.cpp index 442109951f..942e5b2136 100644 --- a/Tools/AP_Periph/battery.cpp +++ b/Tools/AP_Periph/battery.cpp @@ -67,7 +67,7 @@ void AP_Periph_FW::can_battery_update(void) pkt.model_name.len = strnlen((char*)pkt.model_name.data, sizeof(pkt.model_name.data)); #endif //defined(HAL_PERIPH_BATTERY_SKIP_NAME) - uint8_t buffer[UAVCAN_EQUIPMENT_POWER_BATTERYINFO_MAX_SIZE] {}; + uint8_t buffer[UAVCAN_EQUIPMENT_POWER_BATTERYINFO_MAX_SIZE]; const uint16_t total_size = uavcan_equipment_power_BatteryInfo_encode(&pkt, buffer, !periph.canfdout()); canard_broadcast(UAVCAN_EQUIPMENT_POWER_BATTERYINFO_SIGNATURE, diff --git a/Tools/AP_Periph/can.cpp b/Tools/AP_Periph/can.cpp index 110a482f2f..556791c311 100644 --- a/Tools/AP_Periph/can.cpp +++ b/Tools/AP_Periph/can.cpp @@ -185,7 +185,7 @@ static void readUniqueID(uint8_t* out_uid) void AP_Periph_FW::handle_get_node_info(CanardInstance* canard_instance, CanardRxTransfer* transfer) { - uint8_t buffer[UAVCAN_PROTOCOL_GETNODEINFO_RESPONSE_MAX_SIZE] {}; + uint8_t buffer[UAVCAN_PROTOCOL_GETNODEINFO_RESPONSE_MAX_SIZE]; uavcan_protocol_GetNodeInfoResponse pkt {}; node_status.uptime_sec = AP_HAL::millis() / 1000U; @@ -324,7 +324,7 @@ void AP_Periph_FW::handle_param_getset(CanardInstance* canard_instance, CanardRx pkt.name.len = strnlen((char *)pkt.name.data, sizeof(pkt.name.data)); } - uint8_t buffer[UAVCAN_PROTOCOL_PARAM_GETSET_RESPONSE_MAX_SIZE] {}; + uint8_t buffer[UAVCAN_PROTOCOL_PARAM_GETSET_RESPONSE_MAX_SIZE]; uint16_t total_size = uavcan_protocol_param_GetSetResponse_encode(&pkt, buffer, !canfdout()); canard_respond(canard_instance, @@ -373,7 +373,7 @@ void AP_Periph_FW::handle_param_executeopcode(CanardInstance* canard_instance, C pkt.ok = true; - uint8_t buffer[UAVCAN_PROTOCOL_PARAM_EXECUTEOPCODE_RESPONSE_MAX_SIZE] {}; + uint8_t buffer[UAVCAN_PROTOCOL_PARAM_EXECUTEOPCODE_RESPONSE_MAX_SIZE]; uint16_t total_size = uavcan_protocol_param_ExecuteOpcodeResponse_encode(&pkt, buffer, !canfdout()); canard_respond(canard_instance, @@ -406,7 +406,7 @@ void AP_Periph_FW::handle_begin_firmware_update(CanardInstance* canard_instance, memcpy(comms->path, req.image_file_remote_path.path.data, req.image_file_remote_path.path.len); comms->my_node_id = canardGetLocalNodeID(canard_instance); - uint8_t buffer[UAVCAN_PROTOCOL_FILE_BEGINFIRMWAREUPDATE_RESPONSE_MAX_SIZE] {}; + uint8_t buffer[UAVCAN_PROTOCOL_FILE_BEGINFIRMWAREUPDATE_RESPONSE_MAX_SIZE]; uavcan_protocol_file_BeginFirmwareUpdateResponse reply {}; reply.error = UAVCAN_PROTOCOL_FILE_BEGINFIRMWAREUPDATE_RESPONSE_ERROR_OK; @@ -753,7 +753,7 @@ void AP_Periph_FW::can_safety_button_update(void) pkt.button = ARDUPILOT_INDICATION_BUTTON_BUTTON_SAFETY; pkt.press_time = counter; - uint8_t buffer[ARDUPILOT_INDICATION_BUTTON_MAX_SIZE] {}; + uint8_t buffer[ARDUPILOT_INDICATION_BUTTON_MAX_SIZE]; uint16_t total_size = ardupilot_indication_Button_encode(&pkt, buffer, !canfdout()); canard_broadcast(ARDUPILOT_INDICATION_BUTTON_SIGNATURE, @@ -1711,7 +1711,7 @@ void AP_Periph_FW::esc_telem_update() pkt.power_rating_pct = 0; pkt.error_count = 0; - uint8_t buffer[UAVCAN_EQUIPMENT_ESC_STATUS_MAX_SIZE] {}; + uint8_t buffer[UAVCAN_EQUIPMENT_ESC_STATUS_MAX_SIZE]; uint16_t total_size = uavcan_equipment_esc_Status_encode(&pkt, buffer, !canfdout()); canard_broadcast(UAVCAN_EQUIPMENT_ESC_STATUS_SIGNATURE, UAVCAN_EQUIPMENT_ESC_STATUS_ID, @@ -1744,7 +1744,7 @@ void AP_Periph_FW::apd_esc_telem_update() pkt.power_rating_pct = t.power_rating_pct; pkt.error_count = t.error_count; - uint8_t buffer[UAVCAN_EQUIPMENT_ESC_STATUS_MAX_SIZE] {}; + uint8_t buffer[UAVCAN_EQUIPMENT_ESC_STATUS_MAX_SIZE]; uint16_t total_size = uavcan_equipment_esc_Status_encode(&pkt, buffer, !canfdout()); canard_broadcast(UAVCAN_EQUIPMENT_ESC_STATUS_SIGNATURE, UAVCAN_EQUIPMENT_ESC_STATUS_ID, @@ -1913,7 +1913,7 @@ void can_vprintf(uint8_t severity, const char *fmt, va_list ap) memcpy(pkt.text.data, &buffer_data[buffer_offset], pkt.text.len); buffer_offset += pkt.text.len; - uint8_t buffer_packet[UAVCAN_PROTOCOL_DEBUG_LOGMESSAGE_MAX_SIZE] {}; + uint8_t buffer_packet[UAVCAN_PROTOCOL_DEBUG_LOGMESSAGE_MAX_SIZE]; const uint32_t len = uavcan_protocol_debug_LogMessage_encode(&pkt, buffer_packet, !periph.canfdout()); periph.canard_broadcast(UAVCAN_PROTOCOL_DEBUG_LOGMESSAGE_SIGNATURE, @@ -1925,7 +1925,7 @@ void can_vprintf(uint8_t severity, const char *fmt, va_list ap) #else uavcan_protocol_debug_LogMessage pkt {}; - uint8_t buffer[UAVCAN_PROTOCOL_DEBUG_LOGMESSAGE_MAX_SIZE] {}; + uint8_t buffer[UAVCAN_PROTOCOL_DEBUG_LOGMESSAGE_MAX_SIZE]; uint32_t n = vsnprintf((char*)pkt.text.data, sizeof(pkt.text.data), fmt, ap); pkt.level.value = level; pkt.text.len = MIN(n, sizeof(pkt.text.data)); diff --git a/Tools/AP_Periph/compass.cpp b/Tools/AP_Periph/compass.cpp index 2c70ae1cc0..06c0aae8be 100644 --- a/Tools/AP_Periph/compass.cpp +++ b/Tools/AP_Periph/compass.cpp @@ -20,6 +20,8 @@ #define AP_PERIPH_MAG_HIRES 0 #endif +extern const AP_HAL::HAL &hal; + /* update CAN magnetometer */ @@ -68,7 +70,7 @@ void AP_Periph_FW::can_mag_update(void) pkt.magnetic_field_ga[i] = field_Ga[i]; } - uint8_t buffer[UAVCAN_EQUIPMENT_AHRS_MAGNETICFIELDSTRENGTH_MAX_SIZE] {}; + uint8_t buffer[UAVCAN_EQUIPMENT_AHRS_MAGNETICFIELDSTRENGTH_MAX_SIZE]; uint16_t total_size = uavcan_equipment_ahrs_MagneticFieldStrength_encode(&pkt, buffer, !periph.canfdout()); canard_broadcast(UAVCAN_EQUIPMENT_AHRS_MAGNETICFIELDSTRENGTH_SIGNATURE, @@ -84,7 +86,7 @@ void AP_Periph_FW::can_mag_update(void) pkt.magnetic_field_ga[i] = field_Ga[i]; } - uint8_t buffer[DRONECAN_SENSORS_MAGNETOMETER_MAGNETICFIELDSTRENGTHHIRES_MAX_SIZE] {}; + uint8_t buffer[DRONECAN_SENSORS_MAGNETOMETER_MAGNETICFIELDSTRENGTHHIRES_MAX_SIZE]; uint16_t total_size = dronecan_sensors_magnetometer_MagneticFieldStrengthHiRes_encode(&pkt, buffer, !periph.canfdout()); canard_broadcast(DRONECAN_SENSORS_MAGNETOMETER_MAGNETICFIELDSTRENGTHHIRES_SIGNATURE, diff --git a/Tools/AP_Periph/efi.cpp b/Tools/AP_Periph/efi.cpp index d1bb114cf6..84d0eb3ffb 100644 --- a/Tools/AP_Periph/efi.cpp +++ b/Tools/AP_Periph/efi.cpp @@ -193,7 +193,7 @@ void AP_Periph_FW::can_efi_update(void) c.exhaust_gas_temperature = state_c.exhaust_gas_temperature; c.lambda_coefficient = state_c.lambda_coefficient; - uint8_t buffer[UAVCAN_EQUIPMENT_ICE_RECIPROCATING_STATUS_MAX_SIZE] {}; + uint8_t buffer[UAVCAN_EQUIPMENT_ICE_RECIPROCATING_STATUS_MAX_SIZE]; const uint16_t total_size = uavcan_equipment_ice_reciprocating_Status_encode(&pkt, buffer, !canfdout()); canard_broadcast(UAVCAN_EQUIPMENT_ICE_RECIPROCATING_STATUS_SIGNATURE, diff --git a/Tools/AP_Periph/gps.cpp b/Tools/AP_Periph/gps.cpp index 87b1976eb9..3eced2d6e1 100644 --- a/Tools/AP_Periph/gps.cpp +++ b/Tools/AP_Periph/gps.cpp @@ -159,7 +159,7 @@ void AP_Periph_FW::can_gps_update(void) check_float16_range(pkt.covariance.data, pkt.covariance.len); - uint8_t buffer[UAVCAN_EQUIPMENT_GNSS_FIX2_MAX_SIZE] {}; + uint8_t buffer[UAVCAN_EQUIPMENT_GNSS_FIX2_MAX_SIZE]; uint16_t total_size = uavcan_equipment_gnss_Fix2_encode(&pkt, buffer, !canfdout()); canard_broadcast(UAVCAN_EQUIPMENT_GNSS_FIX2_SIGNATURE, @@ -177,7 +177,7 @@ void AP_Periph_FW::can_gps_update(void) aux.hdop = gps.get_hdop() * 0.01; aux.vdop = gps.get_vdop() * 0.01; - uint8_t buffer[UAVCAN_EQUIPMENT_GNSS_AUXILIARY_MAX_SIZE] {}; + uint8_t buffer[UAVCAN_EQUIPMENT_GNSS_AUXILIARY_MAX_SIZE]; uint16_t total_size = uavcan_equipment_gnss_Auxiliary_encode(&aux, buffer, !canfdout()); canard_broadcast(UAVCAN_EQUIPMENT_GNSS_AUXILIARY_SIGNATURE, UAVCAN_EQUIPMENT_GNSS_AUXILIARY_ID, @@ -204,7 +204,7 @@ void AP_Periph_FW::can_gps_update(void) status.error_codes = error_codes; } - uint8_t buffer[ARDUPILOT_GNSS_STATUS_MAX_SIZE] {}; + uint8_t buffer[ARDUPILOT_GNSS_STATUS_MAX_SIZE]; const uint16_t total_size = ardupilot_gnss_Status_encode(&status, buffer, !canfdout()); canard_broadcast(ARDUPILOT_GNSS_STATUS_SIGNATURE, ARDUPILOT_GNSS_STATUS_ID, @@ -226,7 +226,7 @@ void AP_Periph_FW::can_gps_update(void) heading.heading_accuracy_valid = is_positive(yaw_acc_deg); heading.heading_rad = radians(yaw_deg); heading.heading_accuracy_rad = radians(yaw_acc_deg); - uint8_t buffer[ARDUPILOT_GNSS_HEADING_MAX_SIZE] {}; + uint8_t buffer[ARDUPILOT_GNSS_HEADING_MAX_SIZE]; const uint16_t total_size = ardupilot_gnss_Heading_encode(&heading, buffer, !canfdout()); canard_broadcast(ARDUPILOT_GNSS_HEADING_SIGNATURE, ARDUPILOT_GNSS_HEADING_ID, @@ -271,7 +271,7 @@ void AP_Periph_FW::send_moving_baseline_msg() mbldata.data.len = n; memcpy(mbldata.data.data, data, n); - uint8_t buffer[ARDUPILOT_GNSS_MOVINGBASELINEDATA_MAX_SIZE] {}; + uint8_t buffer[ARDUPILOT_GNSS_MOVINGBASELINEDATA_MAX_SIZE]; const uint16_t total_size = ardupilot_gnss_MovingBaselineData_encode(&mbldata, buffer, !canfdout()); canard_broadcast(ARDUPILOT_GNSS_MOVINGBASELINEDATA_SIGNATURE, @@ -307,7 +307,7 @@ void AP_Periph_FW::send_relposheading_msg() { relpos.relative_down_pos_m = relative_down_pos; relpos.reported_heading_acc_deg = reported_heading_acc; relpos.reported_heading_acc_available = !is_zero(relpos.reported_heading_acc_deg); - uint8_t buffer[ARDUPILOT_GNSS_RELPOSHEADING_MAX_SIZE] {}; + uint8_t buffer[ARDUPILOT_GNSS_RELPOSHEADING_MAX_SIZE]; const uint16_t total_size = ardupilot_gnss_RelPosHeading_encode(&relpos, buffer, !canfdout()); canard_broadcast(ARDUPILOT_GNSS_RELPOSHEADING_SIGNATURE, ARDUPILOT_GNSS_RELPOSHEADING_ID, diff --git a/Tools/AP_Periph/hardpoint.cpp b/Tools/AP_Periph/hardpoint.cpp index c60d64ca81..59279825b2 100644 --- a/Tools/AP_Periph/hardpoint.cpp +++ b/Tools/AP_Periph/hardpoint.cpp @@ -53,7 +53,7 @@ void AP_Periph_FW::pwm_hardpoint_update() cmd.hardpoint_id = g.hardpoint_id; cmd.command = value; - uint8_t buffer[UAVCAN_EQUIPMENT_HARDPOINT_COMMAND_MAX_SIZE] {}; + uint8_t buffer[UAVCAN_EQUIPMENT_HARDPOINT_COMMAND_MAX_SIZE]; uint16_t total_size = uavcan_equipment_hardpoint_Command_encode(&cmd, buffer, !canfdout()); canard_broadcast(UAVCAN_EQUIPMENT_HARDPOINT_COMMAND_SIGNATURE, UAVCAN_EQUIPMENT_HARDPOINT_COMMAND_ID, diff --git a/Tools/AP_Periph/hwing_esc.cpp b/Tools/AP_Periph/hwing_esc.cpp index a1e2d4a472..6ffb36f4eb 100644 --- a/Tools/AP_Periph/hwing_esc.cpp +++ b/Tools/AP_Periph/hwing_esc.cpp @@ -164,7 +164,7 @@ void AP_Periph_FW::hwesc_telem_update() pkt.power_rating_pct = t.phase_current; pkt.error_count = t.error_count; - uint8_t buffer[UAVCAN_EQUIPMENT_ESC_STATUS_MAX_SIZE] {}; + uint8_t buffer[UAVCAN_EQUIPMENT_ESC_STATUS_MAX_SIZE]; uint16_t total_size = uavcan_equipment_esc_Status_encode(&pkt, buffer, !canfdout()); canard_broadcast(UAVCAN_EQUIPMENT_ESC_STATUS_SIGNATURE, UAVCAN_EQUIPMENT_ESC_STATUS_ID, diff --git a/Tools/AP_Periph/proximity.cpp b/Tools/AP_Periph/proximity.cpp index 2c88d3fc0f..d0a3267e1d 100644 --- a/Tools/AP_Periph/proximity.cpp +++ b/Tools/AP_Periph/proximity.cpp @@ -60,7 +60,7 @@ void AP_Periph_FW::can_proximity_update() break; } - uint8_t buffer[ARDUPILOT_EQUIPMENT_PROXIMITY_SENSOR_PROXIMITY_MAX_SIZE] {}; + uint8_t buffer[ARDUPILOT_EQUIPMENT_PROXIMITY_SENSOR_PROXIMITY_MAX_SIZE]; uint16_t total_size = ardupilot_equipment_proximity_sensor_Proximity_encode(&pkt, buffer, !periph.canfdout()); canard_broadcast(ARDUPILOT_EQUIPMENT_PROXIMITY_SENSOR_PROXIMITY_SIGNATURE, diff --git a/Tools/AP_Periph/rangefinder.cpp b/Tools/AP_Periph/rangefinder.cpp index 981f4dca47..5ea1753ff9 100644 --- a/Tools/AP_Periph/rangefinder.cpp +++ b/Tools/AP_Periph/rangefinder.cpp @@ -106,7 +106,7 @@ void AP_Periph_FW::can_rangefinder_update(void) float dist_m = backend->distance(); pkt.range = dist_m; - uint8_t buffer[UAVCAN_EQUIPMENT_RANGE_SENSOR_MEASUREMENT_MAX_SIZE] {}; + uint8_t buffer[UAVCAN_EQUIPMENT_RANGE_SENSOR_MEASUREMENT_MAX_SIZE]; uint16_t total_size = uavcan_equipment_range_sensor_Measurement_encode(&pkt, buffer, !periph.canfdout()); canard_broadcast(UAVCAN_EQUIPMENT_RANGE_SENSOR_MEASUREMENT_SIGNATURE, diff --git a/Tools/AP_Periph/rc_in.cpp b/Tools/AP_Periph/rc_in.cpp index 63a584d684..c4fd8dcbd6 100644 --- a/Tools/AP_Periph/rc_in.cpp +++ b/Tools/AP_Periph/rc_in.cpp @@ -165,7 +165,7 @@ void AP_Periph_FW::can_send_RCInput(uint8_t quality, uint16_t *values, uint8_t n } // encode and send message: - uint8_t buffer[DRONECAN_SENSORS_RC_RCINPUT_MAX_SIZE] {}; + uint8_t buffer[DRONECAN_SENSORS_RC_RCINPUT_MAX_SIZE]; uint16_t total_size = dronecan_sensors_rc_RCInput_encode(&pkt, buffer, !periph.canfdout()); diff --git a/Tools/AP_Periph/rc_out.cpp b/Tools/AP_Periph/rc_out.cpp index 93614c1352..4b9f5e97d6 100644 --- a/Tools/AP_Periph/rc_out.cpp +++ b/Tools/AP_Periph/rc_out.cpp @@ -63,6 +63,13 @@ void AP_Periph_FW::rcout_init() // run this once and at 1Hz to configure aux and esc ranges rcout_init_1Hz(); +#if HAL_DSHOT_ENABLED + hal.rcout->set_dshot_esc_type(SRV_Channels::get_dshot_esc_type()); +#endif + + // run PWM ESCs at configured rate + hal.rcout->set_freq(esc_mask, g.esc_rate.get()); + // setup ESCs with the desired PWM type, allowing for DShot SRV_Channels::init(esc_mask, (AP_HAL::RCOutput::output_mode)g.esc_pwm_type.get()); diff --git a/Tools/AP_Periph/rpm.cpp b/Tools/AP_Periph/rpm.cpp index 5a39866013..b017fb0415 100644 --- a/Tools/AP_Periph/rpm.cpp +++ b/Tools/AP_Periph/rpm.cpp @@ -37,7 +37,7 @@ void AP_Periph_FW::rpm_sensor_send(void) pkt.flags |= DRONECAN_SENSORS_RPM_RPM_FLAGS_UNHEALTHY; } - uint8_t buffer[DRONECAN_SENSORS_RPM_RPM_MAX_SIZE] {}; + uint8_t buffer[DRONECAN_SENSORS_RPM_RPM_MAX_SIZE]; const uint16_t total_size = dronecan_sensors_rpm_RPM_encode(&pkt, buffer, !canfdout()); canard_broadcast(DRONECAN_SENSORS_RPM_RPM_SIGNATURE, diff --git a/Tools/AP_Periph/serial_tunnel.cpp b/Tools/AP_Periph/serial_tunnel.cpp index 758f51ca51..a4e13d9ab9 100644 --- a/Tools/AP_Periph/serial_tunnel.cpp +++ b/Tools/AP_Periph/serial_tunnel.cpp @@ -196,7 +196,7 @@ void AP_Periph_FW::send_serial_monitor_data() pkt.serial_id = uart_monitor.uart_num; memcpy(pkt.buffer.data, buf, n); - uint8_t buffer[UAVCAN_TUNNEL_TARGETTED_MAX_SIZE] {}; + uint8_t buffer[UAVCAN_TUNNEL_TARGETTED_MAX_SIZE]; const uint16_t total_size = uavcan_tunnel_Targetted_encode(&pkt, buffer, !canfdout()); debug("read %u", unsigned(n)); diff --git a/Tools/AP_Periph/temperature.cpp b/Tools/AP_Periph/temperature.cpp index 3377e2b635..b7003b022d 100644 --- a/Tools/AP_Periph/temperature.cpp +++ b/Tools/AP_Periph/temperature.cpp @@ -36,7 +36,7 @@ void AP_Periph_FW::temperature_sensor_update(void) // Use source ID from temperature lib pkt.device_id = temperature_sensor.get_source_id(index); - uint8_t buffer[UAVCAN_EQUIPMENT_DEVICE_TEMPERATURE_MAX_SIZE] {}; + uint8_t buffer[UAVCAN_EQUIPMENT_DEVICE_TEMPERATURE_MAX_SIZE]; const uint16_t total_size = uavcan_equipment_device_Temperature_encode(&pkt, buffer, !canfdout()); canard_broadcast(UAVCAN_EQUIPMENT_DEVICE_TEMPERATURE_SIGNATURE, diff --git a/Tools/Frame_params/ModalAI/AutonomyDevKit.parm b/Tools/Frame_params/ModalAI/AutonomyDevKit.parm new file mode 100644 index 0000000000..ad2982829b --- /dev/null +++ b/Tools/Frame_params/ModalAI/AutonomyDevKit.parm @@ -0,0 +1,95 @@ +# parameters for the autonomy dev kit +# https://www.modalai.com/products/px4-autonomy-developer-kit + +# flight modes +FLTMODE1 5 +FLTMODE4 2 +FLTMODE_CH 6 + +# motor ordering +SERVO1_FUNCTION 34 +SERVO2_FUNCTION 35 +SERVO3_FUNCTION 33 +SERVO4_FUNCTION 36 + +# enable PID logging +LOG_BITMASK 65535 + +# mag field varies quite a lot between batteries +ARMING_MAGTHRESH 200 + +# IMU orientation +AHRS_ORIENTATION 8 + +# compass orientation +COMPASS_ORIENT 8 + +# filtering +INS_GYRO_FILTER 40 +INS_HNTCH_ENABLE 1 +INS_HNTCH_FREQ 100 +INS_HNTCH_BW 50 +INS_HNTCH_HMNCS 7 +INS_HNTCH_REF 1 +INS_HNTCH_MODE 3 +INS_HNTCH_OPTS 2 + +# run IMU at 2kHz +INS_GYRO_RATE 1 + +# a bit more agressive loiter +PILOT_SPEED_UP 500 +LOIT_BRK_ACCEL 500 +LOIT_BRK_JERK 1000 +LOIT_BRK_DELAY 0.200000 + +# tuning from autotune +ATC_ACCEL_Y_MAX 46813.816406 +ATC_ACCEL_R_MAX 218565.890625 +ATC_ACCEL_P_MAX 220962 +ATC_ANG_RLL_P 15.120497 +ATC_ANG_PIT_P 15.393054 +ATC_ANG_YAW_P 7.636879 +ATC_RAT_RLL_P 0.038459 +ATC_RAT_RLL_I 0.038459 +ATC_RAT_RLL_D 0.000927 +ATC_RAT_PIT_P 0.043496 +ATC_RAT_PIT_I 0.043496 +ATC_RAT_PIT_D 0.000934 +ATC_RAT_YAW_P 0.376548 +ATC_RAT_YAW_I 0.037655 +ATC_RAT_YAW_FLTE 2.090602 + +# battery setup +BATT_LOW_VOLT 7 +BATT_OPTIONS 64 +BATT_VOLT_PIN 1 +BATT_CURR_PIN 2 +BATT_VOLT_MULT 1 +BATT_AMP_PERVLT 1 +# on the test board we have a current offset of -16.8A +# we need to check if this applies to all versions of this vehicle +BATT_AMP_OFFSET -16.8 + +# 2S battery range +MOT_BAT_VOLT_MAX 8.400000 +MOT_BAT_VOLT_MIN 6.600000 + +# quad-X +FRAME_CLASS 1 + +# tweak R/C inputs +RC1_MIN 1000 +RC1_MAX 2000 +RC1_DZ 40 +RC2_MIN 1000 +RC2_MAX 2000 +RC2_REVERSED 1 +RC3_MIN 1000 +RC3_MAX 2000 +RC4_MIN 1000 +RC4_MAX 2000 +RC4_DZ 40 + +# add arming on right switch +RC7_OPTION 153 diff --git a/Tools/Frame_params/ModalAI/D0013.parm b/Tools/Frame_params/ModalAI/D0013.parm new file mode 100644 index 0000000000..1d3fcf6513 --- /dev/null +++ b/Tools/Frame_params/ModalAI/D0013.parm @@ -0,0 +1,109 @@ +# parameters for the Stinger drone + +# flight modes +FLTMODE1 5 +FLTMODE4 2 +FLTMODE_CH 6 + +# enable PID logging +LOG_BITMASK 65535 + +# mag field varies quite a lot between batteries +ARMING_MAGTHRESH 200 + +# IMU orientation +# 4 = YAW 180 +AHRS_ORIENTATION 4 + +# Forced external compass +COMPASS_EXTERNAL 2 +# compass orientation +# 2 = YAW 90 +COMPASS_ORIENT 8 + +# filtering +INS_GYRO_FILTER 40 +INS_HNTCH_ENABLE 1 +INS_HNTCH_ATT 40.0 +INS_HNTCH_BW 50.0 +INS_HNTCH_FM_RAT 1.0 +INS_HNTCH_FREQ 100.0 +INS_HNTCH_HMNCS 7 +INS_HNTCH_MODE 3 +INS_HNTCH_OPTS 2 +INS_HNTCH_REF 1.0 + +# run IMU at 2kHz +INS_GYRO_RATE 1 + +# a bit more agressive loiter +PILOT_SPEED_UP 500 +LOIT_BRK_ACCEL 500 +LOIT_BRK_JERK 1000 +LOIT_BRK_DELAY 0.200000 + +# Tune parameters from Quik Tune +ATC_ACCEL_Y_MAX 30000.0 +ATC_ACCEL_R_MAX 125000.0 +ATC_ACCEL_P_MAX 125000.0 +ATC_RAT_PIT_D 0.002856164472177625 +ATC_RAT_PIT_FLTD 40.0 +ATC_RAT_PIT_FLTT 40.0 +ATC_RAT_PIT_I 0.124929137527942657 +ATC_RAT_PIT_P 0.124929137527942657 +ATC_RAT_PIT_SMAX 50.0 +ATC_RAT_RLL_D 0.001519999350421131 +ATC_RAT_RLL_FLTD 40.0 +ATC_RAT_RLL_FLTT 40.0 +ATC_RAT_RLL_I 0.075611755251884460 +ATC_RAT_RLL_P 0.075611755251884460 +ATC_RAT_RLL_SMAX 50.0 +ATC_RAT_YAW_D 0.010000008158385754 +ATC_RAT_YAW_FLTD 40.0 +ATC_RAT_YAW_FLTE 2.0 +ATC_RAT_YAW_FLTT 40.0 +ATC_RAT_YAW_I 0.050000030547380447 +ATC_RAT_YAW_P 0.500000298023223877 +ATC_RAT_YAW_SMAX 50.0 + +# battery setup +BATT_LOW_VOLT 14.2 +BATT_OPTIONS 64 +BATT_VOLT_PIN 1 +BATT_CURR_PIN 2 +BATT_VOLT_MULT 1 +BATT_AMP_PERVLT 1 +BATT_AMP_OFFSET 0.0 + +# 4S battery range +MOT_BAT_VOLT_MAX 16.800000 +MOT_BAT_VOLT_MIN 13.200000 + +# Learned hover thrust +MOT_THST_EXPO 0.550000011920928955 +MOT_THST_HOVER 0.130549192428588867 + +# quad-X +FRAME_CLASS 1 + +# tweak R/C inputs +RC1_MIN 1000 +RC1_MAX 2000 +RC1_DZ 40 +RC2_MIN 1000 +RC2_MAX 2000 +RC2_REVERSED 1 +RC3_MIN 1000 +RC3_MAX 2000 +RC4_MIN 1000 +RC4_MAX 2000 +RC4_DZ 40 + +# add arming on right switch +RC7_OPTION 153 + +# Motor mappings +SERVO1_FUNCTION 33 +SERVO2_FUNCTION 36 +SERVO3_FUNCTION 34 +SERVO4_FUNCTION 35 diff --git a/Tools/GIT_Test/GIT_Success.txt b/Tools/GIT_Test/GIT_Success.txt index 18f2ad8269..91e375800d 100644 --- a/Tools/GIT_Test/GIT_Success.txt +++ b/Tools/GIT_Test/GIT_Success.txt @@ -184,3 +184,18 @@ FreeName Anchit maggie Abdullah Saleem +Hiroshi Kaneda +Abe Takuya +Masahiro Suzuki +Hideyuki Fujikawa +Ryoga Kamimura +HIROSHI Suto +Yasuhiro Setoguchi +Shinji Ichimura +masahiko Ito +Kei Kabutomori +Hiroaki Kawasaki +Kazuhide Juta +Ryoichi Shiohama +Masaki Shibuya +Aryan Roshan trying his first commit \ No newline at end of file diff --git a/Tools/Replay/Replay.cpp b/Tools/Replay/Replay.cpp index 2166885e4d..d705933b70 100644 --- a/Tools/Replay/Replay.cpp +++ b/Tools/Replay/Replay.cpp @@ -297,14 +297,15 @@ bool Replay::parse_param_line(char *line, char **vname, float &value) */ void Replay::load_param_file(const char *pfilename) { - FILE *f = fopen(pfilename, "r"); - if (f == NULL) { + auto &fs = AP::FS(); + int fd = fs.open(pfilename, O_RDONLY, true); + if (fd == -1) { printf("Failed to open parameter file: %s\n", pfilename); exit(1); } char line[100]; - while (fgets(line, sizeof(line)-1, f)) { + while (fs.fgets(line, sizeof(line)-1, fd)) { char *pname; float value; if (!parse_param_line(line, &pname, value)) { @@ -316,7 +317,7 @@ void Replay::load_param_file(const char *pfilename) u->next = user_parameters; user_parameters = u; } - fclose(f); + fs.close(fd); } Replay replay(replayvehicle); diff --git a/Tools/ardupilotwaf/ardupilotwaf.py b/Tools/ardupilotwaf/ardupilotwaf.py index 1f5a628ff5..7234625594 100644 --- a/Tools/ardupilotwaf/ardupilotwaf.py +++ b/Tools/ardupilotwaf/ardupilotwaf.py @@ -17,6 +17,13 @@ SOURCE_EXTS = [ '*.cpp', ] +COMMON_VEHICLE_DEPENDENT_CAN_LIBRARIES = [ + 'AP_CANManager', + 'AP_KDECAN', + 'AP_PiccoloCAN', + 'AP_PiccoloCAN/piccolo_protocol', +] + COMMON_VEHICLE_DEPENDENT_LIBRARIES = [ 'AP_Airspeed', 'AP_AccelCal', @@ -27,7 +34,6 @@ COMMON_VEHICLE_DEPENDENT_LIBRARIES = [ 'AP_BattMonitor', 'AP_BoardConfig', 'AP_Camera', - 'AP_CANManager', 'AP_Common', 'AP_Compass', 'AP_Declination', @@ -35,7 +41,6 @@ COMMON_VEHICLE_DEPENDENT_LIBRARIES = [ 'AP_HAL', 'AP_HAL_Empty', 'AP_InertialSensor', - 'AP_KDECAN', 'AP_Math', 'AP_Mission', 'AP_DAL', @@ -67,6 +72,7 @@ COMMON_VEHICLE_DEPENDENT_LIBRARIES = [ 'AP_ICEngine', 'AP_Networking', 'AP_Frsky_Telem', + 'AP_IBus_Telem', 'AP_FlashStorage', 'AP_Relay', 'AP_ServoRelayEvents', @@ -74,8 +80,6 @@ COMMON_VEHICLE_DEPENDENT_LIBRARIES = [ 'AP_SBusOut', 'AP_IOMCU', 'AP_Parachute', - 'AP_PiccoloCAN', - 'AP_PiccoloCAN/piccolo_protocol', 'AP_RAMTRON', 'AP_RCProtocol', 'AP_Radio', @@ -249,11 +253,8 @@ def ap_get_all_libraries(bld): def ap_common_vehicle_libraries(bld): libraries = COMMON_VEHICLE_DEPENDENT_LIBRARIES - if bld.env.DEST_BINFMT == 'pe': - libraries += [ - 'AC_Fence', - 'AC_AttitudeControl', - ] + if bld.env.with_can or bld.env.HAL_NUM_CAN_IFACES: + libraries.extend(COMMON_VEHICLE_DEPENDENT_CAN_LIBRARIES) return libraries diff --git a/Tools/ardupilotwaf/boards.py b/Tools/ardupilotwaf/boards.py index c8d1bbbc42..65452f8d08 100644 --- a/Tools/ardupilotwaf/boards.py +++ b/Tools/ardupilotwaf/boards.py @@ -43,7 +43,10 @@ class Board: def configure(self, cfg): cfg.env.TOOLCHAIN = cfg.options.toolchain or self.toolchain cfg.env.ROMFS_FILES = [] - cfg.load('toolchain') + if hasattr(self,'configure_toolchain'): + self.configure_toolchain(cfg) + else: + cfg.load('toolchain') cfg.load('cxx_checks') # don't check elf symbols by default @@ -198,6 +201,8 @@ class Board: cfg.msg("Configured VSCode Intellisense:", 'no', color='YELLOW') def cc_version_gte(self, cfg, want_major, want_minor): + if cfg.env.TOOLCHAIN == "custom": + return True (major, minor, patchlevel) = cfg.env.CC_VERSION return (int(major) > want_major or (int(major) == want_major and int(minor) >= want_minor)) @@ -207,6 +212,8 @@ class Board: # make easy to override them. Convert back to list before consumption. env.DEFINES = {} + env.with_can = self.with_can + # potentially set extra defines from an environment variable: if cfg.options.define is not None: for (n, v) in [d.split("=") for d in cfg.options.define]: @@ -611,8 +618,12 @@ def get_ap_periph_boards(): hwdef = os.path.join(dirname, d, 'hwdef.dat') if os.path.exists(hwdef): ch = chibios_hwdef.ChibiOSHWDef(hwdef=[hwdef], quiet=True) - if ch.is_periph_fw_unprocessed(): - list_ap.append(d) + try: + if ch.is_periph_fw_unprocessed(): + list_ap.append(d) + except chibios_hwdef.ChibiOSHWDefIncludeNotFoundException as e: + print(f"{e.includer} includes {e.hwdef} which does not exist") + sys.exit(1) list_ap = list(set(list_ap)) return list_ap @@ -753,8 +764,10 @@ class sitl(Board): ] # wrap malloc to ensure memory is zeroed - # don't do this on MacOS as ld doesn't support --wrap - if platform.system() != 'Darwin': + if cfg.env.DEST_OS == 'cygwin': + # on cygwin we need to wrap _malloc_r instead + env.LINKFLAGS += ['-Wl,--wrap,_malloc_r'] + elif platform.system() != 'Darwin': env.LINKFLAGS += ['-Wl,--wrap,malloc'] if cfg.options.enable_sfml: @@ -981,7 +994,6 @@ class esp32(Board): # this makes sure we get the correct subtype env.DEFINES.update( - ENABLE_HEAP = 0, CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_ESP32_%s' % tt.upper() , HAL_HAVE_HARDWARE_DOUBLE = '1', ) @@ -1019,8 +1031,7 @@ class esp32(Board): '-fno-inline-functions', '-mlongcalls', '-fsingle-precision-constant', # force const vals to be float , not double. so 100.0 means 100.0f - '-fno-threadsafe-statics', - '-DCYGWIN_BUILD'] + '-fno-threadsafe-statics'] env.CXXFLAGS.remove('-Werror=undef') env.CXXFLAGS.remove('-Werror=shadow') @@ -1646,3 +1657,99 @@ class SITL_x86_64_linux_gnu(SITL_static): class SITL_arm_linux_gnueabihf(SITL_static): toolchain = 'arm-linux-gnueabihf' + +class QURT(Board): + '''support for QURT based boards''' + toolchain = 'custom' + + def __init__(self): + self.with_can = False + + def configure_toolchain(self, cfg): + cfg.env.CXX_NAME = 'gcc' + cfg.env.HEXAGON_SDK_DIR = "/opt/hexagon-sdk/4.1.0.4-lite" + cfg.env.CC_VERSION = ('4','1','0') + cfg.env.TOOLCHAIN_DIR = cfg.env.HEXAGON_SDK_DIR + "/tools/HEXAGON_Tools/8.4.05/Tools" + cfg.env.COMPILER_CC = cfg.env.TOOLCHAIN_DIR + "/bin/hexagon-clang" + cfg.env.COMPILER_CXX = cfg.env.TOOLCHAIN_DIR + "/bin/hexagon-clang++" + cfg.env.LINK_CXX = cfg.env.HEXAGON_SDK_DIR + "/tools/HEXAGON_Tools/8.4.05/Tools/bin/hexagon-link" + cfg.env.CXX = ["ccache", cfg.env.COMPILER_CXX] + cfg.env.CC = ["ccache", cfg.env.COMPILER_CC] + cfg.env.CXX_TGT_F = ['-c', '-o'] + cfg.env.CC_TGT_F = ['-c', '-o'] + cfg.env.CCLNK_SRC_F = [] + cfg.env.CXXLNK_SRC_F = [] + cfg.env.CXXLNK_TGT_F = ['-o'] + cfg.env.CCLNK_TGT_F = ['-o'] + cfg.env.CPPPATH_ST = '-I%s' + cfg.env.DEFINES_ST = '-D%s' + cfg.env.AR = cfg.env.HEXAGON_SDK_DIR + "/tools/HEXAGON_Tools/8.4.05/Tools/bin/hexagon-ar" + cfg.env.ARFLAGS = 'rcs' + cfg.env.cxxstlib_PATTERN = 'lib%s.a' + cfg.env.cstlib_PATTERN = 'lib%s.a' + cfg.env.LIBPATH_ST = '-L%s' + cfg.env.LIB_ST = '-l%s' + cfg.env.SHLIB_MARKER = '' + cfg.env.STLIBPATH_ST = '-L%s' + cfg.env.STLIB_MARKER = '' + cfg.env.STLIB_ST = '-l%s' + cfg.env.LDFLAGS = [ + '-lgcc', + cfg.env.TOOLCHAIN_DIR + '/target/hexagon/lib/v66/G0/pic/finiS.o' + ] + + def configure_env(self, cfg, env): + super(QURT, self).configure_env(cfg, env) + + env.BOARD_CLASS = "QURT" + env.HEXAGON_APP = "libardupilot.so" + env.INCLUDES += [cfg.env.HEXAGON_SDK_DIR + "/rtos/qurt/computev66/include/qurt"] + env.INCLUDES += [cfg.env.HEXAGON_SDK_DIR + "/rtos/qurt/computev66/include/posix"] + + CFLAGS = "-MD -mv66 -fPIC -mcpu=hexagonv66 -G0 -fdata-sections -ffunction-sections -fomit-frame-pointer -fmerge-all-constants -fno-signed-zeros -fno-trapping-math -freciprocal-math -fno-math-errno -fno-strict-aliasing -fvisibility=hidden -fno-rtti -fmath-errno" + env.CXXFLAGS += CFLAGS.split() + env.CFLAGS += CFLAGS.split() + + env.DEFINES.update( + CONFIG_HAL_BOARD = 'HAL_BOARD_QURT', + CONFIG_HAL_BOARD_SUBTYPE = 'HAL_BOARD_SUBTYPE_NONE', + AP_SIM_ENABLED = 0, + ) + + env.LINKFLAGS = [ + "-march=hexagon", + "-mcpu=hexagonv66", + "-shared", + "-call_shared", + "-G0", + cfg.env.TOOLCHAIN_DIR + "/target/hexagon/lib/v66/G0/pic/initS.o", + f"-L{cfg.env.TOOLCHAIN_DIR}/target/hexagon/lib/v66/G0/pic", + "-Bsymbolic", + cfg.env.TOOLCHAIN_DIR + "/target/hexagon/lib/v66/G0/pic/libgcc.a", + "--wrap=malloc", + "--wrap=calloc", + "--wrap=free", + "--wrap=realloc", + "--wrap=printf", + "--wrap=strdup", + "--wrap=__stack_chk_fail", + "-lc" + ] + + if not cfg.env.DEBUG: + env.CXXFLAGS += [ + '-O3', + ] + + env.AP_LIBRARIES += [ + 'AP_HAL_QURT', + ] + + def build(self, bld): + super(QURT, self).build(bld) + bld.load('qurt') + + def get_name(self): + # get name of class + return self.__class__.__name__ + diff --git a/Tools/ardupilotwaf/qurt.py b/Tools/ardupilotwaf/qurt.py new file mode 100644 index 0000000000..51a556c094 --- /dev/null +++ b/Tools/ardupilotwaf/qurt.py @@ -0,0 +1,35 @@ +# encoding: utf-8 + +""" +Waf tool for QURT build +""" + +def build(bld): + AARCH64_SDK_DIR = "/opt/aarch64-sdk/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu" + AARCH64_CC = AARCH64_SDK_DIR + "/bin/aarch64-linux-gnu-gcc" + AARCH64_CXX = AARCH64_SDK_DIR + "/bin/aarch64-linux-gnu-g++" + + STUB_C = bld.srcnode.make_node('libraries/AP_HAL_QURT/ap_host/libslpi-link-api/src/slpi_link_stub.c') + STUB_INC = bld.srcnode.make_node('libraries/AP_HAL_QURT/ap_host/libslpi-link-api/inc') + STUB_SO = bld.bldnode.find_or_declare('slpi_link_stub.so') + MAIN_CPP = bld.srcnode.make_node('libraries/AP_HAL_QURT/ap_host/src/main.cpp') + IFADDR_CPP = bld.srcnode.make_node('libraries/AP_HAL_QURT/ap_host/src/getifaddrs.cpp') + AP_HOST = bld.bldnode.find_or_declare('ardupilot') + + bld( + # build slpi stub library + source=[STUB_C], + rule="%s -fPIC -o %s -shared -Wl,-soname,libslpi_link.so %s" % (AARCH64_CC, STUB_SO.abspath(), STUB_C.abspath()), + target=[STUB_SO], + group='dynamic_sources' + ) + + bld( + # build ap_host + source=[STUB_SO, MAIN_CPP], + rule="%s -I%s %s %s %s -lpthread -o %s" % (AARCH64_CXX, STUB_INC.abspath(), + MAIN_CPP.abspath(), IFADDR_CPP.abspath(), STUB_SO.abspath(), AP_HOST.abspath()), + target=[AP_HOST], + group='dynamic_sources' + ) + diff --git a/Tools/ardupilotwaf/toolchain.py b/Tools/ardupilotwaf/toolchain.py index a01bbedc04..1be9b96821 100644 --- a/Tools/ardupilotwaf/toolchain.py +++ b/Tools/ardupilotwaf/toolchain.py @@ -133,6 +133,8 @@ def configure(cfg): _filter_supported_cxx_compilers('g++', 'clang++') cfg.msg('Using toolchain', cfg.env.TOOLCHAIN) + if cfg.env.TOOLCHAIN == "custom": + return if cfg.env.TOOLCHAIN == 'native': cfg.load('compiler_cxx compiler_c') diff --git a/Tools/autotest/ArduPlane_Tests/TakeoffAuto1/catapult.txt b/Tools/autotest/ArduPlane_Tests/TakeoffAuto1/catapult.txt new file mode 100644 index 0000000000..0aa9cd624d --- /dev/null +++ b/Tools/autotest/ArduPlane_Tests/TakeoffAuto1/catapult.txt @@ -0,0 +1,13 @@ +QGC WPL 110 +0 0 0 16 0.000000 0.000000 0.000000 0.000000 -35.363262 149.165237 584.390015 1 +1 0 3 22 15.000000 0.000000 0.000000 0.000000 -35.361279 149.164230 100.000000 1 +2 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.361229 149.163025 100.000000 1 +3 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.364563 149.163773 100.000000 1 +4 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.364384 149.164795 80.000000 1 +5 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.361027 149.164093 80.000000 1 +6 0 0 177 2.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1 +7 0 3 189 0.000000 0.000000 0.000000 0.000000 -35.362915 149.162613 60.000000 1 +8 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.363136 149.162750 60.000000 1 +9 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.365467 149.164215 55.000000 1 +10 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.365009 149.165482 39.889999 1 +11 0 3 21 0.000000 0.000000 0.000000 1.000000 -35.363041 149.165222 0.000000 1 diff --git a/Tools/autotest/ArduPlane_Tests/TakeoffAuto2/catapult.txt b/Tools/autotest/ArduPlane_Tests/TakeoffAuto2/catapult.txt new file mode 100644 index 0000000000..0aa9cd624d --- /dev/null +++ b/Tools/autotest/ArduPlane_Tests/TakeoffAuto2/catapult.txt @@ -0,0 +1,13 @@ +QGC WPL 110 +0 0 0 16 0.000000 0.000000 0.000000 0.000000 -35.363262 149.165237 584.390015 1 +1 0 3 22 15.000000 0.000000 0.000000 0.000000 -35.361279 149.164230 100.000000 1 +2 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.361229 149.163025 100.000000 1 +3 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.364563 149.163773 100.000000 1 +4 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.364384 149.164795 80.000000 1 +5 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.361027 149.164093 80.000000 1 +6 0 0 177 2.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1 +7 0 3 189 0.000000 0.000000 0.000000 0.000000 -35.362915 149.162613 60.000000 1 +8 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.363136 149.162750 60.000000 1 +9 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.365467 149.164215 55.000000 1 +10 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.365009 149.165482 39.889999 1 +11 0 3 21 0.000000 0.000000 0.000000 1.000000 -35.363041 149.165222 0.000000 1 diff --git a/Tools/autotest/ArduPlane_Tests/TakeoffAuto3/catapult.txt b/Tools/autotest/ArduPlane_Tests/TakeoffAuto3/catapult.txt new file mode 100644 index 0000000000..0aa9cd624d --- /dev/null +++ b/Tools/autotest/ArduPlane_Tests/TakeoffAuto3/catapult.txt @@ -0,0 +1,13 @@ +QGC WPL 110 +0 0 0 16 0.000000 0.000000 0.000000 0.000000 -35.363262 149.165237 584.390015 1 +1 0 3 22 15.000000 0.000000 0.000000 0.000000 -35.361279 149.164230 100.000000 1 +2 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.361229 149.163025 100.000000 1 +3 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.364563 149.163773 100.000000 1 +4 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.364384 149.164795 80.000000 1 +5 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.361027 149.164093 80.000000 1 +6 0 0 177 2.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1 +7 0 3 189 0.000000 0.000000 0.000000 0.000000 -35.362915 149.162613 60.000000 1 +8 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.363136 149.162750 60.000000 1 +9 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.365467 149.164215 55.000000 1 +10 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.365009 149.165482 39.889999 1 +11 0 3 21 0.000000 0.000000 0.000000 1.000000 -35.363041 149.165222 0.000000 1 diff --git a/Tools/autotest/ArduPlane_Tests/TakeoffAuto4/catapult.txt b/Tools/autotest/ArduPlane_Tests/TakeoffAuto4/catapult.txt new file mode 100644 index 0000000000..0aa9cd624d --- /dev/null +++ b/Tools/autotest/ArduPlane_Tests/TakeoffAuto4/catapult.txt @@ -0,0 +1,13 @@ +QGC WPL 110 +0 0 0 16 0.000000 0.000000 0.000000 0.000000 -35.363262 149.165237 584.390015 1 +1 0 3 22 15.000000 0.000000 0.000000 0.000000 -35.361279 149.164230 100.000000 1 +2 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.361229 149.163025 100.000000 1 +3 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.364563 149.163773 100.000000 1 +4 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.364384 149.164795 80.000000 1 +5 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.361027 149.164093 80.000000 1 +6 0 0 177 2.000000 1.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1 +7 0 3 189 0.000000 0.000000 0.000000 0.000000 -35.362915 149.162613 60.000000 1 +8 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.363136 149.162750 60.000000 1 +9 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.365467 149.164215 55.000000 1 +10 0 3 16 0.000000 0.000000 0.000000 0.000000 -35.365009 149.165482 39.889999 1 +11 0 3 21 0.000000 0.000000 0.000000 1.000000 -35.363041 149.165222 0.000000 1 diff --git a/Tools/autotest/ArduRover_Tests/DriveMission/rover1.txt b/Tools/autotest/ArduRover_Tests/DriveMission/rover1.txt index 8d14fa00ea..f9fefd71f5 100644 --- a/Tools/autotest/ArduRover_Tests/DriveMission/rover1.txt +++ b/Tools/autotest/ArduRover_Tests/DriveMission/rover1.txt @@ -18,4 +18,5 @@ QGC WPL 110 16 0 3 16 0.000000 0.000000 0.000000 0.000000 40.071133 -105.229233 11085.900391 1 17 0 3 16 0.000000 0.000000 0.000000 0.000000 40.071255 -105.229355 11085.900391 1 18 0 3 16 0.000000 0.000000 0.000000 0.000000 40.071404 -105.229485 9502.200195 1 -19 0 3 16 0.000000 0.000000 0.000000 0.000000 40.071369 -105.229828 9502.200195 1 +19 0 3 18 1.000000 0.000000 20.000000 0.000000 40.071105 -105.229625 0.000000 1 +20 0 3 16 0.000000 0.000000 0.000000 0.000000 40.071369 -105.229828 9502.200195 1 \ No newline at end of file diff --git a/Tools/autotest/ArduRover_Tests/PolyFenceObjectAvoidance/rover-path-planning-fence.txt b/Tools/autotest/ArduRover_Tests/PolyFenceObjectAvoidanceAuto/rover-path-planning-fence.txt similarity index 100% rename from Tools/autotest/ArduRover_Tests/PolyFenceObjectAvoidance/rover-path-planning-fence.txt rename to Tools/autotest/ArduRover_Tests/PolyFenceObjectAvoidanceAuto/rover-path-planning-fence.txt diff --git a/Tools/autotest/ArduRover_Tests/PolyFenceObjectAvoidance/rover-path-planning-mission.txt b/Tools/autotest/ArduRover_Tests/PolyFenceObjectAvoidanceAuto/rover-path-planning-mission.txt similarity index 100% rename from Tools/autotest/ArduRover_Tests/PolyFenceObjectAvoidance/rover-path-planning-mission.txt rename to Tools/autotest/ArduRover_Tests/PolyFenceObjectAvoidanceAuto/rover-path-planning-mission.txt diff --git a/Tools/autotest/ArduRover_Tests/PolyFenceObjectAvoidanceBendyRulerEasier/rover-path-bendyruler-fence.txt b/Tools/autotest/ArduRover_Tests/PolyFenceObjectAvoidanceBendyRulerEasierAuto/rover-path-bendyruler-fence.txt similarity index 100% rename from Tools/autotest/ArduRover_Tests/PolyFenceObjectAvoidanceBendyRulerEasier/rover-path-bendyruler-fence.txt rename to Tools/autotest/ArduRover_Tests/PolyFenceObjectAvoidanceBendyRulerEasierAuto/rover-path-bendyruler-fence.txt diff --git a/Tools/autotest/ArduRover_Tests/PolyFenceObjectAvoidanceBendyRulerEasier/rover-path-bendyruler-mission-easier.txt b/Tools/autotest/ArduRover_Tests/PolyFenceObjectAvoidanceBendyRulerEasierAuto/rover-path-bendyruler-mission-easier.txt similarity index 100% rename from Tools/autotest/ArduRover_Tests/PolyFenceObjectAvoidanceBendyRulerEasier/rover-path-bendyruler-mission-easier.txt rename to Tools/autotest/ArduRover_Tests/PolyFenceObjectAvoidanceBendyRulerEasierAuto/rover-path-bendyruler-mission-easier.txt diff --git a/Tools/autotest/ArduRover_Tests/PolyFenceObjectAvoidanceBendyRulerEasierGuided/rover-path-bendyruler-fence.txt b/Tools/autotest/ArduRover_Tests/PolyFenceObjectAvoidanceBendyRulerEasierGuided/rover-path-bendyruler-fence.txt new file mode 100644 index 0000000000..ace97c223c --- /dev/null +++ b/Tools/autotest/ArduRover_Tests/PolyFenceObjectAvoidanceBendyRulerEasierGuided/rover-path-bendyruler-fence.txt @@ -0,0 +1,11 @@ +QGC WPL 110 +0 0 0 5001 8.000000 0.000000 0.000000 0.000000 40.071766 -105.230202 0.000000 0 +1 0 0 5001 8.000000 0.000000 0.000000 0.000000 40.071014 -105.230247 0.000000 0 +2 0 0 5001 8.000000 0.000000 0.000000 0.000000 40.071014 -105.228821 0.000000 0 +3 0 0 5001 8.000000 0.000000 0.000000 0.000000 40.071609 -105.228867 0.000000 0 +4 0 0 5001 8.000000 0.000000 0.000000 0.000000 40.071602 -105.228172 0.000000 0 +5 0 0 5001 8.000000 0.000000 0.000000 0.000000 40.070858 -105.227982 0.000000 0 +6 0 0 5001 8.000000 0.000000 0.000000 0.000000 40.070789 -105.226219 0.000000 0 +7 0 0 5001 8.000000 0.000000 0.000000 0.000000 40.072453 -105.226379 0.000000 0 +8 0 0 5004 20.000000 0.000000 0.000000 0.000000 40.071609 -105.228172 0.000000 0 +9 0 0 5004 20.000000 0.000000 0.000000 0.000000 40.071625 -105.227982 0.000000 0 diff --git a/Tools/autotest/Generic_Missions/CMAC-fence.txt b/Tools/autotest/Generic_Missions/CMAC-fence.txt new file mode 100644 index 0000000000..a6169e4e3c --- /dev/null +++ b/Tools/autotest/Generic_Missions/CMAC-fence.txt @@ -0,0 +1,6 @@ +-35.363720 149.163651 +-35.358738 149.165070 +-35.359295 149.154434 +-35.372292 149.157135 +-35.368290 149.166809 +-35.358738 149.165070 diff --git a/Tools/autotest/antennatracker.py b/Tools/autotest/antennatracker.py index b186711637..3864f4c512 100644 --- a/Tools/autotest/antennatracker.py +++ b/Tools/autotest/antennatracker.py @@ -177,8 +177,6 @@ class AutoTestTracker(vehicle_test_suite.TestSuite): def GPSForYaw(self): '''Moving baseline GPS yaw''' - self.context_push() - self.load_default_params_file("tracker-gps-for-yaw.parm") self.reboot_sitl() @@ -195,10 +193,6 @@ class AutoTestTracker(vehicle_test_suite.TestSuite): raise NotAchievedException("GPS_RAW not tracking simstate yaw") self.progress(f"yaw match ({gps_raw_hdg} vs {sim_hdg}") - self.context_pop() - - self.reboot_sitl() - def tests(self): '''return list of all tests''' ret = super(AutoTestTracker, self).tests() diff --git a/Tools/autotest/arducopter.py b/Tools/autotest/arducopter.py index f6f8e7a73b..638fe6ffdf 100644 --- a/Tools/autotest/arducopter.py +++ b/Tools/autotest/arducopter.py @@ -961,21 +961,6 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): # Tests all actions and logic behind the battery failsafe def BatteryFailsafe(self, timeout=300): '''Fly Battery Failsafe''' - self.context_push() - ex = None - try: - self.test_battery_failsafe(timeout=timeout) - except Exception as e: - self.print_exception_caught(e) - self.disarm_vehicle(force=True) - ex = e - self.context_pop() - self.reboot_sitl() - - if ex is not None: - raise ex - - def test_battery_failsafe(self, timeout=300): self.progress("Configure battery failsafe parameters") self.set_parameters({ 'SIM_SPEEDUP': 4, @@ -1115,6 +1100,43 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.progress("All Battery failsafe tests complete") + def BatteryMissing(self): + ''' Test battery health pre-arm and missing failsafe''' + self.context_push() + + # Should be good to arm with no changes + self.wait_ready_to_arm() + + # Make monitor unhealthy, this should result in unhealthy prearm + self.set_parameters({ + 'BATT_VOLT_PIN': -1, + }) + + self.drain_mav() + + # Battery should go unhealthy immediately + self.assert_prearm_failure("Battery 1 unhealthy", other_prearm_failures_fatal=False) + + # Return monitor to health + self.context_pop() + self.context_push() + + self.wait_ready_to_arm() + + # take off and then trigger in flight + self.takeoff(10, mode="LOITER") + self.set_parameters({ + 'BATT_VOLT_PIN': -1, + }) + + # Should trigger missing failsafe + self.wait_statustext("Battery 1 is missing") + + # Done, reset params and reboot to clear failsafe + self.land_and_disarm() + self.context_pop() + self.reboot_sitl() + def VibrationFailsafe(self): '''Test Vibration Failsafe''' self.context_push() @@ -1417,7 +1439,7 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.wait_altitude(10, 100, relative=True) self.set_rc(3, 1500) self.set_rc(2, 1400) - self.wait_distance_to_home(12, 20) + self.wait_distance_to_home(12, 20, timeout=30) tstart = self.get_sim_time() push_time = 70 # push against barrier for 60 seconds failed_max = False @@ -1476,7 +1498,7 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.load_fence("fence-in-middle-of-nowhere.txt") self.delay_sim_time(5) # let fence check run so it loads-from-eeprom - self.assert_prearm_failure("vehicle outside fence") + self.assert_prearm_failure("Vehicle breaching Polygon fence") self.progress("Failed to arm outside fence (good!)") self.clear_fence() self.delay_sim_time(5) # let fence breach clear @@ -1486,7 +1508,7 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.start_subtest("ensure we can't arm with bad radius") self.context_push() self.set_parameter("FENCE_RADIUS", -1) - self.assert_prearm_failure("Invalid FENCE_RADIUS value") + self.assert_prearm_failure("Invalid Circle FENCE_RADIUS value") self.context_pop() self.progress("Failed to arm with bad radius") self.drain_mav() @@ -1568,6 +1590,7 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): "FENCE_ENABLE": 1, "AVOID_ENABLE": 0, "FENCE_TYPE": 1, + "FENCE_ENABLE" : 1, }) self.change_alt(10) @@ -1655,6 +1678,7 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): # enable fence, disable avoidance self.set_parameters({ "AVOID_ENABLE": 0, + "FENCE_ENABLE" : 1, "FENCE_TYPE": 8, "FENCE_ALT_MIN": 20, }) @@ -1691,6 +1715,59 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.zero_throttle() + # MinAltFenceAvoid - fly down and make sure fence action does not trigger + # Also check that the vehicle will not try and ascend too fast when trying to backup from a min alt fence due to avoidance + def MinAltFenceAvoid(self): + '''Test Min Alt Fence Avoidance''' + self.takeoff(30, mode="LOITER") + """Hold loiter position.""" + + # enable fence, only min altitude + # No action, rely on avoidance to prevent the breach + self.set_parameters({ + "FENCE_ENABLE": 1, + "FENCE_TYPE": 8, + "FENCE_ALT_MIN": 20, + "FENCE_ACTION": 0, + }) + + # Try and fly past the fence + self.set_rc(3, 1120) + + # Avoid should prevent the vehicle flying past the fence, so the altitude wait should timeouts + try: + self.wait_altitude(10, 15, timeout=90, relative=True) + raise NotAchievedException("Avoid should prevent reaching altitude") + except AutoTestTimeoutException: + pass + except Exception as e: + raise e + + # Check ascent is not too fast, allow 10% above the configured backup speed + max_ascent_rate = self.get_parameter("AVOID_BACKUP_SPD") * 1.1 + + def get_climb_rate(mav, m): + m_type = m.get_type() + if m_type != 'VFR_HUD': + return + if m.climb > max_ascent_rate: + raise NotAchievedException("Ascending too fast want %f got %f" % (max_ascent_rate, m.climb)) + + self.context_push() + self.install_message_hook_context(get_climb_rate) + + # Reduce fence alt, this will result in a fence breach, but there is no action. + # Avoid should then backup the vehicle to be over the new fence alt. + self.set_parameters({ + "FENCE_ALT_MIN": 30, + }) + self.wait_altitude(30, 40, timeout=90, relative=True) + + self.context_pop() + + self.set_rc(3, 1500) + self.do_RTL() + def FenceFloorEnabledLanding(self): """Ensures we can initiate and complete an RTL while the fence is enabled. @@ -1700,15 +1777,16 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.progress("Test Landing while fence floor enabled") self.set_parameters({ "AVOID_ENABLE": 0, + "FENCE_ENABLE" : 1, "FENCE_TYPE": 15, - "FENCE_ALT_MIN": 10, - "FENCE_ALT_MAX": 20, + "FENCE_ALT_MIN": 20, + "FENCE_ALT_MAX": 30, }) self.change_mode("GUIDED") self.wait_ready_to_arm() self.arm_vehicle() - self.user_takeoff(alt_min=15) + self.user_takeoff(alt_min=25) # Check fence is enabled self.do_fence_enable() @@ -1720,16 +1798,109 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.set_rc(3, 1800) self.wait_mode('RTL', timeout=120) - self.wait_landed_and_disarmed() + # center throttle + self.set_rc(3, 1500) + + # wait until we are below the fence floor and re-enter loiter + self.wait_altitude(5, 15, relative=True) + self.change_mode('LOITER') + # wait for manual recovery to expire + self.delay_sim_time(15) + + # lower throttle and try and land + self.set_rc(3, 1300) + self.wait_altitude(0, 2, relative=True) + self.wait_disarmed() self.assert_fence_enabled() - # Assert fence is not healthy + # Assert fence is not healthy since it was enabled manually self.assert_sensor_state(fence_bit, healthy=False) # Disable the fence using mavlink command to ensure cleaned up SITL state self.do_fence_disable() self.assert_fence_disabled() + def FenceFloorAutoDisableLanding(self): + """Ensures we can initiate and complete an RTL while the fence is enabled""" + + fence_bit = mavutil.mavlink.MAV_SYS_STATUS_GEOFENCE + + self.progress("Test Landing while fence floor enabled") + self.set_parameters({ + "AVOID_ENABLE": 0, + "FENCE_TYPE": 11, + "FENCE_ALT_MIN": 10, + "FENCE_ALT_MAX": 20, + "FENCE_AUTOENABLE" : 1, + }) + + self.change_mode("GUIDED") + self.wait_ready_to_arm() + self.arm_vehicle() + self.takeoff(alt_min=15, mode="GUIDED") + + # Check fence is enabled + self.assert_fence_enabled() + + # Change to RC controlled mode + self.change_mode('LOITER') + + self.set_rc(3, 1800) + + self.wait_mode('RTL', timeout=120) + + self.wait_landed_and_disarmed(0) + # the breach should have cleared since we auto-disable the + # fence on landing + self.assert_fence_disabled() + + # Assert fences have gone now that we have landed and disarmed + self.assert_sensor_state(fence_bit, present=True, enabled=False) + + def FenceFloorAutoEnableOnArming(self): + """Ensures we can auto-enable fences on arming and still takeoff and land""" + + fence_bit = mavutil.mavlink.MAV_SYS_STATUS_GEOFENCE + + self.set_parameters({ + "AVOID_ENABLE": 0, + "FENCE_TYPE": 11, + "FENCE_ALT_MIN": 10, + "FENCE_ALT_MAX": 20, + "FENCE_AUTOENABLE" : 3, + }) + + self.change_mode("GUIDED") + # Check fence is not enabled + self.assert_fence_disabled() + + self.wait_ready_to_arm() + self.arm_vehicle() + self.takeoff(alt_min=15, mode="GUIDED") + + # Check fence is enabled + self.assert_fence_enabled() + + # Change to RC controlled mode + self.change_mode('LOITER') + + self.set_rc(3, 1800) + + self.wait_mode('RTL', timeout=120) + # Assert fence is not healthy now that we are in RTL + self.assert_sensor_state(fence_bit, healthy=False) + + self.wait_landed_and_disarmed(0) + # the breach should have cleared since we auto-disable the + # fence on landing + self.assert_fence_disabled() + + # Assert fences have gone now that we have landed and disarmed + self.assert_sensor_state(fence_bit, present=True, enabled=False) + + # Disable the fence using mavlink command to ensure cleaned up SITL state + self.assert_fence_disabled() + def GPSGlitchLoiter(self, timeout=30, max_distance=20): """fly_gps_glitch_loiter_test. Fly south east in loiter and test reaction to gps glitch.""" @@ -2229,46 +2400,36 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): def ModeFlip(self): '''Fly Flip Mode''' - ex = None - try: - self.set_message_rate_hz(mavutil.mavlink.MAVLINK_MSG_ID_ATTITUDE, 100) + self.context_set_message_rate_hz(mavutil.mavlink.MAVLINK_MSG_ID_ATTITUDE, 100) - self.takeoff(20) - self.hover() - old_speedup = self.get_parameter("SIM_SPEEDUP") - self.set_parameter('SIM_SPEEDUP', 1) - self.progress("Flipping in roll") - self.set_rc(1, 1700) - self.send_cmd_do_set_mode('FLIP') # don't wait for success - self.wait_attitude(despitch=0, desroll=45, tolerance=30) - self.wait_attitude(despitch=0, desroll=90, tolerance=30) - self.wait_attitude(despitch=0, desroll=-45, tolerance=30) - self.progress("Waiting for level") - self.set_rc(1, 1500) # can't change quickly enough! - self.wait_attitude(despitch=0, desroll=0, tolerance=5) + self.takeoff(20) - self.progress("Regaining altitude") - self.change_mode('ALT_HOLD') - self.wait_altitude(19, 60, relative=True) + self.progress("Flipping in roll") + self.set_rc(1, 1700) + self.send_cmd_do_set_mode('FLIP') # don't wait for success + self.wait_attitude(despitch=0, desroll=45, tolerance=30) + self.wait_attitude(despitch=0, desroll=90, tolerance=30) + self.wait_attitude(despitch=0, desroll=-45, tolerance=30) + self.progress("Waiting for level") + self.set_rc(1, 1500) # can't change quickly enough! + self.wait_attitude(despitch=0, desroll=0, tolerance=5) - self.progress("Flipping in pitch") - self.set_rc(2, 1700) - self.send_cmd_do_set_mode('FLIP') # don't wait for success - self.wait_attitude(despitch=45, desroll=0, tolerance=30) - # can't check roll here as it flips from 0 to -180.. - self.wait_attitude(despitch=90, tolerance=30) - self.wait_attitude(despitch=-45, tolerance=30) - self.progress("Waiting for level") - self.set_rc(2, 1500) # can't change quickly enough! - self.wait_attitude(despitch=0, desroll=0, tolerance=5) - self.set_parameter('SIM_SPEEDUP', old_speedup) - self.do_RTL() - except Exception as e: - self.print_exception_caught(e) - ex = e - self.set_message_rate_hz(mavutil.mavlink.MAVLINK_MSG_ID_ATTITUDE, 0) - if ex is not None: - raise ex + self.progress("Regaining altitude") + self.change_mode('ALT_HOLD') + self.wait_altitude(19, 60, relative=True) + + self.progress("Flipping in pitch") + self.set_rc(2, 1700) + self.send_cmd_do_set_mode('FLIP') # don't wait for success + self.wait_attitude(despitch=45, desroll=0, tolerance=30) + # can't check roll here as it flips from 0 to -180.. + self.wait_attitude(despitch=90, tolerance=30) + self.wait_attitude(despitch=-45, tolerance=30) + self.progress("Waiting for level") + self.set_rc(2, 1500) # can't change quickly enough! + self.wait_attitude(despitch=0, desroll=0, tolerance=5) + + self.do_RTL() def configure_EKFs_to_use_optical_flow_instead_of_GPS(self): '''configure EKF to use optical flow instead of GPS''' @@ -2311,10 +2472,10 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): '''test OpticalFlow in flight''' self.start_subtest("Make sure no crash if no rangefinder") - self.context_push() - - self.set_parameter("SIM_FLOW_ENABLE", 1) - self.set_parameter("FLOW_TYPE", 10) + self.set_parameters({ + "SIM_FLOW_ENABLE": 1, + "FLOW_TYPE": 10, + }) self.set_analog_rangefinder_parameters() @@ -2358,75 +2519,58 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.fly_generic_mission("CMAC-copter-navtest.txt") - self.context_pop() + def OpticalFlowLimits(self): + '''test EKF navigation limiting''' + self.set_parameters({ + "SIM_FLOW_ENABLE": 1, + "FLOW_TYPE": 10, + "SIM_GPS_DISABLE": 1, + "SIM_TERRAIN": 0, + }) + + self.configure_EKFs_to_use_optical_flow_instead_of_GPS() + + self.set_analog_rangefinder_parameters() self.reboot_sitl() - def OpticalFlowLimits(self): - '''test EKF navigation limiting''' - ex = None - self.context_push() - try: + # we can't takeoff in loiter as we need flow healthy + self.takeoff(alt_min=5, mode='ALT_HOLD', require_absolute=False, takeoff_throttle=1800) + self.change_mode('LOITER') - self.set_parameter("SIM_FLOW_ENABLE", 1) - self.set_parameter("FLOW_TYPE", 10) + # speed should be limited to <10m/s + self.set_rc(2, 1000) - self.configure_EKFs_to_use_optical_flow_instead_of_GPS() + tstart = self.get_sim_time() + timeout = 60 + started_climb = False + while self.get_sim_time_cached() - tstart < timeout: + m = self.assert_receive_message('GLOBAL_POSITION_INT') + spd = math.sqrt(m.vx**2 + m.vy**2) * 0.01 + alt = m.relative_alt*0.001 - self.set_analog_rangefinder_parameters() + # calculate max speed from altitude above the ground + margin = 2.0 + max_speed = alt * 1.5 + margin + self.progress("%0.1f: Low Speed: %f (want <= %u) alt=%.1f" % + (self.get_sim_time_cached() - tstart, + spd, + max_speed, alt)) + if spd > max_speed: + raise NotAchievedException(("Speed should be limited by" + "EKF optical flow limits")) - self.set_parameter("SIM_GPS_DISABLE", 1) - self.set_parameter("SIM_TERRAIN", 0) + # after 30 seconds start climbing + if not started_climb and self.get_sim_time_cached() - tstart > 30: + started_climb = True + self.set_rc(3, 1900) + self.progress("Moving higher") - self.reboot_sitl() - - # we can't takeoff in loiter as we need flow healthy - self.takeoff(alt_min=5, mode='ALT_HOLD', require_absolute=False, takeoff_throttle=1800) - self.change_mode('LOITER') - - # speed should be limited to <10m/s - self.set_rc(2, 1000) - - tstart = self.get_sim_time() - timeout = 60 - started_climb = False - while self.get_sim_time_cached() - tstart < timeout: - m = self.mav.recv_match(type='GLOBAL_POSITION_INT', blocking=True) - spd = math.sqrt(m.vx**2 + m.vy**2) * 0.01 - alt = m.relative_alt*0.001 - - # calculate max speed from altitude above the ground - margin = 2.0 - max_speed = alt * 1.5 + margin - self.progress("%0.1f: Low Speed: %f (want <= %u) alt=%.1f" % - (self.get_sim_time_cached() - tstart, - spd, - max_speed, alt)) - if spd > max_speed: - raise NotAchievedException(("Speed should be limited by" - "EKF optical flow limits")) - - # after 30 seconds start climbing - if not started_climb and self.get_sim_time_cached() - tstart > 30: - started_climb = True - self.set_rc(3, 1900) - self.progress("Moving higher") - - # check altitude is not climbing above 35m - if alt > 35: - raise NotAchievedException("Alt should be limited by EKF optical flow limits") - - except Exception as e: - self.print_exception_caught(e) - ex = e - - self.set_rc(2, 1500) - self.context_pop() + # check altitude is not climbing above 35m + if alt > 35: + raise NotAchievedException("Alt should be limited by EKF optical flow limits") self.reboot_sitl(force=True) - if ex is not None: - raise ex - def OpticalFlowCalibration(self): '''test optical flow calibration''' ex = None @@ -2503,8 +2647,8 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.print_exception_caught(e) ex = e - self.context_pop() self.disarm_vehicle(force=True) + self.context_pop() self.reboot_sitl() if ex is not None: @@ -3098,122 +3242,109 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.disarm_vehicle(force=True) self.reboot_sitl() - def MotorFail(self, fail_servo=0, fail_mul=0.0, holdtime=30): + def MotorFail(self, ): """Test flight with reduced motor efficiency""" - # we only expect an octocopter to survive ATM: - servo_counts = { - # 2: 6, # hexa - 3: 8, # octa - # 5: 6, # Y6 - } - frame_class = int(self.get_parameter("FRAME_CLASS")) - if frame_class not in servo_counts: - self.progress("Test not relevant for frame_class %u" % frame_class) - return + self.MotorFail_test_frame('octa', 8, frame_class=3) + # self.MotorFail_test_frame('hexa', 6, frame_class=2) + # self.MotorFail_test_frame('y6', 6, frame_class=5) - servo_count = servo_counts[frame_class] + def MotorFail_test_frame(self, model, servo_count, frame_class, fail_servo=0, fail_mul=0.0, holdtime=30): + self.set_parameters({ + 'FRAME_CLASS': frame_class, + }) + self.customise_SITL_commandline([], model=model) - if fail_servo < 0 or fail_servo > servo_count: - raise ValueError('fail_servo outside range for frame class') - - self.takeoff(10, mode="LOITER") - - self.change_alt(alt_min=50) + self.takeoff(25, mode="LOITER") # Get initial values - start_hud = self.mav.recv_match(type='VFR_HUD', blocking=True) - start_attitude = self.mav.recv_match(type='ATTITUDE', blocking=True) + start_hud = self.assert_receive_message('VFR_HUD') + start_attitude = self.assert_receive_message('ATTITUDE') hover_time = 5 - try: - tstart = self.get_sim_time() - int_error_alt = 0 - int_error_yaw_rate = 0 - int_error_yaw = 0 - self.progress("Hovering for %u seconds" % hover_time) - failed = False - while True: - now = self.get_sim_time_cached() - if now - tstart > holdtime + hover_time: - break + tstart = self.get_sim_time() + int_error_alt = 0 + int_error_yaw_rate = 0 + int_error_yaw = 0 + self.progress("Hovering for %u seconds" % hover_time) + failed = False + while True: + now = self.get_sim_time_cached() + if now - tstart > holdtime + hover_time: + break - servo = self.mav.recv_match(type='SERVO_OUTPUT_RAW', - blocking=True) - hud = self.mav.recv_match(type='VFR_HUD', blocking=True) - attitude = self.mav.recv_match(type='ATTITUDE', blocking=True) + servo = self.assert_receive_message('SERVO_OUTPUT_RAW') + hud = self.assert_receive_message('VFR_HUD') + attitude = self.assert_receive_message('ATTITUDE') - if not failed and now - tstart > hover_time: - self.progress("Killing motor %u (%u%%)" % - (fail_servo+1, fail_mul)) - self.set_parameters({ - "SIM_ENGINE_FAIL": fail_servo, - "SIM_ENGINE_MUL": fail_mul, - }) - failed = True + if not failed and now - tstart > hover_time: + self.progress("Killing motor %u (%u%%)" % + (fail_servo+1, fail_mul)) + self.set_parameters({ + "SIM_ENGINE_FAIL": fail_servo, + "SIM_ENGINE_MUL": fail_mul, + }) + failed = True - if failed: - self.progress("Hold Time: %f/%f" % (now-tstart, holdtime)) + if failed: + self.progress("Hold Time: %f/%f" % (now-tstart, holdtime)) - servo_pwm = [servo.servo1_raw, - servo.servo2_raw, - servo.servo3_raw, - servo.servo4_raw, - servo.servo5_raw, - servo.servo6_raw, - servo.servo7_raw, - servo.servo8_raw] + servo_pwm = [ + servo.servo1_raw, + servo.servo2_raw, + servo.servo3_raw, + servo.servo4_raw, + servo.servo5_raw, + servo.servo6_raw, + servo.servo7_raw, + servo.servo8_raw, + ] - self.progress("PWM output per motor") - for i, pwm in enumerate(servo_pwm[0:servo_count]): - if pwm > 1900: - state = "oversaturated" - elif pwm < 1200: - state = "undersaturated" - else: - state = "OK" + self.progress("PWM output per motor") + for i, pwm in enumerate(servo_pwm[0:servo_count]): + if pwm > 1900: + state = "oversaturated" + elif pwm < 1200: + state = "undersaturated" + else: + state = "OK" - if failed and i == fail_servo: - state += " (failed)" + if failed and i == fail_servo: + state += " (failed)" - self.progress("servo %u [pwm=%u] [%s]" % (i+1, pwm, state)) + self.progress("servo %u [pwm=%u] [%s]" % (i+1, pwm, state)) - alt_delta = hud.alt - start_hud.alt - yawrate_delta = attitude.yawspeed - start_attitude.yawspeed - yaw_delta = attitude.yaw - start_attitude.yaw + alt_delta = hud.alt - start_hud.alt + yawrate_delta = attitude.yawspeed - start_attitude.yawspeed + yaw_delta = attitude.yaw - start_attitude.yaw - self.progress("Alt=%fm (delta=%fm)" % (hud.alt, alt_delta)) - self.progress("Yaw rate=%f (delta=%f) (rad/s)" % - (attitude.yawspeed, yawrate_delta)) - self.progress("Yaw=%f (delta=%f) (deg)" % - (attitude.yaw, yaw_delta)) + self.progress("Alt=%fm (delta=%fm)" % (hud.alt, alt_delta)) + self.progress("Yaw rate=%f (delta=%f) (rad/s)" % + (attitude.yawspeed, yawrate_delta)) + self.progress("Yaw=%f (delta=%f) (deg)" % + (attitude.yaw, yaw_delta)) - dt = self.get_sim_time() - now - int_error_alt += abs(alt_delta/dt) - int_error_yaw_rate += abs(yawrate_delta/dt) - int_error_yaw += abs(yaw_delta/dt) - self.progress("## Error Integration ##") - self.progress(" Altitude: %fm" % int_error_alt) - self.progress(" Yaw rate: %f rad/s" % int_error_yaw_rate) - self.progress(" Yaw: %f deg" % int_error_yaw) - self.progress("----") + dt = self.get_sim_time() - now + int_error_alt += abs(alt_delta/dt) + int_error_yaw_rate += abs(yawrate_delta/dt) + int_error_yaw += abs(yaw_delta/dt) + self.progress("## Error Integration ##") + self.progress(" Altitude: %fm" % int_error_alt) + self.progress(" Yaw rate: %f rad/s" % int_error_yaw_rate) + self.progress(" Yaw: %f deg" % int_error_yaw) + self.progress("----") - if int_error_yaw_rate > 0.1: - raise NotAchievedException("Vehicle is spinning") + if int_error_yaw > 5: + raise NotAchievedException("Vehicle is spinning") - if alt_delta < -20: - raise NotAchievedException("Vehicle is descending") + if alt_delta < -20: + raise NotAchievedException("Vehicle is descending") - self.set_parameters({ - "SIM_ENGINE_FAIL": 0, - "SIM_ENGINE_MUL": 1.0, - }) - except Exception as e: - self.set_parameters({ - "SIM_ENGINE_FAIL": 0, - "SIM_ENGINE_MUL": 1.0, - }) - raise e + self.progress("Fixing motors") + self.set_parameters({ + "SIM_ENGINE_FAIL": 0, + "SIM_ENGINE_MUL": 1.0, + }) self.do_RTL() @@ -3231,83 +3362,67 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): def MotorVibration(self): """Test flight with motor vibration""" - self.context_push() - - ex = None - try: - self.set_rc_default() - # magic tridge EKF type that dramatically speeds up the test - self.set_parameters({ - "AHRS_EKF_TYPE": 10, - "INS_LOG_BAT_MASK": 3, - "INS_LOG_BAT_OPT": 0, - "LOG_BITMASK": 958, - "LOG_DISARMED": 0, - "SIM_VIB_MOT_MAX": 350, - # these are real values taken from a 180mm Quad: - "SIM_GYR1_RND": 20, - "SIM_ACC1_RND": 5, - "SIM_ACC2_RND": 5, - "SIM_INS_THR_MIN": 0.1, - }) - self.reboot_sitl() - - # do a simple up-and-down flight to gather data: - self.takeoff(15, mode="ALT_HOLD") - tstart, tend, hover_throttle = self.hover_for_interval(15) - # if we don't reduce vibes here then the landing detector - # may not trigger - self.set_parameter("SIM_VIB_MOT_MAX", 0) - self.do_RTL() - - psd = self.mavfft_fttd(1, 0, tstart * 1.0e6, tend * 1.0e6) - # ignore the first 20Hz and look for a peak at -15dB or more - # it should be at about 190Hz, each bin is 1000/1024Hz wide - ignore_bins = int(100 * 1.024) # start at 100Hz to be safe - freq = psd["F"][numpy.argmax(psd["X"][ignore_bins:]) + ignore_bins] - if numpy.amax(psd["X"][ignore_bins:]) < -15 or freq < 100 or freq > 300: - raise NotAchievedException( - "Did not detect a motor peak, found %f at %f dB" % - (freq, numpy.amax(psd["X"][ignore_bins:]))) - else: - self.progress("Detected motor peak at %fHz" % freq) - - # now add a notch and check that post-filter the peak is squashed below 40dB - self.set_parameters({ - "INS_LOG_BAT_OPT": 2, - "INS_HNTC2_ENABLE": 1, - "INS_HNTC2_FREQ": freq, - "INS_HNTC2_ATT": 50, - "INS_HNTC2_BW": freq/2, - "INS_HNTC2_MODE": 0, - "SIM_VIB_MOT_MAX": 350, - }) - self.reboot_sitl() - - # do a simple up-and-down flight to gather data: - self.takeoff(15, mode="ALT_HOLD") - tstart, tend, hover_throttle = self.hover_for_interval(15) - self.set_parameter("SIM_VIB_MOT_MAX", 0) - self.do_RTL() - - psd = self.mavfft_fttd(1, 0, tstart * 1.0e6, tend * 1.0e6) - freq = psd["F"][numpy.argmax(psd["X"][ignore_bins:]) + ignore_bins] - peakdB = numpy.amax(psd["X"][ignore_bins:]) - if peakdB < -23: - self.progress("Did not detect a motor peak, found %f at %f dB" % (freq, peakdB)) - else: - raise NotAchievedException("Detected peak %.1f Hz %.2f dB" % (freq, peakdB)) - except Exception as e: - self.print_exception_caught(e) - ex = e - self.disarm_vehicle(force=True) - - self.context_pop() - + # magic tridge EKF type that dramatically speeds up the test + self.set_parameters({ + "AHRS_EKF_TYPE": 10, + "INS_LOG_BAT_MASK": 3, + "INS_LOG_BAT_OPT": 0, + "LOG_BITMASK": 958, + "LOG_DISARMED": 0, + "SIM_VIB_MOT_MAX": 350, + # these are real values taken from a 180mm Quad: + "SIM_GYR1_RND": 20, + "SIM_ACC1_RND": 5, + "SIM_ACC2_RND": 5, + "SIM_INS_THR_MIN": 0.1, + }) self.reboot_sitl() - if ex is not None: - raise ex + # do a simple up-and-down flight to gather data: + self.takeoff(15, mode="ALT_HOLD") + tstart, tend, hover_throttle = self.hover_for_interval(15) + # if we don't reduce vibes here then the landing detector + # may not trigger + self.set_parameter("SIM_VIB_MOT_MAX", 0) + self.do_RTL() + + psd = self.mavfft_fttd(1, 0, tstart * 1.0e6, tend * 1.0e6) + # ignore the first 20Hz and look for a peak at -15dB or more + # it should be at about 190Hz, each bin is 1000/1024Hz wide + ignore_bins = int(100 * 1.024) # start at 100Hz to be safe + freq = psd["F"][numpy.argmax(psd["X"][ignore_bins:]) + ignore_bins] + if numpy.amax(psd["X"][ignore_bins:]) < -15 or freq < 100 or freq > 300: + raise NotAchievedException( + "Did not detect a motor peak, found %f at %f dB" % + (freq, numpy.amax(psd["X"][ignore_bins:]))) + else: + self.progress("Detected motor peak at %fHz" % freq) + + # now add a notch and check that post-filter the peak is squashed below 40dB + self.set_parameters({ + "INS_LOG_BAT_OPT": 2, + "INS_HNTC2_ENABLE": 1, + "INS_HNTC2_FREQ": freq, + "INS_HNTC2_ATT": 50, + "INS_HNTC2_BW": freq/2, + "INS_HNTC2_MODE": 0, + "SIM_VIB_MOT_MAX": 350, + }) + self.reboot_sitl() + + # do a simple up-and-down flight to gather data: + self.takeoff(15, mode="ALT_HOLD") + tstart, tend, hover_throttle = self.hover_for_interval(15) + self.set_parameter("SIM_VIB_MOT_MAX", 0) + self.do_RTL() + + psd = self.mavfft_fttd(1, 0, tstart * 1.0e6, tend * 1.0e6) + freq = psd["F"][numpy.argmax(psd["X"][ignore_bins:]) + ignore_bins] + peakdB = numpy.amax(psd["X"][ignore_bins:]) + if peakdB < -23: + self.progress("Did not detect a motor peak, found %f at %f dB" % (freq, peakdB)) + else: + raise NotAchievedException("Detected peak %.1f Hz %.2f dB" % (freq, peakdB)) def VisionPosition(self): """Disable GPS navigation, enable Vicon input.""" @@ -3321,91 +3436,62 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): old_pos = self.mav.recv_match(type='GLOBAL_POSITION_INT', blocking=True) print("old_pos=%s" % str(old_pos)) - self.context_push() - - ex = None - try: - # configure EKF to use external nav instead of GPS - ahrs_ekf_type = self.get_parameter("AHRS_EKF_TYPE") - if ahrs_ekf_type == 2: - self.set_parameter("EK2_GPS_TYPE", 3) - if ahrs_ekf_type == 3: - self.set_parameters({ - "EK3_SRC1_POSXY": 6, - "EK3_SRC1_VELXY": 6, - "EK3_SRC1_POSZ": 6, - "EK3_SRC1_VELZ": 6, - }) + # configure EKF to use external nav instead of GPS + ahrs_ekf_type = self.get_parameter("AHRS_EKF_TYPE") + if ahrs_ekf_type == 2: + self.set_parameter("EK2_GPS_TYPE", 3) + if ahrs_ekf_type == 3: self.set_parameters({ - "GPS1_TYPE": 0, - "VISO_TYPE": 1, - "SERIAL5_PROTOCOL": 1, + "EK3_SRC1_POSXY": 6, + "EK3_SRC1_VELXY": 6, + "EK3_SRC1_POSZ": 6, + "EK3_SRC1_VELZ": 6, }) - self.reboot_sitl() - # without a GPS or some sort of external prompting, AP - # doesn't send system_time messages. So prompt it: - self.mav.mav.system_time_send(int(time.time() * 1000000), 0) - self.progress("Waiting for non-zero-lat") - tstart = self.get_sim_time() - while True: - self.mav.mav.set_gps_global_origin_send(1, - old_pos.lat, - old_pos.lon, - old_pos.alt) - gpi = self.mav.recv_match(type='GLOBAL_POSITION_INT', - blocking=True) - self.progress("gpi=%s" % str(gpi)) - if gpi.lat != 0: - break - - if self.get_sim_time_cached() - tstart > 60: - raise AutoTestTimeoutException("Did not get non-zero lat") - - self.takeoff() - self.set_rc(1, 1600) - tstart = self.get_sim_time() - while True: - vicon_pos = self.mav.recv_match(type='VISION_POSITION_ESTIMATE', - blocking=True) - # print("vpe=%s" % str(vicon_pos)) - self.mav.recv_match(type='GLOBAL_POSITION_INT', - blocking=True) - # self.progress("gpi=%s" % str(gpi)) - if vicon_pos.x > 40: - break - - if self.get_sim_time_cached() - tstart > 100: - raise AutoTestTimeoutException("Vicon showed no movement") - - # recenter controls: - self.set_rc(1, 1500) - self.progress("# Enter RTL") - self.change_mode('RTL') - self.set_rc(3, 1500) - tstart = self.get_sim_time() - while True: - if self.get_sim_time_cached() - tstart > 200: - raise NotAchievedException("Did not disarm") - self.mav.recv_match(type='GLOBAL_POSITION_INT', - blocking=True) - # print("gpi=%s" % str(gpi)) - self.mav.recv_match(type='SIMSTATE', - blocking=True) - # print("ss=%s" % str(ss)) - # wait for RTL disarm: - if not self.armed(): - break - - except Exception as e: - self.print_exception_caught(e) - ex = e - - self.context_pop() - self.zero_throttle() + self.set_parameters({ + "GPS1_TYPE": 0, + "VISO_TYPE": 1, + "SERIAL5_PROTOCOL": 1, + }) self.reboot_sitl() + # without a GPS or some sort of external prompting, AP + # doesn't send system_time messages. So prompt it: + self.mav.mav.system_time_send(int(time.time() * 1000000), 0) + self.progress("Waiting for non-zero-lat") + tstart = self.get_sim_time() + while True: + if self.get_sim_time_cached() - tstart > 60: + raise AutoTestTimeoutException("Did not get non-zero lat") + self.mav.mav.set_gps_global_origin_send(1, + old_pos.lat, + old_pos.lon, + old_pos.alt) + gpi = self.assert_receive_message('GLOBAL_POSITION_INT') + self.progress("gpi=%s" % str(gpi)) + if gpi.lat != 0: + break - if ex is not None: - raise ex + self.takeoff() + self.set_rc(1, 1600) + tstart = self.get_sim_time() + while True: + vicon_pos = self.assert_receive_message('VISION_POSITION_ESTIMATE') + # print("vpe=%s" % str(vicon_pos)) + # gpi = self.assert_receive_message('GLOBAL_POSITION_INT') + # self.progress("gpi=%s" % str(gpi)) + if vicon_pos.x > 40: + break + + if self.get_sim_time_cached() - tstart > 100: + raise AutoTestTimeoutException("Vicon showed no movement") + + # recenter controls: + self.set_rc(1, 1500) + self.progress("# Enter RTL") + self.change_mode('RTL') + self.set_rc(3, 1500) + tstart = self.get_sim_time() + # self.install_messageprinter_handlers_context(['SIMSTATE', 'GLOBAL_POSITION_INT']) + self.wait_disarmed(timeout=200) def BodyFrameOdom(self): """Disable GPS navigation, enable input of VISION_POSITION_DELTA.""" @@ -3554,82 +3640,68 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): def GPSViconSwitching(self): """Fly GPS and Vicon switching test""" + """Setup parameters including switching to EKF3""" + self.set_parameters({ + "VISO_TYPE": 2, # enable vicon + "SERIAL5_PROTOCOL": 2, + "EK3_ENABLE": 1, + "EK3_SRC2_POSXY": 6, # External Nav + "EK3_SRC2_POSZ": 6, # External Nav + "EK3_SRC2_VELXY": 6, # External Nav + "EK3_SRC2_VELZ": 6, # External Nav + "EK3_SRC2_YAW": 6, # External Nav + "RC7_OPTION": 80, # RC aux switch 7 set to Viso Align + "RC8_OPTION": 90, # RC aux switch 8 set to EKF source selector + "EK2_ENABLE": 0, + "AHRS_EKF_TYPE": 3, + }) self.customise_SITL_commandline(["--serial5=sim:vicon:"]) - """Setup parameters including switching to EKF3""" - self.context_push() - ex = None - try: - self.set_parameters({ - "VISO_TYPE": 2, # enable vicon - "SERIAL5_PROTOCOL": 2, - "EK3_ENABLE": 1, - "EK3_SRC2_POSXY": 6, # External Nav - "EK3_SRC2_POSZ": 6, # External Nav - "EK3_SRC2_VELXY": 6, # External Nav - "EK3_SRC2_VELZ": 6, # External Nav - "EK3_SRC2_YAW": 6, # External Nav - "RC7_OPTION": 80, # RC aux switch 7 set to Viso Align - "RC8_OPTION": 90, # RC aux switch 8 set to EKF source selector - "EK2_ENABLE": 0, - "AHRS_EKF_TYPE": 3, - }) - self.reboot_sitl() + # switch to use GPS + self.set_rc(8, 1000) - # switch to use GPS - self.set_rc(8, 1000) + # ensure we can get a global position: + self.poll_home_position(timeout=120) - # ensure we can get a global position: - self.poll_home_position(timeout=120) + # record starting position + old_pos = self.get_global_position_int() + print("old_pos=%s" % str(old_pos)) - # record starting position - old_pos = self.get_global_position_int() - print("old_pos=%s" % str(old_pos)) + # align vicon yaw with ahrs heading + self.set_rc(7, 2000) - # align vicon yaw with ahrs heading - self.set_rc(7, 2000) + # takeoff to 10m in Loiter + self.progress("Moving to ensure location is tracked") + self.takeoff(10, mode="LOITER", require_absolute=True, timeout=720) - # takeoff to 10m in Loiter - self.progress("Moving to ensure location is tracked") - self.takeoff(10, mode="LOITER", require_absolute=True, timeout=720) + # fly forward in Loiter + self.set_rc(2, 1300) - # fly forward in Loiter - self.set_rc(2, 1300) + # disable vicon + self.set_parameter("SIM_VICON_FAIL", 1) - # disable vicon - self.set_parameter("SIM_VICON_FAIL", 1) + # ensure vehicle remain in Loiter for 15 seconds + tstart = self.get_sim_time() + while self.get_sim_time() - tstart < 15: + if not self.mode_is('LOITER'): + raise NotAchievedException("Expected to stay in loiter for >15 seconds") - # ensure vehicle remain in Loiter for 15 seconds - tstart = self.get_sim_time() - while self.get_sim_time() - tstart < 15: - if not self.mode_is('LOITER'): - raise NotAchievedException("Expected to stay in loiter for >15 seconds") + # re-enable vicon + self.set_parameter("SIM_VICON_FAIL", 0) - # re-enable vicon - self.set_parameter("SIM_VICON_FAIL", 0) + # switch to vicon, disable GPS and wait 10sec to ensure vehicle remains in Loiter + self.set_rc(8, 1500) + self.set_parameter("GPS1_TYPE", 0) - # switch to vicon, disable GPS and wait 10sec to ensure vehicle remains in Loiter - self.set_rc(8, 1500) - self.set_parameter("GPS1_TYPE", 0) + # ensure vehicle remain in Loiter for 15 seconds + tstart = self.get_sim_time() + while self.get_sim_time() - tstart < 15: + if not self.mode_is('LOITER'): + raise NotAchievedException("Expected to stay in loiter for >15 seconds") - # ensure vehicle remain in Loiter for 15 seconds - tstart = self.get_sim_time() - while self.get_sim_time() - tstart < 15: - if not self.mode_is('LOITER'): - raise NotAchievedException("Expected to stay in loiter for >15 seconds") - - # RTL and check vehicle arrives within 10m of home - self.set_rc(2, 1500) - self.do_RTL() - - except Exception as e: - self.print_exception_caught(e) - ex = e - self.context_pop() - self.disarm_vehicle(force=True) - self.reboot_sitl() - if ex is not None: - raise ex + # RTL and check vehicle arrives within 10m of home + self.set_rc(2, 1500) + self.do_RTL() def RTLSpeed(self): """Test RTL Speed parameters""" @@ -3709,9 +3781,6 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): def RangeFinder(self): '''Test RangeFinder Basic Functionality''' - ex = None - self.context_push() - self.progress("Making sure we don't ordinarily get RANGEFINDER") m = self.mav.recv_match(type='RANGEFINDER', blocking=True, @@ -3727,68 +3796,59 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): if self.current_onboard_log_contains_message("RFND"): raise NotAchievedException("Found unexpected RFND message") - try: - self.set_analog_rangefinder_parameters() - self.set_parameter("RC9_OPTION", 10) # rangefinder - self.set_rc(9, 2000) + self.set_analog_rangefinder_parameters() + self.set_parameter("RC9_OPTION", 10) # rangefinder + self.set_rc(9, 2000) - self.reboot_sitl() - - self.progress("Making sure we now get RANGEFINDER messages") - m = self.assert_receive_message('RANGEFINDER', timeout=10) - - self.progress("Checking RangeFinder is marked as enabled in mavlink") - m = self.mav.recv_match(type='SYS_STATUS', - blocking=True, - timeout=10) - flags = m.onboard_control_sensors_enabled - if not flags & mavutil.mavlink.MAV_SYS_STATUS_SENSOR_LASER_POSITION: - raise NotAchievedException("Laser not enabled in SYS_STATUS") - self.progress("Disabling laser using switch") - self.set_rc(9, 1000) - self.delay_sim_time(1) - self.progress("Checking RangeFinder is marked as disabled in mavlink") - m = self.mav.recv_match(type='SYS_STATUS', - blocking=True, - timeout=10) - flags = m.onboard_control_sensors_enabled - if flags & mavutil.mavlink.MAV_SYS_STATUS_SENSOR_LASER_POSITION: - raise NotAchievedException("Laser enabled in SYS_STATUS") - - self.progress("Re-enabling rangefinder") - self.set_rc(9, 2000) - self.delay_sim_time(1) - m = self.mav.recv_match(type='SYS_STATUS', - blocking=True, - timeout=10) - flags = m.onboard_control_sensors_enabled - if not flags & mavutil.mavlink.MAV_SYS_STATUS_SENSOR_LASER_POSITION: - raise NotAchievedException("Laser not enabled in SYS_STATUS") - - self.takeoff(10, mode="LOITER") - - m_r = self.mav.recv_match(type='RANGEFINDER', - blocking=True) - m_p = self.mav.recv_match(type='GLOBAL_POSITION_INT', - blocking=True) - - if abs(m_r.distance - m_p.relative_alt/1000) > 1: - raise NotAchievedException( - "rangefinder/global position int mismatch %0.2f vs %0.2f" % - (m_r.distance, m_p.relative_alt/1000)) - - self.land_and_disarm() - - if not self.current_onboard_log_contains_message("RFND"): - raise NotAchievedException("Did not see expected RFND message") - - except Exception as e: - self.print_exception_caught(e) - ex = e - self.context_pop() self.reboot_sitl() - if ex is not None: - raise ex + + self.progress("Making sure we now get RANGEFINDER messages") + m = self.assert_receive_message('RANGEFINDER', timeout=10) + + self.progress("Checking RangeFinder is marked as enabled in mavlink") + m = self.mav.recv_match(type='SYS_STATUS', + blocking=True, + timeout=10) + flags = m.onboard_control_sensors_enabled + if not flags & mavutil.mavlink.MAV_SYS_STATUS_SENSOR_LASER_POSITION: + raise NotAchievedException("Laser not enabled in SYS_STATUS") + self.progress("Disabling laser using switch") + self.set_rc(9, 1000) + self.delay_sim_time(1) + self.progress("Checking RangeFinder is marked as disabled in mavlink") + m = self.mav.recv_match(type='SYS_STATUS', + blocking=True, + timeout=10) + flags = m.onboard_control_sensors_enabled + if flags & mavutil.mavlink.MAV_SYS_STATUS_SENSOR_LASER_POSITION: + raise NotAchievedException("Laser enabled in SYS_STATUS") + + self.progress("Re-enabling rangefinder") + self.set_rc(9, 2000) + self.delay_sim_time(1) + m = self.mav.recv_match(type='SYS_STATUS', + blocking=True, + timeout=10) + flags = m.onboard_control_sensors_enabled + if not flags & mavutil.mavlink.MAV_SYS_STATUS_SENSOR_LASER_POSITION: + raise NotAchievedException("Laser not enabled in SYS_STATUS") + + self.takeoff(10, mode="LOITER") + + m_r = self.mav.recv_match(type='RANGEFINDER', + blocking=True) + m_p = self.mav.recv_match(type='GLOBAL_POSITION_INT', + blocking=True) + + if abs(m_r.distance - m_p.relative_alt/1000) > 1: + raise NotAchievedException( + "rangefinder/global position int mismatch %0.2f vs %0.2f" % + (m_r.distance, m_p.relative_alt/1000)) + + self.land_and_disarm() + + if not self.current_onboard_log_contains_message("RFND"): + raise NotAchievedException("Did not see expected RFND message") def SplineTerrain(self): '''Test Splines and Terrain''' @@ -4547,75 +4607,52 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): def SetModesViaModeSwitch(self): '''Set modes via modeswitch''' - self.context_push() - ex = None - try: - fltmode_ch = 5 - self.set_parameter("FLTMODE_CH", fltmode_ch) - self.set_rc(fltmode_ch, 1000) # PWM for mode1 - testmodes = [("FLTMODE1", 4, "GUIDED", 1165), - ("FLTMODE2", 2, "ALT_HOLD", 1295), - ("FLTMODE3", 6, "RTL", 1425), - ("FLTMODE4", 7, "CIRCLE", 1555), - ("FLTMODE5", 1, "ACRO", 1685), - ("FLTMODE6", 17, "BRAKE", 1815), - ] - for mode in testmodes: - (parm, parm_value, name, pwm) = mode - self.set_parameter(parm, parm_value) + fltmode_ch = 5 + self.set_parameter("FLTMODE_CH", fltmode_ch) + self.set_rc(fltmode_ch, 1000) # PWM for mode1 + testmodes = [("FLTMODE1", 4, "GUIDED", 1165), + ("FLTMODE2", 2, "ALT_HOLD", 1295), + ("FLTMODE3", 6, "RTL", 1425), + ("FLTMODE4", 7, "CIRCLE", 1555), + ("FLTMODE5", 1, "ACRO", 1685), + ("FLTMODE6", 17, "BRAKE", 1815), + ] + for mode in testmodes: + (parm, parm_value, name, pwm) = mode + self.set_parameter(parm, parm_value) - for mode in reversed(testmodes): - (parm, parm_value, name, pwm) = mode - self.set_rc(fltmode_ch, pwm) - self.wait_mode(name) + for mode in reversed(testmodes): + (parm, parm_value, name, pwm) = mode + self.set_rc(fltmode_ch, pwm) + self.wait_mode(name) - for mode in testmodes: - (parm, parm_value, name, pwm) = mode - self.set_rc(fltmode_ch, pwm) - self.wait_mode(name) + for mode in testmodes: + (parm, parm_value, name, pwm) = mode + self.set_rc(fltmode_ch, pwm) + self.wait_mode(name) - for mode in reversed(testmodes): - (parm, parm_value, name, pwm) = mode - self.set_rc(fltmode_ch, pwm) - self.wait_mode(name) - - except Exception as e: - self.print_exception_caught(e) - ex = e - - self.context_pop() - - if ex is not None: - raise ex + for mode in reversed(testmodes): + (parm, parm_value, name, pwm) = mode + self.set_rc(fltmode_ch, pwm) + self.wait_mode(name) def SetModesViaAuxSwitch(self): '''"Set modes via auxswitch"''' - self.context_push() - ex = None - try: - fltmode_ch = int(self.get_parameter("FLTMODE_CH")) - self.set_rc(fltmode_ch, 1000) - self.wait_mode("CIRCLE") - self.set_rc(9, 1000) - self.set_rc(10, 1000) - self.set_parameters({ - "RC9_OPTION": 18, # land - "RC10_OPTION": 55, # guided - }) - self.set_rc(9, 1900) - self.wait_mode("LAND") - self.set_rc(10, 1900) - self.wait_mode("GUIDED") - self.set_rc(10, 1000) # this re-polls the mode switch - self.wait_mode("CIRCLE") - except Exception as e: - self.print_exception_caught(e) - ex = e - - self.context_pop() - - if ex is not None: - raise ex + fltmode_ch = int(self.get_parameter("FLTMODE_CH")) + self.set_rc(fltmode_ch, 1000) + self.wait_mode("CIRCLE") + self.set_rc(9, 1000) + self.set_rc(10, 1000) + self.set_parameters({ + "RC9_OPTION": 18, # land + "RC10_OPTION": 55, # guided + }) + self.set_rc(9, 1900) + self.wait_mode("LAND") + self.set_rc(10, 1900) + self.wait_mode("GUIDED") + self.set_rc(10, 1000) # this re-polls the mode switch + self.wait_mode("CIRCLE") def fly_guided_stop(self, timeout=20, @@ -4951,49 +4988,39 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): """Test payload placing in auto.""" self.context_push() - ex = None - try: - self.set_analog_rangefinder_parameters() - self.set_servo_gripper_parameters() - self.reboot_sitl() + self.set_analog_rangefinder_parameters() + self.set_servo_gripper_parameters() + self.reboot_sitl() - self.load_mission("copter_payload_place.txt") - if self.mavproxy is not None: - self.mavproxy.send('wp list\n') + self.load_mission("copter_payload_place.txt") + if self.mavproxy is not None: + self.mavproxy.send('wp list\n') - self.set_parameter("AUTO_OPTIONS", 3) - self.change_mode('AUTO') - self.wait_ready_to_arm() + self.set_parameter("AUTO_OPTIONS", 3) + self.change_mode('AUTO') + self.wait_ready_to_arm() - self.arm_vehicle() + self.arm_vehicle() - self.wait_text("Gripper load releas", timeout=90) - dist_limit = 1 - # this is a copy of the point in the mission file: - target_loc = mavutil.location(-35.363106, - 149.165436, - 0, - 0) - dist = self.get_distance(target_loc, self.mav.location()) - self.progress("dist=%f" % (dist,)) - if dist > dist_limit: - raise NotAchievedException("Did not honour target lat/lng (dist=%f want <%f" % - (dist, dist_limit)) + self.wait_text("Gripper load releas", timeout=90) + dist_limit = 1 + # this is a copy of the point in the mission file: + target_loc = mavutil.location(-35.363106, + 149.165436, + 0, + 0) + dist = self.get_distance(target_loc, self.mav.location()) + self.progress("dist=%f" % (dist,)) + if dist > dist_limit: + raise NotAchievedException("Did not honour target lat/lng (dist=%f want <%f" % + (dist, dist_limit)) - self.wait_disarmed() - - except Exception as e: - self.print_exception_caught(e) - self.disarm_vehicle(force=True) - ex = e + self.wait_disarmed() self.context_pop() self.reboot_sitl() self.progress("All done") - if ex is not None: - raise ex - def Weathervane(self): '''Test copter weathervaning''' # We test nose into wind code paths and yaw direction here and test side into wind @@ -5169,24 +5196,14 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): def SplineLastWaypoint(self): '''Test Spline as last waypoint''' - self.context_push() - ex = None - try: - self.load_mission("copter-spline-last-waypoint.txt") - self.change_mode('LOITER') - self.wait_ready_to_arm() - self.arm_vehicle() - self.change_mode('AUTO') - self.set_rc(3, 1500) - self.wait_altitude(10, 3000, relative=True) - except Exception as e: - self.print_exception_caught(e) - ex = e - self.context_pop() + self.load_mission("copter-spline-last-waypoint.txt") + self.change_mode('LOITER') + self.wait_ready_to_arm() + self.arm_vehicle() + self.change_mode('AUTO') + self.set_rc(3, 1500) + self.wait_altitude(10, 3000, relative=True) self.do_RTL() - self.wait_disarmed() - if ex is not None: - raise ex def ManualThrottleModeChange(self): '''Check manual throttle mode changes denied on high throttle''' @@ -5228,6 +5245,7 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): def test_mount_pitch(self, despitch, despitch_tolerance, mount_mode, timeout=10, hold=0, constrained=True): tstart = self.get_sim_time() success_start = 0 + while True: now = self.get_sim_time_cached() if now - tstart > timeout: @@ -5238,9 +5256,9 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): despitch = self.constrained_mount_pitch(despitch) '''retrieve latest angles from GIMBAL_DEVICE_ATTITUDE_STATUS''' - mount_roll, mount_pitch, mount_yaw = self.get_mount_roll_pitch_yaw_deg() + mount_roll, mount_pitch, mount_yaw, mount_yaw_is_absolute = self.get_mount_roll_pitch_yaw_deg() - self.progress("despitch=%f roll=%f pitch=%f yaw=%f" % (despitch, mount_roll, mount_pitch, mount_yaw)) + # self.progress("despitch=%f roll=%f pitch=%f yaw=%f" % (despitch, mount_roll, mount_pitch, mount_yaw)) if abs(despitch - mount_pitch) > despitch_tolerance: self.progress("Mount pitch incorrect: got=%f want=%f (+/- %f)" % (mount_pitch, despitch, despitch_tolerance)) @@ -5296,10 +5314,11 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): # wait for gimbal attitude message m = self.assert_receive_message('GIMBAL_DEVICE_ATTITUDE_STATUS', timeout=5) + yaw_is_absolute = m.flags & mavutil.mavlink.GIMBAL_DEVICE_FLAGS_YAW_LOCK # convert quaternion to euler angles and return q = quaternion.Quaternion(m.q) euler = q.euler - return math.degrees(euler[0]), math.degrees(euler[1]), math.degrees(euler[2]) + return math.degrees(euler[0]), math.degrees(euler[1]), math.degrees(euler[2]), yaw_is_absolute def set_mount_mode(self, mount_mode): '''set mount mode''' @@ -5316,9 +5335,9 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): p3=0, # stabilize pitch (unsupported) ) - def test_mount_rc_targetting(self): + def test_mount_rc_targetting(self, pitch_rc_neutral=1500, do_rate_tests=True): '''called in multipleplaces to make sure that mount RC targetting works''' - try: + if True: self.context_push() self.set_parameters({ 'RC6_OPTION': 0, @@ -5378,6 +5397,13 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.set_rc(12, 1500) + if do_rate_tests: + self.test_mount_rc_targetting_rate_control() + + self.context_pop() + + def test_mount_rc_targetting_rate_control(self, pitch_rc_neutral=1500): + if True: self.progress("Testing RC rate control") self.set_parameter('MNT1_RC_RATE', 10) self.test_mount_pitch(0, 1, mavutil.mavlink.MAV_MOUNT_MODE_RC_TARGETING) @@ -5400,46 +5426,21 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.set_rc(12, 1500) self.test_mount_pitch(0, 0.1, mavutil.mavlink.MAV_MOUNT_MODE_RC_TARGETING) - self.context_pop() - - except Exception as e: - self.print_exception_caught(e) - self.context_pop() - raise e - - def Mount(self): - '''Test Camera/Antenna Mount''' - ex = None - self.context_push() - old_srcSystem = self.mav.mav.srcSystem - self.mav.mav.srcSystem = 250 - self.set_parameter("DISARM_DELAY", 0) - try: - '''start by disabling GCS failsafe, otherwise we immediately disarm - due to (apparently) not receiving traffic from the GCS for - too long. This is probably a function of --speedup''' - self.set_parameter("FS_GCS_ENABLE", 0) - - # setup mount parameters - self.setup_servo_mount() - self.reboot_sitl() # to handle MNT_TYPE changing - + def mount_test_body(self, pitch_rc_neutral=1500, do_rate_tests=True, constrain_sysid_target=True): + '''Test Camera/Antenna Mount - assumes a camera is set up and ready to go''' + if True: # make sure we're getting gimbal device attitude status - self.assert_receive_message('GIMBAL_DEVICE_ATTITUDE_STATUS', timeout=5) + self.assert_receive_message('GIMBAL_DEVICE_ATTITUDE_STATUS', timeout=5, very_verbose=True) # change mount to neutral mode (point forward, not stabilising) self.set_mount_mode(mavutil.mavlink.MAV_MOUNT_MODE_NEUTRAL) - # test pitch is not stabilising - mount_roll_deg, mount_pitch_deg, mount_yaw_deg = self.get_mount_roll_pitch_yaw_deg() + # test pitch is not neutral to start with + mount_roll_deg, mount_pitch_deg, mount_yaw_deg, mount_yaw_is_absolute = self.get_mount_roll_pitch_yaw_deg() if mount_roll_deg != 0 or mount_pitch_deg != 0 or mount_yaw_deg != 0: - raise NotAchievedException("Mount stabilising when not requested") + raise NotAchievedException("Mount not neutral") - self.change_mode('GUIDED') - self.wait_ready_to_arm() - self.arm_vehicle() - - self.user_takeoff() + self.takeoff(30, mode='GUIDED') # pitch vehicle back and confirm gimbal is still not stabilising despitch = 10 @@ -5451,13 +5452,13 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.wait_pitch(despitch, despitch_tolerance) # check gimbal is still not stabilising - mount_roll_deg, mount_pitch_deg, mount_yaw_deg = self.get_mount_roll_pitch_yaw_deg() + mount_roll_deg, mount_pitch_deg, mount_yaw_deg, mount_yaw_is_absolute = self.get_mount_roll_pitch_yaw_deg() if mount_roll_deg != 0 or mount_pitch_deg != 0 or mount_yaw_deg != 0: raise NotAchievedException("Mount stabilising when not requested") # center RC tilt control and change mount to RC_TARGETING mode self.progress("Gimbal to RC Targetting mode") - self.set_rc(6, 1500) + self.set_rc(6, pitch_rc_neutral) self.set_mount_mode(mavutil.mavlink.MAV_MOUNT_MODE_RC_TARGETING) # pitch vehicle back and confirm gimbal is stabilising @@ -5503,7 +5504,10 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.progress("Testing mount RC targetting") self.set_mount_mode(mavutil.mavlink.MAV_MOUNT_MODE_RC_TARGETING) - self.test_mount_rc_targetting() + self.test_mount_rc_targetting( + pitch_rc_neutral=pitch_rc_neutral, + do_rate_tests=do_rate_tests, + ) self.progress("Testing mount ROI behaviour") self.test_mount_pitch(0, 0.1, mavutil.mavlink.MAV_MOUNT_MODE_RC_TARGETING) @@ -5641,27 +5645,65 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): 0, # vz 0 # heading ) - self.test_mount_pitch(68, 5, mavutil.mavlink.MAV_MOUNT_MODE_SYSID_TARGET, hold=2) + self.test_mount_pitch( + 68, + 5, + mavutil.mavlink.MAV_MOUNT_MODE_SYSID_TARGET, + hold=2, + constrained=constrain_sysid_target, + ) self.set_mount_mode(mavutil.mavlink.MAV_MOUNT_MODE_NEUTRAL) self.test_mount_pitch(0, 0.1, mavutil.mavlink.MAV_MOUNT_MODE_NEUTRAL) - except Exception as e: - self.print_exception_caught(e) - ex = e + self.disarm_vehicle(force=True) - self.context_pop() + self.test_mount_body_yaw() - self.mav.mav.srcSystem = old_srcSystem - self.disarm_vehicle(force=True) - self.reboot_sitl() # to handle MNT1_TYPE changing + def test_mount_body_yaw(self): + '''check reporting of yaw''' + # change mount to neutral mode (point forward, not stabilising) + self.takeoff(10, mode='GUIDED') - if ex is not None: - raise ex + self.set_mount_mode(mavutil.mavlink.MAV_MOUNT_MODE_NEUTRAL) + + for heading in 30, 45, 150: + self.guided_achieve_heading(heading) + + r, p , y, yaw_is_absolute = self.get_mount_roll_pitch_yaw_deg() + + if yaw_is_absolute: + raise NotAchievedException("Expected a relative yaw") + + if y > 1: + raise NotAchievedException("Bad yaw (y=%f)") + + self.do_RTL() + + def Mount(self): + '''test servo mount''' + self.setup_servo_mount() + self.reboot_sitl() # to handle MNT_TYPE changing + self.mount_test_body() + + def MountSolo(self): + '''test type=2, a "Solo" mount''' + self.set_parameters({ + "MNT1_TYPE": 2, + "RC6_OPTION": 213, # MOUNT1_PITCH + }) + self.customise_SITL_commandline([ + "--gimbal" # connects on port 5762 + ]) + self.mount_test_body( + pitch_rc_neutral=1818, + do_rate_tests=False, # solo can't do rate control (yet?) + constrain_sysid_target=False, # not everything constrains all angles + ) def assert_mount_rpy(self, r, p, y, tolerance=1): '''assert mount atttiude in degrees''' - got_r, got_p, got_y = self.get_mount_roll_pitch_yaw_deg() + got_r, got_p, got_y, yaw_is_absolute = self.get_mount_roll_pitch_yaw_deg() for (want, got, name) in (r, got_r, "roll"), (p, got_p, "pitch"), (y, got_y, "yaw"): if abs(want - got) > tolerance: raise NotAchievedException("%s incorrect; want=%f got=%f" % @@ -6270,90 +6312,60 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): def PIDNotches(self): """Use dynamic harmonic notch to control motor noise.""" self.progress("Flying with PID notches") - self.context_push() + self.set_parameters({ + "FILT1_TYPE": 1, + "AHRS_EKF_TYPE": 10, + "INS_LOG_BAT_MASK": 3, + "INS_LOG_BAT_OPT": 0, + "INS_GYRO_FILTER": 100, # set the gyro filter high so we can observe behaviour + "LOG_BITMASK": 65535, + "LOG_DISARMED": 0, + "SIM_VIB_FREQ_X": 120, # roll + "SIM_VIB_FREQ_Y": 120, # pitch + "SIM_VIB_FREQ_Z": 180, # yaw + "FILT1_NOTCH_FREQ": 120, + "ATC_RAT_RLL_NEF": 1, + "ATC_RAT_PIT_NEF": 1, + "ATC_RAT_YAW_NEF": 1, + "SIM_GYR1_RND": 5, + }) + self.reboot_sitl() - ex = None - try: - self.set_parameters({ - "FILT1_TYPE": 1, - "AHRS_EKF_TYPE": 10, - "INS_LOG_BAT_MASK": 3, - "INS_LOG_BAT_OPT": 0, - "INS_GYRO_FILTER": 100, # set the gyro filter high so we can observe behaviour - "LOG_BITMASK": 65535, - "LOG_DISARMED": 0, - "SIM_VIB_FREQ_X": 120, # roll - "SIM_VIB_FREQ_Y": 120, # pitch - "SIM_VIB_FREQ_Z": 180, # yaw - "FILT1_NOTCH_FREQ": 120, - "ATC_RAT_RLL_NEF": 1, - "ATC_RAT_PIT_NEF": 1, - "ATC_RAT_YAW_NEF": 1, - "SIM_GYR1_RND": 5, - }) - self.reboot_sitl() - - self.takeoff(10, mode="ALT_HOLD") - - freq, hover_throttle, peakdb1 = self.hover_and_check_matched_frequency_with_fft(5, 20, 350, reverse=True) - - except Exception as e: - self.print_exception_caught(e) - ex = e - - self.context_pop() - - if ex is not None: - raise ex + self.hover_and_check_matched_frequency_with_fft(dblevel=5, minhz=20, maxhz=350, reverse=True) def ThrottleGainBoost(self): """Use PD and Angle P boost for anti-gravity.""" # basic gyro sample rate test self.progress("Flying with Throttle-Gain Boost") - self.context_push() - ex = None - try: - # magic tridge EKF type that dramatically speeds up the test - self.set_parameters({ - "AHRS_EKF_TYPE": 10, - "EK2_ENABLE": 0, - "EK3_ENABLE": 0, - "INS_FAST_SAMPLE": 0, - "LOG_BITMASK": 959, - "LOG_DISARMED": 0, - "ATC_THR_G_BOOST": 5.0, - }) + # magic tridge EKF type that dramatically speeds up the test + self.set_parameters({ + "AHRS_EKF_TYPE": 10, + "EK2_ENABLE": 0, + "EK3_ENABLE": 0, + "INS_FAST_SAMPLE": 0, + "LOG_BITMASK": 959, + "LOG_DISARMED": 0, + "ATC_THR_G_BOOST": 5.0, + }) - self.reboot_sitl() - - self.takeoff(10, mode="ALT_HOLD") - hover_time = 15 - self.progress("Hovering for %u seconds" % hover_time) - tstart = self.get_sim_time() - while self.get_sim_time_cached() < tstart + hover_time: - self.mav.recv_match(type='ATTITUDE', blocking=True) - - # fly fast forrest! - self.set_rc(3, 1900) - self.set_rc(2, 1200) - self.wait_groundspeed(5, 1000) - self.set_rc(3, 1500) - self.set_rc(2, 1500) - - self.do_RTL() - - except Exception as e: - self.print_exception_caught(e) - ex = e - - self.context_pop() - - # must reboot after we move away from EKF type 10 to EKF2 or EKF3 self.reboot_sitl() - if ex is not None: - raise ex + self.takeoff(10, mode="ALT_HOLD") + hover_time = 15 + self.progress("Hovering for %u seconds" % hover_time) + tstart = self.get_sim_time() + while self.get_sim_time_cached() < tstart + hover_time: + self.assert_receive_message('ATTITUDE') + + # fly fast forrest! + self.set_rc(3, 1900) + self.set_rc(2, 1200) + self.wait_groundspeed(5, 1000) + self.set_rc(3, 1500) + self.set_rc(2, 1500) + + self.do_RTL() def test_gyro_fft_harmonic(self, averaging): """Use dynamic harmonic notch to control motor noise with harmonic matching of the first harmonic.""" @@ -7117,55 +7129,41 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): def PrecisionLoiterCompanion(self): """Use Companion PrecLand backend precision messages to loiter.""" - self.context_push() - - ex = None - try: - self.set_parameters({ - "PLND_ENABLED": 1, - "PLND_TYPE": 1, # enable companion backend: - "RC7_OPTION": 39, # set up a channel switch to enable precision loiter: - }) - self.set_analog_rangefinder_parameters() - self.reboot_sitl() - - self.progress("Waiting for location") - self.change_mode('LOITER') - self.wait_ready_to_arm() - - # we should be doing precision loiter at this point - start = self.assert_receive_message('LOCAL_POSITION_NED') - - self.takeoff(20, mode='ALT_HOLD') - - # move away a little - self.set_rc(2, 1550) - self.wait_distance(5, accuracy=1) - self.set_rc(2, 1500) - self.change_mode('LOITER') - - # turn precision loiter on: - self.context_collect('STATUSTEXT') - self.set_rc(7, 2000) - - # try to drag aircraft to a position 5 metres north-east-east: - self.precision_loiter_to_pos(start.x + 5, start.y + 10, start.z + 10) - self.wait_statustext("PrecLand: Target Found", check_context=True, timeout=10) - self.wait_statustext("PrecLand: Init Complete", check_context=True, timeout=10) - # .... then northwest - self.precision_loiter_to_pos(start.x + 5, start.y - 10, start.z + 10) - - except Exception as e: - self.print_exception_caught(e) - ex = e - - self.context_pop() - self.disarm_vehicle(force=True) + self.set_parameters({ + "PLND_ENABLED": 1, + "PLND_TYPE": 1, # enable companion backend: + "RC7_OPTION": 39, # set up a channel switch to enable precision loiter: + }) + self.set_analog_rangefinder_parameters() self.reboot_sitl() - self.progress("All done") - if ex is not None: - raise ex + self.progress("Waiting for location") + self.change_mode('LOITER') + self.wait_ready_to_arm() + + # we should be doing precision loiter at this point + start = self.assert_receive_message('LOCAL_POSITION_NED') + + self.takeoff(20, mode='ALT_HOLD') + + # move away a little + self.set_rc(2, 1550) + self.wait_distance(5, accuracy=1) + self.set_rc(2, 1500) + self.change_mode('LOITER') + + # turn precision loiter on: + self.context_collect('STATUSTEXT') + self.set_rc(7, 2000) + + # try to drag aircraft to a position 5 metres north-east-east: + self.precision_loiter_to_pos(start.x + 5, start.y + 10, start.z + 10) + self.wait_statustext("PrecLand: Target Found", check_context=True, timeout=10) + self.wait_statustext("PrecLand: Init Complete", check_context=True, timeout=10) + # .... then northwest + self.precision_loiter_to_pos(start.x + 5, start.y - 10, start.z + 10) + + self.disarm_vehicle(force=True) def loiter_requires_position(self): # ensure we can't switch to LOITER without position @@ -7425,9 +7423,9 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.assert_current_onboard_log_contains_message("PRX") self.assert_current_onboard_log_contains_message("PRXR") - self.context_pop() - self.disarm_vehicle(force=True) + + self.context_pop() self.reboot_sitl() def ProximitySensors(self): @@ -7577,8 +7575,8 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.progress("Caught exception: %s" % self.get_exception_stacktrace(e)) ex = e - self.context_pop() self.disarm_vehicle(force=True) + self.context_pop() self.reboot_sitl() if ex is not None: raise ex @@ -7589,6 +7587,54 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.set_parameter("FENCE_ENABLE", 1) self.check_avoidance_corners() + def AvoidanceAltFence(self): + '''Test fence avoidance at minimum and maximum altitude''' + ex = None + try: + self.set_parameters({ + "FENCE_ENABLE": 1, + "FENCE_TYPE": 9, # min and max alt fence + "FENCE_ALT_MIN": 10, + "FENCE_ALT_MAX": 30, + }) + + self.change_mode('LOITER') + self.wait_ekf_happy() + + tstart = self.get_sim_time() + self.takeoff(15, mode='LOITER') + self.progress("Increasing throttle, vehicle should stay below 30m") + self.set_rc(3, 1920) + + tstart = self.get_sim_time() + while True: + if self.get_sim_time_cached() - tstart > 20: + break + alt = self.get_altitude(relative=True) + self.progress("Altitude %s" % alt) + if alt > 30: + raise NotAchievedException("Breached maximum altitude (%s)" % (str(alt),)) + + self.progress("Decreasing, vehicle should stay above 10m") + self.set_rc(3, 1080) + tstart = self.get_sim_time() + while True: + if self.get_sim_time_cached() - tstart > 20: + break + alt = self.get_altitude(relative=True) + self.progress("Altitude %s" % alt) + if alt < 10: + raise NotAchievedException("Breached minimum altitude (%s)" % (str(alt),)) + + except Exception as e: + self.progress("Caught exception: %s" % + self.get_exception_stacktrace(e)) + ex = e + self.land_and_disarm() + self.disarm_vehicle(force=True) + if ex is not None: + raise ex + def ModeFollow(self): '''Fly follow mode''' foll_ofs_x = 30 # metres @@ -7672,87 +7718,69 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): old_pos = self.get_global_position_int() print("old_pos=%s" % str(old_pos)) + self.set_parameters({ + "BCN_TYPE": 10, + "BCN_LATITUDE": SITL_START_LOCATION.lat, + "BCN_LONGITUDE": SITL_START_LOCATION.lng, + "BCN_ALT": SITL_START_LOCATION.alt, + "BCN_ORIENT_YAW": 0, + "AVOID_ENABLE": 4, + "GPS1_TYPE": 0, + "EK3_ENABLE": 1, + "EK3_SRC1_POSXY": 4, # Beacon + "EK3_SRC1_POSZ": 1, # Baro + "EK3_SRC1_VELXY": 0, # None + "EK3_SRC1_VELZ": 0, # None + "EK2_ENABLE": 0, + "AHRS_EKF_TYPE": 3, + }) + self.reboot_sitl() + + # turn off GPS arming checks. This may be considered a + # bug that we need to do this. + old_arming_check = int(self.get_parameter("ARMING_CHECK")) + if old_arming_check == 1: + old_arming_check = 1 ^ 25 - 1 + new_arming_check = int(old_arming_check) & ~(1 << 3) + self.set_parameter("ARMING_CHECK", new_arming_check) + + self.reboot_sitl() + + # require_absolute=True infers a GPS is present + self.wait_ready_to_arm(require_absolute=False) + + tstart = self.get_sim_time() + timeout = 20 + while True: + if self.get_sim_time_cached() - tstart > timeout: + raise NotAchievedException("Did not get new position like old position") + self.progress("Fetching location") + new_pos = self.get_global_position_int() + pos_delta = self.get_distance_int(old_pos, new_pos) + max_delta = 1 + self.progress("delta=%u want <= %u" % (pos_delta, max_delta)) + if pos_delta <= max_delta: + break + + self.progress("Moving to ensure location is tracked") + self.takeoff(10, mode="STABILIZE") + self.change_mode("CIRCLE") + self.context_push() - ex = None - try: - self.set_parameters({ - "BCN_TYPE": 10, - "BCN_LATITUDE": SITL_START_LOCATION.lat, - "BCN_LONGITUDE": SITL_START_LOCATION.lng, - "BCN_ALT": SITL_START_LOCATION.alt, - "BCN_ORIENT_YAW": 0, - "AVOID_ENABLE": 4, - "GPS1_TYPE": 0, - "EK3_ENABLE": 1, - "EK3_SRC1_POSXY": 4, # Beacon - "EK3_SRC1_POSZ": 1, # Baro - "EK3_SRC1_VELXY": 0, # None - "EK3_SRC1_VELZ": 0, # None - "EK2_ENABLE": 0, - "AHRS_EKF_TYPE": 3, - }) - self.reboot_sitl() + validator = vehicle_test_suite.TestSuite.ValidateGlobalPositionIntAgainstSimState(self, max_allowed_divergence=10) + self.install_message_hook_context(validator) - # turn off GPS arming checks. This may be considered a - # bug that we need to do this. - old_arming_check = int(self.get_parameter("ARMING_CHECK")) - if old_arming_check == 1: - old_arming_check = 1 ^ 25 - 1 - new_arming_check = int(old_arming_check) & ~(1 << 3) - self.set_parameter("ARMING_CHECK", new_arming_check) - - self.reboot_sitl() - - # require_absolute=True infers a GPS is present - self.wait_ready_to_arm(require_absolute=False) - - tstart = self.get_sim_time() - timeout = 20 - while True: - if self.get_sim_time_cached() - tstart > timeout: - raise NotAchievedException("Did not get new position like old position") - self.progress("Fetching location") - new_pos = self.get_global_position_int() - pos_delta = self.get_distance_int(old_pos, new_pos) - max_delta = 1 - self.progress("delta=%u want <= %u" % (pos_delta, max_delta)) - if pos_delta <= max_delta: - break - - self.progress("Moving to ensure location is tracked") - self.takeoff(10, mode="STABILIZE") - self.change_mode("CIRCLE") - - tstart = self.get_sim_time() - max_delta = 0 - max_allowed_delta = 10 - while True: - if self.get_sim_time_cached() - tstart > timeout: - break - - pos_delta = self.get_distance_int(self.sim_location_int(), self.get_global_position_int()) - self.progress("pos_delta=%f max_delta=%f max_allowed_delta=%f" % (pos_delta, max_delta, max_allowed_delta)) - if pos_delta > max_delta: - max_delta = pos_delta - if pos_delta > max_allowed_delta: - raise NotAchievedException("Vehicle location not tracking simulated location (%f > %f)" % - (pos_delta, max_allowed_delta)) - self.progress("Tracked location just fine (max_delta=%f)" % max_delta) - self.change_mode("LOITER") - self.wait_groundspeed(0, 0.3, timeout=120) - self.land_and_disarm() - - self.assert_current_onboard_log_contains_message("BCN") - - except Exception as e: - self.print_exception_caught(e) - ex = e - self.disarm_vehicle(force=True) - self.reboot_sitl() + self.delay_sim_time(20) + self.progress("Tracked location just fine") self.context_pop() - self.reboot_sitl() - if ex is not None: - raise ex + + self.change_mode("LOITER") + self.wait_groundspeed(0, 0.3, timeout=120) + self.land_and_disarm() + + self.assert_current_onboard_log_contains_message("BCN") + + self.disarm_vehicle(force=True) def AC_Avoidance_Beacon(self): '''Test beacon avoidance slide behaviour''' @@ -9235,17 +9263,12 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): (current_log_filepath, os.path.getsize(current_log_filepath)) )) - util.run_cmd( - ['build/sitl/tool/Replay', current_log_filepath], - directory=util.topdir(), - checkfail=True, - show=True, - output=True, - ) + self.run_replay(current_log_filepath) + + replay_log_filepath = self.current_onboard_log_filepath() self.context_pop() - replay_log_filepath = self.current_onboard_log_filepath() self.progress("Replay log path: %s" % str(replay_log_filepath)) check_replay = util.load_local_module("Tools/Replay/check_replay.py") @@ -9675,6 +9698,23 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): if ex is not None: raise ex + def SMART_RTL_EnterLeave(self): + '''check SmartRTL behaviour when entering/leaving''' + # we had a bug where we would consume points when re-entering smartrtl + + self.upload_simple_relhome_mission([ + # N E U + (mavutil.mavlink.MAV_CMD_NAV_TAKEOFF, 0, 0, 10), + (mavutil.mavlink.MAV_CMD_NAV_RETURN_TO_LAUNCH, 0, 0, 0), + ]) + self.set_parameter('AUTO_OPTIONS', 3) + self.change_mode('AUTO') + self.wait_ready_to_arm() + self.change_mode('ALT_HOLD') + self.change_mode('SMART_RTL') + self.change_mode('ALT_HOLD') + self.change_mode('SMART_RTL') + def GPSForYawCompassLearn(self): '''Moving baseline GPS yaw - with compass learning''' self.context_push() @@ -10414,9 +10454,10 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.wait_servo_channel_value(pump_ch, pump_ch_min) + self.disarm_vehicle(force=True) + self.context_pop() - self.disarm_vehicle(force=True) self.reboot_sitl() self.progress("Sprayer OK") @@ -10462,6 +10503,7 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): '''return list of all tests''' ret = ([ self.BatteryFailsafe, + self.BatteryMissing, self.VibrationFailsafe, self.EK3AccelBias, self.StabilityPatch, @@ -10470,6 +10512,7 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.AC_Avoidance_Proximity_AVOID_ALT_MIN, self.AC_Avoidance_Fence, self.AC_Avoidance_Beacon, + self.AvoidanceAltFence, self.BaroWindCorrection, self.SetpointGlobalPos, self.ThrowDoubleDrop, @@ -10488,7 +10531,10 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.MaxAltFence, self.MaxAltFenceAvoid, self.MinAltFence, + self.MinAltFenceAvoid, self.FenceFloorEnabledLanding, + self.FenceFloorAutoDisableLanding, + self.FenceFloorAutoEnableOnArming, self.AutoTuneSwitch, self.GPSGlitchLoiter, self.GPSGlitchLoiter2, @@ -11071,6 +11117,7 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): def Ch6TuningWPSpeed(self): '''test waypoint speed can be changed via Ch6 tuning knob''' self.set_parameters({ + "RC6_OPTION": 219, # RC6 used for tuning "TUNE": 10, # 10 is waypoint speed "TUNE_MIN": 0.02, # 20cm/s "TUNE_MAX": 1000, # 10m/s @@ -11360,7 +11407,10 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.delay_sim_time(1500) + self.disarm_vehicle(force=True) + self.context_pop() + self.reboot_sitl(force=True) def GuidedForceArm(self): @@ -11426,6 +11476,8 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.delay_sim_time(1500) + self.disarm_vehicle(force=True) + self.context_pop() self.reboot_sitl(force=True) @@ -11487,7 +11539,7 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): here = self.mav.location() loc = self.offset_location_ne(here, 10, 0) self.takeoff(5, mode='GUIDED') - self.do_reposition(loc, frame=mavutil.mavlink.MAV_FRAME_GLOBAL) + self.send_do_reposition(loc, frame=mavutil.mavlink.MAV_FRAME_GLOBAL) self.wait_location(loc, timeout=120) self.land_and_disarm() @@ -11523,6 +11575,8 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.reboot_sitl() self.takeoff(30, mode='LOITER') + self.context_push() + self.context_collect('STATUSTEXT') self.set_parameters({ "SIM_ENGINE_FAIL": 1, "SIM_ENGINE_MUL": 0.5, @@ -11530,11 +11584,151 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): }) self.wait_statustext("Gripper Load Released", timeout=60) - self.context_pop() + self.do_RTL() + self.context_pop() self.reboot_sitl() + def assert_home_position_not_set(self): + try: + self.poll_home_position() + except NotAchievedException: + return + + # if home.lng != 0: etc + + raise NotAchievedException("Home is set when it shouldn't be") + + def REQUIRE_POSITION_FOR_ARMING(self): + '''check FlightOption::REQUIRE_POSITION_FOR_ARMING works''' + self.context_push() + self.set_parameters({ + "SIM_GPS_NUMSATS": 3, # EKF does not like < 6 + }) + self.reboot_sitl() + self.change_mode('STABILIZE') + self.wait_prearm_sys_status_healthy() + self.assert_home_position_not_set() + self.arm_vehicle() + self.disarm_vehicle() + self.change_mode('LOITER') + self.assert_prearm_failure("waiting for home", other_prearm_failures_fatal=False) + + self.change_mode('STABILIZE') + self.set_parameters({ + "FLIGHT_OPTIONS": 8, + }) + self.assert_prearm_failure("Need Position Estimate", other_prearm_failures_fatal=False) + self.context_pop() + self.reboot_sitl() + + def AutoContinueOnRCFailsafe(self): + '''check LOITER when entered after RC failsafe is ignored in auto''' + self.set_parameters({ + "FS_OPTIONS": 1, # 1 is "RC continue if in auto" + }) + + self.upload_simple_relhome_mission([ + # N E U + (mavutil.mavlink.MAV_CMD_NAV_TAKEOFF, 0, 0, 10), + (mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 20, 0, 10), + (mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 40, 0, 10), + (mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 60, 0, 10), + ]) + + self.takeoff(mode='LOITER') + self.set_rc(1, 1200) + self.delay_sim_time(1) # build up some pilot desired stuff + self.change_mode('AUTO') + self.wait_waypoint(2, 2) + self.set_parameters({ + 'SIM_RC_FAIL': 1, + }) +# self.set_rc(1, 1500) # note we are still in RC fail! + self.wait_waypoint(3, 3) + self.assert_mode_is('AUTO') + self.change_mode('LOITER') + self.wait_groundspeed(0, 0.1, minimum_duration=30, timeout=450) + self.do_RTL() + + def MissionRTLYawBehaviour(self): + '''check end-of-mission yaw behaviour''' + self.set_parameters({ + "AUTO_OPTIONS": 3, + }) + + self.start_subtest("behaviour with WP_YAW_BEHAVE set to next-waypoint-except-RTL") + self.upload_simple_relhome_mission([ + # N E U + (mavutil.mavlink.MAV_CMD_NAV_TAKEOFF, 0, 0, 10), + (mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 20, 0, 10), + (mavutil.mavlink.MAV_CMD_NAV_RETURN_TO_LAUNCH, 0, 0, 0), + ]) + self.change_mode('AUTO') + self.wait_ready_to_arm() + original_heading = self.get_heading() + if abs(original_heading) < 5: + raise NotAchievedException(f"Bad original heading {original_heading}") + self.arm_vehicle() + self.wait_current_waypoint(3) + self.wait_rtl_complete() + self.wait_disarmed() + if abs(self.get_heading()) > 5: + raise NotAchievedException("Should have yaw zero without option") + + # must change out of auto and back in again to reset state machine: + self.change_mode('LOITER') + self.change_mode('AUTO') + + self.start_subtest("behaviour with WP_YAW_BEHAVE set to next-waypoint") + self.upload_simple_relhome_mission([ + # N E U + (mavutil.mavlink.MAV_CMD_NAV_TAKEOFF, 0, 0, 10), + (mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 20, 20), + (mavutil.mavlink.MAV_CMD_NAV_RETURN_TO_LAUNCH, 0, 0, 0), + ]) + self.set_parameters({ + "WP_YAW_BEHAVIOR": 1, # look at next waypoint (including in RTL) + }) + self.change_mode('AUTO') + self.wait_ready_to_arm() + original_heading = self.get_heading() + if abs(original_heading) > 1: + raise NotAchievedException("Bad original heading") + self.arm_vehicle() + self.wait_current_waypoint(3) + self.wait_rtl_complete() + self.wait_disarmed() + new_heading = self.get_heading() + if abs(new_heading - original_heading) > 5: + raise NotAchievedException(f"Should return to original heading want={original_heading} got={new_heading}") + + def BatteryInternalUseOnly(self): + '''batteries marked as internal use only should not appear over mavlink''' + self.set_parameters({ + "BATT_MONITOR": 4, # 4 is analog volt+curr + "BATT2_MONITOR": 4, + }) + self.reboot_sitl() + self.wait_message_field_values('BATTERY_STATUS', { + "id": 0, + }) + self.wait_message_field_values('BATTERY_STATUS', { + "id": 1, + }) + self.progress("Making battery private") + self.set_parameters({ + "BATT_OPTIONS": 256, + }) + self.wait_message_field_values('BATTERY_STATUS', { + "id": 1, + }) + for i in range(10): + self.assert_received_message_field_values('BATTERY_STATUS', { + "id": 1 + }) + def tests2b(self): # this block currently around 9.5mins here '''return list of all tests''' ret = ([ @@ -11559,6 +11753,7 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.GSF_reset, self.AP_Avoidance, self.SMART_RTL, + self.SMART_RTL_EnterLeave, self.RTL_TO_RALLY, self.FlyEachFrame, self.GPSBlending, @@ -11588,16 +11783,19 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.WatchAlts, self.GuidedEKFLaneChange, self.Sprayer, + self.AutoContinueOnRCFailsafe, self.EK3_RNG_USE_HGT, self.TerrainDBPreArm, self.ThrottleGainBoost, self.ScriptMountPOI, + self.MountSolo, self.FlyMissionTwice, self.FlyMissionTwiceWithReset, self.MissionIndexValidity, self.InvalidJumpTags, self.IMUConsistency, self.AHRSTrimLand, + self.IBus, self.GuidedYawRate, self.NoArmWithoutMissionItems, self.DO_CHANGE_SPEED_in_guided, @@ -11626,6 +11824,10 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): self.GuidedWeatherVane, self.Clamp, self.GripperReleaseOnThrustLoss, + self.REQUIRE_POSITION_FOR_ARMING, + self.LoggingFormat, + self.MissionRTLYawBehaviour, + self.BatteryInternalUseOnly, ]) return ret @@ -11701,13 +11903,13 @@ class AutoTestCopter(vehicle_test_suite.TestSuite): def disabled_tests(self): return { "Parachute": "See https://github.com/ArduPilot/ardupilot/issues/4702", - "HorizontalAvoidFence": "See https://github.com/ArduPilot/ardupilot/issues/11525", "AltEstimation": "See https://github.com/ArduPilot/ardupilot/issues/15191", "GroundEffectCompensation_takeOffExpected": "Flapping", "GroundEffectCompensation_touchDownExpected": "Flapping", "FlyMissionTwice": "See https://github.com/ArduPilot/ardupilot/pull/18561", "GPSForYawCompassLearn": "Vehicle currently crashed in spectacular fashion", "CompassMot": "Cuases an arithmetic exception in the EKF", + "SMART_RTL_EnterLeave": "Causes a panic", } diff --git a/Tools/autotest/arduplane.py b/Tools/autotest/arduplane.py index 4eadb92c2f..3ca7780e5f 100644 --- a/Tools/autotest/arduplane.py +++ b/Tools/autotest/arduplane.py @@ -8,7 +8,6 @@ from __future__ import print_function import math import os import signal -import time from pymavlink import quaternion from pymavlink import mavutil @@ -174,7 +173,7 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): def fly_RTL(self): """Fly to home.""" self.progress("Flying home in RTL") - target_loc = self.homeloc + target_loc = self.home_position_as_mav_location() target_loc.alt += 100 self.change_mode('RTL') self.wait_location(target_loc, @@ -276,8 +275,10 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): return raise NotAchievedException("Failed to attain level flight") - def change_altitude(self, altitude, accuracy=30): + def change_altitude(self, altitude, accuracy=30, relative=False): """Get to a given altitude.""" + if relative: + altitude += self.home_position_as_mav_location().alt self.change_mode('FBWA') alt_error = self.mav.messages['VFR_HUD'].alt - altitude if alt_error > 0: @@ -294,7 +295,7 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): """Fly a left axial roll.""" # full throttle! self.set_rc(3, 2000) - self.change_altitude(self.homeloc.alt+300) + self.change_altitude(300, relative=True) # fly the roll in manual self.change_mode('MANUAL') @@ -321,7 +322,7 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): """Fly a inside loop.""" # full throttle! self.set_rc(3, 2000) - self.change_altitude(self.homeloc.alt+300) + self.change_altitude(300, relative=True) # fly the loop in manual self.change_mode('MANUAL') @@ -433,7 +434,7 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): # full throttle! self.set_rc(3, 2000) self.set_rc(2, 1300) - self.change_altitude(self.homeloc.alt+300) + self.change_altitude(300, relative=True) self.set_rc(2, 1500) self.change_mode('STABILIZE') @@ -459,7 +460,7 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): # full throttle! self.set_rc(3, 2000) self.set_rc(2, 1300) - self.change_altitude(self.homeloc.alt+300) + self.change_altitude(300, relative=True) self.set_rc(2, 1500) self.change_mode('ACRO') @@ -1032,95 +1033,61 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): def TestFlaps(self): """Test flaps functionality.""" filename = "flaps.txt" - self.context_push() - ex = None - try: + flaps_ch = 5 + flaps_ch_min = 1000 + flaps_ch_trim = 1500 + flaps_ch_max = 2000 - flaps_ch = 5 - flaps_ch_min = 1000 - flaps_ch_trim = 1500 - flaps_ch_max = 2000 + servo_ch = 5 + servo_ch_min = 1200 + servo_ch_trim = 1300 + servo_ch_max = 1800 - servo_ch = 5 - servo_ch_min = 1200 - servo_ch_trim = 1300 - servo_ch_max = 1800 + self.set_parameters({ + "SERVO%u_FUNCTION" % servo_ch: 3, # flapsauto + "RC%u_OPTION" % flaps_ch: 208, # Flaps RCx_OPTION + "LAND_FLAP_PERCNT": 50, + "LOG_DISARMED": 1, + "RTL_AUTOLAND": 1, - self.set_parameters({ - "SERVO%u_FUNCTION" % servo_ch: 3, # flapsauto - "RC%u_OPTION" % flaps_ch: 208, # Flaps RCx_OPTION - "LAND_FLAP_PERCNT": 50, - "LOG_DISARMED": 1, - "RTL_AUTOLAND": 1, + "RC%u_MIN" % flaps_ch: flaps_ch_min, + "RC%u_MAX" % flaps_ch: flaps_ch_max, + "RC%u_TRIM" % flaps_ch: flaps_ch_trim, - "RC%u_MIN" % flaps_ch: flaps_ch_min, - "RC%u_MAX" % flaps_ch: flaps_ch_max, - "RC%u_TRIM" % flaps_ch: flaps_ch_trim, + "SERVO%u_MIN" % servo_ch: servo_ch_min, + "SERVO%u_MAX" % servo_ch: servo_ch_max, + "SERVO%u_TRIM" % servo_ch: servo_ch_trim, + }) - "SERVO%u_MIN" % servo_ch: servo_ch_min, - "SERVO%u_MAX" % servo_ch: servo_ch_max, - "SERVO%u_TRIM" % servo_ch: servo_ch_trim, - }) + self.progress("check flaps are not deployed") + self.set_rc(flaps_ch, flaps_ch_min) + self.wait_servo_channel_value(servo_ch, servo_ch_min, timeout=3) + self.progress("deploy the flaps") + self.set_rc(flaps_ch, flaps_ch_max) + tstart = self.get_sim_time() + self.wait_servo_channel_value(servo_ch, servo_ch_max) + tstop = self.get_sim_time_cached() + delta_time = tstop - tstart + delta_time_min = 0.5 + delta_time_max = 1.5 + if delta_time < delta_time_min or delta_time > delta_time_max: + raise NotAchievedException(( + "Flaps Slew not working (%f seconds)" % (delta_time,))) + self.progress("undeploy flaps") + self.set_rc(flaps_ch, flaps_ch_min) + self.wait_servo_channel_value(servo_ch, servo_ch_min) - self.progress("check flaps are not deployed") - self.set_rc(flaps_ch, flaps_ch_min) - self.wait_servo_channel_value(servo_ch, servo_ch_min, timeout=3) - self.progress("deploy the flaps") - self.set_rc(flaps_ch, flaps_ch_max) - tstart = self.get_sim_time() - self.wait_servo_channel_value(servo_ch, servo_ch_max) - tstop = self.get_sim_time_cached() - delta_time = tstop - tstart - delta_time_min = 0.5 - delta_time_max = 1.5 - if delta_time < delta_time_min or delta_time > delta_time_max: - raise NotAchievedException(( - "Flaps Slew not working (%f seconds)" % (delta_time,))) - self.progress("undeploy flaps") - self.set_rc(flaps_ch, flaps_ch_min) - self.wait_servo_channel_value(servo_ch, servo_ch_min) + self.progress("Flying mission %s" % filename) + self.load_mission(filename) + self.change_mode('AUTO') + self.wait_ready_to_arm() + self.arm_vehicle() + # flaps should deploy for landing (RC input value used for position?!) + self.wait_servo_channel_value(servo_ch, flaps_ch_trim, timeout=300) + # flaps should undeploy at the end + self.wait_servo_channel_value(servo_ch, servo_ch_min, timeout=30) - self.progress("Flying mission %s" % filename) - self.load_mission(filename) - self.set_current_waypoint(1) - self.change_mode('AUTO') - self.wait_ready_to_arm() - self.arm_vehicle() - last_mission_current_msg = 0 - last_seq = None - while self.armed(): - m = self.mav.recv_match(type='MISSION_CURRENT', blocking=True) - time_delta = (self.get_sim_time_cached() - - last_mission_current_msg) - if (time_delta > 1 or m.seq != last_seq): - dist = None - x = self.mav.messages.get("NAV_CONTROLLER_OUTPUT", None) - if x is not None: - dist = x.wp_dist - self.progress("MISSION_CURRENT.seq=%u (dist=%s)" % - (m.seq, str(dist))) - last_mission_current_msg = self.get_sim_time_cached() - last_seq = m.seq - # flaps should undeploy at the end - self.wait_servo_channel_value(servo_ch, servo_ch_min, timeout=30) - - # do a short flight in FBWA, watching for flaps - # self.mavproxy.send('switch 4\n') - # self.wait_mode('FBWA') - # self.delay_sim_time(10) - # self.mavproxy.send('switch 6\n') - # self.wait_mode('MANUAL') - # self.delay_sim_time(10) - - self.progress("Flaps OK") - except Exception as e: - self.print_exception_caught(e) - ex = e - self.context_pop() - if ex: - if self.armed(): - self.disarm_vehicle() - raise ex + self.progress("Flaps OK") def TestRCRelay(self): '''Test Relay RC Channel Option''' @@ -1285,32 +1252,25 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): self.progress("Ensure long failsafe can trigger when short failsafe disabled") self.context_push() self.context_collect("STATUSTEXT") - ex = None - try: - self.set_parameters({ - "FS_SHORT_ACTN": 3, # 3 means disabled - "SIM_RC_FAIL": 1, - }) - self.wait_statustext("Long failsafe on", check_context=True) - self.wait_mode("RTL") + self.set_parameters({ + "FS_SHORT_ACTN": 3, # 3 means disabled + "SIM_RC_FAIL": 1, + }) + self.wait_statustext("Long failsafe on", check_context=True) + self.wait_mode("RTL") # self.context_clear_collection("STATUSTEXT") - self.set_parameter("SIM_RC_FAIL", 0) - self.wait_text("Long Failsafe Cleared", check_context=True) - self.change_mode("MANUAL") + self.set_parameter("SIM_RC_FAIL", 0) + self.wait_text("Long Failsafe Cleared", check_context=True) + self.change_mode("MANUAL") - self.progress("Trying again with THR_FS_VALUE") - self.set_parameters({ - "THR_FS_VALUE": 960, - "SIM_RC_FAIL": 2, - }) - self.wait_statustext("Long Failsafe on", check_context=True) - self.wait_mode("RTL") - except Exception as e: - self.print_exception_caught(e) - ex = e + self.progress("Trying again with THR_FS_VALUE") + self.set_parameters({ + "THR_FS_VALUE": 960, + "SIM_RC_FAIL": 2, + }) + self.wait_statustext("Long Failsafe on", check_context=True) + self.wait_mode("RTL") self.context_pop() - if ex is not None: - raise ex self.start_subtest("Not use RC throttle input when THR_FAILSAFE==2") self.takeoff(100) @@ -1433,24 +1393,15 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): def TestGripperMission(self): '''Test Gripper mission items''' - self.context_push() - ex = None - try: - self.set_parameter("RTL_AUTOLAND", 1) - self.load_mission("plane-gripper-mission.txt") - self.set_current_waypoint(1) - self.change_mode('AUTO') - self.wait_ready_to_arm() - self.arm_vehicle() - self.wait_statustext("Gripper Grabbed", timeout=60) - self.wait_statustext("Gripper Released", timeout=60) - self.wait_statustext("Auto disarmed", timeout=60) - except Exception as e: - self.print_exception_caught(e) - ex = e - self.context_pop() - if ex is not None: - raise ex + self.set_parameter("RTL_AUTOLAND", 1) + self.load_mission("plane-gripper-mission.txt") + self.set_current_waypoint(1) + self.change_mode('AUTO') + self.wait_ready_to_arm() + self.arm_vehicle() + self.wait_statustext("Gripper Grabbed", timeout=60) + self.wait_statustext("Gripper Released", timeout=60) + self.wait_statustext("Auto disarmed", timeout=60) def assert_fence_sys_status(self, present, enabled, health): self.delay_sim_time(1) @@ -1539,220 +1490,166 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): def FenceStatic(self): '''Test Basic Fence Functionality''' - ex = None - try: - self.progress("Checking for bizarre healthy-when-not-present-or-enabled") - self.set_parameter("FENCE_TYPE", 4) # Start by only setting polygon fences, otherwise fence will report present - self.assert_fence_sys_status(False, False, True) - self.load_fence("CMAC-fence.txt") - m = self.mav.recv_match(type='FENCE_STATUS', blocking=True, timeout=2) - if m is not None: - raise NotAchievedException("Got FENCE_STATUS unexpectedly") - self.set_parameter("FENCE_ACTION", 0) # report only - self.assert_fence_sys_status(True, False, True) - self.set_parameter("FENCE_ACTION", 1) # RTL - self.assert_fence_sys_status(True, False, True) - self.do_fence_enable() - self.assert_fence_sys_status(True, True, True) - m = self.assert_receive_message('FENCE_STATUS', timeout=2) - if m.breach_status: - raise NotAchievedException("Breached fence unexpectedly (%u)" % - (m.breach_status)) - self.do_fence_disable() - self.assert_fence_sys_status(True, False, True) - self.set_parameter("FENCE_ACTION", 1) - self.assert_fence_sys_status(True, False, True) - self.set_parameter("FENCE_ACTION", 0) - self.assert_fence_sys_status(True, False, True) - self.clear_fence() - if self.get_parameter("FENCE_TOTAL") != 0: - raise NotAchievedException("Expected zero points remaining") - self.assert_fence_sys_status(False, False, True) - self.progress("Trying to enable fence with no points") - self.do_fence_enable(want_result=mavutil.mavlink.MAV_RESULT_FAILED) + self.progress("Checking for bizarre healthy-when-not-present-or-enabled") + self.set_parameter("FENCE_TYPE", 4) # Start by only setting polygon fences, otherwise fence will report present + self.assert_fence_sys_status(False, False, True) + self.load_fence("CMAC-fence.txt") + m = self.mav.recv_match(type='FENCE_STATUS', blocking=True, timeout=2) + if m is not None: + raise NotAchievedException("Got FENCE_STATUS unexpectedly") + self.set_parameter("FENCE_ACTION", 0) # report only + self.assert_fence_sys_status(True, False, True) + self.set_parameter("FENCE_ACTION", 1) # RTL + self.assert_fence_sys_status(True, False, True) + self.do_fence_enable() + self.assert_fence_sys_status(True, True, True) + m = self.assert_receive_message('FENCE_STATUS', timeout=2) + if m.breach_status: + raise NotAchievedException("Breached fence unexpectedly (%u)" % + (m.breach_status)) + self.do_fence_disable() + self.assert_fence_sys_status(True, False, True) + self.set_parameter("FENCE_ACTION", 1) + self.assert_fence_sys_status(True, False, True) + self.set_parameter("FENCE_ACTION", 0) + self.assert_fence_sys_status(True, False, True) + self.clear_fence() + if self.get_parameter("FENCE_TOTAL") != 0: + raise NotAchievedException("Expected zero points remaining") + self.assert_fence_sys_status(False, False, True) + self.progress("Trying to enable fence with no points") + self.do_fence_enable(want_result=mavutil.mavlink.MAV_RESULT_FAILED) - # test a rather unfortunate behaviour: - self.progress("Killing a live fence with fence-clear") - self.load_fence("CMAC-fence.txt") - self.set_parameter("FENCE_ACTION", 1) # AC_FENCE_ACTION_RTL_AND_LAND == 1. mavutil.mavlink.FENCE_ACTION_RTL == 4 - self.do_fence_enable() - self.assert_fence_sys_status(True, True, True) - self.clear_fence() - self.wait_sensor_state(mavutil.mavlink.MAV_SYS_STATUS_GEOFENCE, False, False, True) - if self.get_parameter("FENCE_TOTAL") != 0: - raise NotAchievedException("Expected zero points remaining") - self.assert_fence_sys_status(False, False, True) - self.do_fence_disable() + # test a rather unfortunate behaviour: + self.progress("Killing a live fence with fence-clear") + self.load_fence("CMAC-fence.txt") + self.set_parameter("FENCE_ACTION", 1) # AC_FENCE_ACTION_RTL_AND_LAND == 1. mavutil.mavlink.FENCE_ACTION_RTL == 4 + self.do_fence_enable() + self.assert_fence_sys_status(True, True, True) + self.clear_fence() + self.wait_sensor_state(mavutil.mavlink.MAV_SYS_STATUS_GEOFENCE, False, False, True) + if self.get_parameter("FENCE_TOTAL") != 0: + raise NotAchievedException("Expected zero points remaining") + self.assert_fence_sys_status(False, False, True) + self.do_fence_disable() - # ensure that a fence is present if it is tin can, min alt or max alt - self.progress("Test other fence types (tin-can, min alt, max alt") - self.set_parameter("FENCE_TYPE", 1) # max alt - self.assert_fence_sys_status(True, False, True) - self.set_parameter("FENCE_TYPE", 8) # min alt - self.assert_fence_sys_status(True, False, True) - self.set_parameter("FENCE_TYPE", 2) # tin can - self.assert_fence_sys_status(True, False, True) + # ensure that a fence is present if it is tin can, min alt or max alt + self.progress("Test other fence types (tin-can, min alt, max alt") + self.set_parameter("FENCE_TYPE", 1) # max alt + self.assert_fence_sys_status(True, False, True) + self.set_parameter("FENCE_TYPE", 8) # min alt + self.assert_fence_sys_status(True, False, True) + self.set_parameter("FENCE_TYPE", 2) # tin can + self.assert_fence_sys_status(True, False, True) - # Test cannot arm if outside of fence and fence is enabled - self.progress("Test Arming while vehicle below FENCE_ALT_MIN") - default_fence_alt_min = self.get_parameter("FENCE_ALT_MIN") - self.set_parameter("FENCE_ALT_MIN", 50) - self.set_parameter("FENCE_TYPE", 8) # Enables minimum altitude breaches - self.do_fence_enable() - self.delay_sim_time(2) # Allow breach to propagate - self.assert_fence_enabled() + # Test cannot arm if outside of fence and fence is enabled + self.progress("Test Arming while vehicle below FENCE_ALT_MIN") + default_fence_alt_min = self.get_parameter("FENCE_ALT_MIN") + self.set_parameter("FENCE_ALT_MIN", 50) + self.set_parameter("FENCE_TYPE", 8) # Enables minimum altitude breaches + self.do_fence_enable() + self.delay_sim_time(2) # Allow breach to propagate + self.assert_fence_enabled() - self.try_arm(False, "vehicle outside fence") - self.do_fence_disable() - self.set_parameter("FENCE_ALT_MIN", default_fence_alt_min) + self.try_arm(False, "Vehicle breaching Min Alt fence") + self.do_fence_disable() + self.set_parameter("FENCE_ALT_MIN", default_fence_alt_min) - # Test arming outside inclusion zone - self.progress("Test arming while vehicle outside of inclusion zone") - self.set_parameter("FENCE_TYPE", 4) # Enables polygon fence types - locs = [ + # Test arming outside inclusion zone + self.progress("Test arming while Vehicle breaching of inclusion zone") + self.set_parameter("FENCE_TYPE", 4) # Enables polygon fence types + self.upload_fences_from_locations([( + mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, [ mavutil.location(1.000, 1.000, 0, 0), mavutil.location(1.000, 1.001, 0, 0), mavutil.location(1.001, 1.001, 0, 0), mavutil.location(1.001, 1.000, 0, 0) ] - self.upload_fences_from_locations( - mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, - [ - locs - ] - ) - self.delay_sim_time(10) # let fence check run so it loads-from-eeprom - self.do_fence_enable() - self.assert_fence_enabled() - self.delay_sim_time(2) # Allow breach to propagate - self.try_arm(False, "vehicle outside fence") - self.do_fence_disable() - self.clear_fence() - - self.progress("Test arming while vehicle inside exclusion zone") - self.set_parameter("FENCE_TYPE", 4) # Enables polygon fence types - home_loc = self.mav.location() - locs = [ - mavutil.location(home_loc.lat - 0.001, home_loc.lng - 0.001, 0, 0), - mavutil.location(home_loc.lat - 0.001, home_loc.lng + 0.001, 0, 0), - mavutil.location(home_loc.lat + 0.001, home_loc.lng + 0.001, 0, 0), - mavutil.location(home_loc.lat + 0.001, home_loc.lng - 0.001, 0, 0), - ] - self.upload_fences_from_locations( - mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, - [ - locs - ] - ) - self.delay_sim_time(10) # let fence check run so it loads-from-eeprom - self.do_fence_enable() - self.assert_fence_enabled() - self.delay_sim_time(2) # Allow breach to propagate - self.try_arm(False, "vehicle outside fence") - self.do_fence_disable() - self.clear_fence() - - except Exception as e: - self.print_exception_caught(e) - ex = e + )]) + self.delay_sim_time(10) # let fence check run so it loads-from-eeprom + self.do_fence_enable() + self.assert_fence_enabled() + self.delay_sim_time(2) # Allow breach to propagate + self.try_arm(False, "Vehicle breaching Polygon fence") + self.do_fence_disable() self.clear_fence() - if ex is not None: - raise ex + + self.progress("Test arming while vehicle inside exclusion zone") + self.set_parameter("FENCE_TYPE", 4) # Enables polygon fence types + home_loc = self.mav.location() + locs = [ + mavutil.location(home_loc.lat - 0.001, home_loc.lng - 0.001, 0, 0), + mavutil.location(home_loc.lat - 0.001, home_loc.lng + 0.001, 0, 0), + mavutil.location(home_loc.lat + 0.001, home_loc.lng + 0.001, 0, 0), + mavutil.location(home_loc.lat + 0.001, home_loc.lng - 0.001, 0, 0), + ] + self.upload_fences_from_locations([ + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, locs), + ]) + self.delay_sim_time(10) # let fence check run so it loads-from-eeprom + self.do_fence_enable() + self.assert_fence_enabled() + self.delay_sim_time(2) # Allow breach to propagate + self.try_arm(False, "Vehicle breaching Polygon fence") + self.do_fence_disable() def test_fence_breach_circle_at(self, loc, disable_on_breach=False): - ex = None - try: - self.load_fence("CMAC-fence.txt") - want_radius = 100 - # when ArduPlane is fixed, remove this fudge factor - REALLY_BAD_FUDGE_FACTOR = 1.16 - expected_radius = REALLY_BAD_FUDGE_FACTOR * want_radius - self.set_parameters({ - "RTL_RADIUS": want_radius, - "NAVL1_LIM_BANK": 60, - "FENCE_ACTION": 1, # AC_FENCE_ACTION_RTL_AND_LAND == 1. mavutil.mavlink.FENCE_ACTION_RTL == 4 - }) + self.load_fence("CMAC-fence.txt") + want_radius = 100 + # when ArduPlane is fixed, remove this fudge factor + REALLY_BAD_FUDGE_FACTOR = 1.16 + expected_radius = REALLY_BAD_FUDGE_FACTOR * want_radius + self.set_parameters({ + "RTL_RADIUS": want_radius, + "NAVL1_LIM_BANK": 60, + "FENCE_ACTION": 1, # AC_FENCE_ACTION_RTL_AND_LAND == 1. mavutil.mavlink.FENCE_ACTION_RTL == 4 + }) - self.wait_ready_to_arm() # need an origin to load fence + self.wait_ready_to_arm() # need an origin to load fence - self.do_fence_enable() - self.assert_fence_sys_status(True, True, True) + self.do_fence_enable() + self.assert_fence_sys_status(True, True, True) - self.takeoff(alt=45, alt_max=300) + self.takeoff(alt=45, alt_max=300) - tstart = self.get_sim_time() - while True: - if self.get_sim_time() - tstart > 30: - raise NotAchievedException("Did not breach fence") - m = self.assert_receive_message('FENCE_STATUS', timeout=2) - if m.breach_status == 0: - continue + tstart = self.get_sim_time() + while True: + if self.get_sim_time() - tstart > 30: + raise NotAchievedException("Did not breach fence") + m = self.assert_receive_message('FENCE_STATUS', timeout=2) + if m.breach_status == 0: + continue - # we've breached; check our state; - if m.breach_type != mavutil.mavlink.FENCE_BREACH_BOUNDARY: - raise NotAchievedException("Unexpected breach type %u" % - (m.breach_type,)) - if m.breach_count == 0: - raise NotAchievedException("Unexpected breach count %u" % - (m.breach_count,)) - self.assert_fence_sys_status(True, True, False) - break + # we've breached; check our state; + if m.breach_type != mavutil.mavlink.FENCE_BREACH_BOUNDARY: + raise NotAchievedException("Unexpected breach type %u" % + (m.breach_type,)) + if m.breach_count == 0: + raise NotAchievedException("Unexpected breach count %u" % + (m.breach_count,)) + self.assert_fence_sys_status(True, True, False) + break - if disable_on_breach: - self.do_fence_disable() - - self.wait_circling_point_with_radius(loc, expected_radius) - - self.disarm_vehicle(force=True) - self.reboot_sitl() - - except Exception as e: - self.print_exception_caught(e) - ex = e - self.clear_fence() - if ex is not None: - raise ex + self.wait_circling_point_with_radius(loc, expected_radius) + self.do_fence_disable() + self.disarm_vehicle(force=True) + self.reboot_sitl() def FenceRTL(self): '''Test Fence RTL''' self.progress("Testing FENCE_ACTION_RTL no rally point") # have to disable the fence once we've breached or we breach # it as part of the loiter-at-home! - self.test_fence_breach_circle_at(self.home_position_as_mav_location(), - disable_on_breach=True) + self.test_fence_breach_circle_at(self.home_position_as_mav_location()) def FenceRTLRally(self): '''Test Fence RTL Rally''' - ex = None - target_system = 1 - target_component = 1 - try: - self.progress("Testing FENCE_ACTION_RTL with rally point") + self.progress("Testing FENCE_ACTION_RTL with rally point") - self.wait_ready_to_arm() - loc = self.home_relative_loc_ne(50, -50) - - self.set_parameter("RALLY_TOTAL", 1) - self.mav.mav.rally_point_send(target_system, - target_component, - 0, # sequence number - 1, # total count - int(loc.lat * 1e7), - int(loc.lng * 1e7), - 15, - 0, # "break" alt?! - 0, # "land dir" - 0) # flags - self.delay_sim_time(1) - if self.mavproxy is not None: - self.mavproxy.send("rally list\n") - self.test_fence_breach_circle_at(loc) - except Exception as e: - self.print_exception_caught(e) - ex = e - self.clear_mission(mavutil.mavlink.MAV_MISSION_TYPE_RALLY) - if ex is not None: - raise ex + self.wait_ready_to_arm() + loc = self.home_relative_loc_ne(50, -50) + self.upload_rally_points_from_locations([loc]) + self.test_fence_breach_circle_at(loc) def FenceRetRally(self): """ Tests the FENCE_RET_RALLY flag, either returning to fence return point, @@ -1762,7 +1659,6 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): self.progress("Testing FENCE_ACTION_RTL with fence rally point") self.wait_ready_to_arm() - self.homeloc = self.mav.location() # Grab a location for fence return point, and upload it. fence_loc = self.home_position_as_mav_location() @@ -1792,18 +1688,7 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): # Grab a location for rally point, and upload it. rally_loc = self.home_relative_loc_ne(-50, 50) - self.set_parameter("RALLY_TOTAL", 1) - self.mav.mav.rally_point_send(target_system, - target_component, - 0, # sequence number - 1, # total count - int(rally_loc.lat * 1e7), - int(rally_loc.lng * 1e7), - 15, - 0, # "break" alt?! - 0, # "land dir" - 0) # flags - self.delay_sim_time(1) + self.upload_rally_points_from_locations([rally_loc]) return_radius = 100 return_alt = 80 @@ -1829,7 +1714,7 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): self.delay_sim_time(15) # Fly up before re-triggering fence breach. Fly to fence return point - self.change_altitude(self.homeloc.alt+30) + self.change_altitude(30, relative=True) self.set_parameters({ "FENCE_RET_RALLY": 0, "FENCE_ALT_MIN": 60, @@ -1875,12 +1760,12 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): self.progress("Got required terrain") self.wait_ready_to_arm() - self.homeloc = self.mav.location() + homeloc = self.mav.location() - guided_loc = mavutil.location(-35.39723762, 149.07284612, self.homeloc.alt+99.0, 0) - rally_loc = mavutil.location(-35.3654952000, 149.1558698000, self.homeloc.alt+100, 0) + guided_loc = mavutil.location(-35.39723762, 149.07284612, homeloc.alt+99.0, 0) + rally_loc = mavutil.location(-35.3654952000, 149.1558698000, homeloc.alt+100, 0) - terrain_wait_path(self.homeloc, rally_loc, 10) + terrain_wait_path(homeloc, rally_loc, 10) # set a rally point to the west of home self.upload_rally_points_from_locations([rally_loc]) @@ -1896,7 +1781,7 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): self.install_message_hook_context(terrain_following_above_80m) self.change_mode("GUIDED") - self.do_reposition(guided_loc, frame=mavutil.mavlink.MAV_FRAME_GLOBAL_TERRAIN_ALT) + self.send_do_reposition(guided_loc, frame=mavutil.mavlink.MAV_FRAME_GLOBAL_TERRAIN_ALT) self.progress("Flying to guided location") self.wait_location( guided_loc, @@ -1919,7 +1804,7 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): # Fly back to guided location self.change_mode("GUIDED") - self.do_reposition(guided_loc, frame=mavutil.mavlink.MAV_FRAME_GLOBAL_TERRAIN_ALT) + self.send_do_reposition(guided_loc, frame=mavutil.mavlink.MAV_FRAME_GLOBAL_TERRAIN_ALT) self.progress("Flying to back to guided location") # Disable terrain following and re-load rally point with relative to terrain altitude @@ -2007,20 +1892,8 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): def fly_ahrs2_test(self): '''check secondary estimator is looking OK''' - ahrs2 = self.mav.recv_match(type='AHRS2', blocking=True, timeout=1) - if ahrs2 is None: - raise NotAchievedException("Did not receive AHRS2 message") - self.progress("AHRS2: %s" % str(ahrs2)) - - # check location - gpi = self.mav.recv_match( - type='GLOBAL_POSITION_INT', - blocking=True, - timeout=5 - ) - if gpi is None: - raise NotAchievedException("Did not receive GLOBAL_POSITION_INT message") - self.progress("GPI: %s" % str(gpi)) + ahrs2 = self.assert_receive_message('AHRS2', verbose=1) + gpi = self.assert_receive_message('GLOBAL_POSITION_INT', verbose=1) if self.get_distance_int(gpi, ahrs2) > 10: raise NotAchievedException("Secondary location looks bad") @@ -2033,10 +1906,6 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): self.progress("Asserting we do support transfer of fence via mission item protocol") self.assert_capability(mavutil.mavlink.MAV_PROTOCOL_CAPABILITY_MISSION_FENCE) - # grab home position: - self.mav.recv_match(type='HOME_POSITION', blocking=True) - self.homeloc = self.mav.location() - self.run_subtest("Takeoff", self.takeoff) self.run_subtest("Set Attitude Target", self.set_attitude_target) @@ -2136,42 +2005,18 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): self.fly_home_land_and_disarm() def deadreckoning_main(self, disable_airspeed_sensor=False): + self.context_push() self.set_parameter("EK3_OPTIONS", 1) self.set_parameter("AHRS_OPTIONS", 3) self.set_parameter("LOG_REPLAY", 1) self.reboot_sitl() self.wait_ready_to_arm() - self.gpi = None - self.simstate = None - self.last_print = 0 - self.max_divergence = 0 - def validate_global_position_int_against_simstate(mav, m): - if m.get_type() == 'GLOBAL_POSITION_INT': - self.gpi = m - elif m.get_type() == 'SIMSTATE': - self.simstate = m - if self.gpi is None: - return - if self.simstate is None: - return - divergence = self.get_distance_int(self.gpi, self.simstate) - if disable_airspeed_sensor: - max_allowed_divergence = 300 - else: - max_allowed_divergence = 150 - if (time.time() - self.last_print > 1 or - divergence > self.max_divergence): - self.progress("position-estimate-divergence=%fm" % (divergence,)) - self.last_print = time.time() - if divergence > self.max_divergence: - self.max_divergence = divergence - if divergence > max_allowed_divergence: - raise NotAchievedException( - "global-position-int diverged from simstate by %fm (max=%fm" % - (divergence, max_allowed_divergence,)) - - self.install_message_hook(validate_global_position_int_against_simstate) + if disable_airspeed_sensor: + max_allowed_divergence = 300 + else: + max_allowed_divergence = 150 + self.install_message_hook_context(vehicle_test_suite.TestSuite.ValidateGlobalPositionIntAgainstSimState(self, max_allowed_divergence=max_allowed_divergence)) # noqa try: # wind is from the West: @@ -2232,9 +2077,11 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): raise NotAchievedException("GPS use re-started %f sec after jamming stopped" % time_since_jamming_stopped) self.set_rc(3, 1000) self.fly_home_land_and_disarm() - self.progress("max-divergence: %fm" % (self.max_divergence,)) finally: - self.remove_message_hook(validate_global_position_int_against_simstate) + pass + + self.context_pop() + self.reboot_sitl() def Deadreckoning(self): '''Test deadreckoning support''' @@ -2352,9 +2199,8 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): def RangeFinder(self): '''Test RangeFinder Basic Functionality''' - self.context_push() self.progress("Making sure we don't ordinarily get RANGEFINDER") - self.assert_not_receive_message('RANGEFDINDER') + self.assert_not_receive_message('RANGEFINDER') self.set_analog_rangefinder_parameters() @@ -2368,12 +2214,8 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): self.wait_ready_to_arm() self.arm_vehicle() self.wait_waypoint(5, 5, max_dist=100) - rf = self.mav.recv_match(type="RANGEFINDER", timeout=1, blocking=True) - if rf is None: - raise NotAchievedException("Did not receive rangefinder message") - gpi = self.mav.recv_match(type='GLOBAL_POSITION_INT', blocking=True, timeout=1) - if gpi is None: - raise NotAchievedException("Did not receive GLOBAL_POSITION_INT message") + rf = self.assert_receive_message('RANGEFINDER') + gpi = self.assert_receive_message('GLOBAL_POSITION_INT') if abs(rf.distance - gpi.relative_alt/1000.0) > 3: raise NotAchievedException( "rangefinder alt (%s) disagrees with global-position-int.relative_alt (%s)" % @@ -2384,9 +2226,6 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): if not self.current_onboard_log_contains_message("RFND"): raise NotAchievedException("No RFND messages in log") - self.context_pop() - self.reboot_sitl() - def rc_defaults(self): ret = super(AutoTestPlane, self).rc_defaults() ret[3] = 1000 @@ -2459,12 +2298,7 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): self.reboot_sitl() self.assert_receive_message('ADSB_VEHICLE', timeout=30) - def ADSB(self): - '''Test ADSB''' - self.ADSB_f_action_rtl() - self.ADSB_r_action_resume_or_loiter() - - def ADSB_r_action_resume_or_loiter(self): + def ADSBResumeActionResumeLoiter(self): '''ensure we resume auto mission or enter loiter''' self.set_parameters({ "ADSB_TYPE": 1, @@ -2502,68 +2336,58 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): self.fly_home_land_and_disarm() - def ADSB_f_action_rtl(self): - self.context_push() - ex = None - try: - # message ADSB_VEHICLE 37 -353632614 1491652305 0 584070 0 0 0 "bob" 3 1 255 17 - self.set_parameter("RC12_OPTION", 38) # avoid-adsb - self.set_rc(12, 2000) - self.set_parameters({ - "ADSB_TYPE": 1, - "AVD_ENABLE": 1, - "AVD_F_ACTION": mavutil.mavlink.MAV_COLLISION_ACTION_RTL, - }) - self.reboot_sitl() - self.wait_ready_to_arm() - here = self.mav.location() - self.change_mode("FBWA") - self.delay_sim_time(2) # TODO: work out why this is required... - self.test_adsb_send_threatening_adsb_message(here) - self.progress("Waiting for collision message") - m = self.assert_receive_message('COLLISION', timeout=4) - if m.threat_level != 2: - raise NotAchievedException("Expected some threat at least") - if m.action != mavutil.mavlink.MAV_COLLISION_ACTION_RTL: - raise NotAchievedException("Incorrect action; want=%u got=%u" % - (mavutil.mavlink.MAV_COLLISION_ACTION_RTL, m.action)) - self.wait_mode("RTL") - - self.progress("Sending far-away ABSD_VEHICLE message") - self.mav.mav.adsb_vehicle_send( - 37, # ICAO address - int(here.lat+1 * 1e7), - int(here.lng * 1e7), - mavutil.mavlink.ADSB_ALTITUDE_TYPE_PRESSURE_QNH, - int(here.alt*1000 + 10000), # 10m up - 0, # heading in cdeg - 0, # horizontal velocity cm/s - 0, # vertical velocity cm/s - "bob".encode("ascii"), # callsign - mavutil.mavlink.ADSB_EMITTER_TYPE_LIGHT, - 1, # time since last communication - 65535, # flags - 17 # squawk - ) - self.wait_for_collision_threat_to_clear() - self.change_mode("FBWA") - - self.progress("Disabling ADSB-avoidance with RC channel") - self.set_rc(12, 1000) - self.delay_sim_time(1) # let the switch get polled - self.test_adsb_send_threatening_adsb_message(here) - m = self.mav.recv_match(type='COLLISION', blocking=True, timeout=4) - self.progress("Got (%s)" % str(m)) - if m is not None: - raise NotAchievedException("Got collision message when I shouldn't have") - - except Exception as e: - self.print_exception_caught(e) - ex = e - self.context_pop() + def ADSBFailActionRTL(self): + '''test ADSB avoidance action of RTL''' + # message ADSB_VEHICLE 37 -353632614 1491652305 0 584070 0 0 0 "bob" 3 1 255 17 + self.set_parameter("RC12_OPTION", 38) # avoid-adsb + self.set_rc(12, 2000) + self.set_parameters({ + "ADSB_TYPE": 1, + "AVD_ENABLE": 1, + "AVD_F_ACTION": mavutil.mavlink.MAV_COLLISION_ACTION_RTL, + }) self.reboot_sitl() - if ex is not None: - raise ex + self.wait_ready_to_arm() + here = self.mav.location() + self.change_mode("FBWA") + self.delay_sim_time(2) # TODO: work out why this is required... + self.test_adsb_send_threatening_adsb_message(here) + self.progress("Waiting for collision message") + m = self.assert_receive_message('COLLISION', timeout=4) + if m.threat_level != 2: + raise NotAchievedException("Expected some threat at least") + if m.action != mavutil.mavlink.MAV_COLLISION_ACTION_RTL: + raise NotAchievedException("Incorrect action; want=%u got=%u" % + (mavutil.mavlink.MAV_COLLISION_ACTION_RTL, m.action)) + self.wait_mode("RTL") + + self.progress("Sending far-away ABSD_VEHICLE message") + self.mav.mav.adsb_vehicle_send( + 37, # ICAO address + int(here.lat+1 * 1e7), + int(here.lng * 1e7), + mavutil.mavlink.ADSB_ALTITUDE_TYPE_PRESSURE_QNH, + int(here.alt*1000 + 10000), # 10m up + 0, # heading in cdeg + 0, # horizontal velocity cm/s + 0, # vertical velocity cm/s + "bob".encode("ascii"), # callsign + mavutil.mavlink.ADSB_EMITTER_TYPE_LIGHT, + 1, # time since last communication + 65535, # flags + 17 # squawk + ) + self.wait_for_collision_threat_to_clear() + self.change_mode("FBWA") + + self.progress("Disabling ADSB-avoidance with RC channel") + self.set_rc(12, 1000) + self.delay_sim_time(1) # let the switch get polled + self.test_adsb_send_threatening_adsb_message(here) + m = self.mav.recv_match(type='COLLISION', blocking=True, timeout=4) + self.progress("Got (%s)" % str(m)) + if m is not None: + raise NotAchievedException("Got collision message when I shouldn't have") def GuidedRequest(self, target_system=1, target_component=1): '''Test handling of MISSION_ITEM in guided mode''' @@ -2664,9 +2488,7 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): now = self.get_sim_time_cached() if now - tstart > 60: break - m = self.mav.recv_match(type='VFR_HUD', blocking=True, timeout=5) - if m is None: - raise NotAchievedException("Did not get VFR_HUD") + m = self.assert_receive_message('VFR_HUD') new_throttle = m.throttle alt = m.alt m = self.assert_receive_message('ATTITUDE', timeout=5) @@ -3493,9 +3315,6 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): def EKFlaneswitch(self): '''Test EKF3 Affinity and Lane Switching''' - self.context_push() - ex = None - # new lane swtich available only with EK3 self.set_parameters({ "EK3_ENABLE": 1, @@ -3526,165 +3345,149 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): return newlane = int(message.text[-1]) self.lane_switches.append(newlane) - self.install_message_hook(statustext_hook) + self.install_message_hook_context(statustext_hook) # get flying self.takeoff(alt=50) self.change_mode('CIRCLE') - try: - ################################################################### - self.progress("Checking EKF3 Lane Switching trigger from all sensors") - ################################################################### - self.start_subtest("ACCELEROMETER: Change z-axis offset") - # create an accelerometer error by changing the Z-axis offset - self.context_collect("STATUSTEXT") - old_parameter = self.get_parameter("INS_ACCOFFS_Z") - self.wait_statustext( - text="EKF3 lane switch", - timeout=30, - the_function=self.set_parameter("INS_ACCOFFS_Z", old_parameter + 5), - check_context=True) - if self.lane_switches != [1]: - raise NotAchievedException("Expected lane switch 1, got %s" % str(self.lane_switches[-1])) - # Cleanup - self.set_parameter("INS_ACCOFFS_Z", old_parameter) - self.context_clear_collection("STATUSTEXT") - self.wait_heading(0, accuracy=10, timeout=60) - self.wait_heading(180, accuracy=10, timeout=60) - ################################################################### - self.start_subtest("BAROMETER: Freeze to last measured value") - self.context_collect("STATUSTEXT") - # create a barometer error by inhibiting any pressure change while changing altitude - old_parameter = self.get_parameter("SIM_BAR2_FREEZE") - self.set_parameter("SIM_BAR2_FREEZE", 1) - self.wait_statustext( - text="EKF3 lane switch", - timeout=30, - the_function=lambda: self.set_rc(2, 2000), - check_context=True) - if self.lane_switches != [1, 0]: - raise NotAchievedException("Expected lane switch 0, got %s" % str(self.lane_switches[-1])) - # Cleanup - self.set_rc(2, 1500) - self.set_parameter("SIM_BAR2_FREEZE", old_parameter) - self.context_clear_collection("STATUSTEXT") - self.wait_heading(0, accuracy=10, timeout=60) - self.wait_heading(180, accuracy=10, timeout=60) - ################################################################### - self.start_subtest("GPS: Apply GPS Velocity Error in NED") - self.context_push() - self.context_collect("STATUSTEXT") - - # create a GPS velocity error by adding a random 2m/s - # noise on each axis - def sim_gps_verr(): - self.set_parameters({ - "SIM_GPS_VERR_X": self.get_parameter("SIM_GPS_VERR_X") + 2, - "SIM_GPS_VERR_Y": self.get_parameter("SIM_GPS_VERR_Y") + 2, - "SIM_GPS_VERR_Z": self.get_parameter("SIM_GPS_VERR_Z") + 2, - }) - self.wait_statustext(text="EKF3 lane switch", timeout=30, the_function=sim_gps_verr, check_context=True) - if self.lane_switches != [1, 0, 1]: - raise NotAchievedException("Expected lane switch 1, got %s" % str(self.lane_switches[-1])) - # Cleanup - self.context_pop() - self.context_clear_collection("STATUSTEXT") - self.wait_heading(0, accuracy=10, timeout=60) - self.wait_heading(180, accuracy=10, timeout=60) - ################################################################### - self.start_subtest("MAGNETOMETER: Change X-Axis Offset") - self.context_collect("STATUSTEXT") - # create a magnetometer error by changing the X-axis offset - old_parameter = self.get_parameter("SIM_MAG2_OFS_X") - self.wait_statustext( - text="EKF3 lane switch", - timeout=30, - the_function=self.set_parameter("SIM_MAG2_OFS_X", old_parameter + 150), - check_context=True) - if self.lane_switches != [1, 0, 1, 0]: - raise NotAchievedException("Expected lane switch 0, got %s" % str(self.lane_switches[-1])) - # Cleanup - self.set_parameter("SIM_MAG2_OFS_X", old_parameter) - self.context_clear_collection("STATUSTEXT") - self.wait_heading(0, accuracy=10, timeout=60) - self.wait_heading(180, accuracy=10, timeout=60) - ################################################################### - self.start_subtest("AIRSPEED: Fail to constant value") - self.context_push() - self.context_collect("STATUSTEXT") - - old_parameter = self.get_parameter("SIM_ARSPD_FAIL") - - def fail_speed(): - self.change_mode("GUIDED") - loc = self.mav.location() - self.run_cmd_int( - mavutil.mavlink.MAV_CMD_DO_REPOSITION, - p5=int(loc.lat * 1e7), - p6=int(loc.lng * 1e7), - p7=50, # alt - ) - self.delay_sim_time(5) - # create an airspeed sensor error by freezing to the - # current airspeed then changing the airspeed demand - # to a higher value and waiting for the TECS speed - # loop to diverge - m = self.mav.recv_match(type='VFR_HUD', blocking=True) - self.set_parameter("SIM_ARSPD_FAIL", m.airspeed) - self.run_cmd( - mavutil.mavlink.MAV_CMD_DO_CHANGE_SPEED, - p1=0, # airspeed - p2=30, - p3=-1, # throttle / no change - p4=0, # absolute values - ) - self.wait_statustext(text="EKF3 lane switch", timeout=30, the_function=fail_speed, check_context=True) - if self.lane_switches != [1, 0, 1, 0, 1]: - raise NotAchievedException("Expected lane switch 1, got %s" % str(self.lane_switches[-1])) - # Cleanup - self.set_parameter("SIM_ARSPD_FAIL", old_parameter) - self.change_mode('CIRCLE') - self.context_pop() - self.context_clear_collection("STATUSTEXT") - self.wait_heading(0, accuracy=10, timeout=60) - self.wait_heading(180, accuracy=10, timeout=60) - ################################################################### - self.progress("GYROSCOPE: Change Y-Axis Offset") - self.context_collect("STATUSTEXT") - # create a gyroscope error by changing the Y-axis offset - old_parameter = self.get_parameter("INS_GYR2OFFS_Y") - self.wait_statustext( - text="EKF3 lane switch", - timeout=30, - the_function=self.set_parameter("INS_GYR2OFFS_Y", old_parameter + 1), - check_context=True) - if self.lane_switches != [1, 0, 1, 0, 1, 0]: - raise NotAchievedException("Expected lane switch 0, got %s" % str(self.lane_switches[-1])) - # Cleanup - self.set_parameter("INS_GYR2OFFS_Y", old_parameter) - self.context_clear_collection("STATUSTEXT") - ################################################################### - - self.disarm_vehicle(force=True) - - except Exception as e: - self.print_exception_caught(e) - ex = e - - self.remove_message_hook(statustext_hook) + ################################################################### + self.progress("Checking EKF3 Lane Switching trigger from all sensors") + ################################################################### + self.start_subtest("ACCELEROMETER: Change z-axis offset") + # create an accelerometer error by changing the Z-axis offset + self.context_collect("STATUSTEXT") + old_parameter = self.get_parameter("INS_ACCOFFS_Z") + self.wait_statustext( + text="EKF3 lane switch", + timeout=30, + the_function=self.set_parameter("INS_ACCOFFS_Z", old_parameter + 5), + check_context=True) + if self.lane_switches != [1]: + raise NotAchievedException("Expected lane switch 1, got %s" % str(self.lane_switches[-1])) + # Cleanup + self.set_parameter("INS_ACCOFFS_Z", old_parameter) + self.context_clear_collection("STATUSTEXT") + self.wait_heading(0, accuracy=10, timeout=60) + self.wait_heading(180, accuracy=10, timeout=60) + ################################################################### + self.start_subtest("BAROMETER: Freeze to last measured value") + self.context_collect("STATUSTEXT") + # create a barometer error by inhibiting any pressure change while changing altitude + old_parameter = self.get_parameter("SIM_BAR2_FREEZE") + self.set_parameter("SIM_BAR2_FREEZE", 1) + self.wait_statustext( + text="EKF3 lane switch", + timeout=30, + the_function=lambda: self.set_rc(2, 2000), + check_context=True) + if self.lane_switches != [1, 0]: + raise NotAchievedException("Expected lane switch 0, got %s" % str(self.lane_switches[-1])) + # Cleanup + self.set_rc(2, 1500) + self.set_parameter("SIM_BAR2_FREEZE", old_parameter) + self.context_clear_collection("STATUSTEXT") + self.wait_heading(0, accuracy=10, timeout=60) + self.wait_heading(180, accuracy=10, timeout=60) + ################################################################### + self.start_subtest("GPS: Apply GPS Velocity Error in NED") + self.context_push() + self.context_collect("STATUSTEXT") + # create a GPS velocity error by adding a random 2m/s + # noise on each axis + def sim_gps_verr(): + self.set_parameters({ + "SIM_GPS_VERR_X": self.get_parameter("SIM_GPS_VERR_X") + 2, + "SIM_GPS_VERR_Y": self.get_parameter("SIM_GPS_VERR_Y") + 2, + "SIM_GPS_VERR_Z": self.get_parameter("SIM_GPS_VERR_Z") + 2, + }) + self.wait_statustext(text="EKF3 lane switch", timeout=30, the_function=sim_gps_verr, check_context=True) + if self.lane_switches != [1, 0, 1]: + raise NotAchievedException("Expected lane switch 1, got %s" % str(self.lane_switches[-1])) + # Cleanup self.context_pop() + self.context_clear_collection("STATUSTEXT") + self.wait_heading(0, accuracy=10, timeout=60) + self.wait_heading(180, accuracy=10, timeout=60) + ################################################################### + self.start_subtest("MAGNETOMETER: Change X-Axis Offset") + self.context_collect("STATUSTEXT") + # create a magnetometer error by changing the X-axis offset + old_parameter = self.get_parameter("SIM_MAG2_OFS_X") + self.wait_statustext( + text="EKF3 lane switch", + timeout=30, + the_function=self.set_parameter("SIM_MAG2_OFS_X", old_parameter + 150), + check_context=True) + if self.lane_switches != [1, 0, 1, 0]: + raise NotAchievedException("Expected lane switch 0, got %s" % str(self.lane_switches[-1])) + # Cleanup + self.set_parameter("SIM_MAG2_OFS_X", old_parameter) + self.context_clear_collection("STATUSTEXT") + self.wait_heading(0, accuracy=10, timeout=60) + self.wait_heading(180, accuracy=10, timeout=60) + ################################################################### + self.start_subtest("AIRSPEED: Fail to constant value") + self.context_push() + self.context_collect("STATUSTEXT") - # some parameters need reboot to take effect - self.reboot_sitl() + old_parameter = self.get_parameter("SIM_ARSPD_FAIL") - if ex is not None: - raise ex + def fail_speed(): + self.change_mode("GUIDED") + loc = self.mav.location() + self.run_cmd_int( + mavutil.mavlink.MAV_CMD_DO_REPOSITION, + p5=int(loc.lat * 1e7), + p6=int(loc.lng * 1e7), + p7=50, # alt + ) + self.delay_sim_time(5) + # create an airspeed sensor error by freezing to the + # current airspeed then changing the airspeed demand + # to a higher value and waiting for the TECS speed + # loop to diverge + m = self.mav.recv_match(type='VFR_HUD', blocking=True) + self.set_parameter("SIM_ARSPD_FAIL", m.airspeed) + self.run_cmd( + mavutil.mavlink.MAV_CMD_DO_CHANGE_SPEED, + p1=0, # airspeed + p2=30, + p3=-1, # throttle / no change + p4=0, # absolute values + ) + self.wait_statustext(text="EKF3 lane switch", timeout=30, the_function=fail_speed, check_context=True) + if self.lane_switches != [1, 0, 1, 0, 1]: + raise NotAchievedException("Expected lane switch 1, got %s" % str(self.lane_switches[-1])) + # Cleanup + self.set_parameter("SIM_ARSPD_FAIL", old_parameter) + self.change_mode('CIRCLE') + self.context_pop() + self.context_clear_collection("STATUSTEXT") + self.wait_heading(0, accuracy=10, timeout=60) + self.wait_heading(180, accuracy=10, timeout=60) + ################################################################### + self.progress("GYROSCOPE: Change Y-Axis Offset") + self.context_collect("STATUSTEXT") + # create a gyroscope error by changing the Y-axis offset + old_parameter = self.get_parameter("INS_GYR2OFFS_Y") + self.wait_statustext( + text="EKF3 lane switch", + timeout=30, + the_function=self.set_parameter("INS_GYR2OFFS_Y", old_parameter + 1), + check_context=True) + if self.lane_switches != [1, 0, 1, 0, 1, 0]: + raise NotAchievedException("Expected lane switch 0, got %s" % str(self.lane_switches[-1])) + # Cleanup + self.set_parameter("INS_GYR2OFFS_Y", old_parameter) + self.context_clear_collection("STATUSTEXT") + ################################################################### + + self.disarm_vehicle(force=True) def FenceAltCeilFloor(self): '''Tests the fence ceiling and floor''' - fence_bit = mavutil.mavlink.MAV_SYS_STATUS_GEOFENCE self.set_parameters({ "FENCE_TYPE": 9, # Set fence type to max and min alt "FENCE_ACTION": 0, # Set action to report @@ -3693,41 +3496,422 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): }) # Grab Home Position - self.mav.recv_match(type='HOME_POSITION', blocking=True) - self.homeloc = self.mav.location() + self.wait_ready_to_arm() + startpos = self.mav.location() cruise_alt = 150 self.takeoff(cruise_alt) + # note that while we enable the fence here, since the action + # is set to report-only the fence continues to show as + # not-enabled in the assert calls below self.do_fence_enable() self.progress("Fly above ceiling and check for breach") - self.change_altitude(self.homeloc.alt + cruise_alt + 80) - m = self.mav.recv_match(type='SYS_STATUS', blocking=True) - self.progress("Got (%s)" % str(m)) - if ((m.onboard_control_sensors_health & fence_bit)): - raise NotAchievedException("Fence Ceiling did not breach") + self.change_altitude(startpos.alt + cruise_alt + 80) + self.assert_fence_sys_status(True, False, False) - self.progress("Return to cruise alt and check for breach clear") - self.change_altitude(self.homeloc.alt + cruise_alt) + self.progress("Return to cruise alt") + self.change_altitude(startpos.alt + cruise_alt) - m = self.mav.recv_match(type='SYS_STATUS', blocking=True) - self.progress("Got (%s)" % str(m)) - if (not (m.onboard_control_sensors_health & fence_bit)): - raise NotAchievedException("Fence breach did not clear") + self.progress("Ensure breach has clearned") + self.assert_fence_sys_status(True, False, True) self.progress("Fly below floor and check for breach") - self.change_altitude(self.homeloc.alt + cruise_alt - 80) + self.change_altitude(startpos.alt + cruise_alt - 80) - m = self.mav.recv_match(type='SYS_STATUS', blocking=True) - self.progress("Got (%s)" % str(m)) - if ((m.onboard_control_sensors_health & fence_bit)): - raise NotAchievedException("Fence Floor did not breach") + self.progress("Ensure breach has clearned") + self.assert_fence_sys_status(True, False, False) self.do_fence_disable() self.fly_home_land_and_disarm(timeout=150) + def FenceMinAltAutoEnable(self): + '''Tests autoenablement of the alt min fence and fences on arming''' + self.set_parameters({ + "FENCE_TYPE": 9, # Set fence type to min alt and max alt + "FENCE_ACTION": 1, # Set action to RTL + "FENCE_ALT_MIN": 25, + "FENCE_ALT_MAX": 100, + "FENCE_AUTOENABLE": 3, + "FENCE_ENABLE" : 0, + "RTL_AUTOLAND" : 2, + }) + + # check we can takeoff again + for i in [1, 2]: + # Grab Home Position + self.wait_ready_to_arm() + self.arm_vehicle() + # max alt fence should now be enabled + if i == 1: + self.assert_fence_enabled() + + self.takeoff(alt=50, mode='TAKEOFF') + self.change_mode("FBWA") + self.set_rc(3, 1100) # lower throttle + + self.progress("Waiting for RTL") + tstart = self.get_sim_time() + mode = "RTL" + while not self.mode_is(mode, drain_mav=False): + self.mav.messages['HEARTBEAT'].custom_mode + self.progress("mav.flightmode=%s Want=%s Alt=%f" % ( + self.mav.flightmode, mode, self.get_altitude(relative=True))) + if (self.get_sim_time_cached() > tstart + 120): + raise WaitModeTimeout("Did not change mode") + self.progress("Got mode %s" % mode) + self.fly_home_land_and_disarm() + self.change_mode("FBWA") + self.clear_mission(mavutil.mavlink.MAV_MISSION_TYPE_ALL) + self.set_current_waypoint(0, check_afterwards=False) + self.set_rc(3, 1000) # lower throttle + + def FenceMinAltEnableAutoland(self): + '''Tests autolanding when alt min fence is enabled''' + self.set_parameters({ + "FENCE_TYPE": 12, # Set fence type to min alt and max alt + "FENCE_ACTION": 1, # Set action to RTL + "FENCE_ALT_MIN": 20, + "FENCE_AUTOENABLE": 0, + "FENCE_ENABLE" : 1, + "RTL_AUTOLAND" : 2, + }) + + # Grab Home Position + self.wait_ready_to_arm() + self.arm_vehicle() + + self.takeoff(alt=50, mode='TAKEOFF') + self.change_mode("FBWA") + self.set_rc(3, 1100) # lower throttle + + self.progress("Waiting for RTL") + tstart = self.get_sim_time() + mode = "RTL" + while not self.mode_is(mode, drain_mav=False): + self.mav.messages['HEARTBEAT'].custom_mode + self.progress("mav.flightmode=%s Want=%s Alt=%f" % ( + self.mav.flightmode, mode, self.get_altitude(relative=True))) + if (self.get_sim_time_cached() > tstart + 120): + raise WaitModeTimeout("Did not change mode") + self.progress("Got mode %s" % mode) + # switch to FBWA + self.change_mode("FBWA") + self.set_rc(3, 1500) # raise throttle + self.wait_altitude(25, 35, timeout=50, relative=True) + self.set_rc(3, 1000) # lower throttle + # Now check we can land + self.fly_home_land_and_disarm() + + def FenceMinAltAutoEnableAbort(self): + '''Tests autoenablement of the alt min fence and fences on arming''' + self.set_parameters({ + "FENCE_TYPE": 8, # Set fence type to min alt + "FENCE_ACTION": 1, # Set action to RTL + "FENCE_ALT_MIN": 25, + "FENCE_ALT_MAX": 100, + "FENCE_AUTOENABLE": 3, + "FENCE_ENABLE" : 0, + "RTL_AUTOLAND" : 2, + }) + + self.wait_ready_to_arm() + self.arm_vehicle() + + self.takeoff(alt=50, mode='TAKEOFF') + self.change_mode("FBWA") + # min alt fence should now be enabled + self.assert_fence_enabled() + self.set_rc(3, 1100) # lower throttle + + self.progress("Waiting for RTL") + tstart = self.get_sim_time() + mode = "RTL" + while not self.mode_is(mode, drain_mav=False): + self.mav.messages['HEARTBEAT'].custom_mode + self.progress("mav.flightmode=%s Want=%s Alt=%f" % ( + self.mav.flightmode, mode, self.get_altitude(relative=True))) + if (self.get_sim_time_cached() > tstart + 120): + raise WaitModeTimeout("Did not change mode") + self.progress("Got mode %s" % mode) + + self.load_generic_mission("flaps.txt") + self.change_mode("AUTO") + self.wait_distance_to_waypoint(8, 100, 10000000) + self.set_current_waypoint(8) + # abort the landing + self.wait_altitude(10, 20, timeout=200, relative=True) + self.change_mode("CRUISE") + self.set_rc(2, 1200) + # self.set_rc(3, 1600) # raise throttle + self.wait_altitude(30, 40, timeout=200, relative=True) + # min alt fence should now be re-enabled + self.assert_fence_enabled() + + self.change_mode("AUTO") + self.clear_mission(mavutil.mavlink.MAV_MISSION_TYPE_ALL) + self.fly_home_land_and_disarm(timeout=150) + + def FenceAutoEnableDisableSwitch(self): + '''Tests autoenablement of regular fences and manual disablement''' + self.set_parameters({ + "FENCE_TYPE": 11, # Set fence type to min alt + "FENCE_ACTION": 1, # Set action to RTL + "FENCE_ALT_MIN": 50, + "FENCE_ALT_MAX": 100, + "FENCE_AUTOENABLE": 2, + "FENCE_OPTIONS" : 1, + "FENCE_ENABLE" : 1, + "FENCE_RADIUS" : 300, + "FENCE_RET_ALT" : 0, + "FENCE_RET_RALLY" : 0, + "FENCE_TOTAL" : 0, + "TKOFF_ALT" : 75, + "RC7_OPTION" : 11, # AC_Fence uses Aux switch functionality + }) + fence_bit = mavutil.mavlink.MAV_SYS_STATUS_GEOFENCE + # Grab Home Position + self.mav.recv_match(type='HOME_POSITION', blocking=True) + self.set_rc_from_map({7: 1000}) # Turn fence off with aux function + + self.wait_ready_to_arm() + cruise_alt = 75 + self.takeoff(cruise_alt, mode='TAKEOFF') + + self.progress("Fly above ceiling and check there is no breach") + self.set_rc(3, 2000) + self.change_altitude(cruise_alt + 80, relative=True) + m = self.mav.recv_match(type='SYS_STATUS', blocking=True) + self.progress("Got (%s)" % str(m)) + if (not (m.onboard_control_sensors_health & fence_bit)): + raise NotAchievedException("Fence Ceiling breached") + + self.progress("Return to cruise alt") + self.set_rc(3, 1500) + self.change_altitude(cruise_alt, relative=True) + + self.progress("Fly below floor and check for no breach") + self.change_altitude(25, relative=True) + m = self.mav.recv_match(type='SYS_STATUS', blocking=True) + self.progress("Got (%s)" % str(m)) + if (not (m.onboard_control_sensors_health & fence_bit)): + raise NotAchievedException("Fence Ceiling breached") + + self.progress("Fly above floor and check fence is not re-enabled") + self.set_rc(3, 2000) + self.change_altitude(75, relative=True) + m = self.mav.recv_match(type='SYS_STATUS', blocking=True) + self.progress("Got (%s)" % str(m)) + if (m.onboard_control_sensors_enabled & fence_bit): + raise NotAchievedException("Fence Ceiling re-enabled") + + self.progress("Return to cruise alt") + self.set_rc(3, 1500) + self.change_altitude(cruise_alt, relative=True) + self.fly_home_land_and_disarm(timeout=250) + + def FenceCircleExclusionAutoEnable(self): + '''Tests autolanding when alt min fence is enabled''' + self.set_parameters({ + "FENCE_TYPE": 2, # Set fence type to circle + "FENCE_ACTION": 1, # Set action to RTL + "FENCE_AUTOENABLE": 2, + "FENCE_ENABLE" : 0, + "RTL_AUTOLAND" : 2, + }) + + fence_loc = self.home_position_as_mav_location() + self.location_offset_ne(fence_loc, 300, 0) + + self.upload_fences_from_locations([( + mavutil.mavlink.MAV_CMD_NAV_FENCE_CIRCLE_EXCLUSION, { + "radius" : 100, + "loc" : fence_loc + } + )]) + + self.takeoff(alt=50, mode='TAKEOFF') + self.change_mode("FBWA") + self.set_rc(3, 1100) # lower throttle + + self.progress("Waiting for RTL") + self.wait_mode('RTL') + # Now check we can land + self.fly_home_land_and_disarm() + + def FenceEnableDisableSwitch(self): + '''Tests enablement and disablement of fences on a switch''' + fence_bit = mavutil.mavlink.MAV_SYS_STATUS_GEOFENCE + + self.set_parameters({ + "FENCE_TYPE": 4, # Set fence type to polyfence + "FENCE_ACTION": 6, # Set action to GUIDED + "FENCE_ALT_MIN": 10, + "FENCE_ENABLE" : 0, + "RC7_OPTION" : 11, # AC_Fence uses Aux switch functionality + }) + + self.progress("Checking fence is not present before being configured") + m = self.mav.recv_match(type='SYS_STATUS', blocking=True) + self.progress("Got (%s)" % str(m)) + if (m.onboard_control_sensors_enabled & fence_bit): + raise NotAchievedException("Fence enabled before being configured") + + self.wait_ready_to_arm() + # takeoff at a lower altitude to avoid immediately breaching polyfence + self.takeoff(alt=25) + self.change_mode("FBWA") + + self.load_fence("CMAC-fence.txt") + + self.set_rc_from_map({ + 3: 1500, + 7: 2000, + }) # Turn fence on with aux function + + m = self.mav.recv_match(type='FENCE_STATUS', blocking=True, timeout=2) + self.progress("Got (%s)" % str(m)) + if m is None: + raise NotAchievedException("Got FENCE_STATUS unexpectedly") + + self.progress("Checking fence is initially OK") + self.wait_sensor_state(mavutil.mavlink.MAV_SYS_STATUS_GEOFENCE, + present=True, + enabled=True, + healthy=True, + verbose=False, + timeout=30) + + self.progress("Waiting for GUIDED") + tstart = self.get_sim_time() + mode = "GUIDED" + while not self.mode_is(mode, drain_mav=False): + self.mav.messages['HEARTBEAT'].custom_mode + self.progress("mav.flightmode=%s Want=%s Alt=%f" % ( + self.mav.flightmode, mode, self.get_altitude(relative=True))) + if (self.get_sim_time_cached() > tstart + 120): + raise WaitModeTimeout("Did not change mode") + self.progress("Got mode %s" % mode) + # check we are in breach + self.assert_fence_enabled() + + self.set_rc_from_map({ + 7: 1000, + }) # Turn fence off with aux function + + # wait to no longer be in breach + self.delay_sim_time(5) + self.assert_fence_disabled() + + self.fly_home_land_and_disarm(timeout=250) + self.do_fence_disable() # Ensure the fence is disabled after test + + def FenceEnableDisableAux(self): + '''Tests enablement and disablement of fences via aux command''' + fence_bit = mavutil.mavlink.MAV_SYS_STATUS_GEOFENCE + + enable = 0 + self.set_parameters({ + "FENCE_TYPE": 12, # Set fence type to polyfence + AltMin + "FENCE_ALT_MIN": 10, + "FENCE_ENABLE" : enable, + }) + + if not enable: + self.progress("Checking fence is not present before being configured") + m = self.mav.recv_match(type='SYS_STATUS', blocking=True) + self.progress("Got (%s)" % str(m)) + if (m.onboard_control_sensors_enabled & fence_bit): + raise NotAchievedException("Fence enabled before being configured") + + self.load_fence("CMAC-fence.txt") + + self.wait_ready_to_arm() + # takeoff at a lower altitude to avoid immediately breaching polyfence + self.takeoff(alt=25) + self.change_mode("CRUISE") + self.wait_distance(150, accuracy=20) + + self.run_auxfunc( + 11, + 2, + want_result=mavutil.mavlink.MAV_RESULT_ACCEPTED + ) + + m = self.mav.recv_match(type='FENCE_STATUS', blocking=True, timeout=2) + self.progress("Got (%s)" % str(m)) + if m is None: + raise NotAchievedException("Got FENCE_STATUS unexpectedly") + + self.progress("Checking fence is initially OK") + self.wait_sensor_state(mavutil.mavlink.MAV_SYS_STATUS_GEOFENCE, + present=True, + enabled=True, + healthy=True, + verbose=False, + timeout=30) + + self.progress("Waiting for RTL") + tstart = self.get_sim_time() + mode = "RTL" + while not self.mode_is(mode, drain_mav=False): + self.mav.messages['HEARTBEAT'].custom_mode + self.progress("mav.flightmode=%s Want=%s Alt=%f" % ( + self.mav.flightmode, mode, self.get_altitude(relative=True))) + if (self.get_sim_time_cached() > tstart + 120): + raise WaitModeTimeout("Did not change mode") + self.progress("Got mode %s" % mode) + # check we are in breach + self.assert_fence_enabled() + self.assert_fence_sys_status(True, True, False) + + # wait until we get home + self.wait_distance_to_home(50, 100, timeout=200) + # now check we are now not in breach + self.assert_fence_sys_status(True, True, True) + # Turn fence off with aux function + self.run_auxfunc( + 11, + 0, + want_result=mavutil.mavlink.MAV_RESULT_ACCEPTED + ) + # switch back to cruise + self.change_mode("CRUISE") + self.wait_distance(150, accuracy=20) + + # re-enable the fences + self.run_auxfunc( + 11, + 2, + want_result=mavutil.mavlink.MAV_RESULT_ACCEPTED + ) + + m = self.mav.recv_match(type='FENCE_STATUS', blocking=True, timeout=2) + self.progress("Got (%s)" % str(m)) + if m is None: + raise NotAchievedException("Got FENCE_STATUS unexpectedly") + + self.progress("Waiting for RTL") + tstart = self.get_sim_time() + mode = "RTL" + while not self.mode_is(mode, drain_mav=False): + self.mav.messages['HEARTBEAT'].custom_mode + self.progress("mav.flightmode=%s Want=%s Alt=%f" % ( + self.mav.flightmode, mode, self.get_altitude(relative=True))) + if (self.get_sim_time_cached() > tstart + 120): + raise WaitModeTimeout("Did not change mode") + self.progress("Got mode %s" % mode) + + # wait to no longer be in breach + self.wait_distance_to_home(50, 100, timeout=200) + self.assert_fence_sys_status(True, True, True) + + # fly home and land with fences still enabled + self.fly_home_land_and_disarm(timeout=250) + self.do_fence_disable() # Ensure the fence is disabled after test + def FenceBreachedChangeMode(self): '''Tests manual mode change after fence breach, as set with FENCE_OPTIONS''' """ Attempts to change mode while a fence is breached. @@ -3743,12 +3927,9 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): mavutil.location(home_loc.lat + 0.001, home_loc.lng + 0.001, 0, 0), mavutil.location(home_loc.lat + 0.001, home_loc.lng - 0.001, 0, 0), ] - self.upload_fences_from_locations( - mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, - [ - locs - ] - ) + self.upload_fences_from_locations([ + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, locs), + ]) self.delay_sim_time(1) self.wait_ready_to_arm() self.takeoff(alt=50) @@ -3806,12 +3987,9 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): mavutil.location(home_loc.lat + 0.001, home_loc.lng + 0.003, 0, 0), mavutil.location(home_loc.lat + 0.001, home_loc.lng - 0.001, 0, 0), ] - self.upload_fences_from_locations( - mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, - [ - locs - ] - ) + self.upload_fences_from_locations([ + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, locs), + ]) self.delay_sim_time(1) self.wait_ready_to_arm() self.takeoff(alt=50) @@ -4193,6 +4371,389 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): self.wait_disarmed(timeout=180) + def TakeoffAuto1(self): + '''Test the behaviour of an AUTO takeoff, pt1. + + Conditions: + - ARSPD_USE=1 + - TKOFF_OPTIONS[0]=0 + - TKOFF_THR_MAX < THR_MAX + ''' + + self.customise_SITL_commandline( + [], + model='plane-catapult', + defaults_filepath=self.model_defaults_filepath("plane") + ) + self.set_parameters({ + "ARSPD_USE": 1.0, + "THR_MAX": 100.0, + "TKOFF_THR_MAX": 80.0, + "TKOFF_THR_MINACC": 3.0, + "TECS_PITCH_MAX": 35.0, + "PTCH_LIM_MAX_DEG": 35.0, + "RTL_AUTOLAND": 2, # The mission contains a DO_LAND_START item. + }) + + # Load and start mission. It contains a MAV_CMD_NAV_TAKEOFF item at 100m. + self.load_mission("catapult.txt", strict=True) + self.change_mode('AUTO') + + self.wait_ready_to_arm() + self.arm_vehicle() + + # Throw the catapult. + self.set_servo(7, 2000) + + # Wait until we're midway through the climb. + test_alt = 50 + self.wait_altitude(test_alt, test_alt+2, relative=True) + + # Ensure that by then the aircraft still goes at max allowed throttle. + self.assert_servo_channel_value(3, 1000+10*self.get_parameter("TKOFF_THR_MAX")) + + # Wait for landing waypoint. + self.wait_current_waypoint(11, timeout=1200) + self.wait_disarmed(120) + + def TakeoffAuto2(self): + '''Test the behaviour of an AUTO takeoff, pt2. + + Conditions: + - ARSPD_USE=1 + - TKOFF_OPTIONS[0]=0 + - TKOFF_THR_MAX > THR_MAX + ''' + + self.customise_SITL_commandline( + [], + model='plane-catapult', + defaults_filepath=self.model_defaults_filepath("plane") + ) + self.set_parameters({ + "ARSPD_USE": 0.0, + "THR_MAX": 80.0, + "TKOFF_THR_MAX": 100.0, + "TKOFF_THR_MINACC": 3.0, + "TECS_PITCH_MAX": 35.0, + "PTCH_LIM_MAX_DEG": 35.0, + "RTL_AUTOLAND": 2, # The mission contains a DO_LAND_START item. + }) + + # Load and start mission. It contains a MAV_CMD_NAV_TAKEOFF item at 100m. + self.load_mission("catapult.txt", strict=True) + self.change_mode('AUTO') + + self.wait_ready_to_arm() + self.arm_vehicle() + + # Throw the catapult. + self.set_servo(7, 2000) + + # Wait until we're midway through the climb. + test_alt = 50 + self.wait_altitude(test_alt, test_alt+2, relative=True) + + # Ensure that by then the aircraft still goes at max allowed throttle. + self.assert_servo_channel_value(3, 1000+10*self.get_parameter("TKOFF_THR_MAX")) + + # Wait for landing waypoint. + self.wait_current_waypoint(11, timeout=1200) + self.wait_disarmed(120) + + def TakeoffAuto3(self): + '''Test the behaviour of an AUTO takeoff, pt3. + + Conditions: + - ARSPD_USE=1 + - TKOFF_OPTIONS[0]=1 + ''' + + self.customise_SITL_commandline( + [], + model='plane-catapult', + defaults_filepath=self.model_defaults_filepath("plane") + ) + self.set_parameters({ + "ARSPD_USE": 1.0, + "THR_MAX": 80.0, + "THR_MIN": 0.0, + "TKOFF_OPTIONS": 1.0, + "TKOFF_THR_MAX": 100.0, + "TKOFF_THR_MINACC": 3.0, + "TECS_PITCH_MAX": 35.0, + "TKOFF_THR_MAX_T": 3.0, + "PTCH_LIM_MAX_DEG": 35.0, + "RTL_AUTOLAND": 2, # The mission contains a DO_LAND_START item. + }) + + # Load and start mission. It contains a MAV_CMD_NAV_TAKEOFF item at 100m. + self.load_mission("catapult.txt", strict=True) + self.change_mode('AUTO') + + self.wait_ready_to_arm() + self.arm_vehicle() + + # Throw the catapult. + self.set_servo(7, 2000) + + # Ensure that TKOFF_THR_MAX_T is respected. + self.delay_sim_time(self.get_parameter("TKOFF_THR_MAX_T")-1) + self.assert_servo_channel_value(3, 1000+10*(self.get_parameter("TKOFF_THR_MAX")-1)) + + # Ensure that after that the aircraft does not go full throttle anymore. + test_alt = 50 + self.wait_altitude(test_alt, test_alt+2, relative=True) + self.assert_servo_channel_value(3, 1000+10*self.get_parameter("TKOFF_THR_MAX")-10, operator.lt) + + # Wait for landing waypoint. + self.wait_current_waypoint(11, timeout=1200) + self.wait_disarmed(120) + + def TakeoffAuto4(self): + '''Test the behaviour of an AUTO takeoff, pt4. + + Conditions: + - ARSPD_USE=0 + - TKOFF_OPTIONS[0]=1 + ''' + + self.customise_SITL_commandline( + [], + model='plane-catapult', + defaults_filepath=self.model_defaults_filepath("plane") + ) + self.set_parameters({ + "ARSPD_USE": 0.0, + "THR_MAX": 80.0, + "THR_MIN": 0.0, + "TKOFF_OPTIONS": 1.0, + "TKOFF_THR_MAX": 100.0, + "TKOFF_THR_MINACC": 3.0, + "TECS_PITCH_MAX": 35.0, + "TKOFF_THR_MAX_T": 3.0, + "PTCH_LIM_MAX_DEG": 35.0, + "RTL_AUTOLAND": 2, # The mission contains a DO_LAND_START item. + }) + + # Load and start mission. It contains a MAV_CMD_NAV_TAKEOFF item at 100m. + self.load_mission("catapult.txt", strict=True) + self.change_mode('AUTO') + + self.wait_ready_to_arm() + self.arm_vehicle() + + # Throw the catapult. + self.set_servo(7, 2000) + + # Ensure that TKOFF_THR_MAX_T is respected. + self.delay_sim_time(self.get_parameter("TKOFF_THR_MAX_T")-1) + self.assert_servo_channel_value(3, 1000+10*(self.get_parameter("TKOFF_THR_MAX")), operator.le) + self.assert_servo_channel_value(3, 1000+10*(self.get_parameter("TKOFF_THR_MAX"))-10, operator.ge) + + # Ensure that after that the aircraft still goes to maximum throttle. + test_alt = 50 + self.wait_altitude(test_alt, test_alt+2, relative=True) + self.assert_servo_channel_value(3, 1000+10*(self.get_parameter("TKOFF_THR_MAX")), operator.le) + self.assert_servo_channel_value(3, 1000+10*(self.get_parameter("TKOFF_THR_MAX"))-10, operator.ge) + + # Wait for landing waypoint. + self.wait_current_waypoint(11, timeout=1200) + self.wait_disarmed(120) + + def TakeoffTakeoff1(self): + '''Test the behaviour of a takeoff in TAKEOFF mode, pt1. + + Conditions: + - ARSPD_USE=1 + - TKOFF_OPTIONS[0]=0 + - TKOFF_THR_MAX < THR_MAX + ''' + + self.customise_SITL_commandline( + [], + model='plane-catapult', + defaults_filepath=self.model_defaults_filepath("plane") + ) + self.set_parameters({ + "ARSPD_USE": 1.0, + "THR_MAX": 100.0, + "TKOFF_LVL_ALT": 30.0, + "TKOFF_ALT": 100.0, + "TKOFF_OPTIONS": 0.0, + "TKOFF_THR_MINACC": 3.0, + "TKOFF_THR_MAX": 80.0, + "TECS_PITCH_MAX": 35.0, + "PTCH_LIM_MAX_DEG": 35.0, + }) + self.change_mode("TAKEOFF") + + self.wait_ready_to_arm() + self.arm_vehicle() + + # Throw the catapult. + self.set_servo(7, 2000) + + # Check whether we're at max throttle below TKOFF_LVL_ALT. + test_alt = self.get_parameter("TKOFF_LVL_ALT")-10 + self.wait_altitude(test_alt, test_alt+2, relative=True) + self.assert_servo_channel_value(3, 1000+10*self.get_parameter("TKOFF_THR_MAX")) + + # Check whether we're still at max throttle past TKOFF_LVL_ALT. + test_alt = self.get_parameter("TKOFF_LVL_ALT")+10 + self.wait_altitude(test_alt, test_alt+2, relative=True) + self.assert_servo_channel_value(3, 1000+10*(self.get_parameter("TKOFF_THR_MAX")), operator.le) + self.assert_servo_channel_value(3, 1000+10*(self.get_parameter("TKOFF_THR_MAX"))-1, operator.ge) + + # Wait for the takeoff to complete. + target_alt = self.get_parameter("TKOFF_ALT") + self.wait_altitude(target_alt-5, target_alt, relative=True) + + self.fly_home_land_and_disarm() + + def TakeoffTakeoff2(self): + '''Test the behaviour of a takeoff in TAKEOFF mode, pt2. + + Conditions: + - ARSPD_USE=1 + - TKOFF_OPTIONS[0]=1 + - TKOFF_THR_MAX < THR_MAX + ''' + + self.customise_SITL_commandline( + [], + model='plane-catapult', + defaults_filepath=self.model_defaults_filepath("plane") + ) + self.set_parameters({ + "ARSPD_USE": 1.0, + "THR_MAX": 100.0, + "TKOFF_LVL_ALT": 80.0, + "TKOFF_ALT": 150.0, + "TKOFF_OPTIONS": 1.0, + "TKOFF_THR_MINACC": 3.0, + "TKOFF_THR_MAX": 80.0, + "TECS_PITCH_MAX": 35.0, + "PTCH_LIM_MAX_DEG": 35.0, + }) + self.change_mode("TAKEOFF") + + self.wait_ready_to_arm() + self.arm_vehicle() + + # Throw the catapult. + self.set_servo(7, 2000) + + # Check whether we're at max throttle below TKOFF_LVL_ALT. + test_alt = self.get_parameter("TKOFF_LVL_ALT")-10 + self.wait_altitude(test_alt, test_alt+2, relative=True) + self.assert_servo_channel_value(3, 1000+10*(self.get_parameter("TKOFF_THR_MAX")), operator.le) + self.assert_servo_channel_value(3, 1000+10*(self.get_parameter("TKOFF_THR_MAX"))-1, operator.ge) + + # Check whether we've receded from max throttle past TKOFF_LVL_ALT. + test_alt = self.get_parameter("TKOFF_LVL_ALT")+10 + self.wait_altitude(test_alt, test_alt+2, relative=True) + self.assert_servo_channel_value(3, 1000+10*(self.get_parameter("TKOFF_THR_MAX")), operator.le) + self.assert_servo_channel_value(3, 1000+10*(self.get_parameter("TKOFF_THR_MIN"))-1, operator.ge) + + # Wait for the takeoff to complete. + target_alt = self.get_parameter("TKOFF_ALT") + self.wait_altitude(target_alt-5, target_alt, relative=True) + + self.fly_home_land_and_disarm() + + def TakeoffTakeoff3(self): + '''Test the behaviour of a takeoff in TAKEOFF mode, pt3. + + This is the same as case #1, but with disabled airspeed sensor. + + Conditions: + - ARSPD_USE=0 + - TKOFF_OPTIONS[0]=0 + - TKOFF_THR_MAX < THR_MAX + ''' + + self.customise_SITL_commandline( + [], + model='plane-catapult', + defaults_filepath=self.model_defaults_filepath("plane") + ) + self.set_parameters({ + "ARSPD_USE": 0.0, + "THR_MAX": 100.0, + "TKOFF_LVL_ALT": 30.0, + "TKOFF_ALT": 100.0, + "TKOFF_OPTIONS": 0.0, + "TKOFF_THR_MINACC": 3.0, + "TKOFF_THR_MAX": 80.0, + "TECS_PITCH_MAX": 35.0, + "PTCH_LIM_MAX_DEG": 35.0, + }) + self.change_mode("TAKEOFF") + + self.wait_ready_to_arm() + self.arm_vehicle() + + # Throw the catapult. + self.set_servo(7, 2000) + + # Check whether we're at max throttle below TKOFF_LVL_ALT. + test_alt = self.get_parameter("TKOFF_LVL_ALT")-10 + self.wait_altitude(test_alt, test_alt+2, relative=True) + self.assert_servo_channel_value(3, 1000+10*self.get_parameter("TKOFF_THR_MAX")) + + # Check whether we're still at max throttle past TKOFF_LVL_ALT. + test_alt = self.get_parameter("TKOFF_LVL_ALT")+10 + self.wait_altitude(test_alt, test_alt+2, relative=True) + self.assert_servo_channel_value(3, 1000+10*(self.get_parameter("TKOFF_THR_MAX")), operator.le) + self.assert_servo_channel_value(3, 1000+10*(self.get_parameter("TKOFF_THR_MAX"))-1, operator.ge) + + # Wait for the takeoff to complete. + target_alt = self.get_parameter("TKOFF_ALT") + self.wait_altitude(target_alt-5, target_alt, relative=True) + + self.fly_home_land_and_disarm() + + def TakeoffTakeoff4(self): + '''Test the behaviour of a takeoff in TAKEOFF mode, pt4. + + This is the same as case #3, but with almost stock parameters and without a catapult. + + Conditions: + - ARSPD_USE=0 + ''' + + self.customise_SITL_commandline( + [], + model='plane-catapult', + defaults_filepath=self.model_defaults_filepath("plane") + ) + self.set_parameters({ + "ARSPD_USE": 0.0, + }) + self.change_mode("TAKEOFF") + + self.wait_ready_to_arm() + self.arm_vehicle() + + # Check whether we're at max throttle below TKOFF_LVL_ALT. + test_alt = self.get_parameter("TKOFF_LVL_ALT")-10 + self.wait_altitude(test_alt, test_alt+2, relative=True) + self.assert_servo_channel_value(3, 1000+10*(self.get_parameter("THR_MAX")), operator.le) + self.assert_servo_channel_value(3, 1000+10*(self.get_parameter("THR_MAX"))-10, operator.ge) + + # Check whether we're still at max throttle past TKOFF_LVL_ALT. + test_alt = self.get_parameter("TKOFF_LVL_ALT")+10 + self.wait_altitude(test_alt, test_alt+2, relative=True) + self.assert_servo_channel_value(3, 1000+10*(self.get_parameter("THR_MAX")), operator.le) + self.assert_servo_channel_value(3, 1000+10*(self.get_parameter("THR_MAX"))-10, operator.ge) + + # Wait for the takeoff to complete. + target_alt = self.get_parameter("TKOFF_ALT") + self.wait_altitude(target_alt-5, target_alt, relative=True) + + self.fly_home_land_and_disarm() + def DCMFallback(self): '''Really annoy the EKF and force fallback''' self.reboot_sitl() @@ -4556,8 +5117,8 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): wipe=True) self.context_push() - self.install_applet_script(applet_script) - self.install_applet_script(airshow, install_name=trick72) + self.install_applet_script_context(applet_script) + self.install_applet_script_context(airshow, install_name=trick72) self.context_collect('STATUSTEXT') self.reboot_sitl() @@ -4603,8 +5164,6 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): self.progress("Finished trick, max error=%.1fm" % highest_error) self.disarm_vehicle(force=True) - self.remove_installed_script(applet_script) - self.remove_installed_script(trick72) messages = self.context_collection('STATUSTEXT') self.context_pop() self.reboot_sitl() @@ -5400,6 +5959,99 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): self.context_pop() self.fly_home_land_and_disarm() + def ScriptStats(self): + '''test script stats logging''' + self.context_push() + self.set_parameters({ + 'SCR_ENABLE': 1, + 'SCR_DEBUG_OPTS': 8, # runtime memory usage and time + }) + self.install_test_scripts_context([ + "math.lua", + "strings.lua", + ]) + self.install_example_script_context('simple_loop.lua') + self.context_collect('STATUSTEXT') + + self.reboot_sitl() + + self.wait_statustext('hello, world') + delay = 20 + self.delay_sim_time(delay, reason='gather some stats') + self.wait_statustext("math.lua exceeded time limit", check_context=True, timeout=0) + + dfreader = self.dfreader_for_current_onboard_log() + seen_hello_world = False +# runtime = None + while True: + m = dfreader.recv_match(type=['SCR']) + if m is None: + break + if m.Name == "simple_loop.lua": + seen_hello_world = True +# if m.Name == "math.lua": +# runtime = m.Runtime + + if not seen_hello_world: + raise NotAchievedException("Did not see simple_loop.lua script") + +# self.progress(f"math took {runtime} seconds to run over {delay} seconds") +# if runtime == 0: +# raise NotAchievedException("Expected non-zero runtime for math") + + self.context_pop() + self.reboot_sitl() + + def GPSPreArms(self): + '''ensure GPS prearm checks work''' + self.wait_ready_to_arm() + self.start_subtest('DroneCAN sanity checks') + self.set_parameter('GPS1_TYPE', 9) + self.set_parameter('GPS2_TYPE', 9) + self.set_parameter('GPS1_CAN_OVRIDE', 130) + self.set_parameter('GPS2_CAN_OVRIDE', 130) + self.assert_prearm_failure( + "set for multiple GPS", + other_prearm_failures_fatal=False, + ) + + def SetHomeAltChange(self): + '''check modes retain altitude when home alt changed''' + for mode in 'FBWB', 'CRUISE', 'LOITER': + self.wait_ready_to_arm() + home = self.home_position_as_mav_location() + self.takeoff(20) + higher_home = home + higher_home.alt += 40 + self.set_home(higher_home) + self.wait_altitude(15, 25, relative=True, minimum_duration=10) + self.disarm_vehicle(force=True) + self.reboot_sitl() + + def ForceArm(self): + '''check force-arming functionality''' + self.set_parameter("SIM_GPS_DISABLE", 1) + # 21196 is the mavlink standard, 2989 is legacy + for magic_value in 21196, 2989: + self.wait_sensor_state(mavutil.mavlink.MAV_SYS_STATUS_PREARM_CHECK, + present=True, + enabled=True, + healthy=False, + ) + self.run_cmd( + mavutil.mavlink.MAV_CMD_COMPONENT_ARM_DISARM, + p1=1, # ARM + p2=0, + want_result=mavutil.mavlink.MAV_RESULT_FAILED, + ) + self.run_cmd( + mavutil.mavlink.MAV_CMD_COMPONENT_ARM_DISARM, + p1=1, # ARM + p2=magic_value, + want_result=mavutil.mavlink.MAV_RESULT_ACCEPTED, + ) + self.disarm_vehicle() + def tests(self): '''return list of all tests''' ret = super(AutoTestPlane, self).tests() @@ -5427,11 +6079,19 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): self.FenceRTLRally, self.FenceRetRally, self.FenceAltCeilFloor, + self.FenceMinAltAutoEnable, + self.FenceMinAltEnableAutoland, + self.FenceMinAltAutoEnableAbort, + self.FenceAutoEnableDisableSwitch, + Test(self.FenceCircleExclusionAutoEnable, speedup=20), + self.FenceEnableDisableSwitch, + self.FenceEnableDisableAux, self.FenceBreachedChangeMode, self.FenceNoFenceReturnPoint, self.FenceNoFenceReturnPointInclusion, self.FenceDisableUnderAction, - self.ADSB, + self.ADSBFailActionRTL, + self.ADSBResumeActionResumeLoiter, self.SimADSB, self.Button, self.FRSkySPort, @@ -5470,6 +6130,14 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): self.AHRS_ORIENTATION, self.AHRSTrim, self.LandingDrift, + self.TakeoffAuto1, + self.TakeoffAuto2, + self.TakeoffAuto3, + self.TakeoffAuto4, + self.TakeoffTakeoff1, + self.TakeoffTakeoff2, + self.TakeoffTakeoff3, + self.TakeoffTakeoff4, self.ForcedDCM, self.DCMFallback, self.MAVFTP, @@ -5511,6 +6179,10 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): self.MinThrottle, self.ClimbThrottleSaturation, self.GuidedAttitudeNoGPS, + self.ScriptStats, + self.GPSPreArms, + self.SetHomeAltChange, + self.ForceArm, ]) return ret @@ -5519,4 +6191,5 @@ class AutoTestPlane(vehicle_test_suite.TestSuite): "LandingDrift": "Flapping test. See https://github.com/ArduPilot/ardupilot/issues/20054", "InteractTest": "requires user interaction", "ClimbThrottleSaturation": "requires https://github.com/ArduPilot/ardupilot/pull/27106 to pass", + "SetHomeAltChange": "https://github.com/ArduPilot/ardupilot/issues/5672", } diff --git a/Tools/autotest/ardusub.py b/Tools/autotest/ardusub.py index bca38d192b..e33b4a588b 100644 --- a/Tools/autotest/ardusub.py +++ b/Tools/autotest/ardusub.py @@ -36,6 +36,22 @@ class Joystick(): Lateral = 6 +# Values for EK3_MAG_CAL +class MagCal(): + WHEN_FLYING = 0 + WHEN_MANOEUVRING = 1 + NEVER = 2 + AFTER_FIRST_CLIMB = 3 + ALWAYS = 4 + + +# Values for XKFS.MAG_FUSION +class MagFuseSel(): + NOT_FUSING = 0 + FUSE_YAW = 1 + FUSE_MAG = 2 + + class AutoTestSub(vehicle_test_suite.TestSuite): @staticmethod def get_not_armable_mode_list(): @@ -382,6 +398,7 @@ class AutoTestSub(vehicle_test_suite.TestSuite): self.disarm_vehicle() self.context_pop() + self.reboot_sitl() # e.g. revert rangefinder configuration def SimTerrainMission(self): """Mission at a constant height above synthetic sea floor""" @@ -421,6 +438,7 @@ class AutoTestSub(vehicle_test_suite.TestSuite): self.disarm_vehicle() self.context_pop() + self.reboot_sitl() # e.g. revert rangefinder configuration def ModeChanges(self, delta=0.2): """Check if alternating between ALTHOLD, STABILIZE, POSHOLD and SURFTRAK (mode 21) affects altitude""" @@ -737,6 +755,35 @@ class AutoTestSub(vehicle_test_suite.TestSuite): self._MAV_CMD_CONDITION_YAW(self.run_cmd) self._MAV_CMD_CONDITION_YAW(self.run_cmd_int) + def MAV_CMD_DO_REPOSITION(self): + """Move vehicle using MAV_CMD_DO_REPOSITION""" + self.wait_ready_to_arm() + self.arm_vehicle() + + # Dive so that rangefinder is in range, required for MAV_FRAME_GLOBAL_TERRAIN_ALT + start_altitude = -25 + pwm = 1300 if self.get_altitude(relative=True) > start_altitude else 1700 + self.set_rc(Joystick.Throttle, pwm) + self.wait_altitude(altitude_min=start_altitude-1, altitude_max=start_altitude, relative=False, timeout=120) + self.set_rc(Joystick.Throttle, 1500) + self.change_mode('GUIDED') + + loc = self.mav.location() + + # Reposition, alt relative to surface + loc = self.offset_location_ne(loc, 10, 10) + loc.alt = start_altitude + self.send_do_reposition(loc, frame=mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT) + self.wait_location(loc, timeout=120) + + # Reposition, alt relative to seafloor + loc = self.offset_location_ne(loc, 10, 10) + loc.alt = -start_altitude + self.send_do_reposition(loc, frame=mavutil.mavlink.MAV_FRAME_GLOBAL_TERRAIN_ALT) + self.wait_location(loc, timeout=120) + + self.disarm_vehicle() + def TerrainMission(self): """Mission using surface tracking""" @@ -819,6 +866,86 @@ class AutoTestSub(vehicle_test_suite.TestSuite): # restart GPS driver self.reboot_sitl() + def backup_origin(self): + """Test ORIGIN_LAT and ORIGIN_LON parameters""" + + self.context_push() + self.set_parameters({ + 'GPS1_TYPE': 0, # Disable GPS + 'EK3_SRC1_POSXY': 0, # Make sure EK3_SRC parameters do not refer to GPS + 'EK3_SRC1_VELXY': 0, # Make sure EK3_SRC parameters do not refer to GPS + 'ORIGIN_LAT': 47.607584, + 'ORIGIN_LON': -122.343911, + }) + self.reboot_sitl() + self.context_collect('STATUSTEXT') + + # Wait for the EKF to be happy in constant position mode + self.wait_ready_to_arm_const_pos() + + if self.current_onboard_log_contains_message('ORGN'): + raise NotAchievedException("Found unexpected ORGN message") + + # This should set the origin and write a record to ORGN + self.arm_vehicle() + + self.wait_statustext('Using backup location', check_context=True) + + if not self.current_onboard_log_contains_message('ORGN'): + raise NotAchievedException("Did not find expected ORGN message") + + self.disarm_vehicle() + self.context_pop() + + def assert_mag_fusion_selection(self, expect_sel): + """Get the most recent XKFS message and check the MAG_FUSION value""" + self.progress("Expect mag fusion selection %d" % expect_sel) + mlog = self.dfreader_for_current_onboard_log() + found_sel = MagFuseSel.NOT_FUSING + while True: + m = mlog.recv_match(type='XKFS') + if m is None: + break + found_sel = m.MAG_FUSION + if found_sel != expect_sel: + raise NotAchievedException("Expected mag fusion selection %d, found %d" % (expect_sel, found_sel)) + + def fuse_mag(self): + """Test EK3_MAG_CAL values""" + + # WHEN_FLYING: switch to FUSE_MAG after sub is armed for 5 seconds; switch to FUSE_YAW on disarm + self.set_parameters({'EK3_MAG_CAL': MagCal.WHEN_FLYING}) + self.reboot_sitl() + self.wait_ready_to_arm() + self.assert_mag_fusion_selection(MagFuseSel.FUSE_YAW) + self.arm_vehicle() + self.delay_sim_time(10) + self.assert_mag_fusion_selection(MagFuseSel.FUSE_MAG) + self.disarm_vehicle() + self.delay_sim_time(1) + self.assert_mag_fusion_selection(MagFuseSel.FUSE_YAW) + + # AFTER_FIRST_CLIMB: switch to FUSE_MAG after sub is armed and descends 0.5m; switch to FUSE_YAW on disarm + self.set_parameters({'EK3_MAG_CAL': MagCal.AFTER_FIRST_CLIMB}) + self.reboot_sitl() + self.wait_ready_to_arm() + self.assert_mag_fusion_selection(MagFuseSel.FUSE_YAW) + altitude = self.get_altitude(relative=True) + self.arm_vehicle() + self.set_rc(Joystick.Throttle, 1300) + self.wait_altitude(altitude_min=altitude-4, altitude_max=altitude-3, relative=False, timeout=60) + self.set_rc(Joystick.Throttle, 1500) + self.assert_mag_fusion_selection(MagFuseSel.FUSE_MAG) + self.disarm_vehicle() + self.delay_sim_time(1) + self.assert_mag_fusion_selection(MagFuseSel.FUSE_YAW) + + # ALWAYS + self.set_parameters({'EK3_MAG_CAL': MagCal.ALWAYS}) + self.reboot_sitl() + self.wait_ready_to_arm() + self.assert_mag_fusion_selection(MagFuseSel.FUSE_MAG) + def tests(self): '''return list of all tests''' ret = super(AutoTestSub, self).tests() @@ -844,8 +971,11 @@ class AutoTestSub(vehicle_test_suite.TestSuite): self.MAV_CMD_MISSION_START, self.MAV_CMD_DO_CHANGE_SPEED, self.MAV_CMD_CONDITION_YAW, + self.MAV_CMD_DO_REPOSITION, self.TerrainMission, self.SetGlobalOrigin, + self.backup_origin, + self.fuse_mag, ]) return ret diff --git a/Tools/autotest/default_params/copter-heli-dual.parm b/Tools/autotest/default_params/copter-heli-dual.parm index 5b5e58adda..38d6818e41 100644 --- a/Tools/autotest/default_params/copter-heli-dual.parm +++ b/Tools/autotest/default_params/copter-heli-dual.parm @@ -1,9 +1,9 @@ FRAME_CLASS 11 ATC_ANG_PIT_P 4.5 ATC_ANG_YAW_P 4.5 -ATC_RAT_PIT_D 0.0005 -ATC_RAT_PIT_P 0.02 -ATC_RAT_PIT_FF 0.0 +ATC_RAT_PIT_D 0.005 +ATC_RAT_PIT_P 0.15 +ATC_RAT_PIT_FF 0.44 ATC_RAT_YAW_D 0.0015 ATC_RAT_YAW_P 0.14685 ATC_HOVR_ROL_TRM 0 diff --git a/Tools/autotest/default_params/glider.parm b/Tools/autotest/default_params/glider.parm index e0bc1102fb..2a8a7c57d8 100644 --- a/Tools/autotest/default_params/glider.parm +++ b/Tools/autotest/default_params/glider.parm @@ -1,6 +1,3 @@ -LIM_PITCH_MAX 1000 -LIM_PITCH_MIN -1500 -LIM_ROLL_CD 3000 THR_MAX 0 THR_FAILSAFE 2 @@ -9,6 +6,11 @@ RTL_RADIUS 175 WP_RADIUS 90 KFF_RDDRMIX 0.07 +# fixed wing tuning +PTCH_LIM_MAX_DEG 10 +PTCH_LIM_MIN_DEG -15 +ROLL_LIMIT_DEG 30 + RLL_RATE_FF 0.6 RLL_RATE_P 0.5 RLL_RATE_I 0.14 @@ -26,9 +28,10 @@ PTCH2SRV_TCONST 0.45 PTCH2SRV_RMAX_UP 75 PTCH2SRV_RMAX_DN 75 - -ARSPD_FBW_MIN 17 -ARSPD_FBW_MAX 45 +AIRSPEED_CRUISE 38 +AIRSPEED_MIN 17 +AIRSPEED_MAX 45 +ARSPD_USE 1 HOME_RESET_ALT -1 @@ -47,3 +50,40 @@ NAVL1_LIM_BANK 30 SCHED_LOOP_RATE 200 +WP_LOITER_RAD 230 + +CHUTE_ENABLED 1.000000 +CHUTE_TYPE 10.000000 +CHUTE_SERVO_ON 1900.000000 +CHUTE_OPTIONS 1.000000 + +INS_ACCSCAL_X 1.001000 +INS_ACCSCAL_Y 1.001000 +INS_ACCSCAL_Z 1.001000 +INS_ACCOFFS_X 0.001000 +INS_ACCOFFS_Y 0.001000 +INS_ACCOFFS_Z 0.001000 +INS_ACC2SCAL_X 1.001000 +INS_ACC2SCAL_Y 1.001000 +INS_ACC2SCAL_Z 1.001000 +INS_ACC2OFFS_X 0.001000 +INS_ACC2OFFS_Y 0.001000 +INS_ACC2OFFS_Z 0.001000 + +SIM_SERVO_SPEED 0.110000 +SIM_SERVO_DELAY 0.010000 +SIM_SERVO_FILTER 10 + +SIM_GLD_BLN_BRST 50000 + +SERVO1_MIN 1000 +SERVO1_MAX 2000 +SERVO1_FUNCTION 0 +SERVO2_FUNCTION 4 +SERVO3_TRIM 1460.000000 +SERVO3_REVERSED 1 +SERVO3_FUNCTION 19 +SERVO4_REVERSED 1 +SERVO5_FUNCTION 4 +SERVO6_FUNCTION 56 +SERVO9_FUNCTION 27 diff --git a/Tools/autotest/default_params/rover-omni3mecanum.parm b/Tools/autotest/default_params/rover-omni3mecanum.parm new file mode 100644 index 0000000000..3b5bfb1feb --- /dev/null +++ b/Tools/autotest/default_params/rover-omni3mecanum.parm @@ -0,0 +1,25 @@ +ACRO_TURN_RATE 300.000000 +ATC_SPEED_P 0.200000 +ATC_SPEED_D 0.000010 +ATC_STR_RAT_D 0.000010 +ATC_STR_RAT_FF 0.100000 +ATC_STR_RAT_I 0.010000 +ATC_STR_RAT_MAX 360.000000 +ATC_STR_RAT_P 0.030000 +CRUISE_SPEED 1.0 +CRUISE_THROTTLE 42.0 +FRAME_TYPE 4 +PSC_VEL_P 0.500000 +RC2_MAX 2000 +RC2_MIN 1000 +RC4_MAX 2000 +RC4_MIN 1000 +SERVO1_FUNCTION 33 +SERVO2_FUNCTION 34 +SERVO2_MAX 2000 +SERVO2_MIN 1000 +SERVO3_FUNCTION 35 +WP_PIVOT_RATE 120.0 +WP_SPEED 1.0 + + diff --git a/Tools/autotest/helicopter.py b/Tools/autotest/helicopter.py index 0f02f32242..14fbb1513d 100644 --- a/Tools/autotest/helicopter.py +++ b/Tools/autotest/helicopter.py @@ -224,102 +224,68 @@ class AutoTestHelicopter(AutoTestCopter): def PosHoldTakeOff(self): """ensure vehicle stays put until it is ready to fly""" - self.context_push() + self.set_parameter("PILOT_TKOFF_ALT", 700) + self.change_mode('POSHOLD') + self.zero_throttle() + self.set_rc(8, 1000) + self.wait_ready_to_arm() + # Arm + self.arm_vehicle() + self.progress("Raising rotor speed") + self.set_rc(8, 2000) + self.progress("wait for rotor runup to complete") + self.wait_servo_channel_value(8, 1659, timeout=10) + self.delay_sim_time(20) + # check we are still on the ground... + max_relalt = 1 # metres + relative_alt = self.get_altitude(relative=True) + if abs(relative_alt) > max_relalt: + raise NotAchievedException("Took off prematurely (abs(%f)>%f)" % + (relative_alt, max_relalt)) - ex = None - try: - self.set_parameter("PILOT_TKOFF_ALT", 700) - self.change_mode('POSHOLD') - self.zero_throttle() - self.set_rc(8, 1000) - self.wait_ready_to_arm() - # Arm - self.arm_vehicle() - self.progress("Raising rotor speed") - self.set_rc(8, 2000) - self.progress("wait for rotor runup to complete") - self.wait_servo_channel_value(8, 1659, timeout=10) - self.delay_sim_time(20) - # check we are still on the ground... - m = self.mav.recv_match(type='GLOBAL_POSITION_INT', blocking=True) - max_relalt_mm = 1000 - if abs(m.relative_alt) > max_relalt_mm: - raise NotAchievedException("Took off prematurely (abs(%f)>%f)" % - (m.relative_alt, max_relalt_mm)) + self.progress("Pushing collective past half-way") + self.set_rc(3, 1600) + self.delay_sim_time(0.5) + self.hover() - self.progress("Pushing collective past half-way") - self.set_rc(3, 1600) - self.delay_sim_time(0.5) - self.hover() + # make sure we haven't already reached alt: + relative_alt = self.get_altitude(relative=True) + max_initial_alt = 1.5 # metres + if abs(relative_alt) > max_initial_alt: + raise NotAchievedException("Took off too fast (%f > %f" % + (abs(relative_alt), max_initial_alt)) - # make sure we haven't already reached alt: - m = self.mav.recv_match(type='GLOBAL_POSITION_INT', blocking=True) - max_initial_alt = 1500 - if abs(m.relative_alt) > max_initial_alt: - raise NotAchievedException("Took off too fast (%f > %f" % - (abs(m.relative_alt), max_initial_alt)) - - self.progress("Monitoring takeoff-to-alt") - self.wait_altitude(6.9, 8, relative=True) - - self.progress("Making sure we stop at our takeoff altitude") - tstart = self.get_sim_time() - while self.get_sim_time() - tstart < 5: - m = self.mav.recv_match(type='GLOBAL_POSITION_INT', blocking=True) - delta = abs(7000 - m.relative_alt) - self.progress("alt=%f delta=%f" % (m.relative_alt/1000, - delta/1000)) - if delta > 1000: - raise NotAchievedException("Failed to maintain takeoff alt") - self.progress("takeoff OK") - except Exception as e: - self.print_exception_caught(e) - ex = e + self.progress("Monitoring takeoff-to-alt") + self.wait_altitude(6, 8, relative=True, minimum_duration=5) + self.progress("takeoff OK") self.land_and_disarm() - self.context_pop() - - if ex is not None: - raise ex - def StabilizeTakeOff(self): """Fly stabilize takeoff""" - self.context_push() + self.change_mode('STABILIZE') + self.set_rc(3, 1000) + self.set_rc(8, 1000) + self.wait_ready_to_arm() + self.arm_vehicle() + self.set_rc(8, 2000) + self.progress("wait for rotor runup to complete") + self.wait_servo_channel_value(8, 1659, timeout=10) + self.delay_sim_time(20) + # check we are still on the ground... + relative_alt = self.get_altitude(relative=True) + if abs(relative_alt) > 0.1: + raise NotAchievedException("Took off prematurely") + self.progress("Pushing throttle past half-way") + self.set_rc(3, 1650) - ex = None - try: - self.change_mode('STABILIZE') - self.set_rc(3, 1000) - self.set_rc(8, 1000) - self.wait_ready_to_arm() - self.arm_vehicle() - self.set_rc(8, 2000) - self.progress("wait for rotor runup to complete") - self.wait_servo_channel_value(8, 1659, timeout=10) - self.delay_sim_time(20) - # check we are still on the ground... - m = self.mav.recv_match(type='GLOBAL_POSITION_INT', blocking=True) - if abs(m.relative_alt) > 100: - raise NotAchievedException("Took off prematurely") - self.progress("Pushing throttle past half-way") - self.set_rc(3, 1650) + self.progress("Monitoring takeoff") + self.wait_altitude(6.9, 8, relative=True) - self.progress("Monitoring takeoff") - self.wait_altitude(6.9, 8, relative=True) - - self.progress("takeoff OK") - except Exception as e: - self.print_exception_caught(e) - ex = e + self.progress("takeoff OK") self.land_and_disarm() - self.context_pop() - - if ex is not None: - raise ex - def SplineWaypoint(self, timeout=600): """ensure basic spline functionality works""" self.load_mission("copter_spline_mission.txt", strict=False) @@ -331,13 +297,7 @@ class AutoTestHelicopter(AutoTestCopter): self.delay_sim_time(20) self.change_mode("AUTO") self.set_rc(3, 1500) - tstart = self.get_sim_time() - while True: - if self.get_sim_time() - tstart > timeout: - raise AutoTestTimeoutException("Vehicle did not disarm after mission") - if not self.armed(): - break - self.delay_sim_time(1) + self.wait_disarmed(timeout=600) self.progress("Lowering rotor speed") self.set_rc(8, 1000) @@ -380,13 +340,15 @@ class AutoTestHelicopter(AutoTestCopter): """Check autorotation power recovery behaviour""" RAMP_TIME = 4 AROT_RAMP_TIME = 2 - self.set_parameter("H_RSC_AROT_MN_EN", 1) - self.set_parameter("H_RSC_AROT_ENG_T", AROT_RAMP_TIME) - self.set_parameter("H_RSC_AROT_IDLE", 20) - self.set_parameter("H_RSC_RAMP_TIME", RAMP_TIME) - self.set_parameter("H_RSC_IDLE", 0) start_alt = 100 # metres - self.set_parameter("PILOT_TKOFF_ALT", start_alt * 100) + self.set_parameters({ + "H_RSC_AROT_MN_EN": 1, + "H_RSC_AROT_ENG_T": AROT_RAMP_TIME, + "H_RSC_AROT_IDLE": 20, + "H_RSC_RAMP_TIME": RAMP_TIME, + "H_RSC_IDLE": 0, + "PILOT_TKOFF_ALT": start_alt * 100, + }) self.change_mode('POSHOLD') self.set_rc(3, 1000) self.set_rc(8, 1000) @@ -680,7 +642,14 @@ class AutoTestHelicopter(AutoTestCopter): def AirspeedDrivers(self, timeout=600): '''Test AirSpeed drivers''' + # Copter's airspeed sensors are off by default + self.set_parameters({ + "ARSPD_ENABLE": 1, + "ARSPD_TYPE": 2, # Analog airspeed driver + "ARSPD_PIN": 1, # Analog airspeed driver pin for SITL + }) # set the start location to CMAC to use same test script as other vehicles + self.sitl_start_loc = mavutil.location(-35.362881, 149.165222, 582.000000, 90.0) # CMAC self.customise_SITL_commandline(["--home", "%s,%s,%s,%s" % (-35.362881, 149.165222, 582.000000, 90.0)]) @@ -703,12 +672,6 @@ class AutoTestHelicopter(AutoTestCopter): if delta > 3: raise NotAchievedException("Airspeed mismatch (as1=%f as2=%f)" % (airspeed[0], airspeed[1])) - # Copter's airspeed sensors are off by default - self.set_parameter("ARSPD_ENABLE", 1) - self.set_parameter("ARSPD_TYPE", 2) # Analog airspeed driver - self.set_parameter("ARSPD_PIN", 1) # Analog airspeed driver pin for SITL - self.reboot_sitl() - airspeed_sensors = [ ("MS5525", 3, 1), ("DLVR", 7, 2), @@ -729,11 +692,10 @@ class AutoTestHelicopter(AutoTestCopter): raise NotAchievedException("Never saw an airspeed1") if airspeed[1] is None: raise NotAchievedException("Never saw an airspeed2") - self.context_pop() if not self.current_onboard_log_contains_message("ARSP"): raise NotAchievedException("Expected ARSP log message") - - self.reboot_sitl() + self.disarm_vehicle() + self.context_pop() def TurbineStart(self, timeout=200): """Check Turbine Start Feature""" @@ -805,43 +767,28 @@ class AutoTestHelicopter(AutoTestCopter): def PIDNotches(self): """Use dynamic harmonic notch to control motor noise.""" self.progress("Flying with PID notches") - self.context_push() + self.set_parameters({ + "FILT1_TYPE": 1, + "FILT2_TYPE": 1, + "AHRS_EKF_TYPE": 10, + "INS_LOG_BAT_MASK": 3, + "INS_LOG_BAT_OPT": 0, + "INS_GYRO_FILTER": 100, # set the gyro filter high so we can observe behaviour + "LOG_BITMASK": 65535, + "LOG_DISARMED": 0, + "SIM_VIB_FREQ_X": 120, # roll + "SIM_VIB_FREQ_Y": 120, # pitch + "SIM_VIB_FREQ_Z": 180, # yaw + "FILT1_NOTCH_FREQ": 120, + "FILT2_NOTCH_FREQ": 180, + "ATC_RAT_RLL_NEF": 1, + "ATC_RAT_PIT_NEF": 1, + "ATC_RAT_YAW_NEF": 2, + "SIM_GYR1_RND": 5, + }) + self.reboot_sitl() - ex = None - try: - self.set_parameters({ - "FILT1_TYPE": 1, - "FILT2_TYPE": 1, - "AHRS_EKF_TYPE": 10, - "INS_LOG_BAT_MASK": 3, - "INS_LOG_BAT_OPT": 0, - "INS_GYRO_FILTER": 100, # set the gyro filter high so we can observe behaviour - "LOG_BITMASK": 65535, - "LOG_DISARMED": 0, - "SIM_VIB_FREQ_X": 120, # roll - "SIM_VIB_FREQ_Y": 120, # pitch - "SIM_VIB_FREQ_Z": 180, # yaw - "FILT1_NOTCH_FREQ": 120, - "FILT2_NOTCH_FREQ": 180, - "ATC_RAT_RLL_NEF": 1, - "ATC_RAT_PIT_NEF": 1, - "ATC_RAT_YAW_NEF": 2, - "SIM_GYR1_RND": 5, - }) - self.reboot_sitl() - - self.takeoff(10, mode="ALT_HOLD") - - freq, hover_throttle, peakdb1 = self.hover_and_check_matched_frequency_with_fft(5, 20, 350, reverse=True) - - except Exception as e: - self.print_exception_caught(e) - ex = e - - self.context_pop() - - if ex is not None: - raise ex + self.hover_and_check_matched_frequency_with_fft(5, 20, 350, reverse=True, takeoff=True) def AutoTune(self): """Test autotune mode""" @@ -876,31 +823,12 @@ class AutoTestHelicopter(AutoTestCopter): self.wait_statustext('AutoTune: Success', timeout=1000) now = self.get_sim_time() self.progress("AUTOTUNE OK (%u seconds)" % (now - tstart)) - self.land_and_disarm() + self.autotune_land_and_save_gains() # test pitch rate P and Rate D tuning self.set_parameters({ "AUTOTUNE_AXES": 2, "AUTOTUNE_SEQ": 2, - "AUTOTUNE_GN_MAX": 2.0, - }) - - # Conduct testing from althold - self.takeoff(10, mode="ALT_HOLD") - - # hold position in loiter - self.change_mode('AUTOTUNE') - - tstart = self.get_sim_time() - self.wait_statustext('AutoTune: Success', timeout=1000) - now = self.get_sim_time() - self.progress("AUTOTUNE OK (%u seconds)" % (now - tstart)) - self.land_and_disarm() - - # test Roll rate P and Rate D tuning - self.set_parameters({ - "AUTOTUNE_AXES": 1, - "AUTOTUNE_SEQ": 2, "AUTOTUNE_GN_MAX": 1.8, }) @@ -914,13 +842,34 @@ class AutoTestHelicopter(AutoTestCopter): self.wait_statustext('AutoTune: Success', timeout=1000) now = self.get_sim_time() self.progress("AUTOTUNE OK (%u seconds)" % (now - tstart)) - self.land_and_disarm() + self.autotune_land_and_save_gains() + + # test Roll rate P and Rate D tuning + self.set_parameters({ + "AUTOTUNE_AXES": 1, + "AUTOTUNE_SEQ": 2, + "AUTOTUNE_GN_MAX": 1.6, + }) + + # Conduct testing from althold + self.takeoff(10, mode="ALT_HOLD") + + # hold position in loiter + self.change_mode('AUTOTUNE') + + tstart = self.get_sim_time() + self.wait_statustext('AutoTune: Success', timeout=1000) + now = self.get_sim_time() + self.progress("AUTOTUNE OK (%u seconds)" % (now - tstart)) + self.autotune_land_and_save_gains() # test Roll and pitch angle P tuning self.set_parameters({ "AUTOTUNE_AXES": 3, "AUTOTUNE_SEQ": 4, - "AUTOTUNE_GN_MAX": 2.0, + "AUTOTUNE_FRQ_MIN": 5, + "AUTOTUNE_FRQ_MAX": 50, + "AUTOTUNE_GN_MAX": 1.6, }) # Conduct testing from althold @@ -933,13 +882,56 @@ class AutoTestHelicopter(AutoTestCopter): self.wait_statustext('AutoTune: Success', timeout=1000) now = self.get_sim_time() self.progress("AUTOTUNE OK (%u seconds)" % (now - tstart)) - self.land_and_disarm() + self.autotune_land_and_save_gains() - # test yaw FF, rate P and Rate D, and angle P tuning + # test yaw FF and rate P and Rate D self.set_parameters({ "AUTOTUNE_AXES": 4, - "AUTOTUNE_SEQ": 7, - "AUTOTUNE_GN_MAX": 2.0, + "AUTOTUNE_SEQ": 3, + "AUTOTUNE_FRQ_MIN": 10, + "AUTOTUNE_FRQ_MAX": 70, + "AUTOTUNE_GN_MAX": 1.4, + }) + + # Conduct testing from althold + self.takeoff(10, mode="ALT_HOLD") + + # hold position in loiter + self.change_mode('AUTOTUNE') + + tstart = self.get_sim_time() + self.wait_statustext('AutoTune: Success', timeout=1000) + now = self.get_sim_time() + self.progress("AUTOTUNE OK (%u seconds)" % (now - tstart)) + self.autotune_land_and_save_gains() + + # test yaw angle P tuning + self.set_parameters({ + "AUTOTUNE_AXES": 4, + "AUTOTUNE_SEQ": 4, + "AUTOTUNE_FRQ_MIN": 5, + "AUTOTUNE_FRQ_MAX": 50, + "AUTOTUNE_GN_MAX": 1.5, + }) + + # Conduct testing from althold + self.takeoff(10, mode="ALT_HOLD") + + # hold position in loiter + self.change_mode('AUTOTUNE') + + tstart = self.get_sim_time() + self.wait_statustext('AutoTune: Success', timeout=1000) + now = self.get_sim_time() + self.progress("AUTOTUNE OK (%u seconds)" % (now - tstart)) + self.autotune_land_and_save_gains() + + # tune check + self.set_parameters({ + "AUTOTUNE_AXES": 7, + "AUTOTUNE_SEQ": 16, + "AUTOTUNE_FRQ_MIN": 10, + "AUTOTUNE_FRQ_MAX": 80, }) # Conduct testing from althold @@ -954,6 +946,15 @@ class AutoTestHelicopter(AutoTestCopter): self.progress("AUTOTUNE OK (%u seconds)" % (now - tstart)) self.land_and_disarm() + def autotune_land_and_save_gains(self): + self.set_rc(3, 1000) + self.context_collect('STATUSTEXT') + self.wait_statustext(r"SIM Hit ground at ([0-9.]+) m/s", + check_context=True, + regex=True) + self.set_rc(8, 1000) + self.wait_disarmed() + def land_and_disarm(self, **kwargs): super(AutoTestHelicopter, self).land_and_disarm(**kwargs) self.progress("Killing rotor speed") diff --git a/Tools/autotest/param_metadata/param.py b/Tools/autotest/param_metadata/param.py index ec7bea2176..e8be59cfd6 100644 --- a/Tools/autotest/param_metadata/param.py +++ b/Tools/autotest/param_metadata/param.py @@ -91,6 +91,7 @@ known_units = { 'deg' : 'degrees' , # Not SI, but is some situations more user-friendly than radians 'deg/s' : 'degrees per second' , # Not SI, but is some situations more user-friendly than radians 'deg/s/s' : 'degrees per square second', # Not SI, but is some situations more user-friendly than radians + 'deg/s/s/s' : 'degrees per cube second', # Not SI, but is some situations more user-friendly than radians 'cdeg' : 'centidegrees' , # Not SI, but is some situations more user-friendly than radians 'cdeg/s' : 'centidegrees per second', # Not SI, but is some situations more user-friendly than radians 'cdeg/s/s': 'centidegrees per square second' , # Not SI, but is some situations more user-friendly than radians diff --git a/Tools/autotest/pysim/vehicleinfo.py b/Tools/autotest/pysim/vehicleinfo.py index 3682dbb01a..ca07c51b8f 100644 --- a/Tools/autotest/pysim/vehicleinfo.py +++ b/Tools/autotest/pysim/vehicleinfo.py @@ -391,6 +391,11 @@ class VehicleInfo(object): "default_params_filename": ["default_params/rover.parm", "default_params/rover-skid.parm"], }, + "rover-omni3mecanum": { + "waf_target": "bin/ardurover", + "default_params_filename": ["default_params/rover.parm", + "default_params/rover-omni3mecanum.parm"], + }, "rover-vectored": { "waf_target": "bin/ardurover", "default_params_filename": ["default_params/rover.parm", @@ -407,6 +412,12 @@ class VehicleInfo(object): "default_params_filename": ["default_params/rover.parm", "default_params/motorboat.parm"], }, + "motorboat-skid": { + "waf_target": "bin/ardurover", + "default_params_filename": ["default_params/rover.parm", + "default_params/motorboat.parm", + "default_params/rover-skid.parm"], + }, "sailboat": { "waf_target": "bin/ardurover", "default_params_filename": ["default_params/rover.parm", diff --git a/Tools/autotest/quadplane.py b/Tools/autotest/quadplane.py index 98628a45d7..1395e245c2 100644 --- a/Tools/autotest/quadplane.py +++ b/Tools/autotest/quadplane.py @@ -862,13 +862,13 @@ class AutoTestQuadPlane(vehicle_test_suite.TestSuite): guided_loc = self.home_relative_loc_ne(0, 0) guided_loc.alt = 60 self.change_mode("GUIDED") - self.do_reposition(guided_loc) + self.send_do_reposition(guided_loc) self.wait_altitude(58, 62, relative=True) self.set_parameter("Q_ASSIST_ALT", 50) # Try and descent to 40m guided_loc.alt = 40 - self.do_reposition(guided_loc) + self.send_do_reposition(guided_loc) # Expect alt assist to kick in, eg "Alt assist 48.9m" self.wait_statustext(r"Alt assist \d*.\d*m", regex=True, timeout=100) @@ -1308,9 +1308,7 @@ class AutoTestQuadPlane(vehicle_test_suite.TestSuite): def VTOLQuicktune(self): '''VTOL Quicktune''' - applet_script = "VTOL-quicktune.lua" - - self.install_applet_script(applet_script) + self.install_applet_script_context("VTOL-quicktune.lua") self.set_parameters({ "SCR_ENABLE": 1, @@ -1320,7 +1318,6 @@ class AutoTestQuadPlane(vehicle_test_suite.TestSuite): self.reboot_sitl() - self.context_push() self.context_collect('STATUSTEXT') self.set_parameters({ "QUIK_ENABLE" : 1, @@ -1352,16 +1349,11 @@ class AutoTestQuadPlane(vehicle_test_suite.TestSuite): self.change_mode("QLAND") self.wait_disarmed(timeout=120) - self.set_parameter("QUIK_ENABLE", 0) - self.context_pop() - self.remove_installed_script(applet_script) - self.reboot_sitl() def PrecisionLanding(self): '''VTOL precision landing''' - applet_script = "plane_precland.lua" - self.install_applet_script(applet_script) + self.install_applet_script_context("plane_precland.lua") here = self.mav.location() target = self.offset_location_ne(here, 20, 0) @@ -1385,13 +1377,13 @@ class AutoTestQuadPlane(vehicle_test_suite.TestSuite): self.reboot_sitl() - self.context_push() - self.context_collect('STATUSTEXT') self.set_parameters({ "PLND_ALT_CUTOFF" : 5, "SIM_SPEEDUP" : 10, }) + self.context_collect('STATUSTEXT') + self.scripting_restart() self.wait_text("PLND: Loaded", check_context=True) @@ -1412,15 +1404,9 @@ class AutoTestQuadPlane(vehicle_test_suite.TestSuite): if error > 2: raise NotAchievedException("too far from target %.1fm" % error) - self.context_pop() - self.remove_installed_script(applet_script) - self.reboot_sitl() - def ShipLanding(self): '''ship landing test''' - applet_script = "plane_ship_landing.lua" - - self.install_applet_script(applet_script) + self.install_applet_script_context("plane_ship_landing.lua") self.set_parameters({ "SCR_ENABLE": 1, @@ -1438,7 +1424,6 @@ class AutoTestQuadPlane(vehicle_test_suite.TestSuite): self.reboot_sitl(check_position=False) - self.context_push() self.context_collect('STATUSTEXT') self.set_parameters({ "SHIP_ENABLE" : 1, @@ -1467,10 +1452,6 @@ class AutoTestQuadPlane(vehicle_test_suite.TestSuite): # with the deck self.wait_groundspeed(4.8, 5.2) - self.context_pop() - self.remove_installed_script(applet_script) - self.reboot_sitl(check_position=False) - def RCDisableAirspeedUse(self): '''check disabling airspeed using RC switch''' self.set_parameter("RC9_OPTION", 106) diff --git a/Tools/autotest/rover.py b/Tools/autotest/rover.py index d53df91d73..cbb3cd8290 100644 --- a/Tools/autotest/rover.py +++ b/Tools/autotest/rover.py @@ -86,86 +86,76 @@ class AutoTestRover(vehicle_test_suite.TestSuite): def DriveSquare(self, side=50): """Learn/Drive Square with Ch7 option""" - self.context_push() - ex = None - try: - self.progress("TEST SQUARE") - self.set_parameters({ - "RC7_OPTION": 7, - "RC9_OPTION": 58, - }) + self.progress("TEST SQUARE") + self.set_parameters({ + "RC7_OPTION": 7, + "RC9_OPTION": 58, + }) - self.change_mode('MANUAL') + self.change_mode('MANUAL') - self.wait_ready_to_arm() - self.arm_vehicle() + self.wait_ready_to_arm() + self.arm_vehicle() - self.clear_wp(9) + self.clear_wp(9) - # first aim north - self.progress("\nTurn right towards north") - self.reach_heading_manual(10) - # save bottom left corner of box as home AND waypoint - self.progress("Save HOME") - self.save_wp() + # first aim north + self.progress("\nTurn right towards north") + self.reach_heading_manual(10) + # save bottom left corner of box as home AND waypoint + self.progress("Save HOME") + self.save_wp() - self.progress("Save WP") - self.save_wp() + self.progress("Save WP") + self.save_wp() - # pitch forward to fly north - self.progress("\nGoing north %u meters" % side) - self.reach_distance_manual(side) - # save top left corner of square as waypoint - self.progress("Save WP") - self.save_wp() + # pitch forward to fly north + self.progress("\nGoing north %u meters" % side) + self.reach_distance_manual(side) + # save top left corner of square as waypoint + self.progress("Save WP") + self.save_wp() - # roll right to fly east - self.progress("\nGoing east %u meters" % side) - self.reach_heading_manual(100) - self.reach_distance_manual(side) - # save top right corner of square as waypoint - self.progress("Save WP") - self.save_wp() + # roll right to fly east + self.progress("\nGoing east %u meters" % side) + self.reach_heading_manual(100) + self.reach_distance_manual(side) + # save top right corner of square as waypoint + self.progress("Save WP") + self.save_wp() - # pitch back to fly south - self.progress("\nGoing south %u meters" % side) - self.reach_heading_manual(190) - self.reach_distance_manual(side) - # save bottom right corner of square as waypoint - self.progress("Save WP") - self.save_wp() + # pitch back to fly south + self.progress("\nGoing south %u meters" % side) + self.reach_heading_manual(190) + self.reach_distance_manual(side) + # save bottom right corner of square as waypoint + self.progress("Save WP") + self.save_wp() - # roll left to fly west - self.progress("\nGoing west %u meters" % side) - self.reach_heading_manual(280) - self.reach_distance_manual(side) - # save bottom left corner of square (should be near home) as waypoint - self.progress("Save WP") - self.save_wp() + # roll left to fly west + self.progress("\nGoing west %u meters" % side) + self.reach_heading_manual(280) + self.reach_distance_manual(side) + # save bottom left corner of square (should be near home) as waypoint + self.progress("Save WP") + self.save_wp() - self.progress("Checking number of saved waypoints") - mavproxy = self.start_mavproxy() - num_wp = self.save_mission_to_file_using_mavproxy( - mavproxy, - os.path.join(testdir, "ch7_mission.txt")) - self.stop_mavproxy(mavproxy) - expected = 7 # home + 6 toggled in - if num_wp != expected: - raise NotAchievedException("Did not get %u waypoints; got %u" % - (expected, num_wp)) + self.progress("Checking number of saved waypoints") + mavproxy = self.start_mavproxy() + num_wp = self.save_mission_to_file_using_mavproxy( + mavproxy, + os.path.join(testdir, "ch7_mission.txt")) + self.stop_mavproxy(mavproxy) + expected = 7 # home + 6 toggled in + if num_wp != expected: + raise NotAchievedException("Did not get %u waypoints; got %u" % + (expected, num_wp)) - # TODO: actually drive the mission + # TODO: actually drive the mission - self.clear_wp(9) - except Exception as e: - self.print_exception_caught(e) - ex = e + self.clear_wp(9) self.disarm_vehicle() - self.context_pop() - - if ex: - raise ex def drive_left_circuit(self): """Drive a left circuit, 50m on a side.""" @@ -237,108 +227,98 @@ class AutoTestRover(vehicle_test_suite.TestSuite): def Sprayer(self): """Test sprayer functionality.""" - self.context_push() - ex = None - try: - rc_ch = 5 - pump_ch = 5 - spinner_ch = 6 - pump_ch_min = 1050 - pump_ch_trim = 1520 - pump_ch_max = 1950 - spinner_ch_min = 975 - spinner_ch_trim = 1510 - spinner_ch_max = 1975 + rc_ch = 5 + pump_ch = 5 + spinner_ch = 6 + pump_ch_min = 1050 + pump_ch_trim = 1520 + pump_ch_max = 1950 + spinner_ch_min = 975 + spinner_ch_trim = 1510 + spinner_ch_max = 1975 - self.set_parameters({ - "SPRAY_ENABLE": 1, + self.set_parameters({ + "SPRAY_ENABLE": 1, - "SERVO%u_FUNCTION" % pump_ch: 22, - "SERVO%u_MIN" % pump_ch: pump_ch_min, - "SERVO%u_TRIM" % pump_ch: pump_ch_trim, - "SERVO%u_MAX" % pump_ch: pump_ch_max, + "SERVO%u_FUNCTION" % pump_ch: 22, + "SERVO%u_MIN" % pump_ch: pump_ch_min, + "SERVO%u_TRIM" % pump_ch: pump_ch_trim, + "SERVO%u_MAX" % pump_ch: pump_ch_max, - "SERVO%u_FUNCTION" % spinner_ch: 23, - "SERVO%u_MIN" % spinner_ch: spinner_ch_min, - "SERVO%u_TRIM" % spinner_ch: spinner_ch_trim, - "SERVO%u_MAX" % spinner_ch: spinner_ch_max, + "SERVO%u_FUNCTION" % spinner_ch: 23, + "SERVO%u_MIN" % spinner_ch: spinner_ch_min, + "SERVO%u_TRIM" % spinner_ch: spinner_ch_trim, + "SERVO%u_MAX" % spinner_ch: spinner_ch_max, - "SIM_SPR_ENABLE": 1, - "SIM_SPR_PUMP": pump_ch, - "SIM_SPR_SPIN": spinner_ch, + "SIM_SPR_ENABLE": 1, + "SIM_SPR_PUMP": pump_ch, + "SIM_SPR_SPIN": spinner_ch, - "RC%u_OPTION" % rc_ch: 15, - "LOG_DISARMED": 1, - }) + "RC%u_OPTION" % rc_ch: 15, + "LOG_DISARMED": 1, + }) - self.reboot_sitl() - - self.wait_ready_to_arm() - self.arm_vehicle() - - self.progress("test bootup state - it's zero-output!") - self.wait_servo_channel_value(spinner_ch, 0) - self.wait_servo_channel_value(pump_ch, 0) - - self.progress("Enable sprayer") - self.set_rc(rc_ch, 2000) - - self.progress("Testing zero-speed state") - self.wait_servo_channel_value(spinner_ch, spinner_ch_min) - self.wait_servo_channel_value(pump_ch, pump_ch_min) - - self.progress("Testing turning it off") - self.set_rc(rc_ch, 1000) - self.wait_servo_channel_value(spinner_ch, spinner_ch_min) - self.wait_servo_channel_value(pump_ch, pump_ch_min) - - self.progress("Testing turning it back on") - self.set_rc(rc_ch, 2000) - self.wait_servo_channel_value(spinner_ch, spinner_ch_min) - self.wait_servo_channel_value(pump_ch, pump_ch_min) - - self.progress("Testing speed-ramping") - self.set_rc(3, 1700) # start driving forward - - # this is somewhat empirical... - self.wait_servo_channel_value(pump_ch, 1695, timeout=60) - - self.progress("Turning it off again") - self.set_rc(rc_ch, 1000) - self.wait_servo_channel_value(spinner_ch, spinner_ch_min) - self.wait_servo_channel_value(pump_ch, pump_ch_min) - - self.start_subtest("Sprayer Mission") - self.load_mission("sprayer-mission.txt") - self.change_mode("AUTO") -# self.send_debug_trap() - self.progress("Waiting for sprayer to start") - self.wait_servo_channel_value(pump_ch, 1250, timeout=60, comparator=operator.gt) - self.progress("Waiting for sprayer to stop") - self.wait_servo_channel_value(pump_ch, pump_ch_min, timeout=120) - - self.start_subtest("Checking mavlink commands") - self.change_mode("MANUAL") - self.progress("Starting Sprayer") - self.run_cmd(mavutil.mavlink.MAV_CMD_DO_SPRAYER, p1=1) - - self.progress("Testing speed-ramping") - self.set_rc(3, 1700) # start driving forward - self.wait_servo_channel_value(pump_ch, 1690, timeout=60, comparator=operator.gt) - self.start_subtest("Stopping Sprayer") - self.run_cmd(mavutil.mavlink.MAV_CMD_DO_SPRAYER, p1=0) - self.wait_servo_channel_value(pump_ch, pump_ch_min) - self.set_rc(3, 1000) # start driving forward - - self.progress("Sprayer OK") - except Exception as e: - self.print_exception_caught(e) - ex = e - self.context_pop() - self.disarm_vehicle(force=True) self.reboot_sitl() - if ex: - raise ex + + self.wait_ready_to_arm() + self.arm_vehicle() + + self.progress("test bootup state - it's zero-output!") + self.wait_servo_channel_value(spinner_ch, 0) + self.wait_servo_channel_value(pump_ch, 0) + + self.progress("Enable sprayer") + self.set_rc(rc_ch, 2000) + + self.progress("Testing zero-speed state") + self.wait_servo_channel_value(spinner_ch, spinner_ch_min) + self.wait_servo_channel_value(pump_ch, pump_ch_min) + + self.progress("Testing turning it off") + self.set_rc(rc_ch, 1000) + self.wait_servo_channel_value(spinner_ch, spinner_ch_min) + self.wait_servo_channel_value(pump_ch, pump_ch_min) + + self.progress("Testing turning it back on") + self.set_rc(rc_ch, 2000) + self.wait_servo_channel_value(spinner_ch, spinner_ch_min) + self.wait_servo_channel_value(pump_ch, pump_ch_min) + + self.progress("Testing speed-ramping") + self.set_rc(3, 1700) # start driving forward + + # this is somewhat empirical... + self.wait_servo_channel_value(pump_ch, 1695, timeout=60) + + self.progress("Turning it off again") + self.set_rc(rc_ch, 1000) + self.wait_servo_channel_value(spinner_ch, spinner_ch_min) + self.wait_servo_channel_value(pump_ch, pump_ch_min) + + self.start_subtest("Sprayer Mission") + self.load_mission("sprayer-mission.txt") + self.change_mode("AUTO") +# self.send_debug_trap() + self.progress("Waiting for sprayer to start") + self.wait_servo_channel_value(pump_ch, 1250, timeout=60, comparator=operator.gt) + self.progress("Waiting for sprayer to stop") + self.wait_servo_channel_value(pump_ch, pump_ch_min, timeout=120) + + self.start_subtest("Checking mavlink commands") + self.change_mode("MANUAL") + self.progress("Starting Sprayer") + self.run_cmd(mavutil.mavlink.MAV_CMD_DO_SPRAYER, p1=1) + + self.progress("Testing speed-ramping") + self.set_rc(3, 1700) # start driving forward + self.wait_servo_channel_value(pump_ch, 1690, timeout=60, comparator=operator.gt) + self.start_subtest("Stopping Sprayer") + self.run_cmd(mavutil.mavlink.MAV_CMD_DO_SPRAYER, p1=0) + self.wait_servo_channel_value(pump_ch, pump_ch_min) + self.set_rc(3, 1000) # stop driving forward + + self.progress("Sprayer OK") + self.disarm_vehicle() def DriveMaxRCIN(self, timeout=30): """Drive rover at max RC inputs""" @@ -548,42 +528,30 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) def AC_Avoidance(self): '''Test AC Avoidance switch''' - self.context_push() - ex = None - try: - self.load_fence("rover-fence-ac-avoid.txt") - self.set_parameters({ - "FENCE_ENABLE": 0, - "PRX1_TYPE": 10, - "RC10_OPTION": 40, # proximity-enable - }) - self.reboot_sitl() - # start = self.mav.location() - self.wait_ready_to_arm() - self.arm_vehicle() - # first make sure we can breach the fence: - self.set_rc(10, 1000) - self.change_mode("ACRO") - self.set_rc(3, 1550) - self.wait_distance_to_home(25, 100000, timeout=60) - self.change_mode("RTL") - self.wait_statustext("Reached destination", timeout=60) - # now enable avoidance and make sure we can't: - self.set_rc(10, 2000) - self.change_mode("ACRO") - self.wait_groundspeed(0, 0.7, timeout=60) - # watch for speed zero - self.wait_groundspeed(0, 0.2, timeout=120) - - except Exception as e: - self.print_exception_caught(e) - ex = e - self.context_pop() - self.clear_mission(mavutil.mavlink.MAV_MISSION_TYPE_FENCE) - self.disarm_vehicle(force=True) + self.load_fence("rover-fence-ac-avoid.txt") + self.set_parameters({ + "FENCE_ENABLE": 0, + "PRX1_TYPE": 10, + "RC10_OPTION": 40, # proximity-enable + }) self.reboot_sitl() - if ex: - raise ex + # start = self.mav.location() + self.wait_ready_to_arm() + self.arm_vehicle() + # first make sure we can breach the fence: + self.set_rc(10, 1000) + self.change_mode("ACRO") + self.set_rc(3, 1550) + self.wait_distance_to_home(25, 100000, timeout=60) + self.change_mode("RTL") + self.wait_statustext("Reached destination", timeout=60) + # now enable avoidance and make sure we can't: + self.set_rc(10, 2000) + self.change_mode("ACRO") + self.wait_groundspeed(0, 0.7, timeout=60) + # watch for speed zero + self.wait_groundspeed(0, 0.2, timeout=120) + self.disarm_vehicle() def ServoRelayEvents(self): '''Test ServoRelayEvents''' @@ -755,75 +723,53 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) def ModeSwitch(self): ''''Set modes via modeswitch''' - self.context_push() - ex = None - try: - self.set_parameter("MODE_CH", 8) - self.set_rc(8, 1000) - # mavutil.mavlink.ROVER_MODE_HOLD: - self.set_parameter("MODE6", 4) - # mavutil.mavlink.ROVER_MODE_ACRO - self.set_parameter("MODE5", 1) - self.set_rc(8, 1800) # PWM for mode6 - self.wait_mode("HOLD") - self.set_rc(8, 1700) # PWM for mode5 - self.wait_mode("ACRO") - self.set_rc(8, 1800) # PWM for mode6 - self.wait_mode("HOLD") - self.set_rc(8, 1700) # PWM for mode5 - self.wait_mode("ACRO") - except Exception as e: - self.print_exception_caught(e) - ex = e - - self.context_pop() - - if ex is not None: - raise ex + self.set_parameter("MODE_CH", 8) + self.set_rc(8, 1000) + # mavutil.mavlink.ROVER_MODE_HOLD: + self.set_parameter("MODE6", 4) + # mavutil.mavlink.ROVER_MODE_ACRO + self.set_parameter("MODE5", 1) + self.set_rc(8, 1800) # PWM for mode6 + self.wait_mode("HOLD") + self.set_rc(8, 1700) # PWM for mode5 + self.wait_mode("ACRO") + self.set_rc(8, 1800) # PWM for mode6 + self.wait_mode("HOLD") + self.set_rc(8, 1700) # PWM for mode5 + self.wait_mode("ACRO") def AuxModeSwitch(self): '''Set modes via auxswitches''' - self.context_push() - ex = None - try: - # from mavproxy_rc.py - mapping = [0, 1165, 1295, 1425, 1555, 1685, 1815] - self.set_parameter("MODE1", 1) # acro - self.set_rc(8, mapping[1]) - self.wait_mode('ACRO') + # from mavproxy_rc.py + mapping = [0, 1165, 1295, 1425, 1555, 1685, 1815] + self.set_parameter("MODE1", 1) # acro + self.set_rc(8, mapping[1]) + self.wait_mode('ACRO') - self.set_rc(9, 1000) - self.set_rc(10, 1000) - self.set_parameters({ - "RC9_OPTION": 53, # steering - "RC10_OPTION": 54, # hold - }) - self.set_rc(9, 1900) - self.wait_mode("STEERING") - self.set_rc(10, 1900) - self.wait_mode("HOLD") + self.set_rc(9, 1000) + self.set_rc(10, 1000) + self.set_parameters({ + "RC9_OPTION": 53, # steering + "RC10_OPTION": 54, # hold + }) + self.set_rc(9, 1900) + self.wait_mode("STEERING") + self.set_rc(10, 1900) + self.wait_mode("HOLD") - # reset both switches - should go back to ACRO - self.set_rc(9, 1000) - self.set_rc(10, 1000) - self.wait_mode("ACRO") + # reset both switches - should go back to ACRO + self.set_rc(9, 1000) + self.set_rc(10, 1000) + self.wait_mode("ACRO") - self.set_rc(9, 1900) - self.wait_mode("STEERING") - self.set_rc(10, 1900) - self.wait_mode("HOLD") + self.set_rc(9, 1900) + self.wait_mode("STEERING") + self.set_rc(10, 1900) + self.wait_mode("HOLD") - self.set_rc(10, 1000) # this re-polls the mode switch - self.wait_mode("ACRO") - self.set_rc(9, 1000) - except Exception as e: - self.print_exception_caught(e) - ex = e - - self.context_pop() - - if ex is not None: - raise ex + self.set_rc(10, 1000) # this re-polls the mode switch + self.wait_mode("ACRO") + self.set_rc(9, 1000) def RCOverridesCancel(self): '''Test RC overrides Cancel''' @@ -898,337 +844,314 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) def RCOverrides(self): '''Test RC overrides''' - self.context_push() self.set_parameter("SYSID_MYGCS", self.mav.source_system) - ex = None - try: - self.set_parameter("RC12_OPTION", 46) - self.reboot_sitl() - - self.change_mode('MANUAL') - self.wait_ready_to_arm() - self.set_rc(3, 1500) # throttle at zero - self.arm_vehicle() - # start moving forward a little: - normal_rc_throttle = 1700 - self.set_rc(3, normal_rc_throttle) - self.wait_groundspeed(5, 100) - - # allow overrides: - self.set_rc(12, 2000) - - # now override to stop: - throttle_override = 1500 - - tstart = self.get_sim_time_cached() - while True: - if self.get_sim_time_cached() - tstart > 10: - raise AutoTestTimeoutException("Did not reach speed") - self.progress("Sending throttle of %u" % (throttle_override,)) - self.mav.mav.rc_channels_override_send( - 1, # target system - 1, # targe component - 65535, # chan1_raw - 65535, # chan2_raw - throttle_override, # chan3_raw - 65535, # chan4_raw - 65535, # chan5_raw - 65535, # chan6_raw - 65535, # chan7_raw - 65535) # chan8_raw - - m = self.mav.recv_match(type='VFR_HUD', blocking=True) - want_speed = 2.0 - self.progress("Speed=%f want=<%f" % (m.groundspeed, want_speed)) - if m.groundspeed < want_speed: - break - - # now override to stop - but set the switch on the RC - # transmitter to deny overrides; this should send the - # speed back up to 5 metres/second: - self.set_rc(12, 1000) - - throttle_override = 1500 - tstart = self.get_sim_time_cached() - while True: - if self.get_sim_time_cached() - tstart > 10: - raise AutoTestTimeoutException("Did not speed back up") - self.progress("Sending throttle of %u" % (throttle_override,)) - self.mav.mav.rc_channels_override_send( - 1, # target system - 1, # targe component - 65535, # chan1_raw - 65535, # chan2_raw - throttle_override, # chan3_raw - 65535, # chan4_raw - 65535, # chan5_raw - 65535, # chan6_raw - 65535, # chan7_raw - 65535) # chan8_raw - - m = self.mav.recv_match(type='VFR_HUD', blocking=True) - want_speed = 5.0 - self.progress("Speed=%f want=>%f" % (m.groundspeed, want_speed)) - - if m.groundspeed > want_speed: - break - - # re-enable RC overrides - self.set_rc(12, 2000) - - # check we revert to normal RC inputs when gcs overrides cease: - self.progress("Waiting for RC to revert to normal RC input") - self.wait_rc_channel_value(3, normal_rc_throttle, timeout=10) - - self.start_subtest("Check override time of zero disables overrides") - old = self.get_parameter("RC_OVERRIDE_TIME") - ch = 2 - self.set_rc(ch, 1000) - channels = [65535] * 18 - ch_override_value = 1700 - channels[ch-1] = ch_override_value - channels[7] = 1234 # that's channel 8! - self.progress("Sending override message %u" % ch_override_value) - self.mav.mav.rc_channels_override_send( - 1, # target system - 1, # targe component - *channels - ) - # long timeout required here as we may have sent a lot of - # things via MAVProxy... - self.wait_rc_channel_value(ch, ch_override_value, timeout=30) - self.set_parameter("RC_OVERRIDE_TIME", 0) - self.wait_rc_channel_value(ch, 1000) - self.set_parameter("RC_OVERRIDE_TIME", old) - self.wait_rc_channel_value(ch, ch_override_value) - - ch_override_value = 1720 - channels[ch-1] = ch_override_value - self.progress("Sending override message %u" % ch_override_value) - self.mav.mav.rc_channels_override_send( - 1, # target system - 1, # targe component - *channels - ) - self.wait_rc_channel_value(ch, ch_override_value, timeout=10) - self.set_parameter("RC_OVERRIDE_TIME", 0) - self.wait_rc_channel_value(ch, 1000) - self.set_parameter("RC_OVERRIDE_TIME", old) - - self.progress("Ensuring timeout works") - self.wait_rc_channel_value(ch, 1000, timeout=5) - self.delay_sim_time(10) - - self.set_parameter("RC_OVERRIDE_TIME", 10) - self.progress("Sending override message") - - ch_override_value = 1730 - channels[ch-1] = ch_override_value - self.progress("Sending override message %u" % ch_override_value) - self.mav.mav.rc_channels_override_send( - 1, # target system - 1, # targe component - *channels - ) - self.wait_rc_channel_value(ch, ch_override_value, timeout=10) - tstart = self.get_sim_time() - self.progress("Waiting for channel to revert to 1000 in ~10s") - self.wait_rc_channel_value(ch, 1000, timeout=15) - delta = self.get_sim_time() - tstart - if delta > 12: - raise NotAchievedException("Took too long to revert RC channel value (delta=%f)" % delta) - min_delta = 9 - if delta < min_delta: - raise NotAchievedException("Didn't take long enough to revert RC channel value (delta=%f want>=%f)" % - (delta, min_delta)) - self.progress("Disabling RC override timeout") - self.set_parameter("RC_OVERRIDE_TIME", -1) - ch_override_value = 1740 - channels[ch-1] = ch_override_value - self.progress("Sending override message %u" % ch_override_value) - self.mav.mav.rc_channels_override_send( - 1, # target system - 1, # targe component - *channels - ) - self.wait_rc_channel_value(ch, ch_override_value, timeout=10) - tstart = self.get_sim_time() - while True: - # warning: this is get_sim_time() and can slurp messages on you! - delta = self.get_sim_time() - tstart - if delta > 20: - break - m = self.assert_receive_message('RC_CHANNELS', timeout=1) - channel_field = "chan%u_raw" % ch - m_value = getattr(m, channel_field) - if m_value != ch_override_value: - raise NotAchievedException("Value reverted after %f seconds when it should not have (got=%u) (want=%u)" % (delta, m_value, ch_override_value)) # noqa - self.set_parameter("RC_OVERRIDE_TIME", old) - - self.delay_sim_time(10) - - self.start_subtest("Checking higher-channel semantics") - self.context_push() - self.set_parameter("RC_OVERRIDE_TIME", 30) - - ch = 11 - rc_value = 1010 - self.set_rc(ch, rc_value) - - channels = [65535] * 18 - ch_override_value = 1234 - channels[ch-1] = ch_override_value - self.progress("Sending override message ch%u=%u" % (ch, ch_override_value)) - self.mav.mav.rc_channels_override_send( - 1, # target system - 1, # targe component - *channels - ) - self.progress("Wait for override value") - self.wait_rc_channel_value(ch, ch_override_value, timeout=10) - - self.progress("Sending return-to-RC-input value") - channels[ch-1] = 65534 - self.mav.mav.rc_channels_override_send( - 1, # target system - 1, # targe component - *channels - ) - self.wait_rc_channel_value(ch, rc_value, timeout=10) - - channels[ch-1] = ch_override_value - self.progress("Sending override message ch%u=%u" % (ch, ch_override_value)) - self.mav.mav.rc_channels_override_send( - 1, # target system - 1, # targe component - *channels - ) - self.progress("Wait for override value") - self.wait_rc_channel_value(ch, ch_override_value, timeout=10) - - # make we keep the override vaue for at least 10 seconds: - tstart = self.get_sim_time() - while True: - if self.get_sim_time_cached() - tstart > 10: - break - # try both ignore values: - ignore_value = 0 - if self.get_sim_time_cached() - tstart > 5: - ignore_value = 65535 - self.progress("Sending ignore value %u" % ignore_value) - channels[ch-1] = ignore_value - self.mav.mav.rc_channels_override_send( - 1, # target system - 1, # targe component - *channels - ) - if self.get_rc_channel_value(ch) != ch_override_value: - raise NotAchievedException("Did not maintain value") - - self.context_pop() - - self.end_subtest("Checking higher-channel semantics") - - except Exception as e: - self.print_exception_caught(e) - ex = e - - self.context_pop() - self.disarm_vehicle() + self.set_parameter("RC12_OPTION", 46) self.reboot_sitl() - if ex is not None: - raise ex + self.change_mode('MANUAL') + self.wait_ready_to_arm() + self.set_rc(3, 1500) # throttle at zero + self.arm_vehicle() + # start moving forward a little: + normal_rc_throttle = 1700 + self.set_rc(3, normal_rc_throttle) + self.wait_groundspeed(5, 100) + + # allow overrides: + self.set_rc(12, 2000) + + # now override to stop: + throttle_override = 1500 + + tstart = self.get_sim_time_cached() + while True: + if self.get_sim_time_cached() - tstart > 10: + raise AutoTestTimeoutException("Did not reach speed") + self.progress("Sending throttle of %u" % (throttle_override,)) + self.mav.mav.rc_channels_override_send( + 1, # target system + 1, # targe component + 65535, # chan1_raw + 65535, # chan2_raw + throttle_override, # chan3_raw + 65535, # chan4_raw + 65535, # chan5_raw + 65535, # chan6_raw + 65535, # chan7_raw + 65535) # chan8_raw + + m = self.mav.recv_match(type='VFR_HUD', blocking=True) + want_speed = 2.0 + self.progress("Speed=%f want=<%f" % (m.groundspeed, want_speed)) + if m.groundspeed < want_speed: + break + + # now override to stop - but set the switch on the RC + # transmitter to deny overrides; this should send the + # speed back up to 5 metres/second: + self.set_rc(12, 1000) + + throttle_override = 1500 + tstart = self.get_sim_time_cached() + while True: + if self.get_sim_time_cached() - tstart > 10: + raise AutoTestTimeoutException("Did not speed back up") + self.progress("Sending throttle of %u" % (throttle_override,)) + self.mav.mav.rc_channels_override_send( + 1, # target system + 1, # targe component + 65535, # chan1_raw + 65535, # chan2_raw + throttle_override, # chan3_raw + 65535, # chan4_raw + 65535, # chan5_raw + 65535, # chan6_raw + 65535, # chan7_raw + 65535) # chan8_raw + + m = self.mav.recv_match(type='VFR_HUD', blocking=True) + want_speed = 5.0 + self.progress("Speed=%f want=>%f" % (m.groundspeed, want_speed)) + + if m.groundspeed > want_speed: + break + + # re-enable RC overrides + self.set_rc(12, 2000) + + # check we revert to normal RC inputs when gcs overrides cease: + self.progress("Waiting for RC to revert to normal RC input") + self.wait_rc_channel_value(3, normal_rc_throttle, timeout=10) + + self.start_subtest("Check override time of zero disables overrides") + old = self.get_parameter("RC_OVERRIDE_TIME") + ch = 2 + self.set_rc(ch, 1000) + channels = [65535] * 18 + ch_override_value = 1700 + channels[ch-1] = ch_override_value + channels[7] = 1234 # that's channel 8! + self.progress("Sending override message %u" % ch_override_value) + self.mav.mav.rc_channels_override_send( + 1, # target system + 1, # targe component + *channels + ) + # long timeout required here as we may have sent a lot of + # things via MAVProxy... + self.wait_rc_channel_value(ch, ch_override_value, timeout=30) + self.set_parameter("RC_OVERRIDE_TIME", 0) + self.wait_rc_channel_value(ch, 1000) + self.set_parameter("RC_OVERRIDE_TIME", old) + self.wait_rc_channel_value(ch, ch_override_value) + + ch_override_value = 1720 + channels[ch-1] = ch_override_value + self.progress("Sending override message %u" % ch_override_value) + self.mav.mav.rc_channels_override_send( + 1, # target system + 1, # targe component + *channels + ) + self.wait_rc_channel_value(ch, ch_override_value, timeout=10) + self.set_parameter("RC_OVERRIDE_TIME", 0) + self.wait_rc_channel_value(ch, 1000) + self.set_parameter("RC_OVERRIDE_TIME", old) + + self.progress("Ensuring timeout works") + self.wait_rc_channel_value(ch, 1000, timeout=5) + self.delay_sim_time(10) + + self.set_parameter("RC_OVERRIDE_TIME", 10) + self.progress("Sending override message") + + ch_override_value = 1730 + channels[ch-1] = ch_override_value + self.progress("Sending override message %u" % ch_override_value) + self.mav.mav.rc_channels_override_send( + 1, # target system + 1, # targe component + *channels + ) + self.wait_rc_channel_value(ch, ch_override_value, timeout=10) + tstart = self.get_sim_time() + self.progress("Waiting for channel to revert to 1000 in ~10s") + self.wait_rc_channel_value(ch, 1000, timeout=15) + delta = self.get_sim_time() - tstart + if delta > 12: + raise NotAchievedException("Took too long to revert RC channel value (delta=%f)" % delta) + min_delta = 9 + if delta < min_delta: + raise NotAchievedException("Didn't take long enough to revert RC channel value (delta=%f want>=%f)" % + (delta, min_delta)) + self.progress("Disabling RC override timeout") + self.set_parameter("RC_OVERRIDE_TIME", -1) + ch_override_value = 1740 + channels[ch-1] = ch_override_value + self.progress("Sending override message %u" % ch_override_value) + self.mav.mav.rc_channels_override_send( + 1, # target system + 1, # targe component + *channels + ) + self.wait_rc_channel_value(ch, ch_override_value, timeout=10) + tstart = self.get_sim_time() + while True: + # warning: this is get_sim_time() and can slurp messages on you! + delta = self.get_sim_time() - tstart + if delta > 20: + break + m = self.assert_receive_message('RC_CHANNELS', timeout=1) + channel_field = "chan%u_raw" % ch + m_value = getattr(m, channel_field) + if m_value != ch_override_value: + raise NotAchievedException("Value reverted after %f seconds when it should not have (got=%u) (want=%u)" % (delta, m_value, ch_override_value)) # noqa + self.set_parameter("RC_OVERRIDE_TIME", old) + + self.delay_sim_time(10) + + self.start_subtest("Checking higher-channel semantics") + self.context_push() + self.set_parameter("RC_OVERRIDE_TIME", 30) + + ch = 11 + rc_value = 1010 + self.set_rc(ch, rc_value) + + channels = [65535] * 18 + ch_override_value = 1234 + channels[ch-1] = ch_override_value + self.progress("Sending override message ch%u=%u" % (ch, ch_override_value)) + self.mav.mav.rc_channels_override_send( + 1, # target system + 1, # targe component + *channels + ) + self.progress("Wait for override value") + self.wait_rc_channel_value(ch, ch_override_value, timeout=10) + + self.progress("Sending return-to-RC-input value") + channels[ch-1] = 65534 + self.mav.mav.rc_channels_override_send( + 1, # target system + 1, # targe component + *channels + ) + self.wait_rc_channel_value(ch, rc_value, timeout=10) + + channels[ch-1] = ch_override_value + self.progress("Sending override message ch%u=%u" % (ch, ch_override_value)) + self.mav.mav.rc_channels_override_send( + 1, # target system + 1, # targe component + *channels + ) + self.progress("Wait for override value") + self.wait_rc_channel_value(ch, ch_override_value, timeout=10) + + # make we keep the override vaue for at least 10 seconds: + tstart = self.get_sim_time() + while True: + if self.get_sim_time_cached() - tstart > 10: + break + # try both ignore values: + ignore_value = 0 + if self.get_sim_time_cached() - tstart > 5: + ignore_value = 65535 + self.progress("Sending ignore value %u" % ignore_value) + channels[ch-1] = ignore_value + self.mav.mav.rc_channels_override_send( + 1, # target system + 1, # targe component + *channels + ) + if self.get_rc_channel_value(ch) != ch_override_value: + raise NotAchievedException("Did not maintain value") + + self.context_pop() + + self.end_subtest("Checking higher-channel semantics") + + self.disarm_vehicle() def MANUAL_CONTROL(self): '''Test mavlink MANUAL_CONTROL''' - self.context_push() - self.set_parameter("SYSID_MYGCS", self.mav.source_system) - ex = None - try: - self.set_parameter("RC12_OPTION", 46) # enable/disable rc overrides - self.reboot_sitl() - - self.change_mode("MANUAL") - self.wait_ready_to_arm() - self.zero_throttle() - self.arm_vehicle() - self.progress("start moving forward a little") - normal_rc_throttle = 1700 - self.set_rc(3, normal_rc_throttle) - self.wait_groundspeed(5, 100) - - self.progress("allow overrides") - self.set_rc(12, 2000) - - self.progress("now override to stop") - throttle_override_normalized = 0 - expected_throttle = 0 # in VFR_HUD - - tstart = self.get_sim_time_cached() - while True: - if self.get_sim_time_cached() - tstart > 10: - raise AutoTestTimeoutException("Did not reach speed") - self.progress("Sending normalized throttle of %d" % (throttle_override_normalized,)) - self.mav.mav.manual_control_send( - 1, # target system - 32767, # x (pitch) - 32767, # y (roll) - throttle_override_normalized, # z (thrust) - 32767, # r (yaw) - 0) # button mask - - m = self.mav.recv_match(type='VFR_HUD', blocking=True) - want_speed = 2.0 - self.progress("Speed=%f want=<%f throttle=%u want=%u" % - (m.groundspeed, want_speed, m.throttle, expected_throttle)) - if m.groundspeed < want_speed and m.throttle == expected_throttle: - break - - self.progress("now override to stop - but set the switch on the RC transmitter to deny overrides; this should send the speed back up to 5 metres/second") # noqa - self.set_rc(12, 1000) - - throttle_override_normalized = 500 - expected_throttle = 36 # in VFR_HUD, corresponding to normal_rc_throttle adjusted for channel min/max - - tstart = self.get_sim_time_cached() - while True: - if self.get_sim_time_cached() - tstart > 10: - raise AutoTestTimeoutException("Did not stop") - self.progress("Sending normalized throttle of %u" % (throttle_override_normalized,)) - self.mav.mav.manual_control_send( - 1, # target system - 32767, # x (pitch) - 32767, # y (roll) - throttle_override_normalized, # z (thrust) - 32767, # r (yaw) - 0) # button mask - - m = self.mav.recv_match(type='VFR_HUD', blocking=True) - want_speed = 5.0 - - self.progress("Speed=%f want=>%f throttle=%u want=%u" % - (m.groundspeed, want_speed, m.throttle, expected_throttle)) - if m.groundspeed > want_speed and m.throttle == expected_throttle: - break - - # re-enable RC overrides - self.set_rc(12, 2000) - - # check we revert to normal RC inputs when gcs overrides cease: - self.progress("Waiting for RC to revert to normal RC input") - self.wait_rc_channel_value(3, normal_rc_throttle, timeout=10) - - except Exception as e: - self.print_exception_caught(e) - ex = e - - self.context_pop() - self.disarm_vehicle() + self.set_parameters({ + "SYSID_MYGCS": self.mav.source_system, + "RC12_OPTION": 46, # enable/disable rc overrides + }) self.reboot_sitl() - if ex is not None: - raise ex + self.change_mode("MANUAL") + self.wait_ready_to_arm() + self.arm_vehicle() + self.progress("start moving forward a little") + normal_rc_throttle = 1700 + self.set_rc(3, normal_rc_throttle) + self.wait_groundspeed(5, 100) + + self.progress("allow overrides") + self.set_rc(12, 2000) + + self.progress("now override to stop") + throttle_override_normalized = 0 + expected_throttle = 0 # in VFR_HUD + + tstart = self.get_sim_time_cached() + while True: + if self.get_sim_time_cached() - tstart > 10: + raise AutoTestTimeoutException("Did not reach speed") + self.progress("Sending normalized throttle of %d" % (throttle_override_normalized,)) + self.mav.mav.manual_control_send( + 1, # target system + 32767, # x (pitch) + 32767, # y (roll) + throttle_override_normalized, # z (thrust) + 32767, # r (yaw) + 0) # button mask + + m = self.mav.recv_match(type='VFR_HUD', blocking=True) + want_speed = 2.0 + self.progress("Speed=%f want=<%f throttle=%u want=%u" % + (m.groundspeed, want_speed, m.throttle, expected_throttle)) + if m.groundspeed < want_speed and m.throttle == expected_throttle: + break + + self.progress("now override to stop - but set the switch on the RC transmitter to deny overrides; this should send the speed back up to 5 metres/second") # noqa + self.set_rc(12, 1000) + + throttle_override_normalized = 500 + expected_throttle = 36 # in VFR_HUD, corresponding to normal_rc_throttle adjusted for channel min/max + + tstart = self.get_sim_time_cached() + while True: + if self.get_sim_time_cached() - tstart > 10: + raise AutoTestTimeoutException("Did not stop") + self.progress("Sending normalized throttle of %u" % (throttle_override_normalized,)) + self.mav.mav.manual_control_send( + 1, # target system + 32767, # x (pitch) + 32767, # y (roll) + throttle_override_normalized, # z (thrust) + 32767, # r (yaw) + 0) # button mask + + m = self.mav.recv_match(type='VFR_HUD', blocking=True) + want_speed = 5.0 + + self.progress("Speed=%f want=>%f throttle=%u want=%u" % + (m.groundspeed, want_speed, m.throttle, expected_throttle)) + if m.groundspeed > want_speed and m.throttle == expected_throttle: + break + + # re-enable RC overrides + self.set_rc(12, 2000) + + # check we revert to normal RC inputs when gcs overrides cease: + self.progress("Waiting for RC to revert to normal RC input") + self.wait_rc_channel_value(3, normal_rc_throttle, timeout=10) + + self.disarm_vehicle() def CameraMission(self): '''Test Camera Mission Items''' @@ -3696,7 +3619,7 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) # oldalt = downloaded_items[changealt_item].z want_newalt = 37.2 mavproxy.send('wp changealt %u %f\n' % (changealt_item, want_newalt)) - self.delay_sim_time(5) + self.delay_sim_time(15) downloaded_items = self.download_using_mission_protocol(mavutil.mavlink.MAV_MISSION_TYPE_MISSION) if abs(downloaded_items[changealt_item].z - want_newalt) > 0.0001: raise NotAchievedException( @@ -3952,11 +3875,11 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) continue t = m.get_type() if t == "POSITION_TARGET_GLOBAL_INT": - print("Target: (%s)" % str(m)) + self.progress("Target: (%s)" % str(m)) elif t == "GLOBAL_POSITION_INT": - print("Position: (%s)" % str(m)) + self.progress("Position: (%s)" % str(m)) elif t == "FENCE_STATUS": - print("Fence: %s" % str(m)) + self.progress("Fence: %s" % str(m)) if m.breach_status != 0: seen_fence_breach = True self.progress("Fence breach detected!") @@ -4061,6 +3984,9 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) self.clear_mission(mavutil.mavlink.MAV_MISSION_TYPE_FENCE, target_system=target_system, target_component=target_component) + self.set_parameters({ + "FENCE_TYPE": 2, # circle only + }) self.delay_sim_time(5) # let breaches clear # FIXME: should we allow this? self.progress("Ensure we can arm with no poly in place") @@ -4068,6 +3994,9 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) self.wait_ready_to_arm() self.arm_vehicle() self.disarm_vehicle() + self.set_parameters({ + "FENCE_TYPE": 6, # polyfence + circle + }) self.test_poly_fence_noarms_exclusion_circle(target_system=target_system, target_component=target_component) @@ -4195,22 +4124,22 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) here = self.mav.location() - self.upload_fences_from_locations( - mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, - [ - [ # east - self.offset_location_ne(here, -50, 20), # bl - self.offset_location_ne(here, 50, 20), # br - self.offset_location_ne(here, 50, 40), # tr - self.offset_location_ne(here, -50, 40), # tl, - ], [ # over the top of the vehicle - self.offset_location_ne(here, -50, -50), # bl - self.offset_location_ne(here, -50, 50), # br - self.offset_location_ne(here, 50, 50), # tr - self.offset_location_ne(here, 50, -50), # tl, - ] - ] - ) + self.upload_fences_from_locations([ + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, [ + # east + self.offset_location_ne(here, -50, 20), # bl + self.offset_location_ne(here, 50, 20), # br + self.offset_location_ne(here, 50, 40), # tr + self.offset_location_ne(here, -50, 40), # tl, + ]), + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, [ + # over the top of the vehicle + self.offset_location_ne(here, -50, -50), # bl + self.offset_location_ne(here, -50, 50), # br + self.offset_location_ne(here, 50, 50), # tr + self.offset_location_ne(here, 50, -50), # tl, + ]), + ]) self.delay_sim_time(5) # ArduPilot only checks for breaches @1Hz self.drain_mav() self.assert_fence_breached() @@ -4231,22 +4160,22 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) here = self.mav.location() - self.upload_fences_from_locations( - mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, - [ - [ # east - self.offset_location_ne(here, -50, 20), # bl - self.offset_location_ne(here, 50, 20), # br - self.offset_location_ne(here, 50, 40), # tr - self.offset_location_ne(here, -50, 40), # tl, - ], [ # over the top of the vehicle - self.offset_location_ne(here, -50, -50), # bl - self.offset_location_ne(here, -50, 50), # br - self.offset_location_ne(here, 50, 50), # tr - self.offset_location_ne(here, 50, -50), # tl, - ] - ] - ) + self.upload_fences_from_locations([ + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, [ + # east + self.offset_location_ne(here, -50, 20), # bl + self.offset_location_ne(here, 50, 20), # br + self.offset_location_ne(here, 50, 40), # tr + self.offset_location_ne(here, -50, 40), # tl, + ]), + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, [ + # over the top of the vehicle + self.offset_location_ne(here, -50, -50), # bl + self.offset_location_ne(here, -50, 50), # br + self.offset_location_ne(here, 50, 50), # tr + self.offset_location_ne(here, 50, -50), # tl, + ]), + ]) self.delay_sim_time(5) # ArduPilot only checks for breaches @1Hz self.drain_mav() self.assert_fence_breached() @@ -4605,22 +4534,22 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) def test_poly_fence_reboot_survivability(self): here = self.mav.location() - self.upload_fences_from_locations( - mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, - [ - [ # east - self.offset_location_ne(here, -50, 20), # bl - self.offset_location_ne(here, 50, 20), # br - self.offset_location_ne(here, 50, 40), # tr - self.offset_location_ne(here, -50, 40), # tl, - ], [ # over the top of the vehicle - self.offset_location_ne(here, -50, -50), # bl - self.offset_location_ne(here, -50, 50), # br - self.offset_location_ne(here, 50, 50), # tr - self.offset_location_ne(here, 50, -50), # tl, - ] - ] - ) + self.upload_fences_from_locations([ + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, [ + # east + self.offset_location_ne(here, -50, 20), # bl + self.offset_location_ne(here, 50, 20), # br + self.offset_location_ne(here, 50, 40), # tr + self.offset_location_ne(here, -50, 40), # tl, + ]), + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, [ + # over the top of the vehicle + self.offset_location_ne(here, -50, -50), # bl + self.offset_location_ne(here, -50, 50), # br + self.offset_location_ne(here, 50, 50), # tr + self.offset_location_ne(here, 50, -50), # tl, + ]), + ]) self.reboot_sitl() downloaded_items = self.download_using_mission_protocol(mavutil.mavlink.MAV_MISSION_TYPE_FENCE) downloaded_len = len(downloaded_items) @@ -4663,18 +4592,16 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) def test_poly_fence_inclusion_overlapping_inclusion_circles(self, here, target_system=1, target_component=1): self.start_subtest("Overlapping circular inclusion") - self.upload_fences_from_locations( - mavutil.mavlink.MAV_CMD_NAV_FENCE_CIRCLE_INCLUSION, - [ - { - "radius": 30, - "loc": self.offset_location_ne(here, -20, 0), - }, - { - "radius": 30, - "loc": self.offset_location_ne(here, 20, 0), - }, - ]) + self.upload_fences_from_locations([ + (mavutil.mavlink.MAV_CMD_NAV_FENCE_CIRCLE_INCLUSION, { + "radius": 30, + "loc": self.offset_location_ne(here, -20, 0), + }), + (mavutil.mavlink.MAV_CMD_NAV_FENCE_CIRCLE_INCLUSION, { + "radius": 30, + "loc": self.offset_location_ne(here, 20, 0), + }), + ]) if self.mavproxy is not None: # handy for getting pretty pictures self.mavproxy.send("fence list\n") @@ -4702,20 +4629,18 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) target_system=target_system, target_component=target_component) - self.upload_fences_from_locations( - mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, - [ - [ - self.offset_location_ne(here, -40, -20), # tl - self.offset_location_ne(here, 50, -20), # tr - self.offset_location_ne(here, 50, 20), # br - self.offset_location_ne(here, -40, 20), # bl, - ], - { - "radius": 30, - "loc": self.offset_location_ne(here, -20, 0), - }, - ]) + self.upload_fences_from_locations([ + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, [ + self.offset_location_ne(here, -40, -20), # tl + self.offset_location_ne(here, 50, -20), # tr + self.offset_location_ne(here, 50, 20), # br + self.offset_location_ne(here, -40, 20), # bl, + ]), + (mavutil.mavlink.MAV_CMD_NAV_FENCE_CIRCLE_INCLUSION, { + "radius": 30, + "loc": self.offset_location_ne(here, -20, 0), + }), + ]) self.delay_sim_time(5) if self.mavproxy is not None: @@ -4735,22 +4660,20 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) target_system=target_system, target_component=target_component) - self.upload_fences_from_locations( - mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, - [ - [ - self.offset_location_ne(here, -20, -25), # tl - self.offset_location_ne(here, 50, -25), # tr - self.offset_location_ne(here, 50, 15), # br - self.offset_location_ne(here, -20, 15), # bl, - ], - [ - self.offset_location_ne(here, 20, -20), # tl - self.offset_location_ne(here, -50, -20), # tr - self.offset_location_ne(here, -50, 20), # br - self.offset_location_ne(here, 20, 20), # bl, - ], - ]) + self.upload_fences_from_locations([ + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, [ + self.offset_location_ne(here, -20, -25), # tl + self.offset_location_ne(here, 50, -25), # tr + self.offset_location_ne(here, 50, 15), # br + self.offset_location_ne(here, -20, 15), # bl, + ]), + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, [ + self.offset_location_ne(here, 20, -20), # tl + self.offset_location_ne(here, -50, -20), # tr + self.offset_location_ne(here, -50, 20), # br + self.offset_location_ne(here, 20, 20), # bl, + ]), + ]) self.delay_sim_time(5) if self.mavproxy is not None: @@ -4772,24 +4695,26 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) def test_poly_fence_exclusion(self, here, target_system=1, target_component=1): - self.upload_fences_from_locations( - mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, - [ - [ # east - self.offset_location_ne(here, -50, 20), # bl - self.offset_location_ne(here, 50, 20), # br - self.offset_location_ne(here, 50, 40), # tr - self.offset_location_ne(here, -50, 40), # tl, - ], [ # west - self.offset_location_ne(here, -50, -20), # tl - self.offset_location_ne(here, 50, -20), # tr - self.offset_location_ne(here, 50, -40), # br - self.offset_location_ne(here, -50, -40), # bl, - ], { - "radius": 30, - "loc": self.offset_location_ne(here, -60, 0), - }, - ]) + self.upload_fences_from_locations([ + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, [ + # east + self.offset_location_ne(here, -50, 20), # bl + self.offset_location_ne(here, 50, 20), # br + self.offset_location_ne(here, 50, 40), # tr + self.offset_location_ne(here, -50, 40), # tl, + ]), + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, [ + # west + self.offset_location_ne(here, -50, -20), # tl + self.offset_location_ne(here, 50, -20), # tr + self.offset_location_ne(here, 50, -40), # br + self.offset_location_ne(here, -50, -40), # bl, + ]), + (mavutil.mavlink.MAV_CMD_NAV_FENCE_CIRCLE_EXCLUSION, { + "radius": 30, + "loc": self.offset_location_ne(here, -60, 0), + }), + ]) self.delay_sim_time(5) if self.mavproxy is not None: self.mavproxy.send("fence list\n") @@ -4869,54 +4794,41 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) self.wait_servo_channel_value(3, self.get_parameter("RC3_TRIM", 5), timeout=10) self.wait_disarmed() - def test_poly_fence_object_avoidance_guided(self, target_system=1, target_component=1): + def PolyFenceObjectAvoidanceGuided(self, target_system=1, target_component=1): + '''PolyFence object avoidance tests - guided mode''' if not self.mavproxy_can_do_mision_item_protocols(): return self.test_poly_fence_object_avoidance_guided_pathfinding( target_system=target_system, target_component=target_component) - return - # twosquares is currently disabled because of the requirement to have an inclusion fence (which it doesn't have ATM) - # self.test_poly_fence_object_avoidance_guided_two_squares( - # target_system=target_system, - # target_component=target_component) + self.test_poly_fence_object_avoidance_guided_two_squares( + target_system=target_system, + target_component=target_component) - def test_poly_fence_object_avoidance_auto(self, target_system=1, target_component=1): + def PolyFenceObjectAvoidanceAuto(self, target_system=1, target_component=1): + '''PolyFence object avoidance tests - auto mode''' mavproxy = self.start_mavproxy() self.load_fence_using_mavproxy(mavproxy, "rover-path-planning-fence.txt") self.stop_mavproxy(mavproxy) # self.load_fence("rover-path-planning-fence.txt") self.load_mission("rover-path-planning-mission.txt") - self.context_push() - ex = None - try: - self.set_parameters({ - "AVOID_ENABLE": 3, - "OA_TYPE": 2, - "FENCE_MARGIN": 0, # FIXME: https://github.com/ArduPilot/ardupilot/issues/11601 - }) - self.reboot_sitl() - self.change_mode('AUTO') - self.wait_ready_to_arm() - self.arm_vehicle() - self.set_parameter("FENCE_ENABLE", 1) - if self.mavproxy is not None: - self.mavproxy.send("fence list\n") - # target_loc is copied from the mission file - target_loc = mavutil.location(40.073799, -105.229156) - self.wait_location(target_loc, height_accuracy=None, timeout=300) - # mission has RTL as last item - self.wait_distance_to_home(3, 7, timeout=300) - self.disarm_vehicle() - except Exception as e: - self.disarm_vehicle(force=True) - self.print_exception_caught(e) - ex = e - self.context_pop() + self.set_parameters({ + "AVOID_ENABLE": 3, + "OA_TYPE": 2, + "FENCE_MARGIN": 0, # FIXME: https://github.com/ArduPilot/ardupilot/issues/11601 + }) self.reboot_sitl() - if ex is not None: - raise ex + self.change_mode('AUTO') + self.wait_ready_to_arm() + self.arm_vehicle() + self.set_parameter("FENCE_ENABLE", 1) + # target_loc is copied from the mission file + target_loc = mavutil.location(40.073799, -105.229156) + self.wait_location(target_loc, height_accuracy=None, timeout=300) + # mission has RTL as last item + self.wait_distance_to_home(3, 7, timeout=300) + self.disarm_vehicle() def send_guided_mission_item(self, loc, target_system=1, target_component=1): self.mav.mav.mission_item_send( @@ -4938,93 +4850,72 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) def test_poly_fence_object_avoidance_guided_pathfinding(self, target_system=1, target_component=1): self.load_fence("rover-path-planning-fence.txt") - self.context_push() - ex = None - try: - self.set_parameters({ - "AVOID_ENABLE": 3, - "OA_TYPE": 2, - "FENCE_MARGIN": 0, # FIXME: https://github.com/ArduPilot/ardupilot/issues/11601 - }) - self.reboot_sitl() - self.change_mode('GUIDED') - self.wait_ready_to_arm() - self.arm_vehicle() - self.set_parameter("FENCE_ENABLE", 1) - if self.mavproxy is not None: - self.mavproxy.send("fence list\n") - target_loc = mavutil.location(40.073800, -105.229172) - self.send_guided_mission_item(target_loc, - target_system=target_system, - target_component=target_component) - self.wait_location(target_loc, timeout=300) - self.do_RTL(timeout=300) - self.disarm_vehicle() - except Exception as e: - self.print_exception_caught(e) - ex = e - self.context_pop() + self.set_parameters({ + "AVOID_ENABLE": 3, + "OA_TYPE": 2, + "FENCE_MARGIN": 0, # FIXME: https://github.com/ArduPilot/ardupilot/issues/11601 + }) self.reboot_sitl() - if ex is not None: - raise ex + self.change_mode('GUIDED') + self.wait_ready_to_arm() + self.arm_vehicle() + self.set_parameter("FENCE_ENABLE", 1) + target_loc = mavutil.location(40.073800, -105.229172) + self.send_guided_mission_item(target_loc, + target_system=target_system, + target_component=target_component) + self.wait_location(target_loc, timeout=300) + self.do_RTL(timeout=300) + self.disarm_vehicle() def WheelEncoders(self): '''make sure wheel encoders are generally working''' - ex = None - try: - self.set_parameters({ - "WENC_TYPE": 10, - "EK3_ENABLE": 1, - "AHRS_EKF_TYPE": 3, - }) - self.reboot_sitl() - self.change_mode("LOITER") - self.wait_ready_to_arm() - self.change_mode("MANUAL") - self.arm_vehicle() - self.set_rc(3, 1600) - - m = self.assert_receive_message('WHEEL_DISTANCE', timeout=5) - - tstart = self.get_sim_time() - while True: - if self.get_sim_time_cached() - tstart > 10: - break - dist_home = self.distance_to_home(use_cached_home=True) - m = self.mav.messages.get("WHEEL_DISTANCE") - delta = abs(m.distance[0] - dist_home) - self.progress("dist-home=%f wheel-distance=%f delta=%f" % - (dist_home, m.distance[0], delta)) - if delta > 5: - raise NotAchievedException("wheel distance incorrect") - self.disarm_vehicle() - except Exception as e: - self.print_exception_caught(e) - self.disarm_vehicle() - ex = e + self.set_parameters({ + "WENC_TYPE": 10, + "EK3_ENABLE": 1, + "AHRS_EKF_TYPE": 3, + }) self.reboot_sitl() - if ex is not None: - raise ex + self.change_mode("LOITER") + self.wait_ready_to_arm() + self.change_mode("MANUAL") + self.arm_vehicle() + self.set_rc(3, 1600) + + m = self.assert_receive_message('WHEEL_DISTANCE', timeout=5) + + tstart = self.get_sim_time() + while True: + if self.get_sim_time_cached() - tstart > 10: + break + dist_home = self.distance_to_home(use_cached_home=True) + m = self.mav.messages.get("WHEEL_DISTANCE") + delta = abs(m.distance[0] - dist_home) + self.progress("dist-home=%f wheel-distance=%f delta=%f" % + (dist_home, m.distance[0], delta)) + if delta > 5: + raise NotAchievedException("wheel distance incorrect") + self.disarm_vehicle() def test_poly_fence_object_avoidance_guided_two_squares(self, target_system=1, target_component=1): self.start_subtest("Ensure we can steer around obstacles in guided mode") here = self.mav.location() - self.upload_fences_from_locations( - mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, - [ - [ # east - self.offset_location_ne(here, -50, 20), # bl - self.offset_location_ne(here, 50, 10), # tl - self.offset_location_ne(here, 50, 30), # tr - self.offset_location_ne(here, -50, 40), # br, - ], - [ # further east (and south - self.offset_location_ne(here, -60, 60), # bl - self.offset_location_ne(here, 40, 70), # tl - self.offset_location_ne(here, 40, 90), # tr - self.offset_location_ne(here, -60, 80), # br, - ], - ]) + self.upload_fences_from_locations([ + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, [ + # east + self.offset_location_ne(here, -50, 20), # bl + self.offset_location_ne(here, 50, 10), # tl + self.offset_location_ne(here, 50, 30), # tr + self.offset_location_ne(here, -50, 40), # br, + ]), + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, [ + # further east (and south + self.offset_location_ne(here, -60, 60), # bl + self.offset_location_ne(here, 40, 70), # tl + self.offset_location_ne(here, 40, 90), # tr + self.offset_location_ne(here, -60, 80), # br, + ]), + ]) if self.mavproxy is not None: self.mavproxy.send("fence list\n") self.context_push() @@ -5061,24 +4952,26 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) def test_poly_fence_avoidance_dont_breach_exclusion(self, target_system=1, target_component=1): self.start_subtest("Ensure we stop before breaching an exclusion fence") here = self.mav.location() - self.upload_fences_from_locations( - mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, - [ - [ # east - self.offset_location_ne(here, -50, 20), # bl - self.offset_location_ne(here, 50, 20), # br - self.offset_location_ne(here, 50, 40), # tr - self.offset_location_ne(here, -50, 40), # tl, - ], [ # west - self.offset_location_ne(here, -50, -20), # tl - self.offset_location_ne(here, 50, -20), # tr - self.offset_location_ne(here, 50, -40), # br - self.offset_location_ne(here, -50, -40), # bl, - ], { - "radius": 30, - "loc": self.offset_location_ne(here, -60, 0), - }, - ]) + self.upload_fences_from_locations([ + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, [ + # east + self.offset_location_ne(here, -50, 20), # bl + self.offset_location_ne(here, 50, 20), # br + self.offset_location_ne(here, 50, 40), # tr + self.offset_location_ne(here, -50, 40), # tl, + ]), + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, [ + # west + self.offset_location_ne(here, -50, -20), # tl + self.offset_location_ne(here, 50, -20), # tr + self.offset_location_ne(here, 50, -40), # br + self.offset_location_ne(here, -50, -40), # bl, + ]), + (mavutil.mavlink.MAV_CMD_NAV_FENCE_CIRCLE_INCLUSION, { + "radius": 30, + "loc": self.offset_location_ne(here, -60, 0), + }), + ]) if self.mavproxy is not None: self.mavproxy.send("fence list\n") self.set_parameters({ @@ -5114,159 +5007,86 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) self.disarm_vehicle() - def test_poly_fence_object_avoidance_guided_bendy_ruler(self, target_system=1, target_component=1): - if not self.mavproxy_can_do_mision_item_protocols(): - return - self.load_fence("rover-path-bendyruler-fence.txt") - self.context_push() - ex = None - try: - self.set_parameters({ - "AVOID_ENABLE": 3, - "OA_TYPE": 1, - "OA_LOOKAHEAD": 50, - }) - self.reboot_sitl() - self.change_mode('GUIDED') - self.wait_ready_to_arm() - self.arm_vehicle() - self.set_parameters({ - "FENCE_ENABLE": 1, - "WP_RADIUS": 5, - }) - if self.mavproxy is not None: - self.mavproxy.send("fence list\n") - target_loc = mavutil.location(40.071060, -105.227734, 0, 0) - self.send_guided_mission_item(target_loc, - target_system=target_system, - target_component=target_component) - # FIXME: we don't get within WP_RADIUS of our target?! - self.wait_location(target_loc, timeout=300, accuracy=15) - self.do_RTL(timeout=300) - self.disarm_vehicle() - except Exception as e: - self.print_exception_caught(e) - ex = e - self.context_pop() - self.disarm_vehicle() - self.reboot_sitl() - if ex is not None: - raise ex - - def PolyFenceObjectAvoidanceBendyRulerEasier(self, target_system=1, target_component=1): - '''PolyFence object avoidance tests - easier bendy ruler test''' - if not self.mavproxy_can_do_mision_item_protocols(): - return - self.test_poly_fence_object_avoidance_auto_bendy_ruler_easier( - target_system=target_system, target_component=target_component) - self.test_poly_fence_object_avoidance_guided_bendy_ruler_easier( - target_system=target_system, target_component=target_component) - - def test_poly_fence_object_avoidance_guided_bendy_ruler_easier(self, target_system=1, target_component=1): - '''finish-line issue means we can't complete the harder one. This - test can go away once we've nailed that one. The only - difference here is the target point. - ''' - if not self.mavproxy_can_do_mision_item_protocols(): - return - self.load_fence("rover-path-bendyruler-fence.txt") - self.context_push() - ex = None - try: - self.set_parameters({ - "AVOID_ENABLE": 3, - "OA_TYPE": 1, - "OA_LOOKAHEAD": 50, - }) - self.reboot_sitl() - self.change_mode('GUIDED') - self.wait_ready_to_arm() - self.arm_vehicle() - self.set_parameters({ - "FENCE_ENABLE": 1, - "WP_RADIUS": 5, - }) - if self.mavproxy is not None: - self.mavproxy.send("fence list\n") - target_loc = mavutil.location(40.071260, -105.227000, 0, 0) - self.send_guided_mission_item(target_loc, - target_system=target_system, - target_component=target_component) - # FIXME: we don't get within WP_RADIUS of our target?! - self.wait_location(target_loc, timeout=300, accuracy=15) - self.do_RTL(timeout=300) - self.disarm_vehicle() - except Exception as e: - self.print_exception_caught(e) - ex = e - self.context_pop() - self.disarm_vehicle() - self.reboot_sitl() - if ex is not None: - raise ex - - def test_poly_fence_object_avoidance_auto_bendy_ruler_easier(self, target_system=1, target_component=1): - '''finish-line issue means we can't complete the harder one. This - test can go away once we've nailed that one. The only - difference here is the target point. - ''' - if not self.mavproxy_can_do_mision_item_protocols(): - return - - self.load_fence("rover-path-bendyruler-fence.txt") - self.load_mission("rover-path-bendyruler-mission-easier.txt") - self.context_push() - ex = None - try: - self.set_parameters({ - "AVOID_ENABLE": 3, - "OA_TYPE": 1, - "OA_LOOKAHEAD": 50, - }) - self.reboot_sitl() - self.change_mode('AUTO') - self.wait_ready_to_arm() - self.arm_vehicle() - self.set_parameters({ - "FENCE_ENABLE": 1, - "WP_RADIUS": 5, - }) - if self.mavproxy is not None: - self.mavproxy.send("fence list\n") - target_loc = mavutil.location(40.071260, -105.227000, 0, 0) - # target_loc is copied from the mission file - self.wait_location(target_loc, timeout=300) - # mission has RTL as last item - self.wait_distance_to_home(3, 7, timeout=300) - self.disarm_vehicle() - except Exception as e: - self.print_exception_caught(e) - ex = e - self.context_pop() - self.disarm_vehicle() - self.reboot_sitl() - if ex is not None: - raise ex - - def PolyFenceObjectAvoidance(self, target_system=1, target_component=1): - '''PolyFence object avoidance tests''' - self.test_poly_fence_object_avoidance_auto( - target_system=target_system, - target_component=target_component) - self.test_poly_fence_object_avoidance_guided( - target_system=target_system, - target_component=target_component) - def PolyFenceObjectAvoidanceBendyRuler(self, target_system=1, target_component=1): '''PolyFence object avoidance tests - bendy ruler''' - if not self.mavproxy_can_do_mision_item_protocols(): - return - # bendy Ruler isn't as flexible as Dijkstra for planning, so - # it gets a simpler test: - self.test_poly_fence_object_avoidance_guided_bendy_ruler( - target_system=target_system, - target_component=target_component, - ) + self.load_fence_using_mavwp("rover-path-bendyruler-fence.txt") + self.set_parameters({ + "AVOID_ENABLE": 3, + "OA_TYPE": 1, + "FENCE_ENABLE": 1, + "WP_RADIUS": 5, + }) + self.reboot_sitl() + self.set_parameters({ + "OA_BR_LOOKAHEAD": 50, + }) + self.change_mode('GUIDED') + self.wait_ready_to_arm() + self.arm_vehicle() + target_loc = mavutil.location(40.071060, -105.227734, 1584, 0) + self.send_guided_mission_item(target_loc, + target_system=target_system, + target_component=target_component) + # FIXME: we don't get within WP_RADIUS of our target?! + self.wait_location(target_loc, timeout=300, accuracy=15) + self.do_RTL(timeout=300) + self.disarm_vehicle() + + def PolyFenceObjectAvoidanceBendyRulerEasierGuided(self, target_system=1, target_component=1): + '''finish-line issue means we can't complete the harder one. This + test can go away once we've nailed that one. The only + difference here is the target point. + ''' + self.load_fence_using_mavwp("rover-path-bendyruler-fence.txt") + self.set_parameters({ + "AVOID_ENABLE": 3, + "OA_TYPE": 1, + "FENCE_ENABLE": 1, + "WP_RADIUS": 5, + }) + self.reboot_sitl() + self.set_parameters({ + "OA_BR_LOOKAHEAD": 60, + }) + self.change_mode('GUIDED') + self.wait_ready_to_arm() + self.arm_vehicle() + target_loc = mavutil.location(40.071260, -105.227000, 1584, 0) + self.send_guided_mission_item(target_loc, + target_system=target_system, + target_component=target_component) + # FIXME: we don't get within WP_RADIUS of our target?! + self.wait_location(target_loc, timeout=300, accuracy=15) + self.do_RTL(timeout=300) + self.disarm_vehicle() + + def PolyFenceObjectAvoidanceBendyRulerEasierAuto(self, target_system=1, target_component=1): + '''finish-line issue means we can't complete the harder one. This + test can go away once we've nailed that one. The only + difference here is the target point. + ''' + self.load_fence_using_mavwp("rover-path-bendyruler-fence.txt") + self.load_mission("rover-path-bendyruler-mission-easier.txt") + + self.set_parameters({ + "AVOID_ENABLE": 3, + "OA_TYPE": 1, # BendyRuler + "FENCE_ENABLE": 1, + "WP_RADIUS": 5, + }) + self.reboot_sitl() + self.set_parameters({ + "OA_BR_LOOKAHEAD": 60, + }) + self.change_mode('AUTO') + self.wait_ready_to_arm() + self.arm_vehicle() + target_loc = mavutil.location(40.071260, -105.227000, 1584, 0) + # target_loc is copied from the mission file + self.wait_location(target_loc, timeout=300) + # mission has RTL as last item + self.wait_distance_to_home(3, 7, timeout=300) + self.disarm_vehicle() def test_scripting_simple_loop(self): self.start_subtest("Scripting simple loop") @@ -5314,6 +5134,7 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) self.install_test_scripts_context([ "scripting_test.lua", + "scripting_require_test_2.lua", "math.lua", "strings.lua", "mavlink_test.lua", @@ -5326,6 +5147,7 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) for success_text in [ "Internal tests passed", + "Require test 2 passed", "Math tests passed", "String tests passed", "Received heartbeat from" @@ -5428,6 +5250,28 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) self.context_pop() self.reboot_sitl() + def test_scripting_serial_loopback(self): + self.start_subtest("Scripting serial loopback test") + + self.context_push() + self.context_collect('STATUSTEXT') + self.set_parameters({ + "SCR_ENABLE": 1, + "SCR_SDEV_EN": 1, + "SCR_SDEV1_PROTO": 28, + }) + self.install_test_script_context("serial_loopback.lua") + self.reboot_sitl() + + for success_text in [ + "driver -> device good", + "device -> driver good", + ]: + self.wait_statustext(success_text, check_context=True) + + self.context_pop() + self.reboot_sitl() + def Scripting(self): '''Scripting test''' self.test_scripting_set_home_to_vehicle_location() @@ -5436,6 +5280,7 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) self.test_scripting_simple_loop() self.test_scripting_internal_test() self.test_scripting_auxfunc() + self.test_scripting_serial_loopback() def test_mission_frame(self, frame, target_system=1, target_component=1): self.clear_mission(mavutil.mavlink.MAV_MISSION_TYPE_MISSION, @@ -5565,65 +5410,55 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) def AP_Proximity_MAV(self): '''Test MAV proximity backend''' - self.context_push() - ex = None - try: - self.set_parameters({ - "PRX1_TYPE": 2, # AP_Proximity_MAV - "OA_TYPE": 2, # dijkstra - "OA_DB_OUTPUT": 3, # send all items - }) - self.reboot_sitl() - # 1 laser pointing straight forward: - self.send_obstacle_distances_expect_distance_sensor_messages( - { - "distances": [234], - "increment_f": 10, - "angle_offset": 0.0, - "min_distance": 0, - "max_distance": 1000, # cm - }, [ - {"orientation": 0, "distance": 234}, - ]) - - # 5 lasers at front of vehicle, spread over 40 degrees: - self.send_obstacle_distances_expect_distance_sensor_messages( - { - "distances": [111, 222, 333, 444, 555], - "increment_f": 10, - "angle_offset": -20.0, - "min_distance": 0, - "max_distance": 1000, # cm - }, [ - {"orientation": 0, "distance": 111}, - ]) - - # lots of dense readings (e.g. vision camera: - distances = [0] * 72 - for i in range(0, 72): - distances[i] = 1000 + 10*abs(36-i) - - self.send_obstacle_distances_expect_distance_sensor_messages( - { - "distances": distances, - "increment_f": 90/72.0, - "angle_offset": -45.0, - "min_distance": 0, - "max_distance": 2000, # cm - }, [ - {"orientation": 0, "distance": 1000}, - {"orientation": 1, "distance": 1190}, - {"orientation": 7, "distance": 1190}, - ]) - - except Exception as e: - self.print_exception_caught(e) - ex = e - self.context_pop() + self.set_parameters({ + "PRX1_TYPE": 2, # AP_Proximity_MAV + "OA_TYPE": 2, # dijkstra + "OA_DB_OUTPUT": 3, # send all items + }) self.reboot_sitl() - if ex is not None: - raise ex + + # 1 laser pointing straight forward: + self.send_obstacle_distances_expect_distance_sensor_messages( + { + "distances": [234], + "increment_f": 10, + "angle_offset": 0.0, + "min_distance": 0, + "max_distance": 1000, # cm + }, [ + {"orientation": 0, "distance": 234}, + ]) + + # 5 lasers at front of vehicle, spread over 40 degrees: + self.send_obstacle_distances_expect_distance_sensor_messages( + { + "distances": [111, 222, 333, 444, 555], + "increment_f": 10, + "angle_offset": -20.0, + "min_distance": 0, + "max_distance": 1000, # cm + }, [ + {"orientation": 0, "distance": 111}, + ]) + + # lots of dense readings (e.g. vision camera: + distances = [0] * 72 + for i in range(0, 72): + distances[i] = 1000 + 10*abs(36-i) + + self.send_obstacle_distances_expect_distance_sensor_messages( + { + "distances": distances, + "increment_f": 90/72.0, + "angle_offset": -45.0, + "min_distance": 0, + "max_distance": 2000, # cm + }, [ + {"orientation": 0, "distance": 1000}, + {"orientation": 1, "distance": 1190}, + {"orientation": 7, "distance": 1190}, + ]) def SendToComponents(self): '''Test ArduPilot send_to_components function''' @@ -6125,10 +5960,10 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) def RangeFinder(self): '''Test RangeFinder''' # the following magic numbers correspond to the post locations in SITL - home_string = "%s,%s,%s,%s" % (51.8752066, 14.6487840, 54.15, 315) + home_string = "%s,%s,%s,%s" % (51.8752066, 14.6487840, 54.15, 231) rangefinder_params = { - "SIM_SONAR_ROT": 6, + "SIM_SONAR_ROT": 0, } rangefinder_params.update(self.analog_rangefinder_parameters()) @@ -6143,7 +5978,7 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) if m.voltage == 0: raise NotAchievedException("Did not get non-zero voltage") want_range = 10 - if abs(m.distance - want_range) > 0.1: + if abs(m.distance - want_range) > 0.5: raise NotAchievedException("Expected %fm got %fm" % (want_range, m.distance)) def DepthFinder(self): @@ -6268,8 +6103,6 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) def AutoDock(self): '''Test automatic docking of rover for multiple FOVs of simulated beacon''' - self.context_push() - self.set_parameters({ "PLND_ENABLED": 1, "PLND_TYPE": 4, @@ -6295,40 +6128,27 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) }) for type in range(0, 3): # CYLINDRICAL FOV, CONICAL FOV, SPHERICAL FOV - ex = None - try: - self.set_parameter("SIM_PLD_TYPE", type) - self.reboot_sitl() - self.change_mode('GUIDED') - self.wait_ready_to_arm() - self.arm_vehicle() - initial_position = self.offset_location_ne(target, -20, -2) - self.drive_to_location(initial_position) - self.change_mode(8) # DOCK mode - max_delta = 1 - self.wait_distance_to_location(target, 0, max_delta, timeout=180) - self.disarm_vehicle() - self.assert_receive_message('GLOBAL_POSITION_INT') - new_pos = self.mav.location() - delta = abs(self.get_distance(target, new_pos) - stopping_dist) - self.progress("Docked %f metres from stopping point" % delta) - if delta > max_delta: - raise NotAchievedException("Did not dock close enough to stopping point (%fm > %fm" % (delta, max_delta)) + self.set_parameter("SIM_PLD_TYPE", type) + self.reboot_sitl() + self.change_mode('GUIDED') + self.wait_ready_to_arm() + self.arm_vehicle() + initial_position = self.offset_location_ne(target, -20, -2) + self.drive_to_location(initial_position) + self.change_mode(8) # DOCK mode + max_delta = 1 + self.wait_distance_to_location(target, 0, max_delta, timeout=180) + self.disarm_vehicle() + self.assert_receive_message('GLOBAL_POSITION_INT') + new_pos = self.mav.location() + delta = abs(self.get_distance(target, new_pos) - stopping_dist) + self.progress("Docked %f metres from stopping point" % delta) + if delta > max_delta: + raise NotAchievedException("Did not dock close enough to stopping point (%fm > %fm" % (delta, max_delta)) - if not self.current_onboard_log_contains_message("PL"): - raise NotAchievedException("Did not see expected PL message") + if not self.current_onboard_log_contains_message("PL"): + raise NotAchievedException("Did not see expected PL message") - except Exception as e: - self.print_exception_caught(e) - ex = e - break - - self.context_pop() - - if ex is not None: - raise ex - - self.reboot_sitl() self.progress("All done") def PrivateChannel(self): @@ -6608,22 +6428,22 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) '''ensure MAV_CMD_DO_FENCE_ENABLE mavlink command works''' here = self.mav.location() - self.upload_fences_from_locations( - mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, - [ - [ # east - self.offset_location_ne(here, -50, 20), # bl - self.offset_location_ne(here, 50, 20), # br - self.offset_location_ne(here, 50, 40), # tr - self.offset_location_ne(here, -50, 40), # tl, - ], [ # over the top of the vehicle - self.offset_location_ne(here, -50, -50), # bl - self.offset_location_ne(here, -50, 50), # br - self.offset_location_ne(here, 50, 50), # tr - self.offset_location_ne(here, 50, -50), # tl, - ] - ] - ) + self.upload_fences_from_locations([ + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, [ + # east + self.offset_location_ne(here, -50, 20), # bl + self.offset_location_ne(here, 50, 20), # br + self.offset_location_ne(here, 50, 40), # tr + self.offset_location_ne(here, -50, 40), # tl, + ]), + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION, [ + # over the top of the vehicle + self.offset_location_ne(here, -50, -50), # bl + self.offset_location_ne(here, -50, 50), # br + self.offset_location_ne(here, 50, 50), # tr + self.offset_location_ne(here, 50, -50), # tl, + ]), + ]) # enable: self.run_cmd(mavutil.mavlink.MAV_CMD_DO_FENCE_ENABLE, p1=1) @@ -6824,17 +6644,15 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) self.progress("Ensure we can arm when we have an inclusion fence we are inside of") here = self.mav.location() - self.upload_fences_from_locations( - mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, - [ - [ # over the top of the vehicle - self.offset_location_ne(here, -50, -50), # bl - self.offset_location_ne(here, -50, 50), # br - self.offset_location_ne(here, 50, 50), # tr - self.offset_location_ne(here, 50, -50), # tl, - ] - ] - ) + self.upload_fences_from_locations([ + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, [ + # over the top of the vehicle + self.offset_location_ne(here, -50, -50), # bl + self.offset_location_ne(here, -50, 50), # br + self.offset_location_ne(here, 50, 50), # tr + self.offset_location_ne(here, 50, -50), # tl, + ]), + ]) self.delay_sim_time(5) self.wait_ready_to_arm() @@ -6846,60 +6664,54 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) self.progress("Now create a fence we are in breach of") here = self.mav.location() - self.upload_fences_from_locations( - mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, - [ - [ # over the top of the vehicle - self.offset_location_ne(here, 20, 20), # bl - self.offset_location_ne(here, 20, 50), # br - self.offset_location_ne(here, 50, 50), # tr - self.offset_location_ne(here, 50, 20), # tl, - ] - ] - ) + self.upload_fences_from_locations([ + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, [ + # over the top of the vehicle + self.offset_location_ne(here, 20, 20), # bl + self.offset_location_ne(here, 20, 50), # br + self.offset_location_ne(here, 50, 50), # tr + self.offset_location_ne(here, 50, 20), # tl, + ]), + ]) - self.assert_prearm_failure('vehicle outside fence', other_prearm_failures_fatal=False) + self.assert_prearm_failure('Vehicle breaching Polygon fence', other_prearm_failures_fatal=False) self.reboot_sitl() - self.assert_prearm_failure('vehicle outside fence', other_prearm_failures_fatal=False, timeout=120) + self.assert_prearm_failure('Vehicle breaching Polygon fence', other_prearm_failures_fatal=False, timeout=120) self.progress("Ensure we can arm when a polyfence fence is cleared when we've previously been in breach") self.clear_fence() self.wait_ready_to_arm() - self.upload_fences_from_locations( - mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, - [ - [ # over the top of the vehicle - self.offset_location_ne(here, 20, 20), # bl - self.offset_location_ne(here, 20, 50), # br - self.offset_location_ne(here, 50, 50), # tr - self.offset_location_ne(here, 50, 20), # tl, - ] - ] - ) + self.upload_fences_from_locations([ + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, [ + # over the top of the vehicle + self.offset_location_ne(here, 20, 20), # bl + self.offset_location_ne(here, 20, 50), # br + self.offset_location_ne(here, 50, 50), # tr + self.offset_location_ne(here, 50, 20), # tl, + ]), + ]) self.reboot_sitl() - self.assert_prearm_failure('vehicle outside fence', other_prearm_failures_fatal=False, timeout=120) + self.assert_prearm_failure('Vehicle breaching Polygon fence', other_prearm_failures_fatal=False, timeout=120) self.clear_fence() self.wait_ready_to_arm() self.progress("Ensure we can arm after clearing polygon fence type enabled") - self.upload_fences_from_locations( - mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, - [ - [ # over the top of the vehicle - self.offset_location_ne(here, 20, 20), # bl - self.offset_location_ne(here, 20, 50), # br - self.offset_location_ne(here, 50, 50), # tr - self.offset_location_ne(here, 50, 20), # tl, - ] - ] - ) - self.assert_prearm_failure('vehicle outside fence', other_prearm_failures_fatal=False, timeout=120) + self.upload_fences_from_locations([ + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, [ + # over the top of the vehicle + self.offset_location_ne(here, 20, 20), # bl + self.offset_location_ne(here, 20, 50), # br + self.offset_location_ne(here, 50, 50), # tr + self.offset_location_ne(here, 50, 20), # tl, + ]), + ]) + self.assert_prearm_failure('Vehicle breaching Polygon fence', other_prearm_failures_fatal=False, timeout=120) self.set_parameter('FENCE_TYPE', 2) self.wait_ready_to_arm() self.set_parameter('FENCE_TYPE', 6) - self.assert_prearm_failure('vehicle outside fence', other_prearm_failures_fatal=False, timeout=120) + self.assert_prearm_failure('Vehicle breaching Polygon fence', other_prearm_failures_fatal=False, timeout=120) def OpticalFlow(self): '''lightly test OpticalFlow''' @@ -6915,6 +6727,15 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) self.context_pop() self.reboot_sitl() + def RCDuplicateOptionsExist(self): + '''ensure duplicate RC option detection works''' + self.wait_ready_to_arm() + self.set_parameters({ + "RC6_OPTION": 118, + "RC7_OPTION": 118, + }) + self.assert_arm_failure("Duplicate Aux Switch Options") + def tests(self): '''return list of all tests''' ret = super(AutoTestRover, self).tests() @@ -6967,10 +6788,12 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) self.SkidSteer, self.PolyFence, self.PolyFenceAvoidance, - self.PolyFenceObjectAvoidance, + self.PolyFenceObjectAvoidanceAuto, + self.PolyFenceObjectAvoidanceGuided, self.PolyFenceObjectAvoidanceBendyRuler, self.SendToComponents, - self.PolyFenceObjectAvoidanceBendyRulerEasier, + self.PolyFenceObjectAvoidanceBendyRulerEasierGuided, + self.PolyFenceObjectAvoidanceBendyRulerEasierAuto, self.SlewRate, self.Scripting, self.ScriptingSteeringAndThrottle, @@ -7006,6 +6829,7 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) self.FenceFullAndPartialTransfer, self.MissionPolyEnabledPreArm, self.OpticalFlow, + self.RCDuplicateOptionsExist, ]) return ret @@ -7013,6 +6837,7 @@ Brakes have negligible effect (with=%0.2fm without=%0.2fm delta=%0.2fm) return { "SlewRate": "got timing report failure on CI", "MAV_CMD_NAV_SET_YAW_SPEED": "compiled out of code by default", + "PolyFenceObjectAvoidanceBendyRuler": "unreliable", } def rc_defaults(self): diff --git a/Tools/autotest/vehicle_test_suite.py b/Tools/autotest/vehicle_test_suite.py index 4016c4f047..520eff0c42 100644 --- a/Tools/autotest/vehicle_test_suite.py +++ b/Tools/autotest/vehicle_test_suite.py @@ -205,6 +205,7 @@ class Context(object): def __init__(self): self.parameters = [] self.sitl_commandline_customised = False + self.reboot_sitl_was_done = False self.message_hooks = [] self.collections = {} self.heartbeat_interval_ms = 1000 @@ -340,7 +341,129 @@ class Telem(object): if not self.connected: if not self.connect(): return - self.update_read() + return self.update_read() + + +class IBusMessage(object): + def checksum_bytes(self, out): + checksum = 0xFFFF + for b in iter(out): + checksum -= b + return checksum + + +class IBusResponse(IBusMessage): + def __init__(self, some_bytes): + self.len = some_bytes[0] + checksum = self.checksum_bytes(some_bytes[:self.len-2]) + if checksum >> 8 != some_bytes[self.len-1]: + raise ValueError("Checksum bad (-1)") + if checksum & 0xff != some_bytes[self.len-2]: + raise ValueError("Checksum bad (-2)") + self.address = some_bytes[1] & 0x0F + self.handle_payload_bytes(some_bytes[2:self.len-2]) + + +class IBusResponse_DISCOVER(IBusResponse): + def handle_payload_bytes(self, payload_bytes): + if len(payload_bytes): + raise ValueError("Not expecting payload bytes (%u)" % + (len(payload_bytes), )) + + +class IBusResponse_GET_SENSOR_TYPE(IBusResponse): + def handle_payload_bytes(self, payload_bytes): + if len(payload_bytes) != 2: + raise ValueError("Expected 2 payload bytes") + self.sensor_type = payload_bytes[0] + self.sensor_length = payload_bytes[1] + + +class IBusResponse_GET_SENSOR_VALUE(IBusResponse): + def handle_payload_bytes(self, payload_bytes): + self.sensor_value = payload_bytes + + def get_sensor_value(self): + '''returns an integer based off content''' + ret = 0 + for i in range(len(self.sensor_value)): + x = self.sensor_value[i] + if sys.version_info.major < 3: + x = ord(x) + ret = ret | (x << (i*8)) + return ret + + +class IBusRequest(IBusMessage): + def __init__(self, command, address): + self.command = command + self.address = address + + def payload_bytes(self): + '''most requests don't have a payload''' + return bytearray() + + def for_wire(self): + out = bytearray() + payload_bytes = self.payload_bytes() + payload_length = len(payload_bytes) + length = 1 + 1 + payload_length + 2 # len+cmd|adr+payloadlen+cksum + format_string = '> 8)) + return out + + +class IBusRequest_DISCOVER(IBusRequest): + def __init__(self, address): + super(IBusRequest_DISCOVER, self).__init__(0x08, address) + + +class IBusRequest_GET_SENSOR_TYPE(IBusRequest): + def __init__(self, address): + super(IBusRequest_GET_SENSOR_TYPE, self).__init__(0x09, address) + + +class IBusRequest_GET_SENSOR_VALUE(IBusRequest): + def __init__(self, address): + super(IBusRequest_GET_SENSOR_VALUE, self).__init__(0x0A, address) + + +class IBus(Telem): + def __init__(self, destination_address): + super(IBus, self).__init__(destination_address) + + def progress_tag(self): + return "IBus" + + def packet_from_buffer(self, buffer): + t = buffer[1] >> 4 + if sys.version_info.major < 3: + t = ord(t) + if t == 0x08: + return IBusResponse_DISCOVER(buffer) + if t == 0x09: + return IBusResponse_GET_SENSOR_TYPE(buffer) + if t == 0x0A: + return IBusResponse_GET_SENSOR_VALUE(buffer) + raise ValueError("Unknown response type (%u)" % t) + + def update_read(self): + self.buffer += self.do_read() + while len(self.buffer): + msglen = self.buffer[0] + if sys.version_info.major < 3: + msglen = ord(msglen) + if len(self.buffer) < msglen: + return + packet = self.packet_from_buffer(self.buffer[:msglen]) + self.buffer = self.buffer[msglen:] + return packet class WaitAndMaintain(object): @@ -370,6 +493,7 @@ class WaitAndMaintain(object): # check for timeout if now - tstart > self.timeout: + self.print_failure_text(now, current_value) raise self.timeoutexception() # handle the case where we are are achieving our value: @@ -401,6 +525,10 @@ class WaitAndMaintain(object): text += f" (maintain={delta:.1f}/{self.minimum_duration})" self.progress(text) + def print_failure_text(self, now, value): + '''optionally print a more detailed error string''' + pass + def progress_text(self, value): return f"want={self.get_target_value()} got={value}" @@ -501,10 +629,39 @@ class WaitAndMaintainEKFFlags(WaitAndMaintain): return AutoTestTimeoutException(f"Failed to get EKF.flags={self.required_flags}") def progress_text(self, current_value): - error_bits_str = "" - if current_value & self.error_bits: - error_bits_str = " (error bits present)" - return (f"Want=({self.required_flags}) got={current_value}{error_bits_str}") + error_bits = current_value & self.error_bits + return (f"Want={self.required_flags} got={current_value} errors={error_bits}") + + def ekf_flags_string(self, bits): + ret = [] + for i in range(0, 16): + bit = 1 << i + try: + if not bits & bit: + continue + name = mavutil.mavlink.enums["ESTIMATOR_STATUS_FLAGS"][bit].name + trimmed_name = name.removeprefix("ESTIMATOR_") + ret.append(trimmed_name) + except KeyError: + ret.append(str(bit)) + return "|".join(ret) + + def failure_text(self, now, current_value): + components = [] + components.append(("want", self.ekf_flags_string(self.required_flags))) + + missing_bits = self.required_flags & ~current_value + if missing_bits: + components.append(("missing", self.ekf_flags_string(missing_bits))) + + error_bits = current_value & self.error_bits + if error_bits: + components.append(("errors", self.ekf_flags_string(error_bits))) + + return " ".join([f"{n}={v}" for (n, v) in components]) + + def print_failure_text(self, now, current_value): + self.progress(self.failure_text(now, current_value)) class WaitAndMaintainArmed(WaitAndMaintain): @@ -1798,6 +1955,7 @@ class TestSuite(ABC): self.terrain_data_messages_sent = 0 # count of messages back self.dronecan_tests = dronecan_tests self.statustext_id = 1 + self.message_hooks = [] # functions or MessageHook instances def __del__(self): if self.rc_thread is not None: @@ -1903,9 +2061,9 @@ class TestSuite(ABC): def vehicleinfo_key(self): return self.log_name() - def repeatedly_apply_parameter_file(self, filepath): + def repeatedly_apply_parameter_filepath(self, filepath): if False: - return self.repeatedly_apply_parameter_file_mavproxy(filepath) + return self.repeatedly_apply_parameter_filepath_mavproxy(filepath) parameters = mavparm.MAVParmDict() # correct_parameters = set() if not parameters.load(filepath): @@ -1915,7 +2073,7 @@ class TestSuite(ABC): param_dict[p] = parameters[p] self.set_parameters(param_dict) - def repeatedly_apply_parameter_file_mavproxy(self, filepath): + def repeatedly_apply_parameter_filepath_mavproxy(self, filepath): '''keep applying a parameter file until no parameters changed''' for i in range(0, 3): self.mavproxy.send("param load %s\n" % filepath) @@ -1936,7 +2094,7 @@ class TestSuite(ABC): if self.params is None: self.params = self.model_defaults_filepath(self.frame) for x in self.params: - self.repeatedly_apply_parameter_file(x) + self.repeatedly_apply_parameter_filepath(x) def count_lines_in_filepath(self, filepath): return len([i for i in open(filepath)]) @@ -2044,6 +2202,8 @@ class TestSuite(ABC): def load_fence(self, filename): filepath = os.path.join(testdir, self.current_test_name_directory, filename) + if not os.path.exists(filepath): + filepath = self.generic_mission_filepath_for_filename(filename) self.progress("Loading fence from (%s)" % str(filepath)) locs = [] for line in open(filepath, 'rb'): @@ -2070,11 +2230,17 @@ class TestSuite(ABC): locs2.append(copy.copy(locs2[1])) return self.roundtrip_fence_using_fencepoint_protocol(locs2) - self.upload_fences_from_locations( - mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, - [ - locs - ]) + self.upload_fences_from_locations([ + (mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_INCLUSION, locs), + ]) + + def load_fence_using_mavwp(self, filename): + filepath = os.path.join(testdir, self.current_test_name_directory, filename) + if not os.path.exists(filepath): + filepath = self.generic_mission_filepath_for_filename(filename) + self.progress("Loading fence from (%s)" % str(filepath)) + items = self.mission_item_protocol_items_from_filepath(mavwp.MissionItemProtocol_Fence, filepath) + self.check_fence_upload_download(items) def send_reboot_command(self): self.mav.mav.command_long_send(self.sysid_thismav(), @@ -2188,7 +2354,13 @@ class TestSuite(ABC): 0, 0) - def reboot_sitl(self, required_bootcount=None, force=False, check_position=True): + def reboot_sitl(self, + required_bootcount=None, + force=False, + check_position=True, + mark_context=True, + startup_location_dist_max=1, + ): """Reboot SITL instance and wait for it to reconnect.""" if self.armed() and not force: raise NotAchievedException("Reboot attempted while armed") @@ -2196,7 +2368,9 @@ class TestSuite(ABC): self.reboot_sitl_mav(required_bootcount=required_bootcount, force=force) self.do_heartbeats(force=True) if check_position and self.frame != 'sailboat': # sailboats drift with wind! - self.assert_simstate_location_is_at_startup_location() + self.assert_simstate_location_is_at_startup_location(dist_max=startup_location_dist_max) + if mark_context: + self.context_get().reboot_sitl_was_done = True def reboot_sitl_mavproxy(self, required_bootcount=None): """Reboot SITL instance using MAVProxy and wait for it to reconnect.""" @@ -2343,11 +2517,6 @@ class TestSuite(ABC): def get_sim_parameter_documentation_get_whitelist(self): # common parameters ret = set([ - "SIM_ACC1_RND", - "SIM_ACC2_RND", - "SIM_ACC3_RND", - "SIM_ACC4_RND", - "SIM_ACC5_RND", "SIM_ACC_FILE_RW", "SIM_ACC_TRIM_X", "SIM_ACC_TRIM_Y", @@ -2395,8 +2564,6 @@ class TestSuite(ABC): "SIM_DRIFT_SPEED", "SIM_DRIFT_TIME", "SIM_EFI_TYPE", - "SIM_ENGINE_FAIL", - "SIM_ENGINE_MUL", "SIM_ESC_ARM_RPM", "SIM_FTOWESC_ENA", "SIM_FTOWESC_POW", @@ -2627,7 +2794,6 @@ class TestSuite(ABC): "SIM_WAVE_ENABLE", "SIM_WAVE_LENGTH", "SIM_WAVE_SPEED", - "SIM_WIND_DIR_Z", ]) vinfo_key = self.vehicleinfo_key() @@ -2867,7 +3033,7 @@ class TestSuite(ABC): continue if "#if AC_PRECLAND_ENABLED" in line: continue - if "#if OFFBOARD_GUIDED == ENABLED" in line: + if "#if AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED" in line: continue if "#end" in line: continue @@ -3291,6 +3457,71 @@ class TestSuite(ABC): return self.drain_all_pexpects() + class MessageHook(): + '''base class for objects that watch the message stream and check for + validity of fields''' + def __init__(self, suite): + self.suite = suite + + def process(self): + pass + + def progress_prefix(self): + return "" + + def progress(self, string): + string = self.progress_prefix() + string + self.suite.progress(string) + + class ValidateIntPositionAgainstSimState(MessageHook): + '''monitors a message containing a position containing lat/lng in 1e7, + makes sure it stays close to SIMSTATE''' + def __init__(self, suite, other_int_message_name, max_allowed_divergence=150): + super(TestSuite.ValidateIntPositionAgainstSimState, self).__init__(suite) + self.other_int_message_name = other_int_message_name + self.max_allowed_divergence = max_allowed_divergence + self.max_divergence = 0 + self.gpi = None + self.simstate = None + self.last_print = 0 + self.min_print_interval = 1 # seconds + + def progress_prefix(self): + return "VIPASS: " + + def process(self, mav, m): + if m.get_type() == self.other_int_message_name: + self.gpi = m + elif m.get_type() == 'SIMSTATE': + self.simstate = m + if self.gpi is None: + return + if self.simstate is None: + return + + divergence = self.suite.get_distance_int(self.gpi, self.simstate) + if (time.time() - self.last_print > self.min_print_interval or + divergence > self.max_divergence): + self.progress(f"distance(SIMSTATE,{self.other_int_message_name})={divergence:.5f}m") + self.last_print = time.time() + if divergence > self.max_divergence: + self.max_divergence = divergence + if divergence > self.max_allowed_divergence: + raise NotAchievedException( + "%s diverged from simstate by %fm (max=%fm" % + (self.other_int_message_name, divergence, self.max_allowed_divergence,)) + + def hook_removed(self): + self.progress(f"Maximum divergence was {self.max_divergence}m (max={self.max_allowed_divergence}m)") + + class ValidateGlobalPositionIntAgainstSimState(ValidateIntPositionAgainstSimState): + def __init__(self, suite, **kwargs): + super(TestSuite.ValidateGlobalPositionIntAgainstSimState, self).__init__(suite, 'GLOBAL_POSITION_INT', **kwargs) + + class ValidateAHRS3AgainstSimState(ValidateIntPositionAgainstSimState): + def __init__(self, suite, **kwargs): + super(TestSuite.ValidateAHRS3AgainstSimState, self).__init__(suite, 'AHRS3', **kwargs) + def message_hook(self, mav, msg): """Called as each mavlink msg is received.""" # print("msg: %s" % str(msg)) @@ -3302,6 +3533,13 @@ class TestSuite(ABC): self.idle_hook(mav) self.do_heartbeats() + for h in self.message_hooks: + if isinstance(h, TestSuite.MessageHook): + h.process(mav, msg) + continue + # assume it's a function + h(mav, msg) + def send_message_hook(self, msg, x): self.write_msg_to_tlog(msg) @@ -4416,6 +4654,63 @@ class TestSuite(ABC): self.onboard_logging_log_disarmed() self.onboard_logging_not_log_disarmed() + def LoggingFormatSanityChecks(self, path): + dfreader = self.dfreader_for_path(path) + first_message = dfreader.recv_match() + if first_message.get_type() != 'FMT': + raise NotAchievedException("Expected first message to be a FMT message") + if first_message.Name != 'FMT': + raise NotAchievedException("Expected first message to be the FMT FMT message") + + self.progress("Ensuring DCM format is received") # it's a WriteStreaming message... + while True: + m = dfreader.recv_match(type='FMT') + if m is None: + raise NotAchievedException("Did not find DCM format") + if m.Name != 'DCM': + continue + self.progress("Found DCM format") + break + + self.progress("No message should appear before its format") + dfreader.rewind() + seen_formats = set() + while True: + m = dfreader.recv_match() + if m is None: + break + m_type = m.get_type() + if m_type == 'FMT': + seen_formats.add(m.Name) + continue + if m_type not in seen_formats: + raise ValueError(f"{m_type} seen before its format") + # print(f"{m_type} OK") + + def LoggingFormat(self): + '''ensure formats are emmitted appropriately''' + + self.context_push() + self.set_parameter('LOG_FILE_DSRMROT', 1) + self.wait_ready_to_arm() + for i in range(3): + self.arm_vehicle() + self.delay_sim_time(5) + path = self.current_onboard_log_filepath() + self.disarm_vehicle() + self.LoggingFormatSanityChecks(path) + self.context_pop() + + self.context_push() + for i in range(3): + self.set_parameter("LOG_DISARMED", 1) + self.reboot_sitl() + self.delay_sim_time(5) + path = self.current_onboard_log_filepath() + self.set_parameter("LOG_DISARMED", 0) + self.LoggingFormatSanityChecks(path) + self.context_pop() + def TestLogDownloadMAVProxy(self, upload_logs=False): """Download latest log.""" filename = "MAVProxy-downloaded-log.BIN" @@ -4609,14 +4904,14 @@ class TestSuite(ABC): return wploader.count() def install_message_hook(self, hook): - self.mav.message_hooks.append(hook) + self.message_hooks.append(hook) def install_message_hook_context(self, hook): '''installs a message hook which will be removed when the context goes away''' if self.mav is None: return - self.mav.message_hooks.append(hook) + self.message_hooks.append(hook) self.context_get().message_hooks.append(hook) def remove_message_hook(self, hook): @@ -4624,7 +4919,9 @@ class TestSuite(ABC): once''' if self.mav is None: return - self.mav.message_hooks.remove(hook) + self.message_hooks.remove(hook) + if isinstance(hook, TestSuite.MessageHook): + hook.hook_removed() def install_example_script_context(self, scriptname): '''installs an example script which will be removed when the context goes @@ -4657,10 +4954,10 @@ class TestSuite(ABC): self.install_mavlink_module() self.context_get().installed_modules.append("mavlink") - def install_applet_script_context(self, scriptname): + def install_applet_script_context(self, scriptname, **kwargs): '''installs an applet script which will be removed when the context goes away''' - self.install_applet_script(scriptname) + self.install_applet_script(scriptname, **kwargs) self.context_get().installed_scripts.append(scriptname) def rootdir(self): @@ -4956,7 +5253,7 @@ class TestSuite(ABC): os.path.join(testdir, self.current_test_name_directory, filename), strict=strict) - def wp_to_mission_item_int(self, wp): + def wp_to_mission_item_int(self, wp, mission_type): '''convert a MISSION_ITEM to a MISSION_ITEM_INT. We always send as MISSION_ITEM_INT to give cm level accuracy Swiped from mavproxy_wp.py @@ -4977,19 +5274,35 @@ class TestSuite(ABC): wp.param4, int(wp.x*1.0e7), int(wp.y*1.0e7), - wp.z) + wp.z, + mission_type, + ) return wp_int - def mission_from_filepath(self, filepath, target_system=1, target_component=1): + def mission_item_protocol_items_from_filepath(self, + loaderclass, + filepath, + target_system=1, + target_component=1, + ): '''returns a list of mission-item-ints from filepath''' - print("filepath: %s" % filepath) - self.progress("Loading mission (%s)" % os.path.basename(filepath)) - wploader = mavwp.MAVWPLoader( + # self.progress("filepath: %s" % filepath) + self.progress("Loading {loaderclass.itemstype()} (%s)" % os.path.basename(filepath)) + wploader = loaderclass( target_system=target_system, target_component=target_component ) wploader.load(filepath) - return [self.wp_to_mission_item_int(x) for x in wploader.wpoints] + return [self.wp_to_mission_item_int(x, wploader.mav_mission_type()) for x in wploader.wpoints] # noqa:502 + + def mission_from_filepath(self, filepath, target_system=1, target_component=1): + '''returns a list of mission-item-ints from filepath''' + return self.mission_item_protocol_items_from_filepath( + mavwp.MAVWPLoader, + filepath, + target_system=target_system, + target_component=target_component, + ) def sitl_home_string_from_mission(self, filename): '''return a string of the form "lat,lng,yaw,alt" from the home @@ -5010,6 +5323,10 @@ class TestSuite(ABC): os.path.join(testdir, self.current_test_name_directory, filename) ) + def get_home_location_from_mission(self, filename): + (home_lat, home_lon, home_alt, heading) = self.get_home_tuple_from_mission("rover-path-planning-mission.txt") + return mavutil.location(home_lat, home_lon) + def get_home_tuple_from_mission_filepath(self, filepath): '''gets item 0 from the mission file, returns a tuple suitable for passing to customise_SITL_commandline as --home. Yaw will be @@ -5403,6 +5720,10 @@ class TestSuite(ABC): """Setup a simulated RC control to a PWM value""" self.set_rc_from_map({chan: pwm}, timeout=timeout) + def set_servo(self, chan, pwm): + """Replicate the functionality of MAVProxy: servo set """ + self.run_cmd(mavutil.mavlink.MAV_CMD_DO_SET_SERVO, p1=chan, p2=pwm) + def location_offset_ne(self, location, north, east): '''move location in metres''' print("old: %f %f" % (location.lat, location.lng)) @@ -5416,6 +5737,12 @@ class TestSuite(ABC): self.location_offset_ne(ret, n, e) return ret + def home_relative_loc_neu(self, n, e, u): + ret = self.home_position_as_mav_location() + self.location_offset_ne(ret, n, e) + ret.alt += u + return ret + def zero_throttle(self): """Set throttle to zero.""" if self.is_rover(): @@ -5775,7 +6102,7 @@ class TestSuite(ABC): self.set_output_to_trim(self.get_stick_arming_channel()) self.progress("Arm in %ss" % tdelta) # TODO check arming time return - print("Not armed after %f seconds" % (tdelta)) + self.progress("Not armed after %f seconds" % (tdelta)) if tdelta > timeout: break self.set_output_to_trim(self.get_stick_arming_channel()) @@ -6119,6 +6446,9 @@ class TestSuite(ABC): f.close() self.start_SITL(wipe=False) self.set_streamrate(self.sitl_streamrate()) + elif dead.reboot_sitl_was_done: + self.progress("Doing implicit context-pop reboot") + self.reboot_sitl(mark_context=False) # the following method is broken under Python2; can't **build_opts # def context_start_custom_binary(self, extra_defines={}): @@ -6657,6 +6987,18 @@ class TestSuite(ABC): self.progress("No mode (%s); available modes '%s'" % (mode, mode_map)) raise ErrorException("Unknown mode '%s'" % mode) + def get_mode_string_for_mode(self, mode): + if isinstance(mode, str): + return mode + mode_map = self.mav.mode_mapping() + if mode_map is None: + return f"mode={mode}" + for (n, v) in mode_map.items(): + if v == mode: + return n + self.progress(f"No mode ({mode} {type(mode)}); available modes '{mode_map}'") + raise ErrorException("Unknown mode '%s'" % mode) + def run_cmd_do_set_mode(self, mode, timeout=30, @@ -6807,22 +7149,17 @@ class TestSuite(ABC): self.mavproxy.expect("Loaded module relay") self.mavproxy.send("relay set %d %d\n" % (relay_num, on_off)) - def do_fence_en_or_dis_able(self, value, want_result=mavutil.mavlink.MAV_RESULT_ACCEPTED): - if value: - p1 = 1 - else: - p1 = 0 - self.run_cmd( - mavutil.mavlink.MAV_CMD_DO_FENCE_ENABLE, - p1=p1, # param1 - want_result=want_result, - ) - def do_fence_enable(self, want_result=mavutil.mavlink.MAV_RESULT_ACCEPTED): - self.do_fence_en_or_dis_able(True, want_result=want_result) + self.run_cmd(mavutil.mavlink.MAV_CMD_DO_FENCE_ENABLE, p1=1, want_result=want_result) def do_fence_disable(self, want_result=mavutil.mavlink.MAV_RESULT_ACCEPTED): - self.do_fence_en_or_dis_able(False, want_result=want_result) + self.run_cmd(mavutil.mavlink.MAV_CMD_DO_FENCE_ENABLE, p1=0, want_result=want_result) + + def do_fence_disable_floor(self, want_result=mavutil.mavlink.MAV_RESULT_ACCEPTED): + self.run_cmd(mavutil.mavlink.MAV_CMD_DO_FENCE_ENABLE, p1=0, p2=8, want_result=want_result) + + def do_fence_enable_except_floor(self, want_result=mavutil.mavlink.MAV_RESULT_ACCEPTED): + self.run_cmd(mavutil.mavlink.MAV_CMD_DO_FENCE_ENABLE, p1=1, p2=7, want_result=want_result) ################################################# # WAIT UTILITIES @@ -7428,6 +7765,23 @@ class TestSuite(ABC): **kwargs ) + def wait_distance_between(self, series1, series2, min_distance, max_distance, timeout=30, **kwargs): + """Wait for distance between two position series to be between two thresholds.""" + def get_distance(): + self.drain_mav() + m1 = self.mav.messages[series1] + m2 = self.mav.messages[series2] + return self.get_distance_int(m1, m2) + + self.wait_and_maintain_range( + value_name=f"Distance({series1}, {series2})", + minimum=min_distance, + maximum=max_distance, + current_value_getter=lambda: get_distance(), + timeout=timeout, + **kwargs + ) + def wait_distance(self, distance, accuracy=2, timeout=30, **kwargs): """Wait for flight of a given distance.""" start = self.mav.location() @@ -7673,9 +8027,9 @@ class TestSuite(ABC): raise NotAchievedException("Expected %s to be %u got %u" % (channel, value, m_value)) - def do_reposition(self, - loc, - frame=mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT): + def send_do_reposition(self, + loc, + frame=mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT): '''send a DO_REPOSITION command for a location''' self.run_cmd_int( mavutil.mavlink.MAV_CMD_DO_REPOSITION, @@ -7731,7 +8085,8 @@ class TestSuite(ABC): wpnum_end, allow_skip=True, max_dist=2, - timeout=400): + timeout=400, + ignore_RTL_mode_change=False): """Wait for waypoint ranges.""" tstart = self.get_sim_time() # this message arrives after we set the current WP @@ -7754,8 +8109,11 @@ class TestSuite(ABC): m = self.assert_receive_message('VFR_HUD') # if we changed mode, fail - if self.mav.flightmode != mode: - raise WaitWaypointTimeout('Exited %s mode' % mode) + if not self.mode_is('AUTO'): + self.progress(f"{self.mav.flightmode} vs {self.get_mode_from_mode_mapping(mode)}") + if not ignore_RTL_mode_change or not self.mode_is('RTL', cached=True): + new_mode_str = self.get_mode_string_for_mode(self.get_mode()) + raise WaitWaypointTimeout(f'Exited {mode} mode to {new_mode_str} ignore={ignore_RTL_mode_change}') if self.get_sim_time_cached() - last_wp_msg > 1: self.progress("WP %u (wp_dist=%u Alt=%.02f), current_wp: %u," @@ -7786,9 +8144,9 @@ class TestSuite(ABC): '''returns the most-recently received instance of message_type''' return self.mav.messages[message_type] - def mode_is(self, mode, cached=False, drain_mav=True): + def mode_is(self, mode, cached=False, drain_mav=True, drain_mav_quietly=True): if not cached: - self.wait_heartbeat(drain_mav=drain_mav) + self.wait_heartbeat(drain_mav=drain_mav, quiet=drain_mav_quietly) try: return self.get_mode_from_mode_mapping(self.mav.flightmode) == self.get_mode_from_mode_mapping(mode) except Exception: @@ -7813,6 +8171,12 @@ class TestSuite(ABC): if not self.mode_is(mode): raise NotAchievedException("Expected mode %s" % str(mode)) + def get_mode(self, cached=False, drain_mav=True): + '''return numeric custom mode''' + if not cached: + self.wait_heartbeat(drain_mav=drain_mav) + return self.mav.messages['HEARTBEAT'].custom_mode + def wait_gps_sys_status_not_present_or_enabled_and_healthy(self, timeout=30): self.progress("Waiting for GPS health") tstart = self.get_sim_time() @@ -8209,6 +8573,20 @@ Also, ignores heartbeats not from our target system''' self.progress("Copying (%s) to (%s)" % (source, dest)) shutil.copy(source, dest) + def installed_script_module_path(self, modulename): + return os.path.join("scripts", "modules", os.path.basename(modulename)) + + def install_script_module(self, source, modulename, install_name=None): + if install_name is not None: + dest = self.installed_script_module_path(install_name) + else: + dest = self.installed_script_module_path(modulename) + + destdir = os.path.dirname(dest) + os.makedirs(destdir, exist_ok=True) + self.progress("Copying (%s) to (%s)" % (source, dest)) + shutil.copy(source, dest) + def install_test_modules(self): source = os.path.join(self.rootdir(), "libraries", "AP_Scripting", "tests", "modules", "test") dest = os.path.join("scripts", "modules", "test") @@ -8243,6 +8621,10 @@ Also, ignores heartbeats not from our target system''' except OSError: pass + def remove_installed_script_module(self, modulename): + path = self.installed_script_module_path(modulename) + os.unlink(path) + def remove_installed_modules(self, modulename): dest = os.path.join("scripts", "modules", modulename) try: @@ -8437,7 +8819,7 @@ Also, ignores heartbeats not from our target system''' tee = TeeBoth(test_output_filename, 'w', self.mavproxy_logfile, suppress_stdout=suppress_stdout) - start_message_hooks = copy.copy(self.mav.message_hooks) + start_message_hooks = copy.copy(self.message_hooks) prettyname = "%s (%s)" % (name, desc) self.start_test(prettyname) @@ -8471,9 +8853,9 @@ Also, ignores heartbeats not from our target system''' ex = e # reset the message hooks; we've failed-via-exception and # can't expect the hooks to have been cleaned up - for h in copy.copy(self.mav.message_hooks): + for h in copy.copy(self.message_hooks): if h not in start_message_hooks: - self.mav.message_hooks.remove(h) + self.message_hooks.remove(h) hooks_removed = True self.test_timings[desc] = time.time() - start_time reset_needed = self.contexts[-1].sitl_commandline_customised @@ -8513,6 +8895,7 @@ Also, ignores heartbeats not from our target system''' if ex is None: ex = ArmedAtEndOfTestException("Still armed at end of test") self.progress("Armed at end of test; force-rebooting SITL") + self.set_rc_default() # otherwise we might start calibrating ESCs... try: self.disarm_vehicle(force=True) except AutoTestTimeoutException: @@ -8524,7 +8907,7 @@ Also, ignores heartbeats not from our target system''' else: self.progress("Force-rebooting SITL") self.zero_throttle() - self.reboot_sitl() # that'll learn it + self.reboot_sitl(startup_location_dist_max=1000000) # that'll learn it passed = False elif ardupilot_alive and not passed: # implicit reboot after a failed test: self.progress("Test failed but ArduPilot process alive; rebooting") @@ -8560,9 +8943,9 @@ Also, ignores heartbeats not from our target system''' self.progress("Done popping extra contexts") # make sure we don't leave around stray listeners: - if len(self.mav.message_hooks) != len(start_message_hooks): + if len(self.message_hooks) != len(start_message_hooks): self.progress("Stray message listeners: %s vs start %s" % - (str(self.mav.message_hooks), str(start_message_hooks))) + (str(self.message_hooks), str(start_message_hooks))) passed = False if passed: @@ -8845,7 +9228,7 @@ Also, ignores heartbeats not from our target system''' raise NotAchievedException("received request for item from wrong mission type") if items[m.seq].mission_type != mission_type: - raise NotAchievedException("supplied item not of correct mission type") + raise NotAchievedException(f"supplied item not of correct mission type (want={mission_type} got={items[m.seq].mission_type}") # noqa:501 if items[m.seq].target_system != target_system: raise NotAchievedException("supplied item not of correct target system") if items[m.seq].target_component != target_component: @@ -9820,13 +10203,13 @@ Also, ignores heartbeats not from our target system''' self.arm_vehicle() tstart = self.get_sim_time() last_status = 0 + mavproxy.send('repeat add 1 dataflash_logger status\n') while True: now = self.get_sim_time() if now - tstart > 60: break if now - last_status > 5: last_status = now - mavproxy.send('dataflash_logger status\n') # seen on autotest: Active Rate(3s):97.790kB/s Block:164 Missing:0 Fixed:0 Abandoned:0 mavproxy.expect(r"Active Rate\([0-9]+s\):([0-9]+[.][0-9]+)") rate = float(mavproxy.match.group(1)) @@ -9837,11 +10220,11 @@ Also, ignores heartbeats not from our target system''' if rate < desired_rate: raise NotAchievedException("Exceptionally low transfer rate (%u < %u)" % (rate, desired_rate)) self.disarm_vehicle() + mavproxy.send('repeat remove 0\n') except Exception as e: self.print_exception_caught(e) self.disarm_vehicle() ex = e - self.context_pop() self.mavproxy_unload_module(mavproxy, 'dataflash_logger') # the following things won't work - but they shouldn't die either: @@ -9861,6 +10244,8 @@ Also, ignores heartbeats not from our target system''' self.mavproxy_unload_module(mavproxy, 'log') + self.context_pop() + self.stop_mavproxy(mavproxy) self.reboot_sitl() if ex is not None: @@ -10603,13 +10988,17 @@ Also, ignores heartbeats not from our target system''' mav=mav, ) - def poll_message(self, message_id, timeout=10, quiet=False, mav=None): + def poll_message(self, message_id, timeout=10, quiet=False, mav=None, target_sysid=None, target_compid=None): if mav is None: mav = self.mav + if target_sysid is None: + target_sysid = self.sysid_thismav() + if target_compid is None: + target_compid = 1 if isinstance(message_id, str): message_id = eval("mavutil.mavlink.MAVLINK_MSG_ID_%s" % message_id) tstart = self.get_sim_time() # required for timeout in run_cmd_get_ack to work - self.send_poll_message(message_id, quiet=quiet, mav=mav) + self.send_poll_message(message_id, quiet=quiet, mav=mav, target_sysid=target_sysid, target_compid=target_compid) self.run_cmd_get_ack( mavutil.mavlink.MAV_CMD_REQUEST_MESSAGE, mavutil.mavlink.MAV_RESULT_ACCEPTED, @@ -10628,6 +11017,9 @@ Also, ignores heartbeats not from our target system''' continue if m.id != message_id: continue + if (m.get_srcSystem() != target_sysid or + m.get_srcComponent() != target_compid): + continue return m def get_messages_frame(self, msg_names): @@ -11643,26 +12035,19 @@ Also, ignores heartbeats not from our target system''' '''return mode vehicle should start in with default RC inputs set''' return None - def upload_fences_from_locations(self, - vertex_type, - list_of_list_of_locs, - target_system=1, - target_component=1): + def upload_fences_from_locations(self, fences, target_system=1, target_component=1): seq = 0 items = [] - for locs in list_of_list_of_locs: + + for (vertex_type, locs) in fences: if isinstance(locs, dict): # circular fence - if vertex_type == mavutil.mavlink.MAV_CMD_NAV_FENCE_POLYGON_VERTEX_EXCLUSION: - v = mavutil.mavlink.MAV_CMD_NAV_FENCE_CIRCLE_EXCLUSION - else: - v = mavutil.mavlink.MAV_CMD_NAV_FENCE_CIRCLE_INCLUSION item = self.mav.mav.mission_item_int_encode( target_system, target_component, seq, # seq mavutil.mavlink.MAV_FRAME_GLOBAL, - v, + vertex_type, 0, # current 0, # autocontinue locs["radius"], # p1 @@ -13680,6 +14065,17 @@ switch value''' # heading seemingly indefinitely. self.reboot_sitl() + def run_replay(self, filepath): + '''runs replay in filepath, returns filepath to Replay logfile''' + util.run_cmd( + ['build/sitl/tool/Replay', filepath], + directory=util.topdir(), + checkfail=True, + show=True, + output=True, + ) + return self.current_onboard_log_filepath() + def AHRS_ORIENTATION(self): '''test AHRS_ORIENTATION parameter works''' self.context_push() @@ -14084,6 +14480,115 @@ SERIAL5_BAUD 128 self._MotorTest(self.run_cmd, **kwargs) self._MotorTest(self.run_cmd_int, **kwargs) + def test_ibus_voltage(self, message): + batt = self.mav.recv_match( + type='BATTERY_STATUS', + blocking=True, + timeout=5, + condition="BATTERY_STATUS.id==0" + ) + if batt is None: + raise NotAchievedException("Did not get BATTERY_STATUS message") + want = int(batt.voltages[0] * 0.1) + + if want != message.get_sensor_value(): + raise NotAchievedException("Bad voltage (want=%u got=%u)" % + (want, message.get_sensor_value())) + self.progress("iBus voltage OK") + + def test_ibus_armed(self, message): + got = message.get_sensor_value() + want = 1 if self.armed() else 0 + if got != want: + raise NotAchievedException("Expected armed %u got %u" % + (want, got)) + self.progress("iBus armed OK") + + def test_ibus_mode(self, message): + got = message.get_sensor_value() + want = self.mav.messages['HEARTBEAT'].custom_mode + if got != want: + raise NotAchievedException("Expected mode %u got %u" % + (want, got)) + self.progress("iBus mode OK") + + def test_ibus_get_response(self, ibus, timeout=5): + tstart = self.get_sim_time() + while True: + now = self.get_sim_time() + if now - tstart > timeout: + raise AutoTestTimeoutException("Failed to get ibus data") + packet = ibus.update() + if packet is not None: + return packet + + def IBus(self): + '''test the IBus protocol''' + self.set_parameter("SERIAL5_PROTOCOL", 49) + self.customise_SITL_commandline([ + "--serial5=tcp:6735" # serial5 spews to localhost:6735 + ]) + ibus = IBus(("127.0.0.1", 6735)) + ibus.connect() + + # expected_sensors should match the list created in AP_IBus_Telem + expected_sensors = { + # sensor id : (len, IBUS_MEAS_TYPE_*, test_function) + 1: (2, 0x15, self.test_ibus_armed), + 2: (2, 0x16, self.test_ibus_mode), + 5: (2, 0x03, self.test_ibus_voltage), + } + + for (sensor_addr, results) in expected_sensors.items(): + # first make sure it is present: + request = IBusRequest_DISCOVER(sensor_addr) + ibus.port.sendall(request.for_wire()) + + packet = self.test_ibus_get_response(ibus) + if packet.address != sensor_addr: + raise ValueError("Unexpected sensor address %u" % + (packet.address,)) + + (expected_length, expected_type, validator) = results + + self.progress("Getting sensor (%x) type" % (sensor_addr)) + request = IBusRequest_GET_SENSOR_TYPE(sensor_addr) + ibus.port.sendall(request.for_wire()) + + packet = self.test_ibus_get_response(ibus) + if packet.address != sensor_addr: + raise ValueError("Unexpected sensor address %u" % + (packet.address,)) + + if packet.sensor_type != expected_type: + raise ValueError("Unexpected sensor type want=%u got=%u" % + (expected_type, packet.sensor_type)) + + if packet.sensor_length != expected_length: + raise ValueError("Unexpected sensor len want=%u got=%u" % + (expected_length, packet.sensor_length)) + + self.progress("Getting sensor (%x) value" % (sensor_addr)) + request = IBusRequest_GET_SENSOR_VALUE(sensor_addr) + ibus.port.sendall(request.for_wire()) + + packet = self.test_ibus_get_response(ibus) + validator(packet) + + # self.progress("Ensure we cover all sensors") + # for i in range(1, 17): # zero is special + # if i in expected_sensors: + # continue + # request = IBusRequest_DISCOVER(i) + # ibus.port.sendall(request.for_wire()) + + # try: + # packet = self.test_ibus_get_response(ibus, timeout=1) + # except AutoTestTimeoutException: + # continue + # self.progress("Received packet (%s)" % str(packet)) + # raise NotAchievedException("IBus sensor %u is untested" % i) + def tests(self): return [ self.PIDTuning, @@ -14313,7 +14818,12 @@ SERIAL5_BAUD 128 def load_default_params_file(self, filename): '''load a file from Tools/autotest/default_params''' filepath = util.reltopdir(os.path.join("Tools", "autotest", "default_params", filename)) - self.repeatedly_apply_parameter_file(filepath) + self.repeatedly_apply_parameter_filepath(filepath) + + def load_params_file(self, filename): + '''load a file from test-specific directory''' + filepath = os.path.join(testdir, self.current_test_name_directory, filename) + self.repeatedly_apply_parameter_filepath(filepath) def send_pause_command(self): '''pause AUTO/GUIDED modes''' diff --git a/Tools/bootloaders/BlitzF745AIO_bl.bin b/Tools/bootloaders/BlitzF745AIO_bl.bin old mode 100644 new mode 100755 index 84eccde48a..842cdd9c19 Binary files a/Tools/bootloaders/BlitzF745AIO_bl.bin and b/Tools/bootloaders/BlitzF745AIO_bl.bin differ diff --git a/Tools/bootloaders/BlitzF745AIO_bl.hex b/Tools/bootloaders/BlitzF745AIO_bl.hex index 6b6cd147a5..ec6fc76d5c 100644 --- a/Tools/bootloaders/BlitzF745AIO_bl.hex +++ b/Tools/bootloaders/BlitzF745AIO_bl.hex @@ -898,20 +898,20 @@ :103800009916000840004000F02D0120F02D012005 :1038100001000000002E0120800000004001000097 :10382000050000006D61696E0069646C6500000050 -:103830009955A56A00000000AAAAAAAA66A91A6456 -:103840001AFC00008070000000A70A00555595552D -:1038500000000000AAAAAAAAAAAA6AAA0008000050 -:103860000000000000700000555555550000000094 -:10387000AAAAAAAAAAAAAAAA0000000000000000F8 -:10388000000000005555555500000000AAAAAAAA3C -:10389000AAAAAA2A00000000000000000000000000 -:1038A0005595555500000000AAAAAAAAAA69AAAA75 -:1038B00090000000000000800000000055555555A4 -:1038C00000000000AAAAAAAAAAAAAAAA00000000A8 -:1038D0000000000000000000555555550000000094 -:1038E000AAAAAAAAAAAAAAAA000000000000000088 -:1038F0000000000005000000000000000A000000B9 -:103900000A000000000000000000000000000000AD +:103830008801A06A00000000AAAAAAAA4401106494 +:10384000FFFF00008070000000A70A000000800059 +:1038500000000000AAAAAAAA00004000FFFF000082 +:1038600000000000007000000000000000000000E8 +:10387000AAAAAAAA00000000FFFF000000000000A2 +:10388000000000000000004000000000AAAAAAAA50 +:1038900000000000FF7F00000000000000000000AA +:1038A0000081000000000000AAAAAAAA00410000AE +:1038B000FFFF00000000008000000000000000008A +:1038C00000000000AAAAAAAA00000000FFFF000052 +:1038D00000000000000000000000000000000000E8 +:1038E000AAAAAAAA00000000FFFF00000000000032 +:1038F0000000000000000000000000000A000000BE +:1039000000000000030000000000000000000000B4 :1039100000000000000000000000000000000000A7 :103920000000000000000000000000000000000097 :103930000000000000000000000000000000000087 diff --git a/Tools/bootloaders/BotBloxSwitch_bl.bin b/Tools/bootloaders/BotBloxSwitch_bl.bin index 77f7357d05..f183d8d66d 100755 Binary files a/Tools/bootloaders/BotBloxSwitch_bl.bin and b/Tools/bootloaders/BotBloxSwitch_bl.bin differ diff --git a/Tools/bootloaders/CUAV-7-Nano_bl.bin b/Tools/bootloaders/CUAV-7-Nano_bl.bin new file mode 100644 index 0000000000..60b99e1b3d Binary files /dev/null and b/Tools/bootloaders/CUAV-7-Nano_bl.bin differ diff --git a/Tools/bootloaders/CUAV-7-Nano_bl.hex b/Tools/bootloaders/CUAV-7-Nano_bl.hex new file mode 100644 index 0000000000..863c1db590 --- /dev/null +++ b/Tools/bootloaders/CUAV-7-Nano_bl.hex @@ -0,0 +1,2517 @@ +:020000040800F2 +:1000000000060020E1020008E3020008E302000805 +:10001000E3020008E3020008E3020008E30200082C +:10002000E3020008E3020008E30200080D7700087D +:10003000E3020008E3020008E3020008E30200080C +:10004000E3020008E3020008E3020008E3020008FC +:10005000E3020008E302000819860008458600084C +:10006000718600089D860008C986000819460008A8 +:10007000414600086D46000899460008C54600083C +:10008000ED46000819470008E3020008E3020008F3 +:10009000E3020008E3020008E3020008F586000816 +:1000A000E3020008E3020008E3020008E30200089C +:1000B000E3020008E3020008E3020008E30200088C +:1000C000E3020008E3020008E3020008E30200087C +:1000D000E3020008E3020008E3020008E1870008E9 +:1000E00059870008E3020008E3020008E302000861 +:1000F000E3020008E3020008E302000845470008A5 +:10010000E3020008E30200081D880008E30200087B +:10011000E3020008F5870008E3020008E302000894 +:100120007147000899470008C5470008F1470008D3 +:100130001D480008E3020008E3020008E30200088B +:10014000E3020008E3020008E3020008E3020008FB +:1001500045480008714800089D480008E30200086F +:10016000E3020008E3020008E3020008E3020008DB +:10017000E3020008F9820008E3020008E302000835 +:10018000E3020008E302000809880008E30200080F +:10019000E3020008E3020008E3020008E3020008AB +:1001A000E3020008E3020008E3020008E30200089B +:1001B000E3020008E3020008E3020008E30200088B +:1001C000E3020008E3020008E3020008E30200087B +:1001D000E3020008E5820008E3020008E3020008E9 +:1001E000E3020008E3020008E3020008E30200085B +:1001F000E3020008E3020008E3020008E30200084B +:10020000E3020008E3020008E3020008E30200083A +:10021000E3020008E3020008E3020008E30200082A +:10022000E3020008E3020008E3020008E30200081A +:10023000CD870008E3020008E3020008E30200089B +:10024000E3020008E3020008E3020008E3020008FA +:10025000E3020008E3020008E3020008E3020008EA +:10026000E3020008E3020008E3020008E3020008DA +:10027000E3020008E3020008E3020008E3020008CA +:10028000E3020008E3020008E3020008E3020008BA +:10029000E3020008E3020008E3020008E3020008AA +:1002A000E3020008E3020008E3020008E30200089A +:1002B000E3020008E3020008E3020008E30200088A +:1002C000E3020008E3020008E3020008E30200087A +:1002D000E3020008E3020008E3020008E30200086A +:1002E00002E000F000F8FEE772B6374880F30888B5 +:1002F000364880F3098836483649086040F20000E5 +:10030000CCF200004EF63471CEF200010860BFF36B +:100310004F8FBFF36F8F40F20000C0F2F0004EF637 +:100320008851CEF200010860BFF34F8FBFF36F8F8B +:100330004FF00000E1EE100A4EF63C71CEF20001E3 +:100340000860062080F31488BFF36F8F07F040FA2F +:1003500006F0ACFB4FF055301F491B4A91423CBFA1 +:1003600041F8040BFAE71D49184A91423CBF41F895 +:10037000040BFAE71A491B4A1B4B9A423EBF51F83D +:10038000040B42F8040BF8E700201849184A914280 +:100390003CBF41F8040BFAE707F058FA06F00AFCF4 +:1003A000144C154DAC4203DA54F8041B8847F9E7A6 +:1003B00000F0C4F9114C124DAC4203DA54F8041B9E +:1003C0008847F9E707F040BA000600200022002025 +:1003D0000000000808ED00E00000002000060020FA +:1003E000B89C0008002200207422002078220020FF +:1003F00034670020E0020008E0020008E002000884 +:10040000E00200082DE9F04F2DED108AC1F80CD064 +:10041000D0F80CD0BDEC108ABDE8F08F002383F338 +:1004200011882846A047002006F022F9FEE706F0D2 +:100430007BF800DFFEE7000053B94AB9002908BF86 +:1004400000281CBF4FF0FF314FF0FF3000F074B9AF +:10045000ADF1080C6DE904CE00F006F8DDF804E01B +:10046000DDE9022304B070472DE9F047089D0446FA +:100470008E46002B4DD18A42944669D9B2FA82F257 +:1004800052B101FA02F3C2F1200120FA01F10CFA93 +:1004900002FC41EA030E94404FEA1C48210CBEFBCB +:1004A000F8F61FFA8CF708FB16E341EA034306FB54 +:1004B00007F199420AD91CEB030306F1FF3080F0E3 +:1004C0001F81994240F21C81023E63445B1AA4B230 +:1004D000B3FBF8F008FB103344EA034400FB07F7D2 +:1004E000A7420AD91CEB040400F1FF3380F00A8113 +:1004F000A74240F207816444023840EA0640E41B08 +:1005000000261DB1D4400023C5E900433146BDE8B3 +:10051000F0878B4209D9002D00F0EF800026C5E955 +:10052000000130463146BDE8F087B3FA83F6002E6D +:100530004AD18B4202D3824200F2F980841A61EBE5 +:10054000030301209E46002DE0D0C5E9004EDDE703 +:1005500002B9FFDEB2FA82F2002A40F09280A1EBEB +:100560000C014FEA1C471FFA8CFE0126200CB1FB40 +:10057000F7F307FB131140EA01410EFB03F0884239 +:1005800008D91CEB010103F1FF3802D2884200F2C6 +:10059000CB804346091AA4B2B1FBF7F007FB101158 +:1005A00044EA01440EFB00FEA64508D91CEB0404F6 +:1005B00000F1FF3102D2A64500F2BB800846A4EB51 +:1005C0000E0440EA03409CE7C6F12007B34022FA3C +:1005D00007FC4CEA030C20FA07F401FA06F31C436B +:1005E000F9404FEA1C4900FA06F3B1FBF9F8200C78 +:1005F0001FFA8CFE09FB181140EA014108FB0EF0BE +:10060000884202FA06F20BD91CEB010108F1FF3A0D +:1006100080F08880884240F28580A8F10208614419 +:10062000091AA4B2B1FBF9F009FB101144EA014127 +:1006300000FB0EFE8E4508D91CEB010100F1FF34D2 +:100640006CD28E456AD90238614440EA0840A0FB6A +:100650000294A1EB0E01A142C846A64656D353D040 +:100660005DB1B3EB080261EB0E0101FA07F722FA64 +:1006700006F3F1401F43C5E9007100263146BDE88D +:10068000F087C2F12003D8400CFA02FC21FA03F3F0 +:10069000914001434FEA1C471FFA8CFEB3FBF7F071 +:1006A00007FB10360B0C43EA064300FB0EF69E4296 +:1006B00004FA02F408D91CEB030300F1FF382FD22F +:1006C0009E422DD9023863449B1B89B2B3FBF7F6D7 +:1006D00007FB163341EA034106FB0EF38B4208D9B0 +:1006E0001CEB010106F1FF3816D28B4214D9023EF1 +:1006F0006144C91A46EA004638E72E46284605E70F +:100700000646E3E61846F8E64B45A9D2B9EB0208DF +:1007100064EB0C0E0138A3E74646EAE7204694E76F +:100720004046D1E7D0467BE7023B614432E73046A2 +:1007300009E76444023842E7704700BF38B501F06A +:10074000FFF901F0C1FB06F0CBFE054606F0D4FF31 +:100750000446D0B90F4B9D4219D001339D4241F25E +:10076000883504BF01240025002006F0C3FE0CB12B +:1007700000F078F801F048FB00F026FD08B100F029 +:1007800071F8284600F01CF9F9E70025ECE705466A +:10079000EAE700BF010007B008B501F09DF9A0F13C +:1007A00020035842584108BD07B541F21203022107 +:1007B00001A8ADF8043001F0ADF903B05DF804FB19 +:1007C00038B5302383F31188174803680BB106F05E +:1007D00033F80023154A4FF47A71134806F022F8D3 +:1007E000002383F31188124C236813B12368013B63 +:1007F0002360636813B16368013B63600D4D2B7820 +:1008000033B963687BB9022001F060FA3223636078 +:100810002B78032B07D163682BB9022001F056FA1D +:100820004FF47A73636038BD78220020C107000856 +:100830009823002090220020084B187003280CD821 +:10084000DFE800F008050208022001F031BA0220BA +:1008500001F01EBA024B00225A607047902200201D +:1008600098230020F8B5504B504A1C4619680131B6 +:1008700000F0998004339342F8D162684C4B9A425D +:1008800040F291804B4B9B6803F1006303F500330A +:100890009A4280F08880002001F06CF90220FFF776 +:1008A000CBFF454B0021D3F8E820C3F8E810D3F87C +:1008B0001021C3F81011D3F81021D3F8EC20C3F89D +:1008C000EC10D3F81421C3F81411D3F81421D3F881 +:1008D000F020C3F8F010D3F81821C3F81811D3F89A +:1008E0001821D3F8802042F00062C3F88020D3F8AA +:1008F000802022F00062C3F88020D3F88020D3F853 +:10090000802042F00072C3F88020D3F8802022F0CB +:100910000072C3F88020D3F8803072B64FF0E02325 +:10092000C3F8084DD4E90004BFF34F8FBFF36F8FB6 +:10093000224AC2F88410BFF34F8F536923F48033E7 +:100940005361BFF34F8FD2F8803043F6E076C3F3A4 +:10095000C905C3F34E335B0103EA060C29464CEA92 +:1009600081770139C2F87472F9D2203B13F1200F5C +:10097000F2D1BFF34F8FBFF36F8FBFF34F8FBFF332 +:100980006F8F536923F4003353610023C2F8503250 +:10099000BFF34F8FBFF36F8F302383F311888546EA +:1009A00080F308882047F8BD0000020820000208F4 +:1009B000FFFF0108002200200044025800ED00E083 +:1009C0002DE9F04F93B0B44B2022FF2100900AA8EC +:1009D0009D6801F0C3F9B14A1378A3B90121B04869 +:1009E00011700360302383F3118803680BB105F0A5 +:1009F00023FF0023AB4A4FF47A71A94805F012FF98 +:100A0000002383F31188009B13B1A74B009A1A604F +:100A1000A64A1378032B03D000231370A24A536015 +:100A20004FF0000A009CD3465646D146012001F003 +:100A30003FF924B19C4B1B68002B00F0268200205C +:100A400001F04AF80390039B002BF2DB012001F038 +:100A50001FF9039B213B1F2BE8D801A252F823F07A +:100A6000E10A0008090B00089D0B00082D0A000888 +:100A70002D0A00082D0A00082F0C0008FF0D0008A1 +:100A8000190D00087B0D0008A30D0008C90D000812 +:100A90002D0A0008DB0D00082D0A00084D0E000885 +:100AA000810B00082D0A0008910E0008ED0A0008CD +:100AB000810B00082D0A00087B0D00082D0A000894 +:100AC0002D0A00082D0A00082D0A00082D0A00082A +:100AD0002D0A00082D0A00082D0A00089D0B0008A9 +:100AE0000220FFF759FE002840F0F981009B022107 +:100AF00005A8BAF1000F08BF1C4641F21233ADF849 +:100B0000143001F007F891E74FF47A7000F0E4FF39 +:100B1000071EEBDB0220FFF73FFE0028E6D0013F77 +:100B2000052F00F2DE81DFE807F0030A0D1013360F +:100B30000523042105A8059300F0ECFF17E004212C +:100B40005548F9E704215A48F6E704215948F3E7E4 +:100B50004FF01C08404608F1040801F00DF804218C +:100B6000059005A800F0D6FFB8F12C0FF2D10120B6 +:100B70004FF0000900FA07F747EA0B0B5FFA8BFB0F +:100B800001F038F926B10BF00B030B2B08BF002442 +:100B9000FFF70AFE4AE704214748CDE7002EA5D01B +:100BA0000BF00B030B2BA1D10220FFF7F5FD07463D +:100BB00000289BD00120002600F0DCFF0220FFF778 +:100BC0003BFE1FFA86F8404600F0E4FF0446B0B151 +:100BD000039940460136A1F140025142514100F0D3 +:100BE000E9FF0028EDD1BA46044641F21213022172 +:100BF00005A83E46ADF8143000F08CFF16E72546F8 +:100C00000120FFF719FE244B9B68AB4207D9284609 +:100C100000F0B2FF013040F067810435F3E70025B2 +:100C2000224BBA463E461D701F4B5D60A8E7002E62 +:100C30003FF45CAF0BF00B030B2B7FF457AF02209C +:100C4000FFF7FAFD322000F047FFB0F10008FFF691 +:100C50004DAF18F003077FF449AF0F4A08EB0503C7 +:100C6000926893423FF642AFB8F5807F3FF73EAFC0 +:100C7000124BB845019323DD4FF47A7000F02CFF3E +:100C80000390039A002AFFF631AF039A0137019BC4 +:100C900003F8012BEDE700BF002200209423002081 +:100CA00078220020C107000898230020902200200D +:100CB00004220020082200200C2200209422002080 +:100CC000C820FFF769FD074600283FF40FAF1F2D2E +:100CD00011D8C5F120020AAB25F003008449424532 +:100CE000184428BF4246019201F012F8019AFF21F0 +:100CF0007F4801F033F84FEAA803C8F387027C4924 +:100D00002846019301F032F8064600283FF46DAF03 +:100D1000019B05EB830533E70220FFF73DFD00282B +:100D20003FF4E4AE00F064FF00283FF4DFAE00279C +:100D3000B846704B9B68BB4218D91F2F11D80A9B2D +:100D400001330ED027F0030312AA134453F8203CBA +:100D500005934046042205A9043701F00BF98046AB +:100D6000E7E7384600F008FF0590F2E7CDF8148079 +:100D7000042105A800F0CEFE02E70023642104A8A8 +:100D8000049300F0BDFE00287FF4B0AE0220FFF710 +:100D900003FD00283FF4AAAE049800F01FFF059061 +:100DA000E6E70023642104A8049300F0A9FE0028CC +:100DB0007FF49CAE0220FFF7EFFC00283FF496AED4 +:100DC000049800F00DFFEAE70220FFF7E5FC002899 +:100DD0003FF48CAE00F01CFFE1E70220FFF7DCFCE3 +:100DE00000283FF483AE05A9142000F017FF074642 +:100DF0000421049004A800F08DFE3946B9E73220A2 +:100E000000F06AFE071EFFF671AEBB077FF46EAE00 +:100E1000384A07EB0903926893423FF667AE022017 +:100E2000FFF7BAFC00283FF461AE27F003074F44F8 +:100E3000B9453FF4A5AE484609F1040900F09CFE0F +:100E40000421059005A800F065FEF1E74FF47A70E3 +:100E5000FFF7A2FC00283FF449AE00F0C9FE0028CD +:100E600044D00A9B01330BD008220AA9002000F0CD +:100E70007DFF00283AD02022FF210AA800F06EFF53 +:100E8000FFF792FC1C4805F0F9FB13B0BDE8F08FAA +:100E9000002E3FF42BAE0BF00B030B2B7FF426AE92 +:100EA0000023642105A8059300F02AFE07460028C8 +:100EB0007FF41CAE0220FFF76FFC804600283FF451 +:100EC00015AEFFF771FC41F2883005F0D7FB0598AD +:100ED00000F0D8FF46463C4600F08CFFA6E50646EB +:100EE0004EE64FF0000901E6BA467EE637467CE65C +:100EF0009422002000220020A086010070470000FC +:100F000070470000704700002DE9F04100F5803780 +:100F1000044616463B7C5BB9C0681030204400F0A4 +:100F2000F7FEE5683544B5F5004FE56002D816B127 +:100F3000BDE8F081DEB905F07F0605F11000002163 +:100F4000C6F180062044F6B232462E4400F006FF79 +:100F5000A06804F11008324600F10060414600F537 +:100F6000003006F069F830B901233B74E0E74FF434 +:100F700000463546ECE7A26805F1100140463244D0 +:100F80002144A260E268521BE26000F0C1FE022030 +:100F9000BDE8F04100F09ABE183000F0E9BC000056 +:100FA00010B5044601F002F8204610BD10B5044605 +:100FB00000F0FCFF204610BDC3B280B2A3F1410295 +:100FC000052A02D8373800B27047613B052B94BF21 +:100FD00057383038F7E70000F8B50446154608469C +:100FE00003220C4900F09EFE014688B908346F1CAC +:100FF00015F91100FFF7E0FF064617F9110001315E +:10100000FFF7DAFF102940EA061004F8010BEFD1D0 +:10101000F8BD00BF709200082DE9F04FADF53F7D9F +:101020000746416801222AA802F0A2FE002840F0EB +:1010300087800646824681461125DFF80C81DFF85D +:101040000CB101AB4FF4805241462AA802F0F0FFE8 +:10105000002875D1019AB2F5805F71D8002A65D059 +:101060000446019A9442ECD2282D0FD008DC132DAF +:101070002DD01E2D39D0112D13D00134A4B2F0E79C +:10108000322D2DD0372D2FD02D2DF6D13B68121BB0 +:1010900008EB040138461B692D259847BDF804402C +:1010A000EBE7121B022A09D9594608EB040000F0AD +:1010B00039FE18B902342825A4B2DEE718F8043046 +:1010C0003A2B3DD00A2B1CBFA1461325D5E718F8B3 +:1010D00004300A2B34D03A2B04BFA2463225CCE789 +:1010E00018F80430202BC8D0264618F804300A2BF4 +:1010F0001AD1AAEB090208EB090102A811254F2A0F +:1011000028BF4F2208F0A0F8A21B08EB060116A882 +:101110004F2A28BF4F2208F097F83B6816AA02A969 +:10112000DB6838469847A8E71E25A6E73B6838469F +:1011300004491B69984701200DF53F7DBDE8F08FFC +:101140000020F9E772930008A023002074920008A1 +:1011500000F1180110B5044686B00846019100F070 +:10116000F1FB2046FFF758FF60B1019902A800F09B +:1011700049FC102204F1080102A808F025F8B0FA91 +:1011800080F0400906B010BD70B504460025EEB2EF +:10119000304600F0FFFC58B100213046013500F028 +:1011A00009FD08B9002070BD022000F08FFDEEE7B8 +:1011B0002046FFF731FF0028F4D004F58034207C6E +:1011C00080F00100EFE70000F0B5C9B006F0A0F92B +:1011D00000F008FF18B90025284649B0F0BD69465F +:1011E0002A4802F0E7FF00284BD1294C204603F0A3 +:1011F00011F8284803F00EF8274803F00BF82146B1 +:10120000224803F083F80028E5D1702000F0C8FEE2 +:10121000064610B1214B44600360336830469B683A +:101220009847054600282ED01A4F1948394603F032 +:101230006DF805460028CED1194800F0B1FE0446ED +:1012400038B1184B4760036000F58033C0E90255A0 +:101250001D74236820469B689847054628B10E49AF +:101260000C4803F053F80028B5D1336830465B686A +:1012700098471CB1236820465B68984700F09AFEA7 +:10128000AAE70025FAE70446EFE700BF78920008D6 +:10129000889200089F920008B5920008D892000832 +:1012A00014000100F49200082DE9F04FD44A8DB0EB +:1012B0000B68D0F804A001931A440368D14E1A4475 +:1012C000D1F81C90DFF8B4C3DFF8B4B3D0E902342E +:1012D000634003EA0A03634013444A6802920AEB3C +:1012E0007363029CC84A2244C468224484688AEA20 +:1012F00004051D40654015448A68039203EB35558B +:10130000039CC24A2244846822448AEA03042C4093 +:1013100084EA0A041444CA6805EBF43404921644BF +:1013200083EA0502224056445A4032440E6905962B +:1013300004EBB222059FB64E3E441E4485EA0403E8 +:1013400013406B4033444E69069602EB7363069F6D +:10135000B04E3E442E4484EA02051D4065403544AB +:101360008E69079603EB3555079FAB4E3E442644E6 +:1013700082EA03042C4054403444A84E4E4405EB0A +:10138000F434164483EA050222405A4032440E6A7D +:10139000089604EBB222089FA14E3E441E4485EA03 +:1013A000040313406B4033444E6A099602EB7363A7 +:1013B000099F9C4ED1F830E03E44D1F83880F34488 +:1013C0002E4484EA02051D40654035448E6AA6F528 +:1013D000244703EB35550A964F3F274482EA03041E +:1013E0002C4054403C44CF6A0B9705EBF4340B9EE1 +:1013F0008D4F3744029E174483EA050222405A402B +:101400003A448A4F774404EBB2221F4485EA04032E +:1014100013406B403B444F6BBC4402EB7363654429 +:1014200084EA020C0CEA030C8CEA040C6544DFF835 +:1014300054C2C44403EB3555A44482EA03042C404F +:1014400054406444D1F83CC0794905EBF43461441C +:10145000114483EA050222405A400A44754904EBCC +:10146000B2223144079E194484EA02032B406340B0 +:101470000B44714902EBF36331440B9E0D4482EA45 +:1014800003012140514029446C4D03EBF151354497 +:10149000019E254483EA010414405C402C44684DBD +:1014A00001EBB4443544069E154481EA04021A4017 +:1014B0004A402A44634D04EB323235440A9E1D44AF +:1014C00084EA02030B4063402B445F4D02EBF3635D +:1014D0003544059E0D4482EA0301214051402944D0 +:1014E0005A4D03EBF1516544254483EA010414404D +:1014F0005C402C44564D01EBB4443544099E1544E0 +:1015000081EA04021A404A402A44524D04EB323226 +:101510003544049E1D4484EA02030B4063402B447F +:101520004D4D02EBF36345440D4482EA0301214033 +:1015300051402944494D03EBF1513544089E2C4458 +:1015400083EA010515405D402C44454D01EBB44450 +:101550003544039E2A4481EA04051D404D402A4437 +:10156000404D04EB32323D442B4484EA020593445F +:101570000D4065402B443C4D02EBF3633544069E21 +:10158000294482EA0305254055402944374D03EBA1 +:10159000F1514D442C4483EA010515405D4025443A +:1015A00001EBB54581EA050404EA03024A405A44C6 +:1015B000A6F5B82B089E05EB3232ABF2BE6B544059 +:1015C0005B4423442A4C344402EB33730B9E0C449B +:1015D00085EA020159402144264C344403EB715101 +:1015E000029E254482EA03044C402544224C444494 +:1015F00001EB3545144483EA01026A40224443E08A +:1016000078A46AD7EECEBDC156B7C7E8DB702024F8 +:10161000AF0F7CF52AC68747134630A8019546FDD3 +:10162000D8988069AFF7448BBED75C892211906B44 +:101630002108B44962251EF640B340C0515A5E26C7 +:10164000AAC7B6E95D102FD65314440281E6A1D88B +:10165000C8FBD3E7E6CDE121D60737C3870DD5F424 +:10166000ED145A4505E9E3A9F8A3EFFCD9026F6729 +:1016700081F6718722619D6D0C38E5FD937198FDAF +:101680008A4C2A8D8E4379A6934C344405EB722202 +:10169000059E1C4481EA0503534023448F4C344487 +:1016A00002EB33730A9E0C4485EA0201594021443F +:1016B0008B4C4C4403EB7151254482EA03044C40AB +:1016C0002C44884D354401EB3444019E154483EA93 +:1016D000010262402A44844D3D4404EB72221D44C1 +:1016E00081EA040353402B44804D354402EB3373AD +:1016F000049E294484EA02055D4029447C4D35441A +:1017000003EB7151079E254482EA03044C402C44AC +:10171000784D354401EB3444099E2A4483EA01059F +:1017200065401544744A324404EB7525039E134406 +:1017300081EA04026A401A44704B734405EB32722A +:101740000B4484EA0501514019446D4B634402EB9C +:1017500071511C4485EA02034B401C44694B3344DD +:1017600001EB3444019E1D4482EA010363402B4493 +:10177000654D04EB73233544069E154463EA01026C +:1017800062402A44614D03EBB2624D4462EA0409AF +:1017900029445F4D89EA0309454449442C445D4D81 +:1017A00002EBB1513544049E61EA03081D4488EA06 +:1017B0000208444401EB744464EA02034B402B44A6 +:1017C000554D04EBF323754463EA010E15448EEA8C +:1017D000040E0EEB0502514D03EBB262354462EA92 +:1017E000040E29440A9D8EEA030EA5F580164C4D81 +:1017F0007144A6F6833602EBB151264461EA030434 +:1018000054403444029E01EB7444354464EA0206B9 +:101810001D444E407319089E424D04EBF32335449A +:1018200063EA01061544664072193F4D03EBB2624C +:10183000654462EA040629443C4D5E403144079EFB +:1018400002EBB151354461EA03062C44384D564051 +:101850003D443444059E1D4401EB744464EA020394 +:101860004B402B44334D04EBF32335440B9E15447E +:1018700063EA010262402A442F4D03EBB262354411 +:10188000039E0D4462EA0401594029442B4D02EBAA +:10189000B15135442A4E254461EA030454402C4496 +:1018A000099D01EB74442E4464EA02051E4485EA56 +:1018B00001039D1903681A440AEB040303EBF523A3 +:1018C0000260436083681C44C36819448460C1603B +:1018D0000DB0BDE8F08F00BF44EABEA4A9CFDE4B37 +:1018E000604BBBF670BCBFBEC67E9B28FA27A1EA40 +:1018F0008530EFD4051D880439D0D4D9E599DBE6CD +:10190000F87CA21F6556ACC4442229F497FF2A43F1 +:10191000A72394AB39A093FCC3595B6592CC0C8F81 +:10192000D15D84854F7EA86FE0E62CFE144301A3B1 +:10193000A111084E827E53F735F23ABDBBD2D72AA9 +:1019400091D386EB094B036003F18833436003F1C5 +:101950002943A3F59613A3F68B638360A3F1883321 +:10196000C3600023C0E90433704700BF012345670B +:101970002DE9F8431446026905460E46E300C2F31A +:10198000C50800F118079B18036122BF43690133A2 +:10199000436112F4FC7F436903EB5473436114D039 +:1019A000C8F1400907EB08004C4504D22246BDE8C7 +:1019B000F84307F019BC403C4A464E4407F014FC7B +:1019C000444439462846FFF76FFCA04606EB04095D +:1019D000B8F13F0FA9EB08010AD94022384607F0B9 +:1019E00003FC39462846A8F14008FFF75DFCEFE705 +:1019F000A1096FF03F02384602FB014206EB81115C +:101A0000D5E7000070B50B6901F1180506460C46D4 +:101A1000C3F3C503EA18501C8022EA54C3F13F0205 +:101A2000072A1FD8002100F099F929462046FFF720 +:101A30003BFC38220021284600F090F92369294612 +:101A40002046236563696365FFF72EFC214610225B +:101A5000304607F0C9FB204658220021BDE87040FF +:101A600000F07CB9C3F137020021E5E72DE9F84F1A +:101A70004FF47A7306460D46002402FB03F7DFF8A5 +:101A80005080DFF8509098F900305FFA84FA5A1CC1 +:101A900001D0A34210D159F824002A4631460368E8 +:101AA000D3F820B03B46D847854205D1074B0120EB +:101AB00083F800A0BDE8F88F0134042CE3D14FF483 +:101AC000FA7004F0DBFD0020F4E700BFE4330020EF +:101AD0001022002014220020002307B50246012115 +:101AE0000DF107008DF80730FFF7C0FF20B19DF81A +:101AF000070003B05DF804FB4FF0FF30F9E700008A +:101B00000A46042108B5FFF7B1FF80F00100C0B21A +:101B1000404208BD074B0A4630B41978064B53F8CB +:101B20002140014623682046DD69044BAC4630BCA9 +:101B3000604700BFE433002014220020A08601008B +:101B400070B50A4E00240A4D05F01AFA3080286854 +:101B50003388834208D905F00FFA2B680444013317 +:101B6000B4F5003F2B60F2D370BD00BFE633002018 +:101B7000A033002005F0D2BA00F1006000F500307B +:101B80000068704700F10060920000F5003005F039 +:101B900053BA0000054B1A68054B1B889B1A8342F9 +:101BA00002D9104405F0E8B900207047A0330020A6 +:101BB000E633002038B50446074D29B12868204493 +:101BC000BDE8384005F0F0B92868204405F0DAF99E +:101BD0000028F3D038BD00BFA0330020002070479C +:101BE00000F1FF5000F58F10D0F80008704700009A +:101BF000064991F8243033B100230822086A81F89D +:101C00002430FFF7BFBF0120704700BFA43300207E +:101C1000014B1868704700BF0010005C194B013879 +:101C20000322084470B51D68174BC5F30B042D0C37 +:101C30001E88A6420BD15C680A46013C82421346CC +:101C40000FD214F9016F4EB102F8016BF6E7013AB9 +:101C500003F10803ECD181420B4602D22C2203F897 +:101C6000012B0424094A1688AE4204D1984284BF4D +:101C7000967803F8016B013C02F10402F3D1581A83 +:101C800070BD00BF0010005C2422002034930008C7 +:101C9000022804D1054B4FF400129A6170470128C5 +:101CA000FCD1024B4FF48012F7E700BF001002583E +:101CB000022803D1044B20229A6170470128FCD1ED +:101CC000014B1022F8E700BF00100258022805D18E +:101CD000064A536983F02003536170470128FCD101 +:101CE000024A536983F01003F6E700BF0010025860 +:101CF00070B504464FF47A764CB1412C254628BF86 +:101D0000412506FB05F0641B04F0B8FCF4E770BD48 +:101D1000002310B5934203D0CC5CC4540133F9E7DF +:101D200010BD0000013810B510F9013F3BB191F929 +:101D300000409C4203D11AB10131013AF4E71AB1D3 +:101D400091F90020981A10BD1046FCE703460246A0 +:101D5000D01A12F9011B0029FAD170470244034638 +:101D6000934202D003F8011BFAE770472DE9F843CC +:101D70001F4D14460746884695F8242052BBDFF8CD +:101D800070909CB395F824302BB92022FF2148464F +:101D90002F62FFF7E3FF95F824004146C0F10802E7 +:101DA00005EB8000A24228BF2246D6B29200FFF780 +:101DB000AFFF95F82430A41B17441E449044E4B2AE +:101DC000F6B2082E85F82460DBD1FFF711FF00285A +:101DD000D7D108E02B6A03EB82038342CFD0FFF711 +:101DE00007FF0028CBD10020BDE8F8830120FBE7E6 +:101DF000A4330020024B1A78024B1A70704700BFC0 +:101E0000E433002010220020F8B5194C194803F0E3 +:101E10003DFF2146174803F065FF24684FF47A70B0 +:101E2000154ED4F89020154DD2F80438114F43F0D8 +:101E30000203C2F80438FFF75BFF2046104904F0A4 +:101E40005FF8D4F890200424D2F8043823F0020379 +:101E5000C2F804384FF4E133336055F8040BB8424C +:101E600002D0314603F070FE013CF6D1F8BD00BF50 +:101E7000309B000818490020CC3300201422002099 +:101E8000389B00080C4B70B50C4D04461E780C4B6B +:101E900055F826209A420DD00A4B002118221846E8 +:101EA000FFF75CFF0460014655F82600BDE870406E +:101EB00003F04ABE70BD00BFE433002014220020AE +:101EC00018490020CC330020F0B5A1B071B6002332 +:101ED0000120002480261A46194602F087FD4FF49F +:101EE000D067214A3D25136923BBD2F810310BBBC3 +:101EF000036804F1006199600368C3F80CD00368BB +:101F00005E6003681F6001680B6843F001030B60AB +:101F100001680B6823F01E030B6001680B68DB0788 +:101F2000FCD4037B8034416805FA03F3B4F5001F49 +:101F30000B60D8D102F09AFDB4F5001F11D0002437 +:101F40000A4E0B4D012005F0E9F83388A34205D96C +:101F500028682044013405F027F8F6E7002005F052 +:101F6000DDF861B621B0F0BD00200052E63300205C +:101F7000A033002030B50A44084D91420DD011F82D +:101F8000013B5840082340F30004013B2C4013F070 +:101F9000FF0384EA5000F6D1EFE730BD2083B8EDAF +:101FA0000121884238BF084605F090B908B105F014 +:101FB00091B9704710B5084C01220849002001F082 +:101FC000B3FE23783BB1064803F036FD044803F026 +:101FD00069FD0023237010BDE833002044930008FE +:101FE000C83600201D482DE9F041036D2BB90122B0 +:101FF0004FF48051503005F0D1FA194E33780BB1BF +:10200000FFF7D8FF0324174F4FF00008134D154971 +:102010002846C7F8048003F037FD284603F070FB1C +:1020200048B1013C284603F03DFD14F0FF04EED119 +:10203000204634700FE00C4901220C4801F074FE78 +:10204000014618B1284603F0F7FCEAE7084800F01B +:1020500011F801203070BDE8F08100BFC8360020C3 +:10206000E83300203C22002044930008EC33002099 +:10207000489300080FB4002004B070470068704710 +:1020800003460068596870470B0A017043700B0CD7 +:10209000090E8370C1707047110A0270037141709C +:1020A000110C120E8170C2701A0A42711A0C1B0EAA +:1020B0008271C37170470000C36A0239023B8B42D0 +:1020C00083BF4389006C01FB0300002070470000C0 +:1020D000C2F307238A76CB760378032B01BF120C59 +:1020E0000A75120A4A75704700F10B010022D301EC +:1020F00043EA520310F8012B52FA83F38842DAB212 +:10210000F5D110467047000010B541780446002014 +:10211000013102464901022A16BFA35C032203EBE8 +:10212000C03302F101021EBF9BB203EB500398B211 +:102130009142F0D810BD000002684AB1134613F86E +:10214000011B1F290DD93A29F9D1911C8B4202D0CC +:102150004FF0FF3070471278302AF9D10360002029 +:102160007047014B187870473836002038B50D4657 +:10217000044618B9092000232B6038BD0368002BE2 +:10218000F8D01A78002AF5D08188DA889142F1D106 +:10219000587804F00FFC10F00100EBD12368EBE756 +:1021A00038B50D4640F25231144602F0B9F9FF2815 +:1021B00007D9012C0BD9030A022468702B70204622 +:1021C00038BD30B1002CFAD001242870F7E7002484 +:1021D000F5E70446F3E700002DE9F8430026D0F8C0 +:1021E000008005460C468E76836B002B4AD098F80B +:1021F0000030042B4BD133463546402720E0B7F55D +:10220000187F80F0C480F90606F1010608BF023786 +:10221000D05B02372BB900F5205292B2B2F5006FB5 +:102220000DD305F11A01C5F1FF0240EA0340214434 +:10223000FFF7B6FF002800F0AA80054400200346FF +:10224000D8F8102092F82310B142D8D8002B40F0D3 +:102250009E80002D00F09B8000232544AB766373A5 +:10226000D8F81020137903F03701DB0621730BD463 +:1022700002F13800FFF704FFC4E90001938963818C +:10228000D3892381BDE8F88300200146F4E7C36CBD +:1022900001335ED1EA6B00232E26551E184615F831 +:1022A000011F013020290CD0052908BFE52109288C +:1022B00004D10B2B9EBFE71801337E73E71801335F +:1022C00079730B28EBD1E11800204873A17E002917 +:1022D0004BD1002B40D06FF00C0604F10D00082507 +:1022E000361B331810F8011B002938D02E298BB269 +:1022F0004AD0A3F14101192903D8117B0D4200D026 +:1023000020330373EDE7B9F1000F05D100F5205339 +:102310009BB2B3F5006F0BD307F11A01C7F1FF02AF +:1023200040EA09402144FFF73BFF48B10744002041 +:1023300002368146D8F80C30985B0028E3D1384645 +:10234000B9F1000F4FF0000218BF002023189A7651 +:10235000A0E7B1463746EDE73F23A37601232344A8 +:1023600000219976137B03B96373D37A02F11C00C1 +:1023700003F03F0323730023FFF780FE20606360B8 +:10238000D38A6381138B7CE710250B46B9E73F2383 +:102390000125A37660E7000038B50546002435F82E +:1023A000020B08B9204638BD02F0EEF86308C2B24D +:1023B00003EBC43312FA83F39AB2C0F3072303EB9F +:1023C000520303EBC2339CB2E9E7000037B5C37890 +:1023D00004461BB90025284603B030BD00F14C016E +:1023E000826C01234078019104F00AFB054680B914 +:1023F000A36BE070A06C226BC31A9342EAD2A3785D +:102400000199022BE6D102440123607804F0F8FA26 +:10241000E1E70125DFE7000038B5836C05460C468F +:102420008B4210D0FFF7D2FF60B92246012305F19D +:102430004C01687804F0C0FA00281CBF4FF0FF344C +:102440000120AC6438BD0020FCE7000038B5002353 +:102450000446C3704FF0FF338364FFF7DDFF0028AD +:102460004BD1B4F84A524AF655239D4207D10B226C +:10247000254904F14C0006F0A7FE00283FD094F84F +:102480004C30EB2B03D01833DBB2012B2ED84AF69D +:1024900055239D4206D108221C4904F19E0006F0F6 +:1024A00093FE48B3B4F85730B3F5007F1ED194F8CB +:1024B0005930DBB15A1E1A4218D1B4F85A30ABB1B8 +:1024C00094F85C30013B012B10D8B4F85D306BB14F +:1024D000B4F85F307F2B06D804F16C00FFF7CEFD17 +:1024E000B0F5803F02D3B4F8623053B94AF65520B4 +:1024F00085420CBF0220032038BD0420FCE70120E8 +:10250000FAE70020F8E700BF749300088093000802 +:1025100002392DE9F04701F007044FF0010A466C3B +:1025200005460AFA04F41746984606EB1136C1F33D +:10253000C809E4B2314628460136FFF76DFF18B1ED +:102540000120BDE8F087994605EB090292F84C306E +:10255000234214BF01210021414513D06340013FB4 +:1025600082F84C3085F803A0EBD0640014F0FF042F +:10257000EAD109F1010301244FF00009B3F5007F0E +:10258000E1D1D7E70220DCE701290246F8B50C4685 +:1025900040F28C800668F36A8B4240F28780337881 +:1025A000013B032B00F28280DFE803F00229384B65 +:1025B00004EB5405B16B304601EB5521FFF72CFFBE +:1025C00010B14FF0FF30F8BD6F1CC5F30805B16BBB +:1025D0003046354401EB572195F84C50FFF71CFF6E +:1025E0000028EED1C7F30807E3073E4496F84C00F5 +:1025F00045EA00204CBF0009C0F30B00E3E7B16BD4 +:10260000304601EB1421FFF707FF0028D9D1640001 +:1026100004F4FF742644B6F84C00D4E7B16B30469E +:1026200001EBD411FFF7F8FE0028CAD1A40006F18F +:102630004C0004F4FE742044FFF720FD20F07040AD +:10264000C1E7D0E90430D57953EA000101D091689F +:1026500001B95DBB9168022DA4EB01010DD1013BD5 +:10266000728940F1FF305B0A43EAC053B3FBF2F3D7 +:1026700099421BD81CD0601CA5E7032D02D1936999 +:102680008B42F8D8D3699BB9B16B304601EBD411BA +:10269000FFF7C2FE002894D1A0004C3600F4FE7073 +:1026A0003044FFF7EBFC20F000408CE701208AE784 +:1026B0006FF0004087E70000F8B5066804460D4655 +:1026C0003378042B0CBF4FF080524FF400128A4233 +:1026D00001D80220F8BDCA06FBD182680163D2B9D5 +:1026E000022B13D83389B3EB551FF2D9F36BA363D5 +:1026F000A36B6263002BECD003EB55234C36C5F380 +:1027000008050020A3633544E563E3E7F36BC2717A +:10271000002BE7D01A4677897F02BD42114604D2CA +:102720003046FFF7C9FCA063E2E72046FFF72CFF25 +:10273000431C024606D00128CBD9F36A8342C8D98C +:10274000ED1BEAE70120C5E701292DE9F047064620 +:102750000C46174608D9C36A8B4205D90378022B69 +:1027600062D003D8012B22D0022552E0033B012B7B +:10277000FAD8816B01EBD411FFF74EFE0546002815 +:1027800047D1A40006F14C0304F4FE741C443378D2 +:10279000042B07D0204627F07047FFF76FFC00F0AE +:1027A0007040074339462046FFF76EFC2FE001EBEF +:1027B0005108816B01EB5821FFF72EFE054640BB07 +:1027C00014F0010406F14C0908F1010AC8F30808E5 +:1027D00008BFFBB230461FBF19F8083003F00F02E4 +:1027E0003B0103F0F00318BF134309F8083001233D +:1027F000B16BF37001EB5A21FFF70EFE054640B9AD +:10280000CAF3080A44B1C7F3071709F80A7001238D +:10281000F3702846BDE8F08719F80A30C7F303279C +:1028200023F00F031F43F0E7816B01EB1421FFF747 +:10283000F3FD05460028ECD1640006F14C0304F4D6 +:10284000FF741F551919C7F307274F70DFE7000002 +:10285000F8B504460E461746E3690BB91846F8BDAD +:10286000012BA6EB0305206814BFAA1C3A46691C7D +:10287000FFF76AFF0028F2D1E369013BE361EBE770 +:1028800001292DE9F84306460C461746056802D88B +:102890000220BDE8F883EB6A8B42F9D97AB9A146E8 +:1028A00021463046A046FFF76FFE0446B0B92B78AC +:1028B000042B02D1002F43D1F7710020E9E72B78D8 +:1028C000042B02D1C379022BE9D04FF0FF323946F5 +:1028D0002846FFF739FF0028E1D0DAE70128D7D0F2 +:1028E000421C01D10120D4E72B78042B19D1EA6ACC +:1028F000AB69023A93421CD308F10102A2420CD008 +:102900002B78042B08D10023A2EB09024946284664 +:10291000FFF7FEFD0028BCD1A146EB6AA342BFD859 +:10292000C5E7002241462846FFF70EFF0028DED00B +:10293000AFE70133AB612B7943F001032B71DBE788 +:10294000F3798BB9B468BC4202D10223F371B4E7C6 +:1029500021463046FFF718FE012899D9431CC1D003 +:1029600001348442EFD0A8E7032BA6D1B368BB4261 +:10297000A3D8B2691344BB429FD3E6E770B5C379CD +:102980000446032B06D181688369CD18A94203D17F +:102990000023E371002070BD4E1C20683246FFF713 +:1029A000D3FE0028F7D13146F0E700002DE9F743C8 +:1029B00005460191FFF70AFD0446002849D105F1BB +:1029C0004C09019928464FF40072FFF775FB214628 +:1029D000A86407464846FFF7C1F96C896402B4F55C +:1029E000004F28BF4FF40044B4F5007F2FD9204694 +:1029F00004F074FC804630B122460021640A0026AF +:102A0000FFF7ACF909E06408EEE72346BA1941463E +:102A1000687803F0F5FF18B926446B899E42F4D319 +:102A2000404604F06BFC6889801B18BF012003B08E +:102A3000BDE8F08301366B899E42F4D20123BA19B6 +:102A40004946687803F0DCFF0028F3D0EBE7002666 +:102A5000F1E70120EBE70000F8B50446FFF7B6FC0C +:102A60000546002842D12378032B37D12779012F3F +:102A700034D104F14C0601464FF400723046FFF7A2 +:102A80006DF955234122722184F84A32AA2304F5B4 +:102A90000D7084F84F2084F84B32522384F83012A2 +:102AA00084F84C3084F84D30612384F8311284F876 +:102AB0004E3084F83332A16984F83222FFF7E4FA09 +:102AC000616904F50E70FFF7DFFA626B3B46314631 +:102AD00001326078A26403F093FF257100226078D0 +:102AE000114603F0B1FF003818BF0120F8BD000007 +:102AF00000232DE9F0430B6085B00F461546FFF724 +:102B00001BFB061EC0F2B281804B53F82640002CFE +:102B100000F0AE813C6005F0FE0523786BB1607873 +:102B200003F048FFC70708D41DB110F0040500D01A +:102B30000A25284605B0BDE8F0830023F0B22370D3 +:102B4000607003F023FFC10700F194810DB14207CB +:102B5000EED400212046FFF779FC022840F099804E +:102B60006E4604F2122304F2522132461846103304 +:102B7000FFF784FA42F8040B8B42F7D1002556F890 +:102B8000041B00297DD02046FFF760FC012879D87E +:102B90000128A26C40F0C08004F1570304F18C01BD +:102BA00013F8015B002D7BD18B42F9D1B4F8B4301E +:102BB000B3F5807F74D194F8B830092B70D104F14B +:102BC0009400FFF75DFA4FF0FF33171841F1000151 +:102BD000BB4275EB010363D304F1A000FFF74EFA8B +:102BE00094F8BA302063012BA37059D194F8B990AE +:102BF00003FA09F91FFA89F36381002B50D0444B83 +:102C000004F1A800FFF73AFA0646984248D8831C18 +:102C1000626304F1A400E362FFF730FA00EB0208FC +:102C200004F19C00C4F84080FFF728FA10441FFA12 +:102C300089F2A06306FB02F313EB080345EB0502E0 +:102C40009F4271EB02032BD32E4604F1AC00FFF739 +:102C500015FAE06365B96389B34221D9E16B204677 +:102C6000FFF72AFA81192046FFF7D6FB98B90136FB +:102C7000631993F84C30812B14D02035C5F3080527 +:102C8000E8E703200135042D7FF479AF042807D14C +:102C900001E0042801D101254BE701287FF678AF38 +:102CA0000D2546E705F1140004F14C063044FFF70A +:102CB000E5F901280546F3D9E36A8342F0D9618931 +:102CC000821E236C02FB01336364A16B204601EB7F +:102CD000D511FFF7A1FB0028DDD105F07F0006EB41 +:102CE0008000FFF7CBF9431C03D00135A842ECD09C +:102CF000D6E70425C4E90500064A25700025138897 +:102D0000E56101339BB21380E38012E73C3600207B +:102D1000FDFFFF7F40360020B4F85730B3F5007F49 +:102D2000BED1B4F8626026B904F17000FFF7A6F9CD +:102D3000064694F85C302663591EA3700129AFD86B +:102D400094F859506581002DAAD0691E2942A7D157 +:102D5000B4F85D8018F00F0FA4F80880A0D1B4F883 +:102D60005F0018B904F16C00FFF788F9B4F85A1045 +:102D7000002995D006FB03FE01EB181CF4446045C6 +:102D80008ED3A0EB0C00A842B0FBF5F388D33E48ED +:102D9000834285D84FF6F57083426DD903259F1C79 +:102DA000114402EB0C03032DE7626263A163236409 +:102DB0004CD1B4F8763053EA08037FF471AFBB000E +:102DC00004F17800FFF75AF9E06303F2FF13B6EB62 +:102DD000532FFFF465AF4FF0FF33032DC4E90533E4 +:102DE0004FF08003237187D1B4F87C30012B83D15D +:102DF000511C2046FFF710FB00287FF47DAFB4F88C +:102E00004A224AF6552320719A427FF475AF1F4B30 +:102E100004F14C00FFF732F998427FF46DAF03F1F3 +:102E2000FF5304F50C70FFF729F903F50053203325 +:102E300098427FF461AF04F50D70FFF71FF9A061B0 +:102E400004F50E70FFF71AF9606155E7B8F1000F4D +:102E50003FF426AF7144022D4FEA4703E1631EBFE2 +:102E6000D91907F0010303EB5103AEE70B2560E628 +:102E70000C255EE603255CE640F6F575AB428CBF9B +:102E8000022501258BE700BFF5FFFF0F525261417C +:102E90002DE9F84F07460568884649B96E69C6B1FD +:102EA000EB6AB34298BF0126AB69A3B9002405E0E1 +:102EB000FFF76AFB0128044603D801242046BDE839 +:102EC000F88F421C00F0D280EB6A8342F6D8464667 +:102ED000EAE70126E8E72A78EB6A042A40F08380D3 +:102EE000A6F1020A023B4FF0010B9A4528BF4FF0B2 +:102EF000000AD146696C284601EB1931FFF78CFABC +:102F000000283BD109F00703EA6AC9F3C8010BFAAC +:102F100003F3901EDBB26A184C4609F1010992F8DE +:102F20004C20814502EA030233BF5B0000234FF4CB +:102F30000071DBB228BF9946B2B90234631E033375 +:102F4000BCD80123214628461A46FFF7E1FA022899 +:102F5000B3D0012800F08A80B8F1000F13D102230A +:102F6000FB710028A9D130E0CA450AD0002BD2D18C +:102F70000131B1F5007FBDD20123CCE74FF0FF3422 +:102F8000DCE70024DAE7FB79022B07D1731CA342AC +:102F9000E7D0BB68F31ABB610323FB7108F10102A0 +:102FA000FB69A24205D113B10133FB61D9E70223CA +:102FB000FBE70BB90123FB61224641463846FFF788 +:102FC00047FC00284FD10123FB61EA6AAB69023A52 +:102FD0006C6193429CBF03F1FF33AB612B7943F0EB +:102FE00001032B716AE7464514D1741C3846A3428D +:102FF00098BF02242146FFF7C7FA01283FF45DAFCE +:10300000431C33D0E0B16B69012B03D9EA6A9342C8 +:1030100038BF1E4634460134EB6AA34203D8012E62 +:103020007FF644AF022421463846FFF7ADFA48B197 +:1030300001283FF442AF013018D0B442EBD135E75C +:10304000002CE7D04FF0FF3221462846FFF77CFBEB +:1030500048B9B8F1000FB8D0224641462846FFF7DC +:1030600073FB0028B1D001287FF427AF4FF0FF3465 +:1030700024E700002DE9F84306680446076B8946FB +:1030800033782037042B0CBF4FF080534FF40013DC +:10309000BB429CBF00238363836B73B1C7F30808F3 +:1030A000B8F1000F3CD10133416B836339B93389E7 +:1030B000B3EB571F34D80023A36304200AE07389BD +:1030C000013B13EA57232BD1FFF75EFA012805468F +:1030D00002D80220BDE8F883421C01D10120F9E7A3 +:1030E000F36A834216D8B9F1000FE4D0616B204631 +:1030F000FFF7CEFE0546C8B10128EAD0431CEDD04B +:1031000001463046FFF752FC0028E7D1E37943F04F +:103110000403E371294630466563FEF7CDFFA063E3 +:103120004C36002027634644E663D3E70720D1E707 +:10313000F8B50E46002104460768FFF7BDFA98B9B6 +:103140000546A16B3846FFF767F968B93A78E36B33 +:10315000042A1B780CD11B060ED5054601212046FA +:10316000FFF788FF0028ECD0042808BF072006E0FE +:10317000E52B01D0002BF0D10135B542EED1F8BDE1 +:10318000C16C4B1C2DE9F04104460568066B1FD14C +:10319000E5274FF00108A16B2846FFF73DF998B9E4 +:1031A0002A78E36B042A09BF1A781F7002F07F02A5 +:1031B0001A7085F80380236BB3420DD2002120469C +:1031C000FFF758FF0028E6D0042808BF022003E0DC +:1031D000FFF772FA0028DBD0BDE8F0812DE9F0415D +:1031E00005460068A96B0669FFF716F9044620B981 +:1031F000EB6B1A78852A03D002242046BDE8F081C3 +:10320000324603F1200153F8040B8B4242F8040BC1 +:10321000F9D1777801377F01A7F16003B3F5007F1B +:10322000EAD800212846FFF725FF04280446E3D00A +:103230000028E2D1A96B2868FFF7EEF804460028C1 +:10324000DBD1EB6B1A78C02AD6D106F1200203F14C +:10325000200153F8040B8B4242F8040BF9D196F885 +:1032600023300F222C33B3FBF2F3B7EB431FC3D34E +:103270004FF0400800212846FFF7FCFE04280446D2 +:10328000BAD00028B9D1A96B2868FFF7C5F8044661 +:103290000028B2D1EB6B1A78C12AADD1B8F5187FEE +:1032A00009D206EB080203F1200153F8040B8B420C +:1032B00042F8040BF9D108F120084745DAD8B8F5EF +:1032C000187F9AD83046FEF71FFF7388834294D048 +:1032D00092E700000B68002210B5036004460B6AF9 +:1032E00083604B6AC261C37123F0FF03896AC0E93E +:1032F0000432C164FFF7E0F920B92046BDE8104070 +:10330000FFF76CBF10BD0000F8B503680546012744 +:103310001C692046FEF7F8FEA070000A6678E0708F +:103320002846E96CFFF7C8F920B1022828BF02201F +:10333000C0B2F8BDA96B2868FFF76EF80028F4D179 +:10334000EB6B04F1200254F8041B944243F8041B75 +:10335000F9D12B68DF70002EE7D000212846013E0E +:10336000FFF788FEE0E700002DE9F8434FF0FF0883 +:1033700006460768042445464FF6FF79B16B11B93C +:10338000002C73D063E03846FFF746F80446002867 +:103390005DD1F06B0378002B6ED03A78042A11D1FE +:1033A000852B4DD1336B3046F364FFF717FF04468E +:1033B00000284CD13B691B7903F03F03B3712046D1 +:1033C000BDE8F883C27AE52B02F03F02B27143D028 +:1033D0002E2B41D022F0200108293DD00F2A40D1C8 +:1033E000590637D503F0BF05336B90F80D80F364B1 +:1033F000437B434530D1428B72BB03780D21FC687F +:1034000023F04003DFF874E0013B4B4301211EF839 +:1034100001CB30F80CC009B3FF2B1DD824F813C022 +:103420006146013301320D2AF1D10278520605D5E9 +:1034300021B1FF2B10D8002224F81320013DEDB25A +:1034400000213046FFF716FE0446002896D00023E0 +:10345000B363B4E7AB42CBD0FF25F1E7CC45E1D075 +:10346000FAE72DB9FEF740FE404501D10024A6E75A +:103470004FF0FF33F364A2E70424E8E71C9400084C +:103480002DE9F04F002187B00446D0F80090FFF7F7 +:1034900013F9804670B999F80030042B33D1D9F86C +:1034A0000C00FEF779FF07462046FFF75DFF054653 +:1034B00020B18046404607B0BDE8F08FD9F8103003 +:1034C0009A8CBA42F0D193F823B040265D4506D1DC +:1034D000D9F80C3033F81530002BE5D1EAE7F106C6 +:1034E000D9F8103008BF0236985B01F04DF8D9F8D2 +:1034F0000C30824633F8150001F046F88245D3D1EE +:1035000002360135E2E74FF0FF0A4FF0FF3B554628 +:10351000C4F84CB0A16B4846FEF77EFF00285CD192 +:10352000E66B3778002F77D0F27AE52F02F03F0371 +:10353000A37103D0120704D50F2B04D0C4F84CB0EC +:103540004FE00F2B54D194F84B3058063FD47906F6 +:1035500045D5236B07F0BF0796F80DA0E364737B96 +:1035600053453ED1738B002B3BD135780121D9F8DF +:103570000C3005F03F0501930D23013D5D43284BC1 +:1035800013F8012BB25A71B3FF2D059329D81046B9 +:10359000049200F0F9FF6B1C03900293019B33F837 +:1035A000150000F0F1FF039981421AD1049A029D9F +:1035B0001146059B1B4A9342E2D133785A0604D543 +:1035C00019B1019B33F815305BB97D1EEDB20021B6 +:1035D0002046FFF74FFD00289CD080466AE7BD4299 +:1035E000BDD0FF25F3E74FF6FF708242E2D0F8E747 +:1035F0002DB93046FEF778FD50453FF45BAF94F8A7 +:103600004B30DB079AD40B2204F14001304605F021 +:10361000DBFD002892D14DE74FF004084AE700BFD8 +:103620001C940008299400082DE9F04F90F84BB045 +:1036300099B004461BF0A00540F068810668F26866 +:1036400032F81530002B4AD13378042B40F08780B4 +:103650000F230E352046B5FBF3F5A91CFFF768FDD7 +:103660008146002877D1236B0135A3EB4515E3791B +:103670005A07E56435D523F004032046E371FFF7CC +:103680007DF950BB4FF0FF32616B2046FFF7E0F849 +:1036900018BBA3682BB3214604A8FFF71BFEE0B9B3 +:1036A00070894FF40071D4E90423E0FB01233069F1 +:1036B000C4E904233830FEF7EFFC3069D4E9042371 +:1036C0002830FEF7E9FCE379326904A843F00103EE +:1036D00082F82130FFF718FE18B181463BE0013532 +:1036E000AEE7D6E90354402200212046FEF736FB20 +:1036F0008523012140222370C0234FF0C10C04EB2D +:10370000010884F8203000231E469E46571C04F80A +:1037100002C0F0B2023204F807E021B135F813100C +:1037200009B10133DBB20F0AA15408F8027002326A +:10373000D706F2D135F813700136002FE6D184F8A0 +:103740002330831C28466370FEF726FE84F824008D +:10375000000A84F82500484619B0BDE8F08F04F14E +:1037600040070DF1100A1BF0010F97E807008AE8E7 +:10377000070000F0D38040234FF0010884F84B305D +:10378000BC46F368B8F1050F9AE80700ACE80300FF +:103790002CF8022B4FEA12428CF8002059D9981EBF +:1037A000424630F8021F002942D10DF10F0C0721CB +:1037B00002F00F0E914612090EF13000392888BF31 +:1037C0000EF1370001390CF8010902D0B9F10F0FE1 +:1037D000EED818AB7E205A1802F8580C3846002252 +:1037E000914206D010F801CB02F1010EBCF1200F7E +:1037F00031D104F13F0C072902F1010297BF18AB48 +:1038000020205818013198BF10F8580C072A0CF8DE +:103810000200F0D92046FFF733FE8146002878D118 +:1038200008F10108B8F1640FAAD14FF0070992E737 +:103830004FF0100C01F0010E49080EEB4202D303C9 +:1038400044BF82F4883282F02102BCF1010CF1D134 +:10385000A7E74246A9E77246C2E7216B2046A1EBE3 +:103860004511FEF729FF814600287FF474AF4FF61B +:10387000FF783846FEF738FC0190A16B3046FEF722 +:10388000CBFD814600287FF466AFE36BE9B2019A75 +:103890004FF00D0CD6F80CE05A734FF00F02DFF822 +:1038A000E0A0DA724A1E18730CFB02F28446987686 +:1038B000D87640451AF8019B0CF1010C18BF3EF870 +:1038C000120003EB090B18BF013203F809004FEA9D +:1038D0001029002808BF4046BCF10D0F8BF801905D +:1038E000E7D1404502D03EF812200AB941F040012C +:1038F0001970012300212046F370FFF7BBFB8146BE +:1039000000287FF428AF013DB7D11BE04FF0060936 +:1039100021E704287FF41FAF84F84BB01BF0020F9F +:1039200020461BBF0C350D210125B5FBF1F518BF55 +:1039300001352946FFF7FCFB814600287FF40BAFD9 +:10394000013D8AD1A16B3046FEF766FD8146002815 +:103950007FF401AF01462022E06BFEF7FFF9E36B35 +:1039600003CF18605960BA7839889A72198194F82F +:103970004B30E26B03F0180313730123F370EAE694 +:103980001C94000810B504460A463430FEF776FB56 +:10399000886004F13800FEF773FBC2E9040194F873 +:1039A000213003F00203D3710023D36110BD000066 +:1039B00003284B8B04BF8A8A43EA024318467047A8 +:1039C0002DE9F04F0B7899B0044689462F2BD0F89B +:1039D00000B001D05C2B09D14A46137891460132E0 +:1039E0002F2BFAD05C2BF8D0002301E0DBF81C3041 +:1039F000A3600023E3619BF80030042B1ED1A36871 +:103A0000E3B1DBF82030214604A82362DBF8243040 +:103A10006362DBF82830A362FFF75CFC03460028F2 +:103A200054D1DBF8102002F13800FEF727FBC4E97F +:103A3000040392F8213003F00203E37199F8003097 +:103A40001F2B00F2358180230021204684F84B3063 +:103A500019B0BDE8F04FFEF72FBE49460B788946F6 +:103A600001312F2BFAD05C2BF8D01F2B8CBF0025F7 +:103A70000425012F2FD113882E2B31D1002322F8BA +:103A8000173004F140029F428CBF2E2120210133C8 +:103A90000B2B02F8011BF6D145F02005204684F8D7 +:103AA0004B50FFF7EDFC94F84B30002800F0E78016 +:103AB00004280BD1990603F0040240F1DC80002AAF +:103AC00000F0F6808023002084F84B3019B0BDE868 +:103AD000F08F0425CDE7022F02D153882E2BCAD0B8 +:103AE000911E87BB002322F81730002F00F01181B0 +:103AF00032F81300194601332028F9D009B92E28CD +:103B000001D145F00305901E30F817302E2B01D05F +:103B1000013FF9D14FF020334FF0000A6364D046E3 +:103B20002364C4F847300823481C32F81160009021 +:103B3000F6B1202E03D02E2E0DD1B84210D045F074 +:103B400003050099F0E731F81730202B01D02E2B18 +:103B5000C8D1013FC5E79A4505D20099B9423BD18A +:103B60000B2B30D101E00B2B27D145F003050B23A4 +:103B700094F84020E52A04BF052284F84020082B51 +:103B800004BF4FEA88085FFA88F808F00C030C2B92 +:103B900003D008F00303032B01D145F00205A80769 +:103BA0003FF57CAF18F0010F18BF45F0100518F075 +:103BB000040F18BF45F0080570E70099B94202D01C +:103BC00045F00305D4D84FEA88080B234FF0080AC4 +:103BD00000975FFA88F8B4E77F2E15D9304640F297 +:103BE0005231CDE9022345F00203019300F098FC25 +:103BF00010F0800F0646DDE9022316D000F07F06A4 +:103C000046498E5D019D46B331464548CDE90123C5 +:103C100005F004FBDDE90123F8B9A6F1410189B201 +:103C200019291ED848F0020810E0FF28EAD9591EC9 +:103C30008A4503D345F003059A4682E704EB0A015F +:103C4000000A0AF1010A019D81F8400004EB0A0113 +:103C50000AF1010A81F8406073E745F003055F2629 +:103C6000F4E7A6F1610189B219299EBF203E48F010 +:103C70000108B6B2EAE7002A08BF052026E75A077E +:103C80003FF524AFA379DB0645D59BF80000042857 +:103C900035D1A3682146E27923622369DBF810005D +:103CA00023F0FF0313436362E36CA362FFF76AFE32 +:103CB00023680027DA6819F8010B00283FF409AFE0 +:103CC00040F25231009200F04BFC054608B31F2829 +:103CD000009A7FF6FEAE2F283FF4BFAE5C283FF47B +:103CE000BCAE7F2805D801460E4805F097FA009A29 +:103CF00078B9FF2F0DD022F817500137DBE7216B81 +:103D00000BF14C03C1F308011944FFF751FEA06009 +:103D1000CEE70620DAE60520D8E600BF9C9300082F +:103D2000959300088C9300081FB5CDE9001003A8F7 +:103D300014460391FEF700FA002815DB0B4A52F8EF +:103D400020300BB100211970019B0BB100211970BB +:103D500042F820302CB1002201A96846FEF7C8FEC7 +:103D60000446204604B010BD0B24FAE73C36002080 +:103D70002DE9F04798B0904605460191002800F0E3 +:103D8000528102F03F0603A901A83246FEF7B0FEB9 +:103D9000002840F04681039B4FF48C60049303F0AD +:103DA0009DFA0746002800F04081039B00F5007251 +:103DB0000199D86004A81A61FFF702FE044620B9F1 +:103DC0009DF95B30002BB8BF062418F01C0F00F0E3 +:103DD000CD80002C4CD0042C40D104A8FFF724FC4B +:103DE000044600283AD146F00806039B1A78042AB4 +:103DF00040F08380186929462B60FFF7C3FD039BC1 +:103E00001E22002118690230FDF7A8FF039C002143 +:103E10001A2220692630FDF7A1FF236920221A719A +:103E2000246903F095FA0146012208342046FEF782 +:103E30002BF9039B04A81B6983F82120FFF764FA80 +:103E4000044658B9A96801B302462846FEF718FD92 +:103E5000AB68039A0446013B5361B4B1384603F0A2 +:103E60004DFA0CB100232B60204618B0BDE8F08756 +:103E70009DF8163013F0110F40F0848018F0040FF5 +:103E800040F0C98018F0080FAFD1039A3107139999 +:103E9000936C48BF46F04006E964AB641078042890 +:103EA00072D1069B9DF817102B62089B106923F0B6 +:103EB000FF030B4329466B62179BAB62FFF762FD62 +:103EC000DDF80CA00024002205F15008BAF80630F5 +:103ED00021464046C5F800A0AB80002385F830603D +:103EE00085F831406C64C5E90E234FF40072FDF78C +:103EF00035FFB20653D40024B0E703F029FA014697 +:103F0000009013980E30FEF7BFF813980099163002 +:103F1000FEF7BAF8039C13992078FFF749FD202398 +:103F200000228046CB7220461399FEF7D1F8139BEE +:103F3000002201211A775A779A77DA77039BD97092 +:103F4000B8F1000FA1D0414604A8D3F84890FEF77D +:103F500097FC0446002881D149460398FEF75CFA95 +:103F6000039B044608F1FF30586176E7002C7FF48C +:103F700075AF9DF81630DC064FD418F0020F84D0D0 +:103F8000D80782D5072469E7FFF712FD0023A86050 +:103F900001F11C00FEF772F86B61286190E7D5E92A +:103FA000046956EA0903A6D0BAF80AA0A9684FEA3C +:103FB0004A2AC5E90E69B24574EB09031BD30024F4 +:103FC0002964002C7FF44AAFC6F30803002B92D07B +:103FD000039C2046FEF770F808B3760A0123414699 +:103FE00046EAC95682196A64607802F0E5FC041E4C +:103FF00018BF012432E72846FEF7C6FAB6EB0A06D8 +:10400000014669F10009012803D9431CD3D10124D9 +:10401000D6E70224D4E7082420E704241EE702247C +:104020001CE704461EE709241EE711241CE70000D4 +:104030002DE9F04F994685B00023884603A9044630 +:10404000C9F800301646FEF791F8054680BB94F893 +:1040500031506DBB94F8303013F00103009300F041 +:10406000A68004F1500AD4E90432D4E90E011B1AE7 +:1040700062EB0102B34272F1000238BF1E46BEB1CC +:10408000D4E90E10C1F30803002B40F08280039B9B +:104090005A894B0A013A43EAC0531A401BD151EAEC +:1040A000000309D1A06801280DD8022584F83150F9 +:1040B000284605B0BDE8F08F216C20460192FEF73E +:1040C00063FA019AEFE7431C04D10123009D84F8B1 +:1040D0003130EDE72064DDF80CB0216C5846FDF777 +:1040E000EBFF0028E1D0B6F5007F02EB000731D3EB +:1040F000BBF80A1002EB5620730A88429BF80100B5 +:1041000088BF8B1A3A464146019302F055FC0028BD +:10411000DBD194F93020019B002A0BDA606CC01BC4 +:10412000984207D24FF40072514608EB4020FDF749 +:10413000EFFD019B5F02D9F80030F61BB8443B4409 +:10414000C9F80030D4E90E32DB1942F10002C4E9AB +:104150000E3294E7626CBA421AD094F93030002BD8 +:104160000DDA012351469BF8010002F049FC0028BA +:10417000ABD194F8303003F07F0384F830300398EB +:1041800001233A465146407802F016FC00289CD1A3 +:104190006764A16B4046C1F30801C1F50077514443 +:1041A000B74228BF37463A46FDF7B2FDC3E70725B9 +:1041B0007EE7000070B596B00E460022019002A97D +:1041C00001A8FEF795FC0446E0B94FF48C6003F0BB +:1041D00085F80546D8B1029B00F500720199D860B8 +:1041E00002A81A61FFF7ECFB044640B99DF9533071 +:1041F000002B0ADB1EB1314602A8FDF7EDFF284671 +:1042000003F07CF8204616B070BD0624F7E71124B1 +:10421000F8E7000070B5B8B00222019003A901A828 +:10422000FEF766FC044608BB039B4FF48C601093BA +:1042300003F054F80546002866D0039B00F5007291 +:104240000199D86010A81A61FFF7BAFB044650B96B +:104250009DF88B30980655D4190653D49DF84630F6 +:10426000DA0706D50724284603F048F8204638B078 +:1042700070BD039B04931878042814D104A918690D +:10428000FFF780FB069E9DF84630DB0610D410A891 +:10429000FEF776FF04460028E5D156BB0398FEF7EB +:1042A000DBFB0446DFE71F99FFF782FB0646EAE7E0 +:1042B000039BDA69B242D5D024930021269624A824 +:1042C0001B78042B01BFDDE90823CDE928239DF8E5 +:1042D00017308DF89730FEF7EFF904460028C2D169 +:1042E00024A8FFF741F804460028BBD00428BAD11F +:1042F000CDE70246314604A8FEF7C2FA044600287C +:10430000B1D1CBE70624AEE71124AFE7F0B5BDB0DD +:10431000CDE900106846FDF70FFF022203A901A8AE +:10432000FEF7E6FB0446002841D1039B4FF48C6066 +:10433000149302F0D3FF0546002800F0EE80039BA3 +:1043400000F5007214AE0199D8601A613046FFF78B +:1043500037FB044640BB9DF89B3013F0A00F40F0A4 +:10436000D880039B009F1A78042A68D11B6904AC8B +:1043700003F1400C1868083353F8041C22466345C7 +:1043800003C21446F6D15022314628A8FDF7C0FCDE +:10439000394628A8FFF714FB044600284CD12A9A76 +:1043A000169B9A4206D00824284602F0A7FF204612 +:1043B0003DB0F0BD349A209B9A42F4D128A8FFF773 +:1043C00033F904460028EFD1039B04AF1B6993F82F +:1043D00001E093F823C09C8C3A46083303CAB242EA +:1043E00043F8080C43F8041C1746F5D1039B28A892 +:1043F0001B6983F801E0039B1A6982F823C01A69DC +:1044000082F82440240A82F825401A691379D906D3 +:104410005CBF43F020031371FEF776FF04460028CB +:10442000C2D13046FEF7ACFE04460028BCD103984A +:10443000FEF712FB0446B7E70428B5D1BEE7239A7E +:1044400004AB02F1200C1068083252F8041C1C4620 +:10445000624503C42346F6D15022314628A8FDF711 +:1044600057FC394628A8FFF7ABFA044600284CD180 +:104470002A9A169B9A4296D1349A209B9A4292D1BC +:1044800028A8FFF7D1F8044600288DD137990DF1FF +:104490001D030DF12D0001F10D0253F8044B834271 +:1044A00042F8044BF9D11888012710809B7893704B +:1044B0009DF81B30039CDA0658BF43F02003CB72F3 +:1044C000E770CB7ADB06ACD5169A2A9B9A42A8D025 +:1044D0002078FFF76DFA01462046FDF7EDFD014615 +:1044E000C8B12046FDF798FF044600287FF45CAF72 +:1044F000039890F86D302E2B93D12A9A00F16C011D +:10450000FDF7E6FD039BDF708BE704287FF44CAFDB +:10451000B6E7062448E7022446E7112447E70000EF +:104520007F2810B501D880B210BDB0F5803F13D2FE +:1045300040F2523399420FD10849002231F8024B20 +:1045400093B2844203D103F18000C0B2ECE70132A0 +:10455000802AF3D11346F6E70020E5E7DC96000851 +:104560007F280DD940F25233994208D1FF2806D84E +:1045700000F10040034B803833F8100070470020F2 +:10458000704700BFDC960008B0F5803FF0B522D23E +:104590001F4A83B21F49B0F5805F28BF0A46141D29 +:1045A00034F8042C2146AAB1934213D334F8025CA8 +:1045B0002E0AEFB252FA85F5A84222DA082E09D85F +:1045C000DFE806F0050A10121416181A1C00801AEB +:1045D00034F810301846F0BD981A00F001001B1A8C +:1045E0009BB2F7E7103BFBE7203BF9E7303BF7E7EF +:1045F0001A3BF5E70833F3E7503BF1E7A3F5E35344 +:10460000EEE70434002ECBD101EB4702C7E700BF31 +:104610002C9400082096000808B5074B074A196833 +:1046200001F03D01996053680BB190689847BDE86F +:10463000084003F0A3B800BF000002404436002049 +:1046400008B5084B1968890901F03D018A019A6093 +:10465000054AD3680BB110699847BDE8084003F0DC +:104660008DB800BF000002404436002008B5084B5A +:104670001968090C01F03D010A049A60054A536962 +:104680000BB190699847BDE8084003F077B800BFC8 +:10469000000002404436002008B5084B1968890D17 +:1046A00001F03D018A059A60054AD3690BB1106A91 +:1046B0009847BDE8084003F061B800BF0000024021 +:1046C0004436002008B5074B074A596801F03D0100 +:1046D000D960536A0BB1906A9847BDE8084003F06F +:1046E0004DB800BF000002404436002008B5084B1A +:1046F0005968890901F03D018A01DA60054AD36AE7 +:104700000BB1106B9847BDE8084003F037B800BF05 +:10471000000002404436002008B5084B5968090CD7 +:1047200001F03D010A04DA60054A536B0BB1906B4E +:104730009847BDE8084003F021B800BF00000240E0 +:104740004436002008B5084B5968890D01F03D0139 +:104750008A05DA60054AD36B0BB1106C9847BDE847 +:10476000084003F00BB800BF0000024044360020B0 +:1047700008B5074B074A196801F03D019960536C71 +:104780000BB1906C9847BDE8084002F0F7BF00BF3E +:10479000000402404436002008B5084B1968890916 +:1047A00001F03D018A019A60054AD36C0BB1106D8E +:1047B0009847BDE8084002F0E1BF00BF0004024096 +:1047C0004436002008B5084B1968090C01F03D017A +:1047D0000A049A60054A536D0BB1906D9847BDE885 +:1047E000084002F0CBBF00BF000402404436002066 +:1047F00008B5084B1968890D01F03D018A059A60DA +:10480000054AD36D0BB1106E9847BDE8084002F021 +:10481000B5BF00BF000402404436002008B5074B76 +:10482000074A596801F03D01D960536E0BB1906E93 +:104830009847BDE8084002F0A1BF00BF0004024055 +:104840004436002008B5084B5968890901F03D013C +:104850008A01DA60054AD36E0BB1106F9847BDE844 +:10486000084002F08BBF00BF000402404436002025 +:1048700008B5084B5968090C01F03D010A04DA60DB +:10488000054A536F0BB1906F9847BDE8084002F09E +:1048900075BF00BF000402404436002008B5084B35 +:1048A0005968890D01F03D018A05DA60054AD36F28 +:1048B00013B1D2F880009847BDE8084002F05EBF0F +:1048C000000402404436002000230C4910B51A466B +:1048D0000B4C0B6054F82300026001EB43000433DF +:1048E0004260402BF6D1074A4FF0FF339360D3600C +:1048F000C2F80834C2F80C3410BD00BF44360020A2 +:10490000DC970008000002400F28F8B510D91028E5 +:1049100010D0112811D0122808D10F240720DFF859 +:10492000C8E00126DEF80050A04208D9002653E076 +:104930000446F4E70F240020F1E70724FBE706FA1A +:1049400000F73D424AD1264C4FEA001C3D4304EBA0 +:1049500000160EEBC000CEF80050C0E90123FBB2F8 +:1049600073B12048D0F8D83043F00103C0F8D830F4 +:10497000D0F8003143F00103C0F80031D0F8003125 +:1049800017F47F4F0ED01748D0F8D83043F0020309 +:10499000C0F8D830D0F8003143F00203C0F800313D +:1049A000D0F8003154F80C00036823F01F030360B3 +:1049B000056815F00105FBD104EB0C033D2493F8C9 +:1049C0000CC05F6804FA0CF43C602124056044616B +:1049D00012B1987B00F0CAFC3046F8BD0130A3E765 +:1049E000DC970008004402584436002010B53024FB +:1049F00084F31188FFF788FF002383F3118810BD2B +:104A000010B50446807B00F0C7FC01231549627B8A +:104A100003FA02F20B6823EA0203DAB20B6072B9FE +:104A2000114AD2F8D81021F00101C2F8D810D2F8FA +:104A3000001121F00101C2F80011D2F8002113F495 +:104A40007F4F0ED1084BD3F8D82022F00202C3F8D2 +:104A5000D820D3F8002122F00202C3F80021D3F8B5 +:104A6000003110BD443600200044025808B5302300 +:104A700083F31188FFF7C4FF002383F3118808BD77 +:104A8000836CC26A8B42506810B506D95A1E4C001E +:104A900002EB4103B3FBF4F3184410BD01F0010332 +:104AA0008A0748BF43F002034A0748BF43F00803A0 +:104AB0000A0748BF43F00403CA0648BF43F0100387 +:104AC0008A06426B48BF43F0200313434363704799 +:104AD00010B5074C204600F0CBFF064B0022C4E97E +:104AE0001023054BA364054BE363054BE36410BD42 +:104AF000C83600200024024800B4C4041C3700203B +:104B00001C390020C36A0BB9104BC3620379012B17 +:104B100011D10F4B98420ED10E4BD3F8DC2042F44A +:104B20000072C3F8DC20D3F8042142F40072C3F809 +:104B30000421D3F80431436C00221A65DA621A604A +:104B40005A605A624FF0FF329A637047DC9800084F +:104B5000C8360020004402580379012B1BD0436C57 +:104B600000221A65DA621A605A605A624FF0FF3208 +:104B70009A63094B98420ED1084BD3F8DC2022F4FB +:104B80000072C3F8DC20D3F8042122F40072C3F8C9 +:104B90000421D3F804317047C8360020004402587D +:104BA00010B5446C0649FFF76BFF6060236842F262 +:104BB000107043F003032360BDE8104001F05EBDB8 +:104BC000801A06000129F8B5466C0B4F09D17568AB +:104BD0000A493D40FFF754FF054345F48055756091 +:104BE000F8BD746806493C40FFF74AFF044344F4AB +:104BF00080547460F4E700BF00ECFFFF80F0FA021D +:104C000040787D01436C00225A601A6070470000B2 +:104C1000426C0129536823F4404304D0022905D093 +:104C200001B95360704743F48043FAE743F400430B +:104C3000F7E70000436C41F480519A60D9605A6BE9 +:104C40001206FCD580229A637047000010B541F42B +:104C50008851446CA260E160616B11F04502FBD0A9 +:104C6000A26311F0040203D0FFF718FF012010BD6A +:104C7000616910461960FAE710B541F48851446C37 +:104C8000A260E160616B11F04502FBD0A26311F0FC +:104C9000050203D0FFF702FF012010BD6169104635 +:104CA0001960FAE773B5134604460E46302282F3C4 +:104CB0001188426CD26B32B14FF0FF31403001931A +:104CC00001F0E8FC019B606C00220265C263C262D5 +:104CD000456B15F4807504D185F31188012002B06D +:104CE00070BD4FF0FF31816382F31188012E06D928 +:104CF0000C21204602B0BDE87040FFF7BDBF104652 +:104D0000EDE7000073B5446C0E4600250192616B1F +:104D1000A1632565E562FFF7C1FE012E07D9019B5E +:104D20002A460C2102B0BDE87040FFF7A5BF02B0D3 +:104D300070BD000010B541F49851446CA260E16070 +:104D4000616B11F04502FBD0A26311F03F0203D06A +:104D5000FFF7A4FE012010BD216A10461960E16929 +:104D60005960A16999606169D960F4E72DE9F74359 +:104D700004460191006D01A91746984602F026FCF1 +:104D8000064600284AD0626C2046DDF8049055683B +:104D9000C5F3090501356B00A56CB5FBF3F54FF4C0 +:104DA0007A73B5FBF3F55D43556200F027FE50BB07 +:104DB000636C4FF0FF3201254146C3F858902046FE +:104DC0001D659A634FF49572DA6342F207029F629F +:104DD000DA62E36C0A9AFFF74FFFA0B9E26C104B5E +:104DE00011680B407BB929462046FFF75BFF05465B +:104DF00048B92E463A460199206D02F01FFC304614 +:104E000003B0BDE8F0833A460199206D02F016FC2C +:104E1000E26C01212046FFF775FFF0E70126EEE77F +:104E200008E0FFFD2DE9F7431F46436C01924FF464 +:104E30007A725D6804468846C5F3090501356E003F +:104E4000856CB5FBF6F5B5FBF2F555435D6200F0F8 +:104E5000D5FD20B10125284603B0BDE8F0837E02D0 +:104E600001A9206D324602F0B1FB05460028F1D0C1 +:104E7000636C019AD4F84C909A6501221A654FF040 +:104E8000FF329A634FF49572DA639E62236BDB06FE +:104E90004B4658BF4FEA4828012F42461BD91221E2 +:104EA0002046FFF7E9FEC0B9D9F80020104B1340A7 +:104EB0009BB9636C42F2930239462046DA62E26C97 +:104EC000FFF7F0FE804640B932460199206D454615 +:104ED00002F0B4FBBFE71121E2E732460199206DF1 +:104EE00002F0ACFBE26C39462046FFF70BFFB2E75D +:104EF00008E0FFFD2DE9F3411F46436C01924FF49A +:104F00007A725D6804468846C5F3090501356E006E +:104F1000856CB5FBF6F5B5FBF2F555435D6200F027 +:104F20006DFD20B10125284602B0BDE8F0817E026A +:104F300001A9206D324602F08FFB05460028F1D012 +:104F4000636C019A9A6501221A654FF0FF329A63E9 +:104F50004FF48D72DA639E62236BE66CDB06334698 +:104F600058BF4FEA4828012F424619D91921204637 +:104F7000FFF782FEB0B932680F4B134093B9636CF0 +:104F800042F2910239462046DA62E26CFFF78AFE6D +:104F9000064638B901993546206D02F099FBC2E703 +:104FA0001821E4E70199206D02F092FBE26C39468A +:104FB0002046FFF7A7FEB6E708E0FFFD12F0030F5B +:104FC0002DE9F04107460C4615461E4617D00E4403 +:104FD000B44202D10020BDE8F0810123FA6B2146E2 +:104FE0003846FFF71FFF0028F5D128464FF400721E +:104FF000F96B05F500750134FCF78AFEE8E7BDE8BA +:10500000F041FFF70FBF000012F0030F2DE9F04150 +:1050100007460C4615461E4617D00E44B44202D130 +:105020000020BDE8F08129464FF40072F86B05F5C9 +:105030000075FCF76DFE0123FA6B21463846FFF739 +:1050400059FF0028EDD10134E8E7BDE8F041FFF752 +:1050500051BF000000207047302310B583F3118842 +:105060000024436C40302146DC6301F021FB84F3D3 +:10507000118810BD026843681143016003B11847ED +:1050800070470000024A136843F0C0031360704782 +:1050900000480040024A136843F0C00313607047A1 +:1050A00000500040024A136843F0C0031360704789 +:1050B00000780040064BD3F8E8200243C3F8E8200C +:1050C000D3F810211043C3F81001D3F81031704702 +:1050D0000044025837B5274C274D204600F028FDE4 +:1050E00004F11400009400234FF40072234900F0EF +:1050F000C3F94FF40072224904F138000094214BA7 +:1051000000F03CFA204BC4E91735204C204600F053 +:105110000FFD04F11400009400234FF400721C49A9 +:1051200000F0AAF94FF400721A4904F13800009413 +:10513000194B00F023FA194BC4E91735184C2046D7 +:1051400000F0F6FC04F1140000234FF4007215493E +:10515000009400F091F9144B4FF40072134904F1DC +:105160003800009400F00AFA114BC4E9173503B077 +:1051700030BD00BF2039002000E1F505643A002071 +:105180006440002085500008004800408C39002011 +:10519000643C00206442002095500008005000400C +:1051A000F8390020643E0020A55000086444002027 +:1051B0000078004038B5264D0446037C002918BF0E +:1051C0000D46012B06D1234B984230D14FF480205D +:1051D000FFF770FF2A68236EE16D03EB5203A566AB +:1051E000B3FBF2F36A68100442BF23F0070003F038 +:1051F000070343EA4003CB60AB6843F040034B60D6 +:10520000EB6843F001038B6042F4967343F00103B3 +:105210000B604FF0FF330B62510505D512F01022E1 +:1052200011D0B2F1805F10D084F8643038BD0A4BE1 +:10523000984205D0094B9842CCD14FF08040C7E747 +:105240004FF48010C4E77F23EEE73F23ECE700BF75 +:10525000E4980008203900208C390020F83900201B +:105260002DE9F047C66D05463768F46921073462B9 +:105270001AD014F0080118BF4FF48071E20748BF3C +:1052800041F02001A3074FF0300348BF41F0400137 +:10529000600748BF41F0800183F31188281DFFF7A4 +:1052A000E9FE002383F31188E2050AD5302383F356 +:1052B00011884FF48061281DFFF7DCFE002383F383 +:1052C00011884FF030094FF0000A14F0200838D14F +:1052D0003B0616D54FF0300905F1380A200610D5E7 +:1052E00089F31188504600F07DF9002836DA08214C +:1052F000281DFFF7BFFE27F080033360002383F3F0 +:105300001188790614D5620612D5302383F31188EB +:10531000D5E913239A4208D12B6C33B127F040070B +:105320001021281DFFF7A6FE3760002383F31188A4 +:10533000E30618D5AA6E1369ABB15069BDE8F04712 +:10534000184789F31188736A284695F86410194044 +:1053500000F008FC8AF31188F469B6E7B06288F3BC +:105360001188F469BAE7BDE8F0870000090100F18F +:105370006043012203F56143C9B283F8001300F0D2 +:105380001F039A4043099B0003F1604303F5614307 +:10539000C3F880211A60704700F01F0301229A4071 +:1053A000430900F160409B0000F5614003F1604358 +:1053B00003F56143C3F88020C3F88021002380F8FF +:1053C00000337047F8B51546826804460B46AA427A +:1053D00000D28568A1692669761AB5420BD21846B3 +:1053E0002A46FCF795FCA3692B44A3612846A368D1 +:1053F0005B1BA360F8BD0CD9AF1B18463246FCF707 +:1054000087FC3A46E1683044FCF782FCE3683B44A1 +:10541000EBE718462A46FCF77BFCE368E5E700006B +:1054200083689342F7B50446154600D28568D4E9EF +:105430000460361AB5420BD22A46FCF769FC636950 +:105440002B4463612846A3685B1BA36003B0F0BDD7 +:105450000DD93246AF1B0191FCF75AFC01993A462F +:10546000E0683144FCF754FCE3683B44E9E72A4632 +:10547000FCF74EFCE368E4E710B50A440024C3617E +:10548000029B8460C16002610362C0E90000C0E960 +:10549000051110BD08B5D0E90532934201D18268EB +:1054A00082B98268013282605A1C426119700021FF +:1054B000D0E904329A4224BFC368436101F012F973 +:1054C000002008BD4FF0FF30FBE7000070B530232F +:1054D00004460E4683F31188A568A5B1A368A269A6 +:1054E000013BA360531CA36115782269934224BF3A +:1054F000E368A361E3690BB120469847002383F377 +:105500001188284607E03146204601F0DBF80028E4 +:10551000E2DA85F3118870BD2DE9F74F04460E4697 +:1055200017469846D0F81C904FF0300A8AF311883D +:105530004FF0000B154665B12A4631462046FFF76D +:1055400041FF034660B94146204601F0BBF8002800 +:10555000F1D0002383F31188781B03B0BDE8F08FEE +:10556000B9F1000F03D001902046C847019B8BF38F +:105570001188ED1A1E448AF31188DCE7C160C3610B +:10558000009B82600362C0E905111144C0E900007C +:1055900001617047F8B504460D461646302383F383 +:1055A0001188A768A7B1A368013BA36063695A1C6F +:1055B00062611D70D4E904329A4224BFE3686361DA +:1055C000E3690BB120469847002080F3118807E07B +:1055D0003146204601F076F80028E2DA87F3118898 +:1055E000F8BD0000D0E9052310B59A4201D18268C8 +:1055F0007AB982680021013282605A1C82611C786B +:1056000003699A4224BFC368836101F06BF82046A6 +:1056100010BD4FF0FF30FBE72DE9F74F04460E4673 +:1056200017469846D0F81C904FF0300A8AF311883C +:105630004FF0000B154665B12A4631462046FFF76C +:10564000EFFE034660B94146204601F03BF80028D2 +:10565000F1D0002383F31188781B03B0BDE8F08FED +:10566000B9F1000F03D001902046C847019B8BF38E +:105670001188ED1A1E448AF31188DCE70379052BA3 +:1056800005BF836A002001204B6004BF4FF4007304 +:105690000B60704770B55D1E866A04460D44B542C6 +:1056A00005D9436B43F080034363012070BD062599 +:1056B0000571FFF783FC05232371F7E770B55D1EC5 +:1056C000866A04460D44B54205D9436B43F0800316 +:1056D0004363012070BD07250571FFF795FC052385 +:1056E0002371F7E738B505790446052D05D1082360 +:1056F0000371FFF7AFFC257138BD0120FCE7000006 +:105700000323F0B5037185B00446FFF749FA002280 +:1057100020461146FFF78EFA4FF4D57203AB0821ED +:105720002046FFF7A9FA0246B8B901232363039B79 +:10573000C3F30323012B09D103AB37212046FFF725 +:105740009BFA18B9A44B039A1340ABB1204601252C +:10575000FFF758FA0223237137E103AB0022372108 +:105760002046FFF789FA28B99B4A039B1A40002A72 +:1057700000F0A78002232363236B03F00F03022BA7 +:1057800040F0A9806425954E42F2107000F076FF3B +:1057900003AB324601212046FFF758FA0028D5D145 +:1057A000039B002B80F293805A0003D5236B43F0B8 +:1057B00010032363002204F1080302212046FFF7AF +:1057C000B9FA02460028C1D104F13803032120466A +:1057D000FFF752FA0028B9D104F11805A26B09218C +:1057E00020462B46FFF7A6FA0028AFD102ABA26BEA +:1057F00007212046FFF740FA06460028A6D1236B72 +:1058000003F00F03022B40F08F807E227F21284679 +:1058100003F022FA012840F28780E76B42F2107011 +:1058200000F02CFF08234FF4007239462046009602 +:10583000FFF79CFA002889D1384603F05BFA236B06 +:10584000A06203F00F03022B72D103AB644A06215E +:105850002046FFF711FA002871D15F49039B1940D8 +:10586000B1FA81F149092046FFF7ACF902AB4FF4D8 +:10587000007210212046FFF7FFF9054600287FF44B +:1058800065AF554E029B33427FF460AF236B13F03C +:105890000E0F03F00F0273D0022A7FF457AFE36AB2 +:1058A0001978012900F09480022900F093800029E2 +:1058B00000F089804B4F2046FFF7AAF903AB3A4628 +:1058C00076E0114620462263FFF7B4F954E7013D24 +:1058D0007FF45AAF3AE7444D6426444A3E4F012BC9 +:1058E00018BF154603AB002237212046FFF7C4F945 +:1058F00000287FF42BAF039B3B427FF427AF03AB21 +:105900002A4629212046FFF7A1F900287FF41EAF7F +:10591000039B002BFFF648AF013E3FF417AF42F266 +:10592000107000F0ABFEDDE7284603F0B7F986E71C +:105930007E227F212846E66B03F08EF908B900210C +:1059400091E7002340223146204600930623FFF7CB +:105950000DFA0028F3D1B3895BBA9B07EFD5244B2E +:1059600040223146204600930623FFF7FFF9002826 +:10597000E5D1317C01F00F010F3918BF012172E729 +:10598000E36A1978F9B101297FF4E0AE2046FFF708 +:105990003FF903ABA26B37212046FFF76DF90028D2 +:1059A0007FF4D4AE039B33427FF4D0AE03AB02222C +:1059B00006212046FFF760F900287FF4C7AE039B5D +:1059C00033427FF4C3AE05232371284605B0F0BDF2 +:1059D000084F70E7084F6EE708E0FFFD0080FFC04A +:1059E0000001B9030000B7030080FF5000001080E1 +:1059F000F1FFFF800001B7030002B70337B504468B +:105A00000C4D01ABA26B0D212046FFF735F978B99B +:105A1000019B2B420BD1C3F34323042B08D0053B3E +:105A2000022B04D84FF47A7000F028FEE9E7012039 +:105A300003B030BD08E0FFFD70B53023054683F3A9 +:105A4000118803790024022B03D184F311882046A6 +:105A500070BD0423037184F311880226FFF7CEFF83 +:105A600004462846FFF7CEF82E71F0E7FFF730B86E +:105A7000044B03600123037100234363C0E90A332D +:105A8000704700BFFC98000810B53023044683F32C +:105A90001188C162FFF736F802230020237180F3DA +:105AA000118810BD10B53023044683F31188FFF729 +:105AB00053F800230122E362227183F3118810BDA1 +:105AC000026843681143016003B118477047000042 +:105AD0001430FFF721BD00004FF0FF331430FFF703 +:105AE0001BBD00003830FFF797BD00004FF0FF33BB +:105AF0003830FFF791BD00001430FFF7E7BC00001D +:105B00004FF0FF311430FFF7E1BC00003830FFF7F1 +:105B100041BD00004FF0FF323830FFF73BBD0000C1 +:105B2000012914BF6FF0130000207047FFF7D2BAAD +:105B3000044B036000234360C0E902330123037474 +:105B4000704700BF2099000810B53023044683F346 +:105B50001188FFF72FFB02230020237480F31188A4 +:105B600010BD000038B5C36904460D461BB90421B9 +:105B70000844FFF7A5FF294604F11400FFF78AFC4B +:105B8000002806DA201D4FF40061BDE83840FFF719 +:105B900097BF38BD026843681143016003B11847DD +:105BA0007047000013B5406B00F58054D4F8A4385A +:105BB0001A681178042914D1017C022911D11979AC +:105BC000012312898B4013420BD101A94C3002F002 +:105BD00071FFD4F8A4480246019B2179206800F0A7 +:105BE000DFF902B010BD0000143002F0F3BE000077 +:105BF0004FF0FF33143002F0EDBE00004C3002F0E5 +:105C0000C5BF00004FF0FF334C3002F0BFBF0000B3 +:105C1000143002F0C1BE00004FF0FF31143002F02A +:105C2000BBBE00004C3002F091BF00004FF0FF32CD +:105C30004C3002F08BBF00000020704710B500F51B +:105C40008054D4F8A4381A681178042917D1017C3B +:105C5000022914D15979012352898B4013420ED164 +:105C6000143002F053FE024648B1D4F8A4484FF471 +:105C7000407361792068BDE8104000F07FB910BD25 +:105C8000406BFFF7DBBF0000704700007FB5124B91 +:105C900001250426044603600023057400F18402F4 +:105CA00043602946C0E902330C4B02901430019343 +:105CB0004FF44073009602F005FE094B04F694423F +:105CC000294604F14C000294CDE900634FF440737F +:105CD00002F0CCFE04B070BD48990008815C000859 +:105CE000A55B00080A68302383F311880B790B3316 +:105CF00042F823004B79133342F823008B7913B118 +:105D00000B3342F8230000F58053C3F8A418022394 +:105D10000374002080F311887047000038B5037FBA +:105D2000044613B190F85430ABB90125201D02216F +:105D3000FFF730FF04F114006FF00101257700F048 +:105D4000DDFC04F14C0084F854506FF00101BDE813 +:105D5000384000F0D3BC38BD10B5012104460430F2 +:105D6000FFF718FF0023237784F8543010BD00009C +:105D700038B504460025143002F0BCFD04F14C0097 +:105D8000257702F08BFE201D84F854500121FFF787 +:105D900001FF2046BDE83840FFF750BF90F8803043 +:105DA00003F06003202B06D190F881200023212AE4 +:105DB00003D81F2A06D800207047222AFBD1C0E949 +:105DC0001D3303E0034A426707228267C36701204D +:105DD000704700BF4422002037B500F58055D5F844 +:105DE000A4381A68117804291AD1017C022917D124 +:105DF0001979012312898B40134211D100F14C040F +:105E0000204602F00BFF58B101A9204602F052FED5 +:105E1000D5F8A4480246019B2179206800F0C0F81B +:105E200003B030BD01F10B03F0B550F8236085B02D +:105E300004460D46FEB1302383F3118804EB850739 +:105E4000301D0821FFF7A6FEFB6806F14C005B69D8 +:105E50001B681BB1019002F03BFE019803A902F000 +:105E600029FE024648B1039B2946204600F098F8D7 +:105E7000002383F3118805B0F0BDFB685A691268EE +:105E8000002AF5D01B8A013B1340F1D104F18002B6 +:105E9000EAE70000133138B550F82140ECB1302367 +:105EA00083F3118804F58053D3F8A428136852793A +:105EB00003EB8203DB689B695D6845B104216018D0 +:105EC000FFF768FE294604F1140002F029FD204680 +:105ED000FFF7B4FE002383F3118838BD704700003C +:105EE00001F04ABD01234022002110B5044600F80C +:105EF000303BFBF733FF0023C4E9013310BD000042 +:105F000010B53023044683F3118824224160002118 +:105F10000C30FBF723FF204601F050FD0223002048 +:105F2000237080F3118810BD70B500EB8103054626 +:105F300050690E461446DA6018B110220021FBF7B2 +:105F40000DFFA06918B110220021FBF707FF3146B1 +:105F50002846BDE8704001F037BE0000836820226B +:105F6000002103F0011310B5044683601030FBF7E5 +:105F7000F5FE2046BDE8104001F0B2BEF0B40125A8 +:105F800000EB810447898D40E4683D43A469458165 +:105F900023600023A2606360F0BC01F0CFBE00006C +:105FA000F0B4012500EB810407898D40E4683D438E +:105FB0006469058123600023A2606360F0BC01F086 +:105FC00045BF000070B5022300250446242203705B +:105FD0002946C0F888500C3040F8045CFBF7BEFE40 +:105FE000204684F8705001F083FD63681B6823B17C +:105FF00029462046BDE87040184770BD0378052B40 +:1060000010B504460AD080F88C300523037043682D +:106010001B680BB1042198470023A36010BD00004A +:106020000178052906D190F88C20436802701B681E +:1060300003B118477047000070B590F870300446FF +:1060400013B1002380F8703004F18002204601F083 +:106050006BFE63689B68B3B994F8803013F06005F9 +:1060600035D00021204602F05DF90021204602F0E3 +:106070004DF963681B6813B1062120469847062333 +:1060800084F8703070BD204698470028E4D0B4F8FA +:106090008630A26F9A4288BFA36794F98030A56FBB +:1060A000002B4FF0300380F20381002D00F0F280CE +:1060B000092284F8702083F3118800212046D4E956 +:1060C0001D23FFF76DFF002383F31188DAE794F8AF +:1060D000812003F07F0343EA022340F2023293421D +:1060E00000F0C58021D8B3F5807F48D00DD8012BB2 +:1060F0003FD0022B00F09380002BB2D104F1880234 +:1061000062670222A267E367C1E7B3F5817F00F00F +:106110009B80B3F5407FA4D194F88230012BA0D1AD +:10612000B4F8883043F0020332E0B3F5006F4DD08D +:1061300017D8B3F5A06F31D0A3F5C063012B90D869 +:106140006368204694F882205E6894F88310B4F85F +:106150008430B047002884D0436863670368A3672E +:106160001AE0B3F5106F36D040F6024293427FF446 +:1061700078AF5C4B63670223A3670023C3E794F8FF +:106180008230012B7FF46DAFB4F8883023F0020326 +:10619000A4F88830C4E91D55E56778E7B4F8803085 +:1061A000B3F5A06F0ED194F88230204684F88A307F +:1061B00001F0FCFC63681B6813B10121204698477D +:1061C000032323700023C4E91D339CE704F18B03F0 +:1061D00063670123C3E72378042B10D1302383F3B3 +:1061E00011882046FFF7BAFE85F311880321636802 +:1061F00084F88B5021701B680BB12046984794F8A7 +:106200008230002BDED084F88B3004232370636847 +:106210001B68002BD6D0022120469847D2E794F87D +:10622000843020461D0603F00F010AD501F06EFDF3 +:10623000012804D002287FF414AF2B4B9AE72B4B94 +:1062400098E701F055FDF3E794F88230002B7FF4D6 +:1062500008AF94F8843013F00F01B3D01A0620462B +:1062600002D502F077F8ADE702F068F8AAE794F8F3 +:106270008230002B7FF4F5AE94F8843013F00F01D8 +:10628000A0D01B06204602D502F04CF89AE702F097 +:106290003DF897E7142284F8702083F311882B4689 +:1062A0002A4629462046FFF769FE85F31188E9E66C +:1062B0005DB1152284F8702083F3118800212046F7 +:1062C000D4E91D23FFF75AFEFDE60B2284F8702067 +:1062D00083F311882B462A4629462046FFF760FEA5 +:1062E000E3E700BF789900087099000874990008E6 +:1062F00038B590F870300446002B3ED0063BDAB239 +:106300000F2A34D80F2B32D8DFE803F037313108A9 +:10631000223231313131313131313737856FB0F897 +:1063200086309D4214D2C3681B8AB5FBF3F203FB8F +:1063300012556DB9302383F311882B462A4629461E +:10634000FFF72EFE85F311880A2384F870300EE0E3 +:10635000142384F87030302383F3118800232046FF +:106360001A461946FFF70AFE002383F3118838BD49 +:10637000C36F03B198470023E7E70021204601F0EF +:10638000D1FF0021204601F0C1FF63681B6813B1F3 +:106390000621204698470623D7E7000010B590F85D +:1063A00070300446142B29D017D8062B05D001D8FD +:1063B0001BB110BD093B022BFBD80021204601F088 +:1063C000B1FF0021204601F0A1FF63681B6813B1F3 +:1063D000062120469847062319E0152BE9D10B2307 +:1063E00080F87030302383F3118800231A46194651 +:1063F000FFF7D6FD002383F31188DAE7C3689B69B2 +:106400005B68002BD5D1C36F03B19847002384F894 +:106410007030CEE70023826880F8243083691B68DF +:1064200099689142FBD25A680360426010605860DC +:10643000704700000023826880F8243083691B685D +:1064400099689142FBD85A680360426010605860B6 +:106450007047000008B50846302383F3118891F88F +:106460002430032B05D0042B0DD02BB983F31188D6 +:1064700008BD8B6A00221A604FF0FF338362FFF77A +:10648000C9FF0023F2E7D1E9003213605A60F3E755 +:10649000034610B51B68984203D09C688A689442F2 +:1064A000F8D25A680B604A601160596010BD000054 +:1064B000FFF7B0BF064BD96881F82400186802685E +:1064C00053601A600122D86080F82420F9F79ABF3F +:1064D000684600200C4B30B5DD684B1C87B0044685 +:1064E0000FD02B46094A684600F09CF92046FFF77A +:1064F000E1FF009B13B1684600F09EF9A86A07B05F +:1065000030BDFFF7D7FFF9E7684600205564000863 +:10651000044B1A68DB6890689B68984294BF00201F +:106520000120704768460020094B10B51C68D868E8 +:10653000226853601A600122DC6084F82420FFF78F +:1065400079FF01462046BDE81040F9F75BBF00BF68 +:1065500068460020044B1A68DB6892689B689A4280 +:1065600001D9FFF7E1BF70476846002038B5012325 +:10657000084C00252370656002F0EAFB02F010FC75 +:106580000549064802F0E6FC0223237085F31188D2 +:1065900038BD00BF104900208099000868460020DF +:1065A00000F080B9034A516853685B1A9842FBD8DF +:1065B000704700BF001000E08B604B630023CA618E +:1065C00000F128020B6302230A618B840123886196 +:1065D00081F8263001F11003C26A4A611360C36278 +:1065E00001F12C030846CB6270470000D0E901316D +:1065F000026841F8183CA1F19C033839CB6003696B +:1066000041F8243C436941F8203C034B41F8043CE9 +:10661000C3680248FFF7D0BF1D0400086846002089 +:1066200008B5FFF7E3FFBDE80840FFF741BF0000F2 +:1066300038B50E4BDC6804F12C05A062E06AA84274 +:106640000FD194F826303BB994F825309B0702BF50 +:10665000D4E9043213605A600F20BDE83840FFF7D8 +:1066600029BF0368E362FFF723FFE7E768460020DE +:10667000302383F31188FFF7DBBF000008B5014624 +:10668000302383F311880820FFF724FF002383F3CE +:10669000118808BD054BDB6821B1036098620320B7 +:1066A000FFF718BF4FF0FF30704700BF684600206B +:1066B00003682BB10022026018469962FFF7F8BE0A +:1066C00070470000064BDB6839B1426818605A60B9 +:1066D000136043600420FFF7FDBE4FF0FF307047AA +:1066E000684600200368984206D01A68026050602D +:1066F00018469962FFF7DCBE7047000038B50446C3 +:106700000D462068844200D138BD036823605C6078 +:106710008562FFF7CDFEF4E7036810B59C68A242DE +:106720000CD85C688A600B604C6021605960996885 +:106730008A1A9A604FF0FF33836010BD121B1B68EA +:10674000ECE700000A2938BF0A2170B504460D465F +:106750000A26601902F0F6FA02F0DEFA041BA542DE +:1067600003D8751C04462E46F3E70A2E04D90120EF +:10677000BDE8704002F0B6BC70BD0000F8B5144B27 +:106780000D460A2A4FF00A07D96103F11001826011 +:1067900038BF0A22416019691446016048601861D7 +:1067A000A81802F0BFFA02F0B7FA431B0646A3424C +:1067B00006D37C1C28192746354602F0C3FAF2E7B7 +:1067C0000A2F04D90120BDE8F84002F08BBCF8BDC7 +:1067D00068460020F8B506460D4602F09DFA0F4ABD +:1067E000134653F8107F9F4206D12A460146304691 +:1067F000BDE8F840FFF7C2BFD169BB68441A2C1945 +:1068000028BF2C46A34202D92946FFF79BFF224608 +:1068100031460348BDE8F840FFF77EBF68460020D8 +:1068200078460020C0E90323002310B45DF8044B30 +:106830004361FFF7CFBF000010B5194C23699842A0 +:106840000DD08168D0E9003213605A609A680A441A +:106850009A60002303604FF0FF33A36110BD02680C +:10686000234643F8102F53600022026022699A42A7 +:1068700003D1BDE8104002F05FBA936881680B4411 +:10688000936002F049FA2269E1699268441AA242CF +:10689000E4D91144BDE81040091AFFF753BF00BF07 +:1068A000684600202DE9F047DFF8BC8008F11007AA +:1068B0002C4ED8F8105002F02FFAD8F81C40AA68D5 +:1068C000031B9A423ED814444FF00009D5E9003228 +:1068D000C8F81C4013605A60C5F80090D8F8103012 +:1068E000B34201D102F028FA89F31188D5E90331C6 +:1068F00028469847302383F311886B69002BD8D042 +:1069000002F00AFA6A69A0EB040982464A450DD2F0 +:10691000022002F0E7FB0022D8F81030B34208D181 +:1069200051462846BDE8F047FFF728BF121A224417 +:10693000F2E712EB09092946384638BF4A46FFF705 +:10694000EBFEB5E7D8F81030B34208D01444C8F8CD +:106950001C00211AA960BDE8F047FFF7F3BEBDE8AF +:10696000F08700BF784600206846002038B502F066 +:10697000D3F9054AD2E90845031B181945F100016E +:10698000C2E9080138BD00BF6846002010B560B9F3 +:10699000074804790368053C9B6818BF01249847A1 +:1069A00008B144F00404204610BD0124FBE700BFF9 +:1069B000C8360020FFF7EABF2DE9F04788461746A2 +:1069C0009A460446B0B90D4E3579052D05D00324FD +:1069D0000DE0013D15F0FF050ED0326853463946F3 +:1069E0003046D2F814904246C8470028F1D12046DC +:1069F000BDE8F0870424FAE70124F8E7C836002050 +:106A00002DE9F047884617469A460446B0B90D4E20 +:106A10003579052D05D003240DE0013D15F0FF0566 +:106A20000ED03268534639463046D2F81890424666 +:106A3000C8470028F1D12046BDE8F0870424FAE7D2 +:106A40000124F8E7C836002037B50C46154670B962 +:106A500051B101290BD10748694603681B6A984761 +:106A600010B9019B04462B60204603B030BD0424BE +:106A7000FAE700BFC836002000207047FEE700009C +:106A8000704700004FF0FF30704700004B684360D4 +:106A90008B688360CB68C3600B6943614B69036299 +:106AA0008B6943620B6803607047000008B53C4B7C +:106AB00040F2FF713B48D3F888200A43C3F888208E +:106AC000D3F8882022F4FF6222F00702C3F888205E +:106AD000D3F88820D3F8E0200A43C3F8E020D3F8A5 +:106AE00008210A43C3F808212F4AD3F80831114678 +:106AF000FFF7CCFF00F5806002F11C01FFF7C6FF35 +:106B000000F5806002F13801FFF7C0FF00F58060FA +:106B100002F15401FFF7BAFF00F5806002F1700145 +:106B2000FFF7B4FF00F5806002F18C01FFF7AEFFC4 +:106B300000F5806002F1A801FFF7A8FF00F5806072 +:106B400002F1C401FFF7A2FF00F5806002F1E0014D +:106B5000FFF79CFF00F5806002F1FC01FFF796FF54 +:106B600002F58C7100F58060FFF790FF01F08AFC60 +:106B70000E4BD3F8902242F00102C3F89022D3F8D2 +:106B8000942242F00102C3F894220522C3F898200F +:106B90004FF06052C3F89C20054AC3F8A02008BDFE +:106BA00000440258000002589499000800ED00E0EB +:106BB0001F00080308B501F071FEFFF7D7FC104B6A +:106BC000D3F8DC2042F04002C3F8DC20D3F80421E3 +:106BD00022F04002C3F80421D3F80431094B1A68AB +:106BE00042F008021A601A6842F004021A6000F0CB +:106BF00077FD00F037FBBDE8084000F0B5B800BFF6 +:106C000000440258001802480120704700207047D5 +:106C10007047000002290CD0032904D0012907483D +:106C200018BF00207047032A05D8054800EBC200B2 +:106C30007047044870470020704700BF949B0008CD +:106C400054220020489B000870B59AB005460846BB +:106C5000144601A900F0C2F801A8FBF777F8431C1D +:106C60000022C6B25B001046C5E90034237003233E +:106C7000023404F8013C01ABD1B202348E4201D897 +:106C80001AB070BD13F8011B013204F8010C04F8AE +:106C9000021CF1E708B5302383F311880348FFF79E +:106CA0009BF8002383F3118808BD00BF184900201A +:106CB00090F8803003F01F02012A07D190F881205C +:106CC0000B2A03D10023C0E91D3315E003F0600354 +:106CD000202B08D1B0F884302BB990F88120212ADC +:106CE00003D81F2A04D8FFF759B8222AEBD0FAE7B5 +:106CF000034A426707228267C3670120704700BFCB +:106D00004B22002007B5052917D8DFE801F0191636 +:106D100003191920302383F31188104A01210190AF +:106D2000FFF702F9019802210D4AFFF7FDF80D481F +:106D3000FFF71EF8002383F3118803B05DF804FB0E +:106D4000302383F311880748FEF7E8FFF2E730238A +:106D500083F311880348FEF7FFFFEBE7E89A00088A +:106D60000C9B00081849002038B50C4D0C4C2A46E5 +:106D70000C4904F10800FFF767FF05F1CA0204F1AE +:106D800010000949FFF760FF05F5CA7204F1180009 +:106D90000649BDE83840FFF757BF00BFF06100204B +:106DA00054220020C89A0008D29A0008DD9A0008F0 +:106DB00070B5044608460D46FAF7C8FFC6B220462D +:106DC000013403780BB9184670BD32462946FAF7EC +:106DD000A9FF0028F3D10120F6E700002DE9F84FC4 +:106DE00005460C46FAF7B2FF2D49C6B22846FFF712 +:106DF000DFFF08B10436F6B22A492846FFF7D8FF6C +:106E000008B11036F6B2632E0DD8DFF89490DFF893 +:106E100094A0DFF89C80DFF89CB0234F2E7846B911 +:106E20002670BDE8F88F29462046BDE8F84F02F0ED +:106E300003BA252E30D1072249462846FAF772FFB9 +:106E400070B93B6807350B3444F80B3C7B6844F859 +:106E5000073C3B8924F8033CBB7A04F8013CDDE79E +:106E6000082251462846FAF75DFFA8B9A21C0F4B2D +:106E700019780232090911F8081002F8041C13F8F5 +:106E8000011B01F00F015B4511F8081002F8031C0B +:106E9000EED118340835C1E7013504F8016BBDE7C0 +:106EA000B49B0008DD9A0008BC9B000800E8F11FB5 +:106EB000C89B00080CE8F11FBFF34F8F044B1A6901 +:106EC0005107FCD1D3F810215207F8D1704700BF09 +:106ED0000020005208B50D4B1B78ABB9FFF7ECFF53 +:106EE0000B4BDA68D10704D50A4A5A6002F188329E +:106EF0005A60D3F80C21D20706D5064AC3F80421FC +:106F000002F18832C3F8042108BD00BF4E6400209E +:106F1000002000522301674508B5114B1B78F3B9D7 +:106F2000104B1A69510703D5DA6842F04002DA6063 +:106F3000D3F81021520705D5D3F80C2142F04002B6 +:106F4000C3F80C21FFF7B8FF064BDA6842F00102E4 +:106F5000DA60D3F80C2142F00102C3F80C2108BD1D +:106F60004E640020002000520F289ABF00F5806078 +:106F700040040020704700004FF4003070470000CC +:106F8000102070470F2808B50BD8FFF7EDFF00F56C +:106F900000330268013204D104308342F9D1012068 +:106FA00008BD0020FCE700000F2838B505463FD893 +:106FB000FFF782FF1F4CFFF78DFF4FF0FF330728CD +:106FC0006361C4F814311DD82361FFF775FF030214 +:106FD00043F02403E360E36843F08003E360236944 +:106FE0005A07FCD42846FFF767FFFFF7BDFF4FF4B1 +:106FF000003100F0AFFA2846FFF78EFFBDE83840B9 +:10700000FFF7C0BFC4F81031FFF756FFA0F1080327 +:107010001B0243F02403C4F80C31D4F80C3143F0C4 +:107020008003C4F80C31D4F810315B07FBD4D9E7E6 +:10703000002038BD002000522DE9F84F05460C46CF +:10704000104645EA0203DE0602D00020BDE8F88FB4 +:1070500020F01F00DFF8BCB0DFF8BCA0FFF73AFF5C +:1070600004EB0008444503D10120FFF755FFEDE78D +:1070700020222946204602F0A7F810B920352034F6 +:10708000F0E72B4605F120021F68791CDDD104339F +:107090009A42F9D105F178431B481C4EB3F5801F85 +:1070A0001B4B38BF184603F1F80332BFD946D1460F +:1070B0001E46FFF701FF0760A5EB040C336804F1DF +:1070C0001C0143F002033360231FD9F8007017F04E +:1070D0000507FAD153F8042F8B424CF80320F4D162 +:1070E000BFF34F8FFFF7E8FE4FF0FF33202221461A +:1070F00003602846336823F00203336002F064F82B +:107100000028BBD03846B0E7142100520C200052B2 +:1071100014200052102000521021005210B5084CCB +:10712000237828B11BB9FFF7D5FE0123237010BDCA +:10713000002BFCD02070BDE81040FFF7EDBE00BF73 +:107140004E6400202DE9F04F0D4685B0814658B1C0 +:1071500011F00D0614BF2022082211F0080301933C +:1071600004D0431E034269D0002435E0002E37D0FE +:1071700009F11F0121F01F094FF00108314F05F0FF +:107180000403DFF8CCA005EA080BBBF1000F32D0F6 +:107190007869C0072FD408F101080C37B8F1060F41 +:1071A000F3D19EB9284D4946A819019201F01AFE63 +:1071B0000446002839D12036019AA02EF3D1494641 +:1071C00001F010FE044600282FD1019A49461F48BD +:1071D00001F008FE044660BB204605B0BDE8F08F14 +:1071E0000029C9D101462846029201F0FBFD044660 +:1071F000D8B9029AC0E713B178694107CBD5AC077B +:1072000002D578698007C6D5019911B1786901075F +:10721000C1D549460AEB4810CDE9022301F0E2FD51 +:107220000446DDE902230028B5D04A460021204665 +:1072300001E04A460021FAF791FDCDE70246002E13 +:1072400096D199E7DC9B00089064002050640020F0 +:10725000706400200021FFF775BF00000121FFF7D7 +:1072600071BF000070B5144D0124144E40F2FF327E +:1072700000210120FAF772FD06EB441001342A695F +:1072800055F80C1F01F09AFD062CF5D137254FF467 +:10729000C0542046FFF7E2FF014628B122460848C5 +:1072A000BDE8704001F08ABDC4EBC404013D4FEA63 +:1072B000D404EED170BD00BFDC9B000870640020D8 +:1072C000506400200421FFF73DBF00004843FFF752 +:1072D000C1BF000008B101F0F7BD7047B0F5805F95 +:1072E00010B5044607D8FFF7EDFF28B92046BDE8E2 +:1072F0001040FFF7AFBF002010BD0000FFF7EABF4E +:1073000070B5AAB140EA010313F01F030FD1094C75 +:107310000144A5686D0706D52568A84203D36668B1 +:107320003544A94204D903330C34122BF1D1002285 +:10733000104670BDDC9B000808B501F0DBFE034A77 +:10734000D2E90032C01842EB010108BD30650020CF +:10735000434BD3E900232DE9F34113437CD0FFF7DE +:10736000EBFF404A00230027F9F766F806460D4672 +:107370003D4A0023F9F760F80023144630462946B9 +:10738000394AF9F759F84FF461613C23ADF80170BF +:10739000B4FBF1F5B4FBF3F601FB154103FB164614 +:1073A0004624B1FBF3F1314BF6B28DF80040984220 +:1073B0003CD84FF0640C4FF4C87EA30704F26C7203 +:1073C00025D1B2FBFCF30CFB132313BBB2FBFEF382 +:1073D0000EFB1322B2FA82F35B0903F26D18621CF2 +:1073E0008045D2B217D90FB18DF800400022204C51 +:1073F0004FF00C0C17460CFB0343D4B2013213F8C8 +:1074000004C084450CD8A0EB0C000127F5E700234D +:10741000E3E70123E1E7A0EB080014460127CCE7EE +:107420000FB18DF80140431C8DF802309DF801002A +:10743000431C9DF800005038400640EA43509DF838 +:10744000023040EA034040EA560040EAC52040EAE4 +:10745000411002B0BDE8F0814FF40410F9E700BF1D +:107460003065002040420F008051010090230B0046 +:10747000249C00080244074BD2B210B5904200D1C0 +:1074800010BD441C00B253F8200041F8040BE0B2D8 +:10749000F4E700BF504000580E4B30B51C6F240479 +:1074A00005D41C6F1C671C6F44F400441C670A4C15 +:1074B00002442368D2B243F480732360074B9042A6 +:1074C00000D130BD441C51F8045B00B243F8205099 +:1074D000E0B2F4E700440258004802585040005817 +:1074E00007B5012201A90020FFF7C4FF019803B0EE +:1074F0005DF804FB13B50446FFF7F2FFA04205D088 +:10750000012201A900200194FFF7C6FF02B010BDBF +:1075100010B56424013C4FF47A70FFF7AFF814F013 +:10752000FF04F7D10A4B102214249A614FF48062B1 +:107530009A61A3F580534FF400529A61013C4FF4D5 +:107540007A70FFF79BF814F0FF04F7D110BD00BF6D +:10755000001802580144BFF34F8F064B884204D3F2 +:10756000BFF34F8FBFF36F8F7047C3F85C022030BB +:10757000F4E700BF00ED00E00144BFF34F8F064B7E +:10758000884204D3BFF34F8FBFF36F8F7047C3F8A8 +:1075900070022030F4E700BF00ED00E070B5054652 +:1075A00016460C4601201021FFF790FE2860467316 +:1075B0003CB1204636B1FFF785FE2B68186000B15C +:1075C0009C6070BDFFF74AFEF7E70000F8B50F4674 +:1075D0001546044648B905F11F010126386821F017 +:1075E0001F01FFF7B7FF3046F8BD427B29463868D8 +:1075F000FFF786FE06460028EDD13B686360A3686E +:10760000AB4210D213B12068FFF764FE637B2846BB +:107610002BB1FFF757FE206020B9A060E3E7FFF72A +:107620001DFEF8E7A560206805F11F01012621F085 +:107630001F013860FFF78EFF2673D4E710B50446AC +:1076400040B10068884205D1606808B1FAF760FB74 +:107650000023237310BD0000F8B50F4614460546FD +:1076600048B904F11F010126386821F01F01FFF716 +:1076700083FF3046F8BD427B21463868FFF740FE65 +:1076800006460028EDD1AB68A34210D213B128689A +:10769000FFF720FE6B7B20462BB1FFF713FE28601F +:1076A00020B9A860E5E7FFF7D9FDF8E7AC603968D5 +:1076B00019B122462868FAF72BFB286804F11F014C +:1076C000012621F01F013860FFF756FF2E73D0E727 +:1076D00020B103688B4204BF00230373704700008E +:1076E000034B1A681AB9034AD2F8D0241A607047BB +:1076F000386500200040025808B5FFF7F1FF024B43 +:107700001868C0F3806008BD38650020EFF3098376 +:10771000054968334A6B22F001024A6383F3098802 +:10772000002383F31188704700EF00E0302080F3DE +:10773000118862B60D4B0E4AD96821F4E061090444 +:10774000090C0A430B49DA60D3F8FC2042F080723E +:10775000C3F8FC20084AC2F8B01F116841F00101CB +:1077600011602022DA7783F82200704700ED00E0F4 +:107770000003FA0555CEACC5001000E0302310B56B +:1077800083F311880E4B5B6813F4006314D0F1EEA1 +:10779000103AEFF309844FF08073683CE361094BC2 +:1077A000DB6B236684F30988FEF7B2FE10B1064B4B +:1077B000A36110BD054BFBE783F31188F9E700BF18 +:1077C00000ED00E000EF00E02F04000832040008A4 +:1077D00070B5BFF34F8FBFF36F8F1A4A0021C2F805 +:1077E0005012BFF34F8FBFF36F8F536943F40033D1 +:1077F0005361BFF34F8FBFF36F8FC2F88410BFF395 +:107800004F8FD2F8803043F6E074C3F3C900C3F35E +:107810004E335B0103EA0406014646EA81750139ED +:10782000C2F86052F9D2203B13F1200FF2D1BFF31E +:107830004F8F536943F480335361BFF34F8FBFF3CE +:107840006F8F70BD00ED00E0FEE70000214B224885 +:10785000224A70B5904237D3214BC11EDA1C121A4E +:1078600022F003028B4238BF00220021FAF776FA99 +:107870001C4A0023C2F88430BFF34F8FD2F8803007 +:1078800043F6E074C3F3C900C3F34E335B0103EA6C +:107890000406014646EA81750139C2F86C52F9D2F4 +:1078A000203B13F1200FF2D1BFF34F8FBFF36F8F47 +:1078B000BFF34F8FBFF36F8F0023C2F85032BFF377 +:1078C0004F8FBFF36F8F70BD53F8041B40F8041B3C +:1078D000C0E700BF2C9D00083467002034670020FB +:1078E0003467002000ED00E0074BD3F8D81021EA00 +:1078F0000001C3F8D810D3F8002122EA0002C3F82F +:107900000021D3F8003170470044025870B5D0E927 +:10791000244300224FF0FF359E6804EB42135101CF +:10792000D3F80009002805DAD3F8000940F08040B8 +:10793000C3F80009D3F8000B002805DAD3F8000BD0 +:1079400040F08040C3F8000B013263189642C3F840 +:107950000859C3F8085BE0D24FF00113C4F81C3893 +:1079600070BD0000890141F02001016103699B069F +:10797000FCD41220FEF716BE10B50A4C2046FEF7C6 +:10798000B1FA094BC4F89030084BC4F89430084C55 +:107990002046FEF7A7FA074BC4F89030064BC4F810 +:1079A000943010BD3C65002000000840609C000839 +:1079B000D8650020000004406C9C000870B5037876 +:1079C0000546012B5CD1434BD0F89040984258D1EA +:1079D000414B0E216520D3F8D82042F00062C3F855 +:1079E000D820D3F8002142F00062C3F80021D3F878 +:1079F0000021D3F8802042F00062C3F88020D3F841 +:107A0000802022F00062C3F88020D3F88030FDF798 +:107A1000ADFC324BE360324BC4F800380023D5F89C +:107A20009060C4F8003EC02323604FF40413A363A6 +:107A30003369002BFCDA01230C203361FEF7B2FD21 +:107A40003369DB07FCD41220FEF7ACFD3369002B51 +:107A5000FCDA00262846A660FFF758FF6B68C4F8DA +:107A60001068DB68C4F81468C4F81C6883BB1D4B3D +:107A7000A3614FF0FF336361A36843F00103A36088 +:107A800070BD194B9842C9D1134B4FF08060D3F8A9 +:107A9000D82042F00072C3F8D820D3F8002142F079 +:107AA0000072C3F80021D3F80021D3F8802042F0FF +:107AB0000072C3F88020D3F8802022F00072C3F84F +:107AC0008020D3F88030FFF70FFF0E214D209EE776 +:107AD000064BCDE73C6500200044025840140040AE +:107AE00003002002003C30C0D8650020083C30C0B4 +:107AF000F8B5D0F89040054600214FF000662046CA +:107B0000FFF730FFD5F8941000234FF001128F6873 +:107B10004FF0FF30C4F83438C4F81C2804EB43128B +:107B200001339F42C2F80069C2F8006BC2F808092D +:107B3000C2F8080BF2D20B68D5F89020C5F898303F +:107B4000636210231361166916F01006FBD1122030 +:107B5000FEF728FDD4F8003823F4FE63C4F800389B +:107B6000A36943F4402343F01003A3610923C4F83D +:107B70001038C4F814380B4BEB604FF0C043C4F816 +:107B8000103B094BC4F8003BC4F81069C4F8003935 +:107B9000D5F8983003F1100243F48013C5F898200B +:107BA000A362F8BD3C9C000840800010D0F89020F3 +:107BB00090F88A10D2F8003823F4FE6343EA0113E8 +:107BC000C2F80038704700002DE9F84300EB81034C +:107BD000D0F890500C468046DA680FFA81F94801D7 +:107BE000166806F00306731E022B05EB41134FF0D7 +:107BF000000194BFB604384EC3F8101B4FF00101CA +:107C000004F1100398BF06F1805601FA03F391695D +:107C100098BF06F5004600293AD0578A04F158016A +:107C2000374349016F50D5F81C180B430021C5F8A4 +:107C30001C382B180127C3F81019A7405369611E7F +:107C40009BB3138A928B9B08012A88BF5343D8F8B1 +:107C50009820981842EA034301F140022146C8F8EF +:107C60009800284605EB82025360FFF77BFE08EB85 +:107C70008900C3681B8A43EA845348341E43640165 +:107C80002E51D5F81C381F43C5F81C78BDE8F88381 +:107C900005EB4917D7F8001B21F40041C7F8001B7A +:107CA000D5F81C1821EA0303C0E704F13F030B4A8F +:107CB0002846214605EB83035A60FFF753FE05EB88 +:107CC0004910D0F8003923F40043C0F80039D5F842 +:107CD0001C3823EA0707D7E70080001000040002E1 +:107CE000D0F894201268C0F89820FFF70FBE00006B +:107CF0005831D0F8903049015B5813F4004004D05B +:107D000013F4001F0CBF0220012070474831D0F847 +:107D1000903049015B5813F4004004D013F4001F65 +:107D20000CBF02200120704700EB8101CB68196A6B +:107D30000B6813604B6853607047000000EB8103D1 +:107D400030B5DD68AA691368D36019B9402B84BFC8 +:107D5000402313606B8A1468D0F890201C4402EB17 +:107D60004110013C09B2B4FBF3F46343033323F045 +:107D7000030343EAC44343F0C043C0F8103B2B68FD +:107D800003F00303012B0ED1D2F8083802EB4110A7 +:107D900013F4807FD0F8003B14BF43F0805343F0CE +:107DA0000053C0F8003B02EB4112D2F8003B43F015 +:107DB0000443C2F8003B30BD2DE9F041D0F890609B +:107DC00005460C4606EB4113D3F8087B3A07C3F887 +:107DD000087B08D5D6F814381B0704D500EB8103BF +:107DE000DB685B689847FA071FD5D6F81438DB07BD +:107DF0001BD505EB8403D968CCB98B69488A5A68CE +:107E0000B2FBF0F600FB16228AB91868DA689042D5 +:107E10000DD2121AC3E90024302383F311882146BE +:107E20002846FFF78BFF84F31188BDE8F08101231A +:107E300003FA04F26B8923EA02036B81CB68002BFF +:107E4000F3D021462846BDE8F041184700EB8103F6 +:107E50004A0170B5DD68D0F890306C692668E6603C +:107E600056BB1A444FF40020C2F810092A6802F0E9 +:107E70000302012A0AB20ED1D3F8080803EB421418 +:107E800010F4807FD4F8000914BF40F0805040F017 +:107E90000050C4F8000903EB4212D2F8000940F088 +:107EA0000440C2F800090122D3F8340802FA01F1B3 +:107EB0000143C3F8341870BD19B9402E84BF402067 +:107EC000206020681A442E8A8419013CB4FBF6F421 +:107ED00040EAC44040F00050C6E700002DE9F843F6 +:107EE000D0F8906005460C464F0106EB4113D3F8DD +:107EF000088918F0010FC3F808891CD0D6F810388B +:107F0000DB0718D500EB8103D3F80CC0DCF8143084 +:107F1000D3F800E0DA68964530D2A2EB0E024FF0BB +:107F200000091A60C3F80490302383F31188FFF727 +:107F30008DFF89F3118818F0800F1DD0D6F83438E2 +:107F40000126A640334217D005EB84030134D5F84F +:107F50009050D3F80CC0E4B22F44DCF8142005EBA9 +:107F60000434D2F800E05168714514D3D5F83438A0 +:107F700023EA0606C5F83468BDE8F883012303FA4E +:107F800001F2038923EA02030381DCF80830002BA5 +:107F9000D1D09847CFE7AEEB0103BCF81000834285 +:107FA00028BF0346D7F8180980B2B3EB800FE3D897 +:107FB0009068A0F1040959F8048FC4F80080A0EB80 +:107FC00009089844B8F1040FF5D818440B449060A0 +:107FD0005360C8E72DE9F84FD0F8905004466E6919 +:107FE000AB691E4016F480586E6103D0BDE8F84FAF +:107FF000FDF7E8BF002E12DAD5F8003E9B0705D04A +:10800000D5F8003E23F00303C5F8003ED5F8043848 +:10801000204623F00103C5F80438FEF701F83705C0 +:1080200005D52046FFF772FC2046FDF7E7FFB004B8 +:108030000CD5D5F8083813F0060FEB6823F470530D +:108040000CBF43F4105343F4A053EB6031071BD52E +:108050006368DB681BB9AB6923F00803AB61237865 +:10806000052B0CD1D5F8003E9A0705D0D5F8003E77 +:1080700023F00303C5F8003E2046FDF7D1FF6368F7 +:10808000DB680BB120469847F30200F1BA80B702D3 +:1080900026D5D4F8909000274FF0010A09EB47123B +:1080A000D2F8003B03F44023B3F5802F11D1D2F86E +:1080B000003B002B0DDA62890AFA07F322EA030378 +:1080C000638104EB8703DB68DB6813B13946204624 +:1080D00098470137D4F89430FFB29B689F42DDD9AE +:1080E000F00619D5D4F89000026AC2F30A1702F01C +:1080F0000F0302F4F012B2F5802F00F0CA80B2F53F +:10810000402F09D104EB8303002200F58050DB6887 +:108110001B6A974240F0B0803003D5F8185835D527 +:10812000E90303D500212046FFF746FEAA0303D545 +:1081300001212046FFF740FE6B0303D502212046B4 +:10814000FFF73AFE2F0303D503212046FFF734FE45 +:10815000E80203D504212046FFF72EFEA90203D52D +:1081600005212046FFF728FE6A0203D50621204696 +:10817000FFF722FE2B0203D507212046FFF71CFE46 +:10818000EF0103D508212046FFF716FE700340F1EA +:10819000A780E90703D500212046FFF79FFEAA0725 +:1081A00003D501212046FFF799FE6B0703D5022175 +:1081B0002046FFF793FE2F0703D503212046FFF744 +:1081C0008DFEEE0603D504212046FFF787FEA806A4 +:1081D00003D505212046FFF781FE690603D5062158 +:1081E0002046FFF77BFE2A0603D507212046FFF72E +:1081F00075FEEB0574D520460821BDE8F84FFFF762 +:108200006DBED4F890904FF0000B4FF0010AD4F8F7 +:1082100094305FFA8BF79B689F423FF638AF09EBCB +:108220004713D3F8002902F44022B2F5802F20D161 +:10823000D3F80029002A1CDAD3F8002942F0904232 +:10824000C3F80029D3F80029002AFBDB3946D4F80B +:108250009000FFF787FB22890AFA07F322EA03035B +:10826000238104EB8703DB689B6813B13946204602 +:1082700098470BF1010BCAE7910701D1D0F80080B4 +:10828000072A02F101029CBF03F8018B4FEA18286C +:108290003FE704EB830300F58050DA68D2F818C09A +:1082A000DCF80820DCE9001CA1EB0C0C00218F425B +:1082B00008D1DB689B699A683A449A605A683A44E4 +:1082C0005A6029E711F0030F01D1D0F800808C45E6 +:1082D00001F1010184BF02F8018B4FEA1828E6E79B +:1082E000BDE8F88F08B50348FFF774FEBDE8084005 +:1082F000FFF744BA3C65002008B50348FFF76AFE63 +:10830000BDE80840FFF73ABAD8650020D0F89030B1 +:1083100003EB4111D1F8003B43F40013C1F8003BDB +:1083200070470000D0F8903003EB4111D1F80039CC +:1083300043F40013C1F8003970470000D0F89030C2 +:1083400003EB4111D1F8003B23F40013C1F8003BCB +:1083500070470000D0F8903003EB4111D1F800399C +:1083600023F40013C1F8003970470000064BD3F81E +:10837000DC200243C3F8DC20D3F804211043C3F807 +:108380000401D3F8043170470044025808B53C4B4F +:108390004FF0FF31D3F8802062F00042C3F8802014 +:1083A000D3F8802002F00042C3F88020D3F8802068 +:1083B000D3F88420C3F88410D3F884200022C3F8B3 +:1083C0008420D3F88400D86F40F0FF4040F4FF00D1 +:1083D00040F4DF4040F07F00D867D86F20F0FF40C6 +:1083E00020F4FF0020F4DF4020F07F00D867D86F32 +:1083F000D3F888006FEA40506FEA5050C3F8880005 +:10840000D3F88800C0F30A00C3F88800D3F88800C6 +:10841000D3F89000C3F89010D3F89000C3F89020E0 +:10842000D3F89000D3F89400C3F89410D3F89400D4 +:10843000C3F89420D3F89400D3F89800C3F89810A8 +:10844000D3F89800C3F89820D3F89800D3F88C009C +:10845000C3F88C10D3F88C00C3F88C20D3F88C00B0 +:10846000D3F89C00C3F89C10D3F89C10C3F89C2050 +:10847000D3F89C30FCF728FABDE8084000F0D6B9E4 +:108480000044025808B50122534BC3F80821534B4E +:10849000D3F8F42042F00202C3F8F420D3F81C21F0 +:1084A00042F00202C3F81C210222D3F81C314C4BCB +:1084B000DA605A689104FCD54A4A1A6001229A602F +:1084C000494ADA6000221A614FF440429A61444BF3 +:1084D0009A699204FCD51A6842F480721A603F4B84 +:1084E0001A6F12F4407F04D04FF480321A670022D2 +:1084F0001A671A6842F001021A60384B1A6850076E +:10850000FCD500221A611A6912F03802FBD1012150 +:1085100019604FF0804159605A67344ADA62344A30 +:108520001A611A6842F480321A602C4B1A6891035F +:10853000FCD51A6842F480521A601A689204FCD57D +:108540002C4A2D499A6200225A63196301F57C0175 +:10855000DA6301F2E71199635A64284A1A64284AD7 +:10856000DA621A6842F0A8521A601C4B1A6802F0CC +:108570002852B2F1285FF9D148229A614FF48862FB +:10858000DA6140221A621F4ADA641F4A1A651F4ADA +:108590005A651F4A9A6532231E4A1360136803F016 +:1085A0000F03022BFAD10D4A136943F00303136141 +:1085B000136903F03803182BFAD14FF00050FFF77E +:1085C000D5FE4FF08040FFF7D1FE4FF00040BDE8F0 +:1085D0000840FFF7CBBE00BF0080005100440258A6 +:1085E0000048025800C000F0020000010000FF0136 +:1085F000008890082220400063020901470E050808 +:10860000DD0BBF0120000020000001100910E00078 +:1086100000010110002000524FF0B04208B5D2F81E +:10862000883003F00103C2F8883023B1044A13688C +:108630000BB150689847BDE80840FFF79FB800BFEE +:10864000B46600204FF0B04208B5D2F8883003F08D +:108650000203C2F8883023B1044A93680BB1D06892 +:108660009847BDE80840FFF789B800BFB46600200E +:108670004FF0B04208B5D2F8883003F00403C2F8D6 +:10868000883023B1044A13690BB150699847BDE89B +:108690000840FFF773B800BFB46600204FF0B04247 +:1086A00008B5D2F8883003F00803C2F8883023B147 +:1086B000044A93690BB1D0699847BDE80840FFF7B9 +:1086C0005DB800BFB46600204FF0B04208B5D2F8E4 +:1086D000883003F01003C2F8883023B1044A136ACB +:1086E0000BB1506A9847BDE80840FFF747B800BF94 +:1086F000B46600204FF0B04310B5D3F8884004F4BE +:108700007872C3F88820A30604D5124A936A0BB185 +:10871000D06A9847600604D50E4A136B0BB1506BB4 +:108720009847210604D50B4A936B0BB1D06B984741 +:10873000E20504D5074A136C0BB1506C9847A305AA +:1087400004D5044A936C0BB1D06C9847BDE8104037 +:10875000FFF714B8B46600204FF0B04310B5D3F85B +:10876000884004F47C42C3F88820620504D5164A88 +:10877000136D0BB1506D9847230504D5124A936DC4 +:108780000BB1D06D9847E00404D50F4A136E0BB1BE +:10879000506E9847A10404D50B4A936E0BB1D06E6E +:1087A0009847620404D5084A136F0BB1506F98477D +:1087B000230404D5044A936F0BB1D06F9847BDE8EA +:1087C0001040FEF7DBBF00BFB466002008B50348C9 +:1087D000FCF742FCBDE80840FEF7D0BFC8360020D9 +:1087E00008B50348FCF73CFDBDE80840FEF7C6BFEE +:1087F0002039002008B50348FCF732FDBDE80840E9 +:10880000FEF7BCBF8C39002008B50348FCF728FDF3 +:10881000BDE80840FEF7B2BFF839002008B500F007 +:10882000BDFCBDE80840FEF7A9BF0000062108B561 +:108830000846FCF79BFD06210720FCF797FD062163 +:108840000820FCF793FD06210920FCF78FFD062187 +:108850000A20FCF78BFD06211720FCF787FD062177 +:108860002820FCF783FD09217A20FCF77FFD0921F0 +:108870007C20FCF77BFD07213220FCF777FD0C21E3 +:108880002720FCF773FD0C213520FCF76FFD0C2130 +:108890005220BDE80840FCF769BD000008B5FFF7AD +:1088A00075FD00F043FCFDF741F9FDF7DFF8FDF73A +:1088B00017FBFDF7E9F9FEF7ABF9BDE8084000F05A +:1088C00029BA000030B50433039C0172002104FB77 +:1088D0000325C160C0E90653049B0363059BC0E9FF +:1088E0000000C0E90422C0E90842C0E90A1143635C +:1088F00030BD00000022416AC260C0E90411C0E935 +:108900000A226FF00101FDF7F9BE0000D0E9043240 +:10891000934201D1C2680AB9181D70470020704700 +:10892000036919600021C2680132C260C269134440 +:1089300082699342036124BF436A0361FDF7D2BE9B +:1089400038B504460D46E3683BB162690020131D4B +:108950001268A3621344E36207E0237A33B929461D +:108960002046FDF7AFFE0028EDDA38BD6FF00100BC +:10897000FBE70000C368C269013BC360436913445D +:1089800082699342436124BF436A43610023836247 +:10899000036B03B11847704770B53023044683F367 +:1089A0001188866A3EB9FFF7CBFF054618B186F3FA +:1089B0001188284670BDA36AE26A13F8015B9342EE +:1089C000A36202D32046FFF7D5FF002383F311886B +:1089D000EFE700002DE9F84F04460E46174698468B +:1089E0004FF0300989F311880025AA46D4F828B041 +:1089F000BBF1000F09D141462046FFF7A1FF20B18E +:108A00008BF311882846BDE8F88FD4E90A12A7EB4A +:108A1000050B521A934528BF9346BBF1400F1BD953 +:108A2000334601F1400251F8040B914243F8040B24 +:108A3000F9D1A36A403640354033A362D4E90A2312 +:108A40009A4202D32046FFF795FF8AF31188BD4270 +:108A5000D8D289F31188C9E730465A46F9F758F950 +:108A6000A36A5E445D445B44A362E7E710B5029CE1 +:108A70000433017203FB0421C460C0E90613002320 +:108A8000C0E90A33039B0363049BC0E90000C0E90B +:108A90000422C0E90842436310BD0000026A6FF07F +:108AA0000101C260426AC0E904220022C0E90A2230 +:108AB000FDF724BED0E904239A4201D1C26822B94D +:108AC000184650F8043B0B60704700231846FAE73D +:108AD000C3680021C2690133C360436913448269DA +:108AE0009342436124BF436A4361FDF7FBBD00002D +:108AF00038B504460D46E3683BB1236900201A1DD2 +:108B0000A262E2691344E36207E0237A33B929469B +:108B10002046FDF7D7FD0028EDDA38BD6FF00100E3 +:108B2000FBE7000003691960C268013AC260C269CC +:108B3000134482699342036124BF436A03610023A3 +:108B40008362036B03B118477047000070B5302390 +:108B50000D460446114683F31188866A2EB9FFF745 +:108B6000C7FF10B186F3118870BDA36A1D70A36A98 +:108B7000E26A01339342A36204D3E16920460439D7 +:108B8000FFF7D0FF002080F31188EDE72DE9F84FC3 +:108B900004460D46904699464FF0300A8AF31188F4 +:108BA0000026B346A76A4FB949462046FFF7A0FF03 +:108BB00020B187F311883046BDE8F88FD4E90A0761 +:108BC0003A1AA8EB0607974228BF1746402F1BD931 +:108BD00005F1400355F8042B9D4240F8042BF9D1D0 +:108BE000A36A40364033A362D4E90A239A4204D3ED +:108BF000E16920460439FFF795FF8BF3118846455C +:108C0000D9D28AF31188CDE729463A46F9F780F898 +:108C1000A36A3D443E443B44A362E5E7D0E9042314 +:108C20009A4217D1C3689BB1836A8BB1043B9B1AEC +:108C30000ED01360C368013BC360C3691A448369E3 +:108C40009A42026124BF436A0361002383620123C5 +:108C5000184670470023FBE701F01F03F0B502F050 +:108C60001F0456095A1C0123B6EB511F50F8265019 +:108C700003FA02F34FEA511703F1FF333DBF50F8F7 +:108C80002720C4F12000134003EA05003BBF03FA8C +:108C900000F225FA04F0E0401043F0BD70B57E22EA +:108CA0007F210546FFF7D8FF18B1012819D0002011 +:108CB00070BD3E2249212846FFF7CEFF2F220446F1 +:108CC00031212846FFF7C8FF0646013450220236FC +:108CD00053212846B440FFF7BFFF093804FA00F0DB +:108CE000E6E7302245212846FFF7B6FF0130800233 +:108CF000DEE7000090F8D63090F8D7201B0403EB95 +:108D0000026390F8D42090F8D500134403EB0020C0 +:108D10007047000000F018BA014B586A704700BF56 +:108D2000000C0040034B002258631A610222DA60F3 +:108D3000704700BF000C0040014B0022DA60704712 +:108D4000000C0040014B5863704700BF000C00400E +:108D5000024B034A1A60034A5A6070478C6600202F +:108D60003867002000000220074B494210B55C68BC +:108D7000201A08401968821A8A4203D3A24201D8F5 +:108D80005A6010BD0020FCE78C66002008B5302337 +:108D900083F31188FFF7E8FF002383F3118808BDF0 +:108DA0000448054B03600023C0E901330C3000F098 +:108DB00017B900BF946600208D8D0008CB1D083ABE +:108DC00023F00703591A521A10B4D2080024C0E93C +:108DD000004384600C301C605A605DF8044B00F066 +:108DE000FFB800002DE9F74F364FCD1D884600280B +:108DF00018BF0746082A4FEAD50538BF082207F1F1 +:108E00000C003C1D9146019000F02CF9019809F1ED +:108E10000701C9F1000E2246246864B900F02CF95C +:108E20003B68CBB308224946E8009847044698B30C +:108E300040E9027830E004EB010CD4F804A00CEA1D +:108E40000E0C0AF10106ACF1080304EBC6069E42C3 +:108E5000E1D9A6EB0C0CB5EBEC0F4FEAEC0BDAD832 +:108E60009C421DD204F10802AB45A3EB02024FEA7B +:108E7000E202626009D9691CED4303EBC1025D4463 +:108E80005560256843F8315022601C46C3F80480C1 +:108E900044F8087B00F0F0F8204603B0BDE8F08FFE +:108EA000AA45216802D111602346EEE7013504EBA3 +:108EB000C50344F8351003F10801761AF6105E6018 +:108EC0001360F1E79466002073B50446A0F108052D +:108ED00050F8080C54F8043C061D0C300733019080 +:108EE000DB0844F8043C00F0BDF8334601989E428C +:108EF0001A6801D0AB4228D20AB1954225D244F873 +:108F0000082C54F8042C1D60013254F8081C05EBA1 +:108F1000C206B14206D14E68324444F8042C0A68B5 +:108F200044F8082C5E68711C03EBC1018D4207D127 +:108F300054F8042C013232445A6054F8082C1A6058 +:108F400002B0BDE8704000F097B81346CFE70000CC +:108F5000FEE7000070B51E4B0025044686B0586041 +:108F60000E4605638163FEF7E1FB04F12803A5606B +:108F70006563C4E90A3304F11003C4E904334FF014 +:108F8000FF33C4E90044C4E90635FFF7C5FE2B46AC +:108F9000024604F13C012046C4E9082380230D4A1F +:108FA0006567FDF709FB7368E0600B4A0362012304 +:108FB000009280F824306846F26801923269CDE967 +:108FC0000223064BCDE90435FDF72AFB06B070BD40 +:108FD00010490020809C0008789C0008518F0008F0 +:108FE0000023C0E9000083600361704770B51C4B2B +:108FF00005468468DE685CB3B44213D1036901336B +:10900000036170BDA36094F8243083B1062B15D1A1 +:10901000A06A2146D4E9003213605A60FDF738FA9D +:10902000A36A9C68B368A2689A42EBD306E0D4E9CD +:109030000032204613605A60FDF73AFA284631465E +:10904000FDF726FAB5620620BDE87040FDF732BA9A +:109050000369866001330361336BC3603063D0E71B +:109060006846002008B5302383F31188FFF7BEFF60 +:10907000002383F3118808BD194BD96883688B429C +:1090800010B520D1302383F311880269013A0261BF +:10909000B2B90468C368A0420B631ED04A6B9BB987 +:1090A00001238A60036103681A68026050601A6BCA +:1090B0008360C26018631846FDF7FAF9FDF74AFAB3 +:1090C000002383F3118810BD1C68A34203D0A46859 +:1090D000A24238BF2246DB68E1E78260F0E700BFCA +:1090E00068460020024A536B18435063704700BF24 +:1090F0006846002038B5EFF311859DB9EFF305847C +:10910000C4F30804302334B183F31188FDF72EFC37 +:1091100085F3118838BD83F31188FDF727FC84F3AC +:10912000118838BDBDE83840FDF720BC0023054A52 +:1091300019460133102BC2E9001102F10802F8D1DF +:10914000704700BFB4660020114BD3F8E82042F00E +:109150000802C3F8E820D3F8102142F00802C3F84F +:1091600010210C4AD3F81031D36B43F00803D363BA +:10917000C722094B9A624FF0FF32DA6200229A61ED +:109180005A63DA605A6001225A611A60704700BF60 +:10919000004402580010005C000C0040094A08B569 +:1091A0001169D3680B40D9B29B076FEA01011161C5 +:1091B00007D5302383F31188FDF7F2F9002383F3F9 +:1091C000118808BD000C004010B5013902449042DE +:1091D00001D1002005E0037811F8014FA34201D02E +:1091E000181B10BD0130F2E7884210B501EB0204F4 +:1091F00002D98442234607D8431EA14208D011F861 +:10920000012B03F8012FF8E7024401468A4200D1FE +:1092100010BD13F8014D02F8014DF7E7C9B203463E +:1092200010F8012B1AB18A42F9D11846704700296B +:1092300018BF0023F9E70000034611F8012B03F8DB +:10924000012B002AF9D1704710B50139034632B11C +:1092500011F8014F03F8014B013A002CF7D11A44E1 +:109260000021934200D110BD03F8011BF9E7000073 +:109270004D4435002D2D0A002F6172647570696CA4 +:109280006F742E6162696E002F6172647570696C13 +:109290006F742D7665726966792E6162696E002F32 +:1092A0006172647570696C6F742D666C6173682E81 +:1092B0006162696E002F6172647570696C6F742DE4 +:1092C000666C61736865642E6162696E00000000FF +:1092D0000000000000000000050F0008A10F0008BA +:1092E00051110008D90F0008990F00080000000074 +:1092F00000000000010F0008AD0F000889110008F0 +:10930000FD0E0008090F000853544D333248373F13 +:109310003F3F0053544D3332483733782F3732783C +:109320000053544D3332483734332F3735332F37CA +:109330003530000001105A00031059000120580078 +:10934000032056002F000000537563636573736636 +:10935000756C6C79206D6F756E7465642053444331 +:109360006172642028736C6F77646F776E3D25752A +:10937000290A0000EB7690455846415420202000F1 +:109380004641543332202020000000002A3A3C3E5F +:109390007C223F7F002B2C3B3D5B5D0043554541CC +:1093A0004141414345454549494941414592924FD3 +:1093B0004F4F5555594F554F9C4F9E9F41494F55C3 +:1093C000A5A5A6A7A8A9AAABACADAEAFB0B1B2B3E4 +:1093D000B4414141B8B9BABBBCBDBEBFC0C1C2C334 +:1093E000C4C54141C8C9CACBCCCDCECFD1D14545EA +:1093F0004549494949D9DADBDCDD49DF4FE14F4FC7 +:109400004F4FE6E8E85555555959EEEFF0F1F2F3B4 +:10941000F4F5F6F7F8F9FAFBFCFDFEFF010305078A +:10942000090E10121416181C1E00000061001A0309 +:10943000E0001703F8000703FF00010078010001B6 +:10944000300132010601390110014A012E01790172 +:10945000060180014D0043028101820182018401E5 +:10946000840186018701870189018A018B018B01B3 +:109470008D018E018F019001910191019301940161 +:10948000F60196019701980198013D029B019C010C +:109490009D0120029F01A001A001A201A201A4013F +:1094A000A401A601A701A701A901AA01AB01AC0172 +:1094B000AC01AE01AF01AF01B101B201B301B30123 +:1094C000B501B501B701B801B801BA01BB01BC01D2 +:1094D000BC01BE01F701C001C101C201C301C40149 +:1094E000C501C401C701C801C701CA01CB01CA0136 +:1094F000CD011001DD0101008E01DE011201F30139 +:109500000300F101F401F401F80128012202120123 +:109510003A020900652C3B023B023D02662C3F02E9 +:1095200040024102410246020A0153024000810109 +:109530008601550289018A0158028F015A02900161 +:109540005C025D025E025F029301610262029401AD +:109550006402650266026702970196016A02622C44 +:109560006C026D026E029C01700271029D01730219 +:1095700074029F0176027702780279027A027B02F6 +:109580007C02642C7E027F02A60181028202A90174 +:109590008402850286028702AE014402B101B20153 +:1095A00045028D028E028F0290029102B7017B0369 +:1095B0000300FD03FE03FF03AC03040086038803DE +:1095C00089038A03B1031103C2030200A303A303A7 +:1095D000C4030803CC0303008C038E038F03D8035A +:1095E0001801F2030A00F903F303F403F503F60389 +:1095F000F703F703F903FA03FA03300420035004D6 +:109600001007600422018A043601C1040E01CF0450 +:109610000100C004D00444016105260400000000DC +:109620007D1D0100632C001E9601A01E5A01001F23 +:109630000806101F0606201F0806301F0806401FD8 +:109640000606511F0700591F521F5B1F541F5D1F45 +:10965000561F5F1F601F0806701F0E00BA1FBB1F3A +:10966000C81FC91FCA1FCB1FDA1FDB1FF81FF91F36 +:10967000EA1FEB1FFA1FFB1F801F0806901F08063A +:10968000A01F0806B01F0400B81FB91FB21FBC1FDF +:10969000CC1F0100C31FD01F0206E01F0206E51FFA +:1096A0000100EC1FF31F0100FC1F4E2101003221BD +:1096B00070211002842101008321D0241A05302C4E +:1096C0002F04602C0201672C0601752C0201802CEE +:1096D0006401002D260841FF1A030000C700FC00AA +:1096E000E900E200E400E000E500E700EA00EB004A +:1096F000E800EF00EE00EC00C400C500C900E60081 +:10970000C600F400F600F200FB00F900FF00D600EE +:10971000DC00F800A300D800D7009201E100ED00C2 +:10972000F300FA00F100D100AA00BA00BF00AE00B9 +:10973000AC00BD00BC00A100AB00BB009125922590 +:10974000932502252425C100C200C000A90063257D +:10975000512557255D25A200A50010251425342587 +:109760002C251C2500253C25E300C3005A25542543 +:1097700069256625602550256C25A400F000D000E1 +:10978000CA00CB00C8003101CD00CE00CF001825A3 +:109790000C2588258425A600CC008025D300DF0079 +:1097A000D400D200F500D500B500FE00DE00DA00DE +:1097B000DB00D900FD00DD00AF00B400AD00B1005A +:1097C0001720BE00B600A700F700B800B000A80040 +:1097D000B700B900B300B200A025A00010000240FD +:1097E000080002400008024000000B002800024070 +:1097F000080002400408024006010C00400002403C +:10980000080002400808024010020D005800024003 +:10981000080002400C08024016030E0070000240CF +:109820000C0002401008024000040F0088000240B3 +:109830000C0002401408024006051000A00002407F +:109840000C0002401808024010061100B800024047 +:109850000C0002401C08024016072F0010040240B2 +:109860000804024020080240000838002804024092 +:10987000080402402408024006093900400402405E +:109880000804024028080240100A3A005804024026 +:10989000080402402C080240160B3B0070040240F2 +:1098A0000C04024030080240000C3C0088040240D6 +:1098B0000C04024034080240060D4400A00402409B +:1098C0000C04024038080240100E4500B804024063 +:1098D0000C0402403C080240160F46000100000044 +:1098E00000000000009600000000000000000000E2 +:1098F0000000000000000000000000000000000068 +:10990000096C00080D6C000801570008395A00085E +:1099100095560008BD560008E55600087D5600081B +:1099200000000000ED5A0008D95A0008155B000835 +:10993000015B00080D5B0008F95A0008E55A0008B1 +:10994000D15A0008215B000800000000055C0008F7 +:10995000F15B00082D5C0008195C0008255C00081C +:10996000115C0008FD5B0008E95B0008395C000839 +:109970000000000001000000000000006330000053 +:109980007C9900080000000000000000E046002074 +:10999000104900200000802A00020000AAAAAAAAFA +:1099A00000000024FFFF00000000000000A00A00EB +:1099B000000200A000000000AAAAAAAA000100500C +:1099C000FFFF0000000009000000009900000006F1 +:1099D00000000000AAAAAAAA00000001FFFF0000E0 +:1099E000000000000000080020A00A400000000065 +:1099F000AAAAAAAA10400540FFFF0000000800BB69 +:109A0000770000004045020000000000AAAAAAAAB0 +:109A100000000100C7FF0000000000000700000078 +:109A20000020000000000000AAAAAAAA001000005E +:109A3000FFFF000000000007000000001041900040 +:109A400000000000AAAAAAAA10404000FFFF0000E0 +:109A50000000000000A00000000400000000000062 +:109A6000AAAAAAAA00040000FFFF0000000000004C +:109A7000000000000000040000000000AAAAAAAA3A +:109A800000000400FFFF00000000000000000000D4 +:109A90000000000000000000AAAAAAAA000000001E +:109AA000FFFF0000000000000000000000000000B8 +:109AB00000000000AAAAAAAA00000000FFFF000000 +:109AC00000000000000000004172647550696C6F76 +:109AD000740025424F415244252D424C00255345E8 +:109AE0005249414C25000000020000000000000027 +:109AF000255E0008955E000840004000C06100201F +:109B0000D0610020020000000000000003000000FF +:109B100000000000DD5E00080000000010000000F2 +:109B2000E0610020000000000100000000000000D3 +:109B30003C65002001010200056D0008156C00085D +:109B4000B16C0008956C000843000000509B0008B1 +:109B500009024300020100C03209040000010202B0 +:109B60000100052400100105240100010424020263 +:109B70000524060001070582030800FF090401000F +:109B8000020A0000000705010240000007058102EB +:109B900040000000120000009C9B00081201100110 +:109BA00002000040091241570002010203010000B7 +:109BB0000403090425424F415244250043554156B0 +:109BC0002D372D4E616E6F003031323334353637DC +:109BD000383941424344454600000000000000205F +:109BE000000002000200000000000030000004003D +:109BF000080000000000002400000800040000002D +:109C00000004000000FC000002000000000004301E +:109C10000080000008000000000000380000010083 +:109C2000010000001F1C1F1E1F1E1F1F1E1F1E1FC6 +:109C30001F1D1F1E1F1E1F1F1E1F1E1F00000000B6 +:109C400039600008F16200089D6300084000400090 +:109C50007466002074660020010000008466002005 +:109C6000800000004001000008000000000100002A +:109C7000001000000800000069646C65000000002E +:109C80006D61696E002C0438040438080C10141C33 +:109C900020242526000000000000640401000400C8 +:109CA00000000000000C001028303400BC67FF7F6B +:109CB0000100000000000000581B00000000000030 +:109CC00000001E0000000000FF00000018490020F6 +:109CD000F83900208C3900202039002000000000D5 +:109CE0000893000883040000139300085004000048 +:109CF0002193000801000000000000000096000011 +:109D000000000800960000000008000004000000A9 +:109D1000B09B0008000000000000000000000000F0 +:0C9D200000000000000000000000000037 +:00000001FF diff --git a/Tools/bootloaders/CubeBlack+_bl.bin b/Tools/bootloaders/CubeBlack+_bl.bin index 3173b2f105..a7728c8ba1 100755 Binary files a/Tools/bootloaders/CubeBlack+_bl.bin and b/Tools/bootloaders/CubeBlack+_bl.bin differ diff --git a/Tools/bootloaders/CubeBlack+_bl.hex b/Tools/bootloaders/CubeBlack+_bl.hex index 66e7d8baa7..ebbd8d27cb 100644 --- a/Tools/bootloaders/CubeBlack+_bl.hex +++ b/Tools/bootloaders/CubeBlack+_bl.hex @@ -1,1019 +1,1009 @@ :020000040800F2 -:1000000000040020E1010008210F0008250F00086E -:10001000790F0008250F00084D0F0008E3010008C4 -:10002000E3010008E3010008E301000811280008CB +:1000000000060020E1010008E3010008E301000808 +:10001000E3010008E3010008E3010008E301000830 +:10002000E3010008E3010008E301000801360008CD :10003000E3010008E3010008E3010008E301000810 :10004000E3010008E3010008E3010008E301000800 -:10005000E3010008E301000879390008A539000828 -:10006000D1390008FD390008293A0008E3010008E9 +:10005000E3010008E3010008B1380008D9380008BE +:10006000013900082939000851390008E301000866 :10007000E3010008E3010008E3010008E3010008D0 :10008000E3010008E3010008E3010008E3010008C0 -:10009000E3010008E3010008E3010008553A000805 +:10009000E3010008E3010008E301000879390008E2 :1000A000E3010008E3010008E3010008E3010008A0 :1000B000E3010008E3010008E3010008E301000890 :1000C000E3010008E3010008E3010008E301000880 -:1000D000E3010008E3010008291100083D110008B0 -:1000E000BD3A0008E3010008E3010008E30100084D +:1000D000E3010008E30100084D3A0008E3010008CD +:1000E000DD390008E3010008E3010008E30100082E :1000F000E3010008E3010008E3010008E301000850 -:10010000E3010008E301000889370008E301000863 +:10010000E3010008E3010008613A0008E301000888 :10011000E3010008E3010008E3010008E30100082F :10012000E3010008E3010008E3010008E30100081F :10013000E3010008E3010008E3010008E30100080F -:10014000E3010008E3010008E3010008FD2E0008B8 +:10014000E3010008E3010008E3010008A92D00080D :10015000E3010008E3010008E3010008E3010008EF :10016000E3010008E3010008E3010008E3010008DF :10017000E3010008E3010008E3010008E3010008CF -:10018000E3010008E301000851110008E301000841 +:10018000E3010008E3010008E3010008E3010008BF :10019000E3010008E3010008E3010008E3010008AF :1001A000E3010008E3010008E3010008E30100089F :1001B000E3010008E3010008E3010008E30100088F :1001C000E3010008E3010008E3010008E30100087F :1001D000E3010008E3010008E3010008E30100086F -:1001E00002E000F000F8FEE772B6394880F30888B4 -:1001F000384880F3098838484EF60851CEF200019D -:10020000086040F20000CCF200004EF63471CEF2ED -:1002100000010860BFF34F8FBFF36F8F40F2000003 -:10022000C0F2F0004EF68851CEF200010860BFF334 -:100230004F8FBFF36F8F4FF00000E1EE100A4EF6C4 -:100240003C71CEF200010860062080F31488BFF3F1 -:100250006F8F02F01BFB03F02DFA4FF055301F4952 -:100260001B4A91423CBF41F8040BFAE71C49194A6A -:1002700091423CBF41F8040BFAE71A491A4A1B4B5A -:100280009A423EBF51F8040B42F8040BF8E70020F5 -:100290001749184A91423CBF41F8040BFAE702F0B3 -:1002A000F9FA03F063FA144C144DAC4203DA54F833 -:1002B000041B8847F9E700F03FF8114C114DAC42A0 -:1002C00003DA54F8041B8847F9E702F0E1BA0000AA -:1002D000000400200024002000000008000000208E -:1002E00000040020683F000800240020282400208B -:1002F00028240020903D0020E0010008E0010008D3 -:10030000E0010008E00100082DE9F04F2DED108A12 -:10031000C1F80CD0C3689D46BDEC108ABDE8F08FD3 -:10032000002383F311882846A047002001F0EEFE49 -:1003300001F09EFE00DFFEE770B5214C6FF0140364 -:1003400023700323002563706FF03F061F23A57001 -:10035000E57025716571A571E57125726672A372EC -:10036000E57200F0FFFC20B10F2325726672A372C4 -:10037000E57202F01FFA044602F044FA0546D8B9C5 -:10038000104B9C421AD001339C4218BF054641F2E3 -:10039000883404BF01250024002002F015FA0DB1B5 -:1003A00000F0B6F800F062FD00F01AFC204600F004 -:1003B0000DF900F0ADF8F9E70024EDE70446EBE7AE -:1003C00028240020010007B008B500F087FBA0F149 -:1003D00020035842584108BD07B5054B02211B8830 -:1003E000ADF8043001A800F0E5FB03B05DF804FBB4 -:1003F000A43B0008064991F8243033B100230822B9 -:10040000086A81F8243000F00DBC0120704700BF5D -:10041000482400202DE9F84F234C94F82430054659 -:10042000884617468BBB2E46DFF87C90002F38D0CD -:1004300094F824A0BAF1000F05D12022FF214846EC -:10044000266200F001FDCAF10805BD4228BF3D4605 -:100450005FFA85FBAD0041462A4604EB8A0000F0B6 -:10046000C9FC94F82430A7EB0B079B445FFA8BFB85 -:10047000BBF1080F2E44A844FFB284F824B0D5D1B4 -:10048000FFF7B8FF0028D1D108E0266A06EB830603 -:10049000B042C9D0FFF7AEFF0028C4D10020BDE8AC -:1004A000F88F0120BDE8F88F4824002010B52023E4 -:1004B00083F311881248C3680BB101F0ADFE00232D -:1004C000104A0F484FF47A7101F06AFE002383F35B -:1004D00011880D4C236813B12368013B23606368C6 -:1004E00013B16368013B6360084B1B7833B96368E1 -:1004F00023B9022000F074FC3223636010BD00BFFA -:1005000034240020AD040008782500207024002049 -:1005100010B5254B254953F8042F013200D110BDE9 -:100520008B42F8D1224C234B22689A423AD9224B73 -:100530009B6803F1006303F580439A4232D20020A6 -:1005400000F068FB1D4B0220187000F03FFC1C4BB4 -:100550001A6C00221A64196E1A66196E596C5A6464 -:10056000596E5A665A6E5A6942F080025A615A6947 -:1005700022F080025A615A691A6942F000521A61E7 -:100580001A6922F000521A611B6972B60D4A0E4BAD -:1005900013601B682268202181F311889D4683F334 -:1005A0000888104710BD00BFFC3F00081C40000831 -:1005B00004400008FF3F0008282400207024002089 -:1005C0000038024008ED00E0004000082DE9F04F3F -:1005D00099B0B34C01902022FF2110A8A66800F02A -:1005E00033FCB04A1378A346A3B9AF480121C360D6 -:1005F0001170202383F31188C3680BB101F00CFE46 -:100600000023AA4AA8484FF47A7101F0C9FD0023DB -:1006100083F31188019B13B1A54B019A1A60A54A77 -:10062000A349019F0292002313704B6099461C4618 -:100630001D469846012000F0C9FB002F00F01282F1 -:100640009B4B1B68002B40F00D8219B0BDE8F08F6A -:100650000220FFF7B9FE002840F0FB81019BB9F1B1 -:10066000000F08BF1F46944B1B88ADF82C300221A9 -:100670000BA800F09FFADDE74FF47A7000F02EFA35 -:10068000031E0393EADB0220FFF79EFE824600284A -:10069000E4D0039B581E042800F2DD81DFE800F05F -:1006A000030E1114170018A8052340F8343D042147 -:1006B00000F080FA54464FF0000856E004217848D4 -:1006C000F6E704217D48F3E704217D48F0E71C2488 -:1006D000204600F0A1FA04340B9004210BA800F08E -:1006E00069FA2C2CF4D1E5E7002DB7D0002CB5D059 -:1006F0000220FFF769FE0546002800F0AF810120C7 -:100700006C4C00F087FA0220207000F05FFB4FF085 -:1007100000095FFA89FA504600F08CFA074658B192 -:10072000504600F097FA09F101090028F1D12C4652 -:10073000A9460027634B97E701230220237000F0AE -:100740003BFB3E46DBF808309E4206D2304600F0C6 -:1007500063FA0130EBD10436F4E7029B00261E70E9 -:10076000534BA9465E602C46374600F075FB15B129 -:10077000002C18BF0027FFF72FFE5BE7002D3FF48A -:100780006DAF002C3FF46AAF029B0220187000F09E -:100790001DFB322000F0A2F9B0F1000AC0F25E8128 -:1007A0001AF0030540F05A81DBF8082006EB0A0333 -:1007B000934200F25381BAF5807F00F24F81554594 -:1007C0000DDA4FF47A7000F089F90490049B002B45 -:1007D000C0F244813C4A049BAB540135EFE7C8208A -:1007E000FFF7F2FD0546002800F038811F2E11D8D2 -:1007F000C6F12004544528BF544610AB26F0030030 -:1008000022463149184400F0F5FA2246FF212E48CD -:1008100000F01AFB4FEAAA0A5FFA8AF22A49304628 -:10082000FFF7F8FD0446002800F01A8106EB8A065F -:1008300005469AE70220FFF7C7FD00283FF40EAFF8 -:10084000FFF7D8FD00283FF409AF4FF0000A5346E8 -:10085000DBF8082092451CD2BAF11F0F12D8109A6B -:1008600001320FD02AF0030218A90A4452F8202CB2 -:100870000B92184604220BA900F092FB0AF1040A1D -:100880000346E5E75046039300F0C6F9039B0B903F -:10089000EFE718A8042140F84C3D00F08BF964E71D -:1008A000282400207425002034240020AD040008F2 -:1008B0007825002070240020A63B00082C2400206E -:1008C00030240020A83B00087424002018A800232E -:1008D00040F8343D642100F039F900287FF4BEAEC1 -:1008E0000220FFF771FD00283FF4B8AE0B9800F02E -:1008F000C3F918AB43F8480D04211846CDE718A8F2 -:10090000002340F8343D642100F020F900287FF4F2 -:10091000A5AE0220FFF758FD00283FF49FAE0B98CC -:1009200000F0B8F918AB43F8440DE5E70220FFF7F3 -:100930004BFD00283FF492AE00F0B2F918AB43F83B -:10094000400DD9E70220FFF73FFD00283FF486AEB7 -:100950000BA9142000F0AAF9824618A8042140F837 -:100960003CAD00F027F951460BA896E7322000F085 -:10097000B5F8B0F1000AFFF671AE1AF0030F7FF47C -:100980006DAEDBF808200AEB080393423FF666AE33 -:100990000220FFF719FD00283FF460AE2AF0030A99 -:1009A000C244D0453FF4E1AE404600F035F90421A1 -:1009B0000A900AA800F0FEF808F10408F1E74FF4E5 -:1009C0007A70FFF701FD00283FF448AEFFF712FDF3 -:1009D00000283FF4AFAE109B01330CD0082210A9C1 -:1009E0000020FFF717FD00283FF4A4AE2022FF21CE -:1009F00010A800F029FAFFF7EFFC374801F08CFB54 -:100A000023E6002D3FF42AAE002C3FF427AE18A8B1 -:100A1000002340F8343D642100F098F88246002815 -:100A20007FF41CAE0220FFF7CFFC00283FF416AE87 -:100A30000390FFF7D1FC41F2883001F06DFB0B9879 -:100A400000F04EFA00F008FA039B57461C461D467C -:100A5000F0E5054689E64FF00008FFE52546FDE58F -:100A60002C4667E6002000F039F80490049B002B28 -:100A7000FFF6E3AD012000F09FF9049B213B122B10 -:100A80003FF6D8AD01A252F823F000BF510600088E -:100A900079060008E9060008350600083506000852 -:100AA000350600087D0700086D09000835080008B4 -:100AB000CD080008FF0800082D09000835060008C9 -:100AC0004509000835060008BF0900086B07000843 -:100AD00035060008030A0008A08601002DE9F34747 -:100AE00002AE00244FF47A7506F8014D144FDFF87A -:100AF0005880454397F900305A1C5FFA84F901D0B9 -:100B0000A34212D158F8240003680122D3F820A090 -:100B100031462B46D047012807D10A4B9DF80700E4 -:100B200083F8009002B0BDE8F0870134042CE1D1D5 -:100B30004FF4FA7001F0F0FA4FF0FF30F2E700BF27 -:100B40000024002098250020FC3B00082DE9F047F8 -:100B50004FF47A75144FDFF8588006464D43002451 -:100B600097F900305A1C5FFA84F901D0A34210D1E2 -:100B700058F8240003680422D3F820A031462B46FD -:100B8000D047042805D1094B83F800900020BDE828 -:100B9000F0870134042CE3D14FF4FA7001F0BCFA71 -:100BA0004FF0FF30BDE8F08700240020982500209A -:100BB000FC3B000830B4074B1A78074B53F822402F -:100BC0002368DD69054B0A46AC460146204630BC29 -:100BD000604700BF98250020FC3B0008A08601006C -:100BE00070B501F0E3FC094C094E20700025306817 -:100BF0002378834208D901F0D3FC336805440133DC -:100C0000B5F5804F3360F2D370BD00BF9925002049 -:100C10008025002001F080BD00F1006000F58040DB -:100C20000068704700F10060920000F5804001F01C -:100C30000BBD0000054B1A68054B1B789B1A8342BD -:100C400002D9104401F0ACBC002070478025002080 -:100C50009925002038B5074D04462868204401F046 -:100C6000A7FC28B928682044BDE8384001F0B8BC8A -:100C700038BD00BF8025002010F0030308D1B0F577 -:100C8000007F05D800F10050A0F5084000687047CB -:100C900000207047014BC058704700BF107AFF1FFB -:100CA000014B1868704700BF002004E070B52A4B64 -:100CB0001C68C4F30B03240C63B140F2134293424B -:100CC00031D040F2194293422FD040F22142934258 -:100CD0002DD10323214A0C2505FB03235D6893F9DD -:100CE000082042F201039C4224D0B4F5805F23D057 -:100CF00041F201039C4221D041F203039C421FD0E8 -:100D000041F207039C4208BF3122441E0C44013DBE -:100D10000B46A3421ED215F9016F581C96B103462B -:100D200000F8016CF5E70123D4E70223D2E73F2264 -:100D30000B4DD6E73322E3E74122E1E75A22E4E70D -:100D40005922E2E72C2584421D7001D9981C5A7063 -:100D5000401A70BD1846FBE7002004E0CC3B0008B9 -:100D6000AC3B0008124B5A8842F201018A4293B20E -:100D700014D0B3F5805F13D041F20102934211D039 -:100D800041F2030293420FD041F2070293420DD188 -:100D90000423084A02EB8303D87870470023F8E75E -:100DA0000123F6E70223F4E70323F2E7002070476C -:100DB000002004E0B83B0008022802BF024B4FF4B9 -:100DC00080529A61704700BF00100240022802BFA3 -:100DD000024B4FF080529A61704700BF00100240F2 -:100DE000022801BF024A536983F48053536170475C -:100DF0000010024010B50023934203D0CC5CC454D1 -:100E00000133F9E710BD000030B5441E14F9010F9D -:100E10000B4660B193F90050854201F1010106D102 -:100E20001AB993F90020801A30BD013AEEE7002A82 -:100E3000F7D1104630BD000002460346981A13F958 -:100E4000011B0029FAD1704702440346934202D0A5 -:100E500003F8011BFAE77047024B1A78024B1A702D -:100E6000704700BF9825002000240020F8B5164CDC -:100E70001648174D174E154F00F096FC21461348A3 -:100E800000F0BEFC24681448626D936B23F40023C9 -:100E9000936301F041F92046104900F0BDFD626DF9 -:100EA000936B43F4002393634FF4E1332B600024EE -:100EB00056F82400B84202D0294600F0D3FB013492 -:100EC000042CF5D1F8BD00BFE43C000894330020A9 -:100ED00084250020FC3B000840420F00103D000824 -:100EE00038B50B4B1A780B4B53F822400A4B9C42F7 -:100EF00005460CD0094B002118461422FFF7A4FF29 -:100F0000056001462046BDE8384000F0ABBB38BD67 -:100F100098250020FC3B0008943300208425002005 -:100F2000FEE7000000B59BB0EFF309816822684638 -:100F3000FFF760FFEFF30583034B9A6B9A6A9A6A97 -:100F40009A6A9A6A9B6AFEE700ED00E000B59BB0E2 -:100F5000EFF3098168226846FFF74CFFEFF3058342 -:100F6000044B9A6B9A6A9A6A9A6A9A6A9A6A9B6A14 -:100F7000FEE700BF00ED00E000B59BB0EFF3098194 -:100F800068226846FFF736FFEFF30583034B5A6B81 -:100F90009A6A9A6A9A6A9A6A9B6AFEE700ED00E08A -:100FA00030B5084D0A4491420BD011F8013B092499 -:100FB0005840013CF7D040F300032B4083EA500037 -:100FC000F7E730BD2083B8ED002304491A465A5094 -:100FD000C8180833802B4260F9D170479C25002047 -:100FE000026843681143016003B11847704700006D -:100FF000024AD36843F0C003D36070470044004006 -:10100000024AD36843F0C003D360704700480040F1 -:10101000024AD36843F0C003D360704700780040B1 -:101020002DE9F041D0F85C64F7683368DA050546CD -:101030009CB20DD5202383F311884FF40071043046 -:10104000FFF7CEFF6FF480733360002383F31188C2 -:10105000202383F3118805F1040814F02F0333D102 -:1010600083F31188380615D5210613D5202383F381 -:10107000118805F1380000F053FA002846DA0821FB -:10108000281DFFF7ADFF4FF67F733B40F360002351 -:1010900083F311887A060ED563060CD5202383F3DB -:1010A0001188EA6C2B6D9A4202D12B6C002B2FD148 -:1010B000002383F31188D5F86424D368002B31D042 -:1010C0001069BDE8F0411847230713D014F0080F4A -:1010D0000CBF00218021E00748BF41F02001A2079A -:1010E00048BF41F04001630748BF41F4807140466A -:1010F000FFF776FFA406736805D595F860142846B7 -:10110000194000F0BDFA3468A4B2A6E77060BEE7EB -:1011100027F040073F041021281D3F0CFFF760FF18 -:10112000F760C5E7BDE8F08108B50348FFF778FF31 -:10113000BDE8084001F07CBB1C26002008B5034830 -:10114000FFF76EFFBDE8084001F072BB842A002063 -:1011500008B50348FFF764FFBDE8084001F068BB2D -:10116000EC2E002010B50E4C0E4A2046002100F057 -:1011700057FA0D4BC4F85C340C4C0D4A2046002144 -:1011800000F04EFA0B4BC4F85C340B4C0B4A0021B8 -:10119000204600F045FA0A4BC4F85C3410BD00BF8D -:1011A0001C260020F10F000800440040842A002083 -:1011B0000110000800480040EC2E0020111000082B -:1011C0000078004038B5394D037C002918BF0D4622 -:1011D000012B0446C0F8645410D1354B984242D1DB -:1011E000344B1A6C42F400321A641A6E42F4003224 -:1011F0001A661B6E0B21262000F06AF82E4BD4F8DD -:101200005C249A422B6802D02C498A424BD12C494B -:1012100001EB5301B1FBF3F3A988080442BF23F0AB -:10122000070003F0070343EA40039360EB8843F0B1 -:1012300040039BB213612B8943F001039BB25361BE -:1012400041F4045343F02C03D36001F4A051002374 -:101250001360B1F5806F136853680CBF7F23FF23C1 -:1012600084F8603438BD174B98420CD1114B1A6C7E -:1012700042F480221A641A6E42F480221A661B6EAF -:101280000B212720B8E7104B9842B7D1094B1A6CB5 -:1012900042F080421A641A6E42F080421A661B6E57 -:1012A0000B215220A8E70949B2E700BF2C3C0008F7 -:1012B0001C260020003802400010014000140140AC -:1012C00000BD0105842A0020EC2E002080DE800273 -:1012D00000F1604300F01F02400903F5614309017A -:1012E0008000C9B200F1604083F8001300F561404E -:1012F00001239340C0F8803103607047F8B515466C -:1013000082680669AA420B46816938BF8568761AE9 -:10131000B542044607D218462A46FFF76BFDA3697B -:101320002B44A3610DE011D932461846FFF762FD48 -:10133000AF1B3A46E1683044FFF75CFDE2683A448F -:10134000A261A3685B1BA3602846F8BD18462A4625 -:10135000FFF750FDE368E4E783682DE9F0410446B8 -:1013600093421546266938BF85684069361AB542EA -:101370000F4606D22A46FFF73DFD63692B446361A1 -:101380000DE012D93246A5EB0608FFF733FD4246C1 -:10139000B919E068FFF72EFDE26842446261A36874 -:1013A0005B1BA3602846BDE8F0812A46FFF722FDBB -:1013B000E368E4E710B50A440024C361029B0060BF -:1013C00040608460C160816141610261036210BD5F -:1013D00008B582694369934201D1826882B9826803 -:1013E000013282605A1C42611970426903699A4253 -:1013F00001D3C3684361002100F0AAFE002008BDAC -:101400004FF0FF3008BD000070B5202304460E46A3 -:1014100083F31188A568A5B1A368A269013BA36005 -:10142000531CA36115782269934224BFE368A3612A -:10143000E3690BB120469847002383F311882846BF -:1014400070BD3146204600F073FE0028E2DA85F3D5 -:10145000118870BD2DE9F74F05460F4690469A4614 -:10146000D0F81C90202686F311884FF0000B14460C -:1014700064B1224639462846FFF740FF034668B963 -:101480005146284600F054FE0028F1D0002383F393 -:101490001188A8EB040003B0BDE8F08FB9F1000F8C -:1014A00003D001902846C847019B8BF31188E41AAA -:1014B0001F4486F31188DBE7C16081614161C3612C -:1014C0001144009B006040608260016103627047CC -:1014D000F8B504460E461746202383F31188A56805 -:1014E000A5B1A368013BA36063695A1C62611E70C9 -:1014F000236962699A4224BFE3686361E3690BB1BF -:1015000020469847002080F31188F8BD39462046D0 -:1015100000F00EFE0028E2DA85F31188F8BD000025 -:10152000836942699A4210B501D182687AB98268AA -:10153000013282605A1C82611C7803699A4201D38D -:10154000C3688361002100F003FE204610BD4FF008 -:10155000FF3010BD2DE9F74F05460F4690469A46DD -:10156000D0F81C90202686F311884FF0000B14460B -:1015700064B1224639462846FFF7EEFE034668B9B5 -:101580005146284600F0D4FD0028F1D0002383F313 -:101590001188A8EB040003B0BDE8F08FB9F1000F8B -:1015A00003D001902846C847019B8BF31188E41AA9 -:1015B0001F4486F31188DBE702684368114301602A -:1015C00003B11847704700001430FFF743BF000015 -:1015D0004FF0FF331430FFF73DBF00003830FFF706 -:1015E000B9BF00004FF0FF333830FFF7B3BF000042 -:1015F0001430FFF709BF00004FF0FF311430FFF740 -:1016000003BF00003830FFF763BF00004FF0FF3228 -:101610003830FFF75DBF000000207047FFF7A2BD24 -:1016200037B50F4B0360002343608360C360012321 -:1016300004460374154600900B464FF4007200F107 -:101640005C011430FFF7B6FE00942B464FF4007295 -:1016500004F5177104F13800FFF72EFF03B030BD19 -:10166000403C000810B52023044683F31188FFF79F -:10167000A9FD02232374002383F3118810BD000009 -:1016800038B5C36904460D461BB904210844FFF769 -:1016900093FF294604F11400FFF79AFE002806DAAA -:1016A000201D4FF48061BDE83840FFF785BF38BD8D -:1016B000026843681143016003B118477047000096 -:1016C00013B5446BD4F894341A681178042915D1F1 -:1016D000217C022912D11979128901238B401342EE -:1016E0000CD101A904F14C0001F058FED4F8944447 -:1016F000019B21790246206800F0DAF902B010BDA2 -:10170000143001F0DBBD00004FF0FF33143001F066 -:10171000D5BD00004C3001F0ADBE00004FF0FF33EE -:101720004C3001F0A7BE0000143001F0A9BD00004C -:101730004FF0FF31143001F0A3BD00004C3001F038 -:1017400079BE00004FF0FF324C3001F073BE000054 -:10175000D0F8942438B5136819780429054601D0C7 -:10176000012038BD017C0229FAD112795C8901205F -:1017700090400440F4D105F1140001F03BFD024615 -:101780000028EDD0D5F894544FF480732868697917 -:1017900000F07CF9204638BD406BFFF7D9BF000050 -:1017A00000207047704700007FB5124B0360002394 -:1017B00043608360C360012502260F4B0574044615 -:1017C0000290019300F18402294600964FF4807341 -:1017D000143001F0EBFC094B0193029400964FF496 -:1017E000807304F52372294604F14C0001F0B2FD28 -:1017F00004B070BD683C000899170008C1160008C5 -:101800000B68202282F311880A7903EB820290612F -:101810004A79093243F822008A7912B103EB820334 -:10182000986102230374C0F89414002383F3118891 -:101830007047000038B5037F044613B190F8543068 -:10184000ABB9201D01250221FFF732FF04F114007E -:1018500025776FF0010100F087FC84F8545004F103 -:101860004C006FF00101BDE8384000F07DBC38BD90 -:1018700010B5012104460430FFF71AFF0023237737 -:1018800084F8543010BD000038B5044600251430EB -:1018900001F0A4FC04F14C00257701F073FD201D3C -:1018A00084F854500121FFF703FF2046BDE838407B -:1018B000FFF74EBF90F8443003F06003202B19D19E -:1018C00090F84520212A0AD0222A4FF000030ED09A -:1018D000202A0FD1084A82630722C26304E0064B24 -:1018E00083630723C363002303640120704783637A -:1018F000C363F9E70020704701240020D0F8943436 -:1019000037B51A681178042904461AD1017C0229D6 -:1019100017D11979128901238B40134211D100F19B -:101920004C05284601F0EEFD58B101A9284601F00A -:1019300035FDD4F89444019B21790246206800F0DB -:10194000B7F803B030BD000000EB8103F7B59C6928 -:1019500005460E46F4B1202383F3118805EB860774 -:10196000201D0821FFF7A4FEFB685B691B684C344F -:1019700013B1204601F020FD01A9204601F00EFD23 -:10198000024648B1019B3146284600F091F80023F9 -:1019900083F3118803B0F0BDFB685A691268002A0E -:1019A000F5D01B8A013B1340F1D105F14402EAE76F -:1019B000093138B550F82140DCB1202383F3118878 -:1019C000D4F894241368527903EB8203DB689B6993 -:1019D0005D6845B104216018FFF76AFE294604F1ED -:1019E000140001F011FC2046FFF7B2FE002383F340 -:1019F000118838BD7047000000F0D2BF012303708A -:101A000000234360C36183620362C3624362036372 -:101A1000038143817047000038B50446202383F3D7 -:101A2000118800254160C56005614561856100F050 -:101A3000C7FF0223237085F3118838BD70B500EB12 -:101A4000810305465069DA600E46144618B110222B -:101A50000021FFF7F9F9A06918B110220021FFF762 -:101A6000F3F931462846BDE8704001F073B8000034 -:101A7000028902F001020281428902F001024281E0 -:101A8000002202614261826101F0F8B8F0B400EB1B -:101A900081044789E4680125A4698D403D4345815F -:101AA00023600023A2606360F0BC01F013B9000062 -:101AB000F0B400EB81040789E468012564698D4076 -:101AC0003D43058123600023A2606360F0BC01F008 -:101AD0008DB9000070B50223002504460370A0F8FC -:101AE0004C5080F84E5080F84F5005814581C560BC -:101AF00005614561856180F8345000F0C7FF636877 -:101B00001B6823B129462046BDE87040184770BDC8 -:101B1000436802781B6880F85020052202700BB1E0 -:101B20000421184770470000436890F850201B6854 -:101B300002700BB1052118477047000090F834304F -:101B400070B5044613B1002380F8343004F1440228 -:101B5000204601F0B5F863689B6863BB94F8445075 -:101B600015F0600615D194F8453005F07F0545EA7B -:101B7000032540F202339D4200F00E815BD8022D16 -:101B800000F0DC803FD8002D00F08780012D00F0B0 -:101B9000CF800021204601F0EBFA0021204601F021 -:101BA000DDFA63681B6813B10621204698470623B7 -:101BB00084F8343070BD204698470028CED094F881 -:101BC0004B2094F84A3043EA0223E26B934238BF39 -:101BD000E36394F94430E56B002B4FF0200380F26F -:101BE000FD80002D00F0EC80092284F8342083F37E -:101BF00011880021E36BA26B2046FFF759FF0023F9 -:101C000083F3118870BDB5F5817F00F0B180B5F523 -:101C1000407F49D0B5F5807FBBD194F84630012B89 -:101C2000B7D1B4F84C3023F00203A4F84C30A663CB -:101C3000E6632664C3E740F201639D421ED8B5F512 -:101C4000C06F3BD2B5F5A06FA3D1B4F84430B3F563 -:101C5000A06F0ED194F8463084F84E30204600F044 -:101C60006DFF63681B6813B1012120469847032369 -:101C700023700023A363E3632364A0E7B5F5106F2B -:101C800032D040F602439D4252D0B5F5006F80D16C -:101C900004F14F03A363012324E004F14C03A36385 -:101CA0000223E36325648AE794F84630012B7FF42E -:101CB00070AFB4F84C3043F00203B6E794F8492013 -:101CC000616894F848304D6894F8471043EA02235D -:101CD000204694F84620A84700283FF45AAF4368AE -:101CE000A3630368E363A4E72378042B10D12023C4 -:101CF00083F311882046FFF7BBFE86F311886368E3 -:101D000084F84F601B68032121700BB1204698476F -:101D100094F84630002BACD084F84F300423237065 -:101D200063681B68002BA4D0022120469847A0E7D7 -:101D3000374BA3630223E36300239DE794F8481025 -:101D400011F0800F204601F00F010ED000F0AAFF25 -:101D5000012806D002287FF41CAF2E4BA363E0635A -:101D600067E72D4BA363E56363E700F08DFFEFE7C3 -:101D700094F84630002B7FF40CAF94F8483013F001 -:101D80000F013FF476AF1A06204602D501F004FA9F -:101D90006FE701F0F7F96CE794F84630002B7FF419 -:101DA000F8AE94F8483013F00F013FF462AF1B0611 -:101DB000204602D501F0DCF95BE701F0CFF958E7E6 -:101DC000142284F8342083F311882B462A462946AE -:101DD0002046FFF75BFE85F3118870BD5DB11522CB -:101DE00084F8342083F311880021E36BA26B204632 -:101DF000FFF74CFE03E70B2284F8342083F31188AD -:101E00002B462A4629462046FFF752FEE3E700BF4D -:101E1000983C0008903C0008943C000838B590F8C5 -:101E200034300446152B29D8DFE803F03E28282853 -:101E300028283E28280B2939282828282828282817 -:101E40003E3E90F84B1090F84A20C36B42EA0122C4 -:101E50009A4214D9C268128AB3FBF2F502FB153517 -:101E60006DB9202383F311882B462A462946FFF7B4 -:101E70001FFE85F311880A2384F8343038BD1423FB -:101E800084F83430202383F3118800231A4619463E -:101E90002046FFF7FBFD002383F3118838BD036C58 -:101EA00003B198470023E7E7002101F061F9002121 -:101EB000204601F053F963681B6813B106212046E0 -:101EC00098470623D8E7000090F83420152A38B543 -:101ED000044622D80123934040F6416213421DD1AB -:101EE00013F480150FD19B0217D50B2380F83430E3 -:101EF000202383F311882B462A462946FFF7D8FD75 -:101F000085F3118838BDC3689B695B682BB9036C86 -:101F100003B19847002384F8343038BD002101F024 -:101F200027F90021204601F019F963681B6813B1F5 -:101F30000621204698470623EDE70000024B0022C9 -:101F40001B605B609A607047543300200023037469 -:101F50008268054B1B6899689142FBD25A680360FE -:101F600042601060586070475433002008B5202349 -:101F700083F31188037C032B05D0042B0DD02BB9E0 -:101F800083F3118808BD436900221A604FF0FF33C4 -:101F90004361FFF7DBFF0023F2E790E80C001A60D3 -:101FA00002685360F2E70000002303748268054B67 -:101FB0001B6899689142FBD85A68036042601060C0 -:101FC0005860704754330020054B1969087418682D -:101FD00002681A605360186101230374FEF794B914 -:101FE0005433002030B54B1C87B005460A4C10D046 -:101FF00023690A4A01A800F0D3F82846FFF7E4FF56 -:10200000049B13B101A800F007F92369586907B0D0 -:1020100030BDFFF7D9FFF8E7543300206D1F0008EB -:1020200038B50C4D41612B6981689A68914204462C -:1020300003D8BDE83840FFF789BF1846FFF786FF91 -:1020400001232C61014623742046BDE83840FEF789 -:102050005BB900BF54330020044B1A681B699068B9 -:102060009B68984294BF00200120704754330020A1 -:1020700010B5084C236820691A6822605460012258 -:1020800023611A74FFF790FF01462069BDE81040F4 -:10209000FEF73AB954330020826002220274002213 -:1020A000427470478368A3F17C0243F80C2C0269E8 -:1020B00043F83C2C426943F8382C074A43F81C2C5F -:1020C000C26843F8102C022203F8082C002203F8FF -:1020D000072CA3F1180070472103000810B5202336 -:1020E00083F31188FFF7DEFF00210446FFF798FF16 -:1020F000002383F31188204610BD0000024B1B69AA -:1021000058610F20FFF760BF54330020202383F372 -:102110001188FFF7F3BF000008B50146202383F3C1 -:1021200011880820FFF75EFF002383F3118808BDA4 -:1021300049B1064B42681B6918605A6013604360DE -:102140000420FFF74FBF4FF0FF307047543300209B -:102150000368984206D01A680260506059611846B8 -:10216000FFF7F4BE7047000038B504460D462068FE -:10217000844200D138BD036823605C604561FFF78D -:10218000E5FEF4E7054B03F114025A619A614FF042 -:10219000FF32DA6100221A62704700BF5433002018 -:1021A000F8B503611A4BC2605C6A1A4B1A460229E1 -:1021B00052F8145F38BF0221954206461F460AD1E5 -:1021C000586198611C620560456081600819BDE82E -:1021D000F84001F0B9B9186AAB68241A0C1902D397 -:1021E000E41A2D6804E09C4202D2204401F0BCF9BC -:1021F000AB689C42F4D86B68736035601E606E609B -:10220000B460A9684FF0FF33091BA960FB61F8BDFA -:10221000000C00405433002010B41A4C234653F8ED -:10222000141F814210D0416802680A600268516040 -:102230009A424FF00001C16003D0936881680B445B -:1022400093605DF8044B70470A68626100209A420F -:102250005360C86003D15DF8044B01F07FB9936807 -:10226000886803449360084A206A526A121A9342AB -:10227000E7D9991A012998BF931C18445DF8044BBB -:1022800001F072B954330020000C00400020704768 -:10229000FEE70000704700004FF0FF30704700007D -:1022A000022906D0032906D00129064818BF0020BC -:1022B000704705487047032A9ABF044800EBC200E4 -:1022C000002070476C3D0008203D000808240020D5 -:1022D00070B59AB001AD064608462946144600F08E -:1022E00095F82846FEF7A8FDC0B2431C5B0086E8BF -:1022F0001800237003236370002302341946DAB2F6 -:10230000904204F1020401D81AB070BDEA5C04F8EE -:10231000022C04F8011C0133F1E7000008B520236A -:1023200083F311880348FFF7E9FA002383F3118848 -:1023300008BD00BF9433002010B50446052916D807 -:10234000DFE801F016150316161D202383F311880C -:102350000E4A0121FFF772FB20460D4A0221FFF7CA -:102360006DFB0C48FFF790FA002383F3118810BD32 -:10237000202383F311880748FFF75CFAF4E7202352 -:1023800083F311880348FFF773FAEDE79C3C0008DC -:10239000C03C00089433002038B50C4D0C4C0D495E -:1023A0002A4604F10800FFF793FF05F1CA0204F181 -:1023B00010000949FFF78CFF05F5CA7204F11800F7 -:1023C0000649BDE83840FFF783BF00BF5C380020F6 -:1023D00008240020EC3C0008F93C0008073D0008F8 -:1023E00070B5044608460D46FEF726FDC6B22046E7 -:1023F000013403780BB9184670BD32462946FEF702 -:1024000003FD0028F3D1012070BD00002DE9F84F35 -:1024100005460C46FEF710FD2B49C6B22846FFF7CD -:10242000DFFF08B10336F6B228492846FFF7D8FF88 -:1024300008B11036F6B2632E0DD8DFF88C80DFF8C5 -:102440008C90234FDFF890A0DFF890B02E7846B93B -:102450002670BDE8F88F29462046BDE8F84F01F008 -:1024600099BB252E2CD1072241462846FEF7CCFCED -:1024700058B9DBF800302360DBF804306360BBF848 -:102480000830238107350A34E0E708224946284608 -:10249000FEF7BAFCA0B90F4BA21C13F8011F0909E3 -:1024A0005345C95D02F8021C197801F00F0102F1D1 -:1024B0000202C95D02F8031CEFD118340835C5E7E4 -:1024C000267001350134C1E78C3D0008073D000846 -:1024D0009F3D00080F7AFF1F1B7AFF1F943D0008E5 -:1024E000BFF34F8F024AD368DB03FCD4704700BFB1 -:1024F000003C024008B5094B1B7873B9FFF7F0FFA9 -:10250000074B1A69002ABFBF064A5A6002F1883297 -:102510005A601A6822F480621A6008BDBA3A002034 -:10252000003C02402301674508B50B4B1B7893B96B -:10253000FFF7D6FF094B1A6942F000421A611A6888 -:1025400042F480521A601A6822F480521A601A68A3 -:1025500042F480621A6008BDBA3A0020003C024092 -:10256000172870B513D80B4A0B4C137863B90B4E70 -:102570004FF0006144F8231056F823500133182B14 -:102580002944F7D10123137054F8200070BD0020B6 -:1025900070BD00BF1C3B0020BC3A0020B03D0008CD -:1025A000014B53F820007047B03D000818207047D9 -:1025B000172810B5044601D9002010BDFFF7D0FF41 -:1025C000064B53F824301844C21A0BB9012010BD31 -:1025D00012680132F0D1043BF6E700BFB03D0008BD -:1025E000172810B5044629D8FFF77AFFFFF782FFB6 -:1025F0001349F323CB600C23B0FBF3F203FB12006F -:10260000D30143EAC003DBB243F4007343F0020397 -:102610000B610B6943F480330B61FFF761FF2046C8 -:10262000FFF79EFF074B53F8241000F0DDF8FFF78B -:102630007BFF2046BDE81040FFF7BABF002010BD69 -:10264000003C0240B03D00082DE9F84312F00103C0 -:10265000154640D18218B2F1026F3CD22C4B1B6858 -:1026600013F0010337D02B4CFFF744FFF323E36053 -:10267000FFF736FF40F20127032D01D9830713D05E -:10268000244C0F46401A40F20118EB1B0B44012B5F -:1026900000EB0706236924D823F001032361FFF729 -:1026A00043FF0120BDE8F883236923F440732361CD -:1026B00023693B43236151F8046B0660BFF34F8FDE -:1026C000FFF70EFF03689E4208D0236923F0010341 -:1026D0002361FFF729FF0020BDE8F883043D0430A3 -:1026E000CAE723F440732361236943EA08032361A3 -:1026F000B94637F8023B3380BFF34F8FFFF7F0FE48 -:102700003688B9F80030B6B2B342BED0DDE700BFBC -:1027100000380240003C0240084908B50B7828B157 -:1027200053B9FFF7E7FE01230B7008BD23B1BDE8E5 -:1027300008400870FFF7F8BE08BD00BFBA3A002095 -:1027400010B50244064B0439D2B2904200D110BDFC -:10275000441C00B253F8200041F8040FE0B2F4E743 -:1027600050280040104B30B51C6F240407D41C6F58 -:1027700044F400741C671C6F44F400441C670B4C49 -:10278000236843F4807323600244094B0439D2B2B6 -:10279000904200D130BD441C00B251F8045F43F8B0 -:1027A0002050E0B2F4E700BF003802400070004063 -:1027B0005028004007B5012201A90020FFF7C0FF03 -:1027C000019803B05DF804FB13B50446FFF7F2FF70 -:1027D000A04206D002A9012241F8044D0020FFF7D3 -:1027E000C1FF02B010BD000070470000034B1B6822 -:1027F0009B0042BF024B01221A707047743802409E -:102800001D3B0020014B1878704700BF1D3B002086 -:10281000064A536823F001035360EFF309836833DA -:1028200083F30988002383F31188704730EF00E0B9 -:1028300010B5202383F31188104B5B6813F40063F9 -:1028400018D0F1EE103AEFF309844FF0807344F89A -:102850004C3C0B4BDB6844F8083CA4F1680383F361 -:102860000988FFF7F9FB18B1064B44F8503C10BD3E -:10287000054BFAE783F3118810BD00BF00ED00E0BF -:1028800030EF00E031030008340300087047000017 -:10289000FEE70000084A094B09498B4204D3094A64 -:1028A0000021934205D3704752F8040F43F8040BFC -:1028B000F3E743F8041BF4E78C3F0008903D002049 -:1028C000903D0020903D0020836D30B500229D6832 -:1028D000446D11464FF0FF3004EB42130132954234 -:1028E000C3F80019C3F81019C3F80809C3F8001B8E -:1028F000C3F8101BC3F8080BEED24FF00113C4F855 -:102900001C3830BD890141F02001016103699B063B -:10291000FCD4122000F0B4BE204B03EB80022DE962 -:10292000F047D2F80CE05D6DDEF81420461CD2F8BA -:1029300000C005EB063605EB4018516861450BD326 -:10294000D5F83428012303FA00F022EA0000C5F884 -:1029500034081846BDE8F087BEF81040ACEB010320 -:10296000A34228BF2346D8F81849A4B2B3EB840F7A -:1029700010D894681F46A4F1040959F804AFC6F8AA -:1029800000A0042F01D9043FF7E71C440B449460D6 -:102990005360D2E70020BDE8F08700BF203B002055 -:1029A00010B5054C2046FFF729F84FF0A0436365AA -:1029B000024BA36510BD00BF203B0020343E000841 -:1029C0000378012B70B5054650D12A4B446D9842CF -:1029D0001BD1294B5A6B42F080025A635A6D42F068 -:1029E00080025A655A6D5A6942F080025A615A69EA -:1029F00022F080025A610E2143205B69FEF768FCD9 -:102A00001E4BE3601E4BC4F800380023C4F8003EA0 -:102A1000C02323606E6D4FF45023A3633369002BF2 -:102A2000FCDA012333610C2000F02AFE3369DB0756 -:102A3000FCD4122000F024FE3369002BFCDA0026BF -:102A4000A6602846FFF740FF6B68C4F81068DB6893 -:102A5000C4F81468C4F81C684BB90A4BA3614FF062 -:102A6000FF336361A36843F00103A36070BD064BAD -:102A7000F4E700BF203B0020003802404014004033 -:102A800003002002003C30C0083C30C0F8B5446D63 -:102A9000054600212046FFF735FFA96D00234FF0C2 -:102AA00001128F68C4F834384FF00066C4F81C284F -:102AB0004FF0FF3004EB431201339F42C2F800692C -:102AC000C2F8006BC2F80809C2F8080BF2D20B6812 -:102AD0006A6DEB65636210231361166916F01006C8 -:102AE000FBD1122000F0CCFDD4F8003823F4FE63B3 -:102AF000C4F80038A36943F4402343F01003A361F2 -:102B00000923C4F81038C4F814380A4BEB604FF0AE -:102B1000C043C4F8103B084BC4F8003BC4F810692C -:102B2000C4F80039EB6D03F1100243F48013EA6539 -:102B3000A362F8BD103E000840800010426D90F87E -:102B40004E10D2F8003823F4FE6343EA0113C2F8B2 -:102B5000003870472DE9F0410EB200EB86080D46B3 -:102B6000D8F80C100F6807F00303022B50D0032B8A -:102B700050D03D4A3D4F012B18BF1746446D4FEAD8 -:102B8000451E04EB0E030022C3F8102B8A6905F1E1 -:102B9000100C002A40D04A8A05F158035B013A43E1 -:102BA000E2500123D4F81C2803FA0CF31343A64483 -:102BB0004A69C4F81C380023CEF8103905F13F03E8 -:102BC000002A39D00A8A898B9208012988BF4A4392 -:102BD000C16D04EB8303561841EA0242C6652946DB -:102BE0005A602046FFF78EFED8F80C301B8A43EA65 -:102BF00085531F4305F148035B01E7500123D4F8D7 -:102C00001C2803FA05F51543C4F81C58BDE8F081EB -:102C1000174FB3E7174FB1E704EB4613D3F8002B78 -:102C200022F40042C3F8002BD4F81C28012303FA35 -:102C30000CF322EA0303BAE704EB83030E4A5A605B -:102C400004EB461629462046FFF75CFED6F800390D -:102C500023F40043C6F80039D4F81C38012202FAE4 -:102C600005F523EA0505CFE7008000100080041079 -:102C70000080081000800C1000040002826D1268B1 -:102C8000C265FFF721BE00005831436D49015B5812 -:102C900013F4004004D013F4001F14BF01200220DD -:102CA000704700004831436D49015B5813F4004000 -:102CB00004D013F4001F14BF01200220704700004D -:102CC00000EB8101CB68196A0B6813604B68536095 -:102CD0007047000000EB810330B5DD68AA69136816 -:102CE000D36019B9402B84BF402313606B8A1468EA -:102CF000426D1C44013CB4FBF3F46343033323F003 -:102D0000030302EB411043EAC44343F0C043C0F85D -:102D1000103B2B6803F00303012B09B20ED1D2F84C -:102D2000083802EB411013F4807FD0F8003B14BF49 -:102D300043F0805343F00053C0F8003B02EB4112D4 -:102D4000D2F8003B43F00443C2F8003B30BD000022 -:102D50002DE9F041244D6E6D06EB40130446D3F887 -:102D6000087BC3F8087B38070AD5D6F8143819074A -:102D700006D505EB84032146DB6828465B68984747 -:102D8000FA072FD5D6F81438DB072BD505EB8403CB -:102D9000D968CCB98B69488A5E68B6FBF0F200FB53 -:102DA00012628AB91868DA6890420DD2121A83E862 -:102DB0001400202383F311880B482146FFF78AFF74 -:102DC00084F31188BDE8F081012303FA04F26B89D2 -:102DD00023EA02036B81CB6823B121460248BDE898 -:102DE000F0411847BDE8F081203B002000EB810353 -:102DF00070B5DD68436D6C692668E6604A0156BBB4 -:102E00001A444FF40020C2F810092A6802F00302A5 -:102E1000012A0AB20ED1D3F8080803EB421410F4C9 -:102E2000807FD4F8000914BF40F0805040F000507B -:102E3000C4F8000903EB4212D2F8000940F0044044 -:102E4000C2F80009D3F83408012202FA01F1014363 -:102E5000C3F8341870BD19B9402E84BF40202060DB -:102E600020682E8A841940F00050013C1A44B4FBBB -:102E7000F6F440EAC440C6E7F8B504461E48456D7E -:102E800005EB4413D3F80869C3F80869F10717D5AF -:102E9000D5F81038DA0713D500EB8403D9684B69ED -:102EA0001F68DA68974218D2D21B00271A605F6049 -:102EB000202383F311882146FFF798FF87F31188B9 -:102EC000330617D5D5F834280123A340134211D077 -:102ED0002046BDE8F840FFF71FBD012303FA04F2C6 -:102EE000038923EA020303818B68002BE8D0214683 -:102EF0009847E5E7F8BD00BF203B002096482DE944 -:102F0000F84F456D6E69AB691E4016F4805F6E61C7 -:102F1000044605D0FEF7DEFDBDE8F84FFFF788BC9C -:102F2000002E12DAD5F8003E8B489B071EBFD5F85D -:102F3000003E23F00303C5F8003ED5F8043823F023 -:102F40000103C5F80438FEF7EFFD370502D58248C6 -:102F5000FEF7DEFDB0040CD5D5F8083813F0060FE7 -:102F6000EB6823F470530CBF43F4105343F4A053A5 -:102F7000EB60310704D56368DB680BB1764898478E -:102F8000F2025AD4B3020CD5D4F85480DFF8C8A1A9 -:102F900000274FF00109A36D9B68F9B28B4280F0C6 -:102FA0008780F70619D5616D0A6AC2F30A1702F025 -:102FB0000F0302F4F012B2F5802F00F0A180B2F5F9 -:102FC000402F0AD104EB830301F58051DB68186AB6 -:102FD00000231A469F4240F087803003D5F81848F6 -:102FE00013D5E10302D50020FFF7B2FEA20302D5FC -:102FF0000120FFF7ADFE630302D50220FFF7A8FE14 -:10300000270302D50320FFF7A3FE750384D5E0074D -:1030100002D50020FFF730FFA10702D50120FFF7FE -:103020002BFF620702D50220FFF726FF23077FF55B -:1030300073AF0320FFF720FF6EE7D4F85480DFF86A -:1030400018A100274FF00109A36D9B685FFA87FB69 -:103050005B4597D308EB4B13D3F8002902F44022C9 -:10306000B2F5802F22D1D3F80029002A1EDAD3F836 -:10307000002942F09042C3F80029D3F80029002A21 -:10308000FBDB5946606DFFF73DFC228909FA0BF323 -:1030900022EA0303238104EB8B03DB689B6813B1F3 -:1030A0005946504698475846FFF736FC0137CBE75C -:1030B00008EB4112D2F8003B03F44023B3F5802F14 -:1030C00010D1D2F8003B002B0CDA628909FA01F327 -:1030D00022EA0303638104EB8103DB68DB680BB145 -:1030E00050469847013756E79C0708BF0A68072BE8 -:1030F00098BF027003F101039CBF120A013069E717 -:10310000023304EB830201F5805152689069026832 -:10311000D0F808C04068A2EB000E0022104697428B -:103120000AD104EB830463689B699A683A449A6005 -:103130005A6817445F6050E712F0030F08BF086831 -:10314000964588BF8CF8000002F1010284BF000A96 -:103150000CF1010CE3E700BF203B0020436D03EBC3 -:103160004111D1F8003B43F40013C1F8003B704714 -:10317000436D03EB4111D1F8003943F40013C1F85A -:1031800000397047436D03EB4111D1F8003B23F444 -:103190000013C1F8003B7047436D03EB4111D1F8B8 -:1031A000003923F40013C1F80039704730B5039C8F -:1031B0000172043304FB0325C361049B03630021F4 -:1031C000059B00604060C1604261026185610462EC -:1031D00042628162C162436330BD00000022416AE5 -:1031E00041610161C2608262C2626FF00101FEF75B -:1031F000BBBF000003694269934203D1C2680AB1B0 -:1032000000207047181D704703691960C2680132B9 -:10321000C260C269134482690361934224BF436A56 -:1032200003610021FEF794BF38B504460D46E368FC -:103230003BB16269131D1268A3621344E36200206C -:1032400038BD237A33B929462046FEF771FF00289E -:10325000EDDA38BD6FF00100FBE70000C368C2691A -:10326000013BC3604369134482694361934224BFB5 -:10327000436A436100238362036B03B118477047BD -:1032800070B52023044683F31188866A3EB9FFF7A0 -:10329000CBFF054618B186F31188284670BDA36A96 -:1032A000E26A13F8015BA362934202D32046FFF760 -:1032B000D5FF002383F31188EFE700002DE9F84FD5 -:1032C00004460E4690469946202787F3118800252C -:1032D000AA46D4F828B0BBF1000F09D149462046D0 -:1032E000FFF7A2FF20B18BF311882846BDE8F88FC5 -:1032F000A16AE36AA8EB050B5B1A9B4528BF9B46B6 -:10330000BBF1400F1BD9334601F1400251F8040BC9 -:1033100043F8040B9142F9D1A36A40334036A362CB -:103320004035A26AE36A9A4202D32046FFF796FF2D -:103330008AF311884545D8D287F31188C9E730460A -:103340005A46FDF757FDA36A5B445E44A3625D44A1 -:10335000E7E7000010B5029C0172043303FB04216F -:10336000C36100238362C362039B0363049B006009 -:103370004060C460426102618161046242624363F1 -:1033800010BD0000026AC260426A4261026100220E -:103390008262C2626FF00101FEF7E6BE4369026914 -:1033A0009A4203D1C2680AB100207047184650F80B -:1033B000043B0B6070470000C368C2690133C360FF -:1033C0004369134482694361934224BF436A436162 -:1033D0000021FEF7BDBE000038B504460D46E36887 -:1033E0003BB123691A1DA262E2691344E362002023 -:1033F00038BD237A33B929462046FEF799FE0028C6 -:10340000EDDA38BD6FF00100FBE7000003691960D9 -:10341000C268013AC260C26913448269036193427F -:1034200024BF436A036100238362036B03B118471F -:103430007047000070B5202304460E4683F31188C0 -:10344000856A35B91146FFF7C7FF10B185F31188BA -:1034500070BDA36A1E70A36AE26A01339342A3623D -:1034600004D3E16920460439FFF7D0FF002080F340 -:10347000118870BD2DE9F84F04460D4691469A46D5 -:103480004FF0200888F311880026B346A76A4FB989 -:1034900051462046FFF7A0FF20B187F31188304640 -:1034A000BDE8F88FA06AE76AA9EB06033F1A9F42BE -:1034B00028BF1F46402F1BD905F1400355F8042BA8 -:1034C00040F8042B9D42F9D1A36A4033A3624036F1 -:1034D000A26AE36A9A4204D3E16920460439FFF7FD -:1034E00095FF8BF311884E45D9D288F31188CDE72B -:1034F00029463A46FDF77EFCA36A3B443D44A3625D -:103500003E44E5E7026943699A4203D1C3681BB9A7 -:10351000184670470023FBE7836A002BF8D0043B72 -:103520009B1AF5D01360C368013BC360C3691A449A -:10353000836902619A4224BF436A03610023836264 -:103540000123E5E700F034B9034B002258631A6108 -:103550000222DA60704700BF000C0040014B0022DD -:10356000DA607047000C0040014B5863704700BFA1 -:10357000000C0040FEE7000010B5174CFEF7DEFC23 -:10358000FEF700FE802215492046FEF785FD012347 -:1035900044F8180C0374124B124AD96821F4E06104 -:1035A0000904090C0A431049DA60CA6842F08072C3 -:1035B000CA600E490A6842F001020A601022DA77F6 -:1035C000202283F82220002383F3118862B6084862 -:1035D000BDE81040FEF782BD7C330020403E00086D -:1035E00000ED00E00003FA05F0ED00E0001000E05F -:1035F000483E00082DE9F84F1F4CDFF880906569C0 -:1036000004F114074FF00008D9F82430266AAA689C -:103610009E1B96421DD34FF0200AAA68236AD5F854 -:103620000CB0134423622B68BB425F60A6EB02061A -:103630006361C5F80C8001D1FFF790FF88F3118812 -:103640002869D8478AF311886569AB689E42E4D23D -:10365000DAE76269BA420CD0916823628E1B9660E9 -:10366000A86802282CBF1818981CBDE8F84FFFF76F -:103670007BBFBDE8F88F00BF54330020000C004032 -:10368000034B59685A68521A9042FBD8704700BFE2 -:10369000001000E04B6843608B688360CB68C360B8 -:1036A0000B6943614B6903628B6943620B6803607A -:1036B0007047000008B5224B22481A6940F2FF11FA -:1036C0000A431A611A6922F4FF7222F001021A6198 -:1036D0001A691A6B0A431A631A6D0A431A651A4A61 -:1036E0001B6D1146FFF7D6FF184802F11C01FFF7CA -:1036F000D1FF174802F13801FFF7CCFF154802F15E -:103700005401FFF7C7FF144802F17001FFF7C2FF31 -:10371000124802F18C01FFF7BDFF114802F1A80128 -:10372000FFF7B8FF0F4802F1C401FFF7B3FF0E48DF -:1037300002F1E001FFF7AEFFBDE8084000F0A4B8D9 -:103740000038024000000240683E000800040240C9 -:1037500000080240000C0240001002400014024029 -:1037600000180240001C02400020024008B500F092 -:10377000FFF9FFF701FFFFF739F8BDE80840FEF752 -:103780000BBE000070470000084B1A69920710B585 -:1037900008D500241C61202383F31188FFF72AFF3A -:1037A00084F31188BDE81040FFF742B8000C0040D8 -:1037B000104B1A6C42F008021A641A6E42F00802AA -:1037C0001A660D4A1B6E936843F0080393600B4B17 -:1037D00053229A624FF0FF32DA6200229A615A63F2 -:1037E000DA605A6001225A6108211A603220FDF71E -:1037F0006FBD00BF00380240002004E0000C004014 -:103800001F4B1A696FEAC2526FEAD2521A611A69E3 -:10381000C2F308021A614FF0FF301A695A69586101 -:1038200000215A6959615A691A6A62F080521A6213 -:103830001A6A02F080521A621A6A5A6A58625A6AFE -:1038400059625A6A1A6C42F080521A641A6E42F037 -:1038500080521A661A6E0B4A106840F4807010602D -:10386000186F00F44070B0F5007F1EBF4FF4803039 -:1038700018671967536823F40073536000F058B950 -:103880000038024000700040324B4FF080521A6402 -:10389000314A4FF4404111601A6842F001021A6047 -:1038A0001A689207FCD59A6822F003029A60294BA5 -:1038B00019469A6812F00C02FBD1186800F0F90062 -:1038C00018609A601A6842F480321A600B689B0391 -:1038D000FCD54B6F43F001034B671E4B5A6F9007AB -:1038E000FCD51E4A5A601A6842F080721A601A4A61 -:1038F00053685904FCD5174B1A689201FCD5184A35 -:103900009A600322C3F88C20164B1A68164B9A4211 -:10391000164B1BD1164A1168164A914216D140F235 -:1039200005121A600B4B9A6842F002029A609A687C -:1039300002F00C02082AFAD15A6C42F480425A640E -:103940005A6E42F480425A665B6E704740F20572CE -:10395000E7E700BF003802400070004018544007FD -:1039600000948838002004E011640020003C0240EC -:1039700000ED00E041C20F41084A08B553691168E3 -:103980000B4003F00103536123B1054A13680BB1E7 -:1039900050689847BDE80840FEF74ABF003C014028 -:1039A0009C250020084A08B5536911680B4003F0B4 -:1039B0000203536123B1054A93680BB1D06898475D -:1039C000BDE80840FEF734BF003C01409C250020C4 -:1039D000084A08B5536911680B4003F004035361AA -:1039E00023B1054A13690BB150699847BDE80840F7 -:1039F000FEF71EBF003C01409C250020084A08B588 -:103A0000536911680B4003F00803536123B1054A61 -:103A100093690BB1D0699847BDE80840FEF708BF2D -:103A2000003C01409C250020084A08B553691168F4 -:103A30000B4003F01003536123B1054A136A0BB125 -:103A4000506A9847BDE80840FEF7F2BE003C0140CE -:103A50009C250020174B10B55C691A68144004F4CB -:103A600078725A61A30604D5134A936A0BB1D06ADF -:103A70009847600604D5104A136B0BB1506B9847FA -:103A8000210604D50C4A936B0BB1D06B9847E20525 -:103A900004D5094A136C0BB1506C9847A30504D5A3 -:103AA000054A936C0BB1D06C9847BDE81040FEF707 -:103AB000BFBE00BF003C01409C2500201A4B10B542 -:103AC0005C691A68144004F47C425A61620504D5AA -:103AD000164A136D0BB1506D9847230504D5134A50 -:103AE000936D0BB1D06D9847E00404D50F4A136E67 -:103AF0000BB1506E9847A10404D50C4A936E0BB1DC -:103B0000D06E9847620404D5084A136F0BB1506F0A -:103B10009847230404D5054A936F0BB1D06F98479B -:103B2000BDE81040FEF784BE003C01409C2500200B -:103B3000062108B50846FDF7CBFB06210720FDF757 -:103B4000C7FB06210820FDF7C3FB06210920FDF76E -:103B5000BFFB06210A20FDF7BBFB06211720FDF75E -:103B6000B7FB06212820BDE80840FDF7B1BB0000E7 -:103B700008B5FFF745FEFDF727FAFDF74FFDFDF706 -:103B80003BFFFDF70FFEFFF7FDFDBDE80840FFF727 -:103B9000D9BC0000034611F8012B03F8012B002AC1 -:103BA000F9D17047121012131211000053544D3303 -:103BB00032463F3F3F00000001203300001041012A -:103BC00001105A01031059010710310100000000D3 -:103BD000AC3B00083F000000130400000C3C000850 -:103BE0003F00000019040000163C00083F000000E0 -:103BF00021040000203C00083F0000009433002016 -:103C00001C260020842A0020EC2E002053544D3323 -:103C100032463430780053544D33324634327800D3 -:103C200053544D3332463434365858000096000011 -:103C30000000000000000000000000000000000084 -:103C400000000000E5150008D11500080D16000859 -:103C5000F915000805160008F1150008DD15000823 -:103C6000C915000819160008000000001D170008FB -:103C70000917000845170008311700083D1700080C -:103C8000291700081517000801170008A1170008D8 -:103C90000000000001000000000000000200000021 -:103CA0000000000049190008B11900084000400058 -:103CB0002C3800203C3800200200000000000000EA -:103CC0000300000000000000F519000800000000DB -:103CD000100000004C38002000000000010000002F -:103CE00000000000203B0020010102004865782F01 -:103CF00050726F6669434E430043756265426C6162 -:103D0000636B2B2D424C002553455249414C2500F5 -:103D100039230008A1220008B51800081D23000857 -:103D200043000000283D000809024300020100C0D2 -:103D300032090400000102020100052400100105FF -:103D40002401000104240202052406000107058263 -:103D5000030800FF09040100020A00000007050132 -:103D60000240000007058102400000001200000030 -:103D7000743D00081201100102000040AE2D011137 -:103D800000020102030100000403090425424F411F -:103D90005244250043756265426C61636B2B0030B1 -:103DA00031323334353637383941424344454600A1 -:103DB0000040000000400000004000000040000003 -:103DC00000000100000002000000020000000200EC -:103DD00000000200000002000000020000000200DB -:103DE00000400000004000000040000000400000D3 -:103DF00000000100000002000000020000000200BC -:103E000000000200000002000000020000000200AA -:103E1000000000003D1B00081D1E0008C91E000810 -:103E200040004000803B0020803B0020010000005B -:103E3000903B0020800000004001000003000000D3 -:103E40006D61696E00000000603E0008983B002034 -:103E5000903D0020010000007535000800000000C2 -:103E600069646C65000000000000812A0002000007 -:103E7000AAAAAAAA00000000FFFF0000000000009C -:103E800000A00A000000000000000000AAAAAAAAE0 -:103E900000000000FFFF0000000000000000000024 -:103EA0001400005400000000AAAAAAAA140000549A -:103EB000FFFF0000000000000000000080699A0180 -:103EC00000000000AAAA8AAA40555501FFFF000081 -:103ED0000070700777700000408102010000000050 -:103EE000AAAAAAAA00410100F7FF00000000008072 -:103EF000080000000000000000000000AAAAAAAA12 -:103F000000000000FFFF00000000000000000000B3 -:103F10000000000000000000AAAAAAAA00000000F9 -:103F2000FFFF000000000000000000000000000093 -:103F3000000000000A000000000000000300000074 -:103F40000000000000000000000000000000000071 -:103F50000000000000000000000000000000000061 -:103F60000000000000000000FF00960000000008B4 -:103F700004000000883D0008000000000000000070 -:103F80000000000000000000000000000000000031 +:1001E00002E000F000F8FEE772B6374880F30888B6 +:1001F000364880F3098836483649086040F20000E6 +:10020000CCF200004EF63471CEF200010860BFF36C +:100210004F8FBFF36F8F40F20000C0F2F0004EF638 +:100220008851CEF200010860BFF34F8FBFF36F8F8C +:100230004FF00000E1EE100A4EF63C71CEF20001E4 +:100240000860062080F31488BFF36F8F02F074FA01 +:1002500003F074F94FF055301F491B4A91423CBFDF +:1002600041F8040BFAE71D49184A91423CBF41F896 +:10027000040BFAE71A491B4A1B4B9A423EBF51F83E +:10028000040B42F8040BF8E700201849184A914281 +:100290003CBF41F8040BFAE702F052FA03F0A2F96E +:1002A000144C154DAC4203DA54F8041B8847F9E7A7 +:1002B00000F042F8114C124DAC4203DA54F8041B22 +:1002C0008847F9E702F03ABA000600200022002031 +:1002D0000000000808ED00E00000002000060020FB +:1002E000A03E0008002200204C22002050220020C6 +:1002F00020310020E0010008E0010008E0010008D2 +:10030000E00100082DE9F04F2DED108AC1F80CD066 +:10031000C3689D46BDEC108ABDE8F08F002383F3CF +:1003200011882846A047002001F098FDFEE701F063 +:1003300027FD00DFFEE7000038B500F0DFFB02F02C +:10034000CFF940B1164B6FF03F01002259720F21D7 +:100350001A729972DA7202F0A9F9054602F0E2F90E +:100360000446C8B90F4B9D4218D001339D4218BFB7 +:10037000044641F2883504BF01240025002002F024 +:100380009FF90CB100F076F800F018FD284600F057 +:10039000C1F800F06FF8F9E70025EFE70546EDE753 +:1003A00000220020010007B008B500F073FBA0F1A7 +:1003B00020035842584108BD07B541F212030221FB +:1003C00001A8ADF8043000F083FB03B05DF804FB36 +:1003D00038B5302383F31188174803680BB101F057 +:1003E00009FE164A144800234FF47A7101F0F8FD13 +:1003F000002383F31188124C236813B12368013B57 +:100400002360636813B16368013B63600D4D2B7813 +:1004100033B963687BB9022000F03AFC3223636091 +:100420002B78032B07D163682BB9022000F030FC36 +:100430004FF47A73636038BD50220020D103000866 +:100440007023002068220020084B187003280CD865 +:10045000DFE800F008050208022000F00FBC0220CF +:1004600000F002BC024B00225A6070476822002054 +:1004700070230020234B244A10B51C461968013113 +:100480003FD004339342F9D16268A24239D31F4B63 +:100490009B6803F1006303F580439A4231D2002048 +:1004A00000F046FB0220FFF7CFFF194B1A6C002229 +:1004B0001A64196E1A66196E596C5A64596E5A6626 +:1004C0005A6E5A6942F080025A615A6922F08002DB +:1004D0005A615A691A6942F000521A611A6922F087 +:1004E00000521A611B6972B64FF0E0233021C3F845 +:1004F000084DD4E9003281F311889D4683F30888C2 +:10050000104710BD004000082040000800220020D5 +:10051000003802402DE9F04F93B0AA4B0090202202 +:10052000FF210AA89D6800F0F3FBA74A1378A3B93E +:10053000A648012103601170302383F311880368FA +:100540000BB101F057FDA24AA04800234FF47A7185 +:1005500001F046FD002383F31188009B13B19D4BEE +:10056000009A1A609C4A009C1378032B1EBF00233C +:100570001370984A4FF0000A18BF5360D34656468E +:10058000D146012000F07AFB24B1924B1B68002B6E +:1005900000F01182002000F07DFA0390039B002BF5 +:1005A000F2DB012000F060FB039B213B162BE8D817 +:1005B00001A252F823F000BF150600083D0600080E +:1005C000D10600088305000883050008830500089C +:1005D0005B0700082B09000845080008A708000869 +:1005E000CF080008F508000883050008070900087F +:1005F0008305000879090008B5060008830500088E +:10060000BD09000821060008B5060008830500089A +:10061000A70800080220FFF7C7FE002840F0F58178 +:10062000009B0221BAF1000F08BF1C4605A841F249 +:100630001233ADF8143000F04BFAA2E74FF47A70A1 +:1006400000F028FA071EEBDB0220FFF7ADFE0028C2 +:10065000E6D0013F052F00F2DA81DFE807F0030A58 +:100660000D10133605230593042105A800F030FA78 +:1006700017E054480421F9E758480421F6E75848A0 +:100680000421F3E74FF01C08404600F053FA08F14C +:1006900004080590042105A800F01AFAB8F12C0FFF +:1006A000F2D1012000FA07F747EA0B0B5FFA8BFB48 +:1006B0004FF0000900F078FB26B10BF00B030B2B79 +:1006C00008BF0024FFF778FE5BE746480421CDE72A +:1006D000002EA5D00BF00B030B2BA1D10220FFF7AE +:1006E00063FE074600289BD0012000F021FA02207B +:1006F000FFF7AAFE00261FFA86F8404600F028FA07 +:10070000044690B10021404600F032FA013600283C +:10071000F1D1BA46044641F21213022105A8ADF800 +:1007200014303E4600F0D4F92BE70120FFF78CFE91 +:100730002546244B9B68AB4207D9284600F0FAF9BE +:10074000013040F067810435F3E7234B00251D702D +:10075000204BBA465D603E46ACE7002E3FF460AFEA +:100760000BF00B030B2B7FF45BAF0220FFF76CFE4B +:10077000322000F08FF9B0F10008FFF651AF18F009 +:1007800003077FF44DAF0F4A926808EB05039342CD +:100790003FF646AFB8F5807F3FF742AF124B01936B +:1007A000B84523DD4FF47A7000F074F90390039A92 +:1007B000002AFFF635AF019B039A03F8012B01379E +:1007C000EDE700BF002200206C2300205022002013 +:1007D000D10300087023002068220020042200209A +:1007E000082200200C2200206C220020C820FFF7E5 +:1007F000DBFD074600283FF413AF1F2D11D8C5F1CC +:10080000200242450AAB25F0030028BF4246834937 +:100810000192184400F056FA019A8048FF2100F036 +:1008200077FA4FEAA8037D490193C8F38702284667 +:1008300000F076FA064600283FF46DAF019B05EB09 +:10084000830537E70220FFF7AFFD00283FF4E8AE4D +:1008500000F0BAF900283FF4E3AE0027B846704B29 +:100860009B68BB4218D91F2F11D80A9B01330ED0A9 +:1008700027F0030312AA134453F8203C0593404683 +:10088000042205A900F0F6FA04378046E7E7384667 +:1008900000F050F90590F2E7CDF81480042105A886 +:1008A00000F016F906E70023642104A8049300F081 +:1008B00005F900287FF4B4AE0220FFF775FD00288B +:1008C0003FF4AEAE049800F067F90590E6E7002328 +:1008D000642104A8049300F0F1F800287FF4A0AE8E +:1008E0000220FFF761FD00283FF49AAE049800F063 +:1008F00063F9EAE70220FFF757FD00283FF490AEC6 +:1009000000F072F9E1E70220FFF74EFD00283FF406 +:1009100087AE05A9142000F06DF904210746049064 +:1009200004A800F0D5F83946B9E7322000F0B2F853 +:10093000071EFFF675AEBB077FF472AE384A9268A9 +:1009400007EB090393423FF66BAE0220FFF72CFD45 +:1009500000283FF465AE27F003074F44B9453FF444 +:10096000A9AE484600F0E6F80421059005A800F07D +:10097000AFF809F10409F1E74FF47A70FFF714FDBD +:1009800000283FF44DAE00F01FF9002844D00A9B28 +:1009900001330BD008220AA9002000F0C1F9002879 +:1009A0003AD02022FF210AA800F0B2F9FFF704FD97 +:1009B0001C4801F059FA13B0BDE8F08F002E3FF447 +:1009C0002FAE0BF00B030B2B7FF42AAE0023642118 +:1009D00005A8059300F072F8074600287FF420AEC2 +:1009E0000220FFF7E1FC804600283FF419AEFFF734 +:1009F000E3FC41F2883001F037FA059800F018FA6C +:100A0000464600F0D1F93C46BBE5064652E64FF0BB +:100A1000000905E6BA467EE637467CE66C220020F1 +:100A200000220020A08601002DE9F84F4FF47A73D0 +:100A3000DFF85880DFF8589006460D4602FB03F7B2 +:100A4000002498F900305A1C5FFA84FA01D0A342BE +:100A500012D159F8240003682A46D3F820B0314651 +:100A60003B46D847854207D1074B012083F800A0B9 +:100A7000BDE8F88F0124E4E7002CFBD04FF4FA70B6 +:100A800001F0F2F90020F3E7B82300201022002043 +:100A90001422002007B50023024601210DF10700B2 +:100AA0008DF80730FFF7C0FF20B19DF8070003B0B5 +:100AB0005DF804FB4FF0FF30F9E700000A4608B587 +:100AC0000421FFF7B1FF80F00100C0B2404208BD31 +:100AD00030B4074B0A461978064B53F82140236877 +:100AE000DD69054B0146AC46204630BC604700BF7F +:100AF000B823002014220020A086010070B501F068 +:100B0000D3FC094E094D3080002428683388834285 +:100B100008D901F0C3FC2B6804440133B4F5804FBD +:100B20002B60F2D370BD00BFBA23002078230020D1 +:100B300001F070BD00F1006000F580400068704772 +:100B400000F10060920000F5804001F0FBBC000065 +:100B5000054B1A68054B1B889B1A834202D9104427 +:100B600001F09CBC0020704778230020BA230020AD +:100B700038B5084D044629B128682044BDE83840FE +:100B800001F0ACBC2868204401F090FC0028F3D0B0 +:100B900038BD00BF7823002010F003030AD1B0F560 +:100BA000047F05D200F10050A0F51040D0F80038C5 +:100BB000184670470023FBE700F10050A0F51040F5 +:100BC000D0F8100A70470000064991F8243033B17C +:100BD0000023086A81F824300822FFF7B1BF012002 +:100BE000704700BF7C230020014B1868704700BF8E +:100BF000002004E070B5194B1D68194B0138C5F38E +:100C00000B0408442D0C04221E88A6420BD15C68FC +:100C10000A46013C824213460FD214F9016F4EB1CD +:100C200002F8016BF6E7013A03F10803ECD18142C7 +:100C30000B4602D22C2203F8012B0A4A05241688FF +:100C4000AE4204D1984284BF967803F8016B013C10 +:100C500002F10402F3D1581A70BD00BF002004E075 +:100C6000503B00083C3B0008022802BF024B4FF4F7 +:100C700080529A61704700BF00100240022802BFF4 +:100C8000024B4FF080529A61704700BF0010024043 +:100C9000022801BF024A536983F4805353617047AD +:100CA0000010024070B504464FF47A764CB1412CE6 +:100CB000254628BF412506FB05F001F0D5F8641B49 +:100CC000F4E770BD10B50023934203D0CC5CC4544C +:100CD0000133F9E710BD000010B5013810F9013FEC +:100CE0003BB191F900409C4203D11AB10131013A64 +:100CF000F4E71AB191F90020981A10BD1046FCE7EC +:100D000003460246D01A12F9011B0029FAD1704796 +:100D100002440346934202D003F8011BFAE77047EE +:100D20002DE9F8431F4D144695F8242007468846C0 +:100D300052BBDFF870909CB395F824302BB9202279 +:100D4000FF2148462F62FFF7E3FF95F82400C0F12A +:100D50000802A24228BF2246D6B24146920005EBC5 +:100D60008000FFF7AFFF95F82430A41B1E44F6B2B5 +:100D7000082E17449044E4B285F82460DBD1FFF7D5 +:100D800023FF0028D7D108E02B6A03EB82038342BC +:100D9000CFD0FFF719FF0028CBD10020BDE8F883A2 +:100DA0000120FBE77C230020024B1A78024B1A70CB +:100DB000704700BFB82300201022002038B5174C20 +:100DC000174D204600F0B6FB2946204600F0DEFB1A +:100DD0002D686A6D936B23F4002393634FF47A704C +:100DE000FFF760FF0F49284600F0D6FC6A6D0E4DF4 +:100DF000936B28680D4943F400239363A0424FF49A +:100E0000E1330B6001D000F0F5FA6868A04204D02D +:100E1000BDE83840054900F0EDBA38BD98280020FB +:100E20005C3C0008643C000814220020A42300203D +:100E300070B50C4B0C4D1E780C4B55F826209A4281 +:100E400004460DD00A4B002114221846FFF760FF1C +:100E50000460014655F82600BDE8704000F0CABAAB +:100E600070BD00BFB8230020142200209828002065 +:100E7000A423002030B5094D0A4491420DD011F849 +:100E8000013B5840082340F30004013B2C4013F081 +:100E9000FF0384EA5000F6D1EFE730BD2083B8EDC0 +:100EA000026843681143016003B1184770470000AE +:100EB000024AD36843F0C003D36070470044004047 +:100EC00010B5054C054A0021204600F071FA044A8D +:100ED000044BC4E9972310BDBC230020B10E0008C9 +:100EE0000044004080DE8002234A037C002918BFB2 +:100EF0000A46012B30B5C0F868220CD11F4B98422E +:100F000009D11F4B196C41F400311964196E41F479 +:100F1000003119661B6EB2F904501468D0F86032C3 +:100F2000D0F85C12002D03EB5403B3FBF4F3BEBF07 +:100F300023F0070503F0070343EA450394888B6019 +:100F4000D38843F040030B61138943F001034B61E5 +:100F500044F4045343F02C03CB6004F4A054002366 +:100F60000B60B4F5806F0B684B680CBF7F23FF23C9 +:100F700080F8643230BD00BF703B0008BC23002005 +:100F8000003802402DE9F041D0F85C62F768336820 +:100F9000DA0504469DB20DD5302383F311884FF452 +:100FA00080610430FFF77CFF6FF4807333600023AF +:100FB00083F31188302383F3118804F1040815F0BA +:100FC0002F033AD183F31188380615D5290613D596 +:100FD000302383F3118804F1380000F065F900280C +:100FE0004EDA0821201DFFF75BFF4FF67F733B4071 +:100FF000F360002383F311887A0616D56B0614D5A7 +:10100000302383F31188D4E913239A420AD1236C45 +:1010100043B127F040073F041021201D3F0CFFF78C +:101020003FFFF760002383F31188D4F86822D36868 +:1010300043B3BDE8F041106918472B0714D015F0F1 +:10104000080F0CBF00214FF48071E80748BF41F042 +:101050002001AA0748BF41F040016B0748BF41F09B +:1010600080014046FFF71CFFAD06736805D594F874 +:1010700064122046194000F0CBF93568ADB29EE706 +:101080007060B6E7BDE8F081F8B51546826806697C +:10109000AA420B46816938BF8568761AB542044674 +:1010A0000BD218462A46FFF70DFEA3692B44A36115 +:1010B000A3685B1BA3602846F8BD0CD918463246CE +:1010C000FFF700FEAF1BE1683A463044FFF7FAFD38 +:1010D000E3683B44EBE718462A46FFF7F3FDE36875 +:1010E000E5E7000083689342F7B51546044638BF2C +:1010F0008568D0E90460361AB5420BD22A46FFF75C +:10110000E1FD63692B446361A36828465B1BA36010 +:1011100003B0F0BD0DD932460191FFF7D3FD01991F +:10112000E068AF1B3A463144FFF7CCFDE3683B442F +:10113000E9E72A46FFF7C6FDE368E4E710B50A448D +:101140000024C361029B8460C0E90000C0E905116E +:10115000C1600261036210BD08B5D0E90532934257 +:1011600001D1826882B98268013282605A1C426170 +:101170001970D0E904329A4224BFC3684361002148 +:1011800000F08EFE002008BD4FF0FF30FBE70000AE +:1011900070B5302304460E4683F31188A568A5B1C7 +:1011A000A368A269013BA360531CA361157822695F +:1011B000934224BFE368A361E3690BB120469847DB +:1011C000002383F31188284607E03146204600F0CB +:1011D00057FE0028E2DA85F3118870BD2DE9F74F3C +:1011E00004460E4617469846D0F81C904FF0300A39 +:1011F0008AF311884FF0000B154665B12A46314637 +:101200002046FFF741FF034660B94146204600F003 +:1012100037FE0028F1D0002383F31188781B03B038 +:10122000BDE8F08FB9F1000F03D001902046C84708 +:10123000019B8BF31188ED1A1E448AF31188DCE7B9 +:10124000C0E90511C160C3611144009B8260C0E91F +:101250000000016103627047F8B504460D4616466A +:10126000302383F31188A768A7B1A368013BA3606B +:1012700063695A1C62611D70D4E904329A4224BF2A +:10128000E3686361E3690BB120469847002080F36F +:10129000118807E03146204600F0F2FD0028E2DA2E +:1012A00087F31188F8BD0000D0E905239A4210B5F4 +:1012B00001D182687AB98268013282605A1C8261E7 +:1012C0001C7803699A4224BFC3688361002100F03F +:1012D000E7FD204610BD4FF0FF30FBE72DE9F74F4B +:1012E00004460E4617469846D0F81C904FF0300A38 +:1012F0008AF311884FF0000B154665B12A46314636 +:101300002046FFF7EFFE034660B94146204600F055 +:10131000B7FD0028F1D0002383F31188781B03B0B8 +:10132000BDE8F08FB9F1000F03D001902046C84707 +:10133000019B8BF31188ED1A1E448AF31188DCE7B8 +:10134000026843681143016003B118477047000009 +:101350001430FFF743BF00004FF0FF331430FFF7A6 +:101360003DBF00003830FFF7B9BF00004FF0FF333A +:101370003830FFF7B3BF00001430FFF709BF00009B +:101380004FF0FF311430FFF703BF00003830FFF794 +:1013900063BF00004FF0FF323830FFF75DBF000041 +:1013A000012914BF6FF0130000207047FFF788BDBC +:1013B00037B515460E4A026000224260C0E902229B +:1013C0000122044602740B46009000F15C014FF4C8 +:1013D00080721430FFF7B2FE00942B464FF48072F7 +:1013E00004F5AE7104F13800FFF72AFF03B030BDF9 +:1013F000843B000810B53023044683F31188FFF7BF +:1014000073FD02232374002080F3118810BD0000B7 +:1014100038B5C36904460D461BB904210844FFF7DB +:101420008FFF294604F11400FFF796FE002806DA24 +:10143000201D4FF40061BDE83840FFF781BF38BD83 +:10144000026843681143016003B118477047000008 +:1014500013B5446BD4F894341A681178042915D163 +:10146000217C022912D11979128901238B40134260 +:101470000CD101A904F14C0001F016FFD4F89444FA +:10148000019B21790246206800F0D0F902B010BD1E +:10149000143001F099BE00004FF0FF33143001F01A +:1014A00093BE00004C3001F06BBF00004FF0FF33E3 +:1014B0004C3001F065BF0000143001F067BE000041 +:1014C0004FF0FF31143001F061BE00004C3001F0EC +:1014D00037BF00004FF0FF324C3001F031BF000049 +:1014E0000020704710B5D0F894341A681178042998 +:1014F000044617D1017C022914D15979528901235C +:101500008B4013420ED1143001F0FAFD024648B16F +:10151000D4F894444FF4807361792068BDE810409A +:1015200000F072B910BD0000406BFFF7DBBF000098 +:10153000704700007FB5124B036000234360C0E991 +:101540000233012502260F4B0574044602900193D5 +:1015500000F18402294600964FF48073143001F0A4 +:10156000ABFD094B0294CDE9006304F523724FF4FF +:101570008073294604F14C0001F072FE04B070BD86 +:10158000AC3B000829150008511400080B683022F4 +:1015900082F311880A7903EB820290614A79093259 +:1015A00043F822008A7912B103EB82039861022387 +:1015B000C0F894140374002080F311887047000071 +:1015C00038B5037F044613B190F85430ABB9201DF1 +:1015D00001250221FFF734FF04F1140025776FF095 +:1015E000010100F069FC84F8545004F14C006FF0E4 +:1015F0000101BDE8384000F05FBC38BD10B50121E5 +:1016000004460430FFF71CFF0023237784F854308E +:1016100010BD000038B504460025143001F064FD0B +:1016200004F14C00257701F033FE201D84F854505E +:101630000121FFF705FF2046BDE83840FFF752BF04 +:1016400090F8443003F06003202B07D190F8452038 +:10165000212A4FF0000303D81F2A06D80020704724 +:10166000222AFBD1C0E90E3303E0034A826307223A +:10167000C2630364012070471C22002037B5D0F8F4 +:1016800094341A681178042904461AD1017C02297D +:1016900017D11979128901238B40134211D100F11E +:1016A0004C05284601F0B4FE58B101A9284601F0C6 +:1016B000FBFDD4F89444019B21790246206800F098 +:1016C000B5F803B030BD0000F0B500EB810385B084 +:1016D0009E6904460D46FEB1302383F3118804EB66 +:1016E0008507301D0821FFF7ABFEFB685B691B68AF +:1016F00006F14C001BB1019001F0E4FD019803A933 +:1017000001F0D2FD024648B1039B2946204600F075 +:101710008DF8002383F3118805B0F0BDFB685A698A +:101720001268002AF5D01B8A013B1340F1D104F165 +:101730004402EAE7093138B550F82140DCB13023E2 +:1017400083F31188D4F894241368527903EB82034D +:10175000DB689B695D6845B104216018FFF770FE86 +:10176000294604F1140001F0D5FC2046FFF7BAFE2B +:10177000002383F3118838BD7047000001F034B8AE +:10178000012303700023C0E90133C3618362036254 +:10179000C36243620363704738B50446302383F362 +:1017A00011880025C0E90355C0E90555416001F0E5 +:1017B0002BF80223237085F31188284638BD0000DA +:1017C00070B500EB810305465069DA600E46144699 +:1017D00018B110220021FFF79BFAA06918B110225E +:1017E0000021FFF795FA31462846BDE8704001F028 +:1017F000D5B80000826802F0011282600022C0E9C0 +:101800000422826101F056B9F0B400EB81044789EB +:10181000E4680125A4698D403D4345812360002390 +:10182000A2606360F0BC01F071B90000F0B400EB9D +:1018300081040789E468012564698D403D43058181 +:1018400023600023A2606360F0BC01F0EBB90000EC +:1018500070B50223002504460370C0E90255C0E9B3 +:101860000455C564856180F8345001F033F863682D +:101870001B6823B129462046BDE87040184770BD5B +:101880000378052B10B504460AD080F850300523A4 +:10189000037043681B680BB1042198470023A360C1 +:1018A00010BD00000178052906D190F8502043684A +:1018B00002701B6803B118477047000070B590F8BC +:1018C0003430044613B1002380F8343004F144026C +:1018D000204601F011F963689B68B3B994F844306D +:1018E00013F0600535D00021204601F0B1FB002146 +:1018F000204601F0A3FB63681B6813B10621204654 +:101900009847062384F8343070BD20469847002855 +:10191000E4D0B4F84A30E26B9A4288BFE36394F9AA +:101920004430E56B002B4FF0300380F20381002D33 +:1019300000F0F280092284F8342083F3118800211A +:10194000D4E90E232046FFF771FF002383F31188AB +:10195000DAE794F8452003F07F0343EA022340F2DC +:101960000232934200F0C58021D8B3F5807F48D081 +:101970000DD8012B3FD0022B00F09380002BB2D169 +:1019800004F14C02A2630222E2632364C1E7B3F5CF +:10199000817F00F09B80B3F5407FA4D194F846305E +:1019A000012BA0D1B4F84C3043F0020332E0B3F580 +:1019B000006F4DD017D8B3F5A06F31D0A3F5C06339 +:1019C000012B90D8636894F846205E6894F847101D +:1019D000B4F848302046B047002884D04368A36359 +:1019E0000368E3631AE0B3F5106F36D040F60242A5 +:1019F00093427FF478AF5C4BA3630223E36300233D +:101A0000C3E794F84630012B7FF46DAFB4F84C3047 +:101A100023F00203C4E90E55A4F84C30256478E79E +:101A2000B4F84430B3F5A06F0ED194F8463084F882 +:101A30004E30204600F0A6FF63681B6813B10121F9 +:101A400020469847032323700023C4E90E339CE704 +:101A500004F14F03A3630123C3E72378042B10D1C0 +:101A6000302383F311882046FFF7C4FE85F31188E5 +:101A70000321636884F84F5021701B680BB1204626 +:101A8000984794F84630002BDED084F84F3004237A +:101A9000237063681B68002BD6D00221204698472C +:101AA000D2E794F848301D0603F00F0120460AD50E +:101AB00001F014F8012804D002287FF414AF2B4B56 +:101AC0009AE72B4B98E700F0FBFFF3E794F84630DA +:101AD000002B7FF408AF94F8483013F00F01B3D017 +:101AE0001A06204602D501F0C7FAADE701F0BAFAAE +:101AF000AAE794F84630002B7FF4F5AE94F848300E +:101B000013F00F01A0D01B06204602D501F0A0FA69 +:101B10009AE701F093FA97E7142284F8342083F3CC +:101B200011882B462A4629462046FFF76DFE85F38D +:101B30001188E9E65DB1152284F8342083F3118819 +:101B40000021D4E90E232046FFF75EFEFDE60B22BE +:101B500084F8342083F311882B462A4629462046F0 +:101B6000FFF764FEE3E700BFDC3B0008D43B00085E +:101B7000D83B000838B590F834300446002B3ED0EE +:101B8000063BDAB20F2A34D80F2B32D8DFE803F045 +:101B9000373131082232313131313131313137375A +:101BA000C56BB0F84A309D4214D2C3681B8AB5FB9E +:101BB000F3F203FB12556DB9302383F311882B46E2 +:101BC0002A462946FFF732FE85F311880A2384F856 +:101BD00034300EE0142384F83430302383F311883A +:101BE00000231A4619462046FFF70EFE002383F312 +:101BF000118838BD036C03B198470023E7E7002143 +:101C0000204601F025FA0021204601F017FA63680A +:101C10001B6813B10621204698470623D7E700002A +:101C200010B590F83430142B044629D017D8062B61 +:101C300005D001D81BB110BD093B022BFBD80021F8 +:101C4000204601F005FA0021204601F0F7F963680B +:101C50001B6813B1062120469847062319E0152B6F +:101C6000E9D10B2380F83430302383F3118800232B +:101C70001A461946FFF7DAFD002383F31188DAE7E5 +:101C8000C3689B695B68002BD5D1036C03B198478F +:101C9000002384F83430CEE700230375826803699B +:101CA0001B6899689142FBD25A68036042601060D9 +:101CB0005860704700230375826803691B68996840 +:101CC0009142FBD85A6803604260106058607047C8 +:101CD00008B50846302383F311880B7D032B05D00C +:101CE000042B0DD02BB983F3118808BD8B6900221A +:101CF0001A604FF0FF338361FFF7CEFF0023F2E756 +:101D0000D1E9003213605A60F3E70000FFF7C4BF67 +:101D1000054BD9680875186802681A60536001227B +:101D20000275D860FEF7EEBA2826002030B50C4BBD +:101D3000DD684B1C87B004460FD02B46094A684625 +:101D400000F04EF92046FFF7E3FF009B13B1684611 +:101D500000F050F9A86907B030BDFFF7D9FFF9E7E7 +:101D600028260020D11C0008044B1A68DB68906804 +:101D70009B68984294BF00200120704728260020CD +:101D8000084B10B51C68D86822681A60536001229D +:101D90002275DC60FFF78EFF01462046BDE810404B +:101DA000FEF7B0BA2826002038B5074C0749084886 +:101DB000012300252370656001F068FB0223237076 +:101DC00085F3118838BD00BF90280020E43B00084F +:101DD0002826002000F044B9034A516853685B1A72 +:101DE0009842FBD8704700BF001000E08B600223D0 +:101DF00008618B82084670478368A3F1840243F828 +:101E0000142C026943F8442C426943F8402C094AD7 +:101E100043F8242CC26843F8182C022203F80C2C37 +:101E2000002203F80B2C044A43F8102CA3F12000E5 +:101E3000704700BF1D0300082826002008B5FFF7E3 +:101E4000DBFFBDE80840FFF761BF0000024BDB6825 +:101E500098610F20FFF75CBF28260020302383F312 +:101E60001188FFF7F3BF000008B50146302383F364 +:101E700011880820FFF75AFF002383F3118808BD5B +:101E8000064BDB6839B1426818605A6013604360E2 +:101E90000420FFF74BBF4FF0FF307047282600208B +:101EA0000368984206D01A6802605060996118462B +:101EB000FFF72CBF7047000038B504460D46206878 +:101EC000844200D138BD036823605C608561FFF700 +:101ED0001DFFF4E710B503689C68A2420CD85C684B +:101EE0008A600B604C602160596099688A1A9A6018 +:101EF0004FF0FF33836010BD1B68121BECE700003E +:101F00000A2938BF0A2170B504460D460A26601911 +:101F100001F0B4FA01F09CFA041BA54203D8751C29 +:101F20002E460446F3E70A2E04D9BDE8704001208E +:101F300001F0ECBA70BD0000F8B5144B0D46D96144 +:101F400003F1100141600A2A1969826038BF0A2230 +:101F5000016048601861A818144601F07FFA0A274A +:101F600001F076FA431BA342064606D37C1C2819CF +:101F700001F084FA27463546F2E70A2F04D9BDE876 +:101F8000F840012001F0C2BAF8BD00BF28260020A9 +:101F9000F8B506460D4601F05BFA0F4A134653F8B2 +:101FA000107F9F4206D12A4601463046BDE8F840E0 +:101FB000FFF7C2BFD169BB68441A2C1928BF2C4651 +:101FC000A34202D92946FFF79BFF22463146034828 +:101FD000BDE8F840FFF77EBF282600203826002005 +:101FE00010B4C0E9032300235DF8044B4361FFF7FD +:101FF000CFBF000010B5194C236998420DD0D0E92D +:102000000032816813605A609A680A449A6000231B +:1020100003604FF0FF33A36110BD2346026843F80D +:10202000102F53600022026022699A4203D1BDE85A +:10203000104001F01DBA936881680B44936001F071 +:1020400007FA2269E1699268441AA242E4D911446C +:10205000BDE81040091AFFF753BF00BF2826002033 +:102060002DE9F047DFF8BC8008F110072C4ED8F8B6 +:10207000105001F0EDF9D8F81C40AA68031B9A42F1 +:102080003ED81444D5E900324FF00009C8F81C408E +:1020900013605A60C5F80090D8F81030B34201D1EF +:1020A00001F0E6F989F31188D5E90331284698470C +:1020B000302383F311886B69002BD8D001F0C8F965 +:1020C0006A69A0EB04094A4582460DD2022001F05C +:1020D0001DFA0022D8F81030B34208D151462846E4 +:1020E000BDE8F047FFF728BF121A2244F2E712EBCF +:1020F000090938BF4A4629463846FFF7EBFEB5E7DF +:10210000D8F81030B34208D01444211AC8F81C0083 +:10211000A960BDE8F047FFF7F3BEBDE8F08700BF58 +:10212000382600202826002000207047FEE7000007 +:10213000704700004FF0FF307047000002290CD0BC +:10214000032904D00129074818BF00207047032A3B +:1021500005D8054800EBC2007047044870470020CE +:10216000704700BFC03C00082C220020743C0008CF +:1021700070B59AB00546084601A9144600F0C2F8A9 +:1021800001A8FEF7BDFD431C5B00C5E90034002239 +:10219000237003236370C6B201AB02341046D1B280 +:1021A0008E4204F1020401D81AB070BD13F8011B6D +:1021B00004F8021C04F8010C0132F0E708B53023E2 +:1021C00083F311880348FFF759FA002383F311883A +:1021D00008BD00BF9828002090F8443003F01F028B +:1021E000012A07D190F845200B2A03D10023C0E92A +:1021F0000E3315E003F06003202B08D1B0F848300F +:102200002BB990F84520212A03D81F2A04D8FFF7BC +:1022100017BA222AEBD0FAE7034A82630722C26385 +:1022200003640120704700BF2322002007B5052961 +:1022300017D8DFE801F0191603191920302383F3AA +:102240001188104A01900121FFF7BAFA01980E4A4D +:102250000221FFF7B5FA0D48FFF7DCF9002383F3FD +:10226000118803B05DF804FB302383F3118807481D +:10227000FFF7A6F9F2E7302383F311880348FFF74D +:10228000BDF9EBE7143C0008383C00089828002012 +:1022900038B50C4D0C4C0D492A4604F10800FFF7E7 +:1022A00067FF05F1CA0204F110000949FFF760FF5A +:1022B00005F5CA7204F118000649BDE83840FFF779 +:1022C00057BF00BF602D00202C220020F03B0008EB +:1022D000FD3B0008083C000870B5044608460D4662 +:1022E000FEF70EFDC6B22046013403780BB918463E +:1022F00070BD32462946FEF7EFFC0028F3D10120DD +:10230000F6E700002DE9F84F05460C46FEF7F8FC0D +:102310002B49C6B22846FFF7DFFF08B10336F6B2F5 +:1023200028492846FFF7D8FF08B11036F6B2632EC9 +:102330000DD8DFF88C80DFF88C90234FDFF890A069 +:10234000DFF890B02E7846B92670BDE8F88F2946A0 +:102350002046BDE8F84F01F0D3BB252E2BD1072234 +:1023600041462846FEF7B8FC58B9DBF80030236038 +:10237000DBF804306360BBF80830238107350A348A +:10238000E0E7082249462846FEF7A6FC98B90F4B1D +:10239000A21C197809090232C95D02F8041C13F85D +:1023A000011B01F00F015345C95D02F8031CF0D178 +:1023B00018340835C6E704F8016B0135C2E700BFE1 +:1023C000E03C0008083C0008F33C0008107AFF1FBE +:1023D0001C7AFF1FE83C0008BFF34F8F024AD36806 +:1023E000DB03FCD4704700BF003C024008B5094B3A +:1023F0001B7873B9FFF7F0FF074B1A69002ABFBFBC +:10240000064A5A6002F188325A601A6822F48062E1 +:102410001A6008BDBE2F0020003C02402301674522 +:1024200008B50B4B1B7893B9FFF7D6FF094B1A6918 +:1024300042F000421A611A6842F480521A601A6827 +:1024400022F480521A601A6842F480621A6008BD51 +:10245000BE2F0020003C02401728F0B516D80C4CC7 +:102460000C4923787BB90C4D0E4618234FF00062BF +:1024700055F8047B46F8042B013B13F0FF033A4464 +:10248000F6D10123237051F82000F0BD0020FCE7B5 +:1024900020300020C02F0020043D0008014B53F8DD +:1024A00020007047043D000818207047172810B519 +:1024B000044601D9002010BDFFF7CEFF064B53F8AC +:1024C00024301844C21A0BB90120F4E71268013213 +:1024D000F0D1043BF6E700BF043D0008172838B5EB +:1024E000044628D81549FFF777FFFFF77FFFF3234E +:1024F000CB600C23B0FBF3F203FB1205D30143EADC +:10250000C503DBB243F4007343F002030B610B69B4 +:1025100043F480330B61FFF75FFFFFF79DFF084B2C +:1025200053F8241000F0DAF8FFF77AFF2046BDE8F0 +:102530003840FFF7BBBF002038BD00BF003C024061 +:10254000043D0008F8B512F00103144642D1821888 +:10255000B2F1026F57D82D4B1B6813F0010352D014 +:102560002B4DFFF743FFF323EB60FFF735FF40F2FE +:102570000127032C15D824F001046618244C401AB6 +:1025800040F20117B142236900EB010524D123F089 +:1025900001032361FFF744FF0120F8BD043C043030 +:1025A000E7E78307E7D12B6923F440732B612B699D +:1025B0003B432B6151F8046B0660BFF34F8FFFF76D +:1025C0000BFF03689E42E9D02B6923F001032B61C6 +:1025D000FFF726FF0020E0E723F44073236123691F +:1025E0003B4323610B882B80BFF34F8FFFF7F4FE33 +:1025F0002D8831F8023BADB2AB42C3D0236923F042 +:1026000001032361E4E71846C7E700BF0038024032 +:10261000003C0240084908B50B7828B11BB9FFF708 +:10262000E5FE01230B7008BD002BFCD0BDE808407F +:102630000870FFF7F5BE00BFBE2F002010B50244A2 +:10264000064BD2B2904200D110BD441C00B253F8E8 +:10265000200041F8040BE0B2F4E700BF502800402E +:102660000F4B30B51C6F240407D41C6F44F4007466 +:102670001C671C6F44F400441C670A4C236843F435 +:10268000807323600244084BD2B2904200D130BD27 +:10269000441C00B251F8045B43F82050E0B2F4E768 +:1026A00000380240007000405028004007B5012269 +:1026B00001A90020FFF7C2FF019803B05DF804FBF9 +:1026C00013B50446FFF7F2FFA04205D0012201A98D +:1026D00000200194FFF7C4FF02B010BD7047000056 +:1026E000094B5A88B2F5805F10460BD022F00203E6 +:1026F00041F20102934205D041F20703C31A584246 +:102700005841704701207047002004E0034B1A68CD +:102710001AB9034AD2F874281A607047243000208E +:102720000030024008B5FFF7F1FF024B1868C0F314 +:10273000407008BD2430002070470000FEE7000014 +:102740000A4B0B480B4A90420BD30B4BDA1C121A64 +:10275000C11E22F003028B4238BF00220021FEF787 +:10276000D7BA53F8041B40F8041BECE7EC3E000812 +:1027700020310020203100202031002070B5D0E928 +:1027800015439E6800224FF0FF3504EB42135101C0 +:10279000D3F800090028BEBFD3F8000940F08040FC +:1027A000C3F80009D3F8000B0028BEBFD3F8000B14 +:1027B00040F08040C3F8000B013263189642C3F822 +:1027C0000859C3F8085BE0D24FF00113C4F81C3875 +:1027D00070BD0000890141F02001016103699B0681 +:1027E000FCD41220FFF7F8BA10B5054C2046FEF7CE +:1027F000C7FF4FF0A0436365024BA36510BD00BF48 +:1028000028300020883D000870B50378012B05466C +:1028100050D12A4B446D98421BD1294B5A6B42F040 +:1028200080025A635A6D42F080025A655A6D5A69A5 +:1028300042F080025A615A6922F080025A610E21E8 +:1028400043205B6900F022FC1E4BE3601E4BC4F882 +:1028500000380023C4F8003EC02323606E6D4FF49F +:102860005023A3633369002BFCDA012333610C206E +:10287000FFF7B2FA3369DB07FCD41220FFF7ACFA9A +:102880003369002BFCDA0026A6602846FFF776FFA6 +:102890006B68C4F81068DB68C4F81468C4F81C6876 +:1028A0004BB90A4BA3614FF0FF336361A36843F058 +:1028B0000103A36070BD064BF4E700BF2830002081 +:1028C000003802404014004003002002003C30C0A9 +:1028D000083C30C0F8B5446D054600212046FFF79E +:1028E00079FFA96D00234FF001128F68C4F83438C6 +:1028F0004FF00066C4F81C284FF0FF3004EB431281 +:1029000001339F42C2F80069C2F8006BC2F808099F +:10291000C2F8080BF2D20B686A6DEB656362102394 +:102920001361166916F01006FBD11220FFF754FA56 +:10293000D4F8003823F4FE63C4F80038A36943F4E4 +:10294000402343F01003A3610923C4F81038C4F8EE +:1029500014380A4BEB604FF0C043C4F8103B084BEF +:10296000C4F8003BC4F81069C4F80039EB6D03F1FA +:10297000100243F48013EA65A362F8BD643D0008C9 +:1029800040800010426D90F84E10D2F8003823F4C9 +:10299000FE6343EA0113C2F8003870472DE9F8439B +:1029A00000EB8103456DDA68166806F00306731EB6 +:1029B000022B05EB41130C4680460FFA81F94FEAD2 +:1029C00041104FF00001C3F8101B4FF0010104F15A +:1029D000100398BFB60401FA03F391698EBF334E1A +:1029E00006F1805606F5004600293AD0578A04F1D0 +:1029F0005801490137436F50D5F81C180B43C5F8EF +:102A00001C382B180021C3F8101953690127611EC7 +:102A1000A7409BB3138A928B9B08012A88BF53431C +:102A2000D8F85C20981842EA034301F1400205EB14 +:102A30008202C8F85C00214653602846FFF7CAFEB0 +:102A400008EB8900C3681B8A43EA84534834640155 +:102A50001E432E51D5F81C381F43C5F81C78BDE81D +:102A6000F88305EB4917D7F8001B21F40041C7F89C +:102A7000001BD5F81C1821EA0303C0E704F13F034B +:102A800005EB83030A4A5A6028462146FFF7A2FE57 +:102A900005EB4910D0F8003923F40043C0F80039A1 +:102AA000D5F81C3823EA0707D7E700BF00800010DD +:102AB00000040002826D1268C265FFF75FBE00006D +:102AC0005831436D49015B5813F4004004D013F4AE +:102AD000001F0CBF02200120704700004831436DE9 +:102AE00049015B5813F4004004D013F4001F0CBFDD +:102AF000022001207047000000EB8101CB68196AB9 +:102B00000B6813604B6853607047000000EB810353 +:102B100030B5DD68AA691368D36019B9402B84BF4A +:102B2000402313606B8A1468426D1C44013CB4FB63 +:102B3000F3F46343033323F0030302EB411043EA4E +:102B4000C44343F0C043C0F8103B2B6803F00303B9 +:102B5000012B09B20ED1D2F8083802EB411013F460 +:102B6000807FD0F8003B14BF43F0805343F0005304 +:102B7000C0F8003B02EB4112D2F8003B43F00443A3 +:102B8000C2F8003B30BD00002DE9F041244D6E6DD0 +:102B900006EB40130446D3F8087BC3F8087B3807DC +:102BA0000AD5D6F81438190706D505EB8403214653 +:102BB000DB6828465B689847FA071FD5D6F81438B3 +:102BC000DB071BD505EB8403D968CCB98B69488A30 +:102BD0005A68B2FBF0F600FB16228AB91868DA6868 +:102BE00090420DD2121AC3E90024302383F31188D6 +:102BF0000B482146FFF78AFF84F31188BDE8F08176 +:102C0000012303FA04F26B8923EA02036B81CB6888 +:102C1000002BF3D021460248BDE8F041184700BF21 +:102C20002830002000EB810370B5DD68436D6C69CE +:102C30002668E6604A0156BB1A444FF40020C2F8E9 +:102C400010092A6802F00302012A0AB20ED1D3F851 +:102C5000080803EB421410F4807FD4F8000914BF75 +:102C600040F0805040F00050C4F8000903EB4212DD +:102C7000D2F8000940F00440C2F80009D3F8340843 +:102C8000012202FA01F10143C3F8341870BD19B9E9 +:102C9000402E84BF4020206020682E8A8419013C89 +:102CA000B4FBF6F440EAC44040F000501A44C6E7D2 +:102CB0002DE9F8433B4D6E6D06EB40130446D3F807 +:102CC0000889C3F8088918F0010F4FEA40171AD095 +:102CD000D6F81038DB0716D505EB8003D9684B69A9 +:102CE0001868DA68904230D2121A4FF000091A6060 +:102CF000C3F80490302383F3118821462846FFF758 +:102D000091FF89F3118818F0800F1CD0D6F8343861 +:102D10000126A640334216D005EB84036D6DD3F82F +:102D20000CC0DCF814200134E4B2D2F800E005EB6A +:102D300004342F445168714515D3D5F8343823EA4B +:102D40000606C5F83468BDE8F883012303FA04F2E7 +:102D50002B8923EA02032B818B68002BD3D02146D9 +:102D600028469847CFE7BCF81000AEEB010383423A +:102D700028BF0346D7F8180980B2B3EB800FE2D81A +:102D80009068A0F1040959F8048FC4F80080A0EB02 +:102D900009089844B8F1040FF5D818440B44906022 +:102DA0005360C7E7283000202DE9F74FA24C656D2E +:102DB0006E69AB691E4016F480586E6107D02046DC +:102DC000FEF746FD03B0BDE8F04F00F04DBC002E0D +:102DD00012DAD5F8003E98489B071EBFD5F8003E92 +:102DE00023F00303C5F8003ED5F8043823F00103AF +:102DF000C5F80438FEF756FD370505D58E48FFF7B0 +:102E0000BDFC8D48FEF73CFDB0040CD5D5F8083864 +:102E100013F0060FEB6823F470530CBF43F4105308 +:102E200043F4A053EB6031071BD56368DB681BB923 +:102E3000AB6923F00803AB612378052B0CD1D5F8DF +:102E4000003E7D489A071EBFD5F8003E23F00303DD +:102E5000C5F8003EFEF726FD6368DB680BB17648D7 +:102E60009847F30274D4B70227D5D4F85490DFF80A +:102E7000C8B100274FF0010A09EB4712D2F8003B16 +:102E800003F44023B3F5802F11D1D2F8003B002B7F +:102E90000DDA62890AFA07F322EA0303638104EB7D +:102EA0008703DB68DB6813B1394658469847A36D42 +:102EB00001379B68FFB29F42DED9F00617D5676DD8 +:102EC0003A6AC2F30A1002F00F0302F4F012B2F5EC +:102ED000802F00F08580B2F5402F08D104EB8303EA +:102EE0000022DB681B6A07F5805790426AD13003E5 +:102EF000D5F8184813D5E10302D50020FFF744FEAA +:102F0000A20302D50120FFF73FFE630302D5022092 +:102F1000FFF73AFE270302D50320FFF735FE7503BE +:102F20007FF550AFE00702D50020FFF7C1FEA107F3 +:102F300002D50120FFF7BCFE620702D50220FFF791 +:102F4000B7FE23077FF53EAF0320FFF7B1FE39E759 +:102F5000636DDFF8E4A0019300274FF00109A36D32 +:102F60009B685FFA87FB9B453FF67DAF019B03EBB8 +:102F70004B13D3F8001901F44021B1F5802F1FD174 +:102F8000D3F8001900291BDAD3F8001941F0904159 +:102F9000C3F80019D3F800190029FBDB5946606D0E +:102FA000FFF718FC218909FA0BF321EA03032381B7 +:102FB00004EB8B03DB689B6813B159465046984776 +:102FC0000137CCE7910708BFD7F80080072A98BFE0 +:102FD00003F8018B02F1010298BF4FEA182884E739 +:102FE000023304EB830207F580575268D2F818C009 +:102FF000DCF80820DCE9001CA1EB0C0C0021884265 +:103000000AD104EB830463689B699A6802449A605E +:103010005A6802445A606AE711F0030F08BFD7F8F4 +:1030200000808C4588BF02F8018B01F1010188BF47 +:103030004FEA1828E3E700BF28300020436D03EB78 +:103040004111D1F8003B43F40013C1F8003B704735 +:10305000436D03EB4111D1F8003943F40013C1F87B +:1030600000397047436D03EB4111D1F8003B23F465 +:103070000013C1F8003B7047436D03EB4111D1F8D9 +:10308000003923F40013C1F80039704700F16043A0 +:1030900003F561430901C9B283F80013012200F06E +:1030A0001F039A4043099B0003F1604303F561430A +:1030B000C3F880211A60704730B5039C0172043355 +:1030C00004FB0325C0E90653049B03630021059B11 +:1030D000C160C0E90000C0E90422C0E90842C0E9BB +:1030E0000A11436330BD0000416A0022C0E90411A7 +:1030F000C0E90A22C2606FF00101FEF7DDBE0000E8 +:10310000D0E90432934201D1C2680AB9181D704750 +:103110000020704703691960C2680132C260C26949 +:10312000134482690361934224BF436A036100210F +:10313000FEF7B6BE38B504460D46E3683BB162699A +:10314000131D1268A3621344E362002007E0237A90 +:1031500033B929462046FEF793FE0028EDDA38BD44 +:103160006FF00100FBE70000C368C269013BC36068 +:103170004369134482694361934224BF436A4361B4 +:1031800000238362036B03B11847704770B5302387 +:10319000044683F31188866A3EB9FFF7CBFF0546E4 +:1031A00018B186F31188284670BDA36AE26A13F845 +:1031B000015BA362934202D32046FFF7D5FF0023B1 +:1031C00083F31188EFE700002DE9F84F04460E461F +:1031D000174698464FF0300989F311880025AA4612 +:1031E000D4F828B0BBF1000F09D141462046FFF7C3 +:1031F000A1FF20B18BF311882846BDE8F88FD4E9F0 +:103200000A12A7EB050B521A934528BF9346BBF150 +:10321000400F1BD9334601F1400251F8040B43F82B +:10322000040B9142F9D1A36A40334036A362403582 +:10323000D4E90A239A4202D32046FFF795FF8AF386 +:103240001188BD42D8D289F31188C9E730465A4661 +:10325000FDF738FDA36A5B445E44A3625D44E7E783 +:1032600010B5029C0172043303FB0421C0E906136C +:103270000023C0E90A33039B0363049BC460C0E9D5 +:103280000000C0E90422C0E90842436310BD000009 +:10329000026AC260426AC0E904220022C0E90A222E +:1032A0006FF00101FEF708BED0E904239A4201D174 +:1032B000C26822B9184650F8043B0B6070470023DF +:1032C0001846FAE7C368C2690133C360436913440F +:1032D00082694361934224BF436A43610021FEF740 +:1032E000DFBD000038B504460D46E3683BB12369F5 +:1032F0001A1DA262E2691344E362002007E0237A08 +:1033000033B929462046FEF7BBFD0028EDDA38BD6B +:103310006FF00100FBE7000003691960C268013A21 +:10332000C260C269134482690361934224BF436A45 +:10333000036100238362036B03B1184770470000E9 +:1033400070B530230D460446114683F31188866A12 +:103350002EB9FFF7C7FF10B186F3118870BDA36ABD +:103360001D70A36AE26A01339342A36204D3E16948 +:1033700020460439FFF7D0FF002080F31188EDE7E5 +:103380002DE9F84F04460D46904699464FF0300A15 +:103390008AF311880026B346A76A4FB949462046EA +:1033A000FFF7A0FF20B187F311883046BDE8F88F02 +:1033B000D4E90A073A1AA8EB0607974228BF17462E +:1033C000402F1BD905F1400355F8042B40F8042B7E +:1033D0009D42F9D1A36A4033A3624036D4E90A235F +:1033E0009A4204D3E16920460439FFF795FF8BF335 +:1033F00011884645D9D28AF31188CDE729463A4645 +:10340000FDF760FCA36A3B443D44A3623E44E5E70C +:10341000D0E904239A4217D1C3689BB1836A8BB168 +:10342000043B9B1A0ED01360C368013BC360C369A1 +:103430001A44836902619A4224BF436A03610023EC +:1034400083620123184670470023FBE700F036B97A +:10345000014B586A704700BF000C0040034B00222C +:1034600058631A610222DA60704700BF000C004006 +:10347000014B0022DA607047000C0040014B58639A +:10348000704700BF000C0040FEE7000070B51B4B0A +:1034900001630025044686B0586085620E4600F040 +:1034A000BFF804F11003C4E904334FF0FF33C4E95B +:1034B0000635C4E90044A560E562FFF7C9FF2B4665 +:1034C0000246C4E9082304F134010D4A256580232E +:1034D0002046FEF78BFC0123E0600A4A0375009248 +:1034E00072680192B268CDE90223074B6846CDE9C4 +:1034F0000435FEF7A3FC06B070BD00BF9028002085 +:10350000943D0008993D000889340008024AD36AB6 +:103510001843D062704700BF282600204B684360E4 +:103520008B688360CB68C3600B6943614B6903623E +:103530008B6943620B6803607047000008B5264B37 +:1035400026481A6940F2FF110A431A611A6922F4E7 +:10355000FF7222F001021A611A691A6B0A431A6398 +:103560001A6D0A431A651E4A1B6D1146FFF7D6FFF6 +:1035700002F11C0100F58060FFF7D0FF02F1380175 +:1035800000F58060FFF7CAFF02F1540100F580608A +:10359000FFF7C4FF02F1700100F58060FFF7BEFF86 +:1035A00002F18C0100F58060FFF7B8FF02F1A8017D +:1035B00000F58060FFF7B2FF02F1C40100F5806002 +:1035C000FFF7ACFF02F1E00100F58060FFF7A6FF16 +:1035D000BDE8084000F0F0B80038024000000240AA +:1035E000A03D000808B500F06BFAFEF7DDFBFFF721 +:1035F0008DF8BDE80840FEF74BBE000070470000A4 +:10360000EFF3098305494A6B22F001024A636833EC +:1036100083F30988002383F31188704700EF00E0EB +:10362000302080F3118862B60C4B0D4AD96821F422 +:10363000E0610904090C0A43DA60D3F8FC20094967 +:1036400042F08072C3F8FC200A6842F001020A606E +:103650002022DA7783F82200704700BF00ED00E0F7 +:103660000003FA05001000E010B5302383F3118841 +:103670000E4B5B6813F4006314D0F1EE103AEFF3D5 +:103680000984683C4FF08073E361094BDB6B236670 +:1036900084F30988FEF768FB10B1064BA36110BDE7 +:1036A000054BFBE783F31188F9E700BF00ED00E06D +:1036B00000EF00E02F030008320300080E4B1A6CE5 +:1036C00042F008021A641A6E42F008021A660B4AA7 +:1036D0001B6E936843F008039360094B53229A6270 +:1036E0004FF0FF32DA6200229A615A63DA605A6060 +:1036F00001225A611A60704700380240002004E03D +:10370000000C0040094A08B51169D3680B40D9B2D2 +:10371000C9439B07116107D5302383F31188FEF756 +:1037200059FB002383F3118808BD00BF000C004043 +:103730001F4B1A696FEAC2526FEAD2521A611A69B4 +:10374000C2F308021A614FF0FF301A695A695861D2 +:1037500000215A6959615A691A6A62F080521A62E4 +:103760001A6A02F080521A621A6A5A6A58625A6ACF +:1037700059625A6A1A6C42F080521A641A6E42F008 +:1037800080521A661A6E0B4A106840F480701060FE +:10379000186F00F44070B0F5007F1EBF4FF480300A +:1037A00018671967536823F40073536000F060B919 +:1037B0000038024000700040344B4FF080521A64D1 +:1037C000334A4FF4404111601A6842F001021A6016 +:1037D0001A689107FCD59A6822F003029A602B4B75 +:1037E0009A6812F00C02FBD1196801F0F901196016 +:1037F0009A601A6842F480321A601A689203FCD503 +:103800005A6F42F001025A67204B5A6F9007FCD55D +:10381000204A5A601A6842F080721A601C4A536843 +:103820005904FCD5194B1A689201FCD51A4A9A60C2 +:103830000322C3F88C20194B1A68194B9A42194B72 +:1038400021D1194A1168194A91421CD140F205123E +:103850001A60144A136803F00F03052BFAD10B4BBF +:103860009A6842F002029A609A6802F00C02082AF2 +:10387000FAD15A6C42F480425A645A6E42F4804241 +:103880005A665B6E704740F20572E1E7003802400D +:10389000007000401854400700948838002004E06D +:1038A00011640020003C024000ED00E041C20F41E5 +:1038B000074A08B5536903F00103536123B1054A70 +:1038C00013680BB150689847BDE80840FFF7CCBEBD +:1038D000003C0140A0300020074A08B5536903F0BE +:1038E0000203536123B1054A93680BB1D06898472E +:1038F000BDE80840FFF7B8BE003C0140A030002002 +:10390000074A08B5536903F00403536123B1054A1C +:1039100013690BB150699847BDE80840FFF7A4BE92 +:10392000003C0140A0300020074A08B5536903F06D +:103930000803536123B1054A93690BB1D0699847D5 +:10394000BDE80840FFF790BE003C0140A0300020D9 +:10395000074A08B5536903F01003536123B1054AC0 +:10396000136A0BB1506A9847BDE80840FFF77CBE68 +:10397000003C0140A0300020164B10B55C6904F4F7 +:1039800078725A61A30604D5134A936A0BB1D06AC0 +:103990009847600604D5104A136B0BB1506B9847DB +:1039A000210604D50C4A936B0BB1D06B9847E20506 +:1039B00004D5094A136C0BB1506C9847A30504D584 +:1039C000054A936C0BB1D06C9847BDE81040FFF7E7 +:1039D0004BBE00BF003C0140A0300020194B10B589 +:1039E0005C6904F47C425A61620504D5164A136D81 +:1039F0000BB1506D9847230504D5134A936D0BB155 +:103A0000D06D9847E00404D50F4A136E0BB1506E89 +:103A10009847A10404D50C4A936E0BB1D06E984719 +:103A2000620404D5084A136F0BB1506F9847230402 +:103A300004D5054A936F0BB1D06F9847BDE810408D +:103A4000FFF712BE003C0140A030002008B503483B +:103A5000FDF798FABDE80840FFF706BEBC2300203A +:103A600008B5FFF74FFEBDE80840FFF7FDBD0000B9 +:103A7000062108B50846FFF709FB06210720FFF7D6 +:103A800005FB06210820FFF701FB06210920FFF7AF +:103A9000FDFA06210A20FFF7F9FA06211720FFF7A1 +:103AA000F5FA06212820FFF7F1FA07213220FFF767 +:103AB000EDFABDE808400C212620FFF7E7BA000028 +:103AC00008B5FFF735FE00F00DF8FDF76FFCFDF7C8 +:103AD00055FEFDF72DFDFFF791FDBDE80840FFF70E +:103AE000B5BC00000023054A19460133102BC2E97A +:103AF000001102F10802F8D1704700BFA030002089 +:103B0000034611F8012B03F8012B002AF9D1704765 +:103B100053544D3332463F3F3F0053544D333246AA +:103B20003430780053544D33324634327800535495 +:103B30004D333246343436585800000001203300EB +:103B40000010410001105A00031059000710310005 +:103B500000000000103B0008130400001A3B00089E +:103B600019040000243B0008210400002E3B00083B +:103B700000960000000000000000000000000000AF +:103B800000000000000000006D1300085913000839 +:103B900095130008811300088D130008791300089D +:103BA0006513000851130008A1130008000000006D +:103BB000AD14000899140008D5140008C1140008B9 +:103BC000CD140008B9140008A514000891140008C9 +:103BD000E1140008000000000100000000000000E7 +:103BE00063300000E03B0008802600209028002081 +:103BF0004865782F50726F6669434E430025424FE7 +:103C0000415244252D424C002553455249414C25F3 +:103C1000000000000200000000000000C9160008BB +:103C20003517000840004000302D0020402D0020B6 +:103C3000020000000000000003000000000000007F +:103C4000791700080000000010000000502D00202F +:103C500000000000010000000000000028300020EB +:103C6000010102002D2200083D210008D921000891 +:103C7000BD210008430000007C3C0008090243000D +:103C8000020100C032090400000102020100052403 +:103C9000001001052401000104240202052406008D +:103CA00001070582030800FF09040100020A000061 +:103CB00000070501024000000705810240000000E6 +:103CC00012000000C83C0008120110010200004070 +:103CD000AE2D0111000201020301000004030904DA +:103CE00025424F415244250043756265426C616331 +:103CF0006B2B00303132333435363738394142435B +:103D00004445460000400000004000000040000024 +:103D1000004000000000010000000200000002005E +:103D2000000002000000020000000200000002008B +:103D300000000200004000000040000000400000C1 +:103D4000004000000000010000000200000002002E +:103D5000000002000000020000000200000002005B +:103D60000000020000000000BD180008751B0008DC +:103D7000211C0008400040008830002088300020CE +:103D80000100000098300020800000004001000089 +:103D9000030000006D61696E0069646C65000000DD +:103DA0000000812A00020000AAAAAAAA000000249A +:103DB000FFFF00000000000000A00A00000000005B +:103DC00000000000AAAAAAAA00000000FFFF00004D +:103DD000000000000000000014000054000000007B +:103DE000AAAAAAAA14000054FFFF000000000000C5 +:103DF000000000008069100000000000AAAA8AAA42 +:103E000040561000FFFF0000007070070000000027 +:103E10004001000100000000AAAAAAAA00010000B7 +:103E2000F7FF00000000000000000000000000009C +:103E300000000000AAAAAAAA00000000FFFF0000DC +:103E40000000000000000000000000000000000072 +:103E5000AAAAAAAA00000000FFFF000000000000BC +:103E60000000000000000000000000000A00000048 +:103E7000000000000300000000000000000000003F +:103E80000000000000000000000000000000000032 +:103E90000000000000000000000000000000000022 +:103EA000EB0300000000000000C01F000000000045 +:103EB000FF00000098280020BC230020009600008E +:103EC0000000080096000000000800000400000048 +:103ED000DC3C0008000000000000000000000000C2 +:0C3EE000000000000000000000000000D6 :00000001FF diff --git a/Tools/bootloaders/CubeBlack_bl.bin b/Tools/bootloaders/CubeBlack_bl.bin index c103a92ad4..7a800b2278 100755 Binary files a/Tools/bootloaders/CubeBlack_bl.bin and b/Tools/bootloaders/CubeBlack_bl.bin differ diff --git a/Tools/bootloaders/CubeBlack_bl.elf b/Tools/bootloaders/CubeBlack_bl.elf index 6048f8ee90..6eaf422529 100755 Binary files a/Tools/bootloaders/CubeBlack_bl.elf and b/Tools/bootloaders/CubeBlack_bl.elf differ diff --git a/Tools/bootloaders/CubeBlack_bl.hex b/Tools/bootloaders/CubeBlack_bl.hex index 3000a28a13..4460c7c47d 100644 --- a/Tools/bootloaders/CubeBlack_bl.hex +++ b/Tools/bootloaders/CubeBlack_bl.hex @@ -1,1026 +1,1009 @@ :020000040800F2 -:1000000000060020E1010008F50E0008F90E0008C6 -:10001000510F0008F90E0008250F0008E301000841 -:10002000E3010008E3010008E301000805290008D6 +:1000000000060020E1010008E3010008E301000808 +:10001000E3010008E3010008E3010008E301000830 +:10002000E3010008E3010008E301000801360008CD :10003000E3010008E3010008E3010008E301000810 :10004000E3010008E3010008E3010008E301000800 -:10005000E3010008E3010008D5390008013A00086F -:100060002D3A0008593A0008853A0008E3010008D3 +:10005000E3010008E3010008B1380008D9380008BE +:10006000013900082939000851390008E301000866 :10007000E3010008E3010008E3010008E3010008D0 :10008000E3010008E3010008E3010008E3010008C0 -:10009000E3010008E3010008E3010008B13A0008A9 +:10009000E3010008E3010008E301000879390008E2 :1000A000E3010008E3010008E3010008E3010008A0 :1000B000E3010008E3010008E3010008E301000890 :1000C000E3010008E3010008E3010008E301000880 -:1000D000E3010008E3010008011100081511000800 -:1000E000193B0008E3010008E3010008E3010008F0 +:1000D000E3010008E30100084D3A0008E3010008CD +:1000E000DD390008E3010008E3010008E30100082E :1000F000E3010008E3010008E3010008E301000850 -:10010000E3010008E301000841380008E3010008AA +:10010000E3010008E3010008613A0008E301000888 :10011000E3010008E3010008E3010008E30100082F :10012000E3010008E3010008E3010008E30100081F :10013000E3010008E3010008E3010008E30100080F -:10014000E3010008E3010008E3010008493000086A +:10014000E3010008E3010008E3010008A92D00080D :10015000E3010008E3010008E3010008E3010008EF :10016000E3010008E3010008E3010008E3010008DF :10017000E3010008E3010008E3010008E3010008CF -:10018000E3010008E301000829110008E301000869 +:10018000E3010008E3010008E3010008E3010008BF :10019000E3010008E3010008E3010008E3010008AF :1001A000E3010008E3010008E3010008E30100089F :1001B000E3010008E3010008E3010008E30100088F :1001C000E3010008E3010008E3010008E30100087F :1001D000E3010008E3010008E3010008E30100086F -:1001E00002E000F000F8FEE772B6394880F30888B4 -:1001F000384880F3098838484EF60851CEF200019D -:10020000086040F20000CCF200004EF63471CEF2ED -:1002100000010860BFF34F8FBFF36F8F40F2000003 -:10022000C0F2F0004EF68851CEF200010860BFF334 -:100230004F8FBFF36F8F4FF00000E1EE100A4EF6C4 -:100240003C71CEF200010860062080F31488BFF3F1 -:100250006F8F02F0B5FB03F04BFA4FF055301F499A -:100260001B4A91423CBF41F8040BFAE71C49194A6A -:1002700091423CBF41F8040BFAE71A491A4A1B4B5A -:100280009A423EBF51F8040B42F8040BF8E70020F5 -:100290001749184A91423CBF41F8040BFAE702F0B3 -:1002A00093FB03F081FA144C144DAC4203DA54F87A -:1002B000041B8847F9E700F041F8114C114DAC429E -:1002C00003DA54F8041B8847F9E702F07BBB00000F -:1002D000000600200022002000000008000000208E -:1002E00000060020C03F0008002200203422002029 -:1002F0003822002014350020E0010008E001000849 -:10030000E0010008E00100082DE9F04F2DED108A12 -:10031000C1F80CD0C3689D46BDEC108ABDE8F08FD3 -:10032000002383F311882846A047002001F00CFF2A -:10033000FEE701F08DFE00DFFEE7000038B500F0BB -:10034000AFFC40B1174B6FF03F01002259720F21F3 -:100350001A729972DA7202F0A7FA044602F0CCFA25 -:100360000546D8B9104B9C421AD001339C4218BFA5 -:10037000054641F2883404BF01250024002002F024 -:100380009DFA0DB100F05AF800F05AFD00F0B6FBEE -:10039000204600F0B1F800F051F8F9E70024EDE74D -:1003A0000446EBE700220020010007B008B500F08A -:1003B00071FBA0F120035842584108BD07B5054B19 -:1003C00002211B88ADF8043001A800F081FB03B0C6 -:1003D0005DF804FB003C000810B5202383F311886E -:1003E0001248C3680BB101F04BFF0023104A0F48BD -:1003F0004FF47A7101F0F2FE002383F311880D4C63 -:10040000236813B12368013B2360636813B16368F9 -:10041000013B6360084B1B7833B9636823B9022042 -:1004200000F07CFC3223636010BD00BF3822002046 -:10043000D9030008542300204C22002010B5254B7E -:10044000254953F8042F013200D110BD8B42F8D159 -:10045000224C234B22689A423AD9224B9B6803F1E3 -:10046000006303F580439A4232D2002000F060FB23 -:100470001D4B0220187000F047FC1C4B1A6C002228 -:100480001A64196E1A66196E596C5A64596E5A6656 -:100490005A6E5A6942F080025A615A6922F080020B -:1004A0005A615A691A6942F000521A611A6922F0B7 -:1004B00000521A611B6972B60D4A0E4B13601B681D -:1004C0002268202181F311889D4683F30888104714 -:1004D00010BD00BFFC3F00081C400008044000089D -:1004E000FF3F0008002200204C220020003802407C -:1004F00008ED00E0004000082DE9F04F99B0B94D3B -:1005000000902022FF2110A8AC6800F03BFCB64A06 -:1005100001951378A3B9B5480121C3601170202358 -:1005200083F31188C3680BB101F0AAFE0023B04A1F -:10053000AE484FF47A7101F051FE002383F3118825 -:10054000009BAC4A03B11360AB4B009D02930026A5 -:100550001E705660B2463746B146012000F0D4FB0B -:10056000002D00F02582A34B1B68002B40F0208259 -:1005700019B0BDE8F08F0220FFF718FF002840F007 -:100580001082009B002E08BF1D469C4B02211B8839 -:10059000ADF82C300BA800F09BFADEE74FF47A7030 -:1005A00000F078FAB0F10008EBDB0220FFF7FEFE66 -:1005B0000028E6D008F1FF38B8F1040F00F2F3810B -:1005C000DFE808F0031E2124270018A8052340F8BF -:1005D000343D042100F07CFA012303FA08F848EACC -:1005E0000A0A5FFA8AFA4FF0000900F01FFC27B1EF -:1005F0000AF00B030B2B08BF0025FFF7DFFEACE76B -:1006000004217848E6E704217D48E3E704217D489A -:10061000E0E74FF01C09484600F08CFA09F10409A4 -:100620000B9004210BA800F053FAB9F12C0FF2D172 -:10063000D2E7002FA5D00AF00B030B2BA1D102208B -:10064000FFF7B4FE804600289BD001206A4E00F0E0 -:100650006FFA0220307000F057FB00275FFA87FB2B -:10066000584600F075FA054688B1584600F080FA01 -:1006700001370028F2D146460025634B02211B8832 -:10068000ADF82C300BA800F023FA474665E70123AC -:100690000220337000F02EFB2C46019B9B689C428D -:1006A00006D2204600F046FA0130E4D10434F4E7E3 -:1006B000029B00241C704F4B46465C604746254613 -:1006C00093E7002F3FF45DAF0AF00B030B2B7FF491 -:1006D00058AF029B0220187000F016FB322000F089 -:1006E000D9F9B0F1000BFFF64CAF1BF003087FF413 -:1006F00048AF019B996804EB0B028A423FF641AF79 -:10070000BBF5807F3FF63DAF404A0392D8450FDAF4 -:100710004FF47A7000F0BEF9049004990029FFF6B6 -:1007200030AF039A049908F8021008F10108ECE7C9 -:10073000C820FFF73BFE804600283FF422AF1F2C65 -:1007400011D8C4F120075F4528BF5F4610AB24F0E5 -:1007500003003A462D49184400F0EAFA3A46FF21D0 -:100760002A4800F00FFB4FEAAB03DAB227490393A4 -:10077000204600F00FFB074600283FF47EAF039BA6 -:1007800004EB830431E70220FFF710FE00283FF45A -:10079000F8AE00F013FA00283FF4F3AE4FF0000873 -:1007A0004346019A9268904532D2B8F11F0F12D891 -:1007B000109A01320FD028F0030218A90A4452F807 -:1007C000202C0B92184604220BA900F0D5FB08F14F -:1007D00004080346E5E74046039300F0ABF9039BAA -:1007E0000B90EFE700220020502300203822002049 -:1007F000D9030008542300204C220020023C0008AA -:100800000422002008220020043C0008502200207E -:1008100018A8042140F84C3D00F05AF9E5E618A864 -:10082000002340F8343D642100F048F900287FF4AB -:10083000A8AE0220FFF7BAFD00283FF4A2AE0B9845 -:1008400000F0A8F918AB43F8480D04211846E3E777 -:1008500018A8002340F8343D642100F02FF9002847 -:100860007FF48FAE0220FFF7A1FD00283FF489AE90 -:100870000B9800F09DF918AB43F8440DE5E7022012 -:10088000FFF794FD00283FF47CAE00F0A7F918AB09 -:1008900043F8400DD9E70220FFF788FD00283FF418 -:1008A00070AE0BA9142000F09FF9804618A804210F -:1008B00040F83C8D00F00CF941460BA8ACE7322023 -:1008C00000F0E8F8B0F10008FFF65BAE18F0030F97 -:1008D0007FF457AE019A926808EB090393423FF602 -:1008E00050AE0220FFF762FD00283FF44AAE28F028 -:1008F0000308C844C1453FF478AE484600F01AF9F1 -:1009000004210A900AA800F0E3F809F10409F1E7CC -:100910004FF47A70FFF74AFD00283FF432AE00F042 -:100920004DF9002842D0109B01330BD0082210A9AA -:10093000002000F02FFA002838D02022FF2110A834 -:1009400000F020FAFFF73AFD364801F003FC0FE60D -:10095000002F3FF416AE0AF00B030B2B7FF411AE01 -:1009600018A8002340F8343D642100F0A7F8804621 -:1009700000287FF406AE0220FFF718FD00283FF4A0 -:1009800000AE0390FFF71AFD41F2883001F0E2FB60 -:100990000B9800F08FFA00F049FA039B45461F467A -:1009A000DBE5074621E64FF00009EAE5B84664E6D4 -:1009B000002000F06FF80490049B002BFFF6D0ADF0 -:1009C000012000F097F9049B213B122B3FF6C5ADA7 -:1009D00001A252F823F000BF770500089D0500082A -:1009E000330600085B0500085B0500085B0500088E -:1009F000C3060008BF080008870700081F08000892 -:100A0000510800087F0800085B05000897080008E7 -:100A10005B05000811090008EB0500085B050008EC -:100A200051090008A08601002DE9F84F4FF47A75AE -:100A3000DFF85880DFF8589007460E4655430024EB -:100A400098F900305A1C5FFA84FA01D0A34210D101 -:100A500059F8240003683246D3F820B039462B46B3 -:100A6000D847864205D1084B83F800A00120BDE895 -:100A7000F88F0134042CE3D14FF4FA7001F06AFBD3 -:100A80000020BDE8F88F00BF9C2300200C2200202E -:100A9000583C000807B502AB002203F8012D0121E4 -:100AA00002461846FFF7C0FF20B19DF8070003B0CB +:1001E00002E000F000F8FEE772B6374880F30888B6 +:1001F000364880F3098836483649086040F20000E6 +:10020000CCF200004EF63471CEF200010860BFF36C +:100210004F8FBFF36F8F40F20000C0F2F0004EF638 +:100220008851CEF200010860BFF34F8FBFF36F8F8C +:100230004FF00000E1EE100A4EF63C71CEF20001E4 +:100240000860062080F31488BFF36F8F02F074FA01 +:1002500003F074F94FF055301F491B4A91423CBFDF +:1002600041F8040BFAE71D49184A91423CBF41F896 +:10027000040BFAE71A491B4A1B4B9A423EBF51F83E +:10028000040B42F8040BF8E700201849184A914281 +:100290003CBF41F8040BFAE702F052FA03F0A2F96E +:1002A000144C154DAC4203DA54F8041B8847F9E7A7 +:1002B00000F042F8114C124DAC4203DA54F8041B22 +:1002C0008847F9E702F03ABA000600200022002031 +:1002D0000000000808ED00E00000002000060020FB +:1002E000A03E0008002200204C22002050220020C6 +:1002F00020310020E0010008E0010008E0010008D2 +:10030000E00100082DE9F04F2DED108AC1F80CD066 +:10031000C3689D46BDEC108ABDE8F08F002383F3CF +:1003200011882846A047002001F098FDFEE701F063 +:1003300027FD00DFFEE7000038B500F0DFFB02F02C +:10034000CFF940B1164B6FF03F01002259720F21D7 +:100350001A729972DA7202F0A9F9054602F0E2F90E +:100360000446C8B90F4B9D4218D001339D4218BFB7 +:10037000044641F2883504BF01240025002002F024 +:100380009FF90CB100F076F800F018FD284600F057 +:10039000C1F800F06FF8F9E70025EFE70546EDE753 +:1003A00000220020010007B008B500F073FBA0F1A7 +:1003B00020035842584108BD07B541F212030221FB +:1003C00001A8ADF8043000F083FB03B05DF804FB36 +:1003D00038B5302383F31188174803680BB101F057 +:1003E00009FE164A144800234FF47A7101F0F8FD13 +:1003F000002383F31188124C236813B12368013B57 +:100400002360636813B16368013B63600D4D2B7813 +:1004100033B963687BB9022000F03AFC3223636091 +:100420002B78032B07D163682BB9022000F030FC36 +:100430004FF47A73636038BD50220020D103000866 +:100440007023002068220020084B187003280CD865 +:10045000DFE800F008050208022000F00FBC0220CF +:1004600000F002BC024B00225A6070476822002054 +:1004700070230020234B244A10B51C461968013113 +:100480003FD004339342F9D16268A24239D31F4B63 +:100490009B6803F1006303F580439A4231D2002048 +:1004A00000F046FB0220FFF7CFFF194B1A6C002229 +:1004B0001A64196E1A66196E596C5A64596E5A6626 +:1004C0005A6E5A6942F080025A615A6922F08002DB +:1004D0005A615A691A6942F000521A611A6922F087 +:1004E00000521A611B6972B64FF0E0233021C3F845 +:1004F000084DD4E9003281F311889D4683F30888C2 +:10050000104710BD004000082040000800220020D5 +:10051000003802402DE9F04F93B0AA4B0090202202 +:10052000FF210AA89D6800F0F3FBA74A1378A3B93E +:10053000A648012103601170302383F311880368FA +:100540000BB101F057FDA24AA04800234FF47A7185 +:1005500001F046FD002383F31188009B13B19D4BEE +:10056000009A1A609C4A009C1378032B1EBF00233C +:100570001370984A4FF0000A18BF5360D34656468E +:10058000D146012000F07AFB24B1924B1B68002B6E +:1005900000F01182002000F07DFA0390039B002BF5 +:1005A000F2DB012000F060FB039B213B162BE8D817 +:1005B00001A252F823F000BF150600083D0600080E +:1005C000D10600088305000883050008830500089C +:1005D0005B0700082B09000845080008A708000869 +:1005E000CF080008F508000883050008070900087F +:1005F0008305000879090008B5060008830500088E +:10060000BD09000821060008B5060008830500089A +:10061000A70800080220FFF7C7FE002840F0F58178 +:10062000009B0221BAF1000F08BF1C4605A841F249 +:100630001233ADF8143000F04BFAA2E74FF47A70A1 +:1006400000F028FA071EEBDB0220FFF7ADFE0028C2 +:10065000E6D0013F052F00F2DA81DFE807F0030A58 +:100660000D10133605230593042105A800F030FA78 +:1006700017E054480421F9E758480421F6E75848A0 +:100680000421F3E74FF01C08404600F053FA08F14C +:1006900004080590042105A800F01AFAB8F12C0FFF +:1006A000F2D1012000FA07F747EA0B0B5FFA8BFB48 +:1006B0004FF0000900F078FB26B10BF00B030B2B79 +:1006C00008BF0024FFF778FE5BE746480421CDE72A +:1006D000002EA5D00BF00B030B2BA1D10220FFF7AE +:1006E00063FE074600289BD0012000F021FA02207B +:1006F000FFF7AAFE00261FFA86F8404600F028FA07 +:10070000044690B10021404600F032FA013600283C +:10071000F1D1BA46044641F21213022105A8ADF800 +:1007200014303E4600F0D4F92BE70120FFF78CFE91 +:100730002546244B9B68AB4207D9284600F0FAF9BE +:10074000013040F067810435F3E7234B00251D702D +:10075000204BBA465D603E46ACE7002E3FF460AFEA +:100760000BF00B030B2B7FF45BAF0220FFF76CFE4B +:10077000322000F08FF9B0F10008FFF651AF18F009 +:1007800003077FF44DAF0F4A926808EB05039342CD +:100790003FF646AFB8F5807F3FF742AF124B01936B +:1007A000B84523DD4FF47A7000F074F90390039A92 +:1007B000002AFFF635AF019B039A03F8012B01379E +:1007C000EDE700BF002200206C2300205022002013 +:1007D000D10300087023002068220020042200209A +:1007E000082200200C2200206C220020C820FFF7E5 +:1007F000DBFD074600283FF413AF1F2D11D8C5F1CC +:10080000200242450AAB25F0030028BF4246834937 +:100810000192184400F056FA019A8048FF2100F036 +:1008200077FA4FEAA8037D490193C8F38702284667 +:1008300000F076FA064600283FF46DAF019B05EB09 +:10084000830537E70220FFF7AFFD00283FF4E8AE4D +:1008500000F0BAF900283FF4E3AE0027B846704B29 +:100860009B68BB4218D91F2F11D80A9B01330ED0A9 +:1008700027F0030312AA134453F8203C0593404683 +:10088000042205A900F0F6FA04378046E7E7384667 +:1008900000F050F90590F2E7CDF81480042105A886 +:1008A00000F016F906E70023642104A8049300F081 +:1008B00005F900287FF4B4AE0220FFF775FD00288B +:1008C0003FF4AEAE049800F067F90590E6E7002328 +:1008D000642104A8049300F0F1F800287FF4A0AE8E +:1008E0000220FFF761FD00283FF49AAE049800F063 +:1008F00063F9EAE70220FFF757FD00283FF490AEC6 +:1009000000F072F9E1E70220FFF74EFD00283FF406 +:1009100087AE05A9142000F06DF904210746049064 +:1009200004A800F0D5F83946B9E7322000F0B2F853 +:10093000071EFFF675AEBB077FF472AE384A9268A9 +:1009400007EB090393423FF66BAE0220FFF72CFD45 +:1009500000283FF465AE27F003074F44B9453FF444 +:10096000A9AE484600F0E6F80421059005A800F07D +:10097000AFF809F10409F1E74FF47A70FFF714FDBD +:1009800000283FF44DAE00F01FF9002844D00A9B28 +:1009900001330BD008220AA9002000F0C1F9002879 +:1009A0003AD02022FF210AA800F0B2F9FFF704FD97 +:1009B0001C4801F059FA13B0BDE8F08F002E3FF447 +:1009C0002FAE0BF00B030B2B7FF42AAE0023642118 +:1009D00005A8059300F072F8074600287FF420AEC2 +:1009E0000220FFF7E1FC804600283FF419AEFFF734 +:1009F000E3FC41F2883001F037FA059800F018FA6C +:100A0000464600F0D1F93C46BBE5064652E64FF0BB +:100A1000000905E6BA467EE637467CE66C220020F1 +:100A200000220020A08601002DE9F84F4FF47A73D0 +:100A3000DFF85880DFF8589006460D4602FB03F7B2 +:100A4000002498F900305A1C5FFA84FA01D0A342BE +:100A500012D159F8240003682A46D3F820B0314651 +:100A60003B46D847854207D1074B012083F800A0B9 +:100A7000BDE8F88F0124E4E7002CFBD04FF4FA70B6 +:100A800001F0F2F90020F3E7B82300201022002043 +:100A90001422002007B50023024601210DF10700B2 +:100AA0008DF80730FFF7C0FF20B19DF8070003B0B5 :100AB0005DF804FB4FF0FF30F9E700000A4608B587 :100AC0000421FFF7B1FF80F00100C0B2404208BD31 -:100AD00030B4074B1A78074B53F822402368DD697E -:100AE000054B0A46AC460146204630BC604700BF75 -:100AF0009C230020583C0008A086010070B501F03E -:100B0000CFFD094C094E20800025306823888342A0 -:100B100008D901F0BFFD336805440133B5F5804FB6 -:100B20003360F2D370BD00BF9E2300205C23002001 -:100B300001F06CBE00F1006000F580400068704775 -:100B400000F10060920000F5804001F0F7BD000068 +:100AD00030B4074B0A461978064B53F82140236877 +:100AE000DD69054B0146AC46204630BC604700BF7F +:100AF000B823002014220020A086010070B501F068 +:100B0000D3FC094E094D3080002428683388834285 +:100B100008D901F0C3FC2B6804440133B4F5804FBD +:100B20002B60F2D370BD00BFBA23002078230020D1 +:100B300001F070BD00F1006000F580400068704772 +:100B400000F10060920000F5804001F0FBBC000065 :100B5000054B1A68054B1B889B1A834202D9104427 -:100B600001F098BD002070475C2300209E230020E8 -:100B700038B5074D04462868204401F093FD28B994 -:100B800028682044BDE8384001F0A4BD38BD00BF4E -:100B90005C23002010F0030308D1B0F5047F05D2D8 -:100BA00000F10050A0F50840006870470020704731 -:100BB000014BC058704700BF107AFF1F064991F8DB -:100BC000243033B100230822086A81F82430FFF76B -:100BD000B7BF0120704700BF60230020014B186899 -:100BE000704700BF002004E070B52A4B1C68C4F3B6 -:100BF0000B03240C63B140F21342934231D040F214 -:100C0000194293422FD040F2214293422DD1032327 -:100C1000214A0C2505FB03235D6893F9082042F265 -:100C200001039C4224D0B4F5805F23D041F201033C -:100C30009C4221D041F203039C421FD041F20703A2 -:100C40009C4208BF3122441E0C44013D0B46A34286 -:100C50001ED215F9016F581C96B1034600F8016CBD -:100C6000F5E70123D4E70223D2E73F220B4DD6E775 -:100C70003322E3E74122E1E75A22E4E75922E2E79F -:100C80002C2584421D7001D9981C5A70401A70BDE1 -:100C90001846FBE7002004E0283C0008083C000858 -:100CA000124B5A8842F201018A4293B214D0B3F532 -:100CB000805F13D041F20102934211D041F203024E -:100CC00093420FD041F2070293420DD10423084A08 -:100CD00002EB8303D87870470023F8E70123F6E797 -:100CE0000223F4E70323F2E700207047002004E02A -:100CF000143C0008022802BF024B4FF480529A6154 -:100D0000704700BF00100240022802BF024B4FF0A4 -:100D100080529A61704700BF00100240022801BF54 -:100D2000024A536983F480535361704700100240B4 -:100D300010B50023934203D0CC5CC4540133F9E7CF -:100D400010BD000030B5441E14F9010F0B4660B110 -:100D500093F90050854201F1010106D11AB993F9C6 -:100D60000020801A30BD013AEEE7002AF7D1104684 -:100D700030BD000002460346981A13F9011B0029F2 -:100D8000FAD1704702440346934202D003F8011B94 -:100D9000FAE770472DE9F047234C94F824300546D4 -:100DA0008846174683BB2E46DFF87C90C7B394F87D -:100DB00024302BB92022FF2148462662FFF7E2FFAC -:100DC00094F82400C0F10805BD4228BF3D465FFAF3 -:100DD00085FAAD0041462A4604EB8000FFF7A8FFE4 -:100DE00094F82430A7EB0A079A445FFA8AFABAF11A -:100DF000080F2E44A844FFB284F824A0D6D1FFF7F0 -:100E0000DDFE0028D2D108E0266A06EB8306B04258 -:100E1000CAD0FFF7D3FE0028C5D10020BDE8F08777 -:100E20000120BDE8F08700BF60230020024B1A7844 -:100E3000024B1A70704700BF9C2300200C22002038 -:100E4000F8B5164C1648174D174E154F00F098FC84 -:100E50002146134800F0C0FC24681448626D936B6F -:100E600023F40023936301F075F92046104900F044 -:100E7000BFFD626D936B43F4002393634FF4E13342 -:100E80002B60002456F82400B84202D0294600F016 -:100E9000D5FB0134042CF5D1F8BD00BF683D000836 -:100EA000102D002088230020583C000840420F00ED -:100EB000943D000838B50B4B1A780B4B53F8224081 -:100EC0000A4B9C4205460CD0094B002118461422BF -:100ED000FFF758FF056001462046BDE8384000F0A6 -:100EE000ADBB38BD9C230020583C0008102D0020CD -:100EF00088230020FEE7000000B59BB0EFF30981D6 -:100F000068226846FFF714FFEFF30583044B9A6BE2 -:100F1000DA6A9A6A9A6A9A6A9A6A9A6A9B6AFEE78F -:100F200000ED00E000B59BB0EFF309816822684650 -:100F3000FFF7FEFEEFF30583044B9A6B9A6A9A6AF9 -:100F40009A6A9A6A9A6A9B6AFEE700BF00ED00E01F -:100F500000B59BB0EFF3098168226846FFF7E8FE11 -:100F6000EFF30583034B5A6B9A6A9A6A9A6A9A6AF4 -:100F70009B6AFEE700ED00E030B5084D0A4491425F -:100F80000BD011F8013B09245840013CF7D040F345 -:100F900000032B4083EA5000F7E730BD2083B8ED13 -:100FA000002304491A465A50C8180833802B42605F -:100FB000F9D17047A0230020026843681143016003 -:100FC00003B1184770470000024AD36843F0C003DA -:100FD000D360704700440040024AD36843F0C00326 -:100FE000D360704700480040024AD36843F0C00312 -:100FF000D3607047007800402DE9F041D0F85C6282 -:10100000F7683368DA0505469CB20DD5202383F3D3 -:1010100011884FF400710430FFF7CEFF6FF4807336 -:101020003360002383F31188202383F3118805F1B3 -:10103000040814F02F0333D183F31188380615D533 -:10104000210613D5202383F3118805F1380000F021 -:1010500053FA002846DA0821281DFFF7ADFF4FF6A6 -:101060007F733B40F360002383F311887A060ED52B -:1010700063060CD5202383F31188EA6C2B6D9A420A -:1010800002D12B6C002B2FD1002383F31188D5F8CC -:101090006422D368002B31D01069BDE8F0411847B5 -:1010A000230713D014F0080F0CBF00218021E007A4 -:1010B00048BF41F02001A20748BF41F0400163074B -:1010C00048BF41F480714046FFF776FFA40673687D -:1010D00005D595F860122846194000F0BDFA34682D -:1010E000A4B2A6E77060BEE727F040073F041021D6 -:1010F000281D3F0CFFF760FFF760C5E7BDE8F081F2 -:1011000008B50348FFF778FFBDE8084001F02EBCA2 -:101110002024002008B50348FFF76EFFBDE8084013 -:1011200001F024BC8826002008B50348FFF764FFBF -:10113000BDE8084001F01ABCF028002010B50E4CA4 -:101140000E4A2046002100F057FA0D4BC4F85C32DD -:101150000C4C0D4A2046002100F04EFA0B4BC4F80F -:101160005C320B4C0B4A0021204600F045FA0A4B3A -:10117000C4F85C3210BD00BF20240020C90F000855 -:101180000044004088260020D90F00080048004095 -:10119000F0280020E90F00080078004038B5394DEC -:1011A000037C002918BF0D46012B0446C0F8645289 -:1011B00010D1354B984242D1344B1A6C42F4003274 -:1011C0001A641A6E42F400321A661B6E0B21262036 -:1011D00000F06AF82E4BD4F85C229A422B6802D0B9 -:1011E0002C498A424BD12C4901EB5301B1FBF3F35B -:1011F000A988080442BF23F0070003F0070343EA6D -:1012000040039360EB8843F040039BB213612B894A -:1012100043F001039BB2536141F4045343F02C03A8 -:10122000D36001F4A05100231360B1F5806F1368FF -:1012300053680CBF7F23FF2384F8603238BD174BFF -:1012400098420CD1114B1A6C42F480221A641A6E27 -:1012500042F480221A661B6E0B212720B8E7104B40 -:101260009842B7D1094B1A6C42F080421A641A6E48 -:1012700042F080421A661B6E0B215220A8E70949F2 -:10128000B2E700BF883C000820240020003802405C -:10129000001001400014014000BD01058826002017 -:1012A000F028002080DE800200F1604300F01F0281 -:1012B000400903F5614309018000C9B200F16040B3 -:1012C00083F8001300F5614001239340C0F880319A -:1012D00003607047F8B5154682680669AA420B4656 -:1012E000816938BF8568761AB542044607D2184628 -:1012F0002A46FFF71DFDA3692B44A3610DE011D918 -:1013000032461846FFF714FDAF1B3A46E1683044F9 -:10131000FFF70EFDE2683A44A261A3685B1BA3607D -:101320002846F8BD18462A46FFF702FDE368E4E7C1 -:1013300083682DE9F041044693421546266938BF7B -:1013400085684069361AB5420F4606D22A46FFF72D -:10135000EFFC63692B4463610DE012D93246A5EBC3 -:101360000608FFF7E5FC4246B919E068FFF7E0FC24 -:10137000E26842446261A3685B1BA3602846BDE843 -:10138000F0812A46FFF7D4FCE368E4E710B50A448D -:101390000024C361029B006040608460C160816181 -:1013A00041610261036210BD08B5826943699342DD -:1013B00001D1826882B98268013282605A1C42611E -:1013C0001970426903699A4201D3C36843610021DD -:1013D00000F0DCFE002008BD4FF0FF3008BD00002B -:1013E00070B5202304460E4683F31188A568A5B185 -:1013F000A368A269013BA360531CA361157822690D -:10140000934224BFE368A361E3690BB12046984788 -:10141000002383F31188284670BD3146204600F032 -:10142000A5FE0028E2DA85F3118870BD2DE9F74F9B -:1014300005460F4690469A46D0F81C90202686F323 -:1014400011884FF0000B144664B1224639462846F5 -:10145000FFF740FF034668B95146284600F086FE74 -:101460000028F1D0002383F31188A8EB040003B017 -:10147000BDE8F08FB9F1000F03D001902846C847AE -:10148000019B8BF31188E41A1F4486F31188DBE774 -:10149000C16081614161C3611144009B0060406093 -:1014A0008260016103627047F8B504460E46174634 -:1014B000202383F31188A568A5B1A368013BA3602D -:1014C00063695A1C62611E70236962699A4224BF73 -:1014D000E3686361E3690BB120469847002080F31D -:1014E0001188F8BD3946204600F040FE0028E2DAB7 -:1014F00085F31188F8BD0000836942699A4210B5EE -:1015000001D182687AB98268013282605A1C826194 -:101510001C7803699A4201D3C3688361002100F0FB -:1015200035FE204610BD4FF0FF3010BD2DE9F74FBE -:1015300005460F4690469A46D0F81C90202686F322 -:1015400011884FF0000B144664B1224639462846F4 -:10155000FFF7EEFE034668B95146284600F006FE46 -:101560000028F1D0002383F31188A8EB040003B016 -:10157000BDE8F08FB9F1000F03D001902846C847AD -:10158000019B8BF31188E41A1F4486F31188DBE773 -:10159000026843681143016003B1184770470000B7 -:1015A0001430FFF743BF00004FF0FF331430FFF754 -:1015B0003DBF00003830FFF7B9BF00004FF0FF33E8 -:1015C0003830FFF7B3BF00001430FFF709BF000049 -:1015D0004FF0FF311430FFF703BF00003830FFF742 -:1015E00063BF00004FF0FF323830FFF75DBF0000EF -:1015F00000207047FFF7A2BD37B50F4B03600023F3 -:1016000043608360C3600123044603741546009061 -:101610000B464FF4807200F15C011430FFF7B6FE08 -:1016200000942B464FF4807204F5AE7104F138003B -:10163000FFF72EFF03B030BD9C3C000810B52023FF -:10164000044683F31188FFF7A9FD022323740023C6 -:1016500083F3118810BD000038B5C36904460D46F8 -:101660001BB904210844FFF793FF294604F1140035 -:10167000FFF79AFE002806DA201D4FF48061BDE8CE -:101680003840FFF785BF38BD0268436811430160E9 -:1016900003B118477047000013B5446BD4F8943475 -:1016A0001A681178042915D1217C022912D11979DF -:1016B000128901238B4013420CD101A904F14C0083 -:1016C00001F014FFD4F89444019B2179024620686C -:1016D00000F0DAF902B010BD143001F097BE00003E -:1016E0004FF0FF33143001F091BE00004C3001F098 -:1016F00069BF00004FF0FF334C3001F063BF0000C2 -:10170000143001F065BE00004FF0FF31143001F0DD -:101710005FBE00004C3001F035BF00004FF0FF32DB -:101720004C3001F02FBF0000D0F8942438B5136876 -:1017300019780429054601D0012038BD017C022911 -:10174000FAD112795C89012090400440F4D105F16E -:10175000140001F0F7FD02460028EDD0D5F89454AE -:101760004FF480732868697900F07CF9204638BD11 -:10177000406BFFF7D9BF00000020704770470000A2 -:101780007FB5124B0360002343608360C360012573 -:1017900002260F4B057404460290019300F1840267 -:1017A000294600964FF48073143001F0A7FD094BD1 -:1017B0000193029400964FF4807304F52372294636 -:1017C00004F14C0001F06EFE04B070BDC43C000892 -:1017D00071170008991600080B68202282F31188FF -:1017E0000A7903EB820290614A79093243F82200B8 -:1017F0008A7912B103EB8203986102230374C0F863 -:101800009414002383F311887047000038B5037FD8 -:10181000044613B190F85430ABB9201D01250221C4 -:10182000FFF732FF04F1140025776FF0010100F09B -:10183000B9FC84F8545004F14C006FF00101BDE88C -:10184000384000F0AFBC38BD10B50121044604306B -:10185000FFF71AFF0023237784F8543010BD0000EF -:1018600038B504460025143001F060FD04F14C0049 -:10187000257701F02FFE201D84F854500121FFF739 -:1018800003FF2046BDE83840FFF74EBF90F84430D4 -:1018900003F06003202B19D190F84520212A0AD0AB -:1018A000222A4FF000030ED0202A0FD1084A82636B -:1018B0000722C26304E0064B83630723C36300234C -:1018C0000364012070478363C363F9E70020704716 -:1018D0000D220020D0F8943437B51A681178042905 -:1018E00004461AD1017C022917D1197912890123E2 -:1018F0008B40134211D100F14C05284601F0AAFE9D -:1019000058B101A9284601F0F1FDD4F89444019B97 -:1019100021790246206800F0B7F803B030BD00001E -:1019200000EB8103F7B59C6905460E46F4B1202310 -:1019300083F3118805EB8607201D0821FFF7A4FE1D -:10194000FB685B691B684C3413B1204601F0DCFD79 -:1019500001A9204601F0CAFD024648B1019B31466B -:10196000284600F091F8002383F3118803B0F0BDFE -:10197000FB685A691268002AF5D01B8A013B1340A4 -:10198000F1D105F14402EAE7093138B550F82140B8 -:10199000DCB1202383F31188D4F89424136852799E -:1019A00003EB8203DB689B695D6845B10421601825 -:1019B000FFF76AFE294604F1140001F0CDFC204631 -:1019C000FFF7B2FE002383F3118838BD7047000093 -:1019D00001F08CB80123037000234360C36183626C -:1019E0000362C36243620363038143817047000063 -:1019F00038B50446202383F3118800254160C56073 -:101A000005614561856101F081F80223237085F34A -:101A1000118838BD70B500EB810305465069DA6066 -:101A20000E46144618B110220021FFF7ABF9A06949 -:101A300018B110220021FFF7A5F931462846BDE86C -:101A4000704001F02DB90000028902F0010202810C -:101A5000428902F0010242810022026142618261F8 -:101A600001F0B2B9F0B400EB81044789E4680125C4 -:101A7000A4698D403D43458123600023A2606360DB -:101A8000F0BC01F0CDB90000F0B400EB810407898F -:101A9000E468012564698D403D430581236000238E -:101AA000A2606360F0BC01F047BA000070B5022389 -:101AB000002504460370A0F84C5080F84E5080F882 -:101AC0004F5005814581C56005614561856180F89C -:101AD000345001F081F863681B6823B12946204621 -:101AE000BDE87040184770BD037880F8503005237A -:101AF000037043681B6810B504460BB10421984776 -:101B000000232381638110BD436890F850201B6837 -:101B100002700BB1052118477047000090F834306F -:101B200070B5044613B1002380F8343004F1440248 -:101B3000204601F06BF963689B6863BB94F84450DE -:101B400015F0600615D194F8453005F07F0545EA9B -:101B5000032540F202339D4200F00E815BD8022D36 -:101B600000F0DC803FD8002D00F08780012D00F0D0 -:101B7000CF800021204601F0A3FB0021204601F088 -:101B800095FB63681B6813B106212046984706231E -:101B900084F8343070BD204698470028CED094F8A1 -:101BA0004B2094F84A3043EA0223E26B934238BF59 -:101BB000E36394F94430E56B002B4FF0200380F28F -:101BC000FD80002D00F0EC80092284F8342083F39E -:101BD00011880021E36BA26B2046FFF755FF00231D -:101BE00083F3118870BDB5F5817F00F0B180B5F544 -:101BF000407F49D0B5F5807FBBD194F84630012BAA -:101C0000B7D1B4F84C3023F00203A4F84C30A663EB -:101C1000E6632664C3E740F201639D421ED8B5F532 -:101C2000C06F3BD2B5F5A06FA3D1B4F84430B3F583 -:101C3000A06F0ED194F8463084F84E30204601F063 -:101C400023F863681B6813B10121204698470323DA -:101C500023700023A363E3632364A0E7B5F5106F4B -:101C600032D040F602439D4252D0B5F5006F80D18C -:101C700004F14F03A363012324E004F14C03A363A5 -:101C80000223E36325648AE794F84630012B7FF44E -:101C900070AFB4F84C3043F00203B6E794F8492033 -:101CA000616894F848304D6894F8471043EA02237D -:101CB000204694F84620A84700283FF45AAF4368CE -:101CC000A3630368E363A4E72378042B10D12023E4 -:101CD00083F311882046FFF7B7FE86F31188636807 -:101CE00084F84F601B68032121700BB12046984790 -:101CF00094F84630002BACD084F84F300423237086 -:101D000063681B68002BA4D0022120469847A0E7F7 -:101D1000374BA3630223E36300239DE794F8481045 -:101D200011F0800F204601F00F010ED001F060F895 -:101D3000012806D002287FF41CAF2E4BA363E0637A -:101D400067E72D4BA363E56363E701F043F8EFE733 -:101D500094F84630002B7FF40CAF94F8483013F021 -:101D60000F013FF476AF1A06204602D501F0BCFA07 -:101D70006FE701F0AFFA6CE794F84630002B7FF480 -:101D8000F8AE94F8483013F00F013FF462AF1B0631 -:101D9000204602D501F094FA5BE701F087FA58E794 -:101DA000142284F8342083F311882B462A462946CE -:101DB0002046FFF757FE85F3118870BD5DB11522EF -:101DC00084F8342083F311880021E36BA26B204652 -:101DD000FFF748FE03E70B2284F8342083F31188D1 -:101DE0002B462A4629462046FFF74EFEE3E700BF72 -:101DF000F43C0008EC3C0008F03C000838B590F8D2 -:101E000034300446152B29D8DFE803F03E28282873 -:101E100028283E28280B2939282828282828282837 -:101E20003E3E90F84B1090F84A20C36B42EA0122E4 -:101E30009A4214D9C268128AB3FBF2F502FB153537 -:101E40006DB9202383F311882B462A462946FFF7D4 -:101E50001BFE85F311880A2384F8343038BD14231F -:101E600084F83430202383F3118800231A4619465E -:101E70002046FFF7F7FD002383F3118838BD036C7C -:101E800003B198470023E7E7002101F019FA002188 -:101E9000204601F00BFA63681B6813B10621204647 -:101EA00098470623D8E7000090F83420152A38B563 -:101EB000044622D80123934040F6416213421DD1CB -:101EC00013F480150FD19B0217D50B2380F8343003 -:101ED000202383F311882B462A462946FFF7D4FD99 -:101EE00085F3118838BDC3689B695B682BB9036CA7 -:101EF00003B19847002384F8343038BD002101F045 -:101F0000DFF90021204601F0D1F963681B6813B1A5 -:101F10000621204698470623EDE70000024B0022E9 -:101F20001B605B609A607047582B0020002303748D -:101F30008268054B1B6899689142FBD25A6803601E -:101F40004260106058607047582B002008B520236D -:101F500083F31188037C032B05D0042B0DD02BB900 -:101F600083F3118808BD436900221A604FF0FF33E4 -:101F70004361FFF7DBFF0023F2E790E80C001A60F3 -:101F800002685360F2E70000002303748268054B87 -:101F90001B6899689142FBD85A68036042601060E0 -:101FA00058607047582B0020054B19690874186851 -:101FB00002681A605360186101230374FEF7A4B924 -:101FC000582B002030B54B1C87B005460A4C10D06A -:101FD00023690A4A01A800F001F92846FFF7E4FF47 -:101FE000049B13B101A800F04BF92369586907B0AD -:101FF00030BDFFF7D9FFF8E7582B00204D1F000830 -:1020000038B50C4D41612B6981689A68914204464C -:1020100003D8BDE83840FFF789BF1846FFF7B4FF83 -:1020200001232C61014623742046BDE83840FEF7A9 -:102030006BB900BF582B0020044B1A681B699068CD -:102040009B68984294BF002001207047582B0020C5 -:1020500010B5084C236820691A6822605460012278 -:1020600023611A74FFF790FF01462069BDE8104014 -:10207000FEF74AB9582B0020FEE7000010B50C4CC3 -:10208000FFF74CFF00F09CF880220A49204600F040 -:1020900021F8012344F8180C037400F043FC0023DA -:1020A00083F3118862B60448BDE8104000F034B8EC -:1020B000802B0020F83C0008003D000800F01AB911 -:1020C000034B59685A68521A9042FBD8704700BFB8 -:1020D000001000E082600222027400224274704705 -:1020E0008368A3F17C0243F80C2C026943F83C2C72 -:1020F000426943F8382C074A43F81C2CC26843F85D -:10210000102C022203F8082C002203F8072CA3F15C -:10211000180070472103000810B5202383F31188AD -:10212000FFF7DEFF00210446FFF76AFF002383F379 -:102130001188204610BD0000024B1B6958610F201A -:10214000FFF732BF582B0020202383F31188FFF7BD -:10215000F3BF000008B50146202383F3118808204F -:10216000FFF730FF002383F3118808BD49B1064B08 -:1021700042681B6918605A60136043600420FFF7CF -:1021800021BF4FF0FF307047582B00200368984262 -:1021900006D01A680260506059611846FFF7C6BE43 -:1021A0007047000038B504460D462068844200D1CF -:1021B00038BD036823605C604561FFF7B7FEF4E754 -:1021C000054B03F114025A619A614FF0FF32DA6154 -:1021D00000221A62704700BF582B0020F8B5274F25 -:1021E0000361C2600D46044601F06CFA3B46022DC5 -:1021F00053F8142F294638BF02219A423E461D4605 -:102200000AD138627C61BC61084422606260A160CE -:10221000BDE8F84001F040BAD7F820E0A0EB0E038B -:102220005F181FD300279068834217D8376AAA42E5 -:102230001F44376201D0C01A906073699A68914256 -:1022400019D85A682360626014605C60A160986865 -:10225000411A99604FF0FF33F361F8BD97601B1A84 -:102260001268E0E793689F4203D20EEB070001F08B -:1022700023FA3946E1E7891A1B68DFE7582B00206B -:1022800038B51B4B01685A6990421D4603F1140290 -:102290000CD0446821600368002193425C60C160F7 -:1022A00025D09A6881680A449A6038BD59614A60AD -:1022B0005B6900219342C16003D1BDE8384001F061 -:1022C000F5B99A6881680A449A602C6A01F0FAF9B3 -:1022D0006A699268001B824209D9111A012998BFC4 -:1022E000821C286ABDE83840104401F0E5B938BDC9 -:1022F000582B00202DE9F84F204C0027656904F188 -:102300001406B84601F0DEF9236AA0EB030AAB68B5 -:1023100053451DD84FF02009236AAA68D5F80CB0A0 -:1023200013442362AB68AAEB030A2B68B3425E60D6 -:102330006361EF6001D101F0B9F988F31188286970 -:10234000D84789F311886569AB689A45E4D2D9E723 -:102350006369B34210D020629A68A2EB0A029A60C5 -:10236000226AAB68821A9B1A022B2CBFC01802305B -:10237000BDE8F84F01F0A0B9BDE8F88F582B002058 -:1023800000207047FEE70000704700004FF0FF306C -:1023900070470000022906D0032906D0012906480B -:1023A00018BF0020704705487047032A9ABF0448A9 -:1023B00000EBC20000207047F03D0008A43D00087B -:1023C0001422002070B59AB001AD06460846294691 -:1023D000144600F095F82846FEF7CCFCC0B2431C2A -:1023E0005B0086E818002370032363700023023427 -:1023F0001946DAB2904204F1020401D81AB070BD55 -:10240000EA5C04F8022C04F8011C0133F1E7000037 -:1024100008B5202383F311880348FFF75BFA0023F4 -:1024200083F3118808BD00BF102D002010B50446AD -:10243000052916D8DFE801F016150316161D20230E -:1024400083F311880E4A0121FFF7E4FA20460D4A72 -:102450000221FFF7DFFA0C48FFF702FA002383F3AB -:10246000118810BD202383F311880748FFF7CEF9A8 -:10247000F4E7202383F311880348FFF7E5F9EDE73C -:10248000203D0008443D0008102D002038B50C4DBB -:102490000C4C0D492A4604F10800FFF793FF05F1A3 -:1024A000CA0204F110000949FFF78CFF05F5CA7252 -:1024B00004F118000649BDE83840FFF783BF00BFAC -:1024C000D831002014220020703D00087D3D000816 -:1024D0008A3D000870B5044608460D46FEF74AFCE2 -:1024E000C6B22046013403780BB9184670BD324697 -:1024F0002946FEF727FC0028F3D1012070BD00001B -:102500002DE9F84F05460C46FEF734FC2B49C6B2C0 -:102510002846FFF7DFFF08B10236F6B22849284601 -:10252000FFF7D8FF08B11036F6B2632E0DD8DFF8EA -:102530008C80DFF88C90234FDFF890A0DFF890B00C -:102540002E7846B92670BDE8F88F29462046BDE8AA -:10255000F84F01F04DBB252E2CD1072241462846CD -:10256000FEF7F0FB58B9DBF800302360DBF80430ED -:1025700063609BF80830237207350934E0E70822CE -:1025800049462846FEF7DEFBA0B90F4BA21C13F804 -:10259000011F09095345C95D02F8021C197801F0B1 -:1025A0000F0102F10202C95D02F8031CEFD11834D9 -:1025B0000835C5E7267001350134C1E7103E000833 -:1025C0008A3D0008223E00080F7AFF1F1B7AFF1F7A -:1025D000183E0008BFF34F8F024AD368DB03FCD4D8 -:1025E000704700BF003C024008B5094B1B7873B927 -:1025F000FFF7F0FF074B1A69002ABFBF064A5A606F -:1026000002F188325A601A6822F480621A6008BDAA -:1026100036340020003C02402301674508B50B4BCF -:102620001B7893B9FFF7D6FF094B1A6942F00042B5 -:102630001A611A6842F480521A601A6822F48052B1 -:102640001A601A6842F480621A6008BD36340020AD -:10265000003C0240172870B513D80B4A0B4C137876 -:1026600063B90B4E4FF0006144F8231056F8235025 -:102670000133182B2944F7D10123137054F820009B -:1026800070BD002070BD00BF983400203834002099 -:10269000343E0008014B53F820007047343E0008D8 -:1026A00018207047172810B5044601D9002010BD26 -:1026B000FFF7D0FF064B53F824301844C21A0BB969 -:1026C000012010BD12680132F0D1043BF6E700BFD3 -:1026D000343E0008172810B5044629D8FFF77AFFC2 -:1026E000FFF782FF1349F323CB600C23B0FBF3F217 -:1026F00003FB1200D30143EAC003DBB243F40073CF -:1027000043F002030B610B6943F480330B61FFF765 -:1027100061FF2046FFF79EFF074B53F8241000F09F -:10272000DDF8FFF77BFF2046BDE81040FFF7BABF9A -:10273000002010BD003C0240343E00082DE9F84363 -:1027400012F00103154640D18218B2F1026F3CD25B -:102750002C4B1B6813F0010337D02B4CFFF744FFC1 -:10276000F323E360FFF736FF40F20127032D01D981 -:10277000830713D0244C0F46401A40F20118EB1B7C -:102780000B44012B00EB0706236924D823F0010337 -:102790002361FFF743FF0120BDE8F883236923F499 -:1027A0004073236123693B43236151F8046B066046 -:1027B000BFF34F8FFFF70EFF03689E4208D02369D7 -:1027C00023F001032361FFF729FF0020BDE8F88310 -:1027D000043D0430CAE723F440732361236943EACC -:1027E00008032361B94637F8023B3380BFF34F8FAC -:1027F000FFF7F0FE3688B9F80030B6B2B342BED06B -:10280000DDE700BF00380240003C0240084908B53F -:102810000B7828B153B9FFF7E7FE01230B7008BD11 -:1028200023B1BDE808400870FFF7F8BE08BD00BF3F -:102830003634002010B50244064B0439D2B290421F -:1028400000D110BD441C00B253F8200041F8040F21 -:10285000E0B2F4E750280040104B30B51C6F240460 -:1028600007D41C6F44F400741C671C6F44F40044CC -:102870001C670B4C236843F4807323600244094BAC -:102880000439D2B2904200D130BD441C00B251F89C -:10289000045F43F82050E0B2F4E700BF0038024084 -:1028A000007000405028004007B5012201A9002017 -:1028B000FFF7C0FF019803B05DF804FB13B50446B1 -:1028C000FFF7F2FFA04206D002A9012241F8044D11 -:1028D0000020FFF7C1FF02B010BD000070470000EC -:1028E000034B1B689B0042BF024B01221A707047CA -:1028F0007438024099340020014B1878704700BFAB -:1029000099340020EFF3098305494A6822F0010257 -:102910004A60683383F30988002383F31188704782 -:1029200030EF00E0202080F3118862B60B4B0C4A98 -:10293000D96821F4E0610904090C0A430949DA6005 -:10294000CA6842F08072CA6007490A6842F0010210 -:102950000A601022DA7783F82200704700ED00E069 -:102960000003FA05F0ED00E0001000E010B52023B0 -:1029700083F311880E4B5B6813F4006314D0F1EEFF -:10298000103AEFF30984683C4FF08073E361094B20 -:10299000DB68236684F30988FFF74EFB10B1064B12 -:1029A000A36110BD054BFBE783F3118810BD00BF89 -:1029B00000ED00E030EF00E03303000836030008CC -:1029C00070470000FEE70000084A094B09498B42A6 -:1029D00004D3094A0021934205D3704752F8040FEB -:1029E00043F8040BF3E743F8041BF4E7F03F000857 -:1029F000143500201435002014350020836D70B587 -:102A0000446D9E6800214FF0FF354A01A318013143 -:102A1000D3F800090028BEBFD3F8000940F0804079 -:102A2000C3F80009D3F8000B0028BEBFD3F8000B91 -:102A300040F08040C3F8000BA3188E42C3F8085939 -:102A4000C3F8085BE1D24FF00113C4F81C3870BD25 -:102A5000890141F02001016103699B06FCD4122029 -:102A6000FFF72EBB204B03EB80022DE9F047D2F895 -:102A70000CE05D6DDEF81420461CD2F800C005EBBA -:102A8000063605EB4018516861450BD3D5F834285C -:102A9000012303FA00F022EA0000C5F834081846C2 -:102AA000BDE8F087BEF81040ACEB0103A34228BF9D -:102AB0002346D8F81849A4B2B3EB840F10D8946811 -:102AC0001F46A4F1040959F804AFC6F800A0042F6A -:102AD00001D9043FF7E71C440B4494605360D2E7EC -:102AE0000020BDE8F08700BF9C34002010B5054CE5 -:102AF0002046FEF76FFF4FF0A0436365024BA365CE -:102B000010BD00BF9C340020B83E00080378012BA4 -:102B100070B5054650D12A4B446D98421BD1294BC4 -:102B20005A6B42F080025A635A6D42F080025A6535 -:102B30005A6D5A6942F080025A615A6922F0800245 -:102B40005A610E2143205B69FEF7AEFB1E4BE3602A -:102B50001E4BC4F800380023C4F8003EC023236095 -:102B60006E6D4FF45023A3633369002BFCDA01230D -:102B700033610C20FFF7A4FA3369DB07FCD4122081 -:102B8000FFF79EFA3369002BFCDA0026A660284680 -:102B9000FFF734FF6B68C4F81068DB68C4F814688A -:102BA000C4F81C684BB90A4BA3614FF0FF33636153 -:102BB000A36843F00103A36070BD064BF4E700BFB8 -:102BC0009C340020003802404014004003002002E2 -:102BD000003C30C0083C30C0F8B5446D05460021CB -:102BE0002046FFF735FFA96D00234FF001128F68D3 -:102BF000C4F834384FF00066C4F81C284FF0FF309A -:102C000004EB431201339F42C2F80069C2F8006B23 -:102C1000C2F80809C2F8080BF2D20B686A6DEB65BE -:102C2000636210231361166916F01006FBD112209F -:102C3000FFF746FAD4F8003823F4FE63C4F80038EE -:102C4000A36943F4402343F01003A3610923C4F8AC -:102C50001038C4F814380A4BEB604FF0C043C4F886 -:102C6000103B084BC4F8003BC4F81069C4F80039A5 -:102C7000EB6D03F1100243F48013EA65A362F8BD23 -:102C8000943E000840800010426D90F84E10D2F83B -:102C9000003823F4FE6343EA0113C2F8003870479A -:102CA0002DE9F0410EB200EB86080D46D8F80C1065 -:102CB0000F6807F00303022B50D0032B50D03D4A7E -:102CC0003D4F012B18BF1746446D4FEA451E04EBDC -:102CD0000E030022C3F8102B8A6905F1100C002A9C -:102CE00040D04A8A05F158035B013A43E250012380 -:102CF000D4F81C2803FA0CF31343A6444A69C4F819 -:102D00001C380023CEF8103905F13F03002A39D0D2 -:102D10000A8A898B9208012988BF4A43C16D04EB56 -:102D20008303561841EA0242C66529465A60204686 -:102D3000FFF78EFED8F80C301B8A43EA85531F43F9 -:102D400005F148035B01E7500123D4F81C2803FA7E -:102D500005F51543C4F81C58BDE8F081174FB3E7DB -:102D6000174FB1E704EB4613D3F8002B22F40042CF -:102D7000C3F8002BD4F81C28012303FA0CF322EA31 -:102D80000303BAE704EB83030E4A5A6004EB4616CA -:102D900029462046FFF75CFED6F8003923F40043AD -:102DA000C6F80039D4F81C38012202FA05F523EAE6 -:102DB0000505CFE700800010008004100080081097 -:102DC00000800C1000040002826D1268C265FFF7DB -:102DD00015BE00005831436D49015B5813F40040A3 -:102DE00004D013F4001F14BF01200220704700001C -:102DF0004831436D49015B5813F4004004D013F48B -:102E0000001F14BF012002207047000000EB810169 -:102E1000CB68196A0B6813604B68536070470000F9 -:102E200000EB810330B5DD68AA691368D36019B976 -:102E3000402B84BF402313606B8A1468426D1C448E -:102E4000013CB4FBF3F46343033323F0030302EBCD -:102E5000411043EAC44343F0C043C0F8103B2B6821 -:102E600003F00303012B09B20ED1D2F8083802EBAC -:102E7000411013F4807FD0F8003B14BF43F080531F -:102E800043F00053C0F8003B02EB4112D2F8003B84 -:102E900043F00443C2F8003B30BD00002DE9F0418F -:102EA000244D6E6D06EB40130446D3F8087BC3F83F -:102EB000087B38070AD5D6F81438190706D505EB6C -:102EC00084032146DB6828465B689847FA072FD5BC -:102ED000D6F81438DB072BD505EB8403D968CCB9B9 -:102EE0008B69488A5E68B6FBF0F200FB12628AB911 -:102EF0001868DA6890420DD2121A83E81400202371 -:102F000083F311880B482146FFF78AFF84F3118869 -:102F1000BDE8F081012303FA04F26B8923EA02037E -:102F20006B81CB6823B121460248BDE8F0411847C8 -:102F3000BDE8F0819C34002000EB810370B5DD68B2 -:102F4000436D6C692668E6604A0156BB1A444FF42B -:102F50000020C2F810092A6802F00302012A0AB20E -:102F60000ED1D3F8080803EB421410F4807FD4F894 -:102F7000000914BF40F0805040F00050C4F8000930 -:102F800003EB4212D2F8000940F00440C2F80009F5 -:102F9000D3F83408012202FA01F10143C3F83418CE -:102FA00070BD19B9402E84BF4020206020682E8A51 -:102FB000841940F00050013C1A44B4FBF6F440EA96 -:102FC000C440C6E7F8B504461E48456D05EB4413FA -:102FD000D3F80869C3F80869F10717D5D5F8103890 -:102FE000DA0713D500EB8403D9684B691F68DA68E8 -:102FF000974218D2D21B00271A605F60202383F308 -:1030000011882146FFF798FF87F31188330617D5FB -:10301000D5F834280123A340134211D02046BDE83F -:10302000F840FFF71FBD012303FA04F2038923EAE6 -:10303000020303818B68002BE8D021469847E5E71F -:10304000F8BD00BF9C34002097482DE9F84F456D2E -:103050006E69AB691E4016F4805F6E61044605D050 -:10306000FEF724FDBDE8F84FFFF780BC002E12DA12 -:10307000D5F8003E8C489B071EBFD5F8003E23F0D4 -:103080000303C5F8003ED5F8043823F00103C5F862 -:103090000438FEF739FD370505D58348FFF7AEFC48 -:1030A0008148FEF721FDB0040CD5D5F8083813F09F -:1030B000060FEB6823F470530CBF43F4105343F432 -:1030C000A053EB60310704D56368DB680BB1764829 -:1030D0009847F2025AD4B3020CD5D4F85480DFF8E2 -:1030E000C8A100274FF00109A36D9B68F9B28B427C -:1030F00080F08780F70619D5616D0A6AC2F30A1756 -:1031000002F00F0302F4F012B2F5802F00F0A1805C -:10311000B2F5402F0AD104EB830301F58051DB683F -:10312000186A00231A469F4240F087803003D5F882 -:10313000184813D5E10302D50020FFF7AFFEA20324 -:1031400002D50120FFF7AAFE630302D50220FFF794 -:10315000A5FE270302D50320FFF7A0FE750381D546 -:10316000E00702D50020FFF72DFFA10702D50120BF -:10317000FFF728FF620702D50220FFF723FF23078E -:103180007FF570AF0320FFF71DFF6BE7D4F8548085 -:10319000DFF814A100274FF00109A36D9B685FFAC7 -:1031A00087FB5B4597D308EB4B13D3F8002902F458 -:1031B0004022B2F5802F22D1D3F80029002A1EDA4E -:1031C000D3F8002942F09042C3F80029D3F800292F -:1031D000002AFBDB5946606DFFF73AFC228909FAA9 -:1031E0000BF322EA0303238104EB8B03DB689B6868 -:1031F00013B15946504698475846FFF733FC0137FC -:10320000CBE708EB4112D2F8003B03F44023B3F5BF -:10321000802F10D1D2F8003B002B0CDA628909FA1A -:1032200001F322EA0303638104EB8103DB68DB68BB -:103230000BB150469847013756E79C0708BF0A680C -:10324000072B98BF027003F101039CBF120A0130E3 -:1032500069E7023304EB830201F5805152689069FB -:103260000268D0F808C04068A2EB000E00221046A9 -:1032700097420AD104EB830463689B699A683A44D5 -:103280009A605A6817445F6050E712F0030F08BF56 -:103290000868964588BF8CF8000002F1010284BFDF -:1032A000000A0CF1010CE3E79C340020436D03EBB2 -:1032B0004111D1F8003B43F40013C1F8003B7047C3 -:1032C000436D03EB4111D1F8003943F40013C1F809 -:1032D00000397047436D03EB4111D1F8003B23F4F3 -:1032E0000013C1F8003B7047436D03EB4111D1F867 -:1032F000003923F40013C1F80039704730B5039C3E -:103300000172043304FB0325C361049B03630021A2 -:10331000059B00604060C16042610261856104629A -:1033200042628162C162436330BD00000022416A93 -:1033300041610161C2608262C2626FF00101FEF709 -:1033400031BF000003694269934203D1C2680AB1E8 -:1033500000207047181D704703691960C268013268 -:10336000C260C269134482690361934224BF436A05 -:1033700003610021FEF70ABF38B504460D46E36835 -:103380003BB16269131D1268A3621344E36200201B -:1033900038BD237A33B929462046FEF7E7FE0028D8 -:1033A000EDDA38BD6FF00100FBE70000C368C269C9 -:1033B000013BC3604369134482694361934224BF64 -:1033C000436A436100238362036B03B1184770476C -:1033D00070B52023044683F31188866A3EB9FFF74F -:1033E000CBFF054618B186F31188284670BDA36A45 -:1033F000E26A13F8015BA362934202D32046FFF70F -:10340000D5FF002383F31188EFE700002DE9F84F83 -:1034100004460E4690469946202787F311880025DA -:10342000AA46D4F828B0BBF1000F09D1494620467E -:10343000FFF7A2FF20B18BF311882846BDE8F88F73 -:10344000A16AE36AA8EB050B5B1A9B4528BF9B4664 -:10345000BBF1400F1BD9334601F1400251F8040B78 -:1034600043F8040B9142F9D1A36A40334036A3627A -:103470004035A26AE36A9A4202D32046FFF796FFDC -:103480008AF311884545D8D287F31188C9E73046B9 -:103490005A46FDF74DFCA36A5B445E44A3625D445B -:1034A000E7E7000010B5029C0172043303FB04211E -:1034B000C36100238362C362039B0363049B0060B8 -:1034C0004060C460426102618161046242624363A0 -:1034D00010BD0000026AC260426A426102610022BD -:1034E0008262C2626FF00101FEF75CBE436902694D -:1034F0009A4203D1C2680AB100207047184650F8BA -:10350000043B0B6070470000C368C2690133C360AD -:103510004369134482694361934224BF436A436110 -:103520000021FEF733BE000038B504460D46E368BF -:103530003BB123691A1DA262E2691344E3620020D1 -:1035400038BD237A33B929462046FEF70FFE0028FE -:10355000EDDA38BD6FF00100FBE700000369196088 -:10356000C268013AC260C26913448269036193422E -:1035700024BF436A036100238362036B03B11847CE -:103580007047000070B5202304460E4683F311886F -:10359000856A35B91146FFF7C7FF10B185F3118869 -:1035A00070BDA36A1E70A36AE26A01339342A362EC -:1035B00004D3E16920460439FFF7D0FF002080F3EF -:1035C000118870BD2DE9F84F04460D4691469A4684 -:1035D0004FF0200888F311880026B346A76A4FB938 -:1035E00051462046FFF7A0FF20B187F311883046EF -:1035F000BDE8F88FA06AE76AA9EB06033F1A9F426D -:1036000028BF1F46402F1BD905F1400355F8042B56 -:1036100040F8042B9D42F9D1A36A4033A36240369F -:10362000A26AE36A9A4204D3E16920460439FFF7AB -:1036300095FF8BF311884E45D9D288F31188CDE7D9 -:1036400029463A46FDF774FBA36A3B443D44A36216 -:103650003E44E5E7026943699A4203D1C3681BB956 -:10366000184670470023FBE7836A002BF8D0043B21 -:103670009B1AF5D01360C368013BC360C3691A4449 -:10368000836902619A4224BF436A03610023836213 -:103690000123E5E700F096B8034B002258631A6156 -:1036A0000222DA60704700BF000C0040014B00228C -:1036B000DA607047000C0040014B5863704700BF50 -:1036C000000C0040014B586A704700BF000C0040DE -:1036D0004B6843608B688360CB68C3600B69436150 -:1036E0004B6903628B6943620B680360704700009B -:1036F00008B5224B22481A6940F2FF110A431A61A9 -:103700001A6922F4FF7222F001021A611A691A6B17 -:103710000A431A631A6D0A431A651A4A1B6D114649 -:10372000FFF7D6FF184802F11C01FFF7D1FF174839 -:1037300002F13801FFF7CCFF154802F15401FFF701 -:10374000C7FF144802F17001FFF7C2FF124802F1EF -:103750008C01FFF7BDFF114802F1A801FFF7B8FF88 -:103760000F4802F1C401FFF7B3FF0E4802F1E00178 -:10377000FFF7AEFFBDE8084000F0AEB800380240E9 -:1037800000000240C43E000800040240000802405D -:10379000000C0240001002400014024000180240D9 -:1037A000001C02400020024008B500F00FFAFEF7AE -:1037B00065FCFFF795F8BDE80840FEF767BE00001E -:1037C00070470000104B1A6C42F008021A641A6E1F -:1037D00042F008021A660D4A1B6E936843F0080314 -:1037E00093600B4B53229A624FF0FF32DA62002251 -:1037F0009A615A63DA605A6001225A6108211A609C -:103800003220FDF751BD00BF00380240002004E027 -:10381000000C0040094A08B51369D1680B40D9B2C1 -:10382000C9439B07116107D5202383F31188FEF755 -:1038300045FC002383F3118808BD00BF000C004045 -:1038400008B5FFF7E7FFBDE80840FFF78FB80000B5 -:103850001F4B1A696FEAC2526FEAD2521A611A6993 -:10386000C2F308021A614FF0FF301A695A695861B1 -:1038700000215A6959615A691A6A62F080521A62C3 -:103880001A6A02F080521A621A6A5A6A58625A6AAE -:1038900059625A6A1A6C42F080521A641A6E42F0E7 -:1038A00080521A661A6E0B4A106840F480701060DD -:1038B000186F00F44070B0F5007F1EBF4FF48030E9 -:1038C00018671967536823F40073536000F05EB9FA -:1038D0000038024000700040354B4FF080521A64AF -:1038E000344A4FF4404111601A6842F001021A60F4 -:1038F0001A689207FCD59A6822F003029A602C4B52 -:1039000019469A6812F00C02FBD1186800F0F90011 -:1039100018609A601A6842F480321A600B689B0340 -:10392000FCD54B6F43F001034B67214B5A6F900757 -:10393000FCD5214A5A601A6842F080721A601D4A0A -:1039400053685904FCD51A4B1A689201FCD51B4ADE -:103950009A600322C3F88C20194B1A68194B9A42BB -:10396000194B21D1194A1168194A91421CD140F2D0 -:1039700005121A60144A136803F00F03052BFAD1DD -:103980000B4B9A6842F002029A609A6802F00C02AD -:10399000082AFAD15A6C42F480425A645A6E42F4B0 -:1039A00080425A665B6E704740F20572E1E700BFE5 -:1039B00000380240007000401854400700948838D6 -:1039C000002004E011640020003C024000ED00E013 -:1039D00041C20F41084A08B5536911680B4003F012 -:1039E0000103536123B1054A13680BB1506898472E -:1039F000BDE80840FEF7BABF003C0140A02300200C -:103A0000084A08B5536911680B4003F0020353617B -:103A100023B1054A93680BB1D0689847BDE80840C8 -:103A2000FEF7A4BF003C0140A0230020084A08B5CF -:103A3000536911680B4003F00403536123B1054A35 -:103A400013690BB150699847BDE80840FEF78EBF77 -:103A5000003C0140A0230020084A08B553691168C2 -:103A60000B4003F00803536123B1054A93690BB17E -:103A7000D0699847BDE80840FEF778BF003C014098 -:103A8000A0230020084A08B5536911680B4003F0D1 -:103A90001003536123B1054A136A0BB1506A98476A -:103AA000BDE80840FEF762BF003C0140A0230020B3 -:103AB000174B10B55C691A68144004F478725A61A7 -:103AC000A30604D5134A936A0BB1D06A98476006DF -:103AD00004D5104A136B0BB1506B9847210604D5DF -:103AE0000C4A936B0BB1D06B9847E20504D5094A99 -:103AF000136C0BB1506C9847A30504D5054A936C21 -:103B00000BB1D06C9847BDE81040FEF72FBF00BF47 -:103B1000003C0140A02300201A4B10B55C691A68D4 -:103B2000144004F47C425A61620504D5164A136DB0 -:103B30000BB1506D9847230504D5134A936D0BB113 -:103B4000D06D9847E00404D50F4A136E0BB1506E48 -:103B50009847A10404D50C4A936E0BB1D06E9847D8 -:103B6000620404D5084A136F0BB1506F98472304C1 -:103B700004D5054A936F0BB1D06F9847BDE810404C -:103B8000FEF7F4BE003C0140A0230020062108B54A -:103B90000846FDF789FB06210720FDF785FB062176 -:103BA0000820FDF781FB06210920FDF77DFB06219A -:103BB0000A20FDF779FB06211720FDF775FB06218A -:103BC0002820BDE80840FDF76FBB000008B5FFF7EF -:103BD0003FFEFDF7E5F9FDF70DFDFDF7F9FEFDF7F9 -:103BE000CDFDFFF7EDFDBDE80840FFF753BD000038 -:103BF000034611F8012B03F8012B002AF9D1704775 -:103C0000121012131211000053544D3332463F3F2D -:103C10003F000000012033000010410101105A0153 -:103C2000031059010710310100000000083C000892 -:103C30003F00000013040000683C00083F00000043 -:103C400019040000723C00083F000000210400003D -:103C50007C3C00083F000000102D002020240020A4 -:103C600088260020F028002053544D33324634304B -:103C7000780053544D3332463432780053544D3328 -:103C800032463434365858000096000000000000D8 -:103C90000000000000000000000000000000000024 -:103CA000BD150008A9150008E5150008D115000884 -:103CB000DD150008C9150008B5150008A115000894 -:103CC000F115000800000000F5160008E1160008D4 -:103CD0001D1700080917000815170008011700082C -:103CE000ED160008D916000879170008000000003A -:103CF00001000000000000006D61696E000000001E -:103D0000183D0008982B0020102D00200100000015 -:103D1000792000080000000069646C650000000064 -:103D200002000000000000002119000889190008A5 -:103D300040004000A8310020B831002002000000FF -:103D4000000000000300000000000000CD19000882 -:103D50000000000010000000C8310020000000003A -:103D600001000000000000009C340020010102005E -:103D70004865782F50726F6669434E430043756201 -:103D800065426C61636B2D424C002553455249419D -:103D90004C2500002D240008952300088D180008EC -:103DA0001124000843000000AC3D00080902430054 -:103DB000020100C0320904000001020201000524D2 -:103DC000001001052401000104240202052406005C -:103DD00001070582030800FF09040100020A000030 -:103DE00000070501024000000705810240000000B5 -:103DF00012000000F83D000812011001020000400E -:103E0000AE2D0110000201020301000004030904A9 -:103E100025424F415244250043756265426C6163FF -:103E20006B00303132333435363738394142434410 -:103E30004546000000400000004000000040000037 -:103E4000004000000000010000000200000002002D -:103E5000000002000000020000000200000002005A -:103E60000000020000400000004000000040000090 -:103E700000400000000001000000020000000200FD -:103E8000000002000000020000000200000002002A -:103E900000000200000000001D1B0008FD1D0008BE -:103EA000A91E000840004000FC340020FC34002023 -:103EB000010000000C3500208000000040010000DF -:103EC000030000000000812A00020000AAAAAAAA9A -:103ED00000000000FFFF00000000000000A00A003A -:103EE0000000000000000000AAAAAAAA000000002A -:103EF000FFFF00000000000000000000140000545C -:103F000000000000AAAAAAAA14000054FFFF0000A3 -:103F1000000000000000000080699A01000000001D -:103F2000AAAA8AAA40555501FFFF00000070700739 -:103F3000777000004081020100000000AAAAAAAA2E -:103F400000410100F7FF00000000008008000000B1 -:103F50000000000000000000AAAAAAAA00000000B9 -:103F6000FFFF000000000000000000000000000053 -:103F700000000000AAAAAAAA00000000FFFF00009B -:103F80000000000000000000000000000000000031 -:103F90000A00000000000000030000000000000014 -:103FA0000000000000000000000000000000000011 -:103FB0000000000000000000000000000000000001 -:103FC000090000000000000000C01F00FF00960074 -:103FD00000000008040000000C3E00080000000083 -:103FE00000000000000000000000000000000000D1 -:043FF00000000000CD +:100B600001F09CBC0020704778230020BA230020AD +:100B700038B5084D044629B128682044BDE83840FE +:100B800001F0ACBC2868204401F090FC0028F3D0B0 +:100B900038BD00BF7823002010F003030AD1B0F560 +:100BA000047F05D200F10050A0F51040D0F80038C5 +:100BB000184670470023FBE700F10050A0F51040F5 +:100BC000D0F8100A70470000064991F8243033B17C +:100BD0000023086A81F824300822FFF7B1BF012002 +:100BE000704700BF7C230020014B1868704700BF8E +:100BF000002004E070B5194B1D68194B0138C5F38E +:100C00000B0408442D0C04221E88A6420BD15C68FC +:100C10000A46013C824213460FD214F9016F4EB1CD +:100C200002F8016BF6E7013A03F10803ECD18142C7 +:100C30000B4602D22C2203F8012B0A4A05241688FF +:100C4000AE4204D1984284BF967803F8016B013C10 +:100C500002F10402F3D1581A70BD00BF002004E075 +:100C6000503B00083C3B0008022802BF024B4FF4F7 +:100C700080529A61704700BF00100240022802BFF4 +:100C8000024B4FF080529A61704700BF0010024043 +:100C9000022801BF024A536983F4805353617047AD +:100CA0000010024070B504464FF47A764CB1412CE6 +:100CB000254628BF412506FB05F001F0D5F8641B49 +:100CC000F4E770BD10B50023934203D0CC5CC4544C +:100CD0000133F9E710BD000010B5013810F9013FEC +:100CE0003BB191F900409C4203D11AB10131013A64 +:100CF000F4E71AB191F90020981A10BD1046FCE7EC +:100D000003460246D01A12F9011B0029FAD1704796 +:100D100002440346934202D003F8011BFAE77047EE +:100D20002DE9F8431F4D144695F8242007468846C0 +:100D300052BBDFF870909CB395F824302BB9202279 +:100D4000FF2148462F62FFF7E3FF95F82400C0F12A +:100D50000802A24228BF2246D6B24146920005EBC5 +:100D60008000FFF7AFFF95F82430A41B1E44F6B2B5 +:100D7000082E17449044E4B285F82460DBD1FFF7D5 +:100D800023FF0028D7D108E02B6A03EB82038342BC +:100D9000CFD0FFF719FF0028CBD10020BDE8F883A2 +:100DA0000120FBE77C230020024B1A78024B1A70CB +:100DB000704700BFB82300201022002038B5174C20 +:100DC000174D204600F0B6FB2946204600F0DEFB1A +:100DD0002D686A6D936B23F4002393634FF47A704C +:100DE000FFF760FF0F49284600F0D6FC6A6D0E4DF4 +:100DF000936B28680D4943F400239363A0424FF49A +:100E0000E1330B6001D000F0F5FA6868A04204D02D +:100E1000BDE83840054900F0EDBA38BD98280020FB +:100E20005C3C0008643C000814220020A42300203D +:100E300070B50C4B0C4D1E780C4B55F826209A4281 +:100E400004460DD00A4B002114221846FFF760FF1C +:100E50000460014655F82600BDE8704000F0CABAAB +:100E600070BD00BFB8230020142200209828002065 +:100E7000A423002030B5094D0A4491420DD011F849 +:100E8000013B5840082340F30004013B2C4013F081 +:100E9000FF0384EA5000F6D1EFE730BD2083B8EDC0 +:100EA000026843681143016003B1184770470000AE +:100EB000024AD36843F0C003D36070470044004047 +:100EC00010B5054C054A0021204600F071FA044A8D +:100ED000044BC4E9972310BDBC230020B10E0008C9 +:100EE0000044004080DE8002234A037C002918BFB2 +:100EF0000A46012B30B5C0F868220CD11F4B98422E +:100F000009D11F4B196C41F400311964196E41F479 +:100F1000003119661B6EB2F904501468D0F86032C3 +:100F2000D0F85C12002D03EB5403B3FBF4F3BEBF07 +:100F300023F0070503F0070343EA450394888B6019 +:100F4000D38843F040030B61138943F001034B61E5 +:100F500044F4045343F02C03CB6004F4A054002366 +:100F60000B60B4F5806F0B684B680CBF7F23FF23C9 +:100F700080F8643230BD00BF703B0008BC23002005 +:100F8000003802402DE9F041D0F85C62F768336820 +:100F9000DA0504469DB20DD5302383F311884FF452 +:100FA00080610430FFF77CFF6FF4807333600023AF +:100FB00083F31188302383F3118804F1040815F0BA +:100FC0002F033AD183F31188380615D5290613D596 +:100FD000302383F3118804F1380000F065F900280C +:100FE0004EDA0821201DFFF75BFF4FF67F733B4071 +:100FF000F360002383F311887A0616D56B0614D5A7 +:10100000302383F31188D4E913239A420AD1236C45 +:1010100043B127F040073F041021201D3F0CFFF78C +:101020003FFFF760002383F31188D4F86822D36868 +:1010300043B3BDE8F041106918472B0714D015F0F1 +:10104000080F0CBF00214FF48071E80748BF41F042 +:101050002001AA0748BF41F040016B0748BF41F09B +:1010600080014046FFF71CFFAD06736805D594F874 +:1010700064122046194000F0CBF93568ADB29EE706 +:101080007060B6E7BDE8F081F8B51546826806697C +:10109000AA420B46816938BF8568761AB542044674 +:1010A0000BD218462A46FFF70DFEA3692B44A36115 +:1010B000A3685B1BA3602846F8BD0CD918463246CE +:1010C000FFF700FEAF1BE1683A463044FFF7FAFD38 +:1010D000E3683B44EBE718462A46FFF7F3FDE36875 +:1010E000E5E7000083689342F7B51546044638BF2C +:1010F0008568D0E90460361AB5420BD22A46FFF75C +:10110000E1FD63692B446361A36828465B1BA36010 +:1011100003B0F0BD0DD932460191FFF7D3FD01991F +:10112000E068AF1B3A463144FFF7CCFDE3683B442F +:10113000E9E72A46FFF7C6FDE368E4E710B50A448D +:101140000024C361029B8460C0E90000C0E905116E +:10115000C1600261036210BD08B5D0E90532934257 +:1011600001D1826882B98268013282605A1C426170 +:101170001970D0E904329A4224BFC3684361002148 +:1011800000F08EFE002008BD4FF0FF30FBE70000AE +:1011900070B5302304460E4683F31188A568A5B1C7 +:1011A000A368A269013BA360531CA361157822695F +:1011B000934224BFE368A361E3690BB120469847DB +:1011C000002383F31188284607E03146204600F0CB +:1011D00057FE0028E2DA85F3118870BD2DE9F74F3C +:1011E00004460E4617469846D0F81C904FF0300A39 +:1011F0008AF311884FF0000B154665B12A46314637 +:101200002046FFF741FF034660B94146204600F003 +:1012100037FE0028F1D0002383F31188781B03B038 +:10122000BDE8F08FB9F1000F03D001902046C84708 +:10123000019B8BF31188ED1A1E448AF31188DCE7B9 +:10124000C0E90511C160C3611144009B8260C0E91F +:101250000000016103627047F8B504460D4616466A +:10126000302383F31188A768A7B1A368013BA3606B +:1012700063695A1C62611D70D4E904329A4224BF2A +:10128000E3686361E3690BB120469847002080F36F +:10129000118807E03146204600F0F2FD0028E2DA2E +:1012A00087F31188F8BD0000D0E905239A4210B5F4 +:1012B00001D182687AB98268013282605A1C8261E7 +:1012C0001C7803699A4224BFC3688361002100F03F +:1012D000E7FD204610BD4FF0FF30FBE72DE9F74F4B +:1012E00004460E4617469846D0F81C904FF0300A38 +:1012F0008AF311884FF0000B154665B12A46314636 +:101300002046FFF7EFFE034660B94146204600F055 +:10131000B7FD0028F1D0002383F31188781B03B0B8 +:10132000BDE8F08FB9F1000F03D001902046C84707 +:10133000019B8BF31188ED1A1E448AF31188DCE7B8 +:10134000026843681143016003B118477047000009 +:101350001430FFF743BF00004FF0FF331430FFF7A6 +:101360003DBF00003830FFF7B9BF00004FF0FF333A +:101370003830FFF7B3BF00001430FFF709BF00009B +:101380004FF0FF311430FFF703BF00003830FFF794 +:1013900063BF00004FF0FF323830FFF75DBF000041 +:1013A000012914BF6FF0130000207047FFF788BDBC +:1013B00037B515460E4A026000224260C0E902229B +:1013C0000122044602740B46009000F15C014FF4C8 +:1013D00080721430FFF7B2FE00942B464FF48072F7 +:1013E00004F5AE7104F13800FFF72AFF03B030BDF9 +:1013F000843B000810B53023044683F31188FFF7BF +:1014000073FD02232374002080F3118810BD0000B7 +:1014100038B5C36904460D461BB904210844FFF7DB +:101420008FFF294604F11400FFF796FE002806DA24 +:10143000201D4FF40061BDE83840FFF781BF38BD83 +:10144000026843681143016003B118477047000008 +:1014500013B5446BD4F894341A681178042915D163 +:10146000217C022912D11979128901238B40134260 +:101470000CD101A904F14C0001F016FFD4F89444FA +:10148000019B21790246206800F0D0F902B010BD1E +:10149000143001F099BE00004FF0FF33143001F01A +:1014A00093BE00004C3001F06BBF00004FF0FF33E3 +:1014B0004C3001F065BF0000143001F067BE000041 +:1014C0004FF0FF31143001F061BE00004C3001F0EC +:1014D00037BF00004FF0FF324C3001F031BF000049 +:1014E0000020704710B5D0F894341A681178042998 +:1014F000044617D1017C022914D15979528901235C +:101500008B4013420ED1143001F0FAFD024648B16F +:10151000D4F894444FF4807361792068BDE810409A +:1015200000F072B910BD0000406BFFF7DBBF000098 +:10153000704700007FB5124B036000234360C0E991 +:101540000233012502260F4B0574044602900193D5 +:1015500000F18402294600964FF48073143001F0A4 +:10156000ABFD094B0294CDE9006304F523724FF4FF +:101570008073294604F14C0001F072FE04B070BD86 +:10158000AC3B000829150008511400080B683022F4 +:1015900082F311880A7903EB820290614A79093259 +:1015A00043F822008A7912B103EB82039861022387 +:1015B000C0F894140374002080F311887047000071 +:1015C00038B5037F044613B190F85430ABB9201DF1 +:1015D00001250221FFF734FF04F1140025776FF095 +:1015E000010100F069FC84F8545004F14C006FF0E4 +:1015F0000101BDE8384000F05FBC38BD10B50121E5 +:1016000004460430FFF71CFF0023237784F854308E +:1016100010BD000038B504460025143001F064FD0B +:1016200004F14C00257701F033FE201D84F854505E +:101630000121FFF705FF2046BDE83840FFF752BF04 +:1016400090F8443003F06003202B07D190F8452038 +:10165000212A4FF0000303D81F2A06D80020704724 +:10166000222AFBD1C0E90E3303E0034A826307223A +:10167000C2630364012070471C22002037B5D0F8F4 +:1016800094341A681178042904461AD1017C02297D +:1016900017D11979128901238B40134211D100F11E +:1016A0004C05284601F0B4FE58B101A9284601F0C6 +:1016B000FBFDD4F89444019B21790246206800F098 +:1016C000B5F803B030BD0000F0B500EB810385B084 +:1016D0009E6904460D46FEB1302383F3118804EB66 +:1016E0008507301D0821FFF7ABFEFB685B691B68AF +:1016F00006F14C001BB1019001F0E4FD019803A933 +:1017000001F0D2FD024648B1039B2946204600F075 +:101710008DF8002383F3118805B0F0BDFB685A698A +:101720001268002AF5D01B8A013B1340F1D104F165 +:101730004402EAE7093138B550F82140DCB13023E2 +:1017400083F31188D4F894241368527903EB82034D +:10175000DB689B695D6845B104216018FFF770FE86 +:10176000294604F1140001F0D5FC2046FFF7BAFE2B +:10177000002383F3118838BD7047000001F034B8AE +:10178000012303700023C0E90133C3618362036254 +:10179000C36243620363704738B50446302383F362 +:1017A00011880025C0E90355C0E90555416001F0E5 +:1017B0002BF80223237085F31188284638BD0000DA +:1017C00070B500EB810305465069DA600E46144699 +:1017D00018B110220021FFF79BFAA06918B110225E +:1017E0000021FFF795FA31462846BDE8704001F028 +:1017F000D5B80000826802F0011282600022C0E9C0 +:101800000422826101F056B9F0B400EB81044789EB +:10181000E4680125A4698D403D4345812360002390 +:10182000A2606360F0BC01F071B90000F0B400EB9D +:1018300081040789E468012564698D403D43058181 +:1018400023600023A2606360F0BC01F0EBB90000EC +:1018500070B50223002504460370C0E90255C0E9B3 +:101860000455C564856180F8345001F033F863682D +:101870001B6823B129462046BDE87040184770BD5B +:101880000378052B10B504460AD080F850300523A4 +:10189000037043681B680BB1042198470023A360C1 +:1018A00010BD00000178052906D190F8502043684A +:1018B00002701B6803B118477047000070B590F8BC +:1018C0003430044613B1002380F8343004F144026C +:1018D000204601F011F963689B68B3B994F844306D +:1018E00013F0600535D00021204601F0B1FB002146 +:1018F000204601F0A3FB63681B6813B10621204654 +:101900009847062384F8343070BD20469847002855 +:10191000E4D0B4F84A30E26B9A4288BFE36394F9AA +:101920004430E56B002B4FF0300380F20381002D33 +:1019300000F0F280092284F8342083F3118800211A +:10194000D4E90E232046FFF771FF002383F31188AB +:10195000DAE794F8452003F07F0343EA022340F2DC +:101960000232934200F0C58021D8B3F5807F48D081 +:101970000DD8012B3FD0022B00F09380002BB2D169 +:1019800004F14C02A2630222E2632364C1E7B3F5CF +:10199000817F00F09B80B3F5407FA4D194F846305E +:1019A000012BA0D1B4F84C3043F0020332E0B3F580 +:1019B000006F4DD017D8B3F5A06F31D0A3F5C06339 +:1019C000012B90D8636894F846205E6894F847101D +:1019D000B4F848302046B047002884D04368A36359 +:1019E0000368E3631AE0B3F5106F36D040F60242A5 +:1019F00093427FF478AF5C4BA3630223E36300233D +:101A0000C3E794F84630012B7FF46DAFB4F84C3047 +:101A100023F00203C4E90E55A4F84C30256478E79E +:101A2000B4F84430B3F5A06F0ED194F8463084F882 +:101A30004E30204600F0A6FF63681B6813B10121F9 +:101A400020469847032323700023C4E90E339CE704 +:101A500004F14F03A3630123C3E72378042B10D1C0 +:101A6000302383F311882046FFF7C4FE85F31188E5 +:101A70000321636884F84F5021701B680BB1204626 +:101A8000984794F84630002BDED084F84F3004237A +:101A9000237063681B68002BD6D00221204698472C +:101AA000D2E794F848301D0603F00F0120460AD50E +:101AB00001F014F8012804D002287FF414AF2B4B56 +:101AC0009AE72B4B98E700F0FBFFF3E794F84630DA +:101AD000002B7FF408AF94F8483013F00F01B3D017 +:101AE0001A06204602D501F0C7FAADE701F0BAFAAE +:101AF000AAE794F84630002B7FF4F5AE94F848300E +:101B000013F00F01A0D01B06204602D501F0A0FA69 +:101B10009AE701F093FA97E7142284F8342083F3CC +:101B200011882B462A4629462046FFF76DFE85F38D +:101B30001188E9E65DB1152284F8342083F3118819 +:101B40000021D4E90E232046FFF75EFEFDE60B22BE +:101B500084F8342083F311882B462A4629462046F0 +:101B6000FFF764FEE3E700BFDC3B0008D43B00085E +:101B7000D83B000838B590F834300446002B3ED0EE +:101B8000063BDAB20F2A34D80F2B32D8DFE803F045 +:101B9000373131082232313131313131313137375A +:101BA000C56BB0F84A309D4214D2C3681B8AB5FB9E +:101BB000F3F203FB12556DB9302383F311882B46E2 +:101BC0002A462946FFF732FE85F311880A2384F856 +:101BD00034300EE0142384F83430302383F311883A +:101BE00000231A4619462046FFF70EFE002383F312 +:101BF000118838BD036C03B198470023E7E7002143 +:101C0000204601F025FA0021204601F017FA63680A +:101C10001B6813B10621204698470623D7E700002A +:101C200010B590F83430142B044629D017D8062B61 +:101C300005D001D81BB110BD093B022BFBD80021F8 +:101C4000204601F005FA0021204601F0F7F963680B +:101C50001B6813B1062120469847062319E0152B6F +:101C6000E9D10B2380F83430302383F3118800232B +:101C70001A461946FFF7DAFD002383F31188DAE7E5 +:101C8000C3689B695B68002BD5D1036C03B198478F +:101C9000002384F83430CEE700230375826803699B +:101CA0001B6899689142FBD25A68036042601060D9 +:101CB0005860704700230375826803691B68996840 +:101CC0009142FBD85A6803604260106058607047C8 +:101CD00008B50846302383F311880B7D032B05D00C +:101CE000042B0DD02BB983F3118808BD8B6900221A +:101CF0001A604FF0FF338361FFF7CEFF0023F2E756 +:101D0000D1E9003213605A60F3E70000FFF7C4BF67 +:101D1000054BD9680875186802681A60536001227B +:101D20000275D860FEF7EEBA2826002030B50C4BBD +:101D3000DD684B1C87B004460FD02B46094A684625 +:101D400000F04EF92046FFF7E3FF009B13B1684611 +:101D500000F050F9A86907B030BDFFF7D9FFF9E7E7 +:101D600028260020D11C0008044B1A68DB68906804 +:101D70009B68984294BF00200120704728260020CD +:101D8000084B10B51C68D86822681A60536001229D +:101D90002275DC60FFF78EFF01462046BDE810404B +:101DA000FEF7B0BA2826002038B5074C0749084886 +:101DB000012300252370656001F068FB0223237076 +:101DC00085F3118838BD00BF90280020E43B00084F +:101DD0002826002000F044B9034A516853685B1A72 +:101DE0009842FBD8704700BF001000E08B600223D0 +:101DF00008618B82084670478368A3F1840243F828 +:101E0000142C026943F8442C426943F8402C094AD7 +:101E100043F8242CC26843F8182C022203F80C2C37 +:101E2000002203F80B2C044A43F8102CA3F12000E5 +:101E3000704700BF1D0300082826002008B5FFF7E3 +:101E4000DBFFBDE80840FFF761BF0000024BDB6825 +:101E500098610F20FFF75CBF28260020302383F312 +:101E60001188FFF7F3BF000008B50146302383F364 +:101E700011880820FFF75AFF002383F3118808BD5B +:101E8000064BDB6839B1426818605A6013604360E2 +:101E90000420FFF74BBF4FF0FF307047282600208B +:101EA0000368984206D01A6802605060996118462B +:101EB000FFF72CBF7047000038B504460D46206878 +:101EC000844200D138BD036823605C608561FFF700 +:101ED0001DFFF4E710B503689C68A2420CD85C684B +:101EE0008A600B604C602160596099688A1A9A6018 +:101EF0004FF0FF33836010BD1B68121BECE700003E +:101F00000A2938BF0A2170B504460D460A26601911 +:101F100001F0B4FA01F09CFA041BA54203D8751C29 +:101F20002E460446F3E70A2E04D9BDE8704001208E +:101F300001F0ECBA70BD0000F8B5144B0D46D96144 +:101F400003F1100141600A2A1969826038BF0A2230 +:101F5000016048601861A818144601F07FFA0A274A +:101F600001F076FA431BA342064606D37C1C2819CF +:101F700001F084FA27463546F2E70A2F04D9BDE876 +:101F8000F840012001F0C2BAF8BD00BF28260020A9 +:101F9000F8B506460D4601F05BFA0F4A134653F8B2 +:101FA000107F9F4206D12A4601463046BDE8F840E0 +:101FB000FFF7C2BFD169BB68441A2C1928BF2C4651 +:101FC000A34202D92946FFF79BFF22463146034828 +:101FD000BDE8F840FFF77EBF282600203826002005 +:101FE00010B4C0E9032300235DF8044B4361FFF7FD +:101FF000CFBF000010B5194C236998420DD0D0E92D +:102000000032816813605A609A680A449A6000231B +:1020100003604FF0FF33A36110BD2346026843F80D +:10202000102F53600022026022699A4203D1BDE85A +:10203000104001F01DBA936881680B44936001F071 +:1020400007FA2269E1699268441AA242E4D911446C +:10205000BDE81040091AFFF753BF00BF2826002033 +:102060002DE9F047DFF8BC8008F110072C4ED8F8B6 +:10207000105001F0EDF9D8F81C40AA68031B9A42F1 +:102080003ED81444D5E900324FF00009C8F81C408E +:1020900013605A60C5F80090D8F81030B34201D1EF +:1020A00001F0E6F989F31188D5E90331284698470C +:1020B000302383F311886B69002BD8D001F0C8F965 +:1020C0006A69A0EB04094A4582460DD2022001F05C +:1020D0001DFA0022D8F81030B34208D151462846E4 +:1020E000BDE8F047FFF728BF121A2244F2E712EBCF +:1020F000090938BF4A4629463846FFF7EBFEB5E7DF +:10210000D8F81030B34208D01444211AC8F81C0083 +:10211000A960BDE8F047FFF7F3BEBDE8F08700BF58 +:10212000382600202826002000207047FEE7000007 +:10213000704700004FF0FF307047000002290CD0BC +:10214000032904D00129074818BF00207047032A3B +:1021500005D8054800EBC2007047044870470020CE +:10216000704700BFC03C00082C220020743C0008CF +:1021700070B59AB00546084601A9144600F0C2F8A9 +:1021800001A8FEF7BDFD431C5B00C5E90034002239 +:10219000237003236370C6B201AB02341046D1B280 +:1021A0008E4204F1020401D81AB070BD13F8011B6D +:1021B00004F8021C04F8010C0132F0E708B53023E2 +:1021C00083F311880348FFF759FA002383F311883A +:1021D00008BD00BF9828002090F8443003F01F028B +:1021E000012A07D190F845200B2A03D10023C0E92A +:1021F0000E3315E003F06003202B08D1B0F848300F +:102200002BB990F84520212A03D81F2A04D8FFF7BC +:1022100017BA222AEBD0FAE7034A82630722C26385 +:1022200003640120704700BF2322002007B5052961 +:1022300017D8DFE801F0191603191920302383F3AA +:102240001188104A01900121FFF7BAFA01980E4A4D +:102250000221FFF7B5FA0D48FFF7DCF9002383F3FD +:10226000118803B05DF804FB302383F3118807481D +:10227000FFF7A6F9F2E7302383F311880348FFF74D +:10228000BDF9EBE7143C0008383C00089828002012 +:1022900038B50C4D0C4C0D492A4604F10800FFF7E7 +:1022A00067FF05F1CA0204F110000949FFF760FF5A +:1022B00005F5CA7204F118000649BDE83840FFF779 +:1022C00057BF00BF602D00202C220020F03B0008EB +:1022D000FD3B0008083C000870B5044608460D4662 +:1022E000FEF70EFDC6B22046013403780BB918463E +:1022F00070BD32462946FEF7EFFC0028F3D10120DD +:10230000F6E700002DE9F84F05460C46FEF7F8FC0D +:102310002B49C6B22846FFF7DFFF08B10236F6B2F6 +:1023200028492846FFF7D8FF08B11036F6B2632EC9 +:102330000DD8DFF88C80DFF88C90234FDFF890A069 +:10234000DFF890B02E7846B92670BDE8F88F2946A0 +:102350002046BDE8F84F01F0D3BB252E2BD1072234 +:1023600041462846FEF7B8FC58B9DBF80030236038 +:10237000DBF8043063609BF80830237207350934BA +:10238000E0E7082249462846FEF7A6FC98B90F4B1D +:10239000A21C197809090232C95D02F8041C13F85D +:1023A000011B01F00F015345C95D02F8031CF0D178 +:1023B00018340835C6E704F8016B0135C2E700BFE1 +:1023C000E03C0008083C0008F23C0008107AFF1FBF +:1023D0001C7AFF1FE83C0008BFF34F8F024AD36806 +:1023E000DB03FCD4704700BF003C024008B5094B3A +:1023F0001B7873B9FFF7F0FF074B1A69002ABFBFBC +:10240000064A5A6002F188325A601A6822F48062E1 +:102410001A6008BDBE2F0020003C02402301674522 +:1024200008B50B4B1B7893B9FFF7D6FF094B1A6918 +:1024300042F000421A611A6842F480521A601A6827 +:1024400022F480521A601A6842F480621A6008BD51 +:10245000BE2F0020003C02401728F0B516D80C4CC7 +:102460000C4923787BB90C4D0E4618234FF00062BF +:1024700055F8047B46F8042B013B13F0FF033A4464 +:10248000F6D10123237051F82000F0BD0020FCE7B5 +:1024900020300020C02F0020043D0008014B53F8DD +:1024A00020007047043D000818207047172810B519 +:1024B000044601D9002010BDFFF7CEFF064B53F8AC +:1024C00024301844C21A0BB90120F4E71268013213 +:1024D000F0D1043BF6E700BF043D0008172838B5EB +:1024E000044628D81549FFF777FFFFF77FFFF3234E +:1024F000CB600C23B0FBF3F203FB1205D30143EADC +:10250000C503DBB243F4007343F002030B610B69B4 +:1025100043F480330B61FFF75FFFFFF79DFF084B2C +:1025200053F8241000F0DAF8FFF77AFF2046BDE8F0 +:102530003840FFF7BBBF002038BD00BF003C024061 +:10254000043D0008F8B512F00103144642D1821888 +:10255000B2F1026F57D82D4B1B6813F0010352D014 +:102560002B4DFFF743FFF323EB60FFF735FF40F2FE +:102570000127032C15D824F001046618244C401AB6 +:1025800040F20117B142236900EB010524D123F089 +:1025900001032361FFF744FF0120F8BD043C043030 +:1025A000E7E78307E7D12B6923F440732B612B699D +:1025B0003B432B6151F8046B0660BFF34F8FFFF76D +:1025C0000BFF03689E42E9D02B6923F001032B61C6 +:1025D000FFF726FF0020E0E723F44073236123691F +:1025E0003B4323610B882B80BFF34F8FFFF7F4FE33 +:1025F0002D8831F8023BADB2AB42C3D0236923F042 +:1026000001032361E4E71846C7E700BF0038024032 +:10261000003C0240084908B50B7828B11BB9FFF708 +:10262000E5FE01230B7008BD002BFCD0BDE808407F +:102630000870FFF7F5BE00BFBE2F002010B50244A2 +:10264000064BD2B2904200D110BD441C00B253F8E8 +:10265000200041F8040BE0B2F4E700BF502800402E +:102660000F4B30B51C6F240407D41C6F44F4007466 +:102670001C671C6F44F400441C670A4C236843F435 +:10268000807323600244084BD2B2904200D130BD27 +:10269000441C00B251F8045B43F82050E0B2F4E768 +:1026A00000380240007000405028004007B5012269 +:1026B00001A90020FFF7C2FF019803B05DF804FBF9 +:1026C00013B50446FFF7F2FFA04205D0012201A98D +:1026D00000200194FFF7C4FF02B010BD7047000056 +:1026E000094B5A88B2F5805F10460BD022F00203E6 +:1026F00041F20102934205D041F20703C31A584246 +:102700005841704701207047002004E0034B1A68CD +:102710001AB9034AD2F874281A607047243000208E +:102720000030024008B5FFF7F1FF024B1868C0F314 +:10273000407008BD2430002070470000FEE7000014 +:102740000A4B0B480B4A90420BD30B4BDA1C121A64 +:10275000C11E22F003028B4238BF00220021FEF787 +:10276000D7BA53F8041B40F8041BECE7EC3E000812 +:1027700020310020203100202031002070B5D0E928 +:1027800015439E6800224FF0FF3504EB42135101C0 +:10279000D3F800090028BEBFD3F8000940F08040FC +:1027A000C3F80009D3F8000B0028BEBFD3F8000B14 +:1027B00040F08040C3F8000B013263189642C3F822 +:1027C0000859C3F8085BE0D24FF00113C4F81C3875 +:1027D00070BD0000890141F02001016103699B0681 +:1027E000FCD41220FFF7F8BA10B5054C2046FEF7CE +:1027F000C7FF4FF0A0436365024BA36510BD00BF48 +:1028000028300020883D000870B50378012B05466C +:1028100050D12A4B446D98421BD1294B5A6B42F040 +:1028200080025A635A6D42F080025A655A6D5A69A5 +:1028300042F080025A615A6922F080025A610E21E8 +:1028400043205B6900F022FC1E4BE3601E4BC4F882 +:1028500000380023C4F8003EC02323606E6D4FF49F +:102860005023A3633369002BFCDA012333610C206E +:10287000FFF7B2FA3369DB07FCD41220FFF7ACFA9A +:102880003369002BFCDA0026A6602846FFF776FFA6 +:102890006B68C4F81068DB68C4F81468C4F81C6876 +:1028A0004BB90A4BA3614FF0FF336361A36843F058 +:1028B0000103A36070BD064BF4E700BF2830002081 +:1028C000003802404014004003002002003C30C0A9 +:1028D000083C30C0F8B5446D054600212046FFF79E +:1028E00079FFA96D00234FF001128F68C4F83438C6 +:1028F0004FF00066C4F81C284FF0FF3004EB431281 +:1029000001339F42C2F80069C2F8006BC2F808099F +:10291000C2F8080BF2D20B686A6DEB656362102394 +:102920001361166916F01006FBD11220FFF754FA56 +:10293000D4F8003823F4FE63C4F80038A36943F4E4 +:10294000402343F01003A3610923C4F81038C4F8EE +:1029500014380A4BEB604FF0C043C4F8103B084BEF +:10296000C4F8003BC4F81069C4F80039EB6D03F1FA +:10297000100243F48013EA65A362F8BD643D0008C9 +:1029800040800010426D90F84E10D2F8003823F4C9 +:10299000FE6343EA0113C2F8003870472DE9F8439B +:1029A00000EB8103456DDA68166806F00306731EB6 +:1029B000022B05EB41130C4680460FFA81F94FEAD2 +:1029C00041104FF00001C3F8101B4FF0010104F15A +:1029D000100398BFB60401FA03F391698EBF334E1A +:1029E00006F1805606F5004600293AD0578A04F1D0 +:1029F0005801490137436F50D5F81C180B43C5F8EF +:102A00001C382B180021C3F8101953690127611EC7 +:102A1000A7409BB3138A928B9B08012A88BF53431C +:102A2000D8F85C20981842EA034301F1400205EB14 +:102A30008202C8F85C00214653602846FFF7CAFEB0 +:102A400008EB8900C3681B8A43EA84534834640155 +:102A50001E432E51D5F81C381F43C5F81C78BDE81D +:102A6000F88305EB4917D7F8001B21F40041C7F89C +:102A7000001BD5F81C1821EA0303C0E704F13F034B +:102A800005EB83030A4A5A6028462146FFF7A2FE57 +:102A900005EB4910D0F8003923F40043C0F80039A1 +:102AA000D5F81C3823EA0707D7E700BF00800010DD +:102AB00000040002826D1268C265FFF75FBE00006D +:102AC0005831436D49015B5813F4004004D013F4AE +:102AD000001F0CBF02200120704700004831436DE9 +:102AE00049015B5813F4004004D013F4001F0CBFDD +:102AF000022001207047000000EB8101CB68196AB9 +:102B00000B6813604B6853607047000000EB810353 +:102B100030B5DD68AA691368D36019B9402B84BF4A +:102B2000402313606B8A1468426D1C44013CB4FB63 +:102B3000F3F46343033323F0030302EB411043EA4E +:102B4000C44343F0C043C0F8103B2B6803F00303B9 +:102B5000012B09B20ED1D2F8083802EB411013F460 +:102B6000807FD0F8003B14BF43F0805343F0005304 +:102B7000C0F8003B02EB4112D2F8003B43F00443A3 +:102B8000C2F8003B30BD00002DE9F041244D6E6DD0 +:102B900006EB40130446D3F8087BC3F8087B3807DC +:102BA0000AD5D6F81438190706D505EB8403214653 +:102BB000DB6828465B689847FA071FD5D6F81438B3 +:102BC000DB071BD505EB8403D968CCB98B69488A30 +:102BD0005A68B2FBF0F600FB16228AB91868DA6868 +:102BE00090420DD2121AC3E90024302383F31188D6 +:102BF0000B482146FFF78AFF84F31188BDE8F08176 +:102C0000012303FA04F26B8923EA02036B81CB6888 +:102C1000002BF3D021460248BDE8F041184700BF21 +:102C20002830002000EB810370B5DD68436D6C69CE +:102C30002668E6604A0156BB1A444FF40020C2F8E9 +:102C400010092A6802F00302012A0AB20ED1D3F851 +:102C5000080803EB421410F4807FD4F8000914BF75 +:102C600040F0805040F00050C4F8000903EB4212DD +:102C7000D2F8000940F00440C2F80009D3F8340843 +:102C8000012202FA01F10143C3F8341870BD19B9E9 +:102C9000402E84BF4020206020682E8A8419013C89 +:102CA000B4FBF6F440EAC44040F000501A44C6E7D2 +:102CB0002DE9F8433B4D6E6D06EB40130446D3F807 +:102CC0000889C3F8088918F0010F4FEA40171AD095 +:102CD000D6F81038DB0716D505EB8003D9684B69A9 +:102CE0001868DA68904230D2121A4FF000091A6060 +:102CF000C3F80490302383F3118821462846FFF758 +:102D000091FF89F3118818F0800F1CD0D6F8343861 +:102D10000126A640334216D005EB84036D6DD3F82F +:102D20000CC0DCF814200134E4B2D2F800E005EB6A +:102D300004342F445168714515D3D5F8343823EA4B +:102D40000606C5F83468BDE8F883012303FA04F2E7 +:102D50002B8923EA02032B818B68002BD3D02146D9 +:102D600028469847CFE7BCF81000AEEB010383423A +:102D700028BF0346D7F8180980B2B3EB800FE2D81A +:102D80009068A0F1040959F8048FC4F80080A0EB02 +:102D900009089844B8F1040FF5D818440B44906022 +:102DA0005360C7E7283000202DE9F74FA24C656D2E +:102DB0006E69AB691E4016F480586E6107D02046DC +:102DC000FEF746FD03B0BDE8F04F00F04DBC002E0D +:102DD00012DAD5F8003E98489B071EBFD5F8003E92 +:102DE00023F00303C5F8003ED5F8043823F00103AF +:102DF000C5F80438FEF756FD370505D58E48FFF7B0 +:102E0000BDFC8D48FEF73CFDB0040CD5D5F8083864 +:102E100013F0060FEB6823F470530CBF43F4105308 +:102E200043F4A053EB6031071BD56368DB681BB923 +:102E3000AB6923F00803AB612378052B0CD1D5F8DF +:102E4000003E7D489A071EBFD5F8003E23F00303DD +:102E5000C5F8003EFEF726FD6368DB680BB17648D7 +:102E60009847F30274D4B70227D5D4F85490DFF80A +:102E7000C8B100274FF0010A09EB4712D2F8003B16 +:102E800003F44023B3F5802F11D1D2F8003B002B7F +:102E90000DDA62890AFA07F322EA0303638104EB7D +:102EA0008703DB68DB6813B1394658469847A36D42 +:102EB00001379B68FFB29F42DED9F00617D5676DD8 +:102EC0003A6AC2F30A1002F00F0302F4F012B2F5EC +:102ED000802F00F08580B2F5402F08D104EB8303EA +:102EE0000022DB681B6A07F5805790426AD13003E5 +:102EF000D5F8184813D5E10302D50020FFF744FEAA +:102F0000A20302D50120FFF73FFE630302D5022092 +:102F1000FFF73AFE270302D50320FFF735FE7503BE +:102F20007FF550AFE00702D50020FFF7C1FEA107F3 +:102F300002D50120FFF7BCFE620702D50220FFF791 +:102F4000B7FE23077FF53EAF0320FFF7B1FE39E759 +:102F5000636DDFF8E4A0019300274FF00109A36D32 +:102F60009B685FFA87FB9B453FF67DAF019B03EBB8 +:102F70004B13D3F8001901F44021B1F5802F1FD174 +:102F8000D3F8001900291BDAD3F8001941F0904159 +:102F9000C3F80019D3F800190029FBDB5946606D0E +:102FA000FFF718FC218909FA0BF321EA03032381B7 +:102FB00004EB8B03DB689B6813B159465046984776 +:102FC0000137CCE7910708BFD7F80080072A98BFE0 +:102FD00003F8018B02F1010298BF4FEA182884E739 +:102FE000023304EB830207F580575268D2F818C009 +:102FF000DCF80820DCE9001CA1EB0C0C0021884265 +:103000000AD104EB830463689B699A6802449A605E +:103010005A6802445A606AE711F0030F08BFD7F8F4 +:1030200000808C4588BF02F8018B01F1010188BF47 +:103030004FEA1828E3E700BF28300020436D03EB78 +:103040004111D1F8003B43F40013C1F8003B704735 +:10305000436D03EB4111D1F8003943F40013C1F87B +:1030600000397047436D03EB4111D1F8003B23F465 +:103070000013C1F8003B7047436D03EB4111D1F8D9 +:10308000003923F40013C1F80039704700F16043A0 +:1030900003F561430901C9B283F80013012200F06E +:1030A0001F039A4043099B0003F1604303F561430A +:1030B000C3F880211A60704730B5039C0172043355 +:1030C00004FB0325C0E90653049B03630021059B11 +:1030D000C160C0E90000C0E90422C0E90842C0E9BB +:1030E0000A11436330BD0000416A0022C0E90411A7 +:1030F000C0E90A22C2606FF00101FEF7DDBE0000E8 +:10310000D0E90432934201D1C2680AB9181D704750 +:103110000020704703691960C2680132C260C26949 +:10312000134482690361934224BF436A036100210F +:10313000FEF7B6BE38B504460D46E3683BB162699A +:10314000131D1268A3621344E362002007E0237A90 +:1031500033B929462046FEF793FE0028EDDA38BD44 +:103160006FF00100FBE70000C368C269013BC36068 +:103170004369134482694361934224BF436A4361B4 +:1031800000238362036B03B11847704770B5302387 +:10319000044683F31188866A3EB9FFF7CBFF0546E4 +:1031A00018B186F31188284670BDA36AE26A13F845 +:1031B000015BA362934202D32046FFF7D5FF0023B1 +:1031C00083F31188EFE700002DE9F84F04460E461F +:1031D000174698464FF0300989F311880025AA4612 +:1031E000D4F828B0BBF1000F09D141462046FFF7C3 +:1031F000A1FF20B18BF311882846BDE8F88FD4E9F0 +:103200000A12A7EB050B521A934528BF9346BBF150 +:10321000400F1BD9334601F1400251F8040B43F82B +:10322000040B9142F9D1A36A40334036A362403582 +:10323000D4E90A239A4202D32046FFF795FF8AF386 +:103240001188BD42D8D289F31188C9E730465A4661 +:10325000FDF738FDA36A5B445E44A3625D44E7E783 +:1032600010B5029C0172043303FB0421C0E906136C +:103270000023C0E90A33039B0363049BC460C0E9D5 +:103280000000C0E90422C0E90842436310BD000009 +:10329000026AC260426AC0E904220022C0E90A222E +:1032A0006FF00101FEF708BED0E904239A4201D174 +:1032B000C26822B9184650F8043B0B6070470023DF +:1032C0001846FAE7C368C2690133C360436913440F +:1032D00082694361934224BF436A43610021FEF740 +:1032E000DFBD000038B504460D46E3683BB12369F5 +:1032F0001A1DA262E2691344E362002007E0237A08 +:1033000033B929462046FEF7BBFD0028EDDA38BD6B +:103310006FF00100FBE7000003691960C268013A21 +:10332000C260C269134482690361934224BF436A45 +:10333000036100238362036B03B1184770470000E9 +:1033400070B530230D460446114683F31188866A12 +:103350002EB9FFF7C7FF10B186F3118870BDA36ABD +:103360001D70A36AE26A01339342A36204D3E16948 +:1033700020460439FFF7D0FF002080F31188EDE7E5 +:103380002DE9F84F04460D46904699464FF0300A15 +:103390008AF311880026B346A76A4FB949462046EA +:1033A000FFF7A0FF20B187F311883046BDE8F88F02 +:1033B000D4E90A073A1AA8EB0607974228BF17462E +:1033C000402F1BD905F1400355F8042B40F8042B7E +:1033D0009D42F9D1A36A4033A3624036D4E90A235F +:1033E0009A4204D3E16920460439FFF795FF8BF335 +:1033F00011884645D9D28AF31188CDE729463A4645 +:10340000FDF760FCA36A3B443D44A3623E44E5E70C +:10341000D0E904239A4217D1C3689BB1836A8BB168 +:10342000043B9B1A0ED01360C368013BC360C369A1 +:103430001A44836902619A4224BF436A03610023EC +:1034400083620123184670470023FBE700F036B97A +:10345000014B586A704700BF000C0040034B00222C +:1034600058631A610222DA60704700BF000C004006 +:10347000014B0022DA607047000C0040014B58639A +:10348000704700BF000C0040FEE7000070B51B4B0A +:1034900001630025044686B0586085620E4600F040 +:1034A000BFF804F11003C4E904334FF0FF33C4E95B +:1034B0000635C4E90044A560E562FFF7C9FF2B4665 +:1034C0000246C4E9082304F134010D4A256580232E +:1034D0002046FEF78BFC0123E0600A4A0375009248 +:1034E00072680192B268CDE90223074B6846CDE9C4 +:1034F0000435FEF7A3FC06B070BD00BF9028002085 +:10350000943D0008993D000889340008024AD36AB6 +:103510001843D062704700BF282600204B684360E4 +:103520008B688360CB68C3600B6943614B6903623E +:103530008B6943620B6803607047000008B5264B37 +:1035400026481A6940F2FF110A431A611A6922F4E7 +:10355000FF7222F001021A611A691A6B0A431A6398 +:103560001A6D0A431A651E4A1B6D1146FFF7D6FFF6 +:1035700002F11C0100F58060FFF7D0FF02F1380175 +:1035800000F58060FFF7CAFF02F1540100F580608A +:10359000FFF7C4FF02F1700100F58060FFF7BEFF86 +:1035A00002F18C0100F58060FFF7B8FF02F1A8017D +:1035B00000F58060FFF7B2FF02F1C40100F5806002 +:1035C000FFF7ACFF02F1E00100F58060FFF7A6FF16 +:1035D000BDE8084000F0F0B80038024000000240AA +:1035E000A03D000808B500F06BFAFEF7DDFBFFF721 +:1035F0008DF8BDE80840FEF74BBE000070470000A4 +:10360000EFF3098305494A6B22F001024A636833EC +:1036100083F30988002383F31188704700EF00E0EB +:10362000302080F3118862B60C4B0D4AD96821F422 +:10363000E0610904090C0A43DA60D3F8FC20094967 +:1036400042F08072C3F8FC200A6842F001020A606E +:103650002022DA7783F82200704700BF00ED00E0F7 +:103660000003FA05001000E010B5302383F3118841 +:103670000E4B5B6813F4006314D0F1EE103AEFF3D5 +:103680000984683C4FF08073E361094BDB6B236670 +:1036900084F30988FEF768FB10B1064BA36110BDE7 +:1036A000054BFBE783F31188F9E700BF00ED00E06D +:1036B00000EF00E02F030008320300080E4B1A6CE5 +:1036C00042F008021A641A6E42F008021A660B4AA7 +:1036D0001B6E936843F008039360094B53229A6270 +:1036E0004FF0FF32DA6200229A615A63DA605A6060 +:1036F00001225A611A60704700380240002004E03D +:10370000000C0040094A08B51169D3680B40D9B2D2 +:10371000C9439B07116107D5302383F31188FEF756 +:1037200059FB002383F3118808BD00BF000C004043 +:103730001F4B1A696FEAC2526FEAD2521A611A69B4 +:10374000C2F308021A614FF0FF301A695A695861D2 +:1037500000215A6959615A691A6A62F080521A62E4 +:103760001A6A02F080521A621A6A5A6A58625A6ACF +:1037700059625A6A1A6C42F080521A641A6E42F008 +:1037800080521A661A6E0B4A106840F480701060FE +:10379000186F00F44070B0F5007F1EBF4FF480300A +:1037A00018671967536823F40073536000F060B919 +:1037B0000038024000700040344B4FF080521A64D1 +:1037C000334A4FF4404111601A6842F001021A6016 +:1037D0001A689107FCD59A6822F003029A602B4B75 +:1037E0009A6812F00C02FBD1196801F0F901196016 +:1037F0009A601A6842F480321A601A689203FCD503 +:103800005A6F42F001025A67204B5A6F9007FCD55D +:10381000204A5A601A6842F080721A601C4A536843 +:103820005904FCD5194B1A689201FCD51A4A9A60C2 +:103830000322C3F88C20194B1A68194B9A42194B72 +:1038400021D1194A1168194A91421CD140F205123E +:103850001A60144A136803F00F03052BFAD10B4BBF +:103860009A6842F002029A609A6802F00C02082AF2 +:10387000FAD15A6C42F480425A645A6E42F4804241 +:103880005A665B6E704740F20572E1E7003802400D +:10389000007000401854400700948838002004E06D +:1038A00011640020003C024000ED00E041C20F41E5 +:1038B000074A08B5536903F00103536123B1054A70 +:1038C00013680BB150689847BDE80840FFF7CCBEBD +:1038D000003C0140A0300020074A08B5536903F0BE +:1038E0000203536123B1054A93680BB1D06898472E +:1038F000BDE80840FFF7B8BE003C0140A030002002 +:10390000074A08B5536903F00403536123B1054A1C +:1039100013690BB150699847BDE80840FFF7A4BE92 +:10392000003C0140A0300020074A08B5536903F06D +:103930000803536123B1054A93690BB1D0699847D5 +:10394000BDE80840FFF790BE003C0140A0300020D9 +:10395000074A08B5536903F01003536123B1054AC0 +:10396000136A0BB1506A9847BDE80840FFF77CBE68 +:10397000003C0140A0300020164B10B55C6904F4F7 +:1039800078725A61A30604D5134A936A0BB1D06AC0 +:103990009847600604D5104A136B0BB1506B9847DB +:1039A000210604D50C4A936B0BB1D06B9847E20506 +:1039B00004D5094A136C0BB1506C9847A30504D584 +:1039C000054A936C0BB1D06C9847BDE81040FFF7E7 +:1039D0004BBE00BF003C0140A0300020194B10B589 +:1039E0005C6904F47C425A61620504D5164A136D81 +:1039F0000BB1506D9847230504D5134A936D0BB155 +:103A0000D06D9847E00404D50F4A136E0BB1506E89 +:103A10009847A10404D50C4A936E0BB1D06E984719 +:103A2000620404D5084A136F0BB1506F9847230402 +:103A300004D5054A936F0BB1D06F9847BDE810408D +:103A4000FFF712BE003C0140A030002008B503483B +:103A5000FDF798FABDE80840FFF706BEBC2300203A +:103A600008B5FFF74FFEBDE80840FFF7FDBD0000B9 +:103A7000062108B50846FFF709FB06210720FFF7D6 +:103A800005FB06210820FFF701FB06210920FFF7AF +:103A9000FDFA06210A20FFF7F9FA06211720FFF7A1 +:103AA000F5FA06212820FFF7F1FA07213220FFF767 +:103AB000EDFABDE808400C212620FFF7E7BA000028 +:103AC00008B5FFF735FE00F00DF8FDF76FFCFDF7C8 +:103AD00055FEFDF72DFDFFF791FDBDE80840FFF70E +:103AE000B5BC00000023054A19460133102BC2E97A +:103AF000001102F10802F8D1704700BFA030002089 +:103B0000034611F8012B03F8012B002AF9D1704765 +:103B100053544D3332463F3F3F0053544D333246AA +:103B20003430780053544D33324634327800535495 +:103B30004D333246343436585800000001203300EB +:103B40000010410001105A00031059000710310005 +:103B500000000000103B0008130400001A3B00089E +:103B600019040000243B0008210400002E3B00083B +:103B700000960000000000000000000000000000AF +:103B800000000000000000006D1300085913000839 +:103B900095130008811300088D130008791300089D +:103BA0006513000851130008A1130008000000006D +:103BB000AD14000899140008D5140008C1140008B9 +:103BC000CD140008B9140008A514000891140008C9 +:103BD000E1140008000000000100000000000000E7 +:103BE00063300000E03B0008802600209028002081 +:103BF0004865782F50726F6669434E430025424FE7 +:103C0000415244252D424C002553455249414C25F3 +:103C1000000000000200000000000000C9160008BB +:103C20003517000840004000302D0020402D0020B6 +:103C3000020000000000000003000000000000007F +:103C4000791700080000000010000000502D00202F +:103C500000000000010000000000000028300020EB +:103C6000010102002D2200083D210008D921000891 +:103C7000BD210008430000007C3C0008090243000D +:103C8000020100C032090400000102020100052403 +:103C9000001001052401000104240202052406008D +:103CA00001070582030800FF09040100020A000061 +:103CB00000070501024000000705810240000000E6 +:103CC00012000000C83C0008120110010200004070 +:103CD000AE2D0110000201020301000004030904DB +:103CE00025424F415244250043756265426C616331 +:103CF0006B00303132333435363738394142434442 +:103D00004546000000400000004000000040000068 +:103D1000004000000000010000000200000002005E +:103D2000000002000000020000000200000002008B +:103D300000000200004000000040000000400000C1 +:103D4000004000000000010000000200000002002E +:103D5000000002000000020000000200000002005B +:103D60000000020000000000BD180008751B0008DC +:103D7000211C0008400040008830002088300020CE +:103D80000100000098300020800000004001000089 +:103D9000030000006D61696E0069646C65000000DD +:103DA0000000812A00020000AAAAAAAA000000249A +:103DB000FFFF00000000000000A00A00000000005B +:103DC00000000000AAAAAAAA00000000FFFF00004D +:103DD000000000000000000014000054000000007B +:103DE000AAAAAAAA14000054FFFF000000000000C5 +:103DF000000000008069100000000000AAAA8AAA42 +:103E000040561000FFFF0000007070070000000027 +:103E10004001000100000000AAAAAAAA00010000B7 +:103E2000F7FF00000000000000000000000000009C +:103E300000000000AAAAAAAA00000000FFFF0000DC +:103E40000000000000000000000000000000000072 +:103E5000AAAAAAAA00000000FFFF000000000000BC +:103E60000000000000000000000000000A00000048 +:103E7000000000000300000000000000000000003F +:103E80000000000000000000000000000000000032 +:103E90000000000000000000000000000000000022 +:103EA000090000000000000000C01F00000000002A +:103EB000FF00000098280020BC230020009600008E +:103EC0000000080096000000000800000400000048 +:103ED000DC3C0008000000000000000000000000C2 +:0C3EE000000000000000000000000000D6 :00000001FF diff --git a/Tools/bootloaders/CubeGreen-solo_bl.bin b/Tools/bootloaders/CubeGreen-solo_bl.bin index 29a012f8da..238691cfdc 100755 Binary files a/Tools/bootloaders/CubeGreen-solo_bl.bin and b/Tools/bootloaders/CubeGreen-solo_bl.bin differ diff --git a/Tools/bootloaders/CubeGreen-solo_bl.hex b/Tools/bootloaders/CubeGreen-solo_bl.hex index 62a0215be7..a841e24a36 100644 --- a/Tools/bootloaders/CubeGreen-solo_bl.hex +++ b/Tools/bootloaders/CubeGreen-solo_bl.hex @@ -1,1019 +1,1009 @@ :020000040800F2 -:1000000000040020E10100081D0F0008210F000876 -:10001000750F0008210F0008490F0008E3010008D0 -:10002000E3010008E3010008E301000811280008CB +:1000000000060020E1010008E3010008E301000808 +:10001000E3010008E3010008E3010008E301000830 +:10002000E3010008E3010008E301000801360008CD :10003000E3010008E3010008E3010008E301000810 :10004000E3010008E3010008E3010008E301000800 -:10005000E3010008E301000879390008A539000828 -:10006000D1390008FD390008293A0008E3010008E9 +:10005000E3010008E3010008B1380008D9380008BE +:10006000013900082939000851390008E301000866 :10007000E3010008E3010008E3010008E3010008D0 :10008000E3010008E3010008E3010008E3010008C0 -:10009000E3010008E3010008E3010008553A000805 +:10009000E3010008E3010008E301000879390008E2 :1000A000E3010008E3010008E3010008E3010008A0 :1000B000E3010008E3010008E3010008E301000890 :1000C000E3010008E3010008E3010008E301000880 -:1000D000E3010008E30100082511000839110008B8 -:1000E000BD3A0008E3010008E3010008E30100084D +:1000D000E3010008E30100084D3A0008E3010008CD +:1000E000DD390008E3010008E3010008E30100082E :1000F000E3010008E3010008E3010008E301000850 -:10010000E3010008E301000889370008E301000863 +:10010000E3010008E3010008613A0008E301000888 :10011000E3010008E3010008E3010008E30100082F :10012000E3010008E3010008E3010008E30100081F :10013000E3010008E3010008E3010008E30100080F -:10014000E3010008E3010008E3010008FD2E0008B8 +:10014000E3010008E3010008E3010008A92D00080D :10015000E3010008E3010008E3010008E3010008EF :10016000E3010008E3010008E3010008E3010008DF :10017000E3010008E3010008E3010008E3010008CF -:10018000E3010008E30100084D110008E301000845 +:10018000E3010008E3010008E3010008E3010008BF :10019000E3010008E3010008E3010008E3010008AF :1001A000E3010008E3010008E3010008E30100089F :1001B000E3010008E3010008E3010008E30100088F :1001C000E3010008E3010008E3010008E30100087F :1001D000E3010008E3010008E3010008E30100086F -:1001E00002E000F000F8FEE772B6394880F30888B4 -:1001F000384880F3098838484EF60851CEF200019D -:10020000086040F20000CCF200004EF63471CEF2ED -:1002100000010860BFF34F8FBFF36F8F40F2000003 -:10022000C0F2F0004EF68851CEF200010860BFF334 -:100230004F8FBFF36F8F4FF00000E1EE100A4EF6C4 -:100240003C71CEF200010860062080F31488BFF3F1 -:100250006F8F02F01BFB03F02DFA4FF055301F4952 -:100260001B4A91423CBF41F8040BFAE71C49194A6A -:1002700091423CBF41F8040BFAE71A491A4A1B4B5A -:100280009A423EBF51F8040B42F8040BF8E70020F5 -:100290001749184A91423CBF41F8040BFAE702F0B3 -:1002A000F9FA03F063FA144C144DAC4203DA54F833 -:1002B000041B8847F9E700F03FF8114C114DAC42A0 -:1002C00003DA54F8041B8847F9E702F0E1BA0000AA -:1002D000000400200024002000000008000000208E -:1002E00000040020683F000800240020282400208B -:1002F00028240020903D0020E0010008E0010008D3 -:10030000E0010008E00100082DE9F04F2DED108A12 -:10031000C1F80CD0C3689D46BDEC108ABDE8F08FD3 -:10032000002383F311882846A047002001F0ECFE4B -:1003300001F09CFE00DFFEE770B5204C092300258C -:1003400023706FF03F061F236570A570E57025715F -:100350006571A571E57125726672A372E57200F090 -:10036000FFFC20B10F2325726672A372E57202F0C2 -:1003700021FA044602F046FA0546D8B9104B9C42D1 -:100380001AD001339C4218BF054641F2883404BF9D -:1003900001250024002002F017FA0DB100F0B6F894 -:1003A00000F062FD00F01AFC204600F00DF900F0AC -:1003B000ADF8F9E70024EDE70446EBE72824002038 -:1003C000010007B008B500F087FBA0F120035842F8 -:1003D000584108BD07B5054B02211B88ADF8043014 -:1003E00001A800F0E5FB03B05DF804FBA43B0008A6 -:1003F000064991F8243033B100230822086A81F8B5 -:10040000243000F00DBC0120704700BF48240020BC -:100410002DE9F84F234C94F82430054688461746BA -:100420008BBB2E46DFF87C90002F38D094F824A0A8 -:10043000BAF1000F05D12022FF214846266200F0C4 -:1004400001FDCAF10805BD4228BF3D465FFA85FBA4 -:10045000AD0041462A4604EB8A0000F0C9FC94F83E -:100460002430A7EB0B079B445FFA8BFBBBF1080F13 -:100470002E44A844FFB284F824B0D5D1FFF7B8FFCA -:100480000028D1D108E0266A06EB8306B042C9D025 -:10049000FFF7AEFF0028C4D10020BDE8F88F01208F -:1004A000BDE8F88F4824002010B5202383F311887D -:1004B0001248C3680BB101F0ADFE0023104A0F488B -:1004C0004FF47A7101F06AFE002383F311880D4C1A -:1004D000236813B12368013B2360636813B1636829 -:1004E000013B6360084B1B7833B9636823B9022072 -:1004F00000F074FC3223636010BD00BF3424002080 -:10050000A9040008782500207024002010B5254B90 -:10051000254953F8042F013200D110BD8B42F8D188 -:10052000224C234B22689A423AD9224B9B6803F112 -:10053000006303F580439A4232D2002000F068FB4A -:100540001D4B0220187000F03FFC1C4B1A6C00225F -:100550001A64196E1A66196E596C5A64596E5A6685 -:100560005A6E5A6942F080025A615A6922F080023A -:100570005A615A691A6942F000521A611A6922F0E6 -:1005800000521A611B6972B60D4A0E4B13601B684C -:100590002268202181F311889D4683F30888104743 -:1005A00010BD00BFFC3F00081C40000804400008CC -:1005B000FF3F00082824002070240020003802405B -:1005C00008ED00E0004000082DE9F04F99B0B34C71 -:1005D00001902022FF2110A8A66800F033FCB04A49 -:1005E0001378A346A3B9AF480121C360117020233B -:1005F00083F31188C3680BB101F00CFE0023AA4AF3 -:10060000A8484FF47A7101F0C9FD002383F31188E3 -:10061000019B13B1A54B019A1A60A54AA349019FFA -:100620000292002313704B6099461C461D46984663 -:10063000012000F0C9FB002F00F012829B4B1B68C9 -:10064000002B40F00D8219B0BDE8F08F0220FFF7BB -:10065000B9FE002840F0FB81019BB9F1000F08BFF3 -:100660001F46944B1B88ADF82C3002210BA800F0DC -:100670009FFADDE74FF47A7000F02EFA031E039321 -:10068000EADB0220FFF79EFE82460028E4D0039BAF -:10069000581E042800F2DD81DFE800F0030E11147B -:1006A000170018A8052340F8343D042100F080FA13 -:1006B00054464FF0000856E004217848F6E704213C -:1006C0007D48F3E704217D48F0E71C24204600F034 -:1006D000A1FA04340B9004210BA800F069FA2C2C29 -:1006E000F4D1E5E7002DB7D0002CB5D00220FFF7FC -:1006F00069FE0546002800F0AF8101206C4C00F037 -:1007000087FA0220207000F05FFB4FF000095FFACB -:1007100089FA504600F08CFA074658B1504600F06E -:1007200097FA09F101090028F1D12C46A9460027C2 -:10073000634B97E701230220237000F03BFB3E460A -:10074000DBF808309E4206D2304600F063FA0130F2 -:10075000EBD10436F4E7029B00261E70534BA946EA -:100760005E602C46374600F075FB15B1002C18BFB3 -:100770000027FFF72FFE5BE7002D3FF46DAF002C45 -:100780003FF46AAF029B0220187000F01DFB32207C -:1007900000F0A2F9B0F1000AC0F25E811AF0030580 -:1007A00040F05A81DBF8082006EB0A03934200F27E -:1007B0005381BAF5807F00F24F8155450DDA4FF431 -:1007C0007A7000F089F90490049B002BC0F24481F8 -:1007D0003C4A049BAB540135EFE7C820FFF7F2FD1C -:1007E0000546002800F038811F2E11D8C6F12004DC -:1007F000544528BF544610AB26F003002246314929 -:10080000184400F0F5FA2246FF212E4800F01AFBAA -:100810004FEAAA0A5FFA8AF22A493046FFF7F8FD42 -:100820000446002800F01A8106EB8A0605469AE77E -:100830000220FFF7C7FD00283FF40EAFFFF7D8FDF9 -:1008400000283FF409AF4FF0000A5346DBF80820B8 -:1008500092451CD2BAF11F0F12D8109A01320FD054 -:100860002AF0030218A90A4452F8202C0B921846C9 -:1008700004220BA900F092FB0AF1040A0346E5E703 -:100880005046039300F0C6F9039B0B90EFE718A8BE -:10089000042140F84C3D00F08BF964E72824002047 -:1008A0007425002034240020A904000878250020A5 -:1008B00070240020A63B00082C24002030240020B7 -:1008C000A83B00087424002018A8002340F8343DF9 -:1008D000642100F039F900287FF4BEAE0220FFF752 -:1008E00071FD00283FF4B8AE0B9800F0C3F918ABC7 -:1008F00043F8480D04211846CDE718A8002340F816 -:10090000343D642100F020F900287FF4A5AE0220D8 -:10091000FFF758FD00283FF49FAE0B9800F0B8F9A0 -:1009200018AB43F8440DE5E70220FFF74BFD002824 -:100930003FF492AE00F0B2F918AB43F8400DD9E79E -:100940000220FFF73FFD00283FF486AE0BA91420DC -:1009500000F0AAF9824618A8042140F83CAD00F046 -:1009600027F951460BA896E7322000F0B5F8B0F110 -:10097000000AFFF671AE1AF0030F7FF46DAEDBF8DC -:1009800008200AEB080393423FF666AE0220FFF709 -:1009900019FD00283FF460AE2AF0030AC244D04596 -:1009A0003FF4E1AE404600F035F904210A900AA870 -:1009B00000F0FEF808F10408F1E74FF47A70FFF751 -:1009C00001FD00283FF448AEFFF712FD00283FF478 -:1009D000AFAE109B01330CD0082210A90020FFF706 -:1009E00017FD00283FF4A4AE2022FF2110A800F03C -:1009F00029FAFFF7EFFC374801F08CFB23E6002DC6 -:100A00003FF42AAE002C3FF427AE18A8002340F88C -:100A1000343D642100F098F8824600287FF41CAE33 -:100A20000220FFF7CFFC00283FF416AE0390FFF73B -:100A3000D1FC41F2883001F06DFB0B9800F04EFACA -:100A400000F008FA039B57461C461D46F0E5054694 -:100A500089E64FF00008FFE52546FDE52C4667E6F0 -:100A6000002000F039F80490049B002BFFF6E3AD62 -:100A7000012000F09FF9049B213B122B3FF6D8ADDB -:100A800001A252F823F000BF4D06000875060008C9 -:100A9000E5060008310600083106000831060008A6 -:100AA000790700086909000831080008C90800082A -:100AB000FB08000829090008310600084109000860 -:100AC00031060008BB090008670700083106000866 -:100AD000FF090008A08601002DE9F34702AE0024BB -:100AE0004FF47A7506F8014D144FDFF858804543EE -:100AF00097F900305A1C5FFA84F901D0A34212D151 -:100B000058F8240003680122D3F820A031462B4670 -:100B1000D047012807D10A4B9DF8070083F80090C1 -:100B200002B0BDE8F0870134042CE1D14FF4FA7033 -:100B300001F0F0FA4FF0FF30F2E700BF0024002090 -:100B400098250020FC3B00082DE9F0474FF47A750A -:100B5000144FDFF8588006464D43002497F90030C3 -:100B60005A1C5FFA84F901D0A34210D158F824002E -:100B700003680422D3F820A031462B46D04704282E -:100B800005D1094B83F800900020BDE8F0870134BF -:100B9000042CE3D14FF4FA7001F0BCFA4FF0FF30AF -:100BA000BDE8F0870024002098250020FC3B0008C9 -:100BB00030B4074B1A78074B53F822402368DD699D -:100BC000054B0A46AC460146204630BC604700BF94 -:100BD00098250020FC3B0008A086010070B501F0BC -:100BE000E5FC094C094E20700025306823788342CB -:100BF00008D901F0D5FC336805440133B5F5804FC1 -:100C00003360F2D370BD00BF9925002080250020FD -:100C100001F082BD00F1006000F58040006870477F -:100C200000F10060920000F5804001F00DBD000071 -:100C3000054B1A68054B1B789B1A834202D9104456 -:100C400001F0AEBC002070478025002099250020CF -:100C500038B5074D04462868204401F0A9FC28B99E -:100C600028682044BDE8384001F0BABC38BD00BF58 -:100C70008025002010F0030308D1B0F5007F05D8CF -:100C800000F10050A0F50840006870470020704750 -:100C9000014BC058704700BF107AFF1F014B186806 -:100CA000704700BF002004E070B52A4B1C68C4F3F5 -:100CB0000B03240C63B140F21342934231D040F253 -:100CC000194293422FD040F2214293422DD1032367 -:100CD000214A0C2505FB03235D6893F9082042F2A5 -:100CE00001039C4224D0B4F5805F23D041F201037C -:100CF0009C4221D041F203039C421FD041F20703E2 -:100D00009C4208BF3122441E0C44013D0B46A342C5 -:100D10001ED215F9016F581C96B1034600F8016CFC -:100D2000F5E70123D4E70223D2E73F220B4DD6E7B4 -:100D30003322E3E74122E1E75A22E4E75922E2E7DE -:100D40002C2584421D7001D9981C5A70401A70BD20 -:100D50001846FBE7002004E0CC3B0008AC3B000851 -:100D6000124B5A8842F201018A4293B214D0B3F571 -:100D7000805F13D041F20102934211D041F203028D -:100D800093420FD041F2070293420DD10423084A47 -:100D900002EB8303D87870470023F8E70123F6E7D6 -:100DA0000223F4E70323F2E700207047002004E069 -:100DB000B83B0008022802BF024B4FF480529A61F0 -:100DC000704700BF00100240022802BF024B4FF0E4 -:100DD00080529A61704700BF00100240022801BF94 -:100DE000024A536983F480535361704700100240F4 -:100DF00010B50023934203D0CC5CC4540133F9E70F -:100E000010BD000030B5441E14F9010F0B4660B14F -:100E100093F90050854201F1010106D11AB993F905 -:100E20000020801A30BD013AEEE7002AF7D11046C3 -:100E300030BD000002460346981A13F9011B002931 -:100E4000FAD1704702440346934202D003F8011BD3 -:100E5000FAE77047024B1A78024B1A70704700BFCE -:100E60009825002000240020F8B5164C1648174D90 -:100E7000174E154F00F096FC2146134800F0BEFCBB -:100E800024681448626D936B23F40023936301F08C -:100E900041F92046104900F0BDFD626D936B43F4AB -:100EA000002393634FF4E1332B60002456F82400B1 -:100EB000B84202D0294600F0D3FB0134042CF5D10E -:100EC000F8BD00BFE43C00089433002084250020D6 -:100ED000FC3B000840420F00103D000838B50B4BAA -:100EE0001A780B4B53F822400A4B9C4205460CD013 -:100EF000094B002118461422FFF7A4FF05600146A4 -:100F00002046BDE8384000F0ABBB38BD9825002036 -:100F1000FC3B00089433002084250020FEE70000FD -:100F200000B59BB0EFF3098168226846FFF760FFC8 -:100F3000EFF30583034B9A6B9A6A9A6A9A6A9A6AE4 -:100F40009B6AFEE700ED00E000B59BB0EFF309817E -:100F500068226846FFF74CFFEFF30583044B9A6B5A -:100F60009A6A9A6A9A6A9A6A9A6A9B6AFEE700BFC4 -:100F700000ED00E000B59BB0EFF309816822684600 -:100F8000FFF736FFEFF30583034B5A6B9A6A9A6AB1 -:100F90009A6A9A6A9B6AFEE700ED00E030B5084D58 -:100FA0000A4491420BD011F8013B09245840013CFE -:100FB000F7D040F300032B4083EA5000F7E730BD41 -:100FC0002083B8ED002304491A465A50C818083344 -:100FD000802B4260F9D170479C250020026843684D -:100FE0001143016003B1184770470000024AD368FB -:100FF00043F0C003D360704700440040024AD36806 -:1010000043F0C003D360704700480040024AD368F1 -:1010100043F0C003D3607047007800402DE9F041F1 -:10102000D0F85C64F7683368DA0505469CB20DD5E4 -:10103000202383F311884FF400710430FFF7CEFFB3 -:101040006FF480733360002383F31188202383F3CC -:10105000118805F1040814F02F0333D183F31188AC -:10106000380615D5210613D5202383F3118805F101 -:10107000380000F053FA002846DA0821281DFFF74F -:10108000ADFF4FF67F733B40F360002383F311887D -:101090007A060ED563060CD5202383F31188EA6CFB -:1010A0002B6D9A4202D12B6C002B2FD1002383F39E -:1010B0001188D5F86424D368002B31D01069BDE8BD -:1010C000F0411847230713D014F0080F0CBF00217C -:1010D0008021E00748BF41F02001A20748BF41F04E -:1010E0004001630748BF41F480714046FFF776FF37 -:1010F000A406736805D595F860142846194000F0D9 -:10110000BDFA3468A4B2A6E77060BEE727F04007D6 -:101110003F041021281D3F0CFFF760FFF760C5E773 -:10112000BDE8F08108B50348FFF778FFBDE8084047 -:1011300001F07EBB1C26002008B50348FFF76EFFB8 -:10114000BDE8084001F074BB842A002008B50348BC -:10115000FFF764FFBDE8084001F06ABBEC2E0020F9 -:1011600010B50E4C0E4A2046002100F057FA0D4BE8 -:10117000C4F85C340C4C0D4A2046002100F04EFAB5 -:101180000B4BC4F85C340B4C0B4A0021204600F09A -:1011900045FA0A4BC4F85C3410BD00BF1C26002081 -:1011A000ED0F000800440040842A0020FD0F0008D5 -:1011B00000480040EC2E00200D1000080078004090 -:1011C00038B5394D037C002918BF0D46012B044664 -:1011D000C0F8645410D1354B984242D1344B1A6C4C -:1011E00042F400321A641A6E42F400321A661B6E20 -:1011F0000B21262000F06AF82E4BD4F85C249A428A -:101200002B6802D02C498A424BD12C4901EB530167 -:10121000B1FBF3F3A988080442BF23F0070003F0F1 -:10122000070343EA40039360EB8843F040039BB21B -:1012300013612B8943F001039BB2536141F40453C2 -:1012400043F02C03D36001F4A05100231360B1F5E7 -:10125000806F136853680CBF7F23FF2384F86034CA -:1012600038BD174B98420CD1114B1A6C42F48022B6 -:101270001A641A6E42F480221A661B6E0B21272014 -:10128000B8E7104B9842B7D1094B1A6C42F0804234 -:101290001A641A6E42F080421A661B6E0B215220AD -:1012A000A8E70949B2E700BF2C3C00081C26002033 -:1012B00000380240001001400014014000BD01054B -:1012C000842A0020EC2E002080DE800200F16043A2 -:1012D00000F01F02400903F5614309018000C9B213 -:1012E00000F1604083F8001300F561400123934052 -:1012F000C0F8803103607047F8B51546826806690A -:10130000AA420B46816938BF8568761AB542044601 -:1013100007D218462A46FFF76BFDA3692B44A36149 -:101320000DE011D932461846FFF762FDAF1B3A4671 -:10133000E1683044FFF75CFDE2683A44A261A368CB -:101340005B1BA3602846F8BD18462A46FFF750FDF0 -:10135000E368E4E783682DE9F041044693421546CB -:10136000266938BF85684069361AB5420F4606D2ED -:101370002A46FFF73DFD63692B4463610DE012D9F6 -:101380003246A5EB0608FFF733FD4246B919E0687F -:10139000FFF72EFDE26842446261A3685B1BA36015 -:1013A0002846BDE8F0812A46FFF722FDE368E4E71E -:1013B00010B50A440024C361029B00604060846051 -:1013C000C160816141610261036210BD08B582693B -:1013D0004369934201D1826882B982680132826096 -:1013E0005A1C42611970426903699A4201D3C36869 -:1013F0004361002100F0AAFE002008BD4FF0FF303D -:1014000008BD000070B5202304460E4683F3118802 -:10141000A568A5B1A368A269013BA360531CA361A1 -:1014200015782269934224BFE368A361E3690BB195 -:1014300020469847002383F31188284670BD314623 -:10144000204600F073FE0028E2DA85F3118870BDB3 -:101450002DE9F74F05460F4690469A46D0F81C9066 -:10146000202686F311884FF0000B144664B1224603 -:1014700039462846FFF740FF034668B951462846DB -:1014800000F054FE0028F1D0002383F31188A8EB6C -:10149000040003B0BDE8F08FB9F1000F03D0019054 -:1014A0002846C847019B8BF31188E41A1F4486F332 -:1014B0001188DBE7C16081614161C3611144009B18 -:1014C000006040608260016103627047F8B50446C5 -:1014D0000E461746202383F31188A568A5B1A3689B -:1014E000013BA36063695A1C62611E7023696269D3 -:1014F0009A4224BFE3686361E3690BB120469847D1 -:10150000002080F31188F8BD3946204600F00EFE19 -:101510000028E2DA85F31188F8BD0000836942698A -:101520009A4210B501D182687AB98268013282602C -:101530005A1C82611C7803699A4201D3C368836193 -:10154000002100F003FE204610BD4FF0FF3010BD1B -:101550002DE9F74F05460F4690469A46D0F81C9065 -:10156000202686F311884FF0000B144664B1224602 -:1015700039462846FFF7EEFE034668B9514628462D -:1015800000F0D4FD0028F1D0002383F31188A8EBEC -:10159000040003B0BDE8F08FB9F1000F03D0019053 -:1015A0002846C847019B8BF31188E41A1F4486F331 -:1015B0001188DBE7026843681143016003B11847F3 -:1015C000704700001430FFF743BF00004FF0FF33B7 -:1015D0001430FFF73DBF00003830FFF7B9BF0000FF -:1015E0004FF0FF333830FFF7B3BF00001430FFF780 -:1015F00009BF00004FF0FF311430FFF703BF0000B8 -:101600003830FFF763BF00004FF0FF323830FFF78C -:101610005DBF000000207047FFF7A2BD37B50F4B3C -:101620000360002343608360C360012304460374A6 -:10163000154600900B464FF4007200F15C01143027 -:10164000FFF7B6FE00942B464FF4007204F51771B5 -:1016500004F13800FFF72EFF03B030BD403C000816 -:1016600010B52023044683F31188FFF7A9FD022358 -:101670002374002383F3118810BD000038B5C369BB -:1016800004460D461BB904210844FFF793FF294681 -:1016900004F11400FFF79AFE002806DA201D4FF42B -:1016A0008061BDE83840FFF785BF38BD02684368F8 -:1016B0001143016003B118477047000013B5446B34 -:1016C000D4F894341A681178042915D1217C0229A0 -:1016D00012D11979128901238B4013420CD101A92F -:1016E00004F14C0001F05AFED4F89444019B217996 -:1016F0000246206800F0DAF902B010BD143001F0A3 -:10170000DDBD00004FF0FF33143001F0D7BD000005 -:101710004C3001F0AFBE00004FF0FF334C3001F011 -:10172000A9BE0000143001F0ABBD00004FF0FF3146 -:10173000143001F0A5BD00004C3001F07BBE00006C -:101740004FF0FF324C3001F075BE0000D0F8942409 -:1017500038B5136819780429054601D0012038BD31 -:10176000017C0229FAD112795C8901209040044061 -:10177000F4D105F1140001F03DFD02460028EDD042 -:10178000D5F894544FF480732868697900F07CF997 -:10179000204638BD406BFFF7D9BF000000207047DE -:1017A000704700007FB5124B0360002343608360E5 -:1017B000C360012502260F4B057404460290019375 -:1017C00000F18402294600964FF48073143001F032 -:1017D000EDFC094B0193029400964FF4807304F5DD -:1017E0002372294604F14C0001F0B4FD04B070BD31 -:1017F000683C000895170008BD1600080B682022F9 -:1018000082F311880A7903EB820290614A790932E6 -:1018100043F822008A7912B103EB82039861022314 -:101820000374C0F89414002383F3118870470000F8 -:1018300038B5037F044613B190F85430ABB9201D7E -:1018400001250221FFF732FF04F1140025776FF024 -:10185000010100F087FC84F8545004F14C006FF053 -:101860000101BDE8384000F07DBC38BD10B5012154 -:1018700004460430FFF71AFF0023237784F854301E -:1018800010BD000038B504460025143001F0A6FC58 -:1018900004F14C00257701F075FD201D84F85450AB -:1018A0000121FFF703FF2046BDE83840FFF74EBF98 -:1018B00090F8443003F06003202B19D190F84520B4 -:1018C000212A0AD0222A4FF000030ED0202A0FD15D -:1018D000084A82630722C26304E0064B836307233E -:1018E000C36300230364012070478363C363F9E784 -:1018F0000020704701240020D0F8943437B51A68CE -:101900001178042904461AD1017C022917D11979CA -:10191000128901238B40134211D100F14C05284656 -:1019200001F0F0FD58B101A9284601F037FDD4F8C7 -:101930009444019B21790246206800F0B7F803B077 -:1019400030BD000000EB8103F7B59C6905460E46EB -:10195000F4B1202383F3118805EB8607201D0821AD -:10196000FFF7A4FEFB685B691B684C3413B120468B -:1019700001F022FD01A9204601F010FD024648B108 -:10198000019B3146284600F091F8002383F311882B -:1019900003B0F0BDFB685A691268002AF5D01B8AB3 -:1019A000013B1340F1D105F14402EAE7093138B5B2 -:1019B00050F82140DCB1202383F31188D4F894241B -:1019C0001368527903EB8203DB689B695D6845B15C -:1019D00004216018FFF76AFE294604F1140001F0A3 -:1019E00013FC2046FFF7B2FE002383F3118838BDB5 -:1019F0007047000000F0D4BF012303700023436050 -:101A0000C36183620362C3624362036303814381F0 -:101A10007047000038B50446202383F31188002561 -:101A20004160C56005614561856100F0C9FF022321 -:101A3000237085F3118838BD70B500EB810305462E -:101A40005069DA600E46144618B110220021FFF7E3 -:101A5000F9F9A06918B110220021FFF7F3F9314616 -:101A60002846BDE8704001F075B80000028902F018 -:101A700001020281428902F00102428100220261D8 -:101A80004261826101F0FAB8F0B400EB8104478949 -:101A9000E4680125A4698D403D434581236000230E -:101AA000A2606360F0BC01F015B90000F0B400EB77 -:101AB00081040789E468012564698D403D430581FF -:101AC00023600023A2606360F0BC01F08FB90000C6 -:101AD00070B50223002504460370A0F84C5080F82E -:101AE0004E5080F84F5005814581C56005614561C4 -:101AF000856180F8345000F0C9FF63681B6823B12A -:101B000029462046BDE87040184770BD43680278FA -:101B10001B6880F85020052202700BB10421184781 -:101B200070470000436890F850201B6802700BB1AA -:101B3000052118477047000090F8343070B504460E -:101B400013B1002380F8343004F14402204601F040 -:101B5000B7F863689B6863BB94F8445015F060065F -:101B600015D194F8453005F07F0545EA032540F28C -:101B700002339D4200F00E815BD8022D00F0DC8024 -:101B80003FD8002D00F08780012D00F0CF8000218C -:101B9000204601F0EDFA0021204601F0DFFA6368EB -:101BA0001B6813B1062120469847062384F8343079 -:101BB00070BD204698470028CED094F84B2094F86A -:101BC0004A3043EA0223E26B934238BFE36394F95D -:101BD0004430E56B002B4FF0200380F2FD80002D98 -:101BE00000F0EC80092284F8342083F3118800216E -:101BF000E36BA26B2046FFF759FF002383F31188A4 -:101C000070BDB5F5817F00F0B180B5F5407F49D05A -:101C1000B5F5807FBBD194F84630012BB7D1B4F82D -:101C20004C3023F00203A4F84C30A663E66326642C -:101C3000C3E740F201639D421ED8B5F5C06F3BD2A9 -:101C4000B5F5A06FA3D1B4F84430B3F5A06F0ED1B1 -:101C500094F8463084F84E30204600F06FFF6368F9 -:101C60001B6813B1012120469847032323700023EA -:101C7000A363E3632364A0E7B5F5106F32D040F6A9 -:101C800002439D4252D0B5F5006F80D104F14F035D -:101C9000A363012324E004F14C03A3630223E36361 -:101CA00025648AE794F84630012B7FF470AFB4F8CE -:101CB0004C3043F00203B6E794F84920616894F889 -:101CC00048304D6894F8471043EA0223204694F8C0 -:101CD0004620A84700283FF45AAF4368A36303682F -:101CE000E363A4E72378042B10D1202383F3118826 -:101CF0002046FFF7BBFE86F31188636884F84F60C7 -:101D00001B68032121700BB12046984794F8463098 -:101D1000002BACD084F84F300423237063681B6819 -:101D2000002BA4D0022120469847A0E7374BA3639D -:101D30000223E36300239DE794F8481011F0800F1D -:101D4000204601F00F010ED000F0ACFF012806D0B4 -:101D500002287FF41CAF2E4BA363E06367E72D4B93 -:101D6000A363E56363E700F08FFFEFE794F8463085 -:101D7000002B7FF40CAF94F8483013F00F013FF4C0 -:101D800076AF1A06204602D501F006FA6FE701F099 -:101D9000F9F96CE794F84630002B7FF4F8AE94F82C -:101DA000483013F00F013FF462AF1B06204602D506 -:101DB00001F0DEF95BE701F0D1F958E7142284F86D -:101DC000342083F311882B462A4629462046FFF704 -:101DD0005BFE85F3118870BD5DB1152284F8342057 -:101DE00083F311880021E36BA26B2046FFF74CFEC2 -:101DF00003E70B2284F8342083F311882B462A460C -:101E000029462046FFF752FEE3E700BF983C000852 -:101E1000903C0008943C000838B590F834300446F3 -:101E2000152B29D8DFE803F03E28282828283E284B -:101E3000280B293928282828282828283E3E90F8C9 -:101E40004B1090F84A20C36B42EA01229A4214D9FF -:101E5000C268128AB3FBF2F502FB15356DB9202377 -:101E600083F311882B462A462946FFF71FFE85F388 -:101E700011880A2384F8343038BD142384F83430B0 -:101E8000202383F3118800231A4619462046FFF7C2 -:101E9000FBFD002383F3118838BD036C03B1984721 -:101EA0000023E7E7002101F063F90021204601F05B -:101EB00055F963681B6813B106212046984706232D -:101EC000D8E7000090F83420152A38B5044622D807 -:101ED0000123934040F6416213421DD113F4801553 -:101EE0000FD19B0217D50B2380F83430202383F3C6 -:101EF00011882B462A462946FFF7D8FD85F311881D -:101F000038BDC3689B695B682BB9036C03B1984704 -:101F1000002384F8343038BD002101F029F9002174 -:101F2000204601F01BF963681B6813B106212046A7 -:101F300098470623EDE70000024B00221B605B6020 -:101F40009A60704754330020002303748268054B65 -:101F50001B6899689142FBD25A6803604260106026 -:101F6000586070475433002008B5202383F311884C -:101F7000037C032B05D0042B0DD02BB983F31188E0 -:101F800008BD436900221A604FF0FF334361FFF739 -:101F9000DBFF0023F2E790E80C001A600268536050 -:101FA000F2E70000002303748268054B1B68996800 -:101FB0009142FBD85A6803604260106058607047D5 -:101FC00054330020054B19690874186802681A60B8 -:101FD0005360186101230374FEF796B9543300204F -:101FE00030B54B1C87B005460A4C10D023690A4A0D -:101FF00001A800F0D3F82846FFF7E4FF049B13B1D3 -:1020000001A800F007F92369586907B030BDFFF750 -:10201000D9FFF8E754330020691F000838B50C4D8C -:1020200041612B6981689A689142044603D8BDE8F2 -:102030003840FFF789BF1846FFF786FF01232C6160 -:10204000014623742046BDE83840FEF75DB900BF65 -:1020500054330020044B1A681B6990689B689842AF -:1020600094BF0020012070475433002010B5084C65 -:10207000236820691A6822605460012223611A745F -:10208000FFF790FF01462069BDE81040FEF73CB91C -:10209000543300208260022202740022427470478E -:1020A0008368A3F17C0243F80C2C026943F83C2CB2 -:1020B000426943F8382C074A43F81C2CC26843F89D -:1020C000102C022203F8082C002203F8072CA3F19D -:1020D000180070472103000810B5202383F31188EE -:1020E000FFF7DEFF00210446FFF798FF002383F38C -:1020F0001188204610BD0000024B1B6958610F205B -:10210000FFF760BF54330020202383F31188FFF7CB -:10211000F3BF000008B50146202383F3118808208F -:10212000FFF75EFF002383F3118808BD49B1064B1A -:1021300042681B6918605A60136043600420FFF70F -:102140004FBF4FF0FF307047543300200368984270 -:1021500006D01A680260506059611846FFF7F4BE55 -:102160007047000038B504460D462068844200D10F -:1021700038BD036823605C604561FFF7E5FEF4E766 -:10218000054B03F114025A619A614FF0FF32DA6194 -:1021900000221A62704700BF54330020F8B5036173 -:1021A0001A4BC2605C6A1A4B1A46022952F8145F35 -:1021B00038BF0221954206461F460AD158619861F0 -:1021C0001C620560456081600819BDE8F84001F0B7 -:1021D000BBB9186AAB68241A0C1902D3E41A2D682B -:1021E00004E09C4202D2204401F0BEF9AB689C425C -:1021F000F4D86B68736035601E606E60B460A96867 -:102200004FF0FF33091BA960FB61F8BD000C0040D3 -:102210005433002010B41A4C234653F8141F814243 -:1022200010D0416802680A60026851609A424FF01B -:102230000001C16003D0936881680B4493605DF82E -:10224000044B70470A68626100209A425360C8607C -:1022500003D15DF8044B01F081B9936888680344A9 -:102260009360084A206A526A121A9342E7D9991A6F -:10227000012998BF931C18445DF8044B01F074B910 -:1022800054330020000C004000207047FEE700009F -:10229000704700004FF0FF3070470000022906D061 -:1022A000032906D00129064818BF002070470548B9 -:1022B0007047032A9ABF044800EBC2000020704711 -:1022C0006C3D0008203D00080824002070B59AB03D -:1022D00001AD064608462946144600F095F8284602 -:1022E000FEF7A8FDC0B2431C5B0086E8180023700F -:1022F00003236370002302341946DAB2904204F1DA -:10230000020401D81AB070BDEA5C04F8022C04F88B -:10231000011C0133F1E7000008B5202383F3118885 -:102320000348FFF7E9FA002383F3118808BD00BFD3 -:102330009433002010B50446052916D8DFE801F0D3 -:1023400016150316161D202383F311880E4A01214A -:10235000FFF772FB20460D4A0221FFF76DFB0C4888 -:10236000FFF790FA002383F3118810BD202383F335 -:1023700011880748FFF75CFAF4E7202383F31188FC -:102380000348FFF773FAEDE79C3C0008C03C0008E7 -:102390009433002038B50C4D0C4C0D492A4604F1FD -:1023A0000800FFF793FF05F1CA0204F11000094984 -:1023B000FFF78CFF05F5CA7204F118000649BDE865 -:1023C0003840FFF783BF00BF5C380020082400209E -:1023D000EC3C0008F93C0008063D000870B50446D6 -:1023E00008460D46FEF726FDC6B2204601340378A6 -:1023F0000BB9184670BD32462946FEF703FD00288A -:10240000F3D1012070BD00002DE9F04704460D46D0 -:10241000FEF710FD2C49C6B22046FFF7DFFF08B1DA -:102420000736F6B229492046FFF7D8FF08B1103623 -:10243000F6B2632E0BD8DFF89080DFF89090244F2F -:10244000DFF898A0267846B92E70BDE8F0872146BF -:102450002846BDE8F04701F09DBB252E2FD107226D -:1024600041462046FEF7CEFC70B91A4B2A4603F1CE -:102470000C0153F8040B42F8040B8B42F9D11B8872 -:10248000138007340E35DDE7082249462046FEF763 -:10249000B9FCA0B9104BAA1C13F8011F0909534538 -:1024A000C95D02F8021C197801F00F0102F1020265 -:1024B000C95D02F8031CEFD118350834C2E72E704D -:1024C00001340135BEE700BF8C3D0008063D000821 -:1024D000A33D0008943D00080F7AFF1F1B7AFF1FE1 -:1024E000BFF34F8F024AD368DB03FCD4704700BFB1 -:1024F000003C024008B5094B1B7873B9FFF7F0FFA9 -:10250000074B1A69002ABFBF064A5A6002F1883297 -:102510005A601A6822F480621A6008BDBA3A002034 -:10252000003C02402301674508B50B4B1B7893B96B -:10253000FFF7D6FF094B1A6942F000421A611A6888 -:1025400042F480521A601A6822F480521A601A68A3 -:1025500042F480621A6008BDBA3A0020003C024092 -:10256000172870B513D80B4A0B4C137863B90B4E70 -:102570004FF0006144F8231056F823500133182B14 -:102580002944F7D10123137054F8200070BD0020B6 -:1025900070BD00BF1C3B0020BC3A0020B43D0008C9 -:1025A000014B53F820007047B43D000818207047D5 -:1025B000172810B5044601D9002010BDFFF7D0FF41 -:1025C000064B53F824301844C21A0BB9012010BD31 -:1025D00012680132F0D1043BF6E700BFB43D0008B9 -:1025E000172810B5044629D8FFF77AFFFFF782FFB6 -:1025F0001349F323CB600C23B0FBF3F203FB12006F -:10260000D30143EAC003DBB243F4007343F0020397 -:102610000B610B6943F480330B61FFF761FF2046C8 -:10262000FFF79EFF074B53F8241000F0DDF8FFF78B -:102630007BFF2046BDE81040FFF7BABF002010BD69 -:10264000003C0240B43D00082DE9F84312F00103BC -:10265000154640D18218B2F1026F3CD22C4B1B6858 -:1026600013F0010337D02B4CFFF744FFF323E36053 -:10267000FFF736FF40F20127032D01D9830713D05E -:10268000244C0F46401A40F20118EB1B0B44012B5F -:1026900000EB0706236924D823F001032361FFF729 -:1026A00043FF0120BDE8F883236923F440732361CD -:1026B00023693B43236151F8046B0660BFF34F8FDE -:1026C000FFF70EFF03689E4208D0236923F0010341 -:1026D0002361FFF729FF0020BDE8F883043D0430A3 -:1026E000CAE723F440732361236943EA08032361A3 -:1026F000B94637F8023B3380BFF34F8FFFF7F0FE48 -:102700003688B9F80030B6B2B342BED0DDE700BFBC -:1027100000380240003C0240084908B50B7828B157 -:1027200053B9FFF7E7FE01230B7008BD23B1BDE8E5 -:1027300008400870FFF7F8BE08BD00BFBA3A002095 -:1027400010B50244064B0439D2B2904200D110BDFC -:10275000441C00B253F8200041F8040FE0B2F4E743 -:1027600050280040104B30B51C6F240407D41C6F58 -:1027700044F400741C671C6F44F400441C670B4C49 -:10278000236843F4807323600244094B0439D2B2B6 -:10279000904200D130BD441C00B251F8045F43F8B0 -:1027A0002050E0B2F4E700BF003802400070004063 -:1027B0005028004007B5012201A90020FFF7C0FF03 -:1027C000019803B05DF804FB13B50446FFF7F2FF70 -:1027D000A04206D002A9012241F8044D0020FFF7D3 -:1027E000C1FF02B010BD000070470000034B1B6822 -:1027F0009B0042BF024B01221A707047743802409E -:102800001D3B0020014B1878704700BF1D3B002086 -:10281000064A536823F001035360EFF309836833DA -:1028200083F30988002383F31188704730EF00E0B9 -:1028300010B5202383F31188104B5B6813F40063F9 -:1028400018D0F1EE103AEFF309844FF0807344F89A -:102850004C3C0B4BDB6844F8083CA4F1680383F361 -:102860000988FFF7F7FB18B1064B44F8503C10BD40 -:10287000054BFAE783F3118810BD00BF00ED00E0BF -:1028800030EF00E031030008340300087047000017 -:10289000FEE70000084A094B09498B4204D3094A64 -:1028A0000021934205D3704752F8040F43F8040BFC -:1028B000F3E743F8041BF4E78C3F0008903D002049 -:1028C000903D0020903D0020836D30B500229D6832 -:1028D000446D11464FF0FF3004EB42130132954234 -:1028E000C3F80019C3F81019C3F80809C3F8001B8E -:1028F000C3F8101BC3F8080BEED24FF00113C4F855 -:102900001C3830BD890141F02001016103699B063B -:10291000FCD4122000F0B4BE204B03EB80022DE962 -:10292000F047D2F80CE05D6DDEF81420461CD2F8BA -:1029300000C005EB063605EB4018516861450BD326 -:10294000D5F83428012303FA00F022EA0000C5F884 -:1029500034081846BDE8F087BEF81040ACEB010320 -:10296000A34228BF2346D8F81849A4B2B3EB840F7A -:1029700010D894681F46A4F1040959F804AFC6F8AA -:1029800000A0042F01D9043FF7E71C440B449460D6 -:102990005360D2E70020BDE8F08700BF203B002055 -:1029A00010B5054C2046FFF727F84FF0A0436365AC -:1029B000024BA36510BD00BF203B0020383E00083D -:1029C0000378012B70B5054650D12A4B446D9842CF -:1029D0001BD1294B5A6B42F080025A635A6D42F068 -:1029E00080025A655A6D5A6942F080025A615A69EA -:1029F00022F080025A610E2143205B69FEF766FCDB -:102A00001E4BE3601E4BC4F800380023C4F8003EA0 -:102A1000C02323606E6D4FF45023A3633369002BF2 -:102A2000FCDA012333610C2000F02AFE3369DB0756 -:102A3000FCD4122000F024FE3369002BFCDA0026BF -:102A4000A6602846FFF740FF6B68C4F81068DB6893 -:102A5000C4F81468C4F81C684BB90A4BA3614FF062 -:102A6000FF336361A36843F00103A36070BD064BAD -:102A7000F4E700BF203B0020003802404014004033 -:102A800003002002003C30C0083C30C0F8B5446D63 -:102A9000054600212046FFF735FFA96D00234FF0C2 -:102AA00001128F68C4F834384FF00066C4F81C284F -:102AB0004FF0FF3004EB431201339F42C2F800692C -:102AC000C2F8006BC2F80809C2F8080BF2D20B6812 -:102AD0006A6DEB65636210231361166916F01006C8 -:102AE000FBD1122000F0CCFDD4F8003823F4FE63B3 -:102AF000C4F80038A36943F4402343F01003A361F2 -:102B00000923C4F81038C4F814380A4BEB604FF0AE -:102B1000C043C4F8103B084BC4F8003BC4F810692C -:102B2000C4F80039EB6D03F1100243F48013EA6539 -:102B3000A362F8BD143E000840800010426D90F87A -:102B40004E10D2F8003823F4FE6343EA0113C2F8B2 -:102B5000003870472DE9F0410EB200EB86080D46B3 -:102B6000D8F80C100F6807F00303022B50D0032B8A -:102B700050D03D4A3D4F012B18BF1746446D4FEAD8 -:102B8000451E04EB0E030022C3F8102B8A6905F1E1 -:102B9000100C002A40D04A8A05F158035B013A43E1 -:102BA000E2500123D4F81C2803FA0CF31343A64483 -:102BB0004A69C4F81C380023CEF8103905F13F03E8 -:102BC000002A39D00A8A898B9208012988BF4A4392 -:102BD000C16D04EB8303561841EA0242C6652946DB -:102BE0005A602046FFF78EFED8F80C301B8A43EA65 -:102BF00085531F4305F148035B01E7500123D4F8D7 -:102C00001C2803FA05F51543C4F81C58BDE8F081EB -:102C1000174FB3E7174FB1E704EB4613D3F8002B78 -:102C200022F40042C3F8002BD4F81C28012303FA35 -:102C30000CF322EA0303BAE704EB83030E4A5A605B -:102C400004EB461629462046FFF75CFED6F800390D -:102C500023F40043C6F80039D4F81C38012202FAE4 -:102C600005F523EA0505CFE7008000100080041079 -:102C70000080081000800C1000040002826D1268B1 -:102C8000C265FFF721BE00005831436D49015B5812 -:102C900013F4004004D013F4001F14BF01200220DD -:102CA000704700004831436D49015B5813F4004000 -:102CB00004D013F4001F14BF01200220704700004D -:102CC00000EB8101CB68196A0B6813604B68536095 -:102CD0007047000000EB810330B5DD68AA69136816 -:102CE000D36019B9402B84BF402313606B8A1468EA -:102CF000426D1C44013CB4FBF3F46343033323F003 -:102D0000030302EB411043EAC44343F0C043C0F85D -:102D1000103B2B6803F00303012B09B20ED1D2F84C -:102D2000083802EB411013F4807FD0F8003B14BF49 -:102D300043F0805343F00053C0F8003B02EB4112D4 -:102D4000D2F8003B43F00443C2F8003B30BD000022 -:102D50002DE9F041244D6E6D06EB40130446D3F887 -:102D6000087BC3F8087B38070AD5D6F8143819074A -:102D700006D505EB84032146DB6828465B68984747 -:102D8000FA072FD5D6F81438DB072BD505EB8403CB -:102D9000D968CCB98B69488A5E68B6FBF0F200FB53 -:102DA00012628AB91868DA6890420DD2121A83E862 -:102DB0001400202383F311880B482146FFF78AFF74 -:102DC00084F31188BDE8F081012303FA04F26B89D2 -:102DD00023EA02036B81CB6823B121460248BDE898 -:102DE000F0411847BDE8F081203B002000EB810353 -:102DF00070B5DD68436D6C692668E6604A0156BBB4 -:102E00001A444FF40020C2F810092A6802F00302A5 -:102E1000012A0AB20ED1D3F8080803EB421410F4C9 -:102E2000807FD4F8000914BF40F0805040F000507B -:102E3000C4F8000903EB4212D2F8000940F0044044 -:102E4000C2F80009D3F83408012202FA01F1014363 -:102E5000C3F8341870BD19B9402E84BF40202060DB -:102E600020682E8A841940F00050013C1A44B4FBBB -:102E7000F6F440EAC440C6E7F8B504461E48456D7E -:102E800005EB4413D3F80869C3F80869F10717D5AF -:102E9000D5F81038DA0713D500EB8403D9684B69ED -:102EA0001F68DA68974218D2D21B00271A605F6049 -:102EB000202383F311882146FFF798FF87F31188B9 -:102EC000330617D5D5F834280123A340134211D077 -:102ED0002046BDE8F840FFF71FBD012303FA04F2C6 -:102EE000038923EA020303818B68002BE8D0214683 -:102EF0009847E5E7F8BD00BF203B002096482DE944 -:102F0000F84F456D6E69AB691E4016F4805F6E61C7 -:102F1000044605D0FEF7DCFDBDE8F84FFFF788BC9E -:102F2000002E12DAD5F8003E8B489B071EBFD5F85D -:102F3000003E23F00303C5F8003ED5F8043823F023 -:102F40000103C5F80438FEF7EDFD370502D58248C8 -:102F5000FEF7DCFDB0040CD5D5F8083813F0060FE9 -:102F6000EB6823F470530CBF43F4105343F4A053A5 -:102F7000EB60310704D56368DB680BB1764898478E -:102F8000F2025AD4B3020CD5D4F85480DFF8C8A1A9 -:102F900000274FF00109A36D9B68F9B28B4280F0C6 -:102FA0008780F70619D5616D0A6AC2F30A1702F025 -:102FB0000F0302F4F012B2F5802F00F0A180B2F5F9 -:102FC000402F0AD104EB830301F58051DB68186AB6 -:102FD00000231A469F4240F087803003D5F81848F6 -:102FE00013D5E10302D50020FFF7B2FEA20302D5FC -:102FF0000120FFF7ADFE630302D50220FFF7A8FE14 -:10300000270302D50320FFF7A3FE750384D5E0074D -:1030100002D50020FFF730FFA10702D50120FFF7FE -:103020002BFF620702D50220FFF726FF23077FF55B -:1030300073AF0320FFF720FF6EE7D4F85480DFF86A -:1030400018A100274FF00109A36D9B685FFA87FB69 -:103050005B4597D308EB4B13D3F8002902F44022C9 -:10306000B2F5802F22D1D3F80029002A1EDAD3F836 -:10307000002942F09042C3F80029D3F80029002A21 -:10308000FBDB5946606DFFF73DFC228909FA0BF323 -:1030900022EA0303238104EB8B03DB689B6813B1F3 -:1030A0005946504698475846FFF736FC0137CBE75C -:1030B00008EB4112D2F8003B03F44023B3F5802F14 -:1030C00010D1D2F8003B002B0CDA628909FA01F327 -:1030D00022EA0303638104EB8103DB68DB680BB145 -:1030E00050469847013756E79C0708BF0A68072BE8 -:1030F00098BF027003F101039CBF120A013069E717 -:10310000023304EB830201F5805152689069026832 -:10311000D0F808C04068A2EB000E0022104697428B -:103120000AD104EB830463689B699A683A449A6005 -:103130005A6817445F6050E712F0030F08BF086831 -:10314000964588BF8CF8000002F1010284BF000A96 -:103150000CF1010CE3E700BF203B0020436D03EBC3 -:103160004111D1F8003B43F40013C1F8003B704714 -:10317000436D03EB4111D1F8003943F40013C1F85A -:1031800000397047436D03EB4111D1F8003B23F444 -:103190000013C1F8003B7047436D03EB4111D1F8B8 -:1031A000003923F40013C1F80039704730B5039C8F -:1031B0000172043304FB0325C361049B03630021F4 -:1031C000059B00604060C1604261026185610462EC -:1031D00042628162C162436330BD00000022416AE5 -:1031E00041610161C2608262C2626FF00101FEF75B -:1031F000B9BF000003694269934203D1C2680AB1B2 -:1032000000207047181D704703691960C2680132B9 -:10321000C260C269134482690361934224BF436A56 -:1032200003610021FEF792BF38B504460D46E368FE -:103230003BB16269131D1268A3621344E36200206C -:1032400038BD237A33B929462046FEF76FFF0028A0 -:10325000EDDA38BD6FF00100FBE70000C368C2691A -:10326000013BC3604369134482694361934224BFB5 -:10327000436A436100238362036B03B118477047BD -:1032800070B52023044683F31188866A3EB9FFF7A0 -:10329000CBFF054618B186F31188284670BDA36A96 -:1032A000E26A13F8015BA362934202D32046FFF760 -:1032B000D5FF002383F31188EFE700002DE9F84FD5 -:1032C00004460E4690469946202787F3118800252C -:1032D000AA46D4F828B0BBF1000F09D149462046D0 -:1032E000FFF7A2FF20B18BF311882846BDE8F88FC5 -:1032F000A16AE36AA8EB050B5B1A9B4528BF9B46B6 -:10330000BBF1400F1BD9334601F1400251F8040BC9 -:1033100043F8040B9142F9D1A36A40334036A362CB -:103320004035A26AE36A9A4202D32046FFF796FF2D -:103330008AF311884545D8D287F31188C9E730460A -:103340005A46FDF755FDA36A5B445E44A3625D44A3 -:10335000E7E7000010B5029C0172043303FB04216F -:10336000C36100238362C362039B0363049B006009 -:103370004060C460426102618161046242624363F1 -:1033800010BD0000026AC260426A4261026100220E -:103390008262C2626FF00101FEF7E4BE4369026916 -:1033A0009A4203D1C2680AB100207047184650F80B -:1033B000043B0B6070470000C368C2690133C360FF -:1033C0004369134482694361934224BF436A436162 -:1033D0000021FEF7BBBE000038B504460D46E36889 -:1033E0003BB123691A1DA262E2691344E362002023 -:1033F00038BD237A33B929462046FEF797FE0028C8 -:10340000EDDA38BD6FF00100FBE7000003691960D9 -:10341000C268013AC260C26913448269036193427F -:1034200024BF436A036100238362036B03B118471F -:103430007047000070B5202304460E4683F31188C0 -:10344000856A35B91146FFF7C7FF10B185F31188BA -:1034500070BDA36A1E70A36AE26A01339342A3623D -:1034600004D3E16920460439FFF7D0FF002080F340 -:10347000118870BD2DE9F84F04460D4691469A46D5 -:103480004FF0200888F311880026B346A76A4FB989 -:1034900051462046FFF7A0FF20B187F31188304640 -:1034A000BDE8F88FA06AE76AA9EB06033F1A9F42BE -:1034B00028BF1F46402F1BD905F1400355F8042BA8 -:1034C00040F8042B9D42F9D1A36A4033A3624036F1 -:1034D000A26AE36A9A4204D3E16920460439FFF7FD -:1034E00095FF8BF311884E45D9D288F31188CDE72B -:1034F00029463A46FDF77CFCA36A3B443D44A3625F -:103500003E44E5E7026943699A4203D1C3681BB9A7 -:10351000184670470023FBE7836A002BF8D0043B72 -:103520009B1AF5D01360C368013BC360C3691A449A -:10353000836902619A4224BF436A03610023836264 -:103540000123E5E700F034B9034B002258631A6108 -:103550000222DA60704700BF000C0040014B0022DD -:10356000DA607047000C0040014B5863704700BFA1 -:10357000000C0040FEE7000010B5174CFEF7DCFC25 -:10358000FEF7FEFD802215492046FEF783FD01234C -:1035900044F8180C0374124B124AD96821F4E06104 -:1035A0000904090C0A431049DA60CA6842F08072C3 -:1035B000CA600E490A6842F001020A601022DA77F6 -:1035C000202283F82220002383F3118862B6084862 -:1035D000BDE81040FEF780BD7C330020443E00086B -:1035E00000ED00E00003FA05F0ED00E0001000E05F -:1035F0004C3E00082DE9F84F1F4CDFF880906569BC -:1036000004F114074FF00008D9F82430266AAA689C -:103610009E1B96421DD34FF0200AAA68236AD5F854 -:103620000CB0134423622B68BB425F60A6EB02061A -:103630006361C5F80C8001D1FFF790FF88F3118812 -:103640002869D8478AF311886569AB689E42E4D23D -:10365000DAE76269BA420CD0916823628E1B9660E9 -:10366000A86802282CBF1818981CBDE8F84FFFF76F -:103670007BBFBDE8F88F00BF54330020000C004032 -:10368000034B59685A68521A9042FBD8704700BFE2 -:10369000001000E04B6843608B688360CB68C360B8 -:1036A0000B6943614B6903628B6943620B6803607A -:1036B0007047000008B5224B22481A6940F2FF11FA -:1036C0000A431A611A6922F4FF7222F001021A6198 -:1036D0001A691A6B0A431A631A6D0A431A651A4A61 -:1036E0001B6D1146FFF7D6FF184802F11C01FFF7CA -:1036F000D1FF174802F13801FFF7CCFF154802F15E -:103700005401FFF7C7FF144802F17001FFF7C2FF31 -:10371000124802F18C01FFF7BDFF114802F1A80128 -:10372000FFF7B8FF0F4802F1C401FFF7B3FF0E48DF -:1037300002F1E001FFF7AEFFBDE8084000F0A4B8D9 -:1037400000380240000002406C3E000800040240C5 -:1037500000080240000C0240001002400014024029 -:1037600000180240001C02400020024008B500F092 -:10377000FFF9FFF701FFFFF739F8BDE80840FEF752 -:1037800009BE000070470000084B1A69920710B587 -:1037900008D500241C61202383F31188FFF72AFF3A -:1037A00084F31188BDE81040FFF742B8000C0040D8 -:1037B000104B1A6C42F008021A641A6E42F00802AA -:1037C0001A660D4A1B6E936843F0080393600B4B17 -:1037D00053229A624FF0FF32DA6200229A615A63F2 -:1037E000DA605A6001225A6108211A603220FDF71E -:1037F0006DBD00BF00380240002004E0000C004016 -:103800001F4B1A696FEAC2526FEAD2521A611A69E3 -:10381000C2F308021A614FF0FF301A695A69586101 -:1038200000215A6959615A691A6A62F080521A6213 -:103830001A6A02F080521A621A6A5A6A58625A6AFE -:1038400059625A6A1A6C42F080521A641A6E42F037 -:1038500080521A661A6E0B4A106840F4807010602D -:10386000186F00F44070B0F5007F1EBF4FF4803039 -:1038700018671967536823F40073536000F058B950 -:103880000038024000700040324B4FF080521A6402 -:10389000314A4FF4404111601A6842F001021A6047 -:1038A0001A689207FCD59A6822F003029A60294BA5 -:1038B00019469A6812F00C02FBD1186800F0F90062 -:1038C00018609A601A6842F480321A600B689B0391 -:1038D000FCD54B6F43F001034B671E4B5A6F9007AB -:1038E000FCD51E4A5A601A6842F080721A601A4A61 -:1038F00053685904FCD5174B1A689201FCD5184A35 -:103900009A600322C3F88C20164B1A68164B9A4211 -:10391000164B1BD1164A1168164A914216D140F235 -:1039200005121A600B4B9A6842F002029A609A687C -:1039300002F00C02082AFAD15A6C42F480425A640E -:103940005A6E42F480425A665B6E704740F20572CE -:10395000E7E700BF003802400070004018544007FD -:1039600000948838002004E011640020003C0240EC -:1039700000ED00E041C20F41084A08B553691168E3 -:103980000B4003F00103536123B1054A13680BB1E7 -:1039900050689847BDE80840FEF74ABF003C014028 -:1039A0009C250020084A08B5536911680B4003F0B4 -:1039B0000203536123B1054A93680BB1D06898475D -:1039C000BDE80840FEF734BF003C01409C250020C4 -:1039D000084A08B5536911680B4003F004035361AA -:1039E00023B1054A13690BB150699847BDE80840F7 -:1039F000FEF71EBF003C01409C250020084A08B588 -:103A0000536911680B4003F00803536123B1054A61 -:103A100093690BB1D0699847BDE80840FEF708BF2D -:103A2000003C01409C250020084A08B553691168F4 -:103A30000B4003F01003536123B1054A136A0BB125 -:103A4000506A9847BDE80840FEF7F2BE003C0140CE -:103A50009C250020174B10B55C691A68144004F4CB -:103A600078725A61A30604D5134A936A0BB1D06ADF -:103A70009847600604D5104A136B0BB1506B9847FA -:103A8000210604D50C4A936B0BB1D06B9847E20525 -:103A900004D5094A136C0BB1506C9847A30504D5A3 -:103AA000054A936C0BB1D06C9847BDE81040FEF707 -:103AB000BFBE00BF003C01409C2500201A4B10B542 -:103AC0005C691A68144004F47C425A61620504D5AA -:103AD000164A136D0BB1506D9847230504D5134A50 -:103AE000936D0BB1D06D9847E00404D50F4A136E67 -:103AF0000BB1506E9847A10404D50C4A936E0BB1DC -:103B0000D06E9847620404D5084A136F0BB1506F0A -:103B10009847230404D5054A936F0BB1D06F98479B -:103B2000BDE81040FEF784BE003C01409C2500200B -:103B3000062108B50846FDF7C9FB06210720FDF759 -:103B4000C5FB06210820FDF7C1FB06210920FDF772 -:103B5000BDFB06210A20FDF7B9FB06211720FDF762 -:103B6000B5FB06212820BDE80840FDF7AFBB0000EB -:103B700008B5FFF745FEFDF725FAFDF74DFDFDF70A -:103B800039FFFDF70DFEFFF7FDFDBDE80840FFF72B -:103B9000D9BC0000034611F8012B03F8012B002AC1 -:103BA000F9D17047121012131211000053544D3303 -:103BB00032463F3F3F00000001203300001041012A -:103BC00001105A01031059010710310100000000D3 -:103BD000AC3B00083F000000130400000C3C000850 -:103BE0003F00000019040000163C00083F000000E0 -:103BF00021040000203C00083F0000009433002016 -:103C00001C260020842A0020EC2E002053544D3323 -:103C100032463430780053544D33324634327800D3 -:103C200053544D3332463434365858000096000011 -:103C30000000000000000000000000000000000084 -:103C400000000000E1150008CD1500080916000865 -:103C5000F515000801160008ED150008D915000833 -:103C6000C515000815160008000000001917000807 -:103C700005170008411700082D170008391700081C -:103C80002517000811170008FD1600089D170008E9 -:103C90000000000001000000000000000200000021 -:103CA0000000000045190008AD1900084000400060 -:103CB0002C3800203C3800200200000000000000EA -:103CC0000300000000000000F119000800000000DF -:103CD000100000004C38002000000000010000002F -:103CE00000000000203B0020010102004865782F01 -:103CF00050726F6669434E430043756265426C6162 -:103D0000636B2D424C002553455249414C25000020 -:103D1000352300089D220008B11800081923000867 -:103D200043000000283D000809024300020100C0D2 -:103D300032090400000102020100052400100105FF -:103D40002401000104240202052406000107058263 -:103D5000030800FF09040100020A00000007050132 -:103D60000240000007058102400000001200000030 -:103D7000743D00081201100102000040AE2D011038 -:103D800000020102030100000403090425424F411F -:103D90005244250043756265477265656E2D736FE9 -:103DA0006C6F003031323334353637383941424365 -:103DB0004445460000400000004000000040000074 -:103DC00000400000000001000000020000000200AE -:103DD00000000200000002000000020000000200DB -:103DE0000000020000400000004000000040000011 -:103DF000004000000000010000000200000002007E -:103E000000000200000002000000020000000200AA -:103E10000000020000000000391B0008191E000805 -:103E2000C51E000840004000803B0020803B002071 -:103E300001000000903B00208000000040010000D5 -:103E4000030000006D61696E00000000643E000820 -:103E5000983B0020903D00200100000075350008CF -:103E60000000000069646C65000000000000812A09 -:103E700000020000AAAAAAAA00000000FFFF00009A -:103E80000000000000A00A00000000000000000088 -:103E9000AAAAAAAA00000000FFFF0000000000007C -:103EA000000000001400005400000000AAAAAAAA02 -:103EB00014000054FFFF000000000000000000009C -:103EC00080699A0100000000AAAA8AAA40555501FB -:103ED000FFFF000000707007777000004081020152 -:103EE00000000000AAAAAAAA00410100F7FF0000F2 -:103EF000000000800800000000000000000000003A -:103F0000AAAAAAAA00000000FFFF0000000000000B -:103F1000000000000000000000000000AAAAAAAAF9 -:103F200000000000FFFF0000000000000000000093 -:103F300000000000000000000A0000000000000077 -:103F4000030000000000000000000000000000006E -:103F50000000000000000000000000000000000061 -:103F60000000000000000000FF00960000000008B4 -:103F700004000000883D0008000000000000000070 -:103F80000000000000000000000000000000000031 +:1001E00002E000F000F8FEE772B6374880F30888B6 +:1001F000364880F3098836483649086040F20000E6 +:10020000CCF200004EF63471CEF200010860BFF36C +:100210004F8FBFF36F8F40F20000C0F2F0004EF638 +:100220008851CEF200010860BFF34F8FBFF36F8F8C +:100230004FF00000E1EE100A4EF63C71CEF20001E4 +:100240000860062080F31488BFF36F8F02F074FA01 +:1002500003F074F94FF055301F491B4A91423CBFDF +:1002600041F8040BFAE71D49184A91423CBF41F896 +:10027000040BFAE71A491B4A1B4B9A423EBF51F83E +:10028000040B42F8040BF8E700201849184A914281 +:100290003CBF41F8040BFAE702F052FA03F0A2F96E +:1002A000144C154DAC4203DA54F8041B8847F9E7A7 +:1002B00000F042F8114C124DAC4203DA54F8041B22 +:1002C0008847F9E702F03ABA000600200022002031 +:1002D0000000000808ED00E00000002000060020FB +:1002E000A03E0008002200204C22002050220020C6 +:1002F00020310020E0010008E0010008E0010008D2 +:10030000E00100082DE9F04F2DED108AC1F80CD066 +:10031000C3689D46BDEC108ABDE8F08F002383F3CF +:1003200011882846A047002001F098FDFEE701F063 +:1003300027FD00DFFEE7000038B500F0DFFB02F02C +:10034000CFF940B1164B6FF03F01002259720F21D7 +:100350001A729972DA7202F0A9F9054602F0E2F90E +:100360000446C8B90F4B9D4218D001339D4218BFB7 +:10037000044641F2883504BF01240025002002F024 +:100380009FF90CB100F076F800F018FD284600F057 +:10039000C1F800F06FF8F9E70025EFE70546EDE753 +:1003A00000220020010007B008B500F073FBA0F1A7 +:1003B00020035842584108BD07B541F212030221FB +:1003C00001A8ADF8043000F083FB03B05DF804FB36 +:1003D00038B5302383F31188174803680BB101F057 +:1003E00009FE164A144800234FF47A7101F0F8FD13 +:1003F000002383F31188124C236813B12368013B57 +:100400002360636813B16368013B63600D4D2B7813 +:1004100033B963687BB9022000F03AFC3223636091 +:100420002B78032B07D163682BB9022000F030FC36 +:100430004FF47A73636038BD50220020D103000866 +:100440007023002068220020084B187003280CD865 +:10045000DFE800F008050208022000F00FBC0220CF +:1004600000F002BC024B00225A6070476822002054 +:1004700070230020234B244A10B51C461968013113 +:100480003FD004339342F9D16268A24239D31F4B63 +:100490009B6803F1006303F580439A4231D2002048 +:1004A00000F046FB0220FFF7CFFF194B1A6C002229 +:1004B0001A64196E1A66196E596C5A64596E5A6626 +:1004C0005A6E5A6942F080025A615A6922F08002DB +:1004D0005A615A691A6942F000521A611A6922F087 +:1004E00000521A611B6972B64FF0E0233021C3F845 +:1004F000084DD4E9003281F311889D4683F30888C2 +:10050000104710BD004000082040000800220020D5 +:10051000003802402DE9F04F93B0AA4B0090202202 +:10052000FF210AA89D6800F0F3FBA74A1378A3B93E +:10053000A648012103601170302383F311880368FA +:100540000BB101F057FDA24AA04800234FF47A7185 +:1005500001F046FD002383F31188009B13B19D4BEE +:10056000009A1A609C4A009C1378032B1EBF00233C +:100570001370984A4FF0000A18BF5360D34656468E +:10058000D146012000F07AFB24B1924B1B68002B6E +:1005900000F01182002000F07DFA0390039B002BF5 +:1005A000F2DB012000F060FB039B213B162BE8D817 +:1005B00001A252F823F000BF150600083D0600080E +:1005C000D10600088305000883050008830500089C +:1005D0005B0700082B09000845080008A708000869 +:1005E000CF080008F508000883050008070900087F +:1005F0008305000879090008B5060008830500088E +:10060000BD09000821060008B5060008830500089A +:10061000A70800080220FFF7C7FE002840F0F58178 +:10062000009B0221BAF1000F08BF1C4605A841F249 +:100630001233ADF8143000F04BFAA2E74FF47A70A1 +:1006400000F028FA071EEBDB0220FFF7ADFE0028C2 +:10065000E6D0013F052F00F2DA81DFE807F0030A58 +:100660000D10133605230593042105A800F030FA78 +:1006700017E054480421F9E758480421F6E75848A0 +:100680000421F3E74FF01C08404600F053FA08F14C +:1006900004080590042105A800F01AFAB8F12C0FFF +:1006A000F2D1012000FA07F747EA0B0B5FFA8BFB48 +:1006B0004FF0000900F078FB26B10BF00B030B2B79 +:1006C00008BF0024FFF778FE5BE746480421CDE72A +:1006D000002EA5D00BF00B030B2BA1D10220FFF7AE +:1006E00063FE074600289BD0012000F021FA02207B +:1006F000FFF7AAFE00261FFA86F8404600F028FA07 +:10070000044690B10021404600F032FA013600283C +:10071000F1D1BA46044641F21213022105A8ADF800 +:1007200014303E4600F0D4F92BE70120FFF78CFE91 +:100730002546244B9B68AB4207D9284600F0FAF9BE +:10074000013040F067810435F3E7234B00251D702D +:10075000204BBA465D603E46ACE7002E3FF460AFEA +:100760000BF00B030B2B7FF45BAF0220FFF76CFE4B +:10077000322000F08FF9B0F10008FFF651AF18F009 +:1007800003077FF44DAF0F4A926808EB05039342CD +:100790003FF646AFB8F5807F3FF742AF124B01936B +:1007A000B84523DD4FF47A7000F074F90390039A92 +:1007B000002AFFF635AF019B039A03F8012B01379E +:1007C000EDE700BF002200206C2300205022002013 +:1007D000D10300087023002068220020042200209A +:1007E000082200200C2200206C220020C820FFF7E5 +:1007F000DBFD074600283FF413AF1F2D11D8C5F1CC +:10080000200242450AAB25F0030028BF4246834937 +:100810000192184400F056FA019A8048FF2100F036 +:1008200077FA4FEAA8037D490193C8F38702284667 +:1008300000F076FA064600283FF46DAF019B05EB09 +:10084000830537E70220FFF7AFFD00283FF4E8AE4D +:1008500000F0BAF900283FF4E3AE0027B846704B29 +:100860009B68BB4218D91F2F11D80A9B01330ED0A9 +:1008700027F0030312AA134453F8203C0593404683 +:10088000042205A900F0F6FA04378046E7E7384667 +:1008900000F050F90590F2E7CDF81480042105A886 +:1008A00000F016F906E70023642104A8049300F081 +:1008B00005F900287FF4B4AE0220FFF775FD00288B +:1008C0003FF4AEAE049800F067F90590E6E7002328 +:1008D000642104A8049300F0F1F800287FF4A0AE8E +:1008E0000220FFF761FD00283FF49AAE049800F063 +:1008F00063F9EAE70220FFF757FD00283FF490AEC6 +:1009000000F072F9E1E70220FFF74EFD00283FF406 +:1009100087AE05A9142000F06DF904210746049064 +:1009200004A800F0D5F83946B9E7322000F0B2F853 +:10093000071EFFF675AEBB077FF472AE384A9268A9 +:1009400007EB090393423FF66BAE0220FFF72CFD45 +:1009500000283FF465AE27F003074F44B9453FF444 +:10096000A9AE484600F0E6F80421059005A800F07D +:10097000AFF809F10409F1E74FF47A70FFF714FDBD +:1009800000283FF44DAE00F01FF9002844D00A9B28 +:1009900001330BD008220AA9002000F0C1F9002879 +:1009A0003AD02022FF210AA800F0B2F9FFF704FD97 +:1009B0001C4801F059FA13B0BDE8F08F002E3FF447 +:1009C0002FAE0BF00B030B2B7FF42AAE0023642118 +:1009D00005A8059300F072F8074600287FF420AEC2 +:1009E0000220FFF7E1FC804600283FF419AEFFF734 +:1009F000E3FC41F2883001F037FA059800F018FA6C +:100A0000464600F0D1F93C46BBE5064652E64FF0BB +:100A1000000905E6BA467EE637467CE66C220020F1 +:100A200000220020A08601002DE9F84F4FF47A73D0 +:100A3000DFF85880DFF8589006460D4602FB03F7B2 +:100A4000002498F900305A1C5FFA84FA01D0A342BE +:100A500012D159F8240003682A46D3F820B0314651 +:100A60003B46D847854207D1074B012083F800A0B9 +:100A7000BDE8F88F0124E4E7002CFBD04FF4FA70B6 +:100A800001F0F2F90020F3E7B82300201022002043 +:100A90001422002007B50023024601210DF10700B2 +:100AA0008DF80730FFF7C0FF20B19DF8070003B0B5 +:100AB0005DF804FB4FF0FF30F9E700000A4608B587 +:100AC0000421FFF7B1FF80F00100C0B2404208BD31 +:100AD00030B4074B0A461978064B53F82140236877 +:100AE000DD69054B0146AC46204630BC604700BF7F +:100AF000B823002014220020A086010070B501F068 +:100B0000D3FC094E094D3080002428683388834285 +:100B100008D901F0C3FC2B6804440133B4F5804FBD +:100B20002B60F2D370BD00BFBA23002078230020D1 +:100B300001F070BD00F1006000F580400068704772 +:100B400000F10060920000F5804001F0FBBC000065 +:100B5000054B1A68054B1B889B1A834202D9104427 +:100B600001F09CBC0020704778230020BA230020AD +:100B700038B5084D044629B128682044BDE83840FE +:100B800001F0ACBC2868204401F090FC0028F3D0B0 +:100B900038BD00BF7823002010F003030AD1B0F560 +:100BA000047F05D200F10050A0F51040D0F80038C5 +:100BB000184670470023FBE700F10050A0F51040F5 +:100BC000D0F8100A70470000064991F8243033B17C +:100BD0000023086A81F824300822FFF7B1BF012002 +:100BE000704700BF7C230020014B1868704700BF8E +:100BF000002004E070B5194B1D68194B0138C5F38E +:100C00000B0408442D0C04221E88A6420BD15C68FC +:100C10000A46013C824213460FD214F9016F4EB1CD +:100C200002F8016BF6E7013A03F10803ECD18142C7 +:100C30000B4602D22C2203F8012B0A4A05241688FF +:100C4000AE4204D1984284BF967803F8016B013C10 +:100C500002F10402F3D1581A70BD00BF002004E075 +:100C6000503B00083C3B0008022802BF024B4FF4F7 +:100C700080529A61704700BF00100240022802BFF4 +:100C8000024B4FF080529A61704700BF0010024043 +:100C9000022801BF024A536983F4805353617047AD +:100CA0000010024070B504464FF47A764CB1412CE6 +:100CB000254628BF412506FB05F001F0D5F8641B49 +:100CC000F4E770BD10B50023934203D0CC5CC4544C +:100CD0000133F9E710BD000010B5013810F9013FEC +:100CE0003BB191F900409C4203D11AB10131013A64 +:100CF000F4E71AB191F90020981A10BD1046FCE7EC +:100D000003460246D01A12F9011B0029FAD1704796 +:100D100002440346934202D003F8011BFAE77047EE +:100D20002DE9F8431F4D144695F8242007468846C0 +:100D300052BBDFF870909CB395F824302BB9202279 +:100D4000FF2148462F62FFF7E3FF95F82400C0F12A +:100D50000802A24228BF2246D6B24146920005EBC5 +:100D60008000FFF7AFFF95F82430A41B1E44F6B2B5 +:100D7000082E17449044E4B285F82460DBD1FFF7D5 +:100D800023FF0028D7D108E02B6A03EB82038342BC +:100D9000CFD0FFF719FF0028CBD10020BDE8F883A2 +:100DA0000120FBE77C230020024B1A78024B1A70CB +:100DB000704700BFB82300201022002038B5174C20 +:100DC000174D204600F0B6FB2946204600F0DEFB1A +:100DD0002D686A6D936B23F4002393634FF47A704C +:100DE000FFF760FF0F49284600F0D6FC6A6D0E4DF4 +:100DF000936B28680D4943F400239363A0424FF49A +:100E0000E1330B6001D000F0F5FA6868A04204D02D +:100E1000BDE83840054900F0EDBA38BD98280020FB +:100E20005C3C0008643C000814220020A42300203D +:100E300070B50C4B0C4D1E780C4B55F826209A4281 +:100E400004460DD00A4B002114221846FFF760FF1C +:100E50000460014655F82600BDE8704000F0CABAAB +:100E600070BD00BFB8230020142200209828002065 +:100E7000A423002030B5094D0A4491420DD011F849 +:100E8000013B5840082340F30004013B2C4013F081 +:100E9000FF0384EA5000F6D1EFE730BD2083B8EDC0 +:100EA000026843681143016003B1184770470000AE +:100EB000024AD36843F0C003D36070470044004047 +:100EC00010B5054C054A0021204600F071FA044A8D +:100ED000044BC4E9972310BDBC230020B10E0008C9 +:100EE0000044004080DE8002234A037C002918BFB2 +:100EF0000A46012B30B5C0F868220CD11F4B98422E +:100F000009D11F4B196C41F400311964196E41F479 +:100F1000003119661B6EB2F904501468D0F86032C3 +:100F2000D0F85C12002D03EB5403B3FBF4F3BEBF07 +:100F300023F0070503F0070343EA450394888B6019 +:100F4000D38843F040030B61138943F001034B61E5 +:100F500044F4045343F02C03CB6004F4A054002366 +:100F60000B60B4F5806F0B684B680CBF7F23FF23C9 +:100F700080F8643230BD00BF703B0008BC23002005 +:100F8000003802402DE9F041D0F85C62F768336820 +:100F9000DA0504469DB20DD5302383F311884FF452 +:100FA00080610430FFF77CFF6FF4807333600023AF +:100FB00083F31188302383F3118804F1040815F0BA +:100FC0002F033AD183F31188380615D5290613D596 +:100FD000302383F3118804F1380000F065F900280C +:100FE0004EDA0821201DFFF75BFF4FF67F733B4071 +:100FF000F360002383F311887A0616D56B0614D5A7 +:10100000302383F31188D4E913239A420AD1236C45 +:1010100043B127F040073F041021201D3F0CFFF78C +:101020003FFFF760002383F31188D4F86822D36868 +:1010300043B3BDE8F041106918472B0714D015F0F1 +:10104000080F0CBF00214FF48071E80748BF41F042 +:101050002001AA0748BF41F040016B0748BF41F09B +:1010600080014046FFF71CFFAD06736805D594F874 +:1010700064122046194000F0CBF93568ADB29EE706 +:101080007060B6E7BDE8F081F8B51546826806697C +:10109000AA420B46816938BF8568761AB542044674 +:1010A0000BD218462A46FFF70DFEA3692B44A36115 +:1010B000A3685B1BA3602846F8BD0CD918463246CE +:1010C000FFF700FEAF1BE1683A463044FFF7FAFD38 +:1010D000E3683B44EBE718462A46FFF7F3FDE36875 +:1010E000E5E7000083689342F7B51546044638BF2C +:1010F0008568D0E90460361AB5420BD22A46FFF75C +:10110000E1FD63692B446361A36828465B1BA36010 +:1011100003B0F0BD0DD932460191FFF7D3FD01991F +:10112000E068AF1B3A463144FFF7CCFDE3683B442F +:10113000E9E72A46FFF7C6FDE368E4E710B50A448D +:101140000024C361029B8460C0E90000C0E905116E +:10115000C1600261036210BD08B5D0E90532934257 +:1011600001D1826882B98268013282605A1C426170 +:101170001970D0E904329A4224BFC3684361002148 +:1011800000F08EFE002008BD4FF0FF30FBE70000AE +:1011900070B5302304460E4683F31188A568A5B1C7 +:1011A000A368A269013BA360531CA361157822695F +:1011B000934224BFE368A361E3690BB120469847DB +:1011C000002383F31188284607E03146204600F0CB +:1011D00057FE0028E2DA85F3118870BD2DE9F74F3C +:1011E00004460E4617469846D0F81C904FF0300A39 +:1011F0008AF311884FF0000B154665B12A46314637 +:101200002046FFF741FF034660B94146204600F003 +:1012100037FE0028F1D0002383F31188781B03B038 +:10122000BDE8F08FB9F1000F03D001902046C84708 +:10123000019B8BF31188ED1A1E448AF31188DCE7B9 +:10124000C0E90511C160C3611144009B8260C0E91F +:101250000000016103627047F8B504460D4616466A +:10126000302383F31188A768A7B1A368013BA3606B +:1012700063695A1C62611D70D4E904329A4224BF2A +:10128000E3686361E3690BB120469847002080F36F +:10129000118807E03146204600F0F2FD0028E2DA2E +:1012A00087F31188F8BD0000D0E905239A4210B5F4 +:1012B00001D182687AB98268013282605A1C8261E7 +:1012C0001C7803699A4224BFC3688361002100F03F +:1012D000E7FD204610BD4FF0FF30FBE72DE9F74F4B +:1012E00004460E4617469846D0F81C904FF0300A38 +:1012F0008AF311884FF0000B154665B12A46314636 +:101300002046FFF7EFFE034660B94146204600F055 +:10131000B7FD0028F1D0002383F31188781B03B0B8 +:10132000BDE8F08FB9F1000F03D001902046C84707 +:10133000019B8BF31188ED1A1E448AF31188DCE7B8 +:10134000026843681143016003B118477047000009 +:101350001430FFF743BF00004FF0FF331430FFF7A6 +:101360003DBF00003830FFF7B9BF00004FF0FF333A +:101370003830FFF7B3BF00001430FFF709BF00009B +:101380004FF0FF311430FFF703BF00003830FFF794 +:1013900063BF00004FF0FF323830FFF75DBF000041 +:1013A000012914BF6FF0130000207047FFF788BDBC +:1013B00037B515460E4A026000224260C0E902229B +:1013C0000122044602740B46009000F15C014FF4C8 +:1013D00080721430FFF7B2FE00942B464FF48072F7 +:1013E00004F5AE7104F13800FFF72AFF03B030BDF9 +:1013F000843B000810B53023044683F31188FFF7BF +:1014000073FD02232374002080F3118810BD0000B7 +:1014100038B5C36904460D461BB904210844FFF7DB +:101420008FFF294604F11400FFF796FE002806DA24 +:10143000201D4FF40061BDE83840FFF781BF38BD83 +:10144000026843681143016003B118477047000008 +:1014500013B5446BD4F894341A681178042915D163 +:10146000217C022912D11979128901238B40134260 +:101470000CD101A904F14C0001F016FFD4F89444FA +:10148000019B21790246206800F0D0F902B010BD1E +:10149000143001F099BE00004FF0FF33143001F01A +:1014A00093BE00004C3001F06BBF00004FF0FF33E3 +:1014B0004C3001F065BF0000143001F067BE000041 +:1014C0004FF0FF31143001F061BE00004C3001F0EC +:1014D00037BF00004FF0FF324C3001F031BF000049 +:1014E0000020704710B5D0F894341A681178042998 +:1014F000044617D1017C022914D15979528901235C +:101500008B4013420ED1143001F0FAFD024648B16F +:10151000D4F894444FF4807361792068BDE810409A +:1015200000F072B910BD0000406BFFF7DBBF000098 +:10153000704700007FB5124B036000234360C0E991 +:101540000233012502260F4B0574044602900193D5 +:1015500000F18402294600964FF48073143001F0A4 +:10156000ABFD094B0294CDE9006304F523724FF4FF +:101570008073294604F14C0001F072FE04B070BD86 +:10158000AC3B000829150008511400080B683022F4 +:1015900082F311880A7903EB820290614A79093259 +:1015A00043F822008A7912B103EB82039861022387 +:1015B000C0F894140374002080F311887047000071 +:1015C00038B5037F044613B190F85430ABB9201DF1 +:1015D00001250221FFF734FF04F1140025776FF095 +:1015E000010100F069FC84F8545004F14C006FF0E4 +:1015F0000101BDE8384000F05FBC38BD10B50121E5 +:1016000004460430FFF71CFF0023237784F854308E +:1016100010BD000038B504460025143001F064FD0B +:1016200004F14C00257701F033FE201D84F854505E +:101630000121FFF705FF2046BDE83840FFF752BF04 +:1016400090F8443003F06003202B07D190F8452038 +:10165000212A4FF0000303D81F2A06D80020704724 +:10166000222AFBD1C0E90E3303E0034A826307223A +:10167000C2630364012070471C22002037B5D0F8F4 +:1016800094341A681178042904461AD1017C02297D +:1016900017D11979128901238B40134211D100F11E +:1016A0004C05284601F0B4FE58B101A9284601F0C6 +:1016B000FBFDD4F89444019B21790246206800F098 +:1016C000B5F803B030BD0000F0B500EB810385B084 +:1016D0009E6904460D46FEB1302383F3118804EB66 +:1016E0008507301D0821FFF7ABFEFB685B691B68AF +:1016F00006F14C001BB1019001F0E4FD019803A933 +:1017000001F0D2FD024648B1039B2946204600F075 +:101710008DF8002383F3118805B0F0BDFB685A698A +:101720001268002AF5D01B8A013B1340F1D104F165 +:101730004402EAE7093138B550F82140DCB13023E2 +:1017400083F31188D4F894241368527903EB82034D +:10175000DB689B695D6845B104216018FFF770FE86 +:10176000294604F1140001F0D5FC2046FFF7BAFE2B +:10177000002383F3118838BD7047000001F034B8AE +:10178000012303700023C0E90133C3618362036254 +:10179000C36243620363704738B50446302383F362 +:1017A00011880025C0E90355C0E90555416001F0E5 +:1017B0002BF80223237085F31188284638BD0000DA +:1017C00070B500EB810305465069DA600E46144699 +:1017D00018B110220021FFF79BFAA06918B110225E +:1017E0000021FFF795FA31462846BDE8704001F028 +:1017F000D5B80000826802F0011282600022C0E9C0 +:101800000422826101F056B9F0B400EB81044789EB +:10181000E4680125A4698D403D4345812360002390 +:10182000A2606360F0BC01F071B90000F0B400EB9D +:1018300081040789E468012564698D403D43058181 +:1018400023600023A2606360F0BC01F0EBB90000EC +:1018500070B50223002504460370C0E90255C0E9B3 +:101860000455C564856180F8345001F033F863682D +:101870001B6823B129462046BDE87040184770BD5B +:101880000378052B10B504460AD080F850300523A4 +:10189000037043681B680BB1042198470023A360C1 +:1018A00010BD00000178052906D190F8502043684A +:1018B00002701B6803B118477047000070B590F8BC +:1018C0003430044613B1002380F8343004F144026C +:1018D000204601F011F963689B68B3B994F844306D +:1018E00013F0600535D00021204601F0B1FB002146 +:1018F000204601F0A3FB63681B6813B10621204654 +:101900009847062384F8343070BD20469847002855 +:10191000E4D0B4F84A30E26B9A4288BFE36394F9AA +:101920004430E56B002B4FF0300380F20381002D33 +:1019300000F0F280092284F8342083F3118800211A +:10194000D4E90E232046FFF771FF002383F31188AB +:10195000DAE794F8452003F07F0343EA022340F2DC +:101960000232934200F0C58021D8B3F5807F48D081 +:101970000DD8012B3FD0022B00F09380002BB2D169 +:1019800004F14C02A2630222E2632364C1E7B3F5CF +:10199000817F00F09B80B3F5407FA4D194F846305E +:1019A000012BA0D1B4F84C3043F0020332E0B3F580 +:1019B000006F4DD017D8B3F5A06F31D0A3F5C06339 +:1019C000012B90D8636894F846205E6894F847101D +:1019D000B4F848302046B047002884D04368A36359 +:1019E0000368E3631AE0B3F5106F36D040F60242A5 +:1019F00093427FF478AF5C4BA3630223E36300233D +:101A0000C3E794F84630012B7FF46DAFB4F84C3047 +:101A100023F00203C4E90E55A4F84C30256478E79E +:101A2000B4F84430B3F5A06F0ED194F8463084F882 +:101A30004E30204600F0A6FF63681B6813B10121F9 +:101A400020469847032323700023C4E90E339CE704 +:101A500004F14F03A3630123C3E72378042B10D1C0 +:101A6000302383F311882046FFF7C4FE85F31188E5 +:101A70000321636884F84F5021701B680BB1204626 +:101A8000984794F84630002BDED084F84F3004237A +:101A9000237063681B68002BD6D00221204698472C +:101AA000D2E794F848301D0603F00F0120460AD50E +:101AB00001F014F8012804D002287FF414AF2B4B56 +:101AC0009AE72B4B98E700F0FBFFF3E794F84630DA +:101AD000002B7FF408AF94F8483013F00F01B3D017 +:101AE0001A06204602D501F0C7FAADE701F0BAFAAE +:101AF000AAE794F84630002B7FF4F5AE94F848300E +:101B000013F00F01A0D01B06204602D501F0A0FA69 +:101B10009AE701F093FA97E7142284F8342083F3CC +:101B200011882B462A4629462046FFF76DFE85F38D +:101B30001188E9E65DB1152284F8342083F3118819 +:101B40000021D4E90E232046FFF75EFEFDE60B22BE +:101B500084F8342083F311882B462A4629462046F0 +:101B6000FFF764FEE3E700BFDC3B0008D43B00085E +:101B7000D83B000838B590F834300446002B3ED0EE +:101B8000063BDAB20F2A34D80F2B32D8DFE803F045 +:101B9000373131082232313131313131313137375A +:101BA000C56BB0F84A309D4214D2C3681B8AB5FB9E +:101BB000F3F203FB12556DB9302383F311882B46E2 +:101BC0002A462946FFF732FE85F311880A2384F856 +:101BD00034300EE0142384F83430302383F311883A +:101BE00000231A4619462046FFF70EFE002383F312 +:101BF000118838BD036C03B198470023E7E7002143 +:101C0000204601F025FA0021204601F017FA63680A +:101C10001B6813B10621204698470623D7E700002A +:101C200010B590F83430142B044629D017D8062B61 +:101C300005D001D81BB110BD093B022BFBD80021F8 +:101C4000204601F005FA0021204601F0F7F963680B +:101C50001B6813B1062120469847062319E0152B6F +:101C6000E9D10B2380F83430302383F3118800232B +:101C70001A461946FFF7DAFD002383F31188DAE7E5 +:101C8000C3689B695B68002BD5D1036C03B198478F +:101C9000002384F83430CEE700230375826803699B +:101CA0001B6899689142FBD25A68036042601060D9 +:101CB0005860704700230375826803691B68996840 +:101CC0009142FBD85A6803604260106058607047C8 +:101CD00008B50846302383F311880B7D032B05D00C +:101CE000042B0DD02BB983F3118808BD8B6900221A +:101CF0001A604FF0FF338361FFF7CEFF0023F2E756 +:101D0000D1E9003213605A60F3E70000FFF7C4BF67 +:101D1000054BD9680875186802681A60536001227B +:101D20000275D860FEF7EEBA2826002030B50C4BBD +:101D3000DD684B1C87B004460FD02B46094A684625 +:101D400000F04EF92046FFF7E3FF009B13B1684611 +:101D500000F050F9A86907B030BDFFF7D9FFF9E7E7 +:101D600028260020D11C0008044B1A68DB68906804 +:101D70009B68984294BF00200120704728260020CD +:101D8000084B10B51C68D86822681A60536001229D +:101D90002275DC60FFF78EFF01462046BDE810404B +:101DA000FEF7B0BA2826002038B5074C0749084886 +:101DB000012300252370656001F068FB0223237076 +:101DC00085F3118838BD00BF90280020E43B00084F +:101DD0002826002000F044B9034A516853685B1A72 +:101DE0009842FBD8704700BF001000E08B600223D0 +:101DF00008618B82084670478368A3F1840243F828 +:101E0000142C026943F8442C426943F8402C094AD7 +:101E100043F8242CC26843F8182C022203F80C2C37 +:101E2000002203F80B2C044A43F8102CA3F12000E5 +:101E3000704700BF1D0300082826002008B5FFF7E3 +:101E4000DBFFBDE80840FFF761BF0000024BDB6825 +:101E500098610F20FFF75CBF28260020302383F312 +:101E60001188FFF7F3BF000008B50146302383F364 +:101E700011880820FFF75AFF002383F3118808BD5B +:101E8000064BDB6839B1426818605A6013604360E2 +:101E90000420FFF74BBF4FF0FF307047282600208B +:101EA0000368984206D01A6802605060996118462B +:101EB000FFF72CBF7047000038B504460D46206878 +:101EC000844200D138BD036823605C608561FFF700 +:101ED0001DFFF4E710B503689C68A2420CD85C684B +:101EE0008A600B604C602160596099688A1A9A6018 +:101EF0004FF0FF33836010BD1B68121BECE700003E +:101F00000A2938BF0A2170B504460D460A26601911 +:101F100001F0B4FA01F09CFA041BA54203D8751C29 +:101F20002E460446F3E70A2E04D9BDE8704001208E +:101F300001F0ECBA70BD0000F8B5144B0D46D96144 +:101F400003F1100141600A2A1969826038BF0A2230 +:101F5000016048601861A818144601F07FFA0A274A +:101F600001F076FA431BA342064606D37C1C2819CF +:101F700001F084FA27463546F2E70A2F04D9BDE876 +:101F8000F840012001F0C2BAF8BD00BF28260020A9 +:101F9000F8B506460D4601F05BFA0F4A134653F8B2 +:101FA000107F9F4206D12A4601463046BDE8F840E0 +:101FB000FFF7C2BFD169BB68441A2C1928BF2C4651 +:101FC000A34202D92946FFF79BFF22463146034828 +:101FD000BDE8F840FFF77EBF282600203826002005 +:101FE00010B4C0E9032300235DF8044B4361FFF7FD +:101FF000CFBF000010B5194C236998420DD0D0E92D +:102000000032816813605A609A680A449A6000231B +:1020100003604FF0FF33A36110BD2346026843F80D +:10202000102F53600022026022699A4203D1BDE85A +:10203000104001F01DBA936881680B44936001F071 +:1020400007FA2269E1699268441AA242E4D911446C +:10205000BDE81040091AFFF753BF00BF2826002033 +:102060002DE9F047DFF8BC8008F110072C4ED8F8B6 +:10207000105001F0EDF9D8F81C40AA68031B9A42F1 +:102080003ED81444D5E900324FF00009C8F81C408E +:1020900013605A60C5F80090D8F81030B34201D1EF +:1020A00001F0E6F989F31188D5E90331284698470C +:1020B000302383F311886B69002BD8D001F0C8F965 +:1020C0006A69A0EB04094A4582460DD2022001F05C +:1020D0001DFA0022D8F81030B34208D151462846E4 +:1020E000BDE8F047FFF728BF121A2244F2E712EBCF +:1020F000090938BF4A4629463846FFF7EBFEB5E7DF +:10210000D8F81030B34208D01444211AC8F81C0083 +:10211000A960BDE8F047FFF7F3BEBDE8F08700BF58 +:10212000382600202826002000207047FEE7000007 +:10213000704700004FF0FF307047000002290CD0BC +:10214000032904D00129074818BF00207047032A3B +:1021500005D8054800EBC2007047044870470020CE +:10216000704700BFC03C00082C220020743C0008CF +:1021700070B59AB00546084601A9144600F0C2F8A9 +:1021800001A8FEF7BDFD431C5B00C5E90034002239 +:10219000237003236370C6B201AB02341046D1B280 +:1021A0008E4204F1020401D81AB070BD13F8011B6D +:1021B00004F8021C04F8010C0132F0E708B53023E2 +:1021C00083F311880348FFF759FA002383F311883A +:1021D00008BD00BF9828002090F8443003F01F028B +:1021E000012A07D190F845200B2A03D10023C0E92A +:1021F0000E3315E003F06003202B08D1B0F848300F +:102200002BB990F84520212A03D81F2A04D8FFF7BC +:1022100017BA222AEBD0FAE7034A82630722C26385 +:1022200003640120704700BF2322002007B5052961 +:1022300017D8DFE801F0191603191920302383F3AA +:102240001188104A01900121FFF7BAFA01980E4A4D +:102250000221FFF7B5FA0D48FFF7DCF9002383F3FD +:10226000118803B05DF804FB302383F3118807481D +:10227000FFF7A6F9F2E7302383F311880348FFF74D +:10228000BDF9EBE7143C0008383C00089828002012 +:1022900038B50C4D0C4C0D492A4604F10800FFF7E7 +:1022A00067FF05F1CA0204F110000949FFF760FF5A +:1022B00005F5CA7204F118000649BDE83840FFF779 +:1022C00057BF00BF602D00202C220020F03B0008EB +:1022D000FD3B0008083C000870B5044608460D4662 +:1022E000FEF70EFDC6B22046013403780BB918463E +:1022F00070BD32462946FEF7EFFC0028F3D10120DD +:10230000F6E700002DE9F04705460C46FEF7F8FC1D +:102310002B49C6B22846FFF7DFFF08B10736F6B2F1 +:1023200028492846FFF7D8FF08B11036F6B2632EC9 +:102330000BD8DFF88C80DFF88C90234FDFF894A067 +:102340002E7846B92670BDE8F08729462046BDE8BC +:10235000F04701F0D5BB252E2ED107224146284655 +:10236000FEF7BAFC70B9194B224603F10C0153F881 +:10237000040B42F8040B8B42F9D11B8813800735FC +:102380000E34DDE7082249462846FEF7A5FC98B939 +:102390000F4BA21C197809090232C95D02F8041C0E +:1023A00013F8011B01F00F015345C95D02F8031C2E +:1023B000F0D118340835C3E704F8016B0135BFE7E5 +:1023C000E03C0008083C0008F73C0008E83C000836 +:1023D000107AFF1F1C7AFF1FBFF34F8F024AD3688A +:1023E000DB03FCD4704700BF003C024008B5094B3A +:1023F0001B7873B9FFF7F0FF074B1A69002ABFBFBC +:10240000064A5A6002F188325A601A6822F48062E1 +:102410001A6008BDBE2F0020003C02402301674522 +:1024200008B50B4B1B7893B9FFF7D6FF094B1A6918 +:1024300042F000421A611A6842F480521A601A6827 +:1024400022F480521A601A6842F480621A6008BD51 +:10245000BE2F0020003C02401728F0B516D80C4CC7 +:102460000C4923787BB90C4D0E4618234FF00062BF +:1024700055F8047B46F8042B013B13F0FF033A4464 +:10248000F6D10123237051F82000F0BD0020FCE7B5 +:1024900020300020C02F0020083D0008014B53F8D9 +:1024A00020007047083D000818207047172810B515 +:1024B000044601D9002010BDFFF7CEFF064B53F8AC +:1024C00024301844C21A0BB90120F4E71268013213 +:1024D000F0D1043BF6E700BF083D0008172838B5E7 +:1024E000044628D81549FFF777FFFFF77FFFF3234E +:1024F000CB600C23B0FBF3F203FB1205D30143EADC +:10250000C503DBB243F4007343F002030B610B69B4 +:1025100043F480330B61FFF75FFFFFF79DFF084B2C +:1025200053F8241000F0DAF8FFF77AFF2046BDE8F0 +:102530003840FFF7BBBF002038BD00BF003C024061 +:10254000083D0008F8B512F00103144642D1821884 +:10255000B2F1026F57D82D4B1B6813F0010352D014 +:102560002B4DFFF743FFF323EB60FFF735FF40F2FE +:102570000127032C15D824F001046618244C401AB6 +:1025800040F20117B142236900EB010524D123F089 +:1025900001032361FFF744FF0120F8BD043C043030 +:1025A000E7E78307E7D12B6923F440732B612B699D +:1025B0003B432B6151F8046B0660BFF34F8FFFF76D +:1025C0000BFF03689E42E9D02B6923F001032B61C6 +:1025D000FFF726FF0020E0E723F44073236123691F +:1025E0003B4323610B882B80BFF34F8FFFF7F4FE33 +:1025F0002D8831F8023BADB2AB42C3D0236923F042 +:1026000001032361E4E71846C7E700BF0038024032 +:10261000003C0240084908B50B7828B11BB9FFF708 +:10262000E5FE01230B7008BD002BFCD0BDE808407F +:102630000870FFF7F5BE00BFBE2F002010B50244A2 +:10264000064BD2B2904200D110BD441C00B253F8E8 +:10265000200041F8040BE0B2F4E700BF502800402E +:102660000F4B30B51C6F240407D41C6F44F4007466 +:102670001C671C6F44F400441C670A4C236843F435 +:10268000807323600244084BD2B2904200D130BD27 +:10269000441C00B251F8045B43F82050E0B2F4E768 +:1026A00000380240007000405028004007B5012269 +:1026B00001A90020FFF7C2FF019803B05DF804FBF9 +:1026C00013B50446FFF7F2FFA04205D0012201A98D +:1026D00000200194FFF7C4FF02B010BD7047000056 +:1026E000094B5A88B2F5805F10460BD022F00203E6 +:1026F00041F20102934205D041F20703C31A584246 +:102700005841704701207047002004E0034B1A68CD +:102710001AB9034AD2F874281A607047243000208E +:102720000030024008B5FFF7F1FF024B1868C0F314 +:10273000407008BD2430002070470000FEE7000014 +:102740000A4B0B480B4A90420BD30B4BDA1C121A64 +:10275000C11E22F003028B4238BF00220021FEF787 +:10276000D7BA53F8041B40F8041BECE7EC3E000812 +:1027700020310020203100202031002070B5D0E928 +:1027800015439E6800224FF0FF3504EB42135101C0 +:10279000D3F800090028BEBFD3F8000940F08040FC +:1027A000C3F80009D3F8000B0028BEBFD3F8000B14 +:1027B00040F08040C3F8000B013263189642C3F822 +:1027C0000859C3F8085BE0D24FF00113C4F81C3875 +:1027D00070BD0000890141F02001016103699B0681 +:1027E000FCD41220FFF7F8BA10B5054C2046FEF7CE +:1027F000C7FF4FF0A0436365024BA36510BD00BF48 +:10280000283000208C3D000870B50378012B054668 +:1028100050D12A4B446D98421BD1294B5A6B42F040 +:1028200080025A635A6D42F080025A655A6D5A69A5 +:1028300042F080025A615A6922F080025A610E21E8 +:1028400043205B6900F022FC1E4BE3601E4BC4F882 +:1028500000380023C4F8003EC02323606E6D4FF49F +:102860005023A3633369002BFCDA012333610C206E +:10287000FFF7B2FA3369DB07FCD41220FFF7ACFA9A +:102880003369002BFCDA0026A6602846FFF776FFA6 +:102890006B68C4F81068DB68C4F81468C4F81C6876 +:1028A0004BB90A4BA3614FF0FF336361A36843F058 +:1028B0000103A36070BD064BF4E700BF2830002081 +:1028C000003802404014004003002002003C30C0A9 +:1028D000083C30C0F8B5446D054600212046FFF79E +:1028E00079FFA96D00234FF001128F68C4F83438C6 +:1028F0004FF00066C4F81C284FF0FF3004EB431281 +:1029000001339F42C2F80069C2F8006BC2F808099F +:10291000C2F8080BF2D20B686A6DEB656362102394 +:102920001361166916F01006FBD11220FFF754FA56 +:10293000D4F8003823F4FE63C4F80038A36943F4E4 +:10294000402343F01003A3610923C4F81038C4F8EE +:1029500014380A4BEB604FF0C043C4F8103B084BEF +:10296000C4F8003BC4F81069C4F80039EB6D03F1FA +:10297000100243F48013EA65A362F8BD683D0008C5 +:1029800040800010426D90F84E10D2F8003823F4C9 +:10299000FE6343EA0113C2F8003870472DE9F8439B +:1029A00000EB8103456DDA68166806F00306731EB6 +:1029B000022B05EB41130C4680460FFA81F94FEAD2 +:1029C00041104FF00001C3F8101B4FF0010104F15A +:1029D000100398BFB60401FA03F391698EBF334E1A +:1029E00006F1805606F5004600293AD0578A04F1D0 +:1029F0005801490137436F50D5F81C180B43C5F8EF +:102A00001C382B180021C3F8101953690127611EC7 +:102A1000A7409BB3138A928B9B08012A88BF53431C +:102A2000D8F85C20981842EA034301F1400205EB14 +:102A30008202C8F85C00214653602846FFF7CAFEB0 +:102A400008EB8900C3681B8A43EA84534834640155 +:102A50001E432E51D5F81C381F43C5F81C78BDE81D +:102A6000F88305EB4917D7F8001B21F40041C7F89C +:102A7000001BD5F81C1821EA0303C0E704F13F034B +:102A800005EB83030A4A5A6028462146FFF7A2FE57 +:102A900005EB4910D0F8003923F40043C0F80039A1 +:102AA000D5F81C3823EA0707D7E700BF00800010DD +:102AB00000040002826D1268C265FFF75FBE00006D +:102AC0005831436D49015B5813F4004004D013F4AE +:102AD000001F0CBF02200120704700004831436DE9 +:102AE00049015B5813F4004004D013F4001F0CBFDD +:102AF000022001207047000000EB8101CB68196AB9 +:102B00000B6813604B6853607047000000EB810353 +:102B100030B5DD68AA691368D36019B9402B84BF4A +:102B2000402313606B8A1468426D1C44013CB4FB63 +:102B3000F3F46343033323F0030302EB411043EA4E +:102B4000C44343F0C043C0F8103B2B6803F00303B9 +:102B5000012B09B20ED1D2F8083802EB411013F460 +:102B6000807FD0F8003B14BF43F0805343F0005304 +:102B7000C0F8003B02EB4112D2F8003B43F00443A3 +:102B8000C2F8003B30BD00002DE9F041244D6E6DD0 +:102B900006EB40130446D3F8087BC3F8087B3807DC +:102BA0000AD5D6F81438190706D505EB8403214653 +:102BB000DB6828465B689847FA071FD5D6F81438B3 +:102BC000DB071BD505EB8403D968CCB98B69488A30 +:102BD0005A68B2FBF0F600FB16228AB91868DA6868 +:102BE00090420DD2121AC3E90024302383F31188D6 +:102BF0000B482146FFF78AFF84F31188BDE8F08176 +:102C0000012303FA04F26B8923EA02036B81CB6888 +:102C1000002BF3D021460248BDE8F041184700BF21 +:102C20002830002000EB810370B5DD68436D6C69CE +:102C30002668E6604A0156BB1A444FF40020C2F8E9 +:102C400010092A6802F00302012A0AB20ED1D3F851 +:102C5000080803EB421410F4807FD4F8000914BF75 +:102C600040F0805040F00050C4F8000903EB4212DD +:102C7000D2F8000940F00440C2F80009D3F8340843 +:102C8000012202FA01F10143C3F8341870BD19B9E9 +:102C9000402E84BF4020206020682E8A8419013C89 +:102CA000B4FBF6F440EAC44040F000501A44C6E7D2 +:102CB0002DE9F8433B4D6E6D06EB40130446D3F807 +:102CC0000889C3F8088918F0010F4FEA40171AD095 +:102CD000D6F81038DB0716D505EB8003D9684B69A9 +:102CE0001868DA68904230D2121A4FF000091A6060 +:102CF000C3F80490302383F3118821462846FFF758 +:102D000091FF89F3118818F0800F1CD0D6F8343861 +:102D10000126A640334216D005EB84036D6DD3F82F +:102D20000CC0DCF814200134E4B2D2F800E005EB6A +:102D300004342F445168714515D3D5F8343823EA4B +:102D40000606C5F83468BDE8F883012303FA04F2E7 +:102D50002B8923EA02032B818B68002BD3D02146D9 +:102D600028469847CFE7BCF81000AEEB010383423A +:102D700028BF0346D7F8180980B2B3EB800FE2D81A +:102D80009068A0F1040959F8048FC4F80080A0EB02 +:102D900009089844B8F1040FF5D818440B44906022 +:102DA0005360C7E7283000202DE9F74FA24C656D2E +:102DB0006E69AB691E4016F480586E6107D02046DC +:102DC000FEF746FD03B0BDE8F04F00F04DBC002E0D +:102DD00012DAD5F8003E98489B071EBFD5F8003E92 +:102DE00023F00303C5F8003ED5F8043823F00103AF +:102DF000C5F80438FEF756FD370505D58E48FFF7B0 +:102E0000BDFC8D48FEF73CFDB0040CD5D5F8083864 +:102E100013F0060FEB6823F470530CBF43F4105308 +:102E200043F4A053EB6031071BD56368DB681BB923 +:102E3000AB6923F00803AB612378052B0CD1D5F8DF +:102E4000003E7D489A071EBFD5F8003E23F00303DD +:102E5000C5F8003EFEF726FD6368DB680BB17648D7 +:102E60009847F30274D4B70227D5D4F85490DFF80A +:102E7000C8B100274FF0010A09EB4712D2F8003B16 +:102E800003F44023B3F5802F11D1D2F8003B002B7F +:102E90000DDA62890AFA07F322EA0303638104EB7D +:102EA0008703DB68DB6813B1394658469847A36D42 +:102EB00001379B68FFB29F42DED9F00617D5676DD8 +:102EC0003A6AC2F30A1002F00F0302F4F012B2F5EC +:102ED000802F00F08580B2F5402F08D104EB8303EA +:102EE0000022DB681B6A07F5805790426AD13003E5 +:102EF000D5F8184813D5E10302D50020FFF744FEAA +:102F0000A20302D50120FFF73FFE630302D5022092 +:102F1000FFF73AFE270302D50320FFF735FE7503BE +:102F20007FF550AFE00702D50020FFF7C1FEA107F3 +:102F300002D50120FFF7BCFE620702D50220FFF791 +:102F4000B7FE23077FF53EAF0320FFF7B1FE39E759 +:102F5000636DDFF8E4A0019300274FF00109A36D32 +:102F60009B685FFA87FB9B453FF67DAF019B03EBB8 +:102F70004B13D3F8001901F44021B1F5802F1FD174 +:102F8000D3F8001900291BDAD3F8001941F0904159 +:102F9000C3F80019D3F800190029FBDB5946606D0E +:102FA000FFF718FC218909FA0BF321EA03032381B7 +:102FB00004EB8B03DB689B6813B159465046984776 +:102FC0000137CCE7910708BFD7F80080072A98BFE0 +:102FD00003F8018B02F1010298BF4FEA182884E739 +:102FE000023304EB830207F580575268D2F818C009 +:102FF000DCF80820DCE9001CA1EB0C0C0021884265 +:103000000AD104EB830463689B699A6802449A605E +:103010005A6802445A606AE711F0030F08BFD7F8F4 +:1030200000808C4588BF02F8018B01F1010188BF47 +:103030004FEA1828E3E700BF28300020436D03EB78 +:103040004111D1F8003B43F40013C1F8003B704735 +:10305000436D03EB4111D1F8003943F40013C1F87B +:1030600000397047436D03EB4111D1F8003B23F465 +:103070000013C1F8003B7047436D03EB4111D1F8D9 +:10308000003923F40013C1F80039704700F16043A0 +:1030900003F561430901C9B283F80013012200F06E +:1030A0001F039A4043099B0003F1604303F561430A +:1030B000C3F880211A60704730B5039C0172043355 +:1030C00004FB0325C0E90653049B03630021059B11 +:1030D000C160C0E90000C0E90422C0E90842C0E9BB +:1030E0000A11436330BD0000416A0022C0E90411A7 +:1030F000C0E90A22C2606FF00101FEF7DDBE0000E8 +:10310000D0E90432934201D1C2680AB9181D704750 +:103110000020704703691960C2680132C260C26949 +:10312000134482690361934224BF436A036100210F +:10313000FEF7B6BE38B504460D46E3683BB162699A +:10314000131D1268A3621344E362002007E0237A90 +:1031500033B929462046FEF793FE0028EDDA38BD44 +:103160006FF00100FBE70000C368C269013BC36068 +:103170004369134482694361934224BF436A4361B4 +:1031800000238362036B03B11847704770B5302387 +:10319000044683F31188866A3EB9FFF7CBFF0546E4 +:1031A00018B186F31188284670BDA36AE26A13F845 +:1031B000015BA362934202D32046FFF7D5FF0023B1 +:1031C00083F31188EFE700002DE9F84F04460E461F +:1031D000174698464FF0300989F311880025AA4612 +:1031E000D4F828B0BBF1000F09D141462046FFF7C3 +:1031F000A1FF20B18BF311882846BDE8F88FD4E9F0 +:103200000A12A7EB050B521A934528BF9346BBF150 +:10321000400F1BD9334601F1400251F8040B43F82B +:10322000040B9142F9D1A36A40334036A362403582 +:10323000D4E90A239A4202D32046FFF795FF8AF386 +:103240001188BD42D8D289F31188C9E730465A4661 +:10325000FDF738FDA36A5B445E44A3625D44E7E783 +:1032600010B5029C0172043303FB0421C0E906136C +:103270000023C0E90A33039B0363049BC460C0E9D5 +:103280000000C0E90422C0E90842436310BD000009 +:10329000026AC260426AC0E904220022C0E90A222E +:1032A0006FF00101FEF708BED0E904239A4201D174 +:1032B000C26822B9184650F8043B0B6070470023DF +:1032C0001846FAE7C368C2690133C360436913440F +:1032D00082694361934224BF436A43610021FEF740 +:1032E000DFBD000038B504460D46E3683BB12369F5 +:1032F0001A1DA262E2691344E362002007E0237A08 +:1033000033B929462046FEF7BBFD0028EDDA38BD6B +:103310006FF00100FBE7000003691960C268013A21 +:10332000C260C269134482690361934224BF436A45 +:10333000036100238362036B03B1184770470000E9 +:1033400070B530230D460446114683F31188866A12 +:103350002EB9FFF7C7FF10B186F3118870BDA36ABD +:103360001D70A36AE26A01339342A36204D3E16948 +:1033700020460439FFF7D0FF002080F31188EDE7E5 +:103380002DE9F84F04460D46904699464FF0300A15 +:103390008AF311880026B346A76A4FB949462046EA +:1033A000FFF7A0FF20B187F311883046BDE8F88F02 +:1033B000D4E90A073A1AA8EB0607974228BF17462E +:1033C000402F1BD905F1400355F8042B40F8042B7E +:1033D0009D42F9D1A36A4033A3624036D4E90A235F +:1033E0009A4204D3E16920460439FFF795FF8BF335 +:1033F00011884645D9D28AF31188CDE729463A4645 +:10340000FDF760FCA36A3B443D44A3623E44E5E70C +:10341000D0E904239A4217D1C3689BB1836A8BB168 +:10342000043B9B1A0ED01360C368013BC360C369A1 +:103430001A44836902619A4224BF436A03610023EC +:1034400083620123184670470023FBE700F036B97A +:10345000014B586A704700BF000C0040034B00222C +:1034600058631A610222DA60704700BF000C004006 +:10347000014B0022DA607047000C0040014B58639A +:10348000704700BF000C0040FEE7000070B51B4B0A +:1034900001630025044686B0586085620E4600F040 +:1034A000BFF804F11003C4E904334FF0FF33C4E95B +:1034B0000635C4E90044A560E562FFF7C9FF2B4665 +:1034C0000246C4E9082304F134010D4A256580232E +:1034D0002046FEF78BFC0123E0600A4A0375009248 +:1034E00072680192B268CDE90223074B6846CDE9C4 +:1034F0000435FEF7A3FC06B070BD00BF9028002085 +:10350000983D00089D3D000889340008024AD36AAE +:103510001843D062704700BF282600204B684360E4 +:103520008B688360CB68C3600B6943614B6903623E +:103530008B6943620B6803607047000008B5264B37 +:1035400026481A6940F2FF110A431A611A6922F4E7 +:10355000FF7222F001021A611A691A6B0A431A6398 +:103560001A6D0A431A651E4A1B6D1146FFF7D6FFF6 +:1035700002F11C0100F58060FFF7D0FF02F1380175 +:1035800000F58060FFF7CAFF02F1540100F580608A +:10359000FFF7C4FF02F1700100F58060FFF7BEFF86 +:1035A00002F18C0100F58060FFF7B8FF02F1A8017D +:1035B00000F58060FFF7B2FF02F1C40100F5806002 +:1035C000FFF7ACFF02F1E00100F58060FFF7A6FF16 +:1035D000BDE8084000F0F0B80038024000000240AA +:1035E000A43D000808B500F06BFAFEF7DDFBFFF71D +:1035F0008DF8BDE80840FEF74BBE000070470000A4 +:10360000EFF3098305494A6B22F001024A636833EC +:1036100083F30988002383F31188704700EF00E0EB +:10362000302080F3118862B60C4B0D4AD96821F422 +:10363000E0610904090C0A43DA60D3F8FC20094967 +:1036400042F08072C3F8FC200A6842F001020A606E +:103650002022DA7783F82200704700BF00ED00E0F7 +:103660000003FA05001000E010B5302383F3118841 +:103670000E4B5B6813F4006314D0F1EE103AEFF3D5 +:103680000984683C4FF08073E361094BDB6B236670 +:1036900084F30988FEF768FB10B1064BA36110BDE7 +:1036A000054BFBE783F31188F9E700BF00ED00E06D +:1036B00000EF00E02F030008320300080E4B1A6CE5 +:1036C00042F008021A641A6E42F008021A660B4AA7 +:1036D0001B6E936843F008039360094B53229A6270 +:1036E0004FF0FF32DA6200229A615A63DA605A6060 +:1036F00001225A611A60704700380240002004E03D +:10370000000C0040094A08B51169D3680B40D9B2D2 +:10371000C9439B07116107D5302383F31188FEF756 +:1037200059FB002383F3118808BD00BF000C004043 +:103730001F4B1A696FEAC2526FEAD2521A611A69B4 +:10374000C2F308021A614FF0FF301A695A695861D2 +:1037500000215A6959615A691A6A62F080521A62E4 +:103760001A6A02F080521A621A6A5A6A58625A6ACF +:1037700059625A6A1A6C42F080521A641A6E42F008 +:1037800080521A661A6E0B4A106840F480701060FE +:10379000186F00F44070B0F5007F1EBF4FF480300A +:1037A00018671967536823F40073536000F060B919 +:1037B0000038024000700040344B4FF080521A64D1 +:1037C000334A4FF4404111601A6842F001021A6016 +:1037D0001A689107FCD59A6822F003029A602B4B75 +:1037E0009A6812F00C02FBD1196801F0F901196016 +:1037F0009A601A6842F480321A601A689203FCD503 +:103800005A6F42F001025A67204B5A6F9007FCD55D +:10381000204A5A601A6842F080721A601C4A536843 +:103820005904FCD5194B1A689201FCD51A4A9A60C2 +:103830000322C3F88C20194B1A68194B9A42194B72 +:1038400021D1194A1168194A91421CD140F205123E +:103850001A60144A136803F00F03052BFAD10B4BBF +:103860009A6842F002029A609A6802F00C02082AF2 +:10387000FAD15A6C42F480425A645A6E42F4804241 +:103880005A665B6E704740F20572E1E7003802400D +:10389000007000401854400700948838002004E06D +:1038A00011640020003C024000ED00E041C20F41E5 +:1038B000074A08B5536903F00103536123B1054A70 +:1038C00013680BB150689847BDE80840FFF7CCBEBD +:1038D000003C0140A0300020074A08B5536903F0BE +:1038E0000203536123B1054A93680BB1D06898472E +:1038F000BDE80840FFF7B8BE003C0140A030002002 +:10390000074A08B5536903F00403536123B1054A1C +:1039100013690BB150699847BDE80840FFF7A4BE92 +:10392000003C0140A0300020074A08B5536903F06D +:103930000803536123B1054A93690BB1D0699847D5 +:10394000BDE80840FFF790BE003C0140A0300020D9 +:10395000074A08B5536903F01003536123B1054AC0 +:10396000136A0BB1506A9847BDE80840FFF77CBE68 +:10397000003C0140A0300020164B10B55C6904F4F7 +:1039800078725A61A30604D5134A936A0BB1D06AC0 +:103990009847600604D5104A136B0BB1506B9847DB +:1039A000210604D50C4A936B0BB1D06B9847E20506 +:1039B00004D5094A136C0BB1506C9847A30504D584 +:1039C000054A936C0BB1D06C9847BDE81040FFF7E7 +:1039D0004BBE00BF003C0140A0300020194B10B589 +:1039E0005C6904F47C425A61620504D5164A136D81 +:1039F0000BB1506D9847230504D5134A936D0BB155 +:103A0000D06D9847E00404D50F4A136E0BB1506E89 +:103A10009847A10404D50C4A936E0BB1D06E984719 +:103A2000620404D5084A136F0BB1506F9847230402 +:103A300004D5054A936F0BB1D06F9847BDE810408D +:103A4000FFF712BE003C0140A030002008B503483B +:103A5000FDF798FABDE80840FFF706BEBC2300203A +:103A600008B5FFF74FFEBDE80840FFF7FDBD0000B9 +:103A7000062108B50846FFF709FB06210720FFF7D6 +:103A800005FB06210820FFF701FB06210920FFF7AF +:103A9000FDFA06210A20FFF7F9FA06211720FFF7A1 +:103AA000F5FA06212820FFF7F1FA07213220FFF767 +:103AB000EDFABDE808400C212620FFF7E7BA000028 +:103AC00008B5FFF735FE00F00DF8FDF76FFCFDF7C8 +:103AD00055FEFDF72DFDFFF791FDBDE80840FFF70E +:103AE000B5BC00000023054A19460133102BC2E97A +:103AF000001102F10802F8D1704700BFA030002089 +:103B0000034611F8012B03F8012B002AF9D1704765 +:103B100053544D3332463F3F3F0053544D333246AA +:103B20003430780053544D33324634327800535495 +:103B30004D333246343436585800000001203300EB +:103B40000010410001105A00031059000710310005 +:103B500000000000103B0008130400001A3B00089E +:103B600019040000243B0008210400002E3B00083B +:103B700000960000000000000000000000000000AF +:103B800000000000000000006D1300085913000839 +:103B900095130008811300088D130008791300089D +:103BA0006513000851130008A1130008000000006D +:103BB000AD14000899140008D5140008C1140008B9 +:103BC000CD140008B9140008A514000891140008C9 +:103BD000E1140008000000000100000000000000E7 +:103BE00063300000E03B0008802600209028002081 +:103BF0004865782F50726F6669434E430025424FE7 +:103C0000415244252D424C002553455249414C25F3 +:103C1000000000000200000000000000C9160008BB +:103C20003517000840004000302D0020402D0020B6 +:103C3000020000000000000003000000000000007F +:103C4000791700080000000010000000502D00202F +:103C500000000000010000000000000028300020EB +:103C6000010102002D2200083D210008D921000891 +:103C7000BD210008430000007C3C0008090243000D +:103C8000020100C032090400000102020100052403 +:103C9000001001052401000104240202052406008D +:103CA00001070582030800FF09040100020A000061 +:103CB00000070501024000000705810240000000E6 +:103CC00012000000C83C0008120110010200004070 +:103CD000AE2D0110000201020301000004030904DB +:103CE00025424F4152442500437562654772656520 +:103CF0006E2D736F6C6F0030313233343536373898 +:103D00003941424344454600004000000040000065 +:103D10000040000000400000000001000000020020 +:103D2000000002000000020000000200000002008B +:103D300000000200000002000040000000400000FF +:103D400000400000004000000000010000000200F0 +:103D5000000002000000020000000200000002005B +:103D6000000002000000020000000000BD18000872 +:103D7000751B0008211C000840004000883000200E +:103D800088300020010000009830002080000000F2 +:103D900040010000030000006D61696E0069646C01 +:103DA000650000000000812A00020000AAAAAAAA59 +:103DB00000000024FFFF00000000000000A00A0037 +:103DC0000000000000000000AAAAAAAA000000004B +:103DD000FFFF00000000000000000000140000547D +:103DE00000000000AAAAAAAA14000054FFFF0000C5 +:103DF00000000000000000008069100000000000CA +:103E0000AAAA8AAA40561000FFFF0000007070079F +:103E1000000000004001000100000000AAAAAAAAB8 +:103E200000010000F7FF000000000000000000009B +:103E30000000000000000000AAAAAAAA00000000DA +:103E4000FFFF000000000000000000000000000074 +:103E500000000000AAAAAAAA00000000FFFF0000BC +:103E60000000000000000000000000000000000052 +:103E70000A00000000000000030000000000000035 +:103E80000000000000000000000000000000000032 +:103E90000000000000000000000000000000000022 +:103EA000090000000000000000C01F00000000002A +:103EB000FF00000098280020BC230020009600008E +:103EC0000000080096000000000800000400000048 +:103ED000DC3C0008000000000000000000000000C2 +:0C3EE000000000000000000000000000D6 :00000001FF diff --git a/Tools/bootloaders/CubeOrange-ODID_bl.bin b/Tools/bootloaders/CubeOrange-ODID_bl.bin index a63483ca2d..045fd1e445 100755 Binary files a/Tools/bootloaders/CubeOrange-ODID_bl.bin and b/Tools/bootloaders/CubeOrange-ODID_bl.bin differ diff --git a/Tools/bootloaders/CubeOrange-bdshot_bl.bin b/Tools/bootloaders/CubeOrange-bdshot_bl.bin index 5e40768ac4..57942b84e4 100755 Binary files a/Tools/bootloaders/CubeOrange-bdshot_bl.bin and b/Tools/bootloaders/CubeOrange-bdshot_bl.bin differ diff --git a/Tools/bootloaders/CubeOrange-bdshot_bl.hex b/Tools/bootloaders/CubeOrange-bdshot_bl.hex index ac844a7f48..260a13e82c 100644 --- a/Tools/bootloaders/CubeOrange-bdshot_bl.hex +++ b/Tools/bootloaders/CubeOrange-bdshot_bl.hex @@ -1,1105 +1,2516 @@ :020000040800F2 -:1000000000060020A1020008FD0F00087D0F000877 -:10001000D50F00087D0F0008A90F0008A3020008F3 -:10002000A3020008A3020008A3020008DD290008BB -:10003000A3020008A3020008A3020008A30200080C -:10004000A3020008A3020008A3020008A3020008FC -:10005000A3020008A3020008653E0008913E0008C4 -:10006000BD3E0008E93E0008153F0008A302000855 -:10007000A3020008A3020008A3020008A3020008CC -:10008000A3020008A3020008A3020008A3020008BC -:10009000A3020008A3020008A3020008413F0008D1 -:1000A000A3020008A3020008A3020008A30200089C -:1000B000A3020008A3020008A3020008A30200088C -:1000C000A3020008A3020008A3020008A30200087C -:1000D000A3020008A3020008194000082D400008F0 -:1000E000A53F0008A3020008A3020008A30200081D -:1000F000A3020008A3020008A3020008A30200084C -:10010000A3020008A302000855400008A30200084B -:10011000A3020008A3020008A3020008A30200082B -:10012000A3020008A3020008A3020008A30200081B -:10013000A3020008A3020008A3020008A30200080B -:10014000A3020008A3020008A3020008A3020008FB -:10015000A3020008A3020008A3020008A3020008EB -:10016000A3020008A3020008A3020008A3020008DB -:10017000A302000849350008A3020008A3020008F2 -:10018000A3020008A302000841400008A3020008DF -:10019000A3020008A3020008A3020008A3020008AB -:1001A000A3020008A3020008A3020008A30200089B -:1001B000A3020008A3020008A3020008A30200088B -:1001C000A3020008A3020008A3020008A30200087B -:1001D000A302000835350008A3020008A3020008A6 -:1001E000A3020008A3020008A3020008A30200085B -:1001F000A3020008A3020008A3020008A30200084B -:10020000A3020008A3020008A3020008A30200083A -:10021000A3020008A3020008A3020008A30200082A -:10022000A3020008A3020008A3020008A30200081A -:10023000A3020008A3020008A3020008A30200080A -:10024000A3020008A3020008A3020008A3020008FA -:10025000A3020008A3020008A3020008A3020008EA -:10026000A3020008A3020008A3020008A3020008DA -:10027000A3020008A3020008A3020008A3020008CA -:10028000A3020008A3020008A3020008A3020008BA -:10029000A3020008A3020008A3020008A3020008AA -:1002A00002E000F000F8FEE772B63A4880F30888F2 -:1002B000394880F3098839484EF60851CEF20001DA -:1002C000086040F20000CCF200004EF63471CEF22D -:1002D00000010860BFF34F8FBFF36F8F40F2000043 -:1002E000C0F2F0004EF68851CEF200010860BFF374 -:1002F0004F8FBFF36F8F4FF00000E1EE100A4EF604 -:100300003C71CEF200010860062080F31488BFF330 -:100310006F8F02F021FC02F0C3FB03F05DFB4FF096 -:1003200055301F491B4A91423CBF41F8040BFAE784 -:100330001C49194A91423CBF41F8040BFAE71A499B -:100340001A4A1B4B9A423EBF51F8040B42F8040B69 -:10035000F8E700201749184A91423CBF41F8040BC6 -:10036000FAE702F0DBFB03F0BBFB144C144DAC428C -:1003700003DA54F8041B8847F9E700F041F8114C00 -:10038000114DAC4203DA54F8041B8847F9E702F038 -:10039000C3BB00000006002000220020000000086F -:1003A00000000020000600209044000800220020E9 -:1003B0005C22002060220020D44F0020A002000810 -:1003C000A0020008A0020008A00200082DE9F04FDA -:1003D0002DED108AC1F80CD0D0F80CD0BDEC108AED -:1003E000BDE8F08F002383F311882846A047002042 -:1003F00001F0DAFEFEE701F055FE00DFFEE7000047 -:1004000038B500F0D7FC30B1164B00220E211A721D -:100410005A729972DA7202F0A1FA054602F0D4FA21 -:100420000446D0B9104B9D4219D001339D4241F290 -:10043000883512BF044600250124002002F098FAF6 -:100440000CB100F059F800F039FD00F0F9FB284636 -:1004500000F004F900F050F8F9E70025EDE7054653 -:10046000EBE700BF00220020010007B008B500F054 -:10047000B3FBA0F120035842584108BD07B541F233 -:100480001203022101A8ADF8043000F0C3FB03B051 -:100490005DF804FB202310B583F311881248C3686C -:1004A0000BB101F007FF0023104A4FF47A710E4898 -:1004B00001F0C4FE002383F311880D4C236813B1AF -:1004C0002368013B2360636813B16368013B636089 -:1004D000084B1B7833B9636823B9022000F070FC25 -:1004E0003223636010BD00BF602200209504000825 -:1004F0007C23002074220020F8B5514B514A1C4641 -:100500001968013100F09B8004339342F8D162688E -:100510004D4B9A4240F293804C4B9B6803F1006331 -:1005200003F500339A4280F08A80002000F0A2FB9D -:100530000220474B187000F041FC464B0021D3F8D5 -:10054000E820C3F8E810D3F81021C3F81011D3F84D -:100550001021D3F8EC20C3F8EC10D3F81421C3F821 -:100560001411D3F81421D3F8F020C3F8F010D3F805 -:100570001821C3F81811D3F81821D3F8802042F0BD -:100580000062C3F88020D3F8802022F00062C3F814 -:100590008020D3F88020D3F8802042F00072C3F886 -:1005A0008020D3F8802022F00072C3F88020D3F896 -:1005B000803072B64FF0E023C3F8084DD4E9000450 -:1005C000BFF34F8FBFF36F8F234AC2F88410BFF37E -:1005D0004F8F536923F480335361BFF34F8FD2F8A9 -:1005E000803043F6E076C3F3C905C3F34E335B01B5 -:1005F00003EA060C29464CEA81770139C2F8747285 -:10060000F9D2203B13F1200FF2D1BFF34F8FBFF38C -:100610006F8FBFF34F8FBFF36F8F536923F4003396 -:1006200053610023C2F85032BFF34F8FBFF36F8F77 -:10063000202383F31188854680F308882047F8BD7E -:100640000000020820000208FFFF0108002200202D -:10065000742200200044025800ED00E02DE9F04F24 -:1006600093B0A94B2022FF2100900AA89D6800F0BA -:10067000CFFBA64A1378A3B90121A5481170C36026 -:10068000202383F31188C3680BB101F013FE00230C -:10069000A04A4FF47A719E4801F0D0FD002383F305 -:1006A0001188009B9C4A03B1136000239B49009C66 -:1006B00098469B461E469A460B705360012000F0F8 -:1006C0007DFB24B1944B1B68002B00F016820020A8 -:1006D00000F082FA0390039B002BF2DB012000F074 -:1006E0006BFB039B213B162BE8D801A252F823F0A9 -:1006F0004D0700087507000809080008BD06000836 -:10070000BD060008BD0600089D0800086F0A000825 -:1007100089090008EB090008130A0008390A0008D3 -:10072000BD0600084B0A0008BD060008BD0A000807 -:10073000ED070008BD060008010B00085907000876 -:10074000ED070008BD060008EB0900080220FFF7CE -:100750008DFE002840F0FB81009B022105A8B8F126 -:10076000000F08BF1C4641F21233ADF8143000F000 -:1007700051FAA3E74FF47A7000F02EFA071EEBDB74 -:100780000220FFF773FE0028E6D0013F052F00F29C -:10079000E081DFE807F0030A0D101336052304217A -:1007A00005A8059300F036FA17E004215648F9E74A -:1007B00004215B48F6E704215A48F3E74FF01C098F -:1007C000484609F1040900F057FA0421059005A8EC -:1007D00000F020FAB9F12C0FF2D101204FF0000AFD -:1007E00000FA07F747EA0B0B5FFA8BFB00F05CFBA4 -:1007F00026B10BF00B030B2B08BF0024FFF73EFEC6 -:100800005CE704214848CDE7002EA5D00BF00B0390 -:100810000B2BA1D10220FFF729FE074600289BD011 -:1008200001203E4E00F026FA4FF000080220307002 -:1008300000F0C4FA5FFA88F9484600F02BFA044643 -:1008400090B1484608F1010800F034FA0028F1D1CF -:10085000B846044641F21213022105A83E46ADF8FF -:10086000143000F0D7F929E7012325460220337020 -:1008700000F0A2FA244B9B68AB4207D9284600F04F -:10088000FBF9013040F068810435F3E70025234B84 -:10089000B8463E461D70204B5D60A7E7002E3FF432 -:1008A0005BAF0BF00B030B2B7FF456AF02201B4BFF -:1008B000187000F083FA322000F08EF9B0F10009D0 -:1008C000FFF64AAF19F003077FF446AF0E4A09EB73 -:1008D0000503926893423FF63FAFB9F5807F3FF73B -:1008E0003BAF124BB945019322DD4FF47A7000F013 -:1008F00073F90390039A002AFFF62EAF039A01378B -:10090000019B03F8012BEDE7002200207823002053 -:1009100060220020950400087C230020742200201F -:1009200004220020082200200C220020782200202F -:10093000C820FFF79BFD074600283FF40DAF1F2D91 -:1009400011D8C5F120020AAB25F0030084494A45BD -:10095000184428BF4A46019200F034FA019AFF2158 -:100960007F4800F055FA4FEAA903C9F387027C4992 -:100970002846019300F054FA064600283FF46AAF77 -:10098000019B05EB830531E70220FFF76FFD00288F -:100990003FF4E2AE00F0AAF900283FF4DDAE0027F4 -:1009A000B946704B9B68BB4218D91F2F11D80A9BC0 -:1009B00001330ED027F0030312AA134453F8203C4E -:1009C00005934846042205A9043700F019FB814627 -:1009D000E7E7384600F050F90590F2E7CDF81490BB -:1009E000042105A800F016F900E70023642104A8FB -:1009F000049300F005F900287FF4AEAE0220FFF763 -:100A000035FD00283FF4A8AE049800F065F9059084 -:100A1000E6E70023642104A8049300F0F1F800281D -:100A20007FF49AAE0220FFF721FD00283FF494AE38 -:100A3000049800F053F9EAE70220FFF717FD0028B9 -:100A40003FF48AAE00F062F9E1E70220FFF70EFD05 -:100A500000283FF481AE05A9142000F05DF9074697 -:100A60000421049004A800F0D5F83946B9E73220F3 -:100A700000F0B2F8071EFFF66FAEBB077FF46CAE56 -:100A8000384A07EB0A03926893423FF665AE0220AC -:100A9000FFF7ECFC00283FF45FAE27F00307574454 -:100AA000BA453FF4A3AE50460AF1040A00F0E4F858 -:100AB0000421059005A800F0ADF8F1E74FF47A7035 -:100AC000FFF7D4FC00283FF447AE00F00FF90028F0 -:100AD00044D00A9B01330BD008220AA9002000F061 -:100AE0009FF900283AD02022FF210AA800F090F9AF -:100AF000FFF7C4FC1C4801F05DFB13B0BDE8F08FAC -:100B0000002E3FF429AE0BF00B030B2B7FF424AE29 -:100B10000023642105A8059300F072F80746002819 -:100B20007FF41AAE0220FFF7A1FC814600283FF4B3 -:100B300013AEFFF7A3FC41F2883001F03BFB0598B0 -:100B400000F0FCF94E463C4600F0AEF9B6E506462C -:100B50004CE64FF0000AFFE5B8467BE6374679E6FB -:100B60007822002000220020A08601002DE9F84F05 -:100B70004FF47A7306460D46002402FB03F7DFF8B4 -:100B80005080DFF8509098F900305FFA84FA5A1CD0 -:100B900001D0A34210D159F824002A4631460368F7 -:100BA000D3F820B03B46D847854205D1074B0120FA -:100BB00083F800A0BDE8F88F0134042CE3D14FF492 -:100BC000FA7001F0F7FA0020F4E700BFC823002014 -:100BD0001022002058410008002307B502460121D9 -:100BE0000DF107008DF80730FFF7C0FF20B19DF829 -:100BF000070003B05DF804FB4FF0FF30F9E7000099 -:100C00000A46042108B5FFF7B1FF80F00100C0B229 -:100C1000404208BD074B0A4630B41978064B53F8DA -:100C20002140014623682046DD69044BAC4630BCB8 -:100C3000604700BFC823002058410008A08601007B -:100C400070B50A4E00240A4D01F060FD308028681E -:100C50003388834208D901F055FD2B6804440133E1 -:100C6000B4F5003F2B60F2D370BD00BFCA23002053 -:100C70008423002001F028BE00F1006000F5003060 -:100C80000068704700F10060920000F5003001F04C -:100C90009FBD0000054B1A68054B1B889B1A8342B9 -:100CA00002D9104401F02EBD00207047842300209B -:100CB000CA23002038B5074D04462868204401F0B7 -:100CC00027FD28B928682044BDE8384001F032BD2E -:100CD00038BD00BF842300200020704700F1FF5082 -:100CE00000F58F10D0F8000870470000064991F811 -:100CF000243033B100230822086A81F82430FFF73A -:100D0000C1BF0120704700BF88230020014B186835 -:100D1000704700BF0010005C244BF0B51A68044611 -:100D2000234BC2F30B06120C1F885868BE4293F97E -:100D3000085028D09F89BE4206D101200C2505FB12 -:100D40000033586893F9085041F201039A421CD0CD -:100D500041F203039A421AD042F201039A4218D098 -:100D600042F203039A4208BF5625621E0B46441EF8 -:100D70000A4493420FD214F9016F581C6EB1034616 -:100D800000F8016CF5E70020D8E75A25EDE7592572 -:100D9000EBE75825E9E7184605E02C2482421C7051 -:100DA00001D9981C5D70401AF0BD00BF0010005CB6 -:100DB0001422002000207047704700007047000098 -:100DC00070470000002310B5934203D0CC5CC4549C -:100DD0000133F9E710BD0000013810B510F9013FEB -:100DE0003BB191F900409C4203D11AB10131013A63 -:100DF000F4E71AB191F90020981A10BD1046FCE7EB -:100E000003460246D01A12F9011B0029FAD1704795 -:100E100002440346934202D003F8011BFAE77047ED -:100E20002DE9F8431F4D14460746884695F82420BF -:100E300052BBDFF870909CB395F824302BB9202278 -:100E4000FF2148462F62FFF7E3FF95F82400414653 -:100E5000C0F1080205EB8000A24228BF2246D6B2AC -:100E60009200FFF7AFFF95F82430A41B17441E44EF -:100E70009044E4B2F6B2082E85F82460DBD1FFF787 -:100E800035FF0028D7D108E02B6A03EB82038342A9 -:100E9000CFD0FFF72BFF0028CBD10020BDE8F8838F -:100EA0000120FBE788230020024B1A78024B1A70BE -:100EB000704700BFC823002010220020F8B5194C4D -:100EC000194800F079FC2146174800F0A1FC24687D -:100ED0001648D4F89020164ED2F80438154D43F039 -:100EE0000203114FC2F8043801F064F92046124998 -:100EF00000F09CFDD4F890200424D2F8043823F0AC -:100F00000203C2F804384FF4E133336055F8040BA0 -:100F1000B84202D0314600F0ADFB013C14F0FF04B2 -:100F2000F4D1F8BD70420008C832002040420F00E2 -:100F3000B0230020584100087842000838B50B4B18 -:100F400004461A780A4B53F822500A4B9D420CD0A3 -:100F5000094B002118221846FFF75AFF046001468A -:100F60002846BDE8384000F085BB38BDC8230020C6 -:100F700058410008C8320020B023002000B59BB0C3 -:100F8000EFF3098168226846FFF71CFFEFF3058342 -:100F9000044B9A6BDA6A9A6A9A6A9A6A9A6A9A6AA5 -:100FA0009B6AFEE700ED00E000B59BB0EFF309811E -:100FB00068226846FFF706FFEFF30583044B9A6B40 -:100FC0009A6A9A6A9A6A9A6A9A6A9B6AFEE700BF64 -:100FD00000ED00E000B59BB0EFF3098168226846A0 -:100FE000FFF7F0FEEFF30583034B5A6B9A6A9A6A98 -:100FF0009A6A9A6A9B6AFEE700ED00E0FEE700004D -:1010000030B50A44084D91420DD011F8013B5840CB -:10101000082340F30004013B2C4013F0FF0384EA53 -:101020005000F6D1EFE730BD2083B8ED0268436889 -:101030001143016003B1184770470000024A13686A -:1010400043F0C0031360704700440040024A136835 -:1010500043F0C0031360704700480040024A136821 -:1010600043F0C003136070470078004037B5274C49 -:10107000274D204600F0F2FA04F1140000940023FA -:101080004FF40072234900F0B3F94FF40072224983 -:1010900004F138000094214B00F02CFA204BC4E9F5 -:1010A0001735204C204600F0D9FA04F114000094C2 -:1010B00000234FF400721C4900F09AF94FF40072BB -:1010C0001A4904F138000094194B00F013FA194B37 -:1010D000C4E91735184C204600F0C0FA04F114009A -:1010E00000234FF400721549009400F081F9144B6D -:1010F0004FF40072134904F13800009400F0FAF93B -:10110000114BC4E9173503B030BD00BFCC2300201C -:1011100000E1F50510250020102B00203D100008EF -:10112000004400403824002010270020102D00200B -:101130004D10000800480040A42400201029002081 -:101140005D100008102F002000780040037C30B5AF -:10115000334C002918BF0C46012B18D1314B984253 -:101160000FD1314BD3F8E82042F40032C3F8E82025 -:10117000D3F8102142F40032C3F81021D3F8103113 -:1011800005E02A4B98422FD0294B984238D022684C -:10119000036EC16D03EB52038466B3FBF2F3626826 -:1011A000150442BF23F0070503F0070343EA450394 -:1011B000CB60A36843F040034B60E36843F0010356 -:1011C0008B6042F4967343F001030B604FF0FF33E2 -:1011D0000B62510505D512F010221DD0B2F1805FCF -:1011E0001CD080F8643030BD0F4BD3F8E82042F4B7 -:1011F0008022C3F8E820D3F8102142F48022BBE714 -:10120000094BD3F8E82042F08042C3F8E820D3F835 -:10121000102142F08042AFE77F23E2E73F23E0E77F -:1012200068410008CC2300200044025838240020E4 -:10123000A42400202DE9F047C66D05463768F469FF -:101240002107346219D014F0080118BF8021E20789 -:1012500048BF41F02001A3074FF0200348BF41F0F1 -:101260004001600748BF41F4807183F31188281D55 -:10127000FFF7DCFE002383F31188E2050AD5202363 -:1012800083F311884FF40071281DFFF7CFFE002370 -:1012900083F311884FF020094FF0000A14F0200862 -:1012A00038D13B0616D54FF0200905F1380A200643 -:1012B00010D589F31188504600F050F9002836DA2D -:1012C0000821281DFFF7B2FE27F0800333600023BA -:1012D00083F31188790614D5620612D5202383F38F -:1012E0001188D5E913239A4208D12B6C33B127F02A -:1012F00040071021281DFFF799FE3760002383F374 -:101300001188E30618D5AA6E1369ABB15069BDE820 -:10131000F047184789F31188736A284695F86410D6 -:10132000194000F0B5F98AF31188F469B6E7B062A4 -:1013300088F31188F469BAE7BDE8F087F8B5154677 -:10134000826804460B46AA4200D28568A1692669D4 -:10135000761AB5420BD218462A46FFF733FDA36929 -:101360002B44A3612846A3685B1BA360F8BD0CD97E -:10137000AF1B18463246FFF725FD3A46E168304478 -:10138000FFF720FDE3683B44EBE718462A46FFF7EA -:1013900019FDE368E5E7000083689342F7B504466A -:1013A000154600D28568D4E90460361AB5420BD2DE -:1013B0002A46FFF707FD63692B4463612846A3684B -:1013C0005B1BA36003B0F0BD0DD93246AF1B01918A -:1013D000FFF7F8FC01993A46E0683144FFF7F2FC68 -:1013E000E3683B44E9E72A46FFF7ECFCE368E4E7FF -:1013F00010B50A440024C361029B8460C16002618D -:101400000362C0E90000C0E9051110BD08B5D0E9CC -:101410000532934201D1826882B9826801328260CA -:101420005A1C426119700021D0E904329A4224BF4B -:10143000C368436100F0DAFE002008BD4FF0FF30C2 -:10144000FBE7000070B5202304460E4683F31188A5 -:10145000A568A5B1A368A269013BA360531CA36161 -:1014600015782269934224BFE368A361E3690BB155 -:1014700020469847002383F31188284607E0314629 -:10148000204600F0A3FE0028E2DA85F3118870BD43 -:101490002DE9F74F04460E4617469846D0F81C90A3 -:1014A0004FF0200A8AF311884FF0000B154665B102 -:1014B0002A4631462046FFF741FF034660B94146C0 -:1014C000204600F083FE0028F1D0002383F311882A -:1014D000781B03B0BDE8F08FB9F1000F03D0019085 -:1014E0002046C847019B8BF31188ED1A1E448AF3EE -:1014F0001188DCE7C160C361009B82600362C0E9C0 -:1015000005111144C0E9000001617047F8B50446B7 -:101510000D461646202383F31188A768A7B1A36858 -:10152000013BA36063695A1C62611D70D4E90432F7 -:101530009A4224BFE3686361E3690BB12046984790 -:10154000002080F3118807E03146204600F03EFE7F -:101550000028E2DA87F31188F8BD0000D0E90523FE -:1015600010B59A4201D182687AB9826800210132AD -:1015700082605A1C82611C7803699A4224BFC36846 -:10158000836100F033FE204610BD4FF0FF30FBE7D3 -:101590002DE9F74F04460E4617469846D0F81C90A2 -:1015A0004FF0200A8AF311884FF0000B154665B101 -:1015B0002A4631462046FFF7EFFE034660B9414612 -:1015C000204600F003FE0028F1D0002383F31188A9 -:1015D000781B03B0BDE8F08FB9F1000F03D0019084 -:1015E0002046C847019B8BF31188ED1A1E448AF3ED -:1015F0001188DCE7026843681143016003B11847B2 -:10160000704700001430FFF743BF00004FF0FF3376 -:101610001430FFF73DBF00003830FFF7B9BF0000BE -:101620004FF0FF333830FFF7B3BF00001430FFF73F -:1016300009BF00004FF0FF311430FFF703BF000077 -:101640003830FFF763BF00004FF0FF323830FFF74C -:101650005DBF000000207047FFF708BD044B03602A -:1016600000234360C0E9023301230374704700BFC5 -:101670008041000810B52023044683F31188FFF74A -:1016800065FD02232374002383F3118810BD00003D -:1016900038B5C36904460D461BB904210844FFF759 -:1016A000A9FF294604F11400FFF7B0FE002806DA6E -:1016B000201D4FF48061BDE83840FFF79BBF38BD67 -:1016C000026843681143016003B118477047000086 -:1016D00013B5406B00F58054D4F8A4381A6811781B -:1016E000042914D1017C022911D11979012312890D -:1016F0008B4013420BD101A94C3002F06DF8D4F8A5 -:10170000A4480246019B2179206800F0DFF902B06D -:1017100010BD0000143001F0EFBF00004FF0FF33A8 -:10172000143001F0E9BF00004C3002F0C1B80000F5 -:101730004FF0FF334C3002F0BBB80000143001F022 -:10174000BDBF00004FF0FF31143001F0B7BF000003 -:101750004C3002F08DB800004FF0FF324C3002F0F8 -:1017600087B800000020704710B500F58054D4F809 -:10177000A4381A681178042917D1017C022914D1E0 -:101780005979012352898B4013420ED1143001F054 -:101790004FFF024648B1D4F8A4484FF44073617932 -:1017A0002068BDE8104000F07FB910BD406BFFF726 -:1017B000DBBF0000704700007FB5124B01250426F7 -:1017C000044603600023057400F184024360294647 -:1017D000C0E902330C4B0290143001934FF4407374 -:1017E000009601F001FF094B04F69442294604F1EA -:1017F0004C000294CDE900634FF4407301F0C8FF40 -:1018000004B070BDA8410008AD170008D11600084B -:101810000A68202383F311880B790B3342F82300E5 -:101820004B79133342F823008B7913B10B3342F811 -:10183000230000F58053C3F8A41802230374002387 -:1018400083F311887047000038B5037F044613B155 -:1018500090F85430ABB90125201D0221FFF730FF6D -:1018600004F114006FF00101257700F0CBFC04F1C6 -:101870004C0084F854506FF00101BDE8384000F08E -:10188000C1BC38BD10B5012104460430FFF718FF74 -:101890000023237784F8543010BD000038B5044687 -:1018A0000025143001F0B8FE04F14C00257701F05A -:1018B00087FF201D84F854500121FFF701FF2046C7 -:1018C000BDE83840FFF750BF90F8803003F0600368 -:1018D000202B06D190F881200023212A03D81F2A2B -:1018E00006D800207047222AFBD1C0E91D3303E04F -:1018F000034A426707228267C3670120704700BF1F -:101900002C22002037B500F58055D5F8A4381A6888 -:10191000117804291AD1017C022917D119790123E0 -:1019200012898B40134211D100F14C04204602F081 -:1019300007F858B101A9204601F04EFFD5F8A44898 -:101940000246019B2179206800F0C0F803B030BD49 -:1019500001F10B03F0B550F8236085B004460D4645 -:10196000FEB1202383F3118804EB8507301D082185 -:10197000FFF7A6FEFB6806F14C005B691B681BB114 -:10198000019001F037FF019803A901F025FF0246FD -:1019900048B1039B2946204600F098F8002383F3C2 -:1019A000118805B0F0BDFB685A691268002AF5D0AD -:1019B0001B8A013B1340F1D104F18002EAE70000E9 -:1019C000133138B550F82140ECB1202383F311884E -:1019D00004F58053D3F8A4281368527903EB8203EB -:1019E000DB689B695D6845B104216018FFF768FEFC -:1019F000294604F1140001F025FE2046FFF7B4FE4D -:101A0000002383F3118838BD7047000001F018B936 -:101A100001234022002110B5044600F8303BFFF7B7 -:101A2000F7F90023C4E9013310BD000010B52023ED -:101A3000044683F311882422416000210C30FFF713 -:101A4000E7F9204601F01EF902232370002383F3F7 -:101A5000118810BD70B500EB8103054650690E4634 -:101A60001446DA6018B110220021FFF7D1F9A069FD -:101A700018B110220021FFF7CBF931462846BDE806 -:101A8000704001F011BA000083682022002103F0A9 -:101A9000011310B5044683601030FFF7B9F92046F2 -:101AA000BDE8104001F08CBAF0B4012500EB8104D0 -:101AB00047898D40E4683D43A46945812360002344 -:101AC000A2606360F0BC01F0A9BA0000F0B4012587 -:101AD00000EB810407898D40E4683D43646905811A -:101AE00023600023A2606360F0BC01F01FBB000014 -:101AF00070B5022300250446242203702946C0F84D -:101B000088500C3040F8045CFFF782F9204684F8D6 -:101B1000705001F05DF963681B6823B129462046C7 -:101B2000BDE87040184770BD037880F88C300523FD -:101B3000037043681B6810B504460BB10421984735 -:101B40000023A36010BD000090F88C204368027051 -:101B50001B680BB1052118477047000070B590F85D -:101B60007030044613B1002380F8703004F1800215 -:101B7000204601F049FA63689B68B3B994F8803055 -:101B800013F0600535D00021204601F0F3FC002160 -:101B9000204601F0E3FC63681B6813B10621204670 -:101BA0009847062384F8703070BD20469847002877 -:101BB000E4D0B4F88630A26F9A4288BFA36794F944 -:101BC0008030A56F002B4FF0200380F20381002DA1 -:101BD00000F0F280092284F8702083F3118800213C -:101BE0002046D4E91D23FFF771FF002383F31188FA -:101BF000DAE794F8812003F07F0343EA022340F2FE -:101C00000232934200F0C58021D8B3F5807F48D0DE -:101C10000DD8012B3FD0022B00F09380002BB2D1C6 -:101C200004F1880262670222A267E367C1E7B3F5A5 -:101C3000817F00F09B80B3F5407FA4D194F882307F -:101C4000012BA0D1B4F8883043F0020332E0B3F5A1 -:101C5000006F4DD017D8B3F5A06F31D0A3F5C06396 -:101C6000012B90D86368204694F882205E6894F82F -:101C70008310B4F88430B047002884D04368636789 -:101C80000368A3671AE0B3F5106F36D040F602423E -:101C900093427FF478AF5C4B63670223A367002312 -:101CA000C3E794F88230012B7FF46DAFB4F888302D -:101CB00023F00203A4F88830C4E91D55E56778E7EE -:101CC000B4F88030B3F5A06F0ED194F8823020467E -:101CD00084F88A3001F0DAF863681B6813B10121D7 -:101CE00020469847032323700023C4E91D339CE753 -:101CF00004F18B0363670123C3E72378042B10D11E -:101D0000202383F311882046FFF7BEFE85F3118858 -:101D10000321636884F88B5021701B680BB1204647 -:101D2000984794F88230002BDED084F88B3004235F -:101D3000237063681B68002BD6D002212046984789 -:101D4000D2E794F8843020461D0603F00F010AD52F -:101D500001F04CF9012804D002287FF414AF2B4B7A -:101D60009AE72B4B98E701F033F9F3E794F88230C8 -:101D7000002B7FF408AF94F8843013F00F01B3D038 -:101D80001A06204602D501F00DFCADE701F0FEFB7E -:101D9000AAE794F88230002B7FF4F5AE94F88430F3 -:101DA00013F00F01A0D01B06204602D501F0E2FB84 -:101DB0009AE701F0D3FB97E7142284F8702083F3AD -:101DC00011882B462A4629462046FFF76DFE85F3EB -:101DD0001188E9E65DB1152284F8702083F311883B -:101DE00000212046D4E91D23FFF75EFEFDE60B220D -:101DF00084F8702083F311882B462A462946204612 -:101E0000FFF764FEE3E700BFD8410008D0410008B7 -:101E1000D441000838B590F870300446002B3ED00D -:101E2000063BDAB20F2A34D80F2B32D8DFE803F0A2 -:101E300037313108223231313131313131313737B7 -:101E4000856FB0F886309D4214D2C3681B8AB5FBFB -:101E5000F3F203FB12556DB9202383F311882B464F -:101E60002A462946FFF732FE85F311880A2384F8B3 -:101E700070300EE0142384F87030202383F311882F -:101E8000002320461A461946FFF70EFE002383F36F -:101E9000118838BDC36F03B198470023E7E70021DD -:101EA000204601F067FB0021204601F057FB6368E4 -:101EB0001B6813B10621204698470623D7E7000088 -:101EC00010B590F870300446142B29D017D8062B83 -:101ED00005D001D81BB110BD093B022BFBD8002156 -:101EE000204601F047FB0021204601F037FB6368E4 -:101EF0001B6813B1062120469847062319E0152BCD -:101F0000E9D10B2380F87030202383F3118800235C -:101F10001A461946FFF7DAFD002383F31188DAE742 -:101F2000C3689B695B68002BD5D1C36F03B1984729 -:101F3000002384F87030CEE7024B0022C3E900335F -:101F40009A60704710310020002382680374054BAB -:101F50001B6899689142FBD25A6803604260106026 -:101F6000586070471031002008B5202383F3118892 -:101F7000037C032B05D0042B0DD02BB983F31188E0 -:101F800008BD436900221A604FF0FF334361FFF739 -:101F9000DBFF0023F2E7D0E9003213605A60F3E779 -:101FA000002382680374054B1B6899689142FBD833 -:101FB0005A6803604260106058607047103100201A -:101FC000054B196908741868026853601A60186133 -:101FD00001230374FEF7FAB9103100204B1C30B511 -:101FE000044687B00A4D10D02B6901A8094A00F0B9 -:101FF00025F92046FFF7E4FF049B13B101A800F088 -:1020000059F92B69586907B030BDFFF7D9FFF8E7D8 -:1020100010310020691F000838B50C4D044641619D -:102020002B6981689A68914203D8BDE83840FFF770 -:102030008BBF1846FFF7B4FF01232C6101462374C0 -:102040002046BDE83840FEF7C1B900BF103100207E -:10205000044B1A681B6990689B68984294BF0020E3 -:10206000012070471031002010B5084C236820690A -:102070001A6854602260012223611A74FFF790FFEE -:1020800001462069BDE81040FEF7A0B910310020DC -:1020900008B5FFF7DDFF18B1BDE80840FFF7E4BF62 -:1020A00008BD0000FFF7E0BFFEE7000010B50C4CD4 -:1020B000FFF742FF00F0B4F880220A49204600F002 -:1020C0003BF8012344F8180C037400F097FC00233C -:1020D00083F3118862B60448BDE8104000F04CB8A4 -:1020E00038310020DC410008EC41000800F01CB948 -:1020F000EFF3118020B9EFF30583202282F31188DA -:102100007047000010B530B9EFF30584C4F308043C -:1021100014B180F3118810BDFFF7BAFF84F3118862 -:10212000F9E70000034A516853685B1A9842FBD8EC -:10213000704700BF001000E08260022202827047F8 -:102140008368A3F17C0243F80C2C026943F83C2C11 -:10215000426943F8382C074A43F81C2CC268A3F1A3 -:10216000180043F8102C022203F8082C002203F870 -:10217000072C7047E503000810B5202383F311886E -:10218000FFF7DEFF00210446FFF746FF002383F33D -:102190001188204610BD0000024B1B6958610F20BA -:1021A000FFF70EBF10310020202383F31188FFF7C3 -:1021B000F3BF000008B50146202383F311880820EF -:1021C000FFF70CFF002383F3118808BD49B1064BCC -:1021D00042681B6918605A60136043600420FFF76F -:1021E000FDBE4FF0FF307047103100200368984269 -:1021F00006D01A680260506018465961FFF7A4BE05 -:102200007047000038B504460D462068844200D16E -:1022100038BD036823605C604561FFF795FEF4E715 -:10222000054B4FF0FF3103F11402C3E905220022F0 -:10223000C3E90712704700BF1031002070B51C4E73 -:1022400005460C46C0E9032301F0B0FB334653F8C2 -:10225000142F9A420DD130620A2C2CBF00190A307B -:102260002A60C5E90124C6E90555BDE8704001F0C2 -:1022700087BB316A431AE31838BF1C469368A342F0 -:1022800002D9081901F08CFB73699A6894420CD842 -:102290005A68AC602B606A6015609A685D60121BBA -:1022A0009A604FF0FF33F36170BDA41A1B68ECE72E -:1022B0001031002038B51B4C636998420DD08168FD -:1022C000D0E9003213605A600022C2609A680A4462 -:1022D0009A604FF0FF33E36138BD03682246002166 -:1022E00042F8143F93425A60C16003D1BDE83840C0 -:1022F00001F050BB9A688168256A0A449A6001F02F -:1023000055FB6369411B9A688A42E5D9AB181D1ACF -:10231000206A092D98BF01F10A02BDE83840104437 -:1023200001F03EBB103100202DE9F041184C002790 -:1023300004F11406656901F039FB236AAA68C11A21 -:102340008A4215D81344D5F80C802362D5E90032AF -:1023500013605A606369EF60B34201D101F01AFB68 -:1023600087F311882869C047202383F31188E1E7A8 -:102370006169B14209D013441B1ABDE8F0410A2B30 -:102380002CBFC0180A3001F00BBBBDE8F08100BFC4 -:102390001031002000207047FEE700007047000069 -:1023A0004FF0FF307047000002290CD0032904D001 -:1023B0000129074818BF00207047032A05D805489F -:1023C00000EBC2007047044870470020704700BF10 -:1023D000D44200083C2200208842000870B59AB020 -:1023E00005460846144601A900F0C2F801A8FEF708 -:1023F00007FD431C0022C6B25B001046C5E900344D -:1024000023700323023404F8013C01ABD1B202343F -:102410008E4201D81AB070BD13F8011B013204F8C6 -:10242000010C04F8021CF1E708B5202383F311889E -:102430000348FFF767FA002383F3118808BD00BF44 -:10244000C832002090F8803003F01F02012A07D123 -:1024500090F881200B2A03D10023C0E91D3315E039 -:1024600003F06003202B08D1B0F884302BB990F82A -:102470008120212A03D81F2A04D8FFF725BA222A4F -:10248000EBD0FAE7034A426707228267C36701205D -:10249000704700BF3322002007B5052917D8DFE8B1 -:1024A00001F0191603191920202383F31188104A0B -:1024B00001210190FFF7CEFA019802210D4AFFF7A2 -:1024C000C9FA0D48FFF7EAF9002383F3118803B036 -:1024D0005DF804FB202383F311880748FFF7B4F964 -:1024E000F2E7202383F311880348FFF7CBF9EBE7EA -:1024F000284200084C420008C832002038B50C4D74 -:102500000C4C2A460C4904F10800FFF767FF05F15F -:10251000CA0204F110000949FFF760FF05F5CA720D -:1025200004F118000649BDE83840FFF757BF00BF67 -:10253000A04B00203C220020044200081142000869 -:102540001C42000870B5044608460D46FEF758FCCC -:10255000C6B22046013403780BB9184670BD324626 -:102560002946FEF739FC0028F3D10120F6E70000E8 -:102570002DE9F04705460C46FEF742FC2B49C6B252 -:102580002846FFF7DFFF08B10A36F6B22849284689 -:10259000FFF7D8FF08B11036F6B2632E0BD8DFF87C -:1025A0008C80DFF88C90234FDFF894A02E7846B90A -:1025B0002670BDE8F08729462046BDE8F04701F0C7 -:1025C000B5BD252E2ED1072241462846FEF704FC34 -:1025D00070B9194B224603F1100153F8040B8B42DA -:1025E00042F8040BF9D11B78073511341370DDE77D -:1025F000082249462846FEF7EFFB98B9A21C0F4B6C -:10260000197802320909C95D02F8041C13F8011B8C -:1026100001F00F015345C95D02F8031CF0D11834D5 -:102620000835C3E7013504F8016BBFE7F442000841 -:102630001C4200080E430008FC42000800E8F11F9D -:102640000CE8F11FBFF34F8F044B1A695107FCD1FF -:10265000D3F810215207F8D1704700BF0020005274 -:1026600008B50D4B1B78ABB9FFF7ECFF0B4BDA68E5 -:10267000D10704D50A4A5A6002F188325A60D3F869 -:102680000C21D20706D5064AC3F8042102F188328C -:10269000C3F8042108BD00BFFE4D002000200052F9 -:1026A0002301674508B5114B1B78F3B9104B1A6924 -:1026B000510703D5DA6842F04002DA60D3F81021FE -:1026C000520705D5D3F80C2142F04002C3F80C2183 -:1026D000FFF7B8FF064BDA6842F00102DA60D3F880 -:1026E0000C2142F00102C3F80C2108BDFE4D002070 -:1026F000002000520F289ABF00F58060400400209F -:10270000704700004FF40030704700001020704701 -:102710000F2808B50BD8FFF7EDFF00F5003302686E -:10272000013204D104308342F9D1012008BD0020D8 -:10273000FCE700000F2870B5054645D8FFF7D8FC28 -:10274000224CFFF77FFF0646FFF78AFF4FF0FF336B -:10275000072D6361C4F8143120D82361FFF772FF9D -:102760002B0243F02403E360E36843F08003E3605B -:1027700023695A07FCD42846FFF764FF4FF4003161 -:10278000FFF7B8FF00F002F93046FFF78BFFFFF7C5 -:10279000B9FC2846BDE87040FFF7BABFC4F8103155 -:1027A000FFF750FFA5F108031B0243F02403C4F810 -:1027B0000C31D4F80C3143F08003C4F80C31D4F858 -:1027C00010315B07FBD4D6E7002070BD002000521B -:1027D0002DE9F84F40EA020305460C461746D80695 -:1027E00002D00020BDE8F88F27F01F07DFF8D4B033 -:1027F000FFF736FF2744BC4203D10120FFF752FF09 -:10280000F0E720222946204601F080FC10B920354F -:102810002034F0E72B4605F120021E68711CE0D140 -:1028200004339A42F9D1FFF763FC05F17843234A58 -:10283000B3F5801F224B28BF9A4603F1040338BF2B -:102840009046A2F1080228BF9846A3F108033ABFB8 -:102850009146DA469946FFF7F5FEC8F80060A5EB09 -:10286000040CD9F8002004F11C0142F00202C9F85E -:102870000020221FDAF8006016F00506FAD152F89F -:10288000043F8A424CF80230F4D1BFF34F8FFFF778 -:10289000D9FE4FF0FF32C8F80020D9F8002022F00E -:1028A0000202C9F80020FFF72DFC2022214628460D -:1028B00001F02CFC0028AAD030469FE714200052DB -:1028C000102100521020005210B5084C237828B176 -:1028D0001BB9FFF7C5FE0123237010BD002BFCD0F0 -:1028E0002070BDE81040FFF7DDBE00BFFE4D0020A8 -:1028F0000244074BD2B210B5904200D110BD441C27 -:1029000000B253F8200041F8040BE0B2F4E700BF36 -:10291000504000580E4B30B51C6F240405D41C6F7A -:102920001C671C6F44F400441C670A4C0244236873 -:10293000D2B243F480732360074B904200D130BD84 -:10294000441C51F8045B00B243F82050E0B2F4E7B5 -:1029500000440258004802585040005807B5012270 -:1029600001A90020FFF7C4FF019803B05DF804FB44 -:1029700013B50446FFF7F2FFA04205D0012201A9DA -:1029800000200194FFF7C6FF02B010BD0144BFF361 -:102990004F8F064B884204D3BFF34F8FBFF36F8F27 -:1029A0007047C3F85C022030F4E700BF00ED00E0A0 -:1029B000034B1A681AB9034AD2F8D0241A60704738 -:1029C000004E00200040025808B5FFF7F1FF024B0F -:1029D0001868C0F3806008BD004E0020EFF3098343 -:1029E000054968334A6B22F001024A6383F3098880 -:1029F000002383F31188704700EF00E0202080F36C -:102A0000118862B60D4B0E4AD96821F4E0610904C1 -:102A1000090C0A430B49DA60D3F8FC2042F08072BB -:102A2000C3F8FC20084AC2F8B01F116841F0010148 -:102A300011601022DA7783F82200704700ED00E081 -:102A40000003FA0555CEACC5001000E0202310B5F8 -:102A500083F311880E4B5B6813F4006314D0F1EE1E -:102A6000103AEFF309844FF08073683CE361094B3F -:102A7000DB6B236684F30988FFF7EAFA10B1064B93 -:102A8000A36110BD054BFBE783F31188F9E700BF95 -:102A900000ED00E000EF00E0F7030008FA03000893 -:102AA00070B5BFF34F8FBFF36F8F1A4A0021C2F882 -:102AB0005012BFF34F8FBFF36F8F536943F400334E -:102AC0005361BFF34F8FBFF36F8FC2F88410BFF312 -:102AD0004F8FD2F8803043F6E074C3F3C900C3F3DC -:102AE0004E335B0103EA0406014646EA817501396B -:102AF000C2F86052F9D2203B13F1200FF2D1BFF39C -:102B00004F8F536943F480335361BFF34F8FBFF34B -:102B10006F8F70BD00ED00E0FEE700000A4B0B4830 -:102B20000B4A90420BD30B4BC11EDA1C121A22F037 -:102B300003028B4238BF00220021FEF769B953F827 -:102B4000041B40F8041BECE7EC440008D44F0020C1 -:102B5000D44F0020D44F00207047000070B5D0E95A -:102B6000244300224FF0FF359E6804EB42135101CD -:102B7000D3F80009002805DAD3F8000940F08040B6 -:102B8000C3F80009D3F8000B002805DAD3F8000BCE -:102B900040F08040C3F8000B013263189642C3F83E -:102BA0000859C3F8085BE0D24FF00113C4F81C3891 -:102BB00070BD000000EB8103D3F80CC02DE9F04399 -:102BC000DCF814204E1CD0F89050D2F800E005EB51 -:102BD000063605EB4118506870450AD30122D5F836 -:102BE000343802FA01F123EA0101C5F83418BDE8CE -:102BF000F083AEEB0003BCF81040A34228BF23468D -:102C0000D8F81849A4B2B3EB840FF0D89468A4F1B3 -:102C1000040959F8047F3760A4EB09071F44042F07 -:102C2000F7D81C44034494605360D4E7890141F011 -:102C30002001016103699B06FCD41220FFF772BAE0 -:102C400010B50A4C2046FEF7E3FE094BC4F890305D -:102C5000084BC4F89430084C2046FEF7D9FE074BC9 -:102C6000C4F89030064BC4F8943010BD044E0020D8 -:102C70000000084044430008A04E0020000004402B -:102C80005043000870B503780546012B5DD1494BD0 -:102C9000D0F89040984259D1474B0E216520D3F887 -:102CA000D82042F00062C3F8D820D3F8002142F0C7 -:102CB0000062C3F80021D3F80021D3F8802042F04D -:102CC0000062C3F88020D3F8802022F00062C3F8AD -:102CD0008020D3F8803000F071FC384BE360384B33 -:102CE000C4F800380023D5F89060C4F8003EC02333 -:102CF00023604FF40413A3633369002BFCDA012330 -:102D00000C203361FFF70EFA3369DB07FCD4122085 -:102D1000FFF708FA3369002BFCDA00262846A66084 -:102D2000FFF71CFF6B68C4F81068DB68C4F8146810 -:102D3000C4F81C68002B3AD1224BA3614FF0FF333B -:102D40006361A36843F00103A36070BD1E4B98420A -:102D5000C8D1194B0E214D20D3F8D82042F0007273 -:102D6000C3F8D820D3F8002142F00072C3F8002144 -:102D7000D3F80021D3F8802042F00072C3F88020FD -:102D8000D3F8802022F00072C3F88020D3F880208E -:102D9000D3F8D82022F08062C3F8D820D3F80021DD -:102DA00022F08062C3F80021D3F8003193E7074B8B -:102DB000C3E700BF044E0020004402584014004006 -:102DC00003002002003C30C0A04E0020083C30C070 -:102DD000F8B5D0F89040054600214FF00066204637 -:102DE000FFF724FFD5F8941000234FF001128F68ED -:102DF0004FF0FF30C4F83438C4F81C2804EB4312F9 -:102E000001339F42C2F80069C2F8006BC2F808099A -:102E1000C2F8080BF2D20B68D5F89020C5F89830AC -:102E2000636210231361166916F01006FBD112209D -:102E3000FFF778F9D4F8003823F4FE63C4F80038BB -:102E4000A36943F4402343F01003A3610923C4F8AA -:102E50001038C4F814380B4BEB604FF0C043C4F883 -:102E6000103B094BC4F8003BC4F81069C4F80039A2 -:102E7000D5F8983003F1100243F48013C5F8982078 -:102E8000A362F8BD2043000840800010D0F89020D5 -:102E900090F88A10D2F8003823F4FE6343EA011355 -:102EA000C2F80038704700002DE9F84300EB8103B9 -:102EB000D0F890500C468046DA680FFA81F9480144 -:102EC000166806F00306731E022B05EB41134FF044 -:102ED000000194BFB604384EC3F8101B4FF0010137 -:102EE00004F1100398BF06F1805601FA03F39169CB -:102EF00098BF06F5004600293AD0578A04F15801D8 -:102F0000374349016F50D5F81C180B430021C5F811 -:102F10001C382B180127C3F81019A7405369611EEC -:102F20009BB3138A928B9B08012A88BF5343D8F81E -:102F30009820981842EA034301F140022146C8F85C -:102F40009800284605EB82025360FFF76FFE08EBFE -:102F50008900C3681B8A43EA845348341E436401D2 -:102F60002E51D5F81C381F43C5F81C78BDE8F883EE -:102F700005EB4917D7F8001B21F40041C7F8001BE7 -:102F8000D5F81C1821EA0303C0E704F13F030B4AFC -:102F90002846214605EB83035A60FFF747FE05EB01 -:102FA0004910D0F8003923F40043C0F80039D5F8AF -:102FB0001C3823EA0707D7E700800010000400024E -:102FC000D0F894201268C0F89820FFF7C7BD000021 -:102FD0005831D0F8903049015B5813F4004004D0C8 -:102FE00013F4001F0CBF0220012070474831D0F8B5 -:102FF000903049015B5813F4004004D013F4001FD3 -:103000000CBF02200120704700EB8101CB68196AD8 -:103010000B6813604B6853607047000000EB81033E -:1030200030B5DD68AA691368D36019B9402B84BF35 -:10303000402313606B8A1468D0F890201C4402EB84 -:103040004110013C09B2B4FBF3F46343033323F0B2 -:10305000030343EAC44343F0C043C0F8103B2B686A -:1030600003F00303012B0ED1D2F8083802EB411014 -:1030700013F4807FD0F8003B14BF43F0805343F03B -:103080000053C0F8003B02EB4112D2F8003B43F082 -:103090000443C2F8003B30BD2DE9F041D0F8906008 -:1030A00005460C4606EB4113D3F8087B3A07C3F8F4 -:1030B000087B08D5D6F814381B0704D500EB81032C -:1030C000DB685B689847FA071FD5D6F81438DB072A -:1030D0001BD505EB8403D968CCB98B69488A5A683B -:1030E000B2FBF0F600FB16228AB91868DA68904243 -:1030F0000DD2121AC3E90024202383F3118821463C -:103100002846FFF78BFF84F31188BDE8F081012387 -:1031100003FA04F26B8923EA02036B81CB68002B6C -:10312000F3D021462846BDE8F041184700EB810363 -:103130004A0170B5DD68D0F890306C692668E660A9 -:1031400056BB1A444FF40020C2F810092A6802F056 -:103150000302012A0AB20ED1D3F8080803EB421485 -:1031600010F4807FD4F8000914BF40F0805040F084 -:103170000050C4F8000903EB4212D2F8000940F0F5 -:103180000440C2F800090122D3F8340802FA01F120 -:103190000143C3F8341870BD19B9402E84BF4020D4 -:1031A000206020681A442E8A8419013CB4FBF6F48E -:1031B00040EAC44040F00050C6E700002DE9F0416D -:1031C000D0F8906004460D4606EB4113D3F8087919 -:1031D000C3F80879FB071CD5D6F81038DA0718D5DC -:1031E00000EB8103D3F80CC0DCF81430D3F800E016 -:1031F000DA6896451BD2A2EB0E024FF000081A6067 -:10320000C3F80480202383F31188FFF78FFF88F32E -:1032100011883B0618D50123D6F83428AB40134259 -:1032200012D029462046BDE8F041FFF7C3BC012378 -:1032300003FA01F2038923EA02030381DCF8083070 -:10324000002BE6D09847E4E7BDE8F0812DE9F84F80 -:10325000D0F8905004466E69AB691E4016F4805851 -:103260006E6103D0BDE8F84FFEF742BC002E12DAC3 -:10327000D5F8003E9F0705D0D5F8003E23F00303A4 -:10328000C5F8003ED5F80438204623F00103C5F800 -:103290000438FEF759FC300505D52046FFF75EFCE3 -:1032A0002046FEF741FCB1040CD5D5F8083813F0E0 -:1032B000060FEB6823F470530CBF43F4105343F430 -:1032C000A053EB60320704D56368DB680BB120467E -:1032D0009847F30200F1BA80B70226D5D4F890904F -:1032E00000274FF0010A09EB4712D2F8003B03F424 -:1032F0004023B3F5802F11D1D2F8003B002B0DDA1B -:1033000062890AFA07F322EA0303638104EB870365 -:10331000DB68DB6813B13946204698470137D4F89B -:103320009430FFB29B689F42DDD9F00619D5D4F8DE -:103330009000026AC2F30A1702F00F0302F4F012BF -:10334000B2F5802F00F0CC80B2F5402F09D104EB0C -:103350008303002200F58050DB681B6A974240F02F -:10336000B2803003D5F8185835D5E90303D50021CC -:103370002046FFF791FEAA0303D501212046FFF75F -:103380008BFE6B0303D502212046FFF785FE2F033A -:1033900003D503212046FFF77FFEE80203D5042171 -:1033A0002046FFF779FEA90203D505212046FFF745 -:1033B00073FE6A0203D506212046FFF76DFE2B023D -:1033C00003D507212046FFF767FEEF0103D508214B -:1033D0002046FFF761FE700340F1A980E90703D59D -:1033E00000212046FFF7EAFEAA0703D50121204667 -:1033F000FFF7E4FE6B0703D502212046FFF7DEFE50 -:103400002F0703D503212046FFF7D8FEEE0603D58C -:1034100004212046FFF7D2FEA80603D50521204649 -:10342000FFF7CCFE690603D506212046FFF7C6FE4E -:103430002A0603D507212046FFF7C0FEEB0576D507 -:1034400020460821BDE8F84FFFF7B8BED4F89090A9 -:1034500000274FF0010AD4F894305FFA87FB9B688D -:103460009B453FF639AF09EB4B13D3F8002902F423 -:103470004022B2F5802F24D1D3F80029002A20DA87 -:10348000D3F8002942F09042C3F80029D3F800296C -:10349000002AFBDB5946D4F89000FFF7C7FB2289CE -:1034A0000AFA0BF322EA0303238104EB8B03DB68A4 -:1034B0009B6813B159462046984759462046FFF766 -:1034C00079FB0137C7E7910701D1D0F80080072ABF -:1034D00002F101029CBF03F8018B4FEA18283DE777 -:1034E00004EB830300F58050DA68D2F818C0DCF8EA -:1034F0000820DCE9001CA1EB0C0C00218F4208D154 -:10350000DB689B699A683A449A605A683A445A6000 -:1035100027E711F0030F01D1D0F800808C4501F1AD -:10352000010184BF02F8018B4FEA1828E6E7BDE8E5 -:10353000F88F000008B50348FFF788FEBDE8084093 -:10354000FFF784BA044E002008B50348FFF77EFE5B -:10355000BDE80840FFF77ABAA04E0020D0F89030BE -:1035600003EB4111D1F8003B43F40013C1F8003BD9 -:1035700070470000D0F8903003EB4111D1F80039CA -:1035800043F40013C1F8003970470000D0F89030C0 -:1035900003EB4111D1F8003B23F40013C1F8003BC9 -:1035A00070470000D0F8903003EB4111D1F800399A -:1035B00023F40013C1F8003970470000090100F13D -:1035C0006043012203F56143C9B283F8001300F0A0 -:1035D0001F039A4043099B0003F1604303F56143D5 -:1035E000C3F880211A60704730B50433039C017220 -:1035F000002104FB0325C160C0E90653049B03635B -:10360000059BC0E90000C0E90422C0E90842C0E906 -:103610000A11436330BD00000022416AC260C0E964 -:103620000411C0E90A226FF00101FEF7EBBD0000B2 -:10363000D0E90432934201D1C2680AB9181D70471B -:1036400000207047036919600021C2680132C2601E -:10365000C269134482699342036124BF436A0361D0 -:10366000FEF7C4BD38B504460D46E3683BB1626958 -:103670000020131D1268A3621344E36207E0237A5B -:1036800033B929462046FEF7A1FD0028EDDA38BD02 -:103690006FF00100FBE70000C368C269013BC36033 -:1036A0004369134482699342436124BF436A43617F -:1036B00000238362036B03B11847704770B5202362 -:1036C000044683F31188866A3EB9FFF7CBFF0546AF -:1036D00018B186F31188284670BDA36AE26A13F810 -:1036E000015B9342A36202D32046FFF7D5FF00237C -:1036F00083F31188EFE700002DE9F84F04460E46EA -:10370000174698464FF0200989F311880025AA46EC -:10371000D4F828B0BBF1000F09D141462046FFF78D -:10372000A1FF20B18BF311882846BDE8F88FD4E9BA -:103730000A12A7EB050B521A934528BF9346BBF11B -:10374000400F1BD9334601F1400251F8040B91425E -:1037500043F8040BF9D1A36A403640354033A362E5 -:10376000D4E90A239A4202D32046FFF795FF8AF351 -:103770001188BD42D8D289F31188C9E730465A462C -:10378000FDF720FBA36A5E445D445B44A362E7E768 -:1037900010B5029C0433017204FB0321C460C0E92C -:1037A00006130023C0E90A33039B0363049BC0E9AB -:1037B0000000C0E90422C0E90842436310BD0000D4 -:1037C000026A6FF00101C260426AC0E9042200226D -:1037D000C0E90A22FEF716BDD0E904239A4201D1BE -:1037E000C26822B9184650F8043B0B6070470020AD -:1037F00070470000C3680021C2690133C360436998 -:10380000134482699342436124BF436A4361FEF7D4 -:10381000EDBC000038B504460D46E3683BB12369B2 -:1038200000201A1DA262E2691344E36207E0237AD2 -:1038300033B929462046FEF7C9FC0028EDDA38BD29 -:103840006FF00100FBE7000003691960C268013AEC -:10385000C260C269134482699342036124BF436A10 -:10386000036100238362036B03B1184770470000B4 -:1038700070B520230D460446114683F31188866AED -:103880002EB9FFF7C7FF10B186F3118870BDA36A88 -:103890001D70A36AE26A01339342A36204D3E16913 -:1038A00020460439FFF7D0FF002080F31188EDE7B0 -:1038B0002DE9F84F04460D46904699464FF0200AF0 -:1038C0008AF311880026B346A76A4FB949462046B5 -:1038D000FFF7A0FF20B187F311883046BDE8F88FCD -:1038E000D4E90A073A1AA8EB0607974228BF1746F9 -:1038F000402F1BD905F1400355F8042B9D4240F899 -:10390000042BF9D1A36A40364033A362D4E90A23D9 -:103910009A4204D3E16920460439FFF795FF8BF3FF -:1039200011884645D9D28AF31188CDE729463A460F -:10393000FDF748FAA36A3D443E443B44A362E5E7F1 -:10394000D0E904239A4217D1C3689BB1836A8BB133 -:10395000043B9B1A0ED01360C368013BC360C3696C -:103960001A4483699A42026124BF436A03610023B7 -:1039700083620123184670470023FBE700F0DAB8A2 -:10398000034B002258631A610222DA60704700BFBD -:10399000000C0040014B0022DA607047000C004030 -:1039A000014B5863704700BF000C0040014B586A40 -:1039B000704700BF000C00404B6843608B68836019 -:1039C000CB68C3600B6943614B6903628B694362D7 -:1039D0000B6803607047000008B53C4B40F2FF7174 -:1039E0003B48D3F888200A43C3F88820D3F88820BE -:1039F00022F4FF6222F00702C3F88820D3F888205F -:103A0000D3F8E0200A43C3F8E020D3F808210A43A2 -:103A1000C3F808212F4AD3F808311146FFF7CCFF2D -:103A200000F5806002F11C01FFF7C6FF00F5806021 -:103A300002F13801FFF7C0FF00F5806002F1540188 -:103A4000FFF7BAFF00F5806002F17001FFF7B4FFE5 -:103A500000F5806002F18C01FFF7AEFF00F5806099 -:103A600002F1A801FFF7A8FF00F5806002F1C40190 -:103A7000FFF7A2FF00F5806002F1E001FFF79CFF75 -:103A800000F5806002F1FC01FFF796FF02F58C71F2 -:103A900000F58060FFF790FF00F000F90E4BD3F8BF -:103AA000902242F00102C3F89022D3F8942242F00F -:103AB0000102C3F894220522C3F898204FF0605207 -:103AC000C3F89C20054AC3F8A02008BD0044025852 -:103AD000000002585C43000800ED00E01F000803EE -:103AE00008B500F0F3FAFEF7E1FA0F4BD3F8DC204B -:103AF00042F04002C3F8DC20D3F8042122F0400257 -:103B0000C3F80421D3F80431084B1A6842F00802C4 -:103B10001A601A6842F004021A60FEF749FFBDE815 -:103B20000840FEF7EBBC00BF0044025800180248F2 -:103B300070470000114BD3F8E82042F00802C3F8A8 -:103B4000E820D3F8102142F00802C3F810210C4AF3 -:103B5000D3F81031D36B43F00803D363C722094B6A -:103B60009A624FF0FF32DA6200229A615A63DA6099 -:103B70005A6001225A611A60704700BF004402581F -:103B80000010005C000C0040094A08B51169D368B8 -:103B90000B40D9B29B076FEA0101116107D52023C1 -:103BA00083F31188FEF7A2FA002383F3118808BD7E -:103BB000000C0040384B4FF0FF31D3F88020C3F8A1 -:103BC0008010D3F880200022C3F88020D3F8800032 -:103BD000D3F88400C3F88410D3F88400C3F8842099 -:103BE000D3F88400D86F40F0FF4040F4FF0040F469 -:103BF0003F5040F03F00D867D86F20F0FF4020F4DE -:103C0000FF0020F43F5020F03F00D867D86FD3F872 -:103C100088006FEA40506FEA5050C3F88800D3F82C -:103C20008800C0F30A00C3F88800D3F88800D3F8EE -:103C30009000C3F89010D3F89000C3F89020D3F808 -:103C40009000D3F89400C3F89410D3F89400C3F80C -:103C50009420D3F89400D3F89800C3F89810D3F8C0 -:103C60009800C3F89820D3F89800D3F88C00C3F8D4 -:103C70008C10D3F88C00C3F88C20D3F88C00D3F8C8 -:103C80009C00C3F89C10D3F89C10C3F89C20D3F878 -:103C90009C3000F0E7B900BF00440258614B01229C -:103CA000C3F80821604BD3F8F42042F00202C3F8B5 -:103CB000F420D3F81C2142F00202C3F81C21022296 -:103CC000D3F81C31594BDA605A689104FCD5584A34 -:103CD0001A6001229A60574ADA6000221A614FF492 -:103CE00040429A61514B9A699204FCD51A6842F499 -:103CF00080721A604C4B1A6F12F4407F04D04FF45C -:103D000080321A6700221A671A6842F001021A60AC -:103D1000454B1A685007FCD500221A611A6912F047 -:103D20003802FBD1012119604FF0804159605A6778 -:103D3000414ADA62414A1A611A6842F480321A60D2 -:103D4000394B1A689103FCD51A6842F480521A6004 -:103D50001A689204FCD53A4A3A499A6200225A6398 -:103D600019633949DA6399635A64384A1A64384ADC -:103D7000DA621A6842F0A8521A602B4B1A6802F0F5 -:103D80002852B2F1285FF9D148229A614FF4886233 -:103D9000DA6140221A622F4ADA644FF080521A65C3 -:103DA0002D4A5A652D4A9A6532232D4A13601368AD -:103DB00003F00F03022BFAD11B4B1A6942F00302E6 -:103DC0001A611A6902F03802182AFAD1D3F8DC20F5 -:103DD00042F00052C3F8DC20D3F8042142F0005234 -:103DE000C3F80421D3F80421D3F8DC2042F0804248 -:103DF000C3F8DC20D3F8042142F08042C3F8042148 -:103E0000D3F80421D3F8DC2042F00042C3F8DC20D0 -:103E1000D3F8042142F00042C3F80421D3F804315E -:103E2000704700BF0080005100440258004802580B -:103E300000C000F0020000010000FF0100889008AF -:103E400032206000630209011D02040047040508D6 -:103E5000FD0BFF01200000200010E0000001010028 -:103E6000002000524FF0B04208B5D2F8883003F07D -:103E70000103C2F8883023B1044A13680BB15068BB -:103E80009847BDE80840FEF7E1BD00BF544F002051 -:103E90004FF0B04208B5D2F8883003F00203C2F800 -:103EA000883023B1044A93680BB1D0689847BDE8C5 -:103EB0000840FEF7CBBD00BF544F00204FF0B0428A -:103EC00008B5D2F8883003F00403C2F8883023B173 -:103ED000044A13690BB150699847BDE80840FEF7E2 -:103EE000B5BD00BF544F00204FF0B04208B5D2F826 -:103EF000883003F00803C2F8883023B1044A93697C -:103F00000BB1D0699847BDE80840FEF79FBD00BFE0 -:103F1000544F00204FF0B04208B5D2F8883003F07B -:103F20001003C2F8883023B1044A136A0BB1506AF7 -:103F30009847BDE80840FEF789BD00BF544F0020F8 -:103F40004FF0B04310B5D3F8884004F47872C3F84A -:103F50008820A30604D5124A936A0BB1D06A984709 -:103F6000600604D50E4A136B0BB1506B98472106BF -:103F700004D50B4A936B0BB1D06B9847E20504D57F -:103F8000074A136C0BB1506C9847A30504D5044A3B -:103F9000936C0BB1D06C9847BDE81040FEF756BD4E -:103FA000544F00204FF0B04310B5D3F8884004F4CC -:103FB0007C42C3F88820620504D5164A136D0BB104 -:103FC000506D9847230504D5124A936D0BB1D06DFF -:103FD0009847E00404D50F4A136E0BB1506E984712 -:103FE000A10404D50B4A936E0BB1D06E98476204BE -:103FF00004D5084A136F0BB1506F9847230404D5BA -:10400000044A936F0BB1D06F9847BDE81040FEF79C -:104010001DBD00BF544F002008B50348FDF70AF945 -:10402000BDE80840FEF712BDCC23002008B50348C8 -:10403000FDF700F9BDE80840FEF708BD3824002070 -:1040400008B50348FDF7F6F8BDE80840FEF7FEBCEA -:10405000A424002008B5FFF797FDBDE80840FEF74F -:10406000F5BC0000062108B50846FFF7A7FA0621AF -:104070000720FFF7A3FA06210820FFF79FFA062181 -:104080000920FFF79BFA06210A20FFF797FA06217D -:104090001720FFF793FA06212820FFF78FFA09214E -:1040A0007A20FFF78BFA07213220FFF787FA0C21DD -:1040B0002620FFF783FA0C212720FFF77FFA0C2137 -:1040C0005220BDE80840FFF779BA000008B5FFF7B5 -:1040D00071FD00F00DF8FDF7BFFAFDF797FCFDF755 -:1040E00069FBFFF725FDBDE80840FFF747BC00006E -:1040F0000023054A19460133102BC2E9001102F1D1 -:104100000802F8D1704700BF544F002010B50139A4 -:104110000244904201D1002005E0037811F8014FDC -:10412000A34201D0181B10BD0130F2E7034611F87D -:10413000012B03F8012B002AF9D1704753544D335A -:104140003248373F3F3F0053544D333248373433C2 -:104150002F37353300000000C8320020CC23002068 -:1041600038240020A4240020009600000000000055 -:10417000000000000000000000000000000000003F -:1041800000000000211600080D160008491600085E -:1041900035160008411600082D16000819160008EB -:1041A0000516000855160008000000003117000829 -:1041B0001D17000859170008451700085117000877 -:1041C0003D17000829170008151700086517000893 -:1041D0000000000001000000000000006D61696E39 -:1041E0000000000069646C6500000000E441000804 -:1041F00050310020C832002001000000A920000832 -:10420000000000004865782F50726F6669434E4386 -:104210000025424F415244252D424C002553455222 -:1042200049414C2500000000020000000000000091 -:1042300051190008C119000840004000704B0020CF -:10424000804B00200200000000000000030000007E -:1042500000000000091A0008000000001000000023 -:10426000904B002000000000010000000000000052 -:10427000044E00200101020099240008A92300082F -:10428000452400082924000843000000904200084B -:1042900009024300020100C03209040000010202C9 -:1042A000010005240010010524010001042402027C -:1042B0000524060001070582030800FF0904010028 -:1042C000020A000000070501024000000705810204 -:1042D0004000000012000000DC4200081201100142 -:1042E00002000040AE2D1610000201020301000082 -:1042F0000403090425424F41524425004375626579 -:104300004F72616E67652D626473686F740030313F -:10431000323334353637383941424344454600005C -:10432000000000005D1B0008151E0008C11E0008EB -:10433000400040003C4F00203C4F002001000000A6 -:104340004C4F0020800000004001000008000000E9 -:104350000001000000040000080000000000812AA5 -:1043600000000000AAAAAAAA00000024FFFE000084 -:104370000000000000A00A00000100000000000092 -:10438000AAAAAAAA00000000FFFF00000000000087 -:10439000000000001400005400000000AAAAAAAA0D -:1043A00014000054FFFF00000000000000000000A7 -:1043B00000681A0000000000AAAA8AAA005415008A -:1043C000FFFF00000000700777000000408102003E -:1043D00000000000AAAAAAAA00410100F7FF0000FD -:1043E0000000007007000000000000000000000056 -:1043F000AAAAAAAA00000000FFFF00000000000017 -:10440000000000000000000000000000AAAAAAAA04 -:1044100000000000FFFF000000000000000000009E -:104420000000000000000000AAAAAAAA00000000E4 -:10443000FFFF00000000000000000000000000007E -:1044400000000000AAAAAAAA00000000FFFF0000C6 -:10445000000000000000000000000000000000005C -:10446000AAAAAAAA00000000FFFF000000000000A6 -:10447000000000000000000000000000AAAAAAAA94 -:1044800000000000FFFF000000000000000000002E -:104490008C0000000000000000001E000000000072 -:1044A000FF000000000000003C4100083F00000049 -:1044B00050040000474100083F0000000096000043 -:1044C0000000080096000000000800000400000042 -:1044D000F0420008000000000000000000000000A2 -:0C44E000000000000000000000000000D0 +:1000000000060020E1020008E3020008E302000805 +:10001000E3020008E3020008E3020008E30200082C +:10002000E3020008E3020008E3020008ED7600089E +:10003000E3020008E3020008E3020008E30200080C +:10004000E3020008E3020008E3020008E3020008FC +:10005000E3020008E3020008F9850008258600088D +:10006000518600087D860008A98600080946000818 +:10007000314600085D46000889460008B54600087C +:10008000DD46000809470008E3020008E302000813 +:10009000E3020008E3020008E3020008D586000836 +:1000A000E3020008E3020008E3020008E30200089C +:1000B000E3020008E3020008E3020008E30200088C +:1000C000E3020008E3020008E3020008E30200087C +:1000D000E3020008E3020008C1870008D587000892 +:1000E00039870008E3020008E3020008E302000881 +:1000F000E3020008E3020008E302000835470008B5 +:10010000E3020008AD870008FD870008E30200084D +:10011000E3020008E3020008E3020008E30200082B +:100120006147000889470008B5470008E147000813 +:100130000D480008E3020008E3020008E30200089B +:10014000E3020008E3020008E3020008E3020008FB +:1001500035480008614800088D480008E30200089F +:10016000E3020008E3020008E3020008E3020008DB +:10017000E3020008D9820008E3020008E302000855 +:10018000E3020008E3020008E9870008E302000830 +:10019000E3020008E3020008E3020008E3020008AB +:1001A000E3020008E3020008E3020008E30200089B +:1001B000E3020008E3020008E3020008E30200088B +:1001C000E3020008E3020008E3020008E30200087B +:1001D000E3020008C5820008E3020008E302000809 +:1001E000E3020008E3020008E3020008E30200085B +:1001F000E3020008E3020008E3020008E30200084B +:10020000E3020008E3020008E3020008E30200083A +:10021000E3020008E3020008E3020008E30200082A +:10022000E3020008E3020008E3020008E30200081A +:10023000E3020008E3020008E3020008E30200080A +:10024000E3020008E3020008E3020008E3020008FA +:10025000E3020008E3020008E3020008E3020008EA +:10026000E3020008E3020008E3020008E3020008DA +:10027000E3020008E3020008E3020008E3020008CA +:10028000E3020008E3020008E3020008E3020008BA +:10029000E3020008E3020008E3020008E3020008AA +:1002A000E3020008E3020008E3020008E30200089A +:1002B000E3020008E3020008E3020008E30200088A +:1002C000E3020008E3020008E3020008E30200087A +:1002D000E3020008E3020008E3020008E30200086A +:1002E00002E000F000F8FEE772B6374880F30888B5 +:1002F000364880F3098836483649086040F20000E5 +:10030000CCF200004EF63471CEF200010860BFF36B +:100310004F8FBFF36F8F40F20000C0F2F0004EF637 +:100320008851CEF200010860BFF34F8FBFF36F8F8B +:100330004FF00000E1EE100A4EF63C71CEF20001E3 +:100340000860062080F31488BFF36F8F07F030FA3F +:1003500006F0A4FB4FF055301F491B4A91423CBFA9 +:1003600041F8040BFAE71D49184A91423CBF41F895 +:10037000040BFAE71A491B4A1B4B9A423EBF51F83D +:10038000040B42F8040BF8E700201849184A914280 +:100390003CBF41F8040BFAE707F048FA06F002FC0C +:1003A000144C154DAC4203DA54F8041B8847F9E7A6 +:1003B00000F0C4F9114C124DAC4203DA54F8041B9E +:1003C0008847F9E707F030BA000600200022002035 +:1003D0000000000808ED00E00000002000060020FA +:1003E000A09C000800220020742200207822002017 +:1003F00034670020E0020008E0020008E002000884 +:10040000E00200082DE9F04F2DED108AC1F80CD064 +:10041000D0F80CD0BDEC108ABDE8F08F002383F338 +:1004200011882846A047002006F01AF9FEE706F0DA +:1004300073F800DFFEE7000053B94AB9002908BF8E +:1004400000281CBF4FF0FF314FF0FF3000F074B9AF +:10045000ADF1080C6DE904CE00F006F8DDF804E01B +:10046000DDE9022304B070472DE9F047089D0446FA +:100470008E46002B4DD18A42944669D9B2FA82F257 +:1004800052B101FA02F3C2F1200120FA01F10CFA93 +:1004900002FC41EA030E94404FEA1C48210CBEFBCB +:1004A000F8F61FFA8CF708FB16E341EA034306FB54 +:1004B00007F199420AD91CEB030306F1FF3080F0E3 +:1004C0001F81994240F21C81023E63445B1AA4B230 +:1004D000B3FBF8F008FB103344EA034400FB07F7D2 +:1004E000A7420AD91CEB040400F1FF3380F00A8113 +:1004F000A74240F207816444023840EA0640E41B08 +:1005000000261DB1D4400023C5E900433146BDE8B3 +:10051000F0878B4209D9002D00F0EF800026C5E955 +:10052000000130463146BDE8F087B3FA83F6002E6D +:100530004AD18B4202D3824200F2F980841A61EBE5 +:10054000030301209E46002DE0D0C5E9004EDDE703 +:1005500002B9FFDEB2FA82F2002A40F09280A1EBEB +:100560000C014FEA1C471FFA8CFE0126200CB1FB40 +:10057000F7F307FB131140EA01410EFB03F0884239 +:1005800008D91CEB010103F1FF3802D2884200F2C6 +:10059000CB804346091AA4B2B1FBF7F007FB101158 +:1005A00044EA01440EFB00FEA64508D91CEB0404F6 +:1005B00000F1FF3102D2A64500F2BB800846A4EB51 +:1005C0000E0440EA03409CE7C6F12007B34022FA3C +:1005D00007FC4CEA030C20FA07F401FA06F31C436B +:1005E000F9404FEA1C4900FA06F3B1FBF9F8200C78 +:1005F0001FFA8CFE09FB181140EA014108FB0EF0BE +:10060000884202FA06F20BD91CEB010108F1FF3A0D +:1006100080F08880884240F28580A8F10208614419 +:10062000091AA4B2B1FBF9F009FB101144EA014127 +:1006300000FB0EFE8E4508D91CEB010100F1FF34D2 +:100640006CD28E456AD90238614440EA0840A0FB6A +:100650000294A1EB0E01A142C846A64656D353D040 +:100660005DB1B3EB080261EB0E0101FA07F722FA64 +:1006700006F3F1401F43C5E9007100263146BDE88D +:10068000F087C2F12003D8400CFA02FC21FA03F3F0 +:10069000914001434FEA1C471FFA8CFEB3FBF7F071 +:1006A00007FB10360B0C43EA064300FB0EF69E4296 +:1006B00004FA02F408D91CEB030300F1FF382FD22F +:1006C0009E422DD9023863449B1B89B2B3FBF7F6D7 +:1006D00007FB163341EA034106FB0EF38B4208D9B0 +:1006E0001CEB010106F1FF3816D28B4214D9023EF1 +:1006F0006144C91A46EA004638E72E46284605E70F +:100700000646E3E61846F8E64B45A9D2B9EB0208DF +:1007100064EB0C0E0138A3E74646EAE7204694E76F +:100720004046D1E7D0467BE7023B614432E73046A2 +:1007300009E76444023842E7704700BF38B501F06A +:10074000FFF901F0AFFB06F0BFFE054606F0C4FF5F +:100750000446D0B90F4B9D4219D001339D4241F25E +:10076000883504BF01240025002006F0B7FE0CB137 +:1007700000F078F801F036FB00F026FD08B100F03B +:1007800071F8284600F01CF9F9E70025ECE705466A +:10079000EAE700BF010007B008B501F09DF9A0F13C +:1007A00020035842584108BD07B541F21203022107 +:1007B00001A8ADF8043001F0ADF903B05DF804FB19 +:1007C00038B5302383F31188174803680BB106F05E +:1007D0002BF80023154A4FF47A71134806F01AF8E3 +:1007E000002383F31188124C236813B12368013B63 +:1007F0002360636813B16368013B63600D4D2B7820 +:1008000033B963687BB9022001F056FA3223636082 +:100810002B78032B07D163682BB9022001F04CFA27 +:100820004FF47A73636038BD78220020C107000856 +:100830009823002090220020084B187003280CD821 +:10084000DFE800F008050208022001F02BBA0220C0 +:1008500001F01EBA024B00225A607047902200201D +:1008600098230020F8B5504B504A1C4619680131B6 +:1008700000F0998004339342F8D162684C4B9A425D +:1008800040F291804B4B9B6803F1006303F500330A +:100890009A4280F08880002001F06CF90220FFF776 +:1008A000CBFF454B0021D3F8E820C3F8E810D3F87C +:1008B0001021C3F81011D3F81021D3F8EC20C3F89D +:1008C000EC10D3F81421C3F81411D3F81421D3F881 +:1008D000F020C3F8F010D3F81821C3F81811D3F89A +:1008E0001821D3F8802042F00062C3F88020D3F8AA +:1008F000802022F00062C3F88020D3F88020D3F853 +:10090000802042F00072C3F88020D3F8802022F0CB +:100910000072C3F88020D3F8803072B64FF0E02325 +:10092000C3F8084DD4E90004BFF34F8FBFF36F8FB6 +:10093000224AC2F88410BFF34F8F536923F48033E7 +:100940005361BFF34F8FD2F8803043F6E076C3F3A4 +:10095000C905C3F34E335B0103EA060C29464CEA92 +:1009600081770139C2F87472F9D2203B13F1200F5C +:10097000F2D1BFF34F8FBFF36F8FBFF34F8FBFF332 +:100980006F8F536923F4003353610023C2F8503250 +:10099000BFF34F8FBFF36F8F302383F311888546EA +:1009A00080F308882047F8BD0000020820000208F4 +:1009B000FFFF0108002200200044025800ED00E083 +:1009C0002DE9F04F93B0B44B2022FF2100900AA8EC +:1009D0009D6801F0B1F9B14A1378A3B90121B0487B +:1009E00011700360302383F3118803680BB105F0A5 +:1009F0001BFF0023AB4A4FF47A71A94805F00AFFA8 +:100A0000002383F31188009B13B1A74B009A1A604F +:100A1000A64A1378032B03D000231370A24A536015 +:100A20004FF0000A009CD3465646D146012001F003 +:100A300039F924B19C4B1B68002B00F02682002062 +:100A400001F04AF80390039B002BF2DB012001F038 +:100A50001FF9039B213B1F2BE8D801A252F823F07A +:100A6000E10A0008090B00089D0B00082D0A000888 +:100A70002D0A00082D0A00082F0C0008FF0D0008A1 +:100A8000190D00087B0D0008A30D0008C90D000812 +:100A90002D0A0008DB0D00082D0A00084D0E000885 +:100AA000810B00082D0A0008910E0008ED0A0008CD +:100AB000810B00082D0A00087B0D00082D0A000894 +:100AC0002D0A00082D0A00082D0A00082D0A00082A +:100AD0002D0A00082D0A00082D0A00089D0B0008A9 +:100AE0000220FFF759FE002840F0F981009B022107 +:100AF00005A8BAF1000F08BF1C4641F21233ADF849 +:100B0000143001F007F891E74FF47A7000F0E4FF39 +:100B1000071EEBDB0220FFF73FFE0028E6D0013F77 +:100B2000052F00F2DE81DFE807F0030A0D1013360F +:100B30000523042105A8059300F0ECFF17E004212C +:100B40005548F9E704215A48F6E704215948F3E7E4 +:100B50004FF01C08404608F1040801F00DF804218C +:100B6000059005A800F0D6FFB8F12C0FF2D10120B6 +:100B70004FF0000900FA07F747EA0B0B5FFA8BFB0F +:100B800001F026F926B10BF00B030B2B08BF002454 +:100B9000FFF70AFE4AE704214748CDE7002EA5D01B +:100BA0000BF00B030B2BA1D10220FFF7F5FD07463D +:100BB00000289BD00120002600F0DCFF0220FFF778 +:100BC0003BFE1FFA86F8404600F0E4FF0446B0B151 +:100BD000039940460136A1F140025142514100F0D3 +:100BE000E9FF0028EDD1BA46044641F21213022172 +:100BF00005A83E46ADF8143000F08CFF16E72546F8 +:100C00000120FFF719FE244B9B68AB4207D9284609 +:100C100000F0B2FF013040F067810435F3E70025B2 +:100C2000224BBA463E461D701F4B5D60A8E7002E62 +:100C30003FF45CAF0BF00B030B2B7FF457AF02209C +:100C4000FFF7FAFD322000F047FFB0F10008FFF691 +:100C50004DAF18F003077FF449AF0F4A08EB0503C7 +:100C6000926893423FF642AFB8F5807F3FF73EAFC0 +:100C7000124BB845019323DD4FF47A7000F02CFF3E +:100C80000390039A002AFFF631AF039A0137019BC4 +:100C900003F8012BEDE700BF002200209423002081 +:100CA00078220020C107000898230020902200200D +:100CB00004220020082200200C2200209422002080 +:100CC000C820FFF769FD074600283FF40FAF1F2D2E +:100CD00011D8C5F120020AAB25F003008449424532 +:100CE000184428BF4246019201F000F8019AFF2102 +:100CF0007F4801F021F84FEAA803C8F387027C4936 +:100D00002846019301F020F8064600283FF46DAF15 +:100D1000019B05EB830533E70220FFF73DFD00282B +:100D20003FF4E4AE00F064FF00283FF4DFAE00279C +:100D3000B846704B9B68BB4218D91F2F11D80A9B2D +:100D400001330ED027F0030312AA134453F8203CBA +:100D500005934046042205A9043701F003F98046B3 +:100D6000E7E7384600F008FF0590F2E7CDF8148079 +:100D7000042105A800F0CEFE02E70023642104A8A8 +:100D8000049300F0BDFE00287FF4B0AE0220FFF710 +:100D900003FD00283FF4AAAE049800F01FFF059061 +:100DA000E6E70023642104A8049300F0A9FE0028CC +:100DB0007FF49CAE0220FFF7EFFC00283FF496AED4 +:100DC000049800F00DFFEAE70220FFF7E5FC002899 +:100DD0003FF48CAE00F01CFFE1E70220FFF7DCFCE3 +:100DE00000283FF483AE05A9142000F017FF074642 +:100DF0000421049004A800F08DFE3946B9E73220A2 +:100E000000F06AFE071EFFF671AEBB077FF46EAE00 +:100E1000384A07EB0903926893423FF667AE022017 +:100E2000FFF7BAFC00283FF461AE27F003074F44F8 +:100E3000B9453FF4A5AE484609F1040900F09CFE0F +:100E40000421059005A800F065FEF1E74FF47A70E3 +:100E5000FFF7A2FC00283FF449AE00F0C9FE0028CD +:100E600044D00A9B01330BD008220AA9002000F0CD +:100E70006BFF00283AD02022FF210AA800F05CFF77 +:100E8000FFF792FC1C4805F0F1FB13B0BDE8F08FB2 +:100E9000002E3FF42BAE0BF00B030B2B7FF426AE92 +:100EA0000023642105A8059300F02AFE07460028C8 +:100EB0007FF41CAE0220FFF76FFC804600283FF451 +:100EC00015AEFFF771FC41F2883005F0CFFB0598B5 +:100ED00000F0C6FF46463C4600F07AFFA6E506460F +:100EE0004EE64FF0000901E6BA467EE637467CE65C +:100EF0009422002000220020A086010070470000FC +:100F000070470000704700002DE9F04100F5803780 +:100F1000044616463B7C5BB9C0681030204400F0A4 +:100F2000E5FEE5683544B5F5004FE56002D816B139 +:100F3000BDE8F081DEB905F07F0605F11000002163 +:100F4000C6F180062044F6B232462E4400F0F4FE8C +:100F5000A06804F11008324600F10060414600F537 +:100F6000003006F05DF830B901233B74E0E74FF440 +:100F700000463546ECE7A26805F1100140463244D0 +:100F80002144A260E268521BE26000F0AFFE022042 +:100F9000BDE8F04100F090BE183000F0E9BC000060 +:100FA00010B5044600F0FAFF204610BD10B5044607 +:100FB00000F0F4FF204610BDC3B280B2A3F141029D +:100FC000052A02D8373800B27047613B052B94BF21 +:100FD00057383038F7E70000F8B50446154608469C +:100FE00003220C4900F08CFE014688B908346F1CBE +:100FF00015F91100FFF7E0FF064617F9110001315E +:10100000FFF7DAFF102940EA061004F8010BEFD1D0 +:10101000F8BD00BF509200082DE9F04FADF53F7DBF +:101020000746416801222AA802F09AFE002840F0F3 +:1010300087800646824681461125DFF80C81DFF85D +:101040000CB101AB4FF4805241462AA802F0E8FFF0 +:10105000002875D1019AB2F5805F71D8002A65D059 +:101060000446019A9442ECD2282D0FD008DC132DAF +:101070002DD01E2D39D0112D13D00134A4B2F0E79C +:10108000322D2DD0372D2FD02D2DF6D13B68121BB0 +:1010900008EB040138461B692D259847BDF804402C +:1010A000EBE7121B022A09D9594608EB040000F0AD +:1010B00027FE18B902342825A4B2DEE718F8043058 +:1010C0003A2B3DD00A2B1CBFA1461325D5E718F8B3 +:1010D00004300A2B34D03A2B04BFA2463225CCE789 +:1010E00018F80430202BC8D0264618F804300A2BF4 +:1010F0001AD1AAEB090208EB090102A811254F2A0F +:1011000028BF4F2208F090F8A21B08EB060116A892 +:101110004F2A28BF4F2208F087F83B6816AA02A979 +:10112000DB6838469847A8E71E25A6E73B6838469F +:1011300004491B69984701200DF53F7DBDE8F08FFC +:101140000020F9E752930008A023002054920008E1 +:1011500000F1180110B5044686B00846019100F070 +:10116000F1FB2046FFF758FF60B1019902A800F09B +:1011700049FC102204F1080102A808F015F8B0FAA1 +:1011800080F0400906B010BD70B504460025EEB2EF +:10119000304600F0FFFC58B100213046013500F028 +:1011A00009FD08B9002070BD022000F085FDEEE7C2 +:1011B0002046FFF731FF0028F4D004F58034207C6E +:1011C00080F00100EFE70000F0B5C9B006F094F937 +:1011D00000F000FF18B90025284649B0F0BD694667 +:1011E0002A4802F0DFFF00284BD1294C204603F0AB +:1011F00009F8284803F006F8274803F003F82146C9 +:10120000224803F07BF80028E5D1702000F0C0FEF2 +:10121000064610B1214B44600360336830469B683A +:101220009847054600282ED01A4F1948394603F032 +:1012300065F805460028CED1194800F0A9FE0446FD +:1012400038B1184B4760036000F58033C0E90255A0 +:101250001D74236820469B689847054628B10E49AF +:101260000C4803F04BF80028B5D1336830465B6872 +:1012700098471CB1236820465B68984700F092FEAF +:10128000AAE70025FAE70446EFE700BF58920008F6 +:10129000689200087F92000895920008B8920008B2 +:1012A00014000100D49200082DE9F04FD44A8DB00B +:1012B0000B68D0F804A001931A440368D14E1A4475 +:1012C000D1F81C90DFF8B4C3DFF8B4B3D0E902342E +:1012D000634003EA0A03634013444A6802920AEB3C +:1012E0007363029CC84A2244C468224484688AEA20 +:1012F00004051D40654015448A68039203EB35558B +:10130000039CC24A2244846822448AEA03042C4093 +:1013100084EA0A041444CA6805EBF43404921644BF +:1013200083EA0502224056445A4032440E6905962B +:1013300004EBB222059FB64E3E441E4485EA0403E8 +:1013400013406B4033444E69069602EB7363069F6D +:10135000B04E3E442E4484EA02051D4065403544AB +:101360008E69079603EB3555079FAB4E3E442644E6 +:1013700082EA03042C4054403444A84E4E4405EB0A +:10138000F434164483EA050222405A4032440E6A7D +:10139000089604EBB222089FA14E3E441E4485EA03 +:1013A000040313406B4033444E6A099602EB7363A7 +:1013B000099F9C4ED1F830E03E44D1F83880F34488 +:1013C0002E4484EA02051D40654035448E6AA6F528 +:1013D000244703EB35550A964F3F274482EA03041E +:1013E0002C4054403C44CF6A0B9705EBF4340B9EE1 +:1013F0008D4F3744029E174483EA050222405A402B +:101400003A448A4F774404EBB2221F4485EA04032E +:1014100013406B403B444F6BBC4402EB7363654429 +:1014200084EA020C0CEA030C8CEA040C6544DFF835 +:1014300054C2C44403EB3555A44482EA03042C404F +:1014400054406444D1F83CC0794905EBF43461441C +:10145000114483EA050222405A400A44754904EBCC +:10146000B2223144079E194484EA02032B406340B0 +:101470000B44714902EBF36331440B9E0D4482EA45 +:1014800003012140514029446C4D03EBF151354497 +:10149000019E254483EA010414405C402C44684DBD +:1014A00001EBB4443544069E154481EA04021A4017 +:1014B0004A402A44634D04EB323235440A9E1D44AF +:1014C00084EA02030B4063402B445F4D02EBF3635D +:1014D0003544059E0D4482EA0301214051402944D0 +:1014E0005A4D03EBF1516544254483EA010414404D +:1014F0005C402C44564D01EBB4443544099E1544E0 +:1015000081EA04021A404A402A44524D04EB323226 +:101510003544049E1D4484EA02030B4063402B447F +:101520004D4D02EBF36345440D4482EA0301214033 +:1015300051402944494D03EBF1513544089E2C4458 +:1015400083EA010515405D402C44454D01EBB44450 +:101550003544039E2A4481EA04051D404D402A4437 +:10156000404D04EB32323D442B4484EA020593445F +:101570000D4065402B443C4D02EBF3633544069E21 +:10158000294482EA0305254055402944374D03EBA1 +:10159000F1514D442C4483EA010515405D4025443A +:1015A00001EBB54581EA050404EA03024A405A44C6 +:1015B000A6F5B82B089E05EB3232ABF2BE6B544059 +:1015C0005B4423442A4C344402EB33730B9E0C449B +:1015D00085EA020159402144264C344403EB715101 +:1015E000029E254482EA03044C402544224C444494 +:1015F00001EB3545144483EA01026A40224443E08A +:1016000078A46AD7EECEBDC156B7C7E8DB702024F8 +:10161000AF0F7CF52AC68747134630A8019546FDD3 +:10162000D8988069AFF7448BBED75C892211906B44 +:101630002108B44962251EF640B340C0515A5E26C7 +:10164000AAC7B6E95D102FD65314440281E6A1D88B +:10165000C8FBD3E7E6CDE121D60737C3870DD5F424 +:10166000ED145A4505E9E3A9F8A3EFFCD9026F6729 +:1016700081F6718722619D6D0C38E5FD937198FDAF +:101680008A4C2A8D8E4379A6934C344405EB722202 +:10169000059E1C4481EA0503534023448F4C344487 +:1016A00002EB33730A9E0C4485EA0201594021443F +:1016B0008B4C4C4403EB7151254482EA03044C40AB +:1016C0002C44884D354401EB3444019E154483EA93 +:1016D000010262402A44844D3D4404EB72221D44C1 +:1016E00081EA040353402B44804D354402EB3373AD +:1016F000049E294484EA02055D4029447C4D35441A +:1017000003EB7151079E254482EA03044C402C44AC +:10171000784D354401EB3444099E2A4483EA01059F +:1017200065401544744A324404EB7525039E134406 +:1017300081EA04026A401A44704B734405EB32722A +:101740000B4484EA0501514019446D4B634402EB9C +:1017500071511C4485EA02034B401C44694B3344DD +:1017600001EB3444019E1D4482EA010363402B4493 +:10177000654D04EB73233544069E154463EA01026C +:1017800062402A44614D03EBB2624D4462EA0409AF +:1017900029445F4D89EA0309454449442C445D4D81 +:1017A00002EBB1513544049E61EA03081D4488EA06 +:1017B0000208444401EB744464EA02034B402B44A6 +:1017C000554D04EBF323754463EA010E15448EEA8C +:1017D000040E0EEB0502514D03EBB262354462EA92 +:1017E000040E29440A9D8EEA030EA5F580164C4D81 +:1017F0007144A6F6833602EBB151264461EA030434 +:1018000054403444029E01EB7444354464EA0206B9 +:101810001D444E407319089E424D04EBF32335449A +:1018200063EA01061544664072193F4D03EBB2624C +:10183000654462EA040629443C4D5E403144079EFB +:1018400002EBB151354461EA03062C44384D564051 +:101850003D443444059E1D4401EB744464EA020394 +:101860004B402B44334D04EBF32335440B9E15447E +:1018700063EA010262402A442F4D03EBB262354411 +:10188000039E0D4462EA0401594029442B4D02EBAA +:10189000B15135442A4E254461EA030454402C4496 +:1018A000099D01EB74442E4464EA02051E4485EA56 +:1018B00001039D1903681A440AEB040303EBF523A3 +:1018C0000260436083681C44C36819448460C1603B +:1018D0000DB0BDE8F08F00BF44EABEA4A9CFDE4B37 +:1018E000604BBBF670BCBFBEC67E9B28FA27A1EA40 +:1018F0008530EFD4051D880439D0D4D9E599DBE6CD +:10190000F87CA21F6556ACC4442229F497FF2A43F1 +:10191000A72394AB39A093FCC3595B6592CC0C8F81 +:10192000D15D84854F7EA86FE0E62CFE144301A3B1 +:10193000A111084E827E53F735F23ABDBBD2D72AA9 +:1019400091D386EB094B036003F18833436003F1C5 +:101950002943A3F59613A3F68B638360A3F1883321 +:10196000C3600023C0E90433704700BF012345670B +:101970002DE9F8431446026905460E46E300C2F31A +:10198000C50800F118079B18036122BF43690133A2 +:10199000436112F4FC7F436903EB5473436114D039 +:1019A000C8F1400907EB08004C4504D22246BDE8C7 +:1019B000F84307F009BC403C4A464E4407F004FC9B +:1019C000444439462846FFF76FFCA04606EB04095D +:1019D000B8F13F0FA9EB08010AD94022384607F0B9 +:1019E000F3FB39462846A8F14008FFF75DFCEFE716 +:1019F000A1096FF03F02384602FB014206EB81115C +:101A0000D5E7000070B50B6901F1180506460C46D4 +:101A1000C3F3C503EA18501C8022EA54C3F13F0205 +:101A2000072A1FD8002100F087F929462046FFF732 +:101A30003BFC38220021284600F07EF92369294624 +:101A40002046236563696365FFF72EFC214610225B +:101A5000304607F0B9FB204658220021BDE870400F +:101A600000F06AB9C3F137020021E5E72DE9F84F2C +:101A70004FF47A7306460D46002402FB03F7DFF8A5 +:101A80005080DFF8509098F900305FFA84FA5A1CC1 +:101A900001D0A34210D159F824002A4631460368E8 +:101AA000D3F820B03B46D847854205D1074B0120EB +:101AB00083F800A0BDE8F88F0134042CE3D14FF483 +:101AC000FA7004F0D3FD0020F4E700BFE4330020F7 +:101AD0001022002014220020002307B50246012115 +:101AE0000DF107008DF80730FFF7C0FF20B19DF81A +:101AF000070003B05DF804FB4FF0FF30F9E700008A +:101B00000A46042108B5FFF7B1FF80F00100C0B21A +:101B1000404208BD074B0A4630B41978064B53F8CB +:101B20002140014623682046DD69044BAC4630BCA9 +:101B3000604700BFE433002014220020A08601008B +:101B400070B50A4E00240A4D05F00EFA3080286860 +:101B50003388834208D905F003FA2B680444013323 +:101B6000B4F5003F2B60F2D370BD00BFE633002018 +:101B7000A033002005F0C6BA00F1006000F5003087 +:101B80000068704700F10060920000F5003005F039 +:101B900047BA0000054B1A68054B1B889B1A834205 +:101BA00002D9104405F0DCB900207047A0330020B2 +:101BB000E633002038B50446074D29B12868204493 +:101BC000BDE8384005F0E4B92868204405F0CEF9B6 +:101BD0000028F3D038BD00BFA0330020002070479C +:101BE00000F1FF5000F58F10D0F80008704700009A +:101BF000064991F8243033B100230822086A81F89D +:101C00002430FFF7BFBF0120704700BFA43300207E +:101C1000014B1868704700BF0010005C194B013879 +:101C20000322084470B51D68174BC5F30B042D0C37 +:101C30001E88A6420BD15C680A46013C82421346CC +:101C40000FD214F9016F4EB102F8016BF6E7013AB9 +:101C500003F10803ECD181420B4602D22C2203F897 +:101C6000012B0424094A1688AE4204D1984284BF4D +:101C7000967803F8016B013C02F10402F3D1581A83 +:101C800070BD00BF0010005C2422002014930008E7 +:101C9000022803D1024B4FF080529A61704700BF77 +:101CA00000100258022803D1024B4FF480529A616F +:101CB000704700BF00100258022804D1024A53693D +:101CC00083F48053536170470010025870B5044686 +:101CD0004FF47A764CB1412C254628BF412506FBAE +:101CE00005F0641B04F0C2FCF4E770BD002310B5DE +:101CF000934203D0CC5CC4540133F9E710BD00001B +:101D0000013810B510F9013F3BB191F900409C42F8 +:101D100003D11AB10131013AF4E71AB191F9002067 +:101D2000981A10BD1046FCE703460246D01A12F975 +:101D3000011B0029FAD1704702440346934202D0A6 +:101D400003F8011BFAE770472DE9F8431F4D1446CD +:101D50000746884695F8242052BBDFF870909CB364 +:101D600095F824302BB92022FF2148462F62FFF737 +:101D7000E3FF95F824004146C0F1080205EB80001E +:101D8000A24228BF2246D6B29200FFF7AFFF95F8D5 +:101D90002430A41B17441E449044E4B2F6B2082E2B +:101DA00085F82460DBD1FFF723FF0028D7D108E0B6 +:101DB0002B6A03EB82038342CFD0FFF719FF002881 +:101DC000CBD10020BDE8F8830120FBE7A43300203D +:101DD000024B1A78024B1A70704700BFE4330020A0 +:101DE00010220020F8B5194C194803F047FF21468E +:101DF000174803F06FFF24684FF47A70154ED4F83B +:101E00009020154DD2F80438114F43F00203C2F868 +:101E10000438FFF75BFF2046104904F069F8D4F856 +:101E200090200424D2F8043823F00203C2F80438C6 +:101E30004FF4E133336055F8040BB84202D0314619 +:101E400003F07AFE013CF6D1F8BD00BF149B0008F8 +:101E500018490020CC330020142200201C9B0008CD +:101E60000C4B70B50C4D04461E780C4B55F82620D3 +:101E70009A420DD00A4B002118221846FFF75CFF4A +:101E80000460014655F82600BDE8704003F054BEDA +:101E900070BD00BFE4330020142200201849002048 +:101EA000CC330020F8B571B6002301201A4619463C +:101EB00002F094FD0446802005F0C4F9002849D0C2 +:101EC0000025254A80274FF4D06C3D26136913F076 +:101ED000C06F26D1D2F8103113F0C06F21D1236822 +:101EE00005F1006199602368D86023685F6023680A +:101EF000C3F800C021680B6843F001030B60216840 +:101F00000B6823F01E030B6021680B68DB07FCD411 +:101F1000237B8035616806FA03F3B5F5001F0B607B +:101F2000D4D1204602F09AFDB5F5001F11D000244F +:101F30000A4E0B4D012005F0E5F83388A34205D980 +:101F400028682044013405F023F8F6E7002005F066 +:101F5000D9F861B6F8BD00BF00200052E63300207A +:101F6000A033002030B50A44084D91420DD011F83D +:101F7000013B5840082340F30004013B2C4013F080 +:101F8000FF0384EA5000F6D1EFE730BD2083B8EDBF +:101F90000121884238BF084605F08CB908B105F028 +:101FA0008DB9704710B5084C01220849002001F096 +:101FB000B3FE23783BB1064803F036FD044803F036 +:101FC00069FD0023237010BDE8330020249300082E +:101FD000C83600201D482DE9F041036D2BB90122C0 +:101FE0004FF48051503005F0C9FA194E33780BB1D7 +:101FF000FFF7D8FF0324174F4FF00008134D154982 +:102000002846C7F8048003F037FD284603F070FB2C +:1020100048B1013C284603F03DFD14F0FF04EED129 +:10202000204634700FE00C4901220C4801F074FE88 +:10203000014618B1284603F0F7FCEAE7084800F02B +:1020400011F801203070BDE8F08100BFC8360020D3 +:10205000E83300203C22002024930008EC330020C9 +:10206000289300080FB4002004B070470068704740 +:1020700003460068596870470B0A017043700B0CE7 +:10208000090E8370C1707047110A027003714170AC +:10209000110C120E8170C2701A0A42711A0C1B0EBA +:1020A0008271C37170470000C36A0239023B8B42E0 +:1020B00083BF4389006C01FB0300002070470000D0 +:1020C000C2F307238A76CB760378032B01BF120C69 +:1020D0000A75120A4A75704700F10B010022D301FC +:1020E00043EA520310F8012B52FA83F38842DAB222 +:1020F000F5D110467047000010B541780446002025 +:10210000013102464901022A16BFA35C032203EBF8 +:10211000C03302F101021EBF9BB203EB500398B221 +:102120009142F0D810BD000002684AB1134613F87E +:10213000011B1F290DD93A29F9D1911C8B4202D0DC +:102140004FF0FF3070471278302AF9D10360002039 +:102150007047014B187870473836002038B50D4667 +:10216000044618B9092000232B6038BD0368002BF2 +:10217000F8D01A78002AF5D08188DA889142F1D116 +:10218000587804F00FFC10F00100EBD12368EBE766 +:1021900038B50D4640F25231144602F0B9F9FF2825 +:1021A00007D9012C0BD9030A022468702B70204632 +:1021B00038BD30B1002CFAD001242870F7E7002494 +:1021C000F5E70446F3E700002DE9F8430026D0F8D0 +:1021D000008005460C468E76836B002B4AD098F81B +:1021E0000030042B4BD133463546402720E0B7F56D +:1021F000187F80F0C480F90606F1010608BF023797 +:10220000D05B02372BB900F5205292B2B2F5006FC5 +:102210000DD305F11A01C5F1FF0240EA0340214444 +:10222000FFF7B6FF002800F0AA800544002003460F +:10223000D8F8102092F82310B142D8D8002B40F0E3 +:102240009E80002D00F09B8000232544AB766373B5 +:10225000D8F81020137903F03701DB0621730BD473 +:1022600002F13800FFF704FFC4E90001938963819C +:10227000D3892381BDE8F88300200146F4E7C36CCD +:1022800001335ED1EA6B00232E26551E184615F841 +:10229000011F013020290CD0052908BFE52109289C +:1022A00004D10B2B9EBFE71801337E73E71801336F +:1022B00079730B28EBD1E11800204873A17E002927 +:1022C0004BD1002B40D06FF00C0604F10D00082517 +:1022D000361B331810F8011B002938D02E298BB279 +:1022E0004AD0A3F14101192903D8117B0D4200D036 +:1022F00020330373EDE7B9F1000F05D100F520534A +:102300009BB2B3F5006F0BD307F11A01C7F1FF02BF +:1023100040EA09402144FFF73BFF48B10744002051 +:1023200002368146D8F80C30985B0028E3D1384655 +:10233000B9F1000F4FF0000218BF002023189A7661 +:10234000A0E7B1463746EDE73F23A37601232344B8 +:1023500000219976137B03B96373D37A02F11C00D1 +:1023600003F03F0323730023FFF780FE20606360C8 +:10237000D38A6381138B7CE710250B46B9E73F2393 +:102380000125A37660E7000038B50546002435F83E +:10239000020B08B9204638BD02F0EEF86308C2B25D +:1023A00003EBC43312FA83F39AB2C0F3072303EBAF +:1023B000520303EBC2339CB2E9E7000037B5C378A0 +:1023C00004461BB90025284603B030BD00F14C017E +:1023D000826C01234078019104F00AFB054680B924 +:1023E000A36BE070A06C226BC31A9342EAD2A3786D +:1023F0000199022BE6D102440123607804F0F8FA37 +:10240000E1E70125DFE7000038B5836C05460C469F +:102410008B4210D0FFF7D2FF60B92246012305F1AD +:102420004C01687804F0C0FA00281CBF4FF0FF345C +:102430000120AC6438BD0020FCE7000038B5002363 +:102440000446C3704FF0FF338364FFF7DDFF0028BD +:102450004BD1B4F84A524AF655239D4207D10B227C +:10246000254904F14C0006F09FFE00283FD094F867 +:102470004C30EB2B03D01833DBB2012B2ED84AF6AD +:1024800055239D4206D108221C4904F19E0006F006 +:102490008BFE48B3B4F85730B3F5007F1ED194F8E3 +:1024A0005930DBB15A1E1A4218D1B4F85A30ABB1C8 +:1024B00094F85C30013B012B10D8B4F85D306BB15F +:1024C000B4F85F307F2B06D804F16C00FFF7CEFD27 +:1024D000B0F5803F02D3B4F8623053B94AF65520C4 +:1024E00085420CBF0220032038BD0420FCE70120F8 +:1024F000FAE70020F8E700BF549300086093000853 +:1025000002392DE9F04701F007044FF0010A466C4B +:1025100005460AFA04F41746984606EB1136C1F34D +:10252000C809E4B2314628460136FFF76DFF18B1FD +:102530000120BDE8F087994605EB090292F84C307E +:10254000234214BF01210021414513D06340013FC4 +:1025500082F84C3085F803A0EBD0640014F0FF043F +:10256000EAD109F1010301244FF00009B3F5007F1E +:10257000E1D1D7E70220DCE701290246F8B50C4695 +:1025800040F28C800668F36A8B4240F28780337891 +:10259000013B032B00F28280DFE803F00229384B75 +:1025A00004EB5405B16B304601EB5521FFF72CFFCE +:1025B00010B14FF0FF30F8BD6F1CC5F30805B16BCB +:1025C0003046354401EB572195F84C50FFF71CFF7E +:1025D0000028EED1C7F30807E3073E4496F84C0005 +:1025E00045EA00204CBF0009C0F30B00E3E7B16BE4 +:1025F000304601EB1421FFF707FF0028D9D1640012 +:1026000004F4FF742644B6F84C00D4E7B16B3046AE +:1026100001EBD411FFF7F8FE0028CAD1A40006F19F +:102620004C0004F4FE742044FFF720FD20F07040BD +:10263000C1E7D0E90430D57953EA000101D09168AF +:1026400001B95DBB9168022DA4EB01010DD1013BE5 +:10265000728940F1FF305B0A43EAC053B3FBF2F3E7 +:1026600099421BD81CD0601CA5E7032D02D19369A9 +:102670008B42F8D8D3699BB9B16B304601EBD411CA +:10268000FFF7C2FE002894D1A0004C3600F4FE7083 +:102690003044FFF7EBFC20F000408CE701208AE794 +:1026A0006FF0004087E70000F8B5066804460D4665 +:1026B0003378042B0CBF4FF080524FF400128A4243 +:1026C00001D80220F8BDCA06FBD182680163D2B9E5 +:1026D000022B13D83389B3EB551FF2D9F36BA363E5 +:1026E000A36B6263002BECD003EB55234C36C5F390 +:1026F00008050020A3633544E563E3E7F36BC2718B +:10270000002BE7D01A4677897F02BD42114604D2DA +:102710003046FFF7C9FCA063E2E72046FFF72CFF35 +:10272000431C024606D00128CBD9F36A8342C8D99C +:10273000ED1BEAE70120C5E701292DE9F047064630 +:102740000C46174608D9C36A8B4205D90378022B79 +:1027500062D003D8012B22D0022552E0033B012B8B +:10276000FAD8816B01EBD411FFF74EFE0546002825 +:1027700047D1A40006F14C0304F4FE741C443378E2 +:10278000042B07D0204627F07047FFF76FFC00F0BE +:102790007040074339462046FFF76EFC2FE001EBFF +:1027A0005108816B01EB5821FFF72EFE054640BB17 +:1027B00014F0010406F14C0908F1010AC8F30808F5 +:1027C00008BFFBB230461FBF19F8083003F00F02F4 +:1027D0003B0103F0F00318BF134309F8083001234D +:1027E000B16BF37001EB5A21FFF70EFE054640B9BD +:1027F000CAF3080A44B1C7F3071709F80A7001239E +:10280000F3702846BDE8F08719F80A30C7F30327AC +:1028100023F00F031F43F0E7816B01EB1421FFF757 +:10282000F3FD05460028ECD1640006F14C0304F4E6 +:10283000FF741F551919C7F307274F70DFE7000012 +:10284000F8B504460E461746E3690BB91846F8BDBD +:10285000012BA6EB0305206814BFAA1C3A46691C8D +:10286000FFF76AFF0028F2D1E369013BE361EBE780 +:1028700001292DE9F84306460C461746056802D89B +:102880000220BDE8F883EB6A8B42F9D97AB9A146F8 +:1028900021463046A046FFF76FFE0446B0B92B78BC +:1028A000042B02D1002F43D1F7710020E9E72B78E8 +:1028B000042B02D1C379022BE9D04FF0FF32394605 +:1028C0002846FFF739FF0028E1D0DAE70128D7D002 +:1028D000421C01D10120D4E72B78042B19D1EA6ADC +:1028E000AB69023A93421CD308F10102A2420CD018 +:1028F0002B78042B08D10023A2EB09024946284675 +:10290000FFF7FEFD0028BCD1A146EB6AA342BFD869 +:10291000C5E7002241462846FFF70EFF0028DED01B +:10292000AFE70133AB612B7943F001032B71DBE798 +:10293000F3798BB9B468BC4202D10223F371B4E7D6 +:1029400021463046FFF718FE012899D9431CC1D013 +:1029500001348442EFD0A8E7032BA6D1B368BB4271 +:10296000A3D8B2691344BB429FD3E6E770B5C379DD +:102970000446032B06D181688369CD18A94203D18F +:102980000023E371002070BD4E1C20683246FFF723 +:10299000D3FE0028F7D13146F0E700002DE9F743D8 +:1029A00005460191FFF70AFD0446002849D105F1CB +:1029B0004C09019928464FF40072FFF775FB214638 +:1029C000A86407464846FFF7B7F96C896402B4F576 +:1029D000004F28BF4FF40044B4F5007F2FD92046A4 +:1029E00004F070FC804630B122460021640A0026C3 +:1029F000FFF7A2F909E06408EEE72346BA19414659 +:102A0000687803F0F5FF18B926446B899E42F4D329 +:102A1000404604F067FC6889801B18BF012003B0A2 +:102A2000BDE8F08301366B899E42F4D20123BA19C6 +:102A30004946687803F0DCFF0028F3D0EBE7002676 +:102A4000F1E70120EBE70000F8B50446FFF7B6FC1C +:102A50000546002842D12378032B37D12779012F4F +:102A600034D104F14C0601464FF400723046FFF7B2 +:102A700063F955234122722184F84A32AA2304F5CE +:102A80000D7084F84F2084F84B32522384F83012B2 +:102A900084F84C3084F84D30612384F8311284F886 +:102AA0004E3084F83332A16984F83222FFF7E4FA19 +:102AB000616904F50E70FFF7DFFA626B3B46314641 +:102AC00001326078A26403F093FF257100226078E0 +:102AD000114603F0B1FF003818BF0120F8BD000017 +:102AE00000232DE9F0430B6085B00F461546FFF734 +:102AF0001BFB061EC0F2B281804B53F82640002C0F +:102B000000F0AE813C6005F0FE0523786BB1607883 +:102B100003F048FFC70708D41DB110F0040500D02A +:102B20000A25284605B0BDE8F0830023F0B22370E3 +:102B3000607003F023FFC10700F194810DB14207DB +:102B4000EED400212046FFF779FC022840F099805E +:102B50006E4604F2122304F2522132461846103314 +:102B6000FFF784FA42F8040B8B42F7D1002556F8A0 +:102B7000041B00297DD02046FFF760FC012879D88E +:102B80000128A26C40F0C08004F1570304F18C01CD +:102B900013F8015B002D7BD18B42F9D1B4F8B4302E +:102BA000B3F5807F74D194F8B830092B70D104F15B +:102BB0009400FFF75DFA4FF0FF33171841F1000161 +:102BC000BB4275EB010363D304F1A000FFF74EFA9B +:102BD00094F8BA302063012BA37059D194F8B990BE +:102BE00003FA09F91FFA89F36381002B50D0444B93 +:102BF00004F1A800FFF73AFA0646984248D8831C29 +:102C0000626304F1A400E362FFF730FA00EB02080C +:102C100004F19C00C4F84080FFF728FA10441FFA22 +:102C200089F2A06306FB02F313EB080345EB0502F0 +:102C30009F4271EB02032BD32E4604F1AC00FFF749 +:102C400015FAE06365B96389B34221D9E16B204687 +:102C5000FFF72AFA81192046FFF7D6FB98B901360B +:102C6000631993F84C30812B14D02035C5F3080537 +:102C7000E8E703200135042D7FF479AF042807D15C +:102C800001E0042801D101254BE701287FF678AF48 +:102C90000D2546E705F1140004F14C063044FFF71A +:102CA000E5F901280546F3D9E36A8342F0D9618941 +:102CB000821E236C02FB01336364A16B204601EB8F +:102CC000D511FFF7A1FB0028DDD105F07F0006EB51 +:102CD0008000FFF7CBF9431C03D00135A842ECD0AC +:102CE000D6E70425C4E90500064A257000251388A7 +:102CF000E56101339BB21380E38012E73C3600208C +:102D0000FDFFFF7F40360020B4F85730B3F5007F59 +:102D1000BED1B4F8626026B904F17000FFF7A6F9DD +:102D2000064694F85C302663591EA3700129AFD87B +:102D300094F859506581002DAAD0691E2942A7D167 +:102D4000B4F85D8018F00F0FA4F80880A0D1B4F893 +:102D50005F0018B904F16C00FFF788F9B4F85A1055 +:102D6000002995D006FB03FE01EB181CF4446045D6 +:102D70008ED3A0EB0C00A842B0FBF5F388D33E48FD +:102D8000834285D84FF6F57083426DD903259F1C89 +:102D9000114402EB0C03032DE7626263A163236419 +:102DA0004CD1B4F8763053EA08037FF471AFBB001E +:102DB00004F17800FFF75AF9E06303F2FF13B6EB72 +:102DC000532FFFF465AF4FF0FF33032DC4E90533F4 +:102DD0004FF08003237187D1B4F87C30012B83D16D +:102DE000511C2046FFF710FB00287FF47DAFB4F89C +:102DF0004A224AF6552320719A427FF475AF1F4B41 +:102E000004F14C00FFF732F998427FF46DAF03F103 +:102E1000FF5304F50C70FFF729F903F50053203335 +:102E200098427FF461AF04F50D70FFF71FF9A061C0 +:102E300004F50E70FFF71AF9606155E7B8F1000F5D +:102E40003FF426AF7144022D4FEA4703E1631EBFF2 +:102E5000D91907F0010303EB5103AEE70B2560E638 +:102E60000C255EE603255CE640F6F575AB428CBFAB +:102E7000022501258BE700BFF5FFFF0F525261418C +:102E80002DE9F84F07460568884649B96E69C6B10D +:102E9000EB6AB34298BF0126AB69A3B9002405E0F1 +:102EA000FFF76AFB0128044603D801242046BDE849 +:102EB000F88F421C00F0D280EB6A8342F6D8464677 +:102EC000EAE70126E8E72A78EB6A042A40F08380E3 +:102ED000A6F1020A023B4FF0010B9A4528BF4FF0C2 +:102EE000000AD146696C284601EB1931FFF78CFACC +:102EF00000283BD109F00703EA6AC9F3C8010BFABD +:102F000003F3901EDBB26A184C4609F1010992F8EE +:102F10004C20814502EA030233BF5B0000234FF4DB +:102F20000071DBB228BF9946B2B90234631E033385 +:102F3000BCD80123214628461A46FFF7E1FA0228A9 +:102F4000B3D0012800F08A80B8F1000F13D102231A +:102F5000FB710028A9D130E0CA450AD0002BD2D19C +:102F60000131B1F5007FBDD20123CCE74FF0FF3432 +:102F7000DCE70024DAE7FB79022B07D1731CA342BC +:102F8000E7D0BB68F31ABB610323FB7108F10102B0 +:102F9000FB69A24205D113B10133FB61D9E70223DA +:102FA000FBE70BB90123FB61224641463846FFF798 +:102FB00047FC00284FD10123FB61EA6AAB69023A62 +:102FC0006C6193429CBF03F1FF33AB612B7943F0FB +:102FD00001032B716AE7464514D1741C3846A3429D +:102FE00098BF02242146FFF7C7FA01283FF45DAFDE +:102FF000431C33D0E0B16B69012B03D9EA6A9342D9 +:1030000038BF1E4634460134EB6AA34203D8012E72 +:103010007FF644AF022421463846FFF7ADFA48B1A7 +:1030200001283FF442AF013018D0B442EBD135E76C +:10303000002CE7D04FF0FF3221462846FFF77CFBFB +:1030400048B9B8F1000FB8D0224641462846FFF7EC +:1030500073FB0028B1D001287FF427AF4FF0FF3475 +:1030600024E700002DE9F84306680446076B89460B +:1030700033782037042B0CBF4FF080534FF40013EC +:10308000BB429CBF00238363836B73B1C7F3080803 +:10309000B8F1000F3CD10133416B836339B93389F7 +:1030A000B3EB571F34D80023A36304200AE07389CD +:1030B000013B13EA57232BD1FFF75EFA012805469F +:1030C00002D80220BDE8F883421C01D10120F9E7B3 +:1030D000F36A834216D8B9F1000FE4D0616B204641 +:1030E000FFF7CEFE0546C8B10128EAD0431CEDD05B +:1030F00001463046FFF752FC0028E7D1E37943F060 +:103100000403E371294630466563FEF7CDFFA063F3 +:103110004C36002027634644E663D3E70720D1E717 +:10312000F8B50E46002104460768FFF7BDFA98B9C6 +:103130000546A16B3846FFF767F968B93A78E36B43 +:10314000042A1B780CD11B060ED50546012120460A +:10315000FFF788FF0028ECD0042808BF072006E00E +:10316000E52B01D0002BF0D10135B542EED1F8BDF1 +:10317000C16C4B1C2DE9F04104460568066B1FD15C +:10318000E5274FF00108A16B2846FFF73DF998B9F4 +:103190002A78E36B042A09BF1A781F7002F07F02B5 +:1031A0001A7085F80380236BB3420DD200212046AC +:1031B000FFF758FF0028E6D0042808BF022003E0EC +:1031C000FFF772FA0028DBD0BDE8F0812DE9F0416D +:1031D00005460068A96B0669FFF716F9044620B991 +:1031E000EB6B1A78852A03D002242046BDE8F081D3 +:1031F000324603F1200153F8040B8B4242F8040BD2 +:10320000F9D1777801377F01A7F16003B3F5007F2B +:10321000EAD800212846FFF725FF04280446E3D01A +:103220000028E2D1A96B2868FFF7EEF804460028D1 +:10323000DBD1EB6B1A78C02AD6D106F1200203F15C +:10324000200153F8040B8B4242F8040BF9D196F895 +:1032500023300F222C33B3FBF2F3B7EB431FC3D35E +:103260004FF0400800212846FFF7FCFE04280446E2 +:10327000BAD00028B9D1A96B2868FFF7C5F8044671 +:103280000028B2D1EB6B1A78C12AADD1B8F5187FFE +:1032900009D206EB080203F1200153F8040B8B421C +:1032A00042F8040BF9D108F120084745DAD8B8F5FF +:1032B000187F9AD83046FEF71FFF7388834294D058 +:1032C00092E700000B68002210B5036004460B6A09 +:1032D00083604B6AC261C37123F0FF03896AC0E94E +:1032E0000432C164FFF7E0F920B92046BDE8104080 +:1032F000FFF76CBF10BD0000F8B503680546012755 +:103300001C692046FEF7F8FEA070000A6678E0709F +:103310002846E96CFFF7C8F920B1022828BF02202F +:10332000C0B2F8BDA96B2868FFF76EF80028F4D189 +:10333000EB6B04F1200254F8041B944243F8041B85 +:10334000F9D12B68DF70002EE7D000212846013E1E +:10335000FFF788FEE0E700002DE9F8434FF0FF0893 +:1033600006460768042445464FF6FF79B16B11B94C +:10337000002C73D063E03846FFF746F80446002877 +:103380005DD1F06B0378002B6ED03A78042A11D10E +:10339000852B4DD1336B3046F364FFF717FF04469E +:1033A00000284CD13B691B7903F03F03B3712046E1 +:1033B000BDE8F883C27AE52B02F03F02B27143D038 +:1033C0002E2B41D022F0200108293DD00F2A40D1D8 +:1033D000590637D503F0BF05336B90F80D80F364C1 +:1033E000437B434530D1428B72BB03780D21FC688F +:1033F00023F04003DFF874E0013B4B4301211EF84A +:1034000001CB30F80CC009B3FF2B1DD824F813C032 +:103410006146013301320D2AF1D10278520605D5F9 +:1034200021B1FF2B10D8002224F81320013DEDB26A +:1034300000213046FFF716FE0446002896D00023F0 +:10344000B363B4E7AB42CBD0FF25F1E7CC45E1D085 +:10345000FAE72DB9FEF740FE404501D10024A6E76A +:103460004FF0FF33F364A2E70424E8E7FC9300087D +:103470002DE9F04F002187B00446D0F80090FFF707 +:1034800013F9804670B999F80030042B33D1D9F87C +:103490000C00FEF779FF07462046FFF75DFF054663 +:1034A00020B18046404607B0BDE8F08FD9F8103013 +:1034B0009A8CBA42F0D193F823B040265D4506D1EC +:1034C000D9F80C3033F81530002BE5D1EAE7F106D6 +:1034D000D9F8103008BF0236985B01F04DF8D9F8E2 +:1034E0000C30824633F8150001F046F88245D3D1FE +:1034F00002360135E2E74FF0FF0A4FF0FF3B554639 +:10350000C4F84CB0A16B4846FEF77EFF00285CD1A2 +:10351000E66B3778002F77D0F27AE52F02F03F0381 +:10352000A37103D0120704D50F2B04D0C4F84CB0FC +:103530004FE00F2B54D194F84B3058063FD4790606 +:1035400045D5236B07F0BF0796F80DA0E364737BA6 +:1035500053453ED1738B002B3BD135780121D9F8EF +:103560000C3005F03F0501930D23013D5D43284BD1 +:1035700013F8012BB25A71B3FF2D059329D81046C9 +:10358000049200F0F9FF6B1C03900293019B33F847 +:10359000150000F0F1FF039981421AD1049A029DAF +:1035A0001146059B1B4A9342E2D133785A0604D553 +:1035B00019B1019B33F815305BB97D1EEDB20021C6 +:1035C0002046FFF74FFD00289CD080466AE7BD42A9 +:1035D000BDD0FF25F3E74FF6FF708242E2D0F8E757 +:1035E0002DB93046FEF778FD50453FF45BAF94F8B7 +:1035F0004B30DB079AD40B2204F14001304605F032 +:10360000D3FD002892D14DE74FF004084AE700BFF0 +:10361000FC930008099400082DE9F04F90F84BB096 +:1036200099B004461BF0A00540F068810668F26876 +:1036300032F81530002B4AD13378042B40F08780C4 +:103640000F230E352046B5FBF3F5A91CFFF768FDE7 +:103650008146002877D1236B0135A3EB4515E3792B +:103660005A07E56435D523F004032046E371FFF7DC +:103670007DF950BB4FF0FF32616B2046FFF7E0F859 +:1036800018BBA3682BB3214604A8FFF71BFEE0B9C3 +:1036900070894FF40071D4E90423E0FB0123306901 +:1036A000C4E904233830FEF7EFFC3069D4E9042381 +:1036B0002830FEF7E9FCE379326904A843F00103FE +:1036C00082F82130FFF718FE18B181463BE0013542 +:1036D000AEE7D6E90354402200212046FEF72CFB3A +:1036E0008523012140222370C0234FF0C10C04EB3D +:1036F000010884F8203000231E469E46571C04F81B +:1037000002C0F0B2023204F807E021B135F813101C +:1037100009B10133DBB20F0AA15408F8027002327A +:10372000D706F2D135F813700136002FE6D184F8B0 +:103730002330831C28466370FEF726FE84F824009D +:10374000000A84F82500484619B0BDE8F08F04F15E +:1037500040070DF1100A1BF0010F97E807008AE8F7 +:10376000070000F0D38040234FF0010884F84B306D +:10377000BC46F368B8F1050F9AE80700ACE803000F +:103780002CF8022B4FEA12428CF8002059D9981ECF +:10379000424630F8021F002942D10DF10F0C0721DB +:1037A00002F00F0E914612090EF13000392888BF41 +:1037B0000EF1370001390CF8010902D0B9F10F0FF1 +:1037C000EED818AB7E205A1802F8580C3846002262 +:1037D000914206D010F801CB02F1010EBCF1200F8E +:1037E00031D104F13F0C072902F1010297BF18AB58 +:1037F00020205818013198BF10F8580C072A0CF8EF +:103800000200F0D92046FFF733FE8146002878D128 +:1038100008F10108B8F1640FAAD14FF0070992E747 +:103820004FF0100C01F0010E49080EEB4202D303D9 +:1038300044BF82F4883282F02102BCF1010CF1D144 +:10384000A7E74246A9E77246C2E7216B2046A1EBF3 +:103850004511FEF729FF814600287FF474AF4FF62B +:10386000FF783846FEF738FC0190A16B3046FEF732 +:10387000CBFD814600287FF466AFE36BE9B2019A85 +:103880004FF00D0CD6F80CE05A734FF00F02DFF832 +:10389000E0A0DA724A1E18730CFB02F28446987696 +:1038A000D87640451AF8019B0CF1010C18BF3EF880 +:1038B000120003EB090B18BF013203F809004FEAAD +:1038C0001029002808BF4046BCF10D0F8BF801906D +:1038D000E7D1404502D03EF812200AB941F040013C +:1038E0001970012300212046F370FFF7BBFB8146CE +:1038F00000287FF428AF013DB7D11BE04FF0060947 +:1039000021E704287FF41FAF84F84BB01BF0020FAF +:1039100020461BBF0C350D210125B5FBF1F518BF65 +:1039200001352946FFF7FCFB814600287FF40BAFE9 +:10393000013D8AD1A16B3046FEF766FD8146002825 +:103940007FF401AF01462022E06BFEF7F5F9E36B4F +:1039500003CF18605960BA7839889A72198194F83F +:103960004B30E26B03F0180313730123F370EAE6A4 +:10397000FC93000810B504460A463430FEF776FB87 +:10398000886004F13800FEF773FBC2E9040194F883 +:10399000213003F00203D3710023D36110BD000076 +:1039A00003284B8B04BF8A8A43EA024318467047B8 +:1039B0002DE9F04F0B7899B0044689462F2BD0F8AB +:1039C00000B001D05C2B09D14A46137891460132F0 +:1039D0002F2BFAD05C2BF8D0002301E0DBF81C3051 +:1039E000A3600023E3619BF80030042B1ED1A36881 +:1039F000E3B1DBF82030214604A82362DBF8243051 +:103A00006362DBF82830A362FFF75CFC0346002802 +:103A100054D1DBF8102002F13800FEF727FBC4E98F +:103A2000040392F8213003F00203E37199F80030A7 +:103A30001F2B00F2358180230021204684F84B3073 +:103A400019B0BDE8F04FFEF72FBE49460B78894606 +:103A500001312F2BFAD05C2BF8D01F2B8CBF002507 +:103A60000425012F2FD113882E2B31D1002322F8CA +:103A7000173004F140029F428CBF2E2120210133D8 +:103A80000B2B02F8011BF6D145F02005204684F8E7 +:103A90004B50FFF7EDFC94F84B30002800F0E78026 +:103AA00004280BD1990603F0040240F1DC80002ABF +:103AB00000F0F6808023002084F84B3019B0BDE878 +:103AC000F08F0425CDE7022F02D153882E2BCAD0C8 +:103AD000911E87BB002322F81730002F00F01181C0 +:103AE00032F81300194601332028F9D009B92E28DD +:103AF00001D145F00305901E30F817302E2B01D070 +:103B0000013FF9D14FF020334FF0000A6364D046F3 +:103B10002364C4F847300823481C32F81160009031 +:103B2000F6B1202E03D02E2E0DD1B84210D045F084 +:103B300003050099F0E731F81730202B01D02E2B28 +:103B4000C8D1013FC5E79A4505D20099B9423BD19A +:103B50000B2B30D101E00B2B27D145F003050B23B4 +:103B600094F84020E52A04BF052284F84020082B61 +:103B700004BF4FEA88085FFA88F808F00C030C2BA2 +:103B800003D008F00303032B01D145F00205A80779 +:103B90003FF57CAF18F0010F18BF45F0100518F085 +:103BA000040F18BF45F0080570E70099B94202D02C +:103BB00045F00305D4D84FEA88080B234FF0080AD4 +:103BC00000975FFA88F8B4E77F2E15D9304640F2A7 +:103BD0005231CDE9022345F00203019300F098FC35 +:103BE00010F0800F0646DDE9022316D000F07F06B4 +:103BF00046498E5D019D46B331464548CDE90123D6 +:103C000005F0FCFADDE90123F8B9A6F1410189B21A +:103C100019291ED848F0020810E0FF28EAD9591ED9 +:103C20008A4503D345F003059A4682E704EB0A016F +:103C3000000A0AF1010A019D81F8400004EB0A0123 +:103C40000AF1010A81F8406073E745F003055F2639 +:103C5000F4E7A6F1610189B219299EBF203E48F020 +:103C60000108B6B2EAE7002A08BF052026E75A078E +:103C70003FF524AFA379DB0645D59BF80000042867 +:103C800035D1A3682146E27923622369DBF810006D +:103C900023F0FF0313436362E36CA362FFF76AFE42 +:103CA00023680027DA6819F8010B00283FF409AFF0 +:103CB00040F25231009200F04BFC054608B31F2839 +:103CC000009A7FF6FEAE2F283FF4BFAE5C283FF48B +:103CD000BCAE7F2805D801460E4805F08FFA009A41 +:103CE00078B9FF2F0DD022F817500137DBE7216B91 +:103CF0000BF14C03C1F308011944FFF751FEA0601A +:103D0000CEE70620DAE60520D8E600BF7C9300085F +:103D1000759300086C9300081FB5CDE9001003A847 +:103D200014460391FEF700FA002815DB0B4A52F8FF +:103D300020300BB100211970019B0BB100211970CB +:103D400042F820302CB1002201A96846FEF7C8FED7 +:103D50000446204604B010BD0B24FAE73C36002090 +:103D60002DE9F04798B0904605460191002800F0F3 +:103D7000528102F03F0603A901A83246FEF7B0FEC9 +:103D8000002840F04681039B4FF48C60049303F0BD +:103D900099FA0746002800F04081039B00F5007265 +:103DA0000199D86004A81A61FFF702FE044620B901 +:103DB0009DF95B30002BB8BF062418F01C0F00F0F3 +:103DC000CD80002C4CD0042C40D104A8FFF724FC5B +:103DD000044600283AD146F00806039B1A78042AC4 +:103DE00040F08380186929462B60FFF7C3FD039BD1 +:103DF0001E22002118690230FDF79EFF039C00215E +:103E00001A2220692630FDF797FF236920221A71B4 +:103E1000246903F091FA0146012208342046FEF796 +:103E20002BF9039B04A81B6983F82120FFF764FA90 +:103E3000044658B9A96801B302462846FEF718FDA2 +:103E4000AB68039A0446013B5361B4B1384603F0B2 +:103E500049FA0CB100232B60204618B0BDE8F0876A +:103E60009DF8163013F0110F40F0848018F0040F05 +:103E700040F0C98018F0080FAFD1039A31071399A9 +:103E8000936C48BF46F04006E964AB6410780428A0 +:103E900072D1069B9DF817102B62089B106923F0C6 +:103EA000FF030B4329466B62179BAB62FFF762FD72 +:103EB000DDF80CA00024002205F15008BAF8063005 +:103EC00021464046C5F800A0AB80002385F830604D +:103ED00085F831406C64C5E90E234FF40072FDF79C +:103EE0002BFFB20653D40024B0E703F025FA0146B5 +:103EF000009013980E30FEF7BFF813980099163013 +:103F0000FEF7BAF8039C13992078FFF749FD2023A8 +:103F100000228046CB7220461399FEF7D1F8139BFE +:103F2000002201211A775A779A77DA77039BD970A2 +:103F3000B8F1000FA1D0414604A8D3F84890FEF78D +:103F400097FC0446002881D149460398FEF75CFAA5 +:103F5000039B044608F1FF30586176E7002C7FF49C +:103F600075AF9DF81630DC064FD418F0020F84D0E0 +:103F7000D80782D5072469E7FFF712FD0023A86060 +:103F800001F11C00FEF772F86B61286190E7D5E93A +:103F9000046956EA0903A6D0BAF80AA0A9684FEA4C +:103FA0004A2AC5E90E69B24574EB09031BD3002404 +:103FB0002964002C7FF44AAFC6F30803002B92D08B +:103FC000039C2046FEF770F808B3760A01234146A9 +:103FD00046EAC95682196A64607802F0E5FC041E5C +:103FE00018BF012432E72846FEF7C6FAB6EB0A06E8 +:103FF000014669F10009012803D9431CD3D10124EA +:10400000D6E70224D4E7082420E704241EE702248C +:104010001CE704461EE709241EE711241CE70000E4 +:104020002DE9F04F994685B00023884603A9044640 +:10403000C9F800301646FEF791F8054680BB94F8A3 +:1040400031506DBB94F8303013F00103009300F051 +:10405000A68004F1500AD4E90432D4E90E011B1AF7 +:1040600062EB0102B34272F1000238BF1E46BEB1DC +:10407000D4E90E10C1F30803002B40F08280039BAB +:104080005A894B0A013A43EAC0531A401BD151EAFC +:10409000000309D1A06801280DD8022584F8315009 +:1040A000284605B0BDE8F08F216C20460192FEF74E +:1040B00063FA019AEFE7431C04D10123009D84F8C1 +:1040C0003130EDE72064DDF80CB0216C5846FDF787 +:1040D000EBFF0028E1D0B6F5007F02EB000731D3FB +:1040E000BBF80A1002EB5620730A88429BF80100C5 +:1040F00088BF8B1A3A464146019302F055FC0028CE +:10410000DBD194F93020019B002A0BDA606CC01BD4 +:10411000984207D24FF40072514608EB4020FDF759 +:10412000E5FD019B5F02D9F80030F61BB8443B4423 +:10413000C9F80030D4E90E32DB1942F10002C4E9BB +:104140000E3294E7626CBA421AD094F93030002BE8 +:104150000DDA012351469BF8010002F049FC0028CA +:10416000ABD194F8303003F07F0384F830300398FB +:1041700001233A465146407802F016FC00289CD1B3 +:104180006764A16B4046C1F30801C1F50077514453 +:10419000B74228BF37463A46FDF7A8FDC3E70725D3 +:1041A0007EE7000070B596B00E460022019002A98D +:1041B00001A8FEF795FC0446E0B94FF48C6003F0CB +:1041C00081F80546D8B1029B00F500720199D860CC +:1041D00002A81A61FFF7ECFB044640B99DF9533081 +:1041E000002B0ADB1EB1314602A8FDF7EDFF284681 +:1041F00003F078F8204616B070BD0624F7E71124C6 +:10420000F8E7000070B5B8B00222019003A901A838 +:10421000FEF766FC044608BB039B4FF48C601093CA +:1042200003F050F80546002866D0039B00F50072A5 +:104230000199D86010A81A61FFF7BAFB044650B97B +:104240009DF88B30980655D4190653D49DF8463006 +:10425000DA0706D50724284603F044F8204638B08C +:1042600070BD039B04931878042814D104A918691D +:10427000FFF780FB069E9DF84630DB0610D410A8A1 +:10428000FEF776FF04460028E5D156BB0398FEF7FB +:10429000DBFB0446DFE71F99FFF782FB0646EAE7F0 +:1042A000039BDA69B242D5D024930021269624A834 +:1042B0001B78042B01BFDDE90823CDE928239DF8F5 +:1042C00017308DF89730FEF7EFF904460028C2D179 +:1042D00024A8FFF741F804460028BBD00428BAD12F +:1042E000CDE70246314604A8FEF7C2FA044600288C +:1042F000B1D1CBE70624AEE71124AFE7F0B5BDB0EE +:10430000CDE900106846FDF70FFF022203A901A8BE +:10431000FEF7E6FB0446002841D1039B4FF48C6076 +:10432000149302F0CFFF0546002800F0EE80039BB7 +:1043300000F5007214AE0199D8601A613046FFF79B +:1043400037FB044640BB9DF89B3013F0A00F40F0B4 +:10435000D880039B009F1A78042A68D11B6904AC9B +:1043600003F1400C1868083353F8041C22466345D7 +:1043700003C21446F6D15022314628A8FDF7B6FCF8 +:10438000394628A8FFF714FB044600284CD12A9A86 +:10439000169B9A4206D00824284602F0A3FF204626 +:1043A0003DB0F0BD349A209B9A42F4D128A8FFF783 +:1043B00033F904460028EFD1039B04AF1B6993F83F +:1043C00001E093F823C09C8C3A46083303CAB242FA +:1043D00043F8080C43F8041C1746F5D1039B28A8A2 +:1043E0001B6983F801E0039B1A6982F823C01A69EC +:1043F00082F82440240A82F825401A691379D906E4 +:104400005CBF43F020031371FEF776FF04460028DB +:10441000C2D13046FEF7ACFE04460028BCD103985A +:10442000FEF712FB0446B7E70428B5D1BEE7239A8E +:1044300004AB02F1200C1068083252F8041C1C4630 +:10444000624503C42346F6D15022314628A8FDF721 +:104450004DFC394628A8FFF7ABFA044600284CD19A +:104460002A9A169B9A4296D1349A209B9A4292D1CC +:1044700028A8FFF7D1F8044600288DD137990DF10F +:104480001D030DF12D0001F10D0253F8044B834281 +:1044900042F8044BF9D11888012710809B7893705B +:1044A0009DF81B30039CDA0658BF43F02003CB7203 +:1044B000E770CB7ADB06ACD5169A2A9B9A42A8D035 +:1044C0002078FFF76DFA01462046FDF7EDFD014625 +:1044D000C8B12046FDF798FF044600287FF45CAF82 +:1044E000039890F86D302E2B93D12A9A00F16C012D +:1044F000FDF7E6FD039BDF708BE704287FF44CAFEC +:10450000B6E7062448E7022446E7112447E70000FF +:104510007F2810B501D880B210BDB0F5803F13D20E +:1045200040F2523399420FD10849002231F8024B30 +:1045300093B2844203D103F18000C0B2ECE70132B0 +:10454000802AF3D11346F6E70020E5E7BC96000881 +:104550007F280DD940F25233994208D1FF2806D85E +:1045600000F10040034B803833F810007047002002 +:10457000704700BFBC960008B0F5803FF0B522D26E +:104580001F4A83B21F49B0F5805F28BF0A46141D39 +:1045900034F8042C2146AAB1934213D334F8025CB8 +:1045A0002E0AEFB252FA85F5A84222DA082E09D86F +:1045B000DFE806F0050A10121416181A1C00801AFB +:1045C00034F810301846F0BD981A00F001001B1A9C +:1045D0009BB2F7E7103BFBE7203BF9E7303BF7E7FF +:1045E0001A3BF5E70833F3E7503BF1E7A3F5E35354 +:1045F000EEE70434002ECBD101EB4702C7E700BF42 +:104600000C9400080096000808B5074B074A196883 +:1046100001F03D01996053680BB190689847BDE87F +:10462000084003F09BB800BF000002404436002061 +:1046300008B5084B1968890901F03D018A019A60A3 +:10464000054AD3680BB110699847BDE8084003F0EC +:1046500085B800BF000002404436002008B5084B72 +:104660001968090C01F03D010A049A60054A536972 +:104670000BB190699847BDE8084003F06FB800BFE0 +:10468000000002404436002008B5084B1968890D27 +:1046900001F03D018A059A60054AD3690BB1106AA1 +:1046A0009847BDE8084003F059B800BF0000024039 +:1046B0004436002008B5074B074A596801F03D0110 +:1046C000D960536A0BB1906A9847BDE8084003F07F +:1046D00045B800BF000002404436002008B5084B32 +:1046E0005968890901F03D018A01DA60054AD36AF7 +:1046F0000BB1106B9847BDE8084003F02FB800BF1E +:10470000000002404436002008B5084B5968090CE7 +:1047100001F03D010A04DA60054A536B0BB1906B5E +:104720009847BDE8084003F019B800BF00000240F8 +:104730004436002008B5084B5968890D01F03D0149 +:104740008A05DA60054AD36B0BB1106C9847BDE857 +:10475000084003F003B800BF0000024044360020C8 +:1047600008B5074B074A196801F03D019960536C81 +:104770000BB1906C9847BDE8084002F0EFBF00BF56 +:10478000000402404436002008B5084B1968890926 +:1047900001F03D018A019A60054AD36C0BB1106D9E +:1047A0009847BDE8084002F0D9BF00BF00040240AE +:1047B0004436002008B5084B1968090C01F03D018A +:1047C0000A049A60054A536D0BB1906D9847BDE895 +:1047D000084002F0C3BF00BF00040240443600207E +:1047E00008B5084B1968890D01F03D018A059A60EA +:1047F000054AD36D0BB1106E9847BDE8084002F032 +:10480000ADBF00BF000402404436002008B5074B8E +:10481000074A596801F03D01D960536E0BB1906EA3 +:104820009847BDE8084002F099BF00BF000402406D +:104830004436002008B5084B5968890901F03D014C +:104840008A01DA60054AD36E0BB1106F9847BDE854 +:10485000084002F083BF00BF00040240443600203D +:1048600008B5084B5968090C01F03D010A04DA60EB +:10487000054A536F0BB1906F9847BDE8084002F0AE +:104880006DBF00BF000402404436002008B5084B4D +:104890005968890D01F03D018A05DA60054AD36F38 +:1048A00013B1D2F880009847BDE8084002F056BF27 +:1048B000000402404436002000230C4910B51A467B +:1048C0000B4C0B6054F82300026001EB43000433EF +:1048D0004260402BF6D1074A4FF0FF339360D3601C +:1048E000C2F80834C2F80C3410BD00BF44360020B2 +:1048F000BC970008000002400F28F8B510D9102816 +:1049000010D0112811D0122808D10F240720DFF869 +:10491000C8E00126DEF80050A04208D9002653E086 +:104920000446F4E70F240020F1E70724FBE706FA2A +:1049300000F73D424AD1264C4FEA001C3D4304EBB0 +:1049400000160EEBC000CEF80050C0E90123FBB208 +:1049500073B12048D0F8D83043F00103C0F8D83004 +:10496000D0F8003143F00103C0F80031D0F8003135 +:1049700017F47F4F0ED01748D0F8D83043F0020319 +:10498000C0F8D830D0F8003143F00203C0F800314D +:10499000D0F8003154F80C00036823F01F030360C3 +:1049A000056815F00105FBD104EB0C033D2493F8D9 +:1049B0000CC05F6804FA0CF43C602124056044617B +:1049C00012B1987B00F0CAFC3046F8BD0130A3E775 +:1049D000BC970008004402584436002010B530242B +:1049E00084F31188FFF788FF002383F3118810BD3B +:1049F00010B50446807B00F0C7FC01231549627B9B +:104A000003FA02F20B6823EA0203DAB20B6072B90E +:104A1000114AD2F8D81021F00101C2F8D810D2F80A +:104A2000001121F00101C2F80011D2F8002113F4A5 +:104A30007F4F0ED1084BD3F8D82022F00202C3F8E2 +:104A4000D820D3F8002122F00202C3F80021D3F8C5 +:104A5000003110BD443600200044025808B5302310 +:104A600083F31188FFF7C4FF002383F3118808BD87 +:104A7000836CC26A8B42506810B506D95A1E4C002E +:104A800002EB4103B3FBF4F3184410BD01F0010342 +:104A90008A0748BF43F002034A0748BF43F00803B0 +:104AA0000A0748BF43F00403CA0648BF43F0100397 +:104AB0008A06426B48BF43F02003134343637047A9 +:104AC00010B5074C204600F0CBFF064B0022C4E98E +:104AD0001023054BA364054BE363054BE36410BD52 +:104AE000C83600200070005200B4C4041C370020F7 +:104AF0001C390020C36A0BB9104BC3620379012B28 +:104B000011D10F4B98420ED10E4BD3F8D42042F462 +:104B10008032C3F8D420D3F8FC2042F48032C3F8AA +:104B2000FC20D3F8FC30436C00221A65DA621A606C +:104B30005A605A624FF0FF329A637047BC9800087F +:104B4000C8360020004402580379012B1BD0436C67 +:104B500000221A65DA621A605A605A624FF0FF3218 +:104B60009A63094B98420ED1084BD3F8D42022F413 +:104B70008032C3F8D420D3F8FC2022F48032C3F86A +:104B8000FC20D3F8FC307047C8360020004402589F +:104B900010B5446C0649FFF76BFF6060236842F272 +:104BA000107043F003032360BDE8104001F05EBDC8 +:104BB000801A06000129F8B5466C0B4F09D17568BB +:104BC0000A493D40FFF754FF054345F480557560A1 +:104BD000F8BD746806493C40FFF74AFF044344F4BB +:104BE00080547460F4E700BF00ECFFFF80F0FA022D +:104BF00040787D01436C00225A601A6070470000C3 +:104C0000426C0129536823F4404304D0022905D0A3 +:104C100001B95360704743F48043FAE743F400431B +:104C2000F7E70000436C41F480519A60D9605A6BF9 +:104C30001206FCD580229A637047000010B541F43B +:104C40008851446CA260E160616B11F04502FBD0B9 +:104C5000A26311F0040203D0FFF718FF012010BD7A +:104C6000616910461960FAE710B541F48851446C47 +:104C7000A260E160616B11F04502FBD0A26311F00C +:104C8000050203D0FFF702FF012010BD6169104645 +:104C90001960FAE773B5134604460E46302282F3D4 +:104CA0001188426CD26B32B14FF0FF31403001932A +:104CB00001F0E8FC019B606C00220265C263C262E5 +:104CC000456B15F4807504D185F31188012002B07D +:104CD00070BD4FF0FF31816382F31188012E06D938 +:104CE0000C21204602B0BDE87040FFF7BDBF104662 +:104CF000EDE7000073B5446C0E4600250192616B30 +:104D0000A1632565E562FFF7C1FE012E07D9019B6E +:104D10002A460C2102B0BDE87040FFF7A5BF02B0E3 +:104D200070BD000010B541F49851446CA260E16080 +:104D3000616B11F04502FBD0A26311F03F0203D07A +:104D4000FFF7A4FE012010BD216A10461960E16939 +:104D50005960A16999606169D960F4E72DE9F74369 +:104D600004460191006D01A91746984602F01EFC09 +:104D7000064600284AD0626C2046DDF8049055684B +:104D8000C5F3090501356B00A56CB5FBF3F54FF4D0 +:104D90007A73B5FBF3F55D43556200F027FE50BB17 +:104DA000636C4FF0FF3201254146C3F8589020460E +:104DB0001D659A634FF49572DA6342F207029F62AF +:104DC000DA62E36C0A9AFFF74FFFA0B9E26C104B6E +:104DD00011680B407BB929462046FFF75BFF05466B +:104DE00048B92E463A460199206D02F017FC30462C +:104DF00003B0BDE8F0833A460199206D02F00EFC45 +:104E0000E26C01212046FFF775FFF0E70126EEE78F +:104E100008E0FFFD2DE9F7431F46436C01924FF474 +:104E20007A725D6804468846C5F3090501356E004F +:104E3000856CB5FBF6F5B5FBF2F555435D6200F008 +:104E4000D5FD20B10125284603B0BDE8F0837E02E0 +:104E500001A9206D324602F0A9FB05460028F1D0D9 +:104E6000636C019AD4F84C909A6501221A654FF050 +:104E7000FF329A634FF49572DA639E62236BDB060E +:104E80004B4658BF4FEA4828012F42461BD91221F2 +:104E90002046FFF7E9FEC0B9D9F80020104B1340B7 +:104EA0009BB9636C42F2930239462046DA62E26CA7 +:104EB000FFF7F0FE804640B932460199206D454625 +:104EC00002F0ACFBBFE71121E2E732460199206D09 +:104ED00002F0A4FBE26C39462046FFF70BFFB2E775 +:104EE00008E0FFFD2DE9F3411F46436C01924FF4AA +:104EF0007A725D6804468846C5F3090501356E007F +:104F0000856CB5FBF6F5B5FBF2F555435D6200F037 +:104F10006DFD20B10125284602B0BDE8F0817E027A +:104F200001A9206D324602F087FB05460028F1D02A +:104F3000636C019A9A6501221A654FF0FF329A63F9 +:104F40004FF48D72DA639E62236BE66CDB063346A8 +:104F500058BF4FEA4828012F424619D91921204647 +:104F6000FFF782FEB0B932680F4B134093B9636C00 +:104F700042F2910239462046DA62E26CFFF78AFE7D +:104F8000064638B901993546206D02F091FBC2E71B +:104F90001821E4E70199206D02F08AFBE26C3946A2 +:104FA0002046FFF7A7FEB6E708E0FFFD12F0030F6B +:104FB0002DE9F04107460C4615461E4617D00E4413 +:104FC000B44202D10020BDE8F0810123FA6B2146F2 +:104FD0003846FFF71FFF0028F5D128464FF400722E +:104FE000F96B05F500750134FCF780FEE8E7BDE8D4 +:104FF000F041FFF70FBF000012F0030F2DE9F04161 +:1050000007460C4615461E4617D00E44B44202D140 +:105010000020BDE8F08129464FF40072F86B05F5D9 +:105020000075FCF763FE0123FA6B21463846FFF753 +:1050300059FF0028EDD10134E8E7BDE8F041FFF762 +:1050400051BF000000207047302310B583F3118852 +:105050000024436C40302146DC6301F021FB84F3E3 +:10506000118810BD026843681143016003B11847FD +:1050700070470000024A136843F0C0031360704792 +:1050800000440040024A136843F0C00313607047B5 +:1050900000480040024A136843F0C00313607047A1 +:1050A00000780040064BD3F8E8200243C3F8E8201C +:1050B000D3F810211043C3F81001D3F81031704712 +:1050C0000044025837B5274C274D204600F028FDF4 +:1050D00004F11400009400234FF40072234900F0FF +:1050E000C3F94FF40072224904F138000094214BB7 +:1050F00000F03CFA204BC4E91735204C204600F064 +:105100000FFD04F11400009400234FF400721C49B9 +:1051100000F0AAF94FF400721A4904F13800009423 +:10512000194B00F023FA194BC4E91735184C2046E7 +:1051300000F0F6FC04F1140000234FF4007215494E +:10514000009400F091F9144B4FF40072134904F1EC +:105150003800009400F00AFA114BC4E9173503B087 +:1051600030BD00BF2039002000E1F505643A002081 +:105170006440002075500008004400408C39002035 +:10518000643C002064420020855000080048004034 +:10519000F8390020643E0020955000086444002047 +:1051A0000078004038B5264D0446037C002918BF1E +:1051B0000D46012B06D1234B984230D14FF40030DD +:1051C000FFF770FF2A68236EE16D03EB5203A566BB +:1051D000B3FBF2F36A68100442BF23F0070003F048 +:1051E000070343EA4003CB60AB6843F040034B60E6 +:1051F000EB6843F001038B6042F4967343F00103C4 +:105200000B604FF0FF330B62510505D512F01022F1 +:1052100011D0B2F1805F10D084F8643038BD0A4BF1 +:10522000984205D0094B9842CCD14FF08040C7E757 +:105230004FF48020C4E77F23EEE73F23ECE700BF75 +:10524000C4980008203900208C390020F83900204B +:105250002DE9F047C66D05463768F46921073462C9 +:105260001AD014F0080118BF4FF48071E20748BF4C +:1052700041F02001A3074FF0300348BF41F0400147 +:10528000600748BF41F0800183F31188281DFFF7B4 +:10529000E9FE002383F31188E2050AD5302383F366 +:1052A00011884FF48061281DFFF7DCFE002383F393 +:1052B00011884FF030094FF0000A14F0200838D15F +:1052C0003B0616D54FF0300905F1380A200610D5F7 +:1052D00089F31188504600F07DF9002836DA08215C +:1052E000281DFFF7BFFE27F080033360002383F300 +:1052F0001188790614D5620612D5302383F31188FC +:10530000D5E913239A4208D12B6C33B127F040071B +:105310001021281DFFF7A6FE3760002383F31188B4 +:10532000E30618D5AA6E1369ABB15069BDE8F04722 +:10533000184789F31188736A284695F86410194054 +:1053400000F008FC8AF31188F469B6E7B06288F3CC +:105350001188F469BAE7BDE8F0870000090100F19F +:105360006043012203F56143C9B283F8001300F0E2 +:105370001F039A4043099B0003F1604303F5614317 +:10538000C3F880211A60704700F01F0301229A4081 +:10539000430900F160409B0000F5614003F1604368 +:1053A00003F56143C3F88020C3F88021002380F80F +:1053B00000337047F8B51546826804460B46AA428A +:1053C00000D28568A1692669761AB5420BD21846C3 +:1053D0002A46FCF78BFCA3692B44A3612846A368EB +:1053E0005B1BA360F8BD0CD9AF1B18463246FCF717 +:1053F0007DFC3A46E1683044FCF778FCE3683B44C6 +:10540000EBE718462A46FCF771FCE368E5E7000085 +:1054100083689342F7B50446154600D28568D4E9FF +:105420000460361AB5420BD22A46FCF75FFC63696A +:105430002B4463612846A3685B1BA36003B0F0BDE7 +:105440000DD93246AF1B0191FCF750FC01993A4649 +:10545000E0683144FCF74AFCE3683B44E9E72A464C +:10546000FCF744FCE368E4E710B50A440024C36198 +:10547000029B8460C16002610362C0E90000C0E970 +:10548000051110BD08B5D0E90532934201D18268FB +:1054900082B98268013282605A1C4261197000210F +:1054A000D0E904329A4224BFC368436101F012F983 +:1054B000002008BD4FF0FF30FBE7000070B530233F +:1054C00004460E4683F31188A568A5B1A368A269B6 +:1054D000013BA360531CA36115782269934224BF4A +:1054E000E368A361E3690BB120469847002383F387 +:1054F0001188284607E03146204601F0DBF80028F5 +:10550000E2DA85F3118870BD2DE9F74F04460E46A7 +:1055100017469846D0F81C904FF0300A8AF311884D +:105520004FF0000B154665B12A4631462046FFF77D +:1055300041FF034660B94146204601F0BBF8002810 +:10554000F1D0002383F31188781B03B0BDE8F08FFE +:10555000B9F1000F03D001902046C847019B8BF39F +:105560001188ED1A1E448AF31188DCE7C160C3611B +:10557000009B82600362C0E905111144C0E900008C +:1055800001617047F8B504460D461646302383F393 +:105590001188A768A7B1A368013BA36063695A1C7F +:1055A00062611D70D4E904329A4224BFE3686361EA +:1055B000E3690BB120469847002080F3118807E08B +:1055C0003146204601F076F80028E2DA87F31188A8 +:1055D000F8BD0000D0E9052310B59A4201D18268D8 +:1055E0007AB982680021013282605A1C82611C787B +:1055F00003699A4224BFC368836101F06BF82046B7 +:1056000010BD4FF0FF30FBE72DE9F74F04460E4683 +:1056100017469846D0F81C904FF0300A8AF311884C +:105620004FF0000B154665B12A4631462046FFF77C +:10563000EFFE034660B94146204601F03BF80028E2 +:10564000F1D0002383F31188781B03B0BDE8F08FFD +:10565000B9F1000F03D001902046C847019B8BF39E +:105660001188ED1A1E448AF31188DCE70379052BB3 +:1056700005BF836A002001204B6004BF4FF4007314 +:105680000B60704770B55D1E866A04460D44B542D6 +:1056900005D9436B43F080034363012070BD0625A9 +:1056A0000571FFF783FC05232371F7E770B55D1ED5 +:1056B000866A04460D44B54205D9436B43F0800326 +:1056C0004363012070BD07250571FFF795FC052395 +:1056D0002371F7E738B505790446052D05D1082370 +:1056E0000371FFF7AFFC257138BD0120FCE7000016 +:1056F0000323F0B5037185B00446FFF749FA002291 +:1057000020461146FFF78EFA4FF4D57203AB0821FD +:105710002046FFF7A9FA0246B8B901232363039B89 +:10572000C3F30323012B09D103AB37212046FFF735 +:105730009BFA18B9A44B039A1340ABB1204601253C +:10574000FFF758FA0223237137E103AB0022372118 +:105750002046FFF789FA28B99B4A039B1A40002A82 +:1057600000F0A78002232363236B03F00F03022BB7 +:1057700040F0A9806425954E42F2107000F076FF4B +:1057800003AB324601212046FFF758FA0028D5D155 +:10579000039B002B80F293805A0003D5236B43F0C8 +:1057A00010032363002204F1080302212046FFF7BF +:1057B000B9FA02460028C1D104F13803032120467A +:1057C000FFF752FA0028B9D104F11805A26B09219C +:1057D00020462B46FFF7A6FA0028AFD102ABA26BFA +:1057E00007212046FFF740FA06460028A6D1236B82 +:1057F00003F00F03022B40F08F807E227F2128468A +:1058000003F01AFA012840F28780E76B42F2107029 +:1058100000F02CFF08234FF4007239462046009612 +:10582000FFF79CFA002889D1384603F053FA236B1E +:10583000A06203F00F03022B72D103AB644A06216E +:105840002046FFF711FA002871D15F49039B1940E8 +:10585000B1FA81F149092046FFF7ACF902AB4FF4E8 +:10586000007210212046FFF7FFF9054600287FF45B +:1058700065AF554E029B33427FF460AF236B13F04C +:105880000E0F03F00F0273D0022A7FF457AFE36AC2 +:105890001978012900F09480022900F093800029F2 +:1058A00000F089804B4F2046FFF7AAF903AB3A4638 +:1058B00076E0114620462263FFF7B4F954E7013D34 +:1058C0007FF45AAF3AE7444D6426444A3E4F012BD9 +:1058D00018BF154603AB002237212046FFF7C4F955 +:1058E00000287FF42BAF039B3B427FF427AF03AB31 +:1058F0002A4629212046FFF7A1F900287FF41EAF90 +:10590000039B002BFFF648AF013E3FF417AF42F276 +:10591000107000F0ABFEDDE7284603F0AFF986E734 +:105920007E227F212846E66B03F086F908B9002124 +:1059300091E7002340223146204600930623FFF7DB +:105940000DFA0028F3D1B3895BBA9B07EFD5244B3E +:1059500040223146204600930623FFF7FFF9002836 +:10596000E5D1317C01F00F010F3918BF012172E739 +:10597000E36A1978F9B101297FF4E0AE2046FFF718 +:105980003FF903ABA26B37212046FFF76DF90028E2 +:105990007FF4D4AE039B33427FF4D0AE03AB02223C +:1059A00006212046FFF760F900287FF4C7AE039B6D +:1059B00033427FF4C3AE05232371284605B0F0BD02 +:1059C000084F70E7084F6EE708E0FFFD0080FFC05A +:1059D0000001B9030000B7030080FF5000001080F1 +:1059E000F1FFFF800001B7030002B70337B504469B +:1059F0000C4D01ABA26B0D212046FFF735F978B9AC +:105A0000019B2B420BD1C3F34323042B08D0053B4E +:105A1000022B04D84FF47A7000F028FEE9E7012049 +:105A200003B030BD08E0FFFD70B53023054683F3B9 +:105A3000118803790024022B03D184F311882046B6 +:105A400070BD0423037184F311880226FFF7CEFF93 +:105A500004462846FFF7CEF82E71F0E7FFF730B87E +:105A6000044B03600123037100234363C0E90A333D +:105A7000704700BFDC98000810B53023044683F35C +:105A80001188C162FFF736F802230020237180F3EA +:105A9000118810BD10B53023044683F31188FFF739 +:105AA00053F800230122E362227183F3118810BDB1 +:105AB000026843681143016003B118477047000052 +:105AC0001430FFF721BD00004FF0FF331430FFF713 +:105AD0001BBD00003830FFF797BD00004FF0FF33CB +:105AE0003830FFF791BD00001430FFF7E7BC00002D +:105AF0004FF0FF311430FFF7E1BC00003830FFF702 +:105B000041BD00004FF0FF323830FFF73BBD0000D1 +:105B1000012914BF6FF0130000207047FFF7D2BABD +:105B2000044B036000234360C0E902330123037484 +:105B3000704700BF0099000810B53023044683F376 +:105B40001188FFF72FFB02230020237480F31188B4 +:105B500010BD000038B5C36904460D461BB90421C9 +:105B60000844FFF7A5FF294604F11400FFF78AFC5B +:105B7000002806DA201D4FF40061BDE83840FFF729 +:105B800097BF38BD026843681143016003B11847ED +:105B90007047000013B5406B00F58054D4F8A4386A +:105BA0001A681178042914D1017C022911D11979BC +:105BB000012312898B4013420BD101A94C3002F012 +:105BC00069FFD4F8A4480246019B2179206800F0BF +:105BD000DFF902B010BD0000143002F0EBBE00008F +:105BE0004FF0FF33143002F0E5BE00004C3002F0FD +:105BF000BDBF00004FF0FF334C3002F0B7BF0000D4 +:105C0000143002F0B9BE00004FF0FF31143002F042 +:105C1000B3BE00004C3002F089BF00004FF0FF32ED +:105C20004C3002F083BF00000020704710B500F533 +:105C30008054D4F8A4381A681178042917D1017C4B +:105C4000022914D15979012352898B4013420ED174 +:105C5000143002F04BFE024648B1D4F8A4484FF489 +:105C6000407361792068BDE8104000F07FB910BD35 +:105C7000406BFFF7DBBF0000704700007FB5124BA1 +:105C800001250426044603600023057400F1840204 +:105C900043602946C0E902330C4B02901430019353 +:105CA0004FF44073009602F0FDFD094B04F6944258 +:105CB000294604F14C000294CDE900634FF440738F +:105CC00002F0C4FE04B070BD28990008715C0008A1 +:105CD000955B00080A68302383F311880B790B3336 +:105CE00042F823004B79133342F823008B7913B128 +:105CF0000B3342F8230000F58053C3F8A4180223A5 +:105D00000374002080F311887047000038B5037FCA +:105D1000044613B190F85430ABB90125201D02217F +:105D2000FFF730FF04F114006FF00101257700F058 +:105D3000DDFC04F14C0084F854506FF00101BDE823 +:105D4000384000F0D3BC38BD10B501210446043002 +:105D5000FFF718FF0023237784F8543010BD0000AC +:105D600038B504460025143002F0B4FD04F14C00AF +:105D7000257702F083FE201D84F854500121FFF79F +:105D800001FF2046BDE83840FFF750BF90F8803053 +:105D900003F06003202B06D190F881200023212AF4 +:105DA00003D81F2A06D800207047222AFBD1C0E959 +:105DB0001D3303E0034A426707228267C36701205D +:105DC000704700BF4422002037B500F58055D5F854 +:105DD000A4381A68117804291AD1017C022917D134 +:105DE0001979012312898B40134211D100F14C041F +:105DF000204602F003FF58B101A9204602F04AFEF6 +:105E0000D5F8A4480246019B2179206800F0C0F82B +:105E100003B030BD01F10B03F0B550F8236085B03D +:105E200004460D46FEB1302383F3118804EB850749 +:105E3000301D0821FFF7A6FEFB6806F14C005B69E8 +:105E40001B681BB1019002F033FE019803A902F018 +:105E500021FE024648B1039B2946204600F098F8EF +:105E6000002383F3118805B0F0BDFB685A691268FE +:105E7000002AF5D01B8A013B1340F1D104F18002C6 +:105E8000EAE70000133138B550F82140ECB1302377 +:105E900083F3118804F58053D3F8A428136852794A +:105EA00003EB8203DB689B695D6845B104216018E0 +:105EB000FFF768FE294604F1140002F021FD204698 +:105EC000FFF7B4FE002383F3118838BD704700004C +:105ED00001F042BD01234022002110B5044600F824 +:105EE000303BFBF729FF0023C4E9013310BD00005C +:105EF00010B53023044683F3118824224160002129 +:105F00000C30FBF719FF204601F048FD022300206A +:105F1000237080F3118810BD70B500EB8103054636 +:105F200050690E461446DA6018B110220021FBF7C2 +:105F300003FFA06918B110220021FBF7FDFE3146D6 +:105F40002846BDE8704001F02FBE00008368202283 +:105F5000002103F0011310B5044683601030FBF7F5 +:105F6000EBFE2046BDE8104001F0AABEF0B40125CA +:105F700000EB810447898D40E4683D43A469458175 +:105F800023600023A2606360F0BC01F0C7BE000084 +:105F9000F0B4012500EB810407898D40E4683D439E +:105FA0006469058123600023A2606360F0BC01F096 +:105FB0003DBF000070B50223002504462422037073 +:105FC0002946C0F888500C3040F8045CFBF7B4FE5A +:105FD000204684F8705001F07BFD63681B6823B194 +:105FE00029462046BDE87040184770BD0378052B50 +:105FF00010B504460AD080F88C300523037043683E +:106000001B680BB1042198470023A36010BD00005A +:106010000178052906D190F88C20436802701B682E +:1060200003B118477047000070B590F8703004460F +:1060300013B1002380F8703004F18002204601F093 +:1060400063FE63689B68B3B994F8803013F0600511 +:1060500035D00021204602F055F90021204602F0FB +:1060600045F963681B6813B106212046984706234B +:1060700084F8703070BD204698470028E4D0B4F80A +:106080008630A26F9A4288BFA36794F98030A56FCB +:10609000002B4FF0300380F20381002D00F0F280DE +:1060A000092284F8702083F3118800212046D4E966 +:1060B0001D23FFF76DFF002383F31188DAE794F8BF +:1060C000812003F07F0343EA022340F2023293422D +:1060D00000F0C58021D8B3F5807F48D00DD8012BC2 +:1060E0003FD0022B00F09380002BB2D104F1880244 +:1060F00062670222A267E367C1E7B3F5817F00F020 +:106100009B80B3F5407FA4D194F88230012BA0D1BD +:10611000B4F8883043F0020332E0B3F5006F4DD09D +:1061200017D8B3F5A06F31D0A3F5C063012B90D879 +:106130006368204694F882205E6894F88310B4F86F +:106140008430B047002884D0436863670368A3673E +:106150001AE0B3F5106F36D040F6024293427FF456 +:1061600078AF5C4B63670223A3670023C3E794F80F +:106170008230012B7FF46DAFB4F8883023F0020336 +:10618000A4F88830C4E91D55E56778E7B4F8803095 +:10619000B3F5A06F0ED194F88230204684F88A308F +:1061A00001F0F4FC63681B6813B101212046984795 +:1061B000032323700023C4E91D339CE704F18B0300 +:1061C00063670123C3E72378042B10D1302383F3C3 +:1061D00011882046FFF7BAFE85F311880321636812 +:1061E00084F88B5021701B680BB12046984794F8B7 +:1061F0008230002BDED084F88B3004232370636858 +:106200001B68002BD6D0022120469847D2E794F88D +:10621000843020461D0603F00F010AD501F066FD0B +:10622000012804D002287FF414AF2B4B9AE72B4BA4 +:1062300098E701F04DFDF3E794F88230002B7FF4EE +:1062400008AF94F8843013F00F01B3D01A0620463B +:1062500002D502F06FF8ADE702F060F8AAE794F813 +:106260008230002B7FF4F5AE94F8843013F00F01E8 +:10627000A0D01B06204602D502F044F89AE702F0AF +:1062800035F897E7142284F8702083F311882B46A1 +:106290002A4629462046FFF769FE85F31188E9E67C +:1062A0005DB1152284F8702083F311880021204607 +:1062B000D4E91D23FFF75AFEFDE60B2284F8702077 +:1062C00083F311882B462A4629462046FFF760FEB5 +:1062D000E3E700BF58990008509900085499000856 +:1062E00038B590F870300446002B3ED0063BDAB249 +:1062F0000F2A34D80F2B32D8DFE803F037313108BA +:10630000223231313131313131313737856FB0F8A7 +:1063100086309D4214D2C3681B8AB5FBF3F203FB9F +:1063200012556DB9302383F311882B462A4629462E +:10633000FFF72EFE85F311880A2384F870300EE0F3 +:10634000142384F87030302383F31188002320460F +:106350001A461946FFF70AFE002383F3118838BD59 +:10636000C36F03B198470023E7E70021204601F0FF +:10637000C9FF0021204601F0B9FF63681B6813B113 +:106380000621204698470623D7E7000010B590F86D +:1063900070300446142B29D017D8062B05D001D80D +:1063A0001BB110BD093B022BFBD80021204601F098 +:1063B000A9FF0021204601F099FF63681B6813B113 +:1063C000062120469847062319E0152BE9D10B2317 +:1063D00080F87030302383F3118800231A46194661 +:1063E000FFF7D6FD002383F31188DAE7C3689B69C2 +:1063F0005B68002BD5D1C36F03B19847002384F8A5 +:106400007030CEE70023826880F8243083691B68EF +:1064100099689142FBD25A680360426010605860EC +:10642000704700000023826880F8243083691B686D +:1064300099689142FBD85A680360426010605860C6 +:106440007047000008B50846302383F3118891F89F +:106450002430032B05D0042B0DD02BB983F31188E6 +:1064600008BD8B6A00221A604FF0FF338362FFF78A +:10647000C9FF0023F2E7D1E9003213605A60F3E765 +:10648000034610B51B68984203D09C688A68944202 +:10649000F8D25A680B604A601160596010BD000064 +:1064A000FFF7B0BF064BD96881F82400186802686E +:1064B00053601A600122D86080F82420F9F7A2BF47 +:1064C000684600200C4B30B5DD684B1C87B0044695 +:1064D0000FD02B46094A684600F09CF92046FFF78A +:1064E000E1FF009B13B1684600F09EF9A86A07B06F +:1064F00030BDFFF7D7FFF9E7684600204564000884 +:10650000044B1A68DB6890689B68984294BF00202F +:106510000120704768460020094B10B51C68D868F8 +:10652000226853601A600122DC6084F82420FFF79F +:1065300079FF01462046BDE81040F9F763BF00BF70 +:1065400068460020044B1A68DB6892689B689A4290 +:1065500001D9FFF7E1BF70476846002038B5012335 +:10656000084C00252370656002F0E2FB02F008FC95 +:106570000549064802F0DEFC0223237085F31188EA +:1065800038BD00BF1049002060990008684600200F +:1065900000F080B9034A516853685B1A9842FBD8EF +:1065A000704700BF001000E08B604B630023CA619E +:1065B00000F128020B6302230A618B8401238861A6 +:1065C00081F8263001F11003C26A4A611360C36288 +:1065D00001F12C030846CB6270470000D0E901317D +:1065E000026841F8183CA1F19C033839CB6003697B +:1065F00041F8243C436941F8203C034B41F8043CFA +:10660000C3680248FFF7D0BF1D0400086846002099 +:1066100008B5FFF7E3FFBDE80840FFF741BF000002 +:1066200038B50E4BDC6804F12C05A062E06AA84284 +:106630000FD194F826303BB994F825309B0702BF60 +:10664000D4E9043213605A600F20BDE83840FFF7E8 +:1066500029BF0368E362FFF723FFE7E768460020EE +:10666000302383F31188FFF7DBBF000008B5014634 +:10667000302383F311880820FFF724FF002383F3DE +:10668000118808BD054BDB6821B1036098620320C7 +:10669000FFF718BF4FF0FF30704700BF684600207B +:1066A00003682BB10022026018469962FFF7F8BE1A +:1066B00070470000064BDB6839B1426818605A60C9 +:1066C000136043600420FFF7FDBE4FF0FF307047BA +:1066D000684600200368984206D01A68026050603D +:1066E00018469962FFF7DCBE7047000038B50446D3 +:1066F0000D462068844200D138BD036823605C6089 +:106700008562FFF7CDFEF4E7036810B59C68A242EE +:106710000CD85C688A600B604C6021605960996895 +:106720008A1A9A604FF0FF33836010BD121B1B68FA +:10673000ECE700000A2938BF0A2170B504460D466F +:106740000A26601902F0EEFA02F0D6FA041BA542FE +:1067500003D8751C04462E46F3E70A2E04D90120FF +:10676000BDE8704002F0AEBC70BD0000F8B5144B3F +:106770000D460A2A4FF00A07D96103F11001826021 +:1067800038BF0A22416019691446016048601861E7 +:10679000A81802F0B7FA02F0AFFA431B0646A3426C +:1067A00006D37C1C28192746354602F0BBFAF2E7CF +:1067B0000A2F04D90120BDE8F84002F083BCF8BDDF +:1067C00068460020F8B506460D4602F095FA0F4AD5 +:1067D000134653F8107F9F4206D12A4601463046A1 +:1067E000BDE8F840FFF7C2BFD169BB68441A2C1955 +:1067F00028BF2C46A34202D92946FFF79BFF224619 +:1068000031460348BDE8F840FFF77EBF68460020E8 +:1068100078460020C0E90323002310B45DF8044B40 +:106820004361FFF7CFBF000010B5194C23699842B0 +:106830000DD08168D0E9003213605A609A680A442A +:106840009A60002303604FF0FF33A36110BD02681C +:10685000234643F8102F53600022026022699A42B7 +:1068600003D1BDE8104002F057BA936881680B4429 +:10687000936002F041FA2269E1699268441AA242E7 +:10688000E4D91144BDE81040091AFFF753BF00BF17 +:10689000684600202DE9F047DFF8BC8008F11007BA +:1068A0002C4ED8F8105002F027FAD8F81C40AA68ED +:1068B000031B9A423ED814444FF00009D5E9003238 +:1068C000C8F81C4013605A60C5F80090D8F8103022 +:1068D000B34201D102F020FA89F31188D5E90331DE +:1068E00028469847302383F311886B69002BD8D052 +:1068F00002F002FA6A69A0EB040982464A450DD209 +:10690000022002F0DFFB0022D8F81030B34208D199 +:1069100051462846BDE8F047FFF728BF121A224427 +:10692000F2E712EB09092946384638BF4A46FFF715 +:10693000EBFEB5E7D8F81030B34208D01444C8F8DD +:106940001C00211AA960BDE8F047FFF7F3BEBDE8BF +:10695000F08700BF784600206846002038B502F076 +:10696000CBF9054AD2E90845031B181945F1000186 +:10697000C2E9080138BD00BF6846002010B560B903 +:10698000074804790368053C9B6818BF01249847B1 +:1069900008B144F00404204610BD0124FBE700BF09 +:1069A000C8360020FFF7EABF2DE9F04788461746B2 +:1069B0009A460446B0B90D4E3579052D05D003240D +:1069C0000DE0013D15F0FF050ED032685346394603 +:1069D0003046D2F814904246C8470028F1D12046EC +:1069E000BDE8F0870424FAE70124F8E7C836002060 +:1069F0002DE9F047884617469A460446B0B90D4E31 +:106A00003579052D05D003240DE0013D15F0FF0576 +:106A10000ED03268534639463046D2F81890424676 +:106A2000C8470028F1D12046BDE8F0870424FAE7E2 +:106A30000124F8E7C836002037B50C46154670B972 +:106A400051B101290BD10748694603681B6A984771 +:106A500010B9019B04462B60204603B030BD0424CE +:106A6000FAE700BFC836002000207047FEE70000AC +:106A7000704700004FF0FF30704700004B684360E4 +:106A80008B688360CB68C3600B6943614B690362A9 +:106A90008B6943620B6803607047000008B53C4B8C +:106AA00040F2FF713B48D3F888200A43C3F888209E +:106AB000D3F8882022F4FF6222F00702C3F888206E +:106AC000D3F88820D3F8E0200A43C3F8E020D3F8B5 +:106AD00008210A43C3F808212F4AD3F80831114688 +:106AE000FFF7CCFF00F5806002F11C01FFF7C6FF45 +:106AF00000F5806002F13801FFF7C0FF00F580600B +:106B000002F15401FFF7BAFF00F5806002F1700155 +:106B1000FFF7B4FF00F5806002F18C01FFF7AEFFD4 +:106B200000F5806002F1A801FFF7A8FF00F5806082 +:106B300002F1C401FFF7A2FF00F5806002F1E0015D +:106B4000FFF79CFF00F5806002F1FC01FFF796FF64 +:106B500002F58C7100F58060FFF790FF01F082FC78 +:106B60000E4BD3F8902242F00102C3F89022D3F8E2 +:106B7000942242F00102C3F894220522C3F898201F +:106B80004FF06052C3F89C20054AC3F8A02008BD0E +:106B900000440258000002587499000800ED00E01B +:106BA0001F00080308B501F069FEFFF7D7FC104B82 +:106BB000D3F8DC2042F04002C3F8DC20D3F80421F3 +:106BC00022F04002C3F80421D3F80431094B1A68BB +:106BD00042F008021A601A6842F004021A6000F0DB +:106BE0006FFD00F033FBBDE8084000F0B5B800BF12 +:106BF00000440258001802480120704700207047E6 +:106C00007047000002290CD0032904D0012907484D +:106C100018BF00207047032A05D8054800EBC200C2 +:106C20007047044870470020704700BF789B0008F9 +:106C3000542200202C9B000870B59AB005460846E7 +:106C4000144601A900F0C2F801A8FBF76DF8431C37 +:106C50000022C6B25B001046C5E90034237003234E +:106C6000023404F8013C01ABD1B202348E4201D8A7 +:106C70001AB070BD13F8011B013204F8010C04F8BE +:106C8000021CF1E708B5302383F311880348FFF7AE +:106C90009BF8002383F3118808BD00BF184900202A +:106CA00090F8803003F01F02012A07D190F881206C +:106CB0000B2A03D10023C0E91D3315E003F0600364 +:106CC000202B08D1B0F884302BB990F88120212AEC +:106CD00003D81F2A04D8FFF759B8222AEBD0FAE7C5 +:106CE000034A426707228267C3670120704700BFDB +:106CF0004B22002007B5052917D8DFE801F0191647 +:106D000003191920302383F31188104A01210190BF +:106D1000FFF702F9019802210D4AFFF7FDF80D482F +:106D2000FFF71EF8002383F3118803B05DF804FB1E +:106D3000302383F311880748FEF7E8FFF2E730239A +:106D400083F311880348FEF7FFFFEBE7CC9A0008B6 +:106D5000F09A00081849002038B50C4D0C4C2A4612 +:106D60000C4904F10800FFF767FF05F1CA0204F1BE +:106D700010000949FFF760FF05F5CA7204F1180019 +:106D80000649BDE83840FFF757BF00BFF06100205B +:106D900054220020A89A0008B59A0008C09A00085A +:106DA00070B5044608460D46FAF7BEFFC6B2204647 +:106DB000013403780BB9184670BD32462946FAF7FC +:106DC0009FFF0028F3D10120F6E700002DE9F047EE +:106DD00005460C46FAF7A8FF2B49C6B22846FFF72E +:106DE000DFFF08B10A36F6B228492846FFF7D8FF78 +:106DF00008B11036F6B2632E0BD8DFF88C80DFF8BE +:106E00008C90234FDFF894A02E7846B92670BDE809 +:106E1000F08729462046BDE8F04702F0FDB9252E4F +:106E20002ED1072241462846FAF76AFF70B9194B5E +:106E3000224603F1100153F8040B8B4242F8040B75 +:106E4000F9D11B78073511341370DDE70822494664 +:106E50002846FAF755FF98B9A21C0F4B1978023251 +:106E60000909C95D02F8041C13F8011B01F00F01A8 +:106E70005345C95D02F8031CF0D118340835C3E747 +:106E8000013504F8016BBFE7989B0008C09A000821 +:106E9000B29B0008A09B000800E8F11F0CE8F11F5E +:106EA000BFF34F8F044B1A695107FCD1D3F810215F +:106EB0005207F8D1704700BF0020005208B50D4BB3 +:106EC0001B78ABB9FFF7ECFF0B4BDA68D10704D5A1 +:106ED0000A4A5A6002F188325A60D3F80C21D2076C +:106EE00006D5064AC3F8042102F18832C3F804210A +:106EF00008BD00BF4E6400200020005223016745FA +:106F000008B5114B1B78F3B9104B1A69510703D51B +:106F1000DA6842F04002DA60D3F81021520705D552 +:106F2000D3F80C2142F04002C3F80C21FFF7B8FF60 +:106F3000064BDA6842F00102DA60D3F80C2142F025 +:106F40000102C3F80C2108BD4E640020002000524D +:106F50000F289ABF00F580604004002070470000B1 +:106F60004FF4003070470000102070470F2808B51C +:106F70000BD8FFF7EDFF00F500330268013204D1B2 +:106F800004308342F9D1012008BD0020FCE7000055 +:106F90000F2838B505463FD8FFF782FF1F4CFFF793 +:106FA0008DFF4FF0FF3307286361C4F814311DD8FB +:106FB0002361FFF775FF030243F02403E360E368F6 +:106FC00043F08003E36023695A07FCD42846FFF7A7 +:106FD00067FFFFF7BDFF4FF4003100F0ABFA284622 +:106FE000FFF78EFFBDE83840FFF7C0BFC4F810318F +:106FF000FFF756FFA0F108031B0243F02403C4F877 +:107000000C31D4F80C3143F08003C4F80C31D4F8BF +:1070100010315B07FBD4D9E7002038BD00200052B7 +:107020002DE9F84F05460C46104645EA0203DE06F8 +:1070300002D00020BDE8F88F20F01F00DFF8BCB0C0 +:10704000DFF8BCA0FFF73AFF04EB0008444503D18A +:107050000120FFF755FFEDE720222946204602F0E8 +:10706000A3F810B920352034F0E72B4605F12002B3 +:107070001F68791CDDD104339A42F9D105F17843B8 +:107080001B481C4EB3F5801F1B4B38BF184603F13D +:10709000F80332BFD946D1461E46FFF701FF07600D +:1070A000A5EB040C336804F11C0143F002033360C8 +:1070B000231FD9F8007017F00507FAD153F8042FF1 +:1070C0008B424CF80320F4D1BFF34F8FFFF7E8FE5B +:1070D0004FF0FF332022214603602846336823F017 +:1070E0000203336002F060F80028BBD03846B0E7F6 +:1070F000142100520C200052142000521020005283 +:107100001021005210B5084C237828B11BB9FFF7A5 +:10711000D5FE0123237010BD002BFCD02070BDE8EC +:107120001040FFF7EDBE00BF4E6400202DE9F04F88 +:107130000D4685B0814658B111F00D0614BF2022CE +:10714000082211F00803019304D0431E034269D0C2 +:10715000002435E0002E37D009F11F0121F01F096E +:107160004FF00108314F05F00403DFF8CCA005EA29 +:10717000080BBBF1000F32D07869C0072FD408F19B +:1071800001080C37B8F1060FF3D19EB9284D4946D6 +:10719000A819019201F016FE0446002839D12036C4 +:1071A000019AA02EF3D1494601F00CFE04460028B6 +:1071B0002FD1019A49461F4801F004FE044660BBE6 +:1071C000204605B0BDE8F08F0029C9D10146284608 +:1071D000029201F0F7FD0446D8B9029AC0E713B154 +:1071E00078694107CBD5AC0702D578698007C6D549 +:1071F000019911B178690107C1D549460AEB4810D8 +:10720000CDE9022301F0DEFD0446DDE9022300287A +:10721000B5D04A460021204601E04A460021FAF74F +:107220008BFDCDE70246002E96D199E7C49B00085E +:107230009064002050640020706400200021FFF75B +:1072400075BF00000121FFF771BF000070B5144D3C +:107250000124144E40F2FF3200210120FAF76CFDA8 +:1072600006EB441001342A6955F80C1F01F096FD15 +:10727000062CF5D137254FF4C0542046FFF7E2FF26 +:10728000014628B122460848BDE8704001F086BD9D +:10729000C4EBC404013D4FEAD404EED170BD00BF7D +:1072A000C49B000870640020506400200421FFF794 +:1072B0003DBF00004843FFF7C1BF000008B101F027 +:1072C000F3BD7047B0F5805F10B5044607D8FFF7EF +:1072D000EDFF28B92046BDE81040FFF7AFBF002002 +:1072E00010BD0000FFF7EABF70B5AAB140EA010384 +:1072F00013F01F030FD1094C0144A5686D0706D593 +:107300002568A84203D366683544A94204D90333EB +:107310000C34122BF1D10022104670BDC49B000822 +:1073200008B501F0D7FE034AD2E90032C01842EB9B +:10733000010108BD30650020434BD3E900232DE94E +:10734000F34113437CD0FFF7EBFF404A00230027B3 +:10735000F9F772F806460D463D4A0023F9F76CF836 +:107360000023144630462946394AF9F765F84FF4A8 +:1073700061613C23ADF80170B4FBF1F5B4FBF3F6A9 +:1073800001FB154103FB16464624B1FBF3F1314BDB +:10739000F6B28DF8004098423CD84FF0640C4FF4A0 +:1073A000C87EA30704F26C7225D1B2FBFCF30CFB80 +:1073B000132313BBB2FBFEF30EFB1322B2FA82F3CC +:1073C0005B0903F26D18621C8045D2B217D90FB168 +:1073D0008DF800400022204C4FF00C0C17460CFB9F +:1073E0000343D4B2013213F804C084450CD8A0EB97 +:1073F0000C000127F5E70023E3E70123E1E7A0EB19 +:10740000080014460127CCE70FB18DF80140431C5A +:107410008DF802309DF80100431C9DF800005038A3 +:10742000400640EA43509DF8023040EA034040EAFB +:10743000560040EAC52040EA411002B0BDE8F081A4 +:107440004FF40410F9E700BF3065002040420F0000 +:107450008051010090230B000C9C00080244074B54 +:10746000D2B210B5904200D110BD441C00B253F806 +:10747000200041F8040BE0B2F4E700BF5040005890 +:107480000E4B30B51C6F240405D41C6F1C671C6F99 +:1074900044F400441C670A4C02442368D2B243F40B +:1074A00080732360074B904200D130BD441C51F8DB +:1074B000045B00B243F82050E0B2F4E70044025805 +:1074C000004802585040005807B5012201A9002089 +:1074D000FFF7C4FF019803B05DF804FB13B5044641 +:1074E000FFF7F2FFA04205D0012201A9002001947C +:1074F000FFF7C6FF02B010BD10B56424013C4FF485 +:107500007A70FFF7B3F814F0FF04F7D1084B4FF08F +:10751000807214249A6103F5805308229A61013C19 +:107520004FF47A70FFF7A2F814F0FF04F7D110BD02 +:10753000000002580144BFF34F8F064B884204D32A +:10754000BFF34F8FBFF36F8F7047C3F85C022030DB +:10755000F4E700BF00ED00E00144BFF34F8F064B9E +:10756000884204D3BFF34F8FBFF36F8F7047C3F8C8 +:1075700070022030F4E700BF00ED00E070B5054672 +:1075800016460C4601201021FFF794FE2860467332 +:107590003CB1204636B1FFF789FE2B68186000B178 +:1075A0009C6070BDFFF74EFEF7E70000F8B50F4690 +:1075B0001546044648B905F11F010126386821F037 +:1075C0001F01FFF7B7FF3046F8BD427B29463868F8 +:1075D000FFF78AFE06460028EDD13B686360A3688A +:1075E000AB4210D213B12068FFF768FE637B2846D8 +:1075F0002BB1FFF75BFE206020B9A060E3E7FFF747 +:1076000021FEF8E7A560206805F11F01012621F0A1 +:107610001F013860FFF78EFF2673D4E710B50446CC +:1076200040B10068884205D1606808B1FAF75EFB96 +:107630000023237310BD0000F8B50F46144605461D +:1076400048B904F11F010126386821F01F01FFF736 +:1076500083FF3046F8BD427B21463868FFF744FE81 +:1076600006460028EDD1AB68A34210D213B12868BA +:10767000FFF724FE6B7B20462BB1FFF717FE286037 +:1076800020B9A860E5E7FFF7DDFDF8E7AC603968F1 +:1076900019B122462868FAF729FB286804F11F016E +:1076A000012621F01F013860FFF756FF2E73D0E747 +:1076B00020B103688B4204BF0023037370470000AE +:1076C000034B1A681AB9034AD2F8D0241A607047DB +:1076D000386500200040025808B5FFF7F1FF024B63 +:1076E0001868C0F3806008BD38650020EFF3098397 +:1076F000054968334A6B22F001024A6383F3098823 +:10770000002383F31188704700EF00E0302080F3FE +:10771000118862B60D4B0E4AD96821F4E061090464 +:10772000090C0A430B49DA60D3F8FC2042F080725E +:10773000C3F8FC20084AC2F8B01F116841F00101EB +:1077400011602022DA7783F82200704700ED00E014 +:107750000003FA0555CEACC5001000E0302310B58B +:1077600083F311880E4B5B6813F4006314D0F1EEC1 +:10777000103AEFF309844FF08073683CE361094BE2 +:10778000DB6B236684F30988FEF7BAFE10B1064B63 +:10779000A36110BD054BFBE783F31188F9E700BF38 +:1077A00000ED00E000EF00E02F04000832040008C4 +:1077B00070B5BFF34F8FBFF36F8F1A4A0021C2F825 +:1077C0005012BFF34F8FBFF36F8F536943F40033F1 +:1077D0005361BFF34F8FBFF36F8FC2F88410BFF3B5 +:1077E0004F8FD2F8803043F6E074C3F3C900C3F37F +:1077F0004E335B0103EA0406014646EA817501390E +:10780000C2F86052F9D2203B13F1200FF2D1BFF33E +:107810004F8F536943F480335361BFF34F8FBFF3EE +:107820006F8F70BD00ED00E0FEE70000214B2248A5 +:10783000224A70B5904237D3214BC11EDA1C121A6E +:1078400022F003028B4238BF00220021FAF774FABB +:107850001C4A0023C2F88430BFF34F8FD2F8803027 +:1078600043F6E074C3F3C900C3F34E335B0103EA8C +:107870000406014646EA81750139C2F86C52F9D214 +:10788000203B13F1200FF2D1BFF34F8FBFF36F8F67 +:10789000BFF34F8FBFF36F8F0023C2F85032BFF397 +:1078A0004F8FBFF36F8F70BD53F8041B40F8041B5C +:1078B000C0E700BF149D0008346700203467002033 +:1078C0003467002000ED00E0074BD3F8D81021EA20 +:1078D0000001C3F8D810D3F8002122EA0002C3F84F +:1078E0000021D3F8003170470044025870B5D0E948 +:1078F000244300224FF0FF359E6804EB42135101F0 +:10790000D3F80009002805DAD3F8000940F08040D8 +:10791000C3F80009D3F8000B002805DAD3F8000BF0 +:1079200040F08040C3F8000B013263189642C3F860 +:107930000859C3F8085BE0D24FF00113C4F81C38B3 +:1079400070BD0000890141F02001016103699B06BF +:10795000FCD41220FEF71EBE10B50A4C2046FEF7DE +:10796000B9FA094BC4F89030084BC4F89430084C6D +:107970002046FEF7AFFA074BC4F89030064BC4F828 +:10798000943010BD3C65002000000840489C000871 +:10799000D865002000000440549C000870B50378AE +:1079A0000546012B5CD1434BD0F89040984258D10A +:1079B000414B0E216520D3F8D82042F00062C3F875 +:1079C000D820D3F8002142F00062C3F80021D3F898 +:1079D0000021D3F8802042F00062C3F88020D3F861 +:1079E000802022F00062C3F88020D3F88030FDF7B9 +:1079F000B5FC324BE360324BC4F800380023D5F8B5 +:107A00009060C4F8003EC02323604FF40413A363C6 +:107A10003369002BFCDA01230C203361FEF7BAFD39 +:107A20003369DB07FCD41220FEF7B4FD3369002B69 +:107A3000FCDA00262846A660FFF758FF6B68C4F8FA +:107A40001068DB68C4F81468C4F81C6883BB1D4B5D +:107A5000A3614FF0FF336361A36843F00103A360A8 +:107A600070BD194B9842C9D1134B4FF08060D3F8C9 +:107A7000D82042F00072C3F8D820D3F8002142F099 +:107A80000072C3F80021D3F80021D3F8802042F01F +:107A90000072C3F88020D3F8802022F00072C3F86F +:107AA0008020D3F88030FFF70FFF0E214D209EE796 +:107AB000064BCDE73C6500200044025840140040CE +:107AC00003002002003C30C0D8650020083C30C0D4 +:107AD000F8B5D0F89040054600214FF000662046EA +:107AE000FFF730FFD5F8941000234FF001128F6894 +:107AF0004FF0FF30C4F83438C4F81C2804EB4312AC +:107B000001339F42C2F80069C2F8006BC2F808094D +:107B1000C2F8080BF2D20B68D5F89020C5F898305F +:107B2000636210231361166916F01006FBD1122050 +:107B3000FEF730FDD4F8003823F4FE63C4F80038B3 +:107B4000A36943F4402343F01003A3610923C4F85D +:107B50001038C4F814380B4BEB604FF0C043C4F836 +:107B6000103B094BC4F8003BC4F81069C4F8003955 +:107B7000D5F8983003F1100243F48013C5F898202B +:107B8000A362F8BD249C000840800010D0F890202B +:107B900090F88A10D2F8003823F4FE6343EA011308 +:107BA000C2F80038704700002DE9F84300EB81036C +:107BB000D0F890500C468046DA680FFA81F94801F7 +:107BC000166806F00306731E022B05EB41134FF0F7 +:107BD000000194BFB604384EC3F8101B4FF00101EA +:107BE00004F1100398BF06F1805601FA03F391697E +:107BF00098BF06F5004600293AD0578A04F158018B +:107C0000374349016F50D5F81C180B430021C5F8C4 +:107C10001C382B180127C3F81019A7405369611E9F +:107C20009BB3138A928B9B08012A88BF5343D8F8D1 +:107C30009820981842EA034301F140022146C8F80F +:107C40009800284605EB82025360FFF77BFE08EBA5 +:107C50008900C3681B8A43EA845348341E43640185 +:107C60002E51D5F81C381F43C5F81C78BDE8F883A1 +:107C700005EB4917D7F8001B21F40041C7F8001B9A +:107C8000D5F81C1821EA0303C0E704F13F030B4AAF +:107C90002846214605EB83035A60FFF753FE05EBA8 +:107CA0004910D0F8003923F40043C0F80039D5F862 +:107CB0001C3823EA0707D7E7008000100004000201 +:107CC000D0F894201268C0F89820FFF70FBE00008B +:107CD0005831D0F8903049015B5813F4004004D07B +:107CE00013F4001F0CBF0220012070474831D0F868 +:107CF000903049015B5813F4004004D013F4001F86 +:107D00000CBF02200120704700EB8101CB68196A8B +:107D10000B6813604B6853607047000000EB8103F1 +:107D200030B5DD68AA691368D36019B9402B84BFE8 +:107D3000402313606B8A1468D0F890201C4402EB37 +:107D40004110013C09B2B4FBF3F46343033323F065 +:107D5000030343EAC44343F0C043C0F8103B2B681D +:107D600003F00303012B0ED1D2F8083802EB4110C7 +:107D700013F4807FD0F8003B14BF43F0805343F0EE +:107D80000053C0F8003B02EB4112D2F8003B43F035 +:107D90000443C2F8003B30BD2DE9F041D0F89060BB +:107DA00005460C4606EB4113D3F8087B3A07C3F8A7 +:107DB000087B08D5D6F814381B0704D500EB8103DF +:107DC000DB685B689847FA071FD5D6F81438DB07DD +:107DD0001BD505EB8403D968CCB98B69488A5A68EE +:107DE000B2FBF0F600FB16228AB91868DA689042F6 +:107DF0000DD2121AC3E90024302383F311882146DF +:107E00002846FFF78BFF84F31188BDE8F08101233A +:107E100003FA04F26B8923EA02036B81CB68002B1F +:107E2000F3D021462846BDE8F041184700EB810316 +:107E30004A0170B5DD68D0F890306C692668E6605C +:107E400056BB1A444FF40020C2F810092A6802F009 +:107E50000302012A0AB20ED1D3F8080803EB421438 +:107E600010F4807FD4F8000914BF40F0805040F037 +:107E70000050C4F8000903EB4212D2F8000940F0A8 +:107E80000440C2F800090122D3F8340802FA01F1D3 +:107E90000143C3F8341870BD19B9402E84BF402087 +:107EA000206020681A442E8A8419013CB4FBF6F441 +:107EB00040EAC44040F00050C6E700002DE9F84316 +:107EC000D0F8906005460C464F0106EB4113D3F8FD +:107ED000088918F0010FC3F808891CD0D6F81038AB +:107EE000DB0718D500EB8103D3F80CC0DCF81430A5 +:107EF000D3F800E0DA68964530D2A2EB0E024FF0DC +:107F000000091A60C3F80490302383F31188FFF747 +:107F10008DFF89F3118818F0800F1DD0D6F8343802 +:107F20000126A640334217D005EB84030134D5F86F +:107F30009050D3F80CC0E4B22F44DCF8142005EBC9 +:107F40000434D2F800E05168714514D3D5F83438C0 +:107F500023EA0606C5F83468BDE8F883012303FA6E +:107F600001F2038923EA02030381DCF80830002BC5 +:107F7000D1D09847CFE7AEEB0103BCF810008342A5 +:107F800028BF0346D7F8180980B2B3EB800FE3D8B7 +:107F90009068A0F1040959F8048FC4F80080A0EBA0 +:107FA00009089844B8F1040FF5D818440B449060C0 +:107FB0005360C8E72DE9F84FD0F8905004466E6939 +:107FC000AB691E4016F480586E6103D0BDE8F84FCF +:107FD000FDF7F0BF002E12DAD5F8003E9B0705D062 +:107FE000D5F8003E23F00303C5F8003ED5F8043869 +:107FF000204623F00103C5F80438FEF709F83705D9 +:1080000005D52046FFF772FC2046FDF7EFFFB004D0 +:108010000CD5D5F8083813F0060FEB6823F470532D +:108020000CBF43F4105343F4A053EB6031071BD54E +:108030006368DB681BB9AB6923F00803AB61237885 +:10804000052B0CD1D5F8003E9A0705D0D5F8003E97 +:1080500023F00303C5F8003E2046FDF7D9FF63680F +:10806000DB680BB120469847F30200F1BA80B702F3 +:1080700026D5D4F8909000274FF0010A09EB47125B +:10808000D2F8003B03F44023B3F5802F11D1D2F88E +:10809000003B002B0DDA62890AFA07F322EA030398 +:1080A000638104EB8703DB68DB6813B13946204644 +:1080B00098470137D4F89430FFB29B689F42DDD9CE +:1080C000F00619D5D4F89000026AC2F30A1702F03C +:1080D0000F0302F4F012B2F5802F00F0CA80B2F55F +:1080E000402F09D104EB8303002200F58050DB68A8 +:1080F0001B6A974240F0B0803003D5F8185835D548 +:10810000E90303D500212046FFF746FEAA0303D565 +:1081100001212046FFF740FE6B0303D502212046D4 +:10812000FFF73AFE2F0303D503212046FFF734FE65 +:10813000E80203D504212046FFF72EFEA90203D54D +:1081400005212046FFF728FE6A0203D506212046B6 +:10815000FFF722FE2B0203D507212046FFF71CFE66 +:10816000EF0103D508212046FFF716FE700340F10A +:10817000A780E90703D500212046FFF79FFEAA0745 +:1081800003D501212046FFF799FE6B0703D5022195 +:108190002046FFF793FE2F0703D503212046FFF764 +:1081A0008DFEEE0603D504212046FFF787FEA806C4 +:1081B00003D505212046FFF781FE690603D5062178 +:1081C0002046FFF77BFE2A0603D507212046FFF74E +:1081D00075FEEB0574D520460821BDE8F84FFFF782 +:1081E0006DBED4F890904FF0000B4FF0010AD4F818 +:1081F00094305FFA8BF79B689F423FF638AF09EBEC +:108200004713D3F8002902F44022B2F5802F20D181 +:10821000D3F80029002A1CDAD3F8002942F0904252 +:10822000C3F80029D3F80029002AFBDB3946D4F82B +:108230009000FFF787FB22890AFA07F322EA03037B +:10824000238104EB8703DB689B6813B13946204622 +:1082500098470BF1010BCAE7910701D1D0F80080D4 +:10826000072A02F101029CBF03F8018B4FEA18288C +:108270003FE704EB830300F58050DA68D2F818C0BA +:10828000DCF80820DCE9001CA1EB0C0C00218F427B +:1082900008D1DB689B699A683A449A605A683A4404 +:1082A0005A6029E711F0030F01D1D0F800808C4506 +:1082B00001F1010184BF02F8018B4FEA1828E6E7BB +:1082C000BDE8F88F08B50348FFF774FEBDE8084025 +:1082D000FFF744BA3C65002008B50348FFF76AFE83 +:1082E000BDE80840FFF73ABAD8650020D0F89030D2 +:1082F00003EB4111D1F8003B43F40013C1F8003BFC +:1083000070470000D0F8903003EB4111D1F80039EC +:1083100043F40013C1F8003970470000D0F89030E2 +:1083200003EB4111D1F8003B23F40013C1F8003BEB +:1083300070470000D0F8903003EB4111D1F80039BC +:1083400023F40013C1F8003970470000064BD3F83E +:10835000DC200243C3F8DC20D3F804211043C3F827 +:108360000401D3F8043170470044025808B53C4B6F +:108370004FF0FF31D3F8802062F00042C3F8802034 +:10838000D3F8802002F00042C3F88020D3F8802088 +:10839000D3F88420C3F88410D3F884200022C3F8D3 +:1083A0008420D3F88400D86F40F0FF4040F4FF00F1 +:1083B00040F4DF4040F07F00D867D86F20F0FF40E6 +:1083C00020F4FF0020F4DF4020F07F00D867D86F52 +:1083D000D3F888006FEA40506FEA5050C3F8880025 +:1083E000D3F88800C0F30A00C3F88800D3F88800E7 +:1083F000D3F89000C3F89010D3F89000C3F8902001 +:10840000D3F89000D3F89400C3F89410D3F89400F4 +:10841000C3F89420D3F89400D3F89800C3F89810C8 +:10842000D3F89800C3F89820D3F89800D3F88C00BC +:10843000C3F88C10D3F88C00C3F88C20D3F88C00D0 +:10844000D3F89C00C3F89C10D3F89C10C3F89C2070 +:10845000D3F89C30FCF730FABDE8084000F0D6B9FC +:108460000044025808B50122534BC3F80821534B6E +:10847000D3F8F42042F00202C3F8F420D3F81C2110 +:1084800042F00202C3F81C210222D3F81C314C4BEB +:10849000DA605A689104FCD54A4A1A6001229A604F +:1084A000494ADA6000221A614FF440429A61444B13 +:1084B0009A699204FCD51A6842F480721A603F4BA4 +:1084C0001A6F12F4407F04D04FF480321A670022F2 +:1084D0001A671A6842F001021A60384B1A6850078E +:1084E000FCD500221A611A6912F03802FBD1012171 +:1084F00019604FF0804159605A67344ADA62344A51 +:108500001A611A6842F480321A602C4B1A6891037F +:10851000FCD51A6842F480521A601A689204FCD59D +:108520002C4A2D499A6200225A63196301F57C0195 +:10853000DA6301F5E77199635A64284A1A64284A94 +:10854000DA621A6842F0A8521A601C4B1A6802F0EC +:108550002852B2F1285FF9D148229A614FF488621B +:10856000DA6140221A621F4ADA641F4A1A651F4AFA +:108570005A651F4A9A6532231E4A1360136803F036 +:108580000F03022BFAD10D4A136943F00303136161 +:10859000136903F03803182BFAD14FF00050FFF79E +:1085A000D5FE4FF08040FFF7D1FE4FF00040BDE810 +:1085B0000840FFF7CBBE00BF0080005100440258C6 +:1085C0000048025800C000F0020000010000FF0156 +:1085D000008890083220600063020901470E0508F8 +:1085E000DD0BBF0120000020000001100910E00099 +:1085F00000010110002000524FF0B04208B5D2F83F +:10860000883003F00103C2F8883023B1044A1368AC +:108610000BB150689847BDE80840FFF79FB800BF0E +:10862000B46600204FF0B04208B5D2F8883003F0AD +:108630000203C2F8883023B1044A93680BB1D068B2 +:108640009847BDE80840FFF789B800BFB46600202E +:108650004FF0B04208B5D2F8883003F00403C2F8F6 +:10866000883023B1044A13690BB150699847BDE8BB +:108670000840FFF773B800BFB46600204FF0B04267 +:1086800008B5D2F8883003F00803C2F8883023B167 +:10869000044A93690BB1D0699847BDE80840FFF7D9 +:1086A0005DB800BFB46600204FF0B04208B5D2F804 +:1086B000883003F01003C2F8883023B1044A136AEB +:1086C0000BB1506A9847BDE80840FFF747B800BFB4 +:1086D000B46600204FF0B04310B5D3F8884004F4DE +:1086E0007872C3F88820A30604D5124A936A0BB1A6 +:1086F000D06A9847600604D50E4A136B0BB1506BD5 +:108700009847210604D50B4A936B0BB1D06B984761 +:10871000E20504D5074A136C0BB1506C9847A305CA +:1087200004D5044A936C0BB1D06C9847BDE8104057 +:10873000FFF714B8B46600204FF0B04310B5D3F87B +:10874000884004F47C42C3F88820620504D5164AA8 +:10875000136D0BB1506D9847230504D5124A936DE4 +:108760000BB1D06D9847E00404D50F4A136E0BB1DE +:10877000506E9847A10404D50B4A936E0BB1D06E8E +:108780009847620404D5084A136F0BB1506F98479D +:10879000230404D5044A936F0BB1D06F9847BDE80A +:1087A0001040FEF7DBBF00BFB466002008B50348E9 +:1087B000FCF74AFCBDE80840FEF7D0BFC8360020F1 +:1087C00008B50348FCF744FDBDE80840FEF7C6BF06 +:1087D0002039002008B50348FCF73AFDBDE8084001 +:1087E000FEF7BCBF8C39002008B50348FCF730FD0C +:1087F000BDE80840FEF7B2BFF839002008B500F028 +:10880000BDFCBDE80840FEF7A9BF0000062108B581 +:108810000846FCF7A3FD06210720FCF79FFD062173 +:108820000820FCF79BFD06210920FCF797FD062197 +:108830000A20FCF793FD06211720FCF78FFD062187 +:108840002820FCF78BFD09217A20FCF787FD092100 +:108850003120FCF783FD07213220FCF77FFD0C213E +:108860002620FCF77BFD0C212720FCF777FD0C214F +:108870005220BDE80840FCF771BD000008B5FFF7C5 +:1088800075FD00F043FCFDF749F9FDF7E7F8FDF74A +:108890001FFBFDF7F1F9FEF7B3F9BDE8084000F062 +:1088A00029BA000030B50433039C0172002104FB97 +:1088B0000325C160C0E90653049B0363059BC0E91F +:1088C0000000C0E90422C0E90842C0E90A1143637C +:1088D00030BD00000022416AC260C0E90411C0E955 +:1088E0000A226FF00101FDF701BF0000D0E9043258 +:1088F000934201D1C2680AB9181D70470020704721 +:10890000036919600021C2680132C260C269134460 +:1089100082699342036124BF436A0361FDF7DABEB3 +:1089200038B504460D46E3683BB162690020131D6B +:108930001268A3621344E36207E0237A33B929463D +:108940002046FDF7B7FE0028EDDA38BD6FF00100D4 +:10895000FBE70000C368C269013BC360436913447D +:1089600082699342436124BF436A43610023836267 +:10897000036B03B11847704770B53023044683F387 +:108980001188866A3EB9FFF7CBFF054618B186F31A +:108990001188284670BDA36AE26A13F8015B93420E +:1089A000A36202D32046FFF7D5FF002383F311888B +:1089B000EFE700002DE9F84F04460E4617469846AB +:1089C0004FF0300989F311880025AA46D4F828B061 +:1089D000BBF1000F09D141462046FFF7A1FF20B1AE +:1089E0008BF311882846BDE8F88FD4E90A12A7EB6B +:1089F000050B521A934528BF9346BBF1400F1BD974 +:108A0000334601F1400251F8040B914243F8040B44 +:108A1000F9D1A36A403640354033A362D4E90A2332 +:108A20009A4202D32046FFF795FF8AF31188BD4290 +:108A3000D8D289F31188C9E730465A46F9F756F972 +:108A4000A36A5E445D445B44A362E7E710B5029C01 +:108A50000433017203FB0421C460C0E90613002340 +:108A6000C0E90A33039B0363049BC0E90000C0E92B +:108A70000422C0E90842436310BD0000026A6FF09F +:108A80000101C260426AC0E904220022C0E90A2250 +:108A9000FDF72CBED0E904239A4201D1C26822B965 +:108AA000184650F8043B0B60704700231846FAE75D +:108AB000C3680021C2690133C360436913448269FA +:108AC0009342436124BF436A4361FDF703BE000044 +:108AD00038B504460D46E3683BB1236900201A1DF2 +:108AE000A262E2691344E36207E0237A33B92946BC +:108AF0002046FDF7DFFD0028EDDA38BD6FF00100FC +:108B0000FBE7000003691960C268013AC260C269EC +:108B1000134482699342036124BF436A03610023C3 +:108B20008362036B03B118477047000070B53023B0 +:108B30000D460446114683F31188866A2EB9FFF765 +:108B4000C7FF10B186F3118870BDA36A1D70A36AB8 +:108B5000E26A01339342A36204D3E16920460439F7 +:108B6000FFF7D0FF002080F31188EDE72DE9F84FE3 +:108B700004460D46904699464FF0300A8AF3118814 +:108B80000026B346A76A4FB949462046FFF7A0FF23 +:108B900020B187F311883046BDE8F88FD4E90A0781 +:108BA0003A1AA8EB0607974228BF1746402F1BD951 +:108BB00005F1400355F8042B9D4240F8042BF9D1F0 +:108BC000A36A40364033A362D4E90A239A4204D30D +:108BD000E16920460439FFF795FF8BF3118846457C +:108BE000D9D28AF31188CDE729463A46F9F77EF8BB +:108BF000A36A3D443E443B44A362E5E7D0E9042335 +:108C00009A4217D1C3689BB1836A8BB1043B9B1A0C +:108C10000ED01360C368013BC360C3691A44836903 +:108C20009A42026124BF436A0361002383620123E5 +:108C3000184670470023FBE701F01F03F0B502F070 +:108C40001F0456095A1C0123B6EB511F50F8265039 +:108C500003FA02F34FEA511703F1FF333DBF50F817 +:108C60002720C4F12000134003EA05003BBF03FAAC +:108C700000F225FA04F0E0401043F0BD70B57E220A +:108C80007F210546FFF7D8FF18B1012819D0002031 +:108C900070BD3E2249212846FFF7CEFF2F22044611 +:108CA00031212846FFF7C8FF06460134502202361C +:108CB00053212846B440FFF7BFFF093804FA00F0FB +:108CC000E6E7302245212846FFF7B6FF0130800253 +:108CD000DEE7000090F8D63090F8D7201B0403EBB5 +:108CE000026390F8D42090F8D500134403EB0020E1 +:108CF0007047000000F018BA014B586A704700BF77 +:108D0000000C0040034B002258631A610222DA6013 +:108D1000704700BF000C0040014B0022DA60704732 +:108D2000000C0040014B5863704700BF000C00402E +:108D3000024B034A1A60034A5A6070478C6600204F +:108D40003867002000000220074B494210B55C68DC +:108D5000201A08401968821A8A4203D3A24201D815 +:108D60005A6010BD0020FCE78C66002008B5302357 +:108D700083F31188FFF7E8FF002383F3118808BD10 +:108D80000448054B03600023C0E901330C3000F0B8 +:108D900017B900BF946600206D8D0008CB1D083AFE +:108DA00023F00703591A521A10B4D2080024C0E95C +:108DB000004384600C301C605A605DF8044B00F086 +:108DC000FFB800002DE9F74F364FCD1D884600282B +:108DD00018BF0746082A4FEAD50538BF082207F111 +:108DE0000C003C1D9146019000F02CF9019809F10E +:108DF0000701C9F1000E2246246864B900F02CF97D +:108E00003B68CBB308224946E8009847044698B32C +:108E100040E9027830E004EB010CD4F804A00CEA3D +:108E20000E0C0AF10106ACF1080304EBC6069E42E3 +:108E3000E1D9A6EB0C0CB5EBEC0F4FEAEC0BDAD852 +:108E40009C421DD204F10802AB45A3EB02024FEA9B +:108E5000E202626009D9691CED4303EBC1025D4483 +:108E60005560256843F8315022601C46C3F80480E1 +:108E700044F8087B00F0F0F8204603B0BDE8F08F1E +:108E8000AA45216802D111602346EEE7013504EBC3 +:108E9000C50344F8351003F10801761AF6105E6038 +:108EA0001360F1E79466002073B50446A0F108054D +:108EB00050F8080C54F8043C061D0C3007330190A0 +:108EC000DB0844F8043C00F0BDF8334601989E42AC +:108ED0001A6801D0AB4228D20AB1954225D244F893 +:108EE000082C54F8042C1D60013254F8081C05EBC2 +:108EF000C206B14206D14E68324444F8042C0A68D6 +:108F000044F8082C5E68711C03EBC1018D4207D147 +:108F100054F8042C013232445A6054F8082C1A6078 +:108F200002B0BDE8704000F097B81346CFE70000EC +:108F3000FEE7000070B51E4B0025044686B0586061 +:108F40000E4605638163FEF7E1FB04F12803A5608B +:108F50006563C4E90A3304F11003C4E904334FF034 +:108F6000FF33C4E90044C4E90635FFF7C5FE2B46CC +:108F7000024604F13C012046C4E9082380230D4A3F +:108F80006567FDF711FB7368E0600B4A036201231C +:108F9000009280F824306846F26801923269CDE987 +:108FA0000223064BCDE90435FDF732FB06B070BD58 +:108FB00010490020689C0008609C0008318F000860 +:108FC0000023C0E9000083600361704770B51C4B4B +:108FD00005468468DE685CB3B44213D1036901338B +:108FE000036170BDA36094F8243083B1062B15D1C2 +:108FF000A06A2146D4E9003213605A60FDF740FAB6 +:10900000A36A9C68B368A2689A42EBD306E0D4E9ED +:109010000032204613605A60FDF742FA2846314676 +:10902000FDF72EFAB5620620BDE87040FDF73ABAAA +:109030000369866001330361336BC3603063D0E73B +:109040006846002008B5302383F31188FFF7BEFF80 +:10905000002383F3118808BD194BD96883688B42BC +:1090600010B520D1302383F311880269013A0261DF +:10907000B2B90468C368A0420B631ED04A6B9BB9A7 +:1090800001238A60036103681A68026050601A6BEA +:109090008360C26018631846FDF702FAFDF752FAC2 +:1090A000002383F3118810BD1C68A34203D0A46879 +:1090B000A24238BF2246DB68E1E78260F0E700BFEA +:1090C00068460020024A536B18435063704700BF44 +:1090D0006846002038B5EFF311859DB9EFF305849C +:1090E000C4F30804302334B183F31188FDF736FC50 +:1090F00085F3118838BD83F31188FDF72FFC84F3C5 +:10910000118838BDBDE83840FDF728BC0023054A6A +:1091100019460133102BC2E9001102F10802F8D1FF +:10912000704700BFB4660020114BD3F8E82042F02E +:109130000802C3F8E820D3F8102142F00802C3F86F +:1091400010210C4AD3F81031D36B43F00803D363DA +:10915000C722094B9A624FF0FF32DA6200229A610D +:109160005A63DA605A6001225A611A60704700BF80 +:10917000004402580010005C000C0040094A08B589 +:109180001169D3680B40D9B29B076FEA01011161E5 +:1091900007D5302383F31188FDF7FAF9002383F311 +:1091A000118808BD000C004010B5013902449042FE +:1091B00001D1002005E0037811F8014FA34201D04E +:1091C000181B10BD0130F2E7884210B501EB020414 +:1091D00002D98442234607D8431EA14208D011F881 +:1091E000012B03F8012FF8E7024401468A4200D11F +:1091F00010BD13F8014D02F8014DF7E7C9B203465F +:1092000010F8012B1AB18A42F9D11846704700298B +:1092100018BF0023F9E70000034611F8012B03F8FB +:10922000012B002AF9D1704710B50139034632B13C +:1092300011F8014F03F8014B013A002CF7D11A4401 +:109240000021934200D110BD03F8011BF9E7000093 +:109250004D4435002D2D0A002F6172647570696CC4 +:109260006F742E6162696E002F6172647570696C33 +:109270006F742D7665726966792E6162696E002F52 +:109280006172647570696C6F742D666C6173682EA1 +:109290006162696E002F6172647570696C6F742D04 +:1092A000666C61736865642E6162696E000000001F +:1092B0000000000000000000050F0008A10F0008DA +:1092C00051110008D90F0008990F00080000000094 +:1092D00000000000010F0008AD0F00088911000810 +:1092E000FD0E0008090F000853544D333248373F34 +:1092F0003F3F0053544D3332483733782F3732785D +:109300000053544D3332483734332F3735332F37EA +:109310003530000001105A00031059000120580098 +:10932000032056002F000000537563636573736656 +:10933000756C6C79206D6F756E7465642053444351 +:109340006172642028736C6F77646F776E3D25754A +:10935000290A0000EB769045584641542020200011 +:109360004641543332202020000000002A3A3C3E7F +:109370007C223F7F002B2C3B3D5B5D0043554541EC +:109380004141414345454549494941414592924FF3 +:109390004F4F5555594F554F9C4F9E9F41494F55E3 +:1093A000A5A5A6A7A8A9AAABACADAEAFB0B1B2B304 +:1093B000B4414141B8B9BABBBCBDBEBFC0C1C2C354 +:1093C000C4C54141C8C9CACBCCCDCECFD1D145450A +:1093D0004549494949D9DADBDCDD49DF4FE14F4FE7 +:1093E0004F4FE6E8E85555555959EEEFF0F1F2F3D5 +:1093F000F4F5F6F7F8F9FAFBFCFDFEFF01030507AB +:10940000090E10121416181C1E00000061001A0329 +:10941000E0001703F8000703FF00010078010001D6 +:10942000300132010601390110014A012E01790192 +:10943000060180014D004302810182018201840105 +:10944000840186018701870189018A018B018B01D3 +:109450008D018E018F019001910191019301940181 +:10946000F60196019701980198013D029B019C012C +:109470009D0120029F01A001A001A201A201A4015F +:10948000A401A601A701A701A901AA01AB01AC0192 +:10949000AC01AE01AF01AF01B101B201B301B30143 +:1094A000B501B501B701B801B801BA01BB01BC01F2 +:1094B000BC01BE01F701C001C101C201C301C40169 +:1094C000C501C401C701C801C701CA01CB01CA0156 +:1094D000CD011001DD0101008E01DE011201F30159 +:1094E0000300F101F401F401F80128012202120144 +:1094F0003A020900652C3B023B023D02662C3F020A +:1095000040024102410246020A0153024000810129 +:109510008601550289018A0158028F015A02900181 +:109520005C025D025E025F029301610262029401CD +:109530006402650266026702970196016A02622C64 +:109540006C026D026E029C01700271029D01730239 +:1095500074029F0176027702780279027A027B0216 +:109560007C02642C7E027F02A60181028202A90194 +:109570008402850286028702AE014402B101B20173 +:1095800045028D028E028F0290029102B7017B0389 +:109590000300FD03FE03FF03AC03040086038803FE +:1095A00089038A03B1031103C2030200A303A303C7 +:1095B000C4030803CC0303008C038E038F03D8037A +:1095C0001801F2030A00F903F303F403F503F603A9 +:1095D000F703F703F903FA03FA03300420035004F6 +:1095E0001007600422018A043601C1040E01CF0471 +:1095F0000100C004D00444016105260400000000FD +:109600007D1D0100632C001E9601A01E5A01001F43 +:109610000806101F0606201F0806301F0806401FF8 +:109620000606511F0700591F521F5B1F541F5D1F65 +:10963000561F5F1F601F0806701F0E00BA1FBB1F5A +:10964000C81FC91FCA1FCB1FDA1FDB1FF81FF91F56 +:10965000EA1FEB1FFA1FFB1F801F0806901F08065A +:10966000A01F0806B01F0400B81FB91FB21FBC1FFF +:10967000CC1F0100C31FD01F0206E01F0206E51F1A +:109680000100EC1FF31F0100FC1F4E2101003221DD +:1096900070211002842101008321D0241A05302C6E +:1096A0002F04602C0201672C0601752C0201802C0E +:1096B0006401002D260841FF1A030000C700FC00CA +:1096C000E900E200E400E000E500E700EA00EB006A +:1096D000E800EF00EE00EC00C400C500C900E600A1 +:1096E000C600F400F600F200FB00F900FF00D6000F +:1096F000DC00F800A300D800D7009201E100ED00E3 +:10970000F300FA00F100D100AA00BA00BF00AE00D9 +:10971000AC00BD00BC00A100AB00BB0091259225B0 +:10972000932502252425C100C200C000A90063259D +:10973000512557255D25A200A500102514253425A7 +:109740002C251C2500253C25E300C3005A25542563 +:1097500069256625602550256C25A400F000D00001 +:10976000CA00CB00C8003101CD00CE00CF001825C3 +:109770000C2588258425A600CC008025D300DF0099 +:10978000D400D200F500D500B500FE00DE00DA00FE +:10979000DB00D900FD00DD00AF00B400AD00B1007A +:1097A0001720BE00B600A700F700B800B000A80060 +:1097B000B700B900B300B200A025A000100002401D +:1097C000080002400008024000000B002800024090 +:1097D000080002400408024006010C00400002405C +:1097E000080002400808024010020D005800024024 +:1097F000080002400C08024016030E0070000240F0 +:109800000C0002401008024000040F0088000240D3 +:109810000C0002401408024006051000A00002409F +:109820000C0002401808024010061100B800024067 +:109830000C0002401C08024016072F0010040240D2 +:1098400008040240200802400008380028040240B2 +:10985000080402402408024006093900400402407E +:109860000804024028080240100A3A005804024046 +:10987000080402402C080240160B3B007004024012 +:109880000C04024030080240000C3C0088040240F6 +:109890000C04024034080240060D4400A0040240BB +:1098A0000C04024038080240100E4500B804024083 +:1098B0000C0402403C080240160F46000100000064 +:1098C0000000000000960000000000000000000002 +:1098D0000000000000000000000000000000000088 +:1098E000F96B0008FD6B0008F1560008295A0008C2 +:1098F00085560008AD560008D55600086D5600087C +:1099000000000000DD5A0008C95A0008055B000885 +:10991000F15A0008FD5A0008E95A0008D55A000813 +:10992000C15A0008115B000800000000F55B000848 +:10993000E15B00081D5C0008095C0008155C00087C +:10994000015C0008ED5B0008D95B0008295C000899 +:109950000000000001000000000000006330000073 +:109960005C9900080000000000000000E0460020B4 +:10997000104900200000812A00000000AAAAAAAA1B +:1099800000000024FFFE00000000000000A00A000C +:109990000001000000000000AAAAAAAA000000001E +:1099A000FFFF000000000000000000001400AA56A5 +:1099B00000000000AAAAAAAA14005554FFFF000044 +:1099C00000000000CCCC0C0020681A000000000051 +:1099D000AAAA8AAA10541500FFFF0000000C700705 +:1099E000770000004081020100100000AAAAAAAA84 +:1099F00000410100F7FF00000000007007000000B8 +:109A00000000000000000000AAAAAAAA00000000AE +:109A1000FFFF000000000000000000000000000048 +:109A200000000000AAAAAAAA00000000FFFF000090 +:109A30000000000000000000000000000000000026 +:109A4000AAAAAAAA00000000FFFF00000000000070 +:109A5000000000000000000000000000AAAAAAAA5E +:109A600000000000FFFF00000000000000000000F8 +:109A70000000000000000000AAAAAAAA000000003E +:109A8000FFFF0000000000000000000000000000D8 +:109A900000000000AAAAAAAA00000000FFFF000020 +:109AA00000000000000000004865782F50726F66CB +:109AB00069434E430025424F415244252D424C00FC +:109AC0002553455249414C2500000000020000008A +:109AD00000000000155E0008855E000840004000A0 +:109AE000C0610020D06100200200000000000000E2 +:109AF0000300000000000000CD5E00080000000030 +:109B000010000000E06100200000000001000000E3 +:109B1000000000003C65002001010200F56C000817 +:109B2000056C0008A16C0008856C0008430000006B +:109B3000349B000809024300020100C032090400FE +:109B400000010202010005240010010524010001AA +:109B5000042402020524060001070582030800FF11 +:109B600009040100020A000000070501024000008C +:109B7000070581024000000012000000809B0008E1 +:109B80001201100102000040AE2D16100002010269 +:109B9000030100000403090425424F4152442500FB +:109BA000437562654F72616E67652D626473686F9D +:109BB000740030313233343536373839414243441A +:109BC00045460000000000200000020002000000E6 +:109BD0000000003000000400080000000000002425 +:109BE00000000800040000000004000000FC000069 +:109BF00002000000000004300080000008000000A7 +:109C00000000003800000100010000001F1C1F1EA2 +:109C10001F1E1F1F1E1F1E1F1F1D1F1E1F1E1F1F5B +:109C20001E1F1E1F0000000029600008E1620008DE +:109C30008D630008400040007466002074660020B8 +:109C40000100000084660020800000004001000048 +:109C500008000000000100000010000008000000E3 +:109C600069646C65000000006D61696E002C043849 +:109C7000040438080C10141C2024252600000000C1 +:109C8000000064040100040000000000000C00104B +:109C900028303400D467FF7F01000000000000007E +:109CA0008C0000000000000000001E00000000000A +:109CB000FF00000018490020203900208C390020C6 +:109CC000F839002000000000E8920008830400003A +:109CD000F392000850040000019300080100000006 +:109CE0000000000000960000000008009600000040 +:109CF0000008000004000000949B00080000000021 +:109D00000000000000000000000000000000000053 +:049D1000000000004F :00000001FF diff --git a/Tools/bootloaders/CubeOrange-joey_bl.bin b/Tools/bootloaders/CubeOrange-joey_bl.bin index 3270f22c87..9209ca80b0 100755 Binary files a/Tools/bootloaders/CubeOrange-joey_bl.bin and b/Tools/bootloaders/CubeOrange-joey_bl.bin differ diff --git a/Tools/bootloaders/CubeOrange-joey_bl.hex b/Tools/bootloaders/CubeOrange-joey_bl.hex index 6ad3df3385..1393b512a6 100644 --- a/Tools/bootloaders/CubeOrange-joey_bl.hex +++ b/Tools/bootloaders/CubeOrange-joey_bl.hex @@ -1,1105 +1,2515 @@ :020000040800F2 -:1000000000060020A1020008FD0F00087D0F000877 -:10001000D50F00087D0F0008A90F0008A3020008F3 -:10002000A3020008A3020008A3020008E1290008B7 -:10003000A3020008A3020008A3020008A30200080C -:10004000A3020008A3020008A3020008A3020008FC -:10005000A3020008A3020008693E0008953E0008BC -:10006000C13E0008ED3E0008193F0008A302000849 -:10007000A3020008A3020008A3020008A3020008CC -:10008000A3020008A3020008A3020008A3020008BC -:10009000A3020008A3020008A3020008453F0008CD -:1000A000A3020008A3020008A3020008A30200089C -:1000B000A3020008A3020008A3020008A30200088C -:1000C000A3020008A3020008A3020008A30200087C -:1000D000A3020008A30200081D40000831400008E8 -:1000E000A93F0008A3020008A3020008A302000819 -:1000F000A3020008A3020008A3020008A30200084C -:10010000A3020008A302000859400008A302000847 -:10011000A3020008A3020008A3020008A30200082B -:10012000A3020008A3020008A3020008A30200081B -:10013000A3020008A3020008A3020008A30200080B -:10014000A3020008A3020008A3020008A3020008FB -:10015000A3020008A3020008A3020008A3020008EB -:10016000A3020008A3020008A3020008A3020008DB -:10017000A30200084D350008A3020008A3020008EE -:10018000A3020008A302000845400008A3020008DB -:10019000A3020008A3020008A3020008A3020008AB -:1001A000A3020008A3020008A3020008A30200089B -:1001B000A3020008A3020008A3020008A30200088B -:1001C000A3020008A3020008A3020008A30200087B -:1001D000A302000839350008A3020008A3020008A2 -:1001E000A3020008A3020008A3020008A30200085B -:1001F000A3020008A3020008A3020008A30200084B -:10020000A3020008A3020008A3020008A30200083A -:10021000A3020008A3020008A3020008A30200082A -:10022000A3020008A3020008A3020008A30200081A -:10023000A3020008A3020008A3020008A30200080A -:10024000A3020008A3020008A3020008A3020008FA -:10025000A3020008A3020008A3020008A3020008EA -:10026000A3020008A3020008A3020008A3020008DA -:10027000A3020008A3020008A3020008A3020008CA -:10028000A3020008A3020008A3020008A3020008BA -:10029000A3020008A3020008A3020008A3020008AA -:1002A00002E000F000F8FEE772B63A4880F30888F2 -:1002B000394880F3098839484EF60851CEF20001DA -:1002C000086040F20000CCF200004EF63471CEF22D -:1002D00000010860BFF34F8FBFF36F8F40F2000043 -:1002E000C0F2F0004EF68851CEF200010860BFF374 -:1002F0004F8FBFF36F8F4FF00000E1EE100A4EF604 -:100300003C71CEF200010860062080F31488BFF330 -:100310006F8F02F023FC02F0C5FB03F05FFB4FF090 -:1003200055301F491B4A91423CBF41F8040BFAE784 -:100330001C49194A91423CBF41F8040BFAE71A499B -:100340001A4A1B4B9A423EBF51F8040B42F8040B69 -:10035000F8E700201749184A91423CBF41F8040BC6 -:10036000FAE702F0DDFB03F0BDFB144C144DAC4288 -:1003700003DA54F8041B8847F9E700F041F8114C00 -:10038000114DAC4203DA54F8041B8847F9E702F038 -:10039000C5BB00000006002000220020000000086D -:1003A00000000020000600209044000800220020E9 -:1003B0005C22002060220020D44F0020A002000810 -:1003C000A0020008A0020008A00200082DE9F04FDA -:1003D0002DED108AC1F80CD0D0F80CD0BDEC108AED -:1003E000BDE8F08F002383F311882846A047002042 -:1003F00001F0DAFEFEE701F055FE00DFFEE7000047 -:1004000038B500F0D7FC30B1164B00220E211A721D -:100410005A729972DA7202F0A3FA054602F0D6FA1D -:100420000446D0B9104B9D4219D001339D4241F290 -:10043000883512BF044600250124002002F09AFAF4 -:100440000CB100F059F800F039FD00F0F9FB284636 -:1004500000F004F900F050F8F9E70025EDE7054653 -:10046000EBE700BF00220020010007B008B500F054 -:10047000B3FBA0F120035842584108BD07B541F233 -:100480001203022101A8ADF8043000F0C3FB03B051 -:100490005DF804FB202310B583F311881248C3686C -:1004A0000BB101F007FF0023104A4FF47A710E4898 -:1004B00001F0C4FE002383F311880D4C236813B1AF -:1004C0002368013B2360636813B16368013B636089 -:1004D000084B1B7833B9636823B9022000F070FC25 -:1004E0003223636010BD00BF602200209504000825 -:1004F0007C23002074220020F8B5514B514A1C4641 -:100500001968013100F09B8004339342F8D162688E -:100510004D4B9A4240F293804C4B9B6803F1006331 -:1005200003F500339A4280F08A80002000F0A2FB9D -:100530000220474B187000F041FC464B0021D3F8D5 -:10054000E820C3F8E810D3F81021C3F81011D3F84D -:100550001021D3F8EC20C3F8EC10D3F81421C3F821 -:100560001411D3F81421D3F8F020C3F8F010D3F805 -:100570001821C3F81811D3F81821D3F8802042F0BD -:100580000062C3F88020D3F8802022F00062C3F814 -:100590008020D3F88020D3F8802042F00072C3F886 -:1005A0008020D3F8802022F00072C3F88020D3F896 -:1005B000803072B64FF0E023C3F8084DD4E9000450 -:1005C000BFF34F8FBFF36F8F234AC2F88410BFF37E -:1005D0004F8F536923F480335361BFF34F8FD2F8A9 -:1005E000803043F6E076C3F3C905C3F34E335B01B5 -:1005F00003EA060C29464CEA81770139C2F8747285 -:10060000F9D2203B13F1200FF2D1BFF34F8FBFF38C -:100610006F8FBFF34F8FBFF36F8F536923F4003396 -:1006200053610023C2F85032BFF34F8FBFF36F8F77 -:10063000202383F31188854680F308882047F8BD7E -:100640000000020820000208FFFF0108002200202D -:10065000742200200044025800ED00E02DE9F04F24 -:1006600093B0A94B2022FF2100900AA89D6800F0BA -:10067000CFFBA64A1378A3B90121A5481170C36026 -:10068000202383F31188C3680BB101F013FE00230C -:10069000A04A4FF47A719E4801F0D0FD002383F305 -:1006A0001188009B9C4A03B1136000239B49009C66 -:1006B00098469B461E469A460B705360012000F0F8 -:1006C0007DFB24B1944B1B68002B00F016820020A8 -:1006D00000F082FA0390039B002BF2DB012000F074 -:1006E0006BFB039B213B162BE8D801A252F823F0A9 -:1006F0004D0700087507000809080008BD06000836 -:10070000BD060008BD0600089D0800086F0A000825 -:1007100089090008EB090008130A0008390A0008D3 -:10072000BD0600084B0A0008BD060008BD0A000807 -:10073000ED070008BD060008010B00085907000876 -:10074000ED070008BD060008EB0900080220FFF7CE -:100750008DFE002840F0FB81009B022105A8B8F126 -:10076000000F08BF1C4641F21233ADF8143000F000 -:1007700051FAA3E74FF47A7000F02EFA071EEBDB74 -:100780000220FFF773FE0028E6D0013F052F00F29C -:10079000E081DFE807F0030A0D101336052304217A -:1007A00005A8059300F036FA17E004215648F9E74A -:1007B00004215B48F6E704215A48F3E74FF01C098F -:1007C000484609F1040900F057FA0421059005A8EC -:1007D00000F020FAB9F12C0FF2D101204FF0000AFD -:1007E00000FA07F747EA0B0B5FFA8BFB00F05CFBA4 -:1007F00026B10BF00B030B2B08BF0024FFF73EFEC6 -:100800005CE704214848CDE7002EA5D00BF00B0390 -:100810000B2BA1D10220FFF729FE074600289BD011 -:1008200001203E4E00F026FA4FF000080220307002 -:1008300000F0C4FA5FFA88F9484600F02BFA044643 -:1008400090B1484608F1010800F034FA0028F1D1CF -:10085000B846044641F21213022105A83E46ADF8FF -:10086000143000F0D7F929E7012325460220337020 -:1008700000F0A2FA244B9B68AB4207D9284600F04F -:10088000FBF9013040F068810435F3E70025234B84 -:10089000B8463E461D70204B5D60A7E7002E3FF432 -:1008A0005BAF0BF00B030B2B7FF456AF02201B4BFF -:1008B000187000F083FA322000F08EF9B0F10009D0 -:1008C000FFF64AAF19F003077FF446AF0E4A09EB73 -:1008D0000503926893423FF63FAFB9F5807F3FF73B -:1008E0003BAF124BB945019322DD4FF47A7000F013 -:1008F00073F90390039A002AFFF62EAF039A01378B -:10090000019B03F8012BEDE7002200207823002053 -:1009100060220020950400087C230020742200201F -:1009200004220020082200200C220020782200202F -:10093000C820FFF79BFD074600283FF40DAF1F2D91 -:1009400011D8C5F120020AAB25F0030084494A45BD -:10095000184428BF4A46019200F034FA019AFF2158 -:100960007F4800F055FA4FEAA903C9F387027C4992 -:100970002846019300F054FA064600283FF46AAF77 -:10098000019B05EB830531E70220FFF76FFD00288F -:100990003FF4E2AE00F0AAF900283FF4DDAE0027F4 -:1009A000B946704B9B68BB4218D91F2F11D80A9BC0 -:1009B00001330ED027F0030312AA134453F8203C4E -:1009C00005934846042205A9043700F019FB814627 -:1009D000E7E7384600F050F90590F2E7CDF81490BB -:1009E000042105A800F016F900E70023642104A8FB -:1009F000049300F005F900287FF4AEAE0220FFF763 -:100A000035FD00283FF4A8AE049800F065F9059084 -:100A1000E6E70023642104A8049300F0F1F800281D -:100A20007FF49AAE0220FFF721FD00283FF494AE38 -:100A3000049800F053F9EAE70220FFF717FD0028B9 -:100A40003FF48AAE00F062F9E1E70220FFF70EFD05 -:100A500000283FF481AE05A9142000F05DF9074697 -:100A60000421049004A800F0D5F83946B9E73220F3 -:100A700000F0B2F8071EFFF66FAEBB077FF46CAE56 -:100A8000384A07EB0A03926893423FF665AE0220AC -:100A9000FFF7ECFC00283FF45FAE27F00307574454 -:100AA000BA453FF4A3AE50460AF1040A00F0E4F858 -:100AB0000421059005A800F0ADF8F1E74FF47A7035 -:100AC000FFF7D4FC00283FF447AE00F00FF90028F0 -:100AD00044D00A9B01330BD008220AA9002000F061 -:100AE0009FF900283AD02022FF210AA800F090F9AF -:100AF000FFF7C4FC1C4801F05DFB13B0BDE8F08FAC -:100B0000002E3FF429AE0BF00B030B2B7FF424AE29 -:100B10000023642105A8059300F072F80746002819 -:100B20007FF41AAE0220FFF7A1FC814600283FF4B3 -:100B300013AEFFF7A3FC41F2883001F03BFB0598B0 -:100B400000F0FCF94E463C4600F0AEF9B6E506462C -:100B50004CE64FF0000AFFE5B8467BE6374679E6FB -:100B60007822002000220020A08601002DE9F84F05 -:100B70004FF47A7306460D46002402FB03F7DFF8B4 -:100B80005080DFF8509098F900305FFA84FA5A1CD0 -:100B900001D0A34210D159F824002A4631460368F7 -:100BA000D3F820B03B46D847854205D1074B0120FA -:100BB00083F800A0BDE8F88F0134042CE3D14FF492 -:100BC000FA7001F0F7FA0020F4E700BFC823002014 -:100BD000102200205C410008002307B502460121D5 -:100BE0000DF107008DF80730FFF7C0FF20B19DF829 -:100BF000070003B05DF804FB4FF0FF30F9E7000099 -:100C00000A46042108B5FFF7B1FF80F00100C0B229 -:100C1000404208BD074B0A4630B41978064B53F8DA -:100C20002140014623682046DD69044BAC4630BCB8 -:100C3000604700BFC82300205C410008A086010077 -:100C400070B50A4E00240A4D01F062FD308028681C -:100C50003388834208D901F057FD2B6804440133DF -:100C6000B4F5003F2B60F2D370BD00BFCA23002053 -:100C70008423002001F02ABE00F1006000F500305E -:100C80000068704700F10060920000F5003001F04C -:100C9000A1BD0000054B1A68054B1B889B1A8342B7 -:100CA00002D9104401F030BD002070478423002099 -:100CB000CA23002038B5074D04462868204401F0B7 -:100CC00029FD28B928682044BDE8384001F034BD2A -:100CD00038BD00BF842300200020704700F1FF5082 -:100CE00000F58F10D0F8000870470000064991F811 -:100CF000243033B100230822086A81F82430FFF73A -:100D0000C1BF0120704700BF88230020014B186835 -:100D1000704700BF0010005C244BF0B51A68044611 -:100D2000234BC2F30B06120C1F885868BE4293F97E -:100D3000085028D09F89BE4206D101200C2505FB12 -:100D40000033586893F9085041F201039A421CD0CD -:100D500041F203039A421AD042F201039A4218D098 -:100D600042F203039A4208BF5625621E0B46441EF8 -:100D70000A4493420FD214F9016F581C6EB1034616 -:100D800000F8016CF5E70020D8E75A25EDE7592572 -:100D9000EBE75825E9E7184605E02C2482421C7051 -:100DA00001D9981C5D70401AF0BD00BF0010005CB6 -:100DB0001422002000207047704700007047000098 -:100DC00070470000002310B5934203D0CC5CC4549C -:100DD0000133F9E710BD0000013810B510F9013FEB -:100DE0003BB191F900409C4203D11AB10131013A63 -:100DF000F4E71AB191F90020981A10BD1046FCE7EB -:100E000003460246D01A12F9011B0029FAD1704795 -:100E100002440346934202D003F8011BFAE77047ED -:100E20002DE9F8431F4D14460746884695F82420BF -:100E300052BBDFF870909CB395F824302BB9202278 -:100E4000FF2148462F62FFF7E3FF95F82400414653 -:100E5000C0F1080205EB8000A24228BF2246D6B2AC -:100E60009200FFF7AFFF95F82430A41B17441E44EF -:100E70009044E4B2F6B2082E85F82460DBD1FFF787 -:100E800035FF0028D7D108E02B6A03EB82038342A9 -:100E9000CFD0FFF72BFF0028CBD10020BDE8F8838F -:100EA0000120FBE788230020024B1A78024B1A70BE -:100EB000704700BFC823002010220020F8B5194C4D -:100EC000194800F079FC2146174800F0A1FC24687D -:100ED0001648D4F89020164ED2F80438154D43F039 -:100EE0000203114FC2F8043801F064F92046124998 -:100EF00000F09CFDD4F890200424D2F8043823F0AC -:100F00000203C2F804384FF4E133336055F8040BA0 -:100F1000B84202D0314600F0ADFB013C14F0FF04B2 -:100F2000F4D1F8BD6C420008C832002040420F00E6 -:100F3000B02300205C4100087442000838B50B4B18 -:100F400004461A780A4B53F822500A4B9D420CD0A3 -:100F5000094B002118221846FFF75AFF046001468A -:100F60002846BDE8384000F085BB38BDC8230020C6 -:100F70005C410008C8320020B023002000B59BB0BF -:100F8000EFF3098168226846FFF71CFFEFF3058342 -:100F9000044B9A6BDA6A9A6A9A6A9A6A9A6A9A6AA5 -:100FA0009B6AFEE700ED00E000B59BB0EFF309811E -:100FB00068226846FFF706FFEFF30583044B9A6B40 -:100FC0009A6A9A6A9A6A9A6A9A6A9B6AFEE700BF64 -:100FD00000ED00E000B59BB0EFF3098168226846A0 -:100FE000FFF7F0FEEFF30583034B5A6B9A6A9A6A98 -:100FF0009A6A9A6A9B6AFEE700ED00E0FEE700004D -:1010000030B50A44084D91420DD011F8013B5840CB -:10101000082340F30004013B2C4013F0FF0384EA53 -:101020005000F6D1EFE730BD2083B8ED0268436889 -:101030001143016003B1184770470000024A13686A -:1010400043F0C0031360704700440040024A136835 -:1010500043F0C0031360704700480040024A136821 -:1010600043F0C003136070470078004037B5274C49 -:10107000274D204600F0F2FA04F1140000940023FA -:101080004FF40072234900F0B3F94FF40072224983 -:1010900004F138000094214B00F02CFA204BC4E9F5 -:1010A0001735204C204600F0D9FA04F114000094C2 -:1010B00000234FF400721C4900F09AF94FF40072BB -:1010C0001A4904F138000094194B00F013FA194B37 -:1010D000C4E91735184C204600F0C0FA04F114009A -:1010E00000234FF400721549009400F081F9144B6D -:1010F0004FF40072134904F13800009400F0FAF93B -:10110000114BC4E9173503B030BD00BFCC2300201C -:1011100000E1F50510250020102B00203D100008EF -:10112000004400403824002010270020102D00200B -:101130004D10000800480040A42400201029002081 -:101140005D100008102F002000780040037C30B5AF -:10115000334C002918BF0C46012B18D1314B984253 -:101160000FD1314BD3F8E82042F40032C3F8E82025 -:10117000D3F8102142F40032C3F81021D3F8103113 -:1011800005E02A4B98422FD0294B984238D022684C -:10119000036EC16D03EB52038466B3FBF2F3626826 -:1011A000150442BF23F0070503F0070343EA450394 -:1011B000CB60A36843F040034B60E36843F0010356 -:1011C0008B6042F4967343F001030B604FF0FF33E2 -:1011D0000B62510505D512F010221DD0B2F1805FCF -:1011E0001CD080F8643030BD0F4BD3F8E82042F4B7 -:1011F0008022C3F8E820D3F8102142F48022BBE714 -:10120000094BD3F8E82042F08042C3F8E820D3F835 -:10121000102142F08042AFE77F23E2E73F23E0E77F -:101220006C410008CC2300200044025838240020E0 -:10123000A42400202DE9F047C66D05463768F469FF -:101240002107346219D014F0080118BF8021E20789 -:1012500048BF41F02001A3074FF0200348BF41F0F1 -:101260004001600748BF41F4807183F31188281D55 -:10127000FFF7DCFE002383F31188E2050AD5202363 -:1012800083F311884FF40071281DFFF7CFFE002370 -:1012900083F311884FF020094FF0000A14F0200862 -:1012A00038D13B0616D54FF0200905F1380A200643 -:1012B00010D589F31188504600F050F9002836DA2D -:1012C0000821281DFFF7B2FE27F0800333600023BA -:1012D00083F31188790614D5620612D5202383F38F -:1012E0001188D5E913239A4208D12B6C33B127F02A -:1012F00040071021281DFFF799FE3760002383F374 -:101300001188E30618D5AA6E1369ABB15069BDE820 -:10131000F047184789F31188736A284695F86410D6 -:10132000194000F0B5F98AF31188F469B6E7B062A4 -:1013300088F31188F469BAE7BDE8F087F8B5154677 -:10134000826804460B46AA4200D28568A1692669D4 -:10135000761AB5420BD218462A46FFF733FDA36929 -:101360002B44A3612846A3685B1BA360F8BD0CD97E -:10137000AF1B18463246FFF725FD3A46E168304478 -:10138000FFF720FDE3683B44EBE718462A46FFF7EA -:1013900019FDE368E5E7000083689342F7B504466A -:1013A000154600D28568D4E90460361AB5420BD2DE -:1013B0002A46FFF707FD63692B4463612846A3684B -:1013C0005B1BA36003B0F0BD0DD93246AF1B01918A -:1013D000FFF7F8FC01993A46E0683144FFF7F2FC68 -:1013E000E3683B44E9E72A46FFF7ECFCE368E4E7FF -:1013F00010B50A440024C361029B8460C16002618D -:101400000362C0E90000C0E9051110BD08B5D0E9CC -:101410000532934201D1826882B9826801328260CA -:101420005A1C426119700021D0E904329A4224BF4B -:10143000C368436100F0DAFE002008BD4FF0FF30C2 -:10144000FBE7000070B5202304460E4683F31188A5 -:10145000A568A5B1A368A269013BA360531CA36161 -:1014600015782269934224BFE368A361E3690BB155 -:1014700020469847002383F31188284607E0314629 -:10148000204600F0A3FE0028E2DA85F3118870BD43 -:101490002DE9F74F04460E4617469846D0F81C90A3 -:1014A0004FF0200A8AF311884FF0000B154665B102 -:1014B0002A4631462046FFF741FF034660B94146C0 -:1014C000204600F083FE0028F1D0002383F311882A -:1014D000781B03B0BDE8F08FB9F1000F03D0019085 -:1014E0002046C847019B8BF31188ED1A1E448AF3EE -:1014F0001188DCE7C160C361009B82600362C0E9C0 -:1015000005111144C0E9000001617047F8B50446B7 -:101510000D461646202383F31188A768A7B1A36858 -:10152000013BA36063695A1C62611D70D4E90432F7 -:101530009A4224BFE3686361E3690BB12046984790 -:10154000002080F3118807E03146204600F03EFE7F -:101550000028E2DA87F31188F8BD0000D0E90523FE -:1015600010B59A4201D182687AB9826800210132AD -:1015700082605A1C82611C7803699A4224BFC36846 -:10158000836100F033FE204610BD4FF0FF30FBE7D3 -:101590002DE9F74F04460E4617469846D0F81C90A2 -:1015A0004FF0200A8AF311884FF0000B154665B101 -:1015B0002A4631462046FFF7EFFE034660B9414612 -:1015C000204600F003FE0028F1D0002383F31188A9 -:1015D000781B03B0BDE8F08FB9F1000F03D0019084 -:1015E0002046C847019B8BF31188ED1A1E448AF3ED -:1015F0001188DCE7026843681143016003B11847B2 -:10160000704700001430FFF743BF00004FF0FF3376 -:101610001430FFF73DBF00003830FFF7B9BF0000BE -:101620004FF0FF333830FFF7B3BF00001430FFF73F -:1016300009BF00004FF0FF311430FFF703BF000077 -:101640003830FFF763BF00004FF0FF323830FFF74C -:101650005DBF000000207047FFF708BD044B03602A -:1016600000234360C0E9023301230374704700BFC5 -:101670008441000810B52023044683F31188FFF746 -:1016800065FD02232374002383F3118810BD00003D -:1016900038B5C36904460D461BB904210844FFF759 -:1016A000A9FF294604F11400FFF7B0FE002806DA6E -:1016B000201D4FF48061BDE83840FFF79BBF38BD67 -:1016C000026843681143016003B118477047000086 -:1016D00013B5406B00F58054D4F8A4381A6811781B -:1016E000042914D1017C022911D11979012312890D -:1016F0008B4013420BD101A94C3002F06FF8D4F8A3 -:10170000A4480246019B2179206800F0DFF902B06D -:1017100010BD0000143001F0F1BF00004FF0FF33A6 -:10172000143001F0EBBF00004C3002F0C3B80000F1 -:101730004FF0FF334C3002F0BDB80000143001F020 -:10174000BFBF00004FF0FF31143001F0B9BF0000FF -:101750004C3002F08FB800004FF0FF324C3002F0F6 -:1017600089B800000020704710B500F58054D4F807 -:10177000A4381A681178042917D1017C022914D1E0 -:101780005979012352898B4013420ED1143001F054 -:1017900051FF024648B1D4F8A4484FF44073617930 -:1017A0002068BDE8104000F07FB910BD406BFFF726 -:1017B000DBBF0000704700007FB5124B01250426F7 -:1017C000044603600023057400F184024360294647 -:1017D000C0E902330C4B0290143001934FF4407374 -:1017E000009601F003FF094B04F69442294604F1E8 -:1017F0004C000294CDE900634FF4407301F0CAFF3E -:1018000004B070BDAC410008AD170008D116000847 -:101810000A68202383F311880B790B3342F82300E5 -:101820004B79133342F823008B7913B10B3342F811 -:10183000230000F58053C3F8A41802230374002387 -:1018400083F311887047000038B5037F044613B155 -:1018500090F85430ABB90125201D0221FFF730FF6D -:1018600004F114006FF00101257700F0CBFC04F1C6 -:101870004C0084F854506FF00101BDE8384000F08E -:10188000C1BC38BD10B5012104460430FFF718FF74 -:101890000023237784F8543010BD000038B5044687 -:1018A0000025143001F0BAFE04F14C00257701F058 -:1018B00089FF201D84F854500121FFF701FF2046C5 -:1018C000BDE83840FFF750BF90F8803003F0600368 -:1018D000202B06D190F881200023212A03D81F2A2B -:1018E00006D800207047222AFBD1C0E91D3303E04F -:1018F000034A426707228267C3670120704700BF1F -:101900002C22002037B500F58055D5F8A4381A6888 -:10191000117804291AD1017C022917D119790123E0 -:1019200012898B40134211D100F14C04204602F081 -:1019300009F858B101A9204601F050FFD5F8A44894 -:101940000246019B2179206800F0C0F803B030BD49 -:1019500001F10B03F0B550F8236085B004460D4645 -:10196000FEB1202383F3118804EB8507301D082185 -:10197000FFF7A6FEFB6806F14C005B691B681BB114 -:10198000019001F039FF019803A901F027FF0246F9 -:1019900048B1039B2946204600F098F8002383F3C2 -:1019A000118805B0F0BDFB685A691268002AF5D0AD -:1019B0001B8A013B1340F1D104F18002EAE70000E9 -:1019C000133138B550F82140ECB1202383F311884E -:1019D00004F58053D3F8A4281368527903EB8203EB -:1019E000DB689B695D6845B104216018FFF768FEFC -:1019F000294604F1140001F027FE2046FFF7B4FE4B -:101A0000002383F3118838BD7047000001F01AB934 -:101A100001234022002110B5044600F8303BFFF7B7 -:101A2000F7F90023C4E9013310BD000010B52023ED -:101A3000044683F311882422416000210C30FFF713 -:101A4000E7F9204601F020F902232370002383F3F5 -:101A5000118810BD70B500EB8103054650690E4634 -:101A60001446DA6018B110220021FFF7D1F9A069FD -:101A700018B110220021FFF7CBF931462846BDE806 -:101A8000704001F013BA000083682022002103F0A7 -:101A9000011310B5044683601030FFF7B9F92046F2 -:101AA000BDE8104001F08EBAF0B4012500EB8104CE -:101AB00047898D40E4683D43A46945812360002344 -:101AC000A2606360F0BC01F0ABBA0000F0B4012585 -:101AD00000EB810407898D40E4683D43646905811A -:101AE00023600023A2606360F0BC01F021BB000012 -:101AF00070B5022300250446242203702946C0F84D -:101B000088500C3040F8045CFFF782F9204684F8D6 -:101B1000705001F05FF963681B6823B129462046C5 -:101B2000BDE87040184770BD037880F88C300523FD -:101B3000037043681B6810B504460BB10421984735 -:101B40000023A36010BD000090F88C204368027051 -:101B50001B680BB1052118477047000070B590F85D -:101B60007030044613B1002380F8703004F1800215 -:101B7000204601F04BFA63689B68B3B994F8803053 -:101B800013F0600535D00021204601F0F5FC00215E -:101B9000204601F0E5FC63681B6813B1062120466E -:101BA0009847062384F8703070BD20469847002877 -:101BB000E4D0B4F88630A26F9A4288BFA36794F944 -:101BC0008030A56F002B4FF0200380F20381002DA1 -:101BD00000F0F280092284F8702083F3118800213C -:101BE0002046D4E91D23FFF771FF002383F31188FA -:101BF000DAE794F8812003F07F0343EA022340F2FE -:101C00000232934200F0C58021D8B3F5807F48D0DE -:101C10000DD8012B3FD0022B00F09380002BB2D1C6 -:101C200004F1880262670222A267E367C1E7B3F5A5 -:101C3000817F00F09B80B3F5407FA4D194F882307F -:101C4000012BA0D1B4F8883043F0020332E0B3F5A1 -:101C5000006F4DD017D8B3F5A06F31D0A3F5C06396 -:101C6000012B90D86368204694F882205E6894F82F -:101C70008310B4F88430B047002884D04368636789 -:101C80000368A3671AE0B3F5106F36D040F602423E -:101C900093427FF478AF5C4B63670223A367002312 -:101CA000C3E794F88230012B7FF46DAFB4F888302D -:101CB00023F00203A4F88830C4E91D55E56778E7EE -:101CC000B4F88030B3F5A06F0ED194F8823020467E -:101CD00084F88A3001F0DCF863681B6813B10121D5 -:101CE00020469847032323700023C4E91D339CE753 -:101CF00004F18B0363670123C3E72378042B10D11E -:101D0000202383F311882046FFF7BEFE85F3118858 -:101D10000321636884F88B5021701B680BB1204647 -:101D2000984794F88230002BDED084F88B3004235F -:101D3000237063681B68002BD6D002212046984789 -:101D4000D2E794F8843020461D0603F00F010AD52F -:101D500001F04EF9012804D002287FF414AF2B4B78 -:101D60009AE72B4B98E701F035F9F3E794F88230C6 -:101D7000002B7FF408AF94F8843013F00F01B3D038 -:101D80001A06204602D501F00FFCADE701F000FC79 -:101D9000AAE794F88230002B7FF4F5AE94F88430F3 -:101DA00013F00F01A0D01B06204602D501F0E4FB82 -:101DB0009AE701F0D5FB97E7142284F8702083F3AB -:101DC00011882B462A4629462046FFF76DFE85F3EB -:101DD0001188E9E65DB1152284F8702083F311883B -:101DE00000212046D4E91D23FFF75EFEFDE60B220D -:101DF00084F8702083F311882B462A462946204612 -:101E0000FFF764FEE3E700BFDC410008D4410008AF -:101E1000D841000838B590F870300446002B3ED009 -:101E2000063BDAB20F2A34D80F2B32D8DFE803F0A2 -:101E300037313108223231313131313131313737B7 -:101E4000856FB0F886309D4214D2C3681B8AB5FBFB -:101E5000F3F203FB12556DB9202383F311882B464F -:101E60002A462946FFF732FE85F311880A2384F8B3 -:101E700070300EE0142384F87030202383F311882F -:101E8000002320461A461946FFF70EFE002383F36F -:101E9000118838BDC36F03B198470023E7E70021DD -:101EA000204601F069FB0021204601F059FB6368E0 -:101EB0001B6813B10621204698470623D7E7000088 -:101EC00010B590F870300446142B29D017D8062B83 -:101ED00005D001D81BB110BD093B022BFBD8002156 -:101EE000204601F049FB0021204601F039FB6368E0 -:101EF0001B6813B1062120469847062319E0152BCD -:101F0000E9D10B2380F87030202383F3118800235C -:101F10001A461946FFF7DAFD002383F31188DAE742 -:101F2000C3689B695B68002BD5D1C36F03B1984729 -:101F3000002384F87030CEE7024B0022C3E900335F -:101F40009A60704710310020002382680374054BAB -:101F50001B6899689142FBD25A6803604260106026 -:101F6000586070471031002008B5202383F3118892 -:101F7000037C032B05D0042B0DD02BB983F31188E0 -:101F800008BD436900221A604FF0FF334361FFF739 -:101F9000DBFF0023F2E7D0E9003213605A60F3E779 -:101FA000002382680374054B1B6899689142FBD833 -:101FB0005A6803604260106058607047103100201A -:101FC000054B196908741868026853601A60186133 -:101FD00001230374FEF7FAB9103100204B1C30B511 -:101FE000044687B00A4D10D02B6901A8094A00F0B9 -:101FF00025F92046FFF7E4FF049B13B101A800F088 -:1020000059F92B69586907B030BDFFF7D9FFF8E7D8 -:1020100010310020691F000838B50C4D044641619D -:102020002B6981689A68914203D8BDE83840FFF770 -:102030008BBF1846FFF7B4FF01232C6101462374C0 -:102040002046BDE83840FEF7C1B900BF103100207E -:10205000044B1A681B6990689B68984294BF0020E3 -:10206000012070471031002010B5084C236820690A -:102070001A6854602260012223611A74FFF790FFEE -:1020800001462069BDE81040FEF7A0B910310020DC -:1020900008B5FFF7DDFF18B1BDE80840FFF7E4BF62 -:1020A00008BD0000FFF7E0BFFEE7000010B50C4CD4 -:1020B000FFF742FF00F0B4F880220A49204600F002 -:1020C0003BF8012344F8180C037400F099FC00233A -:1020D00083F3118862B60448BDE8104000F04CB8A4 -:1020E00038310020E0410008F041000800F01CB940 -:1020F000EFF3118020B9EFF30583202282F31188DA -:102100007047000010B530B9EFF30584C4F308043C -:1021100014B180F3118810BDFFF7BAFF84F3118862 -:10212000F9E70000034A516853685B1A9842FBD8EC -:10213000704700BF001000E08260022202827047F8 -:102140008368A3F17C0243F80C2C026943F83C2C11 -:10215000426943F8382C074A43F81C2CC268A3F1A3 -:10216000180043F8102C022203F8082C002203F870 -:10217000072C7047E503000810B5202383F311886E -:10218000FFF7DEFF00210446FFF746FF002383F33D -:102190001188204610BD0000024B1B6958610F20BA -:1021A000FFF70EBF10310020202383F31188FFF7C3 -:1021B000F3BF000008B50146202383F311880820EF -:1021C000FFF70CFF002383F3118808BD49B1064BCC -:1021D00042681B6918605A60136043600420FFF76F -:1021E000FDBE4FF0FF307047103100200368984269 -:1021F00006D01A680260506018465961FFF7A4BE05 -:102200007047000038B504460D462068844200D16E -:1022100038BD036823605C604561FFF795FEF4E715 -:10222000054B4FF0FF3103F11402C3E905220022F0 -:10223000C3E90712704700BF1031002070B51C4E73 -:1022400005460C46C0E9032301F0B2FB334653F8C0 -:10225000142F9A420DD130620A2C2CBF00190A307B -:102260002A60C5E90124C6E90555BDE8704001F0C2 -:1022700089BB316A431AE31838BF1C469368A342EE -:1022800002D9081901F08EFB73699A6894420CD840 -:102290005A68AC602B606A6015609A685D60121BBA -:1022A0009A604FF0FF33F36170BDA41A1B68ECE72E -:1022B0001031002038B51B4C636998420DD08168FD -:1022C000D0E9003213605A600022C2609A680A4462 -:1022D0009A604FF0FF33E36138BD03682246002166 -:1022E00042F8143F93425A60C16003D1BDE83840C0 -:1022F00001F052BB9A688168256A0A449A6001F02D -:1023000057FB6369411B9A688A42E5D9AB181D1ACD -:10231000206A092D98BF01F10A02BDE83840104437 -:1023200001F040BB103100202DE9F041184C00278E -:1023300004F11406656901F03BFB236AAA68C11A1F -:102340008A4215D81344D5F80C802362D5E90032AF -:1023500013605A606369EF60B34201D101F01CFB66 -:1023600087F311882869C047202383F31188E1E7A8 -:102370006169B14209D013441B1ABDE8F0410A2B30 -:102380002CBFC0180A3001F00DBBBDE8F08100BFC2 -:102390001031002000207047FEE700007047000069 -:1023A0004FF0FF307047000002290CD0032904D001 -:1023B0000129074818BF00207047032A05D805489F -:1023C00000EBC2007047044870470020704700BF10 -:1023D000D04200083C2200208442000870B59AB028 -:1023E00005460846144601A900F0C2F801A8FEF708 -:1023F00007FD431C0022C6B25B001046C5E900344D -:1024000023700323023404F8013C01ABD1B202343F -:102410008E4201D81AB070BD13F8011B013204F8C6 -:10242000010C04F8021CF1E708B5202383F311889E -:102430000348FFF767FA002383F3118808BD00BF44 -:10244000C832002090F8803003F01F02012A07D123 -:1024500090F881200B2A03D10023C0E91D3315E039 -:1024600003F06003202B08D1B0F884302BB990F82A -:102470008120212A03D81F2A04D8FFF725BA222A4F -:10248000EBD0FAE7034A426707228267C36701205D -:10249000704700BF3322002007B5052917D8DFE8B1 -:1024A00001F0191603191920202383F31188104A0B -:1024B00001210190FFF7CEFA019802210D4AFFF7A2 -:1024C000C9FA0D48FFF7EAF9002383F3118803B036 -:1024D0005DF804FB202383F311880748FFF7B4F964 -:1024E000F2E7202383F311880348FFF7CBF9EBE7EA -:1024F0002442000848420008C832002038B50C4D7C -:102500000C4C2A460C4904F10800FFF767FF05F15F -:10251000CA0204F110000949FFF760FF05F5CA720D -:1025200004F118000649BDE83840FFF757BF00BF67 -:10253000A04B00203C220020084200081242000864 -:102540001A42000870B5044608460D46FEF758FCCE -:10255000C6B22046013403780BB9184670BD324626 -:102560002946FEF739FC0028F3D10120F6E70000E8 -:102570002DE9F04705460C46FEF742FC2C49C6B251 -:102580002846FFF7DFFF08B10836F6B2294928468A -:10259000FFF7D8FF08B11036F6B2632E0BD8DFF87C -:1025A0009080DFF89090244FDFF898A02E7846B9FD -:1025B0002670BDE8F08729462046BDE8F04701F0C7 -:1025C000B7BD252E30D1072241462846FEF704FC30 -:1025D00080B91A4B224603F10C0153F8040B8B42CD -:1025E00042F8040BF9D1198807359B780F34118014 -:1025F0009370DBE7082249462846FEF7EDFB98B9C1 -:10260000A21C0F4B197802320909C95D02F8041C9B -:1026100013F8011B01F00F015345C95D02F8031CBB -:10262000F0D118340835C1E7013504F8016BBDE776 -:10263000F04200081A42000808430008F842000867 -:1026400000E8F11F0CE8F11FBFF34F8F044B1A692C -:102650005107FCD1D3F810215207F8D1704700BFC1 -:102660000020005208B50D4B1B78ABB9FFF7ECFF0B -:102670000B4BDA68D10704D50A4A5A6002F1883256 -:102680005A60D3F80C21D20706D5064AC3F80421B4 -:1026900002F18832C3F8042108BD00BFFE4D0020BE -:1026A000002000522301674508B5114B1B78F3B990 -:1026B000104B1A69510703D5DA6842F04002DA601C -:1026C000D3F81021520705D5D3F80C2142F040026F -:1026D000C3F80C21FFF7B8FF064BDA6842F001029D -:1026E000DA60D3F80C2142F00102C3F80C2108BDD6 -:1026F000FE4D0020002000520F289ABF00F5806098 -:1027000040040020704700004FF400307047000084 -:10271000102070470F2808B50BD8FFF7EDFF00F524 -:1027200000330268013204D104308342F9D1012020 -:1027300008BD0020FCE700000F2870B5054645D80D -:10274000FFF7D6FC224CFFF77FFF0646FFF78AFF14 -:102750004FF0FF33072D6361C4F8143120D8236193 -:10276000FFF772FF2B0243F02403E360E36843F0BA -:102770008003E36023695A07FCD42846FFF764FF0F -:102780004FF40031FFF7B8FF00F002F93046FFF7D1 -:102790008BFFFFF7B7FC2846BDE87040FFF7BABFD4 -:1027A000C4F81031FFF750FFA5F108031B0243F0F6 -:1027B0002403C4F80C31D4F80C3143F08003C4F87E -:1027C0000C31D4F810315B07FBD4D6E7002070BD84 -:1027D000002000522DE9F84F40EA020305460C465E -:1027E0001746D80602D00020BDE8F88F27F01F0753 -:1027F000DFF8D4B0FFF736FF2744BC4203D10120F5 -:10280000FFF752FFF0E720222946204601F080FC26 -:1028100010B920352034F0E72B4605F120021E6860 -:10282000711CE0D104339A42F9D1FFF761FC05F144 -:102830007843234AB3F5801F224B28BF9A4603F101 -:10284000040338BF9046A2F1080228BF9846A3F1BE -:1028500008033ABF9146DA469946FFF7F5FEC8F8F5 -:102860000060A5EB040CD9F8002004F11C0142F033 -:102870000202C9F80020221FDAF8006016F00506EF -:10288000FAD152F8043F8A424CF80230F4D1BFF337 -:102890004F8FFFF7D9FE4FF0FF32C8F80020D9F86C -:1028A000002022F00202C9F80020FFF72BFC2022B2 -:1028B0002146284601F02CFC0028AAD030469FE78C -:1028C00014200052102100521020005210B5084C64 -:1028D000237828B11BB9FFF7C5FE0123237010BD73 -:1028E000002BFCD02070BDE81040FFF7DDBE00BF1C -:1028F000FE4D00200244074BD2B210B5904200D1E9 -:1029000010BD441C00B253F8200041F8040BE0B2A3 -:10291000F4E700BF504000580E4B30B51C6F240444 -:1029200005D41C6F1C671C6F44F400441C670A4CE0 -:1029300002442368D2B243F480732360074B904271 -:1029400000D130BD441C51F8045B00B243F8205064 -:10295000E0B2F4E7004402580048025850400058E2 -:1029600007B5012201A90020FFF7C4FF019803B0B9 -:102970005DF804FB13B50446FFF7F2FFA04205D053 -:10298000012201A900200194FFF7C6FF02B010BD8B -:102990000144BFF34F8F064B884204D3BFF34F8FE0 -:1029A000BFF36F8F7047C3F85C022030F4E700BFBD -:1029B00000ED00E0034B1A681AB9034AD2F8D0249C -:1029C0001A607047004E00200040025808B5FFF71B -:1029D000F1FF024B1868C0F3806008BD004E002074 -:1029E000EFF30983054968334A6B22F001024A6319 -:1029F00083F30988002383F31188704700EF00E018 -:102A0000202080F3118862B60D4B0E4AD96821F45C -:102A1000E0610904090C0A430B49DA60D3F8FC2091 -:102A200042F08072C3F8FC20084AC2F8B01F116857 -:102A300041F0010111601022DA7783F8220070471B -:102A400000ED00E00003FA0555CEACC5001000E033 -:102A5000202310B583F311880E4B5B6813F40063D9 -:102A600014D0F1EE103AEFF309844FF08073683C14 -:102A7000E361094BDB6B236684F30988FFF7E8FA0F -:102A800010B1064BA36110BD054BFBE783F3118822 -:102A9000F9E700BF00ED00E000EF00E0F7030008F9 -:102AA000FA03000870B5BFF34F8FBFF36F8F1A4A58 -:102AB0000021C2F85012BFF34F8FBFF36F8F5369DD -:102AC00043F400335361BFF34F8FBFF36F8FC2F8EE -:102AD0008410BFF34F8FD2F8803043F6E074C3F315 -:102AE000C900C3F34E335B0103EA0406014646EA1C -:102AF00081750139C2F86052F9D2203B13F1200FE1 -:102B0000F2D1BFF34F8F536943F480335361BFF366 -:102B10004F8FBFF36F8F70BD00ED00E0FEE7000048 -:102B20000A4B0B480B4A90420BD30B4BC11EDA1CCD -:102B3000121A22F003028B4238BF00220021FEF756 -:102B400067B953F8041B40F8041BECE7EC44000899 -:102B5000D44F0020D44F0020D44F002070470000F5 -:102B600070B5D0E9244300224FF0FF359E6804EB96 -:102B700042135101D3F80009002805DAD3F80009FF -:102B800040F08040C3F80009D3F8000B002805DAB4 -:102B9000D3F8000B40F08040C3F8000B01326318FB -:102BA0009642C3F80859C3F8085BE0D24FF001130E -:102BB000C4F81C3870BD000000EB8103D3F80CC0D2 -:102BC0002DE9F043DCF814204E1CD0F89050D2F8D8 -:102BD00000E005EB063605EB4118506870450AD356 -:102BE0000122D5F8343802FA01F123EA0101C5F8CF -:102BF0003418BDE8F083AEEB0003BCF81040A342EC -:102C000028BF2346D8F81849A4B2B3EB840FF0D8F4 -:102C10009468A4F1040959F8047F3760A4EB09070C -:102C20001F44042FF7D81C44034494605360D4E736 -:102C3000890141F02001016103699B06FCD4122047 -:102C4000FFF770BA10B50A4C2046FEF7E1FE094BBB -:102C5000C4F89030084BC4F89430084C2046FEF776 -:102C6000D7FE074BC4F89030064BC4F8943010BD23 -:102C7000044E00200000084040430008A04E002001 -:102C8000000004404C43000870B503780546012B52 -:102C90005DD1494BD0F89040984259D1474B0E2115 -:102CA0006520D3F8D82042F00062C3F8D820D3F8CA -:102CB000002142F00062C3F80021D3F80021D3F8CC -:102CC000802042F00062C3F88020D3F8802022F0F8 -:102CD0000062C3F88020D3F8803000F071FC384BDC -:102CE000E360384BC4F800380023D5F89060C4F88E -:102CF000003EC02323604FF40413A3633369002B09 -:102D0000FCDA01230C203361FFF70CFA3369DB078F -:102D1000FCD41220FFF706FA3369002BFCDA0026F8 -:102D20002846A660FFF71CFF6B68C4F81068DB68D4 -:102D3000C4F81468C4F81C68002B3AD1224BA36174 -:102D40004FF0FF336361A36843F00103A36070BDDC -:102D50001E4B9842C8D1194B0E214D20D3F8D820D4 -:102D600042F00072C3F8D820D3F8002142F000727C -:102D7000C3F80021D3F80021D3F8802042F000727C -:102D8000C3F88020D3F8802022F00072C3F880209E -:102D9000D3F88020D3F8D82022F08062C3F8D8205E -:102DA000D3F8002122F08062C3F80021D3F800316B -:102DB00093E7074BC3E700BF044E002000440258CE -:102DC0004014004003002002003C30C0A04E002010 -:102DD000083C30C0F8B5D0F89040054600214FF0CF -:102DE00000662046FFF724FFD5F8941000234FF02B -:102DF00001128F684FF0FF30C4F83438C4F81C2833 -:102E000004EB431201339F42C2F80069C2F8006B21 -:102E1000C2F80809C2F8080BF2D20B68D5F8902066 -:102E2000C5F89830636210231361166916F0100616 -:102E3000FBD11220FFF776F9D4F8003823F4FE63B3 -:102E4000C4F80038A36943F4402343F01003A3619E -:102E50000923C4F81038C4F814380B4BEB604FF05A -:102E6000C043C4F8103B094BC4F8003BC4F81069D8 -:102E7000C4F80039D5F8983003F1100243F48013F8 -:102E8000C5F89820A362F8BD1C43000840800010DC -:102E9000D0F8902090F88A10D2F8003823F4FE631E -:102EA00043EA0113C2F80038704700002DE9F843E7 -:102EB00000EB8103D0F890500C468046DA680FFA98 -:102EC00081F94801166806F00306731E022B05EB14 -:102ED00041134FF0000194BFB604384EC3F8101BE5 -:102EE0004FF0010104F1100398BF06F1805601FA7A -:102EF00003F3916998BF06F5004600293AD0578A36 -:102F000004F15801374349016F50D5F81C180B43A1 -:102F10000021C5F81C382B180127C3F81019A74049 -:102F20005369611E9BB3138A928B9B08012A88BF49 -:102F30005343D8F89820981842EA034301F140021D -:102F40002146C8F89800284605EB82025360FFF737 -:102F50006FFE08EB8900C3681B8A43EA8453483438 -:102F60001E4364012E51D5F81C381F43C5F81C7848 -:102F7000BDE8F88305EB4917D7F8001B21F40041A1 -:102F8000C7F8001BD5F81C1821EA0303C0E704F1B9 -:102F90003F030B4A2846214605EB83035A60FFF79F -:102FA00047FE05EB4910D0F8003923F40043C0F880 -:102FB0000039D5F81C3823EA0707D7E7008000104E -:102FC00000040002D0F894201268C0F89820FFF79F -:102FD000C7BD00005831D0F8903049015B5813F458 -:102FE000004004D013F4001F0CBF022001207047E2 -:102FF0004831D0F8903049015B5813F4004004D0B8 -:1030000013F4001F0CBF02200120704700EB810168 -:10301000CB68196A0B6813604B68536070470000F7 -:1030200000EB810330B5DD68AA691368D36019B974 -:10303000402B84BF402313606B8A1468D0F8902023 -:103040001C4402EB4110013C09B2B4FBF3F46343AE -:10305000033323F0030343EAC44343F0C043C0F8FF -:10306000103B2B6803F00303012B0ED1D2F8083874 -:1030700002EB411013F4807FD0F8003B14BF43F003 -:10308000805343F00053C0F8003B02EB4112D2F8EA -:10309000003B43F00443C2F8003B30BD2DE9F04152 -:1030A000D0F8906005460C4606EB4113D3F8087B38 -:1030B0003A07C3F8087B08D5D6F814381B0704D59F -:1030C00000EB8103DB685B689847FA071FD5D6F8E9 -:1030D0001438DB071BD505EB8403D968CCB98B69A1 -:1030E000488A5A68B2FBF0F600FB16228AB91868C3 -:1030F000DA6890420DD2121AC3E90024202383F328 -:10310000118821462846FFF78BFF84F31188BDE81C -:10311000F081012303FA04F26B8923EA02036B8135 -:10312000CB68002BF3D021462846BDE8F041184774 -:1031300000EB81034A0170B5DD68D0F890306C690E -:103140002668E66056BB1A444FF40020C2F8100906 -:103150002A6802F00302012A0AB20ED1D3F8080845 -:1031600003EB421410F4807FD4F8000914BF40F040 -:10317000805040F00050C4F8000903EB4212D2F82E -:10318000000940F00440C2F800090122D3F83408D5 -:1031900002FA01F10143C3F8341870BD19B9402E89 -:1031A00084BF4020206020681A442E8A8419013C84 -:1031B000B4FBF6F440EAC44040F00050C6E700001B -:1031C0002DE9F041D0F8906004460D4606EB41131E -:1031D000D3F80879C3F80879FB071CD5D6F810385E -:1031E000DA0718D500EB8103D3F80CC0DCF81430F3 -:1031F000D3F800E0DA6896451BD2A2EB0E024FF03E -:1032000000081A60C3F80480202383F31188FFF7B5 -:103210008FFF88F311883B0618D50123D6F8342890 -:10322000AB40134212D029462046BDE8F041FFF7DB -:10323000C3BC012303FA01F2038923EA02030381D9 -:10324000DCF80830002BE6D09847E4E7BDE8F081D1 -:103250002DE9F84FD0F8905004466E69AB691E40D6 -:1032600016F480586E6103D0BDE8F84FFEF740BCFD -:10327000002E12DAD5F8003E9F0705D0D5F8003EA3 -:1032800023F00303C5F8003ED5F80438204623F0A8 -:103290000103C5F80438FEF757FC300505D5204674 -:1032A000FFF75EFC2046FEF73FFCB1040CD5D5F8D5 -:1032B000083813F0060FEB6823F470530CBF43F487 -:1032C000105343F4A053EB60320704D56368DB6806 -:1032D0000BB120469847F30200F1BA80B70226D519 -:1032E000D4F8909000274FF0010A09EB4712D2F86A -:1032F000003B03F44023B3F5802F11D1D2F8003BFB -:10330000002B0DDA62890AFA07F322EA03036381CC -:1033100004EB8703DB68DB6813B139462046984726 -:103320000137D4F89430FFB29B689F42DDD9F00694 -:1033300019D5D4F89000026AC2F30A1702F00F03FD -:1033400002F4F012B2F5802F00F0CC80B2F5402FDD -:1033500009D104EB8303002200F58050DB681B6A6F -:10336000974240F0B2803003D5F8185835D5E903BC -:1033700003D500212046FFF791FEAA0303D50121C2 -:103380002046FFF78BFE6B0303D502212046FFF793 -:1033900085FE2F0303D503212046FFF77FFEE802B9 -:1033A00003D504212046FFF779FEA90203D50521A4 -:1033B0002046FFF773FE6A0203D506212046FFF779 -:1033C0006DFE2B0203D507212046FFF767FEEF01B4 -:1033D00003D508212046FFF761FE700340F1A98064 -:1033E000E90703D500212046FFF7EAFEAA0703D527 -:1033F00001212046FFF7E4FE6B0703D5022120469A -:10340000FFF7DEFE2F0703D503212046FFF7D8FE86 -:10341000EE0603D504212046FFF7D2FEA80603D509 -:1034200005212046FFF7CCFE690603D5062120467C -:10343000FFF7C6FE2A0603D507212046FFF7C0FE88 -:10344000EB0576D520460821BDE8F84FFFF7B8BE5A -:10345000D4F8909000274FF0010AD4F894305FFA26 -:1034600087FB9B689B453FF639AF09EB4B13D3F8BD -:10347000002902F44022B2F5802F24D1D3F800298C -:10348000002A20DAD3F8002942F09042C3F800293C -:10349000D3F80029002AFBDB5946D4F89000FFF747 -:1034A000C7FB22890AFA0BF322EA0303238104EB08 -:1034B0008B03DB689B6813B15946204698475946F1 -:1034C0002046FFF779FB0137C7E7910701D1D0F814 -:1034D0000080072A02F101029CBF03F8018B4FEA2A -:1034E00018283DE704EB830300F58050DA68D2F832 -:1034F00018C0DCF80820DCE9001CA1EB0C0C002152 -:103500008F4208D1DB689B699A683A449A605A688E -:103510003A445A6027E711F0030F01D1D0F8008038 -:103520008C4501F1010184BF02F8018B4FEA182894 -:10353000E6E7BDE8F88F000008B50348FFF788FE0E -:10354000BDE80840FFF784BA044E002008B50348E0 -:10355000FFF77EFEBDE80840FFF77ABAA04E0020D4 -:10356000D0F8903003EB4111D1F8003B43F4001345 -:10357000C1F8003B70470000D0F8903003EB4111D8 -:10358000D1F8003943F40013C1F800397047000046 -:10359000D0F8903003EB4111D1F8003B23F4001335 -:1035A000C1F8003B70470000D0F8903003EB4111A8 -:1035B000D1F8003923F40013C1F800397047000036 -:1035C000090100F16043012203F56143C9B283F8A8 -:1035D000001300F01F039A4043099B0003F160436E -:1035E00003F56143C3F880211A60704730B5043396 -:1035F000039C0172002104FB0325C160C0E906534E -:10360000049B0363059BC0E90000C0E90422C0E9F4 -:103610000842C0E90A11436330BD00000022416A3C -:10362000C260C0E90411C0E90A226FF00101FEF78F -:10363000E9BD0000D0E90432934201D1C2680AB961 -:10364000181D704700207047036919600021C26887 -:103650000132C260C269134482699342036124BF8C -:10366000436A0361FEF7C2BD38B504460D46E36800 -:103670003BB162690020131D1268A3621344E36228 -:1036800007E0237A33B929462046FEF79FFD00283C -:10369000EDDA38BD6FF00100FBE70000C368C269D6 -:1036A000013BC3604369134482699342436124BF71 -:1036B000436A436100238362036B03B11847704779 -:1036C00070B52023044683F31188866A3EB9FFF75C -:1036D000CBFF054618B186F31188284670BDA36A52 -:1036E000E26A13F8015B9342A36202D32046FFF71C -:1036F000D5FF002383F31188EFE700002DE9F84F91 -:1037000004460E46174698464FF0200989F3118863 -:103710000025AA46D4F828B0BBF1000F09D14146D4 -:103720002046FFF7A1FF20B18BF311882846BDE8A2 -:10373000F88FD4E90A12A7EB050B521A934528BF5C -:103740009346BBF1400F1BD9334601F1400251F8BB -:10375000040B914243F8040BF9D1A36A403640357B -:103760004033A362D4E90A239A4202D32046FFF7EA -:1037700095FF8AF31188BD42D8D289F31188C9E731 -:1037800030465A46FDF71EFBA36A5E445D445B4427 -:10379000A362E7E710B5029C0433017204FB032126 -:1037A000C460C0E906130023C0E90A33039B036326 -:1037B000049BC0E90000C0E90422C0E90842436359 -:1037C00010BD0000026A6FF00101C260426AC0E9E8 -:1037D00004220022C0E90A22FEF714BDD0E9042326 -:1037E0009A4201D1C26822B9184650F8043B0B60D6 -:1037F0007047002070470000C3680021C269013390 -:10380000C3604369134482699342436124BF436A9E -:103810004361FEF7EBBC000038B504460D46E36893 -:103820003BB1236900201A1DA262E2691344E362DE -:1038300007E0237A33B929462046FEF7C7FC002863 -:10384000EDDA38BD6FF00100FBE700000369196095 -:10385000C268013AC260C26913448269934203613B -:1038600024BF436A036100238362036B03B11847DB -:103870007047000070B520230D460446114683F3BF -:103880001188866A2EB9FFF7C7FF10B186F3118839 -:1038900070BDA36A1D70A36AE26A01339342A362FA -:1038A00004D3E16920460439FFF7D0FF002080F3FC -:1038B0001188EDE72DE9F84F04460D4690469946EC -:1038C0004FF0200A8AF311880026B346A76A4FB941 -:1038D00049462046FFF7A0FF20B187F31188304604 -:1038E000BDE8F88FD4E90A073A1AA8EB0607974211 -:1038F00028BF1746402F1BD905F1400355F8042B6C -:103900009D4240F8042BF9D1A36A40364033A362AC -:10391000D4E90A239A4204D3E16920460439FFF727 -:1039200095FF8BF311884645D9D28AF31188CDE7EC -:1039300029463A46FDF746FAA36A3D443E443B44D5 -:10394000A362E5E7D0E904239A4217D1C3689BB18B -:10395000836A8BB1043B9B1A0ED01360C368013B92 -:10396000C360C3691A4483699A42026124BF436AEF -:103970000361002383620123184670470023FBE79D -:1039800000F0DAB8034B002258631A610222DA60B1 -:10399000704700BF000C0040014B0022DA60704706 -:1039A000000C0040014B5863704700BF000C004002 -:1039B000014B586A704700BF000C00404B684360E1 -:1039C0008B688360CB68C3600B6943614B6903629A -:1039D0008B6943620B6803607047000008B53C4B7D -:1039E00040F2FF713B48D3F888200A43C3F888208F -:1039F000D3F8882022F4FF6222F00702C3F888205F -:103A0000D3F88820D3F8E0200A43C3F8E020D3F8A5 -:103A100008210A43C3F808212F4AD3F80831114678 -:103A2000FFF7CCFF00F5806002F11C01FFF7C6FF35 -:103A300000F5806002F13801FFF7C0FF00F58060FB -:103A400002F15401FFF7BAFF00F5806002F1700146 -:103A5000FFF7B4FF00F5806002F18C01FFF7AEFFC5 -:103A600000F5806002F1A801FFF7A8FF00F5806073 -:103A700002F1C401FFF7A2FF00F5806002F1E0014E -:103A8000FFF79CFF00F5806002F1FC01FFF796FF55 -:103A900002F58C7100F58060FFF790FF00F000F9EF -:103AA0000E4BD3F8902242F00102C3F89022D3F8D3 -:103AB000942242F00102C3F894220522C3F8982010 -:103AC0004FF06052C3F89C20054AC3F8A02008BDFF -:103AD00000440258000002585843000800ED00E07E -:103AE0001F00080308B500F0F3FAFEF7DFFA0F4BEA -:103AF000D3F8DC2042F04002C3F8DC20D3F80421E4 -:103B000022F04002C3F80421D3F80431084B1A68AC -:103B100042F008021A601A6842F004021A60FEF7C6 -:103B200049FFBDE80840FEF7E9BC00BF0044025869 -:103B30000018024870470000114BD3F8E82042F00B -:103B40000802C3F8E820D3F8102142F00802C3F8B5 -:103B500010210C4AD3F81031D36B43F00803D36320 -:103B6000C722094B9A624FF0FF32DA6200229A6153 -:103B70005A63DA605A6001225A611A60704700BFC6 -:103B8000004402580010005C000C0040094A08B5CF -:103B90001169D3680B40D9B29B076FEA010111612B -:103BA00007D5202383F31188FEF7A0FA002383F3BF -:103BB000118808BD000C0040384B4FF0FF31D3F89E -:103BC0008020C3F88010D3F880200022C3F8802022 -:103BD000D3F88000D3F88400C3F88410D3F88400AD -:103BE000C3F88420D3F88400D86F40F0FF4040F43D -:103BF000FF0040F43F5040F03F00D867D86F20F0FE -:103C0000FF4020F4FF0020F43F5020F03F00D86731 -:103C1000D86FD3F888006FEA40506FEA5050C3F86D -:103C20008800D3F88800C0F30A00C3F88800D3F8EE -:103C30008800D3F89000C3F89010D3F89000C3F830 -:103C40009020D3F89000D3F89400C3F89410D3F8E0 -:103C50009400C3F89420D3F89400D3F89800C3F8E4 -:103C60009810D3F89800C3F89820D3F89800D3F8A8 -:103C70008C00C3F88C10D3F88C00C3F88C20D3F8D8 -:103C80008C00D3F89C00C3F89C10D3F89C10C3F8A8 -:103C90009C20D3F89C3000F0E7B900BF00440258E4 -:103CA000614B0122C3F80821604BD3F8F42042F0A5 -:103CB0000202C3F8F420D3F81C2142F00202C3F838 -:103CC0001C210222D3F81C31594BDA605A68910446 -:103CD000FCD5584A1A6001229A60574ADA600022DD -:103CE0001A614FF440429A61514B9A699204FCD593 -:103CF0001A6842F480721A604C4B1A6F12F4407FBB -:103D000004D04FF480321A6700221A671A6842F012 -:103D100001021A60454B1A685007FCD500221A614F -:103D20001A6912F03802FBD1012119604FF080416D -:103D300059605A67414ADA62414A1A611A6842F484 -:103D400080321A60394B1A689103FCD51A6842F424 -:103D500080521A601A689204FCD53A4A3A499A622B -:103D600000225A6319633949DA6399635A64384AFD -:103D70001A64384ADA621A6842F0A8521A602B4B69 -:103D80001A6802F02852B2F1285FF9D148229A61EC -:103D90004FF48862DA6140221A622F4ADA644FF0E7 -:103DA00080521A652D4A5A652D4A9A6532232D4A4A -:103DB0001360136803F00F03022BFAD11B4B1A692F -:103DC00042F003021A611A6902F03802182AFAD185 -:103DD000D3F8DC2042F00052C3F8DC20D3F80421F1 -:103DE00042F00052C3F80421D3F80421D3F8DC20B8 -:103DF00042F08042C3F8DC20D3F8042142F0804234 -:103E0000C3F80421D3F80421D3F8DC2042F00042A7 -:103E1000C3F8DC20D3F8042142F00042C3F80421A7 -:103E2000D3F80431704700BF0080005100440258AD -:103E30000048025800C000F0020000010000FF012D -:103E40000088900832206000630209011D0204000E -:103E500047040508FD0BFF01200000200010E000D2 -:103E600000010100002000524FF0B04208B5D2F826 -:103E7000883003F00103C2F8883023B1044A136884 -:103E80000BB150689847BDE80840FEF7E1BD00BFA0 -:103E9000544F00204FF0B04208B5D2F8883003F0FC -:103EA0000203C2F8883023B1044A93680BB1D0688A -:103EB0009847BDE80840FEF7CBBD00BF544F002037 -:103EC0004FF0B04208B5D2F8883003F00403C2F8CE -:103ED000883023B1044A13690BB150699847BDE893 -:103EE0000840FEF7B5BD00BF544F00204FF0B04270 -:103EF00008B5D2F8883003F00803C2F8883023B13F -:103F0000044A93690BB1D0699847BDE80840FEF7B1 -:103F10009FBD00BF544F00204FF0B04208B5D2F80B -:103F2000883003F01003C2F8883023B1044A136AC2 -:103F30000BB1506A9847BDE80840FEF789BD00BF45 -:103F4000544F00204FF0B04310B5D3F8884004F42C -:103F50007872C3F88820A30604D5124A936A0BB17D -:103F6000D06A9847600604D50E4A136B0BB1506BAC -:103F70009847210604D50B4A936B0BB1D06B984739 -:103F8000E20504D5074A136C0BB1506C9847A305A2 -:103F900004D5044A936C0BB1D06C9847BDE810402F -:103FA000FEF756BD544F00204FF0B04310B5D3F884 -:103FB000884004F47C42C3F88820620504D5164A80 -:103FC000136D0BB1506D9847230504D5124A936DBC -:103FD0000BB1D06D9847E00404D50F4A136E0BB1B6 -:103FE000506E9847A10404D50B4A936E0BB1D06E66 -:103FF0009847620404D5084A136F0BB1506F984775 -:10400000230404D5044A936F0BB1D06F9847BDE8E1 -:104010001040FEF71DBD00BF544F002008B50348F7 -:10402000FDF708F9BDE80840FEF712BDCC230020DB -:1040300008B50348FDF7FEF8BDE80840FEF708BDE7 -:104040003824002008B50348FDF7F4F8BDE808401F -:10405000FEF7FEBCA424002008B5FFF797FDBDE8DD -:104060000840FEF7F5BC0000062108B50846FFF73A -:10407000A7FA06210720FFF7A3FA06210820FFF779 -:104080009FFA06210920FFF79BFA06210A20FFF775 -:1040900097FA06211720FFF793FA06212820FFF749 -:1040A0008FFA09217A20FFF78BFA07213220FFF7D8 -:1040B00087FA0C212620FFF783FA0C212720FFF72F -:1040C0007FFA0C215220BDE80840FFF779BA0000C2 -:1040D00008B5FFF771FD00F00DF8FDF7BDFAFDF72B -:1040E00095FCFDF767FBFFF725FDBDE80840FFF7EE -:1040F00047BC00000023054A19460133102BC2E9D2 -:10410000001102F10802F8D1704700BF544F00209F -:1041100010B501390244904201D1002005E0037836 -:1041200011F8014FA34201D0181B10BD0130F2E776 -:10413000034611F8012B03F8012B002AF9D170472F -:1041400053544D333248373F3F3F0053544D333281 -:10415000483734332F37353300000000C832002091 -:10416000CC23002038240020A42400200096000046 -:10417000000000000000000000000000000000003F -:104180000000000000000000211600080D160008C5 -:104190004916000835160008411600082D160008BB -:1041A0001916000805160008551600080000000042 -:1041B000311700081D170008591700084517000897 -:1041C000511700083D1700082917000815170008A7 -:1041D000651700080000000001000000000000005A -:1041E0006D61696E0000000069646C65000000008C -:1041F000E841000850310020C832002001000000D2 -:10420000A9200008000000004375626550696C6FCA -:1042100074004A6F65792D424C002553455249413F -:104220004C250000020000000000000051190008A9 -:10423000C119000840004000704B0020804B002056 -:104240000200000000000000030000000000000069 -:10425000091A00080000000010000000904B002028 -:10426000000000000100000000000000044E0020DB -:104270000101020099240008A92300084524000830 -:1042800029240008430000008C4200080902430072 -:10429000020100C0320904000001020201000524ED -:1042A0000010010524010001042402020524060077 -:1042B00001070582030800FF09040100020A00004B -:1042C00000070501024000000705810240000000D0 -:1042D00012000000D8420008120110010200004044 -:1042E000AE2D561000020102030100000403090470 -:1042F00025424F4152442500437562654F72616EFD -:1043000067652D6A6F657900303132333435363761 -:104310003839414243444546000000000000000097 -:104320005D1B0008151E0008C11E0008400040006B -:104330003C4F00203C4F0020010000004C4F00206B -:1043400080000000400100000800000000010000A3 -:1043500000040000080000000000812A00000000A6 -:10436000AAAAAAAA00000024FFFE00000000000084 -:1043700000A00A000001000000000000AAAAAAAAEA -:1043800000000000FFFF000000000000000000002F -:104390001400005400000000AAAAAAAA14000054A5 -:1043A000FFFF0000000000000000000000681A008D -:1043B00000000000AAAA8AAA00541500FFFF00000E -:1043C000000070077700000040810200000000003C -:1043D000AAAAAAAA00410100F7FF0000000000708D -:1043E000070000000000000000000000AAAAAAAA1E -:1043F00000000000FFFF00000000000000000000BF -:104400000000000000000000AAAAAAAA0000000004 -:10441000FFFF00000000000000000000000000009E -:1044200000000000AAAAAAAA00000000FFFF0000E6 -:10443000000000000000000000000000000000007C -:10444000AAAAAAAA00000000FFFF000000000000C6 -:10445000000000000000000000000000AAAAAAAAB4 -:1044600000000000FFFF000000000000000000004E -:104470000000000000000000AAAAAAAA0000000094 -:10448000FFFF00000000000000000000000000002E -:10449000090400000000000000001E0000000000F1 -:1044A000FF00000000000000404100083F00000045 -:1044B000500400004B4100083F000000009600003F -:1044C0000000080096000000000800000400000042 -:1044D000EC420008000000000000000000000000A6 -:0C44E000000000000000000000000000D0 +:1000000000060020E1020008E3020008E302000805 +:10001000E3020008E3020008E3020008E30200082C +:10002000E3020008E3020008E3020008F17600089A +:10003000E3020008E3020008E3020008E30200080C +:10004000E3020008E3020008E3020008E3020008FC +:10005000E3020008E3020008FD8500082986000885 +:100060005586000881860008AD860008094600080C +:10007000314600085D46000889460008B54600087C +:10008000DD46000809470008E3020008E302000813 +:10009000E3020008E3020008E3020008D986000832 +:1000A000E3020008E3020008E3020008E30200089C +:1000B000E3020008E3020008E3020008E30200088C +:1000C000E3020008E3020008E3020008E30200087C +:1000D000E3020008E3020008C5870008D98700088A +:1000E0003D870008E3020008E3020008E30200087D +:1000F000E3020008E3020008E302000835470008B5 +:10010000E3020008B187000801880008E302000844 +:10011000E3020008E3020008E3020008E30200082B +:100120006147000889470008B5470008E147000813 +:100130000D480008E3020008E3020008E30200089B +:10014000E3020008E3020008E3020008E3020008FB +:1001500035480008614800088D480008E30200089F +:10016000E3020008E3020008E3020008E3020008DB +:10017000E3020008DD820008E3020008E302000851 +:10018000E3020008E3020008ED870008E30200082C +:10019000E3020008E3020008E3020008E3020008AB +:1001A000E3020008E3020008E3020008E30200089B +:1001B000E3020008E3020008E3020008E30200088B +:1001C000E3020008E3020008E3020008E30200087B +:1001D000E3020008C9820008E3020008E302000805 +:1001E000E3020008E3020008E3020008E30200085B +:1001F000E3020008E3020008E3020008E30200084B +:10020000E3020008E3020008E3020008E30200083A +:10021000E3020008E3020008E3020008E30200082A +:10022000E3020008E3020008E3020008E30200081A +:10023000E3020008E3020008E3020008E30200080A +:10024000E3020008E3020008E3020008E3020008FA +:10025000E3020008E3020008E3020008E3020008EA +:10026000E3020008E3020008E3020008E3020008DA +:10027000E3020008E3020008E3020008E3020008CA +:10028000E3020008E3020008E3020008E3020008BA +:10029000E3020008E3020008E3020008E3020008AA +:1002A000E3020008E3020008E3020008E30200089A +:1002B000E3020008E3020008E3020008E30200088A +:1002C000E3020008E3020008E3020008E30200087A +:1002D000E3020008E3020008E3020008E30200086A +:1002E00002E000F000F8FEE772B6374880F30888B5 +:1002F000364880F3098836483649086040F20000E5 +:10030000CCF200004EF63471CEF200010860BFF36B +:100310004F8FBFF36F8F40F20000C0F2F0004EF637 +:100320008851CEF200010860BFF34F8FBFF36F8F8B +:100330004FF00000E1EE100A4EF63C71CEF20001E3 +:100340000860062080F31488BFF36F8F07F032FA3D +:1003500006F0A4FB4FF055301F491B4A91423CBFA9 +:1003600041F8040BFAE71D49184A91423CBF41F895 +:10037000040BFAE71A491B4A1B4B9A423EBF51F83D +:10038000040B42F8040BF8E700201849184A914280 +:100390003CBF41F8040BFAE707F04AFA06F002FC0A +:1003A000144C154DAC4203DA54F8041B8847F9E7A6 +:1003B00000F0C4F9114C124DAC4203DA54F8041B9E +:1003C0008847F9E707F032BA000600200022002033 +:1003D0000000000808ED00E00000002000060020FA +:1003E000989C00080022002074220020782200201F +:1003F00034670020E0020008E0020008E002000884 +:10040000E00200082DE9F04F2DED108AC1F80CD064 +:10041000D0F80CD0BDEC108ABDE8F08F002383F338 +:1004200011882846A047002006F01AF9FEE706F0DA +:1004300073F800DFFEE7000053B94AB9002908BF8E +:1004400000281CBF4FF0FF314FF0FF3000F074B9AF +:10045000ADF1080C6DE904CE00F006F8DDF804E01B +:10046000DDE9022304B070472DE9F047089D0446FA +:100470008E46002B4DD18A42944669D9B2FA82F257 +:1004800052B101FA02F3C2F1200120FA01F10CFA93 +:1004900002FC41EA030E94404FEA1C48210CBEFBCB +:1004A000F8F61FFA8CF708FB16E341EA034306FB54 +:1004B00007F199420AD91CEB030306F1FF3080F0E3 +:1004C0001F81994240F21C81023E63445B1AA4B230 +:1004D000B3FBF8F008FB103344EA034400FB07F7D2 +:1004E000A7420AD91CEB040400F1FF3380F00A8113 +:1004F000A74240F207816444023840EA0640E41B08 +:1005000000261DB1D4400023C5E900433146BDE8B3 +:10051000F0878B4209D9002D00F0EF800026C5E955 +:10052000000130463146BDE8F087B3FA83F6002E6D +:100530004AD18B4202D3824200F2F980841A61EBE5 +:10054000030301209E46002DE0D0C5E9004EDDE703 +:1005500002B9FFDEB2FA82F2002A40F09280A1EBEB +:100560000C014FEA1C471FFA8CFE0126200CB1FB40 +:10057000F7F307FB131140EA01410EFB03F0884239 +:1005800008D91CEB010103F1FF3802D2884200F2C6 +:10059000CB804346091AA4B2B1FBF7F007FB101158 +:1005A00044EA01440EFB00FEA64508D91CEB0404F6 +:1005B00000F1FF3102D2A64500F2BB800846A4EB51 +:1005C0000E0440EA03409CE7C6F12007B34022FA3C +:1005D00007FC4CEA030C20FA07F401FA06F31C436B +:1005E000F9404FEA1C4900FA06F3B1FBF9F8200C78 +:1005F0001FFA8CFE09FB181140EA014108FB0EF0BE +:10060000884202FA06F20BD91CEB010108F1FF3A0D +:1006100080F08880884240F28580A8F10208614419 +:10062000091AA4B2B1FBF9F009FB101144EA014127 +:1006300000FB0EFE8E4508D91CEB010100F1FF34D2 +:100640006CD28E456AD90238614440EA0840A0FB6A +:100650000294A1EB0E01A142C846A64656D353D040 +:100660005DB1B3EB080261EB0E0101FA07F722FA64 +:1006700006F3F1401F43C5E9007100263146BDE88D +:10068000F087C2F12003D8400CFA02FC21FA03F3F0 +:10069000914001434FEA1C471FFA8CFEB3FBF7F071 +:1006A00007FB10360B0C43EA064300FB0EF69E4296 +:1006B00004FA02F408D91CEB030300F1FF382FD22F +:1006C0009E422DD9023863449B1B89B2B3FBF7F6D7 +:1006D00007FB163341EA034106FB0EF38B4208D9B0 +:1006E0001CEB010106F1FF3816D28B4214D9023EF1 +:1006F0006144C91A46EA004638E72E46284605E70F +:100700000646E3E61846F8E64B45A9D2B9EB0208DF +:1007100064EB0C0E0138A3E74646EAE7204694E76F +:100720004046D1E7D0467BE7023B614432E73046A2 +:1007300009E76444023842E7704700BF38B501F06A +:10074000FFF901F0AFFB06F0C1FE054606F0C6FF5B +:100750000446D0B90F4B9D4219D001339D4241F25E +:10076000883504BF01240025002006F0B9FE0CB135 +:1007700000F078F801F036FB00F026FD08B100F03B +:1007800071F8284600F01CF9F9E70025ECE705466A +:10079000EAE700BF010007B008B501F09DF9A0F13C +:1007A00020035842584108BD07B541F21203022107 +:1007B00001A8ADF8043001F0ADF903B05DF804FB19 +:1007C00038B5302383F31188174803680BB106F05E +:1007D0002BF80023154A4FF47A71134806F01AF8E3 +:1007E000002383F31188124C236813B12368013B63 +:1007F0002360636813B16368013B63600D4D2B7820 +:1008000033B963687BB9022001F056FA3223636082 +:100810002B78032B07D163682BB9022001F04CFA27 +:100820004FF47A73636038BD78220020C107000856 +:100830009823002090220020084B187003280CD821 +:10084000DFE800F008050208022001F02BBA0220C0 +:1008500001F01EBA024B00225A607047902200201D +:1008600098230020F8B5504B504A1C4619680131B6 +:1008700000F0998004339342F8D162684C4B9A425D +:1008800040F291804B4B9B6803F1006303F500330A +:100890009A4280F08880002001F06CF90220FFF776 +:1008A000CBFF454B0021D3F8E820C3F8E810D3F87C +:1008B0001021C3F81011D3F81021D3F8EC20C3F89D +:1008C000EC10D3F81421C3F81411D3F81421D3F881 +:1008D000F020C3F8F010D3F81821C3F81811D3F89A +:1008E0001821D3F8802042F00062C3F88020D3F8AA +:1008F000802022F00062C3F88020D3F88020D3F853 +:10090000802042F00072C3F88020D3F8802022F0CB +:100910000072C3F88020D3F8803072B64FF0E02325 +:10092000C3F8084DD4E90004BFF34F8FBFF36F8FB6 +:10093000224AC2F88410BFF34F8F536923F48033E7 +:100940005361BFF34F8FD2F8803043F6E076C3F3A4 +:10095000C905C3F34E335B0103EA060C29464CEA92 +:1009600081770139C2F87472F9D2203B13F1200F5C +:10097000F2D1BFF34F8FBFF36F8FBFF34F8FBFF332 +:100980006F8F536923F4003353610023C2F8503250 +:10099000BFF34F8FBFF36F8F302383F311888546EA +:1009A00080F308882047F8BD0000020820000208F4 +:1009B000FFFF0108002200200044025800ED00E083 +:1009C0002DE9F04F93B0B44B2022FF2100900AA8EC +:1009D0009D6801F0B1F9B14A1378A3B90121B0487B +:1009E00011700360302383F3118803680BB105F0A5 +:1009F0001BFF0023AB4A4FF47A71A94805F00AFFA8 +:100A0000002383F31188009B13B1A74B009A1A604F +:100A1000A64A1378032B03D000231370A24A536015 +:100A20004FF0000A009CD3465646D146012001F003 +:100A300039F924B19C4B1B68002B00F02682002062 +:100A400001F04AF80390039B002BF2DB012001F038 +:100A50001FF9039B213B1F2BE8D801A252F823F07A +:100A6000E10A0008090B00089D0B00082D0A000888 +:100A70002D0A00082D0A00082F0C0008FF0D0008A1 +:100A8000190D00087B0D0008A30D0008C90D000812 +:100A90002D0A0008DB0D00082D0A00084D0E000885 +:100AA000810B00082D0A0008910E0008ED0A0008CD +:100AB000810B00082D0A00087B0D00082D0A000894 +:100AC0002D0A00082D0A00082D0A00082D0A00082A +:100AD0002D0A00082D0A00082D0A00089D0B0008A9 +:100AE0000220FFF759FE002840F0F981009B022107 +:100AF00005A8BAF1000F08BF1C4641F21233ADF849 +:100B0000143001F007F891E74FF47A7000F0E4FF39 +:100B1000071EEBDB0220FFF73FFE0028E6D0013F77 +:100B2000052F00F2DE81DFE807F0030A0D1013360F +:100B30000523042105A8059300F0ECFF17E004212C +:100B40005548F9E704215A48F6E704215948F3E7E4 +:100B50004FF01C08404608F1040801F00DF804218C +:100B6000059005A800F0D6FFB8F12C0FF2D10120B6 +:100B70004FF0000900FA07F747EA0B0B5FFA8BFB0F +:100B800001F026F926B10BF00B030B2B08BF002454 +:100B9000FFF70AFE4AE704214748CDE7002EA5D01B +:100BA0000BF00B030B2BA1D10220FFF7F5FD07463D +:100BB00000289BD00120002600F0DCFF0220FFF778 +:100BC0003BFE1FFA86F8404600F0E4FF0446B0B151 +:100BD000039940460136A1F140025142514100F0D3 +:100BE000E9FF0028EDD1BA46044641F21213022172 +:100BF00005A83E46ADF8143000F08CFF16E72546F8 +:100C00000120FFF719FE244B9B68AB4207D9284609 +:100C100000F0B2FF013040F067810435F3E70025B2 +:100C2000224BBA463E461D701F4B5D60A8E7002E62 +:100C30003FF45CAF0BF00B030B2B7FF457AF02209C +:100C4000FFF7FAFD322000F047FFB0F10008FFF691 +:100C50004DAF18F003077FF449AF0F4A08EB0503C7 +:100C6000926893423FF642AFB8F5807F3FF73EAFC0 +:100C7000124BB845019323DD4FF47A7000F02CFF3E +:100C80000390039A002AFFF631AF039A0137019BC4 +:100C900003F8012BEDE700BF002200209423002081 +:100CA00078220020C107000898230020902200200D +:100CB00004220020082200200C2200209422002080 +:100CC000C820FFF769FD074600283FF40FAF1F2D2E +:100CD00011D8C5F120020AAB25F003008449424532 +:100CE000184428BF4246019201F000F8019AFF2102 +:100CF0007F4801F021F84FEAA803C8F387027C4936 +:100D00002846019301F020F8064600283FF46DAF15 +:100D1000019B05EB830533E70220FFF73DFD00282B +:100D20003FF4E4AE00F064FF00283FF4DFAE00279C +:100D3000B846704B9B68BB4218D91F2F11D80A9B2D +:100D400001330ED027F0030312AA134453F8203CBA +:100D500005934046042205A9043701F003F98046B3 +:100D6000E7E7384600F008FF0590F2E7CDF8148079 +:100D7000042105A800F0CEFE02E70023642104A8A8 +:100D8000049300F0BDFE00287FF4B0AE0220FFF710 +:100D900003FD00283FF4AAAE049800F01FFF059061 +:100DA000E6E70023642104A8049300F0A9FE0028CC +:100DB0007FF49CAE0220FFF7EFFC00283FF496AED4 +:100DC000049800F00DFFEAE70220FFF7E5FC002899 +:100DD0003FF48CAE00F01CFFE1E70220FFF7DCFCE3 +:100DE00000283FF483AE05A9142000F017FF074642 +:100DF0000421049004A800F08DFE3946B9E73220A2 +:100E000000F06AFE071EFFF671AEBB077FF46EAE00 +:100E1000384A07EB0903926893423FF667AE022017 +:100E2000FFF7BAFC00283FF461AE27F003074F44F8 +:100E3000B9453FF4A5AE484609F1040900F09CFE0F +:100E40000421059005A800F065FEF1E74FF47A70E3 +:100E5000FFF7A2FC00283FF449AE00F0C9FE0028CD +:100E600044D00A9B01330BD008220AA9002000F0CD +:100E70006BFF00283AD02022FF210AA800F05CFF77 +:100E8000FFF792FC1C4805F0F1FB13B0BDE8F08FB2 +:100E9000002E3FF42BAE0BF00B030B2B7FF426AE92 +:100EA0000023642105A8059300F02AFE07460028C8 +:100EB0007FF41CAE0220FFF76FFC804600283FF451 +:100EC00015AEFFF771FC41F2883005F0CFFB0598B5 +:100ED00000F0C6FF46463C4600F07AFFA6E506460F +:100EE0004EE64FF0000901E6BA467EE637467CE65C +:100EF0009422002000220020A086010070470000FC +:100F000070470000704700002DE9F04100F5803780 +:100F1000044616463B7C5BB9C0681030204400F0A4 +:100F2000E5FEE5683544B5F5004FE56002D816B139 +:100F3000BDE8F081DEB905F07F0605F11000002163 +:100F4000C6F180062044F6B232462E4400F0F4FE8C +:100F5000A06804F11008324600F10060414600F537 +:100F6000003006F05FF830B901233B74E0E74FF43E +:100F700000463546ECE7A26805F1100140463244D0 +:100F80002144A260E268521BE26000F0AFFE022042 +:100F9000BDE8F04100F090BE183000F0E9BC000060 +:100FA00010B5044600F0FAFF204610BD10B5044607 +:100FB00000F0F4FF204610BDC3B280B2A3F141029D +:100FC000052A02D8373800B27047613B052B94BF21 +:100FD00057383038F7E70000F8B50446154608469C +:100FE00003220C4900F08CFE014688B908346F1CBE +:100FF00015F91100FFF7E0FF064617F9110001315E +:10100000FFF7DAFF102940EA061004F8010BEFD1D0 +:10101000F8BD00BF549200082DE9F04FADF53F7DBB +:101020000746416801222AA802F09AFE002840F0F3 +:1010300087800646824681461125DFF80C81DFF85D +:101040000CB101AB4FF4805241462AA802F0E8FFF0 +:10105000002875D1019AB2F5805F71D8002A65D059 +:101060000446019A9442ECD2282D0FD008DC132DAF +:101070002DD01E2D39D0112D13D00134A4B2F0E79C +:10108000322D2DD0372D2FD02D2DF6D13B68121BB0 +:1010900008EB040138461B692D259847BDF804402C +:1010A000EBE7121B022A09D9594608EB040000F0AD +:1010B00027FE18B902342825A4B2DEE718F8043058 +:1010C0003A2B3DD00A2B1CBFA1461325D5E718F8B3 +:1010D00004300A2B34D03A2B04BFA2463225CCE789 +:1010E00018F80430202BC8D0264618F804300A2BF4 +:1010F0001AD1AAEB090208EB090102A811254F2A0F +:1011000028BF4F2208F092F8A21B08EB060116A890 +:101110004F2A28BF4F2208F089F83B6816AA02A977 +:10112000DB6838469847A8E71E25A6E73B6838469F +:1011300004491B69984701200DF53F7DBDE8F08FFC +:101140000020F9E756930008A023002058920008D9 +:1011500000F1180110B5044686B00846019100F070 +:10116000F1FB2046FFF758FF60B1019902A800F09B +:1011700049FC102204F1080102A808F017F8B0FA9F +:1011800080F0400906B010BD70B504460025EEB2EF +:10119000304600F0FFFC58B100213046013500F028 +:1011A00009FD08B9002070BD022000F085FDEEE7C2 +:1011B0002046FFF731FF0028F4D004F58034207C6E +:1011C00080F00100EFE70000F0B5C9B006F096F935 +:1011D00000F000FF18B90025284649B0F0BD694667 +:1011E0002A4802F0DFFF00284BD1294C204603F0AB +:1011F00009F8284803F006F8274803F003F82146C9 +:10120000224803F07BF80028E5D1702000F0C0FEF2 +:10121000064610B1214B44600360336830469B683A +:101220009847054600282ED01A4F1948394603F032 +:1012300065F805460028CED1194800F0A9FE0446FD +:1012400038B1184B4760036000F58033C0E90255A0 +:101250001D74236820469B689847054628B10E49AF +:101260000C4803F04BF80028B5D1336830465B6872 +:1012700098471CB1236820465B68984700F092FEAF +:10128000AAE70025FAE70446EFE700BF5C920008F2 +:101290006C9200088392000899920008BC920008A2 +:1012A00014000100D89200082DE9F04FD44A8DB007 +:1012B0000B68D0F804A001931A440368D14E1A4475 +:1012C000D1F81C90DFF8B4C3DFF8B4B3D0E902342E +:1012D000634003EA0A03634013444A6802920AEB3C +:1012E0007363029CC84A2244C468224484688AEA20 +:1012F00004051D40654015448A68039203EB35558B +:10130000039CC24A2244846822448AEA03042C4093 +:1013100084EA0A041444CA6805EBF43404921644BF +:1013200083EA0502224056445A4032440E6905962B +:1013300004EBB222059FB64E3E441E4485EA0403E8 +:1013400013406B4033444E69069602EB7363069F6D +:10135000B04E3E442E4484EA02051D4065403544AB +:101360008E69079603EB3555079FAB4E3E442644E6 +:1013700082EA03042C4054403444A84E4E4405EB0A +:10138000F434164483EA050222405A4032440E6A7D +:10139000089604EBB222089FA14E3E441E4485EA03 +:1013A000040313406B4033444E6A099602EB7363A7 +:1013B000099F9C4ED1F830E03E44D1F83880F34488 +:1013C0002E4484EA02051D40654035448E6AA6F528 +:1013D000244703EB35550A964F3F274482EA03041E +:1013E0002C4054403C44CF6A0B9705EBF4340B9EE1 +:1013F0008D4F3744029E174483EA050222405A402B +:101400003A448A4F774404EBB2221F4485EA04032E +:1014100013406B403B444F6BBC4402EB7363654429 +:1014200084EA020C0CEA030C8CEA040C6544DFF835 +:1014300054C2C44403EB3555A44482EA03042C404F +:1014400054406444D1F83CC0794905EBF43461441C +:10145000114483EA050222405A400A44754904EBCC +:10146000B2223144079E194484EA02032B406340B0 +:101470000B44714902EBF36331440B9E0D4482EA45 +:1014800003012140514029446C4D03EBF151354497 +:10149000019E254483EA010414405C402C44684DBD +:1014A00001EBB4443544069E154481EA04021A4017 +:1014B0004A402A44634D04EB323235440A9E1D44AF +:1014C00084EA02030B4063402B445F4D02EBF3635D +:1014D0003544059E0D4482EA0301214051402944D0 +:1014E0005A4D03EBF1516544254483EA010414404D +:1014F0005C402C44564D01EBB4443544099E1544E0 +:1015000081EA04021A404A402A44524D04EB323226 +:101510003544049E1D4484EA02030B4063402B447F +:101520004D4D02EBF36345440D4482EA0301214033 +:1015300051402944494D03EBF1513544089E2C4458 +:1015400083EA010515405D402C44454D01EBB44450 +:101550003544039E2A4481EA04051D404D402A4437 +:10156000404D04EB32323D442B4484EA020593445F +:101570000D4065402B443C4D02EBF3633544069E21 +:10158000294482EA0305254055402944374D03EBA1 +:10159000F1514D442C4483EA010515405D4025443A +:1015A00001EBB54581EA050404EA03024A405A44C6 +:1015B000A6F5B82B089E05EB3232ABF2BE6B544059 +:1015C0005B4423442A4C344402EB33730B9E0C449B +:1015D00085EA020159402144264C344403EB715101 +:1015E000029E254482EA03044C402544224C444494 +:1015F00001EB3545144483EA01026A40224443E08A +:1016000078A46AD7EECEBDC156B7C7E8DB702024F8 +:10161000AF0F7CF52AC68747134630A8019546FDD3 +:10162000D8988069AFF7448BBED75C892211906B44 +:101630002108B44962251EF640B340C0515A5E26C7 +:10164000AAC7B6E95D102FD65314440281E6A1D88B +:10165000C8FBD3E7E6CDE121D60737C3870DD5F424 +:10166000ED145A4505E9E3A9F8A3EFFCD9026F6729 +:1016700081F6718722619D6D0C38E5FD937198FDAF +:101680008A4C2A8D8E4379A6934C344405EB722202 +:10169000059E1C4481EA0503534023448F4C344487 +:1016A00002EB33730A9E0C4485EA0201594021443F +:1016B0008B4C4C4403EB7151254482EA03044C40AB +:1016C0002C44884D354401EB3444019E154483EA93 +:1016D000010262402A44844D3D4404EB72221D44C1 +:1016E00081EA040353402B44804D354402EB3373AD +:1016F000049E294484EA02055D4029447C4D35441A +:1017000003EB7151079E254482EA03044C402C44AC +:10171000784D354401EB3444099E2A4483EA01059F +:1017200065401544744A324404EB7525039E134406 +:1017300081EA04026A401A44704B734405EB32722A +:101740000B4484EA0501514019446D4B634402EB9C +:1017500071511C4485EA02034B401C44694B3344DD +:1017600001EB3444019E1D4482EA010363402B4493 +:10177000654D04EB73233544069E154463EA01026C +:1017800062402A44614D03EBB2624D4462EA0409AF +:1017900029445F4D89EA0309454449442C445D4D81 +:1017A00002EBB1513544049E61EA03081D4488EA06 +:1017B0000208444401EB744464EA02034B402B44A6 +:1017C000554D04EBF323754463EA010E15448EEA8C +:1017D000040E0EEB0502514D03EBB262354462EA92 +:1017E000040E29440A9D8EEA030EA5F580164C4D81 +:1017F0007144A6F6833602EBB151264461EA030434 +:1018000054403444029E01EB7444354464EA0206B9 +:101810001D444E407319089E424D04EBF32335449A +:1018200063EA01061544664072193F4D03EBB2624C +:10183000654462EA040629443C4D5E403144079EFB +:1018400002EBB151354461EA03062C44384D564051 +:101850003D443444059E1D4401EB744464EA020394 +:101860004B402B44334D04EBF32335440B9E15447E +:1018700063EA010262402A442F4D03EBB262354411 +:10188000039E0D4462EA0401594029442B4D02EBAA +:10189000B15135442A4E254461EA030454402C4496 +:1018A000099D01EB74442E4464EA02051E4485EA56 +:1018B00001039D1903681A440AEB040303EBF523A3 +:1018C0000260436083681C44C36819448460C1603B +:1018D0000DB0BDE8F08F00BF44EABEA4A9CFDE4B37 +:1018E000604BBBF670BCBFBEC67E9B28FA27A1EA40 +:1018F0008530EFD4051D880439D0D4D9E599DBE6CD +:10190000F87CA21F6556ACC4442229F497FF2A43F1 +:10191000A72394AB39A093FCC3595B6592CC0C8F81 +:10192000D15D84854F7EA86FE0E62CFE144301A3B1 +:10193000A111084E827E53F735F23ABDBBD2D72AA9 +:1019400091D386EB094B036003F18833436003F1C5 +:101950002943A3F59613A3F68B638360A3F1883321 +:10196000C3600023C0E90433704700BF012345670B +:101970002DE9F8431446026905460E46E300C2F31A +:10198000C50800F118079B18036122BF43690133A2 +:10199000436112F4FC7F436903EB5473436114D039 +:1019A000C8F1400907EB08004C4504D22246BDE8C7 +:1019B000F84307F00BBC403C4A464E4407F006FC97 +:1019C000444439462846FFF76FFCA04606EB04095D +:1019D000B8F13F0FA9EB08010AD94022384607F0B9 +:1019E000F5FB39462846A8F14008FFF75DFCEFE714 +:1019F000A1096FF03F02384602FB014206EB81115C +:101A0000D5E7000070B50B6901F1180506460C46D4 +:101A1000C3F3C503EA18501C8022EA54C3F13F0205 +:101A2000072A1FD8002100F087F929462046FFF732 +:101A30003BFC38220021284600F07EF92369294624 +:101A40002046236563696365FFF72EFC214610225B +:101A5000304607F0BBFB204658220021BDE870400D +:101A600000F06AB9C3F137020021E5E72DE9F84F2C +:101A70004FF47A7306460D46002402FB03F7DFF8A5 +:101A80005080DFF8509098F900305FFA84FA5A1CC1 +:101A900001D0A34210D159F824002A4631460368E8 +:101AA000D3F820B03B46D847854205D1074B0120EB +:101AB00083F800A0BDE8F88F0134042CE3D14FF483 +:101AC000FA7004F0D3FD0020F4E700BFE4330020F7 +:101AD0001022002014220020002307B50246012115 +:101AE0000DF107008DF80730FFF7C0FF20B19DF81A +:101AF000070003B05DF804FB4FF0FF30F9E700008A +:101B00000A46042108B5FFF7B1FF80F00100C0B21A +:101B1000404208BD074B0A4630B41978064B53F8CB +:101B20002140014623682046DD69044BAC4630BCA9 +:101B3000604700BFE433002014220020A08601008B +:101B400070B50A4E00240A4D05F010FA308028685E +:101B50003388834208D905F005FA2B680444013321 +:101B6000B4F5003F2B60F2D370BD00BFE633002018 +:101B7000A033002005F0C8BA00F1006000F5003085 +:101B80000068704700F10060920000F5003005F039 +:101B900049BA0000054B1A68054B1B889B1A834203 +:101BA00002D9104405F0DEB900207047A0330020B0 +:101BB000E633002038B50446074D29B12868204493 +:101BC000BDE8384005F0E6B92868204405F0D0F9B2 +:101BD0000028F3D038BD00BFA0330020002070479C +:101BE00000F1FF5000F58F10D0F80008704700009A +:101BF000064991F8243033B100230822086A81F89D +:101C00002430FFF7BFBF0120704700BFA43300207E +:101C1000014B1868704700BF0010005C194B013879 +:101C20000322084470B51D68174BC5F30B042D0C37 +:101C30001E88A6420BD15C680A46013C82421346CC +:101C40000FD214F9016F4EB102F8016BF6E7013AB9 +:101C500003F10803ECD181420B4602D22C2203F897 +:101C6000012B0424094A1688AE4204D1984284BF4D +:101C7000967803F8016B013C02F10402F3D1581A83 +:101C800070BD00BF0010005C2422002018930008E3 +:101C9000022803D1024B4FF080529A61704700BF77 +:101CA00000100258022803D1024B4FF480529A616F +:101CB000704700BF00100258022804D1024A53693D +:101CC00083F48053536170470010025870B5044686 +:101CD0004FF47A764CB1412C254628BF412506FBAE +:101CE00005F0641B04F0C2FCF4E770BD002310B5DE +:101CF000934203D0CC5CC4540133F9E710BD00001B +:101D0000013810B510F9013F3BB191F900409C42F8 +:101D100003D11AB10131013AF4E71AB191F9002067 +:101D2000981A10BD1046FCE703460246D01A12F975 +:101D3000011B0029FAD1704702440346934202D0A6 +:101D400003F8011BFAE770472DE9F8431F4D1446CD +:101D50000746884695F8242052BBDFF870909CB364 +:101D600095F824302BB92022FF2148462F62FFF737 +:101D7000E3FF95F824004146C0F1080205EB80001E +:101D8000A24228BF2246D6B29200FFF7AFFF95F8D5 +:101D90002430A41B17441E449044E4B2F6B2082E2B +:101DA00085F82460DBD1FFF723FF0028D7D108E0B6 +:101DB0002B6A03EB82038342CFD0FFF719FF002881 +:101DC000CBD10020BDE8F8830120FBE7A43300203D +:101DD000024B1A78024B1A70704700BFE4330020A0 +:101DE00010220020F8B5194C194803F047FF21468E +:101DF000174803F06FFF24684FF47A70154ED4F83B +:101E00009020154DD2F80438114F43F00203C2F868 +:101E10000438FFF75BFF2046104904F069F8D4F856 +:101E200090200424D2F8043823F00203C2F80438C6 +:101E30004FF4E133336055F8040BB84202D0314619 +:101E400003F07AFE013CF6D1F8BD00BF109B0008FC +:101E500018490020CC33002014220020189B0008D1 +:101E60000C4B70B50C4D04461E780C4B55F82620D3 +:101E70009A420DD00A4B002118221846FFF75CFF4A +:101E80000460014655F82600BDE8704003F054BEDA +:101E900070BD00BFE4330020142200201849002048 +:101EA000CC330020F8B571B6002301201A4619463C +:101EB00002F094FD0446802005F0C6F9002849D0C0 +:101EC0000025254A80274FF4D06C3D26136913F076 +:101ED000C06F26D1D2F8103113F0C06F21D1236822 +:101EE00005F1006199602368D86023685F6023680A +:101EF000C3F800C021680B6843F001030B60216840 +:101F00000B6823F01E030B6021680B68DB07FCD411 +:101F1000237B8035616806FA03F3B5F5001F0B607B +:101F2000D4D1204602F09AFDB5F5001F11D000244F +:101F30000A4E0B4D012005F0E7F83388A34205D97E +:101F400028682044013405F025F8F6E7002005F064 +:101F5000DBF861B6F8BD00BF00200052E633002078 +:101F6000A033002030B50A44084D91420DD011F83D +:101F7000013B5840082340F30004013B2C4013F080 +:101F8000FF0384EA5000F6D1EFE730BD2083B8EDBF +:101F90000121884238BF084605F08EB908B105F026 +:101FA0008FB9704710B5084C01220849002001F094 +:101FB000B3FE23783BB1064803F036FD044803F036 +:101FC00069FD0023237010BDE8330020289300082A +:101FD000C83600201D482DE9F041036D2BB90122C0 +:101FE0004FF48051503005F0CBFA194E33780BB1D5 +:101FF000FFF7D8FF0324174F4FF00008134D154982 +:102000002846C7F8048003F037FD284603F070FB2C +:1020100048B1013C284603F03DFD14F0FF04EED129 +:10202000204634700FE00C4901220C4801F074FE88 +:10203000014618B1284603F0F7FCEAE7084800F02B +:1020400011F801203070BDE8F08100BFC8360020D3 +:10205000E83300203C22002028930008EC330020C5 +:102060002C9300080FB4002004B07047006870473C +:1020700003460068596870470B0A017043700B0CE7 +:10208000090E8370C1707047110A027003714170AC +:10209000110C120E8170C2701A0A42711A0C1B0EBA +:1020A0008271C37170470000C36A0239023B8B42E0 +:1020B00083BF4389006C01FB0300002070470000D0 +:1020C000C2F307238A76CB760378032B01BF120C69 +:1020D0000A75120A4A75704700F10B010022D301FC +:1020E00043EA520310F8012B52FA83F38842DAB222 +:1020F000F5D110467047000010B541780446002025 +:10210000013102464901022A16BFA35C032203EBF8 +:10211000C03302F101021EBF9BB203EB500398B221 +:102120009142F0D810BD000002684AB1134613F87E +:10213000011B1F290DD93A29F9D1911C8B4202D0DC +:102140004FF0FF3070471278302AF9D10360002039 +:102150007047014B187870473836002038B50D4667 +:10216000044618B9092000232B6038BD0368002BF2 +:10217000F8D01A78002AF5D08188DA889142F1D116 +:10218000587804F00FFC10F00100EBD12368EBE766 +:1021900038B50D4640F25231144602F0B9F9FF2825 +:1021A00007D9012C0BD9030A022468702B70204632 +:1021B00038BD30B1002CFAD001242870F7E7002494 +:1021C000F5E70446F3E700002DE9F8430026D0F8D0 +:1021D000008005460C468E76836B002B4AD098F81B +:1021E0000030042B4BD133463546402720E0B7F56D +:1021F000187F80F0C480F90606F1010608BF023797 +:10220000D05B02372BB900F5205292B2B2F5006FC5 +:102210000DD305F11A01C5F1FF0240EA0340214444 +:10222000FFF7B6FF002800F0AA800544002003460F +:10223000D8F8102092F82310B142D8D8002B40F0E3 +:102240009E80002D00F09B8000232544AB766373B5 +:10225000D8F81020137903F03701DB0621730BD473 +:1022600002F13800FFF704FFC4E90001938963819C +:10227000D3892381BDE8F88300200146F4E7C36CCD +:1022800001335ED1EA6B00232E26551E184615F841 +:10229000011F013020290CD0052908BFE52109289C +:1022A00004D10B2B9EBFE71801337E73E71801336F +:1022B00079730B28EBD1E11800204873A17E002927 +:1022C0004BD1002B40D06FF00C0604F10D00082517 +:1022D000361B331810F8011B002938D02E298BB279 +:1022E0004AD0A3F14101192903D8117B0D4200D036 +:1022F00020330373EDE7B9F1000F05D100F520534A +:102300009BB2B3F5006F0BD307F11A01C7F1FF02BF +:1023100040EA09402144FFF73BFF48B10744002051 +:1023200002368146D8F80C30985B0028E3D1384655 +:10233000B9F1000F4FF0000218BF002023189A7661 +:10234000A0E7B1463746EDE73F23A37601232344B8 +:1023500000219976137B03B96373D37A02F11C00D1 +:1023600003F03F0323730023FFF780FE20606360C8 +:10237000D38A6381138B7CE710250B46B9E73F2393 +:102380000125A37660E7000038B50546002435F83E +:10239000020B08B9204638BD02F0EEF86308C2B25D +:1023A00003EBC43312FA83F39AB2C0F3072303EBAF +:1023B000520303EBC2339CB2E9E7000037B5C378A0 +:1023C00004461BB90025284603B030BD00F14C017E +:1023D000826C01234078019104F00AFB054680B924 +:1023E000A36BE070A06C226BC31A9342EAD2A3786D +:1023F0000199022BE6D102440123607804F0F8FA37 +:10240000E1E70125DFE7000038B5836C05460C469F +:102410008B4210D0FFF7D2FF60B92246012305F1AD +:102420004C01687804F0C0FA00281CBF4FF0FF345C +:102430000120AC6438BD0020FCE7000038B5002363 +:102440000446C3704FF0FF338364FFF7DDFF0028BD +:102450004BD1B4F84A524AF655239D4207D10B227C +:10246000254904F14C0006F0A1FE00283FD094F865 +:102470004C30EB2B03D01833DBB2012B2ED84AF6AD +:1024800055239D4206D108221C4904F19E0006F006 +:102490008DFE48B3B4F85730B3F5007F1ED194F8E1 +:1024A0005930DBB15A1E1A4218D1B4F85A30ABB1C8 +:1024B00094F85C30013B012B10D8B4F85D306BB15F +:1024C000B4F85F307F2B06D804F16C00FFF7CEFD27 +:1024D000B0F5803F02D3B4F8623053B94AF65520C4 +:1024E00085420CBF0220032038BD0420FCE70120F8 +:1024F000FAE70020F8E700BF58930008649300084B +:1025000002392DE9F04701F007044FF0010A466C4B +:1025100005460AFA04F41746984606EB1136C1F34D +:10252000C809E4B2314628460136FFF76DFF18B1FD +:102530000120BDE8F087994605EB090292F84C307E +:10254000234214BF01210021414513D06340013FC4 +:1025500082F84C3085F803A0EBD0640014F0FF043F +:10256000EAD109F1010301244FF00009B3F5007F1E +:10257000E1D1D7E70220DCE701290246F8B50C4695 +:1025800040F28C800668F36A8B4240F28780337891 +:10259000013B032B00F28280DFE803F00229384B75 +:1025A00004EB5405B16B304601EB5521FFF72CFFCE +:1025B00010B14FF0FF30F8BD6F1CC5F30805B16BCB +:1025C0003046354401EB572195F84C50FFF71CFF7E +:1025D0000028EED1C7F30807E3073E4496F84C0005 +:1025E00045EA00204CBF0009C0F30B00E3E7B16BE4 +:1025F000304601EB1421FFF707FF0028D9D1640012 +:1026000004F4FF742644B6F84C00D4E7B16B3046AE +:1026100001EBD411FFF7F8FE0028CAD1A40006F19F +:102620004C0004F4FE742044FFF720FD20F07040BD +:10263000C1E7D0E90430D57953EA000101D09168AF +:1026400001B95DBB9168022DA4EB01010DD1013BE5 +:10265000728940F1FF305B0A43EAC053B3FBF2F3E7 +:1026600099421BD81CD0601CA5E7032D02D19369A9 +:102670008B42F8D8D3699BB9B16B304601EBD411CA +:10268000FFF7C2FE002894D1A0004C3600F4FE7083 +:102690003044FFF7EBFC20F000408CE701208AE794 +:1026A0006FF0004087E70000F8B5066804460D4665 +:1026B0003378042B0CBF4FF080524FF400128A4243 +:1026C00001D80220F8BDCA06FBD182680163D2B9E5 +:1026D000022B13D83389B3EB551FF2D9F36BA363E5 +:1026E000A36B6263002BECD003EB55234C36C5F390 +:1026F00008050020A3633544E563E3E7F36BC2718B +:10270000002BE7D01A4677897F02BD42114604D2DA +:102710003046FFF7C9FCA063E2E72046FFF72CFF35 +:10272000431C024606D00128CBD9F36A8342C8D99C +:10273000ED1BEAE70120C5E701292DE9F047064630 +:102740000C46174608D9C36A8B4205D90378022B79 +:1027500062D003D8012B22D0022552E0033B012B8B +:10276000FAD8816B01EBD411FFF74EFE0546002825 +:1027700047D1A40006F14C0304F4FE741C443378E2 +:10278000042B07D0204627F07047FFF76FFC00F0BE +:102790007040074339462046FFF76EFC2FE001EBFF +:1027A0005108816B01EB5821FFF72EFE054640BB17 +:1027B00014F0010406F14C0908F1010AC8F30808F5 +:1027C00008BFFBB230461FBF19F8083003F00F02F4 +:1027D0003B0103F0F00318BF134309F8083001234D +:1027E000B16BF37001EB5A21FFF70EFE054640B9BD +:1027F000CAF3080A44B1C7F3071709F80A7001239E +:10280000F3702846BDE8F08719F80A30C7F30327AC +:1028100023F00F031F43F0E7816B01EB1421FFF757 +:10282000F3FD05460028ECD1640006F14C0304F4E6 +:10283000FF741F551919C7F307274F70DFE7000012 +:10284000F8B504460E461746E3690BB91846F8BDBD +:10285000012BA6EB0305206814BFAA1C3A46691C8D +:10286000FFF76AFF0028F2D1E369013BE361EBE780 +:1028700001292DE9F84306460C461746056802D89B +:102880000220BDE8F883EB6A8B42F9D97AB9A146F8 +:1028900021463046A046FFF76FFE0446B0B92B78BC +:1028A000042B02D1002F43D1F7710020E9E72B78E8 +:1028B000042B02D1C379022BE9D04FF0FF32394605 +:1028C0002846FFF739FF0028E1D0DAE70128D7D002 +:1028D000421C01D10120D4E72B78042B19D1EA6ADC +:1028E000AB69023A93421CD308F10102A2420CD018 +:1028F0002B78042B08D10023A2EB09024946284675 +:10290000FFF7FEFD0028BCD1A146EB6AA342BFD869 +:10291000C5E7002241462846FFF70EFF0028DED01B +:10292000AFE70133AB612B7943F001032B71DBE798 +:10293000F3798BB9B468BC4202D10223F371B4E7D6 +:1029400021463046FFF718FE012899D9431CC1D013 +:1029500001348442EFD0A8E7032BA6D1B368BB4271 +:10296000A3D8B2691344BB429FD3E6E770B5C379DD +:102970000446032B06D181688369CD18A94203D18F +:102980000023E371002070BD4E1C20683246FFF723 +:10299000D3FE0028F7D13146F0E700002DE9F743D8 +:1029A00005460191FFF70AFD0446002849D105F1CB +:1029B0004C09019928464FF40072FFF775FB214638 +:1029C000A86407464846FFF7B7F96C896402B4F576 +:1029D000004F28BF4FF40044B4F5007F2FD92046A4 +:1029E00004F072FC804630B122460021640A0026C1 +:1029F000FFF7A2F909E06408EEE72346BA19414659 +:102A0000687803F0F5FF18B926446B899E42F4D329 +:102A1000404604F069FC6889801B18BF012003B0A0 +:102A2000BDE8F08301366B899E42F4D20123BA19C6 +:102A30004946687803F0DCFF0028F3D0EBE7002676 +:102A4000F1E70120EBE70000F8B50446FFF7B6FC1C +:102A50000546002842D12378032B37D12779012F4F +:102A600034D104F14C0601464FF400723046FFF7B2 +:102A700063F955234122722184F84A32AA2304F5CE +:102A80000D7084F84F2084F84B32522384F83012B2 +:102A900084F84C3084F84D30612384F8311284F886 +:102AA0004E3084F83332A16984F83222FFF7E4FA19 +:102AB000616904F50E70FFF7DFFA626B3B46314641 +:102AC00001326078A26403F093FF257100226078E0 +:102AD000114603F0B1FF003818BF0120F8BD000017 +:102AE00000232DE9F0430B6085B00F461546FFF734 +:102AF0001BFB061EC0F2B281804B53F82640002C0F +:102B000000F0AE813C6005F0FE0523786BB1607883 +:102B100003F048FFC70708D41DB110F0040500D02A +:102B20000A25284605B0BDE8F0830023F0B22370E3 +:102B3000607003F023FFC10700F194810DB14207DB +:102B4000EED400212046FFF779FC022840F099805E +:102B50006E4604F2122304F2522132461846103314 +:102B6000FFF784FA42F8040B8B42F7D1002556F8A0 +:102B7000041B00297DD02046FFF760FC012879D88E +:102B80000128A26C40F0C08004F1570304F18C01CD +:102B900013F8015B002D7BD18B42F9D1B4F8B4302E +:102BA000B3F5807F74D194F8B830092B70D104F15B +:102BB0009400FFF75DFA4FF0FF33171841F1000161 +:102BC000BB4275EB010363D304F1A000FFF74EFA9B +:102BD00094F8BA302063012BA37059D194F8B990BE +:102BE00003FA09F91FFA89F36381002B50D0444B93 +:102BF00004F1A800FFF73AFA0646984248D8831C29 +:102C0000626304F1A400E362FFF730FA00EB02080C +:102C100004F19C00C4F84080FFF728FA10441FFA22 +:102C200089F2A06306FB02F313EB080345EB0502F0 +:102C30009F4271EB02032BD32E4604F1AC00FFF749 +:102C400015FAE06365B96389B34221D9E16B204687 +:102C5000FFF72AFA81192046FFF7D6FB98B901360B +:102C6000631993F84C30812B14D02035C5F3080537 +:102C7000E8E703200135042D7FF479AF042807D15C +:102C800001E0042801D101254BE701287FF678AF48 +:102C90000D2546E705F1140004F14C063044FFF71A +:102CA000E5F901280546F3D9E36A8342F0D9618941 +:102CB000821E236C02FB01336364A16B204601EB8F +:102CC000D511FFF7A1FB0028DDD105F07F0006EB51 +:102CD0008000FFF7CBF9431C03D00135A842ECD0AC +:102CE000D6E70425C4E90500064A257000251388A7 +:102CF000E56101339BB21380E38012E73C3600208C +:102D0000FDFFFF7F40360020B4F85730B3F5007F59 +:102D1000BED1B4F8626026B904F17000FFF7A6F9DD +:102D2000064694F85C302663591EA3700129AFD87B +:102D300094F859506581002DAAD0691E2942A7D167 +:102D4000B4F85D8018F00F0FA4F80880A0D1B4F893 +:102D50005F0018B904F16C00FFF788F9B4F85A1055 +:102D6000002995D006FB03FE01EB181CF4446045D6 +:102D70008ED3A0EB0C00A842B0FBF5F388D33E48FD +:102D8000834285D84FF6F57083426DD903259F1C89 +:102D9000114402EB0C03032DE7626263A163236419 +:102DA0004CD1B4F8763053EA08037FF471AFBB001E +:102DB00004F17800FFF75AF9E06303F2FF13B6EB72 +:102DC000532FFFF465AF4FF0FF33032DC4E90533F4 +:102DD0004FF08003237187D1B4F87C30012B83D16D +:102DE000511C2046FFF710FB00287FF47DAFB4F89C +:102DF0004A224AF6552320719A427FF475AF1F4B41 +:102E000004F14C00FFF732F998427FF46DAF03F103 +:102E1000FF5304F50C70FFF729F903F50053203335 +:102E200098427FF461AF04F50D70FFF71FF9A061C0 +:102E300004F50E70FFF71AF9606155E7B8F1000F5D +:102E40003FF426AF7144022D4FEA4703E1631EBFF2 +:102E5000D91907F0010303EB5103AEE70B2560E638 +:102E60000C255EE603255CE640F6F575AB428CBFAB +:102E7000022501258BE700BFF5FFFF0F525261418C +:102E80002DE9F84F07460568884649B96E69C6B10D +:102E9000EB6AB34298BF0126AB69A3B9002405E0F1 +:102EA000FFF76AFB0128044603D801242046BDE849 +:102EB000F88F421C00F0D280EB6A8342F6D8464677 +:102EC000EAE70126E8E72A78EB6A042A40F08380E3 +:102ED000A6F1020A023B4FF0010B9A4528BF4FF0C2 +:102EE000000AD146696C284601EB1931FFF78CFACC +:102EF00000283BD109F00703EA6AC9F3C8010BFABD +:102F000003F3901EDBB26A184C4609F1010992F8EE +:102F10004C20814502EA030233BF5B0000234FF4DB +:102F20000071DBB228BF9946B2B90234631E033385 +:102F3000BCD80123214628461A46FFF7E1FA0228A9 +:102F4000B3D0012800F08A80B8F1000F13D102231A +:102F5000FB710028A9D130E0CA450AD0002BD2D19C +:102F60000131B1F5007FBDD20123CCE74FF0FF3432 +:102F7000DCE70024DAE7FB79022B07D1731CA342BC +:102F8000E7D0BB68F31ABB610323FB7108F10102B0 +:102F9000FB69A24205D113B10133FB61D9E70223DA +:102FA000FBE70BB90123FB61224641463846FFF798 +:102FB00047FC00284FD10123FB61EA6AAB69023A62 +:102FC0006C6193429CBF03F1FF33AB612B7943F0FB +:102FD00001032B716AE7464514D1741C3846A3429D +:102FE00098BF02242146FFF7C7FA01283FF45DAFDE +:102FF000431C33D0E0B16B69012B03D9EA6A9342D9 +:1030000038BF1E4634460134EB6AA34203D8012E72 +:103010007FF644AF022421463846FFF7ADFA48B1A7 +:1030200001283FF442AF013018D0B442EBD135E76C +:10303000002CE7D04FF0FF3221462846FFF77CFBFB +:1030400048B9B8F1000FB8D0224641462846FFF7EC +:1030500073FB0028B1D001287FF427AF4FF0FF3475 +:1030600024E700002DE9F84306680446076B89460B +:1030700033782037042B0CBF4FF080534FF40013EC +:10308000BB429CBF00238363836B73B1C7F3080803 +:10309000B8F1000F3CD10133416B836339B93389F7 +:1030A000B3EB571F34D80023A36304200AE07389CD +:1030B000013B13EA57232BD1FFF75EFA012805469F +:1030C00002D80220BDE8F883421C01D10120F9E7B3 +:1030D000F36A834216D8B9F1000FE4D0616B204641 +:1030E000FFF7CEFE0546C8B10128EAD0431CEDD05B +:1030F00001463046FFF752FC0028E7D1E37943F060 +:103100000403E371294630466563FEF7CDFFA063F3 +:103110004C36002027634644E663D3E70720D1E717 +:10312000F8B50E46002104460768FFF7BDFA98B9C6 +:103130000546A16B3846FFF767F968B93A78E36B43 +:10314000042A1B780CD11B060ED50546012120460A +:10315000FFF788FF0028ECD0042808BF072006E00E +:10316000E52B01D0002BF0D10135B542EED1F8BDF1 +:10317000C16C4B1C2DE9F04104460568066B1FD15C +:10318000E5274FF00108A16B2846FFF73DF998B9F4 +:103190002A78E36B042A09BF1A781F7002F07F02B5 +:1031A0001A7085F80380236BB3420DD200212046AC +:1031B000FFF758FF0028E6D0042808BF022003E0EC +:1031C000FFF772FA0028DBD0BDE8F0812DE9F0416D +:1031D00005460068A96B0669FFF716F9044620B991 +:1031E000EB6B1A78852A03D002242046BDE8F081D3 +:1031F000324603F1200153F8040B8B4242F8040BD2 +:10320000F9D1777801377F01A7F16003B3F5007F2B +:10321000EAD800212846FFF725FF04280446E3D01A +:103220000028E2D1A96B2868FFF7EEF804460028D1 +:10323000DBD1EB6B1A78C02AD6D106F1200203F15C +:10324000200153F8040B8B4242F8040BF9D196F895 +:1032500023300F222C33B3FBF2F3B7EB431FC3D35E +:103260004FF0400800212846FFF7FCFE04280446E2 +:10327000BAD00028B9D1A96B2868FFF7C5F8044671 +:103280000028B2D1EB6B1A78C12AADD1B8F5187FFE +:1032900009D206EB080203F1200153F8040B8B421C +:1032A00042F8040BF9D108F120084745DAD8B8F5FF +:1032B000187F9AD83046FEF71FFF7388834294D058 +:1032C00092E700000B68002210B5036004460B6A09 +:1032D00083604B6AC261C37123F0FF03896AC0E94E +:1032E0000432C164FFF7E0F920B92046BDE8104080 +:1032F000FFF76CBF10BD0000F8B503680546012755 +:103300001C692046FEF7F8FEA070000A6678E0709F +:103310002846E96CFFF7C8F920B1022828BF02202F +:10332000C0B2F8BDA96B2868FFF76EF80028F4D189 +:10333000EB6B04F1200254F8041B944243F8041B85 +:10334000F9D12B68DF70002EE7D000212846013E1E +:10335000FFF788FEE0E700002DE9F8434FF0FF0893 +:1033600006460768042445464FF6FF79B16B11B94C +:10337000002C73D063E03846FFF746F80446002877 +:103380005DD1F06B0378002B6ED03A78042A11D10E +:10339000852B4DD1336B3046F364FFF717FF04469E +:1033A00000284CD13B691B7903F03F03B3712046E1 +:1033B000BDE8F883C27AE52B02F03F02B27143D038 +:1033C0002E2B41D022F0200108293DD00F2A40D1D8 +:1033D000590637D503F0BF05336B90F80D80F364C1 +:1033E000437B434530D1428B72BB03780D21FC688F +:1033F00023F04003DFF874E0013B4B4301211EF84A +:1034000001CB30F80CC009B3FF2B1DD824F813C032 +:103410006146013301320D2AF1D10278520605D5F9 +:1034200021B1FF2B10D8002224F81320013DEDB26A +:1034300000213046FFF716FE0446002896D00023F0 +:10344000B363B4E7AB42CBD0FF25F1E7CC45E1D085 +:10345000FAE72DB9FEF740FE404501D10024A6E76A +:103460004FF0FF33F364A2E70424E8E70094000878 +:103470002DE9F04F002187B00446D0F80090FFF707 +:1034800013F9804670B999F80030042B33D1D9F87C +:103490000C00FEF779FF07462046FFF75DFF054663 +:1034A00020B18046404607B0BDE8F08FD9F8103013 +:1034B0009A8CBA42F0D193F823B040265D4506D1EC +:1034C000D9F80C3033F81530002BE5D1EAE7F106D6 +:1034D000D9F8103008BF0236985B01F04DF8D9F8E2 +:1034E0000C30824633F8150001F046F88245D3D1FE +:1034F00002360135E2E74FF0FF0A4FF0FF3B554639 +:10350000C4F84CB0A16B4846FEF77EFF00285CD1A2 +:10351000E66B3778002F77D0F27AE52F02F03F0381 +:10352000A37103D0120704D50F2B04D0C4F84CB0FC +:103530004FE00F2B54D194F84B3058063FD4790606 +:1035400045D5236B07F0BF0796F80DA0E364737BA6 +:1035500053453ED1738B002B3BD135780121D9F8EF +:103560000C3005F03F0501930D23013D5D43284BD1 +:1035700013F8012BB25A71B3FF2D059329D81046C9 +:10358000049200F0F9FF6B1C03900293019B33F847 +:10359000150000F0F1FF039981421AD1049A029DAF +:1035A0001146059B1B4A9342E2D133785A0604D553 +:1035B00019B1019B33F815305BB97D1EEDB20021C6 +:1035C0002046FFF74FFD00289CD080466AE7BD42A9 +:1035D000BDD0FF25F3E74FF6FF708242E2D0F8E757 +:1035E0002DB93046FEF778FD50453FF45BAF94F8B7 +:1035F0004B30DB079AD40B2204F14001304605F032 +:10360000D5FD002892D14DE74FF004084AE700BFEE +:10361000009400080D9400082DE9F04F90F84BB08D +:1036200099B004461BF0A00540F068810668F26876 +:1036300032F81530002B4AD13378042B40F08780C4 +:103640000F230E352046B5FBF3F5A91CFFF768FDE7 +:103650008146002877D1236B0135A3EB4515E3792B +:103660005A07E56435D523F004032046E371FFF7DC +:103670007DF950BB4FF0FF32616B2046FFF7E0F859 +:1036800018BBA3682BB3214604A8FFF71BFEE0B9C3 +:1036900070894FF40071D4E90423E0FB0123306901 +:1036A000C4E904233830FEF7EFFC3069D4E9042381 +:1036B0002830FEF7E9FCE379326904A843F00103FE +:1036C00082F82130FFF718FE18B181463BE0013542 +:1036D000AEE7D6E90354402200212046FEF72CFB3A +:1036E0008523012140222370C0234FF0C10C04EB3D +:1036F000010884F8203000231E469E46571C04F81B +:1037000002C0F0B2023204F807E021B135F813101C +:1037100009B10133DBB20F0AA15408F8027002327A +:10372000D706F2D135F813700136002FE6D184F8B0 +:103730002330831C28466370FEF726FE84F824009D +:10374000000A84F82500484619B0BDE8F08F04F15E +:1037500040070DF1100A1BF0010F97E807008AE8F7 +:10376000070000F0D38040234FF0010884F84B306D +:10377000BC46F368B8F1050F9AE80700ACE803000F +:103780002CF8022B4FEA12428CF8002059D9981ECF +:10379000424630F8021F002942D10DF10F0C0721DB +:1037A00002F00F0E914612090EF13000392888BF41 +:1037B0000EF1370001390CF8010902D0B9F10F0FF1 +:1037C000EED818AB7E205A1802F8580C3846002262 +:1037D000914206D010F801CB02F1010EBCF1200F8E +:1037E00031D104F13F0C072902F1010297BF18AB58 +:1037F00020205818013198BF10F8580C072A0CF8EF +:103800000200F0D92046FFF733FE8146002878D128 +:1038100008F10108B8F1640FAAD14FF0070992E747 +:103820004FF0100C01F0010E49080EEB4202D303D9 +:1038300044BF82F4883282F02102BCF1010CF1D144 +:10384000A7E74246A9E77246C2E7216B2046A1EBF3 +:103850004511FEF729FF814600287FF474AF4FF62B +:10386000FF783846FEF738FC0190A16B3046FEF732 +:10387000CBFD814600287FF466AFE36BE9B2019A85 +:103880004FF00D0CD6F80CE05A734FF00F02DFF832 +:10389000E0A0DA724A1E18730CFB02F28446987696 +:1038A000D87640451AF8019B0CF1010C18BF3EF880 +:1038B000120003EB090B18BF013203F809004FEAAD +:1038C0001029002808BF4046BCF10D0F8BF801906D +:1038D000E7D1404502D03EF812200AB941F040013C +:1038E0001970012300212046F370FFF7BBFB8146CE +:1038F00000287FF428AF013DB7D11BE04FF0060947 +:1039000021E704287FF41FAF84F84BB01BF0020FAF +:1039100020461BBF0C350D210125B5FBF1F518BF65 +:1039200001352946FFF7FCFB814600287FF40BAFE9 +:10393000013D8AD1A16B3046FEF766FD8146002825 +:103940007FF401AF01462022E06BFEF7F5F9E36B4F +:1039500003CF18605960BA7839889A72198194F83F +:103960004B30E26B03F0180313730123F370EAE6A4 +:103970000094000810B504460A463430FEF776FB82 +:10398000886004F13800FEF773FBC2E9040194F883 +:10399000213003F00203D3710023D36110BD000076 +:1039A00003284B8B04BF8A8A43EA024318467047B8 +:1039B0002DE9F04F0B7899B0044689462F2BD0F8AB +:1039C00000B001D05C2B09D14A46137891460132F0 +:1039D0002F2BFAD05C2BF8D0002301E0DBF81C3051 +:1039E000A3600023E3619BF80030042B1ED1A36881 +:1039F000E3B1DBF82030214604A82362DBF8243051 +:103A00006362DBF82830A362FFF75CFC0346002802 +:103A100054D1DBF8102002F13800FEF727FBC4E98F +:103A2000040392F8213003F00203E37199F80030A7 +:103A30001F2B00F2358180230021204684F84B3073 +:103A400019B0BDE8F04FFEF72FBE49460B78894606 +:103A500001312F2BFAD05C2BF8D01F2B8CBF002507 +:103A60000425012F2FD113882E2B31D1002322F8CA +:103A7000173004F140029F428CBF2E2120210133D8 +:103A80000B2B02F8011BF6D145F02005204684F8E7 +:103A90004B50FFF7EDFC94F84B30002800F0E78026 +:103AA00004280BD1990603F0040240F1DC80002ABF +:103AB00000F0F6808023002084F84B3019B0BDE878 +:103AC000F08F0425CDE7022F02D153882E2BCAD0C8 +:103AD000911E87BB002322F81730002F00F01181C0 +:103AE00032F81300194601332028F9D009B92E28DD +:103AF00001D145F00305901E30F817302E2B01D070 +:103B0000013FF9D14FF020334FF0000A6364D046F3 +:103B10002364C4F847300823481C32F81160009031 +:103B2000F6B1202E03D02E2E0DD1B84210D045F084 +:103B300003050099F0E731F81730202B01D02E2B28 +:103B4000C8D1013FC5E79A4505D20099B9423BD19A +:103B50000B2B30D101E00B2B27D145F003050B23B4 +:103B600094F84020E52A04BF052284F84020082B61 +:103B700004BF4FEA88085FFA88F808F00C030C2BA2 +:103B800003D008F00303032B01D145F00205A80779 +:103B90003FF57CAF18F0010F18BF45F0100518F085 +:103BA000040F18BF45F0080570E70099B94202D02C +:103BB00045F00305D4D84FEA88080B234FF0080AD4 +:103BC00000975FFA88F8B4E77F2E15D9304640F2A7 +:103BD0005231CDE9022345F00203019300F098FC35 +:103BE00010F0800F0646DDE9022316D000F07F06B4 +:103BF00046498E5D019D46B331464548CDE90123D6 +:103C000005F0FEFADDE90123F8B9A6F1410189B218 +:103C100019291ED848F0020810E0FF28EAD9591ED9 +:103C20008A4503D345F003059A4682E704EB0A016F +:103C3000000A0AF1010A019D81F8400004EB0A0123 +:103C40000AF1010A81F8406073E745F003055F2639 +:103C5000F4E7A6F1610189B219299EBF203E48F020 +:103C60000108B6B2EAE7002A08BF052026E75A078E +:103C70003FF524AFA379DB0645D59BF80000042867 +:103C800035D1A3682146E27923622369DBF810006D +:103C900023F0FF0313436362E36CA362FFF76AFE42 +:103CA00023680027DA6819F8010B00283FF409AFF0 +:103CB00040F25231009200F04BFC054608B31F2839 +:103CC000009A7FF6FEAE2F283FF4BFAE5C283FF48B +:103CD000BCAE7F2805D801460E4805F091FA009A3F +:103CE00078B9FF2F0DD022F817500137DBE7216B91 +:103CF0000BF14C03C1F308011944FFF751FEA0601A +:103D0000CEE70620DAE60520D8E600BF809300085B +:103D100079930008709300081FB5CDE9001003A83F +:103D200014460391FEF700FA002815DB0B4A52F8FF +:103D300020300BB100211970019B0BB100211970CB +:103D400042F820302CB1002201A96846FEF7C8FED7 +:103D50000446204604B010BD0B24FAE73C36002090 +:103D60002DE9F04798B0904605460191002800F0F3 +:103D7000528102F03F0603A901A83246FEF7B0FEC9 +:103D8000002840F04681039B4FF48C60049303F0BD +:103D90009BFA0746002800F04081039B00F5007263 +:103DA0000199D86004A81A61FFF702FE044620B901 +:103DB0009DF95B30002BB8BF062418F01C0F00F0F3 +:103DC000CD80002C4CD0042C40D104A8FFF724FC5B +:103DD000044600283AD146F00806039B1A78042AC4 +:103DE00040F08380186929462B60FFF7C3FD039BD1 +:103DF0001E22002118690230FDF79EFF039C00215E +:103E00001A2220692630FDF797FF236920221A71B4 +:103E1000246903F093FA0146012208342046FEF794 +:103E20002BF9039B04A81B6983F82120FFF764FA90 +:103E3000044658B9A96801B302462846FEF718FDA2 +:103E4000AB68039A0446013B5361B4B1384603F0B2 +:103E50004BFA0CB100232B60204618B0BDE8F08768 +:103E60009DF8163013F0110F40F0848018F0040F05 +:103E700040F0C98018F0080FAFD1039A31071399A9 +:103E8000936C48BF46F04006E964AB6410780428A0 +:103E900072D1069B9DF817102B62089B106923F0C6 +:103EA000FF030B4329466B62179BAB62FFF762FD72 +:103EB000DDF80CA00024002205F15008BAF8063005 +:103EC00021464046C5F800A0AB80002385F830604D +:103ED00085F831406C64C5E90E234FF40072FDF79C +:103EE0002BFFB20653D40024B0E703F027FA0146B3 +:103EF000009013980E30FEF7BFF813980099163013 +:103F0000FEF7BAF8039C13992078FFF749FD2023A8 +:103F100000228046CB7220461399FEF7D1F8139BFE +:103F2000002201211A775A779A77DA77039BD970A2 +:103F3000B8F1000FA1D0414604A8D3F84890FEF78D +:103F400097FC0446002881D149460398FEF75CFAA5 +:103F5000039B044608F1FF30586176E7002C7FF49C +:103F600075AF9DF81630DC064FD418F0020F84D0E0 +:103F7000D80782D5072469E7FFF712FD0023A86060 +:103F800001F11C00FEF772F86B61286190E7D5E93A +:103F9000046956EA0903A6D0BAF80AA0A9684FEA4C +:103FA0004A2AC5E90E69B24574EB09031BD3002404 +:103FB0002964002C7FF44AAFC6F30803002B92D08B +:103FC000039C2046FEF770F808B3760A01234146A9 +:103FD00046EAC95682196A64607802F0E5FC041E5C +:103FE00018BF012432E72846FEF7C6FAB6EB0A06E8 +:103FF000014669F10009012803D9431CD3D10124EA +:10400000D6E70224D4E7082420E704241EE702248C +:104010001CE704461EE709241EE711241CE70000E4 +:104020002DE9F04F994685B00023884603A9044640 +:10403000C9F800301646FEF791F8054680BB94F8A3 +:1040400031506DBB94F8303013F00103009300F051 +:10405000A68004F1500AD4E90432D4E90E011B1AF7 +:1040600062EB0102B34272F1000238BF1E46BEB1DC +:10407000D4E90E10C1F30803002B40F08280039BAB +:104080005A894B0A013A43EAC0531A401BD151EAFC +:10409000000309D1A06801280DD8022584F8315009 +:1040A000284605B0BDE8F08F216C20460192FEF74E +:1040B00063FA019AEFE7431C04D10123009D84F8C1 +:1040C0003130EDE72064DDF80CB0216C5846FDF787 +:1040D000EBFF0028E1D0B6F5007F02EB000731D3FB +:1040E000BBF80A1002EB5620730A88429BF80100C5 +:1040F00088BF8B1A3A464146019302F055FC0028CE +:10410000DBD194F93020019B002A0BDA606CC01BD4 +:10411000984207D24FF40072514608EB4020FDF759 +:10412000E5FD019B5F02D9F80030F61BB8443B4423 +:10413000C9F80030D4E90E32DB1942F10002C4E9BB +:104140000E3294E7626CBA421AD094F93030002BE8 +:104150000DDA012351469BF8010002F049FC0028CA +:10416000ABD194F8303003F07F0384F830300398FB +:1041700001233A465146407802F016FC00289CD1B3 +:104180006764A16B4046C1F30801C1F50077514453 +:10419000B74228BF37463A46FDF7A8FDC3E70725D3 +:1041A0007EE7000070B596B00E460022019002A98D +:1041B00001A8FEF795FC0446E0B94FF48C6003F0CB +:1041C00083F80546D8B1029B00F500720199D860CA +:1041D00002A81A61FFF7ECFB044640B99DF9533081 +:1041E000002B0ADB1EB1314602A8FDF7EDFF284681 +:1041F00003F07AF8204616B070BD0624F7E71124C4 +:10420000F8E7000070B5B8B00222019003A901A838 +:10421000FEF766FC044608BB039B4FF48C601093CA +:1042200003F052F80546002866D0039B00F50072A3 +:104230000199D86010A81A61FFF7BAFB044650B97B +:104240009DF88B30980655D4190653D49DF8463006 +:10425000DA0706D50724284603F046F8204638B08A +:1042600070BD039B04931878042814D104A918691D +:10427000FFF780FB069E9DF84630DB0610D410A8A1 +:10428000FEF776FF04460028E5D156BB0398FEF7FB +:10429000DBFB0446DFE71F99FFF782FB0646EAE7F0 +:1042A000039BDA69B242D5D024930021269624A834 +:1042B0001B78042B01BFDDE90823CDE928239DF8F5 +:1042C00017308DF89730FEF7EFF904460028C2D179 +:1042D00024A8FFF741F804460028BBD00428BAD12F +:1042E000CDE70246314604A8FEF7C2FA044600288C +:1042F000B1D1CBE70624AEE71124AFE7F0B5BDB0EE +:10430000CDE900106846FDF70FFF022203A901A8BE +:10431000FEF7E6FB0446002841D1039B4FF48C6076 +:10432000149302F0D1FF0546002800F0EE80039BB5 +:1043300000F5007214AE0199D8601A613046FFF79B +:1043400037FB044640BB9DF89B3013F0A00F40F0B4 +:10435000D880039B009F1A78042A68D11B6904AC9B +:1043600003F1400C1868083353F8041C22466345D7 +:1043700003C21446F6D15022314628A8FDF7B6FCF8 +:10438000394628A8FFF714FB044600284CD12A9A86 +:10439000169B9A4206D00824284602F0A5FF204624 +:1043A0003DB0F0BD349A209B9A42F4D128A8FFF783 +:1043B00033F904460028EFD1039B04AF1B6993F83F +:1043C00001E093F823C09C8C3A46083303CAB242FA +:1043D00043F8080C43F8041C1746F5D1039B28A8A2 +:1043E0001B6983F801E0039B1A6982F823C01A69EC +:1043F00082F82440240A82F825401A691379D906E4 +:104400005CBF43F020031371FEF776FF04460028DB +:10441000C2D13046FEF7ACFE04460028BCD103985A +:10442000FEF712FB0446B7E70428B5D1BEE7239A8E +:1044300004AB02F1200C1068083252F8041C1C4630 +:10444000624503C42346F6D15022314628A8FDF721 +:104450004DFC394628A8FFF7ABFA044600284CD19A +:104460002A9A169B9A4296D1349A209B9A4292D1CC +:1044700028A8FFF7D1F8044600288DD137990DF10F +:104480001D030DF12D0001F10D0253F8044B834281 +:1044900042F8044BF9D11888012710809B7893705B +:1044A0009DF81B30039CDA0658BF43F02003CB7203 +:1044B000E770CB7ADB06ACD5169A2A9B9A42A8D035 +:1044C0002078FFF76DFA01462046FDF7EDFD014625 +:1044D000C8B12046FDF798FF044600287FF45CAF82 +:1044E000039890F86D302E2B93D12A9A00F16C012D +:1044F000FDF7E6FD039BDF708BE704287FF44CAFEC +:10450000B6E7062448E7022446E7112447E70000FF +:104510007F2810B501D880B210BDB0F5803F13D20E +:1045200040F2523399420FD10849002231F8024B30 +:1045300093B2844203D103F18000C0B2ECE70132B0 +:10454000802AF3D11346F6E70020E5E7C09600087D +:104550007F280DD940F25233994208D1FF2806D85E +:1045600000F10040034B803833F810007047002002 +:10457000704700BFC0960008B0F5803FF0B522D26A +:104580001F4A83B21F49B0F5805F28BF0A46141D39 +:1045900034F8042C2146AAB1934213D334F8025CB8 +:1045A0002E0AEFB252FA85F5A84222DA082E09D86F +:1045B000DFE806F0050A10121416181A1C00801AFB +:1045C00034F810301846F0BD981A00F001001B1A9C +:1045D0009BB2F7E7103BFBE7203BF9E7303BF7E7FF +:1045E0001A3BF5E70833F3E7503BF1E7A3F5E35354 +:1045F000EEE70434002ECBD101EB4702C7E700BF42 +:10460000109400080496000808B5074B074A19687B +:1046100001F03D01996053680BB190689847BDE87F +:10462000084003F09DB800BF00000240443600205F +:1046300008B5084B1968890901F03D018A019A60A3 +:10464000054AD3680BB110699847BDE8084003F0EC +:1046500087B800BF000002404436002008B5084B70 +:104660001968090C01F03D010A049A60054A536972 +:104670000BB190699847BDE8084003F071B800BFDE +:10468000000002404436002008B5084B1968890D27 +:1046900001F03D018A059A60054AD3690BB1106AA1 +:1046A0009847BDE8084003F05BB800BF0000024037 +:1046B0004436002008B5074B074A596801F03D0110 +:1046C000D960536A0BB1906A9847BDE8084003F07F +:1046D00047B800BF000002404436002008B5084B30 +:1046E0005968890901F03D018A01DA60054AD36AF7 +:1046F0000BB1106B9847BDE8084003F031B800BF1C +:10470000000002404436002008B5084B5968090CE7 +:1047100001F03D010A04DA60054A536B0BB1906B5E +:104720009847BDE8084003F01BB800BF00000240F6 +:104730004436002008B5084B5968890D01F03D0149 +:104740008A05DA60054AD36B0BB1106C9847BDE857 +:10475000084003F005B800BF0000024044360020C6 +:1047600008B5074B074A196801F03D019960536C81 +:104770000BB1906C9847BDE8084002F0F1BF00BF54 +:10478000000402404436002008B5084B1968890926 +:1047900001F03D018A019A60054AD36C0BB1106D9E +:1047A0009847BDE8084002F0DBBF00BF00040240AC +:1047B0004436002008B5084B1968090C01F03D018A +:1047C0000A049A60054A536D0BB1906D9847BDE895 +:1047D000084002F0C5BF00BF00040240443600207C +:1047E00008B5084B1968890D01F03D018A059A60EA +:1047F000054AD36D0BB1106E9847BDE8084002F032 +:10480000AFBF00BF000402404436002008B5074B8C +:10481000074A596801F03D01D960536E0BB1906EA3 +:104820009847BDE8084002F09BBF00BF000402406B +:104830004436002008B5084B5968890901F03D014C +:104840008A01DA60054AD36E0BB1106F9847BDE854 +:10485000084002F085BF00BF00040240443600203B +:1048600008B5084B5968090C01F03D010A04DA60EB +:10487000054A536F0BB1906F9847BDE8084002F0AE +:104880006FBF00BF000402404436002008B5084B4B +:104890005968890D01F03D018A05DA60054AD36F38 +:1048A00013B1D2F880009847BDE8084002F058BF25 +:1048B000000402404436002000230C4910B51A467B +:1048C0000B4C0B6054F82300026001EB43000433EF +:1048D0004260402BF6D1074A4FF0FF339360D3601C +:1048E000C2F80834C2F80C3410BD00BF44360020B2 +:1048F000C0970008000002400F28F8B510D9102812 +:1049000010D0112811D0122808D10F240720DFF869 +:10491000C8E00126DEF80050A04208D9002653E086 +:104920000446F4E70F240020F1E70724FBE706FA2A +:1049300000F73D424AD1264C4FEA001C3D4304EBB0 +:1049400000160EEBC000CEF80050C0E90123FBB208 +:1049500073B12048D0F8D83043F00103C0F8D83004 +:10496000D0F8003143F00103C0F80031D0F8003135 +:1049700017F47F4F0ED01748D0F8D83043F0020319 +:10498000C0F8D830D0F8003143F00203C0F800314D +:10499000D0F8003154F80C00036823F01F030360C3 +:1049A000056815F00105FBD104EB0C033D2493F8D9 +:1049B0000CC05F6804FA0CF43C602124056044617B +:1049C00012B1987B00F0CAFC3046F8BD0130A3E775 +:1049D000C0970008004402584436002010B5302427 +:1049E00084F31188FFF788FF002383F3118810BD3B +:1049F00010B50446807B00F0C7FC01231549627B9B +:104A000003FA02F20B6823EA0203DAB20B6072B90E +:104A1000114AD2F8D81021F00101C2F8D810D2F80A +:104A2000001121F00101C2F80011D2F8002113F4A5 +:104A30007F4F0ED1084BD3F8D82022F00202C3F8E2 +:104A4000D820D3F8002122F00202C3F80021D3F8C5 +:104A5000003110BD443600200044025808B5302310 +:104A600083F31188FFF7C4FF002383F3118808BD87 +:104A7000836CC26A8B42506810B506D95A1E4C002E +:104A800002EB4103B3FBF4F3184410BD01F0010342 +:104A90008A0748BF43F002034A0748BF43F00803B0 +:104AA0000A0748BF43F00403CA0648BF43F0100397 +:104AB0008A06426B48BF43F02003134343637047A9 +:104AC00010B5074C204600F0CBFF064B0022C4E98E +:104AD0001023054BA364054BE363054BE36410BD52 +:104AE000C83600200070005200B4C4041C370020F7 +:104AF0001C390020C36A0BB9104BC3620379012B28 +:104B000011D10F4B98420ED10E4BD3F8D42042F462 +:104B10008032C3F8D420D3F8FC2042F48032C3F8AA +:104B2000FC20D3F8FC30436C00221A65DA621A606C +:104B30005A605A624FF0FF329A637047C09800087B +:104B4000C8360020004402580379012B1BD0436C67 +:104B500000221A65DA621A605A605A624FF0FF3218 +:104B60009A63094B98420ED1084BD3F8D42022F413 +:104B70008032C3F8D420D3F8FC2022F48032C3F86A +:104B8000FC20D3F8FC307047C8360020004402589F +:104B900010B5446C0649FFF76BFF6060236842F272 +:104BA000107043F003032360BDE8104001F05EBDC8 +:104BB000801A06000129F8B5466C0B4F09D17568BB +:104BC0000A493D40FFF754FF054345F480557560A1 +:104BD000F8BD746806493C40FFF74AFF044344F4BB +:104BE00080547460F4E700BF00ECFFFF80F0FA022D +:104BF00040787D01436C00225A601A6070470000C3 +:104C0000426C0129536823F4404304D0022905D0A3 +:104C100001B95360704743F48043FAE743F400431B +:104C2000F7E70000436C41F480519A60D9605A6BF9 +:104C30001206FCD580229A637047000010B541F43B +:104C40008851446CA260E160616B11F04502FBD0B9 +:104C5000A26311F0040203D0FFF718FF012010BD7A +:104C6000616910461960FAE710B541F48851446C47 +:104C7000A260E160616B11F04502FBD0A26311F00C +:104C8000050203D0FFF702FF012010BD6169104645 +:104C90001960FAE773B5134604460E46302282F3D4 +:104CA0001188426CD26B32B14FF0FF31403001932A +:104CB00001F0E8FC019B606C00220265C263C262E5 +:104CC000456B15F4807504D185F31188012002B07D +:104CD00070BD4FF0FF31816382F31188012E06D938 +:104CE0000C21204602B0BDE87040FFF7BDBF104662 +:104CF000EDE7000073B5446C0E4600250192616B30 +:104D0000A1632565E562FFF7C1FE012E07D9019B6E +:104D10002A460C2102B0BDE87040FFF7A5BF02B0E3 +:104D200070BD000010B541F49851446CA260E16080 +:104D3000616B11F04502FBD0A26311F03F0203D07A +:104D4000FFF7A4FE012010BD216A10461960E16939 +:104D50005960A16999606169D960F4E72DE9F74369 +:104D600004460191006D01A91746984602F020FC07 +:104D7000064600284AD0626C2046DDF8049055684B +:104D8000C5F3090501356B00A56CB5FBF3F54FF4D0 +:104D90007A73B5FBF3F55D43556200F027FE50BB17 +:104DA000636C4FF0FF3201254146C3F8589020460E +:104DB0001D659A634FF49572DA6342F207029F62AF +:104DC000DA62E36C0A9AFFF74FFFA0B9E26C104B6E +:104DD00011680B407BB929462046FFF75BFF05466B +:104DE00048B92E463A460199206D02F019FC30462A +:104DF00003B0BDE8F0833A460199206D02F010FC43 +:104E0000E26C01212046FFF775FFF0E70126EEE78F +:104E100008E0FFFD2DE9F7431F46436C01924FF474 +:104E20007A725D6804468846C5F3090501356E004F +:104E3000856CB5FBF6F5B5FBF2F555435D6200F008 +:104E4000D5FD20B10125284603B0BDE8F0837E02E0 +:104E500001A9206D324602F0ABFB05460028F1D0D7 +:104E6000636C019AD4F84C909A6501221A654FF050 +:104E7000FF329A634FF49572DA639E62236BDB060E +:104E80004B4658BF4FEA4828012F42461BD91221F2 +:104E90002046FFF7E9FEC0B9D9F80020104B1340B7 +:104EA0009BB9636C42F2930239462046DA62E26CA7 +:104EB000FFF7F0FE804640B932460199206D454625 +:104EC00002F0AEFBBFE71121E2E732460199206D07 +:104ED00002F0A6FBE26C39462046FFF70BFFB2E773 +:104EE00008E0FFFD2DE9F3411F46436C01924FF4AA +:104EF0007A725D6804468846C5F3090501356E007F +:104F0000856CB5FBF6F5B5FBF2F555435D6200F037 +:104F10006DFD20B10125284602B0BDE8F0817E027A +:104F200001A9206D324602F089FB05460028F1D028 +:104F3000636C019A9A6501221A654FF0FF329A63F9 +:104F40004FF48D72DA639E62236BE66CDB063346A8 +:104F500058BF4FEA4828012F424619D91921204647 +:104F6000FFF782FEB0B932680F4B134093B9636C00 +:104F700042F2910239462046DA62E26CFFF78AFE7D +:104F8000064638B901993546206D02F093FBC2E719 +:104F90001821E4E70199206D02F08CFBE26C3946A0 +:104FA0002046FFF7A7FEB6E708E0FFFD12F0030F6B +:104FB0002DE9F04107460C4615461E4617D00E4413 +:104FC000B44202D10020BDE8F0810123FA6B2146F2 +:104FD0003846FFF71FFF0028F5D128464FF400722E +:104FE000F96B05F500750134FCF780FEE8E7BDE8D4 +:104FF000F041FFF70FBF000012F0030F2DE9F04161 +:1050000007460C4615461E4617D00E44B44202D140 +:105010000020BDE8F08129464FF40072F86B05F5D9 +:105020000075FCF763FE0123FA6B21463846FFF753 +:1050300059FF0028EDD10134E8E7BDE8F041FFF762 +:1050400051BF000000207047302310B583F3118852 +:105050000024436C40302146DC6301F021FB84F3E3 +:10506000118810BD026843681143016003B11847FD +:1050700070470000024A136843F0C0031360704792 +:1050800000440040024A136843F0C00313607047B5 +:1050900000480040024A136843F0C00313607047A1 +:1050A00000780040064BD3F8E8200243C3F8E8201C +:1050B000D3F810211043C3F81001D3F81031704712 +:1050C0000044025837B5274C274D204600F028FDF4 +:1050D00004F11400009400234FF40072234900F0FF +:1050E000C3F94FF40072224904F138000094214BB7 +:1050F00000F03CFA204BC4E91735204C204600F064 +:105100000FFD04F11400009400234FF400721C49B9 +:1051100000F0AAF94FF400721A4904F13800009423 +:10512000194B00F023FA194BC4E91735184C2046E7 +:1051300000F0F6FC04F1140000234FF4007215494E +:10514000009400F091F9144B4FF40072134904F1EC +:105150003800009400F00AFA114BC4E9173503B087 +:1051600030BD00BF2039002000E1F505643A002081 +:105170006440002075500008004400408C39002035 +:10518000643C002064420020855000080048004034 +:10519000F8390020643E0020955000086444002047 +:1051A0000078004038B5264D0446037C002918BF1E +:1051B0000D46012B06D1234B984230D14FF40030DD +:1051C000FFF770FF2A68236EE16D03EB5203A566BB +:1051D000B3FBF2F36A68100442BF23F0070003F048 +:1051E000070343EA4003CB60AB6843F040034B60E6 +:1051F000EB6843F001038B6042F4967343F00103C4 +:105200000B604FF0FF330B62510505D512F01022F1 +:1052100011D0B2F1805F10D084F8643038BD0A4BF1 +:10522000984205D0094B9842CCD14FF08040C7E757 +:105230004FF48020C4E77F23EEE73F23ECE700BF75 +:10524000C8980008203900208C390020F839002047 +:105250002DE9F047C66D05463768F46921073462C9 +:105260001AD014F0080118BF4FF48071E20748BF4C +:1052700041F02001A3074FF0300348BF41F0400147 +:10528000600748BF41F0800183F31188281DFFF7B4 +:10529000E9FE002383F31188E2050AD5302383F366 +:1052A00011884FF48061281DFFF7DCFE002383F393 +:1052B00011884FF030094FF0000A14F0200838D15F +:1052C0003B0616D54FF0300905F1380A200610D5F7 +:1052D00089F31188504600F07DF9002836DA08215C +:1052E000281DFFF7BFFE27F080033360002383F300 +:1052F0001188790614D5620612D5302383F31188FC +:10530000D5E913239A4208D12B6C33B127F040071B +:105310001021281DFFF7A6FE3760002383F31188B4 +:10532000E30618D5AA6E1369ABB15069BDE8F04722 +:10533000184789F31188736A284695F86410194054 +:1053400000F008FC8AF31188F469B6E7B06288F3CC +:105350001188F469BAE7BDE8F0870000090100F19F +:105360006043012203F56143C9B283F8001300F0E2 +:105370001F039A4043099B0003F1604303F5614317 +:10538000C3F880211A60704700F01F0301229A4081 +:10539000430900F160409B0000F5614003F1604368 +:1053A00003F56143C3F88020C3F88021002380F80F +:1053B00000337047F8B51546826804460B46AA428A +:1053C00000D28568A1692669761AB5420BD21846C3 +:1053D0002A46FCF78BFCA3692B44A3612846A368EB +:1053E0005B1BA360F8BD0CD9AF1B18463246FCF717 +:1053F0007DFC3A46E1683044FCF778FCE3683B44C6 +:10540000EBE718462A46FCF771FCE368E5E7000085 +:1054100083689342F7B50446154600D28568D4E9FF +:105420000460361AB5420BD22A46FCF75FFC63696A +:105430002B4463612846A3685B1BA36003B0F0BDE7 +:105440000DD93246AF1B0191FCF750FC01993A4649 +:10545000E0683144FCF74AFCE3683B44E9E72A464C +:10546000FCF744FCE368E4E710B50A440024C36198 +:10547000029B8460C16002610362C0E90000C0E970 +:10548000051110BD08B5D0E90532934201D18268FB +:1054900082B98268013282605A1C4261197000210F +:1054A000D0E904329A4224BFC368436101F012F983 +:1054B000002008BD4FF0FF30FBE7000070B530233F +:1054C00004460E4683F31188A568A5B1A368A269B6 +:1054D000013BA360531CA36115782269934224BF4A +:1054E000E368A361E3690BB120469847002383F387 +:1054F0001188284607E03146204601F0DBF80028F5 +:10550000E2DA85F3118870BD2DE9F74F04460E46A7 +:1055100017469846D0F81C904FF0300A8AF311884D +:105520004FF0000B154665B12A4631462046FFF77D +:1055300041FF034660B94146204601F0BBF8002810 +:10554000F1D0002383F31188781B03B0BDE8F08FFE +:10555000B9F1000F03D001902046C847019B8BF39F +:105560001188ED1A1E448AF31188DCE7C160C3611B +:10557000009B82600362C0E905111144C0E900008C +:1055800001617047F8B504460D461646302383F393 +:105590001188A768A7B1A368013BA36063695A1C7F +:1055A00062611D70D4E904329A4224BFE3686361EA +:1055B000E3690BB120469847002080F3118807E08B +:1055C0003146204601F076F80028E2DA87F31188A8 +:1055D000F8BD0000D0E9052310B59A4201D18268D8 +:1055E0007AB982680021013282605A1C82611C787B +:1055F00003699A4224BFC368836101F06BF82046B7 +:1056000010BD4FF0FF30FBE72DE9F74F04460E4683 +:1056100017469846D0F81C904FF0300A8AF311884C +:105620004FF0000B154665B12A4631462046FFF77C +:10563000EFFE034660B94146204601F03BF80028E2 +:10564000F1D0002383F31188781B03B0BDE8F08FFD +:10565000B9F1000F03D001902046C847019B8BF39E +:105660001188ED1A1E448AF31188DCE70379052BB3 +:1056700005BF836A002001204B6004BF4FF4007314 +:105680000B60704770B55D1E866A04460D44B542D6 +:1056900005D9436B43F080034363012070BD0625A9 +:1056A0000571FFF783FC05232371F7E770B55D1ED5 +:1056B000866A04460D44B54205D9436B43F0800326 +:1056C0004363012070BD07250571FFF795FC052395 +:1056D0002371F7E738B505790446052D05D1082370 +:1056E0000371FFF7AFFC257138BD0120FCE7000016 +:1056F0000323F0B5037185B00446FFF749FA002291 +:1057000020461146FFF78EFA4FF4D57203AB0821FD +:105710002046FFF7A9FA0246B8B901232363039B89 +:10572000C3F30323012B09D103AB37212046FFF735 +:105730009BFA18B9A44B039A1340ABB1204601253C +:10574000FFF758FA0223237137E103AB0022372118 +:105750002046FFF789FA28B99B4A039B1A40002A82 +:1057600000F0A78002232363236B03F00F03022BB7 +:1057700040F0A9806425954E42F2107000F076FF4B +:1057800003AB324601212046FFF758FA0028D5D155 +:10579000039B002B80F293805A0003D5236B43F0C8 +:1057A00010032363002204F1080302212046FFF7BF +:1057B000B9FA02460028C1D104F13803032120467A +:1057C000FFF752FA0028B9D104F11805A26B09219C +:1057D00020462B46FFF7A6FA0028AFD102ABA26BFA +:1057E00007212046FFF740FA06460028A6D1236B82 +:1057F00003F00F03022B40F08F807E227F2128468A +:1058000003F01CFA012840F28780E76B42F2107027 +:1058100000F02CFF08234FF4007239462046009612 +:10582000FFF79CFA002889D1384603F055FA236B1C +:10583000A06203F00F03022B72D103AB644A06216E +:105840002046FFF711FA002871D15F49039B1940E8 +:10585000B1FA81F149092046FFF7ACF902AB4FF4E8 +:10586000007210212046FFF7FFF9054600287FF45B +:1058700065AF554E029B33427FF460AF236B13F04C +:105880000E0F03F00F0273D0022A7FF457AFE36AC2 +:105890001978012900F09480022900F093800029F2 +:1058A00000F089804B4F2046FFF7AAF903AB3A4638 +:1058B00076E0114620462263FFF7B4F954E7013D34 +:1058C0007FF45AAF3AE7444D6426444A3E4F012BD9 +:1058D00018BF154603AB002237212046FFF7C4F955 +:1058E00000287FF42BAF039B3B427FF427AF03AB31 +:1058F0002A4629212046FFF7A1F900287FF41EAF90 +:10590000039B002BFFF648AF013E3FF417AF42F276 +:10591000107000F0ABFEDDE7284603F0B1F986E732 +:105920007E227F212846E66B03F088F908B9002122 +:1059300091E7002340223146204600930623FFF7DB +:105940000DFA0028F3D1B3895BBA9B07EFD5244B3E +:1059500040223146204600930623FFF7FFF9002836 +:10596000E5D1317C01F00F010F3918BF012172E739 +:10597000E36A1978F9B101297FF4E0AE2046FFF718 +:105980003FF903ABA26B37212046FFF76DF90028E2 +:105990007FF4D4AE039B33427FF4D0AE03AB02223C +:1059A00006212046FFF760F900287FF4C7AE039B6D +:1059B00033427FF4C3AE05232371284605B0F0BD02 +:1059C000084F70E7084F6EE708E0FFFD0080FFC05A +:1059D0000001B9030000B7030080FF5000001080F1 +:1059E000F1FFFF800001B7030002B70337B504469B +:1059F0000C4D01ABA26B0D212046FFF735F978B9AC +:105A0000019B2B420BD1C3F34323042B08D0053B4E +:105A1000022B04D84FF47A7000F028FEE9E7012049 +:105A200003B030BD08E0FFFD70B53023054683F3B9 +:105A3000118803790024022B03D184F311882046B6 +:105A400070BD0423037184F311880226FFF7CEFF93 +:105A500004462846FFF7CEF82E71F0E7FFF730B87E +:105A6000044B03600123037100234363C0E90A333D +:105A7000704700BFE098000810B53023044683F358 +:105A80001188C162FFF736F802230020237180F3EA +:105A9000118810BD10B53023044683F31188FFF739 +:105AA00053F800230122E362227183F3118810BDB1 +:105AB000026843681143016003B118477047000052 +:105AC0001430FFF721BD00004FF0FF331430FFF713 +:105AD0001BBD00003830FFF797BD00004FF0FF33CB +:105AE0003830FFF791BD00001430FFF7E7BC00002D +:105AF0004FF0FF311430FFF7E1BC00003830FFF702 +:105B000041BD00004FF0FF323830FFF73BBD0000D1 +:105B1000012914BF6FF0130000207047FFF7D2BABD +:105B2000044B036000234360C0E902330123037484 +:105B3000704700BF0499000810B53023044683F372 +:105B40001188FFF72FFB02230020237480F31188B4 +:105B500010BD000038B5C36904460D461BB90421C9 +:105B60000844FFF7A5FF294604F11400FFF78AFC5B +:105B7000002806DA201D4FF40061BDE83840FFF729 +:105B800097BF38BD026843681143016003B11847ED +:105B90007047000013B5406B00F58054D4F8A4386A +:105BA0001A681178042914D1017C022911D11979BC +:105BB000012312898B4013420BD101A94C3002F012 +:105BC0006BFFD4F8A4480246019B2179206800F0BD +:105BD000DFF902B010BD0000143002F0EDBE00008D +:105BE0004FF0FF33143002F0E7BE00004C3002F0FB +:105BF000BFBF00004FF0FF334C3002F0B9BF0000D0 +:105C0000143002F0BBBE00004FF0FF31143002F040 +:105C1000B5BE00004C3002F08BBF00004FF0FF32E9 +:105C20004C3002F085BF00000020704710B500F531 +:105C30008054D4F8A4381A681178042917D1017C4B +:105C4000022914D15979012352898B4013420ED174 +:105C5000143002F04DFE024648B1D4F8A4484FF487 +:105C6000407361792068BDE8104000F07FB910BD35 +:105C7000406BFFF7DBBF0000704700007FB5124BA1 +:105C800001250426044603600023057400F1840204 +:105C900043602946C0E902330C4B02901430019353 +:105CA0004FF44073009602F0FFFD094B04F6944256 +:105CB000294604F14C000294CDE900634FF440738F +:105CC00002F0C6FE04B070BD2C990008715C00089B +:105CD000955B00080A68302383F311880B790B3336 +:105CE00042F823004B79133342F823008B7913B128 +:105CF0000B3342F8230000F58053C3F8A4180223A5 +:105D00000374002080F311887047000038B5037FCA +:105D1000044613B190F85430ABB90125201D02217F +:105D2000FFF730FF04F114006FF00101257700F058 +:105D3000DDFC04F14C0084F854506FF00101BDE823 +:105D4000384000F0D3BC38BD10B501210446043002 +:105D5000FFF718FF0023237784F8543010BD0000AC +:105D600038B504460025143002F0B6FD04F14C00AD +:105D7000257702F085FE201D84F854500121FFF79D +:105D800001FF2046BDE83840FFF750BF90F8803053 +:105D900003F06003202B06D190F881200023212AF4 +:105DA00003D81F2A06D800207047222AFBD1C0E959 +:105DB0001D3303E0034A426707228267C36701205D +:105DC000704700BF4422002037B500F58055D5F854 +:105DD000A4381A68117804291AD1017C022917D134 +:105DE0001979012312898B40134211D100F14C041F +:105DF000204602F005FF58B101A9204602F04CFEF2 +:105E0000D5F8A4480246019B2179206800F0C0F82B +:105E100003B030BD01F10B03F0B550F8236085B03D +:105E200004460D46FEB1302383F3118804EB850749 +:105E3000301D0821FFF7A6FEFB6806F14C005B69E8 +:105E40001B681BB1019002F035FE019803A902F016 +:105E500023FE024648B1039B2946204600F098F8ED +:105E6000002383F3118805B0F0BDFB685A691268FE +:105E7000002AF5D01B8A013B1340F1D104F18002C6 +:105E8000EAE70000133138B550F82140ECB1302377 +:105E900083F3118804F58053D3F8A428136852794A +:105EA00003EB8203DB689B695D6845B104216018E0 +:105EB000FFF768FE294604F1140002F023FD204696 +:105EC000FFF7B4FE002383F3118838BD704700004C +:105ED00001F044BD01234022002110B5044600F822 +:105EE000303BFBF729FF0023C4E9013310BD00005C +:105EF00010B53023044683F3118824224160002129 +:105F00000C30FBF719FF204601F04AFD0223002068 +:105F1000237080F3118810BD70B500EB8103054636 +:105F200050690E461446DA6018B110220021FBF7C2 +:105F300003FFA06918B110220021FBF7FDFE3146D6 +:105F40002846BDE8704001F031BE00008368202281 +:105F5000002103F0011310B5044683601030FBF7F5 +:105F6000EBFE2046BDE8104001F0ACBEF0B40125C8 +:105F700000EB810447898D40E4683D43A469458175 +:105F800023600023A2606360F0BC01F0C9BE000082 +:105F9000F0B4012500EB810407898D40E4683D439E +:105FA0006469058123600023A2606360F0BC01F096 +:105FB0003FBF000070B50223002504462422037071 +:105FC0002946C0F888500C3040F8045CFBF7B4FE5A +:105FD000204684F8705001F07DFD63681B6823B192 +:105FE00029462046BDE87040184770BD0378052B50 +:105FF00010B504460AD080F88C300523037043683E +:106000001B680BB1042198470023A36010BD00005A +:106010000178052906D190F88C20436802701B682E +:1060200003B118477047000070B590F8703004460F +:1060300013B1002380F8703004F18002204601F093 +:1060400065FE63689B68B3B994F8803013F060050F +:1060500035D00021204602F057F90021204602F0F9 +:1060600047F963681B6813B1062120469847062349 +:1060700084F8703070BD204698470028E4D0B4F80A +:106080008630A26F9A4288BFA36794F98030A56FCB +:10609000002B4FF0300380F20381002D00F0F280DE +:1060A000092284F8702083F3118800212046D4E966 +:1060B0001D23FFF76DFF002383F31188DAE794F8BF +:1060C000812003F07F0343EA022340F2023293422D +:1060D00000F0C58021D8B3F5807F48D00DD8012BC2 +:1060E0003FD0022B00F09380002BB2D104F1880244 +:1060F00062670222A267E367C1E7B3F5817F00F020 +:106100009B80B3F5407FA4D194F88230012BA0D1BD +:10611000B4F8883043F0020332E0B3F5006F4DD09D +:1061200017D8B3F5A06F31D0A3F5C063012B90D879 +:106130006368204694F882205E6894F88310B4F86F +:106140008430B047002884D0436863670368A3673E +:106150001AE0B3F5106F36D040F6024293427FF456 +:1061600078AF5C4B63670223A3670023C3E794F80F +:106170008230012B7FF46DAFB4F8883023F0020336 +:10618000A4F88830C4E91D55E56778E7B4F8803095 +:10619000B3F5A06F0ED194F88230204684F88A308F +:1061A00001F0F6FC63681B6813B101212046984793 +:1061B000032323700023C4E91D339CE704F18B0300 +:1061C00063670123C3E72378042B10D1302383F3C3 +:1061D00011882046FFF7BAFE85F311880321636812 +:1061E00084F88B5021701B680BB12046984794F8B7 +:1061F0008230002BDED084F88B3004232370636858 +:106200001B68002BD6D0022120469847D2E794F88D +:10621000843020461D0603F00F010AD501F068FD09 +:10622000012804D002287FF414AF2B4B9AE72B4BA4 +:1062300098E701F04FFDF3E794F88230002B7FF4EC +:1062400008AF94F8843013F00F01B3D01A0620463B +:1062500002D502F071F8ADE702F062F8AAE794F80F +:106260008230002B7FF4F5AE94F8843013F00F01E8 +:10627000A0D01B06204602D502F046F89AE702F0AD +:1062800037F897E7142284F8702083F311882B469F +:106290002A4629462046FFF769FE85F31188E9E67C +:1062A0005DB1152284F8702083F311880021204607 +:1062B000D4E91D23FFF75AFEFDE60B2284F8702077 +:1062C00083F311882B462A4629462046FFF760FEB5 +:1062D000E3E700BF5C99000854990008589900084A +:1062E00038B590F870300446002B3ED0063BDAB249 +:1062F0000F2A34D80F2B32D8DFE803F037313108BA +:10630000223231313131313131313737856FB0F8A7 +:1063100086309D4214D2C3681B8AB5FBF3F203FB9F +:1063200012556DB9302383F311882B462A4629462E +:10633000FFF72EFE85F311880A2384F870300EE0F3 +:10634000142384F87030302383F31188002320460F +:106350001A461946FFF70AFE002383F3118838BD59 +:10636000C36F03B198470023E7E70021204601F0FF +:10637000CBFF0021204601F0BBFF63681B6813B10F +:106380000621204698470623D7E7000010B590F86D +:1063900070300446142B29D017D8062B05D001D80D +:1063A0001BB110BD093B022BFBD80021204601F098 +:1063B000ABFF0021204601F09BFF63681B6813B10F +:1063C000062120469847062319E0152BE9D10B2317 +:1063D00080F87030302383F3118800231A46194661 +:1063E000FFF7D6FD002383F31188DAE7C3689B69C2 +:1063F0005B68002BD5D1C36F03B19847002384F8A5 +:106400007030CEE70023826880F8243083691B68EF +:1064100099689142FBD25A680360426010605860EC +:10642000704700000023826880F8243083691B686D +:1064300099689142FBD85A680360426010605860C6 +:106440007047000008B50846302383F3118891F89F +:106450002430032B05D0042B0DD02BB983F31188E6 +:1064600008BD8B6A00221A604FF0FF338362FFF78A +:10647000C9FF0023F2E7D1E9003213605A60F3E765 +:10648000034610B51B68984203D09C688A68944202 +:10649000F8D25A680B604A601160596010BD000064 +:1064A000FFF7B0BF064BD96881F82400186802686E +:1064B00053601A600122D86080F82420F9F7A2BF47 +:1064C000684600200C4B30B5DD684B1C87B0044695 +:1064D0000FD02B46094A684600F09CF92046FFF78A +:1064E000E1FF009B13B1684600F09EF9A86A07B06F +:1064F00030BDFFF7D7FFF9E7684600204564000884 +:10650000044B1A68DB6890689B68984294BF00202F +:106510000120704768460020094B10B51C68D868F8 +:10652000226853601A600122DC6084F82420FFF79F +:1065300079FF01462046BDE81040F9F763BF00BF70 +:1065400068460020044B1A68DB6892689B689A4290 +:1065500001D9FFF7E1BF70476846002038B5012335 +:10656000084C00252370656002F0E4FB02F00AFC91 +:106570000549064802F0E0FC0223237085F31188E8 +:1065800038BD00BF1049002064990008684600200B +:1065900000F080B9034A516853685B1A9842FBD8EF +:1065A000704700BF001000E08B604B630023CA619E +:1065B00000F128020B6302230A618B8401238861A6 +:1065C00081F8263001F11003C26A4A611360C36288 +:1065D00001F12C030846CB6270470000D0E901317D +:1065E000026841F8183CA1F19C033839CB6003697B +:1065F00041F8243C436941F8203C034B41F8043CFA +:10660000C3680248FFF7D0BF1D0400086846002099 +:1066100008B5FFF7E3FFBDE80840FFF741BF000002 +:1066200038B50E4BDC6804F12C05A062E06AA84284 +:106630000FD194F826303BB994F825309B0702BF60 +:10664000D4E9043213605A600F20BDE83840FFF7E8 +:1066500029BF0368E362FFF723FFE7E768460020EE +:10666000302383F31188FFF7DBBF000008B5014634 +:10667000302383F311880820FFF724FF002383F3DE +:10668000118808BD054BDB6821B1036098620320C7 +:10669000FFF718BF4FF0FF30704700BF684600207B +:1066A00003682BB10022026018469962FFF7F8BE1A +:1066B00070470000064BDB6839B1426818605A60C9 +:1066C000136043600420FFF7FDBE4FF0FF307047BA +:1066D000684600200368984206D01A68026050603D +:1066E00018469962FFF7DCBE7047000038B50446D3 +:1066F0000D462068844200D138BD036823605C6089 +:106700008562FFF7CDFEF4E7036810B59C68A242EE +:106710000CD85C688A600B604C6021605960996895 +:106720008A1A9A604FF0FF33836010BD121B1B68FA +:10673000ECE700000A2938BF0A2170B504460D466F +:106740000A26601902F0F0FA02F0D8FA041BA542FA +:1067500003D8751C04462E46F3E70A2E04D90120FF +:10676000BDE8704002F0B0BC70BD0000F8B5144B3D +:106770000D460A2A4FF00A07D96103F11001826021 +:1067800038BF0A22416019691446016048601861E7 +:10679000A81802F0B9FA02F0B1FA431B0646A34268 +:1067A00006D37C1C28192746354602F0BDFAF2E7CD +:1067B0000A2F04D90120BDE8F84002F085BCF8BDDD +:1067C00068460020F8B506460D4602F097FA0F4AD3 +:1067D000134653F8107F9F4206D12A4601463046A1 +:1067E000BDE8F840FFF7C2BFD169BB68441A2C1955 +:1067F00028BF2C46A34202D92946FFF79BFF224619 +:1068000031460348BDE8F840FFF77EBF68460020E8 +:1068100078460020C0E90323002310B45DF8044B40 +:106820004361FFF7CFBF000010B5194C23699842B0 +:106830000DD08168D0E9003213605A609A680A442A +:106840009A60002303604FF0FF33A36110BD02681C +:10685000234643F8102F53600022026022699A42B7 +:1068600003D1BDE8104002F059BA936881680B4427 +:10687000936002F043FA2269E1699268441AA242E5 +:10688000E4D91144BDE81040091AFFF753BF00BF17 +:10689000684600202DE9F047DFF8BC8008F11007BA +:1068A0002C4ED8F8105002F029FAD8F81C40AA68EB +:1068B000031B9A423ED814444FF00009D5E9003238 +:1068C000C8F81C4013605A60C5F80090D8F8103022 +:1068D000B34201D102F022FA89F31188D5E90331DC +:1068E00028469847302383F311886B69002BD8D052 +:1068F00002F004FA6A69A0EB040982464A450DD207 +:10690000022002F0E1FB0022D8F81030B34208D197 +:1069100051462846BDE8F047FFF728BF121A224427 +:10692000F2E712EB09092946384638BF4A46FFF715 +:10693000EBFEB5E7D8F81030B34208D01444C8F8DD +:106940001C00211AA960BDE8F047FFF7F3BEBDE8BF +:10695000F08700BF784600206846002038B502F076 +:10696000CDF9054AD2E90845031B181945F1000184 +:10697000C2E9080138BD00BF6846002010B560B903 +:10698000074804790368053C9B6818BF01249847B1 +:1069900008B144F00404204610BD0124FBE700BF09 +:1069A000C8360020FFF7EABF2DE9F04788461746B2 +:1069B0009A460446B0B90D4E3579052D05D003240D +:1069C0000DE0013D15F0FF050ED032685346394603 +:1069D0003046D2F814904246C8470028F1D12046EC +:1069E000BDE8F0870424FAE70124F8E7C836002060 +:1069F0002DE9F047884617469A460446B0B90D4E31 +:106A00003579052D05D003240DE0013D15F0FF0576 +:106A10000ED03268534639463046D2F81890424676 +:106A2000C8470028F1D12046BDE8F0870424FAE7E2 +:106A30000124F8E7C836002037B50C46154670B972 +:106A400051B101290BD10748694603681B6A984771 +:106A500010B9019B04462B60204603B030BD0424CE +:106A6000FAE700BFC836002000207047FEE70000AC +:106A7000704700004FF0FF30704700004B684360E4 +:106A80008B688360CB68C3600B6943614B690362A9 +:106A90008B6943620B6803607047000008B53C4B8C +:106AA00040F2FF713B48D3F888200A43C3F888209E +:106AB000D3F8882022F4FF6222F00702C3F888206E +:106AC000D3F88820D3F8E0200A43C3F8E020D3F8B5 +:106AD00008210A43C3F808212F4AD3F80831114688 +:106AE000FFF7CCFF00F5806002F11C01FFF7C6FF45 +:106AF00000F5806002F13801FFF7C0FF00F580600B +:106B000002F15401FFF7BAFF00F5806002F1700155 +:106B1000FFF7B4FF00F5806002F18C01FFF7AEFFD4 +:106B200000F5806002F1A801FFF7A8FF00F5806082 +:106B300002F1C401FFF7A2FF00F5806002F1E0015D +:106B4000FFF79CFF00F5806002F1FC01FFF796FF64 +:106B500002F58C7100F58060FFF790FF01F084FC76 +:106B60000E4BD3F8902242F00102C3F89022D3F8E2 +:106B7000942242F00102C3F894220522C3F898201F +:106B80004FF06052C3F89C20054AC3F8A02008BD0E +:106B900000440258000002587899000800ED00E017 +:106BA0001F00080308B501F06BFEFFF7D7FC104B80 +:106BB000D3F8DC2042F04002C3F8DC20D3F80421F3 +:106BC00022F04002C3F80421D3F80431094B1A68BB +:106BD00042F008021A601A6842F004021A6000F0DB +:106BE00071FD00F035FBBDE8084000F0B5B800BF0E +:106BF00000440258001802480120704700207047E6 +:106C00007047000002290CD0032904D0012907484D +:106C100018BF00207047032A05D8054800EBC200C2 +:106C20007047044870470020704700BF749B0008FD +:106C300054220020289B000870B59AB005460846EB +:106C4000144601A900F0C2F801A8FBF76DF8431C37 +:106C50000022C6B25B001046C5E90034237003234E +:106C6000023404F8013C01ABD1B202348E4201D8A7 +:106C70001AB070BD13F8011B013204F8010C04F8BE +:106C8000021CF1E708B5302383F311880348FFF7AE +:106C90009BF8002383F3118808BD00BF184900202A +:106CA00090F8803003F01F02012A07D190F881206C +:106CB0000B2A03D10023C0E91D3315E003F0600364 +:106CC000202B08D1B0F884302BB990F88120212AEC +:106CD00003D81F2A04D8FFF759B8222AEBD0FAE7C5 +:106CE000034A426707228267C3670120704700BFDB +:106CF0004B22002007B5052917D8DFE801F0191647 +:106D000003191920302383F31188104A01210190BF +:106D1000FFF702F9019802210D4AFFF7FDF80D482F +:106D2000FFF71EF8002383F3118803B05DF804FB1E +:106D3000302383F311880748FEF7E8FFF2E730239A +:106D400083F311880348FEF7FFFFEBE7C89A0008BA +:106D5000EC9A00081849002038B50C4D0C4C2A4616 +:106D60000C4904F10800FFF767FF05F1CA0204F1BE +:106D700010000949FFF760FF05F5CA7204F1180019 +:106D80000649BDE83840FFF757BF00BFF06100205B +:106D900054220020AC9A0008B69A0008BE9A000857 +:106DA00070B5044608460D46FAF7BEFFC6B2204647 +:106DB000013403780BB9184670BD32462946FAF7FC +:106DC0009FFF0028F3D10120F6E700002DE9F047EE +:106DD00005460C46FAF7A8FF2C49C6B22846FFF72D +:106DE000DFFF08B10836F6B229492846FFF7D8FF79 +:106DF00008B11036F6B2632E0BD8DFF89080DFF8BA +:106E00009090244FDFF898A02E7846B92670BDE800 +:106E1000F08729462046BDE8F04702F0FFB9252E4D +:106E200030D1072241462846FAF76AFF80B91A4B4B +:106E3000224603F10C0153F8040B8B4242F8040B79 +:106E4000F9D1198807359B780F3411809370DBE7EF +:106E5000082249462846FAF753FF98B9A21C0F4B5F +:106E6000197802320909C95D02F8041C13F8011BE4 +:106E700001F00F015345C95D02F8031CF0D118342D +:106E80000835C1E7013504F8016BBDE7949B0008A4 +:106E9000BE9A0008AC9B00089C9B000800E8F11F0C +:106EA0000CE8F11FBFF34F8F044B1A695107FCD157 +:106EB000D3F810215207F8D1704700BF00200052CC +:106EC00008B50D4B1B78ABB9FFF7ECFF0B4BDA683D +:106ED000D10704D50A4A5A6002F188325A60D3F8C1 +:106EE0000C21D20706D5064AC3F8042102F18832E4 +:106EF000C3F8042108BD00BF4E64002000200052EA +:106F00002301674508B5114B1B78F3B9104B1A697B +:106F1000510703D5DA6842F04002DA60D3F8102155 +:106F2000520705D5D3F80C2142F04002C3F80C21DA +:106F3000FFF7B8FF064BDA6842F00102DA60D3F8D7 +:106F40000C2142F00102C3F80C2108BD4E64002060 +:106F5000002000520F289ABF00F5806040040020F6 +:106F6000704700004FF40030704700001020704759 +:106F70000F2808B50BD8FFF7EDFF00F500330268C6 +:106F8000013204D104308342F9D1012008BD002030 +:106F9000FCE700000F2838B505463FD8FFF782FF11 +:106FA0001F4CFFF78DFF4FF0FF3307286361C4F8D4 +:106FB00014311DD82361FFF775FF030243F024034A +:106FC000E360E36843F08003E36023695A07FCD47D +:106FD0002846FFF767FFFFF7BDFF4FF4003100F0D1 +:106FE000ABFA2846FFF78EFFBDE83840FFF7C0BF79 +:106FF000C4F81031FFF756FFA0F108031B0243F05D +:107000002403C4F80C31D4F80C3143F08003C4F8E5 +:107010000C31D4F810315B07FBD4D9E7002038BD20 +:10702000002000522DE9F84F05460C46104645EA6F +:107030000203DE0602D00020BDE8F88F20F01F001A +:10704000DFF8BCB0DFF8BCA0FFF73AFF04EB0008A4 +:10705000444503D10120FFF755FFEDE720222946E3 +:10706000204602F0A3F810B920352034F0E72B4673 +:1070700005F120021F68791CDDD104339A42F9D151 +:1070800005F178431B481C4EB3F5801F1B4B38BFDE +:10709000184603F1F80332BFD946D1461E46FFF722 +:1070A00001FF0760A5EB040C336804F11C0143F0F9 +:1070B00002033360231FD9F8007017F00507FAD1D7 +:1070C00053F8042F8B424CF80320F4D1BFF34F8FB9 +:1070D000FFF7E8FE4FF0FF332022214603602846E9 +:1070E000336823F00203336002F060F80028BBD05D +:1070F0003846B0E7142100520C20005214200052F0 +:10710000102000521021005210B5084C237828B1ED +:107110001BB9FFF7D5FE0123237010BD002BFCD057 +:107120002070BDE81040FFF7EDBE00BF4E640020A8 +:107130002DE9F04F0D4685B0814658B111F00D068E +:1071400014BF2022082211F00803019304D0431E2B +:10715000034269D0002435E0002E37D009F11F0129 +:1071600021F01F094FF00108314F05F00403DFF84B +:10717000CCA005EA080BBBF1000F32D07869C0073C +:107180002FD408F101080C37B8F1060FF3D19EB9DE +:10719000284D4946A819019201F016FE0446002820 +:1071A00039D12036019AA02EF3D1494601F00CFEC8 +:1071B000044600282FD1019A49461F4801F004FED9 +:1071C000044660BB204605B0BDE8F08F0029C9D158 +:1071D00001462846029201F0F7FD0446D8B9029A0A +:1071E000C0E713B178694107CBD5AC0702D5786900 +:1071F0008007C6D5019911B178690107C1D5494603 +:107200000AEB4810CDE9022301F0DEFD0446DDE97A +:1072100002230028B5D04A460021204601E04A4614 +:107220000021FAF789FDCDE70246002E96D199E7B5 +:10723000C09B00089064002050640020706400200F +:107240000021FFF775BF00000121FFF771BF0000AB +:1072500070B5144D0124144E40F2FF32002101207C +:10726000FAF76AFD06EB441001342A6955F80C1F41 +:1072700001F096FD062CF5D137254FF4C054204679 +:10728000FFF7E2FF014628B122460848BDE87040FA +:1072900001F086BDC4EBC404013D4FEAD404EED135 +:1072A00070BD00BFC09B00087064002050640020C7 +:1072B0000421FFF73DBF00004843FFF7C1BF0000B6 +:1072C00008B101F0F3BD7047B0F5805F10B504461A +:1072D00007D8FFF7EDFF28B92046BDE81040FFF7BB +:1072E000AFBF002010BD0000FFF7EABF70B5AAB124 +:1072F00040EA010313F01F030FD1094C0144A568B4 +:107300006D0706D52568A84203D366683544A942AF +:1073100004D903330C34122BF1D10022104670BD76 +:10732000C09B000808B501F0D7FE034AD2E900323D +:10733000C01842EB010108BD30650020434BD3E982 +:1073400000232DE9F34113437CD0FFF7EBFF404AC4 +:1073500000230027F9F770F806460D463D4A002342 +:10736000F9F76AF80023144630462946394AF9F7F6 +:1073700063F84FF461613C23ADF80170B4FBF1F5A3 +:10738000B4FBF3F601FB154103FB16464624B1FBA3 +:10739000F3F1314BF6B28DF8004098423CD84FF0F3 +:1073A000640C4FF4C87EA30704F26C7225D1B2FBC3 +:1073B000FCF30CFB132313BBB2FBFEF30EFB1322F7 +:1073C000B2FA82F35B0903F26D18621C8045D2B2F7 +:1073D00017D90FB18DF800400022204C4FF00C0C53 +:1073E00017460CFB0343D4B2013213F804C08445A2 +:1073F0000CD8A0EB0C000127F5E70023E3E70123FD +:10740000E1E7A0EB080014460127CCE70FB18DF8A7 +:107410000140431C8DF802309DF80100431C9DF88B +:1074200000005038400640EA43509DF8023040EAE0 +:10743000034040EA560040EAC52040EA411002B04D +:10744000BDE8F0814FF40410F9E700BF306500207B +:1074500040420F008051010090230B00089C00085F +:107460000244074BD2B210B5904200D110BD441C6B +:1074700000B253F8200041F8040BE0B2F4E700BF7B +:10748000504000580E4B30B51C6F240405D41C6FBF +:107490001C671C6F44F400441C670A4C02442368B8 +:1074A000D2B243F480732360074B904200D130BDC9 +:1074B000441C51F8045B00B243F82050E0B2F4E7FA +:1074C00000440258004802585040005807B50122B5 +:1074D00001A90020FFF7C4FF019803B05DF804FB89 +:1074E00013B50446FFF7F2FFA04205D0012201A91F +:1074F00000200194FFF7C6FF02B010BD10B5642450 +:10750000013C4FF47A70FFF7B1F814F0FF04F7D1A3 +:10751000084B4FF0807214249A6103F580530822BF +:107520009A61013C4FF47A70FFF7A0F814F0FF0461 +:10753000F7D110BD000002580144BFF34F8F064B36 +:10754000884204D3BFF34F8FBFF36F8F7047C3F8E8 +:107550005C022030F4E700BF00ED00E00144BFF31F +:107560004F8F064B884204D3BFF34F8FBFF36F8F0B +:107570007047C3F870022030F4E700BF00ED00E070 +:1075800070B5054616460C4601201021FFF794FE03 +:10759000286046733CB1204636B1FFF789FE2B6860 +:1075A000186000B19C6070BDFFF74EFEF7E7000069 +:1075B000F8B50F461546044648B905F11F010126E6 +:1075C000386821F01F01FFF7B7FF3046F8BD427B56 +:1075D00029463868FFF78AFE06460028EDD13B6849 +:1075E0006360A368AB4210D213B12068FFF768FE56 +:1075F000637B28462BB1FFF75BFE206020B9A060BB +:10760000E3E7FFF721FEF8E7A560206805F11F0119 +:10761000012621F01F013860FFF78EFF2673D4E7A3 +:1076200010B5044640B10068884205D1606808B1D1 +:10763000FAF75CFB0023237310BD0000F8B50F467A +:107640001446054648B904F11F010126386821F0A7 +:107650001F01FFF783FF3046F8BD427B21463868A3 +:10766000FFF744FE06460028EDD1AB68A34210D2D6 +:1076700013B12868FFF724FE6B7B20462BB1FFF780 +:1076800017FE286020B9A860E5E7FFF7DDFDF8E701 +:10769000AC60396819B122462868FAF727FB2868D8 +:1076A00004F11F01012621F01F013860FFF756FF8A +:1076B0002E73D0E720B103688B4204BF002303730D +:1076C00070470000034B1A681AB9034AD2F8D02455 +:1076D0001A607047386500200040025808B5FFF76F +:1076E000F1FF024B1868C0F3806008BD38650020C8 +:1076F000EFF30983054968334A6B22F001024A63BC +:1077000083F30988002383F31188704700EF00E0BA +:10771000302080F3118862B60D4B0E4AD96821F4EF +:10772000E0610904090C0A430B49DA60D3F8FC2034 +:1077300042F08072C3F8FC20084AC2F8B01F1168FA +:1077400041F0010111602022DA7783F822007047AE +:1077500000ED00E00003FA0555CEACC5001000E0D6 +:10776000302310B583F311880E4B5B6813F400636C +:1077700014D0F1EE103AEFF309844FF08073683CB7 +:10778000E361094BDB6B236684F30988FEF7B8FEDF +:1077900010B1064BA36110BD054BFBE783F31188C5 +:1077A000F9E700BF00ED00E000EF00E02F04000863 +:1077B0003204000870B5BFF34F8FBFF36F8F1A4AC2 +:1077C0000021C2F85012BFF34F8FBFF36F8F536980 +:1077D00043F400335361BFF34F8FBFF36F8FC2F891 +:1077E0008410BFF34F8FD2F8803043F6E074C3F3B8 +:1077F000C900C3F34E335B0103EA0406014646EABF +:1078000081750139C2F86052F9D2203B13F1200F83 +:10781000F2D1BFF34F8F536943F480335361BFF309 +:107820004F8FBFF36F8F70BD00ED00E0FEE70000EB +:10783000214B2248224A70B5904237D3214BC11EBA +:10784000DA1C121A22F003028B4238BF00220021F8 +:10785000FAF772FA1C4A0023C2F88430BFF34F8F44 +:10786000D2F8803043F6E074C3F3C900C3F34E335B +:107870005B0103EA0406014646EA81750139C2F854 +:107880006C52F9D2203B13F1200FF2D1BFF34F8F8E +:10789000BFF36F8FBFF34F8FBFF36F8F0023C2F81B +:1078A0005032BFF34F8FBFF36F8F70BD53F8041B7F +:1078B00040F8041BC0E700BF0C9D0008346700209F +:1078C000346700203467002000ED00E0074BD3F858 +:1078D000D81021EA0001C3F8D810D3F8002122EA19 +:1078E0000002C3F80021D3F8003170470044025869 +:1078F00070B5D0E9244300224FF0FF359E6804EBB9 +:1079000042135101D3F80009002805DAD3F8000921 +:1079100040F08040C3F80009D3F8000B002805DAD6 +:10792000D3F8000B40F08040C3F8000B013263181D +:107930009642C3F80859C3F8085BE0D24FF0011330 +:10794000C4F81C3870BD0000890141F020010161BC +:1079500003699B06FCD41220FEF71CBE10B50A4C2E +:107960002046FEF7B7FA094BC4F89030084BC4F82C +:107970009430084C2046FEF7ADFA074BC4F890301F +:10798000064BC4F8943010BD3C6500200000084050 +:10799000449C0008D865002000000440509C00086A +:1079A00070B503780546012B5CD1434BD0F890406D +:1079B000984258D1414B0E216520D3F8D82042F08F +:1079C0000062C3F8D820D3F8002142F00062C3F867 +:1079D0000021D3F80021D3F8802042F00062C3F8E0 +:1079E0008020D3F8802022F00062C3F88020D3F8F2 +:1079F0008030FDF7B3FC324BE360324BC4F8003803 +:107A00000023D5F89060C4F8003EC02323604FF4F3 +:107A10000413A3633369002BFCDA01230C203361C8 +:107A2000FEF7B8FD3369DB07FCD41220FEF7B2FD88 +:107A30003369002BFCDA00262846A660FFF758FFC2 +:107A40006B68C4F81068DB68C4F81468C4F81C6874 +:107A500083BB1D4BA3614FF0FF336361A36843F009 +:107A60000103A36070BD194B9842C9D1134B4FF06D +:107A70008060D3F8D82042F00072C3F8D820D3F841 +:107A8000002142F00072C3F80021D3F80021D3F89E +:107A9000802042F00072C3F88020D3F8802022F0CA +:107AA0000072C3F88020D3F88030FFF70FFF0E215B +:107AB0004D209EE7064BCDE73C6500200044025870 +:107AC0004014004003002002003C30C0D865002074 +:107AD000083C30C0F8B5D0F89040054600214FF082 +:107AE00000662046FFF730FFD5F8941000234FF0D2 +:107AF00001128F684FF0FF30C4F83438C4F81C28E6 +:107B000004EB431201339F42C2F80069C2F8006BD4 +:107B1000C2F80809C2F8080BF2D20B68D5F8902019 +:107B2000C5F89830636210231361166916F01006C9 +:107B3000FBD11220FEF72EFDD4F8003823F4FE63AB +:107B4000C4F80038A36943F4402343F01003A36151 +:107B50000923C4F81038C4F814380B4BEB604FF00D +:107B6000C043C4F8103B094BC4F8003BC4F810698B +:107B7000C4F80039D5F8983003F1100243F48013AB +:107B8000C5F89820A362F8BD209C00084080001032 +:107B9000D0F8902090F88A10D2F8003823F4FE63D1 +:107BA00043EA0113C2F80038704700002DE9F8439A +:107BB00000EB8103D0F890500C468046DA680FFA4B +:107BC00081F94801166806F00306731E022B05EBC7 +:107BD00041134FF0000194BFB604384EC3F8101B98 +:107BE0004FF0010104F1100398BF06F1805601FA2D +:107BF00003F3916998BF06F5004600293AD0578AE9 +:107C000004F15801374349016F50D5F81C180B4354 +:107C10000021C5F81C382B180127C3F81019A740FC +:107C20005369611E9BB3138A928B9B08012A88BFFC +:107C30005343D8F89820981842EA034301F14002D0 +:107C40002146C8F89800284605EB82025360FFF7EA +:107C50007BFE08EB8900C3681B8A43EA84534834DF +:107C60001E4364012E51D5F81C381F43C5F81C78FB +:107C7000BDE8F88305EB4917D7F8001B21F4004154 +:107C8000C7F8001BD5F81C1821EA0303C0E704F16C +:107C90003F030B4A2846214605EB83035A60FFF752 +:107CA00053FE05EB4910D0F8003923F40043C0F827 +:107CB0000039D5F81C3823EA0707D7E70080001001 +:107CC00000040002D0F894201268C0F89820FFF752 +:107CD0000FBE00005831D0F8903049015B5813F4C2 +:107CE000004004D013F4001F0CBF02200120704795 +:107CF0004831D0F8903049015B5813F4004004D06B +:107D000013F4001F0CBF02200120704700EB81011B +:107D1000CB68196A0B6813604B68536070470000AA +:107D200000EB810330B5DD68AA691368D36019B927 +:107D3000402B84BF402313606B8A1468D0F89020D6 +:107D40001C4402EB4110013C09B2B4FBF3F4634361 +:107D5000033323F0030343EAC44343F0C043C0F8B2 +:107D6000103B2B6803F00303012B0ED1D2F8083827 +:107D700002EB411013F4807FD0F8003B14BF43F0B6 +:107D8000805343F00053C0F8003B02EB4112D2F89D +:107D9000003B43F00443C2F8003B30BD2DE9F04105 +:107DA000D0F8906005460C4606EB4113D3F8087BEB +:107DB0003A07C3F8087B08D5D6F814381B0704D552 +:107DC00000EB8103DB685B689847FA071FD5D6F89C +:107DD0001438DB071BD505EB8403D968CCB98B6954 +:107DE000488A5A68B2FBF0F600FB16228AB9186876 +:107DF000DA6890420DD2121AC3E90024302383F3CB +:107E0000118821462846FFF78BFF84F31188BDE8CF +:107E1000F081012303FA04F26B8923EA02036B81E8 +:107E2000CB68002BF3D021462846BDE8F041184727 +:107E300000EB81034A0170B5DD68D0F890306C69C1 +:107E40002668E66056BB1A444FF40020C2F81009B9 +:107E50002A6802F00302012A0AB20ED1D3F80808F8 +:107E600003EB421410F4807FD4F8000914BF40F0F3 +:107E7000805040F00050C4F8000903EB4212D2F8E1 +:107E8000000940F00440C2F800090122D3F8340888 +:107E900002FA01F10143C3F8341870BD19B9402E3C +:107EA00084BF4020206020681A442E8A8419013C37 +:107EB000B4FBF6F440EAC44040F00050C6E70000CE +:107EC0002DE9F843D0F8906005460C464F0106EBCB +:107ED0004113D3F8088918F0010FC3F808891CD0A2 +:107EE000D6F81038DB0718D500EB8103D3F80CC0A7 +:107EF000DCF81430D3F800E0DA68964530D2A2EB13 +:107F00000E024FF000091A60C3F80490302383F387 +:107F10001188FFF78DFF89F3118818F0800F1DD0AD +:107F2000D6F834380126A640334217D005EB840337 +:107F30000134D5F89050D3F80CC0E4B22F44DCF8EB +:107F4000142005EB0434D2F800E05168714514D3D5 +:107F5000D5F8343823EA0606C5F83468BDE8F88356 +:107F6000012303FA01F2038923EA02030381DCF807 +:107F70000830002BD1D09847CFE7AEEB0103BCF817 +:107F80001000834228BF0346D7F8180980B2B3EB2C +:107F9000800FE3D89068A0F1040959F8048FC4F861 +:107FA0000080A0EB09089844B8F1040FF5D81844F4 +:107FB0000B4490605360C8E72DE9F84FD0F890501B +:107FC00004466E69AB691E4016F480586E6103D09A +:107FD000BDE8F84FFDF7EEBF002E12DAD5F8003EEF +:107FE0009B0705D0D5F8003E23F00303C5F8003EFB +:107FF000D5F80438204623F00103C5F80438FEF70D +:1080000007F8370505D52046FFF772FC2046FDF737 +:10801000EDFFB0040CD5D5F8083813F0060FEB6867 +:1080200023F470530CBF43F4105343F4A053EB609C +:1080300031071BD56368DB681BB9AB6923F0080304 +:10804000AB612378052B0CD1D5F8003E9A0705D0FB +:10805000D5F8003E23F00303C5F8003E2046FDF7A7 +:10806000D7FF6368DB680BB120469847F30200F145 +:10807000BA80B70226D5D4F8909000274FF0010AB5 +:1080800009EB4712D2F8003B03F44023B3F5802FED +:1080900011D1D2F8003B002B0DDA62890AFA07F3FE +:1080A00022EA0303638104EB8703DB68DB6813B117 +:1080B0003946204698470137D4F89430FFB29B6880 +:1080C0009F42DDD9F00619D5D4F89000026AC2F3B8 +:1080D0000A1702F00F0302F4F012B2F5802F00F03D +:1080E000CA80B2F5402F09D104EB8303002200F5CA +:1080F0008050DB681B6A974240F0B0803003D5F8AF +:10810000185835D5E90303D500212046FFF746FE70 +:10811000AA0303D501212046FFF740FE6B0303D5D8 +:1081200002212046FFF73AFE2F0303D50321204604 +:10813000FFF734FEE80203D504212046FFF72EFEA8 +:10814000A90203D505212046FFF728FE6A0203D5C0 +:1081500006212046FFF722FE2B0203D507212046E9 +:10816000FFF71CFEEF0103D508212046FFF716FE9E +:10817000700340F1A780E90703D500212046FFF7EF +:108180009FFEAA0703D501212046FFF799FE6B0742 +:1081900003D502212046FFF793FE2F0703D50321C5 +:1081A0002046FFF78DFEEE0603D504212046FFF79B +:1081B00087FEA80603D505212046FFF781FE690644 +:1081C00003D506212046FFF77BFE2A0603D50721AB +:1081D0002046FFF775FEEB0574D520460821BDE863 +:1081E000F84FFFF76DBED4F890904FF0000B4FF0B2 +:1081F000010AD4F894305FFA8BF79B689F423FF6F0 +:1082000038AF09EB4713D3F8002902F44022B2F546 +:10821000802F20D1D3F80029002A1CDAD3F80029B6 +:1082200042F09042C3F80029D3F80029002AFBDB72 +:108230003946D4F89000FFF787FB22890AFA07F342 +:1082400022EA0303238104EB8703DB689B6813B1F5 +:108250003946204698470BF1010BCAE7910701D137 +:10826000D0F80080072A02F101029CBF03F8018BBD +:108270004FEA18283FE704EB830300F58050DA68E3 +:10828000D2F818C0DCF80820DCE9001CA1EB0C0CCB +:1082900000218F4208D1DB689B699A683A449A6052 +:1082A0005A683A445A6029E711F0030F01D1D0F817 +:1082B00000808C4501F1010184BF02F8018B4FEA77 +:1082C0001828E6E7BDE8F88F08B50348FFF774FE05 +:1082D000BDE80840FFF744BA3C65002008B50348F4 +:1082E000FFF76AFEBDE80840FFF73ABAD8650020FC +:1082F000D0F8903003EB4111D1F8003B43F4001368 +:10830000C1F8003B70470000D0F8903003EB4111FA +:10831000D1F8003943F40013C1F800397047000068 +:10832000D0F8903003EB4111D1F8003B23F4001357 +:10833000C1F8003B70470000D0F8903003EB4111CA +:10834000D1F8003923F40013C1F800397047000058 +:10835000064BD3F8DC200243C3F8DC20D3F8042119 +:108360001043C3F80401D3F80431704700440258A5 +:1083700008B53C4B4FF0FF31D3F8802062F000424B +:10838000C3F88020D3F8802002F00042C3F8802098 +:10839000D3F88020D3F88420C3F88410D3F8842045 +:1083A0000022C3F88420D3F88400D86F40F0FF4047 +:1083B00040F4FF0040F4DF4040F07F00D867D86F02 +:1083C00020F0FF4020F4FF0020F4DF4020F07F0089 +:1083D000D867D86FD3F888006FEA40506FEA5050E2 +:1083E000C3F88800D3F88800C0F30A00C3F88800F7 +:1083F000D3F88800D3F89000C3F89010D3F8900019 +:10840000C3F89020D3F89000D3F89400C3F89410E8 +:10841000D3F89400C3F89420D3F89400D3F89800CC +:10842000C3F89810D3F89800C3F89820D3F89800B0 +:10843000D3F88C00C3F88C10D3F88C00C3F88C20D0 +:10844000D3F88C00D3F89C00C3F89C10D3F89C1090 +:10845000C3F89C20D3F89C30FCF72EFABDE8084006 +:1084600000F0D6B90044025808B50122534BC3F8B6 +:108470000821534BD3F8F42042F00202C3F8F42051 +:10848000D3F81C2142F00202C3F81C210222D3F8C7 +:108490001C314C4BDA605A689104FCD54A4A1A6088 +:1084A00001229A60494ADA6000221A614FF4404280 +:1084B0009A61444B9A699204FCD51A6842F480721E +:1084C0001A603F4B1A6F12F4407F04D04FF4803291 +:1084D0001A6700221A671A6842F001021A60384BC4 +:1084E0001A685007FCD500221A611A6912F0380286 +:1084F000FBD1012119604FF0804159605A67344A1D +:10850000DA62344A1A611A6842F480321A602C4BDB +:108510001A689103FCD51A6842F480521A601A68EE +:108520009204FCD52C4A2D499A6200225A631963A1 +:1085300001F57C01DA6301F5E77199635A64284A11 +:108540001A64284ADA621A6842F0A8521A601C4B70 +:108550001A6802F02852B2F1285FF9D148229A61D4 +:108560004FF48862DA6140221A621F4ADA641F4AB5 +:108570001A651F4A5A651F4A9A6532231E4A1360BC +:10858000136803F00F03022BFAD10D4A136943F06D +:1085900003031361136903F03803182BFAD14FF06A +:1085A0000050FFF7D5FE4FF08040FFF7D1FE4FF0AF +:1085B0000040BDE80840FFF7CBBE00BF008000517F +:1085C000004402580048025800C000F002000001B8 +:1085D0000000FF010088900832206000630209015A +:1085E000470E0508DD0BBF01200000200000011030 +:1085F0000910E00000010110002000524FF0B042CD +:1086000008B5D2F8883003F00103C2F8883023B1EE +:10861000044A13680BB150689847BDE80840FFF75B +:108620009FB800BFB46600204FF0B04208B5D2F842 +:10863000883003F00203C2F8883023B1044A9368FB +:108640000BB1D0689847BDE80840FFF789B800BF74 +:10865000B46600204FF0B04208B5D2F8883003F07D +:108660000403C2F8883023B1044A13690BB150697E +:108670009847BDE80840FFF773B800BFB466002014 +:108680004FF0B04208B5D2F8883003F00803C2F8C2 +:10869000883023B1044A93690BB1D0699847BDE88B +:1086A0000840FFF75DB800BFB46600204FF0B0424D +:1086B00008B5D2F8883003F01003C2F8883023B12F +:1086C000044A136A0BB1506A9847BDE80840FFF7A7 +:1086D00047B800BFB46600204FF0B04310B5D3F8E0 +:1086E000884004F47872C3F88820A30604D5124A9F +:1086F000936A0BB1D06A9847600604D50E4A136B93 +:108700000BB1506B9847210604D50B4A936B0BB104 +:10871000D06B9847E20504D5074A136C0BB1506C37 +:108720009847A30504D5044A936C0BB1D06C9847C5 +:10873000BDE81040FFF714B8B46600204FF0B04316 +:1087400010B5D3F8884004F47C42C3F88820620551 +:1087500004D5164A136D0BB1506D9847230504D507 +:10876000124A936D0BB1D06D9847E00404D50F4ABF +:10877000136E0BB1506E9847A10404D50B4A936E4B +:108780000BB1D06E9847620404D5084A136F0BB141 +:10879000506F9847230404D5044A936F0BB1D06FF0 +:1087A0009847BDE81040FEF7DBBF00BFB46600206D +:1087B00008B50348FCF748FCBDE80840FEF7D0BF09 +:1087C000C836002008B50348FCF742FDBDE8084064 +:1087D000FEF7C6BF2039002008B50348FCF738FD76 +:1087E000BDE80840FEF7BCBF8C39002008B503483F +:1087F000FCF72EFDBDE80840FEF7B2BFF8390020B7 +:1088000008B500F0BDFCBDE80840FEF7A9BF0000B8 +:10881000062108B50846FCF7A1FD06210720FCF754 +:108820009DFD06210820FCF799FD06210920FCF793 +:1088300095FD06210A20FCF791FD06211720FCF783 +:108840008DFD06212820FCF789FD09217A20FCF7FF +:1088500085FD09213120FCF781FD07213220FCF73D +:108860007DFD0C212620FCF779FD0C212720FCF74B +:1088700075FD0C215220BDE80840FCF76FBD0000DB +:1088800008B5FFF775FD00F043FCFDF747F9FDF76C +:10889000E5F8FDF71DFBFDF7EFF9FEF7B1F9BDE8CF +:1088A000084000F029BA000030B50433039C01727F +:1088B000002104FB0325C160C0E90653049B036348 +:1088C000059BC0E90000C0E90422C0E90842C0E9F4 +:1088D0000A11436330BD00000022416AC260C0E952 +:1088E0000411C0E90A226FF00101FDF7FFBE00008C +:1088F000D0E90432934201D1C2680AB9181D704709 +:1089000000207047036919600021C2680132C2600B +:10891000C269134482699342036124BF436A0361BD +:10892000FDF7D8BE38B504460D46E3683BB1626931 +:108930000020131D1268A3621344E36207E0237A48 +:1089400033B929462046FDF7B5FE0028EDDA38BDDB +:108950006FF00100FBE70000C368C269013BC36020 +:108960004369134482699342436124BF436A43616C +:1089700000238362036B03B11847704770B530233F +:10898000044683F31188866A3EB9FFF7CBFF05469C +:1089900018B186F31188284670BDA36AE26A13F8FD +:1089A000015B9342A36202D32046FFF7D5FF002369 +:1089B00083F31188EFE700002DE9F84F04460E46D7 +:1089C000174698464FF0300989F311880025AA46CA +:1089D000D4F828B0BBF1000F09D141462046FFF77B +:1089E000A1FF20B18BF311882846BDE8F88FD4E9A8 +:1089F0000A12A7EB050B521A934528BF9346BBF109 +:108A0000400F1BD9334601F1400251F8040B91424B +:108A100043F8040BF9D1A36A403640354033A362D2 +:108A2000D4E90A239A4202D32046FFF795FF8AF33E +:108A30001188BD42D8D289F31188C9E730465A4619 +:108A4000F9F754F9A36A5E445D445B44A362E7E727 +:108A500010B5029C0433017203FB0421C460C0E919 +:108A600006130023C0E90A33039B0363049BC0E998 +:108A70000000C0E90422C0E90842436310BD0000C1 +:108A8000026A6FF00101C260426AC0E9042200225A +:108A9000C0E90A22FDF72ABED0E904239A4201D197 +:108AA000C26822B9184650F8043B0B607047002397 +:108AB0001846FAE7C3680021C2690133C3604369FD +:108AC000134482699342436124BF436A4361FDF7C3 +:108AD00001BE000038B504460D46E3683BB123698A +:108AE00000201A1DA262E2691344E36207E0237AC0 +:108AF00033B929462046FDF7DDFD0028EDDA38BD03 +:108B00006FF00100FBE7000003691960C268013AD9 +:108B1000C260C269134482699342036124BF436AFD +:108B2000036100238362036B03B1184770470000A1 +:108B300070B530230D460446114683F31188866ACA +:108B40002EB9FFF7C7FF10B186F3118870BDA36A75 +:108B50001D70A36AE26A01339342A36204D3E16900 +:108B600020460439FFF7D0FF002080F31188EDE79D +:108B70002DE9F84F04460D46904699464FF0300ACD +:108B80008AF311880026B346A76A4FB949462046A2 +:108B9000FFF7A0FF20B187F311883046BDE8F88FBA +:108BA000D4E90A073A1AA8EB0607974228BF1746E6 +:108BB000402F1BD905F1400355F8042B9D4240F886 +:108BC000042BF9D1A36A40364033A362D4E90A23C7 +:108BD0009A4204D3E16920460439FFF795FF8BF3ED +:108BE00011884645D9D28AF31188CDE729463A46FD +:108BF000F9F77CF8A36A3D443E443B44A362E5E7B1 +:108C0000D0E904239A4217D1C3689BB1836A8BB120 +:108C1000043B9B1A0ED01360C368013BC360C36959 +:108C20001A4483699A42026124BF436A03610023A4 +:108C300083620123184670470023FBE701F01F03FE +:108C4000F0B502F01F0456095A1C0123B6EB511F60 +:108C500050F8265003FA02F34FEA511703F1FF339D +:108C60003DBF50F82720C4F12000134003EA05005F +:108C70003BBF03FA00F225FA04F0E0401043F0BDD8 +:108C800070B57E227F210546FFF7D8FF18B1012875 +:108C900019D0002070BD3E2249212846FFF7CEFFA3 +:108CA0002F22044631212846FFF7C8FF064601342B +:108CB0005022023653212846B440FFF7BFFF09383F +:108CC00004FA00F0E6E7302245212846FFF7B6FF18 +:108CD00001308002DEE7000090F8D63090F8D7200F +:108CE0001B0403EB026390F8D42090F8D5001344E2 +:108CF00003EB00207047000000F018BA014B586ADF +:108D0000704700BF000C0040034B002258631A61FB +:108D10000222DA60704700BF000C0040014B0022C5 +:108D2000DA607047000C0040014B5863704700BF89 +:108D3000000C0040024B034A1A60034A5A60704715 +:108D40008C6600203867002000000220074B494253 +:108D500010B55C68201A08401968821A8A4203D349 +:108D6000A24201D85A6010BD0020FCE78C660020AA +:108D700008B5302383F31188FFF7E8FF002383F35E +:108D8000118808BD0448054B03600023C0E9013386 +:108D90000C3000F017B900BF94660020718D0008F8 +:108DA000CB1D083A23F00703591A521A10B4D208FF +:108DB0000024C0E9004384600C301C605A605DF8F8 +:108DC000044B00F0FFB800002DE9F74F364FCD1DE2 +:108DD0008846002818BF0746082A4FEAD50538BF3D +:108DE000082207F10C003C1D9146019000F02CF97F +:108DF000019809F10701C9F1000E2246246864B9FF +:108E000000F02CF93B68CBB308224946E8009847AC +:108E1000044698B340E9027830E004EB010CD4F842 +:108E200004A00CEA0E0C0AF10106ACF1080304EBF5 +:108E3000C6069E42E1D9A6EB0C0CB5EBEC0F4FEA4F +:108E4000EC0BDAD89C421DD204F10802AB45A3EB2F +:108E500002024FEAE202626009D9691CED4303EBAA +:108E6000C1025D445560256843F8315022601C46BC +:108E7000C3F8048044F8087B00F0F0F8204603B003 +:108E8000BDE8F08FAA45216802D111602346EEE7C4 +:108E9000013504EBC50344F8351003F10801761AD7 +:108EA000F6105E601360F1E79466002073B5044627 +:108EB000A0F1080550F8080C54F8043C061D0C30CD +:108EC00007330190DB0844F8043C00F0BDF833465A +:108ED00001989E421A6801D0AB4228D20AB195424D +:108EE00025D244F8082C54F8042C1D60013254F8A3 +:108EF000081C05EBC206B14206D14E68324444F864 +:108F0000042C0A6844F8082C5E68711C03EBC1014C +:108F10008D4207D154F8042C013232445A6054F87F +:108F2000082C1A6002B0BDE8704000F097B81346F4 +:108F3000CFE70000FEE7000070B51E4B0025044699 +:108F400086B058600E4605638163FEF7E1FB04F1CD +:108F50002803A5606563C4E90A3304F11003C4E97A +:108F600004334FF0FF33C4E90044C4E90635FFF78A +:108F7000C5FE2B46024604F13C012046C4E9082305 +:108F800080230D4A6567FDF70FFB7368E0600B4AAD +:108F900003620123009280F824306846F26801924F +:108FA0003269CDE90223064BCDE90435FDF730FBEC +:108FB00006B070BD10490020649C00085C9C00084D +:108FC000358F00080023C0E900008360036170470B +:108FD00070B51C4B05468468DE685CB3B44213D19F +:108FE00003690133036170BDA36094F8243083B139 +:108FF000062B15D1A06A2146D4E9003213605A60CD +:10900000FDF73EFAA36A9C68B368A2689A42EBD364 +:1090100006E0D4E90032204613605A60FDF740FABA +:1090200028463146FDF72CFAB5620620BDE87040AF +:10903000FDF738BA0369866001330361336BC3609F +:109040003063D0E76846002008B5302383F31188E9 +:10905000FFF7BEFF002383F3118808BD194BD968C1 +:1090600083688B4210B520D1302383F311880269C5 +:10907000013A0261B2B90468C368A0420B631ED012 +:109080004A6B9BB901238A60036103681A68026016 +:1090900050601A6B8360C26018631846FDF700FACF +:1090A000FDF750FA002383F3118810BD1C68A3421A +:1090B00003D0A468A24238BF2246DB68E1E78260A1 +:1090C000F0E700BF68460020024A536B1843506324 +:1090D000704700BF6846002038B5EFF311859DB991 +:1090E000EFF30584C4F30804302334B183F311880B +:1090F000FDF734FC85F3118838BD83F31188FDF743 +:109100002DFC84F3118838BDBDE83840FDF726BC3E +:109110000023054A19460133102BC2E9001102F160 +:109120000802F8D1704700BFB4660020114BD3F895 +:10913000E82042F00802C3F8E820D3F8102142F0FA +:109140000802C3F810210C4AD3F81031D36B43F056 +:109150000803D363C722094B9A624FF0FF32DA62E9 +:1091600000229A615A63DA605A6001225A611A60D9 +:10917000704700BF004402580010005C000C004023 +:10918000094A08B51169D3680B40D9B29B076FEA49 +:109190000101116107D5302383F31188FDF7F8F938 +:1091A000002383F3118808BD000C004010B501397D +:1091B0000244904201D1002005E0037811F8014FEC +:1091C000A34201D0181B10BD0130F2E7884210B550 +:1091D00001EB020402D98442234607D8431EA14270 +:1091E00008D011F8012B03F8012FF8E702440146DB +:1091F0008A4200D110BD13F8014D02F8014DF7E786 +:10920000C9B2034610F8012B1AB18A42F9D11846A7 +:109210007047002918BF0023F9E70000034611F842 +:10922000012B03F8012B002AF9D1704710B5013941 +:10923000034632B111F8014F03F8014B013A002CFB +:10924000F7D11A440021934200D110BD03F8011B4D +:10925000F9E700004D4435002D2D0A002F6172649E +:109260007570696C6F742E6162696E002F61726433 +:109270007570696C6F742D7665726966792E61629E +:10928000696E002F6172647570696C6F742D666C05 +:109290006173682E6162696E002F61726475706916 +:1092A0006C6F742D666C61736865642E6162696EA3 +:1092B000000000000000000000000000050F000892 +:1092C000A10F000851110008D90F0008990F0008DC +:1092D0000000000000000000010F0008AD0F0008B2 +:1092E00089110008FD0E0008090F000853544D3382 +:1092F0003248373F3F3F0053544D3332483733787D +:109300002F3732780053544D3332483734332F37A8 +:1093100035332F373530000001105A000310590043 +:1093200001205800032056002F000000537563638E +:1093300065737366756C6C79206D6F756E7465649A +:10934000205344436172642028736C6F77646F7795 +:109350006E3D2575290A0000EB769045584641542C +:1093600020202000464154333220202000000000FD +:109370002A3A3C3E7C223F7F002B2C3B3D5B5D002C +:10938000435545414141414345454549494941418D +:109390004592924F4F4F5555594F554F9C4F9E9F59 +:1093A00041494F55A5A5A6A7A8A9AAABACADAEAF9C +:1093B000B0B1B2B3B4414141B8B9BABBBCBDBEBF94 +:1093C000C0C1C2C3C4C54141C8C9CACBCCCDCECF30 +:1093D000D1D145454549494949D9DADBDCDD49DF89 +:1093E0004FE14F4F4F4FE6E8E85555555959EEEFCD +:1093F000F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFFF5 +:1094000001030507090E10121416181C1E00000097 +:1094100061001A03E0001703F8000703FF000100D2 +:1094200078010001300132010601390110014A01C1 +:109430002E017901060180014D0043028101820164 +:1094400082018401840186018701870189018A01E3 +:109450008B018B018D018E018F0190019101910192 +:1094600093019401F60196019701980198013D023C +:109470009B019C019D0120029F01A001A001A2016E +:10948000A201A401A401A601A701A701A901AA01A3 +:10949000AB01AC01AC01AE01AF01AF01B101B20152 +:1094A000B301B301B501B501B701B801B801BA0103 +:1094B000BB01BC01BC01BE01F701C001C101C20179 +:1094C000C301C401C501C401C701C801C701CA0164 +:1094D000CB01CA01CD011001DD0101008E01DE01C9 +:1094E0001201F3010300F101F401F401F801280174 +:1094F000220212013A020900652C3B023B023D02A6 +:10950000662C3F0240024102410246020A01530218 +:10951000400081018601550289018A0158028F01AC +:109520005A0290015C025D025E025F0293016102D9 +:109530006202940164026502660267029701960165 +:109540006A02622C6C026D026E029C017002710252 +:109550009D01730274029F017602770278027902FC +:109560007A027B027C02642C7E027F02A6018102C9 +:109570008202A9018402850286028702AE014402AA +:10958000B101B20145028D028E028F02900291025A +:10959000B7017B030300FD03FE03FF03AC030400DC +:1095A0008603880389038A03B1031103C2030200FF +:1095B000A303A303C4030803CC0303008C038E039B +:1095C0008F03D8031801F2030A00F903F303F4032D +:1095D000F503F603F703F703F903FA03FA0330047C +:1095E000200350041007600422018A043601C104DC +:1095F0000E01CF040100C004D0044401610526041B +:10960000000000007D1D0100632C001E9601A01EBD +:109610005A01001F0806101F0606201F0806301FEB +:109620000806401F0606511F0700591F521F5B1FE7 +:10963000541F5D1F561F5F1F601F0806701F0E001E +:10964000BA1FBB1FC81FC91FCA1FCB1FDA1FDB1FD2 +:10965000F81FF91FEA1FEB1FFA1FFB1F801F0806E8 +:10966000901F0806A01F0806B01F0400B81FB91FEE +:10967000B21FBC1FCC1F0100C31FD01F0206E01F7A +:109680000206E51F0100EC1FF31F0100FC1F4E2125 +:109690000100322170211002842101008321D02495 +:1096A0001A05302C2F04602C0201672C0601752C42 +:1096B0000201802C6401002D260841FF1A030000DE +:1096C000C700FC00E900E200E400E000E500E7007C +:1096D000EA00EB00E800EF00EE00EC00C400C5007B +:1096E000C900E600C600F400F600F200FB00F90035 +:1096F000FF00D600DC00F800A300D800D7009201DC +:10970000E100ED00F300FA00F100D100AA00BA0078 +:10971000BF00AE00AC00BD00BC00A100AB00BB00B0 +:1097200091259225932502252425C100C200C00061 +:10973000A9006325512557255D25A200A500102508 +:10974000142534252C251C2500253C25E300C300C9 +:109750005A25542569256625602550256C25A400C9 +:10976000F000D000CA00CB00C8003101CD00CE000F +:10977000CF0018250C2588258425A600CC0080253F +:10978000D300DF00D400D200F500D500B500FE0004 +:10979000DE00DA00DB00D900FD00DD00AF00B40020 +:1097A000AD00B1001720BE00B600A700F700B8005A +:1097B000B000A800B700B900B300B200A025A00017 +:1097C00010000240080002400008024000000B00A8 +:1097D00028000240080002400408024006010C0074 +:1097E00040000240080002400808024010020D003C +:1097F00058000240080002400C08024016030E0008 +:10980000700002400C0002401008024000040F00EB +:10981000880002400C0002401408024006051000B7 +:10982000A00002400C00024018080240100611007F +:10983000B80002400C0002401C08024016072F002E +:1098400010040240080402402008024000083800CA +:109850002804024008040240240802400609390096 +:10986000400402400804024028080240100A3A005E +:1098700058040240080402402C080240160B3B002A +:10988000700402400C04024030080240000C3C000E +:10989000880402400C04024034080240060D4400D3 +:1098A000A00402400C04024038080240100E45009B +:1098B000B80402400C0402403C080240160F460067 +:1098C0000100000000000000009600000000000001 +:1098D0000000000000000000000000000000000088 +:1098E00000000000F96B0008FD6B0008F15600084D +:1098F000295A000885560008AD560008D5560008BC +:109900006D56000800000000DD5A0008C95A000822 +:10991000055B0008F15A0008FD5A0008E95A0008E2 +:10992000D55A0008C15A0008115B00080000000069 +:10993000F55B0008E15B00081D5C0008095C00089D +:10994000155C0008015C0008ED5B0008D95B0008AD +:10995000295C000800000000010000000000000079 +:109960006330000060990008000000000000000063 +:10997000E0460020104900200000812A000000007D +:10998000AAAAAAAA00000024FFFE0000000000000E +:1099900000A00A000001000000000000AAAAAAAA74 +:1099A00000000000FFFF00000000000000000000B9 +:1099B0001400AA5600000000AAAAAAAA140055542E +:1099C000FFFF000000000000CCCC0C0020681A0053 +:1099D00000000000AAAA8AAA10541500FFFF000088 +:1099E000000C7007770000004081020100100000A9 +:1099F000AAAAAAAA00410100F7FF00000000007017 +:109A0000070000000000000000000000AAAAAAAAA7 +:109A100000000000FFFF0000000000000000000048 +:109A20000000000000000000AAAAAAAA000000008E +:109A3000FFFF000000000000000000000000000028 +:109A400000000000AAAAAAAA00000000FFFF000070 +:109A50000000000000000000000000000000000006 +:109A6000AAAAAAAA00000000FFFF00000000000050 +:109A7000000000000000000000000000AAAAAAAA3E +:109A800000000000FFFF00000000000000000000D8 +:109A90000000000000000000AAAAAAAA000000001E +:109AA000FFFF000000000000000000004375626539 +:109AB00050696C6F74004A6F65792D424C002553D4 +:109AC000455249414C250000020000000000000002 +:109AD000155E0008855E000840004000C06100205F +:109AE000D061002002000000000000000300000020 +:109AF00000000000CD5E0008000000001000000023 +:109B0000E0610020000000000100000000000000F3 +:109B10003C65002001010200F56C0008056C00089E +:109B2000A16C0008856C000843000000309B000811 +:109B300009024300020100C03209040000010202D0 +:109B40000100052400100105240100010424020283 +:109B50000524060001070582030800FF090401002F +:109B6000020A00000007050102400000070581020B +:109B700040000000120000007C9B00081201100150 +:109B800002000040AE2D5610000201020301000049 +:109B90000403090425424F41524425004375626580 +:109BA0004F72616E67652D6A6F65790030313233AF +:109BB00034353637383941424344454600000000C9 +:109BC0000000002000000200020000000000003041 +:109BD000000004000800000000000024000008004D +:109BE000040000000004000000FC0000020000006F +:109BF0000000043000800000080000000000003871 +:109C000000000100010000001F1C1F1E1F1E1F1F5F +:109C10001E1F1E1F1F1D1F1E1F1E1F1F1E1F1E1F5C +:109C20000000000029600008E16200088D63000860 +:109C300040004000746600207466002001000000AF +:109C40008466002080000000400100000800000041 +:109C500000010000001000000800000069646C654D +:109C6000000000006D61696E002C0438040438089F +:109C70000C10141C202425260000000000006404A1 +:109C80000100040000000000000C00102830340027 +:109C9000D867FF7F010000000904000000000000F9 +:109CA00000001E0000000000FF0000001849002016 +:109CB000203900208C390020F839002000000000F5 +:109CC000EC92000883040000F792000850040000A2 +:109CD000059300080100000000000000009600004D +:109CE00000000800960000000008000004000000CA +:109CF000909B000800000000000000000000000031 +:0C9D000000000000000000000000000057 :00000001FF diff --git a/Tools/bootloaders/CubeOrange-periph-heavy_bl.bin b/Tools/bootloaders/CubeOrange-periph-heavy_bl.bin index cd09e9be90..89300109d8 100755 Binary files a/Tools/bootloaders/CubeOrange-periph-heavy_bl.bin and b/Tools/bootloaders/CubeOrange-periph-heavy_bl.bin differ diff --git a/Tools/bootloaders/CubeOrange-periph-heavy_bl.hex b/Tools/bootloaders/CubeOrange-periph-heavy_bl.hex index d7433019f9..09ea9eb33f 100644 --- a/Tools/bootloaders/CubeOrange-periph-heavy_bl.hex +++ b/Tools/bootloaders/CubeOrange-periph-heavy_bl.hex @@ -1,34 +1,34 @@ :020000040800F2 -:1000000000070020F1020008A1330008593300085E -:10001000813300085933000879330008F3020008DF -:10002000F3020008F3020008F30200088543000809 +:1000000000070020F102000839340008F13300082D +:1000100019340008F133000811340008F302000815 +:10002000F3020008F3020008F30200082544000868 :10003000F3020008F3020008F3020008F3020008CC :10004000F3020008F3020008F3020008F3020008BC -:10005000F3020008F3020008017800082D78000878 -:100060005978000885780008B178000849440008EC -:10007000714400089D440008C9440008F544000884 -:100080001D45000849450008F3020008093300082F -:10009000313300081D33000845330008DD780008BF +:10005000F3020008F3020008DD7C0008097D0008B7 +:10006000357D0008617D00088D7D0008E9440008A9 +:10007000114500083D450008694500089545000800 +:10008000BD450008E9450008F3020008A133000857 +:10009000C9330008B5330008DD330008B97D000816 :1000A000F3020008F3020008F3020008F30200085C :1000B000F3020008F3020008F3020008F30200084C :1000C000F3020008F3020008F3020008F30200083C :1000D000F3020008F3020008F3020008F30200082C -:1000E00041790008F3020008F3020008F302000857 -:1000F000F3020008F3020008F30200087545000847 -:10010000F3020008F3020008C9790008F3020008AE +:1000E0001D7E0008F3020008F3020008F302000876 +:1000F000F3020008F3020008F302000815460008A6 +:10010000F3020008F3020008A57E0008F3020008CD :10011000F3020008F3020008F3020008F3020008EB -:10012000A1450008C9450008F5450008214600081A -:100130004D460008F3020008F3020008F30200082D +:10012000414600086946000895460008C146000897 +:10013000ED460008F3020008F3020008F30200088D :10014000F3020008F3020008F3020008F3020008BB -:1001500075460008A1460008CD460008F3020008D5 +:1001500015470008414700086D470008F3020008F2 :10016000F3020008F3020008F3020008F30200089B -:10017000F3020008816E0008F3020008F302000891 -:10018000F3020008F3020008B5790008F302000842 +:10017000F3020008E5700008F3020008F30200082B +:10018000F3020008F3020008917E0008F302000861 :10019000F3020008F3020008F3020008F30200086B :1001A000F3020008F3020008F3020008F30200085B :1001B000F3020008F3020008F3020008F30200084B :1001C000F3020008F3020008F3020008F30200083B -:1001D000F30200086D6E0008F3020008F302000845 +:1001D000F3020008D1700008F3020008F3020008DF :1001E000F3020008F3020008F3020008F30200081B :1001F000F3020008F3020008F3020008F30200080B :10020000F3020008F3020008F3020008F3020008FA @@ -52,49 +52,49 @@ :100320004F8FBFF36F8F40F20000C0F2F0004EF627 :100330008851CEF200010860BFF34F8FBFF36F8F7B :100340004FF00000E1EE100A4EF63C71CEF20001D3 -:100350000860062080F31488BFF36F8F05F0FCFF60 -:1003600007F00AF84FF055301F491B4A91423CBF35 +:100350000860062080F31488BFF36F8F06F02EF933 +:1003600007F076FA4FF055301F491B4A91423CBFC7 :1003700041F8040BFAE71D49184A91423CBF41F885 :10038000040BFAE71A491B4A1B4B9A423EBF51F82D :10039000040B42F8040BF8E700201849184A914270 -:1003A0003CBF41F8040BFAE706F014F807F068F8D0 +:1003A0003CBF41F8040BFAE706F046F907F0D4FA2F :1003B000144C154DAC4203DA54F8041B8847F9E796 :1003C00000F042F8114C124DAC4203DA54F8041B11 -:1003D0008847F9E705F0FCBF000700200023002054 +:1003D0008847F9E706F02EB9000700200023002027 :1003E0000000000808ED00E00001002000070020E8 -:1003F0009880000800230020D0230020D023002074 -:10040000C8880020E0020008E4020008E4020008B6 +:1003F00060850008002300206C230020702300206B +:1004000030890020E0020008E4020008E40200084D :10041000E40200082DE9F04F2DED108AC1F80CD050 :10042000D0F80CD0BDEC108ABDE8F08F002383F328 -:1004300011882846A047002005F070FAFEE705F075 -:10044000EFF900DFFEE70000F8B501F0E9F901F08F -:100450007FFB05F005FF074605F074FF0546A8BBC6 +:1004300011882846A047002005F0E4FAFEE705F001 +:100440005FFA00DFFEE70000F8B501F0E9F901F01E +:100450007FFB06F037F8074606F0A6F80546A8BB6E :100460001F4B9F4232D001339F4232D027F0FF0210 :100470001C4B9A4230D12E4642F21074F8B200F072 -:100480009BFF00F09FFF08B10024264601F0A8FD65 +:100480009BFF00F09FFF08B10024264601F0F0FD1D :1004900020B10024032000F079F8264635B1124B34 -:1004A0009F4203D0002405F045FF2646002005F0BA -:1004B000E1FE0EB100F080F801F0E8FA00F0B6FFBE +:1004A0009F4203D0002406F077F82646002006F08D +:1004B00013F80EB100F080F801F0E8FA00F0B6FF92 :1004C000204600F037F900F077F8F9E72E460024CF :1004D000D7E704460126D4E7064641F28834D0E740 :1004E000010007B0000008B0263A09B008B501F0D5 :1004F00063F9A0F120035842584108BD07B541F205 :100500001203022101A8ADF8043001F073F903B021 :100510005DF804FB38B5302383F31188174803686E -:100520000BB105F0C7FA0023154A4FF47A7113484E -:1005300005F0B6FA002383F31188124C236813B137 +:100520000BB105F03BFB0023154A4FF47A711348D9 +:1005300005F02AFB002383F31188124C236813B1C2 :100540002368013B2360636813B16368013B636008 :100550000D4D2B7833B963687BB9022001F008FA9E :10056000322363602B78032B07D163682BB90220F9 -:1005700001F0FEF94FF47A73636038BDD023002098 -:1005800015050008F0240020E8230020084B18700F +:1005700001F0FEF94FF47A73636038BD70230020F8 +:10058000150500089024002088230020084B1870CF :1005900003280CD8DFE800F008050208022001F06B :1005A000E5B9022001F0E0B9024B00225A60704721 -:1005B000E8230020F0240020F8B501F011FD30B14F +:1005B0008823002090240020F8B501F059FD30B1C7 :1005C000544B03221A700022534B5A60F8BD534B10 :1005D000534A1C4619680131F8D004339342F9D1CB :1005E0006268504B9A42F1D94F4B9B6803F100630C -:1005F00003F500339A42E9D205F070FE05F082FE61 +:1005F00003F500339A42E9D205F0A2FF05F0B4FFFB :10060000002001F027F90220FFF7C0FF474B00212F :10061000D3F8E820C3F8E810D3F81021C3F810117C :10062000D3F81021D3F8EC20C3F8EC10D3F8142140 @@ -112,13 +112,13 @@ :1006E000BFF36F8FBFF34F8FBFF36F8F536923F447 :1006F000003353610023C2F85032BFF34F8FBFF372 :100700006F8F302383F31188854680F30888204754 -:100710005CE700BFE8230020F0240020000002086E +:100710005CE700BF8823002090240020000002082E :1007200020000208FFFF01080023002000440258B7 :1007300000ED00E02DE9F04F93B0B74B2022FF21F0 :1007400000900AA89D6801F04BF9B44A1378A3B948 :100750000121B34811700360302383F311880368CB -:100760000BB105F0A7F90023AE4A4FF47A71AC48FB -:1007700005F096F9002383F31188009B13B1AA4B6F +:100760000BB105F01BFA0023AE4A4FF47A71AC4886 +:1007700005F00AFA002383F31188009B13B1AA4BFA :10078000009A1A60A94A1378032B03D00023137030 :10079000A54A53604FF0000A009CD3465646D14606 :1007A000012001F0E3F824B19F4B1B68002B00F0FF @@ -160,9 +160,9 @@ :1009E000926893423FF642AFB8F5807F3FF73EAF43 :1009F000124BB845019323DD4FF47A7000F0DCFE12 :100A00000390039A002AFFF631AF039A0137019B46 -:100A100003F8012BEDE700BF00230020EC240020A9 -:100A2000D023002015050008F0240020E823002032 -:100A300004230020082300200C230020EC230020A6 +:100A100003F8012BEDE700BF002300208C24002009 +:100A20007023002015050008902400208823002052 +:100A300004230020082300200C2300208C23002006 :100A4000C820FFF753FD074600283FF40FAF1F2DC6 :100A500011D8C5F120020AAB25F0030084494245B4 :100A6000184428BF4246019200F094FF019AFF21EA @@ -172,7 +172,7 @@ :100AA0003FF4E4AE00F010FF00283FF4DFAE002773 :100AB000B846704B9B68BB4218D91F2F11D80A9BB0 :100AC00001330ED027F0030312AA134453F8203C3D -:100AD00005934046042205A9043701F06BFA8046CD +:100AD00005934046042205A9043701F0B3FA804685 :100AE000E7E7384600F0B8FE0590F2E7CDF814804D :100AF000042105A800F07EFE02E70023642104A87B :100B0000049300F06DFE00287FF4B0AE0220FFF7E2 @@ -191,14 +191,14 @@ :100BD000FFF78CFC00283FF449AE00F075FE0028BA :100BE00044D00A9B01330BD008220AA9002000F050 :100BF000FFFE00283AD02022FF210AA800F0F0FED4 -:100C0000FFF77CFC1C4804F08FFE13B0BDE8F08FAA +:100C0000FFF77CFC1C4804F003FF13B0BDE8F08F35 :100C1000002E3FF42BAE0BF00B030B2B7FF426AE14 :100C20000023642105A8059300F0DAFD074600289B :100C30007FF41CAE0220FFF759FC804600283FF4E9 -:100C400015AEFFF75BFC41F2883004F06DFE0598AD +:100C400015AEFFF75BFC41F2883004F0E1FE059839 :100C500000F05CFF46463C4600F00EFFA0E506466D :100C60004EE64FF0000901E6BA467EE637467CE6DE -:100C7000EC23002000230020A0860100094A49F24D +:100C70008C23002000230020A0860100094A49F2AD :100C80006900136899B21B0C00FB013344F25061F8 :100C90001360054B186882B2000C01FB020018605B :100CA00080B270471423002010230020002110225E @@ -206,51 +206,51 @@ :100CC0001868A06010BD00BF00E8F11F2DE9F041D9 :100CD000ADF5527D0D46002140F2751270AC07460D :100CE00012A8119100F07CFE4FF4C472002120463E -:100CF00000F076FE0DF1440802F05AFB4FF47A72D0 +:100CF00000F076FE0DF1440802F0A6FB4FF47A7284 :100D0000264BB0FBF2F0186093E80700022384E85A :100D100007000DF5F1702382FFF7C8FF47F60503C2 -:100D20001F4907A8238406F0F3FE25230DF2F322C2 +:100D20001F4907A8238407F057F925230DF2F32262 :100D30000DF13C0C84F8323107AB1E46083203CE6D :100D4000664542F8080C42F8041C3346F5D1306879 -:100D500041461060204633791371012200F04EFFA6 +:100D500041461060204633791371012200F058FF9C :100D6000002380B2E97E0393AB7E029305F1190361 :100D700001930123009307A3D3E90023CDE9048065 -:100D8000384602F0D3FE0DF5527DBDE8F08100BF7C -:100D9000AFF300809E6AC421818A46EEF8240020C9 -:100DA000207B00082DE9F0412C4CDAB080460D463E -:100DB000237A5BBB27A9284601F02EF807460028B6 +:100D8000384602F01FFF0DF5527DBDE8F08100BF2F +:100D9000AFF300809E6AC421818A46EE9824002029 +:100DA000E87F00082DE9F0412C4CDAB080460D4672 +:100DB000237A5BBB27A9284601F04EF80746002896 :100DC00042D19DF89D60C82E3ED801464FF4A662E0 :100DD000204600F005FE4FF4807332460DF19E016F :100DE000C4F8F8314FF4007304F109002644C4F844 :100DF0000C334FF44073C4F8203400F0CBFD9DF861 :100E00009C30777223720BB9EB7E237206AC812281 :100E1000002127A800F0E4FD0122214627A801F0C7 -:100E200037F8002380B2E97E0393AB7E029305F18D +:100E200061F8002380B2E97E0393AB7E029305F163 :100E3000190301932823CDE904400093404605A3FC -:100E4000D3E9002302F072FE5AB0BDE8F08100BF82 -:100E5000AFF3008026417272DF25D7B7C05E002055 +:100E4000D3E9002302F0BEFE5AB0BDE8F08100BF36 +:100E5000AFF3008026417272DF25D7B7605E0020B5 :100E6000F0B5254E4FF48A75F1B0002405FB0065FE :100E700096F8D830D822214685F8DC303AA885F893 :100E8000E84006AF00F0ACFD06F1090000F0A0FD5F :100E9000D5F8E430C2B206F109018DF8F0000DF189 :100EA000F100CDE93A3400F075FD394601223AA847 -:100EB00001F01AF8082380B2317ACDE904700127D5 +:100EB00001F04EF8082380B2317ACDE904700127A1 :100EC0000E48CDE9023706F1D80301933023009391 -:100ED00007A3D3E9002302F029FEA04206DD02F0B9 -:100EE00067FAC5F8E000384671B0F0BD2046FBE770 -:100EF00078F6339F93CACD8DC05E00201035002058 +:100ED00007A3D3E9002302F075FEA04206DD02F06D +:100EE000B3FAC5F8E000384671B0F0BD2046FBE724 +:100EF00078F6339F93CACD8D605E0020B034002019 :100F00002DE9F04F264F87B0DFF8A080254E3846F8 -:100F100002F038FE034600283AD00024224DADF8F6 +:100F100002F084FE034600283AD00024224DADF8AA :100F20001440A1460294A246CDE90344027B8DF809 :100F3000142003AA9968406803C21B6843F0004369 -:100F400002932B6804F5A664D3F810B002F032FACD +:100F400002932B6804F5A664D3F810B002F07EFA81 :100F500010EB0802CDF800A0284605F5A65541F192 :100F6000000302A9D8470028C8BF49F00109B4F519 -:100F7000266FE6D1B9F1000F05D0384602F006FE23 +:100F7000266FE6D1B9F1000F05D0384602F052FED7 :100F800086F800A0C3E73378072B04D80133337009 -:100F900007B0BDE8F08F024802F0F8FDF8E700BFA7 -:100FA00010350020F56300204035002040420F003E -:100FB00070B50D4614461E4602F014FD50B9022EBF +:100F900007B0BDE8F08F024802F044FEF8E700BF5A +:100FA000B034002095630020E034002040420F0060 +:100FB00070B50D4614461E4602F060FD50B9022E73 :100FC00010D1012C0ED112A3D3E900230120C5E9D1 :100FD000002307E0282C10D005D8012C09D0052CBF :100FE0000FD0002070BD302CFBD10BA3D3E9002320 @@ -262,22 +262,22 @@ :10104000013500F02FFCA4F82C55B4F82C0500F065 :1010500011FC78B1B4F82C0500F01CFC014648B92D :10106000B4F82C0500F01EFCB4F82C350133A4F8BC -:101070002C35EAE738BD00BFC05E0020F8B50D4C46 +:101070002C35EAE738BD00BF605E0020F8B50D4CA6 :1010800002260D4FA4F5805343F8307C237E3BB9F4 -:1010900065692DB1284601F01DF8284606F0EEFCE2 -:1010A0002046A4F5A65401F015F8012E00D1F8BD94 -:1010B0000126E7E7305A0020E87B00082DE9F04FD1 -:1010C0008FB005460C4600AF02F08CFC002849D1D9 -:1010D000237E022B1BD1E38A012B18D102F068F981 +:1010900065692DB1284601F065F8284601F09EF9F2 +:1010A0002046A4F5A65401F05DF8012E00D1F8BD4C +:1010B0000126E7E7D0590020B08000082DE9F04F65 +:1010C0008FB005460C4600AF02F0D8FC002849D18D +:1010D000237E022B1BD1E38A012B18D102F0B4F935 :1010E0000646FFF7CBFD03464FF4C87006F51676AB :1010F000DFF8C082B3FBF0F202FB103316FA83F381 :10110000C8F80030E37E33B9A34B00221A703C3795 -:10111000BD46BDE8F08F07F12401204600F03AFEFD +:10111000BD46BDE8F08F07F12401204600F050FEE7 :101120000028F4D107F11400FFF7C0FD97F826401E -:1011300007F1140107F12700224606F0B7FC00284A +:1011300007F1140107F12700224606F01BFF0028E3 :10114000E2D10F2C08D8944B1C70D8F80030A3F5CE :101150001673C8F80030DAE797F82410284602F032 -:1011600039FCD4E7E38A282B2BD010D8012B23D0CD +:1011600085FCD4E7E38A282B2BD010D8012B23D081 :10117000052BCCD1BFF34F8F8849894BCA6802F445 :10118000E0621343CB60BFF34F8F00BFFDE7302B0E :10119000BDD1844EE17E327A9142B8D1607E314633 @@ -297,14 +297,14 @@ :101270007260D6F8D42005EB0209C6F8D49000F0CD :10128000F9FA814509D396F8D220D6F8D400013274 :10129000001B86F8D220C6F8D400FF2D0FD80024FA -:1012A000347200F011FB204600F0D4FA00F098FEF2 +:1012A000347200F011FB204600F0D4FA00F0E0FEAA :1012B0003D4B188108B9FFF77FF9C54627E7BB68A2 :1012C00096F8D9000AFB0362FB68D2F8E41082F8B2 :1012D000E83001F58061C2F8E030C2F8E410FFF7B1 :1012E000BFFDFFF70DFE96F8D920013202F0030290 :1012F00086F8D920B6E74FF48A7A20460AFB02F531 -:1013000005F1EA01314400F01BFEF86000287FF48B -:10131000FEAE0122354485F8E82002F049F8D5F800 +:1013000005F1EA01314400F057FEF86000287FF44F +:10131000FEAE0122354485F8E82002F095F8D5F8B4 :10132000E020D6ED007A801A40F6B832B8EE677A3F :10133000DFED1E6A192838BF1920904228BF1046D9 :1013400007EE900AF8EEE77A67EEA67ADFED186A04 @@ -312,27 +312,27 @@ :10136000BB60BA6873680AFB02F4321992F8E8109D :1013700059B1D2F8E410E8468B423FF427AF002180 :1013800082F8E810C2F8E010C5467368064A9B0A66 -:1013900001331381BBE600BF0935002000ED00E0FA -:1013A0000400FA05C05E0020F8240020CDCCCC3D1E -:1013B0006666663F0C350020014B1870704700BF11 -:1013C0000425002038B54FF00054144B22689A428F -:1013D00021D1627D0025124B12481A70C922237D4B -:1013E0000930114900F8013C4FF48073C0F8DB501C -:1013F000C0F8EF314FF40073C0F803334FF440737B -:10140000C0F8173400F0C6FAE0222946204600F062 -:10141000E7FA012038BD0020FCE700BF9AAD44C5C3 -:1014200004250020C05E00201600002037B500F023 -:10143000D7FD1F4C1F4D022301221F496B712368EA +:1013900001331381BBE600BFA934002000ED00E05B +:1013A0000400FA05605E002098240020CDCCCC3DDE +:1013B0006666663FAC340020014B1870704700BF72 +:1013C000A424002038B54FF00054144B22689A42F0 +:1013D00022D1607DF8B1124B0025C9221149187045 +:1013E0001148237D0930C0F8DB5000F8013C4FF470 +:1013F0008073C0F8EF314FF40073C0F803334FF43B +:101400004073C0F8173400F0C5FAE02229462046A0 +:1014100000F0E6FA012038BD0020FCE79AAD44C593 +:10142000A424002016000020605E002037B500F0E4 +:101430001FFE1F4C1F4D022301221F496B712368A1 :10144000288120465B68984704F5805301221A4999 :10145000D3F8C03404F5A6505B68984700231749B9 :101460004FF480520193164B16480093164B02F02E -:1014700089FA164B197811B1124802F0ABFA01F053 -:1014800097FF0446FFF7FAFB4FF4C873B0FBF3F283 +:10147000D5FA164B197811B1124802F0F7FA01F0BB +:10148000E3FF0446FFF7FAFB4FF4C873B0FBF3F237 :1014900002FB130304F5167010FA83F00C4B18606E -:1014A00004F050FF08B10F232B8103B030BD00BF03 -:1014B00040350020F824002040420F00082500207D -:1014C000B10F000810350020BD10000804250020D1 -:1014D0000C3500202DE9F04F00242DED028B93B048 +:1014A00005F082F808B10F232B8103B030BD00BFD7 +:1014B000E03400209824002040420F00A82400209F +:1014C000B10F0008B0340020BD100008A424002093 +:1014D000AC3400202DE9F04F00242DED028B93B0A9 :1014E0000DF12C084FF0010ADFF814B2FFF708FDE8 :1014F0000A94ADF834400B94C8F804409FED798B02 :1015000000267E4D37462B680DF11D0207A928469F @@ -341,63 +341,63 @@ :1015300000210EA800F054FA2B6808AA0AA95F69D6 :1015400028460DF11E03B8470FAB4F4698E803003D :1015500083E803009DF834300EA958468DF84430D6 -:101560000A9B0E93DDE9082302F0EEFC06F5A66661 +:101560000A9B0E93DDE9082302F03AFD06F5A66614 :1015700005F5A655B6F5266FC5D1002FC0D1604838 -:1015800002F030FA00283FD15E4E01F011FF3368BF -:10159000984239D301F00CFF0546FFF76FFB4FF47B +:1015800002F07CFA00283FD15E4E01F05DFF336827 +:10159000984239D301F058FF0546FFF76FFB4FF42F :1015A000C8738DF82870B0FBF3F202FB130305F546 :1015B000167010FA83F03060534E377817B9012354 :1015C0008DF82830C7F110050EA8FFF76FFB0EABA2 :1015D000EDB20DF12900D919062D28BF06252A469E :1015E000013500F0D7F90AABEDB245480393182353 :1015F00004950293454B0193012300933BA3D3E948 -:10160000002302F035FA347001F0D2FE404A414D19 -:101610001368C31AB3F57A7F2FD3106001F0CAFEA6 -:1016200002460B46364802F0BBFA354802F0DAF9BA +:10160000002302F081FA347001F01EFF404A414D80 +:101610001368C31AB3F57A7F2FD3106001F016FF59 +:1016200002460B46364802F007FB354802F026FA20 :1016300018B32B7A0EAF384E002B14BF03230223AE -:10164000737101F0B5FE4FF47A7301223946B0FB95 -:10165000F3F03060304600F075FB182380B202933F +:10164000737101F001FF4FF47A7301223946B0FB48 +:10165000F3F03060304600F08BFB182380B2029329 :101660002E4B019340F25513CDE9037000932448AB -:1016700020A3D3E9002302F0FBF92B7A93B101F008 -:1016800097FE002607464FF48A7895F8D900304433 +:1016700020A3D3E9002302F047FA2B7A93B101F0BB +:10168000E3FE002607464FF48A7895F8D9003044E7 :1016900000F0030008FB005393F8E82072B1013614 -:1016A000042EF2D1C82004F03FF92B7A002B7FF4EE +:1016A000042EF2D1C82004F0B3F92B7A002B7FF47A :1016B00017AF13B0BDEC028BBDE8F08FD3F8E0207C :1016C00042B12B68BA1AFA2B38BFFA230533B2EBB2 :1016D000430FE4D3FFF7C4FB0028E0D1E2E700BFEB :1016E000AFF300800000000000000000401DA120BA -:1016F00026812A0BF1C6A7C1D068080F403500200B -:10170000103500200C350020093500200835002058 -:10171000F0630020C05E0020F8240020F463002065 -:1017200010B5074C204601F007F904F5A65001F06A -:1017300003F9044A04490020BDE8104006F098B9B6 -:1017400040350020506400207D1000082DE9F84F3E +:1016F00026812A0BF1C6A7C1D068080FE03400206C +:10170000B0340020AC340020A9340020A8340020DC +:1017100090630020605E00209824002094630020E5 +:1017200010B5074C204601F053F904F5A65001F01E +:101730004FF9044A04490020BDE8104006F006BCF9 +:10174000E0340020F06300207D1000082DE9F84F00 :101750004FF47A7306460D46002402FB03F7DFF8C8 :101760005080DFF8509098F900305FFA84FA5A1CE4 :1017700001D0A34212D159F824002A463146036809 :10178000D3F820B03B46D847854207D1074B01200C :1017900083F800A0BDE8F88F0124E4E7002CFBD01B -:1017A0004FF4FA7004F0C0F80020F3E73C64002026 +:1017A0004FF4FA7004F034F90020F3E7DC63002012 :1017B000182300201C230020002307B50246012126 :1017C0000DF107008DF80730FFF7C0FF20B19DF83D :1017D000070003B05DF804FB4FF0FF30F9E70000AD :1017E0000A46042108B5FFF7B1FF80F00100C0B23E :1017F000404208BD074B0A4630B41978064B53F8EF :101800002140014623682046DD69044BAC4630BCCC -:10181000604700BF3C6400201C230020A08601001C -:1018200070B50A4E00240A4D04F0ACFB30802868E5 -:101830003388834208D904F0A1FB2B6804440133A8 -:10184000B4F5003F2B60F2D370BD00BF3E640020B2 -:10185000F863002004F064BC00F1006000F5003083 +:10181000604700BFDC6300201C230020A08601007D +:1018200070B50A4E00240A4D04F020FC3080286870 +:101830003388834208D904F015FC2B680444013333 +:10184000B4F5003F2B60F2D370BD00BFDE63002013 +:101850009863002004F0D8BC00F1006000F500306F :101860000068704700F10060920000F5003004F05D -:10187000E5BB0000054B1A68054B1B889B1A834289 -:1018800002D9104404F07ABB00207047F8630020AE -:101890003E640020024B1B68184404F075BB00BF77 -:1018A000F8630020024B1B68184404F07FBB00BFA4 -:1018B000F86300200020704700F1FF5000F58F1002 +:1018700059BC0000054B1A68054B1B889B1A834214 +:1018800002D9104404F0EEBB00207047986300209A +:10189000DE630020024B1B68184404F0E9BB00BF64 +:1018A00098630020024B1B68184404F0F3BB00BF90 +:1018B000986300200020704700F1FF5000F58F1062 :1018C000D0F8000870470000064991F8243033B181 :1018D00000230822086A81F82430FFF7C3BF0120E3 -:1018E000704700BFFC630020014B1868704700BFC1 +:1018E000704700BF9C630020014B1868704700BF21 :1018F0000010005C194B01380322084470B51D68C4 :10190000174BC5F30B042D0C1E88A6420BD15C6847 :101910000A46013C824213460FD214F9016F4EB1C0 @@ -405,9 +405,9 @@ :101930000B4602D22C2203F8012B0424094A1688F4 :10194000AE4204D1984284BF967803F8016B013C03 :1019500002F10402F3D1581A70BD00BF0010005C00 -:1019600024230020747B00087047000070470000AB +:10196000242300203C8000087047000070470000DE :101970007047000070B504464FF47A764CB1412CA4 -:10198000254628BF412506FB05F0641B03F0CCFF6C +:10198000254628BF412506FB05F0641B04F040F8FE :10199000F4E770BD002310B5934203D0CC5CC4546F :1019A0000133F9E710BD0000013810B510F9013F0F :1019B0003BB191F900409C4203D11AB10131013A87 @@ -422,1652 +422,1722 @@ :101A40009044E4B2F6B2082E85F82460DBD1FFF7AB :101A50003BFF0028D7D108E02B6A03EB82038342C7 :101A6000CFD0FFF731FF0028CBD10020BDE8F883AD -:101A70000120FBE7FC630020024B1A78024B1A702E -:101A8000704700BF3C6400201823002038B51A4C72 -:101A90001A4D204603F08CFA2946204603F0B4FA8A +:101A70000120FBE79C630020024B1A78024B1A708E +:101A8000704700BFDC6300201823002038B51A4CD3 +:101A90001A4D204603F0DCFA2946204603F004FBE9 :101AA0002D684FF47A70D5F89020D2F8043843F0BE :101AB0000203C2F80438FFF75DFF1149284603F01E -:101AC000B1FBD5F890200F4DD2F80438286823F0E8 +:101AC00001FCD5F890200F4DD2F80438286823F097 :101AD00002030D49A042C2F804384FF4E1330B6011 -:101AE00001D003F0C3F96868A04204D00649BDE8FC -:101AF000384003F0BBB938BDB86B0020347E000815 -:101B00003C7E00081C230020246400200C4B70B590 +:101AE00001D003F013FA6868A04204D00649BDE8AB +:101AF000384003F00BBA38BD586B0020FC82000858 +:101B0000048300081C230020C46300200C4B70B524 :101B10000C4D04461E780C4B55F826209A420DD0E9 :101B20000A4B002118221846FFF75AFF04600146AD -:101B300055F82600BDE8704003F098B970BD00BFAD -:101B40003C6400201C230020B86B0020246400208B -:101B5000F0B5A1B071B600230120002480261A46FA -:101B6000194602F05BFE4FF4D067214A3D25136908 -:101B700023BBD2F810310BBB036804F100619960FC -:101B80000368C3F80CD003685E6003681F600168D7 -:101B90000B6843F001030B6001680B6823F01E0320 -:101BA0000B6001680B68DB07FCD4037B8034416861 -:101BB00005FA03F3B4F5001F0B60D8D102F06EFEF6 -:101BC000B4F5001F11D000240A4E0B4D012004F083 -:101BD000A7FA3388A34205D928682044013404F0C9 -:101BE000E5F9F6E7002004F09BFA61B621B0F0BDFC -:101BF000002000523E640020F86300202DE9F047E9 -:101C00000D46044600219046284640F27912FFF71F -:101C1000E7FE234620220021284604F1220702F095 -:101C200035F9231D022220212846C02602F02EF974 -:101C3000631D03222221284602F028F9A31D032256 -:101C40002521284602F022F904F108031022282158 -:101C5000284602F01BF904F1100308223821284617 -:101C600002F014F904F1110308224021284602F081 -:101C70000DF904F1120308224821284602F006F962 -:101C800004F1140320225021284602F0FFF804F149 -:101C9000180340227021284602F0F8F804F12003CE -:101CA0000822B021284602F0F1F804F121030822AD -:101CB000B821284602F0EAF8314608363B460822A9 -:101CC0002846013702F0E2F8B6F5A07FF4D10027EC -:101CD00004F1330A04F1320308223146284602F0A7 -:101CE000D5F894F832304FEAC7099F4209F5A47637 -:101CF00015D3B8F1000F08D1314609F24F1604F59B -:101D000099730722284602F0C1F827463B1B94F836 -:101D1000322193420CD3F01DC008BDE8F0870AEBD6 -:101D20000703082231462846013702F0AFF8D8E70A -:101D300007F233133146082228460836013702F0ED -:101D4000A5F8E3E713B50446084600212022234600 -:101D500001900160C0F8031002F098F8231D01986B -:101D60000222202102F092F8631D01980322222111 -:101D700002F08CF8A31D01980322252102F086F8B9 -:101D8000019804F108031022282102F07FF80720AF -:101D900002B010BD0023F7B50E46047F0722009164 -:101DA0001946054601F036FF731C012207210093F6 -:101DB0002846002301F02EFFC4B9B31C05220821D8 -:101DC0002846009323460D2401F024FF3746BB1B11 -:101DD000B278934211D307342B7FA88AE408BBB9A9 -:101DE000844294BF0020012003B0F0BDAB8A0824D8 -:101DF000DB00083BDB08B370E8E7FB1C2146082248 -:101E00002846009300230834013701F003FFDEE782 -:101E1000201A18BF0120E7E70023F7B50E46047F1C -:101E2000082200911946054601F0F4FE731CC4B95E -:101E300008220093234610241146284601F0EAFEAA -:101E400001235F1C7278013B934211D307342B7F2F -:101E5000A88AE408BBB9844294BF0020012003B0E3 -:101E6000F0BDAB8A0824DB00083BDB087370E7E7B2 -:101E7000F3192146082228460093002301F0CAFEE8 -:101E800008343B46DDE7201A18BF0120E7E70000D1 -:101E9000F8B50E4605461446002181223046FFF76C -:101EA0009FFD2B4608220021304601F0EFFF7CB950 -:101EB0000F246B1C07220821304601F0E7FF0123A5 -:101EC0005F1C6A78013B934204D3E01DC008F8BD53 -:101ED0000824F4E7EB1921460822304601F0D6FF2A -:101EE00008343B46ECE70000F8B50E4605461446BC -:101EF0000021CE223046FFF773FD2B462822002119 -:101F0000304601F0C3FF7CB9302405F108030822F4 -:101F10002821304601F0BAFF2F467B1B2A7A9342D4 -:101F200004D3E01DC008F8BD2824F5E707F1090334 -:101F30002146082230460834013701F0A7FFECE7BC -:101F4000F7B5047F0E4600910123102200210546BB -:101F500001F060FEC4B9B31C092210212846009389 -:101F60002346192401F056FE37467288BB1B9A425D -:101F700011D807342B7FA88AE408BBB9844294BFE8 -:101F80000020012003B0F0BDAB8A1024DB00103B21 -:101F9000DB087380E8E73B1D2146082228460093B2 -:101FA00000230834013701F035FEDEE7201A18BFA0 -:101FB0000120E7E730B50A44084D91420DD011F8F1 -:101FC000013B5840082340F30004013B2C4013F030 -:101FD000FF0384EA5000F6D1EFE730BD2083B8ED6F -:101FE000F7B5364A6B46106851686A4603C3082342 -:101FF0003349344805F06AFD044690BB0A25324A4D -:102000006B46106851686A4603C308232F492D4860 -:1020100005F05CFD0446002847D00369B3F5F01FC6 -:1020200043D8B0F86620B2F5AF6F3ED1284A0244DB -:1020300002F15C018B4238D35C3B224900209E1A9E -:10204000FFF7B8FF04F16401074632460020FFF7AE -:10205000B1FFA3689F4228D1E368984208BF0025DA -:1020600023E00369B3F5F01F26D8428BB2F5AF6FBA -:1020700020D1174A024402F110018B4218D3103BC1 -:10208000104900209D1AFFF795FF04F1180106463C -:102090002A460020FFF78EFFA3689E4202D1E36824 -:1020A000984201D00D25AAE70025284603B0F0BDCF -:1020B0001025A4E70C25A2E70B25A0E7847B0008E8 -:1020C000DCFF1D00000002088D7B000890FF1D0052 -:1020D0000800FEF710B5037C044613B9006805F04C -:1020E000DDFC204610BD00000023BFF35B8FC36002 -:1020F000BFF35B8FBFF35B8F8360BFF35B8F704772 -:10210000BFF35B8F0068BFF35B8F704770B5054608 -:102110000C30FFF7F5FF044605F108063046FFF7DF -:10212000EFFFA04206D96D683046FFF7E9FF25446E -:10213000281A70BD3046FFF7E3FF201AF9E70000C8 -:1021400070B505464068A0B105F10C0605F1080020 -:10215000FFF7D6FF04463046FFF7D2FF844204F172 -:10216000FF34304694BF6D680025FFF7C9FF2C444B -:10217000201A70BD38B50C460546FFF7C7FFA042D0 -:1021800010D305F10800FFF7BBFF04446868BFF3F4 -:102190005B8FB4FBF0F100FB11440120AC60BFF396 -:1021A0005B8F38BD0020FCE72DE9F041144607465F -:1021B0000D46FFF7C5FF844228BF0446D4B1B84698 -:1021C00058F80C6B4046FFF79BFF304428604046B0 -:1021D0007E68FFF795FF331A9C4203D801206C609C -:1021E000BDE8F081A41B6B603B682044AB60E860F5 -:1021F0000220F5E72046F3E738B50C460546FFF721 -:102200009FFFA04210D305F10C00FFF779FF0444B3 -:102210006868BFF35B8FB4FBF0F100FB1144012051 -:10222000EC60BFF35B8F38BD0020FCE72DE9FF4178 -:102230008846694607466C46FFF7B6FF002506B29A -:1022400004EBC606B4420AD0626808EB05012068B8 -:102250000834FFF79FFB54F8043C1D44F2E729467D -:102260003846FFF7C9FF284604B0BDE8F0810000FA -:10227000F8B505460C300F46FFF742FF05F108069A -:1022800004463046FFF73CFFA042304688BF6C68EA -:10229000FFF736FF201A386020B12C683046FFF770 -:1022A0002FFF2044F8BD000073B5144606460D46C6 -:1022B000FFF72CFF8442019028BF0446DCB101A93E -:1022C0003046FFF7D5FF019B33B93268C5E90233C9 -:1022D000C5E9002401200CE09C42286038BF01942D -:1022E000019884426860F5D93368241A0220AB60F3 -:1022F000EC6002B070BD2046FBE700002DE9FF4115 -:102300000F4669466C46FFF7CFFF00B2002604EB8C -:10231000C005AC4209D0D4F80480B81954F8081BA1 -:1023200042464644FFF736FBF3E7304604B0BDE8CB -:10233000F081000038B50546FFF7E0FF044601468E -:102340002846FFF717FF204638BD00007047000001 -:1023500010B41346026814680022A4465DF8044BCA -:102360006047000000F5805090F859047047000065 -:1023700000F5805090F852047047000000F580503E -:1023800090F95804704700004E207047302383F3C3 -:10239000118800F58052D2F89C34D2F89804184481 -:1023A000D2F894341844D2F87C341844D2F88C34DF -:1023B0001844D2F888341844002383F311887047F6 -:1023C00000F58050C0F85414012070472DE9F04FFB -:1023D0000C4600F5805185B01F4691F852340546F1 -:1023E0009046BDF838909BB1D1F878340133C1F8EC -:1023F00078342368980006D4237B082B0BD9627BA2 -:102400000AB10F2B07D9D1F87C340133C1F87C34E1 -:102410004FF0FF3010E0302383F31188EB6AD3F8DC -:10242000C42012F4001B0AD0D1F8803400200133FC -:10243000C1F8803480F3118805B0BDE8F08F2068C2 -:102440004822D3F8C4300028C3F3044A6B6AB4BFEF -:1024500040F08040800412FB0A334FEA4A161860AD -:10246000226852004FEA0A6244BF40F000501860F0 -:10247000207B42EA00425A60607B10B342F4401273 -:102480005A60D1F8B0240132C1F8B024AA1902F57B -:102490008352117B41F020011173207B039300F0E4 -:1024A000E3FF0330039B80105FFA8BF20BF1010B0B -:1024B00082420DDA04EB820103EB820249689160EB -:1024C000F2E7AA1902F58352117B60F34511E3E7A5 -:1024D0000122EB6A05EB4A1102FA0AF201F5825178 -:1024E000C3F8D020AB19183104F10C0203F5825364 -:1024F000C3E90487234653F8040B934241F8040BC5 -:10250000F9D11B882E440B8041F2680346F803A0E2 -:1025100006F5805609F0030396F86C2043F010038B -:1025200022F01F02134386F86C30002383F31188D6 -:1025300042463B4621462846CDF8009000F05AFF1F -:10254000012079E72DE9F04700F58056044696F81A -:102550005254002D40F00381037C032B40F0948003 -:1025600028462B462F465FFA80FC944510DA01EB93 -:10257000CC0E51F83CC0BCF1000F04DBDEF804C007 -:10258000BCF1000F02DB01370130ECE70133FBE760 -:10259000302080F31188E06AF3B9D0F8803043F03E -:1025A0000203C0F880304E23E06A002F6FD1D0F8CC -:1025B000803043F00103C0F880306A4B6A4A1B68E0 -:1025C00003F1805303F52C539B009342A36240F226 -:1025D000B080664800F0E6FE4D2B42D8DFF88481DB -:1025E0004FEA034EDFF88891D8F800C04EEA8C0E0F -:1025F000C0F884E00CF1805000F52C508000606140 -:1026000003EB0C00D4F82CC0C3F14E03C8F8000053 -:10261000DCF8800040F03000CCF880004FF0000C77 -:10262000D4F81480E6465FFA8CF08242BCDD01EB00 -:10263000C00A51F83000002810DBDAF804A0BAF123 -:10264000000F0BDA09EA00400AF07F0A40EA0A00AC -:1026500040F0084048F82E000EF1010E0CF1010C7C -:10266000E1E7836923F00103836100F0A1FE0646E0 -:10267000E36A9B69D90704D500F09AFE831BFA2B05 -:10268000F6D9002383F311882846BDE8F087B7EB1D -:10269000530F3DD2DFF8CCE04FEA074CDEF80030B4 -:1026A0004CEA830CC0F888C003F1805003EB470369 -:1026B000002700F52C50CEF80030BC468000A06109 -:1026C000E06AD0F8803043F00C03C0F88030D4F8D2 -:1026D00018E0FBB29A427FF770AF51F8330001EB7C -:1026E000C3080028D8F8043001DB002B0EDB20F0F3 -:1026F000604023F0604340F0005043F000434EF848 -:102700003C000EEBCC000CF1010C43600137E0E71C -:10271000836923F00103836100F04AFE0646E36A01 -:102720009B69DA07ADD500F043FE831BFA2BF6D97F -:10273000A7E7E26A936923F00103936100F038FE92 -:102740000746E36A9B69DB0705D500F031FEC31B32 -:10275000FA2BF6D995E7012586F8525491E7002522 -:1027600092E700BF4C640020FCB50040987B000855 -:102770000000FF0713B500F580540191606CFFF76E -:10278000DFFC1F280AD920220199606CFFF74EFD5B -:10279000A0F120035842584102B010BD0020FBE7D1 -:1027A00008B5302383F3118800F58050406CFFF7A3 -:1027B0009BFC002383F3118808BD00000022026007 -:1027C00082814260826070470022002310B5C0E918 -:1027D0000023002304460C3020F8043CFFF7EEFFF2 -:1027E000204610BD2DE9F0479A4688B00746884636 -:1027F0009146302383F3118807F580546846FFF72C -:10280000E3FF606CFFF782FC1F282ED92022694667 -:10281000606CFFF78FFD202827D194F8523423B342 -:1028200003AD444605AB2E46083403CE9E4244F821 -:10283000080C44F8041C3546F5D130682060B38894 -:10284000A380DDE90023C9E90023BDF80830AAF818 -:102850000030002383F3118853464A4641463846E8 -:1028600008B0BDE8F04700F0B3BD002080F3118848 -:1028700008B0BDE8F08700002DE9F84F00230646B8 -:1028800000F58154054688461034C0E90133274BD2 -:1028900046F8303B374638462037FFF795FFA742CA -:1028A000F9D105F580544FF4805305F5A3594FF045 -:1028B000000A26630026676405F5835709F11009AD -:1028C0004FF0000B1037E663C4E90D36012384F89E -:1028D000403084F84830A7F11800203747E910ABA2 -:1028E000FFF76CFF47F8286C4F45F4D1B8F1010FA2 -:1028F00084F85884A4F85A64A4F85C64A4F85E646C -:1029000084F86064A4F86264A4F86464A4F866645B -:1029100084F8686402D9064800F044FD054B284657 -:1029200053F82830EB62BDE8F88F00BFE87B000861 -:10293000BC7B0008D87B0008044B10B5197804460E -:102940004A1C1A70FFF798FF204610BD496400200A -:102950002DE9F04300295AD02E4E2F48B6FBF1F452 -:1029600081428CBF0A201120431EB4FBF0F700FB0C -:102970001740DDB220B1022B1846F5D8002032E016 -:102980007B1EB3F5806F2ED2C5EBC5084FF47A736A -:1029900008F103044FEAE40EC4F3C7040EF1010981 -:1029A000281B0EFB033E5FFA80FC59FA80F0BEFB49 -:1029B000F0F0B0F5617F18DC83B2601C5CFA80F047 -:1029C0007843B6FBF0F08142D8D1611E0F29D5D8EB -:1029D0000CF1FF310729D1D80120138057801071E5 -:1029E000547182F806C0BDE8F08308F1FF34E010AE -:1029F000C4F3C70400F1010E2D1B00FB03335FFA83 -:102A000085FC5EFA85F5B3FBF5F39BB2D5E7084686 -:102A1000E9E700BF00B4C4043F420F0030B50D4BDE -:102A200005200D4D1C786C438C420ED15978012045 -:102A3000518099785171D9789171197911715B79B7 -:102A400003EB83035B00138030BD013803F1060301 -:102A5000E8D1F9E7287C000840420F0038B540F281 -:102A60007772C36A154CC3F8BC200722C36AC3F847 -:102A7000C8202268C16A930043F4C023C1F8A03083 -:102A800002F1805302F16C01C56A03F52C53EA325E -:102A900089009B00226041F0E061094AC361C5F8EA -:102AA000C01003F5D87103F56A73416293428362E3 -:102AB00002D9044800F076FC38BD00BF4C64002009 -:102AC000FCB50040987B00082DE9F04F00F58055DB -:102AD0001F4689B0044695F8583489469046022B23 -:102AE00004D90026304609B0BDE8F08FA84A52F854 -:102AF000231009B942F82300A648C4F80C900178C5 -:102B00002774C9B9302383F31188A34BD3F8EC2081 -:102B100042F48072C3F8EC20D3F8942042F480721F -:102B2000C3F89420D3F8942022F48072C3F8942040 -:102B30000123037081F3118895F851347BB9302358 -:102B400083F31188954A95F85834D35C0BB3012B65 -:102B500028D0012385F85134002383F311883023D2 -:102B600083F31188E26A936923F01003936100F004 -:102B70001FFC8246E36A9E6916F0080619D000F031 -:102B800017FCA0EB0A03FA2BF4D9002686F3118870 -:102B9000A8E70321132001F09DFF0321152001F078 -:102BA00099FFD6E70321142001F094FF032116209A -:102BB000F5E79A6942F001029A6100F0F9FB82465A -:102BC000E36A9A69D00706D400F0F2FBA0EB0A038F -:102BD000FA2BF5D9D9E79A694FF0000A42F00202C0 -:102BE0009A61E36AC3F854A08AF3118804F5825B02 -:102BF000686CFFF779FA0BF1100B20220021684670 -:102C0000FEF7EEFE02A8FFF7D9FD6A460BEB0603BE -:102C10000DF1180ECDF818A094460833BCE8030057 -:102C2000F44543F8080C43F8041C6246F4D1DCF880 -:102C3000000020361860B6F5806F9CF804201A71E9 -:102C4000DBD1002304F5A252494620461A3285F80A -:102C5000503485F85334FFF77BFE064690B9E26A9C -:102C6000936923F00103936100F0A2FB0546E36A38 -:102C70009B69D9077FF535AF00F09AFB431BFA2B10 -:102C8000F5D92EE795F85E34C5F86C94591E95F881 -:102C90005F34E26A013B1B0243EA416395F860142A -:102CA00001390B43B5F85C14013943EA0143D361A0 -:102CB000B8F1000F36D004F5A35241462046023247 -:102CC000FFF7ACFE90B9E26A936923F001039361C8 -:102CD00000F06EFB0546E36A9B69DA077FF501AFFA -:102CE00000F066FB431BFA2BF5D9FAE695F867244A -:102CF000C5F87084511E95F86824E36A013A120100 -:102D000042EA012295F8661401390A43B5F86414C1 -:102D1000013942EA014242F40002DA604FF42062D3 -:102D2000E36A9A64E36A4FF000082046C3F8BC8067 -:102D3000FFF794FE85F859846FF04042E36A1A6504 -:102D4000174AE36A5A654FF00222E36A9A654FF028 -:102D5000FF32E36AC3F8E0200322E36A9742DA65B0 -:102D60003FF4C0AEE26A936923F00103936100F07F -:102D70001FFB0746E36A9B69DB0705D500F018FBDC -:102D8000C31BFA2BF6D9ACE6012385F85234A9E629 -:102D9000406400204864002000440258D07B0008B2 -:102DA000550200022DE9F04F054689B0904699463C -:102DB000002741F2680A00F58056EB6AD3F8D83054 -:102DC000FB40D80751D505EB47124FEA471B524449 -:102DD0001379190749D4D6F884340133C6F88434FA -:102DE00005F5A553C3E9008913799A0605EB0B0293 -:102DF00048BFD6F8B434524444BF0133C6F8B434A3 -:102E0000137943F008031371DB0723D596F8533485 -:102E100003B305F582546846FFF7D6FC03AB1834BC -:102E20005C4404F1080C2068083454F8041C1A4669 -:102E3000644503C21346F6D12068694610602846EF -:102E4000A2889A800123ADF808302B68CDE900896B -:102E5000DB6B9847D6F8A834D6F854040133C6F88B -:102E6000A83410B103681B6998470137202FA4D1FB -:102E700009B0BDE8F08F00002DE9F04F0F468DB08E -:102E8000044600F097FA82468946002F5BD1E36A38 -:102E9000D3F8A02012F4FE0F03D100200DB0BDE83E -:102EA000F08FD3F8A420920141BF04F58051D1F8EE -:102EB00098240132C1F89824D3F8A4205606ECD007 -:102EC000D3F8A450E669C5F305254823E8464FF03A -:102ED000000B03FB05664046FFF770FC32685100AB -:102EE0004ABF22F06043C2F38A4343F0004392009A -:102EF00048BF43F080430093736813F400131BBF73 -:102F0000012304F580528DF80D308DF80D301EBF71 -:102F1000D2F8B8340133C2F8B834F38803F00F03A1 -:102F20008DF80C309DF80C0000F09EFA5FFA8BF3E0 -:102F3000984225D9F2180CA90BF1010B127A0B4417 -:102F400003F82C2CEEE7012FA7D1E36AD3F8B020C9 -:102F500012F4FE0FA1D0D3F8B420950141BF04F5BF -:102F60008051D1F898240132C1F89824D3F8B420C4 -:102F7000500692D0D3F8B450266AC5F30525A4E7CD -:102F8000EFB9E36AC3F8A85004A807ADFFF71CFC2B -:102F900098E80F0007C52B800023204604A9ADF850 -:102FA0001830236804F58054DB6BCDE904A99847F9 -:102FB00058B1D4F890340133C4F890346EE7012F3F -:102FC000E2D1E36AC3F8B850DEE7D4F894340120C4 -:102FD0000133C4F8943461E72DE9F04105460F460A -:102FE00000F58054012639462846FFF745FF10B109 -:102FF00084F85364F7E7D4F8A834D4F854040133C0 -:10300000C4F8A83420B10368BDE8F0411B69184733 -:10301000BDE8F081C36AF0B51A6C12F47F0F2BD0B3 -:103020001B6C00F5805441F268054FF0010CC4F8A8 -:10303000AC340023471900EB43125E012A44117996 -:1030400011F0020F15D0490713D4B959C66A0CFA0A -:1030500001F1D6F8CCE011EA0E0F0AD0C6F8D41070 -:10306000117941F004011171D4F88C240132C4F8B3 -:103070008C240133202BDED1F0BD00002B4B70B52A -:103080001E561B5C012B30D8294D2A4A55F8233097 -:1030900052F8264013B349B3236D9A0510D54FF467 -:1030A0000073236500F086F950EA01020B4602D056 -:1030B000013861F10003024655F82600FFF772FE61 -:1030C000236D9B012CD54FF0007255F826302265F8 -:1030D00003F58053012283F8592421E0012323655D -:1030E000102323654FF48053236570BD236DDA07E9 -:1030F00002D4236D5B0706D50523002155F8260071 -:103100002365FFF769FF236DD80602D4236D5906A6 -:1031100006D55023012155F826002365FFF75CFFF3 -:1031200055F82600BDE87040FFF774BFD47B000857 -:1031300040640020D87B000808B5302383F3118851 -:10314000FFF768FF002383F3118808BDC36AD3F833 -:10315000C00010F07C5005D0D3F8C40080F40010FB -:10316000C0F340507047000008B5302383F3118846 -:1031700000F58050406CFEF7C9FF002383F31188EF -:1031800043090CBF0120002008BD000000F580535A -:1031900093F8592462B1C16A8A6922F001028A61F6 -:1031A000D3F89C240132C3F89C24002283F85924CC -:1031B000704700002DE9F743302181F3118800F5B5 -:1031C0008251002541F2680E4FF00108103100F5E0 -:1031D000805C00EB45147444267977071CD4F6060E -:1031E0001AD58E69D0F82C9008FA06F6D9F8CC706A -:1031F0003E4211D04F6801970F689742019F9F414F -:103200000AD2C9F8D460267946F004062671DCF8A3 -:1032100088440134CCF8884401352031202DD8D1A0 -:10322000002383F3118803B0BDE8F083F8B51E4690 -:1032300000230F46054613701446FFF795FF80F0F4 -:10324000010038701EB12846FFF780FF2070F8BDDE -:103250002DE9F04F85B099460D468046164691F807 -:1032600000B0DDE90EA302931378019300F0A2F8F9 -:103270002B7804460F4613B93378002B41D02246F1 -:103280003B464046FFF796FFFFF756FFFFF77EFFEE -:103290004B4632462946FFF7C9FF2B7833B1BBF1C5 -:1032A000000F03D0012005B0BDE8F08F337813B1D3 -:1032B000019B002BF6D108F5805303935445029BE4 -:1032C00077EB03031DD2039BD3F85404C8B1036802 -:1032D000AAEB04011B6898474B46324629464046F4 -:1032E000FFF7A4FF2B7813B1BBF1000FDAD13378CD -:1032F00013B1019B002BD5D100F05CF804460F46BA -:10330000DCE70020CFE70000002108B50846FFF702 -:10331000B5FEBDE8084001F06DB8000008B5012118 -:103320000020FFF7ABFEBDE8084001F063B80000E5 -:1033300008B500210120FFF7A1FEBDE8084001F01B -:1033400059B80000012108B50846FFF797FEBDE80F -:10335000084001F04FB8000000B59BB0EFF30981C1 -:1033600068226846FEF716FBEFF30583014B9B6B63 -:10337000FEE700BF00ED00E008B5FFF7EDFF00003D -:1033800000B59BB0EFF3098168226846FEF702FBA7 -:10339000EFF30583014B5B6BFEE700BF00ED00E040 -:1033A000FEE700000FB408B5029802F063FAFEE7EA -:1033B00002F0F8BE02F0DABE13B56C46031D84E8D5 -:1033C000060094E8030083E80500012002B010BD68 -:1033D00073B58568019155B11B885B0707D4D0E9A7 -:1033E00000369B6B9847019AC1B23046A84701202E -:1033F00002B070BDF0B5866889B005460C465EB176 -:10340000BDF838305B070AD4D0E900379B6B98478A -:103410002246C1B23846B047012009B0F0BD0022B3 -:10342000002301F10806CDE9002300230A46ADF888 -:10343000083003AB1068083252F8041C1C46B24234 -:1034400003C42346F6D1106820609288A280FFF75B -:10345000B1FF0423ADF808302B68CDE90001DB6B28 -:10346000694628469847D7E7082817D909280CD075 -:103470000A280CD00B280CD00C280CD00D280CD00E -:103480000E2814BF4020302070470C2070471020B9 -:1034900070471420704718207047202070470000A4 -:1034A0002DE9F041456A15B94162BDE8F0814B68EC -:1034B000AC4623F06047C3F38A464FEAD37EC3F39A -:1034C000807816EA230638BF3E462B465A68BEEB84 -:1034D000D27F22F060440AD0002A18DAA40CB44249 -:1034E00017D19D420FD10D60DEE71346EEE7A742EC -:1034F00007D102F08044C2F3807242450BD054B130 -:10350000EFE708D2EDE7CCF800100B60CDE7B4424E -:1035100001D0B442E5D81A689C46002AE5D119606A -:10352000C3E700002DE9F047089D01F0070400EB18 -:10353000D1004FF47F494FEAD508224405F0070532 -:10354000944201D1BDE8F08704F0070705F0070AAF -:10355000111B08EBD50E57453E4613F80EC038BF79 -:103560005646C6F108068E4228BF0E46E108415C69 -:1035700034443544B94029FA06F721FA0AF1FFB27A -:103580008CEA010147FA0AF739408CEA010C03F88A -:103590000EC0D5E780EA0120082341F2210201B2E2 -:1035A000013B4000002980B2B8BF504013F0FF0338 -:1035B000F5D1704738B50C468D18A54200D138BDFD -:1035C00014F8011BFFF7E6FFF7E7000042684AB175 -:1035D000136881894360438901339BB299424381D7 -:1035E00038BF83811046704770B588B004462022EA -:1035F0000D4668460021FEF7F3F920460495FFF7D3 -:10360000E5FF024660B16B46054608AE1C4608352C -:1036100003CCB44245F8080C45F8041C2346F5D108 -:10362000104608B070BD0000082817D909280CD032 -:103630000A280CD00B280CD00C280CD00D280CD04C -:103640000E2814BF4020302070470C2070471020F7 -:1036500070471420704718207047202070470000E2 -:10366000082817D90C280CD910280CD914280CD9E3 -:1036700018280CD920280CD930288CBF0F200E20F8 -:103680007047092070470A2070470B2070470C20B4 -:1036900070470D20704700002DE9F843078C044661 -:1036A000072F1ED900254FF6FF73D0E90298C5F108 -:1036B0002006A5F1200029FA05F1083508FA06F6DA -:1036C00028FA00F0314301431846C9B2FFF762FF00 -:1036D000402D0346EBD13A46E169BDE8F843FFF7D8 -:1036E00069BF4FF6FF70BDE8F883000010B54B6866 -:1036F00023B9CA8A63F30902CA8210BD04691A6831 -:103700001C600361C38A013BC3824A60EFE700008B -:103710002DE9F84F1D46CB8A0F468146C3F30901B8 -:10372000924605290B4630D00020AAB207F11A04B0 -:103730009EB21FFA80F8042E0FD8904503F10103C2 -:1037400006D30A44FB8A62F309030120FB821AE0D4 -:103750001AF800600130E654EAE79045F1D2A1F191 -:10376000050B1C237C68BBFBF3F203FB12BB1FFAA7 -:103770008BF6002C45D14846FFF728FF044638B9A0 -:1037800078606FF00200BDE8F88F4FF00008E6E7C0 -:10379000002606607860ADB24FF0000B454510D9A9 -:1037A0000AEB0803221D13F8011B08F101089155CB -:1037B000B1B21FFA88F81B292BD0454506F1010646 -:1037C000F1D8FB8AC3F30902154465F30903BCE78A -:1037D00001321C4692B22368002BF9D16B1F0B44B7 -:1037E0001C21B3FBF1F301339BB29A42D3D2BBF15C -:1037F000000FD0D14846FFF7E9FE20B9C4F800B069 -:10380000BFE70122E7E7C0F800B05E46206004464B -:10381000C1E74545D5D94846FFF7D8FE08B920602D -:10382000AFE7C0F800B0002620600446B6E700000D -:103830002DE9F04F1C46074688462DED028B83B0DC -:103840005B690192002B00F09A80238C2BB1E26916 -:10385000002A00F09480072B35D807F10C00FFF701 -:10386000B5FE054638B96FF00205284603B0BDEC39 -:10387000028BBDE8F08F14220021FEF7B1F8228CF4 -:10388000E16905F10800FEF785F8208C48F0004159 -:10389000013080B2FFF7E4FEFFF7C6FE013880B2C8 -:1038A00020840130287438466369228C1B782A44AE -:1038B00003F01F0363F03F03137269602946FFF7AB -:1038C000EFFD0125D1E74FF0000900F10C034FF0A7 -:1038D000800A4E464D4608EE103A18EE100AFFF7E1 -:1038E00075FE83460028BED014220021FEF778F82A -:1038F000002E3AD1019B0222ABF808300BF1080EE2 -:103900001FFA82FC218C0CF10100BCF1060F80B281 -:1039100001D88E422BD3FFF7A3FE8E4208BF4FF093 -:10392000400AFFF781FE62690138013512781BFAFF -:1039300080F1013002F01F022DB242EA491289F0F3 -:1039400001094AEA020A48F0004281F808A05946F3 -:103950008BF810003846CBF804204FF0000AFFF730 -:103960009FFD238CB342B8D17FE70022C6E7E1690F -:10397000895D01360EF80210B6B20132C0E76FF071 -:10398000010572E7F8B515460E46302200210446BF -:103990001F46FEF725F8069BB5F5001FA76063607C -:1039A00004F11000079B34BF6A094FF6FF72E6610D -:1039B000A362002397B29A4206D800230360A7822D -:1039C000E3822383E360F8BD06600133304620368E -:1039D000F1E7000003781BB94BB2002BC8BF0170A0 -:1039E0007047000000787047F8B50C46C969074673 -:1039F00011B9238C002B37D1257E1F2D34D8387870 -:103A000028BB228C072A2CD8268A36F003032BD118 -:103A10004FF6FF70FFF7CEFD20F0010031024FF6A8 -:103A2000FF72400441EA0561400C41EA402523460B -:103A300029463846FFF7FCFE002807DD6269137847 -:103A40000133DBB21F2B88BF00231370F8BD218A1E -:103A50002D0645EA012505432046FFF71DFE0246D7 -:103A6000E5E76FF00300F1E76FF00100EEE700001B -:103A700070B58AB0044616460021282268461D46C5 -:103A8000FDF7AEFFBDF8383069462046ADF810307E -:103A90000F9B05939DF840308DF81830119B0793CC -:103AA000BDF84830CDE90265ADF82030FFF79CFF46 -:103AB0000AB070BD2DE9F041D36905460C461646A3 -:103AC0000BB9138C5BBB377E1F2F28D895F800806D -:103AD000B8F1000F26D03046FFF7DEFD3378210223 -:103AE0000246284641EAC331338A41EA080141EAE5 -:103AF000076141EA0341334641F08001FFF798FE38 -:103B000000280ADD3378012B07D17269137801335D -:103B1000DBB21F2B88BF00231370BDE8F0816FF06C -:103B20000100FAE76FF00300F7E70000F0B58BB093 -:103B300004460D4617460021282268461E46FDF71A -:103B40004FFF9DF84C30294620465A1E53425341A0 -:103B50006A468DF800309DF84030ADF81030119B6A -:103B600005939DF848308DF81830149B0793BDF8E5 -:103B70005430CDE90276ADF82030FFF79BFF0BB053 -:103B8000F0BD0000406A00B104307047436A1A6813 -:103B9000426202691A600361C38A013BC3827047B3 -:103BA0002DE9F041D0F8208014461D46184E4146BC -:103BB000002709B9BDE8F081D1E90223A21A65EB1B -:103BC0000303964277EB03031ED2036A8B420DD1A7 -:103BD000FFF78CFD036A1B68036203690B60C38AED -:103BE0000161013B016AC3828846E2E7FFF77EFD7F -:103BF0000B68C8F8003003690B60C38A0161013BA0 -:103C0000C382D8F80010D4E788460968D1E700BF1E -:103C100080841E002DE9F04F8BB00D4614469B4664 -:103C2000DDF850908046002800F01881B9F1000FAF -:103C300000F01481531E3F2B00F21081012A03D1A2 -:103C4000BBF1000F40F00A810023CDE90833B8F83A -:103C50001430B5EBC30F4FEAC30703D300200BB0FA -:103C6000BDE8F08F2B199F42D8F80C3036BF7F1B70 -:103C70002746FFB21BB9D8F81030002B7AD0272D79 -:103C80004DD8C5F1280600232946B742009308AB5A -:103C9000D8F808002CBFF6B23E46A7EB060A35441A -:103CA00032465FFA8AFAFFF73DFCB8F81430282153 -:103CB00003F10053053BDB000493D8F80C30039369 -:103CC000039B13B1BAF1000F2CD1D8F8100040B10A -:103CD000BAF1000F05D008AB5246691A0096FFF7FB -:103CE00021FC38B2002FB9D066070AD00AAB624275 -:103CF00003EBD40102F0070211F8083C134101F86C -:103D0000083C082C3DD9102C40F2B580202C40F204 -:103D1000B780BBF1000F00F09C80082335E0BA4665 -:103D20000026C2E7049BE02B28BFE02306930B4448 -:103D3000AB42059315D95A1B0398691A0096924510 -:103D400008AB00F1040034BF5246D2B20792FFF72D -:103D5000E9FB079A1644AAEB020A1544F6B25FFA89 -:103D60008AFA049B069A05999B1A0493039B1B6885 -:103D70000393A5E700933A4608AB2946D8F8080014 -:103D8000ADE7BBF1000F13D00123B4EBC30F6BD031 -:103D9000082C12D89DF82030621E23FA02F2D507B3 -:103DA00006D54FF0FF3202FA04F423438DF8203099 -:103DB0009DF8203089F8003051E7102C12D8BDF85A -:103DC0002030621E23FA02F2D10706D54FF0FF32EF -:103DD00002FA04F42343ADF82030BDF82030A9F8EE -:103DE00000303CE7202C0FD80899631E21FA03F31A -:103DF000DA0705D54FF0FF3202FA04F40C430894B9 -:103E0000089BC9F800302AE7402C2AD0611EC4F173 -:103E10002102A4F12103DDE9086526FA01F105FA82 -:103E200002F225FA03F311431943CB0711D50122FE -:103E3000A4F12003C4F1200102FA03F322FA01F1F4 -:103E4000A2400B43524263EB430332432B43CDE981 -:103E50000823DDE90823C9E9002300E76FF001002A -:103E6000FDE66FF00800FAE6082CA1D9102CB4D9B1 -:103E7000202CEED8C4E7BBF1000FAED0022384E7BC -:103E8000BBF1000FBCD004237FE70000012A30B54E -:103E9000144638BF012485B00025402C28BF40249B -:103EA000012ACDE9025518D81B788DF80830630730 -:103EB0000AD004AB624203EBD40502F0070215F806 -:103EC000083C934005F8083C034600912246002137 -:103ED00002A8FFF727FB05B030BD082AE4D9102A55 -:103EE00003D81B88ADF80830E1E7202A95BF1B688E -:103EF000D3E900230293CDE90223D8E710B5CB68BC -:103F00001BB98B600B618B8210BD04691A681C6041 -:103F10000361C38A013BC382CA60F0E703064CBF5A -:103F2000C0F3C0300220704708B50246FFF7F6FF25 -:103F3000022806D15306C2F30F2001D100F003007E -:103F400008BDC2F30740FBE72DE9F04F93B00446EC -:103F50000D46CDE903230A681046FFF7DFFF02286C -:103F6000824614BFC2F306260026002A80F2F3819F -:103F700012F0C04940F0EF81097B002900F0EB818D -:103F8000022803D02378B34240F0E881C2F30463EF -:103F900010462944069302F07F030593FFF7C4FF00 -:103FA000059B002283464FEA8348002348EA0A48DB -:103FB00048EA4668CE78CDE90823F30948EA0008C4 -:103FC000029368D0059B024608A9204600935346F9 -:103FD0006768B847002800F0C481276A4FB9414696 -:103FE00004F10C00FFF700FB074690B96FF00200E8 -:103FF00055E03B6998450DD03F68002FF9D1414607 -:1040000004F10C00FFF7F0FA07460028EED0236A0F -:104010003B60276297F817C006F01F08CCF3840CAA -:10402000ACEB0800A8EB0C031FFA80FE0028B8BF19 -:104030000EF120001FFA83FEB8BF00B2002B0793D9 -:10404000B8BF0EF12003D7E90221BCBF1BB2079312 -:1040500052EA010338D0039B4FF0000CDFF820E355 -:104060009A1A049B63EB010196457CEB01032BD369 -:104070006B7B97F81AE0734519D1029B002B78D01F -:10408000012821DC7868F8B9DFF8F0C2944570EBBC -:10409000010316D337E0276A27B96FF00C0013B07D -:1040A000BDE8F08F3B699845B4D03F68F4E7B3486A -:1040B00090427CEB010301D30020F0E7029B002B30 -:1040C000FAD0079B0F2B17DCFA7DB3003946204648 -:1040D00002F0030203F07C031343FB75FFF706FBBA -:1040E0006B7BBB76029B3BB9FB7DC3F38402013241 -:1040F00062F38603FB75D0E76A7BBB7E9A42DBD115 -:10410000029B002B35D0B309022B32D0039B142223 -:1041100000210DA8BB60049BFB60FDF761FC039BC5 -:104120000AA920460A93049BADF83EB00B932B1DC1 -:104130008DF840A00C932B7B8DF84180013BDBB2C6 -:10414000ADF83C30069B8DF84230059B8DF843302E -:1041500094F82C3083F001038DF84430A36898471D -:10416000FB7DC3F38403013303F01F039B02FB8237 -:10417000A2E7FB7DC6F34012B2EBD31F40F0F48000 -:10418000C3F38403434540F0F280029AB6092B7BC7 -:10419000002A4DD0F2075DD4032B40F2EB80039B45 -:1041A000AE1D394604F10C00BB603246049BFB6037 -:1041B0002B7B033BDBB2FFF7ABFA00280CDA394666 -:1041C0002046FFF793FAFB7DC3F38403013303F02A -:1041D0001F039B02FB8209E7AB88DDE908843B8370 -:1041E0004FF6FF73C9F12000A9F1200228FA09F166 -:1041F00009F1080904FA00F024FA02F20143184612 -:104200001143C9B2FFF7C6F9B9F1400F0346E9D12E -:10421000B88231462A7B033AD2B2FFF7CBF9FB7D55 -:10422000B882DA43C2F3C01262F3C713FB7543E7E7 -:1042300086B92E1D013B394604F10C00DBB2324633 -:10424000FFF766FA0028BADB2A7B3146B88A013AC2 -:10425000D2B2E2E7F98A013BC1F30901DAB20429DB -:104260005BD8281D002307F11B069A4208D910F8D5 -:1042700001CB013306F801C00131DBB20529F4D1CD -:10428000039993420A9138BF043304992CBF002349 -:1042900055FA83F30B9107F11B010C9179680E938A -:1042A0000D91291DFB8AADF83EB0C3F309038DF8CB -:1042B00040A08DF841801A44069B8DF84230059B42 -:1042C000ADF83C208DF8433094F82C3083F0010396 -:1042D0008DF844300023B88A7B602A7B013AFFF7CF -:1042E00069F93B8BB882834203D1A3680AA92046AF -:1042F000984720460AA9FFF701FEFB7DBA8AC3F35F -:104300008403013303F01F039B02FB823B8B9A4221 -:104310000CBF00206FF01000C1E67B68002BAFD00F -:10432000052001E01C3033461E68002EFAD1091A20 -:104330002E1D081D184401EB090C5FFA89F3BCF12E -:104340001B0F9DD89A429BD916F8013B09F1010930 -:1043500000F8013BEFE76FF00900A0E66FF00A00FC -:104360009DE66FF00B009AE66FF00D0097E66FF098 -:104370000E0094E66FF00F0091E600BF40420F0080 -:1043800080841E00EFF30983054968334A6B22F0ED -:1043900001024A6383F30988002383F3118870477D -:1043A00000EF00E0302080F3118862B60D4B0E4A1A -:1043B000D96821F4E0610904090C0A430B49DA6069 -:1043C000D3F8FC2042F08072C3F8FC20084AC2F8FF -:1043D000B01F116841F0010111602022DA7783F8E3 -:1043E0002200704700ED00E00003FA0555CEACC591 -:1043F000001000E0302310B583F311880E4B5B688A -:1044000013F4006314D0F1EE103AEFF309844FF087 -:104410008073683CE361094BDB6B236684F3098896 -:1044200001F0F2F910B1064BA36110BD054BFBE79B -:1044300083F31188F9E700BF00ED00E000EF00E032 -:104440003F0400084204000808B5074B074A1968F2 -:1044500001F03D01996053680BB190689847BDE841 -:104460000840FFF7C7BF00BF0000024054640020AF -:1044700008B5084B1968890901F03D018A019A6065 -:10448000054AD3680BB110699847BDE80840FFF7AB -:10449000B1BF00BF000002405464002008B5084BC3 -:1044A0001968090C01F03D010A049A60054A536934 -:1044B0000BB190699847BDE80840FFF79BBF00BF6C -:1044C000000002405464002008B5084B1968890DAB -:1044D00001F03D018A059A60054AD3690BB1106A63 -:1044E0009847BDE80840FFF785BF00BF00000240C5 -:1044F0005464002008B5074B074A596801F03D0194 -:10450000D960536A0BB1906A9847BDE80840FFF73D -:1045100071BF00BF000002405464002008B5084B82 -:104520005968890901F03D018A01DA60054AD36AB8 -:104530000BB1106B9847BDE80840FFF75BBF00BFA9 -:10454000000002405464002008B5084B5968090C6B -:1045500001F03D010A04DA60054A536B0BB1906B20 -:104560009847BDE80840FFF745BF00BF0000024084 -:104570005464002008B5084B5968890D01F03D01CD -:104580008A05DA60054AD36B0BB1106C9847BDE819 -:104590000840FFF72FBF00BF000002405464002016 -:1045A00008B5074B074A196801F03D019960536C43 -:1045B0000BB1906C9847BDE80840FFF71BBF00BFE8 -:1045C000000402405464002008B5084B19688909AA -:1045D00001F03D018A019A60054AD36C0BB1106D60 -:1045E0009847BDE80840FFF705BF00BF0004024040 -:1045F0005464002008B5084B1968090C01F03D010E -:104600000A049A60054A536D0BB1906D9847BDE856 -:104610000840FFF7EFBE00BF0004024054640020D2 -:1046200008B5084B1968890D01F03D018A059A60AB -:10463000054AD36D0BB1106E9847BDE80840FFF7EF -:10464000D9BE00BF000402405464002008B5074BE7 -:10465000074A596801F03D01D960536E0BB1906E65 -:104660009847BDE80840FFF7C5BE00BF0004024000 -:104670005464002008B5084B5968890901F03D01D0 -:104680008A01DA60054AD36E0BB1106F9847BDE816 -:104690000840FFF7AFBE00BF000402405464002092 -:1046A00008B5084B5968090C01F03D010A04DA60AD -:1046B000054A536F0BB1906F9847BDE80840FFF76C -:1046C00099BE00BF000402405464002008B5084BA6 -:1046D0005968890D01F03D018A05DA60054AD36FFA -:1046E00013B1D2F880009847BDE80840FFF782BEBA -:1046F000000402405464002000230C4910B51A46FF -:104700000B4C0B6054F82300026001EB43000433B0 -:104710004260402BF6D1074A4FF0FF339360D360DD -:10472000C2F80834C2F80C3410BD00BF5464002035 -:10473000487C0008000002400F28F8B510D9102866 -:1047400010D0112811D0122808D10F240720DFF82B -:10475000C8E00126DEF80050A04208D9002653E048 -:104760000446F4E70F240020F1E70724FBE706FAEC -:1047700000F73D424AD1264C4FEA001C3D4304EB72 -:1047800000160EEBC000CEF80050C0E90123FBB2CA -:1047900073B12048D0F8D83043F00103C0F8D830C6 -:1047A000D0F8003143F00103C0F80031D0F80031F7 -:1047B00017F47F4F0ED01748D0F8D83043F00203DB -:1047C000C0F8D830D0F8003143F00203C0F800310F -:1047D000D0F8003154F80C00036823F01F03036085 -:1047E000056815F00105FBD104EB0C033D2493F89B -:1047F0000CC05F6804FA0CF43C602124056044613D -:1048000012B1987B00F066F93046F8BD0130A3E79D -:10481000487C0008004402585464002010B530243D -:1048200084F31188FFF788FF002383F3118810BDFC -:1048300010B50446807B00F063F901231549627BC3 -:1048400003FA02F20B6823EA0203DAB20B6072B9D0 -:10485000114AD2F8D81021F00101C2F8D810D2F8CC -:10486000001121F00101C2F80011D2F8002113F467 -:104870007F4F0ED1084BD3F8D82022F00202C3F8A4 -:10488000D820D3F8002122F00202C3F80021D3F887 -:10489000003110BD546400200044025808B5302394 -:1048A00083F31188FFF7C4FF002383F3118808BD49 -:1048B000026843681143016003B118477047000064 -:1048C000024A136843F0C003136070470078004049 -:1048D00013B50E4C204600F0BDFA04F1140000237D -:1048E0004FF400720A49009400F07AF9094B4FF432 -:1048F0000072094904F13800009400F0F3F9074A06 -:10490000074BC4E9172302B010BD00BFD8640020D4 -:1049100044650020C148000844670020007800403A -:1049200000E1F505037C30B5244C002918BF0C4686 -:10493000012B11D1224B98420ED1224BD3F8E82003 -:1049400042F08042C3F8E820D3F8102142F08042C0 -:10495000C3F81021D3F810312268036EC16D03EB48 -:1049600052038466B3FBF2F36268150442BF23F07E -:10497000070503F0070343EA4503CB60A36843F050 -:1049800040034B60E36843F001038B6042F496738D -:1049900043F001030B604FF0FF330B62510505D567 -:1049A00012F0102205D0B2F1805F04D080F864309C -:1049B00030BD7F23FAE73F23F8E700BF487D0008BA -:1049C000D8640020004402582DE9F047C66D054622 -:1049D0003768F469210734621AD014F0080118BF4F -:1049E0004FF48071E20748BF41F02001A3074FF068 -:1049F000300348BF41F04001600748BF41F08001EB -:104A000083F31188281DFFF753FF002383F31188D8 -:104A1000E2050AD5302383F311884FF48061281D05 -:104A2000FFF746FF002383F311884FF030094FF062 -:104A3000000A14F0200838D13B0616D54FF0300993 -:104A400005F1380A200610D589F31188504600F088 -:104A50007DF9002836DA0821281DFFF729FF27F005 -:104A600080033360002383F31188790614D562062E -:104A700012D5302383F31188D5E913239A4208D144 -:104A80002B6C33B127F040071021281DFFF710FFD2 -:104A90003760002383F31188E30618D5AA6E1369E3 -:104AA000ABB15069BDE8F047184789F31188736AC4 -:104AB000284695F86410194000F0E6F98AF3118849 -:104AC000F469B6E7B06288F31188F469BAE7BDE823 -:104AD000F0870000090100F16043012203F5614302 -:104AE000C9B283F8001300F01F039A4043099B00EA -:104AF00003F1604303F56143C3F880211A607047F6 -:104B000000F01F0301229A40430900F160409B001E -:104B100000F5614003F1604303F56143C3F8802071 -:104B2000C3F88021002380F800337047F8B515469C -:104B3000826804460B46AA4200D28568A1692669AC -:104B4000761AB5420BD218462A46FCF723FFA36912 -:104B50002B44A3612846A3685B1BA360F8BD0CD956 -:104B6000AF1B18463246FCF715FF3A46E168304461 -:104B7000FCF710FFE3683B44EBE718462A46FCF7D6 -:104B800009FFE368E5E7000083689342F7B5044650 -:104B9000154600D28568D4E90460361AB5420BD2B6 -:104BA0002A46FCF7F7FE63692B4463612846A36835 -:104BB0005B1BA36003B0F0BD0DD93246AF1B019162 -:104BC000FCF7E8FE01993A46E0683144FCF7E2FE62 -:104BD000E3683B44E9E72A46FCF7DCFEE368E4E7E8 -:104BE00010B50A440024C361029B8460C160026165 -:104BF0000362C0E90000C0E9051110BD08B5D0E9A5 -:104C00000532934201D1826882B9826801328260A2 -:104C10005A1C426119700021D0E904329A4224BF23 -:104C2000C368436100F09CFE002008BD4FF0FF30D8 -:104C3000FBE7000070B5302304460E4683F311886D -:104C4000A568A5B1A368A269013BA360531CA36139 -:104C500015782269934224BFE368A361E3690BB12D -:104C600020469847002383F31188284607E0314601 -:104C7000204600F065FE0028E2DA85F3118870BD59 -:104C80002DE9F74F04460E4617469846D0F81C907B -:104C90004FF0300A8AF311884FF0000B154665B1CA -:104CA0002A4631462046FFF741FF034660B9414698 -:104CB000204600F045FE0028F1D0002383F3118840 -:104CC000781B03B0BDE8F08FB9F1000F03D001905D -:104CD0002046C847019B8BF31188ED1A1E448AF3C6 -:104CE0001188DCE7C160C361009B82600362C0E998 -:104CF00005111144C0E9000001617047F8B5044690 -:104D00000D461646302383F31188A768A7B1A36820 -:104D1000013BA36063695A1C62611D70D4E90432CF -:104D20009A4224BFE3686361E3690BB12046984768 -:104D3000002080F3118807E03146204600F000FE95 -:104D40000028E2DA87F31188F8BD0000D0E90523D6 -:104D500010B59A4201D182687AB982680021013285 -:104D600082605A1C82611C7803699A4224BFC3681E -:104D7000836100F0F5FD204610BD4FF0FF30FBE7EA -:104D80002DE9F74F04460E4617469846D0F81C907A -:104D90004FF0300A8AF311884FF0000B154665B1C9 -:104DA0002A4631462046FFF7EFFE034660B94146EA -:104DB000204600F0C5FD0028F1D0002383F31188C0 -:104DC000781B03B0BDE8F08FB9F1000F03D001905C -:104DD0002046C847019B8BF31188ED1A1E448AF3C5 -:104DE0001188DCE7026843681143016003B118478A -:104DF000704700001430FFF743BF00004FF0FF334F -:104E00001430FFF73DBF00003830FFF7B9BF000096 -:104E10004FF0FF333830FFF7B3BF00001430FFF717 -:104E200009BF00004FF0FF311430FFF703BF00004F -:104E30003830FFF763BF00004FF0FF323830FFF724 -:104E40005DBF0000012914BF6FF013000020704700 -:104E5000FFF73EBD044B036000234360C0E902330B -:104E600001230374704700BF607D000810B5302334 -:104E7000044683F31188FFF755FD022300202374B5 -:104E800080F3118810BD000038B5C36904460D4693 -:104E90001BB904210844FFF7A5FF294604F11400BB -:104EA000FFF7ACFE002806DA201D4FF40061BDE8D4 -:104EB0003840FFF797BF38BD02684368114301606F -:104EC00003B118477047000013B5406B00F58054DC -:104ED000D4F8A4381A681178042914D1017C022965 -:104EE00011D11979012312898B4013420BD101A9E9 -:104EF0004C3002F0F7F8D4F8A4480246019B21791F -:104F0000206800F0DFF902B010BD0000143002F09C -:104F100079B800004FF0FF33143002F073B800008E -:104F20004C3002F04BB900004FF0FF334C3002F030 -:104F300045B90000143002F047B800004FF0FF31CF -:104F4000143002F041B800004C3002F017B90000F4 -:104F50004FF0FF324C3002F011B9000000207047D2 -:104F600010B500F58054D4F8A4381A6811780429D3 -:104F700017D1017C022914D15979012352898B4020 -:104F800013420ED1143001F0D9FF024648B1D4F8D3 -:104F9000A4484FF4407361792068BDE8104000F0E8 -:104FA0007FB910BD406BFFF7DBBF0000704700000A -:104FB0007FB5124B012504260446036000230574C7 -:104FC00000F1840243602946C0E902330C4B029091 -:104FD000143001934FF44073009601F08BFF094B9E -:104FE00004F69442294604F14C000294CDE9006392 -:104FF0004FF4407302F052F804B070BD887D000891 -:10500000A54F0008C94E00080A68302383F31188B1 -:105010000B790B3342F823004B79133342F823000A -:105020008B7913B10B3342F8230000F58053C3F89A -:10503000A41802230374002080F311887047000035 -:1050400038B5037F044613B190F85430ABB901254D -:10505000201D0221FFF730FF04F114006FF0010161 -:10506000257700F089FC04F14C0084F854506FF06F -:105070000101BDE8384000F07FBC38BD10B501210A -:1050800004460430FFF718FF0023237784F85430D8 -:1050900010BD000038B504460025143001F042FF71 -:1050A00004F14C00257702F011F8201D84F85450CB -:1050B0000121FFF701FF2046BDE83840FFF750BF50 -:1050C00090F8803003F06003202B06D190F8812007 -:1050D0000023212A03D81F2A06D800207047222A3D -:1050E000FBD1C0E91D3303E0034A42670722826710 -:1050F000C3670120704700BF3C23002037B500F58F -:105100008055D5F8A4381A68117804291AD1017C81 -:10511000022917D11979012312898B40134211D129 -:1051200000F14C04204602F091F858B101A9204644 -:1051300001F0D8FFD5F8A4480246019B21792068E8 -:1051400000F0C0F803B030BD01F10B03F0B550F82A -:10515000236085B004460D46FEB1302383F31188E9 -:1051600004EB8507301D0821FFF7A6FEFB6806F15A -:105170004C005B691B681BB1019001F0C1FF0198F5 -:1051800003A901F0AFFF024648B1039B2946204620 -:1051900000F098F8002383F3118805B0F0BDFB6898 -:1051A0005A691268002AF5D01B8A013B1340F1D1DD -:1051B00004F18002EAE70000133138B550F82140CD -:1051C000ECB1302383F3118804F58053D3F8A4287D -:1051D0001368527903EB8203DB689B695D6845B114 -:1051E00004216018FFF768FE294604F1140001F05D -:1051F000AFFE2046FFF7B4FE002383F3118838BDCD -:105200007047000001F07CB901234022002110B555 -:10521000044600F8303BFCF7E3FB0023C4E901330C -:1052200010BD000010B53023044683F311882422FA -:10523000416000210C30FCF7D3FB204601F082F9DD -:1052400002230020237080F3118810BD70B500EB9D -:105250008103054650690E461446DA6018B11022E3 -:105260000021FCF7BDFBA06918B110220021FCF75A -:10527000B7FB31462846BDE8704001F069BA00002E -:1052800083682022002103F0011310B504468360D7 -:105290001030FCF7A5FB2046BDE8104001F0E4BA51 -:1052A000F0B4012500EB810447898D40E4683D435B -:1052B000A469458123600023A2606360F0BC01F013 -:1052C00001BB0000F0B4012500EB810407898D408B -:1052D000E4683D436469058123600023A260636044 -:1052E000F0BC01F077BB000070B502230025044636 -:1052F000242203702946C0F888500C3040F8045C22 -:10530000FCF76EFB204684F8705001F0B5F9636835 -:105310001B6823B129462046BDE87040184770BD80 -:105320000378052B10B504460AD080F88C3005238D -:10533000037043681B680BB1042198470023A360E6 -:1053400010BD00000178052906D190F88C20436833 -:1053500002701B6803B118477047000070B590F8E1 -:105360007030044613B1002380F8703004F18002DD -:10537000204601F09DFA63689B68B3B994F88030C9 -:1053800013F0600535D00021204601F08FFD00218B -:10539000204601F07FFD63681B6813B1062120469B -:1053A0009847062384F8703070BD2046984700283F -:1053B000E4D0B4F88630A26F9A4288BFA36794F90C -:1053C0008030A56F002B4FF0300380F20381002D59 -:1053D00000F0F280092284F8702083F31188002104 -:1053E0002046D4E91D23FFF76DFF002383F31188C6 -:1053F000DAE794F8812003F07F0343EA022340F2C6 -:105400000232934200F0C58021D8B3F5807F48D0A6 -:105410000DD8012B3FD0022B00F09380002BB2D18E -:1054200004F1880262670222A267E367C1E7B3F56D -:10543000817F00F09B80B3F5407FA4D194F8823047 -:10544000012BA0D1B4F8883043F0020332E0B3F569 -:10545000006F4DD017D8B3F5A06F31D0A3F5C0635E -:10546000012B90D86368204694F882205E6894F8F7 -:105470008310B4F88430B047002884D04368636751 -:105480000368A3671AE0B3F5106F36D040F6024206 -:1054900093427FF478AF5C4B63670223A3670023DA -:1054A000C3E794F88230012B7FF46DAFB4F88830F5 -:1054B00023F00203A4F88830C4E91D55E56778E7B6 -:1054C000B4F88030B3F5A06F0ED194F88230204646 -:1054D00084F88A3001F02EF963681B6813B101214A -:1054E00020469847032323700023C4E91D339CE71B -:1054F00004F18B0363670123C3E72378042B10D1E6 -:10550000302383F311882046FFF7BAFE85F3118814 -:105510000321636884F88B5021701B680BB120460F -:10552000984794F88230002BDED084F88B30042327 -:10553000237063681B68002BD6D002212046984751 -:10554000D2E794F8843020461D0603F00F010AD5F7 -:1055500001F0A0F9012804D002287FF414AF2B4BEE -:105560009AE72B4B98E701F087F9F3E794F882303C -:10557000002B7FF408AF94F8843013F00F01B3D000 -:105580001A06204602D501F0A9FCADE701F09AFC0D -:10559000AAE794F88230002B7FF4F5AE94F88430BB -:1055A00013F00F01A0D01B06204602D501F07EFCAF -:1055B0009AE701F06FFC97E7142284F8702083F3D8 -:1055C00011882B462A4629462046FFF769FE85F3B7 -:1055D0001188E9E65DB1152284F8702083F3118803 -:1055E00000212046D4E91D23FFF75AFEFDE60B22D9 -:1055F00084F8702083F311882B462A4629462046DA -:10560000FFF760FEE3E700BFB87D0008B07D00084B -:10561000B47D000838B590F870300446002B3ED0B9 -:10562000063BDAB20F2A34D80F2B32D8DFE803F06A -:10563000373131082232313131313131313137377F -:10564000856FB0F886309D4214D2C3681B8AB5FBC3 -:10565000F3F203FB12556DB9302383F311882B4607 -:105660002A462946FFF72EFE85F311880A2384F87F -:1056700070300EE0142384F87030302383F31188E7 -:10568000002320461A461946FFF70AFE002383F33B -:10569000118838BDC36F03B198470023E7E70021A5 -:1056A000204601F003FC0021204601F0F3FB636873 -:1056B0001B6813B10621204698470623D7E7000050 -:1056C00010B590F870300446142B29D017D8062B4B -:1056D00005D001D81BB110BD093B022BFBD800211E -:1056E000204601F0E3FB0021204601F0D3FB636874 -:1056F0001B6813B1062120469847062319E0152B95 -:10570000E9D10B2380F87030302383F31188002314 -:105710001A461946FFF7D6FD002383F31188DAE70E -:10572000C3689B695B68002BD5D1C36F03B19847F1 -:10573000002384F87030CEE7002382680375036984 -:105740001B6899689142FBD25A68036042601060FE -:105750005860704700238268037503691B68996865 -:105760009142FBD85A6803604260106058607047ED -:1057700008B50846302383F311880B7D032B05D031 -:10578000042B0DD02BB983F3118808BD8B6900223F -:105790001A604FF0FF338361FFF7CEFF0023F2E77B -:1057A000D1E9003213605A60F3E70000FFF7C4BF8D -:1057B000054BD96808751868026853601A600122A1 -:1057C000D8600275FAF726BE486900200C4B30B548 -:1057D000DD684B1C87B004460FD02B46094A68464B -:1057E00000F05EF92046FFF7E3FF009B13B1684627 -:1057F00000F060F9A86907B030BDFFF7D9FFF9E7FD -:105800004869002071570008044B1A68DB689068EB -:105810009B68984294BF002001207047486900208F -:10582000084B10B51C68D868226853601A600122C2 -:10583000DC602275FFF78EFF01462046BDE8104070 -:10584000FAF7E8BD4869002038B5074C0123002568 -:10585000064907482370656001F036FD0223237076 -:1058600085F3118838BD00BFB06B0020C07D0008F3 -:105870004869002008B572B6044B186500F064FC56 -:1058800000F02AFD024B03221A70FEE7486900204F -:10589000B06B002000F044B9034A516853685B1AAA -:1058A0009842FBD8704700BF001000E08B600223D5 -:1058B000086108468B8270478368A3F1840243F82D -:1058C000142C026943F8442C426943F8402C094ADD -:1058D00043F8242CC268A3F1200043F8182C0222BC -:1058E00003F80C2C002203F80B2C034A43F8102C6D -:1058F000704700BF2D0400084869002008B5FFF775 -:10590000DBFFBDE80840FFF751BF0000024BDB683A -:1059100098610F20FFF74CBF48690020302383F3C4 -:105920001188FFF7F3BF000008B50146302383F369 -:1059300011880820FFF74AFF002383F3118808BD70 -:10594000064BDB6839B1426818605A6013604360E7 -:105950000420FFF73BBF4FF0FF307047486900203D -:105960000368984206D01A68026050601846996130 -:10597000FFF71CBF7047000038B504460D4620688D -:10598000844200D138BD036823605C608561FFF705 -:105990000DFFF4E7036810B59C68A2420CD85C6860 -:1059A0008A600B604C602160596099688A1A9A601D -:1059B0004FF0FF33836010BD121B1B68ECE7000043 -:1059C0000A2938BF0A2170B504460D460A26601917 -:1059D00001F072FC01F05AFC041BA54203D8751CAF -:1059E00004462E46F3E70A2E04D90120BDE8704094 -:1059F00001F0AABC70BD0000F8B5144B0D460A2A90 -:105A00004FF00A07D96103F11001826038BF0A2202 -:105A1000416019691446016048601861A81801F0D6 -:105A20003BFC01F033FC431B0646A34206D37C1C1F -:105A300028192746354601F03FFCF2E70A2F04D922 -:105A40000120BDE8F84001F07FBCF8BD48690020A6 -:105A5000F8B506460D4601F019FC0F4A134653F8F7 -:105A6000107F9F4206D12A4601463046BDE8F840E5 -:105A7000FFF7C2BFD169BB68441A2C1928BF2C4656 -:105A8000A34202D92946FFF79BFF2246314603482D -:105A9000BDE8F840FFF77EBF486900205869002044 -:105AA000C0E90323002310B45DF8044B4361FFF702 -:105AB000CFBF000010B5194C236998420DD0816802 -:105AC000D0E9003213605A609A680A449A60002351 -:105AD00003604FF0FF33A36110BD0268234643F813 -:105AE000102F53600022026022699A4203D1BDE860 -:105AF000104001F0DBBB936881680B44936001F0B8 -:105B0000C5FB2269E1699268441AA242E4D91144B2 -:105B1000BDE81040091AFFF753BF00BF48690020D5 -:105B20002DE9F047DFF8BC8008F110072C4ED8F8BB -:105B3000105001F0ABFBD8F81C40AA68031B9A4236 -:105B40003ED814444FF00009D5E90032C8F81C4093 -:105B500013605A60C5F80090D8F81030B34201D1F4 -:105B600001F0A4FB89F31188D5E903312846984751 -:105B7000302383F311886B69002BD8D001F086FBAA -:105B80006A69A0EB040982464A450DD2022001F061 -:105B9000DBFB0022D8F81030B34208D1514628462A -:105BA000BDE8F047FFF728BF121A2244F2E712EBD4 -:105BB00009092946384638BF4A46FFF7EBFEB5E7E4 -:105BC000D8F81030B34208D01444C8F81C00211A89 -:105BD000A960BDE8F047FFF7F3BEBDE8F08700BF5E -:105BE000586900204869002038B501F04FFB054A8C -:105BF000D2E90845031B181945F10001C2E9080163 -:105C000038BD00BF4869002000207047FEE7000053 -:105C1000704700004FF0FF307047000002290CD0A1 -:105C2000032904D00129074818BF00207047032A20 -:105C300005D8054800EBC2007047044870470020B3 -:105C4000704700BF987E00084C2300204C7E00085F -:105C500070B59AB005460846144601A900F0C2F88E -:105C600001A8FBF7B5FE431C0022C6B25B0010463C -:105C7000C5E9003423700323023404F8013C01AB6E -:105C8000D1B202348E4201D81AB070BD13F8011B94 -:105C9000013204F8010C04F8021CF1E708B53023C6 -:105CA00083F311880348FFF729FA002383F311884F -:105CB00008BD00BFB86B002090F8803003F01F02D1 -:105CC000012A07D190F881200B2A03D10023C0E9D3 -:105CD0001D3315E003F06003202B08D1B0F88430A9 -:105CE0002BB990F88120212A03D81F2A04D8FFF766 -:105CF000E7B9222AEBD0FAE7034A42670722826714 -:105D0000C3670120704700BF4323002007B5052962 -:105D100017D8DFE801F0191603191920302383F38F -:105D20001188104A01210190FFF790FA0198022191 -:105D30000D4AFFF78BFA0D48FFF7ACF9002383F308 -:105D4000118803B05DF804FB302383F31188074802 -:105D5000FFF776F9F2E7302383F311880348FFF762 -:105D60008DF9EBE7EC7D0008107E0008B86B002091 -:105D700038B50C4D0C4C2A460C4904F10800FFF7CD -:105D800067FF05F1CA0204F110000949FFF760FF3F -:105D900005F5CA7204F118000649BDE83840FFF75E -:105DA00057BF00BF908400204C230020CC7D00080A -:105DB000D67D0008E17D000870B5044608460D4612 -:105DC000FBF706FEC6B22046013403780BB918462D -:105DD00070BD32462946FBF7E7FD0028F3D10120CC -:105DE000F6E700002DE9F04705460C46FBF7F0FD0D -:105DF0002C49C6B22846FFF7DFFF08B11036F6B2CD -:105E000029492846FFF7D8FF08B11036F6B2632EAD -:105E10000BD8DFF89080DFF89090244FDFF898A03F -:105E20002E7846B92670BDE8F08729462046BDE8A1 -:105E3000F04701F06DBE252E30D10722414628469D -:105E4000FBF7B2FD80B91A4B224603F1140153F857 -:105E5000040B8B4242F8040BF9D1198807359B7863 -:105E6000173411809370DBE7082249462846FBF778 -:105E70009BFD98B9A21C0F4B197802320909C95D24 -:105E800002F8041C13F8011B01F00F015345C95D12 -:105E900002F8031CF0D118340835C1E7013504F8C5 -:105EA000016BBDE7B87E0008E17D0008C07E0008F8 -:105EB0002E7B000800E8F11F0CE8F11FBFF34F8FA5 -:105EC000044B1A695107FCD1D3F810215207F8D1BD -:105ED000704700BF0020005208B50D4B1B78ABB9CE -:105EE000FFF7ECFF0B4BDA68D10704D50A4A5A607A -:105EF00002F188325A60D3F80C21D20706D5064A3F -:105F0000C3F8042102F18832C3F8042108BD00BFA0 -:105F1000EE860020002000522301674508B5114B92 -:105F20001B78F3B9104B1A69510703D5DA6842F0B0 -:105F30004002DA60D3F81021520705D5D3F80C21BE -:105F400042F04002C3F80C21FFF7B8FF064BDA68B5 -:105F500042F00102DA60D3F80C2142F00102C3F8EA -:105F60000C2108BDEE860020002000520F289ABFA9 -:105F700000F5806040040020704700004FF40030BE -:105F800070470000102070470F2808B50BD8FFF7A6 -:105F9000EDFF00F500330268013204D10430834282 -:105FA000F9D1012008BD0020FCE700000F2838B51A -:105FB00005463FD8FFF782FF1F4CFFF78DFF4FF0DC -:105FC000FF3307286361C4F814311DD82361FFF73C -:105FD00075FF030243F02403E360E36843F08003AA -:105FE000E36023695A07FCD42846FFF767FFFFF7F1 -:105FF000BDFF4FF4003100F04BF92846FFF78EFF4C -:10600000BDE83840FFF7C0BFC4F81031FFF756FFB6 -:10601000A0F108031B0243F02403C4F80C31D4F8A8 -:106020000C3143F08003C4F80C31D4F810315B0715 -:10603000FBD4D9E7002038BD002000522DE9F84FED -:1060400005460C46104645EA0203DE0602D0002053 -:10605000BDE8F88F20F01F00DFF8BCB0DFF8BCA06F -:10606000FFF73AFF04EB0008444503D10120FFF796 -:1060700055FFEDE720222946204601F017FD10B913 -:1060800020352034F0E72B4605F120021F68791CEB -:10609000DDD104339A42F9D105F178431B481C4EF7 -:1060A000B3F5801F1B4B38BF184603F1F80332BF0E -:1060B000D946D1461E46FFF701FF0760A5EB040C49 -:1060C000336804F11C0143F002033360231FD9F845 -:1060D000007017F00507FAD153F8042F8B424CF8E3 -:1060E0000320F4D1BFF34F8FFFF7E8FE4FF0FF33EB -:1060F0002022214603602846336823F002033360E0 -:1061000001F0D4FC0028BBD03846B0E7142100527F -:106110000C20005214200052102000521021005276 -:1061200010B5084C237828B11BB9FFF7D5FE012321 -:10613000237010BD002BFCD02070BDE81040FFF78D -:10614000EDBE00BFEE86002038B5054D00240334B7 -:10615000696855F80C0B00F0ADF8122CF7D138BD7A -:10616000D47E0008084601F099BC000038B5EFF372 -:1061700011859DB9EFF30584C4F30804302334B1CD -:1061800083F31188FFF730FD85F3118838BD83F361 -:106190001188FFF729FD84F3118838BDBDE8384028 -:1061A000FFF722BD10B5FFF7E1FF104CC008104A01 -:1061B000002340EA4170C908A0FB04ECA0FB020EDA -:1061C0001CEB0000A1FB044CA1FB02125B41001977 -:1061D00043EB0C0011EB0E0142F10002411842F1B9 -:1061E0000000090941EA007010BD00BFCFF753E37A -:1061F000A59BC4200244074BD2B210B5904200D1F7 -:1062000010BD441C00B253F8200041F8040BE0B26A -:10621000F4E700BF504000580E4B30B51C6F24040B -:1062200005D41C6F1C671C6F44F400441C670A4CA7 -:1062300002442368D2B243F480732360074B904238 -:1062400000D130BD441C51F8045B00B243F820502B -:10625000E0B2F4E7004402580048025850400058A9 -:1062600007B5012201A90020FFF7C4FF019803B080 -:106270005DF804FB13B50446FFF7F2FFA04205D01A -:10628000012201A900200194FFF7C6FF02B010BD52 -:106290000144BFF34F8F064B884204D3BFF34F8FA7 -:1062A000BFF36F8F7047C3F85C022030F4E700BF84 -:1062B00000ED00E00144BFF34F8F064B884204D34A -:1062C000BFF34F8FBFF36F8F7047C3F8700220305A -:1062D000F4E700BF00ED00E070470000074B45F217 -:1062E00055521A6002225A6040F6FF729A604CF6CC -:1062F000CC421A600122024B1A70704700480058C5 -:10630000F4860020034B1B781BB1034B4AF6AA22EC -:106310001A607047F486002000480058034B1A6842 -:106320001AB9034AD2F8D0241A607047F0860020C8 -:1063300000400258024B4FF48032C3F8D02470471B -:106340000040025808B5FFF7E9FF024B1868C0F398 -:10635000806008BDF086002070B5BFF34F8FBFF39B -:106360006F8F1A4A0021C2F85012BFF34F8FBFF34C -:106370006F8F536943F400335361BFF34F8FBFF303 -:106380006F8FC2F88410BFF34F8FD2F8803043F67E -:10639000E074C3F3C900C3F34E335B0103EA0406A0 -:1063A000014646EA81750139C2F86052F9D2203BB4 -:1063B00013F1200FF2D1BFF34F8F536943F48033B1 -:1063C0005361BFF34F8FBFF36F8F70BD00ED00E0DF -:1063D000FEE70000214B2248224A70B5904237D395 -:1063E000214BC11EDA1C121A22F003028B4238BF65 -:1063F00000220021FBF7F4FA1C4A0023C2F8843083 -:10640000BFF34F8FD2F8803043F6E074C3F3C90076 -:10641000C3F34E335B0103EA0406014646EA817585 -:106420000139C2F86C52F9D2203B13F1200FF2D19E -:10643000BFF34F8FBFF36F8FBFF34F8FBFF36F8FDC -:106440000023C2F85032BFF34F8FBFF36F8F70BD80 -:1064500053F8041B40F8041BC0E700BF6881000824 -:10646000C8880020C8880020C888002000ED00E00F -:10647000074BD3F8D81021EA0001C3F8D810D3F89D -:10648000002122EA0002C3F80021D3F8003170474E -:106490000044025870B5D0E9244300224FF0FF3584 -:1064A0009E6804EB42135101D3F80009002805DA75 -:1064B000D3F8000940F08040C3F80009D3F8000B7E -:1064C000002805DAD3F8000B40F08040C3F8000B39 -:1064D000013263189642C3F80859C3F8085BE0D24A -:1064E0004FF00113C4F81C3870BD0000890141F061 -:1064F0002001016103699B06FCD41220FFF7CCB98F -:1065000010B50A4C2046FEF77FFE094BC4F89030C8 -:10651000084BC4F89430084C2046FEF775FE074B34 -:10652000C4F89030064BC4F8943010BDF8860020B3 -:1065300000000840407F00089487002000000440CD -:106540004C7F000870B503780546012B5CD1434BA6 -:10655000D0F89040984258D1414B0E216520D3F895 -:10656000D82042F00062C3F8D820D3F8002142F0CE -:106570000062C3F80021D3F80021D3F8802042F054 -:106580000062C3F88020D3F8802022F00062C3F8B4 -:106590008020D3F88030FEF79DFA324BE360324B17 -:1065A000C4F800380023D5F89060C4F8003EC0233A -:1065B00023604FF40413A3633369002BFCDA012337 -:1065C0000C203361FFF768F93369DB07FCD4122034 -:1065D000FFF762F93369002BFCDA00262846A66033 -:1065E000FFF758FF6B68C4F81068DB68C4F81468DC -:1065F000C4F81C6883BB1D4BA3614FF0FF3363617C -:10660000A36843F00103A36070BD194B9842C9D140 -:10661000134B4FF08060D3F8D82042F00072C3F8DB -:10662000D820D3F8002142F00072C3F80021D3F83B -:106630000021D3F8802042F00072C3F88020D3F804 -:10664000802022F00072C3F88020D3F88030FFF75A -:106650000FFF0E214D209EE7064BCDE7F886002068 -:10666000004402584014004003002002003C30C0A7 -:1066700094870020083C30C0F8B5D0F8904005461B -:1066800000214FF000662046FFF730FFD5F8941048 -:1066900000234FF001128F684FF0FF30C4F83438F8 -:1066A000C4F81C2804EB431201339F42C2F800696E -:1066B000C2F8006BC2F80809C2F8080BF2D20B68E6 -:1066C000D5F89020C5F898306362102313611669DD -:1066D00016F01006FBD11220FFF7DEF8D4F80038D0 -:1066E00023F4FE63C4F80038A36943F4402343F065 -:1066F0001003A3610923C4F81038C4F814380B4BF5 -:10670000EB604FF0C043C4F8103B094BC4F8003BAA -:10671000C4F81069C4F80039D5F8983003F11002B4 -:1067200043F48013C5F89820A362F8BD1C7F0008CD -:1067300040800010D0F8902090F88A10D2F80038ED -:1067400023F4FE6343EA0113C2F8003870470000E7 -:106750002DE9F84300EB8103D0F890500C468046B9 -:10676000DA680FFA81F94801166806F00306731E0D -:10677000022B05EB41134FF0000194BFB604384ED5 -:10678000C3F8101B4FF0010104F1100398BF06F18C -:10679000805601FA03F3916998BF06F50046002977 -:1067A0003AD0578A04F15801374349016F50D5F860 -:1067B0001C180B430021C5F81C382B180127C3F8FF -:1067C0001019A7405369611E9BB3138A928B9B08D3 -:1067D000012A88BF5343D8F89820981842EA034307 -:1067E00001F140022146C8F89800284605EB8202D4 -:1067F0005360FFF77BFE08EB8900C3681B8A43EAFE -:10680000845348341E4364012E51D5F81C381F436D -:10681000C5F81C78BDE8F88305EB4917D7F8001BCD -:1068200021F40041C7F8001BD5F81C1821EA030326 -:10683000C0E704F13F030B4A2846214605EB8303DA -:106840005A60FFF753FE05EB4910D0F8003923F4E6 -:106850000043C0F80039D5F81C3823EA0707D7E70A -:106860000080001000040002D0F894201268C0F8E4 -:106870009820FFF70FBE00005831D0F89030490142 -:106880005B5813F4004004D013F4001F0CBF022027 -:10689000012070474831D0F8903049015B5813F41B -:1068A000004004D013F4001F0CBF022001207047E9 -:1068B00000EB8101CB68196A0B6813604B68536069 -:1068C0007047000000EB810330B5DD68AA691368EA -:1068D000D36019B9402B84BF402313606B8A1468BE -:1068E000D0F890201C4402EB4110013C09B2B4FBEB -:1068F000F3F46343033323F0030343EAC44343F055 -:10690000C043C0F8103B2B6803F00303012B0ED1EA -:10691000D2F8083802EB411013F4807FD0F8003B26 -:1069200014BF43F0805343F00053C0F8003B02EB28 -:106930004112D2F8003B43F00443C2F8003B30BDA3 -:106940002DE9F041D0F8906005460C4606EB411366 -:10695000D3F8087B3A07C3F8087B08D5D6F8143873 -:106960001B0704D500EB8103DB685B689847FA07D7 -:106970001FD5D6F81438DB071BD505EB8403D9687F -:10698000CCB98B69488A5A68B2FBF0F600FB162234 -:106990008AB91868DA6890420DD2121AC3E9002445 -:1069A000302383F3118821462846FFF78BFF84F3B9 -:1069B0001188BDE8F081012303FA04F26B8923EA10 -:1069C00002036B81CB68002BF3D021462846BDE83B -:1069D000F041184700EB81034A0170B5DD68D0F83B -:1069E00090306C692668E66056BB1A444FF400206C -:1069F000C2F810092A6802F00302012A0AB20ED175 -:106A0000D3F8080803EB421410F4807FD4F800098F -:106A100014BF40F0805040F00050C4F8000903EB70 -:106A20004212D2F8000940F00440C2F800090122E5 -:106A3000D3F8340802FA01F10143C3F8341870BDE9 -:106A400019B9402E84BF4020206020681A442E8A45 -:106A50008419013CB4FBF6F440EAC44040F0005015 -:106A6000C6E700002DE9F843D0F8906005460C46D3 -:106A70004F0106EB4113D3F8088918F0010FC3F852 -:106A800008891CD0D6F81038DB0718D500EB810335 -:106A9000D3F80CC0DCF81430D3F800E0DA6896457F -:106AA00030D2A2EB0E024FF000091A60C3F8049036 -:106AB000302383F31188FFF78DFF89F3118818F0D5 -:106AC000800F1DD0D6F834380126A640334217D0A7 -:106AD00005EB84030134D5F89050D3F80CC0E4B230 -:106AE0002F44DCF8142005EB0434D2F800E05168A0 -:106AF000714514D3D5F8343823EA0606C5F834684E -:106B0000BDE8F883012303FA01F2038923EA0203B3 -:106B10000381DCF80830002BD1D09847CFE7AEEBEB -:106B20000103BCF81000834228BF0346D7F81809B8 -:106B300080B2B3EB800FE3D89068A0F1040959F854 -:106B4000048FC4F80080A0EB09089844B8F1040F42 -:106B5000F5D818440B4490605360C8E72DE9F84F0E -:106B6000D0F8905004466E69AB691E4016F4805808 -:106B70006E6103D0BDE8F84FFEF7B6BB002E12DA07 -:106B8000D5F8003E9B0705D0D5F8003E23F003035F -:106B9000C5F8003ED5F80438204623F00103C5F8B7 -:106BA0000438FEF7CFFB370505D52046FFF772FC0A -:106BB0002046FEF7B5FBB0040CD5D5F8083813F025 -:106BC000060FEB6823F470530CBF43F4105343F4E7 -:106BD000A053EB6031071BD56368DB681BB9AB6959 -:106BE00023F00803AB612378052B0CD1D5F8003EC8 -:106BF0009A0705D0D5F8003E23F00303C5F8003E00 -:106C00002046FEF79FFB6368DB680BB12046984780 -:106C1000F30200F1BA80B70226D5D4F8909000278D -:106C20004FF0010A09EB4712D2F8003B03F440236E -:106C3000B3F5802F11D1D2F8003B002B0DDA628919 -:106C40000AFA07F322EA0303638104EB8703DB6894 -:106C5000DB6813B13946204698470137D4F89430A1 -:106C6000FFB29B689F42DDD9F00619D5D4F8900099 -:106C7000026AC2F30A1702F00F0302F4F012B2F52F -:106C8000802F00F0CA80B2F5402F09D104EB8303B6 -:106C9000002200F58050DB681B6A974240F0B0800C -:106CA0003003D5F8185835D5E90303D5002120461F -:106CB000FFF746FEAA0303D501212046FFF740FE59 -:106CC0006B0303D502212046FFF73AFE2F0303D5BD -:106CD00003212046FFF734FEE80203D504212046B5 -:106CE000FFF72EFEA90203D505212046FFF728FE57 -:106CF0006A0203D506212046FFF722FE2B0203D5A8 -:106D000007212046FFF71CFEEF0103D5082120468E -:106D1000FFF716FE700340F1A780E90703D50021B5 -:106D20002046FFF79FFEAA0703D501212046FFF763 -:106D300099FE6B0703D502212046FFF793FE2F072C -:106D400003D503212046FFF78DFEEE0603D504216F -:106D50002046FFF787FEA80603D505212046FFF74A -:106D600081FE690603D506212046FFF77BFE2A0631 -:106D700003D507212046FFF775FEEB0574D52046A5 -:106D80000821BDE8F84FFFF76DBED4F890904FF0A2 -:106D9000000B4FF0010AD4F894305FFA8BF79B6830 -:106DA0009F423FF638AF09EB4713D3F8002902F4AE -:106DB0004022B2F5802F20D1D3F80029002A1CDA16 -:106DC000D3F8002942F09042C3F80029D3F80029F3 -:106DD000002AFBDB3946D4F89000FFF787FB2289B5 -:106DE0000AFA07F322EA0303238104EB8703DB6833 -:106DF0009B6813B13946204698470BF1010BCAE74F -:106E0000910701D1D0F80080072A02F101029CBF4E -:106E100003F8018B4FEA18283FE704EB830300F5E2 -:106E20008050DA68D2F818C0DCF80820DCE9001CD1 -:106E3000A1EB0C0C00218F4208D1DB689B699A689A -:106E40003A449A605A683A445A6029E711F0030FAD -:106E500001D1D0F800808C4501F1010184BF02F816 -:106E6000018B4FEA1828E6E7BDE8F88F08B503481C -:106E7000FFF774FEBDE80840FDF7BCBAF8860020B5 -:106E800008B50348FFF76AFEBDE80840FDF7B2BA4F -:106E900094870020D0F8903003EB4111D1F8003BEB -:106EA00043F40013C1F8003B70470000D0F8903065 -:106EB00003EB4111D1F8003943F40013C1F8003954 -:106EC00070470000D0F8903003EB4111D1F8003B3F -:106ED00023F40013C1F8003B70470000D0F8903055 -:106EE00003EB4111D1F8003923F40013C1F8003944 -:106EF0007047000030B50433039C0172002104FB8D -:106F00000325C160C0E90653049B0363059BC0E9E8 -:106F10000000C0E90422C0E90842C0E90A11436345 -:106F200030BD00000022416AC260C0E90411C0E91E -:106F30000A226FF00101FEF71FBD0000D0E9043204 -:106F4000934201D1C2680AB9181D704700207047EA -:106F5000036919600021C2680132C260C26913442A -:106F600082699342036124BF436A0361FEF7F8BC60 -:106F700038B504460D46E3683BB162690020131D35 -:106F80001268A3621344E36207E0237A33B9294607 -:106F90002046FEF7D5FC0028EDDA38BD6FF0010081 -:106FA000FBE70000C368C269013BC3604369134447 -:106FB00082699342436124BF436A43610023836231 -:106FC000036B03B11847704770B53023044683F351 -:106FD0001188866A3EB9FFF7CBFF054618B186F3E4 -:106FE0001188284670BDA36AE26A13F8015B9342D8 -:106FF000A36202D32046FFF7D5FF002383F3118855 -:10700000EFE700002DE9F84F04460E461746984674 -:107010004FF0300989F311880025AA46D4F828B02A -:10702000BBF1000F09D141462046FFF7A1FF20B177 -:107030008BF311882846BDE8F88FD4E90A12A7EB34 -:10704000050B521A934528BF9346BBF1400F1BD93D -:10705000334601F1400251F8040B914243F8040B0E -:10706000F9D1A36A403640354033A362D4E90A23FC -:107070009A4202D32046FFF795FF8AF31188BD425A -:10708000D8D289F31188C9E730465A46FAF782FC0C -:10709000A36A5E445D445B44A362E7E710B5029CCB -:1070A0000433017203FB0421C460C0E9061300230A -:1070B000C0E90A33039B0363049BC0E90000C0E9F5 -:1070C0000422C0E90842436310BD0000026A6FF069 -:1070D0000101C260426AC0E904220022C0E90A221A -:1070E000FEF74ABCD0E904239A4201D1C26822B912 -:1070F000184650F8043B0B60704700231846FAE727 -:10710000C3680021C2690133C360436913448269C3 -:107110009342436124BF436A4361FEF721BC0000F0 -:1071200038B504460D46E3683BB1236900201A1DBB -:10713000A262E2691344E36207E0237A33B9294685 -:107140002046FEF7FDFB0028EDDA38BD6FF00100A8 -:10715000FBE7000003691960C268013AC260C269B6 -:10716000134482699342036124BF436A036100238D -:107170008362036B03B118477047000070B530237A -:107180000D460446114683F31188866A2EB9FFF72F -:10719000C7FF10B186F3118870BDA36A1D70A36A82 -:1071A000E26A01339342A36204D3E16920460439C1 -:1071B000FFF7D0FF002080F31188EDE72DE9F84FAD -:1071C00004460D46904699464FF0300A8AF31188DE -:1071D0000026B346A76A4FB949462046FFF7A0FFED -:1071E00020B187F311883046BDE8F88FD4E90A074B -:1071F0003A1AA8EB0607974228BF1746402F1BD91B -:1072000005F1400355F8042B9D4240F8042BF9D1B9 -:10721000A36A40364033A362D4E90A239A4204D3D6 -:10722000E16920460439FFF795FF8BF31188464545 -:10723000D9D28AF31188CDE729463A46FAF7AAFB54 -:10724000A36A3D443E443B44A362E5E7D0E90423FE -:107250009A4217D1C3689BB1836A8BB1043B9B1AD6 -:107260000ED01360C368013BC360C3691A448369CD -:107270009A42026124BF436A0361002383620123AF -:10728000184670470023FBE700F024B9014B586A09 -:10729000704700BF000C0040034B002258631A6186 -:1072A0000222DA60704700BF000C0040014B002250 -:1072B000DA607047000C0040014B5863704700BF14 -:1072C000000C0040FEE7000070B51B4B0025044693 -:1072D00086B058600E4685620163FDF763F804F1DD -:1072E0001003A560E562C4E904334FF0FF33C4E93D -:1072F0000044C4E90635FFF7C9FF2B46024604F1F6 -:1073000034012046C4E9082380230C4A2565FEF792 -:10731000CDFA01230A4AE06000920375684672685C -:107320000192B268CDE90223064BCDE90435FEF7A0 -:10733000E5FA06B070BD00BFB06B0020587F0008B2 -:107340005D7F0008C5720008024AD36A1843D06204 -:10735000704700BF486900204B6843608B688360BA -:10736000CB68C3600B6943614B6903628B694362FD -:107370000B6803607047000008B53C4B40F2FF719A -:107380003B48D3F888200A43C3F88820D3F88820E4 -:1073900022F4FF6222F00702C3F88820D3F8882085 -:1073A000D3F8E0200A43C3F8E020D3F808210A43C9 -:1073B000C3F808212F4AD3F808311146FFF7CCFF54 -:1073C00000F5806002F11C01FFF7C6FF00F5806048 -:1073D00002F13801FFF7C0FF00F5806002F15401AF -:1073E000FFF7BAFF00F5806002F17001FFF7B4FF0C -:1073F00000F5806002F18C01FFF7AEFF00F58060C0 -:1074000002F1A801FFF7A8FF00F5806002F1C401B6 -:10741000FFF7A2FF00F5806002F1E001FFF79CFF9B -:1074200000F5806002F1FC01FFF796FF02F58C7118 -:1074300000F58060FFF790FF00F018F90E4BD3F8CD -:10744000902242F00102C3F89022D3F8942242F035 -:107450000102C3F894220522C3F898204FF060522D -:10746000C3F89C20054AC3F8A02008BD0044025878 -:1074700000000258647F000800ED00E01F000803D0 -:1074800008B500F0D5FAFEF7DFF90F4BD3F8DC2092 -:1074900042F04002C3F8DC20D3F8042122F040027D -:1074A000C3F80421D3F80431084B1A6842F00802EB -:1074B0001A601A6842F004021A60FEF72FFFBDE856 -:1074C0000840FEF755BC00BF0044025800180248AF -:1074D00070470000114BD3F8E82042F00802C3F8CF -:1074E000E820D3F8102142F00802C3F810210C4A1A -:1074F000D3F81031D36B43F00803D363C722094B91 -:107500009A624FF0FF32DA6200229A615A63DA60BF -:107510005A6001225A611A60704700BF0044025845 -:107520000010005C000C0040094A08B51169D368DE -:107530000B40D9B29B076FEA0101116107D53023D7 -:1075400083F31188FEF7A6F9002383F3118808BDA1 -:10755000000C0040064BD3F8DC200243C3F8DC20CB -:10756000D3F804211043C3F80401D3F80431704761 -:107570000044025808B53C4B4FF0FF31D3F880204F -:1075800062F00042C3F88020D3F8802002F000426D -:10759000C3F88020D3F88020D3F88420C3F8841067 -:1075A000D3F884200022C3F88420D3F88400D86F55 -:1075B00040F0FF4040F4FF0040F4DF4040F07F0027 -:1075C000D867D86F20F0FF4020F4FF0020F4DF40A0 -:1075D00020F07F00D867D86FD3F888006FEA40505A -:1075E0006FEA5050C3F88800D3F88800C0F30A004F -:1075F000C3F88800D3F88800D3F89000C3F890103F -:10760000D3F89000C3F89020D3F89000D3F89400FA -:10761000C3F89410D3F89400C3F89420D3F89400DE -:10762000D3F89800C3F89810D3F89800C3F89820BE -:10763000D3F89800D3F88C00C3F88C10D3F88C00E2 -:10764000C3F88C20D3F88C00D3F89C00C3F89C10AE -:10765000D3F89C10C3F89C20D3F89C30FDF74CF86D -:10766000BDE8084000F0B8B90044025808B501224E -:10767000534BC3F80821534BD3F8F42042F00202D5 -:10768000C3F8F420D3F81C2142F00202C3F81C21F5 -:107690000222D3F81C314C4BDA605A689104FCD5B5 -:1076A0004A4A1A6001229A60494ADA6000221A6145 -:1076B0004FF440429A61444B9A699204FCD51A688F -:1076C00042F480721A603F4B1A6F12F4407F04D06C -:1076D0004FF480321A6700221A671A6842F00102DA -:1076E0001A60384B1A685007FCD500221A611A69D3 -:1076F00012F03802FBD1012119604FF0804159602E -:107700005A67344ADA62344A1A611A6842F480329B -:107710001A602C4B1A689103FCD51A6842F4805207 -:107720001A601A689204FCD52C4A2D499A620022EC -:107730005A63196301F57C01DA6301F5E771996316 -:107740005A64284A1A64284ADA621A6842F0A8522F -:107750001A601C4B1A6802F02852B2F1285FF9D166 -:1077600048229A614FF48862DA6140221A621F4A05 -:10777000DA641F4A1A651F4A5A651F4A9A653223FE -:107780001E4A1360136803F00F03022BFAD10D4A4F -:10779000136943F003031361136903F03803182BD3 -:1077A000FAD14FF00050FFF7D5FE4FF08040FFF7C1 -:1077B000D1FE4FF00040BDE80840FFF7CBBE00BF50 -:1077C00000800051004402580048025800C000F0F8 -:1077D000020000010000FF010088900832206000D4 -:1077E00063020901470E0508DD0BBF0120000020E0 -:1077F000000001100910E0000001011000200052FB -:107800004FF0B04208B5D2F8883003F00103C2F857 -:10781000883023B1044A13680BB150689847BDE81B -:107820000840FCF7E7BD00BF488800204FF0B04299 -:1078300008B5D2F8883003F00203C2F8883023B1CB -:10784000044A93680BB1D0689847BDE80840FCF73C -:10785000D1BD00BF488800204FF0B04208B5D2F833 -:10786000883003F00403C2F8883023B1044A136956 -:107870000BB150699847BDE80840FCF7BBBD00BF9D -:10788000488800204FF0B04208B5D2F8883003F0A5 -:107890000803C2F8883023B1044A93690BB1D06958 -:1078A0009847BDE80840FCF7A5BD00BF4888002008 -:1078B0004FF0B04208B5D2F8883003F01003C2F898 -:1078C000883023B1044A136A0BB1506A9847BDE867 -:1078D0000840FCF78FBD00BF488800204FF0B04340 -:1078E00010B5D3F8884004F47872C3F88820A30652 -:1078F00004D5124A936A0BB1D06A9847600604D542 -:107900000E4A136B0BB1506B9847210604D50B4AF6 -:10791000936B0BB1D06B9847E20504D5074A136C03 -:107920000BB1506C9847A30504D5044A936C0BB176 -:10793000D06C9847BDE81040FCF75CBD488800203B -:107940004FF0B04310B5D3F8884004F47C42C3F83C -:107950008820620504D5164A136D0BB1506D984707 -:10796000230504D5124A936D0BB1D06D9847E004FE -:1079700004D50F4A136E0BB1506E9847A10404D57D -:107980000B4A936E0BB1D06E9847620404D5084A37 -:10799000136F0BB1506F9847230404D5044A936FBB -:1079A0000BB1D06F9847BDE81040FCF723BD00BF76 -:1079B0004888002008B50348FDF706F8BDE80840F0 -:1079C000FCF718BDD864002008B5FFF7ADFDBDE891 -:1079D0000840FCF70FBD0000062108B50846FDF77A -:1079E00079F806210720FDF775F806210820FDF734 -:1079F00071F806210920FDF76DF806210A20FDF730 -:107A000069F806211720FDF765F806212820FDF703 -:107A100061F809217A20FDF75DF807213220FDF792 -:107A200059F80C215220BDE80840FDF753B800007A -:107A300008B5FFF79FFD00F00DF8FDF709FAFDF717 -:107A4000E1FBFDF7B3FAFFF743FDBDE80840FFF7A0 -:107A50001BBC00000023054A19460133102BC2E964 -:107A6000001102F10802F8D1704700BF48880020D9 -:107A70000B460146184600F003B8000000F00EB8AF -:107A800010B5054C13462CB10A4601460220AFF34F -:107A9000008010BD2046FCE700000000024B0146BC -:107AA0001868FEF75FBB00BF6C23002010B50139DA -:107AB0000244904201D1002005E0037811F8014F03 -:107AC000A34201D0181B10BD0130F2E72DE9F041AF -:107AD000A3B1C91A17780144044603F1FF3C8C4254 -:107AE000204601D9002009E00578BD4204F10104D7 -:107AF000F5D10CEB0405D618A54201D1BDE8F08103 -:107B000015F8018D16F801EDF045F5D0E7E7000016 -:107B1000034611F8012B03F8012B002AF9D1704715 -:107B20006F72672E6172647570696C6F742E437525 -:107B300062654F72616E67652D7065726970682D40 -:107B4000686561767900000053544D333248373F01 -:107B50003F3F0053544D3332483733782F37327814 -:107B60000053544D3332483734332F3735332F37A2 -:107B70003530000001105A00031059000120580050 -:107B80000320560040A2E4F1646891060041A3E599 -:107B9000F26569920700000043414E464449666120 -:107BA00063653A204D6573736167652052414D20CE -:107BB0004F766572666C6F77210000004261642029 -:107BC00043414E496661636520696E6465782E00A5 -:107BD000000100000001FF0000A0004000A40040E0 -:107BE0000000000000000000C92A0008512300081E -:107BF00051320008C1230008CD230008E527000802 -:107C000045250008892300088D2300086523000806 -:107C10004D230008A127000871230008B93300088C -:107C20007D2300087527000801040E05054B02029C -:107C30000E05054B04010E05054B05010B04044B15 -:107C4000080106030346000010000240080002403D -:107C50000008024000000B0028000240080002401B -:107C60000408024006010C004000024008000240E7 -:107C70000808024010020D005800024008000240AF -:107C80000C08024016030E00700002400C00024077 -:107C90001008024000040F00880002400C0002405F -:107CA0001408024006051000A00002400C0002402B -:107CB0001808024010061100B80002400C000240F3 -:107CC0001C08024016072F0010040240080402405E -:107CD000200802400008380028040240080402403E -:107CE000240802400609390040040240080402400A -:107CF00028080240100A3A005804024008040240D2 -:107D00002C080240160B3B00700402400C04024099 -:107D100030080240000C3C00880402400C04024081 -:107D200034080240060D4400A00402400C04024046 -:107D300038080240100E4500B80402400C0402400E -:107D40003C080240160F46000096000000000000AC -:107D50000000000000000000000000000000000023 -:107D600000000000114E0008FD4D0008394E0008CB -:107D7000254E0008314E00081D4E0008094E00082F -:107D8000F54D0008454E000800000000294F00088E -:107D9000154F0008514F00083D4F0008494F00089B -:107DA000354F0008214F00080D4F00085D4F0008B7 -:107DB000000000000100000000000000633000002F -:107DC000BC7D0008A0690020B06B00204172647582 -:107DD00050696C6F740025424F415244252D424C2E -:107DE000002553455249414C250000000200000087 -:107DF0000000000049510008B9510008400040004F -:107E00006084002070840020020000000000000058 -:107E10000300000000000000015200080000000004 -:107E2000100000008084002000000000010000001D -:107E300000000000F8860020010102000D5D00082E -:107E40001D5C0008B95C00089D5C00084300000050 -:107E5000547E000809024300020100C032090400F8 -:107E600000010202010005240010010524010001A7 -:107E7000042402020524060001070582030800FF0E -:107E800009040100020A0000000705010240000089 -:107E9000070581024000000012000000A07E0008DB -:107EA00012011001020000400912415700020102B4 -:107EB000030100000403090425424F4152442500F8 -:107EC0003031323334353637383941424344454610 -:107ED000000000000001002000FF0100020000007F -:107EE0000000003000000400080000000000002432 -:107EF00000000800040000000004000000FC000076 -:107F000002000000000004300080000008000000B3 -:107F10000000003800000100010000000000000027 -:107F20005D53000815560008C15600084000400087 -:107F300030880020308800200100000040880020A8 -:107F40008000000040010000080000000001000067 -:107F500000100000080000006D61696E0069646C2B -:107F6000650000000000802A00000000AAAAAAAA5A -:107F700000000024FFFF00000000000000A00A0035 -:107F80000021000200000000AAAAAAAA0000000026 -:107F9000FFFF000000000009000009001400005469 -:107FA00000000000AAAAAAAA14000054FFFF0000C3 -:107FB00000000000000000000A4010000000000067 -:107FC000AAAA8AAA00401000FFFF00009900000042 -:107FD000000000000081020000000000AAAAAAAA76 -:107FE00000410100FFFF00000000007007000000DA -:107FF0000000000000000000AAAAAAAA00000000D9 -:10800000FFFF000000000000000000000000000072 -:1080100000000000AAAAAAAA00000000FFFF0000BA -:108020000000000000000000000000000000000050 -:10803000AAAAAAAA00000000FFFF0000000000009A -:10804000000000000000000000000000AAAAAAAA88 -:1080500000000000FFFF0000000000000000000022 -:108060000000000000000000AAAAAAAA0000000068 -:10807000FFFF000000000000000000000000000002 -:1080800000000000AAAAAAAA00000000FFFF00004A -:108090000000000000000000780500000000000063 -:1080A00000001E0000000000FE2A0100D2040000B3 -:1080B000FF000000B86B0020D86400200000000022 -:1080C000487B000883040000537B00085004000034 -:1080D000617B000800960000000008009600000088 -:1080E0000008000004000000B47E0008000000004A -:1080F0000000000000000000000000000000000080 -:1081000000000000702300200000000000000000BC -:10811000000000000000000000000000000000005F -:10812000000000000000000000000000000000004F -:10813000000000000000000000000000000000003F -:10814000000000000000000000000000000000002F -:10815000000000000000000000000000000000001F -:08816000000000000000000017 +:101B300055F82600BDE8704003F0E8B970BD00BF5D +:101B4000DC6300201C230020586B0020C4630020AD +:101B5000F8B571B6002301201A46194602F0AEFE10 +:101B60000446802004F0EEFB002849D00025254AD9 +:101B700080274FF4D06C3D26136913F0C06F26D137 +:101B8000D2F8103113F0C06F21D1236805F1006144 +:101B900099602368D86023685F602368C3F800C039 +:101BA00021680B6843F001030B6021680B6823F088 +:101BB0001E030B6021680B68DB07FCD4237B803598 +:101BC000616806FA03F3B5F5001F0B60D4D1204617 +:101BD00002F0B4FEB5F5001F11D000240A4E0B4DE3 +:101BE000012004F011FB3388A34205D92868204462 +:101BF000013404F04FFAF6E7002004F005FB61B66B +:101C0000F8BD00BF00200052DE6300209863002072 +:101C10002DE9F3470D46044600219046284640F240 +:101C20007912FFF7DDFE234620220021284604F129 +:101C3000220702F077F9231D022220212846C02620 +:101C400002F070F9631D03222221284602F06AF98E +:101C5000A31D03222521284602F064F904F108039C +:101C600010222821284602F05DF904F11003082211 +:101C70003821284602F056F904F1110308224021C8 +:101C8000284602F04FF904F11203082248212846A1 +:101C900002F048F904F1140320225021284602F0F2 +:101CA00041F904F1180340227021284602F03AF964 +:101CB00004F120030822B021284602F033F904F190 +:101CC00021030822B821284602F02CF931460836B3 +:101CD0003B4608222846013702F024F9B6F5A07FDA +:101CE000F4D194F83230314604F1330A00268DF8ED +:101CF000073008220DF10703284602F013F99DF87A +:101D000007304FEAC6099E4209F5A47720D394F81C +:101D10003231502B28BF50238DF80730B8F1000F17 +:101D200008D1394609F24F170DF10703072228465B +:101D300002F0F8F8002604F233149DF8073007EBA0 +:101D4000C6019E420DD30731C80802B0BDE8F08736 +:101D50000AEB0603082239462846013602F0E2F86B +:101D6000CDE7A31908222846013602F0DBF8E4E7A4 +:101D700013B5044608460021202223460190016045 +:101D8000C0F8031002F0CEF8231D01980222202192 +:101D900002F0C8F8631D01980322222102F0C2F864 +:101DA000A31D01980322252102F0BCF8019804F13B +:101DB00008031022282102F0B5F8072002B010BD58 +:101DC000F7B5047F05460E462CB1838A122B02D943 +:101DD000012003B0F0BD00230722284600961946D3 +:101DE00001F064FF731C01220721009328460023A1 +:101DF00001F05CFFD4B9B31C0522082128460093EA +:101E000023460D2401F052FFB378102BE0D837465B +:101E1000BB1BB278934210D307342B7FA88AE40807 +:101E2000B3B9844294BF00200120D2E7AB8A0824D2 +:101E3000DB00083BDB08B370E6E7FB1C2146082209 +:101E40002846009300230834013701F02FFFDFE715 +:101E5000201A18BF0120BCE7F7B5047F05460E46DF +:101E60002CB1838ACA2B02D9012003B0F0BD002314 +:101E7000082228460096194601F018FF731CD4B9B1 +:101E800008220093234610241146284601F00EFF35 +:101E90007378C82BE8D801235F1C7278013B93420A +:101EA00010D307342B7FA88AE408B3B9844294BFC7 +:101EB00000200120D9E7AB8A0824DB00083BDB08BF +:101EC0007370E5E7F31921460822284600930023A2 +:101ED00001F0ECFE08343B46DEE7201A18BF012073 +:101EE000C3E70000F7B50D46044600211646284614 +:101EF0008122FFF775FD234608220021284602F0C3 +:101F000011F894F901206378002AB8BF7F238DF877 +:101F100007309EB90F270DF1070307220821284635 +:101F200002F000F8002602349DF8073007EBC601E6 +:101F30009E4205D30731C80803B0F0BD0827F1E77A +:101F4000A31908222846013601F0ECFFECE7000057 +:101F5000F7B50E460546002114463046CE22FFF75F +:101F60003FFD2B4628220021304601F0DBFF2B7A73 +:101F7000C82B28BFC8238DF807308CB930240DF149 +:101F8000070308222821304601F0CCFF2F467B1B97 +:101F90009DF80720934205D3E01DC00803B0F0BDB3 +:101FA0002824F3E707F109032146082230460834C4 +:101FB000013701F0B7FFEAE7F7B5047F05460E46A3 +:101FC00034B1838AB3F5827F02D9012003B0F0BD1A +:101FD0000123102200212846009601F067FEDCB99B +:101FE000B31C09221021284600932346192401F02E +:101FF0005DFE7388B3F5807FE7D83746BB1B7288D8 +:10200000934210D307342B7FA88AE408B3B98442E3 +:1020100094BF00200120D9E7AB8A1024DB00103BDD +:10202000DB087380E5E73B1D214608222846009324 +:1020300000230834013701F039FEDFE7201A18BF0A +:102040000120C3E730B50A44084D91420DD011F884 +:10205000013B5840082340F30004013B2C4013F09F +:10206000FF0384EA5000F6D1EFE730BD2083B8EDDE +:10207000F7B5364A6B46106851686A4603C30823B1 +:102080003349344805F086FF044690BB0A25324A9E +:102090006B46106851686A4603C308232F492D48D0 +:1020A00005F078FF0446002847D00369B3F5F01F18 +:1020B00043D8B0F86620B2F5AF6F3ED1284A02444B +:1020C00002F15C018B4238D35C3B224900209E1A0E +:1020D000FFF7B8FF04F16401074632460020FFF71E +:1020E000B1FFA3689F4228D1E368984208BF00254A +:1020F00023E00369B3F5F01F26D8428BB2F5AF6F2A +:1021000020D1174A024402F110018B4218D3103B30 +:10211000104900209D1AFFF795FF04F118010646AB +:102120002A460020FFF78EFFA3689E4202D1E36893 +:10213000984201D00D25AAE70025284603B0F0BD3E +:102140001025A4E70C25A2E70B25A0E74C8000088A +:10215000DCFF1D00000002085580000890FF1D00F4 +:102160000800FEF710B5037C044613B9006804F0BC +:102170001DF9204610BD00000023BFF35B8FC36034 +:10218000BFF35B8FBFF35B8F8360BFF35B8F7047E1 +:10219000BFF35B8F0068BFF35B8F704770B5054678 +:1021A0000C30FFF7F5FF044605F108063046FFF74F +:1021B000EFFFA04206D96D683046FFF7E9FF2544DE +:1021C000281A70BD3046FFF7E3FF201AF9E7000038 +:1021D00070B505464068A0B105F10C0605F1080090 +:1021E000FFF7D6FF04463046FFF7D2FF844204F1E2 +:1021F000FF34304694BF6D680025FFF7C9FF2C44BB +:10220000201A70BD38B50C460546FFF7C7FFA0423F +:1022100010D305F10800FFF7BBFF04446868BFF363 +:102220005B8FB4FBF0F100FB11440120AC60BFF305 +:102230005B8F38BD0020FCE72DE9F04114460746CE +:102240000D46FFF7C5FF844228BF0446D4B1B84607 +:1022500058F80C6B4046FFF79BFF3044286040461F +:102260007E68FFF795FF331A9C4203D801206C600B +:10227000BDE8F081A41B6B603B682044AB60E86064 +:102280000220F5E72046F3E738B50C460546FFF790 +:102290009FFFA04210D305F10C00FFF779FF044423 +:1022A0006868BFF35B8FB4FBF0F100FB11440120C1 +:1022B000EC60BFF35B8F38BD0020FCE72DE9FF41E8 +:1022C0008846694607466C46FFF7B6FF002506B20A +:1022D00004EBC606B4420AD0626808EB0501206828 +:1022E0000834FFF757FB54F8043C1D44F2E7294635 +:1022F0003846FFF7C9FF284604B0BDE8F08100006A +:10230000F8B505460C300F46FFF742FF05F1080609 +:1023100004463046FFF73CFFA042304688BF6C6859 +:10232000FFF736FF201A386020B12C683046FFF7DF +:102330002FFF2044F8BD000073B5144606460D4635 +:10234000FFF72CFF8442019028BF0446DCB101A9AD +:102350003046FFF7D5FF019B33B93268C5E9023338 +:10236000C5E9002401200CE09C42286038BF01949C +:10237000019884426860F5D93368241A0220AB6062 +:10238000EC6002B070BD2046FBE700002DE9FF4184 +:102390000F4669466C46FFF7CFFF00B2002604EBFC +:1023A000C005AC4209D0D4F80480B81954F8081B11 +:1023B00042464644FFF7EEFAF3E7304604B0BDE884 +:1023C000F081000038B50546FFF7E0FF04460146FE +:1023D0002846FFF717FF204638BD000008B103F07C +:1023E000E5BF70477047000010B4134602681468D8 +:1023F0000022A4465DF8044B6047000000F58050C1 +:1024000090F859047047000000F5805090F852048D +:102410007047000000F5805090F9580470470000A4 +:102420004E207047302383F3118800F58052D2F894 +:102430009C34D2F898041844D2F894341844D2F852 +:102440007C341844D2F88C341844D2F888341844B8 +:10245000002383F31188704700F58050C0F85414AE +:10246000012070472DE9F04F0C4600F5805185B0F2 +:102470001F4691F8523405469046BDF838909BB1FE +:10248000D1F878340133C1F878342368980006D441 +:10249000237B082B0BD9627B0AB10F2B07D9D1F80C +:1024A0007C340133C1F87C344FF0FF3010E030232E +:1024B00083F31188EB6AD3F8C42012F4001B0AD00E +:1024C000D1F8803400200133C1F8803480F31188C2 +:1024D00005B0BDE8F08F20684822D3F8C43000284A +:1024E000C3F3044A6B6AB4BF40F08040800412FB1F +:1024F0000A334FEA4A161860226852004FEA0A620D +:1025000044BF40F000501860207B42EA00425A600D +:10251000607B10B342F440125A60D1F8B02401320B +:10252000C1F8B024AA1902F58352117B41F02001B1 +:102530001173207B039300F0E3FF0330039B8010B3 +:102540005FFA8BF20BF1010B82420DDA04EB820190 +:1025500003EB820249689160F2E7AA1902F58352FF +:10256000117B60F34511E3E70122EB6A05EB4A11A9 +:1025700002FA0AF201F58251C3F8D020AB191831E2 +:1025800004F10C0203F58253C3E90487234653F890 +:10259000040B934241F8040BF9D11B882E440B80A5 +:1025A00041F2680346F803A006F5805609F00303DC +:1025B00096F86C2043F0100322F01F02134386F8B4 +:1025C0006C30002383F3118842463B46214628465F +:1025D000CDF8009000F05AFF012079E72DE9F0478F +:1025E00000F58056044696F85254002D40F00381C1 +:1025F000037C032B40F0948028462B462F465FFA3D +:1026000080FC944510DA01EBCC0E51F83CC0BCF1D3 +:10261000000F04DBDEF804C0BCF1000F02DB013761 +:102620000130ECE70133FBE7302080F31188E06AEA +:10263000F3B9D0F8803043F00203C0F880304E2365 +:10264000E06A002F6FD1D0F8803043F00103C0F86A +:1026500080306A4B6A4A1B6803F1805303F52C53A0 +:102660009B009342A36240F2B080664800F0E6FE11 +:102670004D2B42D8DFF884814FEA034EDFF8889172 +:10268000D8F800C04EEA8C0EC0F884E00CF18050FF +:1026900000F52C508000606103EB0C00D4F82CC0D6 +:1026A000C3F14E03C8F80000DCF8800040F03000B1 +:1026B000CCF880004FF0000CD4F81480E6465FFAA6 +:1026C0008CF08242BCDD01EBC00A51F830000028DA +:1026D00010DBDAF804A0BAF1000F0BDA09EA0040C7 +:1026E0000AF07F0A40EA0A0040F0084048F82E004D +:1026F0000EF1010E0CF1010CE1E7836923F00103F7 +:10270000836100F0A1FE0646E36A9B69D90704D500 +:1027100000F09AFE831BFA2BF6D9002383F311886D +:102720002846BDE8F087B7EB530F3DD2DFF8CCE089 +:102730004FEA074CDEF800304CEA830CC0F888C042 +:1027400003F1805003EB4703002700F52C50CEF82F +:102750000030BC468000A061E06AD0F8803043F0D1 +:102760000C03C0F88030D4F818E0FBB29A427FF72F +:1027700070AF51F8330001EBC3080028D8F80430DB +:1027800001DB002B0EDB20F0604023F0604340F0C3 +:10279000005043F000434EF83C000EEBCC000CF12F +:1027A000010C43600137E0E7836923F00103836193 +:1027B00000F04AFE0646E36A9B69DA07ADD500F0F1 +:1027C00043FE831BFA2BF6D9A7E7E26A936923F04D +:1027D0000103936100F038FE0746E36A9B69DB075B +:1027E00005D500F031FEC31BFA2BF6D995E701257C +:1027F00086F8525491E7002592E700BFEC63002071 +:10280000FCB50040608000080000FF0713B500F52C +:1028100080540191606CFFF7DBFC1F280AD920224D +:102820000199606CFFF74AFDA0F12003584258411E +:1028300002B010BD0020FBE708B5302383F31188F8 +:1028400000F58050406CFFF797FC002383F311885C +:1028500008BD0000002202608281426082607047F1 +:102860000022002310B5C0E90023002304460C30E9 +:1028700020F8043CFFF7EEFF204610BD2DE9F0479D +:102880009A4688B0074688469146302383F31188DC +:1028900007F580546846FFF7E3FF606CFFF77EFCA6 +:1028A0001F282ED920226946606CFFF78BFD202857 +:1028B00027D194F8523423B303AD444605AB2E46DA +:1028C000083403CE9E4244F8080C44F8041C3546F4 +:1028D000F5D130682060B388A380DDE90023C9E921 +:1028E0000023BDF80830AAF80030002383F31188D4 +:1028F00053464A464146384608B0BDE8F04700F026 +:10290000B3BD002080F3118808B0BDE8F087000057 +:102910002DE9F84F0023064600F581540546884608 +:102920001034C0E90133274B46F8303B3746384670 +:102930002037FFF795FFA742F9D105F580544FF4F2 +:10294000805305F5A3594FF0000A266300266764FB +:1029500005F5835709F110094FF0000B1037E663B6 +:10296000C4E90D36012384F8403084F84830A7F1DB +:102970001800203747E910ABFFF76CFF47F8286CC9 +:102980004F45F4D1B8F1010F84F85884A4F85A6483 +:10299000A4F85C64A4F85E6484F86064A4F86264DB +:1029A000A4F86464A4F8666484F8686402D90648EC +:1029B00000F044FD054B284653F82830EB62BDE893 +:1029C000F88F00BFB080000884800008A080000855 +:1029D000044B10B5197804464A1C1A70FFF798FF8B +:1029E000204610BDE96300202DE9F04300295AD0AC +:1029F0002E4E2F48B6FBF1F481428CBF0A201120E5 +:102A0000431EB4FBF0F700FB1740DDB220B1022BF0 +:102A10001846F5D8002032E07B1EB3F5806F2ED229 +:102A2000C5EBC5084FF47A7308F103044FEAE40ECE +:102A3000C4F3C7040EF10109281B0EFB033E5FFA25 +:102A400080FC59FA80F0BEFBF0F0B0F5617F18DC35 +:102A500083B2601C5CFA80F07843B6FBF0F08142F0 +:102A6000D8D1611E0F29D5D80CF1FF310729D1D853 +:102A70000120138057801071547182F806C0BDE8A0 +:102A8000F08308F1FF34E010C4F3C70400F1010E35 +:102A90002D1B00FB03335FFA85FC5EFA85F5B3FB63 +:102AA000F5F39BB2D5E70846E9E700BF00B4C404DC +:102AB0003F420F0030B50D4B05200D4D1C786C4387 +:102AC0008C420ED159780120518099785171D97872 +:102AD0009171197911715B7903EB83035B001380AA +:102AE00030BD013803F10603E8D1F9E7F0800008B2 +:102AF00040420F0038B540F27772C36A154CC3F8F4 +:102B0000BC200722C36AC3F8C8202268C16A9300A8 +:102B100043F4C023C1F8A03002F1805302F16C01EC +:102B2000C56A03F52C53EA3289009B00226041F00C +:102B3000E061094AC361C5F8C01003F5D87103F517 +:102B40006A7341629342836202D9044800F076FCC2 +:102B500038BD00BFEC630020FCB500406080000879 +:102B60002DE9F04F00F580551F4689B0044695F8D1 +:102B7000583489469046022B04D90026304609B0C5 +:102B8000BDE8F08FA84A52F8231009B942F8230093 +:102B9000A648C4F80C9001782774C9B9302383F390 +:102BA0001188A34BD3F8EC2042F48072C3F8EC20D8 +:102BB000D3F8942042F48072C3F89420D3F8942080 +:102BC00022F48072C3F894200123037081F31188EA +:102BD00095F851347BB9302383F31188954A95F8E1 +:102BE0005834D35C0BB3012B28D0012385F8513422 +:102BF000002383F31188302383F31188E26A9369F9 +:102C000023F01003936100F01FFC8246E36A9E6983 +:102C100016F0080619D000F017FCA0EB0A03FA2BF7 +:102C2000F4D9002686F31188A8E70321132001F0C8 +:102C3000A1FF0321152001F09DFFD6E703211420F9 +:102C400001F098FF03211620F5E79A6942F001028E +:102C50009A6100F0F9FB8246E36A9A69D00706D4CC +:102C600000F0F2FBA0EB0A03FA2BF5D9D9E79A6939 +:102C70004FF0000A42F002029A61E36AC3F854A0DE +:102C80008AF3118804F5825B686CFFF775FA0BF123 +:102C9000100B202200216846FEF7A2FE02A8FFF7D3 +:102CA000D9FD6A460BEB06030DF1180ECDF818A0FE +:102CB00094460833BCE80300F44543F8080C43F895 +:102CC000041C6246F4D1DCF8000020361860B6F52A +:102CD000806F9CF804201A71DBD1002304F5A25206 +:102CE000494620461A3285F8503485F85334FFF7A8 +:102CF0007BFE064690B9E26A936923F00103936173 +:102D000000F0A2FB0546E36A9B69D9077FF535AF62 +:102D100000F09AFB431BFA2BF5D92EE795F85E34A9 +:102D2000C5F86C94591E95F85F34E26A013B1B02AA +:102D300043EA416395F8601401390B43B5F85C141C +:102D4000013943EA0143D361B8F1000F36D004F5ED +:102D5000A352414620460232FFF7ACFE90B9E26A28 +:102D6000936923F00103936100F06EFB0546E36A6B +:102D70009B69DA077FF501AF00F066FB431BFA2B76 +:102D8000F5D9FAE695F86724C5F87084511E95F8D0 +:102D90006824E36A013A120142EA012295F86614B6 +:102DA00001390A43B5F86414013942EA014242F498 +:102DB0000002DA604FF42062E36A9A64E36A4FF03B +:102DC00000082046C3F8BC80FFF794FE85F85984BC +:102DD0006FF04042E36A1A65174AE36A5A654FF09A +:102DE0000222E36A9A654FF0FF32E36AC3F8E020FB +:102DF0000322E36A9742DA653FF4C0AEE26A936960 +:102E000023F00103936100F01FFB0746E36A9B690F +:102E1000DB0705D500F018FBC31BFA2BF6D9ACE68F +:102E2000012385F85234A9E6E0630020E86300201E +:102E30000044025898800008550200022DE9F04F26 +:102E4000054689B090469946002741F2680A00F588 +:102E50008056EB6AD3F8D830FB40D80751D505EB44 +:102E600047124FEA471B52441379190749D4D6F841 +:102E700084340133C6F8843405F5A553C3E90089C9 +:102E800013799A0605EB0B0248BFD6F8B4345244C6 +:102E900044BF0133C6F8B434137943F00803137107 +:102EA000DB0723D596F8533403B305F582546846FF +:102EB000FFF7D6FC03AB18345C4404F1080C20681F +:102EC000083454F8041C1A46644503C21346F6D16C +:102ED0002068694610602846A2889A800123ADF8D0 +:102EE00008302B68CDE90089DB6B9847D6F8A83409 +:102EF000D6F854040133C6F8A83410B103681B692E +:102F000098470137202FA4D109B0BDE8F08F000009 +:102F10002DE9F04F0F468DB0044600F097FA824637 +:102F20008946002F5BD1E36AD3F8A02012F4FE0F8C +:102F300003D100200DB0BDE8F08FD3F8A42092019A +:102F400041BF04F58051D1F898240132C1F898248A +:102F5000D3F8A4205606ECD0D3F8A450E669C5F304 +:102F600005254823E8464FF0000B03FB0566404665 +:102F7000FFF770FC326851004ABF22F06043C2F391 +:102F80008A4343F00043920048BF43F080430093DC +:102F9000736813F400131BBF012304F580528DF8EE +:102FA0000D308DF80D301EBFD2F8B8340133C2F8A1 +:102FB000B834F38803F00F038DF80C309DF80C0043 +:102FC00000F09EFA5FFA8BF3984225D9F2180CA90B +:102FD0000BF1010B127A0B4403F82C2CEEE7012FB6 +:102FE000A7D1E36AD3F8B02012F4FE0FA1D0D3F832 +:102FF000B420950141BF04F58051D1F898240132E5 +:10300000C1F89824D3F8B420500692D0D3F8B45025 +:10301000266AC5F30525A4E7EFB9E36AC3F8A8500B +:1030200004A807ADFFF71CFC98E80F0007C52B802C +:103030000023204604A9ADF81830236804F5805415 +:10304000DB6BCDE904A9984758B1D4F8903401332B +:10305000C4F890346EE7012FE2D1E36AC3F8B850A8 +:10306000DEE7D4F8943401200133C4F8943461E7E6 +:103070002DE9F04105460F4600F5805401263946FA +:103080002846FFF745FF10B184F85364F7E7D4F8FA +:10309000A834D4F854040133C4F8A83420B1036828 +:1030A000BDE8F0411B691847BDE8F081C36AF0B57F +:1030B0001A6C12F47F0F2BD01B6C00F5805441F278 +:1030C00068054FF0010CC4F8AC340023471900EB3D +:1030D00043125E012A44117911F0020F15D04907FD +:1030E00013D4B959C66A0CFA01F1D6F8CCE011EA4A +:1030F0000E0F0AD0C6F8D410117941F004011171F5 +:10310000D4F88C240132C4F88C240133202BDED176 +:10311000F0BD00002B4B70B51E561B5C012B30D848 +:10312000294D2A4A55F8233052F8264013B349B3A3 +:10313000236D9A0510D54FF40073236500F086F9CE +:1031400050EA01020B4602D0013861F10003024649 +:1031500055F82600FFF772FE236D9B012CD54FF02A +:10316000007255F82630226503F58053012283F85A +:10317000592421E001232365102323654FF4805354 +:10318000236570BD236DDA0702D4236D5B0706D576 +:103190000523002155F826002365FFF769FF236DFD +:1031A000D80602D4236D590606D55023012155F8BF +:1031B00026002365FFF75CFF55F82600BDE8704048 +:1031C000FFF774BF9C800008E0630020A080000827 +:1031D00008B5302383F31188FFF768FF002383F3DA +:1031E000118808BDC36AD3F8C00010F07C5005D028 +:1031F000D3F8C40080F40010C0F3405070470000C2 +:1032000008B5302383F3118800F58050406CFEF739 +:10321000C5FF002383F3118843090CBF0120002060 +:1032200008BD000000F5805393F8592462B1C16ACB +:103230008A6922F001028A61D3F89C240132C3F822 +:103240009C24002283F85924704700002DE9F7439D +:10325000302181F3118800F58251002541F2680E7A +:103260004FF00108103100F5805C00EB4514744408 +:10327000267977071CD4F6061AD58E69D0F82C90DB +:1032800008FA06F6D9F8CC703E4211D04F68019783 +:103290000F689742019F9F410AD2C9F8D4602679EE +:1032A00046F004062671DCF888440134CCF88844E2 +:1032B00001352031202DD8D1002383F3118803B0AC +:1032C000BDE8F083F8B51E4600230F46054613708F +:1032D0001446FFF795FF80F0010038701EB12846B4 +:1032E000FFF780FF2070F8BD2DE9F04F85B09946BB +:1032F0000D468046164691F800B0DDE90EA3029314 +:103300001378019300F0A2F82B7804460F4613B906 +:103310003378002B41D022463B464046FFF796FFCC +:10332000FFF756FFFFF77EFF4B4632462946FFF771 +:10333000C9FF2B7833B1BBF1000F03D0012005B0DA +:10334000BDE8F08F337813B1019B002BF6D108F55F +:10335000805303935445029B77EB03031DD2039BD9 +:10336000D3F85404C8B10368AAEB04011B6898475A +:103370004B46324629464046FFF7A4FF2B7813B14F +:10338000BBF1000FDAD1337813B1019B002BD5D1FB +:1033900000F05CF804460F46DCE70020CFE70000B1 +:1033A000002108B50846FFF7B5FEBDE8084001F06A +:1033B00071B8000008B501210020FFF7ABFEBDE8A1 +:1033C000084001F067B8000008B500210120FFF7B0 +:1033D000A1FEBDE8084001F05DB80000012108B57C +:1033E0000846FFF797FEBDE8084001F053B800001B +:1033F00000B59BB0EFF3098168226846FEF7CAFA70 +:10340000EFF30583014B9B6BFEE700BF00ED00E08F +:1034100008B5FFF7EDFF000000B59BB0EFF30981A1 +:1034200068226846FEF7B6FAEFF30583014B5B6B43 +:10343000FEE700BF00ED00E0FEE700000FB408B5B6 +:10344000029802F08BFAFEE702F0DEBF02F0C0BF86 +:1034500013B56C46031D84E8060094E8030083E876 +:103460000500012002B010BD73B58568019155B10A +:103470001B885B0707D4D0E900369B6B9847019AFD +:10348000C1B23046A847012002B070BDF0B58668D1 +:1034900089B005460C465EB1BDF838305B070AD4EA +:1034A000D0E900379B6B98472246C1B23846B047F7 +:1034B000012009B0F0BD0022002301F10806CDE98A +:1034C000002300230A46ADF8083003AB1068083229 +:1034D00052F8041C1C46B24203C42346F6D11068BD +:1034E00020609288A280FFF7B1FF0423ADF8083076 +:1034F0002B68CDE90001DB6B694628469847D7E782 +:10350000082817D909280CD00A280CD00B280CD071 +:103510000C280CD00D280CD00E2814BF40203020D1 +:1035200070470C20704710207047142070471820F7 +:1035300070472020704700002DE9F041456A15B919 +:103540004162BDE8F0814B68AC4623F06047C3F3AD +:103550008A464FEAD37EC3F3807816EA230638BF43 +:103560003E462B465A68BEEBD27F22F060440AD01A +:10357000002A18DAA40CB44217D19D420FD10D6075 +:10358000DEE71346EEE7A74207D102F08044C2F31C +:10359000807242450BD054B1EFE708D2EDE7CCF88A +:1035A00000100B60CDE7B44201D0B442E5D81A68F0 +:1035B0009C46002AE5D11960C3E700002DE9F047D9 +:1035C000089D01F0070400EBD1004FF47F494FEA5A +:1035D000D508224405F00705944201D1BDE8F087E3 +:1035E00004F0070705F0070A111B08EBD50E574535 +:1035F0003E4613F80EC038BF5646C6F108068E4246 +:1036000028BF0E46E108415C34443544B94029FAEC +:1036100006F721FA0AF1FFB28CEA010147FA0AF72C +:1036200039408CEA010C03F80EC0D5E780EA01208E +:10363000082341F2210201B2013B4000002980B27F +:10364000B8BF504013F0FF03F5D1704738B50C46B2 +:103650008D18A54200D138BD14F8011BFFF7E6FF15 +:10366000F7E7000042684AB11368818943604389E3 +:1036700001339BB29942438138BF83811046704722 +:1036800070B588B0044620220D4668460021FEF73A +:10369000A7F920460495FFF7E5FF024660B16B46A7 +:1036A000054608AE1C46083503CCB44245F8080C64 +:1036B00045F8041C2346F5D1104608B070BD000043 +:1036C000082817D909280CD00A280CD00B280CD0B0 +:1036D0000C280CD00D280CD00E2814BF4020302010 +:1036E00070470C2070471020704714207047182036 +:1036F0007047202070470000082817D90C280CD9E3 +:1037000010280CD914280CD918280CD920280CD929 +:1037100030288CBF0F200E207047092070470A20E8 +:1037200070470B2070470C2070470D207047000039 +:103730002DE9F843078C0446072F1ED900254FF6C4 +:10374000FF73D0E90298C5F12006A5F1200029FAFF +:1037500005F1083508FA06F628FA00F0314301436E +:103760001846C9B2FFF762FF402D0346EBD13A4637 +:10377000E169BDE8F843FFF769BF4FF6FF70BDE8A8 +:10378000F883000010B54B6823B9CA8A63F30902B5 +:10379000CA8210BD04691A681C600361C38A013BB8 +:1037A000C3824A60EFE700002DE9F84F1D46CB8A3F +:1037B0000F468146C3F30901924605290B4630D0D6 +:1037C0000020AAB207F11A049EB21FFA80F8042E54 +:1037D0000FD8904503F1010306D30A44FB8A62F334 +:1037E00009030120FB821AE01AF800600130E65458 +:1037F000EAE79045F1D2A1F1050B1C237C68BBFBE5 +:10380000F3F203FB12BB1FFA8BF6002C45D148469E +:10381000FFF728FF044638B978606FF00200BDE872 +:10382000F88F4FF00008E6E7002606607860ADB23A +:103830004FF0000B454510D90AEB0803221D13F881 +:10384000011B08F101089155B1B21FFA88F81B2934 +:103850002BD0454506F10106F1D8FB8AC3F30902D6 +:10386000154465F30903BCE701321C4692B2236894 +:10387000002BF9D16B1F0B441C21B3FBF1F3013377 +:103880009BB29A42D3D2BBF1000FD0D14846FFF78A +:10389000E9FE20B9C4F800B0BFE70122E7E7C0F8AD +:1038A00000B05E4620600446C1E74545D5D948468C +:1038B000FFF7D8FE08B92060AFE7C0F800B00026D7 +:1038C00020600446B6E700002DE9F04F1C4607468D +:1038D00088462DED028B83B05B690192002B00F0CE +:1038E0009A80238C2BB1E269002A00F09480072B88 +:1038F00035D807F10C00FFF7B5FE054638B96FF073 +:103900000205284603B0BDEC028BBDE8F08F1422FF +:103910000021FEF765F8228CE16905F10800FEF749 +:1039200039F8208C48F00041013080B2FFF7E4FE06 +:10393000FFF7C6FE013880B2208401302874384673 +:103940006369228C1B782A4403F01F0363F03F0352 +:10395000137269602946FFF7EFFD0125D1E74FF0AB +:10396000000900F10C034FF0800A4E464D4608EE68 +:10397000103A18EE100AFFF775FE83460028BED0F5 +:1039800014220021FEF72CF8002E3AD1019B0222CE +:10399000ABF808300BF1080E1FFA82FC218C0CF1F9 +:1039A0000100BCF1060F80B201D88E422BD3FFF785 +:1039B000A3FE8E4208BF4FF0400AFFF781FE626906 +:1039C0000138013512781BFA80F1013002F01F0234 +:1039D0002DB242EA491289F001094AEA020A48F086 +:1039E000004281F808A059468BF810003846CBF801 +:1039F00004204FF0000AFFF79FFD238CB342B8D19B +:103A00007FE70022C6E7E169895D01360EF8021002 +:103A1000B6B20132C0E76FF0010572E7F8B515469E +:103A20000E463022002104461F46FDF7D9FF069BB3 +:103A3000B5F5001FA760636004F11000079B34BF59 +:103A40006A094FF6FF72E661A362002397B29A42B9 +:103A500006D800230360A782E3822383E360F8BDD6 +:103A60000660013330462036F1E7000003781BB9C9 +:103A70004BB2002BC8BF0170704700000078704740 +:103A8000F8B50C46C969074611B9238C002B37D10C +:103A9000257E1F2D34D8387828BB228C072A2CD8B5 +:103AA000268A36F003032BD14FF6FF70FFF7CEFDC9 +:103AB00020F0010031024FF6FF72400441EA056137 +:103AC000400C41EA4025234629463846FFF7FCFED4 +:103AD000002807DD626913780133DBB21F2B88BF32 +:103AE00000231370F8BD218A2D0645EA0125054300 +:103AF0002046FFF71DFE0246E5E76FF00300F1E701 +:103B00006FF00100EEE7000070B58AB0044616467B +:103B10000021282268461D46FDF762FFBDF83830B7 +:103B200069462046ADF810300F9B05939DF8403054 +:103B30008DF81830119B0793BDF84830CDE9026528 +:103B4000ADF82030FFF79CFF0AB070BD2DE9F041C1 +:103B5000D36905460C4616460BB9138C5BBB377E02 +:103B60001F2F28D895F80080B8F1000F26D03046D6 +:103B7000FFF7DEFD337821020246284641EAC331D1 +:103B8000338A41EA080141EA076141EA03413346C9 +:103B900041F08001FFF798FE00280ADD3378012B01 +:103BA00007D1726913780133DBB21F2B88BF002362 +:103BB0001370BDE8F0816FF00100FAE76FF00300C9 +:103BC000F7E70000F0B58BB004460D46174600211C +:103BD000282268461E46FDF703FF9DF84C30294613 +:103BE00020465A1E534253416A468DF800309DF8D4 +:103BF0004030ADF81030119B05939DF848308DF89A +:103C00001830149B0793BDF85430CDE90276ADF817 +:103C10002030FFF79BFF0BB0F0BD0000406A00B101 +:103C200004307047436A1A68426202691A6003618D +:103C3000C38A013BC38270472DE9F041D0F8208050 +:103C400014461D46184E4146002709B9BDE8F081CB +:103C5000D1E90223A21A65EB0303964277EB030333 +:103C60001ED2036A8B420DD1FFF78CFD036A1B68DD +:103C7000036203690B60C38A0161013B016AC3826D +:103C80008846E2E7FFF77EFD0B68C8F8003003695D +:103C90000B60C38A0161013BC382D8F80010D4E7EE +:103CA00088460968D1E700BF80841E002DE9F04FE7 +:103CB0008BB00D4614469B46DDF850908046002898 +:103CC00000F01881B9F1000F00F01481531E3F2B52 +:103CD00000F21081012A03D1BBF1000F40F00A81EC +:103CE0000023CDE90833B8F81430B5EBC30F4FEA21 +:103CF000C30703D300200BB0BDE8F08F2B199F4200 +:103D0000D8F80C3036BF7F1B2746FFB21BB9D8F856 +:103D10001030002B7AD0272D4DD8C5F1280600236E +:103D20002946B742009308ABD8F808002CBFF6B27A +:103D30003E46A7EB060A354432465FFA8AFAFFF799 +:103D40003DFCB8F81430282103F10053053BDB009B +:103D50000493D8F80C300393039B13B1BAF1000F0E +:103D60002CD1D8F8100040B1BAF1000F05D008AB43 +:103D70005246691A0096FFF721FC38B2002FB9D0DD +:103D800066070AD00AAB624203EBD40102F00702D5 +:103D900011F8083C134101F8083C082C3DD9102CBF +:103DA00040F2B580202C40F2B780BBF1000F00F04C +:103DB0009C80082335E0BA460026C2E7049BE02B2E +:103DC00028BFE02306930B44AB42059315D95A1B39 +:103DD0000398691A0096924508AB00F1040034BFBD +:103DE0005246D2B20792FFF7E9FB079A1644AAEBB4 +:103DF000020A1544F6B25FFA8AFA049B069A0599FC +:103E00009B1A0493039B1B680393A5E700933A4610 +:103E100008AB2946D8F80800ADE7BBF1000F13D076 +:103E20000123B4EBC30F6BD0082C12D89DF82030BF +:103E3000621E23FA02F2D50706D54FF0FF3202FACE +:103E400004F423438DF820309DF8203089F80030A9 +:103E500051E7102C12D8BDF82030621E23FA02F26E +:103E6000D10706D54FF0FF3202FA04F42343ADF830 +:103E70002030BDF82030A9F800303CE7202C0FD8C6 +:103E80000899631E21FA03F3DA0705D54FF0FF32D4 +:103E900002FA04F40C430894089BC9F800302AE79E +:103EA000402C2AD0611EC4F12102A4F12103DDE9D6 +:103EB000086526FA01F105FA02F225FA03F3114327 +:103EC0001943CB0711D50122A4F12003C4F120012D +:103ED00002FA03F322FA01F1A2400B43524263EBD0 +:103EE000430332432B43CDE90823DDE90823C9E925 +:103EF000002300E76FF00100FDE66FF00800FAE62E +:103F0000082CA1D9102CB4D9202CEED8C4E7BBF1D1 +:103F1000000FAED0022384E7BBF1000FBCD0042316 +:103F20007FE70000012A30B5144638BF012485B070 +:103F30000025402C28BF4024012ACDE9025518D87D +:103F40001B788DF8083063070AD004AB624203EB9C +:103F5000D40502F0070215F8083C934005F8083C28 +:103F6000034600912246002102A8FFF727FB05B077 +:103F700030BD082AE4D9102A03D81B88ADF80830D0 +:103F8000E1E7202A95BF1B68D3E900230293CDE91E +:103F90000223D8E710B5CB681BB98B600B618B820D +:103FA00010BD04691A681C600361C38A013BC382A7 +:103FB000CA60F0E703064CBFC0F3C0300220704770 +:103FC00008B50246FFF7F6FF022806D15306C2F3F2 +:103FD0000F2001D100F0030008BDC2F30740FBE74A +:103FE0002DE9F04F93B004460D46CDE903230A684E +:103FF0001046FFF7DFFF0228824614BFC2F30626F1 +:104000000026002A80F2F88112F0C04940F0F481C5 +:10401000097B002900F0F081022803D02378B34205 +:1040200040F0ED81C2F3046310462944069302F088 +:104030007F030593FFF7C4FF059B002283464FEAE9 +:104040008348002348EA0A4848EA4668CE78CDE922 +:104050000823F30948EA0008029368D0059B02464A +:1040600008A92046009353466768B847002800F027 +:10407000C981276A4FB9414604F10C00FFF700FBE4 +:10408000074690B96FF0020055E03B6998450DD0A6 +:104090003F68002FF9D1414604F10C00FFF7F0FA18 +:1040A00007460028EED0236A3B60276297F817C0C6 +:1040B00006F01F08CCF3840CACEB0800A8EB0C0353 +:1040C0001FFA80FE0028B8BF0EF120001FFA83FE01 +:1040D000B8BF00B2002B0793B8BF0EF12003D7E999 +:1040E0000221BCBF1BB2079352EA010338D0039BE5 +:1040F0004FF0000CDFF81CE39A1A049B63EB0101FC +:1041000096457CEB01032BD36B7B97F81AE0734544 +:1041100019D1029B002B78D0012821DC7868F8B9EE +:10412000DFF8ECC2944570EB010316D337E0276A41 +:1041300027B96FF00C0013B0BDE8F08F3B699845CC +:10414000B4D03F68F4E7B24890427CEB010301D35E +:104150000020F0E7029B002BFAD0079B0F2B17DC07 +:10416000FA7DB3003946204602F0030203F07C03D7 +:104170001343FB75FFF706FB6B7BBB76029B3BB9DA +:10418000FB7DC3F38402013262F38603FB75D0E743 +:104190006A7BBB7E9A42DBD1029B002B35D0B309F0 +:1041A000022B32D0039B142200210DA8BB60049B7C +:1041B000FB60FDF715FC039B0AA920460A93049BAC +:1041C000ADF83EB00B932B1D8DF840A00C932B7BCC +:1041D0008DF84180013BDBB2ADF83C30069B8DF899 +:1041E0004230059B8DF8433094F82C3083F0010366 +:1041F0008DF84430A3689847FB7DC3F384030133F3 +:1042000003F01F039B02FB82A2E7FB7DC6F3401273 +:10421000B2EBD31F40F0F980C3F38403434540F071 +:10422000FB80029AB6092B7B002A52D016F00106B9 +:1042300061D1032B40F2F380039B394604F10C005B +:10424000BB60049BFB60FB8A66F30903AE1DFB8227 +:1042500032462B7B033BDBB2FFF7A6FA00280CDAD1 +:1042600039462046FFF78EFAFB7DC3F38403013302 +:1042700003F01F039B02FB8204E7AB88DDE908849F +:104280003B834FF6FF73C9F12000A9F1200228FA01 +:1042900009F109F1080904FA00F024FA02F20143D5 +:1042A00018461143C9B2FFF7C1F9B9F1400F0346EF +:1042B000E9D1B88231462A7B033AD2B2FFF7C6F978 +:1042C000FB7DB882DA43C2F3C01262F3C713FB75F9 +:1042D0003EE786B92E1D013B394604F10C00DBB2E6 +:1042E0003246FFF761FA0028BADB2A7B3146B88AEA +:1042F000013AD2B2E2E7F98A013BC1F30901DAB22D +:1043000004295BD8281D002307F11B069A4208D90F +:1043100010F801CB013306F801C00131DBB20529E9 +:10432000F4D1039993420A9138BF043304992CBF06 +:10433000002355FA83F30B9107F11B010C91796867 +:104340000E930D91291DFB8AADF83EB0C3F309030E +:104350008DF840A08DF841801A44069B8DF84230BC +:10436000059BADF83C208DF8433094F82C3083F059 +:1043700001038DF844300023B88A7B602A7B013A20 +:10438000FFF764F93B8BB882834203D1A3680AA983 +:104390002046984720460AA9FFF7FCFDFB7DBA8A14 +:1043A000C3F38403013303F01F039B02FB823B8BA7 +:1043B0009A420CBF00206FF01000BCE67B68002B17 +:1043C000AFD0052001E01C3033461E68002EFAD124 +:1043D000091A2E1D081D184401EB090C5FFA89F318 +:1043E000BCF11B0F9DD89A429BD916F8013B09F1ED +:1043F000010900F8013BEFE76FF009009BE66FF061 +:104400000A0098E66FF00B0095E66FF00D0092E65B +:1044100040420F0080841E006FF00E008BE66FF0AC +:104420000F0088E6EFF30983054968334A6B22F0F1 +:1044300001024A6383F30988002383F311887047DC +:1044400000EF00E0302080F3118862B60D4B0E4A79 +:10445000D96821F4E0610904090C0A430B49DA60C8 +:10446000D3F8FC2042F08072C3F8FC20084AC2F85E +:10447000B01F116841F0010111602022DA7783F842 +:104480002200704700ED00E00003FA0555CEACC5F0 +:10449000001000E0302310B583F311880E4B5B68E9 +:1044A00013F4006314D0F1EE103AEFF309844FF0E7 +:1044B0008073683CE361094BDB6B236684F30988F6 +:1044C00001F012FA10B1064BA36110BD054BFBE7DA +:1044D00083F31188F9E700BF00ED00E000EF00E092 +:1044E0003F0400084204000808B5074B074A196852 +:1044F00001F03D01996053680BB190689847BDE8A1 +:104500000840FFF7C7BF00BF00000240F46300206F +:1045100008B5084B1968890901F03D018A019A60C4 +:10452000054AD3680BB110699847BDE80840FFF70A +:10453000B1BF00BF00000240F463002008B5084B83 +:104540001968090C01F03D010A049A60054A536993 +:104550000BB190699847BDE80840FFF79BBF00BFCB +:1045600000000240F463002008B5084B1968890D6B +:1045700001F03D018A059A60054AD3690BB1106AC2 +:104580009847BDE80840FFF785BF00BF0000024024 +:10459000F463002008B5074B074A596801F03D0154 +:1045A000D960536A0BB1906A9847BDE80840FFF79D +:1045B00071BF00BF00000240F463002008B5084B43 +:1045C0005968890901F03D018A01DA60054AD36A18 +:1045D0000BB1106B9847BDE80840FFF75BBF00BF09 +:1045E00000000240F463002008B5084B5968090C2C +:1045F00001F03D010A04DA60054A536B0BB1906B80 +:104600009847BDE80840FFF745BF00BF00000240E3 +:10461000F463002008B5084B5968890D01F03D018D +:104620008A05DA60054AD36B0BB1106C9847BDE878 +:104630000840FFF72FBF00BF00000240F4630020D6 +:1046400008B5074B074A196801F03D019960536CA2 +:104650000BB1906C9847BDE80840FFF71BBF00BF47 +:1046600000040240F463002008B5084B196889096A +:1046700001F03D018A019A60054AD36C0BB1106DBF +:104680009847BDE80840FFF705BF00BF000402409F +:10469000F463002008B5084B1968090C01F03D01CE +:1046A0000A049A60054A536D0BB1906D9847BDE8B6 +:1046B0000840FFF7EFBE00BF00040240F463002093 +:1046C00008B5084B1968890D01F03D018A059A600B +:1046D000054AD36D0BB1106E9847BDE80840FFF74F +:1046E000D9BE00BF00040240F463002008B5074BA8 +:1046F000074A596801F03D01D960536E0BB1906EC5 +:104700009847BDE80840FFF7C5BE00BF000402405F +:10471000F463002008B5084B5968890901F03D0190 +:104720008A01DA60054AD36E0BB1106F9847BDE875 +:104730000840FFF7AFBE00BF00040240F463002052 +:1047400008B5084B5968090C01F03D010A04DA600C +:10475000054A536F0BB1906F9847BDE80840FFF7CB +:1047600099BE00BF00040240F463002008B5084B66 +:104770005968890D01F03D018A05DA60054AD36F59 +:1047800013B1D2F880009847BDE80840FFF782BE19 +:1047900000040240F463002000230C4910B51A46BF +:1047A0000B4C0B6054F82300026001EB4300043310 +:1047B0004260402BF6D1074A4FF0FF339360D3603D +:1047C000C2F80834C2F80C3410BD00BFF4630020F6 +:1047D00010810008000002400F28F8B510D91028F9 +:1047E00010D0112811D0122808D10F240720DFF88B +:1047F000C8E00126DEF80050A04208D9002653E0A8 +:104800000446F4E70F240020F1E70724FBE706FA4B +:1048100000F73D424AD1264C4FEA001C3D4304EBD1 +:1048200000160EEBC000CEF80050C0E90123FBB229 +:1048300073B12048D0F8D83043F00103C0F8D83025 +:10484000D0F8003143F00103C0F80031D0F8003156 +:1048500017F47F4F0ED01748D0F8D83043F002033A +:10486000C0F8D830D0F8003143F00203C0F800316E +:10487000D0F8003154F80C00036823F01F030360E4 +:10488000056815F00105FBD104EB0C033D2493F8FA +:104890000CC05F6804FA0CF43C602124056044619C +:1048A00012B1987B00F066F93046F8BD0130A3E7FD +:1048B0001081000800440258F463002010B5302431 +:1048C00084F31188FFF788FF002383F3118810BD5C +:1048D00010B50446807B00F063F901231549627B23 +:1048E00003FA02F20B6823EA0203DAB20B6072B930 +:1048F000114AD2F8D81021F00101C2F8D810D2F82C +:10490000001121F00101C2F80011D2F8002113F4C6 +:104910007F4F0ED1084BD3F8D82022F00202C3F803 +:10492000D820D3F8002122F00202C3F80021D3F8E6 +:10493000003110BDF46300200044025808B5302354 +:1049400083F31188FFF7C4FF002383F3118808BDA8 +:10495000026843681143016003B1184770470000C3 +:10496000024A136843F0C0031360704700780040A8 +:1049700013B50E4C204600F0BDFA04F114000023DC +:104980004FF400720A49009400F07AF9094B4FF491 +:104990000072094904F13800009400F0F3F9074A65 +:1049A000074BC4E9172302B010BD00BF7864002094 +:1049B000E464002061490008E466002000780040BB +:1049C00000E1F505037C30B5244C002918BF0C46E6 +:1049D000012B11D1224B98420ED1224BD3F8E82063 +:1049E00042F08042C3F8E820D3F8102142F0804220 +:1049F000C3F81021D3F810312268036EC16D03EBA8 +:104A000052038466B3FBF2F36268150442BF23F0DD +:104A1000070503F0070343EA4503CB60A36843F0AF +:104A200040034B60E36843F001038B6042F49673EC +:104A300043F001030B604FF0FF330B62510505D5C6 +:104A400012F0102205D0B2F1805F04D080F86430FB +:104A500030BD7F23FAE73F23F8E700BF108200084C +:104A600078640020004402582DE9F047C66D0546E1 +:104A70003768F469210734621AD014F0080118BFAE +:104A80004FF48071E20748BF41F02001A3074FF0C7 +:104A9000300348BF41F04001600748BF41F080014A +:104AA00083F31188281DFFF753FF002383F3118838 +:104AB000E2050AD5302383F311884FF48061281D65 +:104AC000FFF746FF002383F311884FF030094FF0C2 +:104AD000000A14F0200838D13B0616D54FF03009F3 +:104AE00005F1380A200610D589F31188504600F0E8 +:104AF0007DF9002836DA0821281DFFF729FF27F065 +:104B000080033360002383F31188790614D562068D +:104B100012D5302383F31188D5E913239A4208D1A3 +:104B20002B6C33B127F040071021281DFFF710FF31 +:104B30003760002383F31188E30618D5AA6E136942 +:104B4000ABB15069BDE8F047184789F31188736A23 +:104B5000284695F86410194000F0E6F98AF31188A8 +:104B6000F469B6E7B06288F31188F469BAE7BDE882 +:104B7000F0870000090100F16043012203F5614361 +:104B8000C9B283F8001300F01F039A4043099B0049 +:104B900003F1604303F56143C3F880211A60704755 +:104BA00000F01F0301229A40430900F160409B007E +:104BB00000F5614003F1604303F56143C3F88020D1 +:104BC000C3F88021002380F800337047F8B51546FC +:104BD000826804460B46AA4200D28568A16926690C +:104BE000761AB5420BD218462A46FCF7D3FEA369C3 +:104BF0002B44A3612846A3685B1BA360F8BD0CD9B6 +:104C0000AF1B18463246FCF7C5FE3A46E168304411 +:104C1000FCF7C0FEE3683B44EBE718462A46FCF786 +:104C2000B9FEE368E5E7000083689342F7B5044600 +:104C3000154600D28568D4E90460361AB5420BD215 +:104C40002A46FCF7A7FE63692B4463612846A368E4 +:104C50005B1BA36003B0F0BD0DD93246AF1B0191C1 +:104C6000FCF798FE01993A46E0683144FCF792FE61 +:104C7000E3683B44E9E72A46FCF78CFEE368E4E797 +:104C800010B50A440024C361029B8460C1600261C4 +:104C90000362C0E90000C0E9051110BD08B5D0E904 +:104CA0000532934201D1826882B982680132826002 +:104CB0005A1C426119700021D0E904329A4224BF83 +:104CC000C368436100F0C0FE002008BD4FF0FF3014 +:104CD000FBE7000070B5302304460E4683F31188CD +:104CE000A568A5B1A368A269013BA360531CA36199 +:104CF00015782269934224BFE368A361E3690BB18D +:104D000020469847002383F31188284607E0314660 +:104D1000204600F089FE0028E2DA85F3118870BD94 +:104D20002DE9F74F04460E4617469846D0F81C90DA +:104D30004FF0300A8AF311884FF0000B154665B129 +:104D40002A4631462046FFF741FF034660B94146F7 +:104D5000204600F069FE0028F1D0002383F311887B +:104D6000781B03B0BDE8F08FB9F1000F03D00190BC +:104D70002046C847019B8BF31188ED1A1E448AF325 +:104D80001188DCE7C160C361009B82600362C0E9F7 +:104D900005111144C0E9000001617047F8B50446EF +:104DA0000D461646302383F31188A768A7B1A36880 +:104DB000013BA36063695A1C62611D70D4E904322F +:104DC0009A4224BFE3686361E3690BB120469847C8 +:104DD000002080F3118807E03146204600F024FED1 +:104DE0000028E2DA87F31188F8BD0000D0E9052336 +:104DF00010B59A4201D182687AB9826800210132E5 +:104E000082605A1C82611C7803699A4224BFC3687D +:104E1000836100F019FE204610BD4FF0FF30FBE724 +:104E20002DE9F74F04460E4617469846D0F81C90D9 +:104E30004FF0300A8AF311884FF0000B154665B128 +:104E40002A4631462046FFF7EFFE034660B9414649 +:104E5000204600F0E9FD0028F1D0002383F31188FB +:104E6000781B03B0BDE8F08FB9F1000F03D00190BB +:104E70002046C847019B8BF31188ED1A1E448AF324 +:104E80001188DCE7026843681143016003B11847E9 +:104E9000704700001430FFF743BF00004FF0FF33AE +:104EA0001430FFF73DBF00003830FFF7B9BF0000F6 +:104EB0004FF0FF333830FFF7B3BF00001430FFF777 +:104EC00009BF00004FF0FF311430FFF703BF0000AF +:104ED0003830FFF763BF00004FF0FF323830FFF784 +:104EE0005DBF0000012914BF6FF013000020704760 +:104EF000FFF73EBD044B036000234360C0E902336B +:104F000001230374704700BF2882000810B53023C6 +:104F1000044683F31188FFF755FD02230020237414 +:104F200080F3118810BD000038B5C36904460D46F2 +:104F30001BB904210844FFF7A5FF294604F114001A +:104F4000FFF7ACFE002806DA201D4FF40061BDE833 +:104F50003840FFF797BF38BD0268436811430160CE +:104F600003B118477047000013B5406B00F580543B +:104F7000D4F8A4381A681178042914D1017C0229C4 +:104F800011D11979012312898B4013420BD101A948 +:104F90004C3002F0D9F9D4F8A4480246019B21799B +:104FA000206800F0DFF902B010BD0000143002F0FC +:104FB0005BB900004FF0FF33143002F055B9000028 +:104FC0004C3002F02DBA00004FF0FF334C3002F0AD +:104FD00027BA0000143002F029B900004FF0FF3169 +:104FE000143002F023B900004C3002F0F9B900008F +:104FF0004FF0FF324C3002F0F3B900000020704750 +:1050000010B500F58054D4F8A4381A681178042932 +:1050100017D1017C022914D15979012352898B407F +:1050200013420ED1143002F0BBF8024648B1D4F856 +:10503000A4484FF4407361792068BDE8104000F047 +:105040007FB910BD406BFFF7DBBF00007047000069 +:105050007FB5124B01250426044603600023057426 +:1050600000F1840243602946C0E902330C4B0290F0 +:10507000143001934FF44073009602F06DF8094B21 +:1050800004F69442294604F14C000294CDE90063F1 +:105090004FF4407302F034F904B070BD5082000840 +:1050A00045500008694F00080A68302383F31188CF +:1050B0000B790B3342F823004B79133342F823006A +:1050C0008B7913B10B3342F8230000F58053C3F8FA +:1050D000A41802230374002080F311887047000095 +:1050E00038B5037F044613B190F85430ABB90125AD +:1050F000201D0221FFF730FF04F114006FF00101C1 +:10510000257700F0ADFC04F14C0084F854506FF0AA +:105110000101BDE8384000F0A3BC38BD10B5012145 +:1051200004460430FFF718FF0023237784F8543037 +:1051300010BD000038B504460025143002F024F8F4 +:1051400004F14C00257702F0F3F8201D84F8545048 +:105150000121FFF701FF2046BDE83840FFF750BFAF +:1051600090F8803003F06003202B06D190F8812066 +:105170000023212A03D81F2A06D800207047222A9C +:10518000FBD1C0E91D3303E0034A4267072282676F +:10519000C3670120704700BF3C23002037B500F5EE +:1051A0008055D5F8A4381A68117804291AD1017CE1 +:1051B000022917D11979012312898B40134211D189 +:1051C00000F14C04204602F073F958B101A92046C1 +:1051D00002F0BAF8D5F8A4480246019B217920686C +:1051E00000F0C0F803B030BD01F10B03F0B550F88A +:1051F000236085B004460D46FEB1302383F3118849 +:1052000004EB8507301D0821FFF7A6FEFB6806F1B9 +:105210004C005B691B681BB1019002F0A3F8019878 +:1052200003A902F091F8024648B1039B29462046A3 +:1052300000F098F8002383F3118805B0F0BDFB68F7 +:105240005A691268002AF5D01B8A013B1340F1D13C +:1052500004F18002EAE70000133138B550F821402C +:10526000ECB1302383F3118804F58053D3F8A428DC +:105270001368527903EB8203DB689B695D6845B173 +:1052800004216018FFF768FE294604F1140001F0BC +:1052900091FF2046FFF7B4FE002383F3118838BD49 +:1052A0007047000001F05EBA01234022002110B5D2 +:1052B000044600F8303BFCF793FB0023C4E90133BC +:1052C00010BD000010B53023044683F3118824225A +:1052D000416000210C30FCF783FB204601F064FAAA +:1052E00002230020237080F3118810BD70B500EBFD +:1052F0008103054650690E461446DA6018B1102243 +:105300000021FCF76DFBA06918B110220021FCF709 +:1053100067FB31462846BDE8704001F04BBB0000FA +:1053200083682022002103F0011310B50446836036 +:105330001030FCF755FB2046BDE8104001F0C6BB1D +:10534000F0B4012500EB810447898D40E4683D43BA +:10535000A469458123600023A2606360F0BC01F072 +:10536000E3BB0000F0B4012500EB810407898D4008 +:10537000E4683D436469058123600023A2606360A3 +:10538000F0BC01F059BC000070B5022300250446B2 +:10539000242203702946C0F888500C3040F8045C81 +:1053A000FCF71EFB204684F8705001F097FA636802 +:1053B0001B6823B129462046BDE87040184770BDE0 +:1053C0000378052B10B504460AD080F88C300523ED +:1053D000037043681B680BB1042198470023A36046 +:1053E00010BD00000178052906D190F88C20436893 +:1053F00002701B6803B118477047000070B590F841 +:105400007030044613B1002380F8703004F180023C +:10541000204601F07FFB63689B68B3B994F8803045 +:1054200013F0600535D00021204601F071FE002107 +:10543000204601F061FE63681B6813B10621204617 +:105440009847062384F8703070BD2046984700289E +:10545000E4D0B4F88630A26F9A4288BFA36794F96B +:105460008030A56F002B4FF0300380F20381002DB8 +:1054700000F0F280092284F8702083F31188002163 +:105480002046D4E91D23FFF76DFF002383F3118825 +:10549000DAE794F8812003F07F0343EA022340F225 +:1054A0000232934200F0C58021D8B3F5807F48D006 +:1054B0000DD8012B3FD0022B00F09380002BB2D1EE +:1054C00004F1880262670222A267E367C1E7B3F5CD +:1054D000817F00F09B80B3F5407FA4D194F88230A7 +:1054E000012BA0D1B4F8883043F0020332E0B3F5C9 +:1054F000006F4DD017D8B3F5A06F31D0A3F5C063BE +:10550000012B90D86368204694F882205E6894F856 +:105510008310B4F88430B047002884D043686367B0 +:105520000368A3671AE0B3F5106F36D040F6024265 +:1055300093427FF478AF5C4B63670223A367002339 +:10554000C3E794F88230012B7FF46DAFB4F8883054 +:1055500023F00203A4F88830C4E91D55E56778E715 +:10556000B4F88030B3F5A06F0ED194F882302046A5 +:1055700084F88A3001F010FA63681B6813B10121C6 +:1055800020469847032323700023C4E91D339CE77A +:1055900004F18B0363670123C3E72378042B10D145 +:1055A000302383F311882046FFF7BAFE85F3118874 +:1055B0000321636884F88B5021701B680BB120466F +:1055C000984794F88230002BDED084F88B30042387 +:1055D000237063681B68002BD6D0022120469847B1 +:1055E000D2E794F8843020461D0603F00F010AD557 +:1055F00001F082FA012804D002287FF414AF2B4B6B +:105600009AE72B4B98E701F069FAF3E794F88230B8 +:10561000002B7FF408AF94F8843013F00F01B3D05F +:105620001A06204602D501F08BFDADE701F07CFDA6 +:10563000AAE794F88230002B7FF4F5AE94F884301A +:1056400013F00F01A0D01B06204602D501F060FD2B +:105650009AE701F051FD97E7142284F8702083F354 +:1056600011882B462A4629462046FFF769FE85F316 +:105670001188E9E65DB1152284F8702083F3118862 +:1056800000212046D4E91D23FFF75AFEFDE60B2238 +:1056900084F8702083F311882B462A462946204639 +:1056A000FFF760FEE3E700BF808200087882000811 +:1056B0007C82000838B590F870300446002B3ED04C +:1056C000063BDAB20F2A34D80F2B32D8DFE803F0CA +:1056D00037313108223231313131313131313737DF +:1056E000856FB0F886309D4214D2C3681B8AB5FB23 +:1056F000F3F203FB12556DB9302383F311882B4667 +:105700002A462946FFF72EFE85F311880A2384F8DE +:1057100070300EE0142384F87030302383F3118846 +:10572000002320461A461946FFF70AFE002383F39A +:10573000118838BDC36F03B198470023E7E7002104 +:10574000204601F0E5FC0021204601F0D5FC63680D +:105750001B6813B10621204698470623D7E70000AF +:1057600010B590F870300446142B29D017D8062BAA +:1057700005D001D81BB110BD093B022BFBD800217D +:10578000204601F0C5FC0021204601F0B5FC63680D +:105790001B6813B1062120469847062319E0152BF4 +:1057A000E9D10B2380F87030302383F31188002374 +:1057B0001A461946FFF7D6FD002383F31188DAE76E +:1057C000C3689B695B68002BD5D1C36F03B1984751 +:1057D000002384F87030CEE70023826803750369E4 +:1057E0001B6899689142FBD25A680360426010605E +:1057F0005860704700238268037503691B689968C5 +:105800009142FBD85A68036042601060586070474C +:1058100008B50846302383F311880A7D0023052A42 +:1058200006D8DFE802F00B050503120E826913604B +:105830004FF0FF338361FFF7CFFF002383F311881D +:1058400008BD8269936801339360D0E90032136028 +:105850005A60EDE7FFF7C0BF054BD96808751868B7 +:10586000026853601A600122D8600275FAF7D2BD4F +:10587000E86800200C4B30B5DD684B1C87B004464F +:105880000FD02B46094A684600F07EF92046FFF704 +:10589000E3FF009B13B1684600F080F9A86907B0E8 +:1058A00030BDFFF7D9FFF9E7E8680020115800087C +:1058B00038B50C4D04468161EB6881689A68914265 +:1058C00003D8BDE83840FFF787BF1846FFF792FFBF +:1058D00001230146EC6020462375BDE83840FAF705 +:1058E00099BD00BFE8680020044B1A68DB68906827 +:1058F0009B68984294BF002001207047E868002010 +:10590000084B10B51C68D868226853601A600122E1 +:10591000DC602275FFF76EFF01462046BDE81040AF +:10592000FAF778BDE868002038B50123084C002557 +:105930002370656001F0F8FD01F01EFE0549064880 +:1059400001F0F2FE0223237085F3118838BD00BFF9 +:10595000506B002088820008E868002008B572B605 +:10596000044B186500F026FD00F0E8FD024B032211 +:105970001A70FEE7E8680020506B002000F044B980 +:10598000034A516853685B1A9842FBD8704700BFBE +:10599000001000E08B600223086108468B8270478C +:1059A0008368A3F1840243F8142C026943F8442C61 +:1059B000426943F8402C094A43F8242CC268A3F1F9 +:1059C000200043F8182C022203F80C2C002203F8C4 +:1059D0000B2C034A43F8102C704700BF2D0400081D +:1059E000E868002008B5FFF7DBFFBDE80840FFF7D7 +:1059F00031BF0000024BDB6898610F20FFF72CBF1E +:105A0000E8680020302383F31188FFF7F3BF00001C +:105A100008B50146302383F311880820FFF72AFFD9 +:105A2000002383F3118808BD064BDB6839B1426857 +:105A300018605A60136043600420FFF71BBF4FF0EB +:105A4000FF307047E86800200368984206D01A6863 +:105A50000260506018469961FFF7FCBE7047000075 +:105A600038B504460D462068844200D138BD03682D +:105A700023605C608561FFF7EDFEF4E7036810B515 +:105A80009C68A2420CD85C688A600B604C60216004 +:105A9000596099688A1A9A604FF0FF33836010BD8D +:105AA000121B1B68ECE700000A2938BF0A2170B5F9 +:105AB00004460D460A26601901F030FD01F018FD7C +:105AC000041BA54203D8751C04462E46F3E70A2E94 +:105AD00004D90120BDE8704001F066BE70BD000031 +:105AE000F8B5144B0D460A2A4FF00A07D96103F1A5 +:105AF0001001826038BF0A224160196914460160B2 +:105B000048601861A81801F0F9FC01F0F1FC431B92 +:105B10000646A34206D37C1C28192746354601F0C9 +:105B2000FDFCF2E70A2F04D90120BDE8F84001F09E +:105B30003BBEF8BDE8680020F8B506460D4601F00A +:105B4000D7FC0F4A134653F8107F9F4206D12A46CE +:105B500001463046BDE8F840FFF7C2BFD169BB68D7 +:105B6000441A2C1928BF2C46A34202D92946FFF714 +:105B70009BFF224631460348BDE8F840FFF77EBF51 +:105B8000E8680020F8680020C0E90323002310B46F +:105B90005DF8044B4361FFF7CFBF000010B5194C0F +:105BA000236998420DD08168D0E9003213605A60B1 +:105BB0009A680A449A60002303604FF0FF33A361A0 +:105BC00010BD0268234643F8102F53600022026084 +:105BD00022699A4203D1BDE8104001F099BC936854 +:105BE00081680B44936001F083FC2269E16992684B +:105BF000441AA242E4D91144BDE81040091AFFF743 +:105C000053BF00BFE86800202DE9F047DFF8BC80F3 +:105C100008F110072C4ED8F8105001F069FCD8F8A4 +:105C20001C40AA68031B9A423ED814444FF0000956 +:105C3000D5E90032C8F81C4013605A60C5F80090DE +:105C4000D8F81030B34201D101F062FC89F3118819 +:105C5000D5E9033128469847302383F311886B69CF +:105C6000002BD8D001F044FC6A69A0EB04098246FD +:105C70004A450DD2022001F097FD0022D8F81030DD +:105C8000B34208D151462846BDE8F047FFF728BF88 +:105C9000121A2244F2E712EB09092946384638BFA6 +:105CA0004A46FFF7EBFEB5E7D8F81030B34208D00C +:105CB0001444C8F81C00211AA960BDE8F047FFF79A +:105CC000F3BEBDE8F08700BFF8680020E868002058 +:105CD00038B501F00DFC054AD2E90845031B181937 +:105CE00045F10001C2E9080138BD00BFE8680020A5 +:105CF00000207047FEE70000704700004FF0FF30C3 +:105D00007047000002290CD0032904D0012907485C +:105D100018BF00207047032A05D8054800EBC200D1 +:105D20007047044870470020704700BF6083000838 +:105D30004C2300201483000870B59AB0054608462D +:105D4000144601A900F0C2F801A8FBF741FE431C6C +:105D50000022C6B25B001046C5E90034237003235D +:105D6000023404F8013C01ABD1B202348E4201D8B6 +:105D70001AB070BD13F8011B013204F8010C04F8CD +:105D8000021CF1E708B5302383F311880348FFF7BD +:105D900005FA002383F3118808BD00BF586B00206B +:105DA00090F8803003F01F02012A07D190F881207B +:105DB0000B2A03D10023C0E91D3315E003F0600373 +:105DC000202B08D1B0F884302BB990F88120212AFB +:105DD00003D81F2A04D8FFF7C3B9222AEBD0FAE769 +:105DE000034A426707228267C3670120704700BFEA +:105DF0004323002007B5052917D8DFE801F019165D +:105E000003191920302383F31188104A01210190CE +:105E1000FFF76CFA019802210D4AFFF767FA0D4867 +:105E2000FFF788F9002383F3118803B05DF804FBC2 +:105E3000302383F311880748FFF752F9F2E7302344 +:105E400083F311880348FFF769F9EBE7B482000890 +:105E5000D8820008586B002038B50C4D0C4C2A46EF +:105E60000C4904F10800FFF767FF05F1CA0204F1CD +:105E700010000949FFF760FF05F5CA7204F1180028 +:105E80000649BDE83840FFF757BF00BF3084002007 +:105E90004C230020948200089E820008A9820008FA +:105EA00070B5044608460D46FBF792FDC6B2204683 +:105EB000013403780BB9184670BD32462946FBF70A +:105EC00073FD0028F3D10120F6E700002DE9F0472B +:105ED00005460C46FBF77CFD2C49C6B22846FFF769 +:105EE000DFFF08B11036F6B229492846FFF7D8FF80 +:105EF00008B11036F6B2632E0BD8DFF89080DFF8C9 +:105F00009090244FDFF898A02E7846B92670BDE80F +:105F1000F08729462046BDE8F04702F05DB8252EFF +:105F200030D1072241462846FBF73EFD80B91A4B87 +:105F3000224603F1140153F8040B8B4242F8040B80 +:105F4000F9D1198807359B78173411809370DBE7F6 +:105F5000082249462846FBF727FD98B9A21C0F4B9B +:105F6000197802320909C95D02F8041C13F8011BF3 +:105F700001F00F015345C95D02F8031CF0D118343C +:105F80000835C1E7013504F8016BBDE780830008DF +:105F9000A982000888830008F67F000800E8F11F46 +:105FA0000CE8F11FBFF34F8F044B1A695107FCD166 +:105FB000D3F810215207F8D1704700BF00200052DB +:105FC00008B50D4B1B78ABB9FFF7ECFF0B4BDA684C +:105FD000D10704D50A4A5A6002F188325A60D3F8D0 +:105FE0000C21D20706D5064AC3F8042102F18832F3 +:105FF000C3F8042108BD00BF8E8600200020005297 +:106000002301674508B5114B1B78F3B9104B1A698A +:10601000510703D5DA6842F04002DA60D3F8102164 +:10602000520705D5D3F80C2142F04002C3F80C21E9 +:10603000FFF7B8FF064BDA6842F00102DA60D3F8E6 +:106040000C2142F00102C3F80C2108BD8E8600200D +:10605000002000520F289ABF00F580604004002005 +:10606000704700004FF40030704700001020704768 +:106070000F2808B50BD8FFF7EDFF00F500330268D5 +:10608000013204D104308342F9D1012008BD00203F +:10609000FCE700000F2838B505463FD8FFF782FF20 +:1060A0001F4CFFF78DFF4FF0FF3307286361C4F8E3 +:1060B00014311DD82361FFF775FF030243F0240359 +:1060C000E360E36843F08003E36023695A07FCD48C +:1060D0002846FFF767FFFFF7BDFF4FF4003100F0E0 +:1060E00009FA2846FFF78EFFBDE83840FFF7C0BF2A +:1060F000C4F81031FFF756FFA0F108031B0243F06C +:106100002403C4F80C31D4F80C3143F08003C4F8F4 +:106110000C31D4F810315B07FBD4D9E7002038BD2F +:10612000002000522DE9F84F05460C46104645EA7E +:106130000203DE0602D00020BDE8F88F20F01F0029 +:10614000DFF8BCB0DFF8BCA0FFF73AFF04EB0008B3 +:10615000444503D10120FFF755FFEDE720222946F2 +:10616000204601F007FF10B920352034F0E72B4618 +:1061700005F120021F68791CDDD104339A42F9D160 +:1061800005F178431B481C4EB3F5801F1B4B38BFED +:10619000184603F1F80332BFD946D1461E46FFF731 +:1061A00001FF0760A5EB040C336804F11C0143F008 +:1061B00002033360231FD9F8007017F00507FAD1E6 +:1061C00053F8042F8B424CF80320F4D1BFF34F8FC8 +:1061D000FFF7E8FE4FF0FF332022214603602846F8 +:1061E000336823F00203336001F0C4FE0028BBD003 +:1061F0003846B0E7142100520C20005214200052FF +:10620000102000521021005210B5084C237828B1FC +:106210001BB9FFF7D5FE0123237010BD002BFCD066 +:106220002070BDE81040FFF7EDBE00BF8E86002055 +:106230002DE9F04F0D4685B0814658B111F00D069D +:1062400014BF2022082211F00803019304D0431E3A +:1062500003426AD0002435E0002E37D009F11F0137 +:1062600021F01F094FF00108324F05F00403DFF859 +:10627000D0A005EA080BBBF1000F32D07869C00747 +:106280002FD408F101080C37B8F1060FF3D19EB9ED +:10629000294D4946A819019201F090F904460028B9 +:1062A0003AD11836019A782EF3D1494601F086F991 +:1062B0000446002830D1019A4946204801F07EF971 +:1062C000044668BB204605B0BDE8F08F0029C9D15F +:1062D00001462846029201F071F90446E0B9029A9B +:1062E000C0E713B178694107CBD5AC0702D578690F +:1062F0008007C6D5019911B178690107C1D5182069 +:10630000494600FB08A0CDE9022301F057F90446F5 +:10631000DDE902230028B4D04A460021204601E0EE +:106320004A460021FBF75CFBCCE70246002E95D1E4 +:1063300098E700BF9C830008C0860020908600205C +:10634000A88600200121FFF773BF0000F8B5144DA7 +:1063500001241827134E40F2FF3200210120FBF7E1 +:106360003FFB07FB046001342A6955F80C1F01F05C +:1063700011F9062CF5D137254FF4C0542046FFF70C +:10638000E1FF014628B122460748BDE8F84001F088 +:1063900001B9C4EBC404013D4FEAD404EED1F8BD09 +:1063A0009C830008A88600209086002008B101F098 +:1063B00077B9704738B5054D00240334696855F83E +:1063C0000C0B00F0A9F8122CF7D138BD9C83000803 +:1063D00038B5EFF311859DB9EFF30584C4F30804D4 +:1063E000302334B183F31188FFF772FC85F31188F1 +:1063F00038BD83F31188FFF76BFC84F3118838BD37 +:10640000BDE83840FFF764BC10B5FFF7E1FF104C62 +:10641000C008104A002340EA4170C908A0FB04EC00 +:10642000A0FB020E1CEB0000A1FB044CA1FB02121E +:106430005B41001943EB0C0011EB0E0142F100022D +:10644000411842F10000090941EA007010BD00BF87 +:10645000CFF753E3A59BC4200244074BD2B210B53B +:10646000904200D110BD441C00B253F8200041F806 +:10647000040BE0B2F4E700BF504000580E4B30B5BB +:106480001C6F240405D41C6F1C671C6F44F400446B +:106490001C670A4C02442368D2B243F48073236021 +:1064A000074B904200D130BD441C51F8045B00B250 +:1064B00043F82050E0B2F4E7004402580048025884 +:1064C0005040005807B5012201A90020FFF7C4FF82 +:1064D000019803B05DF804FB13B50446FFF7F2FF23 +:1064E000A04205D0012201A900200194FFF7C6FFB8 +:1064F00002B010BD0144BFF34F8F064B884204D356 +:10650000BFF34F8FBFF36F8F7047C3F85C0220302B +:10651000F4E700BF00ED00E00144BFF34F8F064BEE +:10652000884204D3BFF34F8FBFF36F8F7047C3F818 +:1065300070022030F4E700BF00ED00E0704700007B +:10654000074B45F255521A6003225A6040F2FF721F +:106550009A604CF6CC421A600122024B1A707047C6 +:10656000004800583C870020034B1B781BB1034BAD +:106570004AF6AA221A6070473C870020004800585B +:10658000034B1A681AB9034AD2F8D0241A6070472C +:106590003887002000400258024B4FF48032C3F885 +:1065A000D02470470040025808B5FFF7E9FF024BBE +:1065B0001868C0F3806008BD3887002070B5BFF34D +:1065C0004F8FBFF36F8F1A4A0021C2F85012BFF3EA +:1065D0004F8FBFF36F8F536943F400335361BFF3A1 +:1065E0004F8FBFF36F8FC2F88410BFF34F8FD2F875 +:1065F000803043F6E074C3F3C900C3F34E335B014C +:1066000003EA0406014646EA81750139C2F8605280 +:10661000F9D2203B13F1200FF2D1BFF34F8F536912 +:1066200043F480335361BFF34F8FBFF36F8F70BD5F +:1066300000ED00E0FEE70000214B2248224A70B541 +:10664000904237D3214BC11EDA1C121A22F00302EA +:106650008B4238BF00220021FBF7C2F91C4A0023FD +:10666000C2F88430BFF34F8FD2F8803043F6E07425 +:10667000C3F3C900C3F34E335B0103EA04060146CA +:1066800046EA81750139C2F86C52F9D2203B13F108 +:10669000200FF2D1BFF34F8FBFF36F8FBFF34F8F38 +:1066A000BFF36F8F0023C2F85032BFF34F8FBFF399 +:1066B0006F8F70BD53F8041B40F8041BC0E700BF88 +:1066C000CC850008308900203089002030890020E6 +:1066D00000ED00E0074BD3F8D81021EA0001C3F821 +:1066E000D810D3F8002122EA0002C3F80021D3F821 +:1066F000003170470044025870B5D0E924430022AD +:106700004FF0FF359E6804EB42135101D3F80009A6 +:10671000002805DAD3F8000940F08040C3F80009EA +:10672000D3F8000B002805DAD3F8000B40F08040C6 +:10673000C3F8000B013263189642C3F80859C3F836 +:10674000085BE0D24FF00113C4F81C3870BD0000A4 +:10675000890141F02001016103699B06FCD41220EC +:10676000FFF70EB910B50A4C2046FEF79DFD094B08 +:10677000C4F89030084BC4F89430084C2046FEF71B +:1067800093FD074BC4F89030064BC4F8943010BD0D +:10679000408700200000084008840008DC870020B3 +:1067A000000004401484000870B503780546012BEE +:1067B0005CD1434BD0F89040984258D1414B0E21C8 +:1067C0006520D3F8D82042F00062C3F8D820D3F86F +:1067D000002142F00062C3F80021D3F80021D3F871 +:1067E000802042F00062C3F88020D3F8802022F09D +:1067F0000062C3F88020D3F88030FEF7BBF9324B3B +:10680000E360324BC4F800380023D5F89060C4F838 +:10681000003EC02323604FF40413A3633369002BAD +:10682000FCDA01230C203361FFF7AAF83369DB0798 +:10683000FCD41220FFF7A4F83369002BFCDA002601 +:106840002846A660FFF758FF6B68C4F81068DB683D +:10685000C4F81468C4F81C6883BB1D4BA3614FF0D7 +:10686000FF336361A36843F00103A36070BD194B5C +:106870009842C9D1134B4FF08060D3F8D82042F032 +:106880000072C3F8D820D3F8002142F00072C3F898 +:106890000021D3F80021D3F8802042F00072C3F821 +:1068A0008020D3F8802022F00072C3F88020D3F833 +:1068B0008030FFF70FFF0E214D209EE7064BCDE7FE +:1068C000408700200044025840140040030020028A +:1068D000003C30C0DC870020083C30C0F8B5D0F860 +:1068E0009040054600214FF000662046FFF730FF3C +:1068F000D5F8941000234FF001128F684FF0FF304D +:10690000C4F83438C4F81C2804EB431201339F4206 +:10691000C2F80069C2F8006BC2F80809C2F8080B97 +:10692000F2D20B68D5F89020C5F898306362102336 +:106930001361166916F01006FBD11220FFF720F83C +:10694000D4F8003823F4FE63C4F80038A36943F494 +:10695000402343F01003A3610923C4F81038C4F89E +:1069600014380B4BEB604FF0C043C4F8103B094B9D +:10697000C4F8003BC4F81069C4F80039D5F8983061 +:1069800003F1100243F48013C5F89820A362F8BD08 +:10699000E483000840800010D0F8902090F88A101E +:1069A000D2F8003823F4FE6343EA0113C2F800383A +:1069B000704700002DE9F84300EB8103D0F89050B8 +:1069C0000C468046DA680FFA81F94801166806F02D +:1069D0000306731E022B05EB41134FF0000194BF19 +:1069E000B604384EC3F8101B4FF0010104F1100338 +:1069F00098BF06F1805601FA03F3916998BF06F536 +:106A0000004600293AD0578A04F15801374349011A +:106A10006F50D5F81C180B430021C5F81C382B18F3 +:106A20000127C3F81019A7405369611E9BB3138A4D +:106A3000928B9B08012A88BF5343D8F89820981856 +:106A400042EA034301F140022146C8F89800284673 +:106A500005EB82025360FFF77BFE08EB8900C368F9 +:106A60001B8A43EA845348341E4364012E51D5F8EF +:106A70001C381F43C5F81C78BDE8F88305EB49179F +:106A8000D7F8001B21F40041C7F8001BD5F81C18EB +:106A900021EA0303C0E704F13F030B4A28462146DD +:106AA00005EB83035A60FFF753FE05EB4910D0F85E +:106AB000003923F40043C0F80039D5F81C3823EA24 +:106AC0000707D7E70080001000040002D0F89420E8 +:106AD0001268C0F89820FFF70FBE00005831D0F8B8 +:106AE000903049015B5813F4004004D013F4001FA8 +:106AF0000CBF0220012070474831D0F89030490186 +:106B00005B5813F4004004D013F4001F0CBF0220A4 +:106B10000120704700EB8101CB68196A0B68136094 +:106B20004B6853607047000000EB810330B5DD68AF +:106B3000AA691368D36019B9402B84BF402313603E +:106B40006B8A1468D0F890201C4402EB4110013C81 +:106B500009B2B4FBF3F46343033323F0030343EAC2 +:106B6000C44343F0C043C0F8103B2B6803F0030359 +:106B7000012B0ED1D2F8083802EB411013F4807FBC +:106B8000D0F8003B14BF43F0805343F00053C0F8EB +:106B9000003B02EB4112D2F8003B43F00443C2F841 +:106BA000003B30BD2DE9F041D0F8906005460C4621 +:106BB00006EB4113D3F8087B3A07C3F8087B08D5E6 +:106BC000D6F814381B0704D500EB8103DB685B683B +:106BD0009847FA071FD5D6F81438DB071BD505EB05 +:106BE0008403D968CCB98B69488A5A68B2FBF0F63D +:106BF00000FB16228AB91868DA6890420DD2121A80 +:106C0000C3E90024302383F3118821462846FFF787 +:106C10008BFF84F31188BDE8F081012303FA04F2AD +:106C20006B8923EA02036B81CB68002BF3D02146EA +:106C30002846BDE8F041184700EB81034A0170B5D2 +:106C4000DD68D0F890306C692668E66056BB1A445F +:106C50004FF40020C2F810092A6802F00302012A4A +:106C60000AB20ED1D3F8080803EB421410F4807F67 +:106C7000D4F8000914BF40F0805040F00050C4F830 +:106C8000000903EB4212D2F8000940F00440C2F8B8 +:106C900000090122D3F8340802FA01F10143C3F8D4 +:106CA000341870BD19B9402E84BF40202060206880 +:106CB0001A442E8A8419013CB4FBF6F440EAC4401D +:106CC00040F00050C6E700002DE9F843D0F890608E +:106CD00005460C464F0106EB4113D3F8088918F01E +:106CE000010FC3F808891CD0D6F81038DB0718D577 +:106CF00000EB8103D3F80CC0DCF81430D3F800E0CB +:106D0000DA68964530D2A2EB0E024FF000091A6005 +:106D1000C3F80490302383F31188FFF78DFF89F3C4 +:106D2000118818F0800F1DD0D6F834380126A640FF +:106D3000334217D005EB84030134D5F89050D3F8D3 +:106D40000CC0E4B22F44DCF8142005EB0434D2F874 +:106D500000E05168714514D3D5F8343823EA0606AB +:106D6000C5F83468BDE8F883012303FA01F203890A +:106D700023EA02030381DCF80830002BD1D09847C6 +:106D8000CFE7AEEB0103BCF81000834228BF0346F7 +:106D9000D7F8180980B2B3EB800FE3D89068A0F160 +:106DA000040959F8048FC4F80080A0EB090898443E +:106DB000B8F1040FF5D818440B4490605360C8E74D +:106DC0002DE9F84FD0F8905004466E69AB691E402B +:106DD00016F480586E6103D0BDE8F84FFEF7D4BAC0 +:106DE000002E12DAD5F8003E9B0705D0D5F8003EFC +:106DF00023F00303C5F8003ED5F80438204623F0FD +:106E00000103C5F80438FEF7EDFA370505D520462D +:106E1000FFF772FC2046FEF7D3FAB0040CD5D5F884 +:106E2000083813F0060FEB6823F470530CBF43F4DB +:106E3000105343F4A053EB6031071BD56368DB6844 +:106E40001BB9AB6923F00803AB612378052B0CD188 +:106E5000D5F8003E9A0705D0D5F8003E23F003038D +:106E6000C5F8003E2046FEF7BDFA6368DB680BB14B +:106E700020469847F30200F1BA80B70226D5D4F82D +:106E8000909000274FF0010A09EB4712D2F8003B1F +:106E900003F44023B3F5802F11D1D2F8003B002B2F +:106EA0000DDA62890AFA07F322EA0303638104EB2D +:106EB0008703DB68DB6813B1394620469847013702 +:106EC000D4F89430FFB29B689F42DDD9F00619D503 +:106ED000D4F89000026AC2F30A1702F00F0302F41A +:106EE000F012B2F5802F00F0CA80B2F5402F09D120 +:106EF00004EB8303002200F58050DB681B6A974295 +:106F000040F0B0803003D5F8185835D5E90303D5E3 +:106F100000212046FFF746FEAA0303D501212046A3 +:106F2000FFF740FE6B0303D502212046FFF73AFE30 +:106F30002F0303D503212046FFF734FEE80203D5D3 +:106F400004212046FFF72EFEA90203D50521204685 +:106F5000FFF728FE6A0203D506212046FFF722FE2E +:106F60002B0203D507212046FFF71CFEEF0103D5B6 +:106F700008212046FFF716FE700340F1A780E907BD +:106F800003D500212046FFF79FFEAA0703D5012164 +:106F90002046FFF799FE6B0703D502212046FFF735 +:106FA00093FE2F0703D503212046FFF78DFEEE0643 +:106FB00003D504212046FFF787FEA80603D5052147 +:106FC0002046FFF781FE690603D506212046FFF71C +:106FD0007BFE2A0603D507212046FFF775FEEB0549 +:106FE00074D520460821BDE8F84FFFF76DBED4F8F0 +:106FF00090904FF0000B4FF0010AD4F894305FFAF4 +:107000008BF79B689F423FF638AF09EB4713D3F8E5 +:10701000002902F44022B2F5802F20D1D3F80029B4 +:10702000002A1CDAD3F8002942F09042C3F8002964 +:10703000D3F80029002AFBDB3946D4F89000FFF78B +:1070400087FB22890AFA07F322EA0303238104EB70 +:107050008703DB689B6813B13946204698470BF1DC +:10706000010BCAE7910701D1D0F80080072A02F18D +:1070700001029CBF03F8018B4FEA18283FE704EB9D +:10708000830300F58050DA68D2F818C0DCF80820D5 +:10709000DCE9001CA1EB0C0C00218F4208D1DB685D +:1070A0009B699A683A449A605A683A445A6029E758 +:1070B00011F0030F01D1D0F800808C4501F10101DE +:1070C00084BF02F8018B4FEA1828E6E7BDE8F88F85 +:1070D00008B50348FFF774FEBDE80840FDF7DAB9CC +:1070E0004087002008B50348FFF76AFEBDE8084066 +:1070F000FDF7D0B9DC870020D0F8903003EB4111C8 +:10710000D1F8003B43F40013C1F8003B7047000086 +:10711000D0F8903003EB4111D1F8003943F400135B +:10712000C1F8003970470000D0F8903003EB4111EE +:10713000D1F8003B23F40013C1F8003B7047000076 +:10714000D0F8903003EB4111D1F8003923F400134B +:10715000C1F800397047000030B50433039C017258 +:10716000002104FB0325C160C0E90653049B0363AF +:10717000059BC0E90000C0E90422C0E90842C0E95B +:107180000A11436330BD00000022416AC260C0E9B9 +:107190000411C0E90A226FF00101FEF761BC000092 +:1071A000D0E90432934201D1C2680AB9181D704770 +:1071B00000207047036919600021C2680132C26073 +:1071C000C269134482699342036124BF436A036125 +:1071D000FEF73ABC38B504460D46E3683BB1626938 +:1071E0000020131D1268A3621344E36207E0237AB0 +:1071F00033B929462046FEF717FC0028EDDA38BDE2 +:107200006FF00100FBE70000C368C269013BC36087 +:107210004369134482699342436124BF436A4361D3 +:1072200000238362036B03B11847704770B53023A6 +:10723000044683F31188866A3EB9FFF7CBFF054603 +:1072400018B186F31188284670BDA36AE26A13F864 +:10725000015B9342A36202D32046FFF7D5FF0023D0 +:1072600083F31188EFE700002DE9F84F04460E463E +:10727000174698464FF0300989F311880025AA4631 +:10728000D4F828B0BBF1000F09D141462046FFF7E2 +:10729000A1FF20B18BF311882846BDE8F88FD4E90F +:1072A0000A12A7EB050B521A934528BF9346BBF170 +:1072B000400F1BD9334601F1400251F8040B9142B3 +:1072C00043F8040BF9D1A36A403640354033A3623A +:1072D000D4E90A239A4202D32046FFF795FF8AF3A6 +:1072E0001188BD42D8D289F31188C9E730465A4681 +:1072F000FAF750FBA36A5E445D445B44A362E7E790 +:1073000010B5029C0433017203FB0421C460C0E980 +:1073100006130023C0E90A33039B0363049BC0E9FF +:107320000000C0E90422C0E90842436310BD000028 +:10733000026A6FF00101C260426AC0E904220022C1 +:10734000C0E90A22FEF78CBBD0E904239A4201D19E +:10735000C26822B9184650F8043B0B6070470023FE +:107360001846FAE7C3680021C2690133C360436964 +:10737000134482699342436124BF436A4361FEF729 +:1073800063BB000038B504460D46E3683BB1236992 +:1073900000201A1DA262E2691344E36207E0237A27 +:1073A00033B929462046FEF73FFB0028EDDA38BD09 +:1073B0006FF00100FBE7000003691960C268013A41 +:1073C000C260C269134482699342036124BF436A65 +:1073D000036100238362036B03B118477047000009 +:1073E00070B530230D460446114683F31188866A32 +:1073F0002EB9FFF7C7FF10B186F3118870BDA36ADD +:107400001D70A36AE26A01339342A36204D3E16967 +:1074100020460439FFF7D0FF002080F31188EDE704 +:107420002DE9F84F04460D46904699464FF0300A34 +:107430008AF311880026B346A76A4FB94946204609 +:10744000FFF7A0FF20B187F311883046BDE8F88F21 +:10745000D4E90A073A1AA8EB0607974228BF17464D +:10746000402F1BD905F1400355F8042B9D4240F8ED +:10747000042BF9D1A36A40364033A362D4E90A232E +:107480009A4204D3E16920460439FFF795FF8BF354 +:1074900011884645D9D28AF31188CDE729463A4664 +:1074A000FAF778FAA36A3D443E443B44A362E5E719 +:1074B000D0E904239A4217D1C3689BB1836A8BB188 +:1074C000043B9B1A0ED01360C368013BC360C369C1 +:1074D0001A4483699A42026124BF436A036100230C +:1074E00083620123184670470023FBE700F060BA6F +:1074F000014B586A704700BF000C0040034B00224C +:1075000058631A610222DA60704700BF000C004025 +:10751000014B0022DA607047000C0040014B5863B9 +:10752000704700BF000C0040024B034A1A60034A38 +:107530005A607047908800203089002000000220A7 +:10754000074B494210B55C68201A08401968821A36 +:107550008A4203D3A24201D85A6010BD0020FCE742 +:107560009088002008B5302383F31188FFF7E8FFE7 +:10757000002383F3118808BD04480121044B0360F4 +:107580000023C0E901330C3000F016B998880020C0 +:1075900065750008CB1D083A23F00703591A521AE3 +:1075A000012110B4D2080024C0E9004384600C30EB +:1075B0001C605A605DF8044B00F0FEB82DE9F84FEE +:1075C000364ECD1D0F46002818BF0646082A4FEA42 +:1075D000D50538BF082206F10C08341D91464046F7 +:1075E00000F006F909F10701C9F1000E22462468EE +:1075F0006CB9404600F006F93368CBB3082249461F +:10760000E8009847044698B340E9026730E004EB8D +:10761000010CD4F804A00CEA0E0C0AF10100ACF144 +:10762000080304EBC0009842E0D9A0EB0C0CB5EBCA +:10763000EC0F4FEAEC0BD9D89C421CD204F10802A3 +:10764000AB45A3EB02024FEAE202626009D9691C72 +:10765000ED43206803EBC1025D44556043F83100FF +:1076600022601C465F60404644F8086B00F0CAF890 +:107670002046BDE8F88FAA45216802D11160234653 +:10768000EFE7013504EBC50344F8351003F10801B9 +:10769000401AC01058601360F1E700BF98880020BE +:1076A000F8B550F8043C044650F8085CA0F1080610 +:1076B00007332F1D0C35DB0840F8043C284600F04A +:1076C00097F83B469F421A6801D0B34228D20AB1CC +:1076D000964225D244F8082C54F8042C1E6001323E +:1076E00054F8081C06EBC200814206D148680244E7 +:1076F00044F8042C0A6844F8082C5868411C03EB31 +:10770000C1018E4207D154F8042C013202445A6060 +:1077100054F8082C1A602846BDE8F84000F072B80A +:107720001346CFE7FEE7000070B51B4B002504466B +:1077300086B058600E4685620163FCF783FE04F153 +:107740001003A560E562C4E904334FF0FF33C4E9D8 +:107750000044C4E90635FFF7CBFE2B46024604F190 +:1077600034012046C4E9082380230C4A2565FEF72E +:1077700011F901230A4AE0600092037568467268B5 +:107780000192B268CDE90223064BCDE90435FEF73C +:1077900029F906B070BD00BF506B0020208400089E +:1077A0002584000825770008024AD36A1843D0626E +:1077B000704700BFE8680020C0E9000081607047A2 +:1077C0008368013B002B10B583600CDA074BDC6843 +:1077D0004368A061206063601C6044600520FEF780 +:1077E0003BF8A06910BD0020FCE700BFE86800205E +:1077F00008B5302383F31188FFF7E2FF002383F3FA +:10780000118808BD08B5302383F3118883680133DC +:10781000002B836007DC036800211A680260506057 +:107820001846FEF745F8002383F3118808BD0000D1 +:107830004B6843608B688360CB68C3600B694361AE +:107840004B6903628B6943620B68036070470000F9 +:1078500008B53C4B40F2FF713B48D3F888200A43FF +:10786000C3F88820D3F8882022F4FF6222F00702B0 +:10787000C3F88820D3F88820D3F8E0200A43C3F85F +:10788000E020D3F808210A43C3F808212F4AD3F88F +:1078900008311146FFF7CCFF00F5806002F11C01B2 +:1078A000FFF7C6FF00F5806002F13801FFF7C0FF67 +:1078B00000F5806002F15401FFF7BAFF00F5806027 +:1078C00002F17001FFF7B4FF00F5806002F18C0156 +:1078D000FFF7AEFF00F5806002F1A801FFF7A8FFF7 +:1078E00000F5806002F1C401FFF7A2FF00F580609F +:1078F00002F1E001FFF79CFF00F5806002F1FC015E +:10790000FFF796FF02F58C7100F58060FFF790FF9E +:1079100000F01AF90E4BD3F8902242F00102C3F89E +:107920009022D3F8942242F00102C3F89422052257 +:10793000C3F898204FF06052C3F89C20054AC3F862 +:10794000A02008BD00440258000002582C84000802 +:1079500000ED00E01F00080308B500F0D7FAFDF7BE +:10796000E3FF104BD3F8DC2042F04002C3F8DC20E8 +:10797000D3F8042122F04002C3F80421D3F80431E3 +:10798000094B1A6842F008021A601A6842F00402B1 +:107990001A60FEF7F5FDFEF7D9FCBDE80840FEF7DA +:1079A0005BBA00BF0044025800180248704700004C +:1079B000114BD3F8E82042F00802C3F8E820D3F8CE +:1079C000102142F00802C3F810210C4AD3F81031FC +:1079D000D36B43F00803D363C722094B9A624FF07D +:1079E000FF32DA6200229A615A63DA605A60012239 +:1079F0005A611A60704700BF004402580010005CD2 +:107A0000000C0040094A08B51169D3680B40D9B28F +:107A10009B076FEA0101116107D5302383F31188B9 +:107A2000FDF7ACFF002383F3118808BD000C004074 +:107A3000064BD3F8DC200243C3F8DC20D3F8042142 +:107A40001043C3F80401D3F80431704700440258CE +:107A500008B53C4B4FF0FF31D3F8802062F0004274 +:107A6000C3F88020D3F8802002F00042C3F88020C1 +:107A7000D3F88020D3F88420C3F88410D3F884206E +:107A80000022C3F88420D3F88400D86F40F0FF4070 +:107A900040F4FF0040F4DF4040F07F00D867D86F2B +:107AA00020F0FF4020F4FF0020F4DF4020F07F00B2 +:107AB000D867D86FD3F888006FEA40506FEA50500B +:107AC000C3F88800D3F88800C0F30A00C3F8880020 +:107AD000D3F88800D3F89000C3F89010D3F8900042 +:107AE000C3F89020D3F89000D3F89400C3F8941012 +:107AF000D3F89400C3F89420D3F89400D3F89800F6 +:107B0000C3F89810D3F89800C3F89820D3F89800D9 +:107B1000D3F88C00C3F88C10D3F88C00C3F88C20F9 +:107B2000D3F88C00D3F89C00C3F89C10D3F89C10B9 +:107B3000C3F89C20D3F89C30FCF72EFEBDE808402B +:107B400000F0B8B90044025808B50122534BC3F8FD +:107B50000821534BD3F8F42042F00202C3F8F4207A +:107B6000D3F81C2142F00202C3F81C210222D3F8F0 +:107B70001C314C4BDA605A689104FCD54A4A1A60B1 +:107B800001229A60494ADA6000221A614FF44042A9 +:107B90009A61444B9A699204FCD51A6842F4807247 +:107BA0001A603F4B1A6F12F4407F04D04FF48032BA +:107BB0001A6700221A671A6842F001021A60384BED +:107BC0001A685007FCD500221A611A6912F03802AF +:107BD000FBD1012119604FF0804159605A67344A46 +:107BE000DA62344A1A611A6842F480321A602C4B05 +:107BF0001A689103FCD51A6842F480521A601A6818 +:107C00009204FCD52C4A2D499A6200225A631963CA +:107C100001F57C01DA6301F5E77199635A64284A3A +:107C20001A64284ADA621A6842F0A8521A601C4B99 +:107C30001A6802F02852B2F1285FF9D148229A61FD +:107C40004FF48862DA6140221A621F4ADA641F4ADE +:107C50001A651F4A5A651F4A9A6532231E4A1360E5 +:107C6000136803F00F03022BFAD10D4A136943F096 +:107C700003031361136903F03803182BFAD14FF093 +:107C80000050FFF7D5FE4FF08040FFF7D1FE4FF0D8 +:107C90000040BDE80840FFF7CBBE00BF00800051A8 +:107CA000004402580048025800C000F002000001E1 +:107CB0000000FF0100889008322060006302090183 +:107CC000470E0508DD0BBF01200000200000011059 +:107CD0000910E00000010110002000524FF0B042F6 +:107CE00008B5D2F8883003F00103C2F8883023B118 +:107CF000044A13680BB150689847BDE80840FCF788 +:107D0000C9BB00BFB08800204FF0B04208B5D2F820 +:107D1000883003F00203C2F8883023B1044A936824 +:107D20000BB1D0689847BDE80840FCF7B3BB00BF73 +:107D3000B08800204FF0B04208B5D2F8883003F088 +:107D40000403C2F8883023B1044A13690BB15069A7 +:107D50009847BDE80840FCF79DBB00BFB0880020F5 +:107D60004FF0B04208B5D2F8883003F00803C2F8EB +:107D7000883023B1044A93690BB1D0699847BDE8B4 +:107D80000840FCF787BB00BFB08800204FF0B0422E +:107D900008B5D2F8883003F01003C2F8883023B158 +:107DA000044A136A0BB1506A9847BDE80840FCF7D3 +:107DB00071BB00BFB08800204FF0B04310B5D3F8BE +:107DC000884004F47872C3F88820A30604D5124AC8 +:107DD000936A0BB1D06A9847600604D50E4A136BBC +:107DE0000BB1506B9847210604D50B4A936B0BB12E +:107DF000D06B9847E20504D5074A136C0BB1506C61 +:107E00009847A30504D5044A936C0BB1D06C9847EE +:107E1000BDE81040FCF73EBBB08800204FF0B043F7 +:107E200010B5D3F8884004F47C42C3F8882062057A +:107E300004D5164A136D0BB1506D9847230504D530 +:107E4000124A936D0BB1D06D9847E00404D50F4AE8 +:107E5000136E0BB1506E9847A10404D50B4A936E74 +:107E60000BB1D06E9847620404D5084A136F0BB16A +:107E7000506F9847230404D5044A936F0BB1D06F19 +:107E80009847BDE81040FCF705BB00BFB088002054 +:107E900008B50348FCF7E8FDBDE80840FCF7FABA6E +:107EA0007864002008B5FFF7ADFDBDE80840FCF799 +:107EB000F1BA0000062108B50846FCF75BFE062172 +:107EC0000720FCF757FE06210820FCF753FE062189 +:107ED0000920FCF74FFE06210A20FCF74BFE062185 +:107EE0001720FCF747FE06212820FCF743FE092156 +:107EF0007A20FCF73FFE07213220FCF73BFE0C21E5 +:107F00005220BDE80840FCF735BE000008B5FFF779 +:107F10009FFD00F00DF8FCF7EBFFFDF7C3F9FDF74F +:107F200095F8FFF743FDBDE80840FFF7DFBA000012 +:107F30000023054A19460133102BC2E9001102F152 +:107F40000802F8D1704700BFB08800200B460146F8 +:107F5000184600F001B8000010B5054C13462CB1CE +:107F60000A4601460220AFF3008010BD2046FCE720 +:107F70000000000010B501390244904201D10020F8 +:107F800005E0037811F8014FA34201D0181B10BD82 +:107F90000130F2E72DE9F041A3B1C91A1778014485 +:107FA000044603F1FF3C8C42204601D9002009E041 +:107FB0000578BD4204F10104F5D10CEB0405D61897 +:107FC000A54201D1BDE8F08115F8018D16F801ED4B +:107FD000F045F5D0E7E70000034611F8012B03F860 +:107FE000012B002AF9D170476F72672E6172647598 +:107FF00070696C6F742E437562654F72616E676550 +:108000002D7065726970682D686561767900000071 +:1080100053544D333248373F3F3F0053544D333272 +:10802000483733782F3732780053544D333248373E +:1080300034332F3735332F373530000001105A00D5 +:1080400003105900012058000320560040A2E4F11B +:10805000646891060041A3E5F2656992070000009B +:1080600043414E464449666163653A204D657373EA +:108070006167652052414D204F766572666C6F775F +:10808000210000004261642043414E4966616365FE +:1080900020696E6465782E00000100000001FF0079 +:1080A00000A0004000A4004000000000000000000C +:1080B000612B0008E9230008E93200085924000870 +:1080C000652400087D280008DD250008212400081B +:1080D00025240008FD230008E523000839280008AE +:1080E0000924000851340008152400080D28000850 +:1080F00001040E05054B02020E05054B04010E0599 +:10810000054B05010B04044B080106030346000060 +:1081100010000240080002400008024000000B006E +:1081200028000240080002400408024006010C003A +:1081300040000240080002400808024010020D0002 +:1081400058000240080002400C08024016030E00CE +:10815000700002400C0002401008024000040F00B2 +:10816000880002400C00024014080240060510007E +:10817000A00002400C000240180802401006110046 +:10818000B80002400C0002401C08024016072F00F5 +:108190001004024008040240200802400008380091 +:1081A000280402400804024024080240060939005D +:1081B000400402400804024028080240100A3A0025 +:1081C00058040240080402402C080240160B3B00F1 +:1081D000700402400C04024030080240000C3C00D5 +:1081E000880402400C04024034080240060D44009A +:1081F000A00402400C04024038080240100E450062 +:10820000B80402400C0402403C080240160F46002D +:1082100000960000000000000000000000000000C8 +:10822000000000000000000000000000B14E000847 +:108230009D4E0008D94E0008C54E0008D14E0008DA +:10824000BD4E0008A94E0008954E0008E54E0008F6 +:1082500000000000C94F0008B54F0008F14F0008AA +:10826000DD4F0008E94F0008D54F0008C14F000856 +:10827000AD4F0008FD4F00080000000001000000A5 +:108280000000000063300000848200084069002084 +:10829000506B00204172647550696C6F7400254208 +:1082A0004F415244252D424C002553455249414CE3 +:1082B000250000000200000000000000E951000855 +:1082C0005952000840004000008400201084002023 +:1082D0000200000000000000030000000000000099 +:1082E000A1520008000000001000000020840020BF +:1082F0000000000001000000000000004087002096 +:1083000001010200F55D0008055D0008A15D00089F +:10831000855D0008430000001C830008090243003B +:10832000020100C03209040000010202010005241C +:1083300000100105240100010424020205240600A6 +:1083400001070582030800FF09040100020A00007A +:1083500000070501024000000705810240000000FF +:1083600012000000688300081201100102000040A2 +:10837000091241570002010203010000040309042D +:1083800025424F415244250030313233343536379F +:1083900038394142434445460000000000010020B6 +:1083A00000FF010002000000000000300000040097 +:1083B0000800000000000024000008000400000085 +:1083C0000004000000FC0000020000000000043077 +:1083D00000800000080000000000003800000100DC +:1083E0000100000000000000FD530008B556000821 +:1083F00061570008400040007888002078880020FD +:10840000010000008888002080000000400100007A +:10841000080000000001000000100000080000003B +:108420006D61696E0069646C650000000000802A5F +:1084300000000000AAAAAAAA00000024FFFF000072 +:108440000000000000A00A0000210002000000005F +:10845000AAAAAAAA00000000FFFF0000000000096D +:10846000000009001400005400000000AAAAAAAAF3 +:1084700014000054FFFF0000000000000000000096 +:108480000A40100000000000AAAA8AAA00401000BA +:10849000FFFF0000990000000000000000810200C2 +:1084A00000000000AAAAAAAA00410100FFFF0000E4 +:1084B0000000007007000000000000000000000045 +:1084C000AAAAAAAA00000000FFFF00000000000006 +:1084D000000000000000000000000000AAAAAAAAF4 +:1084E00000000000FFFF000000000000000000008E +:1084F0000000000000000000AAAAAAAA00000000D4 +:10850000FFFF00000000000000000000000000006D +:1085100000000000AAAAAAAA00000000FFFF0000B5 +:10852000000000000000000000000000000000004B +:10853000AAAAAAAA00000000FFFF00000000000095 +:10854000000000000000000000000000AAAAAAAA83 +:1085500000000000FFFF000000000000000000001D +:10856000780500000000000000001E000000000070 +:10857000FE2A0100D2040000FF000000586B00201A +:1085800078640020000000001080000883040000D0 +:108590001B8000085004000029800008009600009D +:1085A0000000080096000000000800000400000021 +:1085B0007C830008000000000000000000000000B4 +:0C85C000000000000000000000000000AF :00000001FF diff --git a/Tools/bootloaders/CubeOrange-periph_bl.bin b/Tools/bootloaders/CubeOrange-periph_bl.bin index a470da6051..7968f86fed 100755 Binary files a/Tools/bootloaders/CubeOrange-periph_bl.bin and b/Tools/bootloaders/CubeOrange-periph_bl.bin differ diff --git a/Tools/bootloaders/CubeOrange-periph_bl.hex b/Tools/bootloaders/CubeOrange-periph_bl.hex index c5edc23201..3d90b77c7a 100644 --- a/Tools/bootloaders/CubeOrange-periph_bl.hex +++ b/Tools/bootloaders/CubeOrange-periph_bl.hex @@ -1,34 +1,34 @@ :020000040800F2 -:1000000000070020F1020008A1330008593300085E -:10001000813300085933000879330008F3020008DF -:10002000F3020008F3020008F30200088543000809 +:1000000000070020F102000839340008F13300082D +:1000100019340008F133000811340008F302000815 +:10002000F3020008F3020008F30200082544000868 :10003000F3020008F3020008F3020008F3020008CC :10004000F3020008F3020008F3020008F3020008BC -:10005000F3020008F3020008FD7700082978000881 -:100060005578000881780008AD78000849440008F8 -:10007000714400089D440008C9440008F544000884 -:100080001D45000849450008F3020008093300082F -:10009000313300081D33000845330008D9780008C3 +:10005000F3020008F3020008D97C0008057D0008BF +:10006000317D00085D7D0008897D0008E9440008B5 +:10007000114500083D450008694500089545000800 +:10008000BD450008E9450008F3020008A133000857 +:10009000C9330008B5330008DD330008B57D00081A :1000A000F3020008F3020008F3020008F30200085C :1000B000F3020008F3020008F3020008F30200084C :1000C000F3020008F3020008F3020008F30200083C :1000D000F3020008F3020008F3020008F30200082C -:1000E0003D790008F3020008F3020008F30200085B -:1000F000F3020008F3020008F30200087545000847 -:10010000F3020008F3020008C5790008F3020008B2 +:1000E000197E0008F3020008F3020008F30200087A +:1000F000F3020008F3020008F302000815460008A6 +:10010000F3020008F3020008A17E0008F3020008D1 :10011000F3020008F3020008F3020008F3020008EB -:10012000A1450008C9450008F5450008214600081A -:100130004D460008F3020008F3020008F30200082D +:10012000414600086946000895460008C146000897 +:10013000ED460008F3020008F3020008F30200088D :10014000F3020008F3020008F3020008F3020008BB -:1001500075460008A1460008CD460008F3020008D5 +:1001500015470008414700086D470008F3020008F2 :10016000F3020008F3020008F3020008F30200089B -:10017000F30200087D6E0008F3020008F302000895 -:10018000F3020008F3020008B1790008F302000846 +:10017000F3020008E1700008F3020008F30200082F +:10018000F3020008F30200088D7E0008F302000865 :10019000F3020008F3020008F3020008F30200086B :1001A000F3020008F3020008F3020008F30200085B :1001B000F3020008F3020008F3020008F30200084B :1001C000F3020008F3020008F3020008F30200083B -:1001D000F3020008696E0008F3020008F302000849 +:1001D000F3020008CD700008F3020008F3020008E3 :1001E000F3020008F3020008F3020008F30200081B :1001F000F3020008F3020008F3020008F30200080B :10020000F3020008F3020008F3020008F3020008FA @@ -52,49 +52,49 @@ :100320004F8FBFF36F8F40F20000C0F2F0004EF627 :100330008851CEF200010860BFF34F8FBFF36F8F7B :100340004FF00000E1EE100A4EF63C71CEF20001D3 -:100350000860062080F31488BFF36F8F05F0FAFF62 -:1003600007F008F84FF055301F491B4A91423CBF37 +:100350000860062080F31488BFF36F8F06F02CF935 +:1003600007F074FA4FF055301F491B4A91423CBFC9 :1003700041F8040BFAE71D49184A91423CBF41F885 :10038000040BFAE71A491B4A1B4B9A423EBF51F82D :10039000040B42F8040BF8E700201849184A914270 -:1003A0003CBF41F8040BFAE706F012F807F066F8D4 +:1003A0003CBF41F8040BFAE706F044F907F0D2FA33 :1003B000144C154DAC4203DA54F8041B8847F9E796 :1003C00000F042F8114C124DAC4203DA54F8041B11 -:1003D0008847F9E705F0FABF000700200023002056 +:1003D0008847F9E706F02CB9000700200023002029 :1003E0000000000808ED00E00001002000070020E8 -:1003F0009080000800230020D0230020D02300207C -:10040000C8880020E0020008E4020008E4020008B6 +:1003F00058850008002300206C2300207023002073 +:1004000030890020E0020008E4020008E40200084D :10041000E40200082DE9F04F2DED108AC1F80CD050 :10042000D0F80CD0BDEC108ABDE8F08F002383F328 -:1004300011882846A047002005F070FAFEE705F075 -:10044000EFF900DFFEE70000F8B501F0E9F901F08F -:100450007FFB05F003FF074605F072FF0546A8BBCA +:1004300011882846A047002005F0E4FAFEE705F001 +:100440005FFA00DFFEE70000F8B501F0E9F901F01E +:100450007FFB06F035F8074606F0A4F80546A8BB72 :100460001F4B9F4232D001339F4232D027F0FF0210 :100470001C4B9A4230D12E4642F21074F8B200F072 -:100480009BFF00F09FFF08B10024264601F0A8FD65 +:100480009BFF00F09FFF08B10024264601F0F0FD1D :1004900020B10024032000F079F8264635B1124B34 -:1004A0009F4203D0002405F043FF2646002005F0BC -:1004B000DFFE0EB100F080F801F0E8FA00F0B6FFC0 +:1004A0009F4203D0002406F075F82646002006F08F +:1004B00011F80EB100F080F801F0E8FA00F0B6FF94 :1004C000204600F037F900F077F8F9E72E460024CF :1004D000D7E704460126D4E7064641F28834D0E740 :1004E000010007B0000008B0263A09B008B501F0D5 :1004F00063F9A0F120035842584108BD07B541F205 :100500001203022101A8ADF8043001F073F903B021 :100510005DF804FB38B5302383F31188174803686E -:100520000BB105F0C7FA0023154A4FF47A7113484E -:1005300005F0B6FA002383F31188124C236813B137 +:100520000BB105F03BFB0023154A4FF47A711348D9 +:1005300005F02AFB002383F31188124C236813B1C2 :100540002368013B2360636813B16368013B636008 :100550000D4D2B7833B963687BB9022001F008FA9E :10056000322363602B78032B07D163682BB90220F9 -:1005700001F0FEF94FF47A73636038BDD023002098 -:1005800015050008F0240020E8230020084B18700F +:1005700001F0FEF94FF47A73636038BD70230020F8 +:10058000150500089024002088230020084B1870CF :1005900003280CD8DFE800F008050208022001F06B :1005A000E5B9022001F0E0B9024B00225A60704721 -:1005B000E8230020F0240020F8B501F011FD30B14F +:1005B0008823002090240020F8B501F059FD30B1C7 :1005C000544B03221A700022534B5A60F8BD534B10 :1005D000534A1C4619680131F8D004339342F9D1CB :1005E0006268504B9A42F1D94F4B9B6803F100630C -:1005F00003F500339A42E9D205F06EFE05F080FE65 +:1005F00003F500339A42E9D205F0A0FF05F0B2FFFF :10060000002001F027F90220FFF7C0FF474B00212F :10061000D3F8E820C3F8E810D3F81021C3F810117C :10062000D3F81021D3F8EC20C3F8EC10D3F8142140 @@ -112,13 +112,13 @@ :1006E000BFF36F8FBFF34F8FBFF36F8F536923F447 :1006F000003353610023C2F85032BFF34F8FBFF372 :100700006F8F302383F31188854680F30888204754 -:100710005CE700BFE8230020F0240020000002086E +:100710005CE700BF8823002090240020000002082E :1007200020000208FFFF01080023002000440258B7 :1007300000ED00E02DE9F04F93B0B74B2022FF21F0 :1007400000900AA89D6801F04BF9B44A1378A3B948 :100750000121B34811700360302383F311880368CB -:100760000BB105F0A7F90023AE4A4FF47A71AC48FB -:1007700005F096F9002383F31188009B13B1AA4B6F +:100760000BB105F01BFA0023AE4A4FF47A71AC4886 +:1007700005F00AFA002383F31188009B13B1AA4BFA :10078000009A1A60A94A1378032B03D00023137030 :10079000A54A53604FF0000A009CD3465646D14606 :1007A000012001F0E3F824B19F4B1B68002B00F0FF @@ -160,9 +160,9 @@ :1009E000926893423FF642AFB8F5807F3FF73EAF43 :1009F000124BB845019323DD4FF47A7000F0DCFE12 :100A00000390039A002AFFF631AF039A0137019B46 -:100A100003F8012BEDE700BF00230020EC240020A9 -:100A2000D023002015050008F0240020E823002032 -:100A300004230020082300200C230020EC230020A6 +:100A100003F8012BEDE700BF002300208C24002009 +:100A20007023002015050008902400208823002052 +:100A300004230020082300200C2300208C23002006 :100A4000C820FFF753FD074600283FF40FAF1F2DC6 :100A500011D8C5F120020AAB25F0030084494245B4 :100A6000184428BF4246019200F094FF019AFF21EA @@ -172,7 +172,7 @@ :100AA0003FF4E4AE00F010FF00283FF4DFAE002773 :100AB000B846704B9B68BB4218D91F2F11D80A9BB0 :100AC00001330ED027F0030312AA134453F8203C3D -:100AD00005934046042205A9043701F06BFA8046CD +:100AD00005934046042205A9043701F0B3FA804685 :100AE000E7E7384600F0B8FE0590F2E7CDF814804D :100AF000042105A800F07EFE02E70023642104A87B :100B0000049300F06DFE00287FF4B0AE0220FFF7E2 @@ -191,14 +191,14 @@ :100BD000FFF78CFC00283FF449AE00F075FE0028BA :100BE00044D00A9B01330BD008220AA9002000F050 :100BF000FFFE00283AD02022FF210AA800F0F0FED4 -:100C0000FFF77CFC1C4804F08FFE13B0BDE8F08FAA +:100C0000FFF77CFC1C4804F003FF13B0BDE8F08F35 :100C1000002E3FF42BAE0BF00B030B2B7FF426AE14 :100C20000023642105A8059300F0DAFD074600289B :100C30007FF41CAE0220FFF759FC804600283FF4E9 -:100C400015AEFFF75BFC41F2883004F06DFE0598AD +:100C400015AEFFF75BFC41F2883004F0E1FE059839 :100C500000F05CFF46463C4600F00EFFA0E506466D :100C60004EE64FF0000901E6BA467EE637467CE6DE -:100C7000EC23002000230020A0860100094A49F24D +:100C70008C23002000230020A0860100094A49F2AD :100C80006900136899B21B0C00FB013344F25061F8 :100C90001360054B186882B2000C01FB020018605B :100CA00080B270471423002010230020002110225E @@ -206,51 +206,51 @@ :100CC0001868A06010BD00BF00E8F11F2DE9F041D9 :100CD000ADF5507D0D46002140F275126EAC074611 :100CE00010A80F9100F07CFE4FF4C4720021204642 -:100CF00000F076FE0DF13C0802F05AFB4FF47A72D8 +:100CF00000F076FE0DF13C0802F0A6FB4FF47A728C :100D0000264BB0FBF2F0186093E80700022384E85A :100D100007000DF5ED702382FFF7C8FF47F60503C6 -:100D20001F4907A8238406F0F1FE1F230DF2EB22D2 +:100D20001F4907A8238407F055F91F230DF2EB2272 :100D30000DF1340C84F8323107AB1E46083203CE75 :100D4000664542F8080C42F8041C3346F5D1306879 :100D500010602046B188B379918041469371012299 -:100D600000F04CFF002380B2E97E0393AB7E029338 +:100D600000F056FF002380B2E97E0393AB7E02932E :100D700005F1190301930123009306A3D3E900238E -:100D8000CDE90480384602F0D1FE0DF5507DBDE876 -:100D9000F08100BF9E6AC421818A46EEF8240020BB -:100DA0001C7B00082DE9F0412C4CDAB080460D4642 -:100DB000237A5BBB27A9284601F02EF807460028B6 +:100D8000CDE90480384602F01DFF0DF5507DBDE829 +:100D9000F08100BF9E6AC421818A46EE982400201B +:100DA000E47F00082DE9F0412C4CDAB080460D4676 +:100DB000237A5BBB27A9284601F04EF80746002896 :100DC00042D19DF89D60C82E3ED801464FF4A662E0 :100DD000204600F005FE4FF4807332460DF19E016F :100DE000C4F8F8314FF4007304F109002644C4F844 :100DF0000C334FF44073C4F8203400F0CBFD9DF861 :100E00009C30777223720BB9EB7E237206AC812281 :100E1000002127A800F0E4FD0122214627A801F0C7 -:100E200037F8002380B2E97E0393AB7E029305F18D +:100E200061F8002380B2E97E0393AB7E029305F163 :100E3000190301932823CDE904400093404605A3FC -:100E4000D3E9002302F072FE5AB0BDE8F08100BF82 -:100E5000AFF3008026417272DF25D7B7C05E002055 +:100E4000D3E9002302F0BEFE5AB0BDE8F08100BF36 +:100E5000AFF3008026417272DF25D7B7605E0020B5 :100E6000F0B5254E4FF48A75F1B0002405FB0065FE :100E700096F8D830D822214685F8DC303AA885F893 :100E8000E84006AF00F0ACFD06F1090000F0A0FD5F :100E9000D5F8E430C2B206F109018DF8F0000DF189 :100EA000F100CDE93A3400F075FD394601223AA847 -:100EB00001F01AF8082380B2317ACDE904700127D5 +:100EB00001F04EF8082380B2317ACDE904700127A1 :100EC0000E48CDE9023706F1D80301933023009391 -:100ED00007A3D3E9002302F029FEA04206DD02F0B9 -:100EE00067FAC5F8E000384671B0F0BD2046FBE770 -:100EF00078F6339F93CACD8DC05E00201035002058 +:100ED00007A3D3E9002302F075FEA04206DD02F06D +:100EE000B3FAC5F8E000384671B0F0BD2046FBE724 +:100EF00078F6339F93CACD8D605E0020B034002019 :100F00002DE9F04F264F87B0DFF8A080254E3846F8 -:100F100002F038FE034600283AD00024224DADF8F6 +:100F100002F084FE034600283AD00024224DADF8AA :100F20001440A1460294A246CDE90344027B8DF809 :100F3000142003AA9968406803C21B6843F0004369 -:100F400002932B6804F5A664D3F810B002F032FACD +:100F400002932B6804F5A664D3F810B002F07EFA81 :100F500010EB0802CDF800A0284605F5A65541F192 :100F6000000302A9D8470028C8BF49F00109B4F519 -:100F7000266FE6D1B9F1000F05D0384602F006FE23 +:100F7000266FE6D1B9F1000F05D0384602F052FED7 :100F800086F800A0C3E73378072B04D80133337009 -:100F900007B0BDE8F08F024802F0F8FDF8E700BFA7 -:100FA00010350020F56300204035002040420F003E -:100FB00070B50D4614461E4602F014FD50B9022EBF +:100F900007B0BDE8F08F024802F044FEF8E700BF5A +:100FA000B034002095630020E034002040420F0060 +:100FB00070B50D4614461E4602F060FD50B9022E73 :100FC00010D1012C0ED112A3D3E900230120C5E9D1 :100FD000002307E0282C10D005D8012C09D0052CBF :100FE0000FD0002070BD302CFBD10BA3D3E9002320 @@ -262,22 +262,22 @@ :10104000013500F02FFCA4F82C55B4F82C0500F065 :1010500011FC78B1B4F82C0500F01CFC014648B92D :10106000B4F82C0500F01EFCB4F82C350133A4F8BC -:101070002C35EAE738BD00BFC05E0020F8B50D4C46 +:101070002C35EAE738BD00BF605E0020F8B50D4CA6 :1010800002260D4FA4F5805343F8307C237E3BB9F4 -:1010900065692DB1284601F01DF8284606F0ECFCE4 -:1010A0002046A4F5A65401F015F8012E00D1F8BD94 -:1010B0000126E7E7305A0020DC7B00082DE9F04FDD -:1010C0008FB005460C4600AF02F08CFC002849D1D9 -:1010D000237E022B1BD1E38A012B18D102F068F981 +:1010900065692DB1284601F065F8284601F09EF9F2 +:1010A0002046A4F5A65401F05DF8012E00D1F8BD4C +:1010B0000126E7E7D0590020A48000082DE9F04F71 +:1010C0008FB005460C4600AF02F0D8FC002849D18D +:1010D000237E022B1BD1E38A012B18D102F0B4F935 :1010E0000646FFF7CBFD03464FF4C87006F51676AB :1010F000DFF8C082B3FBF0F202FB103316FA83F381 :10110000C8F80030E37E33B9A34B00221A703C3795 -:10111000BD46BDE8F08F07F12401204600F03AFEFD +:10111000BD46BDE8F08F07F12401204600F050FEE7 :101120000028F4D107F11400FFF7C0FD97F826401E -:1011300007F1140107F12700224606F0B5FC00284C +:1011300007F1140107F12700224606F019FF0028E5 :10114000E2D10F2C08D8944B1C70D8F80030A3F5CE :101150001673C8F80030DAE797F82410284602F032 -:1011600039FCD4E7E38A282B2BD010D8012B23D0CD +:1011600085FCD4E7E38A282B2BD010D8012B23D081 :10117000052BCCD1BFF34F8F8849894BCA6802F445 :10118000E0621343CB60BFF34F8F00BFFDE7302B0E :10119000BDD1844EE17E327A9142B8D1607E314633 @@ -297,14 +297,14 @@ :101270007260D6F8D42005EB0209C6F8D49000F0CD :10128000F9FA814509D396F8D220D6F8D400013274 :10129000001B86F8D220C6F8D400FF2D0FD80024FA -:1012A000347200F011FB204600F0D4FA00F098FEF2 +:1012A000347200F011FB204600F0D4FA00F0E0FEAA :1012B0003D4B188108B9FFF77FF9C54627E7BB68A2 :1012C00096F8D9000AFB0362FB68D2F8E41082F8B2 :1012D000E83001F58061C2F8E030C2F8E410FFF7B1 :1012E000BFFDFFF70DFE96F8D920013202F0030290 :1012F00086F8D920B6E74FF48A7A20460AFB02F531 -:1013000005F1EA01314400F01BFEF86000287FF48B -:10131000FEAE0122354485F8E82002F049F8D5F800 +:1013000005F1EA01314400F057FEF86000287FF44F +:10131000FEAE0122354485F8E82002F095F8D5F8B4 :10132000E020D6ED007A801A40F6B832B8EE677A3F :10133000DFED1E6A192838BF1920904228BF1046D9 :1013400007EE900AF8EEE77A67EEA67ADFED186A04 @@ -312,27 +312,27 @@ :10136000BB60BA6873680AFB02F4321992F8E8109D :1013700059B1D2F8E410E8468B423FF427AF002180 :1013800082F8E810C2F8E010C5467368064A9B0A66 -:1013900001331381BBE600BF0935002000ED00E0FA -:1013A0000400FA05C05E0020F8240020CDCCCC3D1E -:1013B0006666663F0C350020014B1870704700BF11 -:1013C0000425002038B54FF00054144B22689A428F -:1013D00021D1627D0025124B12481A70C922237D4B -:1013E0000930114900F8013C4FF48073C0F8DB501C -:1013F000C0F8EF314FF40073C0F803334FF440737B -:10140000C0F8173400F0C6FAE0222946204600F062 -:10141000E7FA012038BD0020FCE700BF9AAD44C5C3 -:1014200004250020C05E00201600002037B500F023 -:10143000D7FD1F4C1F4D022301221F496B712368EA +:1013900001331381BBE600BFA934002000ED00E05B +:1013A0000400FA05605E002098240020CDCCCC3DDE +:1013B0006666663FAC340020014B1870704700BF72 +:1013C000A424002038B54FF00054144B22689A42F0 +:1013D00022D1607DF8B1124B0025C9221149187045 +:1013E0001148237D0930C0F8DB5000F8013C4FF470 +:1013F0008073C0F8EF314FF40073C0F803334FF43B +:101400004073C0F8173400F0C5FAE02229462046A0 +:1014100000F0E6FA012038BD0020FCE79AAD44C593 +:10142000A424002016000020605E002037B500F0E4 +:101430001FFE1F4C1F4D022301221F496B712368A1 :10144000288120465B68984704F5805301221A4999 :10145000D3F8C03404F5A6505B68984700231749B9 :101460004FF480520193164B16480093164B02F02E -:1014700089FA164B197811B1124802F0ABFA01F053 -:1014800097FF0446FFF7FAFB4FF4C873B0FBF3F283 +:10147000D5FA164B197811B1124802F0F7FA01F0BB +:10148000E3FF0446FFF7FAFB4FF4C873B0FBF3F237 :1014900002FB130304F5167010FA83F00C4B18606E -:1014A00004F04EFF08B10F232B8103B030BD00BF05 -:1014B00040350020F824002040420F00082500207D -:1014C000B10F000810350020BD10000804250020D1 -:1014D0000C3500202DE9F04F00242DED028B93B048 +:1014A00005F080F808B10F232B8103B030BD00BFD9 +:1014B000E03400209824002040420F00A82400209F +:1014C000B10F0008B0340020BD100008A424002093 +:1014D000AC3400202DE9F04F00242DED028B93B0A9 :1014E0000DF12C084FF0010ADFF814B2FFF708FDE8 :1014F0000A94ADF834400B94C8F804409FED798B02 :1015000000267E4D37462B680DF11D0207A928469F @@ -341,63 +341,63 @@ :1015300000210EA800F054FA2B6808AA0AA95F69D6 :1015400028460DF11E03B8470FAB4F4698E803003D :1015500083E803009DF834300EA958468DF84430D6 -:101560000A9B0E93DDE9082302F0EEFC06F5A66661 +:101560000A9B0E93DDE9082302F03AFD06F5A66614 :1015700005F5A655B6F5266FC5D1002FC0D1604838 -:1015800002F030FA00283FD15E4E01F011FF3368BF -:10159000984239D301F00CFF0546FFF76FFB4FF47B +:1015800002F07CFA00283FD15E4E01F05DFF336827 +:10159000984239D301F058FF0546FFF76FFB4FF42F :1015A000C8738DF82870B0FBF3F202FB130305F546 :1015B000167010FA83F03060534E377817B9012354 :1015C0008DF82830C7F110050EA8FFF76FFB0EABA2 :1015D000EDB20DF12900D919062D28BF06252A469E :1015E000013500F0D7F90AABEDB245480393182353 :1015F00004950293454B0193012300933BA3D3E948 -:10160000002302F035FA347001F0D2FE404A414D19 -:101610001368C31AB3F57A7F2FD3106001F0CAFEA6 -:1016200002460B46364802F0BBFA354802F0DAF9BA +:10160000002302F081FA347001F01EFF404A414D80 +:101610001368C31AB3F57A7F2FD3106001F016FF59 +:1016200002460B46364802F007FB354802F026FA20 :1016300018B32B7A0EAF384E002B14BF03230223AE -:10164000737101F0B5FE4FF47A7301223946B0FB95 -:10165000F3F03060304600F075FB182380B202933F +:10164000737101F001FF4FF47A7301223946B0FB48 +:10165000F3F03060304600F08BFB182380B2029329 :101660002E4B019340F25513CDE9037000932448AB -:1016700020A3D3E9002302F0FBF92B7A93B101F008 -:1016800097FE002607464FF48A7895F8D900304433 +:1016700020A3D3E9002302F047FA2B7A93B101F0BB +:10168000E3FE002607464FF48A7895F8D9003044E7 :1016900000F0030008FB005393F8E82072B1013614 -:1016A000042EF2D1C82004F03FF92B7A002B7FF4EE +:1016A000042EF2D1C82004F0B3F92B7A002B7FF47A :1016B00017AF13B0BDEC028BBDE8F08FD3F8E0207C :1016C00042B12B68BA1AFA2B38BFFA230533B2EBB2 :1016D000430FE4D3FFF7C4FB0028E0D1E2E700BFEB :1016E000AFF300800000000000000000401DA120BA -:1016F00026812A0BF1C6A7C1D068080F403500200B -:10170000103500200C350020093500200835002058 -:10171000F0630020C05E0020F8240020F463002065 -:1017200010B5074C204601F007F904F5A65001F06A -:1017300003F9044A04490020BDE8104006F096B9B8 -:1017400040350020506400207D1000082DE9F84F3E +:1016F00026812A0BF1C6A7C1D068080FE03400206C +:10170000B0340020AC340020A9340020A8340020DC +:1017100090630020605E00209824002094630020E5 +:1017200010B5074C204601F053F904F5A65001F01E +:101730004FF9044A04490020BDE8104006F004BCFB +:10174000E0340020F06300207D1000082DE9F84F00 :101750004FF47A7306460D46002402FB03F7DFF8C8 :101760005080DFF8509098F900305FFA84FA5A1CE4 :1017700001D0A34212D159F824002A463146036809 :10178000D3F820B03B46D847854207D1074B01200C :1017900083F800A0BDE8F88F0124E4E7002CFBD01B -:1017A0004FF4FA7004F0C0F80020F3E73C64002026 +:1017A0004FF4FA7004F034F90020F3E7DC63002012 :1017B000182300201C230020002307B50246012126 :1017C0000DF107008DF80730FFF7C0FF20B19DF83D :1017D000070003B05DF804FB4FF0FF30F9E70000AD :1017E0000A46042108B5FFF7B1FF80F00100C0B23E :1017F000404208BD074B0A4630B41978064B53F8EF :101800002140014623682046DD69044BAC4630BCCC -:10181000604700BF3C6400201C230020A08601001C -:1018200070B50A4E00240A4D04F0AAFB30802868E7 -:101830003388834208D904F09FFB2B6804440133AA -:10184000B4F5003F2B60F2D370BD00BF3E640020B2 -:10185000F863002004F062BC00F1006000F5003085 +:10181000604700BFDC6300201C230020A08601007D +:1018200070B50A4E00240A4D04F01EFC3080286872 +:101830003388834208D904F013FC2B680444013335 +:10184000B4F5003F2B60F2D370BD00BFDE63002013 +:101850009863002004F0D6BC00F1006000F5003071 :101860000068704700F10060920000F5003004F05D -:10187000E3BB0000054B1A68054B1B889B1A83428B -:1018800002D9104404F078BB00207047F8630020B0 -:101890003E640020024B1B68184404F073BB00BF79 -:1018A000F8630020024B1B68184404F07DBB00BFA6 -:1018B000F86300200020704700F1FF5000F58F1002 +:1018700057BC0000054B1A68054B1B889B1A834216 +:1018800002D9104404F0ECBB00207047986300209C +:10189000DE630020024B1B68184404F0E7BB00BF66 +:1018A00098630020024B1B68184404F0F1BB00BF92 +:1018B000986300200020704700F1FF5000F58F1062 :1018C000D0F8000870470000064991F8243033B181 :1018D00000230822086A81F82430FFF7C3BF0120E3 -:1018E000704700BFFC630020014B1868704700BFC1 +:1018E000704700BF9C630020014B1868704700BF21 :1018F0000010005C194B01380322084470B51D68C4 :10190000174BC5F30B042D0C1E88A6420BD15C6847 :101910000A46013C824213460FD214F9016F4EB1C0 @@ -405,9 +405,9 @@ :101930000B4602D22C2203F8012B0424094A1688F4 :10194000AE4204D1984284BF967803F8016B013C03 :1019500002F10402F3D1581A70BD00BF0010005C00 -:1019600024230020687B00087047000070470000B7 +:1019600024230020308000087047000070470000EA :101970007047000070B504464FF47A764CB1412CA4 -:10198000254628BF412506FB05F0641B03F0CCFF6C +:10198000254628BF412506FB05F0641B04F040F8FE :10199000F4E770BD002310B5934203D0CC5CC4546F :1019A0000133F9E710BD0000013810B510F9013F0F :1019B0003BB191F900409C4203D11AB10131013A87 @@ -422,1651 +422,1722 @@ :101A40009044E4B2F6B2082E85F82460DBD1FFF7AB :101A50003BFF0028D7D108E02B6A03EB82038342C7 :101A6000CFD0FFF731FF0028CBD10020BDE8F883AD -:101A70000120FBE7FC630020024B1A78024B1A702E -:101A8000704700BF3C6400201823002038B51A4C72 -:101A90001A4D204603F08CFA2946204603F0B4FA8A +:101A70000120FBE79C630020024B1A78024B1A708E +:101A8000704700BFDC6300201823002038B51A4CD3 +:101A90001A4D204603F0DCFA2946204603F004FBE9 :101AA0002D684FF47A70D5F89020D2F8043843F0BE :101AB0000203C2F80438FFF75DFF1149284603F01E -:101AC000B1FBD5F890200F4DD2F80438286823F0E8 +:101AC00001FCD5F890200F4DD2F80438286823F097 :101AD00002030D49A042C2F804384FF4E1330B6011 -:101AE00001D003F0C3F96868A04204D00649BDE8FC -:101AF000384003F0BBB938BDB86B0020287E000821 -:101B0000307E00081C230020246400200C4B70B59C +:101AE00001D003F013FA6868A04204D00649BDE8AB +:101AF000384003F00BBA38BD586B0020F082000864 +:101B0000F88200081C230020C46300200C4B70B531 :101B10000C4D04461E780C4B55F826209A420DD0E9 :101B20000A4B002118221846FFF75AFF04600146AD -:101B300055F82600BDE8704003F098B970BD00BFAD -:101B40003C6400201C230020B86B0020246400208B -:101B5000F0B5A1B071B600230120002480261A46FA -:101B6000194602F05BFE4FF4D067214A3D25136908 -:101B700023BBD2F810310BBB036804F100619960FC -:101B80000368C3F80CD003685E6003681F600168D7 -:101B90000B6843F001030B6001680B6823F01E0320 -:101BA0000B6001680B68DB07FCD4037B8034416861 -:101BB00005FA03F3B4F5001F0B60D8D102F06EFEF6 -:101BC000B4F5001F11D000240A4E0B4D012004F083 -:101BD000A5FA3388A34205D928682044013404F0CB -:101BE000E3F9F6E7002004F099FA61B621B0F0BD00 -:101BF000002000523E640020F86300202DE9F047E9 -:101C00000D46044600219046284640F27912FFF71F -:101C1000E7FE234620220021284604F1220702F095 -:101C200035F9231D022220212846C02602F02EF974 -:101C3000631D03222221284602F028F9A31D032256 -:101C40002521284602F022F904F108031022282158 -:101C5000284602F01BF904F1100308223821284617 -:101C600002F014F904F1110308224021284602F081 -:101C70000DF904F1120308224821284602F006F962 -:101C800004F1140320225021284602F0FFF804F149 -:101C9000180340227021284602F0F8F804F12003CE -:101CA0000822B021284602F0F1F804F121030822AD -:101CB000B821284602F0EAF8314608363B460822A9 -:101CC0002846013702F0E2F8B6F5A07FF4D10027EC -:101CD00004F1330A04F1320308223146284602F0A7 -:101CE000D5F894F832304FEAC7099F4209F5A47637 -:101CF00015D3B8F1000F08D1314609F24F1604F59B -:101D000099730722284602F0C1F827463B1B94F836 -:101D1000322193420CD3F01DC008BDE8F0870AEBD6 -:101D20000703082231462846013702F0AFF8D8E70A -:101D300007F233133146082228460836013702F0ED -:101D4000A5F8E3E713B50446084600212022234600 -:101D500001900160C0F8031002F098F8231D01986B -:101D60000222202102F092F8631D01980322222111 -:101D700002F08CF8A31D01980322252102F086F8B9 -:101D8000019804F108031022282102F07FF80720AF -:101D900002B010BD0023F7B50E46047F0722009164 -:101DA0001946054601F036FF731C012207210093F6 -:101DB0002846002301F02EFFC4B9B31C05220821D8 -:101DC0002846009323460D2401F024FF3746BB1B11 -:101DD000B278934211D307342B7FA88AE408BBB9A9 -:101DE000844294BF0020012003B0F0BDAB8A0824D8 -:101DF000DB00083BDB08B370E8E7FB1C2146082248 -:101E00002846009300230834013701F003FFDEE782 -:101E1000201A18BF0120E7E70023F7B50E46047F1C -:101E2000082200911946054601F0F4FE731CC4B95E -:101E300008220093234610241146284601F0EAFEAA -:101E400001235F1C7278013B934211D307342B7F2F -:101E5000A88AE408BBB9844294BF0020012003B0E3 -:101E6000F0BDAB8A0824DB00083BDB087370E7E7B2 -:101E7000F3192146082228460093002301F0CAFEE8 -:101E800008343B46DDE7201A18BF0120E7E70000D1 -:101E9000F8B50E4605461446002181223046FFF76C -:101EA0009FFD2B4608220021304601F0EFFF7CB950 -:101EB0000F246B1C07220821304601F0E7FF0123A5 -:101EC0005F1C6A78013B934204D3E01DC008F8BD53 -:101ED0000824F4E7EB1921460822304601F0D6FF2A -:101EE00008343B46ECE70000F8B50E4605461446BC -:101EF0000021CE223046FFF773FD2B462822002119 -:101F0000304601F0C3FF7CB9302405F108030822F4 -:101F10002821304601F0BAFF2F467B1B2A7A9342D4 -:101F200004D3E01DC008F8BD2824F5E707F1090334 -:101F30002146082230460834013701F0A7FFECE7BC -:101F4000F7B5047F0E4600910123102200210546BB -:101F500001F060FEC4B9B31C092210212846009389 -:101F60002346192401F056FE37467288BB1B9A425D -:101F700011D807342B7FA88AE408BBB9844294BFE8 -:101F80000020012003B0F0BDAB8A1024DB00103B21 -:101F9000DB087380E8E73B1D2146082228460093B2 -:101FA00000230834013701F035FEDEE7201A18BFA0 -:101FB0000120E7E730B50A44084D91420DD011F8F1 -:101FC000013B5840082340F30004013B2C4013F030 -:101FD000FF0384EA5000F6D1EFE730BD2083B8ED6F -:101FE000F7B5364A6B46106851686A4603C3082342 -:101FF0003349344805F068FD044690BB0A25324A4F -:102000006B46106851686A4603C308232F492D4860 -:1020100005F05AFD0446002847D00369B3F5F01FC8 -:1020200043D8B0F86620B2F5AF6F3ED1284A0244DB -:1020300002F15C018B4238D35C3B224900209E1A9E -:10204000FFF7B8FF04F16401074632460020FFF7AE -:10205000B1FFA3689F4228D1E368984208BF0025DA -:1020600023E00369B3F5F01F26D8428BB2F5AF6FBA -:1020700020D1174A024402F110018B4218D3103BC1 -:10208000104900209D1AFFF795FF04F1180106463C -:102090002A460020FFF78EFFA3689E4202D1E36824 -:1020A000984201D00D25AAE70025284603B0F0BDCF -:1020B0001025A4E70C25A2E70B25A0E7787B0008F4 -:1020C000DCFF1D0000000208817B000890FF1D005E -:1020D0000800FEF710B5037C044613B9006805F04C -:1020E000DBFC204610BD00000023BFF35B8FC36004 -:1020F000BFF35B8FBFF35B8F8360BFF35B8F704772 -:10210000BFF35B8F0068BFF35B8F704770B5054608 -:102110000C30FFF7F5FF044605F108063046FFF7DF -:10212000EFFFA04206D96D683046FFF7E9FF25446E -:10213000281A70BD3046FFF7E3FF201AF9E70000C8 -:1021400070B505464068A0B105F10C0605F1080020 -:10215000FFF7D6FF04463046FFF7D2FF844204F172 -:10216000FF34304694BF6D680025FFF7C9FF2C444B -:10217000201A70BD38B50C460546FFF7C7FFA042D0 -:1021800010D305F10800FFF7BBFF04446868BFF3F4 -:102190005B8FB4FBF0F100FB11440120AC60BFF396 -:1021A0005B8F38BD0020FCE72DE9F041144607465F -:1021B0000D46FFF7C5FF844228BF0446D4B1B84698 -:1021C00058F80C6B4046FFF79BFF304428604046B0 -:1021D0007E68FFF795FF331A9C4203D801206C609C -:1021E000BDE8F081A41B6B603B682044AB60E860F5 -:1021F0000220F5E72046F3E738B50C460546FFF721 -:102200009FFFA04210D305F10C00FFF779FF0444B3 -:102210006868BFF35B8FB4FBF0F100FB1144012051 -:10222000EC60BFF35B8F38BD0020FCE72DE9FF4178 -:102230008846694607466C46FFF7B6FF002506B29A -:1022400004EBC606B4420AD0626808EB05012068B8 -:102250000834FFF79FFB54F8043C1D44F2E729467D -:102260003846FFF7C9FF284604B0BDE8F0810000FA -:10227000F8B505460C300F46FFF742FF05F108069A -:1022800004463046FFF73CFFA042304688BF6C68EA -:10229000FFF736FF201A386020B12C683046FFF770 -:1022A0002FFF2044F8BD000073B5144606460D46C6 -:1022B000FFF72CFF8442019028BF0446DCB101A93E -:1022C0003046FFF7D5FF019B33B93268C5E90233C9 -:1022D000C5E9002401200CE09C42286038BF01942D -:1022E000019884426860F5D93368241A0220AB60F3 -:1022F000EC6002B070BD2046FBE700002DE9FF4115 -:102300000F4669466C46FFF7CFFF00B2002604EB8C -:10231000C005AC4209D0D4F80480B81954F8081BA1 -:1023200042464644FFF736FBF3E7304604B0BDE8CB -:10233000F081000038B50546FFF7E0FF044601468E -:102340002846FFF717FF204638BD00007047000001 -:1023500010B41346026814680022A4465DF8044BCA -:102360006047000000F5805090F859047047000065 -:1023700000F5805090F852047047000000F580503E -:1023800090F95804704700004E207047302383F3C3 -:10239000118800F58052D2F89C34D2F89804184481 -:1023A000D2F894341844D2F87C341844D2F88C34DF -:1023B0001844D2F888341844002383F311887047F6 -:1023C00000F58050C0F85414012070472DE9F04FFB -:1023D0000C4600F5805185B01F4691F852340546F1 -:1023E0009046BDF838909BB1D1F878340133C1F8EC -:1023F00078342368980006D4237B082B0BD9627BA2 -:102400000AB10F2B07D9D1F87C340133C1F87C34E1 -:102410004FF0FF3010E0302383F31188EB6AD3F8DC -:10242000C42012F4001B0AD0D1F8803400200133FC -:10243000C1F8803480F3118805B0BDE8F08F2068C2 -:102440004822D3F8C4300028C3F3044A6B6AB4BFEF -:1024500040F08040800412FB0A334FEA4A161860AD -:10246000226852004FEA0A6244BF40F000501860F0 -:10247000207B42EA00425A60607B10B342F4401273 -:102480005A60D1F8B0240132C1F8B024AA1902F57B -:102490008352117B41F020011173207B039300F0E4 -:1024A000E3FF0330039B80105FFA8BF20BF1010B0B -:1024B00082420DDA04EB820103EB820249689160EB -:1024C000F2E7AA1902F58352117B60F34511E3E7A5 -:1024D0000122EB6A05EB4A1102FA0AF201F5825178 -:1024E000C3F8D020AB19183104F10C0203F5825364 -:1024F000C3E90487234653F8040B934241F8040BC5 -:10250000F9D11B882E440B8041F2680346F803A0E2 -:1025100006F5805609F0030396F86C2043F010038B -:1025200022F01F02134386F86C30002383F31188D6 -:1025300042463B4621462846CDF8009000F05AFF1F -:10254000012079E72DE9F04700F58056044696F81A -:102550005254002D40F00381037C032B40F0948003 -:1025600028462B462F465FFA80FC944510DA01EB93 -:10257000CC0E51F83CC0BCF1000F04DBDEF804C007 -:10258000BCF1000F02DB01370130ECE70133FBE760 -:10259000302080F31188E06AF3B9D0F8803043F03E -:1025A0000203C0F880304E23E06A002F6FD1D0F8CC -:1025B000803043F00103C0F880306A4B6A4A1B68E0 -:1025C00003F1805303F52C539B009342A36240F226 -:1025D000B080664800F0E6FE4D2B42D8DFF88481DB -:1025E0004FEA034EDFF88891D8F800C04EEA8C0E0F -:1025F000C0F884E00CF1805000F52C508000606140 -:1026000003EB0C00D4F82CC0C3F14E03C8F8000053 -:10261000DCF8800040F03000CCF880004FF0000C77 -:10262000D4F81480E6465FFA8CF08242BCDD01EB00 -:10263000C00A51F83000002810DBDAF804A0BAF123 -:10264000000F0BDA09EA00400AF07F0A40EA0A00AC -:1026500040F0084048F82E000EF1010E0CF1010C7C -:10266000E1E7836923F00103836100F0A1FE0646E0 -:10267000E36A9B69D90704D500F09AFE831BFA2B05 -:10268000F6D9002383F311882846BDE8F087B7EB1D -:10269000530F3DD2DFF8CCE04FEA074CDEF80030B4 -:1026A0004CEA830CC0F888C003F1805003EB470369 -:1026B000002700F52C50CEF80030BC468000A06109 -:1026C000E06AD0F8803043F00C03C0F88030D4F8D2 -:1026D00018E0FBB29A427FF770AF51F8330001EB7C -:1026E000C3080028D8F8043001DB002B0EDB20F0F3 -:1026F000604023F0604340F0005043F000434EF848 -:102700003C000EEBCC000CF1010C43600137E0E71C -:10271000836923F00103836100F04AFE0646E36A01 -:102720009B69DA07ADD500F043FE831BFA2BF6D97F -:10273000A7E7E26A936923F00103936100F038FE92 -:102740000746E36A9B69DB0705D500F031FEC31B32 -:10275000FA2BF6D995E7012586F8525491E7002522 -:1027600092E700BF4C640020FCB500408C7B000861 -:102770000000FF0713B500F580540191606CFFF76E -:10278000DFFC1F280AD920220199606CFFF74EFD5B -:10279000A0F120035842584102B010BD0020FBE7D1 -:1027A00008B5302383F3118800F58050406CFFF7A3 -:1027B0009BFC002383F3118808BD00000022026007 -:1027C00082814260826070470022002310B5C0E918 -:1027D0000023002304460C3020F8043CFFF7EEFFF2 -:1027E000204610BD2DE9F0479A4688B00746884636 -:1027F0009146302383F3118807F580546846FFF72C -:10280000E3FF606CFFF782FC1F282ED92022694667 -:10281000606CFFF78FFD202827D194F8523423B342 -:1028200003AD444605AB2E46083403CE9E4244F821 -:10283000080C44F8041C3546F5D130682060B38894 -:10284000A380DDE90023C9E90023BDF80830AAF818 -:102850000030002383F3118853464A4641463846E8 -:1028600008B0BDE8F04700F0B3BD002080F3118848 -:1028700008B0BDE8F08700002DE9F84F00230646B8 -:1028800000F58154054688461034C0E90133274BD2 -:1028900046F8303B374638462037FFF795FFA742CA -:1028A000F9D105F580544FF4805305F5A3594FF045 -:1028B000000A26630026676405F5835709F11009AD -:1028C0004FF0000B1037E663C4E90D36012384F89E -:1028D000403084F84830A7F11800203747E910ABA2 -:1028E000FFF76CFF47F8286C4F45F4D1B8F1010FA2 -:1028F00084F85884A4F85A64A4F85C64A4F85E646C -:1029000084F86064A4F86264A4F86464A4F866645B -:1029100084F8686402D9064800F044FD054B284657 -:1029200053F82830EB62BDE8F88F00BFDC7B00086D -:10293000B07B0008CC7B0008044B10B51978044626 -:102940004A1C1A70FFF798FF204610BD496400200A -:102950002DE9F04300295AD02E4E2F48B6FBF1F452 -:1029600081428CBF0A201120431EB4FBF0F700FB0C -:102970001740DDB220B1022B1846F5D8002032E016 -:102980007B1EB3F5806F2ED2C5EBC5084FF47A736A -:1029900008F103044FEAE40EC4F3C7040EF1010981 -:1029A000281B0EFB033E5FFA80FC59FA80F0BEFB49 -:1029B000F0F0B0F5617F18DC83B2601C5CFA80F047 -:1029C0007843B6FBF0F08142D8D1611E0F29D5D8EB -:1029D0000CF1FF310729D1D80120138057801071E5 -:1029E000547182F806C0BDE8F08308F1FF34E010AE -:1029F000C4F3C70400F1010E2D1B00FB03335FFA83 -:102A000085FC5EFA85F5B3FBF5F39BB2D5E7084686 -:102A1000E9E700BF00B4C4043F420F0030B50D4BDE -:102A200005200D4D1C786C438C420ED15978012045 -:102A3000518099785171D9789171197911715B79B7 -:102A400003EB83035B00138030BD013803F1060301 -:102A5000E8D1F9E71C7C000840420F0038B540F28D -:102A60007772C36A154CC3F8BC200722C36AC3F847 -:102A7000C8202268C16A930043F4C023C1F8A03083 -:102A800002F1805302F16C01C56A03F52C53EA325E -:102A900089009B00226041F0E061094AC361C5F8EA -:102AA000C01003F5D87103F56A73416293428362E3 -:102AB00002D9044800F076FC38BD00BF4C64002009 -:102AC000FCB500408C7B00082DE9F04F00F58055E7 -:102AD0001F4689B0044695F8583489469046022B23 -:102AE00004D90026304609B0BDE8F08FA84A52F854 -:102AF000231009B942F82300A648C4F80C900178C5 -:102B00002774C9B9302383F31188A34BD3F8EC2081 -:102B100042F48072C3F8EC20D3F8942042F480721F -:102B2000C3F89420D3F8942022F48072C3F8942040 -:102B30000123037081F3118895F851347BB9302358 -:102B400083F31188954A95F85834D35C0BB3012B65 -:102B500028D0012385F85134002383F311883023D2 -:102B600083F31188E26A936923F01003936100F004 -:102B70001FFC8246E36A9E6916F0080619D000F031 -:102B800017FCA0EB0A03FA2BF4D9002686F3118870 -:102B9000A8E70321132001F09DFF0321152001F078 -:102BA00099FFD6E70321142001F094FF032116209A -:102BB000F5E79A6942F001029A6100F0F9FB82465A -:102BC000E36A9A69D00706D400F0F2FBA0EB0A038F -:102BD000FA2BF5D9D9E79A694FF0000A42F00202C0 -:102BE0009A61E36AC3F854A08AF3118804F5825B02 -:102BF000686CFFF779FA0BF1100B20220021684670 -:102C0000FEF7EEFE02A8FFF7D9FD6A460BEB0603BE -:102C10000DF1180ECDF818A094460833BCE8030057 -:102C2000F44543F8080C43F8041C6246F4D1DCF880 -:102C3000000020361860B6F5806F9CF804201A71E9 -:102C4000DBD1002304F5A252494620461A3285F80A -:102C5000503485F85334FFF77BFE064690B9E26A9C -:102C6000936923F00103936100F0A2FB0546E36A38 -:102C70009B69D9077FF535AF00F09AFB431BFA2B10 -:102C8000F5D92EE795F85E34C5F86C94591E95F881 -:102C90005F34E26A013B1B0243EA416395F860142A -:102CA00001390B43B5F85C14013943EA0143D361A0 -:102CB000B8F1000F36D004F5A35241462046023247 -:102CC000FFF7ACFE90B9E26A936923F001039361C8 -:102CD00000F06EFB0546E36A9B69DA077FF501AFFA -:102CE00000F066FB431BFA2BF5D9FAE695F867244A -:102CF000C5F87084511E95F86824E36A013A120100 -:102D000042EA012295F8661401390A43B5F86414C1 -:102D1000013942EA014242F40002DA604FF42062D3 -:102D2000E36A9A64E36A4FF000082046C3F8BC8067 -:102D3000FFF794FE85F859846FF04042E36A1A6504 -:102D4000174AE36A5A654FF00222E36A9A654FF028 -:102D5000FF32E36AC3F8E0200322E36A9742DA65B0 -:102D60003FF4C0AEE26A936923F00103936100F07F -:102D70001FFB0746E36A9B69DB0705D500F018FBDC -:102D8000C31BFA2BF6D9ACE6012385F85234A9E629 -:102D9000406400204864002000440258C47B0008BE -:102DA000550200022DE9F04F054689B0904699463C -:102DB000002741F2680A00F58056EB6AD3F8D83054 -:102DC000FB40D80751D505EB47124FEA471B524449 -:102DD0001379190749D4D6F884340133C6F88434FA -:102DE00005F5A553C3E9008913799A0605EB0B0293 -:102DF00048BFD6F8B434524444BF0133C6F8B434A3 -:102E0000137943F008031371DB0723D596F8533485 -:102E100003B305F582546846FFF7D6FC03AB1834BC -:102E20005C4404F1080C2068083454F8041C1A4669 -:102E3000644503C21346F6D12068694610602846EF -:102E4000A2889A800123ADF808302B68CDE900896B -:102E5000DB6B9847D6F8A834D6F854040133C6F88B -:102E6000A83410B103681B6998470137202FA4D1FB -:102E700009B0BDE8F08F00002DE9F04F0F468DB08E -:102E8000044600F097FA82468946002F5BD1E36A38 -:102E9000D3F8A02012F4FE0F03D100200DB0BDE83E -:102EA000F08FD3F8A420920141BF04F58051D1F8EE -:102EB00098240132C1F89824D3F8A4205606ECD007 -:102EC000D3F8A450E669C5F305254823E8464FF03A -:102ED000000B03FB05664046FFF770FC32685100AB -:102EE0004ABF22F06043C2F38A4343F0004392009A -:102EF00048BF43F080430093736813F400131BBF73 -:102F0000012304F580528DF80D308DF80D301EBF71 -:102F1000D2F8B8340133C2F8B834F38803F00F03A1 -:102F20008DF80C309DF80C0000F09EFA5FFA8BF3E0 -:102F3000984225D9F2180CA90BF1010B127A0B4417 -:102F400003F82C2CEEE7012FA7D1E36AD3F8B020C9 -:102F500012F4FE0FA1D0D3F8B420950141BF04F5BF -:102F60008051D1F898240132C1F89824D3F8B420C4 -:102F7000500692D0D3F8B450266AC5F30525A4E7CD -:102F8000EFB9E36AC3F8A85004A807ADFFF71CFC2B -:102F900098E80F0007C52B800023204604A9ADF850 -:102FA0001830236804F58054DB6BCDE904A99847F9 -:102FB00058B1D4F890340133C4F890346EE7012F3F -:102FC000E2D1E36AC3F8B850DEE7D4F894340120C4 -:102FD0000133C4F8943461E72DE9F04105460F460A -:102FE00000F58054012639462846FFF745FF10B109 -:102FF00084F85364F7E7D4F8A834D4F854040133C0 -:10300000C4F8A83420B10368BDE8F0411B69184733 -:10301000BDE8F081C36AF0B51A6C12F47F0F2BD0B3 -:103020001B6C00F5805441F268054FF0010CC4F8A8 -:10303000AC340023471900EB43125E012A44117996 -:1030400011F0020F15D0490713D4B959C66A0CFA0A -:1030500001F1D6F8CCE011EA0E0F0AD0C6F8D41070 -:10306000117941F004011171D4F88C240132C4F8B3 -:103070008C240133202BDED1F0BD00002B4B70B52A -:103080001E561B5C012B30D8294D2A4A55F8233097 -:1030900052F8264013B349B3236D9A0510D54FF467 -:1030A0000073236500F086F950EA01020B4602D056 -:1030B000013861F10003024655F82600FFF772FE61 -:1030C000236D9B012CD54FF0007255F826302265F8 -:1030D00003F58053012283F8592421E0012323655D -:1030E000102323654FF48053236570BD236DDA07E9 -:1030F00002D4236D5B0706D50523002155F8260071 -:103100002365FFF769FF236DD80602D4236D5906A6 -:1031100006D55023012155F826002365FFF75CFFF3 -:1031200055F82600BDE87040FFF774BFC87B000863 -:1031300040640020CC7B000808B5302383F311885D -:10314000FFF768FF002383F3118808BDC36AD3F833 -:10315000C00010F07C5005D0D3F8C40080F40010FB -:10316000C0F340507047000008B5302383F3118846 -:1031700000F58050406CFEF7C9FF002383F31188EF -:1031800043090CBF0120002008BD000000F580535A -:1031900093F8592462B1C16A8A6922F001028A61F6 -:1031A000D3F89C240132C3F89C24002283F85924CC -:1031B000704700002DE9F743302181F3118800F5B5 -:1031C0008251002541F2680E4FF00108103100F5E0 -:1031D000805C00EB45147444267977071CD4F6060E -:1031E0001AD58E69D0F82C9008FA06F6D9F8CC706A -:1031F0003E4211D04F6801970F689742019F9F414F -:103200000AD2C9F8D460267946F004062671DCF8A3 -:1032100088440134CCF8884401352031202DD8D1A0 -:10322000002383F3118803B0BDE8F083F8B51E4690 -:1032300000230F46054613701446FFF795FF80F0F4 -:10324000010038701EB12846FFF780FF2070F8BDDE -:103250002DE9F04F85B099460D468046164691F807 -:1032600000B0DDE90EA302931378019300F0A2F8F9 -:103270002B7804460F4613B93378002B41D02246F1 -:103280003B464046FFF796FFFFF756FFFFF77EFFEE -:103290004B4632462946FFF7C9FF2B7833B1BBF1C5 -:1032A000000F03D0012005B0BDE8F08F337813B1D3 -:1032B000019B002BF6D108F5805303935445029BE4 -:1032C00077EB03031DD2039BD3F85404C8B1036802 -:1032D000AAEB04011B6898474B46324629464046F4 -:1032E000FFF7A4FF2B7813B1BBF1000FDAD13378CD -:1032F00013B1019B002BD5D100F05CF804460F46BA -:10330000DCE70020CFE70000002108B50846FFF702 -:10331000B5FEBDE8084001F06DB8000008B5012118 -:103320000020FFF7ABFEBDE8084001F063B80000E5 -:1033300008B500210120FFF7A1FEBDE8084001F01B -:1033400059B80000012108B50846FFF797FEBDE80F -:10335000084001F04FB8000000B59BB0EFF30981C1 -:1033600068226846FEF716FBEFF30583014B9B6B63 -:10337000FEE700BF00ED00E008B5FFF7EDFF00003D -:1033800000B59BB0EFF3098168226846FEF702FBA7 -:10339000EFF30583014B5B6BFEE700BF00ED00E040 -:1033A000FEE700000FB408B5029802F063FAFEE7EA -:1033B00002F0F6BE02F0D8BE13B56C46031D84E8D9 -:1033C000060094E8030083E80500012002B010BD68 -:1033D00073B58568019155B11B885B0707D4D0E9A7 -:1033E00000369B6B9847019AC1B23046A84701202E -:1033F00002B070BDF0B5866889B005460C465EB176 -:10340000BDF838305B070AD4D0E900379B6B98478A -:103410002246C1B23846B047012009B0F0BD0022B3 -:10342000002301F10806CDE9002300230A46ADF888 -:10343000083003AB1068083252F8041C1C46B24234 -:1034400003C42346F6D1106820609288A280FFF75B -:10345000B1FF0423ADF808302B68CDE90001DB6B28 -:10346000694628469847D7E7082817D909280CD075 -:103470000A280CD00B280CD00C280CD00D280CD00E -:103480000E2814BF4020302070470C2070471020B9 -:1034900070471420704718207047202070470000A4 -:1034A0002DE9F041456A15B94162BDE8F0814B68EC -:1034B000AC4623F06047C3F38A464FEAD37EC3F39A -:1034C000807816EA230638BF3E462B465A68BEEB84 -:1034D000D27F22F060440AD0002A18DAA40CB44249 -:1034E00017D19D420FD10D60DEE71346EEE7A742EC -:1034F00007D102F08044C2F3807242450BD054B130 -:10350000EFE708D2EDE7CCF800100B60CDE7B4424E -:1035100001D0B442E5D81A689C46002AE5D119606A -:10352000C3E700002DE9F047089D01F0070400EB18 -:10353000D1004FF47F494FEAD508224405F0070532 -:10354000944201D1BDE8F08704F0070705F0070AAF -:10355000111B08EBD50E57453E4613F80EC038BF79 -:103560005646C6F108068E4228BF0E46E108415C69 -:1035700034443544B94029FA06F721FA0AF1FFB27A -:103580008CEA010147FA0AF739408CEA010C03F88A -:103590000EC0D5E780EA0120082341F2210201B2E2 -:1035A000013B4000002980B2B8BF504013F0FF0338 -:1035B000F5D1704738B50C468D18A54200D138BDFD -:1035C00014F8011BFFF7E6FFF7E7000042684AB175 -:1035D000136881894360438901339BB299424381D7 -:1035E00038BF83811046704770B588B004462022EA -:1035F0000D4668460021FEF7F3F920460495FFF7D3 -:10360000E5FF024660B16B46054608AE1C4608352C -:1036100003CCB44245F8080C45F8041C2346F5D108 -:10362000104608B070BD0000082817D909280CD032 -:103630000A280CD00B280CD00C280CD00D280CD04C -:103640000E2814BF4020302070470C2070471020F7 -:1036500070471420704718207047202070470000E2 -:10366000082817D90C280CD910280CD914280CD9E3 -:1036700018280CD920280CD930288CBF0F200E20F8 -:103680007047092070470A2070470B2070470C20B4 -:1036900070470D20704700002DE9F843078C044661 -:1036A000072F1ED900254FF6FF73D0E90298C5F108 -:1036B0002006A5F1200029FA05F1083508FA06F6DA -:1036C00028FA00F0314301431846C9B2FFF762FF00 -:1036D000402D0346EBD13A46E169BDE8F843FFF7D8 -:1036E00069BF4FF6FF70BDE8F883000010B54B6866 -:1036F00023B9CA8A63F30902CA8210BD04691A6831 -:103700001C600361C38A013BC3824A60EFE700008B -:103710002DE9F84F1D46CB8A0F468146C3F30901B8 -:10372000924605290B4630D00020AAB207F11A04B0 -:103730009EB21FFA80F8042E0FD8904503F10103C2 -:1037400006D30A44FB8A62F309030120FB821AE0D4 -:103750001AF800600130E654EAE79045F1D2A1F191 -:10376000050B1C237C68BBFBF3F203FB12BB1FFAA7 -:103770008BF6002C45D14846FFF728FF044638B9A0 -:1037800078606FF00200BDE8F88F4FF00008E6E7C0 -:10379000002606607860ADB24FF0000B454510D9A9 -:1037A0000AEB0803221D13F8011B08F101089155CB -:1037B000B1B21FFA88F81B292BD0454506F1010646 -:1037C000F1D8FB8AC3F30902154465F30903BCE78A -:1037D00001321C4692B22368002BF9D16B1F0B44B7 -:1037E0001C21B3FBF1F301339BB29A42D3D2BBF15C -:1037F000000FD0D14846FFF7E9FE20B9C4F800B069 -:10380000BFE70122E7E7C0F800B05E46206004464B -:10381000C1E74545D5D94846FFF7D8FE08B920602D -:10382000AFE7C0F800B0002620600446B6E700000D -:103830002DE9F04F1C46074688462DED028B83B0DC -:103840005B690192002B00F09A80238C2BB1E26916 -:10385000002A00F09480072B35D807F10C00FFF701 -:10386000B5FE054638B96FF00205284603B0BDEC39 -:10387000028BBDE8F08F14220021FEF7B1F8228CF4 -:10388000E16905F10800FEF785F8208C48F0004159 -:10389000013080B2FFF7E4FEFFF7C6FE013880B2C8 -:1038A00020840130287438466369228C1B782A44AE -:1038B00003F01F0363F03F03137269602946FFF7AB -:1038C000EFFD0125D1E74FF0000900F10C034FF0A7 -:1038D000800A4E464D4608EE103A18EE100AFFF7E1 -:1038E00075FE83460028BED014220021FEF778F82A -:1038F000002E3AD1019B0222ABF808300BF1080EE2 -:103900001FFA82FC218C0CF10100BCF1060F80B281 -:1039100001D88E422BD3FFF7A3FE8E4208BF4FF093 -:10392000400AFFF781FE62690138013512781BFAFF -:1039300080F1013002F01F022DB242EA491289F0F3 -:1039400001094AEA020A48F0004281F808A05946F3 -:103950008BF810003846CBF804204FF0000AFFF730 -:103960009FFD238CB342B8D17FE70022C6E7E1690F -:10397000895D01360EF80210B6B20132C0E76FF071 -:10398000010572E7F8B515460E46302200210446BF -:103990001F46FEF725F8069BB5F5001FA76063607C -:1039A00004F11000079B34BF6A094FF6FF72E6610D -:1039B000A362002397B29A4206D800230360A7822D -:1039C000E3822383E360F8BD06600133304620368E -:1039D000F1E7000003781BB94BB2002BC8BF0170A0 -:1039E0007047000000787047F8B50C46C969074673 -:1039F00011B9238C002B37D1257E1F2D34D8387870 -:103A000028BB228C072A2CD8268A36F003032BD118 -:103A10004FF6FF70FFF7CEFD20F0010031024FF6A8 -:103A2000FF72400441EA0561400C41EA402523460B -:103A300029463846FFF7FCFE002807DD6269137847 -:103A40000133DBB21F2B88BF00231370F8BD218A1E -:103A50002D0645EA012505432046FFF71DFE0246D7 -:103A6000E5E76FF00300F1E76FF00100EEE700001B -:103A700070B58AB0044616460021282268461D46C5 -:103A8000FDF7AEFFBDF8383069462046ADF810307E -:103A90000F9B05939DF840308DF81830119B0793CC -:103AA000BDF84830CDE90265ADF82030FFF79CFF46 -:103AB0000AB070BD2DE9F041D36905460C461646A3 -:103AC0000BB9138C5BBB377E1F2F28D895F800806D -:103AD000B8F1000F26D03046FFF7DEFD3378210223 -:103AE0000246284641EAC331338A41EA080141EAE5 -:103AF000076141EA0341334641F08001FFF798FE38 -:103B000000280ADD3378012B07D17269137801335D -:103B1000DBB21F2B88BF00231370BDE8F0816FF06C -:103B20000100FAE76FF00300F7E70000F0B58BB093 -:103B300004460D4617460021282268461E46FDF71A -:103B40004FFF9DF84C30294620465A1E53425341A0 -:103B50006A468DF800309DF84030ADF81030119B6A -:103B600005939DF848308DF81830149B0793BDF8E5 -:103B70005430CDE90276ADF82030FFF79BFF0BB053 -:103B8000F0BD0000406A00B104307047436A1A6813 -:103B9000426202691A600361C38A013BC3827047B3 -:103BA0002DE9F041D0F8208014461D46184E4146BC -:103BB000002709B9BDE8F081D1E90223A21A65EB1B -:103BC0000303964277EB03031ED2036A8B420DD1A7 -:103BD000FFF78CFD036A1B68036203690B60C38AED -:103BE0000161013B016AC3828846E2E7FFF77EFD7F -:103BF0000B68C8F8003003690B60C38A0161013BA0 -:103C0000C382D8F80010D4E788460968D1E700BF1E -:103C100080841E002DE9F04F8BB00D4614469B4664 -:103C2000DDF850908046002800F01881B9F1000FAF -:103C300000F01481531E3F2B00F21081012A03D1A2 -:103C4000BBF1000F40F00A810023CDE90833B8F83A -:103C50001430B5EBC30F4FEAC30703D300200BB0FA -:103C6000BDE8F08F2B199F42D8F80C3036BF7F1B70 -:103C70002746FFB21BB9D8F81030002B7AD0272D79 -:103C80004DD8C5F1280600232946B742009308AB5A -:103C9000D8F808002CBFF6B23E46A7EB060A35441A -:103CA00032465FFA8AFAFFF73DFCB8F81430282153 -:103CB00003F10053053BDB000493D8F80C30039369 -:103CC000039B13B1BAF1000F2CD1D8F8100040B10A -:103CD000BAF1000F05D008AB5246691A0096FFF7FB -:103CE00021FC38B2002FB9D066070AD00AAB624275 -:103CF00003EBD40102F0070211F8083C134101F86C -:103D0000083C082C3DD9102C40F2B580202C40F204 -:103D1000B780BBF1000F00F09C80082335E0BA4665 -:103D20000026C2E7049BE02B28BFE02306930B4448 -:103D3000AB42059315D95A1B0398691A0096924510 -:103D400008AB00F1040034BF5246D2B20792FFF72D -:103D5000E9FB079A1644AAEB020A1544F6B25FFA89 -:103D60008AFA049B069A05999B1A0493039B1B6885 -:103D70000393A5E700933A4608AB2946D8F8080014 -:103D8000ADE7BBF1000F13D00123B4EBC30F6BD031 -:103D9000082C12D89DF82030621E23FA02F2D507B3 -:103DA00006D54FF0FF3202FA04F423438DF8203099 -:103DB0009DF8203089F8003051E7102C12D8BDF85A -:103DC0002030621E23FA02F2D10706D54FF0FF32EF -:103DD00002FA04F42343ADF82030BDF82030A9F8EE -:103DE00000303CE7202C0FD80899631E21FA03F31A -:103DF000DA0705D54FF0FF3202FA04F40C430894B9 -:103E0000089BC9F800302AE7402C2AD0611EC4F173 -:103E10002102A4F12103DDE9086526FA01F105FA82 -:103E200002F225FA03F311431943CB0711D50122FE -:103E3000A4F12003C4F1200102FA03F322FA01F1F4 -:103E4000A2400B43524263EB430332432B43CDE981 -:103E50000823DDE90823C9E9002300E76FF001002A -:103E6000FDE66FF00800FAE6082CA1D9102CB4D9B1 -:103E7000202CEED8C4E7BBF1000FAED0022384E7BC -:103E8000BBF1000FBCD004237FE70000012A30B54E -:103E9000144638BF012485B00025402C28BF40249B -:103EA000012ACDE9025518D81B788DF80830630730 -:103EB0000AD004AB624203EBD40502F0070215F806 -:103EC000083C934005F8083C034600912246002137 -:103ED00002A8FFF727FB05B030BD082AE4D9102A55 -:103EE00003D81B88ADF80830E1E7202A95BF1B688E -:103EF000D3E900230293CDE90223D8E710B5CB68BC -:103F00001BB98B600B618B8210BD04691A681C6041 -:103F10000361C38A013BC382CA60F0E703064CBF5A -:103F2000C0F3C0300220704708B50246FFF7F6FF25 -:103F3000022806D15306C2F30F2001D100F003007E -:103F400008BDC2F30740FBE72DE9F04F93B00446EC -:103F50000D46CDE903230A681046FFF7DFFF02286C -:103F6000824614BFC2F306260026002A80F2F3819F -:103F700012F0C04940F0EF81097B002900F0EB818D -:103F8000022803D02378B34240F0E881C2F30463EF -:103F900010462944069302F07F030593FFF7C4FF00 -:103FA000059B002283464FEA8348002348EA0A48DB -:103FB00048EA4668CE78CDE90823F30948EA0008C4 -:103FC000029368D0059B024608A9204600935346F9 -:103FD0006768B847002800F0C481276A4FB9414696 -:103FE00004F10C00FFF700FB074690B96FF00200E8 -:103FF00055E03B6998450DD03F68002FF9D1414607 -:1040000004F10C00FFF7F0FA07460028EED0236A0F -:104010003B60276297F817C006F01F08CCF3840CAA -:10402000ACEB0800A8EB0C031FFA80FE0028B8BF19 -:104030000EF120001FFA83FEB8BF00B2002B0793D9 -:10404000B8BF0EF12003D7E90221BCBF1BB2079312 -:1040500052EA010338D0039B4FF0000CDFF820E355 -:104060009A1A049B63EB010196457CEB01032BD369 -:104070006B7B97F81AE0734519D1029B002B78D01F -:10408000012821DC7868F8B9DFF8F0C2944570EBBC -:10409000010316D337E0276A27B96FF00C0013B07D -:1040A000BDE8F08F3B699845B4D03F68F4E7B3486A -:1040B00090427CEB010301D30020F0E7029B002B30 -:1040C000FAD0079B0F2B17DCFA7DB3003946204648 -:1040D00002F0030203F07C031343FB75FFF706FBBA -:1040E0006B7BBB76029B3BB9FB7DC3F38402013241 -:1040F00062F38603FB75D0E76A7BBB7E9A42DBD115 -:10410000029B002B35D0B309022B32D0039B142223 -:1041100000210DA8BB60049BFB60FDF761FC039BC5 -:104120000AA920460A93049BADF83EB00B932B1DC1 -:104130008DF840A00C932B7B8DF84180013BDBB2C6 -:10414000ADF83C30069B8DF84230059B8DF843302E -:1041500094F82C3083F001038DF84430A36898471D -:10416000FB7DC3F38403013303F01F039B02FB8237 -:10417000A2E7FB7DC6F34012B2EBD31F40F0F48000 -:10418000C3F38403434540F0F280029AB6092B7BC7 -:10419000002A4DD0F2075DD4032B40F2EB80039B45 -:1041A000AE1D394604F10C00BB603246049BFB6037 -:1041B0002B7B033BDBB2FFF7ABFA00280CDA394666 -:1041C0002046FFF793FAFB7DC3F38403013303F02A -:1041D0001F039B02FB8209E7AB88DDE908843B8370 -:1041E0004FF6FF73C9F12000A9F1200228FA09F166 -:1041F00009F1080904FA00F024FA02F20143184612 -:104200001143C9B2FFF7C6F9B9F1400F0346E9D12E -:10421000B88231462A7B033AD2B2FFF7CBF9FB7D55 -:10422000B882DA43C2F3C01262F3C713FB7543E7E7 -:1042300086B92E1D013B394604F10C00DBB2324633 -:10424000FFF766FA0028BADB2A7B3146B88A013AC2 -:10425000D2B2E2E7F98A013BC1F30901DAB20429DB -:104260005BD8281D002307F11B069A4208D910F8D5 -:1042700001CB013306F801C00131DBB20529F4D1CD -:10428000039993420A9138BF043304992CBF002349 -:1042900055FA83F30B9107F11B010C9179680E938A -:1042A0000D91291DFB8AADF83EB0C3F309038DF8CB -:1042B00040A08DF841801A44069B8DF84230059B42 -:1042C000ADF83C208DF8433094F82C3083F0010396 -:1042D0008DF844300023B88A7B602A7B013AFFF7CF -:1042E00069F93B8BB882834203D1A3680AA92046AF -:1042F000984720460AA9FFF701FEFB7DBA8AC3F35F -:104300008403013303F01F039B02FB823B8B9A4221 -:104310000CBF00206FF01000C1E67B68002BAFD00F -:10432000052001E01C3033461E68002EFAD1091A20 -:104330002E1D081D184401EB090C5FFA89F3BCF12E -:104340001B0F9DD89A429BD916F8013B09F1010930 -:1043500000F8013BEFE76FF00900A0E66FF00A00FC -:104360009DE66FF00B009AE66FF00D0097E66FF098 -:104370000E0094E66FF00F0091E600BF40420F0080 -:1043800080841E00EFF30983054968334A6B22F0ED -:1043900001024A6383F30988002383F3118870477D -:1043A00000EF00E0302080F3118862B60D4B0E4A1A -:1043B000D96821F4E0610904090C0A430B49DA6069 -:1043C000D3F8FC2042F08072C3F8FC20084AC2F8FF -:1043D000B01F116841F0010111602022DA7783F8E3 -:1043E0002200704700ED00E00003FA0555CEACC591 -:1043F000001000E0302310B583F311880E4B5B688A -:1044000013F4006314D0F1EE103AEFF309844FF087 -:104410008073683CE361094BDB6B236684F3098896 -:1044200001F0F2F910B1064BA36110BD054BFBE79B -:1044300083F31188F9E700BF00ED00E000EF00E032 -:104440003F0400084204000808B5074B074A1968F2 -:1044500001F03D01996053680BB190689847BDE841 -:104460000840FFF7C7BF00BF0000024054640020AF -:1044700008B5084B1968890901F03D018A019A6065 -:10448000054AD3680BB110699847BDE80840FFF7AB -:10449000B1BF00BF000002405464002008B5084BC3 -:1044A0001968090C01F03D010A049A60054A536934 -:1044B0000BB190699847BDE80840FFF79BBF00BF6C -:1044C000000002405464002008B5084B1968890DAB -:1044D00001F03D018A059A60054AD3690BB1106A63 -:1044E0009847BDE80840FFF785BF00BF00000240C5 -:1044F0005464002008B5074B074A596801F03D0194 -:10450000D960536A0BB1906A9847BDE80840FFF73D -:1045100071BF00BF000002405464002008B5084B82 -:104520005968890901F03D018A01DA60054AD36AB8 -:104530000BB1106B9847BDE80840FFF75BBF00BFA9 -:10454000000002405464002008B5084B5968090C6B -:1045500001F03D010A04DA60054A536B0BB1906B20 -:104560009847BDE80840FFF745BF00BF0000024084 -:104570005464002008B5084B5968890D01F03D01CD -:104580008A05DA60054AD36B0BB1106C9847BDE819 -:104590000840FFF72FBF00BF000002405464002016 -:1045A00008B5074B074A196801F03D019960536C43 -:1045B0000BB1906C9847BDE80840FFF71BBF00BFE8 -:1045C000000402405464002008B5084B19688909AA -:1045D00001F03D018A019A60054AD36C0BB1106D60 -:1045E0009847BDE80840FFF705BF00BF0004024040 -:1045F0005464002008B5084B1968090C01F03D010E -:104600000A049A60054A536D0BB1906D9847BDE856 -:104610000840FFF7EFBE00BF0004024054640020D2 -:1046200008B5084B1968890D01F03D018A059A60AB -:10463000054AD36D0BB1106E9847BDE80840FFF7EF -:10464000D9BE00BF000402405464002008B5074BE7 -:10465000074A596801F03D01D960536E0BB1906E65 -:104660009847BDE80840FFF7C5BE00BF0004024000 -:104670005464002008B5084B5968890901F03D01D0 -:104680008A01DA60054AD36E0BB1106F9847BDE816 -:104690000840FFF7AFBE00BF000402405464002092 -:1046A00008B5084B5968090C01F03D010A04DA60AD -:1046B000054A536F0BB1906F9847BDE80840FFF76C -:1046C00099BE00BF000402405464002008B5084BA6 -:1046D0005968890D01F03D018A05DA60054AD36FFA -:1046E00013B1D2F880009847BDE80840FFF782BEBA -:1046F000000402405464002000230C4910B51A46FF -:104700000B4C0B6054F82300026001EB43000433B0 -:104710004260402BF6D1074A4FF0FF339360D360DD -:10472000C2F80834C2F80C3410BD00BF5464002035 -:104730003C7C0008000002400F28F8B510D9102872 -:1047400010D0112811D0122808D10F240720DFF82B -:10475000C8E00126DEF80050A04208D9002653E048 -:104760000446F4E70F240020F1E70724FBE706FAEC -:1047700000F73D424AD1264C4FEA001C3D4304EB72 -:1047800000160EEBC000CEF80050C0E90123FBB2CA -:1047900073B12048D0F8D83043F00103C0F8D830C6 -:1047A000D0F8003143F00103C0F80031D0F80031F7 -:1047B00017F47F4F0ED01748D0F8D83043F00203DB -:1047C000C0F8D830D0F8003143F00203C0F800310F -:1047D000D0F8003154F80C00036823F01F03036085 -:1047E000056815F00105FBD104EB0C033D2493F89B -:1047F0000CC05F6804FA0CF43C602124056044613D -:1048000012B1987B00F066F93046F8BD0130A3E79D -:104810003C7C0008004402585464002010B5302449 -:1048200084F31188FFF788FF002383F3118810BDFC -:1048300010B50446807B00F063F901231549627BC3 -:1048400003FA02F20B6823EA0203DAB20B6072B9D0 -:10485000114AD2F8D81021F00101C2F8D810D2F8CC -:10486000001121F00101C2F80011D2F8002113F467 -:104870007F4F0ED1084BD3F8D82022F00202C3F8A4 -:10488000D820D3F8002122F00202C3F80021D3F887 -:10489000003110BD546400200044025808B5302394 -:1048A00083F31188FFF7C4FF002383F3118808BD49 -:1048B000026843681143016003B118477047000064 -:1048C000024A136843F0C003136070470078004049 -:1048D00013B50E4C204600F0BDFA04F1140000237D -:1048E0004FF400720A49009400F07AF9094B4FF432 -:1048F0000072094904F13800009400F0F3F9074A06 -:10490000074BC4E9172302B010BD00BFD8640020D4 -:1049100044650020C148000844670020007800403A -:1049200000E1F505037C30B5244C002918BF0C4686 -:10493000012B11D1224B98420ED1224BD3F8E82003 -:1049400042F08042C3F8E820D3F8102142F08042C0 -:10495000C3F81021D3F810312268036EC16D03EB48 -:1049600052038466B3FBF2F36268150442BF23F07E -:10497000070503F0070343EA4503CB60A36843F050 -:1049800040034B60E36843F001038B6042F496738D -:1049900043F001030B604FF0FF330B62510505D567 -:1049A00012F0102205D0B2F1805F04D080F864309C -:1049B00030BD7F23FAE73F23F8E700BF3C7D0008C6 -:1049C000D8640020004402582DE9F047C66D054622 -:1049D0003768F469210734621AD014F0080118BF4F -:1049E0004FF48071E20748BF41F02001A3074FF068 -:1049F000300348BF41F04001600748BF41F08001EB -:104A000083F31188281DFFF753FF002383F31188D8 -:104A1000E2050AD5302383F311884FF48061281D05 -:104A2000FFF746FF002383F311884FF030094FF062 -:104A3000000A14F0200838D13B0616D54FF0300993 -:104A400005F1380A200610D589F31188504600F088 -:104A50007DF9002836DA0821281DFFF729FF27F005 -:104A600080033360002383F31188790614D562062E -:104A700012D5302383F31188D5E913239A4208D144 -:104A80002B6C33B127F040071021281DFFF710FFD2 -:104A90003760002383F31188E30618D5AA6E1369E3 -:104AA000ABB15069BDE8F047184789F31188736AC4 -:104AB000284695F86410194000F0E6F98AF3118849 -:104AC000F469B6E7B06288F31188F469BAE7BDE823 -:104AD000F0870000090100F16043012203F5614302 -:104AE000C9B283F8001300F01F039A4043099B00EA -:104AF00003F1604303F56143C3F880211A607047F6 -:104B000000F01F0301229A40430900F160409B001E -:104B100000F5614003F1604303F56143C3F8802071 -:104B2000C3F88021002380F800337047F8B515469C -:104B3000826804460B46AA4200D28568A1692669AC -:104B4000761AB5420BD218462A46FCF723FFA36912 -:104B50002B44A3612846A3685B1BA360F8BD0CD956 -:104B6000AF1B18463246FCF715FF3A46E168304461 -:104B7000FCF710FFE3683B44EBE718462A46FCF7D6 -:104B800009FFE368E5E7000083689342F7B5044650 -:104B9000154600D28568D4E90460361AB5420BD2B6 -:104BA0002A46FCF7F7FE63692B4463612846A36835 -:104BB0005B1BA36003B0F0BD0DD93246AF1B019162 -:104BC000FCF7E8FE01993A46E0683144FCF7E2FE62 -:104BD000E3683B44E9E72A46FCF7DCFEE368E4E7E8 -:104BE00010B50A440024C361029B8460C160026165 -:104BF0000362C0E90000C0E9051110BD08B5D0E9A5 -:104C00000532934201D1826882B9826801328260A2 -:104C10005A1C426119700021D0E904329A4224BF23 -:104C2000C368436100F09CFE002008BD4FF0FF30D8 -:104C3000FBE7000070B5302304460E4683F311886D -:104C4000A568A5B1A368A269013BA360531CA36139 -:104C500015782269934224BFE368A361E3690BB12D -:104C600020469847002383F31188284607E0314601 -:104C7000204600F065FE0028E2DA85F3118870BD59 -:104C80002DE9F74F04460E4617469846D0F81C907B -:104C90004FF0300A8AF311884FF0000B154665B1CA -:104CA0002A4631462046FFF741FF034660B9414698 -:104CB000204600F045FE0028F1D0002383F3118840 -:104CC000781B03B0BDE8F08FB9F1000F03D001905D -:104CD0002046C847019B8BF31188ED1A1E448AF3C6 -:104CE0001188DCE7C160C361009B82600362C0E998 -:104CF00005111144C0E9000001617047F8B5044690 -:104D00000D461646302383F31188A768A7B1A36820 -:104D1000013BA36063695A1C62611D70D4E90432CF -:104D20009A4224BFE3686361E3690BB12046984768 -:104D3000002080F3118807E03146204600F000FE95 -:104D40000028E2DA87F31188F8BD0000D0E90523D6 -:104D500010B59A4201D182687AB982680021013285 -:104D600082605A1C82611C7803699A4224BFC3681E -:104D7000836100F0F5FD204610BD4FF0FF30FBE7EA -:104D80002DE9F74F04460E4617469846D0F81C907A -:104D90004FF0300A8AF311884FF0000B154665B1C9 -:104DA0002A4631462046FFF7EFFE034660B94146EA -:104DB000204600F0C5FD0028F1D0002383F31188C0 -:104DC000781B03B0BDE8F08FB9F1000F03D001905C -:104DD0002046C847019B8BF31188ED1A1E448AF3C5 -:104DE0001188DCE7026843681143016003B118478A -:104DF000704700001430FFF743BF00004FF0FF334F -:104E00001430FFF73DBF00003830FFF7B9BF000096 -:104E10004FF0FF333830FFF7B3BF00001430FFF717 -:104E200009BF00004FF0FF311430FFF703BF00004F -:104E30003830FFF763BF00004FF0FF323830FFF724 -:104E40005DBF0000012914BF6FF013000020704700 -:104E5000FFF73EBD044B036000234360C0E902330B -:104E600001230374704700BF547D000810B5302340 -:104E7000044683F31188FFF755FD022300202374B5 -:104E800080F3118810BD000038B5C36904460D4693 -:104E90001BB904210844FFF7A5FF294604F11400BB -:104EA000FFF7ACFE002806DA201D4FF40061BDE8D4 -:104EB0003840FFF797BF38BD02684368114301606F -:104EC00003B118477047000013B5406B00F58054DC -:104ED000D4F8A4381A681178042914D1017C022965 -:104EE00011D11979012312898B4013420BD101A9E9 -:104EF0004C3002F0F5F8D4F8A4480246019B217921 -:104F0000206800F0DFF902B010BD0000143002F09C -:104F100077B800004FF0FF33143002F071B8000092 -:104F20004C3002F049B900004FF0FF334C3002F032 -:104F300043B90000143002F045B800004FF0FF31D3 -:104F4000143002F03FB800004C3002F015B90000F8 -:104F50004FF0FF324C3002F00FB9000000207047D4 -:104F600010B500F58054D4F8A4381A6811780429D3 -:104F700017D1017C022914D15979012352898B4020 -:104F800013420ED1143001F0D7FF024648B1D4F8D5 -:104F9000A4484FF4407361792068BDE8104000F0E8 -:104FA0007FB910BD406BFFF7DBBF0000704700000A -:104FB0007FB5124B012504260446036000230574C7 -:104FC00000F1840243602946C0E902330C4B029091 -:104FD000143001934FF44073009601F089FF094BA0 -:104FE00004F69442294604F14C000294CDE9006392 -:104FF0004FF4407302F050F804B070BD7C7D00089F -:10500000A54F0008C94E00080A68302383F31188B1 -:105010000B790B3342F823004B79133342F823000A -:105020008B7913B10B3342F8230000F58053C3F89A -:10503000A41802230374002080F311887047000035 -:1050400038B5037F044613B190F85430ABB901254D -:10505000201D0221FFF730FF04F114006FF0010161 -:10506000257700F089FC04F14C0084F854506FF06F -:105070000101BDE8384000F07FBC38BD10B501210A -:1050800004460430FFF718FF0023237784F85430D8 -:1050900010BD000038B504460025143001F040FF73 -:1050A00004F14C00257702F00FF8201D84F85450CD -:1050B0000121FFF701FF2046BDE83840FFF750BF50 -:1050C00090F8803003F06003202B06D190F8812007 -:1050D0000023212A03D81F2A06D800207047222A3D -:1050E000FBD1C0E91D3303E0034A42670722826710 -:1050F000C3670120704700BF3C23002037B500F58F -:105100008055D5F8A4381A68117804291AD1017C81 -:10511000022917D11979012312898B40134211D129 -:1051200000F14C04204602F08FF858B101A9204646 -:1051300001F0D6FFD5F8A4480246019B21792068EA -:1051400000F0C0F803B030BD01F10B03F0B550F82A -:10515000236085B004460D46FEB1302383F31188E9 -:1051600004EB8507301D0821FFF7A6FEFB6806F15A -:105170004C005B691B681BB1019001F0BFFF0198F7 -:1051800003A901F0ADFF024648B1039B2946204622 -:1051900000F098F8002383F3118805B0F0BDFB6898 -:1051A0005A691268002AF5D01B8A013B1340F1D1DD -:1051B00004F18002EAE70000133138B550F82140CD -:1051C000ECB1302383F3118804F58053D3F8A4287D -:1051D0001368527903EB8203DB689B695D6845B114 -:1051E00004216018FFF768FE294604F1140001F05D -:1051F000ADFE2046FFF7B4FE002383F3118838BDCF -:105200007047000001F07AB901234022002110B557 -:10521000044600F8303BFCF7E3FB0023C4E901330C -:1052200010BD000010B53023044683F311882422FA -:10523000416000210C30FCF7D3FB204601F080F9DF -:1052400002230020237080F3118810BD70B500EB9D -:105250008103054650690E461446DA6018B11022E3 -:105260000021FCF7BDFBA06918B110220021FCF75A -:10527000B7FB31462846BDE8704001F067BA000030 -:1052800083682022002103F0011310B504468360D7 -:105290001030FCF7A5FB2046BDE8104001F0E2BA53 -:1052A000F0B4012500EB810447898D40E4683D435B -:1052B000A469458123600023A2606360F0BC01F013 -:1052C000FFBA0000F0B4012500EB810407898D408E -:1052D000E4683D436469058123600023A260636044 -:1052E000F0BC01F075BB000070B502230025044638 -:1052F000242203702946C0F888500C3040F8045C22 -:10530000FCF76EFB204684F8705001F0B3F9636837 -:105310001B6823B129462046BDE87040184770BD80 -:105320000378052B10B504460AD080F88C3005238D -:10533000037043681B680BB1042198470023A360E6 -:1053400010BD00000178052906D190F88C20436833 -:1053500002701B6803B118477047000070B590F8E1 -:105360007030044613B1002380F8703004F18002DD -:10537000204601F09BFA63689B68B3B994F88030CB -:1053800013F0600535D00021204601F08DFD00218D -:10539000204601F07DFD63681B6813B1062120469D -:1053A0009847062384F8703070BD2046984700283F -:1053B000E4D0B4F88630A26F9A4288BFA36794F90C -:1053C0008030A56F002B4FF0300380F20381002D59 -:1053D00000F0F280092284F8702083F31188002104 -:1053E0002046D4E91D23FFF76DFF002383F31188C6 -:1053F000DAE794F8812003F07F0343EA022340F2C6 -:105400000232934200F0C58021D8B3F5807F48D0A6 -:105410000DD8012B3FD0022B00F09380002BB2D18E -:1054200004F1880262670222A267E367C1E7B3F56D -:10543000817F00F09B80B3F5407FA4D194F8823047 -:10544000012BA0D1B4F8883043F0020332E0B3F569 -:10545000006F4DD017D8B3F5A06F31D0A3F5C0635E -:10546000012B90D86368204694F882205E6894F8F7 -:105470008310B4F88430B047002884D04368636751 -:105480000368A3671AE0B3F5106F36D040F6024206 -:1054900093427FF478AF5C4B63670223A3670023DA -:1054A000C3E794F88230012B7FF46DAFB4F88830F5 -:1054B00023F00203A4F88830C4E91D55E56778E7B6 -:1054C000B4F88030B3F5A06F0ED194F88230204646 -:1054D00084F88A3001F02CF963681B6813B101214C -:1054E00020469847032323700023C4E91D339CE71B -:1054F00004F18B0363670123C3E72378042B10D1E6 -:10550000302383F311882046FFF7BAFE85F3118814 -:105510000321636884F88B5021701B680BB120460F -:10552000984794F88230002BDED084F88B30042327 -:10553000237063681B68002BD6D002212046984751 -:10554000D2E794F8843020461D0603F00F010AD5F7 -:1055500001F09EF9012804D002287FF414AF2B4BF0 -:105560009AE72B4B98E701F085F9F3E794F882303E -:10557000002B7FF408AF94F8843013F00F01B3D000 -:105580001A06204602D501F0A7FCADE701F098FC11 -:10559000AAE794F88230002B7FF4F5AE94F88430BB -:1055A00013F00F01A0D01B06204602D501F07CFCB1 -:1055B0009AE701F06DFC97E7142284F8702083F3DA -:1055C00011882B462A4629462046FFF769FE85F3B7 -:1055D0001188E9E65DB1152284F8702083F3118803 -:1055E00000212046D4E91D23FFF75AFEFDE60B22D9 -:1055F00084F8702083F311882B462A4629462046DA -:10560000FFF760FEE3E700BFAC7D0008A47D000863 -:10561000A87D000838B590F870300446002B3ED0C5 -:10562000063BDAB20F2A34D80F2B32D8DFE803F06A -:10563000373131082232313131313131313137377F -:10564000856FB0F886309D4214D2C3681B8AB5FBC3 -:10565000F3F203FB12556DB9302383F311882B4607 -:105660002A462946FFF72EFE85F311880A2384F87F -:1056700070300EE0142384F87030302383F31188E7 -:10568000002320461A461946FFF70AFE002383F33B -:10569000118838BDC36F03B198470023E7E70021A5 -:1056A000204601F001FC0021204601F0F1FB636877 -:1056B0001B6813B10621204698470623D7E7000050 -:1056C00010B590F870300446142B29D017D8062B4B -:1056D00005D001D81BB110BD093B022BFBD800211E -:1056E000204601F0E1FB0021204601F0D1FB636878 -:1056F0001B6813B1062120469847062319E0152B95 -:10570000E9D10B2380F87030302383F31188002314 -:105710001A461946FFF7D6FD002383F31188DAE70E -:10572000C3689B695B68002BD5D1C36F03B19847F1 -:10573000002384F87030CEE7002382680375036984 -:105740001B6899689142FBD25A68036042601060FE -:105750005860704700238268037503691B68996865 -:105760009142FBD85A6803604260106058607047ED -:1057700008B50846302383F311880B7D032B05D031 -:10578000042B0DD02BB983F3118808BD8B6900223F -:105790001A604FF0FF338361FFF7CEFF0023F2E77B -:1057A000D1E9003213605A60F3E70000FFF7C4BF8D -:1057B000054BD96808751868026853601A600122A1 -:1057C000D8600275FAF726BE486900200C4B30B548 -:1057D000DD684B1C87B004460FD02B46094A68464B -:1057E00000F05EF92046FFF7E3FF009B13B1684627 -:1057F00000F060F9A86907B030BDFFF7D9FFF9E7FD -:105800004869002071570008044B1A68DB689068EB -:105810009B68984294BF002001207047486900208F -:10582000084B10B51C68D868226853601A600122C2 -:10583000DC602275FFF78EFF01462046BDE8104070 -:10584000FAF7E8BD4869002038B5074C0123002568 -:10585000064907482370656001F034FD0223237078 -:1058600085F3118838BD00BFB06B0020B47D0008FF -:105870004869002008B572B6044B186500F062FC58 -:1058800000F028FD024B03221A70FEE74869002051 -:10589000B06B002000F044B9034A516853685B1AAA -:1058A0009842FBD8704700BF001000E08B600223D5 -:1058B000086108468B8270478368A3F1840243F82D -:1058C000142C026943F8442C426943F8402C094ADD -:1058D00043F8242CC268A3F1200043F8182C0222BC -:1058E00003F80C2C002203F80B2C034A43F8102C6D -:1058F000704700BF2D0400084869002008B5FFF775 -:10590000DBFFBDE80840FFF751BF0000024BDB683A -:1059100098610F20FFF74CBF48690020302383F3C4 -:105920001188FFF7F3BF000008B50146302383F369 -:1059300011880820FFF74AFF002383F3118808BD70 -:10594000064BDB6839B1426818605A6013604360E7 -:105950000420FFF73BBF4FF0FF307047486900203D -:105960000368984206D01A68026050601846996130 -:10597000FFF71CBF7047000038B504460D4620688D -:10598000844200D138BD036823605C608561FFF705 -:105990000DFFF4E7036810B59C68A2420CD85C6860 -:1059A0008A600B604C602160596099688A1A9A601D -:1059B0004FF0FF33836010BD121B1B68ECE7000043 -:1059C0000A2938BF0A2170B504460D460A26601917 -:1059D00001F070FC01F058FC041BA54203D8751CB3 -:1059E00004462E46F3E70A2E04D90120BDE8704094 -:1059F00001F0A8BC70BD0000F8B5144B0D460A2A92 -:105A00004FF00A07D96103F11001826038BF0A2202 -:105A1000416019691446016048601861A81801F0D6 -:105A200039FC01F031FC431B0646A34206D37C1C23 -:105A300028192746354601F03DFCF2E70A2F04D924 -:105A40000120BDE8F84001F07DBCF8BD48690020A8 -:105A5000F8B506460D4601F017FC0F4A134653F8F9 -:105A6000107F9F4206D12A4601463046BDE8F840E5 -:105A7000FFF7C2BFD169BB68441A2C1928BF2C4656 -:105A8000A34202D92946FFF79BFF2246314603482D -:105A9000BDE8F840FFF77EBF486900205869002044 -:105AA000C0E90323002310B45DF8044B4361FFF702 -:105AB000CFBF000010B5194C236998420DD0816802 -:105AC000D0E9003213605A609A680A449A60002351 -:105AD00003604FF0FF33A36110BD0268234643F813 -:105AE000102F53600022026022699A4203D1BDE860 -:105AF000104001F0D9BB936881680B44936001F0BA -:105B0000C3FB2269E1699268441AA242E4D91144B4 -:105B1000BDE81040091AFFF753BF00BF48690020D5 -:105B20002DE9F047DFF8BC8008F110072C4ED8F8BB -:105B3000105001F0A9FBD8F81C40AA68031B9A4238 -:105B40003ED814444FF00009D5E90032C8F81C4093 -:105B500013605A60C5F80090D8F81030B34201D1F4 -:105B600001F0A2FB89F31188D5E903312846984753 -:105B7000302383F311886B69002BD8D001F084FBAC -:105B80006A69A0EB040982464A450DD2022001F061 -:105B9000D9FB0022D8F81030B34208D1514628462C -:105BA000BDE8F047FFF728BF121A2244F2E712EBD4 -:105BB00009092946384638BF4A46FFF7EBFEB5E7E4 -:105BC000D8F81030B34208D01444C8F81C00211A89 -:105BD000A960BDE8F047FFF7F3BEBDE8F08700BF5E -:105BE000586900204869002038B501F04DFB054A8E -:105BF000D2E90845031B181945F10001C2E9080163 -:105C000038BD00BF4869002000207047FEE7000053 -:105C1000704700004FF0FF307047000002290CD0A1 -:105C2000032904D00129074818BF00207047032A20 -:105C300005D8054800EBC2007047044870470020B3 -:105C4000704700BF8C7E00084C230020407E000877 -:105C500070B59AB005460846144601A900F0C2F88E -:105C600001A8FBF7B5FE431C0022C6B25B0010463C -:105C7000C5E9003423700323023404F8013C01AB6E -:105C8000D1B202348E4201D81AB070BD13F8011B94 -:105C9000013204F8010C04F8021CF1E708B53023C6 -:105CA00083F311880348FFF729FA002383F311884F -:105CB00008BD00BFB86B002090F8803003F01F02D1 -:105CC000012A07D190F881200B2A03D10023C0E9D3 -:105CD0001D3315E003F06003202B08D1B0F88430A9 -:105CE0002BB990F88120212A03D81F2A04D8FFF766 -:105CF000E7B9222AEBD0FAE7034A42670722826714 -:105D0000C3670120704700BF4323002007B5052962 -:105D100017D8DFE801F0191603191920302383F38F -:105D20001188104A01210190FFF790FA0198022191 -:105D30000D4AFFF78BFA0D48FFF7ACF9002383F308 -:105D4000118803B05DF804FB302383F31188074802 -:105D5000FFF776F9F2E7302383F311880348FFF762 -:105D60008DF9EBE7E07D0008047E0008B86B0020A9 -:105D700038B50C4D0C4C2A460C4904F10800FFF7CD -:105D800067FF05F1CA0204F110000949FFF760FF3F -:105D900005F5CA7204F118000649BDE83840FFF75E -:105DA00057BF00BF908400204C230020C07D000816 -:105DB000CA7D0008D57D000870B5044608460D462A -:105DC000FBF706FEC6B22046013403780BB918462D -:105DD00070BD32462946FBF7E7FD0028F3D10120CC -:105DE000F6E700002DE9F04705460C46FBF7F0FD0D -:105DF0002B49C6B22846FFF7DFFF08B10A36F6B2D4 -:105E000028492846FFF7D8FF08B11036F6B2632EAE -:105E10000BD8DFF88C80DFF88C90234FDFF894A04C -:105E20002E7846B92670BDE8F08729462046BDE8A1 -:105E3000F04701F06BBE252E2ED1072241462846A1 -:105E4000FBF7B2FD70B9194B224603F1100153F86C -:105E5000040B8B4242F8040BF9D11B78073511343F -:105E60001370DDE7082249462846FBF79DFD98B9E7 -:105E7000A21C0F4B197802320909C95D02F8041CF3 -:105E800013F8011B01F00F015345C95D02F8031C13 -:105E9000F0D118340835C3E7013504F8016BBFE7CA -:105EA000AC7E0008D57D0008B47E00082A7B00087F -:105EB00000E8F11F0CE8F11FBFF34F8F044B1A6984 -:105EC0005107FCD1D3F810215207F8D1704700BF19 -:105ED0000020005208B50D4B1B78ABB9FFF7ECFF63 -:105EE0000B4BDA68D10704D50A4A5A6002F18832AE -:105EF0005A60D3F80C21D20706D5064AC3F804210C -:105F000002F18832C3F8042108BD00BFEE860020EC -:105F1000002000522301674508B5114B1B78F3B9E7 -:105F2000104B1A69510703D5DA6842F04002DA6073 -:105F3000D3F81021520705D5D3F80C2142F04002C6 -:105F4000C3F80C21FFF7B8FF064BDA6842F00102F4 -:105F5000DA60D3F80C2142F00102C3F80C2108BD2D -:105F6000EE860020002000520F289ABF00F58060C6 -:105F700040040020704700004FF4003070470000DC -:105F8000102070470F2808B50BD8FFF7EDFF00F57C -:105F900000330268013204D104308342F9D1012078 -:105FA00008BD0020FCE700000F2838B505463FD8A3 -:105FB000FFF782FF1F4CFFF78DFF4FF0FF330728DD -:105FC0006361C4F814311DD82361FFF775FF030224 -:105FD00043F02403E360E36843F08003E360236954 -:105FE0005A07FCD42846FFF767FFFFF7BDFF4FF4C1 -:105FF000003100F04BF92846FFF78EFFBDE838402E -:10600000FFF7C0BFC4F81031FFF756FFA0F1080337 -:106010001B0243F02403C4F80C31D4F80C3143F0D4 -:106020008003C4F80C31D4F810315B07FBD4D9E7F6 -:10603000002038BD002000522DE9F84F05460C46DF -:10604000104645EA0203DE0602D00020BDE8F88FC4 -:1060500020F01F00DFF8BCB0DFF8BCA0FFF73AFF6C -:1060600004EB0008444503D10120FFF755FFEDE79D -:1060700020222946204601F017FD10B92035203492 -:10608000F0E72B4605F120021F68791CDDD10433AF -:106090009A42F9D105F178431B481C4EB3F5801F95 -:1060A0001B4B38BF184603F1F80332BFD946D1461F -:1060B0001E46FFF701FF0760A5EB040C336804F1EF -:1060C0001C0143F002033360231FD9F8007017F05E -:1060D0000507FAD153F8042F8B424CF80320F4D172 -:1060E000BFF34F8FFFF7E8FE4FF0FF33202221462A -:1060F00003602846336823F00203336001F0D4FCC8 -:106100000028BBD03846B0E7142100520C200052C2 -:1061100014200052102000521021005210B5084CDB -:10612000237828B11BB9FFF7D5FE0123237010BDDA -:10613000002BFCD02070BDE81040FFF7EDBE00BF83 -:10614000EE86002038B5054D00240334696855F803 -:106150000C0B00F0ADF8122CF7D138BDC87E00084A -:10616000084601F099BC000038B5EFF311859DB9E0 -:10617000EFF30584C4F30804302334B183F31188AA -:10618000FFF732FD85F3118838BD83F31188FFF7DF -:106190002BFD84F3118838BDBDE83840FFF724BDDE -:1061A00010B5FFF7E1FF104CC008104A002340EA89 -:1061B0004170C908A0FB04ECA0FB020E1CEB000020 -:1061C000A1FB044CA1FB02125B41001943EB0C0044 -:1061D00011EB0E0142F10002411842F100000909E1 -:1061E00041EA007010BD00BFCFF753E3A59BC42068 -:1061F0000244074BD2B210B5904200D110BD441CEE -:1062000000B253F8200041F8040BE0B2F4E700BFFD -:10621000504000580E4B30B51C6F240405D41C6F41 -:106220001C671C6F44F400441C670A4C024423683A -:10623000D2B243F480732360074B904200D130BD4B -:10624000441C51F8045B00B243F82050E0B2F4E77C -:1062500000440258004802585040005807B5012237 -:1062600001A90020FFF7C4FF019803B05DF804FB0B -:1062700013B50446FFF7F2FFA04205D0012201A9A1 -:1062800000200194FFF7C6FF02B010BD0144BFF328 -:106290004F8F064B884204D3BFF34F8FBFF36F8FEE -:1062A0007047C3F85C022030F4E700BF00ED00E067 -:1062B0000144BFF34F8F064B884204D3BFF34F8F87 -:1062C000BFF36F8F7047C3F870022030F4E700BF50 -:1062D00000ED00E070470000074B45F255521A6090 -:1062E00002225A6040F6FF729A604CF6CC421A6065 -:1062F0000122024B1A70704700480058F4860020B3 -:10630000034B1B781BB1034B4AF6AA221A60704755 -:10631000F486002000480058034B1A681AB9034A53 -:10632000D2F8D0241A607047F0860020004002584E -:10633000024B4FF48032C3F8D0247047004002581B -:1063400008B5FFF7E9FF024B1868C0F3806008BD8D -:10635000F086002070B5BFF34F8FBFF36F8F1A4ADE -:106360000021C2F85012BFF34F8FBFF36F8F5369F4 -:1063700043F400335361BFF34F8FBFF36F8FC2F805 -:106380008410BFF34F8FD2F8803043F6E074C3F32C -:10639000C900C3F34E335B0103EA0406014646EA33 -:1063A00081750139C2F86052F9D2203B13F1200FF8 -:1063B000F2D1BFF34F8F536943F480335361BFF37E -:1063C0004F8FBFF36F8F70BD00ED00E0FEE7000060 -:1063D000214B2248224A70B5904237D3214BC11E2F -:1063E000DA1C121A22F003028B4238BF002200216D -:1063F000FBF7F6FA1C4A0023C2F88430BFF34F8F34 -:10640000D2F8803043F6E074C3F3C900C3F34E33CF -:106410005B0103EA0406014646EA81750139C2F8C8 -:106420006C52F9D2203B13F1200FF2D1BFF34F8F02 -:10643000BFF36F8FBFF34F8FBFF36F8F0023C2F88F -:106440005032BFF34F8FBFF36F8F70BD53F8041BF3 -:1064500040F8041BC0E700BF60810008C888002026 -:10646000C8880020C888002000ED00E0074BD3F862 -:10647000D81021EA0001C3F8D810D3F8002122EA8D -:106480000002C3F80021D3F80031704700440258DD -:1064900070B5D0E9244300224FF0FF359E6804EB2D -:1064A00042135101D3F80009002805DAD3F8000996 -:1064B00040F08040C3F80009D3F8000B002805DA4B -:1064C000D3F8000B40F08040C3F8000B0132631892 -:1064D0009642C3F80859C3F8085BE0D24FF00113A5 -:1064E000C4F81C3870BD0000890141F02001016131 -:1064F00003699B06FCD41220FFF7CEB910B50A4CF5 -:106500002046FEF781FE094BC4F89030084BC4F8D2 -:106510009430084C2046FEF777FE074BC4F89030C5 -:10652000064BC4F8943010BDF886002000000840E7 -:10653000347F00089487002000000440407F00085A -:1065400070B503780546012B5CD1434BD0F89040E1 -:10655000984258D1414B0E216520D3F8D82042F003 -:106560000062C3F8D820D3F8002142F00062C3F8DB -:106570000021D3F80021D3F8802042F00062C3F854 -:106580008020D3F8802022F00062C3F88020D3F866 -:106590008030FEF79FFA324BE360324BC4F800388C -:1065A0000023D5F89060C4F8003EC02323604FF468 -:1065B0000413A3633369002BFCDA01230C2033613D -:1065C000FFF76AF93369DB07FCD41220FFF764F99F -:1065D0003369002BFCDA00262846A660FFF758FF37 -:1065E0006B68C4F81068DB68C4F81468C4F81C68E9 -:1065F00083BB1D4BA3614FF0FF336361A36843F07E -:106600000103A36070BD194B9842C9D1134B4FF0E1 -:106610008060D3F8D82042F00072C3F8D820D3F8B5 -:10662000002142F00072C3F80021D3F80021D3F812 -:10663000802042F00072C3F88020D3F8802022F03E -:106640000072C3F88020D3F88030FFF70FFF0E21CF -:106650004D209EE7064BCDE7F88600200044025807 -:106660004014004003002002003C30C0948700200A -:10667000083C30C0F8B5D0F89040054600214FF0F6 -:1066800000662046FFF730FFD5F8941000234FF046 -:1066900001128F684FF0FF30C4F83438C4F81C285A -:1066A00004EB431201339F42C2F80069C2F8006B49 -:1066B000C2F80809C2F8080BF2D20B68D5F890208E -:1066C000C5F89830636210231361166916F010063E -:1066D000FBD11220FFF7E0F8D4F8003823F4FE6372 -:1066E000C4F80038A36943F4402343F01003A361C6 -:1066F0000923C4F81038C4F814380B4BEB604FF082 -:10670000C043C4F8103B094BC4F8003BC4F81069FF -:10671000C4F80039D5F8983003F1100243F480131F -:10672000C5F89820A362F8BD107F000840800010D3 -:10673000D0F8902090F88A10D2F8003823F4FE6345 -:1067400043EA0113C2F80038704700002DE9F8430E -:1067500000EB8103D0F890500C468046DA680FFABF -:1067600081F94801166806F00306731E022B05EB3B -:1067700041134FF0000194BFB604384EC3F8101B0C -:106780004FF0010104F1100398BF06F1805601FAA1 -:1067900003F3916998BF06F5004600293AD0578A5D -:1067A00004F15801374349016F50D5F81C180B43C9 -:1067B0000021C5F81C382B180127C3F81019A74071 -:1067C0005369611E9BB3138A928B9B08012A88BF71 -:1067D0005343D8F89820981842EA034301F1400245 -:1067E0002146C8F89800284605EB82025360FFF75F -:1067F0007BFE08EB8900C3681B8A43EA8453483454 -:106800001E4364012E51D5F81C381F43C5F81C786F -:10681000BDE8F88305EB4917D7F8001B21F40041C8 -:10682000C7F8001BD5F81C1821EA0303C0E704F1E0 -:106830003F030B4A2846214605EB83035A60FFF7C6 -:1068400053FE05EB4910D0F8003923F40043C0F89B -:106850000039D5F81C3823EA0707D7E70080001075 -:1068600000040002D0F894201268C0F89820FFF7C6 -:106870000FBE00005831D0F8903049015B5813F436 -:10688000004004D013F4001F0CBF02200120704709 -:106890004831D0F8903049015B5813F4004004D0DF -:1068A00013F4001F0CBF02200120704700EB810190 -:1068B000CB68196A0B6813604B685360704700001F -:1068C00000EB810330B5DD68AA691368D36019B99C -:1068D000402B84BF402313606B8A1468D0F890204B -:1068E0001C4402EB4110013C09B2B4FBF3F46343D6 -:1068F000033323F0030343EAC44343F0C043C0F827 -:10690000103B2B6803F00303012B0ED1D2F808389B -:1069100002EB411013F4807FD0F8003B14BF43F02A -:10692000805343F00053C0F8003B02EB4112D2F811 -:10693000003B43F00443C2F8003B30BD2DE9F04179 -:10694000D0F8906005460C4606EB4113D3F8087B5F -:106950003A07C3F8087B08D5D6F814381B0704D5C6 -:1069600000EB8103DB685B689847FA071FD5D6F810 -:106970001438DB071BD505EB8403D968CCB98B69C8 -:10698000488A5A68B2FBF0F600FB16228AB91868EA -:10699000DA6890420DD2121AC3E90024302383F33F -:1069A000118821462846FFF78BFF84F31188BDE844 -:1069B000F081012303FA04F26B8923EA02036B815D -:1069C000CB68002BF3D021462846BDE8F04118479C -:1069D00000EB81034A0170B5DD68D0F890306C6936 -:1069E0002668E66056BB1A444FF40020C2F810092E -:1069F0002A6802F00302012A0AB20ED1D3F808086D -:106A000003EB421410F4807FD4F8000914BF40F067 -:106A1000805040F00050C4F8000903EB4212D2F855 -:106A2000000940F00440C2F800090122D3F83408FC -:106A300002FA01F10143C3F8341870BD19B9402EB0 -:106A400084BF4020206020681A442E8A8419013CAB -:106A5000B4FBF6F440EAC44040F00050C6E7000042 -:106A60002DE9F843D0F8906005460C464F0106EB3F -:106A70004113D3F8088918F0010FC3F808891CD016 -:106A8000D6F81038DB0718D500EB8103D3F80CC01B -:106A9000DCF81430D3F800E0DA68964530D2A2EB87 -:106AA0000E024FF000091A60C3F80490302383F3FC -:106AB0001188FFF78DFF89F3118818F0800F1DD022 -:106AC000D6F834380126A640334217D005EB8403AC -:106AD0000134D5F89050D3F80CC0E4B22F44DCF860 -:106AE000142005EB0434D2F800E05168714514D34A -:106AF000D5F8343823EA0606C5F83468BDE8F883CB -:106B0000012303FA01F2038923EA02030381DCF87B -:106B10000830002BD1D09847CFE7AEEB0103BCF88B -:106B20001000834228BF0346D7F8180980B2B3EBA0 -:106B3000800FE3D89068A0F1040959F8048FC4F8D5 -:106B40000080A0EB09089844B8F1040FF5D8184468 -:106B50000B4490605360C8E72DE9F84FD0F890508F -:106B600004466E69AB691E4016F480586E6103D00E -:106B7000BDE8F84FFEF7B8BB002E12DAD5F8003E9C -:106B80009B0705D0D5F8003E23F00303C5F8003E6F -:106B9000D5F80438204623F00103C5F80438FEF781 -:106BA000D1FB370505D52046FFF772FC2046FEF7DE -:106BB000B7FBB0040CD5D5F8083813F0060FEB6816 -:106BC00023F470530CBF43F4105343F4A053EB6011 -:106BD00031071BD56368DB681BB9AB6923F0080379 -:106BE000AB612378052B0CD1D5F8003E9A0705D070 -:106BF000D5F8003E23F00303C5F8003E2046FEF71B -:106C0000A1FB6368DB680BB120469847F30200F1F3 -:106C1000BA80B70226D5D4F8909000274FF0010A29 -:106C200009EB4712D2F8003B03F44023B3F5802F61 -:106C300011D1D2F8003B002B0DDA62890AFA07F372 -:106C400022EA0303638104EB8703DB68DB6813B18B -:106C50003946204698470137D4F89430FFB29B68F4 -:106C60009F42DDD9F00619D5D4F89000026AC2F32C -:106C70000A1702F00F0302F4F012B2F5802F00F0B1 -:106C8000CA80B2F5402F09D104EB8303002200F53E -:106C90008050DB681B6A974240F0B0803003D5F823 -:106CA000185835D5E90303D500212046FFF746FEE5 -:106CB000AA0303D501212046FFF740FE6B0303D54D -:106CC00002212046FFF73AFE2F0303D50321204679 -:106CD000FFF734FEE80203D504212046FFF72EFE1D -:106CE000A90203D505212046FFF728FE6A0203D535 -:106CF00006212046FFF722FE2B0203D5072120465E -:106D0000FFF71CFEEF0103D508212046FFF716FE12 -:106D1000700340F1A780E90703D500212046FFF763 -:106D20009FFEAA0703D501212046FFF799FE6B07B6 -:106D300003D502212046FFF793FE2F0703D5032139 -:106D40002046FFF78DFEEE0603D504212046FFF70F -:106D500087FEA80603D505212046FFF781FE6906B8 -:106D600003D506212046FFF77BFE2A0603D507211F -:106D70002046FFF775FEEB0574D520460821BDE8D7 -:106D8000F84FFFF76DBED4F890904FF0000B4FF026 -:106D9000010AD4F894305FFA8BF79B689F423FF664 -:106DA00038AF09EB4713D3F8002902F44022B2F5BB -:106DB000802F20D1D3F80029002A1CDAD3F800292B -:106DC00042F09042C3F80029D3F80029002AFBDBE7 -:106DD0003946D4F89000FFF787FB22890AFA07F3B7 -:106DE00022EA0303238104EB8703DB689B6813B16A -:106DF0003946204698470BF1010BCAE7910701D1AC -:106E0000D0F80080072A02F101029CBF03F8018B31 -:106E10004FEA18283FE704EB830300F58050DA6857 -:106E2000D2F818C0DCF80820DCE9001CA1EB0C0C3F -:106E300000218F4208D1DB689B699A683A449A60C6 -:106E40005A683A445A6029E711F0030F01D1D0F88B -:106E500000808C4501F1010184BF02F8018B4FEAEB -:106E60001828E6E7BDE8F88F08B50348FFF774FE79 -:106E7000BDE80840FDF7BEBAF886002008B5034813 -:106E8000FFF76AFEBDE80840FDF7B4BA948700201A -:106E9000D0F8903003EB4111D1F8003B43F40013DC -:106EA000C1F8003B70470000D0F8903003EB41116F -:106EB000D1F8003943F40013C1F8003970470000DD -:106EC000D0F8903003EB4111D1F8003B23F40013CC -:106ED000C1F8003B70470000D0F8903003EB41113F -:106EE000D1F8003923F40013C1F8003970470000CD -:106EF00030B50433039C0172002104FB0325C160FB -:106F0000C0E90653049B0363059BC0E90000C0E988 -:106F10000422C0E90842C0E90A11436330BD000001 -:106F20000022416AC260C0E90411C0E90A226FF080 -:106F30000101FEF721BD0000D0E90432934201D1E6 -:106F4000C2680AB9181D70470020704703691960AC -:106F50000021C2680132C260C2691344826993424F -:106F6000036124BF436A0361FEF7FABC38B50446E7 -:106F70000D46E3683BB162690020131D1268A362ED -:106F80001344E36207E0237A33B929462046FEF72B -:106F9000D7FC0028EDDA38BD6FF00100FBE70000F8 -:106FA000C368C269013BC360436913448269934269 -:106FB000436124BF436A436100238362036B03B1CF -:106FC0001847704770B53023044683F31188866AEA -:106FD0003EB9FFF7CBFF054618B186F31188284666 -:106FE00070BDA36AE26A13F8015B9342A36202D305 -:106FF0002046FFF7D5FF002383F31188EFE7000059 -:107000002DE9F84F04460E46174698464FF03009D2 -:1070100089F311880025AA46D4F828B0BBF1000FE7 -:1070200009D141462046FFF7A1FF20B18BF311881B -:107030002846BDE8F88FD4E90A12A7EB050B521ACF -:10704000934528BF9346BBF1400F1BD9334601F14E -:10705000400251F8040B914243F8040BF9D1A36AA2 -:10706000403640354033A362D4E90A239A4202D322 -:107070002046FFF795FF8AF31188BD42D8D289F3E5 -:107080001188C9E730465A46FAF784FCA36A5E4481 -:107090005D445B44A362E7E710B5029C04330172D0 -:1070A00003FB0421C460C0E906130023C0E90A33CE -:1070B000039B0363049BC0E90000C0E90422C0E90C -:1070C0000842436310BD0000026A6FF00101C26014 -:1070D000426AC0E904220022C0E90A22FEF74CBC41 -:1070E000D0E904239A4201D1C26822B9184650F867 -:1070F000043B0B60704700231846FAE7C368002181 -:10710000C2690133C3604369134482699342436196 -:1071100024BF436A4361FEF723BC000038B5044630 -:107120000D46E3683BB1236900201A1DA262E269A3 -:107130001344E36207E0237A33B929462046FEF779 -:10714000FFFB0028EDDA38BD6FF00100FBE700001F -:1071500003691960C268013AC260C2691344826956 -:107160009342036124BF436A036100238362036B7C -:1071700003B118477047000070B530230D46044630 -:10718000114683F31188866A2EB9FFF7C7FF10B145 -:1071900086F3118870BDA36A1D70A36AE26A013389 -:1071A0009342A36204D3E16920460439FFF7D0FF7C -:1071B000002080F31188EDE72DE9F84F04460D46D5 -:1071C000904699464FF0300A8AF311880026B3465C -:1071D000A76A4FB949462046FFF7A0FF20B187F3C1 -:1071E00011883046BDE8F88FD4E90A073A1AA8EBAF -:1071F0000607974228BF1746402F1BD905F14003C9 -:1072000055F8042B9D4240F8042BF9D1A36A40366F -:107210004033A362D4E90A239A4204D3E1692046A9 -:107220000439FFF795FF8BF311884645D9D28AF3CD -:107230001188CDE729463A46FAF7ACFBA36A3D44EC -:107240003E443B44A362E5E7D0E904239A4217D1C8 -:10725000C3689BB1836A8BB1043B9B1A0ED0136049 -:10726000C368013BC360C3691A4483699A420261DF -:1072700024BF436A036100238362012318467047D9 -:107280000023FBE700F024B9014B586A704700BFA8 -:10729000000C0040034B002258631A610222DA609E -:1072A000704700BF000C0040014B0022DA607047BD -:1072B000000C0040014B5863704700BF000C0040B9 -:1072C000FEE7000070B51B4B0025044686B05860F1 -:1072D0000E4685620163FDF765F804F11003A560B1 -:1072E000E562C4E904334FF0FF33C4E90044C4E964 -:1072F0000635FFF7C9FF2B46024604F1340120464C -:10730000C4E9082380230C4A2565FEF7CFFA012340 -:107310000A4AE06000920375684672680192B2689A -:10732000CDE90223064BCDE90435FEF7E7FA06B0B6 -:1073300070BD00BFB06B00204C7F0008517F00087B -:10734000C1720008024AD36A1843D062704700BF76 -:10735000486900204B6843608B688360CB68C360DA -:107360000B6943614B6903628B6943620B6803607D -:107370007047000008B53C4B40F2FF713B48D3F822 -:1073800088200A43C3F88820D3F8882022F4FF62BB -:1073900022F00702C3F88820D3F88820D3F8E02031 -:1073A0000A43C3F8E020D3F808210A43C3F80821B0 -:1073B0002F4AD3F808311146FFF7CCFF00F5806063 -:1073C00002F11C01FFF7C6FF00F5806002F13801F1 -:1073D000FFF7C0FF00F5806002F15401FFF7BAFF2C -:1073E00000F5806002F17001FFF7B4FF00F58060E6 -:1073F00002F18C01FFF7AEFF00F5806002F1A801F9 -:10740000FFF7A8FF00F5806002F1C401FFF7A2FFBB -:1074100000F5806002F1E001FFF79CFF00F580605D -:1074200002F1FC01FFF796FF02F58C7100F5806018 -:10743000FFF790FF00F018F90E4BD3F8902242F0BE -:107440000102C3F89022D3F8942242F00102C3F85B -:1074500094220522C3F898204FF06052C3F89C2074 -:10746000054AC3F8A02008BD004402580000025895 -:10747000587F000800ED00E01F00080308B500F089 -:10748000D5FAFEF7E1F90F4BD3F8DC2042F04002C9 -:10749000C3F8DC20D3F8042122F04002C3F8042111 -:1074A000D3F80431084B1A6842F008021A601A68CF -:1074B00042F004021A60FEF72FFFBDE80840FEF715 -:1074C00057BC00BF00440258001802487047000033 -:1074D000114BD3F8E82042F00802C3F8E820D3F8B3 -:1074E000102142F00802C3F810210C4AD3F81031E1 -:1074F000D36B43F00803D363C722094B9A624FF062 -:10750000FF32DA6200229A615A63DA605A6001221D -:107510005A611A60704700BF004402580010005CB6 -:10752000000C0040094A08B51169D3680B40D9B274 -:107530009B076FEA0101116107D5302383F311889E -:10754000FEF7A8F9002383F3118808BD000C004062 -:10755000064BD3F8DC200243C3F8DC20D3F8042127 -:107560001043C3F80401D3F80431704700440258B3 -:1075700008B53C4B4FF0FF31D3F8802062F0004259 -:10758000C3F88020D3F8802002F00042C3F88020A6 -:10759000D3F88020D3F88420C3F88410D3F8842053 -:1075A0000022C3F88420D3F88400D86F40F0FF4055 -:1075B00040F4FF0040F4DF4040F07F00D867D86F10 -:1075C00020F0FF4020F4FF0020F4DF4020F07F0097 -:1075D000D867D86FD3F888006FEA40506FEA5050F0 -:1075E000C3F88800D3F88800C0F30A00C3F8880005 -:1075F000D3F88800D3F89000C3F89010D3F8900027 -:10760000C3F89020D3F89000D3F89400C3F89410F6 -:10761000D3F89400C3F89420D3F89400D3F89800DA -:10762000C3F89810D3F89800C3F89820D3F89800BE -:10763000D3F88C00C3F88C10D3F88C00C3F88C20DE -:10764000D3F88C00D3F89C00C3F89C10D3F89C109E -:10765000C3F89C20D3F89C30FDF74EF8BDE80840F5 -:1076600000F0B8B90044025808B50122534BC3F8E2 -:107670000821534BD3F8F42042F00202C3F8F4205F -:10768000D3F81C2142F00202C3F81C210222D3F8D5 -:107690001C314C4BDA605A689104FCD54A4A1A6096 -:1076A00001229A60494ADA6000221A614FF440428E -:1076B0009A61444B9A699204FCD51A6842F480722C -:1076C0001A603F4B1A6F12F4407F04D04FF480329F -:1076D0001A6700221A671A6842F001021A60384BD2 -:1076E0001A685007FCD500221A611A6912F0380294 -:1076F000FBD1012119604FF0804159605A67344A2B -:10770000DA62344A1A611A6842F480321A602C4BE9 -:107710001A689103FCD51A6842F480521A601A68FC -:107720009204FCD52C4A2D499A6200225A631963AF -:1077300001F57C01DA6301F5E77199635A64284A1F -:107740001A64284ADA621A6842F0A8521A601C4B7E -:107750001A6802F02852B2F1285FF9D148229A61E2 -:107760004FF48862DA6140221A621F4ADA641F4AC3 -:107770001A651F4A5A651F4A9A6532231E4A1360CA -:10778000136803F00F03022BFAD10D4A136943F07B -:1077900003031361136903F03803182BFAD14FF078 -:1077A0000050FFF7D5FE4FF08040FFF7D1FE4FF0BD -:1077B0000040BDE80840FFF7CBBE00BF008000518D -:1077C000004402580048025800C000F002000001C6 -:1077D0000000FF0100889008322060006302090168 -:1077E000470E0508DD0BBF0120000020000001103E -:1077F0000910E00000010110002000524FF0B042DB -:1078000008B5D2F8883003F00103C2F8883023B1FC -:10781000044A13680BB150689847BDE80840FCF76C -:10782000E9BD00BF488800204FF0B04208B5D2F84B -:10783000883003F00203C2F8883023B1044A936809 -:107840000BB1D0689847BDE80840FCF7D3BD00BF36 -:10785000488800204FF0B04208B5D2F8883003F0D5 -:107860000403C2F8883023B1044A13690BB150698C -:107870009847BDE80840FCF7BDBD00BF4888002020 -:107880004FF0B04208B5D2F8883003F00803C2F8D0 -:10789000883023B1044A93690BB1D0699847BDE899 -:1078A0000840FCF7A7BD00BF488800204FF0B04259 -:1078B00008B5D2F8883003F01003C2F8883023B13D -:1078C000044A136A0BB1506A9847BDE80840FCF7B8 -:1078D00091BD00BF488800204FF0B04310B5D3F8E9 -:1078E000884004F47872C3F88820A30604D5124AAD -:1078F000936A0BB1D06A9847600604D50E4A136BA1 -:107900000BB1506B9847210604D50B4A936B0BB112 -:10791000D06B9847E20504D5074A136C0BB1506C45 -:107920009847A30504D5044A936C0BB1D06C9847D3 -:10793000BDE81040FCF75EBD488800204FF0B04322 -:1079400010B5D3F8884004F47C42C3F8882062055F -:1079500004D5164A136D0BB1506D9847230504D515 -:10796000124A936D0BB1D06D9847E00404D50F4ACD -:10797000136E0BB1506E9847A10404D50B4A936E59 -:107980000BB1D06E9847620404D5084A136F0BB14F -:10799000506F9847230404D5044A936F0BB1D06FFE -:1079A0009847BDE81040FCF725BD00BF488800207F -:1079B00008B50348FDF708F8BDE80840FCF71ABD14 -:1079C000D864002008B5FFF7ADFDBDE80840FCF71E -:1079D00011BD0000062108B50846FDF77BF8062119 -:1079E0000720FDF777F806210820FDF773F8062138 -:1079F0000920FDF76FF806210A20FDF76BF8062134 -:107A00001720FDF767F806212820FDF763F8092104 -:107A10007A20FDF75FF807213220FDF75BF80C2193 -:107A20005220BDE80840FDF755B8000008B5FFF743 -:107A30009FFD00F00DF8FDF70BFAFDF7E3FBFDF7F6 -:107A4000B5FAFFF743FDBDE80840FFF71BBC000097 -:107A50000023054A19460133102BC2E9001102F137 -:107A60000802F8D1704700BF488800200B46014645 -:107A7000184600F003B8000000F00EB810B5054C31 -:107A800013462CB10A4601460220AFF3008010BD18 -:107A90002046FCE700000000024B01461868FEF794 -:107AA0005FBB00BF6C23002010B501390244904237 -:107AB00001D1002005E0037811F8014FA34201D065 -:107AC000181B10BD0130F2E72DE9F041A3B1C91A2E -:107AD00017780144044603F1FF3C8C42204601D94B -:107AE000002009E00578BD4204F10104F5D10CEB5A -:107AF0000405D618A54201D1BDE8F08115F8018D25 -:107B000016F801EDF045F5D0E7E70000034611F85F -:107B1000012B03F8012B002AF9D170476F72672EF1 -:107B20006172647570696C6F742E437562654F7213 -:107B3000616E67652D7065726970680053544D33CE -:107B40003248373F3F3F0053544D33324837337844 -:107B50002F3732780053544D3332483734332F3770 -:107B600035332F373530000001105A00031059000B -:107B7000012058000320560040A2E4F164689106F9 -:107B80000041A3E5F26569920700000043414E46BB -:107B90004449666163653A204D657373616765208A -:107BA00052414D204F766572666C6F772100000060 -:107BB0004261642043414E496661636520696E6499 -:107BC00065782E00000100000001FF0000A00040C9 -:107BD00000A400400000000000000000C92A0008C6 -:107BE0005123000851320008C1230008CD230008AA -:107BF000E527000845250008892300088D23000893 -:107C0000652300084D230008A12700087123000800 -:107C1000B93300087D2300087527000801040E050C -:107C2000054B02020E05054B04010E05054B05012F -:107C30000B04044B08010603034600001000024039 -:107C4000080002400008024000000B00280002402B -:107C5000080002400408024006010C0040000240F7 -:107C6000080002400808024010020D0058000240BF -:107C7000080002400C08024016030E00700002408B -:107C80000C0002401008024000040F00880002406F -:107C90000C0002401408024006051000A00002403B -:107CA0000C0002401808024010061100B800024003 -:107CB0000C0002401C08024016072F00100402406E -:107CC000080402402008024000083800280402404E -:107CD000080402402408024006093900400402401A -:107CE0000804024028080240100A3A0058040240E2 -:107CF000080402402C080240160B3B0070040240AE -:107D00000C04024030080240000C3C008804024091 -:107D10000C04024034080240060D4400A004024056 -:107D20000C04024038080240100E4500B80402401E -:107D30000C0402403C080240160F4600009600006A -:107D40000000000000000000000000000000000033 -:107D50000000000000000000114E0008FD4D00086A -:107D6000394E0008254E0008314E00081D4E00080F -:107D7000094E0008F54D0008454E000800000000BF -:107D8000294F0008154F0008514F00083D4F0008CB -:107D9000494F0008354F0008214F00080D4F0008DB -:107DA0005D4F00080000000001000000000000001E -:107DB00063300000B07D0008A0690020B06B002097 -:107DC0004172647550696C6F740025424F41524492 -:107DD000252D424C002553455249414C25000000B9 -:107DE000020000000000000049510008B9510008DD -:107DF00040004000608400207084002002000000E9 -:107E00000000000003000000000000000152000814 -:107E1000000000001000000080840020000000002E -:107E20000100000000000000F886002001010200AF -:107E30000D5D00081D5C0008B95C00089D5C000831 -:107E400043000000487E000809024300020100C010 -:107E5000320904000001020201000524001001059E -:107E60002401000104240202052406000107058202 -:107E7000030800FF09040100020A000000070501D1 -:107E800002400000070581024000000012000000CF -:107E9000947E0008120110010200004009124157AF -:107EA00000020102030100000403090425424F41BE -:107EB0005244250030313233343536373839414277 -:107EC00043444546000000000001002000FF01007F -:107ED0000200000000000030000004000800000064 -:107EE000000000240000080004000000000400005E -:107EF00000FC0000020000000000043000800000D0 -:107F0000080000000000003800000100010000002F -:107F1000000000005D53000815560008C156000817 -:107F20004000400030880020308800200100000020 -:107F30004088002080000000400100000800000090 -:107F40000001000000100000080000006D61696E73 -:107F50000069646C650000000000802A00000000D9 -:107F6000AAAAAAAA00000024FFFF00000000000047 -:107F700000A00A000021000200000000AAAAAAAA8C -:107F800000000000FFFF00000000000900000900E1 -:107F90001400005400000000AAAAAAAA1400005469 -:107FA000FFFF000000000000000000000A40100079 -:107FB00000000000AAAA8AAA00401000FFFF0000EB -:107FC0009900000000000000008102000000000095 -:107FD000AAAAAAAA00410100FFFF00000000007049 -:107FE000070000000000000000000000AAAAAAAAE2 -:107FF00000000000FFFF0000000000000000000083 -:108000000000000000000000AAAAAAAA00000000C8 -:10801000FFFF000000000000000000000000000062 -:1080200000000000AAAAAAAA00000000FFFF0000AA -:108030000000000000000000000000000000000040 -:10804000AAAAAAAA00000000FFFF0000000000008A -:10805000000000000000000000000000AAAAAAAA78 -:1080600000000000FFFF0000000000000000000012 -:108070000000000000000000AAAAAAAA0000000058 -:10808000FFFF0000000000000000000000000000F2 -:10809000780500000000000000001E000000000045 -:1080A000FE2A0100D2040000FF000000B86B00208F -:1080B000D8640020000000003C7B0008830400001E -:1080C000477B000850040000557B00080096000024 -:1080D00000000800960000000008000004000000F6 -:1080E000A87E000800000000000000000000000062 -:1080F00000000000000000000000000070230020CD -:10810000000000000000000000000000000000006F -:10811000000000000000000000000000000000005F -:10812000000000000000000000000000000000004F -:10813000000000000000000000000000000000003F -:10814000000000000000000000000000000000002F -:10815000000000000000000000000000000000001F +:101B300055F82600BDE8704003F0E8B970BD00BF5D +:101B4000DC6300201C230020586B0020C4630020AD +:101B5000F8B571B6002301201A46194602F0AEFE10 +:101B60000446802004F0ECFB002849D00025254ADB +:101B700080274FF4D06C3D26136913F0C06F26D137 +:101B8000D2F8103113F0C06F21D1236805F1006144 +:101B900099602368D86023685F602368C3F800C039 +:101BA00021680B6843F001030B6021680B6823F088 +:101BB0001E030B6021680B68DB07FCD4237B803598 +:101BC000616806FA03F3B5F5001F0B60D4D1204617 +:101BD00002F0B4FEB5F5001F11D000240A4E0B4DE3 +:101BE000012004F00FFB3388A34205D92868204464 +:101BF000013404F04DFAF6E7002004F003FB61B66F +:101C0000F8BD00BF00200052DE6300209863002072 +:101C10002DE9F3470D46044600219046284640F240 +:101C20007912FFF7DDFE234620220021284604F129 +:101C3000220702F077F9231D022220212846C02620 +:101C400002F070F9631D03222221284602F06AF98E +:101C5000A31D03222521284602F064F904F108039C +:101C600010222821284602F05DF904F11003082211 +:101C70003821284602F056F904F1110308224021C8 +:101C8000284602F04FF904F11203082248212846A1 +:101C900002F048F904F1140320225021284602F0F2 +:101CA00041F904F1180340227021284602F03AF964 +:101CB00004F120030822B021284602F033F904F190 +:101CC00021030822B821284602F02CF931460836B3 +:101CD0003B4608222846013702F024F9B6F5A07FDA +:101CE000F4D194F83230314604F1330A00268DF8ED +:101CF000073008220DF10703284602F013F99DF87A +:101D000007304FEAC6099E4209F5A47720D394F81C +:101D10003231502B28BF50238DF80730B8F1000F17 +:101D200008D1394609F24F170DF10703072228465B +:101D300002F0F8F8002604F233149DF8073007EBA0 +:101D4000C6019E420DD30731C80802B0BDE8F08736 +:101D50000AEB0603082239462846013602F0E2F86B +:101D6000CDE7A31908222846013602F0DBF8E4E7A4 +:101D700013B5044608460021202223460190016045 +:101D8000C0F8031002F0CEF8231D01980222202192 +:101D900002F0C8F8631D01980322222102F0C2F864 +:101DA000A31D01980322252102F0BCF8019804F13B +:101DB00008031022282102F0B5F8072002B010BD58 +:101DC000F7B5047F05460E462CB1838A122B02D943 +:101DD000012003B0F0BD00230722284600961946D3 +:101DE00001F064FF731C01220721009328460023A1 +:101DF00001F05CFFD4B9B31C0522082128460093EA +:101E000023460D2401F052FFB378102BE0D837465B +:101E1000BB1BB278934210D307342B7FA88AE40807 +:101E2000B3B9844294BF00200120D2E7AB8A0824D2 +:101E3000DB00083BDB08B370E6E7FB1C2146082209 +:101E40002846009300230834013701F02FFFDFE715 +:101E5000201A18BF0120BCE7F7B5047F05460E46DF +:101E60002CB1838ACA2B02D9012003B0F0BD002314 +:101E7000082228460096194601F018FF731CD4B9B1 +:101E800008220093234610241146284601F00EFF35 +:101E90007378C82BE8D801235F1C7278013B93420A +:101EA00010D307342B7FA88AE408B3B9844294BFC7 +:101EB00000200120D9E7AB8A0824DB00083BDB08BF +:101EC0007370E5E7F31921460822284600930023A2 +:101ED00001F0ECFE08343B46DEE7201A18BF012073 +:101EE000C3E70000F7B50D46044600211646284614 +:101EF0008122FFF775FD234608220021284602F0C3 +:101F000011F894F901206378002AB8BF7F238DF877 +:101F100007309EB90F270DF1070307220821284635 +:101F200002F000F8002602349DF8073007EBC601E6 +:101F30009E4205D30731C80803B0F0BD0827F1E77A +:101F4000A31908222846013601F0ECFFECE7000057 +:101F5000F7B50E460546002114463046CE22FFF75F +:101F60003FFD2B4628220021304601F0DBFF2B7A73 +:101F7000C82B28BFC8238DF807308CB930240DF149 +:101F8000070308222821304601F0CCFF2F467B1B97 +:101F90009DF80720934205D3E01DC00803B0F0BDB3 +:101FA0002824F3E707F109032146082230460834C4 +:101FB000013701F0B7FFEAE7F7B5047F05460E46A3 +:101FC00034B1838AB3F5827F02D9012003B0F0BD1A +:101FD0000123102200212846009601F067FEDCB99B +:101FE000B31C09221021284600932346192401F02E +:101FF0005DFE7388B3F5807FE7D83746BB1B7288D8 +:10200000934210D307342B7FA88AE408B3B98442E3 +:1020100094BF00200120D9E7AB8A1024DB00103BDD +:10202000DB087380E5E73B1D214608222846009324 +:1020300000230834013701F039FEDFE7201A18BF0A +:102040000120C3E730B50A44084D91420DD011F884 +:10205000013B5840082340F30004013B2C4013F09F +:10206000FF0384EA5000F6D1EFE730BD2083B8EDDE +:10207000F7B5364A6B46106851686A4603C30823B1 +:102080003349344805F084FF044690BB0A25324AA0 +:102090006B46106851686A4603C308232F492D48D0 +:1020A00005F076FF0446002847D00369B3F5F01F1A +:1020B00043D8B0F86620B2F5AF6F3ED1284A02444B +:1020C00002F15C018B4238D35C3B224900209E1A0E +:1020D000FFF7B8FF04F16401074632460020FFF71E +:1020E000B1FFA3689F4228D1E368984208BF00254A +:1020F00023E00369B3F5F01F26D8428BB2F5AF6F2A +:1021000020D1174A024402F110018B4218D3103B30 +:10211000104900209D1AFFF795FF04F118010646AB +:102120002A460020FFF78EFFA3689E4202D1E36893 +:10213000984201D00D25AAE70025284603B0F0BD3E +:102140001025A4E70C25A2E70B25A0E74080000896 +:10215000DCFF1D00000002084980000890FF1D0000 +:102160000800FEF710B5037C044613B9006804F0BC +:102170001BF9204610BD00000023BFF35B8FC36036 +:10218000BFF35B8FBFF35B8F8360BFF35B8F7047E1 +:10219000BFF35B8F0068BFF35B8F704770B5054678 +:1021A0000C30FFF7F5FF044605F108063046FFF74F +:1021B000EFFFA04206D96D683046FFF7E9FF2544DE +:1021C000281A70BD3046FFF7E3FF201AF9E7000038 +:1021D00070B505464068A0B105F10C0605F1080090 +:1021E000FFF7D6FF04463046FFF7D2FF844204F1E2 +:1021F000FF34304694BF6D680025FFF7C9FF2C44BB +:10220000201A70BD38B50C460546FFF7C7FFA0423F +:1022100010D305F10800FFF7BBFF04446868BFF363 +:102220005B8FB4FBF0F100FB11440120AC60BFF305 +:102230005B8F38BD0020FCE72DE9F04114460746CE +:102240000D46FFF7C5FF844228BF0446D4B1B84607 +:1022500058F80C6B4046FFF79BFF3044286040461F +:102260007E68FFF795FF331A9C4203D801206C600B +:10227000BDE8F081A41B6B603B682044AB60E86064 +:102280000220F5E72046F3E738B50C460546FFF790 +:102290009FFFA04210D305F10C00FFF779FF044423 +:1022A0006868BFF35B8FB4FBF0F100FB11440120C1 +:1022B000EC60BFF35B8F38BD0020FCE72DE9FF41E8 +:1022C0008846694607466C46FFF7B6FF002506B20A +:1022D00004EBC606B4420AD0626808EB0501206828 +:1022E0000834FFF757FB54F8043C1D44F2E7294635 +:1022F0003846FFF7C9FF284604B0BDE8F08100006A +:10230000F8B505460C300F46FFF742FF05F1080609 +:1023100004463046FFF73CFFA042304688BF6C6859 +:10232000FFF736FF201A386020B12C683046FFF7DF +:102330002FFF2044F8BD000073B5144606460D4635 +:10234000FFF72CFF8442019028BF0446DCB101A9AD +:102350003046FFF7D5FF019B33B93268C5E9023338 +:10236000C5E9002401200CE09C42286038BF01949C +:10237000019884426860F5D93368241A0220AB6062 +:10238000EC6002B070BD2046FBE700002DE9FF4184 +:102390000F4669466C46FFF7CFFF00B2002604EBFC +:1023A000C005AC4209D0D4F80480B81954F8081B11 +:1023B00042464644FFF7EEFAF3E7304604B0BDE884 +:1023C000F081000038B50546FFF7E0FF04460146FE +:1023D0002846FFF717FF204638BD000008B103F07C +:1023E000E3BF70477047000010B4134602681468DA +:1023F0000022A4465DF8044B6047000000F58050C1 +:1024000090F859047047000000F5805090F852048D +:102410007047000000F5805090F9580470470000A4 +:102420004E207047302383F3118800F58052D2F894 +:102430009C34D2F898041844D2F894341844D2F852 +:102440007C341844D2F88C341844D2F888341844B8 +:10245000002383F31188704700F58050C0F85414AE +:10246000012070472DE9F04F0C4600F5805185B0F2 +:102470001F4691F8523405469046BDF838909BB1FE +:10248000D1F878340133C1F878342368980006D441 +:10249000237B082B0BD9627B0AB10F2B07D9D1F80C +:1024A0007C340133C1F87C344FF0FF3010E030232E +:1024B00083F31188EB6AD3F8C42012F4001B0AD00E +:1024C000D1F8803400200133C1F8803480F31188C2 +:1024D00005B0BDE8F08F20684822D3F8C43000284A +:1024E000C3F3044A6B6AB4BF40F08040800412FB1F +:1024F0000A334FEA4A161860226852004FEA0A620D +:1025000044BF40F000501860207B42EA00425A600D +:10251000607B10B342F440125A60D1F8B02401320B +:10252000C1F8B024AA1902F58352117B41F02001B1 +:102530001173207B039300F0E3FF0330039B8010B3 +:102540005FFA8BF20BF1010B82420DDA04EB820190 +:1025500003EB820249689160F2E7AA1902F58352FF +:10256000117B60F34511E3E70122EB6A05EB4A11A9 +:1025700002FA0AF201F58251C3F8D020AB191831E2 +:1025800004F10C0203F58253C3E90487234653F890 +:10259000040B934241F8040BF9D11B882E440B80A5 +:1025A00041F2680346F803A006F5805609F00303DC +:1025B00096F86C2043F0100322F01F02134386F8B4 +:1025C0006C30002383F3118842463B46214628465F +:1025D000CDF8009000F05AFF012079E72DE9F0478F +:1025E00000F58056044696F85254002D40F00381C1 +:1025F000037C032B40F0948028462B462F465FFA3D +:1026000080FC944510DA01EBCC0E51F83CC0BCF1D3 +:10261000000F04DBDEF804C0BCF1000F02DB013761 +:102620000130ECE70133FBE7302080F31188E06AEA +:10263000F3B9D0F8803043F00203C0F880304E2365 +:10264000E06A002F6FD1D0F8803043F00103C0F86A +:1026500080306A4B6A4A1B6803F1805303F52C53A0 +:102660009B009342A36240F2B080664800F0E6FE11 +:102670004D2B42D8DFF884814FEA034EDFF8889172 +:10268000D8F800C04EEA8C0EC0F884E00CF18050FF +:1026900000F52C508000606103EB0C00D4F82CC0D6 +:1026A000C3F14E03C8F80000DCF8800040F03000B1 +:1026B000CCF880004FF0000CD4F81480E6465FFAA6 +:1026C0008CF08242BCDD01EBC00A51F830000028DA +:1026D00010DBDAF804A0BAF1000F0BDA09EA0040C7 +:1026E0000AF07F0A40EA0A0040F0084048F82E004D +:1026F0000EF1010E0CF1010CE1E7836923F00103F7 +:10270000836100F0A1FE0646E36A9B69D90704D500 +:1027100000F09AFE831BFA2BF6D9002383F311886D +:102720002846BDE8F087B7EB530F3DD2DFF8CCE089 +:102730004FEA074CDEF800304CEA830CC0F888C042 +:1027400003F1805003EB4703002700F52C50CEF82F +:102750000030BC468000A061E06AD0F8803043F0D1 +:102760000C03C0F88030D4F818E0FBB29A427FF72F +:1027700070AF51F8330001EBC3080028D8F80430DB +:1027800001DB002B0EDB20F0604023F0604340F0C3 +:10279000005043F000434EF83C000EEBCC000CF12F +:1027A000010C43600137E0E7836923F00103836193 +:1027B00000F04AFE0646E36A9B69DA07ADD500F0F1 +:1027C00043FE831BFA2BF6D9A7E7E26A936923F04D +:1027D0000103936100F038FE0746E36A9B69DB075B +:1027E00005D500F031FEC31BFA2BF6D995E701257C +:1027F00086F8525491E7002592E700BFEC63002071 +:10280000FCB50040548000080000FF0713B500F538 +:1028100080540191606CFFF7DBFC1F280AD920224D +:102820000199606CFFF74AFDA0F12003584258411E +:1028300002B010BD0020FBE708B5302383F31188F8 +:1028400000F58050406CFFF797FC002383F311885C +:1028500008BD0000002202608281426082607047F1 +:102860000022002310B5C0E90023002304460C30E9 +:1028700020F8043CFFF7EEFF204610BD2DE9F0479D +:102880009A4688B0074688469146302383F31188DC +:1028900007F580546846FFF7E3FF606CFFF77EFCA6 +:1028A0001F282ED920226946606CFFF78BFD202857 +:1028B00027D194F8523423B303AD444605AB2E46DA +:1028C000083403CE9E4244F8080C44F8041C3546F4 +:1028D000F5D130682060B388A380DDE90023C9E921 +:1028E0000023BDF80830AAF80030002383F31188D4 +:1028F00053464A464146384608B0BDE8F04700F026 +:10290000B3BD002080F3118808B0BDE8F087000057 +:102910002DE9F84F0023064600F581540546884608 +:102920001034C0E90133274B46F8303B3746384670 +:102930002037FFF795FFA742F9D105F580544FF4F2 +:10294000805305F5A3594FF0000A266300266764FB +:1029500005F5835709F110094FF0000B1037E663B6 +:10296000C4E90D36012384F8403084F84830A7F1DB +:102970001800203747E910ABFFF76CFF47F8286CC9 +:102980004F45F4D1B8F1010F84F85884A4F85A6483 +:10299000A4F85C64A4F85E6484F86064A4F86264DB +:1029A000A4F86464A4F8666484F8686402D90648EC +:1029B00000F044FD054B284653F82830EB62BDE893 +:1029C000F88F00BFA4800008788000089480000879 +:1029D000044B10B5197804464A1C1A70FFF798FF8B +:1029E000204610BDE96300202DE9F04300295AD0AC +:1029F0002E4E2F48B6FBF1F481428CBF0A201120E5 +:102A0000431EB4FBF0F700FB1740DDB220B1022BF0 +:102A10001846F5D8002032E07B1EB3F5806F2ED229 +:102A2000C5EBC5084FF47A7308F103044FEAE40ECE +:102A3000C4F3C7040EF10109281B0EFB033E5FFA25 +:102A400080FC59FA80F0BEFBF0F0B0F5617F18DC35 +:102A500083B2601C5CFA80F07843B6FBF0F08142F0 +:102A6000D8D1611E0F29D5D80CF1FF310729D1D853 +:102A70000120138057801071547182F806C0BDE8A0 +:102A8000F08308F1FF34E010C4F3C70400F1010E35 +:102A90002D1B00FB03335FFA85FC5EFA85F5B3FB63 +:102AA000F5F39BB2D5E70846E9E700BF00B4C404DC +:102AB0003F420F0030B50D4B05200D4D1C786C4387 +:102AC0008C420ED159780120518099785171D97872 +:102AD0009171197911715B7903EB83035B001380AA +:102AE00030BD013803F10603E8D1F9E7E4800008BE +:102AF00040420F0038B540F27772C36A154CC3F8F4 +:102B0000BC200722C36AC3F8C8202268C16A9300A8 +:102B100043F4C023C1F8A03002F1805302F16C01EC +:102B2000C56A03F52C53EA3289009B00226041F00C +:102B3000E061094AC361C5F8C01003F5D87103F517 +:102B40006A7341629342836202D9044800F076FCC2 +:102B500038BD00BFEC630020FCB500405480000885 +:102B60002DE9F04F00F580551F4689B0044695F8D1 +:102B7000583489469046022B04D90026304609B0C5 +:102B8000BDE8F08FA84A52F8231009B942F8230093 +:102B9000A648C4F80C9001782774C9B9302383F390 +:102BA0001188A34BD3F8EC2042F48072C3F8EC20D8 +:102BB000D3F8942042F48072C3F89420D3F8942080 +:102BC00022F48072C3F894200123037081F31188EA +:102BD00095F851347BB9302383F31188954A95F8E1 +:102BE0005834D35C0BB3012B28D0012385F8513422 +:102BF000002383F31188302383F31188E26A9369F9 +:102C000023F01003936100F01FFC8246E36A9E6983 +:102C100016F0080619D000F017FCA0EB0A03FA2BF7 +:102C2000F4D9002686F31188A8E70321132001F0C8 +:102C3000A1FF0321152001F09DFFD6E703211420F9 +:102C400001F098FF03211620F5E79A6942F001028E +:102C50009A6100F0F9FB8246E36A9A69D00706D4CC +:102C600000F0F2FBA0EB0A03FA2BF5D9D9E79A6939 +:102C70004FF0000A42F002029A61E36AC3F854A0DE +:102C80008AF3118804F5825B686CFFF775FA0BF123 +:102C9000100B202200216846FEF7A2FE02A8FFF7D3 +:102CA000D9FD6A460BEB06030DF1180ECDF818A0FE +:102CB00094460833BCE80300F44543F8080C43F895 +:102CC000041C6246F4D1DCF8000020361860B6F52A +:102CD000806F9CF804201A71DBD1002304F5A25206 +:102CE000494620461A3285F8503485F85334FFF7A8 +:102CF0007BFE064690B9E26A936923F00103936173 +:102D000000F0A2FB0546E36A9B69D9077FF535AF62 +:102D100000F09AFB431BFA2BF5D92EE795F85E34A9 +:102D2000C5F86C94591E95F85F34E26A013B1B02AA +:102D300043EA416395F8601401390B43B5F85C141C +:102D4000013943EA0143D361B8F1000F36D004F5ED +:102D5000A352414620460232FFF7ACFE90B9E26A28 +:102D6000936923F00103936100F06EFB0546E36A6B +:102D70009B69DA077FF501AF00F066FB431BFA2B76 +:102D8000F5D9FAE695F86724C5F87084511E95F8D0 +:102D90006824E36A013A120142EA012295F86614B6 +:102DA00001390A43B5F86414013942EA014242F498 +:102DB0000002DA604FF42062E36A9A64E36A4FF03B +:102DC00000082046C3F8BC80FFF794FE85F85984BC +:102DD0006FF04042E36A1A65174AE36A5A654FF09A +:102DE0000222E36A9A654FF0FF32E36AC3F8E020FB +:102DF0000322E36A9742DA653FF4C0AEE26A936960 +:102E000023F00103936100F01FFB0746E36A9B690F +:102E1000DB0705D500F018FBC31BFA2BF6D9ACE68F +:102E2000012385F85234A9E6E0630020E86300201E +:102E3000004402588C800008550200022DE9F04F32 +:102E4000054689B090469946002741F2680A00F588 +:102E50008056EB6AD3F8D830FB40D80751D505EB44 +:102E600047124FEA471B52441379190749D4D6F841 +:102E700084340133C6F8843405F5A553C3E90089C9 +:102E800013799A0605EB0B0248BFD6F8B4345244C6 +:102E900044BF0133C6F8B434137943F00803137107 +:102EA000DB0723D596F8533403B305F582546846FF +:102EB000FFF7D6FC03AB18345C4404F1080C20681F +:102EC000083454F8041C1A46644503C21346F6D16C +:102ED0002068694610602846A2889A800123ADF8D0 +:102EE00008302B68CDE90089DB6B9847D6F8A83409 +:102EF000D6F854040133C6F8A83410B103681B692E +:102F000098470137202FA4D109B0BDE8F08F000009 +:102F10002DE9F04F0F468DB0044600F097FA824637 +:102F20008946002F5BD1E36AD3F8A02012F4FE0F8C +:102F300003D100200DB0BDE8F08FD3F8A42092019A +:102F400041BF04F58051D1F898240132C1F898248A +:102F5000D3F8A4205606ECD0D3F8A450E669C5F304 +:102F600005254823E8464FF0000B03FB0566404665 +:102F7000FFF770FC326851004ABF22F06043C2F391 +:102F80008A4343F00043920048BF43F080430093DC +:102F9000736813F400131BBF012304F580528DF8EE +:102FA0000D308DF80D301EBFD2F8B8340133C2F8A1 +:102FB000B834F38803F00F038DF80C309DF80C0043 +:102FC00000F09EFA5FFA8BF3984225D9F2180CA90B +:102FD0000BF1010B127A0B4403F82C2CEEE7012FB6 +:102FE000A7D1E36AD3F8B02012F4FE0FA1D0D3F832 +:102FF000B420950141BF04F58051D1F898240132E5 +:10300000C1F89824D3F8B420500692D0D3F8B45025 +:10301000266AC5F30525A4E7EFB9E36AC3F8A8500B +:1030200004A807ADFFF71CFC98E80F0007C52B802C +:103030000023204604A9ADF81830236804F5805415 +:10304000DB6BCDE904A9984758B1D4F8903401332B +:10305000C4F890346EE7012FE2D1E36AC3F8B850A8 +:10306000DEE7D4F8943401200133C4F8943461E7E6 +:103070002DE9F04105460F4600F5805401263946FA +:103080002846FFF745FF10B184F85364F7E7D4F8FA +:10309000A834D4F854040133C4F8A83420B1036828 +:1030A000BDE8F0411B691847BDE8F081C36AF0B57F +:1030B0001A6C12F47F0F2BD01B6C00F5805441F278 +:1030C00068054FF0010CC4F8AC340023471900EB3D +:1030D00043125E012A44117911F0020F15D04907FD +:1030E00013D4B959C66A0CFA01F1D6F8CCE011EA4A +:1030F0000E0F0AD0C6F8D410117941F004011171F5 +:10310000D4F88C240132C4F88C240133202BDED176 +:10311000F0BD00002B4B70B51E561B5C012B30D848 +:10312000294D2A4A55F8233052F8264013B349B3A3 +:10313000236D9A0510D54FF40073236500F086F9CE +:1031400050EA01020B4602D0013861F10003024649 +:1031500055F82600FFF772FE236D9B012CD54FF02A +:10316000007255F82630226503F58053012283F85A +:10317000592421E001232365102323654FF4805354 +:10318000236570BD236DDA0702D4236D5B0706D576 +:103190000523002155F826002365FFF769FF236DFD +:1031A000D80602D4236D590606D55023012155F8BF +:1031B00026002365FFF75CFF55F82600BDE8704048 +:1031C000FFF774BF90800008E0630020948000083F +:1031D00008B5302383F31188FFF768FF002383F3DA +:1031E000118808BDC36AD3F8C00010F07C5005D028 +:1031F000D3F8C40080F40010C0F3405070470000C2 +:1032000008B5302383F3118800F58050406CFEF739 +:10321000C5FF002383F3118843090CBF0120002060 +:1032200008BD000000F5805393F8592462B1C16ACB +:103230008A6922F001028A61D3F89C240132C3F822 +:103240009C24002283F85924704700002DE9F7439D +:10325000302181F3118800F58251002541F2680E7A +:103260004FF00108103100F5805C00EB4514744408 +:10327000267977071CD4F6061AD58E69D0F82C90DB +:1032800008FA06F6D9F8CC703E4211D04F68019783 +:103290000F689742019F9F410AD2C9F8D4602679EE +:1032A00046F004062671DCF888440134CCF88844E2 +:1032B00001352031202DD8D1002383F3118803B0AC +:1032C000BDE8F083F8B51E4600230F46054613708F +:1032D0001446FFF795FF80F0010038701EB12846B4 +:1032E000FFF780FF2070F8BD2DE9F04F85B09946BB +:1032F0000D468046164691F800B0DDE90EA3029314 +:103300001378019300F0A2F82B7804460F4613B906 +:103310003378002B41D022463B464046FFF796FFCC +:10332000FFF756FFFFF77EFF4B4632462946FFF771 +:10333000C9FF2B7833B1BBF1000F03D0012005B0DA +:10334000BDE8F08F337813B1019B002BF6D108F55F +:10335000805303935445029B77EB03031DD2039BD9 +:10336000D3F85404C8B10368AAEB04011B6898475A +:103370004B46324629464046FFF7A4FF2B7813B14F +:10338000BBF1000FDAD1337813B1019B002BD5D1FB +:1033900000F05CF804460F46DCE70020CFE70000B1 +:1033A000002108B50846FFF7B5FEBDE8084001F06A +:1033B00071B8000008B501210020FFF7ABFEBDE8A1 +:1033C000084001F067B8000008B500210120FFF7B0 +:1033D000A1FEBDE8084001F05DB80000012108B57C +:1033E0000846FFF797FEBDE8084001F053B800001B +:1033F00000B59BB0EFF3098168226846FEF7CAFA70 +:10340000EFF30583014B9B6BFEE700BF00ED00E08F +:1034100008B5FFF7EDFF000000B59BB0EFF30981A1 +:1034200068226846FEF7B6FAEFF30583014B5B6B43 +:10343000FEE700BF00ED00E0FEE700000FB408B5B6 +:10344000029802F08BFAFEE702F0DCBF02F0BEBF8A +:1034500013B56C46031D84E8060094E8030083E876 +:103460000500012002B010BD73B58568019155B10A +:103470001B885B0707D4D0E900369B6B9847019AFD +:10348000C1B23046A847012002B070BDF0B58668D1 +:1034900089B005460C465EB1BDF838305B070AD4EA +:1034A000D0E900379B6B98472246C1B23846B047F7 +:1034B000012009B0F0BD0022002301F10806CDE98A +:1034C000002300230A46ADF8083003AB1068083229 +:1034D00052F8041C1C46B24203C42346F6D11068BD +:1034E00020609288A280FFF7B1FF0423ADF8083076 +:1034F0002B68CDE90001DB6B694628469847D7E782 +:10350000082817D909280CD00A280CD00B280CD071 +:103510000C280CD00D280CD00E2814BF40203020D1 +:1035200070470C20704710207047142070471820F7 +:1035300070472020704700002DE9F041456A15B919 +:103540004162BDE8F0814B68AC4623F06047C3F3AD +:103550008A464FEAD37EC3F3807816EA230638BF43 +:103560003E462B465A68BEEBD27F22F060440AD01A +:10357000002A18DAA40CB44217D19D420FD10D6075 +:10358000DEE71346EEE7A74207D102F08044C2F31C +:10359000807242450BD054B1EFE708D2EDE7CCF88A +:1035A00000100B60CDE7B44201D0B442E5D81A68F0 +:1035B0009C46002AE5D11960C3E700002DE9F047D9 +:1035C000089D01F0070400EBD1004FF47F494FEA5A +:1035D000D508224405F00705944201D1BDE8F087E3 +:1035E00004F0070705F0070A111B08EBD50E574535 +:1035F0003E4613F80EC038BF5646C6F108068E4246 +:1036000028BF0E46E108415C34443544B94029FAEC +:1036100006F721FA0AF1FFB28CEA010147FA0AF72C +:1036200039408CEA010C03F80EC0D5E780EA01208E +:10363000082341F2210201B2013B4000002980B27F +:10364000B8BF504013F0FF03F5D1704738B50C46B2 +:103650008D18A54200D138BD14F8011BFFF7E6FF15 +:10366000F7E7000042684AB11368818943604389E3 +:1036700001339BB29942438138BF83811046704722 +:1036800070B588B0044620220D4668460021FEF73A +:10369000A7F920460495FFF7E5FF024660B16B46A7 +:1036A000054608AE1C46083503CCB44245F8080C64 +:1036B00045F8041C2346F5D1104608B070BD000043 +:1036C000082817D909280CD00A280CD00B280CD0B0 +:1036D0000C280CD00D280CD00E2814BF4020302010 +:1036E00070470C2070471020704714207047182036 +:1036F0007047202070470000082817D90C280CD9E3 +:1037000010280CD914280CD918280CD920280CD929 +:1037100030288CBF0F200E207047092070470A20E8 +:1037200070470B2070470C2070470D207047000039 +:103730002DE9F843078C0446072F1ED900254FF6C4 +:10374000FF73D0E90298C5F12006A5F1200029FAFF +:1037500005F1083508FA06F628FA00F0314301436E +:103760001846C9B2FFF762FF402D0346EBD13A4637 +:10377000E169BDE8F843FFF769BF4FF6FF70BDE8A8 +:10378000F883000010B54B6823B9CA8A63F30902B5 +:10379000CA8210BD04691A681C600361C38A013BB8 +:1037A000C3824A60EFE700002DE9F84F1D46CB8A3F +:1037B0000F468146C3F30901924605290B4630D0D6 +:1037C0000020AAB207F11A049EB21FFA80F8042E54 +:1037D0000FD8904503F1010306D30A44FB8A62F334 +:1037E00009030120FB821AE01AF800600130E65458 +:1037F000EAE79045F1D2A1F1050B1C237C68BBFBE5 +:10380000F3F203FB12BB1FFA8BF6002C45D148469E +:10381000FFF728FF044638B978606FF00200BDE872 +:10382000F88F4FF00008E6E7002606607860ADB23A +:103830004FF0000B454510D90AEB0803221D13F881 +:10384000011B08F101089155B1B21FFA88F81B2934 +:103850002BD0454506F10106F1D8FB8AC3F30902D6 +:10386000154465F30903BCE701321C4692B2236894 +:10387000002BF9D16B1F0B441C21B3FBF1F3013377 +:103880009BB29A42D3D2BBF1000FD0D14846FFF78A +:10389000E9FE20B9C4F800B0BFE70122E7E7C0F8AD +:1038A00000B05E4620600446C1E74545D5D948468C +:1038B000FFF7D8FE08B92060AFE7C0F800B00026D7 +:1038C00020600446B6E700002DE9F04F1C4607468D +:1038D00088462DED028B83B05B690192002B00F0CE +:1038E0009A80238C2BB1E269002A00F09480072B88 +:1038F00035D807F10C00FFF7B5FE054638B96FF073 +:103900000205284603B0BDEC028BBDE8F08F1422FF +:103910000021FEF765F8228CE16905F10800FEF749 +:1039200039F8208C48F00041013080B2FFF7E4FE06 +:10393000FFF7C6FE013880B2208401302874384673 +:103940006369228C1B782A4403F01F0363F03F0352 +:10395000137269602946FFF7EFFD0125D1E74FF0AB +:10396000000900F10C034FF0800A4E464D4608EE68 +:10397000103A18EE100AFFF775FE83460028BED0F5 +:1039800014220021FEF72CF8002E3AD1019B0222CE +:10399000ABF808300BF1080E1FFA82FC218C0CF1F9 +:1039A0000100BCF1060F80B201D88E422BD3FFF785 +:1039B000A3FE8E4208BF4FF0400AFFF781FE626906 +:1039C0000138013512781BFA80F1013002F01F0234 +:1039D0002DB242EA491289F001094AEA020A48F086 +:1039E000004281F808A059468BF810003846CBF801 +:1039F00004204FF0000AFFF79FFD238CB342B8D19B +:103A00007FE70022C6E7E169895D01360EF8021002 +:103A1000B6B20132C0E76FF0010572E7F8B515469E +:103A20000E463022002104461F46FDF7D9FF069BB3 +:103A3000B5F5001FA760636004F11000079B34BF59 +:103A40006A094FF6FF72E661A362002397B29A42B9 +:103A500006D800230360A782E3822383E360F8BDD6 +:103A60000660013330462036F1E7000003781BB9C9 +:103A70004BB2002BC8BF0170704700000078704740 +:103A8000F8B50C46C969074611B9238C002B37D10C +:103A9000257E1F2D34D8387828BB228C072A2CD8B5 +:103AA000268A36F003032BD14FF6FF70FFF7CEFDC9 +:103AB00020F0010031024FF6FF72400441EA056137 +:103AC000400C41EA4025234629463846FFF7FCFED4 +:103AD000002807DD626913780133DBB21F2B88BF32 +:103AE00000231370F8BD218A2D0645EA0125054300 +:103AF0002046FFF71DFE0246E5E76FF00300F1E701 +:103B00006FF00100EEE7000070B58AB0044616467B +:103B10000021282268461D46FDF762FFBDF83830B7 +:103B200069462046ADF810300F9B05939DF8403054 +:103B30008DF81830119B0793BDF84830CDE9026528 +:103B4000ADF82030FFF79CFF0AB070BD2DE9F041C1 +:103B5000D36905460C4616460BB9138C5BBB377E02 +:103B60001F2F28D895F80080B8F1000F26D03046D6 +:103B7000FFF7DEFD337821020246284641EAC331D1 +:103B8000338A41EA080141EA076141EA03413346C9 +:103B900041F08001FFF798FE00280ADD3378012B01 +:103BA00007D1726913780133DBB21F2B88BF002362 +:103BB0001370BDE8F0816FF00100FAE76FF00300C9 +:103BC000F7E70000F0B58BB004460D46174600211C +:103BD000282268461E46FDF703FF9DF84C30294613 +:103BE00020465A1E534253416A468DF800309DF8D4 +:103BF0004030ADF81030119B05939DF848308DF89A +:103C00001830149B0793BDF85430CDE90276ADF817 +:103C10002030FFF79BFF0BB0F0BD0000406A00B101 +:103C200004307047436A1A68426202691A6003618D +:103C3000C38A013BC38270472DE9F041D0F8208050 +:103C400014461D46184E4146002709B9BDE8F081CB +:103C5000D1E90223A21A65EB0303964277EB030333 +:103C60001ED2036A8B420DD1FFF78CFD036A1B68DD +:103C7000036203690B60C38A0161013B016AC3826D +:103C80008846E2E7FFF77EFD0B68C8F8003003695D +:103C90000B60C38A0161013BC382D8F80010D4E7EE +:103CA00088460968D1E700BF80841E002DE9F04FE7 +:103CB0008BB00D4614469B46DDF850908046002898 +:103CC00000F01881B9F1000F00F01481531E3F2B52 +:103CD00000F21081012A03D1BBF1000F40F00A81EC +:103CE0000023CDE90833B8F81430B5EBC30F4FEA21 +:103CF000C30703D300200BB0BDE8F08F2B199F4200 +:103D0000D8F80C3036BF7F1B2746FFB21BB9D8F856 +:103D10001030002B7AD0272D4DD8C5F1280600236E +:103D20002946B742009308ABD8F808002CBFF6B27A +:103D30003E46A7EB060A354432465FFA8AFAFFF799 +:103D40003DFCB8F81430282103F10053053BDB009B +:103D50000493D8F80C300393039B13B1BAF1000F0E +:103D60002CD1D8F8100040B1BAF1000F05D008AB43 +:103D70005246691A0096FFF721FC38B2002FB9D0DD +:103D800066070AD00AAB624203EBD40102F00702D5 +:103D900011F8083C134101F8083C082C3DD9102CBF +:103DA00040F2B580202C40F2B780BBF1000F00F04C +:103DB0009C80082335E0BA460026C2E7049BE02B2E +:103DC00028BFE02306930B44AB42059315D95A1B39 +:103DD0000398691A0096924508AB00F1040034BFBD +:103DE0005246D2B20792FFF7E9FB079A1644AAEBB4 +:103DF000020A1544F6B25FFA8AFA049B069A0599FC +:103E00009B1A0493039B1B680393A5E700933A4610 +:103E100008AB2946D8F80800ADE7BBF1000F13D076 +:103E20000123B4EBC30F6BD0082C12D89DF82030BF +:103E3000621E23FA02F2D50706D54FF0FF3202FACE +:103E400004F423438DF820309DF8203089F80030A9 +:103E500051E7102C12D8BDF82030621E23FA02F26E +:103E6000D10706D54FF0FF3202FA04F42343ADF830 +:103E70002030BDF82030A9F800303CE7202C0FD8C6 +:103E80000899631E21FA03F3DA0705D54FF0FF32D4 +:103E900002FA04F40C430894089BC9F800302AE79E +:103EA000402C2AD0611EC4F12102A4F12103DDE9D6 +:103EB000086526FA01F105FA02F225FA03F3114327 +:103EC0001943CB0711D50122A4F12003C4F120012D +:103ED00002FA03F322FA01F1A2400B43524263EBD0 +:103EE000430332432B43CDE90823DDE90823C9E925 +:103EF000002300E76FF00100FDE66FF00800FAE62E +:103F0000082CA1D9102CB4D9202CEED8C4E7BBF1D1 +:103F1000000FAED0022384E7BBF1000FBCD0042316 +:103F20007FE70000012A30B5144638BF012485B070 +:103F30000025402C28BF4024012ACDE9025518D87D +:103F40001B788DF8083063070AD004AB624203EB9C +:103F5000D40502F0070215F8083C934005F8083C28 +:103F6000034600912246002102A8FFF727FB05B077 +:103F700030BD082AE4D9102A03D81B88ADF80830D0 +:103F8000E1E7202A95BF1B68D3E900230293CDE91E +:103F90000223D8E710B5CB681BB98B600B618B820D +:103FA00010BD04691A681C600361C38A013BC382A7 +:103FB000CA60F0E703064CBFC0F3C0300220704770 +:103FC00008B50246FFF7F6FF022806D15306C2F3F2 +:103FD0000F2001D100F0030008BDC2F30740FBE74A +:103FE0002DE9F04F93B004460D46CDE903230A684E +:103FF0001046FFF7DFFF0228824614BFC2F30626F1 +:104000000026002A80F2F88112F0C04940F0F481C5 +:10401000097B002900F0F081022803D02378B34205 +:1040200040F0ED81C2F3046310462944069302F088 +:104030007F030593FFF7C4FF059B002283464FEAE9 +:104040008348002348EA0A4848EA4668CE78CDE922 +:104050000823F30948EA0008029368D0059B02464A +:1040600008A92046009353466768B847002800F027 +:10407000C981276A4FB9414604F10C00FFF700FBE4 +:10408000074690B96FF0020055E03B6998450DD0A6 +:104090003F68002FF9D1414604F10C00FFF7F0FA18 +:1040A00007460028EED0236A3B60276297F817C0C6 +:1040B00006F01F08CCF3840CACEB0800A8EB0C0353 +:1040C0001FFA80FE0028B8BF0EF120001FFA83FE01 +:1040D000B8BF00B2002B0793B8BF0EF12003D7E999 +:1040E0000221BCBF1BB2079352EA010338D0039BE5 +:1040F0004FF0000CDFF81CE39A1A049B63EB0101FC +:1041000096457CEB01032BD36B7B97F81AE0734544 +:1041100019D1029B002B78D0012821DC7868F8B9EE +:10412000DFF8ECC2944570EB010316D337E0276A41 +:1041300027B96FF00C0013B0BDE8F08F3B699845CC +:10414000B4D03F68F4E7B24890427CEB010301D35E +:104150000020F0E7029B002BFAD0079B0F2B17DC07 +:10416000FA7DB3003946204602F0030203F07C03D7 +:104170001343FB75FFF706FB6B7BBB76029B3BB9DA +:10418000FB7DC3F38402013262F38603FB75D0E743 +:104190006A7BBB7E9A42DBD1029B002B35D0B309F0 +:1041A000022B32D0039B142200210DA8BB60049B7C +:1041B000FB60FDF715FC039B0AA920460A93049BAC +:1041C000ADF83EB00B932B1D8DF840A00C932B7BCC +:1041D0008DF84180013BDBB2ADF83C30069B8DF899 +:1041E0004230059B8DF8433094F82C3083F0010366 +:1041F0008DF84430A3689847FB7DC3F384030133F3 +:1042000003F01F039B02FB82A2E7FB7DC6F3401273 +:10421000B2EBD31F40F0F980C3F38403434540F071 +:10422000FB80029AB6092B7B002A52D016F00106B9 +:1042300061D1032B40F2F380039B394604F10C005B +:10424000BB60049BFB60FB8A66F30903AE1DFB8227 +:1042500032462B7B033BDBB2FFF7A6FA00280CDAD1 +:1042600039462046FFF78EFAFB7DC3F38403013302 +:1042700003F01F039B02FB8204E7AB88DDE908849F +:104280003B834FF6FF73C9F12000A9F1200228FA01 +:1042900009F109F1080904FA00F024FA02F20143D5 +:1042A00018461143C9B2FFF7C1F9B9F1400F0346EF +:1042B000E9D1B88231462A7B033AD2B2FFF7C6F978 +:1042C000FB7DB882DA43C2F3C01262F3C713FB75F9 +:1042D0003EE786B92E1D013B394604F10C00DBB2E6 +:1042E0003246FFF761FA0028BADB2A7B3146B88AEA +:1042F000013AD2B2E2E7F98A013BC1F30901DAB22D +:1043000004295BD8281D002307F11B069A4208D90F +:1043100010F801CB013306F801C00131DBB20529E9 +:10432000F4D1039993420A9138BF043304992CBF06 +:10433000002355FA83F30B9107F11B010C91796867 +:104340000E930D91291DFB8AADF83EB0C3F309030E +:104350008DF840A08DF841801A44069B8DF84230BC +:10436000059BADF83C208DF8433094F82C3083F059 +:1043700001038DF844300023B88A7B602A7B013A20 +:10438000FFF764F93B8BB882834203D1A3680AA983 +:104390002046984720460AA9FFF7FCFDFB7DBA8A14 +:1043A000C3F38403013303F01F039B02FB823B8BA7 +:1043B0009A420CBF00206FF01000BCE67B68002B17 +:1043C000AFD0052001E01C3033461E68002EFAD124 +:1043D000091A2E1D081D184401EB090C5FFA89F318 +:1043E000BCF11B0F9DD89A429BD916F8013B09F1ED +:1043F000010900F8013BEFE76FF009009BE66FF061 +:104400000A0098E66FF00B0095E66FF00D0092E65B +:1044100040420F0080841E006FF00E008BE66FF0AC +:104420000F0088E6EFF30983054968334A6B22F0F1 +:1044300001024A6383F30988002383F311887047DC +:1044400000EF00E0302080F3118862B60D4B0E4A79 +:10445000D96821F4E0610904090C0A430B49DA60C8 +:10446000D3F8FC2042F08072C3F8FC20084AC2F85E +:10447000B01F116841F0010111602022DA7783F842 +:104480002200704700ED00E00003FA0555CEACC5F0 +:10449000001000E0302310B583F311880E4B5B68E9 +:1044A00013F4006314D0F1EE103AEFF309844FF0E7 +:1044B0008073683CE361094BDB6B236684F30988F6 +:1044C00001F012FA10B1064BA36110BD054BFBE7DA +:1044D00083F31188F9E700BF00ED00E000EF00E092 +:1044E0003F0400084204000808B5074B074A196852 +:1044F00001F03D01996053680BB190689847BDE8A1 +:104500000840FFF7C7BF00BF00000240F46300206F +:1045100008B5084B1968890901F03D018A019A60C4 +:10452000054AD3680BB110699847BDE80840FFF70A +:10453000B1BF00BF00000240F463002008B5084B83 +:104540001968090C01F03D010A049A60054A536993 +:104550000BB190699847BDE80840FFF79BBF00BFCB +:1045600000000240F463002008B5084B1968890D6B +:1045700001F03D018A059A60054AD3690BB1106AC2 +:104580009847BDE80840FFF785BF00BF0000024024 +:10459000F463002008B5074B074A596801F03D0154 +:1045A000D960536A0BB1906A9847BDE80840FFF79D +:1045B00071BF00BF00000240F463002008B5084B43 +:1045C0005968890901F03D018A01DA60054AD36A18 +:1045D0000BB1106B9847BDE80840FFF75BBF00BF09 +:1045E00000000240F463002008B5084B5968090C2C +:1045F00001F03D010A04DA60054A536B0BB1906B80 +:104600009847BDE80840FFF745BF00BF00000240E3 +:10461000F463002008B5084B5968890D01F03D018D +:104620008A05DA60054AD36B0BB1106C9847BDE878 +:104630000840FFF72FBF00BF00000240F4630020D6 +:1046400008B5074B074A196801F03D019960536CA2 +:104650000BB1906C9847BDE80840FFF71BBF00BF47 +:1046600000040240F463002008B5084B196889096A +:1046700001F03D018A019A60054AD36C0BB1106DBF +:104680009847BDE80840FFF705BF00BF000402409F +:10469000F463002008B5084B1968090C01F03D01CE +:1046A0000A049A60054A536D0BB1906D9847BDE8B6 +:1046B0000840FFF7EFBE00BF00040240F463002093 +:1046C00008B5084B1968890D01F03D018A059A600B +:1046D000054AD36D0BB1106E9847BDE80840FFF74F +:1046E000D9BE00BF00040240F463002008B5074BA8 +:1046F000074A596801F03D01D960536E0BB1906EC5 +:104700009847BDE80840FFF7C5BE00BF000402405F +:10471000F463002008B5084B5968890901F03D0190 +:104720008A01DA60054AD36E0BB1106F9847BDE875 +:104730000840FFF7AFBE00BF00040240F463002052 +:1047400008B5084B5968090C01F03D010A04DA600C +:10475000054A536F0BB1906F9847BDE80840FFF7CB +:1047600099BE00BF00040240F463002008B5084B66 +:104770005968890D01F03D018A05DA60054AD36F59 +:1047800013B1D2F880009847BDE80840FFF782BE19 +:1047900000040240F463002000230C4910B51A46BF +:1047A0000B4C0B6054F82300026001EB4300043310 +:1047B0004260402BF6D1074A4FF0FF339360D3603D +:1047C000C2F80834C2F80C3410BD00BFF4630020F6 +:1047D00004810008000002400F28F8B510D9102805 +:1047E00010D0112811D0122808D10F240720DFF88B +:1047F000C8E00126DEF80050A04208D9002653E0A8 +:104800000446F4E70F240020F1E70724FBE706FA4B +:1048100000F73D424AD1264C4FEA001C3D4304EBD1 +:1048200000160EEBC000CEF80050C0E90123FBB229 +:1048300073B12048D0F8D83043F00103C0F8D83025 +:10484000D0F8003143F00103C0F80031D0F8003156 +:1048500017F47F4F0ED01748D0F8D83043F002033A +:10486000C0F8D830D0F8003143F00203C0F800316E +:10487000D0F8003154F80C00036823F01F030360E4 +:10488000056815F00105FBD104EB0C033D2493F8FA +:104890000CC05F6804FA0CF43C602124056044619C +:1048A00012B1987B00F066F93046F8BD0130A3E7FD +:1048B0000481000800440258F463002010B530243D +:1048C00084F31188FFF788FF002383F3118810BD5C +:1048D00010B50446807B00F063F901231549627B23 +:1048E00003FA02F20B6823EA0203DAB20B6072B930 +:1048F000114AD2F8D81021F00101C2F8D810D2F82C +:10490000001121F00101C2F80011D2F8002113F4C6 +:104910007F4F0ED1084BD3F8D82022F00202C3F803 +:10492000D820D3F8002122F00202C3F80021D3F8E6 +:10493000003110BDF46300200044025808B5302354 +:1049400083F31188FFF7C4FF002383F3118808BDA8 +:10495000026843681143016003B1184770470000C3 +:10496000024A136843F0C0031360704700780040A8 +:1049700013B50E4C204600F0BDFA04F114000023DC +:104980004FF400720A49009400F07AF9094B4FF491 +:104990000072094904F13800009400F0F3F9074A65 +:1049A000074BC4E9172302B010BD00BF7864002094 +:1049B000E464002061490008E466002000780040BB +:1049C00000E1F505037C30B5244C002918BF0C46E6 +:1049D000012B11D1224B98420ED1224BD3F8E82063 +:1049E00042F08042C3F8E820D3F8102142F0804220 +:1049F000C3F81021D3F810312268036EC16D03EBA8 +:104A000052038466B3FBF2F36268150442BF23F0DD +:104A1000070503F0070343EA4503CB60A36843F0AF +:104A200040034B60E36843F001038B6042F49673EC +:104A300043F001030B604FF0FF330B62510505D5C6 +:104A400012F0102205D0B2F1805F04D080F86430FB +:104A500030BD7F23FAE73F23F8E700BF0482000858 +:104A600078640020004402582DE9F047C66D0546E1 +:104A70003768F469210734621AD014F0080118BFAE +:104A80004FF48071E20748BF41F02001A3074FF0C7 +:104A9000300348BF41F04001600748BF41F080014A +:104AA00083F31188281DFFF753FF002383F3118838 +:104AB000E2050AD5302383F311884FF48061281D65 +:104AC000FFF746FF002383F311884FF030094FF0C2 +:104AD000000A14F0200838D13B0616D54FF03009F3 +:104AE00005F1380A200610D589F31188504600F0E8 +:104AF0007DF9002836DA0821281DFFF729FF27F065 +:104B000080033360002383F31188790614D562068D +:104B100012D5302383F31188D5E913239A4208D1A3 +:104B20002B6C33B127F040071021281DFFF710FF31 +:104B30003760002383F31188E30618D5AA6E136942 +:104B4000ABB15069BDE8F047184789F31188736A23 +:104B5000284695F86410194000F0E6F98AF31188A8 +:104B6000F469B6E7B06288F31188F469BAE7BDE882 +:104B7000F0870000090100F16043012203F5614361 +:104B8000C9B283F8001300F01F039A4043099B0049 +:104B900003F1604303F56143C3F880211A60704755 +:104BA00000F01F0301229A40430900F160409B007E +:104BB00000F5614003F1604303F56143C3F88020D1 +:104BC000C3F88021002380F800337047F8B51546FC +:104BD000826804460B46AA4200D28568A16926690C +:104BE000761AB5420BD218462A46FCF7D3FEA369C3 +:104BF0002B44A3612846A3685B1BA360F8BD0CD9B6 +:104C0000AF1B18463246FCF7C5FE3A46E168304411 +:104C1000FCF7C0FEE3683B44EBE718462A46FCF786 +:104C2000B9FEE368E5E7000083689342F7B5044600 +:104C3000154600D28568D4E90460361AB5420BD215 +:104C40002A46FCF7A7FE63692B4463612846A368E4 +:104C50005B1BA36003B0F0BD0DD93246AF1B0191C1 +:104C6000FCF798FE01993A46E0683144FCF792FE61 +:104C7000E3683B44E9E72A46FCF78CFEE368E4E797 +:104C800010B50A440024C361029B8460C1600261C4 +:104C90000362C0E90000C0E9051110BD08B5D0E904 +:104CA0000532934201D1826882B982680132826002 +:104CB0005A1C426119700021D0E904329A4224BF83 +:104CC000C368436100F0C0FE002008BD4FF0FF3014 +:104CD000FBE7000070B5302304460E4683F31188CD +:104CE000A568A5B1A368A269013BA360531CA36199 +:104CF00015782269934224BFE368A361E3690BB18D +:104D000020469847002383F31188284607E0314660 +:104D1000204600F089FE0028E2DA85F3118870BD94 +:104D20002DE9F74F04460E4617469846D0F81C90DA +:104D30004FF0300A8AF311884FF0000B154665B129 +:104D40002A4631462046FFF741FF034660B94146F7 +:104D5000204600F069FE0028F1D0002383F311887B +:104D6000781B03B0BDE8F08FB9F1000F03D00190BC +:104D70002046C847019B8BF31188ED1A1E448AF325 +:104D80001188DCE7C160C361009B82600362C0E9F7 +:104D900005111144C0E9000001617047F8B50446EF +:104DA0000D461646302383F31188A768A7B1A36880 +:104DB000013BA36063695A1C62611D70D4E904322F +:104DC0009A4224BFE3686361E3690BB120469847C8 +:104DD000002080F3118807E03146204600F024FED1 +:104DE0000028E2DA87F31188F8BD0000D0E9052336 +:104DF00010B59A4201D182687AB9826800210132E5 +:104E000082605A1C82611C7803699A4224BFC3687D +:104E1000836100F019FE204610BD4FF0FF30FBE724 +:104E20002DE9F74F04460E4617469846D0F81C90D9 +:104E30004FF0300A8AF311884FF0000B154665B128 +:104E40002A4631462046FFF7EFFE034660B9414649 +:104E5000204600F0E9FD0028F1D0002383F31188FB +:104E6000781B03B0BDE8F08FB9F1000F03D00190BB +:104E70002046C847019B8BF31188ED1A1E448AF324 +:104E80001188DCE7026843681143016003B11847E9 +:104E9000704700001430FFF743BF00004FF0FF33AE +:104EA0001430FFF73DBF00003830FFF7B9BF0000F6 +:104EB0004FF0FF333830FFF7B3BF00001430FFF777 +:104EC00009BF00004FF0FF311430FFF703BF0000AF +:104ED0003830FFF763BF00004FF0FF323830FFF784 +:104EE0005DBF0000012914BF6FF013000020704760 +:104EF000FFF73EBD044B036000234360C0E902336B +:104F000001230374704700BF1C82000810B53023D2 +:104F1000044683F31188FFF755FD02230020237414 +:104F200080F3118810BD000038B5C36904460D46F2 +:104F30001BB904210844FFF7A5FF294604F114001A +:104F4000FFF7ACFE002806DA201D4FF40061BDE833 +:104F50003840FFF797BF38BD0268436811430160CE +:104F600003B118477047000013B5406B00F580543B +:104F7000D4F8A4381A681178042914D1017C0229C4 +:104F800011D11979012312898B4013420BD101A948 +:104F90004C3002F0D7F9D4F8A4480246019B21799D +:104FA000206800F0DFF902B010BD0000143002F0FC +:104FB00059B900004FF0FF33143002F053B900002C +:104FC0004C3002F02BBA00004FF0FF334C3002F0AF +:104FD00025BA0000143002F027B900004FF0FF316D +:104FE000143002F021B900004C3002F0F7B9000093 +:104FF0004FF0FF324C3002F0F1B900000020704752 +:1050000010B500F58054D4F8A4381A681178042932 +:1050100017D1017C022914D15979012352898B407F +:1050200013420ED1143002F0B9F8024648B1D4F858 +:10503000A4484FF4407361792068BDE8104000F047 +:105040007FB910BD406BFFF7DBBF00007047000069 +:105050007FB5124B01250426044603600023057426 +:1050600000F1840243602946C0E902330C4B0290F0 +:10507000143001934FF44073009602F06BF8094B23 +:1050800004F69442294604F14C000294CDE90063F1 +:105090004FF4407302F032F904B070BD448200084E +:1050A00045500008694F00080A68302383F31188CF +:1050B0000B790B3342F823004B79133342F823006A +:1050C0008B7913B10B3342F8230000F58053C3F8FA +:1050D000A41802230374002080F311887047000095 +:1050E00038B5037F044613B190F85430ABB90125AD +:1050F000201D0221FFF730FF04F114006FF00101C1 +:10510000257700F0ADFC04F14C0084F854506FF0AA +:105110000101BDE8384000F0A3BC38BD10B5012145 +:1051200004460430FFF718FF0023237784F8543037 +:1051300010BD000038B504460025143002F022F8F6 +:1051400004F14C00257702F0F1F8201D84F854504A +:105150000121FFF701FF2046BDE83840FFF750BFAF +:1051600090F8803003F06003202B06D190F8812066 +:105170000023212A03D81F2A06D800207047222A9C +:10518000FBD1C0E91D3303E0034A4267072282676F +:10519000C3670120704700BF3C23002037B500F5EE +:1051A0008055D5F8A4381A68117804291AD1017CE1 +:1051B000022917D11979012312898B40134211D189 +:1051C00000F14C04204602F071F958B101A92046C3 +:1051D00002F0B8F8D5F8A4480246019B217920686E +:1051E00000F0C0F803B030BD01F10B03F0B550F88A +:1051F000236085B004460D46FEB1302383F3118849 +:1052000004EB8507301D0821FFF7A6FEFB6806F1B9 +:105210004C005B691B681BB1019002F0A1F801987A +:1052200003A902F08FF8024648B1039B29462046A5 +:1052300000F098F8002383F3118805B0F0BDFB68F7 +:105240005A691268002AF5D01B8A013B1340F1D13C +:1052500004F18002EAE70000133138B550F821402C +:10526000ECB1302383F3118804F58053D3F8A428DC +:105270001368527903EB8203DB689B695D6845B173 +:1052800004216018FFF768FE294604F1140001F0BC +:105290008FFF2046FFF7B4FE002383F3118838BD4B +:1052A0007047000001F05CBA01234022002110B5D4 +:1052B000044600F8303BFCF793FB0023C4E90133BC +:1052C00010BD000010B53023044683F3118824225A +:1052D000416000210C30FCF783FB204601F062FAAC +:1052E00002230020237080F3118810BD70B500EBFD +:1052F0008103054650690E461446DA6018B1102243 +:105300000021FCF76DFBA06918B110220021FCF709 +:1053100067FB31462846BDE8704001F049BB0000FC +:1053200083682022002103F0011310B50446836036 +:105330001030FCF755FB2046BDE8104001F0C4BB1F +:10534000F0B4012500EB810447898D40E4683D43BA +:10535000A469458123600023A2606360F0BC01F072 +:10536000E1BB0000F0B4012500EB810407898D400A +:10537000E4683D436469058123600023A2606360A3 +:10538000F0BC01F057BC000070B5022300250446B4 +:10539000242203702946C0F888500C3040F8045C81 +:1053A000FCF71EFB204684F8705001F095FA636804 +:1053B0001B6823B129462046BDE87040184770BDE0 +:1053C0000378052B10B504460AD080F88C300523ED +:1053D000037043681B680BB1042198470023A36046 +:1053E00010BD00000178052906D190F88C20436893 +:1053F00002701B6803B118477047000070B590F841 +:105400007030044613B1002380F8703004F180023C +:10541000204601F07DFB63689B68B3B994F8803047 +:1054200013F0600535D00021204601F06FFE002109 +:10543000204601F05FFE63681B6813B10621204619 +:105440009847062384F8703070BD2046984700289E +:10545000E4D0B4F88630A26F9A4288BFA36794F96B +:105460008030A56F002B4FF0300380F20381002DB8 +:1054700000F0F280092284F8702083F31188002163 +:105480002046D4E91D23FFF76DFF002383F3118825 +:10549000DAE794F8812003F07F0343EA022340F225 +:1054A0000232934200F0C58021D8B3F5807F48D006 +:1054B0000DD8012B3FD0022B00F09380002BB2D1EE +:1054C00004F1880262670222A267E367C1E7B3F5CD +:1054D000817F00F09B80B3F5407FA4D194F88230A7 +:1054E000012BA0D1B4F8883043F0020332E0B3F5C9 +:1054F000006F4DD017D8B3F5A06F31D0A3F5C063BE +:10550000012B90D86368204694F882205E6894F856 +:105510008310B4F88430B047002884D043686367B0 +:105520000368A3671AE0B3F5106F36D040F6024265 +:1055300093427FF478AF5C4B63670223A367002339 +:10554000C3E794F88230012B7FF46DAFB4F8883054 +:1055500023F00203A4F88830C4E91D55E56778E715 +:10556000B4F88030B3F5A06F0ED194F882302046A5 +:1055700084F88A3001F00EFA63681B6813B10121C8 +:1055800020469847032323700023C4E91D339CE77A +:1055900004F18B0363670123C3E72378042B10D145 +:1055A000302383F311882046FFF7BAFE85F3118874 +:1055B0000321636884F88B5021701B680BB120466F +:1055C000984794F88230002BDED084F88B30042387 +:1055D000237063681B68002BD6D0022120469847B1 +:1055E000D2E794F8843020461D0603F00F010AD557 +:1055F00001F080FA012804D002287FF414AF2B4B6D +:105600009AE72B4B98E701F067FAF3E794F88230BA +:10561000002B7FF408AF94F8843013F00F01B3D05F +:105620001A06204602D501F089FDADE701F07AFDAA +:10563000AAE794F88230002B7FF4F5AE94F884301A +:1056400013F00F01A0D01B06204602D501F05EFD2D +:105650009AE701F04FFD97E7142284F8702083F356 +:1056600011882B462A4629462046FFF769FE85F316 +:105670001188E9E65DB1152284F8702083F3118862 +:1056800000212046D4E91D23FFF75AFEFDE60B2238 +:1056900084F8702083F311882B462A462946204639 +:1056A000FFF760FEE3E700BF748200086C82000829 +:1056B0007082000838B590F870300446002B3ED058 +:1056C000063BDAB20F2A34D80F2B32D8DFE803F0CA +:1056D00037313108223231313131313131313737DF +:1056E000856FB0F886309D4214D2C3681B8AB5FB23 +:1056F000F3F203FB12556DB9302383F311882B4667 +:105700002A462946FFF72EFE85F311880A2384F8DE +:1057100070300EE0142384F87030302383F3118846 +:10572000002320461A461946FFF70AFE002383F39A +:10573000118838BDC36F03B198470023E7E7002104 +:10574000204601F0E3FC0021204601F0D3FC636811 +:105750001B6813B10621204698470623D7E70000AF +:1057600010B590F870300446142B29D017D8062BAA +:1057700005D001D81BB110BD093B022BFBD800217D +:10578000204601F0C3FC0021204601F0B3FC636811 +:105790001B6813B1062120469847062319E0152BF4 +:1057A000E9D10B2380F87030302383F31188002374 +:1057B0001A461946FFF7D6FD002383F31188DAE76E +:1057C000C3689B695B68002BD5D1C36F03B1984751 +:1057D000002384F87030CEE70023826803750369E4 +:1057E0001B6899689142FBD25A680360426010605E +:1057F0005860704700238268037503691B689968C5 +:105800009142FBD85A68036042601060586070474C +:1058100008B50846302383F311880A7D0023052A42 +:1058200006D8DFE802F00B050503120E826913604B +:105830004FF0FF338361FFF7CFFF002383F311881D +:1058400008BD8269936801339360D0E90032136028 +:105850005A60EDE7FFF7C0BF054BD96808751868B7 +:10586000026853601A600122D8600275FAF7D2BD4F +:10587000E86800200C4B30B5DD684B1C87B004464F +:105880000FD02B46094A684600F07EF92046FFF704 +:10589000E3FF009B13B1684600F080F9A86907B0E8 +:1058A00030BDFFF7D9FFF9E7E8680020115800087C +:1058B00038B50C4D04468161EB6881689A68914265 +:1058C00003D8BDE83840FFF787BF1846FFF792FFBF +:1058D00001230146EC6020462375BDE83840FAF705 +:1058E00099BD00BFE8680020044B1A68DB68906827 +:1058F0009B68984294BF002001207047E868002010 +:10590000084B10B51C68D868226853601A600122E1 +:10591000DC602275FFF76EFF01462046BDE81040AF +:10592000FAF778BDE868002038B50123084C002557 +:105930002370656001F0F6FD01F01CFE0549064884 +:1059400001F0F0FE0223237085F3118838BD00BFFB +:10595000506B00207C820008E868002008B572B611 +:10596000044B186500F024FD00F0E6FD024B032215 +:105970001A70FEE7E8680020506B002000F044B980 +:10598000034A516853685B1A9842FBD8704700BFBE +:10599000001000E08B600223086108468B8270478C +:1059A0008368A3F1840243F8142C026943F8442C61 +:1059B000426943F8402C094A43F8242CC268A3F1F9 +:1059C000200043F8182C022203F80C2C002203F8C4 +:1059D0000B2C034A43F8102C704700BF2D0400081D +:1059E000E868002008B5FFF7DBFFBDE80840FFF7D7 +:1059F00031BF0000024BDB6898610F20FFF72CBF1E +:105A0000E8680020302383F31188FFF7F3BF00001C +:105A100008B50146302383F311880820FFF72AFFD9 +:105A2000002383F3118808BD064BDB6839B1426857 +:105A300018605A60136043600420FFF71BBF4FF0EB +:105A4000FF307047E86800200368984206D01A6863 +:105A50000260506018469961FFF7FCBE7047000075 +:105A600038B504460D462068844200D138BD03682D +:105A700023605C608561FFF7EDFEF4E7036810B515 +:105A80009C68A2420CD85C688A600B604C60216004 +:105A9000596099688A1A9A604FF0FF33836010BD8D +:105AA000121B1B68ECE700000A2938BF0A2170B5F9 +:105AB00004460D460A26601901F02EFD01F016FD80 +:105AC000041BA54203D8751C04462E46F3E70A2E94 +:105AD00004D90120BDE8704001F064BE70BD000033 +:105AE000F8B5144B0D460A2A4FF00A07D96103F1A5 +:105AF0001001826038BF0A224160196914460160B2 +:105B000048601861A81801F0F7FC01F0EFFC431B96 +:105B10000646A34206D37C1C28192746354601F0C9 +:105B2000FBFCF2E70A2F04D90120BDE8F84001F0A0 +:105B300039BEF8BDE8680020F8B506460D4601F00C +:105B4000D5FC0F4A134653F8107F9F4206D12A46D0 +:105B500001463046BDE8F840FFF7C2BFD169BB68D7 +:105B6000441A2C1928BF2C46A34202D92946FFF714 +:105B70009BFF224631460348BDE8F840FFF77EBF51 +:105B8000E8680020F8680020C0E90323002310B46F +:105B90005DF8044B4361FFF7CFBF000010B5194C0F +:105BA000236998420DD08168D0E9003213605A60B1 +:105BB0009A680A449A60002303604FF0FF33A361A0 +:105BC00010BD0268234643F8102F53600022026084 +:105BD00022699A4203D1BDE8104001F097BC936856 +:105BE00081680B44936001F081FC2269E16992684D +:105BF000441AA242E4D91144BDE81040091AFFF743 +:105C000053BF00BFE86800202DE9F047DFF8BC80F3 +:105C100008F110072C4ED8F8105001F067FCD8F8A6 +:105C20001C40AA68031B9A423ED814444FF0000956 +:105C3000D5E90032C8F81C4013605A60C5F80090DE +:105C4000D8F81030B34201D101F060FC89F311881B +:105C5000D5E9033128469847302383F311886B69CF +:105C6000002BD8D001F042FC6A69A0EB04098246FF +:105C70004A450DD2022001F095FD0022D8F81030DF +:105C8000B34208D151462846BDE8F047FFF728BF88 +:105C9000121A2244F2E712EB09092946384638BFA6 +:105CA0004A46FFF7EBFEB5E7D8F81030B34208D00C +:105CB0001444C8F81C00211AA960BDE8F047FFF79A +:105CC000F3BEBDE8F08700BFF8680020E868002058 +:105CD00038B501F00BFC054AD2E90845031B181939 +:105CE00045F10001C2E9080138BD00BFE8680020A5 +:105CF00000207047FEE70000704700004FF0FF30C3 +:105D00007047000002290CD0032904D0012907485C +:105D100018BF00207047032A05D8054800EBC200D1 +:105D20007047044870470020704700BF5483000844 +:105D30004C2300200883000870B59AB00546084639 +:105D4000144601A900F0C2F801A8FBF741FE431C6C +:105D50000022C6B25B001046C5E90034237003235D +:105D6000023404F8013C01ABD1B202348E4201D8B6 +:105D70001AB070BD13F8011B013204F8010C04F8CD +:105D8000021CF1E708B5302383F311880348FFF7BD +:105D900005FA002383F3118808BD00BF586B00206B +:105DA00090F8803003F01F02012A07D190F881207B +:105DB0000B2A03D10023C0E91D3315E003F0600373 +:105DC000202B08D1B0F884302BB990F88120212AFB +:105DD00003D81F2A04D8FFF7C3B9222AEBD0FAE769 +:105DE000034A426707228267C3670120704700BFEA +:105DF0004323002007B5052917D8DFE801F019165D +:105E000003191920302383F31188104A01210190CE +:105E1000FFF76CFA019802210D4AFFF767FA0D4867 +:105E2000FFF788F9002383F3118803B05DF804FBC2 +:105E3000302383F311880748FFF752F9F2E7302344 +:105E400083F311880348FFF769F9EBE7A88200089C +:105E5000CC820008586B002038B50C4D0C4C2A46FB +:105E60000C4904F10800FFF767FF05F1CA0204F1CD +:105E700010000949FFF760FF05F5CA7204F1180028 +:105E80000649BDE83840FFF757BF00BF3084002007 +:105E90004C23002088820008928200089D8200081E +:105EA00070B5044608460D46FBF792FDC6B2204683 +:105EB000013403780BB9184670BD32462946FBF70A +:105EC00073FD0028F3D10120F6E700002DE9F0472B +:105ED00005460C46FBF77CFD2B49C6B22846FFF76A +:105EE000DFFF08B10A36F6B228492846FFF7D8FF87 +:105EF00008B11036F6B2632E0BD8DFF88C80DFF8CD +:105F00008C90234FDFF894A02E7846B92670BDE818 +:105F1000F08729462046BDE8F04702F05BB8252E01 +:105F20002ED1072241462846FBF73EFD70B9194B9A +:105F3000224603F1100153F8040B8B4242F8040B84 +:105F4000F9D11B78073511341370DDE70822494673 +:105F50002846FBF729FD98B9A21C0F4B197802328D +:105F60000909C95D02F8041C13F8011B01F00F01B7 +:105F70005345C95D02F8031CF0D118340835C3E756 +:105F8000013504F8016BBFE7748300089D820008A7 +:105F90007C830008F27F000800E8F11F0CE8F11F85 +:105FA000BFF34F8F044B1A695107FCD1D3F810216E +:105FB0005207F8D1704700BF0020005208B50D4BC2 +:105FC0001B78ABB9FFF7ECFF0B4BDA68D10704D5B0 +:105FD0000A4A5A6002F188325A60D3F80C21D2077B +:105FE00006D5064AC3F8042102F18832C3F8042119 +:105FF00008BD00BF8E8600200020005223016745A7 +:1060000008B5114B1B78F3B9104B1A69510703D52A +:10601000DA6842F04002DA60D3F81021520705D561 +:10602000D3F80C2142F04002C3F80C21FFF7B8FF6F +:10603000064BDA6842F00102DA60D3F80C2142F034 +:106040000102C3F80C2108BD8E86002000200052FA +:106050000F289ABF00F580604004002070470000C0 +:106060004FF4003070470000102070470F2808B52B +:106070000BD8FFF7EDFF00F500330268013204D1C1 +:1060800004308342F9D1012008BD0020FCE7000064 +:106090000F2838B505463FD8FFF782FF1F4CFFF7A2 +:1060A0008DFF4FF0FF3307286361C4F814311DD80A +:1060B0002361FFF775FF030243F02403E360E36805 +:1060C00043F08003E36023695A07FCD42846FFF7B6 +:1060D00067FFFFF7BDFF4FF4003100F009FA2846D3 +:1060E000FFF78EFFBDE83840FFF7C0BFC4F810319E +:1060F000FFF756FFA0F108031B0243F02403C4F886 +:106100000C31D4F80C3143F08003C4F80C31D4F8CE +:1061100010315B07FBD4D9E7002038BD00200052C6 +:106120002DE9F84F05460C46104645EA0203DE0607 +:1061300002D00020BDE8F88F20F01F00DFF8BCB0CF +:10614000DFF8BCA0FFF73AFF04EB0008444503D199 +:106150000120FFF755FFEDE720222946204601F0F8 +:1061600007FF10B920352034F0E72B4605F1200257 +:106170001F68791CDDD104339A42F9D105F17843C7 +:106180001B481C4EB3F5801F1B4B38BF184603F14C +:10619000F80332BFD946D1461E46FFF701FF07601C +:1061A000A5EB040C336804F11C0143F002033360D7 +:1061B000231FD9F8007017F00507FAD153F8042F00 +:1061C0008B424CF80320F4D1BFF34F8FFFF7E8FE6A +:1061D0004FF0FF332022214603602846336823F026 +:1061E0000203336001F0C4FE0028BBD03846B0E79C +:1061F000142100520C200052142000521020005292 +:106200001021005210B5084C237828B11BB9FFF7B4 +:10621000D5FE0123237010BD002BFCD02070BDE8FB +:106220001040FFF7EDBE00BF8E8600202DE9F04F35 +:106230000D4685B0814658B111F00D0614BF2022DD +:10624000082211F00803019304D0431E03426AD0D0 +:10625000002435E0002E37D009F11F0121F01F097D +:106260004FF00108324F05F00403DFF8D0A005EA33 +:10627000080BBBF1000F32D07869C0072FD408F1AA +:1062800001080C37B8F1060FF3D19EB9294D4946E4 +:10629000A819019201F090F9044600283AD1183665 +:1062A000019A782EF3D1494601F086F90446002878 +:1062B00030D1019A4946204801F07EF9044668BB76 +:1062C000204605B0BDE8F08F0029C9D10146284617 +:1062D000029201F071F90446E0B9029AC0E713B1E5 +:1062E00078694107CBD5AC0702D578698007C6D558 +:1062F000019911B178690107C1D51820494600FB01 +:1063000008A0CDE9022301F057F90446DDE9022394 +:106310000028B4D04A460021204601E04A46002128 +:10632000FBF75EFBCCE70246002E95D198E700BF55 +:1063300090830008C086002090860020A886002058 +:106340000121FFF773BF0000F8B5144D0124182791 +:10635000134E40F2FF3200210120FBF741FB07FB07 +:10636000046001342A6955F80C1F01F011F9062C5C +:10637000F5D137254FF4C0542046FFF7E1FF014621 +:1063800028B122460748BDE8F84001F001B9C4EB46 +:10639000C404013D4FEAD404EED1F8BD9083000857 +:1063A000A88600209086002008B101F077B97047D8 +:1063B00038B5054D00240334696855F80C0B00F01E +:1063C000A9F8122CF7D138BD9083000838B5EFF347 +:1063D00011859DB9EFF30584C4F30804302334B16B +:1063E00083F31188FFF774FC85F3118838BD83F3BC +:1063F0001188FFF76DFC84F3118838BDBDE8384083 +:10640000FFF766BC10B5FFF7E1FF104CC008104A5B +:10641000002340EA4170C908A0FB04ECA0FB020E77 +:106420001CEB0000A1FB044CA1FB02125B41001914 +:1064300043EB0C0011EB0E0142F10002411842F156 +:106440000000090941EA007010BD00BFCFF753E317 +:10645000A59BC4200244074BD2B210B5904200D194 +:1064600010BD441C00B253F8200041F8040BE0B208 +:10647000F4E700BF504000580E4B30B51C6F2404A9 +:1064800005D41C6F1C671C6F44F400441C670A4C45 +:1064900002442368D2B243F480732360074B9042D6 +:1064A00000D130BD441C51F8045B00B243F82050C9 +:1064B000E0B2F4E700440258004802585040005847 +:1064C00007B5012201A90020FFF7C4FF019803B01E +:1064D0005DF804FB13B50446FFF7F2FFA04205D0B8 +:1064E000012201A900200194FFF7C6FF02B010BDF0 +:1064F0000144BFF34F8F064B884204D3BFF34F8F45 +:10650000BFF36F8F7047C3F85C022030F4E700BF21 +:1065100000ED00E00144BFF34F8F064B884204D3E7 +:10652000BFF34F8FBFF36F8F7047C3F870022030F7 +:10653000F4E700BF00ED00E070470000074B45F2B4 +:1065400055521A6003225A6040F2FF729A604CF66C +:10655000CC421A600122024B1A7070470048005862 +:106560003C870020034B1B781BB1034B4AF6AA2241 +:106570001A6070473C87002000480058034B1A6897 +:106580001AB9034AD2F8D0241A607047388700201D +:1065900000400258024B4FF48032C3F8D0247047B9 +:1065A0000040025808B5FFF7E9FF024B1868C0F336 +:1065B000806008BD3887002070B5BFF34F8FBFF3F0 +:1065C0006F8F1A4A0021C2F85012BFF34F8FBFF3EA +:1065D0006F8F536943F400335361BFF34F8FBFF3A1 +:1065E0006F8FC2F88410BFF34F8FD2F8803043F61C +:1065F000E074C3F3C900C3F34E335B0103EA04063E +:10660000014646EA81750139C2F86052F9D2203B51 +:1066100013F1200FF2D1BFF34F8F536943F480334E +:106620005361BFF34F8FBFF36F8F70BD00ED00E07C +:10663000FEE70000214B2248224A70B5904237D332 +:10664000214BC11EDA1C121A22F003028B4238BF02 +:1066500000220021FBF7C4F91C4A0023C2F8843051 +:10666000BFF34F8FD2F8803043F6E074C3F3C90014 +:10667000C3F34E335B0103EA0406014646EA817523 +:106680000139C2F86C52F9D2203B13F1200FF2D13C +:10669000BFF34F8FBFF36F8FBFF34F8FBFF36F8F7A +:1066A0000023C2F85032BFF34F8FBFF36F8F70BD1E +:1066B00053F8041B40F8041BC0E700BFC485000862 +:1066C00030890020308900203089002000ED00E072 +:1066D000074BD3F8D81021EA0001C3F8D810D3F83B +:1066E000002122EA0002C3F80021D3F800317047EC +:1066F0000044025870B5D0E9244300224FF0FF3522 +:106700009E6804EB42135101D3F80009002805DA12 +:10671000D3F8000940F08040C3F80009D3F8000B1B +:10672000002805DAD3F8000B40F08040C3F8000BD6 +:10673000013263189642C3F80859C3F8085BE0D2E7 +:106740004FF00113C4F81C3870BD0000890141F0FE +:106750002001016103699B06FCD41220FFF710B9E8 +:1067600010B50A4C2046FEF79FFD094BC4F8903047 +:10677000084BC4F89430084C2046FEF795FD074BB3 +:10678000C4F89030064BC4F8943010BD4087002008 +:1067900000000840FC830008DC8700200000044063 +:1067A0000884000870B503780546012B5CD1434B83 +:1067B000D0F89040984258D1414B0E216520D3F833 +:1067C000D82042F00062C3F8D820D3F8002142F06C +:1067D0000062C3F80021D3F80021D3F8802042F0F2 +:1067E0000062C3F88020D3F8802022F00062C3F852 +:1067F0008020D3F88030FEF7BDF9324BE360324B96 +:10680000C4F800380023D5F89060C4F8003EC023D7 +:1068100023604FF40413A3633369002BFCDA0123D4 +:106820000C203361FFF7ACF83369DB07FCD412208E +:10683000FFF7A6F83369002BFCDA00262846A6608D +:10684000FFF758FF6B68C4F81068DB68C4F8146879 +:10685000C4F81C6883BB1D4BA3614FF0FF33636119 +:10686000A36843F00103A36070BD194B9842C9D1DE +:10687000134B4FF08060D3F8D82042F00072C3F879 +:10688000D820D3F8002142F00072C3F80021D3F8D9 +:106890000021D3F8802042F00072C3F88020D3F8A2 +:1068A000802022F00072C3F88020D3F88030FFF7F8 +:1068B0000FFF0E214D209EE7064BCDE740870020BD +:1068C000004402584014004003002002003C30C045 +:1068D000DC870020083C30C0F8B5D0F89040054671 +:1068E00000214FF000662046FFF730FFD5F89410E6 +:1068F00000234FF001128F684FF0FF30C4F8343896 +:10690000C4F81C2804EB431201339F42C2F800690B +:10691000C2F8006BC2F80809C2F8080BF2D20B6883 +:10692000D5F89020C5F8983063621023136116697A +:1069300016F01006FBD11220FFF722F8D4F8003829 +:1069400023F4FE63C4F80038A36943F4402343F002 +:106950001003A3610923C4F81038C4F814380B4B92 +:10696000EB604FF0C043C4F8103B094BC4F8003B48 +:10697000C4F81069C4F80039D5F8983003F1100252 +:1069800043F48013C5F89820A362F8BDD8830008AB +:1069900040800010D0F8902090F88A10D2F800388B +:1069A00023F4FE6343EA0113C2F800387047000085 +:1069B0002DE9F84300EB8103D0F890500C46804657 +:1069C000DA680FFA81F94801166806F00306731EAB +:1069D000022B05EB41134FF0000194BFB604384E73 +:1069E000C3F8101B4FF0010104F1100398BF06F12A +:1069F000805601FA03F3916998BF06F50046002915 +:106A00003AD0578A04F15801374349016F50D5F8FD +:106A10001C180B430021C5F81C382B180127C3F89C +:106A20001019A7405369611E9BB3138A928B9B0870 +:106A3000012A88BF5343D8F89820981842EA0343A4 +:106A400001F140022146C8F89800284605EB820271 +:106A50005360FFF77BFE08EB8900C3681B8A43EA9B +:106A6000845348341E4364012E51D5F81C381F430B +:106A7000C5F81C78BDE8F88305EB4917D7F8001B6B +:106A800021F40041C7F8001BD5F81C1821EA0303C4 +:106A9000C0E704F13F030B4A2846214605EB830378 +:106AA0005A60FFF753FE05EB4910D0F8003923F484 +:106AB0000043C0F80039D5F81C3823EA0707D7E7A8 +:106AC0000080001000040002D0F894201268C0F882 +:106AD0009820FFF70FBE00005831D0F890304901E0 +:106AE0005B5813F4004004D013F4001F0CBF0220C5 +:106AF000012070474831D0F8903049015B5813F4B9 +:106B0000004004D013F4001F0CBF02200120704786 +:106B100000EB8101CB68196A0B6813604B68536006 +:106B20007047000000EB810330B5DD68AA69136887 +:106B3000D36019B9402B84BF402313606B8A14685B +:106B4000D0F890201C4402EB4110013C09B2B4FB88 +:106B5000F3F46343033323F0030343EAC44343F0F2 +:106B6000C043C0F8103B2B6803F00303012B0ED188 +:106B7000D2F8083802EB411013F4807FD0F8003BC4 +:106B800014BF43F0805343F00053C0F8003B02EBC6 +:106B90004112D2F8003B43F00443C2F8003B30BD41 +:106BA0002DE9F041D0F8906005460C4606EB411304 +:106BB000D3F8087B3A07C3F8087B08D5D6F8143811 +:106BC0001B0704D500EB8103DB685B689847FA0775 +:106BD0001FD5D6F81438DB071BD505EB8403D9681D +:106BE000CCB98B69488A5A68B2FBF0F600FB1622D2 +:106BF0008AB91868DA6890420DD2121AC3E90024E3 +:106C0000302383F3118821462846FFF78BFF84F356 +:106C10001188BDE8F081012303FA04F26B8923EAAD +:106C200002036B81CB68002BF3D021462846BDE8D8 +:106C3000F041184700EB81034A0170B5DD68D0F8D8 +:106C400090306C692668E66056BB1A444FF4002009 +:106C5000C2F810092A6802F00302012A0AB20ED112 +:106C6000D3F8080803EB421410F4807FD4F800092D +:106C700014BF40F0805040F00050C4F8000903EB0E +:106C80004212D2F8000940F00440C2F80009012283 +:106C9000D3F8340802FA01F10143C3F8341870BD87 +:106CA00019B9402E84BF4020206020681A442E8AE3 +:106CB0008419013CB4FBF6F440EAC44040F00050B3 +:106CC000C6E700002DE9F843D0F8906005460C4671 +:106CD0004F0106EB4113D3F8088918F0010FC3F8F0 +:106CE00008891CD0D6F81038DB0718D500EB8103D3 +:106CF000D3F80CC0DCF81430D3F800E0DA6896451D +:106D000030D2A2EB0E024FF000091A60C3F80490D3 +:106D1000302383F31188FFF78DFF89F3118818F072 +:106D2000800F1DD0D6F834380126A640334217D044 +:106D300005EB84030134D5F89050D3F80CC0E4B2CD +:106D40002F44DCF8142005EB0434D2F800E051683D +:106D5000714514D3D5F8343823EA0606C5F83468EB +:106D6000BDE8F883012303FA01F2038923EA020351 +:106D70000381DCF80830002BD1D09847CFE7AEEB89 +:106D80000103BCF81000834228BF0346D7F8180956 +:106D900080B2B3EB800FE3D89068A0F1040959F8F2 +:106DA000048FC4F80080A0EB09089844B8F1040FE0 +:106DB000F5D818440B4490605360C8E72DE9F84FAC +:106DC000D0F8905004466E69AB691E4016F48058A6 +:106DD0006E6103D0BDE8F84FFEF7D6BA002E12DA86 +:106DE000D5F8003E9B0705D0D5F8003E23F00303FD +:106DF000C5F8003ED5F80438204623F00103C5F855 +:106E00000438FEF7EFFA370505D52046FFF772FC88 +:106E10002046FEF7D5FAB0040CD5D5F8083813F0A3 +:106E2000060FEB6823F470530CBF43F4105343F484 +:106E3000A053EB6031071BD56368DB681BB9AB69F6 +:106E400023F00803AB612378052B0CD1D5F8003E65 +:106E50009A0705D0D5F8003E23F00303C5F8003E9D +:106E60002046FEF7BFFA6368DB680BB120469847FF +:106E7000F30200F1BA80B70226D5D4F8909000272B +:106E80004FF0010A09EB4712D2F8003B03F440230C +:106E9000B3F5802F11D1D2F8003B002B0DDA6289B7 +:106EA0000AFA07F322EA0303638104EB8703DB6832 +:106EB000DB6813B13946204698470137D4F894303F +:106EC000FFB29B689F42DDD9F00619D5D4F8900037 +:106ED000026AC2F30A1702F00F0302F4F012B2F5CD +:106EE000802F00F0CA80B2F5402F09D104EB830354 +:106EF000002200F58050DB681B6A974240F0B080AA +:106F00003003D5F8185835D5E90303D500212046BC +:106F1000FFF746FEAA0303D501212046FFF740FEF6 +:106F20006B0303D502212046FFF73AFE2F0303D55A +:106F300003212046FFF734FEE80203D50421204652 +:106F4000FFF72EFEA90203D505212046FFF728FEF4 +:106F50006A0203D506212046FFF722FE2B0203D545 +:106F600007212046FFF71CFEEF0103D5082120462C +:106F7000FFF716FE700340F1A780E90703D5002153 +:106F80002046FFF79FFEAA0703D501212046FFF701 +:106F900099FE6B0703D502212046FFF793FE2F07CA +:106FA00003D503212046FFF78DFEEE0603D504210D +:106FB0002046FFF787FEA80603D505212046FFF7E8 +:106FC00081FE690603D506212046FFF77BFE2A06CF +:106FD00003D507212046FFF775FEEB0574D5204643 +:106FE0000821BDE8F84FFFF76DBED4F890904FF040 +:106FF000000B4FF0010AD4F894305FFA8BF79B68CE +:107000009F423FF638AF09EB4713D3F8002902F44B +:107010004022B2F5802F20D1D3F80029002A1CDAB3 +:10702000D3F8002942F09042C3F80029D3F8002990 +:10703000002AFBDB3946D4F89000FFF787FB228952 +:107040000AFA07F322EA0303238104EB8703DB68D0 +:107050009B6813B13946204698470BF1010BCAE7EC +:10706000910701D1D0F80080072A02F101029CBFEC +:1070700003F8018B4FEA18283FE704EB830300F580 +:107080008050DA68D2F818C0DCF80820DCE9001C6F +:10709000A1EB0C0C00218F4208D1DB689B699A6838 +:1070A0003A449A605A683A445A6029E711F0030F4B +:1070B00001D1D0F800808C4501F1010184BF02F8B4 +:1070C000018B4FEA1828E6E7BDE8F88F08B50348BA +:1070D000FFF774FEBDE80840FDF7DCB940870020EB +:1070E00008B50348FFF76AFEBDE80840FDF7D2B9CE +:1070F000DC870020D0F8903003EB4111D1F8003B41 +:1071000043F40013C1F8003B70470000D0F8903002 +:1071100003EB4111D1F8003943F40013C1F80039F1 +:1071200070470000D0F8903003EB4111D1F8003BDC +:1071300023F40013C1F8003B70470000D0F89030F2 +:1071400003EB4111D1F8003923F40013C1F80039E1 +:107150007047000030B50433039C0172002104FB2A +:107160000325C160C0E90653049B0363059BC0E986 +:107170000000C0E90422C0E90842C0E90A114363E3 +:1071800030BD00000022416AC260C0E90411C0E9BC +:107190000A226FF00101FEF763BC0000D0E904325F +:1071A000934201D1C2680AB9181D70470020704788 +:1071B000036919600021C2680132C260C2691344C8 +:1071C00082699342036124BF436A0361FEF73CBCBA +:1071D00038B504460D46E3683BB162690020131DD3 +:1071E0001268A3621344E36207E0237A33B92946A5 +:1071F0002046FEF719FC0028EDDA38BD6FF00100DB +:10720000FBE70000C368C269013BC36043691344E4 +:1072100082699342436124BF436A436100238362CE +:10722000036B03B11847704770B53023044683F3EE +:107230001188866A3EB9FFF7CBFF054618B186F381 +:107240001188284670BDA36AE26A13F8015B934275 +:10725000A36202D32046FFF7D5FF002383F31188F2 +:10726000EFE700002DE9F84F04460E461746984612 +:107270004FF0300989F311880025AA46D4F828B0C8 +:10728000BBF1000F09D141462046FFF7A1FF20B115 +:107290008BF311882846BDE8F88FD4E90A12A7EBD2 +:1072A000050B521A934528BF9346BBF1400F1BD9DB +:1072B000334601F1400251F8040B914243F8040BAC +:1072C000F9D1A36A403640354033A362D4E90A239A +:1072D0009A4202D32046FFF795FF8AF31188BD42F8 +:1072E000D8D289F31188C9E730465A46FAF752FBDB +:1072F000A36A5E445D445B44A362E7E710B5029C69 +:107300000433017203FB0421C460C0E906130023A7 +:10731000C0E90A33039B0363049BC0E90000C0E992 +:107320000422C0E90842436310BD0000026A6FF006 +:107330000101C260426AC0E904220022C0E90A22B7 +:10734000FEF78EBBD0E904239A4201D1C26822B96C +:10735000184650F8043B0B60704700231846FAE7C4 +:10736000C3680021C2690133C36043691344826961 +:107370009342436124BF436A4361FEF765BB00004B +:1073800038B504460D46E3683BB1236900201A1D59 +:10739000A262E2691344E36207E0237A33B9294623 +:1073A0002046FEF741FB0028EDDA38BD6FF0010002 +:1073B000FBE7000003691960C268013AC260C26954 +:1073C000134482699342036124BF436A036100232B +:1073D0008362036B03B118477047000070B5302318 +:1073E0000D460446114683F31188866A2EB9FFF7CD +:1073F000C7FF10B186F3118870BDA36A1D70A36A20 +:10740000E26A01339342A36204D3E169204604395E +:10741000FFF7D0FF002080F31188EDE72DE9F84F4A +:1074200004460D46904699464FF0300A8AF311887B +:107430000026B346A76A4FB949462046FFF7A0FF8A +:1074400020B187F311883046BDE8F88FD4E90A07E8 +:107450003A1AA8EB0607974228BF1746402F1BD9B8 +:1074600005F1400355F8042B9D4240F8042BF9D157 +:10747000A36A40364033A362D4E90A239A4204D374 +:10748000E16920460439FFF795FF8BF311884645E3 +:10749000D9D28AF31188CDE729463A46FAF77AFA23 +:1074A000A36A3D443E443B44A362E5E7D0E904239C +:1074B0009A4217D1C3689BB1836A8BB1043B9B1A74 +:1074C0000ED01360C368013BC360C3691A4483696B +:1074D0009A42026124BF436A03610023836201234D +:1074E000184670470023FBE700F060BA014B586A6A +:1074F000704700BF000C0040034B002258631A6124 +:107500000222DA60704700BF000C0040014B0022ED +:10751000DA607047000C0040014B5863704700BFB1 +:10752000000C0040024B034A1A60034A5A6070473D +:10753000908800203089002000000220074B49423B +:1075400010B55C68201A08401968821A8A4203D371 +:10755000A24201D85A6010BD0020FCE790880020AC +:1075600008B5302383F31188FFF7E8FF002383F386 +:10757000118808BD04480121044B03600023C0E9C1 +:1075800001330C3000F016B99888002061750008AE +:10759000CB1D083A23F00703591A521A012110B4DF +:1075A000D2080024C0E9004384600C301C605A609B +:1075B0005DF8044B00F0FEB82DE9F84F364ECD1DB6 +:1075C0000F46002818BF0646082A4FEAD50538BFDF +:1075D000082206F10C08341D9146404600F006F9D9 +:1075E00009F10701C9F1000E224624686CB9404632 +:1075F00000F006F93368CBB308224946E800984703 +:10760000044698B340E9026730E004EB010CD4F87B +:1076100004A00CEA0E0C0AF10100ACF1080304EB23 +:10762000C0009842E0D9A0EB0C0CB5EBEC0F4FEA90 +:10763000EC0BD9D89C421CD204F10802AB45A3EB59 +:1076400002024FEAE202626009D9691CED43206838 +:1076500003EBC1025D44556043F8310022601C46D3 +:107660005F60404644F8086B00F0CAF82046BDE869 +:10767000F88FAA45216802D111602346EFE7013552 +:1076800004EBC50344F8351003F10801401AC0109B +:1076900058601360F1E700BF98880020F8B550F8F3 +:1076A000043C044650F8085CA0F1080607332F1D7F +:1076B0000C35DB0840F8043C284600F097F83B46C0 +:1076C0009F421A6801D0B34228D20AB1964225D20D +:1076D00044F8082C54F8042C1E60013254F8081C9D +:1076E00006EBC200814206D14868024444F8042CEB +:1076F0000A6844F8082C5868411C03EBC1018E420B +:1077000007D154F8042C013202445A6054F8082C72 +:107710001A602846BDE8F84000F072B81346CFE77B +:10772000FEE7000070B51B4B0025044686B058608C +:107730000E4685620163FCF785FE04F11003A56027 +:10774000E562C4E904334FF0FF33C4E90044C4E9FF +:107750000635FFF7CBFE2B46024604F134012046E6 +:10776000C4E9082380230C4A2565FEF713F9012399 +:107770000A4AE06000920375684672680192B26836 +:10778000CDE90223064BCDE90435FEF72BF906B00F +:1077900070BD00BF506B00201484000819840008DD +:1077A00021770008024AD36A1843D062704700BFAD +:1077B000E8680020C0E90000816070478368013BF1 +:1077C000002B10B583600CDA074BDC684368A061BE +:1077D000206063601C6044600520FEF73DF8A069EE +:1077E00010BD0020FCE700BFE868002008B530238A +:1077F00083F31188FFF7E2FF002383F3118808BDAC +:1078000008B5302383F3118883680133002B83602C +:1078100007DC036800211A68026050601846FEF712 +:1078200047F8002383F3118808BD00004B684360CC +:107830008B688360CB68C3600B6943614B690362EB +:107840008B6943620B6803607047000008B53C4BCE +:1078500040F2FF713B48D3F888200A43C3F88820E0 +:10786000D3F8882022F4FF6222F00702C3F88820B0 +:10787000D3F88820D3F8E0200A43C3F8E020D3F8F7 +:1078800008210A43C3F808212F4AD3F808311146CA +:10789000FFF7CCFF00F5806002F11C01FFF7C6FF87 +:1078A00000F5806002F13801FFF7C0FF00F580604D +:1078B00002F15401FFF7BAFF00F5806002F1700198 +:1078C000FFF7B4FF00F5806002F18C01FFF7AEFF17 +:1078D00000F5806002F1A801FFF7A8FF00F58060C5 +:1078E00002F1C401FFF7A2FF00F5806002F1E001A0 +:1078F000FFF79CFF00F5806002F1FC01FFF796FFA7 +:1079000002F58C7100F58060FFF790FF00F01AF926 +:107910000E4BD3F8902242F00102C3F89022D3F824 +:10792000942242F00102C3F894220522C3F8982061 +:107930004FF06052C3F89C20054AC3F8A02008BD50 +:1079400000440258000002582084000800ED00E0C6 +:107950001F00080308B500F0D7FAFDF7E5FF104B4C +:10796000D3F8DC2042F04002C3F8DC20D3F8042135 +:1079700022F04002C3F80421D3F80431094B1A68FD +:1079800042F008021A601A6842F004021A60FEF718 +:10799000F5FDFEF7D9FCBDE80840FEF75DBA00BF73 +:1079A000004402580018024870470000114BD3F8F9 +:1079B000E82042F00802C3F8E820D3F8102142F092 +:1079C0000802C3F810210C4AD3F81031D36B43F0EE +:1079D0000803D363C722094B9A624FF0FF32DA6281 +:1079E00000229A615A63DA605A6001225A611A6071 +:1079F000704700BF004402580010005C000C0040BB +:107A0000094A08B51169D3680B40D9B29B076FEAE0 +:107A10000101116107D5302383F31188FDF7AEFF13 +:107A2000002383F3118808BD000C0040064BD3F8F7 +:107A3000DC200243C3F8DC20D3F804211043C3F850 +:107A40000401D3F8043170470044025808B53C4B98 +:107A50004FF0FF31D3F8802062F00042C3F880205D +:107A6000D3F8802002F00042C3F88020D3F88020B1 +:107A7000D3F88420C3F88410D3F884200022C3F8FC +:107A80008420D3F88400D86F40F0FF4040F4FF001A +:107A900040F4DF4040F07F00D867D86F20F0FF400F +:107AA00020F4FF0020F4DF4020F07F00D867D86F7B +:107AB000D3F888006FEA40506FEA5050C3F888004E +:107AC000D3F88800C0F30A00C3F88800D3F8880010 +:107AD000D3F89000C3F89010D3F89000C3F890202A +:107AE000D3F89000D3F89400C3F89410D3F894001E +:107AF000C3F89420D3F89400D3F89800C3F89810F2 +:107B0000D3F89800C3F89820D3F89800D3F88C00E5 +:107B1000C3F88C10D3F88C00C3F88C20D3F88C00F9 +:107B2000D3F89C00C3F89C10D3F89C10C3F89C2099 +:107B3000D3F89C30FCF730FEBDE8084000F0B8B93F +:107B40000044025808B50122534BC3F80821534B97 +:107B5000D3F8F42042F00202C3F8F420D3F81C2139 +:107B600042F00202C3F81C210222D3F81C314C4B14 +:107B7000DA605A689104FCD54A4A1A6001229A6078 +:107B8000494ADA6000221A614FF440429A61444B3C +:107B90009A699204FCD51A6842F480721A603F4BCD +:107BA0001A6F12F4407F04D04FF480321A6700221B +:107BB0001A671A6842F001021A60384B1A685007B7 +:107BC000FCD500221A611A6912F03802FBD101219A +:107BD00019604FF0804159605A67344ADA62344A7A +:107BE0001A611A6842F480321A602C4B1A689103A9 +:107BF000FCD51A6842F480521A601A689204FCD5C7 +:107C00002C4A2D499A6200225A63196301F57C01BE +:107C1000DA6301F5E77199635A64284A1A64284ABD +:107C2000DA621A6842F0A8521A601C4B1A6802F015 +:107C30002852B2F1285FF9D148229A614FF4886244 +:107C4000DA6140221A621F4ADA641F4A1A651F4A23 +:107C50005A651F4A9A6532231E4A1360136803F05F +:107C60000F03022BFAD10D4A136943F0030313618A +:107C7000136903F03803182BFAD14FF00050FFF7C7 +:107C8000D5FE4FF08040FFF7D1FE4FF00040BDE839 +:107C90000840FFF7CBBE00BF0080005100440258EF +:107CA0000048025800C000F0020000010000FF017F +:107CB000008890083220600063020901470E050821 +:107CC000DD0BBF0120000020000001100910E000C2 +:107CD00000010110002000524FF0B04208B5D2F868 +:107CE000883003F00103C2F8883023B1044A1368D6 +:107CF0000BB150689847BDE80840FCF7CBBB00BF0C +:107D0000B08800204FF0B04208B5D2F8883003F0B8 +:107D10000203C2F8883023B1044A93680BB1D068DB +:107D20009847BDE80840FCF7B5BB00BFB08800200D +:107D30004FF0B04208B5D2F8883003F00403C2F81F +:107D4000883023B1044A13690BB150699847BDE8E4 +:107D50000840FCF79FBB00BFB08800204FF0B04246 +:107D600008B5D2F8883003F00803C2F8883023B190 +:107D7000044A93690BB1D0699847BDE80840FCF705 +:107D800089BB00BFB08800204FF0B04208B5D2F8E0 +:107D9000883003F01003C2F8883023B1044A136A14 +:107DA0000BB1506A9847BDE80840FCF773BB00BFB1 +:107DB000B08800204FF0B04310B5D3F8884004F4E9 +:107DC0007872C3F88820A30604D5124A936A0BB1CF +:107DD000D06A9847600604D50E4A136B0BB1506BFE +:107DE0009847210604D50B4A936B0BB1D06B98478B +:107DF000E20504D5074A136C0BB1506C9847A305F4 +:107E000004D5044A936C0BB1D06C9847BDE8104080 +:107E1000FCF740BBB08800204FF0B04310B5D3F85A +:107E2000884004F47C42C3F88820620504D5164AD1 +:107E3000136D0BB1506D9847230504D5124A936D0D +:107E40000BB1D06D9847E00404D50F4A136E0BB107 +:107E5000506E9847A10404D50B4A936E0BB1D06EB7 +:107E60009847620404D5084A136F0BB1506F9847C6 +:107E7000230404D5044A936F0BB1D06F9847BDE833 +:107E80001040FCF707BB00BFB088002008B50348CE +:107E9000FCF7EAFDBDE80840FCF7FCBA7864002076 +:107EA00008B5FFF7ADFDBDE80840FCF7F3BA0000E8 +:107EB000062108B50846FCF75DFE06210720FCF701 +:107EC00059FE06210820FCF755FE06210920FCF783 +:107ED00051FE06210A20FCF74DFE06211720FCF773 +:107EE00049FE06212820FCF745FE09217A20FCF7EF +:107EF00041FE07213220FCF73DFE0C215220BDE857 +:107F00000840FCF737BE000008B5FFF79FFD00F002 +:107F10000DF8FCF7EDFFFDF7C5F9FDF797F8FFF752 +:107F200043FDBDE80840FFF7DFBA00000023054A23 +:107F300019460133102BC2E9001102F10802F8D1F1 +:107F4000704700BFB08800200B460146184600F07D +:107F500001B8000010B5054C13462CB10A46014685 +:107F60000220AFF3008010BD2046FCE700000000B7 +:107F700010B501390244904201D1002005E0037898 +:107F800011F8014FA34201D0181B10BD0130F2E7D8 +:107F90002DE9F041A3B1C91A17780144044603F151 +:107FA000FF3C8C42204601D9002009E00578BD4203 +:107FB00004F10104F5D10CEB0405D618A54201D15A +:107FC000BDE8F08115F8018D16F801EDF045F5D00A +:107FD000E7E70000034611F8012B03F8012B002A04 +:107FE000F9D170476F72672E6172647570696C6F3A +:107FF000742E437562654F72616E67652D70657290 +:108000006970680053544D333248373F3F3F005347 +:10801000544D3332483733782F3732780053544D2C +:108020003332483734332F3735332F37353000006C +:1080300001105A0003105900012058000320560077 +:1080400040A2E4F1646891060041A3E5F2656992FB +:108050000700000043414E464449666163653A208B +:108060004D6573736167652052414D204F7665728F +:10807000666C6F77210000004261642043414E49E5 +:108080006661636520696E6465782E0000010000FA +:108090000001FF0000A0004000A40040000000001C +:1080A00000000000612B0008E9230008E932000805 +:1080B00059240008652400087D280008DD250008F3 +:1080C0002124000825240008FD230008E5230008DA +:1080D0003928000809240008513400081524000834 +:1080E0000D28000801040E05054B02020E05054B84 +:1080F00004010E05054B05010B04044B08010603A2 +:108100000346000010000240080002400008024040 +:1081100000000B0028000240080002400408024052 +:1081200006010C004000024008000240080802401E +:1081300010020D0058000240080002400C080240E6 +:1081400016030E00700002400C00024010080240AE +:1081500000040F00880002400C0002401408024096 +:1081600006051000A00002400C0002401808024062 +:1081700010061100B80002400C0002401C0802402A +:1081800016072F0010040240080402402008024095 +:108190000008380028040240080402402408024075 +:1081A0000609390040040240080402402808024041 +:1081B000100A3A0058040240080402402C08024009 +:1081C000160B3B00700402400C04024030080240D1 +:1081D000000C3C00880402400C04024034080240B9 +:1081E000060D4400A00402400C040240380802407E +:1081F000100E4500B80402400C0402403C08024046 +:10820000160F46000096000000000000000000006D +:10821000000000000000000000000000000000005E +:10822000B14E00089D4E0008D94E0008C54E00080A +:10823000D14E0008BD4E0008A94E0008954E00081A +:10824000E54E000800000000C94F0008B54F0008C7 +:10825000F14F0008DD4F0008E94F0008D54F000836 +:10826000C14F0008AD4F0008FD4F0008000000009E +:108270000100000000000000633000007882000868 +:1082800040690020506B00204172647550696C6F2A +:10829000740025424F415244252D424C0025534540 +:1082A0005249414C2500000002000000000000007F +:1082B000E9510008595200084000400000840020A5 +:1082C00010840020020000000000000003000000F5 +:1082D00000000000A1520008000000001000000093 +:1082E00020840020000000000100000000000000C9 +:1082F0004087002001010200F55D0008055D0008CF +:10830000A15D0008855D000843000000108300089F +:1083100009024300020100C0320904000001020208 +:1083200001000524001001052401000104240202BB +:108330000524060001070582030800FF0904010067 +:10834000020A000000070501024000000705810243 +:1083500040000000120000005C83000812011001C0 +:10836000020000400912415700020102030100000F +:108370000403090425424F41524425003031323371 +:108380003435363738394142434445460000000011 +:108390000001002000FF010002000000000000308A +:1083A0000000040008000000000000240000080095 +:1083B000040000000004000000FC000002000000B7 +:1083C00000000430008000000800000000000038B9 +:1083D000000001000100000000000000FD53000843 +:1083E000B55600086157000840004000788800201A +:1083F00078880020010000008888002080000000AC +:108400004001000008000000000100000010000012 +:10841000080000006D61696E0069646C6500000011 +:108420000000802A00000000AAAAAAAA00000024D6 +:10843000FFFF00000000000000A00A000021000271 +:1084400000000000AAAAAAAA00000000FFFF000086 +:1084500000000009000009001400005400000000A2 +:10846000AAAAAAAA14000054FFFF000000000000FE +:10847000000000000A40100000000000AAAA8AAA1A +:1084800000401000FFFF0000990000000000000005 +:108490000081020000000000AAAAAAAA004101006F +:1084A000FFFF000000000070070000000000000057 +:1084B00000000000AAAAAAAA00000000FFFF000016 +:1084C00000000000000000000000000000000000AC +:1084D000AAAAAAAA00000000FFFF000000000000F6 +:1084E000000000000000000000000000AAAAAAAAE4 +:1084F00000000000FFFF000000000000000000007E +:108500000000000000000000AAAAAAAA00000000C3 +:10851000FFFF00000000000000000000000000005D +:1085200000000000AAAAAAAA00000000FFFF0000A5 +:10853000000000000000000000000000000000003B +:10854000AAAAAAAA00000000FFFF00000000000085 +:10855000000000000000000078050000000000009E +:1085600000001E0000000000FE2A0100D2040000EE +:10857000FF000000586B002078640020000000001D +:1085800004800008830400000F80000850040000ED +:108590001D80000800960000000008009600000002 +:1085A00000080000040000007083000800000000C4 +:1085B00000000000000000000000000000000000BB +:0485C00000000000B7 :00000001FF diff --git a/Tools/bootloaders/CubeOrangePlus-bdshot_bl.bin b/Tools/bootloaders/CubeOrangePlus-bdshot_bl.bin index fcbf811dfc..746f60652b 100755 Binary files a/Tools/bootloaders/CubeOrangePlus-bdshot_bl.bin and b/Tools/bootloaders/CubeOrangePlus-bdshot_bl.bin differ diff --git a/Tools/bootloaders/CubeOrangePlus-bdshot_bl.hex b/Tools/bootloaders/CubeOrangePlus-bdshot_bl.hex index 3b7850fc5a..71453c9b8e 100644 --- a/Tools/bootloaders/CubeOrangePlus-bdshot_bl.hex +++ b/Tools/bootloaders/CubeOrangePlus-bdshot_bl.hex @@ -1,2396 +1,2512 @@ :020000040800F2 -:1000000000060020A50500086D1F0008251F000838 -:100010004D1F0008251F0008451F0008A705000800 -:10002000A7050008A7050008A705000895730008A4 -:10003000A7050008A7050008A7050008A7050008F0 -:10004000A7050008A7050008A7050008A7050008E0 -:10005000A7050008A70500082D820008598200089E -:1000600085820008B1820008DD820008A70500082B -:10007000A7050008A7050008A7050008A7050008B0 -:10008000A7050008A7050008A7050008A7050008A0 -:10009000A7050008A7050008A705000809830008B0 -:1000A000A7050008A7050008A7050008A705000880 -:1000B000A7050008A7050008A7050008A705000870 -:1000C000A7050008A7050008A7050008A705000860 -:1000D000A7050008A7050008E1830008F5830008CC -:1000E0006D830008A7050008A7050008A7050008FC -:1000F000A7050008A7050008A7050008A705000830 -:10010000A7050008714500081D840008A705000820 -:10011000A7050008A7050008A7050008A70500080F -:10012000A7050008A7050008A7050008A7050008FF -:10013000A7050008A7050008A7050008A7050008EF -:10014000A7050008A7050008A7050008A7050008DF -:10015000A7050008A7050008A7050008A7050008CF -:10016000A7050008A7050008A7050008A7050008BF -:10017000A7050008017F0008A7050008A7050008DB -:10018000A7050008A705000809840008A7050008BE -:10019000A7050008A7050008A7050008A70500088F -:1001A000A7050008A7050008A7050008A70500087F -:1001B000A7050008A7050008A7050008A70500086F -:1001C000A7050008A7050008A7050008A70500085F -:1001D000A7050008ED7E0008A7050008A705000890 -:1001E000A7050008A7050008A7050008A70500083F -:1001F000A7050008A7050008A7050008A70500082F -:10020000A7050008A7050008A7050008A70500081E -:10021000A7050008A7050008A7050008A70500080E -:10022000A7050008A7050008A7050008A7050008FE -:10023000A7050008A7050008A7050008A7050008EE -:10024000A7050008A7050008A7050008A7050008DE -:10025000A7050008A7050008A7050008A7050008CE -:10026000A7050008A7050008A7050008A7050008BE -:10027000A7050008A7050008A7050008A7050008AE -:10028000A7050008A7050008A7050008A70500089E -:10029000A7050008A7050008A7050008A70500088E -:1002A00053B94AB9002908BF00281CBF4FF0FF31DD -:1002B0004FF0FF3000F074B9ADF1080C6DE904CED9 -:1002C00000F006F8DDF804E0DDE9022304B0704731 -:1002D0002DE9F047089D04468E46002B4DD18A42F9 -:1002E000944669D9B2FA82F252B101FA02F3C2F12C -:1002F000200120FA01F10CFA02FC41EA030E9440BD -:100300004FEA1C48210CBEFBF8F61FFA8CF708FBDD -:1003100016E341EA034306FB07F199420AD91CEBB5 -:10032000030306F1FF3080F01F81994240F21C81E7 -:10033000023E63445B1AA4B2B3FBF8F008FB10332F -:1003400044EA034400FB07F7A7420AD91CEB040464 -:1003500000F1FF3380F00A81A74240F20781644434 -:10036000023840EA0640E41B00261DB1D4400023B9 -:10037000C5E900433146BDE8F0878B4209D9002D1D -:1003800000F0EF800026C5E9000130463146BDE8A7 -:10039000F087B3FA83F6002E4AD18B4202D3824211 -:1003A00000F2F980841A61EB030301209E46002DC0 -:1003B000E0D0C5E9004EDDE702B9FFDEB2FA82F215 -:1003C000002A40F09280A1EB0C014FEA1C471FFA73 -:1003D0008CFE0126200CB1FBF7F307FB131140EA5A -:1003E00001410EFB03F0884208D91CEB010103F127 -:1003F000FF3802D2884200F2CB804346091AA4B2E9 -:10040000B1FBF7F007FB101144EA01440EFB00FEBC -:10041000A64508D91CEB040400F1FF3102D2A64521 -:1004200000F2BB800846A4EB0E0440EA03409CE7C0 -:10043000C6F12007B34022FA07FC4CEA030C20FA6D -:1004400007F401FA06F31C43F9404FEA1C4900FA8D -:1004500006F3B1FBF9F8200C1FFA8CFE09FB18110A -:1004600040EA014108FB0EF0884202FA06F20BD97D -:100470001CEB010108F1FF3A80F08880884240F2CD -:100480008580A8F102086144091AA4B2B1FBF9F011 -:1004900009FB101144EA014100FB0EFE8E4508D90C -:1004A0001CEB010100F1FF346CD28E456AD9023891 -:1004B000614440EA0840A0FB0294A1EB0E01A14276 -:1004C000C846A64656D353D05DB1B3EB080261EBE4 -:1004D0000E0101FA07F722FA06F3F1401F43C5E9BE -:1004E000007100263146BDE8F087C2F12003D840F4 -:1004F0000CFA02FC21FA03F3914001434FEA1C4736 -:100500001FFA8CFEB3FBF7F007FB10360B0C43EA27 -:10051000064300FB0EF69E4204FA02F408D91CEBD7 -:10052000030300F1FF382FD29E422DD902386344D5 -:100530009B1B89B2B3FBF7F607FB163341EA034175 -:1005400006FB0EF38B4208D91CEB010106F1FF38C4 -:1005500016D28B4214D9023E6144C91A46EA0046BB -:1005600038E72E46284605E70646E3E61846F8E64D -:100570004B45A9D2B9EB020864EB0C0E0138A3E796 -:100580004646EAE7204694E74046D1E7D0467BE777 -:10059000023B614432E7304609E76444023842E7EF -:1005A000704700BF02E000F000F8FEE73B488047DC -:1005B00072B63B4880F308883A4880F309883A4885 -:1005C0004EF60851CEF20001086040F20000CCF275 -:1005D00000004EF63471CEF200010860BFF34F8F79 -:1005E000BFF36F8F40F20000C0F2F0004EF688516A -:1005F000CEF200010860BFF34F8FBFF36F8F4FF053 -:100600000000E1EE100A4EF63C71CEF200010860E7 -:10061000062080F31488BFF36F8F06F079FF06F091 -:100620001BFF06F0A9F84FF0553020491C4A9142B3 -:100630003CBF41F8040BFAE71D491A4A91423CBFFE -:1006400041F8040BFAE71B491B4A1C4B9A423EBF78 -:1006500051F8040B42F8040BF8E700201849194A36 -:1006600091423CBF41F8040BFAE706F033FF06F075 -:1006700007F9154C154DAC4203DA54F8041B8847B2 -:10068000F9E700F043F8124C124DAC4203DA54F88B -:10069000041B8847F9E706F01BBF0000711F000824 -:1006A00000060020002200200000000800000020BA -:1006B00000060020C894000800220020D822002054 -:1006C000D822002064680020A0020008A0020008D0 -:1006D000A0020008A00200082DE9F04F2DED108ABD -:1006E000C1F80CD0D0F80CD0BDEC108ABDE8F08F6A -:1006F000002383F311882846A047002005F0A0FEC0 -:10070000FEE705F0EDFD00DFFEE7000038B506F07E -:1007100043FD054606F028FE0446E0B9104B9D4215 -:100720001BD001339D4241F2883504BF01240025CE -:10073000002006F03BFD0CB100F07AF801F02CFB34 -:1007400001F0E4F900F026FD08B100F071F8284648 -:1007500000F01CF9F9E70025EAE70546E8E700BFE5 -:10076000010007B008B501F09DF9A0F1200358423F -:10077000584108BD07B541F21203022101A8ADF8A6 -:10078000043001F0ADF903B05DF804FB38B5202367 -:1007900083F311881748C3680BB105F0EFFE0023FF -:1007A000154A4FF47A71134805F0ACFE002383F329 -:1007B0001188124C236813B12368013B23606368DE -:1007C00013B16368013B63600D4D2B7833B96368E7 -:1007D0007BB9022001F05AFA322363602B78032B95 -:1007E00007D163682BB9022001F050FA4FF47A73F5 -:1007F000636038BDD82200208D070008F423002054 -:10080000EC220020084B187003280CD8DFE800F019 -:1008100008050208022001F02FBA022001F022BAD6 -:10082000024B00225A607047EC220020F423002083 -:10083000F8B5504B504A1C461968013100F09980B8 -:1008400004339342F8D162684C4B9A4240F2918053 -:100850004B4B9B6803F1006303F500339A4280F031 -:100860008880002001F06CF90220FFF7CBFF454B98 -:100870000021D3F8E820C3F8E810D3F81021C3F81A -:100880001011D3F81021D3F8EC20C3F8EC10D3F8F2 -:100890001421C3F81411D3F81421D3F8F020C3F8AD -:1008A000F010D3F81821C3F81811D3F81821D3F891 -:1008B000802042F00062C3F88020D3F8802022F02C -:1008C0000062C3F88020D3F88020D3F8802042F063 -:1008D0000072C3F88020D3F8802022F00072C3F8A1 -:1008E0008020D3F8803072B64FF0E023C3F8084D73 -:1008F000D4E90004BFF34F8FBFF36F8F224AC2F8D1 -:100900008410BFF34F8F536923F480335361BFF3D7 -:100910004F8FD2F8803043F6E076C3F3C905C3F3B6 -:100920004E335B0103EA060C29464CEA8177013914 -:10093000C2F87472F9D2203B13F1200FF2D1BFF349 -:100940004F8FBFF36F8FBFF34F8FBFF36F8F53691D -:1009500023F4003353610023C2F85032BFF34F8FAA -:10096000BFF36F8F202383F31188854680F30888B7 -:100970002047F8BD0000020820000208FFFF010820 -:10098000002200200044025800ED00E02DE9F04F65 -:1009900093B0B44B2022FF2100900AA89D6801F07B -:1009A000A5F9B14A1378A3B90121B0481170C36009 -:1009B000202383F31188C3680BB105F0DFFD00230A -:1009C000AB4A4FF47A71A94805F09CFD002383F3EC -:1009D0001188009B13B1A74B009A1A60A64A13789E -:1009E000032B03D000231370A24A53604FF0000A78 -:1009F000009CD3465646D146012001F03DF924B172 -:100A00009C4B1B68002B00F02682002001F04AF866 -:100A10000390039B002BF2DB012001F023F9039BE1 -:100A2000213B1F2BE8D801A252F823F0AD0A0008A1 -:100A3000D50A0008690B0008F9090008F90900083F -:100A4000F9090008FB0B0008CB0D0008E50C0008B5 -:100A5000470D00086F0D0008950D0008F909000802 -:100A6000A70D0008F9090008190E00084D0B000831 -:100A7000F90900085D0E0008B90A00084D0B0008CE -:100A8000F9090008470D0008F9090008F9090008EC -:100A9000F9090008F9090008F9090008F90900082E -:100AA000F9090008F9090008690B00080220FFF79E -:100AB00059FE002840F0F981009B022105A8BAF1F7 -:100AC000000F08BF1C4641F21233ADF8143001F09C -:100AD00007F891E74FF47A7000F0E4FF071EEBDBB4 -:100AE0000220FFF73FFE0028E6D0013F052F00F26D -:100AF000DE81DFE807F0030A0D1013360523042119 -:100B000005A8059300F0ECFF17E004215548F9E72C -:100B100004215A48F6E704215948F3E74FF01C082E -:100B2000404608F1040801F00DF80421059005A8DD -:100B300000F0D6FFB8F12C0FF2D101204FF00009E0 -:100B400000FA07F747EA0B0B5FFA8BFB01F01AF983 -:100B500026B10BF00B030B2B08BF0024FFF70AFE96 -:100B60004AE704214748CDE7002EA5D00BF00B0340 -:100B70000B2BA1D10220FFF7F5FD074600289BD0E3 -:100B80000120002600F0DCFF0220FFF73BFE5FFAA9 -:100B900086F8404600F0E4FF0446B0B103994046B1 -:100BA0000136A1F140025142514100F0E9FF002815 -:100BB000EDD1BA46044641F21213022105A83E4681 -:100BC000ADF8143000F08CFF16E725460120FFF742 -:100BD00019FE244B9B68AB4207D9284600F0B2FFB0 -:100BE000013040F067810435F3E70025224BBA4617 -:100BF0003E461D701F4B5D60A8E7002E3FF45CAFC2 -:100C00000BF00B030B2B7FF457AF0220FFF7FAFD1D -:100C1000322000F047FFB0F10008FFF64DAF18F0AA -:100C200003077FF449AF0F4A08EB0503926893422C -:100C30003FF642AFB8F5807F3FF73EAF124BB84565 -:100C4000019323DD4FF47A7000F02CFF0390039A98 -:100C5000002AFFF631AF039A0137019B03F8012BFD -:100C6000EDE700BF00220020F0230020D822002062 -:100C70008D070008F4230020EC220020042200202D -:100C8000082200200C220020F0220020C820FFF7BC -:100C900069FD074600283FF40FAF1F2D11D8C5F19D -:100CA00020020AAB25F0030084494245184428BFBE -:100CB0004246019200F0F4FF019AFF217F4801F0C3 -:100CC00015F84FEAA803C8F387027C492846019328 -:100CD00001F014F8064600283FF46DAF019B05EBC8 -:100CE000830533E70220FFF73DFD00283FF4E4AE23 -:100CF00000F064FF00283FF4DFAE0027B846704BD9 -:100D00009B68BB4218D91F2F11D80A9B01330ED004 -:100D100027F0030312AA134453F8203C05934046DE -:100D2000042205A9043701F041F98046E7E7384677 -:100D300000F008FF0590F2E7CDF81480042105A823 -:100D400000F0CEFE02E70023642104A8049300F023 -:100D5000BDFE00287FF4B0AE0220FFF703FD00289F -:100D60003FF4AAAE049800F01FFF0590E6E70023C9 -:100D7000642104A8049300F0A9FE00287FF49CAE2F -:100D80000220FFF7EFFC00283FF496AE049800F035 -:100D90000DFFEAE70220FFF7E5FC00283FF48CAEE8 -:100DA00000F01CFFE1E70220FFF7DCFC00283FF425 -:100DB00083AE05A9142000F017FF07460421049014 -:100DC00004A800F08DFE3946B9E7322000F06AFE33 -:100DD000071EFFF671AEBB077FF46EAE384A07EB15 -:100DE0000903926893423FF667AE0220FFF7BAFC10 -:100DF00000283FF461AE27F003074F44B9453FF4A4 -:100E0000A5AE484609F1040900F09CFE04210590B6 -:100E100005A800F065FEF1E74FF47A70FFF7A2FC39 -:100E200000283FF449AE00F0C9FE002844D00A9BD8 -:100E300001330BD008220AA9002000F05FFF002830 -:100E40003AD02022FF210AA800F050FFFFF792FCC1 -:100E50001C4805F0FBFA13B0BDE8F08F002E3FF4FC -:100E60002BAE0BF00B030B2B7FF426AE002364217B -:100E700005A8059300F02AFE074600287FF41CAE63 -:100E80000220FFF76FFC804600283FF415AEFFF705 -:100E900071FC41F2883005F0D9FA059800F0BAFFEC -:100EA00046463C4600F06EFFA6E506464EE64FF08D -:100EB000000901E6BA467EE637467CE6F0220020CD -:100EC00000220020A086010070470000704700004B -:100ED000704700002DE9F04100F5803704461646C2 -:100EE0003B7C5BB9C0681030204400F0D9FEE56857 -:100EF0003544B5F5004FE56002D816B1BDE8F08184 -:100F0000DEB905F07F0605F110000021C6F180066C -:100F10002044F6B232462E4400F0E8FEA06804F108 -:100F20001008324600F10060414600F5003005F03F -:100F3000EBFE30B901233B74E0E74FF40046354641 -:100F4000ECE7A26805F11001404632442144A2605A -:100F5000E268521BE26000F0A3FE0220BDE8F0410F -:100F600000F094BE183000F0E9BC000010B5044653 -:100F700007F064FD204610BD10B5044607F05EFD85 -:100F8000204610BDC3B280B2A3F14102052A02D8A7 -:100F9000373800B27047613B052B94BF5738303863 -:100FA000F7E70000F8B504461546084603220C4949 -:100FB00000F080FE014688B908346F1C15F9110055 -:100FC000FFF7E0FF064617F911000131FFF7DAFFDE -:100FD000102940EA061004F8010BEFD1F8BD00BF5C -:100FE000988B00082DE9F04FADF53F7D074641682D -:100FF00001222AA802F05EFE002840F08780064603 -:10100000824681461125DFF80C81DFF80CB101AB77 -:101010004FF4805241462AA802F0A8FF002875D15B -:10102000019AB2F5805F71D8002A65D00446019A12 -:101030009442ECD2282D0FD008DC132D2DD01E2D7C -:1010400039D0112D13D00134A4B2F0E7322D2DD0B8 -:10105000372D2FD02D2DF6D13B68121B08EB040144 -:1010600038461B692D259847BDF80440EBE7121B55 -:10107000022A09D9594608EB040000F01BFE18B9F2 -:1010800002342825A4B2DEE718F804303A2B3DD00C -:101090000A2B1CBFA1461325D5E718F804300A2BEC -:1010A00034D03A2B04BFA2463225CCE718F80430DE -:1010B000202BC8D0264618F804300A2B1AD1AAEBE8 -:1010C000090208EB090102A811254F2A28BF4F2267 -:1010D00007F04EFDA21B08EB060116A84F2A28BFF9 -:1010E0004F2207F045FD3B6816AA02A9DB68384687 -:1010F0009847A8E71E25A6E73B68384604491B69C0 -:10110000984701200DF53F7DBDE8F08F0020F9E7FD -:101110008A8C0008FC2300209C8B000800F1180139 -:1011200010B5044686B00846019100F0F1FB204658 -:10113000FFF758FF60B1019902A800F049FC1022A6 -:1011400004F1080102A807F09DFCB0FA80F0400904 -:1011500006B010BD70B504460025EEB2304600F072 -:10116000FFFC58B100213046013500F009FD08B9F7 -:10117000002070BD022000F089FDEEE72046FFF759 -:1011800031FF0028F4D004F58034207C80F0010089 -:10119000EFE70000F0B5C9B006F016F800F074FEF5 -:1011A00018B90025284649B0F0BD69462A4802F022 -:1011B0009FFF00284BD1294C204602F0C9FF284848 -:1011C00002F0C6FF274802F0C3FF2146224803F081 -:1011D0003BF80028E5D1702007F032FC064610B13C -:1011E000214B44600360336830469B68984705464E -:1011F00000282ED01A4F1948394603F025F8054625 -:101200000028CED1194807F01BFC044638B1184B12 -:101210004760036000F58033C0E902551D74236800 -:1012200020469B689847054628B10E490C4803F0B4 -:101230000BF80028B5D1336830465B6898471CB17D -:10124000236820465B68984700F006FEAAE7002561 -:10125000FAE70446EFE700BFA08B0008B08B000858 -:10126000C78B0008DD8B0008008C0008140001000B -:101270001C8C00082DE9F04FD44A8DB00B68D0F8D3 -:1012800004A001931A440368D14E1A44D1F81C906B -:10129000DFF8B4C3DFF8B4B3D0E90234634003EA43 -:1012A0000A03634013444A6802920AEB7363029C88 -:1012B000C84A2244C468224484688AEA04051D405E -:1012C000654015448A68039203EB3555039CC24A76 -:1012D0002244846822448AEA03042C4084EA0A04F3 -:1012E0001444CA6805EBF4340492164483EA0502F8 -:1012F000224056445A4032440E69059604EBB2220D -:10130000059FB64E3E441E4485EA040313406B40DD -:1013100033444E69069602EB7363069FB04E3E441B -:101320002E4484EA02051D40654035448E690796C7 -:1013300003EB3555079FAB4E3E44264482EA030437 -:101340002C4054403444A84E4E4405EBF43416442B -:1013500083EA050222405A4032440E6A089604EBA2 -:10136000B222089FA14E3E441E4485EA0403134066 -:101370006B4033444E6A099602EB7363099F9C4E9F -:10138000D1F830E03E44D1F83880F3442E4484EA6A -:1013900002051D40654035448E6AA6F5244703EBDF -:1013A00035550A964F3F274482EA03042C405440A7 -:1013B0003C44CF6A0B9705EBF4340B9E8D4F3744BA -:1013C000029E174483EA050222405A403A448A4F5B -:1013D000774404EBB2221F4485EA040313406B40B8 -:1013E0003B444F6BBC4402EB7363654484EA020CDC -:1013F0000CEA030C8CEA040C6544DFF854C2C444C4 -:1014000003EB3555A44482EA03042C405440644461 -:10141000D1F83CC0794905EBF4346144114483EAC6 -:10142000050222405A400A44754904EBB222314475 -:10143000079E194484EA02032B4063400B44714920 -:1014400002EBF36331440B9E0D4482EA0301214019 -:10145000514029446C4D03EBF1513544019E254424 -:1014600083EA010414405C402C44684D01EBB44411 -:101470003544069E154481EA04021A404A402A4433 -:10148000634D04EB323235440A9E1D4484EA020364 -:101490000B4063402B445F4D02EBF3633544059EE4 -:1014A0000D4482EA03012140514029445A4D03EB87 -:1014B000F1516544254483EA010414405C402C4406 -:1014C000564D01EBB4443544099E154481EA0402AB -:1014D0001A404A402A44524D04EB32323544049EAD -:1014E0001D4484EA02030B4063402B444D4D02EB44 -:1014F000F36345440D4482EA0301214051402944ED -:10150000494D03EBF1513544089E2C4483EA010513 -:1015100015405D402C44454D01EBB4443544039ED9 -:101520002A4481EA04051D404D402A44404D04EB05 -:1015300032323D442B4484EA020593440D40654019 -:101540002B443C4D02EBF3633544069E294482EA6A -:101550000305254055402944374D03EBF1514D44D7 -:101560002C4483EA010515405D40254401EBB54557 -:1015700081EA050404EA03024A405A44A6F5B82B5E -:10158000089E05EB3232ABF2BE6B54405B44234401 -:101590002A4C344402EB33730B9E0C4485EA02015F -:1015A00059402144264C344403EB7151029E25449A -:1015B00082EA03044C402544224C444401EB354567 -:1015C000144483EA01026A40224443E078A46AD7C3 -:1015D000EECEBDC156B7C7E8DB702024AF0F7CF557 -:1015E0002AC68747134630A8019546FDD8988069DA -:1015F000AFF7448BBED75C892211906B2108B449A8 -:1016000062251EF640B340C0515A5E26AAC7B6E90D -:101610005D102FD65314440281E6A1D8C8FBD3E74E -:10162000E6CDE121D60737C3870DD5F4ED145A4531 -:1016300005E9E3A9F8A3EFFCD9026F6781F671878A -:1016400022619D6D0C38E5FD937198FD8A4C2A8DC1 -:101650008E4379A6934C344405EB7222059E1C44BC -:1016600081EA0503534023448F4C344402EB337327 -:101670000A9E0C4485EA0201594021448B4C4C449B -:1016800003EB7151254482EA03044C402C44884DFD -:10169000354401EB3444019E154483EA0102624063 -:1016A0002A44844D3D4404EB72221D4481EA040324 -:1016B00053402B44804D354402EB3373049E294440 -:1016C00084EA02055D4029447C4D354403EB7151A9 -:1016D000079E254482EA03044C402C44784D35444F -:1016E00001EB3444099E2A4483EA01056540154410 -:1016F000744A324404EB7525039E134481EA0402C4 -:101700006A401A44704B734405EB32720B4484EA0E -:101710000501514019446D4B634402EB71511C4467 -:1017200085EA02034B401C44694B334401EB3444CB -:10173000019E1D4482EA010363402B44654D04EB86 -:1017400073233544069E154463EA010262402A442D -:10175000614D03EBB2624D4462EA040929445F4DD6 -:1017600089EA0309454449442C445D4D02EBB151DB -:101770003544049E61EA03081D4488EA0208444493 -:1017800001EB744464EA02034B402B44554D04EBD7 -:10179000F323754463EA010E15448EEA040E0EEB42 -:1017A0000502514D03EBB262354462EA040E29444E -:1017B0000A9D8EEA030EA5F580164C4D7144A6F6DF -:1017C000833602EBB151264461EA030454403444A9 -:1017D000029E01EB7444354464EA02061D444E4007 -:1017E0007319089E424D04EBF323354463EA010666 -:1017F0001544664072193F4D03EBB262654462EADC -:10180000040629443C4D5E403144079E02EBB15131 -:10181000354461EA03062C44384D56403D44344477 -:10182000059E1D4401EB744464EA02034B402B44C3 -:10183000334D04EBF32335440B9E154463EA010258 -:1018400062402A442F4D03EBB2623544039E0D449F -:1018500062EA0401594029442B4D02EBB151354451 -:101860002A4E254461EA030454402C44099D01EBAF -:1018700074442E4464EA02051E4485EA01039D195E -:1018800003681A440AEB040303EBF5230260436088 -:1018900083681C44C36819448460C1600DB0BDE80E -:1018A000F08F00BF44EABEA4A9CFDE4B604BBBF66D -:1018B00070BCBFBEC67E9B28FA27A1EA8530EFD454 -:1018C000051D880439D0D4D9E599DBE6F87CA21F40 -:1018D0006556ACC4442229F497FF2A43A72394AB4E -:1018E00039A093FCC3595B6592CC0C8FD15D848584 -:1018F0004F7EA86FE0E62CFE144301A3A111084E11 -:10190000827E53F735F23ABDBBD2D72A91D386EB0C -:10191000094B036003F18833436003F12943A3F5C6 -:101920009613A3F68B638360A3F18833C36000230F -:10193000C0E90433704700BF012345672DE9F84330 -:101940001446026905460E46E300C2F3C50800F1DD -:1019500018079B18036122BF43690133436112F4E6 -:10196000FC7F436903EB5473436114D0C8F1400911 -:1019700007EB08004C4504D22246BDE8F84307F0C7 -:1019800091B8403C4A464E4407F08CF844443946EE -:101990002846FFF76FFCA04606EB0409B8F13F0F9D -:1019A000A9EB08010AD94022384607F07BF83946EE -:1019B0002846A8F14008FFF75DFCEFE7A1096FF0AA -:1019C0003F02384602FB014206EB8111D5E70000D9 -:1019D00070B50B6901F1180506460C46C3F3C50343 -:1019E000EA18501C8022EA54C3F13F02072A1FD88C -:1019F000002100F07BF929462046FFF73BFC382206 -:101A00000021284600F072F9236929462046236503 -:101A100063696365FFF72EFC21461022304607F00C -:101A200041F8204658220021BDE8704000F05EB920 -:101A3000C3F137020021E5E72DE9F84F4FF47A733F -:101A400006460D46002402FB03F7DFF85080DFF85E -:101A5000509098F900305FFA84FA5A1C01D0A342E2 -:101A600010D159F824002A4631460368D3F820B033 -:101A70003B46D847854205D1074B012083F800A09B -:101A8000BDE8F88F0134042CE3D14FF4FA7004F070 -:101A9000DDFC0020F4E700BF4034002010220020CD -:101AA00014220020002307B5024601210DF1070092 -:101AB0008DF80730FFF7C0FF20B19DF8070003B095 -:101AC0005DF804FB4FF0FF30F9E700000A460421FF -:101AD00008B5FFF7B1FF80F00100C0B2404208BD79 -:101AE000074B0A4630B41978064B53F8214001469B -:101AF00023682046DD69044BAC4630BC604700BF1C -:101B00004034002014220020A086010070B50A4E47 -:101B100000240A4D05F096F8308028683388834207 -:101B200008D905F08BF82B6804440133B4F5003F65 -:101B30002B60F2D370BD00BF42340020FC33002084 -:101B400005F05EB900F1006000F5003000687047F4 -:101B500000F10060920000F5003005F0D5B80000FB -:101B6000054B1A68054B1B889B1A834202D9104407 -:101B700005F064B800207047FC3300204234002098 -:101B800038B50446074D29B128682044BDE83840DF -:101B900005F06CB82868204405F056F80028F3D00A -:101BA00038BD00BFFC3300200020704700F1FF501B -:101BB00000F58F10D0F8000870470000064991F832 -:101BC000243033B100230822086A81F82430FFF75B -:101BD000BFBF0120704700BF00340020014B1868D0 -:101BE000704700BF0010005C1B4B0246F0B5186840 -:101BF0001A4BC0F30B06000C1F885C68BE4293F9B9 -:101C0000085003D09F89BE4203D10C335C6893F91E -:101C100008500426124B1F880433874208BF13F96B -:101C2000025C013EF7D1013A013C0B460A44934263 -:101C300007D214F9016F581C2EB1034600F8016C4D -:101C4000F5E7184605E02C2482421C7001D9981C47 -:101C50005D70401AF0BD00BF0010005C242200201F -:101C60004C8C0008022803D1024B4FF080529A613D -:101C7000704700BF00100258022803D1024B4FF4F6 -:101C800080529A61704700BF00100258022804D1A8 -:101C9000024A536983F4805353617047001002581D -:101CA000002310B5934203D0CC5CC4540133F9E750 -:101CB00010BD0000013810B510F9013F3BB191F99A -:101CC00000409C4203D11AB10131013AF4E71AB144 -:101CD00091F90020981A10BD1046FCE70346024611 -:101CE000D01A12F9011B0029FAD1704702440346A9 -:101CF000934202D003F8011BFAE770472DE9F8433D -:101D00001F4D14460746884695F8242052BBDFF83D -:101D100070909CB395F824302BB92022FF214846BF -:101D20002F62FFF7E3FF95F824004146C0F1080257 -:101D300005EB8000A24228BF2246D6B29200FFF7F0 -:101D4000AFFF95F82430A41B17441E449044E4B21E -:101D5000F6B2082E85F82460DBD1FFF72FFF0028AC -:101D6000D7D108E02B6A03EB82038342CFD0FFF781 -:101D700025FF0028CBD10020BDE8F8830120FBE738 -:101D800000340020024B1A78024B1A70704700BFD3 -:101D90004034002010220020F8B5184C184803F0F9 -:101DA000B9FC2146164803F0E1FC24681548D4F834 -:101DB0009020154ED2F80438144D43F00203104F12 -:101DC000C2F8043804F042FB2046114903F0DCFD60 -:101DD000D4F890200424D2F8043823F00203C2F887 -:101DE00004384FF4E133336055F8040BB84202D0A5 -:101DF000314603F0EDFB013CF6D1F8BD54930008E9 -:101E0000504A002040420F002834002014220020B5 -:101E10005C9300080C4B70B50C4D04461E780C4BBF -:101E200055F826209A420DD00A4B00211822184658 -:101E3000FFF75CFF0460014655F82600BDE87040DE -:101E400003F0C6BB70BD00BF403400201422002048 -:101E5000504A00202834002010B5084C01220849BF -:101E6000002001F003FF23783BB1064803F02CFB70 -:101E7000044803F05FFB0023237010BD44340020AE -:101E80005C8C0008A03600201E482DE9F041D0F8F7 -:101E9000503233B901224FF4805100F5147005F02F -:101EA000D5F9194E33780BB1FFF7D6FF0324174F3E -:101EB0004FF00008134D2846144987F8058003F0B9 -:101EC0002BFB284603F054F948B1013C284603F0A7 -:101ED00031FB14F0FF04EED1204634700FE00C49C2 -:101EE00001220C4801F0C2FE014618B1284603F059 -:101EF000EBFAEAE7084800F011F801203070BDE87D -:101F0000F08100BFA0360020443400203C22002095 -:101F10005C8C000848340020608C00080FB400205E -:101F200004B0704700B59BB0EFF3098168226846A2 -:101F3000FFF7B6FEEFF30583014B9B6BFEE700BF97 -:101F400000ED00E008B5FFF7EDFF000000B59BB025 -:101F5000EFF3098168226846FFF7A2FEEFF30583DD -:101F6000014B5B6BFEE700BF00ED00E0FEE7000009 -:101F700000B595B0132101A805F006FA9DF84F3081 -:101F80007BB10023132101A88DF84F3005F0F6F93D -:101F9000054BD3F8002882F30888D3F80438984713 -:101FA000FEE715B05DF804FB0090F01F30B50A4461 -:101FB000084D91420DD011F8013B5840082340F3E1 -:101FC0000004013B2C4013F0FF0384EA5000F6D1DB -:101FD000EFE730BD2083B8ED006870470346006826 -:101FE000596870470B0A017043700B0C090E83701F -:101FF000C1707047110A027003714170110C120E0A -:102000008170C2701A0A42711A0C1B0E8271C37160 -:1020100070470000024400F8011B9042FBD170475A -:10202000024410B510F8013B11F8014B9042A3EBAC -:10203000040301D0002BF5D0184610BDC36A023945 -:10204000023B8B4283BF4389006C01FB03000020ED -:1020500070470000C2F307238A76CB760378032B00 -:1020600001BF120C0A75120A4A75704700F10B0184 -:102070000022D30143EA520310F8012B52FA83F3F2 -:102080008842DAB2F5D110467047000010B54178A9 -:1020900004460020013102464901022A16BFA35C12 -:1020A000032203EBC03302F101021EBF9BB203EB1C -:1020B000500398B29142F0D810BD000002684AB1B6 -:1020C000134613F8011B1F290DD93A29F9D1911C88 -:1020D0008B4202D04FF0FF3070471278302AF9D18E -:1020E000036000207047014B187870479436002039 -:1020F00038B50D46044618B9092000232B6038BDB9 -:102100000368002BF8D01A78002AF5D08188DA8885 -:102110009142F1D1587804F0B3FA10F00100EBD1FC -:102120002368EBE738B50D4640F25231144602F011 -:1021300073F9FF2806D9012C0AD9030A6870022016 -:102140002B7038BD0028FCD024B128700120F8E79E -:102150000020F6E72046F4E72DE9F8430026D0F802 -:10216000008007460C468E76836B3BB398F80030B0 -:10217000042B4BD1D8F8108040273546334698F8C9 -:10218000232096421CD3002B40F0BF80002D00F08E -:10219000BC8000232544AB76637398F80430237326 -:1021A000DB0630D408F13800FFF718FFC4E900015E -:1021B000B8F80C306381B8F80E302381BDE8F8839D -:1021C000B7F5187F80F0A180FA0606F1010608BF76 -:1021D000023738F8070002372BB900F5205292B2C7 -:1021E000B2F5006F0DD305F11A01C5F1FF0240EA07 -:1021F00003402144FFF796FF002800F08680054445 -:1022000000200346BBE700200146CFE7C36C013343 -:102210005DD1FA6B00232E26551E184615F8011FB6 -:10222000013020290CD0052908BFE521092804D157 -:102230000B2B9EBFE71801337E73E71801337973C8 -:102240000B28EBD1E11800204873A17E00294CD166 -:10225000002B41D06FF00C0604F10D000825361B51 -:10226000331810F8011B002939D02E298BB249D020 -:10227000A3F14101192903D8117B0D4200D020336D -:102280000373EDE7B9F1000F05D100F520539BB2C0 -:10229000B3F5006F0BD305F11A01C5F1FF0240EA57 -:1022A00009402144FFF73EFFA0B10544002002365B -:1022B0008146D8F80C30985B0028E3D1B9F1000FC3 -:1022C0004FF0000318BF00252544AB76A1E7B146C7 -:1022D0003546EEE70546F1E73F23A3760123234485 -:1022E00000219976137B03B96373D37A02F11C0042 -:1022F00023730023FFF770FE20606360D38A63813D -:10230000138B5AE710250B46BAE73F230125A37626 -:102310003FE7000038B50546002435F8020B08B940 -:10232000204638BD02F0ACF86308C2B203EBC433F8 -:1023300012FA83F39AB2C0F3072303EB520303EBC1 -:10234000C2339CB2E9E7000001380A4411F8013BAE -:10235000914200F8013FF9D17047000037B5C378CA -:1023600004461BB90025284603B030BD00F14C01DE -:10237000826C01234078019104F0A8F9054680B9E8 -:10238000A36BE070A06C226BC31A9342EAD2A378CD -:102390000199022BE6D102440123607804F096F9FA -:1023A000E1E70125DFE7000038B5836C05460C4600 -:1023B0008B4210D0FFF7D2FF60B92246012305F10E -:1023C0004C01687804F05EF900281CBF4FF0FF3420 -:1023D0000120AC6438BD0020FCE7000038B50023C4 -:1023E0000446C3704FF0FF338364FFF7DDFF00281E -:1023F0003FD1B4F84A524AF655239D4206D10B22EA -:102400001E4904F14C00FFF70BFEA0B394F84C30CA -:10241000EB2B03D01833DBB2012B23D84AF655231C -:102420009D4206D10822164904F19E00FFF7F8FDEF -:10243000F0B1B4F857305A1E1A4213D1B3F5007FE9 -:1024400010D194F8590068B1431E18400AD194F88D -:102450005C30013B012B05D8B4F85D3013B1B4F802 -:1024600062302BB94AF6552085420CBF022003206A -:1024700038BD0420FCE70120FAE700BF8C8C00087F -:10248000988C000802392DE9F04701F007044FF05D -:10249000010A466C05460AFA04F41746984606EB0C -:1024A0001136C1F3C809E4B2314628460136FFF7B8 -:1024B0007BFF18B10120BDE8F087994605EB0902C2 -:1024C00092F84C30234214BF01210021414513D022 -:1024D0006340013F82F84C3085F803A0EBD06400E4 -:1024E00014F0FF04EAD109F1010301244FF00009BF -:1024F000B3F5007FE1D1D7E70220DCE701290246EE -:10250000F8B50C4640F28C800668F36A8B4240F2C4 -:1025100087803378013B032B00F28280DFE803F0F1 -:102520000229384B04EB5405B16B304601EB5521C1 -:10253000FFF73AFF10B14FF0FF30F8BD6F1CC5F345 -:102540000805B16B3046354401EB572195F84C50E6 -:10255000FFF72AFF0028EED1C7F30807E3073E4440 -:1025600096F84C0045EA00204CBF0009C0F30B0070 -:10257000E3E7B16B304601EB1421FFF715FF0028AC -:10258000D9D1640004F4FF742644B6F84C00D4E7B3 -:10259000B16B304601EBD411FFF706FF0028CAD11A -:1025A000A40006F14C0004F4FE742044FFF714FD6F -:1025B00020F07040C1E7D0E90430D57953EA00013A -:1025C00001D0916801B95DBB9168022DA4EB0101B6 -:1025D0000DD1013B728940F1FF305B0A43EAC053E1 -:1025E000B3FBF2F399421BD81CD0601CA5E7032D66 -:1025F00002D193698B42F8D8D3699BB9B16B30464D -:1026000001EBD411FFF7D0FE002894D1A0004C3686 -:1026100000F4FE703044FFF7DFFC20F000408CE750 -:1026200001208AE76FF0004087E70000F8B50668F0 -:1026300004460D463378042B0CBF4FF080524FF404 -:1026400000128A4201D80220F8BDCA06FBD1826876 -:102650000163D2B9022B13D83389B3EB551FF2D9DA -:10266000F36BA363A36B6263002BECD003EB5523E6 -:102670004C36C5F308050020A3633544E563E3E762 -:10268000F36BC271002BE7D01A4677897F02BD42F7 -:10269000114604D23046FFF7D1FCA063E2E72046A2 -:1026A000FFF72CFF431C024606D00128CBD9F36A62 -:1026B0008342C8D9ED1BEAE70120C5E701292DE9CE -:1026C000F04706460C46174608D9C36A8B4205D91F -:1026D0000378022B62D003D8012B22D0022552E0CE -:1026E000033B012BFAD8816B01EBD411FFF75CFEA1 -:1026F0000546002847D1A40006F14C0304F4FE74FB -:102700001C443378042B07D0204627F07047FFF78E -:1027100063FC00F07040074339462046FFF762FC37 -:102720002FE001EB5108816B01EB5821FFF73CFED4 -:10273000054640BB14F0010406F14C0908F1010AFA -:10274000C8F3080808BFFBB230461FBF19F80830AD -:1027500003F00F023B0103F0F00318BF134309F825 -:1027600008300123B16BF37001EB5A21FFF71CFE17 -:10277000054640B9CAF3080A44B1C7F3071709F878 -:102780000A700123F3702846BDE8F08719F80A3073 -:10279000C7F3032723F00F031F43F0E7816B01EB1F -:1027A0001421FFF701FE05460028ECD1640006F174 -:1027B0004C0304F4FF741F551919C7F307274F7012 -:1027C000DFE70000F8B504460E461746E3690BB98B -:1027D0001846F8BD012BA6EB0305206814BFAA1C00 -:1027E0003A46691CFFF76AFF0028F2D1E369013B12 -:1027F000E361EBE701292DE9F84306460C4617464D -:10280000056802D80220BDE8F883EB6A8B42F9D94B -:102810007AB9A14621463046A046FFF76FFE04462E -:10282000B0B92B78042B02D1002F43D1F7710020CF -:10283000E9E72B78042B02D1C379022BE9D04FF0C2 -:10284000FF3239462846FFF739FF0028E1D0DAE7A2 -:102850000128D7D0421C01D10120D4E72B78042BCA -:1028600019D1EA6AAB69023A93421CD308F101021A -:10287000A2420CD02B78042B08D10023A2EB090232 -:1028800049462846FFF7FEFD0028BCD1A146EB6A69 -:10289000A342BFD8C5E7002241462846FFF70EFFF6 -:1028A0000028DED0AFE70133AB612B7943F00103A1 -:1028B0002B71DBE7F3798BB9B468BC4202D10223F8 -:1028C000F371B4E721463046FFF718FE012899D985 -:1028D000431CC1D001348442EFD0A8E7032BA6D11A -:1028E000B368BB42A3D8B2691344BB429FD3E6E7A7 -:1028F00070B5C3790446032B06D181688369CD186E -:10290000A94203D10023E371002070BD4E1C206852 -:102910003246FFF7D3FE0028F7D13146F0E700003A -:102920002DE9F74306460191FFF718FD04460028FC -:1029300049D106F14C09019930464FF40072FFF776 -:102940007DFB2146B06407464846FFF763FB748968 -:102950006402B4F5006F28BF4FF40064B4F5007F43 -:102960002FD9204603F0EAFE804630B100212246EE -:10297000FFF750FB640A0D4609E06408EEE72346C2 -:102980007A194146707803F0A1FE18B9254473897D -:102990009D42F4D3404603F0D3FE7089401B18BF1C -:1029A000012003B0BDE8F083013573899D42F4D264 -:1029B00001237A194946707803F088FE0028F3D085 -:1029C000EBE70025F1E70120EBE70000F8B504464E -:1029D000FFF7C4FC0546002842D12378032B37D1EA -:1029E0002779012F34D104F14C06552301464FF4C9 -:1029F00000723046FFF70EFB84F84A32AA234122C8 -:102A0000722104F50D7084F84B32522384F84F2064 -:102A100084F84C3084F84D30612384F8301284F807 -:102A20004E3084F8333284F8311284F83222A169AE -:102A3000FFF7D8FA616904F50E70FFF7D3FA626BFD -:102A40003B46314601326078A26403F03FFE2571B7 -:102A500000226078114603F05DFE003818BF0120A7 -:102A6000F8BD000000232DE9F0430B6085B00F4650 -:102A70001546FFF723FB061EC0F2B281804B53F8C8 -:102A80002640002C00F0AE813C6005F0FE05237866 -:102A90006BB1607803F0F4FDC70708D41DB110F0E6 -:102AA000040500D00A25284605B0BDE8F0830023C0 -:102AB000F0B22370607003F0D1FDC10700F1948182 -:102AC0000DB14207EED400212046FFF787FC022813 -:102AD00040F099806E4604F2122304F252213246ED -:102AE00018461033FFF778FA42F8040B8B42F7D1FF -:102AF000002556F8041B00297DD02046FFF76EFC08 -:102B0000012879D80128A26C40F0C08004F1570355 -:102B100004F18C0113F8015B002D7BD18B42F9D1BC -:102B2000B4F8B430B3F5807F74D194F8B830092B81 -:102B300070D104F19400FFF751FA4FF0FF331718EA -:102B400041F10001BB4275EB010363D304F1A00026 -:102B5000FFF742FA94F8BA302063012BA37059D1E1 -:102B600094F8B99003FA09F91FFA89F36381002BED -:102B700050D0444B04F1A800FFF72EFA06469842C5 -:102B800048D8831C626304F1A400E362FFF724FACF -:102B900000EB020804F19C00C4F84080FFF71CFA27 -:102BA00010441FFA89F2A06306FB02F313EB08033B -:102BB00045EB05029F4271EB02032BD32E4604F135 -:102BC000AC00FFF709FAE06365B96389B34221D924 -:102BD000E16B2046FFF732FA81192046FFF7E4FB4C -:102BE00098B90136631993F84C30812B14D02035F5 -:102BF000C5F30805E8E703200135042D7FF479AF1C -:102C0000042807D101E0042801D101254BE7012860 -:102C10007FF678AF0D2546E705F1140004F14C0668 -:102C20003044FFF7D9F901280546F3D9E36A834216 -:102C3000F0D96189821E236C02FB01336364A16BAE -:102C4000204601EBD511FFF7AFFB0028DDD105F0E1 -:102C50007F0006EB8000FFF7BFF9431C03D001356E -:102C6000A842ECD0D6E70425C4E90500064A257041 -:102C700000251388E56101339BB21380E38012E7DE -:102C800098360020FDFFFF7F9C360020B4F85730B7 -:102C9000B3F5007FBED1B4F8626026B904F17000CC -:102CA000FFF79AF9064694F85C302663591EA37024 -:102CB0000129AFD894F859506581002DAAD0691E1A -:102CC0002942A7D1B4F85D8018F00F0FA4F808804E -:102CD000A0D1B4F85F0018B904F16C00FFF77CF9DB -:102CE000B4F85A10002995D006FB03FE01EB181C1E -:102CF000F44460458ED3A0EB0C00A842B0FBF5F382 -:102D000088D33E48834285D84FF6F57083426DD90B -:102D100003259F1C114402EB0C03032DE762626341 -:102D2000A16323644CD1B4F8763053EA08037FF4EE -:102D300071AFBB0004F17800FFF74EF9E06303F2D6 -:102D4000FF13B6EB532FFFF465AF4FF0FF33032DA6 -:102D5000C4E905334FF08003237187D1B4F87C3088 -:102D6000012B83D1511C2046FFF71EFB00287FF466 -:102D70007DAFB4F84A224AF6552320719A427FF477 -:102D800075AF1F4B04F14C00FFF726F998427FF412 -:102D90006DAF03F1FF5304F50C70FFF71DF903F558 -:102DA0000053203398427FF461AF04F50D70FFF7B4 -:102DB00013F9A06104F50E70FFF70EF9606155E795 -:102DC000B8F1000F3FF426AF7144022D4FEA4703DC -:102DD000E1631EBFD91907F0010303EB5103AEE70E -:102DE0000B2560E60C255EE603255CE640F6F575EE -:102DF000AB428CBF022501258BE700BFF5FFFF0F1B -:102E0000525261412DE9F84F07460568884649B995 -:102E10006E69C6B1EB6AB34298BF0126AB69A3B92C -:102E2000002405E0FFF76AFB0128044603D80124CB -:102E30002046BDE8F88F421C00F0D280EB6A834246 -:102E4000F6D84646EAE70126E8E72A78EB6A042A3C -:102E500040F08380A6F1020A023B4FF0010B9A4535 -:102E600028BF4FF0000AD146696C284601EB1931A2 -:102E7000FFF79AFA00283BD109F00703EA6AC9F381 -:102E8000C8010BFA03F3901EDBB26A184C4609F135 -:102E9000010992F84C20814502EA030233BF5B002E -:102EA00000234FF40071DBB228BF9946B2B9023457 -:102EB000631E0333BCD80123214628461A46FFF778 -:102EC000E1FA0228B3D0012800F08A80B8F1000F9F -:102ED00013D10223FB710028A9D130E0CA450AD0E2 -:102EE000002BD2D10131B1F5007FBDD20123CCE757 -:102EF0004FF0FF34DCE70024DAE7FB79022B07D13F -:102F0000731CA342E7D0BB68F31ABB610323FB71B8 -:102F100008F10102FB69A24205D113B10133FB6143 -:102F2000D9E70223FBE70BB90123FB6122464146A7 -:102F30003846FFF747FC00284FD10123FB61EA6ABE -:102F4000AB69023A6C6193429CBF03F1FF33AB6102 -:102F50002B7943F001032B716AE7464514D1741CA9 -:102F60003846A34298BF02242146FFF7C7FA01283A -:102F70003FF45DAF431C33D0E0B16B69012B03D943 -:102F8000EA6A934238BF1E4634460134EB6AA342D4 -:102F900003D8012E7FF644AF022421463846FFF7BE -:102FA000ADFA48B101283FF442AF013018D0B44225 -:102FB000EBD135E7002CE7D04FF0FF322146284611 -:102FC000FFF77CFB48B9B8F1000FB8D02246414664 -:102FD0002846FFF773FB0028B1D001287FF427AF04 -:102FE0004FF0FF3424E700002DE9F843066804465B -:102FF000076B894633782037042B0CBF4FF0805382 -:103000004FF40013BB429CBF00238363836B73B1F7 -:10301000C7F30808B8F1000F3CD10133416B83635B -:1030200039B93389B3EB571F34D80023A363042085 -:103030000AE07389013B13EA57232BD1FFF75EFAAD -:103040000128054602D80220BDE8F883421C01D1C0 -:103050000120F9E7F36A834216D8B9F1000FE4D0F2 -:10306000616B2046FFF7CEFE0546C8B10128EAD0C5 -:10307000431CEDD001463046FFF752FC0028E7D153 -:10308000E37943F00403E371294630466563FEF7B4 -:10309000D5FFA0634C36002027634644E663D3E7A0 -:1030A0000720D1E72DE9F04105460068A96B0669C4 -:1030B000FFF77AF9044620B9E96B0B78852B03D02A -:1030C00002242046BDE8F08120223046FFF73CF97B -:1030D000777801377F01A7F16003B3F5007FEFD860 -:1030E00021462846FFF780FF04280446E8D0002840 -:1030F000E7D1A96B2868FFF757F904460028E0D10B -:10310000E96B0B78C02BDBD12022B018FFF71CF93C -:1031100096F823300F222C33B3FBF2F3B7EB431FA7 -:10312000CED34FF0400800212846FFF75DFF04286A -:103130000446C5D00028C4D1A96B2868FFF734F92C -:1031400004460028BDD1E96B0B78C12BB8D1B8F586 -:10315000187F04D2202206EB0800FFF7F5F808F1EB -:1031600020084745DFD8B8F5187FAAD83046FEF7C3 -:103170008DFF73888342A4D0A2E700000B68002271 -:1031800010B5036004460B6A83604B6AC261C37169 -:1031900023F0FF03896AC0E90432C164FFF746FAED -:1031A00020B92046BDE81040FFF77CBF10BD0000ED -:1031B000F8B50E46002104460768FFF737FA98B9BC -:1031C0000546A16B3846FFF7EFF868B93A78E36B2C -:1031D000042A1B780CD11B060ED50546012120467A -:1031E000FFF702FF0028ECD0042808BF072006E004 -:1031F000E52B01D0002BF0D10135B542EED1F8BD61 -:1032000003682DE9F0411E6905464FF0010830467C -:10321000FEF73CFFB070000A7778F0702846E96C42 -:10322000FFF704FA04462CB1022C28BF0224E0B2B6 -:10323000BDE8F081A96B2868FFF7B6F804460028BE -:10324000F2D120223146E86BFFF77EF82B6883F835 -:103250000380002FE8D021462846FFF7C5FE203620 -:103260000446013FDFE70000C16C4B1C2DE9F04133 -:1032700004460568066B1FD1E5274FF00108A16BD6 -:103280002846FFF791F898B92A78E36B042A09BF1A -:103290001A781F7002F07F021A7085F80380236B82 -:1032A000B3420DD200212046FFF79EFE0028E6D053 -:1032B000042808BF022003E0FFF7B8F90028DBD09C -:1032C000BDE8F0812DE9F8434FF0FF080646076896 -:1032D000042445464FF6FF79B16B11B9002C73D029 -:1032E00063E03846FFF760F8044600285DD1F06BD4 -:1032F0000378002B6ED03A78042A11D1852B4DD15A -:10330000336B3046F364FFF7CDFE044600284CD102 -:103310003B691B7903F03F03B3712046BDE8F88396 -:10332000C27AE52B02F03F02B27143D02E2B41D07E -:1033300022F0200108293DD00F2A40D1590637D567 -:1033400003F0BF05336B90F80D80F364437B434576 -:1033500030D1428B72BB03780D21FC6823F040030F -:10336000DFF874E0013B4B4301211EF801CB30F83C -:103370000CC009B3FF2B1DD824F813C061460133DC -:1033800001320D2AF1D10278520605D521B1FF2B69 -:1033900010D8002224F81320013DEDB20021304660 -:1033A000FFF722FE0446002896D00023B363B4E75B -:1033B000AB42CBD0FF25F1E7CC45E1D0FAE72DB900 -:1033C000FEF754FE404501D10024A6E74FF0FF333D -:1033D000F364A2E70424E8E7348D00082DE9F04FF8 -:1033E000002187B00446D0F80090FFF71FF980460F -:1033F00070B999F80030042B33D1D9F80C00FEF7DE -:1034000089FF07462046FFF75DFF054620B180464D -:10341000404607B0BDE8F08FD9F810309A8CBA4218 -:10342000F0D193F823B040265D4506D1D9F80C3091 -:1034300033F81530002BE5D1EAE7F106D9F8103062 -:1034400008BF0236985B01F01BF8D9F80C308246B1 -:1034500033F8150001F014F88245D3D10236013556 -:10346000E2E74FF0FF0A4FF0FF3B5546C4F84CB07F -:10347000A16B4846FEF798FF00285CD1E66B3778D1 -:10348000002F77D0F27AE52F02F03F03A37103D02B -:10349000120704D50F2B04D0C4F84CB04FE00F2B0B -:1034A00054D194F84B3058063FD4790645D5236B58 -:1034B00007F0BF0796F80DA0E364737B53453ED138 -:1034C000738B002B3BD135780121D9F80C3005F0F6 -:1034D0003F0501930D23013D5D43284B13F8012B5C -:1034E000B25A71B3FF2D059329D81046049200F00B -:1034F000C7FF6B1C03900293019B33F8150000F08B -:10350000BFFF039981421AD1049A029D1146059B7F -:103510001B4A9342E2D133785A0604D519B1019B74 -:1035200033F815305BB97D1EEDB200212046FFF760 -:103530005BFD00289CD080466AE7BD42BDD0FF25D8 -:10354000F3E74FF6FF708242E2D0F8E72DB930463C -:10355000FEF78CFD50453FF45BAF94F84B30DB0732 -:103560009AD40B2204F140013046FEF759FD0028A1 -:1035700092D14DE74FF004084AE700BF348D0008B0 -:10358000418D00082DE9F04F90F84B5099B004465A -:1035900015F0A00540F061810668F26832F8153038 -:1035A000002B4AD13378042B40F086800F230E3550 -:1035B0002046B5FBF3F5A91CFFF7FAFD814600286C -:1035C00076D1236B0135A3EB4515E3795A07E56402 -:1035D00035D523F004032046E371FFF789F950BB8A -:1035E0004FF0FF32616B2046FFF7ECF818BBA36881 -:1035F0002BB3214604A8FFF7C1FDE0B970894FF451 -:103600000071D4E90423E0FB01233069C4E90423F9 -:103610003830FEF7EFFC3069D4E904232830FEF798 -:10362000E9FCE379326904A843F0010382F8213010 -:10363000FFF7E6FD18B181463AE00135AEE7D6E97D -:1036400003548523002140222046FEF7E3FC01229B -:103650002370C0230E464FF0C10C84F820308E46F4 -:10366000402304EB02085F1C04F803C0F0B20233ED -:1036700004F807E022B135F811200AB10131C9B2CE -:10368000170AE25408F803700233DF06F2D135F866 -:1036900011700136002FE6D1831C84F823102846D0 -:1036A0006370FEF737FE84F82400000A84F82500D2 -:1036B000484619B0BDE8F08F04F140070C2204A879 -:1036C0003946FEF741FE9DF81B30DB0740F1CF8005 -:1036D00040234FF0010ADFF8F88184F84B300B22C9 -:1036E00004A93846D6F80C90FEF72EFEBAF1050F65 -:1036F00054D9A9F10201534631F8022F002A3FD1D3 -:103700000DF10F00072203F00F0C0CF130013929E5 -:1037100088BF0CF13701013A00F801194FEA131183 -:1037200001D00F2B3CD818AB7E21134403F8581C52 -:1037300039460023934205D011F8010B03F1010C27 -:1037400020282FD104F13F00072A03F1010397BF7E -:1037500018A920218918013298BF11F8581C072B8D -:10376000C154F1D92046FFF739FE8146002877D1B0 -:103770000AF1010ABAF1640FB1D14FF0070997E7D6 -:10378000102002F0010C52080CEB430313F4803FAD -:1037900018BF83EA08030138F3D1ADE75346AFE71A -:1037A0000B46B0E76346C5E7216B2046A1EB451108 -:1037B000FEF73CFF814600287FF47AAF4FF6FF7892 -:1037C0003846FEF753FC0190A16B3046FEF7ECFD46 -:1037D000814600287FF46CAFE36BE9B2019A4FF0A9 -:1037E0000D0CD6F80CE05A734FF00F02DFF8E4A08E -:1037F000DA724A1E18730CFB02F284469876D87669 -:1038000040451AF8019B0CF1010C18BF3EF812005C -:1038100003EB090B18BF013203F809004FEA102926 -:10382000002808BF4046BCF10D0F8BF80190E7D18E -:10383000404502D03EF812200AB941F0400119700B -:10384000012300212046F370FFF7CEFB81460028BC -:103850007FF42EAF013DB7D11EE04FF0060927E7F8 -:1038600004287FF425AF9DF81B3084F84B309DF879 -:103870001B3020469B0745BF0C350D210125B5FBAC -:10388000F1F548BF01352946FFF792FC8146002833 -:103890007FF40EAF013D87D1A16B3046FEF784FD6A -:1038A000814600287FF404AF01462022E06BFEF73A -:1038B000B1FB0B223946E06BFEF746FD94F84B3026 -:1038C000E26B03F0180313730123F370F0E600BFFB -:1038D00021100100348D000810B504460A4634302A -:1038E000FEF77AFB886004F13800FEF777FBC2E947 -:1038F000040194F8213003F00203D3710023D36153 -:1039000010BD000003284B8B04BF8A8A43EA0243A0 -:10391000184670472DE9F04F0B7899B00446884659 -:103920002F2BD0F800B001D05C2B09D14246137880 -:10393000904601322F2BFAD05C2BF8D0002301E007 -:10394000DBF81C30A3600023E3619BF80030042BFC -:103950001ED1A368E3B1DBF82030214604A823621E -:10396000DBF824306362DBF82830A362FFF706FC43 -:103970000346002859D1DBF8102002F13800FEF789 -:103980002BFBC4E9040392F8213003F00203E37136 -:1039900098F800301F2B00F223818023002120465D -:1039A00084F84B3019B0BDE8F04FFEF73FBEFF2E54 -:1039B00000F038812AF81600013615E142461378E6 -:1039C000904601322F2BFAD05C2BF8D00025012E27 -:1039D00030D1BAF800302E2B32D1002304F140024E -:1039E0002AF816309E428CBF2E21202101330B2B4A -:1039F00002F8011BF6D145F02005204684F84B5013 -:103A0000FFF7ECFC94F84B30002800F0D08004283D -:103A10000BD1990603F0040240F1C580002A00F0A2 -:103A2000DF808023002084F84B3019B0BDE8F08F90 -:103A30000425CCE7022E03D1BAF802302E2BC8D0D1 -:103A4000AAF102028EBB00222AF81620002E00F0F6 -:103A5000E9803AF81210134601322029F9D00BB947 -:103A60002E2901D145F00305AAF1020131F81620F3 -:103A70002E2A01D0013EF9D14FF000090B2220215E -:103A800004F14000FEF7C6FA4F460822591C3AF8E6 -:103A900013000191F0B1202803D02E280DD1B1429E -:103AA00010D045F00305019BF0E732F81630202BCB -:103AB00001D02E2BC7D1013EC4E7914505D2019B11 -:103AC000B34235D10B2A2CD101E00B2A23D145F08A -:103AD00003050B2294F84030E52B04BF052384F83E -:103AE0004030082A04BFBF00FFB207F00C030C2BC4 -:103AF00003D007F00303032B01D145F00205AB0708 -:103B00003FF57BAFFE0748BF45F01005780748BF7B -:103B100045F0080571E7019BB34202D045F003056B -:103B2000D8D8BF000B224FF008090196FFB2BAE7C0 -:103B30007F2812D945F0020340F2523103920293DA -:103B400000F06AFC10F0800FDDE9023210D000F0C6 -:103B50007F004349085C1D4630B1424911F8013BE2 -:103B6000002B6DD08342F9D145F003055F2010E0B2 -:103B7000FF28F0D9511E894503D345F0030591462E -:103B800091E704EB0901050A09F1010981F84050A8 -:103B90001D4604EB090309F1010983F8400082E79F -:103BA00047F00207F5E7002A08BF05203DE75A075E -:103BB0003FF53BAFA379DB0640D59BF80000042816 -:103BC00032D1A3682146E27923622369DBF8100031 -:103BD00023F0FF0313436362E36CA362FFF77CFEF1 -:103BE00023680026D3F80CA018F8010B00283FF436 -:103BF0001FAF40F2523100F02FFC98B11F287FF622 -:103C000017AF2F283FF4DAAE5C283FF4D7AE7F28F9 -:103C10003FF6CDAE144A12F8013B002B3FF4C7AE7D -:103C20008342F8D1062000E7216B0BF14C03C1F36E -:103C300008011944FFF766FEA060D1E70520F4E60D -:103C4000A0F141039BB2192BAAD9A0F161039BB249 -:103C5000192B9EBF203847F0010780B299E700BFBB -:103C6000B48C0008AD8C0008A48C00081FB5CDE909 -:103C7000001003A814460391FEF720FA002815DB74 -:103C80000B4A52F820300BB100211970019B0BB187 -:103C90000021197042F820302CB1002201A9684699 -:103CA000FEF7E0FE0446204604B010BD0B24FAE700 -:103CB000983600202DE9F04798B0904605460191CE -:103CC000002800F04F8102F03F0603A901A8324608 -:103CD000FEF7C8FE002840F04381039B4FF48C6040 -:103CE000049302F02BFD0746002800F03D81039B62 -:103CF00000F500720199D86004A81A61FFF70AFE66 -:103D0000044620B99DF95B30002BB8BF062418F09B -:103D10001C0F00F0C980002C4BD0042C3FD104A80C -:103D2000FFF730FC0446002839D146F00806039B13 -:103D30001A78042A7FD1186929462B60FFF7CCFD39 -:103D4000039B00211E2218690230FEF763F9039BD2 -:103D50001A2218692630FEF75DF9039B20211A69A3 -:103D600011711C6903F050F9014601220834204604 -:103D7000FEF738F9039B04A81B6983F82120FFF79D -:103D80003FFA044658B9A96801B302462846FEF72F -:103D900031FDAB68039A0446013B5361B4B1384628 -:103DA00002F0CEFC0CB100232B60204618B0BDE819 -:103DB000F0879DF8163013F0110F40F0818018F055 -:103DC000040F40F0C78018F0080FB0D1039A3107F4 -:103DD0001399936C48BF46F04006E964AB641078D1 -:103DE00004286FD1069B9DF817102B62089B106961 -:103DF00023F0FF030B4329466B62179BAB62FFF76F -:103E00006BFD039B0024002205F150082B60214626 -:103E1000DB88404685F83060AB80002385F8314070 -:103E20006C64C5E90E234FF40072FEF7F3F8B20696 -:103E300053D40024B3E703F0E7F801460090139849 -:103E40000E30FEF7CFF8139800991630FEF7CAF837 -:103E5000039C13992078FFF755FD2023002280460C -:103E6000CB7220461399FEF7F5F8139B002201212F -:103E70001A775A779A77DA77039BD970B8F1000FDF -:103E8000A4D0414604A8D3F84890FEF7B3FC0446FA -:103E9000002884D149460398FEF786FA039B04461E -:103EA00008F1FF30586179E7002C7FF478AF9DF876 -:103EB0001630DC0650D418F0020F87D0D80785D50D -:103EC00007246CE7FFF71EFD0023A86001F11C002A -:103ED000FEF782F86B61286193E7D5E9046956EA39 -:103EE0000903A6D0039BA968B3F80AA04FEA4A2A9F -:103EF000C5E90E69B24574EB09031BD3002429649C -:103F0000002C7FF44CAFC6F30803002B91D0039C28 -:103F10002046FEF793F808B3760A0123414646EAA5 -:103F2000C95682196A64607802F0ACFB041E18BF9F -:103F3000012434E72846FEF7E1FAB6EB0A0601460B -:103F400069F10009012803D9431CD3D10124D6E724 -:103F50000224D4E7082422E7042420E702241EE7F1 -:103F6000044620E7092420E711241EE72DE9F04F3D -:103F7000994685B00023884603A90446C9F8003055 -:103F80001646FEF7B5F8054680BB94F831506DBB78 -:103F900094F8303013F00103009300F0A68004F190 -:103FA000500AD4E90432D4E90E011B1A62EB010273 -:103FB000B34272F1000238BF1E46BEB1D4E90E1002 -:103FC000C1F30803002B40F08280039B5A894B0AFF -:103FD000013A43EAC0531A401BD151EA000309D108 -:103FE000A06801280DD8022584F83150284605B074 -:103FF000BDE8F08F216C20460192FEF77FFA019A0E -:10400000EFE7431C04D10123009D84F83130EDE734 -:104010002064DDF80CB0216C5846FEF70FF800283C -:10402000E1D0B6F5007F02EB000731D3BBF80A10F0 -:1040300002EB5620730A88429BF8010088BF8B1A56 -:104040003A464146019302F01DFB0028DBD194F96A -:104050003020019B002A0BDA606CC01B984207D20B -:104060004FF40072514608EB4020FEF76DF9019BBA -:104070005F02D9F80030F61BB8443B44C9F8003061 -:10408000D4E90E32DB1942F10002C4E90E3294E7A2 -:10409000626CBA421AD094F93030002B0DDA012349 -:1040A00051469BF8010002F011FB0028ABD194F8B7 -:1040B000303003F07F0384F83030039801233A4610 -:1040C0005146407802F0DEFA00289CD16764A16B6B -:1040D0004046C1F30801C1F500775144B74228BFFB -:1040E00037463A46FEF730F9C3E707257EE700007A -:1040F00070B596B00E460022019002A901A8FEF705 -:10410000B1FC0446E0B94FF48C6002F017FB0546A1 -:10411000D8B1029B00F500720199D86002A81A611B -:10412000FFF7F8FB044640B99DF95330002B0ADB3A -:104130001EB1314602A8FEF70FF8284602F000FB38 -:10414000204616B070BD0624F7E71124F8E70000FA -:1041500070B5B8B00222019003A901A8FEF782FC55 -:10416000044608BB039B4FF48C60109302F0E6FA00 -:104170000546002866D0039B00F500720199D860BF -:1041800010A81A61FFF7C6FB044650B99DF88B30A2 -:10419000980655D4190653D49DF84630DA0706D54B -:1041A0000724284602F0CCFA204638B070BD039BA5 -:1041B00004931878042814D104A91869FFF78CFB1C -:1041C000069E9DF84630DB0610D410A8FFF74CF889 -:1041D00004460028E5D156BB0398FEF7F7FB0446DA -:1041E000DFE71F99FFF78EFB0646EAE7039BDA69D4 -:1041F000B242D5D024930021269624A81B78042B04 -:1042000001BFDDE90823CDE928239DF817308DF89B -:104210009730FEF70BFA04460028C2D124A8FFF716 -:1042200051F804460028BBD00428BAD1CDE7024695 -:10423000314604A8FEF7DEFA04460028B1D1CBE7E8 -:104240000624AEE71124AFE7F0B5BDB0CDE900100C -:104250006846FDF733FF022203A901A8FEF702FC1E -:104260000446002838D1039B4FF48C60149302F06D -:1042700065FA0546002800F0CD80039B00F500722A -:104280000199D86014A81A61FFF744FB044600BBEB -:104290009DF89B3013F0A00F40F0B880039B1A7874 -:1042A000042A58D11969402204A8FEF74DF850227B -:1042B00028A80DEB0201FEF747F8009928A8FFF7A0 -:1042C00029FB0446002843D12A9A169B9A4206D01D -:1042D0000824284602F034FA20463DB0F0BD349A56 -:1042E000209B9A42F4D128A8FFF74CF904460028F5 -:1042F000EFD1039B04A940221869848C477890F879 -:104300002360FEF721F8039B28A81B695F70039BBD -:104310001A6982F823601A6982F82440240A82F814 -:1043200025401A691379D9065CBF43F02003137145 -:10433000FEF766FF04460028CBD114A8FEF794FFD1 -:1043400004460028C5D10398FEF740FB0446C0E7A9 -:104350000428BED1C7E72022239904A8FDF7F4FF63 -:10436000502228A80DEB0201FDF7EEFF009928A8C6 -:10437000FFF7D0FA0446002844D12A9A169B9A42A5 -:10438000A6D1349A209B9A42A2D128A8FFF7FAF826 -:10439000044600289DD1379C13220DF11D010127F1 -:1043A00004F10D00FDF7D0FF9DF81B30039EDA06E7 -:1043B00058BF43F02003E372F770E37ADB06BCD505 -:1043C000169A2A9B9A42B8D021463078FFF79AFA7B -:1043D00001463046FDF732FE0146C8B13046FDF7D2 -:1043E000E3FF044600287FF474AF039890F86D3023 -:1043F0002E2BA2D12A9A00F16C01FDF72BFE039B14 -:10440000DF709AE704287FF464AFBEE7062460E714 -:1044100002245EE711245FE77F2810B501D880B23F -:1044200010BDB0F5803F13D240F2523399420FD104 -:104430000849002231F8024B93B2844203D103F1C0 -:104440008000C0B2ECE70132802AF3D11346F6E7D0 -:104450000020E5E7F48F00087F280DD940F25233A1 -:10446000994208D1FF2806D800F10040034B80385C -:1044700033F8100070470020704700BFF48F000829 -:10448000B0F5803FF0B522D21F4A83B21F49B0F584 -:10449000805F28BF0A46141D34F8042C2146AAB1B7 -:1044A000934213D334F8025C2E0AEFB252FA85F528 -:1044B000A84222DA082E09D8DFE806F0050A101211 -:1044C0001416181A1C00801A34F810301846F0BD63 -:1044D000981A00F001001B1A9BB2F7E7103BFBE7AC -:1044E000203BF9E7303BF7E71A3BF5E70833F3E702 -:1044F000503BF1E7A3F5E353EEE70434002ECBD1B4 -:1045000001EB4702C7E700BF448D0008388F000861 -:1045100001F001038A0748BF43F002034A0748BF7E -:1045200043F008030A0748BF43F00403CA0648BF24 -:1045300043F010038A06426B48BF43F02003134345 -:1045400043637047094BC26A994228BF1946D0F8A5 -:104550004C328B4210B5507906D95A1E4C0002EBF2 -:104560004103B3FBF4F3184410BD00BF20BCBE00F0 -:1045700010B5202383F311880024064B06482146FA -:10458000DC6301F07DFF84F31188BDE8104002F088 -:1045900039BF00BF00700052DC36002010B5094C56 -:1045A000204600F0ADFF084B00220849636431202B -:1045B000C4E90F23064BC4E992130921BDE810405A -:1045C00000F022BCA0360020005A620200700052A7 -:1045D00000B4C404C36A0BB90F4BC3620379012B47 -:1045E00011D10E4B98420ED10D4BD3F8D42042F48A -:1045F0008032C3F8D420D3F8FC2042F48032C3F8D0 -:10460000FC20D3F8FC30D0F8483200221A605A60FF -:10461000DA625A62704700BFF4900008A0360020AA -:10462000004402580379012B18D0D0F848320022F8 -:104630001A605A60DA625A62094B98420ED1094BED -:10464000D3F8D42022F48032C3F8D420D3F8FC204D -:1046500022F48032C3F8FC20D3F8FC30704700BF4E -:10466000A03600200044025810B5D0F8484207494F -:10467000FFF768FF6060236842F2107043F00303A5 -:104680002360BDE8104001F0E1BE00BF801A0600C3 -:1046900038B5D0F8485201296C6808BF054924F0A4 -:1046A000FF0418BF0449FFF74DFF044344F480544E -:1046B0006C6038BD80F0FA0240787D01D0F8483255 -:1046C00000225A601A607047D0F8482201295368C6 -:1046D00023F4404304D0022905D001B95360704748 -:1046E00043F48043FAE743F40043F7E7D0F8483255 -:1046F00041F480519A60D9605A6B1206FCD5802231 -:104700009A63704710B541F48851D0F84842A260CE -:10471000E160616B11F04502FBD0A26311F004026D -:1047200003D0FFF7F5FE012010BD61691046196046 -:10473000FAE7000010B541F48851D0F84842A26071 -:10474000E160616B11F04502FBD0A26311F005023C -:1047500003D0FFF7DDFE012010BD6169104619602E -:10476000FAE700002DE9F041044628200F461646DE -:1047700001F06CFED4F84802C56A00F1580115F04A -:1047800002053FD0826AD4F8500202F077FD10B9DA -:104790000120BDE8F081202383F311884FF0FF3121 -:1047A000D4F848024FF49D738163C363012303650A -:1047B000C36A43F00103C36204F13C0001F052FEFE -:1047C000D4F848220023136583F31188D4F84832C3 -:1047D000D4F85002996D9A6A02F078FDD4F8483204 -:1047E0005A6BD205D4D54FF0FF32012F9A634FF0A8 -:1047F0000002DA6231D9334620460C21BDE8F0418F -:10480000FFF798BF4FF0FF384FF49D73C0F8388022 -:10481000C363826AD4F8500202F066FD0028B7D064 -:10482000202383F311880122D4F84832414604F151 -:104830003C001A65DA6A42F00102DA6201F012FE07 -:10484000D4F848321D6585F31188D4F84832D4F87D -:104850005002996D02F074FDC0E7104699E7000020 -:1048600073B5D0F84842002501924FF0FF320E4652 -:10487000616B2565A263E562FFF74AFE012E07D949 -:10488000019B2A460C2102B0BDE87040FFF752BFE1 -:1048900002B070BD10B541F49851D0F84842A26002 -:1048A000E160616B11F04502FBD0A26311F03F02A1 -:1048B00003D0FFF72DFE012010BD216A10461960BC -:1048C000E1695960A16999606169D960F4E7000004 -:1048D0007FB516460193026C0D46D0F84832044667 -:1048E0005A6200F0D3FD019938B1204603AA012194 -:1048F000FFF7B6FF012004B070BDD4F84802089A53 -:10490000C36A43F40053C3624FF0FF33836306234B -:1049100086628565C36203AB2046FFF70BFF002864 -:10492000E3D1064B039A1340002BDED103AA0121E9 -:104930002046FFF717FF0028DDD0D6E708E0FFFD8F -:10494000F7B517461D46026C0446D0F848320E46AD -:104950005A6200F09BFD00BBD4F84832DA6A42F498 -:104960000052DA624FF0FF329A636A029A62922230 -:104970009F65DA62236BDB0601AB58BF7602012D1F -:1049800032460CD912212046FFF7D4FE48B120460A -:1049900001AA2946FFF764FF012003B0F0BD1121F1 -:1049A000F1E7064B019A1340002BF0D101AA2946EA -:1049B0002046FFF7D7FE0028EFD0E8E708E0FFFD2C -:1049C000F7B517461D46426C0446D0F848320E46ED -:1049D0005A6200F05BFDE8B9D4F84832DA6A42F472 -:1049E0000052DA624FF0FF329A636A029A62236BD6 -:1049F000DB0601AB58BF7602012D32460CD91921D6 -:104A00002046FFF797FE48B1204601AA2946FFF746 -:104A100027FF012003B0F0BD1821F1E7084B019AF0 -:104A20001340002BF0D1D4F848329022294620467A -:104A30009F65DA6201AAFFF795FE0028EAD0E3E756 -:104A400008E0FFFD12F0030F2DE9F04107460C4688 -:104A500015461E461CD0C1EBC1520E44DFF838800B -:104A600005EB4225B44202D10020BDE8F0810123CC -:104A7000094A21463846FFF763FF0028F5D105EBC8 -:104A800044204FF4007241460134FDF709F9E9E78B -:104A9000BDE8F041FFF754BFF438002012F0030FD7 -:104AA0002DE9F04107460C4615461E461CD0C1EBC9 -:104AB000C1520E44DFF8388005EB4225B44202D1E2 -:104AC0000020BDE8F0814FF4007205EB4421404620 -:104AD000FDF7E6F80123424621463846FFF770FF0E -:104AE0000028EED10134E9E7BDE8F041FFF768BFE7 -:104AF000F4380020002070470268436811430160C9 -:104B000003B1184770470000024A136843F0C0031E -:104B10001360704700440040024A136843F0C0032A -:104B20001360704700480040024A136843F0C00316 -:104B3000136070470078004037B5274C274D20465A -:104B400000F03AFD04F11400009400234FF40072C9 -:104B5000234900F0C9F94FF40072224904F13800EA -:104B60000094214B00F042FA204BC4E91735204C49 -:104B7000204600F021FD04F11400009400234FF4BE -:104B800000721C4900F0B0F94FF400721A4904F1A8 -:104B900038000094194B00F029FA194BC4E9173575 -:104BA000184C204600F008FD04F1140000234FF4D7 -:104BB00000721549009400F097F9144B4FF40072FD -:104BC000134904F13800009400F010FA114BC4E9C5 -:104BD000173503B030BD00BFF43A002000E1F50501 -:104BE000383C002038420020094B000800440040B7 -:104BF000603B0020383E002038440020194B00085C -:104C000000480040CC3B002038400020294B0008E1 -:104C10003846002000780040037C30B5334C002932 -:104C200018BF0C46012B18D1314B98420FD1314B94 -:104C3000D3F8E82042F40032C3F8E820D3F810217A -:104C400042F40032C3F81021D3F8103105E02A4BAA -:104C500098422FD0294B984238D02268036EC16DFC -:104C600003EB52038466B3FBF2F36268150442BFA0 -:104C700023F0070503F0070343EA4503CB60A3686D -:104C800043F040034B60E36843F001038B6042F460 -:104C9000967343F001030B604FF0FF330B62510535 -:104CA00005D512F010221DD0B2F1805F1CD080F823 -:104CB000643030BD0F4BD3F8E82042F48022C3F8B3 -:104CC000E820D3F8102142F48022BBE7094BD3F847 -:104CD000E82042F08042C3F8E820D3F8102142F0E7 -:104CE0008042AFE77F23E2E73F23E0E7FC90000844 -:104CF000F43A002000440258603B0020CC3B0020E6 -:104D00002DE9F047C66D05463768F469210734621E -:104D100019D014F0080118BF8021E20748BF41F004 -:104D20002001A3074FF0200348BF41F04001600776 -:104D300048BF41F4807183F31188281DFFF7DCFE22 -:104D4000002383F31188E2050AD5202383F3118819 -:104D50004FF40071281DFFF7CFFE002383F3118865 -:104D60004FF020094FF0000A14F0200838D13B061C -:104D700016D54FF0200905F1380A200610D589F321 -:104D80001188504600F066F9002836DA0821281DFF -:104D9000FFF7B2FE27F080033360002383F311880E -:104DA000790614D5620612D5202383F31188D5E93C -:104DB00013239A4208D12B6C33B127F040071021FE -:104DC000281DFFF799FE3760002383F31188E3065F -:104DD00018D5AA6E1369ABB15069BDE8F047184702 -:104DE00089F31188736A284695F86410194000F019 -:104DF000FDFB8AF31188F469B6E7B06288F3118885 -:104E0000F469BAE7BDE8F087090100F160430122C7 -:104E100003F56143C9B283F8001300F01F039A4001 -:104E200043099B0003F1604303F56143C3F880210C -:104E30001A607047F8B51546826804460B46AA42C8 -:104E400000D28568A1692669761AB5420BD2184648 -:104E50002A46FCF725FFA3692B44A3612846A368D3 -:104E60005B1BA360F8BD0CD9AF1B18463246FCF79C -:104E700017FF3A46E1683044FCF712FFE3683B4411 -:104E8000EBE718462A46FCF70BFFE368E5E700006E -:104E900083689342F7B50446154600D28568D4E985 -:104EA0000460361AB5420BD22A46FCF7F9FE636954 -:104EB0002B4463612846A3685B1BA36003B0F0BD6D -:104EC0000DD93246AF1B0191FCF7EAFE01993A4633 -:104ED000E0683144FCF7E4FEE3683B44E9E72A4636 -:104EE000FCF7DEFEE368E4E710B50A440024C36182 -:104EF000029B8460C16002610362C0E90000C0E9F6 -:104F0000051110BD08B5D0E90532934201D1826880 -:104F100082B98268013282605A1C42611970002194 -:104F2000D0E904329A4224BFC368436101F0C2FA57 -:104F3000002008BD4FF0FF30FBE7000070B52023D4 -:104F400004460E4683F31188A568A5B1A368A2693B -:104F5000013BA360531CA36115782269934224BFCF -:104F6000E368A361E3690BB120469847002383F30C -:104F70001188284607E03146204601F08BFA0028C8 -:104F8000E2DA85F3118870BD2DE9F74F04460E462D -:104F900017469846D0F81C904FF0200A8AF31188E3 -:104FA0004FF0000B154665B12A4631462046FFF703 -:104FB00041FF034660B94146204601F06BFA0028E4 -:104FC000F1D0002383F31188781B03B0BDE8F08F84 -:104FD000B9F1000F03D001902046C847019B8BF325 -:104FE0001188ED1A1E448AF31188DCE7C160C361A1 -:104FF000009B82600362C0E905111144C0E9000012 -:1050000001617047F8B504460D461646202383F328 -:105010001188A768A7B1A368013BA36063695A1C04 -:1050200062611D70D4E904329A4224BFE36863616F -:10503000E3690BB120469847002080F3118807E010 -:105040003146204601F026FA0028E2DA87F311887B -:10505000F8BD0000D0E9052310B59A4201D182685D -:105060007AB982680021013282605A1C82611C7800 -:1050700003699A4224BFC368836101F01BFA20468A -:1050800010BD4FF0FF30FBE72DE9F74F04460E4609 -:1050900017469846D0F81C904FF0200A8AF31188E2 -:1050A0004FF0000B154665B12A4631462046FFF702 -:1050B000EFFE034660B94146204601F0EBF90028B7 -:1050C000F1D0002383F31188781B03B0BDE8F08F83 -:1050D000B9F1000F03D001902046C847019B8BF324 -:1050E0001188ED1A1E448AF31188DCE70379052B39 -:1050F00005BF836A002001204B6004BF4FF400739A -:105100000B60704770B55D1E866A04460D44B5425B -:1051100005D9436B43F080034363012070BD06252E -:105120000571FFF78FFC05232371F7E770B55D1E4E -:10513000866A04460D44B54205D9436B43F08003AB -:105140004363012070BD07250571FFF7A7FC052308 -:105150002371F7E738B505790446052D05D10823F5 -:105160000371FFF7C7FC257138BD0120FCE7000083 -:105170002DE9F041032384B0044602AF0371FFF729 -:1051800073FA002220461146FFF7B0FA4FF4D572A9 -:105190003B1D08212046FFF7CDFA0246B8B901238E -:1051A00023637B68C3F30323012B09D13B1D372104 -:1051B0002046FFF7BFFA18B9AB4B7A681340ABB182 -:1051C00020460125FFF77AFA0223237140E13B1DB7 -:1051D000002237212046FFF7ADFA28B9A24A7B68A2 -:1051E0001A40002A00F0A98002232363236B03F0F6 -:1051F0000F03022B40F0AB8064259C4E42F21070EE -:1052000001F024F93B1D324601212046FFF77AFACE -:105210000028D5D17B68002B80F295805A0003D5F9 -:10522000236B43F010032363002204F108030221DF -:105230002046FFF72FFB02460028C1D104F13803B6 -:1052400003212046FFF776FA0028B9D104F11805AA -:10525000A26B092120462B46FFF71CFB0028AFD18B -:105260003B46A26B07212046FFF764FA064600285A -:10527000A6D1236B03F00F03022B40F093807E2214 -:105280007F21284603F0E8FA012840F28B8004F1E0 -:1052900048084FF47A7001F0D9F808234FF40072EF -:1052A000414620460096FFF713FB002888D1404670 -:1052B00003F020FB236BA06203F00F03022B77D1D6 -:1052C0003B1D6B4A06212046FFF734FA00286DD1BA -:1052D00065497B681940B1FA81F149092046FFF719 -:1052E000D7F93B464FF4007210212046FFF722FA0F -:1052F000054600287FF464AF5B4E3B6833427FF481 -:105300005FAF236B13F00E0F03F00F027BD0022A66 -:105310007FF456AFE36A1979012900F09E800229D3 -:1053200000F09E80002900F09180DFF85481204633 -:10533000FFF7CAF93B1D42467DE011462046226335 -:10534000FFF7D4F952E7013D7FF458AF38E7494DF4 -:105350006426494ADFF81081012B18BF15463B1D12 -:10536000002237212046FFF7E5F900287FF428AF17 -:105370007B6813EA080F7FF423AF3B1D2A462921DF -:105380002046FFF7BFF900287FF41AAF7B68002B97 -:10539000FFF644AF013E3FF413AF42F2107001F04C -:1053A00055F8DCE7284603F079FA83E7002195E712 -:1053B000E84690B07E227F21284602AE03F04CFAE8 -:1053C00010B90021C54689E7002340223146204616 -:1053D00000930623FFF77CFA0028F2D1B3895BBA69 -:1053E0009B07EED5254B40223146204600930623ED -:1053F000FFF76EFA0028E4D1317C01F00F010F397C -:1054000018BF0121DEE7E36A1979F9B101297FF4B8 -:10541000D7AE2046FFF758F93B1DA26B3721204637 -:10542000FFF788F900287FF4CBAE7B6833427FF426 -:10543000C7AE3B1D022206212046FFF77BF900285C -:105440007FF4BEAE7B6833427FF4BAAE052323718E -:1054500028460837BD46BDE8F081DFF8288066E7BA -:10546000DFF8248063E700BF08E0FFFD0080FFC095 -:105470000001B9030080FF5000001080F1FFFF80A1 -:105480000000B7030001B7030002B70337B50446B5 -:105490000C4D01ABA26B0D212046FFF74BF978B9FB -:1054A000019B2B420BD1C3F34323042B08D0053BB4 -:1054B000022B04D84FF47A7000F0C8FFE9E701200E -:1054C00003B030BD08E0FFFD70B52023054683F32F -:1054D000118803790024022B03D184F3118820461C -:1054E00070BD0423037184F311880226FFF7CEFFF9 -:1054F00004462846FFF7E2F82E71F0E7FFF74EB8B2 -:10550000044B03600123037100234363C0E90A33A2 -:10551000704700BF1491000810B52023044683F3A0 -:105520001188C162FFF756F802232371002383F329 -:10553000118810BD10B52023044683F31188FFF7AE -:1055400071F800230122E362227183F3118810BDF8 -:10555000026843681143016003B1184770470000B7 -:105560001430FFF711BD00004FF0FF331430FFF788 -:105570000BBD00003830FFF787BD00004FF0FF3350 -:105580003830FFF781BD00001430FFF7D7BC0000B2 -:105590004FF0FF311430FFF7D1BC00003830FFF777 -:1055A00031BD00004FF0FF323830FFF72BBD000057 -:1055B00000207047FFF7C0BA044B0360002343602C -:1055C000C0E9023301230374704700BF389100081B -:1055D00010B52023044683F31188FFF71DFB022337 -:1055E0002374002383F3118810BD000038B5C3690C -:1055F00004460D461BB904210844FFF7A9FF2946BC -:1056000004F11400FFF77EFC002806DA201D4FF499 -:105610008061BDE83840FFF79BBF38BD0268436832 -:105620001143016003B118477047000013B5406B88 -:1056300000F58054D4F8A4381A681178042914D1DC -:10564000017C022911D11979012312898B4013425F -:105650000BD101A94C3003F02DF8D4F8A448024630 -:10566000019B2179206800F0DFF902B010BD000035 -:10567000143002F0AFBF00004FF0FF33143002F0DF -:10568000A9BF00004C3003F081B800004FF0FF3399 -:105690004C3003F07BB80000143002F07DBF0000F6 -:1056A0004FF0FF31143002F077BF00004C3003F0B0 -:1056B0004DB800004FF0FF324C3003F047B8000007 -:1056C0000020704710B500F58054D4F8A4381A684B -:1056D0001178042917D1017C022914D159790123A9 -:1056E00052898B4013420ED1143002F00FFF024654 -:1056F00048B1D4F8A4484FF4407361792068BDE8FC -:10570000104000F07FB910BD406BFFF7DBBF000019 -:10571000704700007FB5124B012504260446036044 -:105720000023057400F1840243602946C0E9023376 -:105730000C4B0290143001934FF44073009602F02A -:10574000C1FE094B04F69442294604F14C00029430 -:10575000CDE900634FF4407302F088FF04B070BDE0 -:1057600060910008095700082D5600080A68202398 -:1057700083F311880B790B3342F823004B791333F1 -:1057800042F823008B7913B10B3342F8230000F564 -:105790008053C3F8A41802230374002383F31188F1 -:1057A0007047000038B5037F044613B190F85430B9 -:1057B000ABB90125201D0221FFF730FF04F11400D1 -:1057C0006FF00101257700F081FE04F14C0084F8B0 -:1057D00054506FF00101BDE8384000F077BE38BD8D -:1057E00010B5012104460430FFF718FF002323778A -:1057F00084F8543010BD000038B50446002514303C -:1058000002F078FE04F14C00257702F047FF201DDE -:1058100084F854500121FFF701FF2046BDE83840CD -:10582000FFF750BF90F8803003F06003202B06D1C3 -:1058300090F881200023212A03D81F2A06D80020AF -:105840007047222AFBD1C0E91D3303E0034A4267B7 -:1058500007228267C3670120704700BF44220020EF -:1058600037B500F58055D5F8A4381A6811780429A1 -:105870001AD1017C022917D11979012312898B4091 -:10588000134211D100F14C04204602F0C7FF58B179 -:1058900001A9204602F00EFFD5F8A4480246019B5C -:1058A0002179206800F0C0F803B030BD01F10B038E -:1058B000F0B550F8236085B004460D46FEB12023B4 -:1058C00083F3118804EB8507301D0821FFF7A6FE3E -:1058D000FB6806F14C005B691B681BB1019002F08C -:1058E000F7FE019803A902F0E5FE024648B1039BCA -:1058F0002946204600F098F8002383F3118805B06C -:10590000F0BDFB685A691268002AF5D01B8A013B7A -:105910001340F1D104F18002EAE70000133138B5F9 -:1059200050F82140ECB1202383F3118804F5805313 -:10593000D3F8A4281368527903EB8203DB689B69D0 -:105940005D6845B104216018FFF768FE294604F13F -:10595000140002F0E5FD2046FFF7B4FE002383F3B8 -:10596000118838BD7047000001F046BE0123402277 -:10597000002110B5044600F8303BFCF7B7F90023CE -:10598000C4E9013310BD000010B52023044683F3A1 -:1059900011882422416000210C30FCF7A7F9204631 -:1059A00001F04CFE02232370002383F3118810BD05 -:1059B00070B500EB8103054650690E461446DA6067 -:1059C00018B110220021FCF791F9A06918B110223A -:1059D0000021FCF78BF931462846BDE8704001F004 -:1059E0003FBF000083682022002103F0011310B59F -:1059F000044683601030FCF779F92046BDE810407A -:105A000001F0BABFF0B4012500EB810447898D4055 -:105A1000E4683D43A469458123600023A26063607C -:105A2000F0BC01F0D7BF0000F0B4012500EB810409 -:105A300007898D40E4683D43646905812360002344 -:105A4000A2606360F0BC02F04DB8000070B50223A4 -:105A500000250446242203702946C0F888500C30E3 -:105A600040F8045CFCF742F9204684F8705001F0DD -:105A70008BFE63681B6823B129462046BDE8704051 -:105A8000184770BD037880F88C3005230370436895 -:105A90001B6810B504460BB1042198470023A3608E -:105AA00010BD000090F88C20436802701B680BB199 -:105AB000052118477047000070B590F87030044613 -:105AC00013B1002380F8703004F18002204601F009 -:105AD00077FF63689B68B3B994F8803013F0600572 -:105AE00035D00021204602F021FA0021204602F0A4 -:105AF00011FA63681B6813B10621204698470623F4 -:105B000084F8703070BD204698470028E4D0B4F87F -:105B10008630A26F9A4288BFA36794F98030A56F40 -:105B2000002B4FF0200380F20381002D00F0F28063 -:105B3000092284F8702083F3118800212046D4E9DB -:105B40001D23FFF771FF002383F31188DAE794F830 -:105B5000812003F07F0343EA022340F202329342A2 -:105B600000F0C58021D8B3F5807F48D00DD8012B37 -:105B70003FD0022B00F09380002BB2D104F18802B9 -:105B800062670222A267E367C1E7B3F5817F00F095 -:105B90009B80B3F5407FA4D194F88230012BA0D133 -:105BA000B4F8883043F0020332E0B3F5006F4DD013 -:105BB00017D8B3F5A06F31D0A3F5C063012B90D8EF -:105BC0006368204694F882205E6894F88310B4F8E5 -:105BD0008430B047002884D0436863670368A367B4 -:105BE0001AE0B3F5106F36D040F6024293427FF4CC -:105BF00078AF5C4B63670223A3670023C3E794F885 -:105C00008230012B7FF46DAFB4F8883023F00203AB -:105C1000A4F88830C4E91D55E56778E7B4F880300A -:105C2000B3F5A06F0ED194F88230204684F88A3004 -:105C300001F008FE63681B6813B1012120469847F4 -:105C4000032323700023C4E91D339CE704F18B0375 -:105C500063670123C3E72378042B10D1202383F348 -:105C600011882046FFF7BEFE85F311880321636883 -:105C700084F88B5021701B680BB12046984794F82C -:105C80008230002BDED084F88B30042323706368CD -:105C90001B68002BD6D0022120469847D2E794F803 -:105CA000843020461D0603F00F010AD501F07AFE6C -:105CB000012804D002287FF414AF2B4B9AE72B4B1A -:105CC00098E701F061FEF3E794F88230002B7FF44F -:105CD00008AF94F8843013F00F01B3D01A062046B1 -:105CE00002D502F03BF9ADE702F02CF9AAE794F8EF -:105CF0008230002B7FF4F5AE94F8843013F00F015E -:105D0000A0D01B06204602D502F010F99AE702F057 -:105D100001F997E7142284F8702083F311882B4649 -:105D20002A4629462046FFF76DFE85F31188E9E6ED -:105D30005DB1152284F8702083F31188002120467C -:105D4000D4E91D23FFF75EFEFDE60B2284F87020E8 -:105D500083F311882B462A4629462046FFF764FE26 -:105D6000E3E700BF90910008889100088C9100083B -:105D700038B590F870300446002B3ED0063BDAB2BE -:105D80000F2A34D80F2B32D8DFE803F0373131082F -:105D9000223231313131313131313737856FB0F81D -:105DA00086309D4214D2C3681B8AB5FBF3F203FB15 -:105DB00012556DB9202383F311882B462A462946B4 -:105DC000FFF732FE85F311880A2384F870300EE065 -:105DD000142384F87030202383F311880023204695 -:105DE0001A461946FFF70EFE002383F3118838BDCB -:105DF000C36F03B198470023E7E70021204602F074 -:105E000095F80021204602F085F863681B6813B1FD -:105E10000621204698470623D7E7000010B590F8E2 -:105E200070300446142B29D017D8062B05D001D882 -:105E30001BB110BD093B022BFBD80021204602F00C -:105E400075F80021204602F065F863681B6813B1FD -:105E5000062120469847062319E0152BE9D10B238C -:105E600080F87030202383F3118800231A461946E6 -:105E7000FFF7DAFD002383F31188DAE7C3689B6933 -:105E80005B68002BD5D1C36F03B19847002384F81A -:105E90007030CEE70448054B03600023C0E90133AE -:105EA0000C3000F0DFB800BF384800208D890008B2 -:105EB000CB1D083A23F00703591A521A10B4D2081E -:105EC0000024C0E9004384600C301C605A605DF817 -:105ED000044B00F0C7B800002DE9F74F364FCD1D39 -:105EE0008846002818BF0746082A4FEAD50538BF5C -:105EF000082207F10C003C1D9146019000F0F2F8D9 -:105F0000019809F10701C9F1000E2246246864B91D -:105F100000F0F2F83B68CBB308224946E800984706 -:105F2000044698B340E9027830E004EB010CD4F861 -:105F300004A00CEA0E0C0AF10106ACF1080304EB14 -:105F4000C6069E42E1D9A6EB0C0CB5EBEC0F4FEA6E -:105F5000EC0BDAD89C421DD204F10802AB45A3EB4E -:105F600002024FEAE202626009D9691CED4303EBC9 -:105F7000C1025D445560256843F8315022601C46DB -:105F8000C3F8048044F8087B00F0B6F8204603B05C -:105F9000BDE8F08FAA45216802D111602346EEE7E3 -:105FA000013504EBC50344F8351003F10801761AF6 -:105FB000F6105E601360F1E73848002073B50446C0 -:105FC000A0F1080550F8080C54F8043C061D0C30EC -:105FD00007330190DB0844F8043C00F083F83346B3 -:105FE0000198B3421A6801D09D4228D90AB195425E -:105FF00025D244F8082C54F8042C1D60013254F8C2 -:10600000081C05EBC206B14206D14E68324444F882 -:10601000042C0A6844F8082C5E68711C03EBC1016B -:106020008D4207D154F8042C013232445A6054F89E -:10603000082C1A6002B0BDE8704000F05DB813464D -:10604000CFE700000B4610B51B68994203D09C684F -:1060500082689442F8D25A680360426010605860C7 -:1060600010BD00000023C0E9000083600361704799 -:1060700038B504461A4B80689D6948B3A84212D1CE -:1060800023690133236138BD836090F820307BB1F0 -:10609000062B13D1416AD0E9003213605A60FFF732 -:1060A000D1FF436A9868AB6882689A42ECD305E0F6 -:1060B000D0E9003213605A6000F05AF828462146B1 -:1060C000FFF7C0FF6C620620BDE8384000F092B8D0 -:1060D0002369A56001332361EB6AE360EC62D2E7D8 -:1060E0005848002008B5202383F31188FFF7C0FF2C -:1060F000002383F3118808BD174B10B5996920233D -:1061000083F311880269013A0261B2B90468C36875 -:106110008442CB621ED00A6B9BB901238A60036163 -:1061200003681A6802605060DA6A8360C260D862ED -:10613000184600F01DF800F0C9F8002383F3118819 -:1061400010BD1C68A34203D0A468A24238BF2246F7 -:10615000DB68E1E7A260F0E758480020034B00222B -:10616000C3E900339A60C3E90433704758480020FC -:106170000023826880F82030054B1B6899689142A3 -:10618000FBD25A680360426010605860704700BFDD -:106190005848002008B5202383F3118890F8203058 -:1061A000032B05D0042B0DD02BB983F3118808BD28 -:1061B000436A00221A604FF0FF334362FFF7D8FFB3 -:1061C0000023F2E7D0E9003213605A60F3E70000E1 -:1061D0000023826880F82030054B1B689968914243 -:1061E000FBD85A680360426010605860704700BF77 -:1061F00058480020064B996981F820001868026809 -:1062000053601A609861012380F82030FAF764BA6D -:10621000584800204B1C30B5044687B00A4D10D0BA -:10622000AB6901A8094A00F06DF92046FFF7E2FFCB -:10623000049B13B101A800F0A1F9AB69586A07B03B -:1062400030BDFFF7D7FFF8E75848002095610008F8 -:1062500038B50C4D04464162AB6981689A68914239 -:1062600003D8BDE83840FFF783BF1846FFF7B0FFFB -:1062700001230146AC61204684F82030BDE8384057 -:10628000FAF72ABA58480020044B1A689B699068AC -:106290009B68984294BF0020012070475848002016 -:1062A00010B5094C2368A0691A6854602260012265 -:1062B000A36183F82020FFF78BFF0146A069BDE8AA -:1062C0001040FAF709BA00BF5848002008B5FFF798 -:1062D000DBFF18B1BDE80840FFF7E2BF08BD0000D2 -:1062E000FFF7DEBFFEE7000010B50F4CFFF736FFEB -:1062F00000F0FAF802F02CFBFFF7CCFD80220B49EE -:10630000204600F03DF8012344F8180C002480F8E2 -:106310002030C46101F04EF884F3118862B604485D -:10632000BDE8104000F05CB888480020A494000844 -:106330009C91000800F05CB9EFF3118020B9EFF3F5 -:106340000583202282F311887047000010B530B910 -:10635000EFF30584C4F3080414B180F3118810BD71 -:10636000FFF7B4FF84F31188F9E70000034A51688E -:1063700053685B1A9842FBD8704700BF001000E0DA -:106380008260026300228161C262022202840122D1 -:1063900080F82220044A516902614161086150611C -:1063A00000F128028262704758480020D0E901239A -:1063B000016843F81C2CA3F19C0243F82C2C0269C1 -:1063C00043F85C2C426943F8582C044A43F83C2CAF -:1063D000C268A3F13800FFF7D3BF00BFF106000881 -:1063E00010B5202383F31188FFF7E0FF0021044656 -:1063F000FFF72EFF002383F31188204610BD000015 -:1064000038B50E4B9C6904F128056062A06AA84269 -:106410000FD194F822303BB994F821309B0702BF8A -:10642000D4E9043213615A610F20BDE83840FFF708 -:10643000E1BE0368A362FFF79BFEE7E75848002030 -:10644000202383F31188FFF7DBBF000008B5014666 -:10645000202383F311880820FFF7DCFE002383F359 -:10646000118808BD054B9B6921B103605862032068 -:10647000FFF7D0BE4FF0FF30704700BF58480020F4 -:1064800003682BB10022026018465962FFF770BE04 -:106490007047000049B1064B42689B6918605A601A -:1064A000136043600420FFF7B5BE4FF0FF30704724 -:1064B000584800200368984206D01A68026050606D -:1064C00018465962FFF754BE7047000038B50446BD -:1064D0000D462068844200D138BD036823605C60AB -:1064E0004562FFF745FEF4E7054B4FF0FF3103F13E -:1064F0001C02C3E907220022C3E90912704700BF4A -:106500005848002070B51C4E05460C46C0E90323D0 -:1065100002F018FA334653F81C2F9A420DD1B0629C -:106520000A2C2CBF00190A302A60C5E90124C6E9EB -:106530000755BDE8704002F0EFB9B16A431AE3189D -:1065400038BF1C469368A34202D9081902F0F4F937 -:10655000F3699A6894420CD85A68AC602B606A6000 -:1065600015609A685D60121B9A604FF0FF3373628A -:1065700070BDA41A1B68ECE75848002038B51B4CC6 -:10658000E36998420DD08168D0E9003213605A6007 -:106590000022C2609A680A449A604FF0FF33636237 -:1065A00038BD03682246002142F81C3F93425A60DE -:1065B000C16003D1BDE8384002F0B8B99A6881687B -:1065C000A56A0A449A6002F0BDF9E369411B9A6822 -:1065D0008A42E5D9AB181D1AA06A092D98BF01F1AE -:1065E0000A02BDE83840104402F0A6B9584800201D -:1065F0002DE9F041184C002704F11C06E56902F072 -:10660000A1F9A36AAA68C11A8A4215D81344D5F819 -:106610000C80A362D5E9003213605A60E369EF6031 -:10662000B34201D102F082F987F311882869C0478B -:10663000202383F31188E1E7E169B14209D01344D3 -:106640001B1ABDE8F0410A2B2CBFC0180A3002F01B -:1066500073B9BDE8F08100BF5848002010B558B9A3 -:1066600006480479053C18BF012400F035F908B14B -:1066700044F00404204610BD0124FBE7A0360020AE -:10668000FFF7ECBF2DE9F8430F461646994604463E -:10669000B0B9DFF8348098F80450052D05D00324F4 -:1066A0000BE0013D15F0FF050CD04B463A46314654 -:1066B0004046FEF727FD0028F3D12046BDE8F883C9 -:1066C0000424FAE70124F8E7A03600202DE9F84376 -:1066D0000F46164699460446B0B9DFF8348098F85C -:1066E0000450052D05D003240BE0013D15F0FF05F6 -:1066F0000CD04B463A4631464046FEF717FD00287F -:10670000F3D12046BDE8F8830424FAE70124F8E732 -:10671000A036002070B9012905D0032907D000292F -:1067200018BF04207047044B9B6A136070474FF4F6 -:106730008073FAE704207047A036002000F0F2BB17 -:1067400000F02CBC00207047FEE7000070470000FE -:106750004FF0FF30704700004B6843608B688360E8 -:10676000CB68C3600B6943614B6903628B69436209 -:106770000B6803607047000008B53C4B40F2FF71A6 -:106780003B48D3F888200A43C3F88820D3F88820F0 -:1067900022F4FF6222F00702C3F88820D3F8882091 -:1067A000D3F8E0200A43C3F8E020D3F808210A43D5 -:1067B000C3F808212F4AD3F808311146FFF7CCFF60 -:1067C00000F5806002F11C01FFF7C6FF00F5806054 -:1067D00002F13801FFF7C0FF00F5806002F15401BB -:1067E000FFF7BAFF00F5806002F17001FFF7B4FF18 -:1067F00000F5806002F18C01FFF7AEFF00F58060CC -:1068000002F1A801FFF7A8FF00F5806002F1C401C2 -:10681000FFF7A2FF00F5806002F1E001FFF79CFFA7 -:1068200000F5806002F1FC01FFF796FF02F58C7124 -:1068300000F58060FFF790FF01F014FC0E4BD3F8D9 -:10684000902242F00102C3F89022D3F8942242F041 -:106850000102C3F894220522C3F898204FF0605239 -:10686000C3F89C20054AC3F8A02008BD0044025884 -:1068700000000258B491000800ED00E01F0008037A -:1068800008B501F00BFEFFF72FFD104BD3F8DC200D -:1068900042F04002C3F8DC20D3F8042122F0400289 -:1068A000C3F80421D3F80431094B1A6842F00802F6 -:1068B0001A601A6842F004021A6000F049FD00F004 -:1068C00035FBBDE8084000F0B5B800BF00440258F1 -:1068D00000180248012070470020704770470000F0 -:1068E00002290CD0032904D00129074818BF002031 -:1068F0007047032A05D8054800EBC20070470448DA -:1069000070470020704700BFB89300085422002051 -:106910006C93000870B59AB005460846144601A964 -:1069200000F0C2F801A8FBF7D9F9431C0022C6B257 -:106930005B001046C5E9003423700323023404F8D9 -:10694000013C01ABD1B202348E4201D81AB070BD05 -:1069500013F8011B013204F8010C04F8021CF1E7E2 -:1069600008B5202383F311880348FEF779FF00233D -:1069700083F3118808BD00BF504A002090F8803092 -:1069800003F01F02012A07D190F881200B2A03D1BE -:106990000023C0E91D3315E003F06003202B08D16C -:1069A000B0F884302BB990F88120212A03D81F2A0F -:1069B00004D8FEF737BF222AEBD0FAE7034A426732 -:1069C00007228267C3670120704700BF4B22002067 -:1069D00007B5052917D8DFE801F0191603191920A2 -:1069E000202383F31188104A01210190FEF7E0FF74 -:1069F000019802210D4AFEF7DBFF0D48FEF7FCFE71 -:106A0000002383F3118803B05DF804FB202383F394 -:106A100011880748FEF7C6FEF2E7202383F31188AA -:106A20000348FEF7DDFEEBE70C9300083093000807 -:106A3000504A002038B50C4D0C4C2A460C4904F144 -:106A40000800FFF767FF05F1CA0204F110000949C9 -:106A5000FFF760FF05F5CA7204F118000649BDE8AA -:106A60003840FFF757BF00BF2863002054220020A2 -:106A7000E8920008F29200080193000870B50446FD -:106A800008460D46FBF72AF9C6B2204601340378C2 -:106A90000BB9184670BD32462946FBF70BF90028A2 -:106AA000F3D10120F6E700002DE9F04705460C463A -:106AB000FBF714F92B49C6B22846FFF7DFFF08B1F0 -:106AC0000E36F6B228492846FFF7D8FF08B110362F -:106AD000F6B2632E0BD8DFF88C80DFF88C90234F52 -:106AE000DFF894A02E7846B92670BDE8F0872946D5 -:106AF0002046BDE8F04702F033B8252E2ED10722FC -:106B000041462846FBF7D6F870B9194B224603F1E7 -:106B1000140153F8040B8B4242F8040BF9D11B7893 -:106B2000073515341370DDE7082249462846FBF780 -:106B3000C1F898B9A21C0F4B197802320909C95D36 -:106B400002F8041C13F8011B01F00F015345C95D45 -:106B500002F8031CF0D118340835C3E7013504F8F6 -:106B6000016BBFE7D893000801930008F693000873 -:106B7000E093000800E8F11F0CE8F11FBFF34F8F0E -:106B8000044B1A695107FCD1D3F810215207F8D1F0 -:106B9000704700BF0020005208B50D4B1B78ABB901 -:106BA000FFF7ECFF0B4BDA68D10704D50A4A5A60AD -:106BB00002F188325A60D3F80C21D20706D5064A72 -:106BC000C3F8042102F18832C3F8042108BD00BFD4 -:106BD00086650020002000522301674508B5114B4F -:106BE0001B78F3B9104B1A69510703D5DA6842F0E4 -:106BF0004002DA60D3F81021520705D5D3F80C21F2 -:106C000042F04002C3F80C21FFF7B8FF064BDA68E8 -:106C100042F00102DA60D3F80C2142F00102C3F81D -:106C20000C2108BD86650020002000520F289ABF65 -:106C300000F5806040040020704700004FF40030F1 -:106C400070470000102070470F2808B50BD8FFF7D9 -:106C5000EDFF00F500330268013204D104308342B5 -:106C6000F9D1012008BD0020FCE700000F2870B515 -:106C7000054645D8FFF760FB224CFFF77FFF06462D -:106C8000FFF78AFF4FF0FF33072D6361C4F814311B -:106C900020D82361FFF772FF2B0243F02403E36047 -:106CA000E36843F08003E36023695A07FCD4284675 -:106CB000FFF764FF4FF40031FFF7B8FF00F0A2FACE -:106CC0003046FFF78BFFFFF741FB2846BDE87040D9 -:106CD000FFF7BABFC4F81031FFF750FFA5F1080362 -:106CE0001B0243F02403C4F80C31D4F80C3143F0F8 -:106CF0008003C4F80C31D4F810315B07FBD4D6E71D -:106D0000002070BD002000522DE9F84F40EA020338 -:106D100005460C461746D80602D00020BDE8F88F7D -:106D200027F01F07DFF8D4B0FFF736FF2744BC4237 -:106D300003D10120FFF752FFF0E720222946204629 -:106D400001F0A0FE10B920352034F0E72B4605F104 -:106D500020021E68711CE0D104339A42F9D1FFF77A -:106D6000EBFA05F17843234AB3F5801F224B28BF85 -:106D70009A4603F1040338BF9046A2F1080228BFE7 -:106D80009846A3F108033ABF9146DA469946FFF7C1 -:106D9000F5FEC8F80060A5EB040CD9F8002004F15A -:106DA0001C0142F00202C9F80020221FDAF800603C -:106DB00016F00506FAD152F8043F8A424CF8023028 -:106DC000F4D1BFF34F8FFFF7D9FE4FF0FF32C8F871 -:106DD0000020D9F8002022F00202C9F80020FFF7B5 -:106DE000B5FA20222146284601F04CFE0028AAD000 -:106DF00030469FE71420005210210052102000520C -:106E000010B5084C237828B11BB9FFF7C5FE012344 -:106E1000237010BD002BFCD02070BDE81040FFF7A0 -:106E2000DDBE00BF866500202DE9F74F0E46054602 -:106E3000002863D011F0050762D139B9082229462C -:106E40003046FFF749F80446002847D108224FF0A2 -:106E50000109DFF8C08006F00403DFF8BCA006EAF1 -:106E6000090BBBF1000F27D0D8F81410C80723D4A2 -:106E700009F1010908F10C08B9F1060FF1D18FB938 -:106E8000224E2946F0190092FFF726F8044628BB47 -:106E90002037009AA02FF4D12946FFF71DF80446A9 -:106EA000E0B9009A29461A48FFF716F8044600BBD5 -:106EB000204603B0BDE8F08FA3B1D8F8141011F04C -:106EC000040FD5D029460AEB4910CDE90023FFF77E -:106ED00003F80446DDE900230028C9D02A46002132 -:106EE000204608E0B107EDD5D8F8141011F0020FD4 -:106EF000E7E72A460021FAF7F9FED9E70446D7E783 -:106F00001F35202225F01F05A1E700BFC86500201E -:106F10008865002008940008A86500200021FFF77C -:106F200083BF00000121FFF77FBF000070B5144D43 -:106F30000124144E40F2FF3200210120FAF7D6FE60 -:106F400006EB441001342A6955F80C1FFEF7B0FF18 -:106F5000062CF5D137254FF4C0542046FFF7E2FF49 -:106F6000014628B122460848BDE87040FEF7A0BFA0 -:106F7000C4EBC404013D4FEAD404EED170BD00BFA0 -:106F800008940008A8650020886500200421FFF708 -:106F90004BBF00004843FFF7C1BF000008B1FFF737 -:106FA0000DB8704770B5104E82B0FFF7C5F90546B1 -:106FB00001F0C8FC326803469042336037BF0B4A89 -:106FC0000A495168146836BF0131D1E90041516066 -:106FD0000419284641F100010191FFF7B7F9204655 -:106FE000019902B070BD00BF686600207066002085 -:106FF00008B5FFF7D7FF034AD2E90032C01842EBC9 -:10700000010108BD78660020434BD3E900232DE938 -:10701000F34113437CD0FFF7EBFF404A00230027E6 -:10702000F9F73EF906460D463D4A0023F9F738F9CF -:107030000023144630462946394AF9F731F94FF40E -:1070400061613C23ADF80170B4FBF1F5B4FBF3F6DC -:1070500001FB154103FB16464624B1FBF3F1314B0E -:10706000F6B28DF8004098423CD84FF0640C4FF4D3 -:10707000C87EA30704F26C7225D1B2FBFCF30CFBB3 -:10708000132313BBB2FBFEF30EFB1322B2FA82F3FF -:107090005B0903F26D18621C8045D2B217D90FB19B -:1070A0008DF800400022204C4FF00C0C17460CFBD2 -:1070B0000343D4B2013213F804C084450CD8A0EBCA -:1070C0000C000127F5E70023E3E70123E1E7A0EB4C -:1070D000080014460127CCE70FB18DF80140431C8E -:1070E0008DF802309DF80100431C9DF800005038D7 -:1070F000400640EA43509DF8023040EA034040EA2F -:10710000560040EAC52040EA411002B0BDE8F081D7 -:107110004FF40410F9E700BF7866002040420F00EA -:107120008051010090230B00509400080244074B4B -:10713000D2B210B5904200D110BD441C00B253F839 -:10714000200041F8040BE0B2F4E700BF50400058C3 -:107150000E4B30B51C6F240405D41C6F1C671C6FCC -:1071600044F400441C670A4C02442368D2B243F43E -:1071700080732360074B904200D130BD441C51F80E -:10718000045B00B243F82050E0B2F4E70044025838 -:10719000004802585040005807B5012201A90020BC -:1071A000FFF7C4FF019803B05DF804FB13B5044674 -:1071B000FFF7F2FFA04205D0012201A900200194AF -:1071C000FFF7C6FF02B010BD10B56424013C4FF4B8 -:1071D0007A70FFF73BF914F0FF04F7D1084B4FF03A -:1071E000807214249A6103F5805308229A61013C4D -:1071F0004FF47A70FFF72AF914F0FF04F7D110BDAD -:10720000000002580144BFF34F8F064B884204D35D -:10721000BFF34F8FBFF36F8F7047C3F85C0220300E -:10722000F4E700BF00ED00E00144BFF34F8F064BD1 -:10723000884204D3BFF34F8FBFF36F8F7047C3F8FB -:1072400070022030F4E700BF00ED00E070B50546A5 -:1072500016460C4601201021FFF79CFE286046735D -:107260003CB1204636B1FFF791FE2B68186000B1A3 -:107270009C6070BDFFF756FEF7E7000070B50E4644 -:107280001546044600B30B6843608368934210D2EE -:1072900013B10068FFF782FE637B28462BB1FFF72E -:1072A00075FE206020B9A06070BDFFF73BFEF8E7D7 -:1072B000A560206805F11F01306021F01F01FFF774 -:1072C000A1FF01202073EFE70120EDE710B5044690 -:1072D00040B10068884205D1606808B1FAF7E0FC67 -:1072E0000023237310BD000070B50E4615460446FA -:1072F00020B38368934210D213B10068FFF74EFEAB -:10730000637B28462BB1FFF741FE206020B9A060C7 -:1073100070BDFFF707FEF8E7A560316819B12A468E -:107320002068FAF7BDFC206805F11F01306021F0EC -:107330001F01FFF779FF01202073E9E70120E7E74C -:1073400020B103688B4204BF002303737047000021 -:10735000034B1A681AB9034AD2F8D0241A6070474E -:10736000806600200040025808B5FFF7F1FF024B8D -:107370001868C0F3806008BD80660020CAB201466C -:107380000120FFF7E5BE0000CAB201460120FFF769 -:10739000CDBE0000EFF30983054968334A6B22F044 -:1073A00001024A6383F30988002383F3118870473D -:1073B00000EF00E0202080F3118862B60D4B0E4AEA -:1073C000D96821F4E0610904090C0A430B49DA6029 -:1073D000D3F8FC2042F08072C3F8FC20084AC2F8BF -:1073E000B01F116841F0010111601022DA7783F8B3 -:1073F0002200704700ED00E00003FA0555CEACC551 -:10740000001000E0202310B583F311880E4B5B6859 -:1074100013F4006314D0F1EE103AEFF309844FF047 -:107420008073683CE361094BDB6B236684F3098856 -:10743000FEF72AFF10B1064BA36110BD054BFBE719 -:1074400083F31188F9E700BF00ED00E000EF00E0F2 -:10745000030700080607000870B5BFF34F8FBFF39E -:107460006F8F1A4A0021C2F85012BFF34F8FBFF33B -:107470006F8F536943F400335361BFF34F8FBFF3F2 -:107480006F8FC2F88410BFF34F8FD2F8803043F66D -:10749000E074C3F3C900C3F34E335B0103EA04068F -:1074A000014646EA81750139C2F86052F9D2203BA3 -:1074B00013F1200FF2D1BFF34F8F536943F48033A0 -:1074C0005361BFF34F8FBFF36F8F70BD00ED00E0CE -:1074D000FEE700000A4B0B480B4A90420BD30B4BC4 -:1074E000C11EDA1C121A22F003028B4238BF00229E -:1074F0000021FAF7FBBB53F8041B40F8041BECE730 -:10750000A09500086468002064680020646800207A -:107510007047000070B5D0E9244300224FF0FF35DA -:107520009E6804EB42135101D3F80009002805DAE4 -:10753000D3F8000940F08040C3F80009D3F8000BED -:10754000002805DAD3F8000B40F08040C3F8000BA8 -:10755000013263189642C3F80859C3F8085BE0D2B9 -:107560004FF00113C4F81C3870BD000000EB81031C -:10757000D3F80CC02DE9F043DCF814204E1CD0F8F1 -:107580009050D2F800E005EB063605EB4118506844 -:1075900070450AD30122D5F8343802FA01F123EA02 -:1075A0000101C5F83418BDE8F083AEEB0003BCF868 -:1075B0001040A34228BF2346D8F81849A4B2B3EB21 -:1075C000840FF0D89468A4F1040959F8047F376057 -:1075D000A4EB09071F44042FF7D81C44034494600C -:1075E0005360D4E7890141F02001016103699B06E2 -:1075F000FCD41220FEF7BABE10B50A4C2046FEF7A6 -:10760000B5F9094BC4F89030084BC4F89430084CD5 -:107610002046FEF7ABF9074BC4F89030064BC4F890 -:10762000943010BD84660020000008408C9400084F -:1076300020670020000004409894000870B503788B -:107640000546012B5DD1494BD0F89040984259D165 -:10765000474B0E216520D3F8D82042F00062C3F8D2 -:10766000D820D3F8002142F00062C3F80021D3F8FB -:107670000021D3F8802042F00062C3F88020D3F8C4 -:10768000802022F00062C3F88020D3F88030FDF71C -:10769000BBFB384BE360384BC4F800380023D5F807 -:1076A0009060C4F8003EC02323604FF40413A3632A -:1076B0003369002BFCDA01230C203361FEF756FE00 -:1076C0003369DB07FCD41220FEF750FE3369002B30 -:1076D000FCDA00262846A660FFF71CFF6B68C4F89A -:1076E0001068DB68C4F81468C4F81C68002B3AD131 -:1076F000224BA3614FF0FF336361A36843F00103A2 -:10770000A36070BD1E4B9842C8D1194B0E214D206D -:10771000D3F8D82042F00072C3F8D820D3F8002163 -:1077200042F00072C3F80021D3F80021D3F8802082 -:1077300042F00072C3F88020D3F8802022F000725B -:10774000C3F88020D3F88020D3F8D82022F08062BC -:10775000C3F8D820D3F8002122F08062C3F80021BA -:10776000D3F8003193E7074BC3E700BF84660020DE -:10777000004402584014004003002002003C30C086 -:1077800020670020083C30C0F8B5D0F8904005468E -:1077900000214FF000662046FFF724FFD5F8941033 -:1077A00000234FF001128F684FF0FF30C4F83438D7 -:1077B000C4F81C2804EB431201339F42C2F800694D -:1077C000C2F8006BC2F80809C2F8080BF2D20B68C5 -:1077D000D5F89020C5F898306362102313611669BC -:1077E00016F01006FBD11220FEF7C0FDD4F80038C9 -:1077F00023F4FE63C4F80038A36943F4402343F044 -:107800001003A3610923C4F81038C4F814380B4BD3 -:10781000EB604FF0C043C4F8103B094BC4F8003B89 -:10782000C4F81069C4F80039D5F8983003F1100293 -:1078300043F48013C5F89820A362F8BD689400084B -:1078400040800010D0F8902090F88A10D2F80038CC -:1078500023F4FE6343EA0113C2F8003870470000C6 -:107860002DE9F84300EB8103D0F890500C46804698 -:10787000DA680FFA81F94801166806F00306731EEC -:10788000022B05EB41134FF0000194BFB604384EB4 -:10789000C3F8101B4FF0010104F1100398BF06F16B -:1078A000805601FA03F3916998BF06F50046002956 -:1078B0003AD0578A04F15801374349016F50D5F83F -:1078C0001C180B430021C5F81C382B180127C3F8DE -:1078D0001019A7405369611E9BB3138A928B9B08B2 -:1078E000012A88BF5343D8F89820981842EA0343E6 -:1078F00001F140022146C8F89800284605EB8202B3 -:107900005360FFF76FFE08EB8900C3681B8A43EAE8 -:10791000845348341E4364012E51D5F81C381F434C -:10792000C5F81C78BDE8F88305EB4917D7F8001BAC -:1079300021F40041C7F8001BD5F81C1821EA030305 -:10794000C0E704F13F030B4A2846214605EB8303B9 -:107950005A60FFF747FE05EB4910D0F8003923F4D1 -:107960000043C0F80039D5F81C3823EA0707D7E7E9 -:107970000080001000040002D0F894201268C0F8C3 -:107980009820FFF7C7BD00005831D0F8903049016A -:107990005B5813F4004004D013F4001F0CBF022006 -:1079A000012070474831D0F8903049015B5813F4FA -:1079B000004004D013F4001F0CBF022001207047C8 -:1079C00000EB8101CB68196A0B6813604B68536048 -:1079D0007047000000EB810330B5DD68AA691368C9 -:1079E000D36019B9402B84BF402313606B8A14689D -:1079F000D0F890201C4402EB4110013C09B2B4FBCA -:107A0000F3F46343033323F0030343EAC44343F033 -:107A1000C043C0F8103B2B6803F00303012B0ED1C9 -:107A2000D2F8083802EB411013F4807FD0F8003B05 -:107A300014BF43F0805343F00053C0F8003B02EB07 -:107A40004112D2F8003B43F00443C2F8003B30BD82 -:107A50002DE9F041D0F8906005460C4606EB411345 -:107A6000D3F8087B3A07C3F8087B08D5D6F8143852 -:107A70001B0704D500EB8103DB685B689847FA07B6 -:107A80001FD5D6F81438DB071BD505EB8403D9685E -:107A9000CCB98B69488A5A68B2FBF0F600FB162213 -:107AA0008AB91868DA6890420DD2121AC3E9002424 -:107AB000202383F3118821462846FFF78BFF84F3A8 -:107AC0001188BDE8F081012303FA04F26B8923EAEF -:107AD00002036B81CB68002BF3D021462846BDE81A -:107AE000F041184700EB81034A0170B5DD68D0F81A -:107AF00090306C692668E66056BB1A444FF400204B -:107B0000C2F810092A6802F00302012A0AB20ED153 -:107B1000D3F8080803EB421410F4807FD4F800096E -:107B200014BF40F0805040F00050C4F8000903EB4F -:107B30004212D2F8000940F00440C2F800090122C4 -:107B4000D3F8340802FA01F10143C3F8341870BDC8 -:107B500019B9402E84BF4020206020681A442E8A24 -:107B60008419013CB4FBF6F440EAC44040F00050F4 -:107B7000C6E700002DE9F041D0F8906004460D46BC -:107B800006EB4113D3F80879C3F80879FB071CD535 -:107B9000D6F81038DA0718D500EB8103D3F80CC0FB -:107BA000DCF81430D3F800E0DA6896451BD2A2EB7B -:107BB0000E024FF000081A60C3F80480202383F3FC -:107BC0001188FFF78FFF88F311883B0618D5012332 -:107BD000D6F83428AB40134212D029462046BDE8DF -:107BE000F041FFF7C3BC012303FA01F2038923EA42 -:107BF00002030381DCF80830002BE6D09847E4E765 -:107C0000BDE8F0812DE9F84FD0F8905004466E6938 -:107C1000AB691E4016F480586E6103D0BDE8F84F82 -:107C2000FDF714BF002E12DAD5F8003E9F0705D0ED -:107C3000D5F8003E23F00303C5F8003ED5F804381C -:107C4000204623F00103C5F80438FDF72BFF30056B -:107C500005D52046FFF75EFC2046FDF713FFB10473 -:107C60000CD5D5F8083813F0060FEB6823F47053E1 -:107C70000CBF43F4105343F4A053EB60320704D518 -:107C80006368DB680BB120469847F30200F1BA80C5 -:107C9000B70226D5D4F8909000274FF0010A09EBDF -:107CA0004712D2F8003B03F44023B3F5802F11D1E3 -:107CB000D2F8003B002B0DDA62890AFA07F322EAB8 -:107CC0000303638104EB8703DB68DB6813B1394688 -:107CD000204698470137D4F89430FFB29B689F4202 -:107CE000DDD9F00619D5D4F89000026AC2F30A175C -:107CF00002F00F0302F4F012B2F5802F00F0CC80F6 -:107D0000B2F5402F09D104EB8303002200F5805027 -:107D1000DB681B6A974240F0B2803003D5F81858F0 -:107D200035D5E90303D500212046FFF791FEAA03CC -:107D300003D501212046FFF78BFE6B0303D50221FB -:107D40002046FFF785FE2F0303D503212046FFF7CA -:107D50007FFEE80203D504212046FFF779FEA90241 -:107D600003D505212046FFF773FE6A0203D50621DD -:107D70002046FFF76DFE2B0203D507212046FFF7B3 -:107D800067FEEF0103D508212046FFF761FE70036F -:107D900040F1A980E90703D500212046FFF7EAFE5C -:107DA000AA0703D501212046FFF7E4FE6B0703D5A0 -:107DB00002212046FFF7DEFE2F0703D503212046D0 -:107DC000FFF7D8FEEE0603D504212046FFF7D2FECA -:107DD000A80603D505212046FFF7CCFE690603D58A -:107DE00006212046FFF7C6FE2A0603D507212046B6 -:107DF000FFF7C0FEEB0576D520460821BDE8F84F19 -:107E0000FFF7B8BED4F8909000274FF0010AD4F8DD -:107E100094305FFA87FB9B689B453FF639AF09EBCF -:107E20004B13D3F8002902F44022B2F5802F24D15D -:107E3000D3F80029002A20DAD3F8002942F0904232 -:107E4000C3F80029D3F80029002AFBDB5946D4F8EF -:107E50009000FFF7C7FB22890AFA0BF322EA03031B -:107E6000238104EB8B03DB689B6813B159462046E2 -:107E7000984759462046FFF779FB0137C7E7910736 -:107E800001D1D0F80080072A02F101029CBF03F85B -:107E9000018B4FEA18283DE704EB830300F580507F -:107EA000DA68D2F818C0DCF80820DCE9001CA1EB85 -:107EB0000C0C00218F4208D1DB689B699A683A4418 -:107EC0009A605A683A445A6027E711F0030F01D1CB -:107ED000D0F800808C4501F1010184BF02F8018BCC -:107EE0004FEA1828E6E7BDE8F88F000008B5034818 -:107EF000FFF788FEBDE80840FFF784BA84660020DB -:107F000008B50348FFF77EFEBDE80840FFF77ABAE0 -:107F100020670020D0F8903003EB4111D1F8003BEE -:107F200043F40013C1F8003B70470000D0F89030D4 -:107F300003EB4111D1F8003943F40013C1F80039C3 -:107F400070470000D0F8903003EB4111D1F8003BAE -:107F500023F40013C1F8003B70470000D0F89030C4 -:107F600003EB4111D1F8003923F40013C1F80039B3 -:107F7000704700003A4B4FF0FF31D3F8802062F099 -:107F80000042C3F88020D3F8802002F00042C3F8FA -:107F90008020D3F88020D3F88420C3F88410D3F84D -:107FA00084200022C3F88420D3F88400D86F40F0E6 -:107FB000FF4040F4FF0040F43F5040F03F00D867DE -:107FC000D86F20F0FF4020F4FF0020F43F5020F055 -:107FD0003F00D867D86FD3F888006FEA40506FEA47 -:107FE0005050C3F88800D3F88800C0F30A00C3F8E3 -:107FF0008800D3F88800D3F89000C3F89010D3F825 -:108000009000C3F89020D3F89000D3F89400C3F800 -:108010009410D3F89400C3F89420D3F89400D3F8C4 -:108020009800C3F89810D3F89800C3F89820D3F8B4 -:108030009800D3F88C00C3F88C10D3F88C00C3F8E8 -:108040008C20D3F88C00D3F89C00C3F89C10D3F894 -:108050009C10C3F89C20D3F89C3000F0E7B900BF17 -:1080600000440258614B0122C3F80821604BD3F849 -:10807000F42042F00202C3F8F420D3F81C2142F0AD -:108080000202C3F81C210422D3F81C31594BDA60D8 -:108090005A689104FCD5584A1A6001229A60574ADE -:1080A000DA6000221A614FF440429A61514B9A699A -:1080B0009204FCD51A6842F480721A604C4B1A6F15 -:1080C00012F4407F04D04FF480321A6700221A67FE -:1080D0001A6842F001021A60454B1A685007FCD535 -:1080E00000221A611A6912F03802FBD101211960CD -:1080F0004FF0804159605A67414ADA62414A1A6139 -:108100001A6842F480321A60394B1A689103FCD520 -:108110001A6842F480521A601A689204FCD53A4AEE -:108120003A499A6200225A6319633949DA639963BA -:108130005A64384A1A64384ADA621A6842F0A85215 -:108140001A602B4B1A6802F02852B2F1285FF9D15D -:1081500048229A614FF48862DA6140221A622F4AFB -:10816000DA644FF080521A652D4A5A652D4A9A6595 -:1081700032232D4A1360136803F00F03022BFAD148 -:108180001B4B1A6942F003021A611A6902F03802A5 -:10819000182AFAD1D3F8DC2042F00052C3F8DC20D0 -:1081A000D3F8042142F00052C3F80421D3F804218B -:1081B000D3F8DC2042F08042C3F8DC20D3F804215D -:1081C00042F08042C3F80421D3F80421D3F8DC2024 -:1081D00042F00042C3F8DC20D3F8042142F0004210 -:1081E000C3F80421D3F80431704700BF0080005168 -:1081F000004402580048025800C000F0040000018A -:108200000000FF010088900832206000630209012D -:108210001D02040047040508FD0BFF01200000209B -:108220000010E00000010100002000524FF0B042B9 -:1082300008B5D2F8883003F00103C2F8883023B1C2 -:10824000044A13680BB150689847BDE80840FFF72F -:10825000D9B800BFDC6700204FF0B04208B5D2F8B3 -:10826000883003F00203C2F8883023B1044A9368CF -:108270000BB1D0689847BDE80840FFF7C3B800BF0E -:10828000DC6700204FF0B04208B5D2F8883003F028 -:108290000403C2F8883023B1044A13690BB1506952 -:1082A0009847BDE80840FFF7ADB800BFDC67002085 -:1082B0004FF0B04208B5D2F8883003F00803C2F896 -:1082C000883023B1044A93690BB1D0699847BDE85F -:1082D0000840FFF797B800BFDC6700204FF0B042BE -:1082E00008B5D2F8883003F01003C2F8883023B103 -:1082F000044A136A0BB1506A9847BDE80840FFF77B -:1083000081B800BFDC6700204FF0B04310B5D3F850 -:10831000884004F47872C3F88820A30604D5124A72 -:10832000936A0BB1D06A9847600604D50E4A136B66 -:108330000BB1506B9847210604D50B4A936B0BB1D8 -:10834000D06B9847E20504D5074A136C0BB1506C0B -:108350009847A30504D5044A936C0BB1D06C984799 -:10836000BDE81040FFF74EB8DC6700204FF0B04387 -:1083700010B5D3F8884004F47C42C3F88820620525 -:1083800004D5164A136D0BB1506D9847230504D5DB -:10839000124A936D0BB1D06D9847E00404D50F4A93 -:1083A000136E0BB1506E9847A10404D50B4A936E1F -:1083B0000BB1D06E9847620404D5084A136F0BB115 -:1083C000506F9847230404D5044A936F0BB1D06FC4 -:1083D0009847BDE81040FFF715B800BFDC670020E4 -:1083E00008B50348FCF78CFCBDE80840FFF70AB865 -:1083F000F43A002008B50348FCF782FCBDE80840C9 -:10840000FFF700B8603B002008B50348FCF778FC94 -:10841000BDE80840FEF7F6BFCC3B002008B500F0F1 -:10842000F7FABDE80840FEF7EDBF0000062108B5E9 -:108430000846FCF7E9FC06210720FCF7E5FC0621CD -:108440000820FCF7E1FC06210920FCF7DDFC0621F1 -:108450000A20FCF7D9FC06211720FCF7D5FC0621E1 -:108460002820FCF7D1FC09217A20FCF7CDFC09215A -:108470003120FCF7C9FC07213220FCF7C5FC0C2198 -:108480002620FCF7C1FC0C212720FCF7BDFC0C21A9 -:108490005220BDE80840FCF7B7BC000008B5FFF764 -:1084A00069FD00F07DFAFDF785F8FDF727F8FDF787 -:1084B0005BFAFDF72DF9FEF711FABDE8084000F070 -:1084C00029BA000030B50433039C0172002104FB7B -:1084D0000325C160C0E90653049B0363059BC0E903 -:1084E0000000C0E90422C0E90842C0E90A11436360 -:1084F00030BD00000022416AC260C0E90411C0E939 -:108500000A226FF00101FDF7E1BF0000D0E904325B -:10851000934201D1C2680AB9181D70470020704704 -:10852000036919600021C2680132C260C269134444 -:1085300082699342036124BF436A0361FDF7BABFB6 -:1085400038B504460D46E3683BB162690020131D4F -:108550001268A3621344E36207E0237A33B9294621 -:108560002046FDF797FF0028EDDA38BD6FF00100D7 -:10857000FBE70000C368C269013BC3604369134461 -:1085800082699342436124BF436A4361002383624B -:10859000036B03B11847704770B52023044683F37B -:1085A0001188866A3EB9FFF7CBFF054618B186F3FE -:1085B0001188284670BDA36AE26A13F8015B9342F2 -:1085C000A36202D32046FFF7D5FF002383F311886F -:1085D000EFE700002DE9F84F04460E46174698468F -:1085E0004FF0200989F311880025AA46D4F828B055 -:1085F000BBF1000F09D141462046FFF7A1FF20B192 -:108600008BF311882846BDE8F88FD4E90A12A7EB4E -:10861000050B521A934528BF9346BBF1400F1BD957 -:10862000334601F1400251F8040B914243F8040B28 -:10863000F9D1A36A403640354033A362D4E90A2316 -:108640009A4202D32046FFF795FF8AF31188BD4274 -:10865000D8D289F31188C9E730465A46F9F720FB8A -:10866000A36A5E445D445B44A362E7E710B5029CE5 -:108670000433017204FB0321C460C0E90613002324 -:10868000C0E90A33039B0363049BC0E90000C0E90F -:108690000422C0E90842436310BD0000026A6FF083 -:1086A0000101C260426AC0E904220022C0E90A2234 -:1086B000FDF70CBFD0E904239A4201D1C26822B968 -:1086C000184650F8043B0B607047002070470000CC -:1086D000C3680021C2690133C360436913448269DE -:1086E0009342436124BF436A4361FDF7E3BE000048 -:1086F00038B504460D46E3683BB1236900201A1DD6 -:10870000A262E2691344E36207E0237A33B929469F -:108710002046FDF7BFFE0028EDDA38BD6FF00100FE -:10872000FBE7000003691960C268013AC260C269D0 -:10873000134482699342036124BF436A03610023A7 -:108740008362036B03B118477047000070B52023A4 -:108750000D460446114683F31188866A2EB9FFF749 -:10876000C7FF10B186F3118870BDA36A1D70A36A9C -:10877000E26A01339342A36204D3E16920460439DB -:10878000FFF7D0FF002080F31188EDE72DE9F84FC7 -:1087900004460D46904699464FF0200A8AF3118808 -:1087A0000026B346A76A4FB949462046FFF7A0FF07 -:1087B00020B187F311883046BDE8F88FD4E90A0765 -:1087C0003A1AA8EB0607974228BF1746402F1BD935 -:1087D00005F1400355F8042B9D4240F8042BF9D1D4 -:1087E000A36A40364033A362D4E90A239A4204D3F1 -:1087F000E16920460439FFF795FF8BF31188464560 -:10880000D9D28AF31188CDE729463A46F9F748FAD2 -:10881000A36A3D443E443B44A362E5E7D0E9042318 -:108820009A4217D1C3689BB1836A8BB1043B9B1AF0 -:108830000ED01360C368013BC360C3691A448369E7 -:108840009A42026124BF436A0361002383620123C9 -:10885000184670470023FBE701F01F03F0B502F054 -:108860001F0456095A1C0123B6EB511F50F826501D -:1088700003FA02F34FEA511703F1FF333DBF50F8FB -:108880002720C4F12000134003EA05003BBF03FA90 -:1088900000F225FA04F0E0401043F0BD70B57E22EE -:1088A0007F210546FFF7D8FF18B1012819D0002015 -:1088B00070BD3E2249212846FFF7CEFF2F220446F5 -:1088C00031212846FFF7C8FF064601345022023600 -:1088D00053212846B440FFF7BFFF093804FA00F0DF -:1088E000E6E7302245212846FFF7B6FF0130800237 -:1088F000DEE7000090F8D63090F8D7201B0403EB99 -:10890000026390F8D42090F8D500134403EB0020C4 -:108910007047000000F052B8034B002258631A6100 -:108920000222DA60704700BF000C0040014B0022B9 -:10893000DA607047000C0040014B5863704700BF7D -:10894000000C0040014B586A704700BF000C00400B -:10895000024B034A1A60034A5A607047D4670020EA -:108960006868002000000220074B494210B55C688F -:10897000201A08401968821A914203D8944201D300 -:108980005A6010BD0020FCE7D467002008B5202302 -:1089900083F31188FFF7E8FF002383F3118808BDF4 -:1089A0000023054A19460133102BC2E9001102F1D8 -:1089B0000802F8D1704700BFDC670020114BD3F8E4 -:1089C000E82042F00802C3F8E820D3F8102142F072 -:1089D0000802C3F810210C4AD3F81031D36B43F0CE -:1089E0000803D363C722094B9A624FF0FF32DA6261 -:1089F00000229A615A63DA605A6001225A611A6051 -:108A0000704700BF004402580010005C000C00409A -:108A1000094A08B51169D3680B40D9B29B076FEAC0 -:108A20000101116107D5202383F31188FDF782FC32 -:108A3000002383F3118808BD000C0040FEF7AEBA96 -:108A4000012838BF012010B504462046FEF766FA1B -:108A500030B900F007F808B900F00CF88047F4E7E7 -:108A600010BD0000024B1868BFF35B8F704700BF5A -:108A70005C68002008B5062000F056F80120FDF7DC -:108A800063FE000010B501390244904201D100207C -:108A900005E0037811F8014FA34201D0181B10BD67 -:108AA0000130F2E7884210B501EB020402D984429A -:108AB000234607D8431EA14208D011F8012B03F822 -:108AC000012FF8E7024401468A4200D110BD13F895 -:108AD000014D02F8014DF7E71F2938B504460D4650 -:108AE00004D9162303604FF0FF3038BD426C12B139 -:108AF00052F821304BB9204600F030F82A460146A2 -:108B00002046BDE8384000F017B8012B0AD0591CA8 -:108B100003D1162303600120E7E7002442F8254033 -:108B2000284698470020E0E7024B01461868FFF707 -:108B3000D3BF00BF7422002038B5074D0023044680 -:108B4000084611462B60FDF703FE431C02D12B683B -:108B500003B1236038BD00BF60680020FDF7F2BD9F -:108B6000034611F8012B03F8012B002AF9D17047B5 -:108B700010B50139034632B111F8014F03F8014B2A -:108B8000013A002CF7D11A440021934200D110BDC4 -:108B900003F8011BF9E700004D4435002D2D0A00B4 -:108BA0002F6172647570696C6F742E6162696E00FA -:108BB0002F6172647570696C6F742D766572696669 -:108BC000792E6162696E002F6172647570696C6FD5 -:108BD000742D666C6173682E6162696E002F61721C -:108BE000647570696C6F742D666C61736865642E52 -:108BF0006162696E000000000000000000000000DB -:108C0000D10E00086D0F00081D110008A50F000807 -:108C1000650F00080000000000000000CD0E0008F5 -:108C2000790F000855110008C90E0008D50E00087C -:108C300053544D333248373F3F3F0053544D333246 -:108C4000483734332F3735330000000001105A0005 -:108C50000310590001205800032056002F00000087 -:108C60005375636365737366756C6C79206D6F758E -:108C70006E746564205344436172642028736C6F82 -:108C800077646F776E3D2575290A0000EB76904575 -:108C900058464154202020004641543332202020A1 -:108CA00000000000222A3A3C3E3F7C7F002B2C3BF8 -:108CB0003D5B5D0043554541414141434545454983 -:108CC000494941414592924F4F4F5555594F554F44 -:108CD0009C4F9E9F41494F55A5A5A6A7A8A9AAAB01 -:108CE000ACADAEAFB0B1B2B3B4414141B8B9BABBAB -:108CF000BCBDBEBFC0C1C2C3C4C54141C8C9CACB47 -:108D0000CCCDCECFD1D145454549494949D9DADB0A -:108D1000DCDD49DF4FE14F4F4F4FE6E8E855555551 -:108D20005959EEEFF0F1F2F3F4F5F6F7F8F9FAFB32 -:108D3000FCFDFEFF01030507090E10121416181C96 -:108D40001E00000061001A03E0001703F80007038B -:108D5000FF000100780100013001320106013901F4 -:108D600010014A012E017901060180014D004302E4 -:108D700081018201820184018401860187018701CA -:108D800089018A018B018B018D018E018F01900178 -:108D90009101910193019401F601960197019801C7 -:108DA00098013D029B019C019D0120029F01A001B1 -:108DB000A001A201A201A401A401A601A701A7018B -:108DC000A901AA01AB01AC01AC01AE01AF01AF0139 -:108DD000B101B201B301B301B501B501B701B801E9 -:108DE000B801BA01BB01BC01BC01BE01F701C00161 -:108DF000C101C201C301C401C501C401C701C80149 -:108E0000C701CA01CB01CA01CD011001DD0101007A -:108E10008E01DE011201F3010300F101F401F401FE -:108E2000F8012801220212013A020900652C3B02D6 -:108E30003B023D02662C3F024002410241024602D3 -:108E40000A015302400081018601550289018A010D -:108E500058028F015A0290015C025D025E025F02BD -:108E60009301610262029401640265026602670274 -:108E7000970196016A02622C6C026D026E029C01DF -:108E8000700271029D01730274029F0176027702E3 -:108E9000780279027A027B027C02642C7E027F02D5 -:108EA000A60181028202A90184028502860287024C -:108EB000AE014402B101B20145028D028E028F0261 -:108EC00090029102B7017B030300FD03FE03FF0341 -:108ED000AC0304008603880389038A03B1031103EA -:108EE000C2030200A303A303C4030803CC030300CB -:108EF0008C038E038F03D8031801F2030A00F903D1 -:108F0000F303F403F503F603F703F703F903FA0396 -:108F1000FA033004200350041007600422018A047D -:108F20003601C1040E01CF040100C004D004440185 -:108F300061052604000000007D1D0100632C001E59 -:108F40009601A01E5A01001F0806101F0606201FCA -:108F50000806301F0806401F0606511F0700591F4C -:108F6000521F5B1F541F5D1F561F5F1F601F0806A7 -:108F7000701F0E00BA1FBB1FC81FC91FCA1FCB1FFF -:108F8000DA1FDB1FF81FF91FEA1FEB1FFA1FFB1F79 -:108F9000801F0806901F0806A01F0806B01F0400C7 -:108FA000B81FB91FB21FBC1FCC1F0100C31FD01FA9 -:108FB0000206E01F0206E51F0100EC1FF31F01007F -:108FC000FC1F4E210100322170211002842101007A -:108FD0008321D0241A05302C2F04602C0201672C29 -:108FE0000601752C0201802C6401002D260841FF2A -:108FF0001A030000C700FC00E900E200E400E00002 -:10900000E500E700EA00EB00E800EF00EE00EC000E -:10901000C400C500C900E600C600F400F600F20076 -:10902000FB00F900FF00D600DC00F800A300D80028 -:10903000D7009201E100ED00F300FA00F100D10049 -:10904000AA00BA00BF00AE00AC00BD00BC00A10089 -:10905000AB00BB0091259225932502252425C10054 -:10906000C200C000A9006325512557255D25A20037 -:10907000A5001025142534252C251C2500253C256C -:10908000E300C3005A25542569256625602550252F -:109090006C25A400F000D000CA00CB00C80031014C -:1090A000CD00CE00CF0018250C2588258425A600EC -:1090B000CC008025D300DF00D400D200F500D5001D -:1090C000B500FE00DE00DA00DB00D900FD00DD00A7 -:1090D000AF00B400AD00B1001720BE00B600A7007D -:1090E000F700B800B000A800B700B900B300B200A4 -:1090F000A025A00000000000010000000096000074 -:10910000000000000000000000000000000000005F -:109110000000000000000000D5680008D9680008C1 -:1091200071510008C9540008055100082D5100086C -:1091300055510008ED500008000000007D55000862 -:1091400069550008A5550008915500089D5500086F -:10915000895500087555000861550008B15500088B -:10916000000000008D56000879560008B55600082A -:10917000A1560008AD56000899560008855600080B -:1091800071560008C15600080000000001000000F0 -:109190000000000069646C65000000009491000804 -:1091A000C0480020504A002001000000E56200088D -:1091B000000000000000812A00000000AAAAAAAA5C -:1091C00000000024FFFE00000000000000A00A00D4 -:1091D0000001000000000000AAAAAAAA00000000E6 -:1091E000FFFF000000000000000000001400AA566D -:1091F00000000000AAAAAAAA14005554FFFF00000C -:1092000000000000CCCC0C0020681A000000000018 -:10921000AAAA8AAA10541500FFFF0000000C7007CC -:10922000770000004081020100100000AAAAAAAA4B -:1092300000410100F7FF000000000070070000007F -:109240000000000000000000AAAAAAAA0000000076 -:10925000FFFF000000000000000000000000000010 -:1092600000000000AAAAAAAA00000000FFFF000058 -:1092700000000000000000000000000000000000EE -:10928000AAAAAAAA00000000FFFF00000000000038 -:10929000000000000000000000000000AAAAAAAA26 -:1092A00000000000FFFF00000000000000000000C0 -:1092B0000000000000000000AAAAAAAA0000000006 -:1092C000FFFF0000000000000000000000000000A0 -:1092D00000000000AAAAAAAA00000000FFFF0000E8 -:1092E00000000000000000004375626550696C6F6B -:1092F0007400437562654F72616E67652B2D424C39 -:10930000002553455249414C250000000200000051 -:1093100000000000AD5800081D5900084000400042 -:10932000F862002008630020020000000000000036 -:109330000300000000000000655900080000000064 -:109340001000000018630020000000000100000071 -:10935000000000008466002001010200D1690008BD -:10936000E16800087D6900086169000843000000A9 -:109370007493000809024300020100C0320904008E -:109380000001020201000524001001052401000172 -:10939000042402020524060001070582030800FFD9 -:1093A00009040100020A0000000705010240000054 -:1093B000070581024000000012000000C093000871 -:1093C0001201100102000040AE2D581000020102EF -:1093D000030100000403090425424F4152442500C3 -:1093E000437562654F72616E6765506C75732D626F -:1093F0006473686F7400303132333435363738393E -:1094000041424344454600000000002000000200A5 -:109410000200000000000030000004000000000016 -:109420000000002400000800040000000004000008 -:1094300000FC00000200000000000430008000007A -:1094400000000000000000380000010001000000E2 -:109450001F1C1F1E1F1E1F1F1E1F1E1F1F1D1F1E26 -:109460001F1E1F1F1E1F1E1F00000000B95A0008EC -:10947000715D00081D5E000840004000BC670020D0 -:10948000BC67002001000000CC67002080000000C5 -:10949000400100000800000000010000000400007E -:1094A000080000006D61696E001643300404340842 -:1094B0000C1014181C20212200000000146EFF7FE5 -:1094C0000100000000000000270400000000000070 -:1094D00000001E0000000000FF000000504A0020B5 -:1094E000F43A0020603B0020CC3B0020000000004C -:1094F000308C00083F000000500400003B8C000846 -:109500003F00000000000000010000000096000085 -:1095100000000800960000000008000004000000A1 -:10952000D4930008000000000000000000000000CC -:109530000000000000000000000000007822002071 -:10954000000000000000000000000000000000001B -:10955000000000000000000000000000000000000B -:1095600000000000000000000000000000000000FB -:1095700000000000000000000000000000000000EB -:1095800000000000000000000000000000000000DB -:1095900000000000000000000000000000000000CB +:1000000000060020E1020008E3020008E302000805 +:10001000E3020008E3020008E3020008E30200082C +:10002000E3020008E3020008E3020008DD760008AE +:10003000E3020008E3020008E3020008E30200080C +:10004000E3020008E3020008E3020008E3020008FC +:10005000E3020008E3020008C5850008F1850008F6 +:100060001D8600084986000875860008F1450008CD +:100070001946000845460008714600089D460008DC +:10008000C5460008F1460008E3020008E302000844 +:10009000E3020008E3020008E3020008A18600086A +:1000A000E3020008E3020008E3020008E30200089C +:1000B000E3020008E3020008E3020008E30200088C +:1000C000E3020008E3020008E3020008E30200087C +:1000D000E3020008E30200088D870008A1870008FA +:1000E00005870008E3020008E3020008E3020008B5 +:1000F000E3020008E3020008E30200081D470008CD +:10010000E302000879870008C9870008E3020008B5 +:10011000E3020008E3020008E3020008E30200082B +:1001200049470008714700089D470008C947000873 +:10013000F5470008E3020008E3020008E3020008B4 +:10014000E3020008E3020008E3020008E3020008FB +:100150001D4800084948000875480008E3020008E7 +:10016000E3020008E3020008E3020008E3020008DB +:10017000E3020008B5820008E3020008E302000879 +:10018000E3020008E3020008B5870008E302000864 +:10019000E3020008E3020008E3020008E3020008AB +:1001A000E3020008E3020008E3020008E30200089B +:1001B000E3020008E3020008E3020008E30200088B +:1001C000E3020008E3020008E3020008E30200087B +:1001D000E3020008A1820008E3020008E30200082D +:1001E000E3020008E3020008E3020008E30200085B +:1001F000E3020008E3020008E3020008E30200084B +:10020000E3020008E3020008E3020008E30200083A +:10021000E3020008E3020008E3020008E30200082A +:10022000E3020008E3020008E3020008E30200081A +:10023000E3020008E3020008E3020008E30200080A +:10024000E3020008E3020008E3020008E3020008FA +:10025000E3020008E3020008E3020008E3020008EA +:10026000E3020008E3020008E3020008E3020008DA +:10027000E3020008E3020008E3020008E3020008CA +:10028000E3020008E3020008E3020008E3020008BA +:10029000E3020008E3020008E3020008E3020008AA +:1002A000E3020008E3020008E3020008E30200089A +:1002B000E3020008E3020008E3020008E30200088A +:1002C000E3020008E3020008E3020008E30200087A +:1002D000E3020008E3020008E3020008E30200086A +:1002E00002E000F000F8FEE772B6374880F30888B5 +:1002F000364880F3098836483649086040F20000E5 +:10030000CCF200004EF63471CEF200010860BFF36B +:100310004F8FBFF36F8F40F20000C0F2F0004EF637 +:100320008851CEF200010860BFF34F8FBFF36F8F8B +:100330004FF00000E1EE100A4EF63C71CEF20001E3 +:100340000860062080F31488BFF36F8F07F028FA47 +:1003500006F078FB4FF055301F491B4A91423CBFD5 +:1003600041F8040BFAE71D49184A91423CBF41F895 +:10037000040BFAE71A491B4A1B4B9A423EBF51F83D +:10038000040B42F8040BF8E700201849184A914280 +:100390003CBF41F8040BFAE707F040FA06F0D8FB3F +:1003A000144C154DAC4203DA54F8041B8847F9E7A6 +:1003B00000F0C4F9114C124DAC4203DA54F8041B9E +:1003C0008847F9E707F028BA00060020002200203D +:1003D0000000000808ED00E00000002000060020FA +:1003E000609C000800220020742200207822002057 +:1003F00034670020E0020008E0020008E002000884 +:10040000E00200082DE9F04F2DED108AC1F80CD064 +:10041000D0F80CD0BDEC108ABDE8F08F002383F338 +:1004200011882846A047002006F0EEF8FEE706F007 +:1004300047F800DFFEE7000053B94AB9002908BFBA +:1004400000281CBF4FF0FF314FF0FF3000F074B9AF +:10045000ADF1080C6DE904CE00F006F8DDF804E01B +:10046000DDE9022304B070472DE9F047089D0446FA +:100470008E46002B4DD18A42944669D9B2FA82F257 +:1004800052B101FA02F3C2F1200120FA01F10CFA93 +:1004900002FC41EA030E94404FEA1C48210CBEFBCB +:1004A000F8F61FFA8CF708FB16E341EA034306FB54 +:1004B00007F199420AD91CEB030306F1FF3080F0E3 +:1004C0001F81994240F21C81023E63445B1AA4B230 +:1004D000B3FBF8F008FB103344EA034400FB07F7D2 +:1004E000A7420AD91CEB040400F1FF3380F00A8113 +:1004F000A74240F207816444023840EA0640E41B08 +:1005000000261DB1D4400023C5E900433146BDE8B3 +:10051000F0878B4209D9002D00F0EF800026C5E955 +:10052000000130463146BDE8F087B3FA83F6002E6D +:100530004AD18B4202D3824200F2F980841A61EBE5 +:10054000030301209E46002DE0D0C5E9004EDDE703 +:1005500002B9FFDEB2FA82F2002A40F09280A1EBEB +:100560000C014FEA1C471FFA8CFE0126200CB1FB40 +:10057000F7F307FB131140EA01410EFB03F0884239 +:1005800008D91CEB010103F1FF3802D2884200F2C6 +:10059000CB804346091AA4B2B1FBF7F007FB101158 +:1005A00044EA01440EFB00FEA64508D91CEB0404F6 +:1005B00000F1FF3102D2A64500F2BB800846A4EB51 +:1005C0000E0440EA03409CE7C6F12007B34022FA3C +:1005D00007FC4CEA030C20FA07F401FA06F31C436B +:1005E000F9404FEA1C4900FA06F3B1FBF9F8200C78 +:1005F0001FFA8CFE09FB181140EA014108FB0EF0BE +:10060000884202FA06F20BD91CEB010108F1FF3A0D +:1006100080F08880884240F28580A8F10208614419 +:10062000091AA4B2B1FBF9F009FB101144EA014127 +:1006300000FB0EFE8E4508D91CEB010100F1FF34D2 +:100640006CD28E456AD90238614440EA0840A0FB6A +:100650000294A1EB0E01A142C846A64656D353D040 +:100660005DB1B3EB080261EB0E0101FA07F722FA64 +:1006700006F3F1401F43C5E9007100263146BDE88D +:10068000F087C2F12003D8400CFA02FC21FA03F3F0 +:10069000914001434FEA1C471FFA8CFEB3FBF7F071 +:1006A00007FB10360B0C43EA064300FB0EF69E4296 +:1006B00004FA02F408D91CEB030300F1FF382FD22F +:1006C0009E422DD9023863449B1B89B2B3FBF7F6D7 +:1006D00007FB163341EA034106FB0EF38B4208D9B0 +:1006E0001CEB010106F1FF3816D28B4214D9023EF1 +:1006F0006144C91A46EA004638E72E46284605E70F +:100700000646E3E61846F8E64B45A9D2B9EB0208DF +:1007100064EB0C0E0138A3E74646EAE7204694E76F +:100720004046D1E7D0467BE7023B614432E73046A2 +:1007300009E76444023842E7704700BF38B501F06A +:10074000F3F901F0A3FB06F08FFE054606F0BCFFAF +:100750000446D0B90F4B9D4219D001339D4241F25E +:10076000883504BF01240025002006F087FE0CB167 +:1007700000F078F801F02AFB00F01AFD08B100F053 +:1007800071F8284600F010F9F9E70025ECE7054676 +:10079000EAE700BF010007B008B501F091F9A0F148 +:1007A00020035842584108BD07B541F21203022107 +:1007B00001A8ADF8043001F0A1F903B05DF804FB25 +:1007C00038B5302383F31188174803680BB105F05F +:1007D000FFFF0023154A4FF47A71134805F0EEFF2E +:1007E000002383F31188124C236813B12368013B63 +:1007F0002360636813B16368013B63600D4D2B7820 +:1008000033B963687BB9022001F04AFA322363608E +:100810002B78032B07D163682BB9022001F040FA33 +:100820004FF47A73636038BD78220020C107000856 +:100830009823002090220020084B187003280CD821 +:10084000DFE800F008050208022001F01FBA0220CC +:1008500001F012BA024B00225A6070479022002029 +:1008600098230020F8B5494B494A1C4619680131C4 +:1008700000F08A8004339342F8D16268454B9A4273 +:1008800040F28280444B9B6803F1006303F5003320 +:100890009A4279D2002001F061F90220FFF7CCFFE3 +:1008A0003E4B00219A6C99641A6F19671A6FDA6CC3 +:1008B000D9645A6F59675A6F1A6D19659A6F99679B +:1008C0009B6F374BD3F8802042F00062C3F8802042 +:1008D000D3F8802022F00062C3F88020D3F8802073 +:1008E000D3F8802042F00072C3F88020D3F8802033 +:1008F00022F00072C3F88020D3F8803072B64FF037 +:10090000E023C3F8084DD4E90004BFF34F8FBFF3D1 +:100910006F8F244AC2F88410BFF34F8F536923F4BA +:1009200080335361BFF34F8FD2F8803043F6E076C7 +:10093000C3F3C905C3F34E335B0103EA060C294632 +:100940004CEA81770139C2F87472F9D2203B13F175 +:10095000200FF2D1BFF34F8FBFF36F8FBFF34F8FD5 +:10096000BFF36F8F536923F4003353610023C2F840 +:100970005032BFF34F8FBFF36F8F302383F3118853 +:10098000854680F308882047F8BD00BF00000208B4 +:1009900020000208FFFF0108002200200045025845 +:1009A0000044025800ED00E02DE9F04F93B0B44B45 +:1009B0002022FF2100900AA89D6801F0B1F9B14AF8 +:1009C0001378A3B90121B04811700360302383F379 +:1009D000118803680BB105F0FBFE0023AB4A4FF40E +:1009E0007A71A94805F0EAFE002383F31188009B81 +:1009F00013B1A74B009A1A60A64A1378032B03D0B1 +:100A000000231370A24A53604FF0000A009CD346A3 +:100A10005646D146012001F039F924B19C4B1B68A0 +:100A2000002B00F02682002001F04AF80390039B7F +:100A3000002BF2DB012001F01FF9039B213B1F2B50 +:100A4000E8D801A252F823F0C90A0008F10A000808 +:100A5000850B0008150A0008150A0008150A000889 +:100A6000170C0008E70D0008010D0008630D0008D1 +:100A70008B0D0008B10D0008150A0008C30D000811 +:100A8000150A0008350E0008690B0008150A000851 +:100A9000790E0008D50A0008690B0008150A00083D +:100AA000630D0008150A0008150A0008150A000859 +:100AB000150A0008150A0008150A0008150A00089A +:100AC000150A0008850B00080220FFF765FE0028C4 +:100AD00040F0F981009B022105A8BAF1000F08BF80 +:100AE0001C4641F21233ADF8143001F007F891E7DB +:100AF0004FF47A7000F0E4FF071EEBDB0220FFF7F3 +:100B00004BFE0028E6D0013F052F00F2DE81DFE832 +:100B100007F0030A0D1013360523042105A80593D9 +:100B200000F0ECFF17E004215548F9E704215A488A +:100B3000F6E704215948F3E74FF01C08404608F156 +:100B4000040801F00DF80421059005A800F0D6FF77 +:100B5000B8F12C0FF2D101204FF0000900FA07F78D +:100B600047EA0B0B5FFA8BFB01F026F926B10BF07D +:100B70000B030B2B08BF0024FFF716FE4AE70421E6 +:100B80004748CDE7002EA5D00BF00B030B2BA1D1CE +:100B90000220FFF701FE074600289BD00120002617 +:100BA00000F0DCFF0220FFF747FE1FFA86F8404600 +:100BB00000F0E4FF0446B0B1039940460136A1F1CC +:100BC00040025142514100F0E9FF0028EDD1BA4600 +:100BD000044641F21213022105A83E46ADF8143036 +:100BE00000F08CFF16E725460120FFF725FE244B79 +:100BF0009B68AB4207D9284600F0B2FF013040F0B5 +:100C000067810435F3E70025224BBA463E461D7046 +:100C10001F4B5D60A8E7002E3FF45CAF0BF00B03A9 +:100C20000B2B7FF457AF0220FFF706FE322000F0B7 +:100C300047FFB0F10008FFF64DAF18F003077FF44F +:100C400049AF0F4A08EB0503926893423FF642AF63 +:100C5000B8F5807F3FF73EAF124BB845019323DDD7 +:100C60004FF47A7000F02CFF0390039A002AFFF6ED +:100C700031AF039A0137019B03F8012BEDE700BF69 +:100C8000002200209423002078220020C1070008C1 +:100C90009823002090220020042200200822002017 +:100CA0000C22002094220020C820FFF775FD074683 +:100CB00000283FF40FAF1F2D11D8C5F120020AAB59 +:100CC00025F0030084494245184428BF424601925A +:100CD00001F000F8019AFF217F4801F021F84FEA66 +:100CE000A803C8F387027C492846019301F020F845 +:100CF000064600283FF46DAF019B05EB830533E703 +:100D00000220FFF749FD00283FF4E4AE00F064FF45 +:100D100000283FF4DFAE0027B846704B9B68BB420B +:100D200018D91F2F11D80A9B01330ED027F00303C7 +:100D300012AA134453F8203C05934046042205A907 +:100D4000043701F003F98046E7E7384600F008FF72 +:100D50000590F2E7CDF81480042105A800F0CEFE3E +:100D600002E70023642104A8049300F0BDFE0028DC +:100D70007FF4B0AE0220FFF70FFD00283FF4AAAECB +:100D8000049800F01FFF0590E6E70023642104A803 +:100D9000049300F0A9FE00287FF49CAE0220FFF728 +:100DA000FBFC00283FF496AE049800F00DFFEAE744 +:100DB0000220FFF7F1FC00283FF48CAE00F01CFF8E +:100DC000E1E70220FFF7E8FC00283FF483AE05A925 +:100DD000142000F017FF07460421049004A800F037 +:100DE0008DFE3946B9E7322000F06AFE071EFFF695 +:100DF00071AEBB077FF46EAE384A07EB0903926809 +:100E000093423FF667AE0220FFF7C6FC00283FF48E +:100E100061AE27F003074F44B9453FF4A5AE4846FD +:100E200009F1040900F09CFE0421059005A800F0DA +:100E300065FEF1E74FF47A70FFF7AEFC00283FF44F +:100E400049AE00F0C9FE002844D00A9B01330BD004 +:100E500008220AA9002000F06BFF00283AD02022C7 +:100E6000FF210AA800F05CFFFFF79EFC1C4805F07C +:100E7000D1FB13B0BDE8F08F002E3FF42BAE0BF08A +:100E80000B030B2B7FF426AE0023642105A80593EA +:100E900000F02AFE074600287FF41CAE0220FFF770 +:100EA0007BFC804600283FF415AEFFF77DFC41F245 +:100EB000883005F0AFFB059800F0C6FF46463C467B +:100EC00000F07AFFA6E506464EE64FF0000901E67F +:100ED000BA467EE637467CE69422002000220020B7 +:100EE000A0860100704700007047000070470000B6 +:100EF0002DE9F04100F58037044616463B7C5BB98E +:100F0000C0681030204400F0E5FEE5683544B5F5D2 +:100F1000004FE56002D816B1BDE8F081DEB905F0FA +:100F20007F0605F110000021C6F180062044F6B2CC +:100F300032462E4400F0F4FEA06804F11008324658 +:100F400000F10060414600F5003006F039F830B994 +:100F500001233B74E0E74FF400463546ECE7A26816 +:100F600005F11001404632442144A260E268521B60 +:100F7000E26000F0AFFE0220BDE8F04100F090BE5C +:100F8000183000F0E9BC000010B5044600F0FAFF8C +:100F9000204610BD10B5044600F0F4FF204610BDF9 +:100FA000C3B280B2A3F14102052A02D8373800B299 +:100FB0007047613B052B94BF57383038F7E7000086 +:100FC000F8B504461546084603220C4900F08CFE8D +:100FD000014688B908346F1C15F91100FFF7E0FFCE +:100FE000064617F911000131FFF7DAFF102940EA30 +:100FF000061004F8010BEFD1F8BD00BF10920008F5 +:101000002DE9F04FADF53F7D0746416801222AA842 +:1010100002F09AFE002840F087800646824681460C +:101020001125DFF80C81DFF80CB101AB4FF48052D1 +:1010300041462AA802F0E8FF002875D1019AB2F5CE +:10104000805F71D8002A65D00446019A9442ECD2A0 +:10105000282D0FD008DC132D2DD01E2D39D0112DA9 +:1010600013D00134A4B2F0E7322D2DD0372D2FD07C +:101070002D2DF6D13B68121B08EB040138461B6985 +:101080002D259847BDF80440EBE7121B022A09D929 +:10109000594608EB040000F027FE18B90234282551 +:1010A000A4B2DEE718F804303A2B3DD00A2B1CBF5F +:1010B000A1461325D5E718F804300A2B34D03A2B73 +:1010C00004BFA2463225CCE718F80430202BC8D044 +:1010D000264618F804300A2B1AD1AAEB090208EBAD +:1010E000090102A811254F2A28BF4F2208F07CF8D9 +:1010F000A21B08EB060116A84F2A28BF4F2208F0B2 +:1011000073F83B6816AA02A9DB6838469847A8E737 +:101110001E25A6E73B68384604491B69984701200D +:101120000DF53F7DBDE8F08F0020F9E71293000830 +:10113000A02300201492000800F1180110B5044605 +:1011400086B00846019100F0F1FB2046FFF758FFFA +:1011500060B1019902A800F049FC102204F10801D5 +:1011600002A808F001F8B0FA80F0400906B010BDFE +:1011700070B504460025EEB2304600F0FFFC58B1D1 +:1011800000213046013500F009FD08B9002070BD8E +:10119000022000F085FDEEE72046FFF731FF002832 +:1011A000F4D004F58034207C80F00100EFE70000EB +:1011B000F0B5C9B006F070F900F000FF18B90025CD +:1011C000284649B0F0BD69462A4802F0DFFF0028F2 +:1011D0004BD1294C204603F009F8284803F006F8C3 +:1011E000274803F003F82146224803F07BF8002843 +:1011F000E5D1702000F0C0FE064610B1214B4460DE +:101200000360336830469B689847054600282ED017 +:101210001A4F1948394603F065F805460028CED123 +:10122000194800F0A9FE044638B1184B4760036026 +:1012300000F58033C0E902551D74236820469B6881 +:101240009847054628B10E490C4803F04BF8002892 +:10125000B5D1336830465B6898471CB12368204697 +:101260005B68984700F092FEAAE70025FAE704467B +:10127000EFE700BF18920008289200083F9200088C +:10128000559200087892000814000100949200081A +:101290002DE9F04FD44A8DB00B68D0F804A001932B +:1012A0001A440368D14E1A44D1F81C90DFF8B4C335 +:1012B000DFF8B4B3D0E90234634003EA0A036340C1 +:1012C00013444A6802920AEB7363029CC84A2244A0 +:1012D000C468224484688AEA04051D4065401544B8 +:1012E0008A68039203EB3555039CC24A2244846802 +:1012F00022448AEA03042C4084EA0A041444CA689B +:1013000005EBF4340492164483EA05022240564465 +:101310005A4032440E69059604EBB222059FB64E40 +:101320003E441E4485EA040313406B4033444E6937 +:10133000069602EB7363069FB04E3E442E4484EA49 +:1013400002051D40654035448E69079603EB35550F +:10135000079FAB4E3E44264482EA03042C4054408F +:101360003444A84E4E4405EBF434164483EA050297 +:1013700022405A4032440E6A089604EBB222089F7B +:10138000A14E3E441E4485EA040313406B4033449F +:101390004E6A099602EB7363099F9C4ED1F830E0C8 +:1013A0003E44D1F83880F3442E4484EA02051D40BF +:1013B000654035448E6AA6F5244703EB35550A96F9 +:1013C0004F3F274482EA03042C4054403C44CF6AF8 +:1013D0000B9705EBF4340B9E8D4F3744029E174458 +:1013E00083EA050222405A403A448A4F774404EB8C +:1013F000B2221F4485EA040313406B403B444F6B09 +:10140000BC4402EB7363654484EA020C0CEA030CEF +:101410008CEA040C6544DFF854C2C44403EB355530 +:10142000A44482EA03042C4054406444D1F83CC0F4 +:10143000794905EBF4346144114483EA0502224002 +:101440005A400A44754904EBB2223144079E1944BC +:1014500084EA02032B4063400B44714902EBF363BF +:1014600031440B9E0D4482EA03012140514029443E +:101470006C4D03EBF1513544019E254483EA010490 +:1014800014405C402C44684D01EBB4443544069E46 +:10149000154481EA04021A404A402A44634D04EB91 +:1014A000323235440A9E1D4484EA02030B406340F5 +:1014B0002B445F4D02EBF3633544059E0D4482EAF5 +:1014C00003012140514029445A4D03EBF151654439 +:1014D000254483EA010414405C402C44564D01EB42 +:1014E000B4443544099E154481EA04021A404A4036 +:1014F0002A44524D04EB32323544049E1D4484EAA2 +:1015000002030B4063402B444D4D02EBF363454413 +:101510000D4482EA0301214051402944494D03EB27 +:10152000F1513544089E2C4483EA010515405D4085 +:101530002C44454D01EBB4443544039E2A4481EAD2 +:1015400004051D404D402A44404D04EB32323D44D9 +:101550002B4484EA020593440D4065402B443C4DE6 +:1015600002EBF3633544069E294482EA03052540D5 +:1015700055402944374D03EBF1514D442C4483EA47 +:10158000010515405D40254401EBB54581EA0504A0 +:1015900004EA03024A405A44A6F5B82B089E05EB1C +:1015A0003232ABF2BE6B54405B4423442A4C344489 +:1015B00002EB33730B9E0C4485EA0201594021442F +:1015C000264C344403EB7151029E254482EA030405 +:1015D0004C402544224C444401EB3545144483EAF5 +:1015E00001026A40224443E078A46AD7EECEBDC12E +:1015F00056B7C7E8DB702024AF0F7CF52AC68747B3 +:10160000134630A8019546FDD8988069AFF7448B02 +:10161000BED75C892211906B2108B44962251EF661 +:1016200040B340C0515A5E26AAC7B6E95D102FD616 +:101630005314440281E6A1D8C8FBD3E7E6CDE121EB +:10164000D60737C3870DD5F4ED145A4505E9E3A94C +:10165000F8A3EFFCD9026F6781F6718722619D6D57 +:101660000C38E5FD937198FD8A4C2A8D8E4379A63E +:10167000934C344405EB7222059E1C4481EA050319 +:10168000534023448F4C344402EB33730A9E0C4482 +:1016900085EA0201594021448B4C4C4403EB7151C3 +:1016A000254482EA03044C402C44884D354401EB28 +:1016B0003444019E154483EA010262402A44844D69 +:1016C0003D4404EB72221D4481EA040353402B4441 +:1016D000804D354402EB3373049E294484EA0205AD +:1016E0005D4029447C4D354403EB7151079E2544F0 +:1016F00082EA03044C402C44784D354401EB3444D9 +:10170000099E2A4483EA010565401544744A32441F +:1017100004EB7525039E134481EA04026A401A44CF +:10172000704B734405EB32720B4484EA050151405F +:1017300019446D4B634402EB71511C4485EA02036A +:101740004B401C44694B334401EB3444019E1D441F +:1017500082EA010363402B44654D04EB7323354457 +:10176000069E154463EA010262402A44614D03EB80 +:10177000B2624D4462EA040929445F4D89EA0309D3 +:10178000454449442C445D4D02EBB1513544049E1F +:1017900061EA03081D4488EA0208444401EB7444EA +:1017A00064EA02034B402B44554D04EBF32375448C +:1017B00063EA010E15448EEA040E0EEB0502514D4C +:1017C00003EBB262354462EA040E29440A9D8EEAB4 +:1017D000030EA5F580164C4D7144A6F6833602EB38 +:1017E000B151264461EA030454403444029E01EBA3 +:1017F0007444354464EA02061D444E407319089E41 +:10180000424D04EBF323354463EA01061544664078 +:1018100072193F4D03EBB262654462EA0406294443 +:101820003C4D5E403144079E02EBB151354461EAC4 +:1018300003062C44384D56403D443444059E1D4417 +:1018400001EB744464EA02034B402B44334D04EB38 +:10185000F32335440B9E154463EA010262402A4497 +:101860002F4D03EBB2623544039E0D4462EA04013E +:10187000594029442B4D02EBB15135442A4E2544A1 +:1018800061EA030454402C44099D01EB74442E4446 +:1018900064EA02051E4485EA01039D1903681A449F +:1018A0000AEB040303EBF5230260436083681C44E6 +:1018B000C36819448460C1600DB0BDE8F08F00BFFB +:1018C00044EABEA4A9CFDE4B604BBBF670BCBFBEE2 +:1018D000C67E9B28FA27A1EA8530EFD4051D88042F +:1018E00039D0D4D9E599DBE6F87CA21F6556ACC4A3 +:1018F000442229F497FF2A43A72394AB39A093FCF1 +:10190000C3595B6592CC0C8FD15D84854F7EA86FE7 +:10191000E0E62CFE144301A3A111084E827E53F78A +:1019200035F23ABDBBD2D72A91D386EB094B03607F +:1019300003F18833436003F12943A3F59613A3F61B +:101940008B638360A3F18833C3600023C0E9043351 +:10195000704700BF012345672DE9F843144602692B +:1019600005460E46E300C2F3C50800F118079B18B0 +:10197000036122BF43690133436112F4FC7F436971 +:1019800003EB5473436114D0C8F1400907EB08001E +:101990004C4504D22246BDE8F84307F0F5BB403C75 +:1019A0004A464E4407F0F0FB444439462846FFF7C8 +:1019B0006FFCA04606EB0409B8F13F0FA9EB080144 +:1019C0000AD94022384607F0DFFB39462846A8F1FD +:1019D0004008FFF75DFCEFE7A1096FF03F023846D2 +:1019E00002FB014206EB8111D5E7000070B50B69DF +:1019F00001F1180506460C46C3F3C503EA18501C4E +:101A00008022EA54C3F13F02072A1FD8002100F0C8 +:101A100087F929462046FFF73BFC3822002128465B +:101A200000F07EF9236929462046236563696365D2 +:101A3000FFF72EFC21461022304607F0A5FB20467A +:101A400058220021BDE8704000F06AB9C3F13702A6 +:101A50000021E5E72DE9F84F4FF47A7306460D466D +:101A6000002402FB03F7DFF85080DFF8509098F96C +:101A700000305FFA84FA5A1C01D0A34210D159F801 +:101A800024002A4631460368D3F820B03B46D847A5 +:101A9000854205D1074B012083F800A0BDE8F88FEF +:101AA0000134042CE3D14FF4FA7004F0B3FD0020AC +:101AB000F4E700BFE43300201022002014220020AD +:101AC000002307B5024601210DF107008DF807300C +:101AD000FFF7C0FF20B19DF8070003B05DF804FBDD +:101AE0004FF0FF30F9E700000A46042108B5FFF780 +:101AF000B1FF80F00100C0B2404208BD074B0A466A +:101B000030B41978064B53F821400146236820462B +:101B1000DD69044BAC4630BC604700BFE4330020B5 +:101B200014220020A086010070B50A4E00240A4D40 +:101B300005F0EAF9308028683388834208D905F037 +:101B4000DFF92B6804440133B4F5003F2B60F2D376 +:101B500070BD00BFE6330020A033002005F0A2BA1C +:101B600000F1006000F500300068704700F100608F +:101B7000920000F5003005F023BA0000054B1A680A +:101B8000054B1B889B1A834202D9104405F0B8B953 +:101B900000207047A0330020E633002038B504460B +:101BA000074D29B128682044BDE8384005F0C0B988 +:101BB0002868204405F0AAF90028F3D038BD00BFFA +:101BC000A03300200020704700F1FF5000F58F1077 +:101BD000D0F8000870470000064991F8243033B16E +:101BE00000230822086A81F82430FFF7BFBF0120D4 +:101BF000704700BFA4330020014B1868704700BF36 +:101C00000010005C194B01380322084470B51D68B0 +:101C1000174BC5F30B042D0C1E88A6420BD15C6834 +:101C20000A46013C824213460FD214F9016F4EB1AD +:101C300002F8016BF6E7013A03F10803ECD18142A7 +:101C40000B4602D22C2203F8012B0424094A1688E1 +:101C5000AE4204D1984284BF967803F8016B013CF0 +:101C600002F10402F3D1581A70BD00BF0010005CED +:101C700024220020D4920008022803D1024B4FF006 +:101C800080529A61704700BF00100258022803D1A9 +:101C9000024B4FF480529A61704700BF0010025807 +:101CA000022804D1024A536983F480535361704778 +:101CB0000010025870B504464FF47A764CB1412CAE +:101CC000254628BF412506FB05F0641B04F0A2FC55 +:101CD000F4E770BD002310B5934203D0CC5CC4542C +:101CE0000133F9E710BD0000013810B510F9013FCC +:101CF0003BB191F900409C4203D11AB10131013A44 +:101D0000F4E71AB191F90020981A10BD1046FCE7CB +:101D100003460246D01A12F9011B0029FAD1704776 +:101D200002440346934202D003F8011BFAE77047CE +:101D30002DE9F8431F4D14460746884695F82420A0 +:101D400052BBDFF870909CB395F824302BB9202259 +:101D5000FF2148462F62FFF7E3FF95F82400414634 +:101D6000C0F1080205EB8000A24228BF2246D6B28D +:101D70009200FFF7AFFF95F82430A41B17441E44D0 +:101D80009044E4B2F6B2082E85F82460DBD1FFF768 +:101D900023FF0028D7D108E02B6A03EB820383429C +:101DA000CFD0FFF719FF0028CBD10020BDE8F88382 +:101DB0000120FBE7A4330020024B1A78024B1A7073 +:101DC000704700BFE433002010220020F8B5194C02 +:101DD000194803F027FF2146174803F04FFF2468F6 +:101DE0004FF47A70154ED4F89020154DD2F804387F +:101DF000114F43F00203C2F80438FFF75BFF20469F +:101E0000104904F049F8D4F890200424D2F804389A +:101E100023F00203C2F804384FF4E133336055F87D +:101E2000040BB84202D0314603F05AFE013CF6D111 +:101E3000F8BD00BFD49A000818490020CC33002018 +:101E400014220020DC9A00080C4B70B50C4D04469F +:101E50001E780C4B55F826209A420DD00A4B0021D3 +:101E600018221846FFF75CFF0460014655F826006B +:101E7000BDE8704003F034BE70BD00BFE433002005 +:101E80001422002018490020CC330020F8B571B688 +:101E9000002301201A46194602F08AFD04468020DC +:101EA00005F0A0F9002849D00025254A80274FF4E5 +:101EB000D06C3D26136913F0C06F26D1D2F81031D3 +:101EC00013F0C06F21D1236805F100619960236888 +:101ED000D86023685F602368C3F800C021680B687E +:101EE00043F001030B6021680B6823F01E030B60B5 +:101EF00021680B68DB07FCD4237B8035616806FA18 +:101F000003F3B5F5001F0B60D4D1204602F086FD27 +:101F1000B5F5001F11D000240A4E0B4D012005F02D +:101F2000C1F83388A34205D928682044013404F05D +:101F3000FFFFF6E7002005F0B5F861B6F8BD00BF79 +:101F400000200052E6330020A033002030B50A44C0 +:101F5000084D91420DD011F8013B5840082340F341 +:101F60000004013B2C4013F0FF0384EA5000F6D13B +:101F7000EFE730BD2083B8ED0121884238BF084625 +:101F800005F068B908B105F069B9704710B5084C9B +:101F900001220849002001F0B3FE23783BB1064836 +:101FA00003F016FD044803F049FD0023237010BD23 +:101FB000E8330020E4920008C83600201D482DE9CF +:101FC000F041036D2BB901224FF48051503005F0E0 +:101FD000CDFA194E33780BB1FFF7D8FF0324174F12 +:101FE0004FF00008134D15492846C7F8048003F048 +:101FF00017FD284603F050FB48B1013C284603F08A +:102000001DFD14F0FF04EED1204634700FE00C49A2 +:1020100001220C4801F074FE014618B1284603F075 +:10202000D7FCEAE7084800F011F801203070BDE85D +:10203000F08100BFC8360020E83300203C22002099 +:10204000E4920008EC330020E89200080FB400206E +:1020500004B07047006870470346006859687047CD +:102060000B0A017043700B0C090E8370C17070472E +:10207000110A027003714170110C120E8170C2704E +:102080001A0A42711A0C1B0E8271C371704700004C +:10209000C36A0239023B8B4283BF4389006C01FB58 +:1020A0000300002070470000C2F307238A76CB7636 +:1020B0000378032B01BF120C0A75120A4A75704788 +:1020C00000F10B010022D30143EA520310F8012B67 +:1020D00052FA83F38842DAB2F5D110467047000015 +:1020E00010B5417804460020013102464901022A18 +:1020F00016BFA35C032203EBC03302F101021EBF33 +:102100009BB203EB500398B29142F0D810BD00008F +:1021100002684AB1134613F8011B1F290DD93A2949 +:10212000F9D1911C8B4202D04FF0FF3070471278EA +:10213000302AF9D1036000207047014B18787047AE +:102140003836002038B50D46044618B9092000235A +:102150002B6038BD0368002BF8D01A78002AF5D020 +:102160008188DA889142F1D1587804F0EFFB10F0C1 +:102170000100EBD12368EBE738B50D4640F2523150 +:10218000144602F0B9F9FF2807D9012C0BD9030A2C +:10219000022468702B70204638BD30B1002CFAD074 +:1021A00001242870F7E70024F5E70446F3E7000070 +:1021B0002DE9F8430026D0F8008005460C468E76BF +:1021C000836B002B4AD098F80030042B4BD1334658 +:1021D0003546402720E0B7F5187F80F0C480F90627 +:1021E00006F1010608BF0237D05B02372BB900F5B4 +:1021F000205292B2B2F5006F0DD305F11A01C5F16C +:10220000FF0240EA03402144FFF7B6FF002800F038 +:10221000AA80054400200346D8F8102092F8231025 +:10222000B142D8D8002B40F09E80002D00F09B805A +:1022300000232544AB766373D8F81020137903F09C +:102240003701DB0621730BD402F13800FFF704FFDE +:10225000C4E9000193896381D3892381BDE8F883B0 +:1022600000200146F4E7C36C01335ED1EA6B002322 +:102270002E26551E184615F8011F013020290CD0B6 +:10228000052908BFE521092804D10B2B9EBFE718BB +:1022900001337E73E718013379730B28EBD1E11812 +:1022A00000204873A17E00294BD1002B40D06FF055 +:1022B0000C0604F10D000825361B331810F8011B1D +:1022C000002938D02E298BB24AD0A3F14101192917 +:1022D00003D8117B0D4200D020330373EDE7B9F131 +:1022E000000F05D100F520539BB2B3F5006F0BD35F +:1022F00007F11A01C7F1FF0240EA09402144FFF744 +:102300003BFF48B10744002002368146D8F80C3024 +:10231000985B0028E3D13846B9F1000F4FF0000276 +:1023200018BF002023189A76A0E7B1463746EDE79C +:102330003F23A3760123234400219976137B03B91D +:102340006373D37A02F11C0003F03F03237300236D +:10235000FFF780FE20606360D38A6381138B7CE784 +:1023600010250B46B9E73F230125A37660E700005F +:1023700038B50546002435F8020B08B9204638BDAB +:1023800002F0EEF86308C2B203EBC43312FA83F32F +:102390009AB2C0F3072303EB520303EBC2339CB2A0 +:1023A000E9E7000037B5C37804461BB90025284685 +:1023B00003B030BD00F14C01826C012340780191E3 +:1023C00004F0EAFA054680B9A36BE070A06C226BBA +:1023D000C31A9342EAD2A3780199022BE6D10244B0 +:1023E0000123607804F0D8FAE1E70125DFE7000077 +:1023F00038B5836C05460C468B4210D0FFF7D2FFF0 +:1024000060B92246012305F14C01687804F0A0FA76 +:1024100000281CBF4FF0FF340120AC6438BD002001 +:10242000FCE7000038B500230446C3704FF0FF33CB +:102430008364FFF7DDFF00284BD1B4F84A524AF617 +:1024400055239D4207D10B22254904F14C0006F08B +:102450008BFE00283FD094F84C30EB2B03D0183380 +:10246000DBB2012B2ED84AF655239D4206D1082215 +:102470001C4904F19E0006F077FE48B3B4F85730CB +:10248000B3F5007F1ED194F85930DBB15A1E1A42C1 +:1024900018D1B4F85A30ABB194F85C30013B012B41 +:1024A00010D8B4F85D306BB1B4F85F307F2B06D82C +:1024B00004F16C00FFF7CEFDB0F5803F02D3B4F815 +:1024C000623053B94AF6552085420CBF02200320E2 +:1024D00038BD0420FCE70120FAE70020F8E700BF40 +:1024E000149300082093000802392DE9F04701F009 +:1024F00007044FF0010A466C05460AFA04F4174631 +:10250000984606EB1136C1F3C809E4B231462846B5 +:102510000136FFF76DFF18B10120BDE8F08799463D +:1025200005EB090292F84C30234214BF012100212F +:10253000414513D06340013F82F84C3085F803A039 +:10254000EBD0640014F0FF04EAD109F10103012487 +:102550004FF00009B3F5007FE1D1D7E70220DCE7B7 +:1025600001290246F8B50C4640F28C800668F36AF1 +:102570008B4240F287803378013B032B00F282804C +:10258000DFE803F00229384B04EB5405B16B304609 +:1025900001EB5521FFF72CFF10B14FF0FF30F8BDD4 +:1025A0006F1CC5F30805B16B3046354401EB57216C +:1025B00095F84C50FFF71CFF0028EED1C7F3080731 +:1025C000E3073E4496F84C0045EA00204CBF000962 +:1025D000C0F30B00E3E7B16B304601EB1421FFF7CA +:1025E00007FF0028D9D1640004F4FF742644B6F82C +:1025F0004C00D4E7B16B304601EBD411FFF7F8FE85 +:102600000028CAD1A40006F14C0004F4FE74204452 +:10261000FFF720FD20F07040C1E7D0E90430D57904 +:1026200053EA000101D0916801B95DBB9168022DA8 +:10263000A4EB01010DD1013B728940F1FF305B0A2F +:1026400043EAC053B3FBF2F399421BD81CD0601C81 +:10265000A5E7032D02D193698B42F8D8D3699BB9C2 +:10266000B16B304601EBD411FFF7C2FE002894D1C4 +:10267000A0004C3600F4FE703044FFF7EBFC20F075 +:1026800000408CE701208AE76FF0004087E70000F8 +:10269000F8B5066804460D463378042B0CBF4FF09E +:1026A00080524FF400128A4201D80220F8BDCA06B7 +:1026B000FBD182680163D2B9022B13D83389B3EB03 +:1026C000551FF2D9F36BA363A36B6263002BECD0AD +:1026D00003EB55234C36C5F308050020A3633544AE +:1026E000E563E3E7F36BC271002BE7D01A46778905 +:1026F0007F02BD42114604D23046FFF7C9FCA063F9 +:10270000E2E72046FFF72CFF431C024606D00128D3 +:10271000CBD9F36A8342C8D9ED1BEAE70120C5E7AC +:1027200001292DE9F04706460C46174608D9C36A29 +:102730008B4205D90378022B62D003D8012B22D01B +:10274000022552E0033B012BFAD8816B01EBD41137 +:10275000FFF74EFE0546002847D1A40006F14C03C2 +:1027600004F4FE741C443378042B07D0204627F071 +:102770007047FFF76FFC00F0704007433946204672 +:10278000FFF76EFC2FE001EB5108816B01EB582144 +:10279000FFF72EFE054640BB14F0010406F14C097C +:1027A00008F1010AC8F3080808BFFBB230461FBF92 +:1027B00019F8083003F00F023B0103F0F00318BFD3 +:1027C000134309F808300123B16BF37001EB5A2170 +:1027D000FFF70EFE054640B9CAF3080A44B1C7F335 +:1027E000071709F80A700123F3702846BDE8F0873F +:1027F00019F80A30C7F3032723F00F031F43F0E74C +:10280000816B01EB1421FFF7F3FD05460028ECD1A5 +:10281000640006F14C0304F4FF741F551919C7F343 +:1028200007274F70DFE70000F8B504460E4617464D +:10283000E3690BB91846F8BD012BA6EB0305206828 +:1028400014BFAA1C3A46691CFFF76AFF0028F2D1A0 +:10285000E369013BE361EBE701292DE9F843064613 +:102860000C461746056802D80220BDE8F883EB6ADB +:102870008B42F9D97AB9A14621463046A046FFF7E6 +:102880006FFE0446B0B92B78042B02D1002F43D140 +:10289000F7710020E9E72B78042B02D1C379022BD2 +:1028A000E9D04FF0FF3239462846FFF739FF0028BC +:1028B000E1D0DAE70128D7D0421C01D10120D4E7CA +:1028C0002B78042B19D1EA6AAB69023A93421CD3E4 +:1028D00008F10102A2420CD02B78042B08D100236E +:1028E000A2EB090249462846FFF7FEFD0028BCD1AD +:1028F000A146EB6AA342BFD8C5E70022414628465D +:10290000FFF70EFF0028DED0AFE70133AB612B7974 +:1029100043F001032B71DBE7F3798BB9B468BC4258 +:1029200002D10223F371B4E721463046FFF718FEC7 +:10293000012899D9431CC1D001348442EFD0A8E7C3 +:10294000032BA6D1B368BB42A3D8B2691344BB42E0 +:102950009FD3E6E770B5C3790446032B06D181689F +:102960008369CD18A94203D10023E371002070BD13 +:102970004E1C20683246FFF7D3FE0028F7D13146BF +:10298000F0E700002DE9F74305460191FFF70AFD46 +:102990000446002849D105F14C09019928464FF415 +:1029A0000072FFF775FB2146A86407464846FFF70B +:1029B000B7F96C896402B4F5004F28BF4FF40044A6 +:1029C000B4F5007F2FD9204604F04CFC804630B18E +:1029D00022460021640A0026FFF7A2F909E06408F4 +:1029E000EEE72346BA194146687803F0D5FF18B9D7 +:1029F00026446B899E42F4D3404604F043FC688928 +:102A0000801B18BF012003B0BDE8F08301366B893D +:102A10009E42F4D20123BA194946687803F0BCFFFC +:102A20000028F3D0EBE70026F1E70120EBE70000F8 +:102A3000F8B50446FFF7B6FC0546002842D12378D6 +:102A4000032B37D12779012F34D104F14C060146ED +:102A50004FF400723046FFF763F95523412272218B +:102A600084F84A32AA2304F50D7084F84F2084F8C4 +:102A70004B32522384F8301284F84C3084F84D30B5 +:102A8000612384F8311284F84E3084F83332A1691E +:102A900084F83222FFF7E4FA616904F50E70FFF75B +:102AA000DFFA626B3B46314601326078A26403F084 +:102AB00073FF257100226078114603F091FF003802 +:102AC00018BF0120F8BD000000232DE9F0430B6082 +:102AD00085B00F461546FFF71BFB061EC0F2B281FC +:102AE000804B53F82640002C00F0AE813C6005F08E +:102AF000FE0523786BB1607803F028FFC70708D480 +:102B00001DB110F0040500D00A25284605B0BDE827 +:102B1000F0830023F0B22370607003F003FFC1075D +:102B200000F194810DB14207EED400212046FFF759 +:102B300079FC022840F099806E4604F2122304F2D8 +:102B40005221324618461033FFF784FA42F8040B3C +:102B50008B42F7D1002556F8041B00297DD0204672 +:102B6000FFF760FC012879D80128A26C40F0C080F2 +:102B700004F1570304F18C0113F8015B002D7BD1A4 +:102B80008B42F9D1B4F8B430B3F5807F74D194F8A6 +:102B9000B830092B70D104F19400FFF75DFA4FF0C3 +:102BA000FF33171841F10001BB4275EB010363D3FA +:102BB00004F1A000FFF74EFA94F8BA302063012B1D +:102BC000A37059D194F8B99003FA09F91FFA89F35F +:102BD0006381002B50D0444B04F1A800FFF73AFA70 +:102BE0000646984248D8831C626304F1A400E3625D +:102BF000FFF730FA00EB020804F19C00C4F84080B3 +:102C0000FFF728FA10441FFA89F2A06306FB02F3CB +:102C100013EB080345EB05029F4271EB02032BD334 +:102C20002E4604F1AC00FFF715FAE06365B963893D +:102C3000B34221D9E16B2046FFF72AFA81192046D9 +:102C4000FFF7D6FB98B90136631993F84C30812B06 +:102C500014D02035C5F30805E8E703200135042D1D +:102C60007FF479AF042807D101E0042801D10125C0 +:102C70004BE701287FF678AF0D2546E705F11400F4 +:102C800004F14C063044FFF7E5F901280546F3D975 +:102C9000E36A8342F0D96189821E236C02FB01330F +:102CA0006364A16B204601EBD511FFF7A1FB00285F +:102CB000DDD105F07F0006EB8000FFF7CBF9431C68 +:102CC00003D00135A842ECD0D6E70425C4E90500BD +:102CD000064A257000251388E56101339BB21380F5 +:102CE000E38012E73C360020FDFFFF7F40360020E6 +:102CF000B4F85730B3F5007FBED1B4F8626026B99E +:102D000004F17000FFF7A6F9064694F85C302663DC +:102D1000591EA3700129AFD894F859506581002D30 +:102D2000AAD0691E2942A7D1B4F85D8018F00F0F10 +:102D3000A4F80880A0D1B4F85F0018B904F16C00C1 +:102D4000FFF788F9B4F85A10002995D006FB03FE66 +:102D500001EB181CF44460458ED3A0EB0C00A84294 +:102D6000B0FBF5F388D33E48834285D84FF6F57023 +:102D700083426DD903259F1C114402EB0C03032DE4 +:102D8000E7626263A16323644CD1B4F8763053EAFE +:102D900008037FF471AFBB0004F17800FFF75AF924 +:102DA000E06303F2FF13B6EB532FFFF465AF4FF070 +:102DB000FF33032DC4E905334FF08003237187D11E +:102DC000B4F87C30012B83D1511C2046FFF710FB57 +:102DD00000287FF47DAFB4F84A224AF655232071CB +:102DE0009A427FF475AF1F4B04F14C00FFF732F9A4 +:102DF00098427FF46DAF03F1FF5304F50C70FFF7B9 +:102E000029F903F50053203398427FF461AF04F5AC +:102E10000D70FFF71FF9A06104F50E70FFF71AF9A6 +:102E2000606155E7B8F1000F3FF426AF7144022D01 +:102E30004FEA4703E1631EBFD91907F0010303EB13 +:102E40005103AEE70B2560E60C255EE603255CE644 +:102E500040F6F575AB428CBF022501258BE700BF1C +:102E6000F5FFFF0F525261412DE9F84F0746056803 +:102E7000884649B96E69C6B1EB6AB34298BF01266C +:102E8000AB69A3B9002405E0FFF76AFB01280446FB +:102E900003D801242046BDE8F88F421C00F0D28000 +:102EA000EB6A8342F6D84646EAE70126E8E72A7845 +:102EB000EB6A042A40F08380A6F1020A023B4FF03D +:102EC000010B9A4528BF4FF0000AD146696C28468D +:102ED00001EB1931FFF78CFA00283BD109F0070309 +:102EE000EA6AC9F3C8010BFA03F3901EDBB26A1851 +:102EF0004C4609F1010992F84C20814502EA03028F +:102F000033BF5B0000234FF40071DBB228BF99464A +:102F1000B2B90234631E0333BCD8012321462846CC +:102F20001A46FFF7E1FA0228B3D0012800F08A80A0 +:102F3000B8F1000F13D10223FB710028A9D130E0B2 +:102F4000CA450AD0002BD2D10131B1F5007FBDD2E4 +:102F50000123CCE74FF0FF34DCE70024DAE7FB790C +:102F6000022B07D1731CA342E7D0BB68F31ABB61E5 +:102F70000323FB7108F10102FB69A24205D113B1E1 +:102F80000133FB61D9E70223FBE70BB90123FB61A6 +:102F9000224641463846FFF747FC00284FD101231F +:102FA000FB61EA6AAB69023A6C6193429CBF03F130 +:102FB000FF33AB612B7943F001032B716AE7464580 +:102FC00014D1741C3846A34298BF02242146FFF74F +:102FD000C7FA01283FF45DAF431C33D0E0B16B6901 +:102FE000012B03D9EA6A934238BF1E4634460134A6 +:102FF000EB6AA34203D8012E7FF644AF0224214698 +:103000003846FFF7ADFA48B101283FF442AF01302E +:1030100018D0B442EBD135E7002CE7D04FF0FF32A7 +:1030200021462846FFF77CFB48B9B8F1000FB8D01D +:10303000224641462846FFF773FB0028B1D00128FD +:103040007FF427AF4FF0FF3424E700002DE9F84369 +:1030500006680446076B894633782037042B0CBF7B +:103060004FF080534FF40013BB429CBF0023836397 +:10307000836B73B1C7F30808B8F1000F3CD101337B +:10308000416B836339B93389B3EB571F34D80023BD +:10309000A36304200AE07389013B13EA57232BD171 +:1030A000FFF75EFA0128054602D80220BDE8F88342 +:1030B000421C01D10120F9E7F36A834216D8B9F125 +:1030C000000FE4D0616B2046FFF7CEFE0546C8B185 +:1030D0000128EAD0431CEDD001463046FFF752FCF0 +:1030E0000028E7D1E37943F00403E3712946304631 +:1030F0006563FEF7CDFFA0634C360020276346448E +:10310000E663D3E70720D1E7F8B50E460021044671 +:103110000768FFF7BDFA98B90546A16B3846FFF777 +:1031200067F968B93A78E36B042A1B780CD11B065F +:103130000ED5054601212046FFF788FF0028ECD078 +:10314000042808BF072006E0E52B01D0002BF0D1B2 +:103150000135B542EED1F8BDC16C4B1C2DE9F041F3 +:1031600004460568066B1FD1E5274FF00108A16BE7 +:103170002846FFF73DF998B92A78E36B042A09BF7E +:103180001A781F7002F07F021A7085F80380236B93 +:10319000B3420DD200212046FFF758FF0028E6D0A9 +:1031A000042808BF022003E0FFF772FA0028DBD0F2 +:1031B000BDE8F0812DE9F04105460068A96B06697C +:1031C000FFF716F9044620B9EB6B1A78852A03D06D +:1031D00002242046BDE8F081324603F1200153F875 +:1031E000040B8B4242F8040BF9D1777801377F0149 +:1031F000A7F16003B3F5007FEAD800212846FFF766 +:1032000025FF04280446E3D00028E2D1A96B2868F2 +:10321000FFF7EEF804460028DBD1EB6B1A78C02AE2 +:10322000D6D106F1200203F1200153F8040B8B42A2 +:1032300042F8040BF9D196F823300F222C33B3FB5C +:10324000F2F3B7EB431FC3D34FF0400800212846E9 +:10325000FFF7FCFE04280446BAD00028B9D1A96BB8 +:103260002868FFF7C5F804460028B2D1EB6B1A783E +:10327000C12AADD1B8F5187F09D206EB080203F1D7 +:10328000200153F8040B8B4242F8040BF9D108F1EA +:1032900020084745DAD8B8F5187F9AD83046FEF7A7 +:1032A0001FFF7388834294D092E700000B680022CE +:1032B00010B5036004460B6A83604B6AC261C37138 +:1032C00023F0FF03896AC0E90432C164FFF7E0F923 +:1032D00020B92046BDE81040FFF76CBF10BD0000CC +:1032E000F8B50368054601271C692046FEF7F8FE7D +:1032F000A070000A6678E0702846E96CFFF7C8F90C +:1033000020B1022828BF0220C0B2F8BDA96B2868EE +:10331000FFF76EF80028F4D1EB6B04F1200254F8AB +:10332000041B944243F8041BF9D12B68DF70002E74 +:10333000E7D000212846013EFFF788FEE0E70000C5 +:103340002DE9F8434FF0FF08064607680424454678 +:103350004FF6FF79B16B11B9002C73D063E038469A +:10336000FFF746F8044600285DD1F06B0378002B88 +:103370006ED03A78042A11D1852B4DD1336B30466B +:10338000F364FFF717FF044600284CD13B691B7913 +:1033900003F03F03B3712046BDE8F883C27AE52B02 +:1033A00002F03F02B27143D02E2B41D022F0200117 +:1033B00008293DD00F2A40D1590637D503F0BF0563 +:1033C000336B90F80D80F364437B434530D1428BDF +:1033D00072BB03780D21FC6823F04003DFF874E032 +:1033E000013B4B4301211EF801CB30F80CC009B35F +:1033F000FF2B1DD824F813C06146013301320D2A7A +:10340000F1D10278520605D521B1FF2B10D8002248 +:1034100024F81320013DEDB200213046FFF716FEDF +:103420000446002896D00023B363B4E7AB42CBD068 +:10343000FF25F1E7CC45E1D0FAE72DB9FEF740FED4 +:10344000404501D10024A6E74FF0FF33F364A2E723 +:103450000424E8E7BC9300082DE9F04F002187B071 +:103460000446D0F80090FFF713F9804670B999F838 +:103470000030042B33D1D9F80C00FEF779FF074652 +:103480002046FFF75DFF054620B18046404607B065 +:10349000BDE8F08FD9F810309A8CBA42F0D193F889 +:1034A00023B040265D4506D1D9F80C3033F81530ED +:1034B000002BE5D1EAE7F106D9F8103008BF023653 +:1034C000985B01F04DF8D9F80C30824633F81500BE +:1034D00001F046F88245D3D102360135E2E74FF0DC +:1034E000FF0A4FF0FF3B5546C4F84CB0A16B48466D +:1034F000FEF77EFF00285CD1E66B3778002F77D08F +:10350000F27AE52F02F03F03A37103D0120704D52E +:103510000F2B04D0C4F84CB04FE00F2B54D194F8CB +:103520004B3058063FD4790645D5236B07F0BF07CB +:1035300096F80DA0E364737B53453ED1738B002B4B +:103540003BD135780121D9F80C3005F03F050193C6 +:103550000D23013D5D43284B13F8012BB25A71B383 +:10356000FF2D059329D81046049200F0F9FF6B1C3B +:1035700003900293019B33F8150000F0F1FF0399CB +:1035800081421AD1049A029D1146059B1B4A93421F +:10359000E2D133785A0604D519B1019B33F81530BE +:1035A0005BB97D1EEDB200212046FFF74FFD0028DC +:1035B0009CD080466AE7BD42BDD0FF25F3E74FF6B9 +:1035C000FF708242E2D0F8E72DB93046FEF778FD71 +:1035D00050453FF45BAF94F84B30DB079AD40B2295 +:1035E00004F14001304605F0BFFD002892D14DE7BF +:1035F0004FF004084AE700BFBC930008C9930008D5 +:103600002DE9F04F90F84BB099B004461BF0A0059F +:1036100040F068810668F26832F81530002B4AD114 +:103620003378042B40F087800F230E352046B5FBFE +:10363000F3F5A91CFFF768FD8146002877D1236BBD +:103640000135A3EB4515E3795A07E56435D523F039 +:1036500004032046E371FFF77DF950BB4FF0FF32C2 +:10366000616B2046FFF7E0F818BBA3682BB3214637 +:1036700004A8FFF71BFEE0B970894FF40071D4E98C +:103680000423E0FB01233069C4E904233830FEF74A +:10369000EFFC3069D4E904232830FEF7E9FCE37934 +:1036A000326904A843F0010382F82130FFF718FEC5 +:1036B00018B181463BE00135AEE7D6E9035440221C +:1036C00000212046FEF72CFB852301214022237098 +:1036D000C0234FF0C10C04EB010884F82030002314 +:1036E0001E469E46571C04F802C0F0B2023204F88F +:1036F00007E021B135F8131009B10133DBB20F0A2D +:10370000A15408F802700232D706F2D135F81370CE +:103710000136002FE6D184F82330831C28466370DD +:10372000FEF726FE84F82400000A84F825004846A7 +:1037300019B0BDE8F08F04F140070DF1100A1BF03D +:10374000010F97E807008AE8070000F0D3804023C4 +:103750004FF0010884F84B30BC46F368B8F1050F10 +:103760009AE80700ACE803002CF8022B4FEA12425B +:103770008CF8002059D9981E424630F8021F0029C3 +:1037800042D10DF10F0C072102F00F0E91461209E4 +:103790000EF13000392888BF0EF1370001390CF8DE +:1037A000010902D0B9F10F0FEED818AB7E205A18DC +:1037B00002F8580C38460022914206D010F801CB8E +:1037C00002F1010EBCF1200F31D104F13F0C0729A9 +:1037D00002F1010297BF18AB20205818013198BFA1 +:1037E00010F8580C072A0CF80200F0D92046FFF711 +:1037F00033FE8146002878D108F10108B8F1640F42 +:10380000AAD14FF0070992E74FF0100C01F0010E1A +:1038100049080EEB4202D30344BF82F4883282F09F +:103820002102BCF1010CF1D1A7E74246A9E772469B +:10383000C2E7216B2046A1EB4511FEF729FF814627 +:1038400000287FF474AF4FF6FF783846FEF738FC57 +:103850000190A16B3046FEF7CBFD814600287FF436 +:1038600066AFE36BE9B2019A4FF00D0CD6F80CE0AD +:103870005A734FF00F02DFF8E0A0DA724A1E187395 +:103880000CFB02F284469876D87640451AF8019BE4 +:103890000CF1010C18BF3EF8120003EB090B18BF26 +:1038A000013203F809004FEA1029002808BF4046FA +:1038B000BCF10D0F8BF80190E7D1404502D03EF8E6 +:1038C00012200AB941F0400119700123002120465D +:1038D000F370FFF7BBFB814600287FF428AF013D62 +:1038E000B7D11BE04FF0060921E704287FF41FAF92 +:1038F00084F84BB01BF0020F20461BBF0C350D2186 +:103900000125B5FBF1F518BF01352946FFF7FCFB92 +:10391000814600287FF40BAF013D8AD1A16B304670 +:10392000FEF766FD814600287FF401AF01462022A4 +:10393000E06BFEF7F5F9E36B03CF18605960BA78D6 +:1039400039889A72198194F84B30E26B03F01803AE +:1039500013730123F370EAE6BC93000810B5044624 +:103960000A463430FEF776FB886004F13800FEF733 +:1039700073FBC2E9040194F8213003F00203D37110 +:103980000023D36110BD000003284B8B04BF8A8A3B +:1039900043EA0243184670472DE9F04F0B7899B07F +:1039A000044689462F2BD0F800B001D05C2B09D1FA +:1039B0004A461378914601322F2BFAD05C2BF8D06F +:1039C000002301E0DBF81C30A3600023E3619BF8D7 +:1039D0000030042B1ED1A368E3B1DBF82030214670 +:1039E00004A82362DBF824306362DBF82830A3628A +:1039F000FFF75CFC0346002854D1DBF8102002F1ED +:103A00003800FEF727FBC4E9040392F8213003F0E5 +:103A10000203E37199F800301F2B00F235818023F7 +:103A20000021204684F84B3019B0BDE8F04FFEF776 +:103A30002FBE49460B78894601312F2BFAD05C2BDB +:103A4000F8D01F2B8CBF00250425012F2FD1138800 +:103A50002E2B31D1002322F8173004F140029F426F +:103A60008CBF2E21202101330B2B02F8011BF6D134 +:103A700045F02005204684F84B50FFF7EDFC94F804 +:103A80004B30002800F0E78004280BD1990603F0A2 +:103A9000040240F1DC80002A00F0F6808023002040 +:103AA00084F84B3019B0BDE8F08F0425CDE7022F24 +:103AB00002D153882E2BCAD0911E87BB002322F837 +:103AC0001730002F00F0118132F81300194601332E +:103AD0002028F9D009B92E2801D145F00305901E00 +:103AE00030F817302E2B01D0013FF9D14FF02033A1 +:103AF0004FF0000A6364D0462364C4F847300823BB +:103B0000481C32F811600090F6B1202E03D02E2E02 +:103B10000DD1B84210D045F003050099F0E731F817 +:103B20001730202B01D02E2BC8D1013FC5E79A4575 +:103B300005D20099B9423BD10B2B30D101E00B2BC0 +:103B400027D145F003050B2394F84020E52A04BF54 +:103B5000052284F84020082B04BF4FEA88085FFA4A +:103B600088F808F00C030C2B03D008F00303032B98 +:103B700001D145F00205A8073FF57CAF18F0010F11 +:103B800018BF45F0100518F0040F18BF45F00805E0 +:103B900070E70099B94202D045F00305D4D84FEA46 +:103BA00088080B234FF0080A00975FFA88F8B4E7FB +:103BB0007F2E15D9304640F25231CDE9022345F02F +:103BC0000203019300F098FC10F0800F0646DDE937 +:103BD000022316D000F07F0646498E5D019D46B354 +:103BE00031464548CDE9012305F0E8FADDE9012336 +:103BF000F8B9A6F1410189B219291ED848F0020886 +:103C000010E0FF28EAD9591E8A4503D345F0030581 +:103C10009A4682E704EB0A01000A0AF1010A019DB3 +:103C200081F8400004EB0A010AF1010A81F84060C2 +:103C300073E745F003055F26F4E7A6F1610189B259 +:103C400019299EBF203E48F00108B6B2EAE7002AD3 +:103C500008BF052026E75A073FF524AFA379DB0606 +:103C600045D59BF80000042835D1A3682146E279A8 +:103C700023622369DBF8100023F0FF031343636220 +:103C8000E36CA362FFF76AFE23680027DA6819F87D +:103C9000010B00283FF409AF40F25231009200F0CE +:103CA0004BFC054608B31F28009A7FF6FEAE2F286E +:103CB0003FF4BFAE5C283FF4BCAE7F2805D8014678 +:103CC0000E4805F07BFA009A78B9FF2F0DD022F844 +:103CD00017500137DBE7216B0BF14C03C1F30801EF +:103CE0001944FFF751FEA060CEE70620DAE6052072 +:103CF000D8E600BF3C930008359300082C930008D9 +:103D00001FB5CDE9001003A814460391FEF700FA91 +:103D1000002815DB0B4A52F820300BB10021197036 +:103D2000019B0BB10021197042F820302CB1002208 +:103D300001A96846FEF7C8FE0446204604B010BD3F +:103D40000B24FAE73C3600202DE9F04798B0904666 +:103D500005460191002800F0528102F03F0603A9B8 +:103D600001A83246FEF7B0FE002840F04681039BD2 +:103D70004FF48C60049303F075FA0746002800F0B6 +:103D80004081039B00F500720199D86004A81A6174 +:103D9000FFF702FE044620B99DF95B30002BB8BF47 +:103DA000062418F01C0F00F0CD80002C4CD0042C01 +:103DB00040D104A8FFF724FC044600283AD146F07D +:103DC0000806039B1A78042A40F083801869294664 +:103DD0002B60FFF7C3FD039B1E22002118690230F0 +:103DE000FDF79EFF039C00211A2220692630FDF773 +:103DF00097FF236920221A71246903F06DFA0146A6 +:103E0000012208342046FEF72BF9039B04A81B6906 +:103E100083F82120FFF764FA044658B9A96801B372 +:103E200002462846FEF718FDAB68039A0446013B9C +:103E30005361B4B1384603F025FA0CB100232B606E +:103E4000204618B0BDE8F0879DF8163013F0110F2A +:103E500040F0848018F0040F40F0C98018F0080F7B +:103E6000AFD1039A31071399936C48BF46F04006CF +:103E7000E964AB641078042872D1069B9DF8171092 +:103E80002B62089B106923F0FF030B4329466B62EA +:103E9000179BAB62FFF762FDDDF80CA00024002247 +:103EA00005F15008BAF8063021464046C5F800A092 +:103EB000AB80002385F8306085F831406C64C5E93B +:103EC0000E234FF40072FDF72BFFB20653D40024EB +:103ED000B0E703F001FA0146009013980E30FEF7A8 +:103EE000BFF8139800991630FEF7BAF8039C13999F +:103EF0002078FFF749FD202300228046CB72204620 +:103F00001399FEF7D1F8139B002201211A775A77F3 +:103F10009A77DA77039BD970B8F1000FA1D04146A8 +:103F200004A8D3F84890FEF797FC0446002881D1F6 +:103F300049460398FEF75CFA039B044608F1FF30FC +:103F4000586176E7002C7FF475AF9DF81630DC06DB +:103F50004FD418F0020F84D0D80782D5072469E720 +:103F6000FFF712FD0023A86001F11C00FEF772F8B4 +:103F70006B61286190E7D5E9046956EA0903A6D088 +:103F8000BAF80AA0A9684FEA4A2AC5E90E69B245FB +:103F900074EB09031BD300242964002C7FF44AAF7F +:103FA000C6F30803002B92D0039C2046FEF770F85E +:103FB00008B3760A0123414646EAC95682196A6463 +:103FC000607802F0C5FC041E18BF012432E72846C1 +:103FD000FEF7C6FAB6EB0A06014669F100090128A8 +:103FE00003D9431CD3D10124D6E70224D4E7082403 +:103FF00020E704241EE702241CE704461EE70924E8 +:104000001EE711241CE700002DE9F04F994685B00A +:104010000023884603A90446C9F800301646FEF777 +:1040200091F8054680BB94F831506DBB94F8303060 +:1040300013F00103009300F0A68004F1500AD4E9C4 +:104040000432D4E90E011B1A62EB0102B34272F191 +:10405000000238BF1E46BEB1D4E90E10C1F30803FA +:10406000002B40F08280039B5A894B0A013A43EAB5 +:10407000C0531A401BD151EA000309D1A06801289E +:104080000DD8022584F83150284605B0BDE8F08FE0 +:10409000216C20460192FEF763FA019AEFE7431C78 +:1040A00004D10123009D84F83130EDE72064DDF870 +:1040B0000CB0216C5846FDF7EBFF0028E1D0B6F5B7 +:1040C000007F02EB000731D3BBF80A1002EB562049 +:1040D000730A88429BF8010088BF8B1A3A46414612 +:1040E000019302F035FC0028DBD194F93020019BCC +:1040F000002A0BDA606CC01B984207D24FF40072A2 +:10410000514608EB4020FDF7E5FD019B5F02D9F821 +:104110000030F61BB8443B44C9F80030D4E90E32F5 +:10412000DB1942F10002C4E90E3294E7626CBA4234 +:104130001AD094F93030002B0DDA012351469BF848 +:10414000010002F029FC0028ABD194F8303003F0D4 +:104150007F0384F83030039801233A465146407873 +:1041600002F0F6FB00289CD16764A16B4046C1F3C6 +:104170000801C1F500775144B74228BF37463A4697 +:10418000FDF7A8FDC3E707257EE7000070B596B0F0 +:104190000E460022019002A901A8FEF795FC0446F4 +:1041A000E0B94FF48C6003F05DF80546D8B1029B8E +:1041B00000F500720199D86002A81A61FFF7ECFBC4 +:1041C000044640B99DF95330002B0ADB1EB131463D +:1041D00002A8FDF7EDFF284603F054F8204616B07C +:1041E00070BD0624F7E71124F8E7000070B5B8B0F9 +:1041F0000222019003A901A8FEF766FC044608BB51 +:10420000039B4FF48C60109303F02CF805460028B4 +:1042100066D0039B00F500720199D86010A81A615E +:10422000FFF7BAFB044650B99DF88B30980655D479 +:10423000190653D49DF84630DA0706D507242846D8 +:1042400003F020F8204638B070BD039B0493187823 +:10425000042814D104A91869FFF780FB069E9DF875 +:104260004630DB0610D410A8FEF776FF044600287F +:10427000E5D156BB0398FEF7DBFB0446DFE71F9949 +:10428000FFF782FB0646EAE7039BDA69B242D5D024 +:1042900024930021269624A81B78042B01BFDDE976 +:1042A0000823CDE928239DF817308DF89730FEF7C5 +:1042B000EFF904460028C2D124A8FFF741F80446CC +:1042C0000028BBD00428BAD1CDE70246314604A865 +:1042D000FEF7C2FA04460028B1D1CBE70624AEE7C8 +:1042E0001124AFE7F0B5BDB0CDE900106846FDF789 +:1042F0000FFF022203A901A8FEF7E6FB04460028EF +:1043000041D1039B4FF48C60149302F0ABFF054640 +:10431000002800F0EE80039B00F5007214AE0199B6 +:10432000D8601A613046FFF737FB044640BB9DF862 +:104330009B3013F0A00F40F0D880039B009F1A78A9 +:10434000042A68D11B6904AC03F1400C18680833D7 +:1043500053F8041C2246634503C21446F6D150228A +:10436000314628A8FDF7B6FC394628A8FFF714FB0C +:10437000044600284CD12A9A169B9A4206D008245B +:10438000284602F07FFF20463DB0F0BD349A209BC6 +:104390009A42F4D128A8FFF733F904460028EFD158 +:1043A000039B04AF1B6993F801E093F823C09C8C36 +:1043B0003A46083303CAB24243F8080C43F8041CD7 +:1043C0001746F5D1039B28A81B6983F801E0039BDE +:1043D0001A6982F823C01A6982F82440240A82F8F4 +:1043E00025401A691379D9065CBF43F02003137185 +:1043F000FEF776FF04460028C2D13046FEF7ACFE39 +:1044000004460028BCD10398FEF712FB0446B7E728 +:104410000428B5D1BEE7239A04AB02F1200C106842 +:10442000083252F8041C1C46624503C42346F6D1E8 +:104430005022314628A8FDF74DFC394628A8FFF741 +:10444000ABFA044600284CD12A9A169B9A4296D180 +:10445000349A209B9A4292D128A8FFF7D1F80446BB +:1044600000288DD137990DF11D030DF12D0001F1BB +:104470000D0253F8044B834242F8044BF9D11888DB +:10448000012710809B7893709DF81B30039CDA06FF +:1044900058BF43F02003CB72E770CB7ADB06ACD574 +:1044A000169A2A9B9A42A8D02078FFF76DFA014607 +:1044B0002046FDF7EDFD0146C8B12046FDF798FF07 +:1044C000044600287FF45CAF039890F86D302E2BE3 +:1044D00093D12A9A00F16C01FDF7E6FD039BDF7092 +:1044E0008BE704287FF44CAFB6E7062448E70224A4 +:1044F00046E7112447E700007F2810B501D880B2B5 +:1045000010BDB0F5803F13D240F2523399420FD123 +:104510000849002231F8024B93B2844203D103F1DF +:104520008000C0B2ECE70132802AF3D11346F6E7EF +:104530000020E5E77C9600087F280DD940F2523331 +:10454000994208D1FF2806D800F10040034B80387B +:1045500033F8100070470020704700BF7C960008B9 +:10456000B0F5803FF0B522D21F4A83B21F49B0F5A3 +:10457000805F28BF0A46141D34F8042C2146AAB1D6 +:10458000934213D334F8025C2E0AEFB252FA85F547 +:10459000A84222DA082E09D8DFE806F0050A101230 +:1045A0001416181A1C00801A34F810301846F0BD82 +:1045B000981A00F001001B1A9BB2F7E7103BFBE7CB +:1045C000203BF9E7303BF7E71A3BF5E70833F3E721 +:1045D000503BF1E7A3F5E353EEE70434002ECBD1D3 +:1045E00001EB4702C7E700BFCC930008C095000865 +:1045F00008B5074B074A196801F03D0199605368F7 +:104600000BB190689847BDE8084003F09FB800BF21 +:10461000000002404436002008B5084B196889099B +:1046200001F03D018A019A60054AD3680BB1106917 +:104630009847BDE8084003F089B800BF0000024079 +:104640004436002008B5084B1968090C01F03D01FB +:104650000A049A60054A53690BB190699847BDE80E +:10466000084003F073B800BF000002404436002049 +:1046700008B5084B1968890D01F03D018A059A605B +:10468000054AD3690BB1106A9847BDE8084003F0AA +:104690005DB800BF000002404436002008B5074B5B +:1046A000074A596801F03D01D960536A0BB1906A1D +:1046B0009847BDE8084003F049B800BF0000024039 +:1046C0004436002008B5084B5968890901F03D01BE +:1046D0008A01DA60054AD36A0BB1106B9847BDE8CE +:1046E000084003F033B800BF000002404436002009 +:1046F00008B5084B5968090C01F03D010A04DA605D +:10470000054A536B0BB1906B9847BDE8084003F026 +:104710001DB800BF000002404436002008B5084B19 +:104720005968890D01F03D018A05DA60054AD36BAD +:104730000BB1106C9847BDE8084003F007B800BF04 +:10474000000002404436002008B5074B074A1968AC +:1047500001F03D019960536C0BB1906C9847BDE836 +:10476000084002F0F3BF00BF0004024044360020BE +:1047700008B5084B1968890901F03D018A019A6062 +:10478000054AD36C0BB1106D9847BDE8084002F0A4 +:10479000DDBF00BF000402404436002008B5084BCE +:1047A0001968090C01F03D010A049A60054A536D2D +:1047B0000BB1906D9847BDE8084002F0C7BF00BF3D +:1047C000000402404436002008B5084B1968890DE2 +:1047D00001F03D018A059A60054AD36D0BB1106E58 +:1047E0009847BDE8084002F0B1BF00BF0004024096 +:1047F0004436002008B5074B074A596801F03D01CF +:10480000D960536E0BB1906E9847BDE8084002F036 +:104810009DBF00BF000402404436002008B5084B8D +:104820005968890901F03D018A01DA60054AD36EB1 +:104830000BB1106F9847BDE8084002F087BF00BF7A +:10484000000402404436002008B5084B5968090CA2 +:1048500001F03D010A04DA60054A536F0BB1906F15 +:104860009847BDE8084002F071BF00BF0004024055 +:104870004436002008B5084B5968890D01F03D0108 +:104880008A05DA60054AD36F13B1D2F880009847E1 +:10489000BDE8084002F05ABF000402404436002040 +:1048A00000230C4910B51A460B4C0B6054F823003A +:1048B000026001EB430004334260402BF6D1074A0B +:1048C0004FF0FF339360D360C2F80834C2F80C3461 +:1048D00010BD00BF443600207C9700080000024055 +:1048E0000F28F8B510D9102810D0112811D012288F +:1048F00008D10F240720DFF8B4E00126DEF80050CD +:10490000A04208D9002649E00446F4E70F2400201D +:10491000F1E70724FBE706FA00F73D4240D1214CBE +:104920004FEA001C3D4304EB00160EEBC000CEF82E +:104930000050C0E90123FBB24BB11B48836B43F02D +:1049400001038363036E43F001030366036E17F4F0 +:104950007F4F09D01448836B43F002038363036ED7 +:1049600043F002030366036E54F80C00036823F05F +:104970001F030360056815F00105FBD104EB0C0370 +:104980003D2493F80CC05F6804FA0CF43C602124C9 +:104990000560446112B1987B00F0B4FC3046F8BD6C +:1049A0000130ADE77C9700080045025844360020EE +:1049B00010B5302484F31188FFF792FF002383F3AE +:1049C000118810BD10B50446807B00F0B1FC0123B6 +:1049D0001049627B03FA02F20B6823EA0203DAB29F +:1049E0000B604AB90C4A916B21F001019163116E81 +:1049F00021F001011166126E13F47F4F09D1064BAD +:104A00009A6B22F002029A631A6E22F002021A6670 +:104A10001B6E10BD443600200045025808B53023F7 +:104A200083F31188FFF7CEFF002383F3118808BDBD +:104A3000836CC26A8B42506810B506D95A1E4C006E +:104A400002EB4103B3FBF4F3184410BD01F0010382 +:104A50008A0748BF43F002034A0748BF43F00803F0 +:104A60000A0748BF43F00403CA0648BF43F01003D7 +:104A70008A06426B48BF43F02003134343637047E9 +:104A800010B5074C204600F0BFFF064B0022C4E9DA +:104A90001023054BA364054BE363054BE36410BD92 +:104AA000C83600200070005200B4C4041C37002037 +:104AB0001C390020C36A0BB90E4BC3620379012B6A +:104AC0000CD10D4B984209D10C4B5A6B42F48032F9 +:104AD0005A63DA6D42F48032DA65DB6D436C002292 +:104AE0001A65DA621A605A605A624FF0FF329A63AE +:104AF000704700BF7C980008C83600200045025867 +:104B00000379012B16D0436C00221A65DA621A6011 +:104B10005A605A624FF0FF329A63074B984209D1AC +:104B2000064B5A6B22F480325A63DA6D22F48032DB +:104B3000DA65DB6D704700BFC836002000450258BB +:104B400010B5446C0649FFF773FF6060236842F2BA +:104B5000107043F003032360BDE8104001F05ABD1C +:104B6000801A06000129F8B5466C0B4F09D175680B +:104B70000A493D40FFF75CFF054345F480557560E9 +:104B8000F8BD746806493C40FFF752FF044344F403 +:104B900080547460F4E700BF00ECFFFF80F0FA027D +:104BA00040787D01436C00225A601A607047000013 +:104BB000426C0129536823F4404304D0022905D0F4 +:104BC00001B95360704743F48043FAE743F400436C +:104BD000F7E70000436C41F480519A60D9605A6B4A +:104BE0001206FCD580229A637047000010B541F48C +:104BF0008851446CA260E160616B11F04502FBD00A +:104C0000A26311F0040203D0FFF720FF012010BDC2 +:104C1000616910461960FAE710B541F48851446C97 +:104C2000A260E160616B11F04502FBD0A26311F05C +:104C3000050203D0FFF70AFF012010BD616910468D +:104C40001960FAE773B5134604460E46302282F324 +:104C50001188426CD26B32B14FF0FF31403001937A +:104C600001F0E4FC019B606C00220265C263C26239 +:104C7000456B15F4807504D185F31188012002B0CD +:104C800070BD4FF0FF31816382F31188012E06D988 +:104C90000C21204602B0BDE87040FFF7BDBF1046B2 +:104CA000EDE7000073B5446C0E4600250192616B80 +:104CB000A1632565E562FFF7C9FE012E07D9019BB7 +:104CC0002A460C2102B0BDE87040FFF7A5BF02B034 +:104CD00070BD000010B541F49851446CA260E160D1 +:104CE000616B11F04502FBD0A26311F03F0203D0CB +:104CF000FFF7ACFE012010BD216A10461960E16982 +:104D00005960A16999606169D960F4E72DE9F743B9 +:104D100004460191006D01A91746984602F03EFC39 +:104D2000064600284AD0626C2046DDF8049055689B +:104D3000C5F3090501356B00A56CB5FBF3F54FF420 +:104D40007A73B5FBF3F55D43556200F023FE50BB6B +:104D5000636C4FF0FF3201254146C3F8589020465E +:104D60001D659A634FF49572DA6342F207029F62FF +:104D7000DA62E36C0A9AFFF74FFFA0B9E26C104BBE +:104D800011680B407BB929462046FFF75BFF0546BB +:104D900048B92E463A460199206D02F037FC30465C +:104DA00003B0BDE8F0833A460199206D02F02EFC75 +:104DB000E26C01212046FFF775FFF0E70126EEE7E0 +:104DC00008E0FFFD2DE9F7431F46436C01924FF4C5 +:104DD0007A725D6804468846C5F3090501356E00A0 +:104DE000856CB5FBF6F5B5FBF2F555435D6200F059 +:104DF000D1FD20B10125284603B0BDE8F0837E0235 +:104E000001A9206D324602F0C9FB05460028F1D009 +:104E1000636C019AD4F84C909A6501221A654FF0A0 +:104E2000FF329A634FF49572DA639E62236BDB065E +:104E30004B4658BF4FEA4828012F42461BD9122142 +:104E40002046FFF7E9FEC0B9D9F80020104B134007 +:104E50009BB9636C42F2930239462046DA62E26CF7 +:104E6000FFF7F0FE804640B932460199206D454675 +:104E700002F0CCFBBFE71121E2E732460199206D39 +:104E800002F0C4FBE26C39462046FFF70BFFB2E7A5 +:104E900008E0FFFD2DE9F3411F46436C01924FF4FA +:104EA0007A725D6804468846C5F3090501356E00CF +:104EB000856CB5FBF6F5B5FBF2F555435D6200F088 +:104EC00069FD20B10125284602B0BDE8F0817E02CF +:104ED00001A9206D324602F0A7FB05460028F1D05B +:104EE000636C019A9A6501221A654FF0FF329A634A +:104EF0004FF48D72DA639E62236BE66CDB063346F9 +:104F000058BF4FEA4828012F424619D91921204697 +:104F1000FFF782FEB0B932680F4B134093B9636C50 +:104F200042F2910239462046DA62E26CFFF78AFECD +:104F3000064638B901993546206D02F0B1FBC2E74B +:104F40001821E4E70199206D02F0AAFBE26C3946D2 +:104F50002046FFF7A7FEB6E708E0FFFD12F0030FBB +:104F60002DE9F04107460C4615461E4617D00E4463 +:104F7000B44202D10020BDE8F0810123FA6B214642 +:104F80003846FFF71FFF0028F5D128464FF400727E +:104F9000F96B05F500750134FCF79CFEE8E7BDE808 +:104FA000F041FFF70FBF000012F0030F2DE9F041B1 +:104FB00007460C4615461E4617D00E44B44202D191 +:104FC0000020BDE8F08129464FF40072F86B05F52A +:104FD0000075FCF77FFE0123FA6B21463846FFF788 +:104FE00059FF0028EDD10134E8E7BDE8F041FFF7B3 +:104FF00051BF000000207047302310B583F31188A3 +:105000000024436C40302146DC6301F01DFB84F337 +:10501000118810BD026843681143016003B118474D +:1050200070470000024A136843F0C00313607047E2 +:1050300000440040024A136843F0C0031360704705 +:1050400000480040024A136843F0C00313607047F1 +:1050500000780040044B9A6C02439A641A6F104324 +:1050600018671B6F704700BF0045025837B5274CC3 +:10507000274D204600F028FD04F114000094002381 +:105080004FF40072234900F0C3F94FF40072224933 +:1050900004F138000094214B00F03CFA204BC4E9A5 +:1050A0001735204C204600F00FFD04F11400009449 +:1050B00000234FF400721C4900F0AAF94FF400726B +:1050C0001A4904F138000094194B00F023FA194BE7 +:1050D000C4E91735184C204600F0F6FC04F1140022 +:1050E00000234FF400721549009400F091F9144B1D +:1050F0004FF40072134904F13800009400F00AFAEA +:10510000114BC4E9173503B030BD00BF2039002072 +:1051100000E1F505643A00206440002025500008B5 +:10512000004400408C390020643C00206442002090 +:105130003550000800480040F8390020643E002047 +:1051400045500008644400200078004038B5264DE2 +:105150000446037C002918BF0D46012B06D1234BC2 +:10516000984230D14FF40030FFF774FF2A68236E65 +:10517000E16D03EB5203A566B3FBF2F36A6810041A +:1051800042BF23F0070003F0070343EA4003CB606C +:10519000AB6843F040034B60EB6843F001038B6066 +:1051A00042F4967343F001030B604FF0FF330B6240 +:1051B000510505D512F0102211D0B2F1805F10D048 +:1051C00084F8643038BD0A4B984205D0094B9842A8 +:1051D000CCD14FF08040C7E74FF48020C4E77F2355 +:1051E000EEE73F23ECE700BF849800082039002059 +:1051F0008C390020F83900202DE9F047C66D0546AE +:105200003768F469210734621AD014F0080118BF16 +:105210004FF48071E20748BF41F02001A3074FF02F +:10522000300348BF41F04001600748BF41F08001B2 +:1052300083F31188281DFFF7EDFE002383F3118807 +:10524000E2050AD5302383F311884FF48061281DCD +:10525000FFF7E0FE002383F311884FF030094FF091 +:10526000000A14F0200838D13B0616D54FF030095B +:1052700005F1380A200610D589F31188504600F050 +:105280007DF9002836DA0821281DFFF7C3FE27F034 +:1052900080033360002383F31188790614D56206F6 +:1052A00012D5302383F31188D5E913239A4208D10C +:1052B0002B6C33B127F040071021281DFFF7AAFE01 +:1052C0003760002383F31188E30618D5AA6E1369AB +:1052D000ABB15069BDE8F047184789F31188736A8C +:1052E000284695F86410194000F008FC8AF31188EC +:1052F000F469B6E7B06288F31188F469BAE7BDE8EB +:10530000F0870000090100F16043012203F56143C9 +:10531000C9B283F8001300F01F039A4043099B00B1 +:1053200003F1604303F56143C3F880211A607047BD +:1053300000F01F0301229A40430900F160409B00E6 +:1053400000F5614003F1604303F56143C3F8802039 +:10535000C3F88021002380F800337047F8B5154664 +:10536000826804460B46AA4200D28568A169266974 +:10537000761AB5420BD218462A46FCF7ABFCA36955 +:105380002B44A3612846A3685B1BA360F8BD0CD91E +:10539000AF1B18463246FCF79DFC3A46E1683044A4 +:1053A000FCF798FCE3683B44EBE718462A46FCF719 +:1053B00091FCE368E5E7000083689342F7B5044693 +:1053C000154600D28568D4E90460361AB5420BD27E +:1053D0002A46FCF77FFC63692B4463612846A36877 +:1053E0005B1BA36003B0F0BD0DD93246AF1B01912A +:1053F000FCF770FC01993A46E0683144FCF76AFC1E +:10540000E3683B44E9E72A46FCF764FCE368E4E729 +:1054100010B50A440024C361029B8460C16002612C +:105420000362C0E90000C0E9051110BD08B5D0E96C +:105430000532934201D1826882B98268013282606A +:105440005A1C426119700021D0E904329A4224BFEB +:10545000C368436101F012F9002008BD4FF0FF302E +:10546000FBE7000070B5302304460E4683F3118835 +:10547000A568A5B1A368A269013BA360531CA36101 +:1054800015782269934224BFE368A361E3690BB1F5 +:1054900020469847002383F31188284607E03146C9 +:1054A000204601F0DBF80028E2DA85F3118870BDB0 +:1054B0002DE9F74F04460E4617469846D0F81C9043 +:1054C0004FF0300A8AF311884FF0000B154665B192 +:1054D0002A4631462046FFF741FF034660B9414660 +:1054E000204601F0BBF80028F1D0002383F3118897 +:1054F000781B03B0BDE8F08FB9F1000F03D0019025 +:105500002046C847019B8BF31188ED1A1E448AF38D +:105510001188DCE7C160C361009B82600362C0E95F +:1055200005111144C0E9000001617047F8B5044657 +:105530000D461646302383F31188A768A7B1A368E8 +:10554000013BA36063695A1C62611D70D4E9043297 +:105550009A4224BFE3686361E3690BB12046984730 +:10556000002080F3118807E03146204601F076F8EC +:105570000028E2DA87F31188F8BD0000D0E905239E +:1055800010B59A4201D182687AB98268002101324D +:1055900082605A1C82611C7803699A4224BFC368E6 +:1055A000836101F06BF8204610BD4FF0FF30FBE740 +:1055B0002DE9F74F04460E4617469846D0F81C9042 +:1055C0004FF0300A8AF311884FF0000B154665B191 +:1055D0002A4631462046FFF7EFFE034660B94146B2 +:1055E000204601F03BF80028F1D0002383F3118816 +:1055F000781B03B0BDE8F08FB9F1000F03D0019024 +:105600002046C847019B8BF31188ED1A1E448AF38C +:105610001188DCE70379052B05BF836A0020012090 +:105620004B6004BF4FF400730B60704770B55D1E94 +:10563000866A04460D44B54205D9436B43F08003A6 +:105640004363012070BD06250571FFF787FC052324 +:105650002371F7E770B55D1E866A04460D44B542B6 +:1056600005D9436B43F080034363012070BD0725D8 +:105670000571FFF799FC05232371F7E738B5057924 +:105680000446052D05D108230371FFF7B3FC2571EE +:1056900038BD0120FCE700000323F0B5037185B09D +:1056A0000446FFF74DFA002220461146FFF792FA12 +:1056B0004FF4D57203AB08212046FFF7ADFA02463E +:1056C000B8B901232363039BC3F30323012B09D13F +:1056D00003AB37212046FFF79FFA18B9A44B039A72 +:1056E0001340ABB120460125FFF75CFA022323717A +:1056F00037E103AB002237212046FFF78DFA28B9A6 +:105700009B4A039B1A40002A00F0A78002232363D0 +:10571000236B03F00F03022B40F0A9806425954E04 +:1057200042F2107000F076FF03AB324601212046B2 +:10573000FFF75CFA0028D5D1039B002B80F2938001 +:105740005A0003D5236B43F010032363002204F1B6 +:10575000080302212046FFF7BDFA02460028C1D106 +:1057600004F1380303212046FFF756FA0028B9D187 +:1057700004F11805A26B092120462B46FFF7AAFA6F +:105780000028AFD102ABA26B07212046FFF744FAF5 +:1057900006460028A6D1236B03F00F03022B40F02E +:1057A0008F807E227F21284603F02CFA012840F2C8 +:1057B0008780E76B42F2107000F02CFF08234FF453 +:1057C0000072394620460096FFF7A0FA002889D1DA +:1057D000384603F065FA236BA06203F00F03022B37 +:1057E00072D103AB644A06212046FFF715FA002860 +:1057F00071D15F49039B1940B1FA81F149092046F3 +:10580000FFF7B0F902AB4FF4007210212046FFF70A +:1058100003FA054600287FF465AF554E029B3342DC +:105820007FF460AF236B13F00E0F03F00F0273D001 +:10583000022A7FF457AFE36A1978012900F09480B7 +:10584000022900F09380002900F089804B4F204608 +:10585000FFF7AEF903AB3A4676E0114620462263E5 +:10586000FFF7B8F954E7013D7FF45AAF3AE7444DEA +:105870006426444A3E4F012B18BF154603AB002255 +:1058800037212046FFF7C8F900287FF42BAF039B90 +:105890003B427FF427AF03AB2A4629212046FFF77E +:1058A000A5F900287FF41EAF039B002BFFF648AF3D +:1058B000013E3FF417AF42F2107000F0ABFEDDE79F +:1058C000284603F0C1F986E77E227F212846E66B51 +:1058D00003F098F908B9002191E7002340223146EE +:1058E000204600930623FFF711FA0028F3D1B3896D +:1058F0005BBA9B07EFD5244B4022314620460093EC +:105900000623FFF703FA0028E5D1317C01F00F01EF +:105910000F3918BF012172E7E36A1978F9B101293B +:105920007FF4E0AE2046FFF743F903ABA26B3721CB +:105930002046FFF771F900287FF4D4AE039B334271 +:105940007FF4D0AE03AB022206212046FFF764F9B4 +:1059500000287FF4C7AE039B33427FF4C3AE052318 +:105960002371284605B0F0BD084F70E7084F6EE779 +:1059700008E0FFFD0080FFC00001B9030000B7038D +:105980000080FF5000001080F1FFFF800001B7038E +:105990000002B70337B504460C4D01ABA26B0D21D5 +:1059A0002046FFF739F978B9019B2B420BD1C3F39D +:1059B0004323042B08D0053B022B04D84FF47A7004 +:1059C00000F028FEE9E7012003B030BD08E0FFFD4C +:1059D00070B53023054683F3118803790024022B28 +:1059E00003D184F31188204670BD0423037184F32E +:1059F00011880226FFF7CEFF04462846FFF7D2F8AB +:105A00002E71F0E7FFF73CB8044B036001230371EC +:105A100000234363C0E90A33704700BF9C98000825 +:105A200010B53023044683F31188C162FFF742F8B2 +:105A300002230020237180F3118810BD10B530239C +:105A4000044683F31188FFF75BF800230122E36229 +:105A5000227183F3118810BD02684368114301600D +:105A600003B11847704700001430FFF721BD000054 +:105A70004FF0FF331430FFF71BBD00003830FFF745 +:105A800097BD00004FF0FF333830FFF791BD0000A5 +:105A90001430FFF7E7BC00004FF0FF311430FFF780 +:105AA000E1BC00003830FFF741BD00004FF0FF328D +:105AB0003830FFF73BBD0000012914BF6FF0130021 +:105AC00000207047FFF7D2BA044B03600023436005 +:105AD000C0E9023301230374704700BFC098000877 +:105AE00010B53023044683F31188FFF72FFB022300 +:105AF0000020237480F3118810BD000038B5C369FD +:105B000004460D461BB904210844FFF7A5FF2946AA +:105B100004F11400FFF78AFC002806DA201D4FF478 +:105B20000061BDE83840FFF797BF38BD02684368A1 +:105B30001143016003B118477047000013B5406B73 +:105B400000F58054D4F8A4381A681178042914D1C7 +:105B5000017C022911D11979012312898B4013424A +:105B60000BD101A94C3002F07BFFD4F8A4480246C7 +:105B7000019B2179206800F0DFF902B010BD000020 +:105B8000143002F0FDBE00004FF0FF33143002F07D +:105B9000F7BE00004C3002F0CFBF00004FF0FF33E3 +:105BA0004C3002F0C9BF0000143002F0CBBE000040 +:105BB0004FF0FF31143002F0C5BE00004C3002F04F +:105BC0009BBF00004FF0FF324C3002F095BF000049 +:105BD0000020704710B500F58054D4F8A4381A6836 +:105BE0001178042917D1017C022914D15979012394 +:105BF00052898B4013420ED1143002F05DFE0246F2 +:105C000048B1D4F8A4484FF4407361792068BDE8E6 +:105C1000104000F07FB910BD406BFFF7DBBF000004 +:105C2000704700007FB5124B01250426044603602F +:105C30000023057400F1840243602946C0E9023361 +:105C40000C4B0290143001934FF44073009602F015 +:105C50000FFE094B04F69442294604F14C000294CD +:105C6000CDE900634FF4407302F0D6FE04B070BD7E +:105C7000E8980008195C00083D5B00080A683023BA +:105C800083F311880B790B3342F823004B791333DC +:105C900042F823008B7913B10B3342F8230000F54F +:105CA0008053C3F8A41802230374002080F31188E2 +:105CB0007047000038B5037F044613B190F85430A4 +:105CC000ABB90125201D0221FFF730FF04F11400BC +:105CD0006FF00101257700F0DDFC04F14C0084F841 +:105CE00054506FF00101BDE8384000F0D3BC38BD1E +:105CF00010B5012104460430FFF718FF0023237775 +:105D000084F8543010BD000038B504460025143026 +:105D100002F0C6FD04F14C00257702F095FE201D2F +:105D200084F854500121FFF701FF2046BDE83840B8 +:105D3000FFF750BF90F8803003F06003202B06D1AE +:105D400090F881200023212A03D81F2A06D800209A +:105D50007047222AFBD1C0E91D3303E0034A4267A2 +:105D600007228267C3670120704700BF44220020DA +:105D700037B500F58055D5F8A4381A68117804298C +:105D80001AD1017C022917D11979012312898B407C +:105D9000134211D100F14C04204602F015FF58B116 +:105DA00001A9204602F05CFED5F8A4480246019BFA +:105DB0002179206800F0C0F803B030BD01F10B0379 +:105DC000F0B550F8236085B004460D46FEB130238F +:105DD00083F3118804EB8507301D0821FFF7A6FE29 +:105DE000FB6806F14C005B691B681BB1019002F077 +:105DF00045FE019803A902F033FE024648B1039B19 +:105E00002946204600F098F8002383F3118805B056 +:105E1000F0BDFB685A691268002AF5D01B8A013B65 +:105E20001340F1D104F18002EAE70000133138B5E4 +:105E300050F82140ECB1302383F3118804F58053EE +:105E4000D3F8A4281368527903EB8203DB689B69BB +:105E50005D6845B104216018FFF768FE294604F12A +:105E6000140002F033FD2046FFF7B4FE002383F355 +:105E7000118838BD7047000001F062BD0123402247 +:105E8000002110B5044600F8303BFBF749FF002322 +:105E9000C4E9013310BD000010B53023044683F37C +:105EA00011882422416000210C30FBF739FF204685 +:105EB00001F068FD02230020237080F3118810BDDB +:105EC00070B500EB8103054650690E461446DA6052 +:105ED00018B110220021FBF723FFA06918B110228E +:105EE0000021FBF71DFF31462846BDE8704001F058 +:105EF00049BE000083682022002103F0011310B581 +:105F0000044683601030FBF70BFF2046BDE81040CD +:105F100001F0C4BEF0B4012500EB810447898D4037 +:105F2000E4683D43A469458123600023A260636067 +:105F3000F0BC01F0E1BE0000F0B4012500EB8104EB +:105F400007898D40E4683D4364690581236000232F +:105F5000A2606360F0BC01F057BF000070B502237F +:105F600000250446242203702946C0F888500C30CE +:105F700040F8045CFBF7D4FE204684F8705001F032 +:105F800095FD63681B6823B129462046BDE8704033 +:105F9000184770BD0378052B10B504460AD080F869 +:105FA0008C300523037043681B680BB104219847AC +:105FB0000023A36010BD00000178052906D190F8E8 +:105FC0008C20436802701B6803B1184770470000BB +:105FD00070B590F87030044613B1002380F870302B +:105FE00004F18002204601F07DFE63689B68B3B92E +:105FF00094F8803013F0600535D00021204602F07F +:106000006FF90021204602F05FF963681B6813B145 +:10601000062120469847062384F8703070BD20463C +:1060200098470028E4D0B4F88630A26F9A4288BF1F +:10603000A36794F98030A56F002B4FF0300380F2F6 +:106040000381002D00F0F280092284F8702083F390 +:10605000118800212046D4E91D23FFF76DFF00239E +:1060600083F31188DAE794F8812003F07F0343EA91 +:10607000022340F20232934200F0C58021D8B3F5EA +:10608000807F48D00DD8012B3FD0022B00F09380A9 +:10609000002BB2D104F1880262670222A267E36793 +:1060A000C1E7B3F5817F00F09B80B3F5407FA4D1B9 +:1060B00094F88230012BA0D1B4F8883043F0020369 +:1060C00032E0B3F5006F4DD017D8B3F5A06F31D0E3 +:1060D000A3F5C063012B90D86368204694F8822012 +:1060E0005E6894F88310B4F88430B047002884D0F8 +:1060F000436863670368A3671AE0B3F5106F36D08F +:1061000040F6024293427FF478AF5C4B6367022310 +:10611000A3670023C3E794F88230012B7FF46DAFAF +:10612000B4F8883023F00203A4F88830C4E91D5580 +:10613000E56778E7B4F88030B3F5A06F0ED194F836 +:106140008230204684F88A3001F00EFD63681B68B7 +:1061500013B1012120469847032323700023C4E98B +:106160001D339CE704F18B0363670123C3E72378A6 +:10617000042B10D1302383F311882046FFF7BAFE99 +:1061800085F311880321636884F88B5021701B68A4 +:106190000BB12046984794F88230002BDED084F86B +:1061A0008B300423237063681B68002BD6D0022138 +:1061B00020469847D2E794F8843020461D0603F025 +:1061C0000F010AD501F080FD012804D002287FF4D8 +:1061D00014AF2B4B9AE72B4B98E701F067FDF3E7E1 +:1061E00094F88230002B7FF408AF94F8843013F0D9 +:1061F0000F01B3D01A06204602D502F089F8ADE7A8 +:1062000002F07AF8AAE794F88230002B7FF4F5AE1A +:1062100094F8843013F00F01A0D01B06204602D55D +:1062200002F05EF89AE702F04FF897E7142284F83C +:10623000702083F311882B462A4629462046FFF713 +:1062400069FE85F31188E9E65DB1152284F87020B6 +:1062500083F3118800212046D4E91D23FFF75AFE5D +:10626000FDE60B2284F8702083F311882B462A4622 +:1062700029462046FFF760FEE3E700BF18990008B3 +:10628000109900081499000838B590F87030044649 +:10629000002B3ED0063BDAB20F2A34D80F2B32D86F +:1062A000DFE803F037313108223231313131313119 +:1062B00031313737856FB0F886309D4214D2C368CC +:1062C0001B8AB5FBF3F203FB12556DB9302383F340 +:1062D00011882B462A462946FFF72EFE85F31188A2 +:1062E0000A2384F870300EE0142384F870303023D1 +:1062F00083F31188002320461A461946FFF70AFE49 +:10630000002383F3118838BDC36F03B1984700237E +:10631000E7E70021204601F0E3FF0021204601F0DD +:10632000D3FF63681B6813B10621204698470623F4 +:10633000D7E7000010B590F870300446142B29D030 +:1063400017D8062B05D001D81BB110BD093B022B75 +:10635000FBD80021204601F0C3FF0021204601F0B8 +:10636000B3FF63681B6813B10621204698470623D4 +:1063700019E0152BE9D10B2380F87030302383F31B +:10638000118800231A461946FFF7D6FD002383F330 +:106390001188DAE7C3689B695B68002BD5D1C36FAE +:1063A00003B19847002384F87030CEE70023826859 +:1063B00080F8243083691B6899689142FBD25A683F +:1063C00003604260106058607047000000238268DC +:1063D00080F8243083691B6899689142FBD85A6819 +:1063E00003604260106058607047000008B50846BE +:1063F000302383F3118891F82430032B05D0042B2C +:106400000DD02BB983F3118808BD8B6A00221A6066 +:106410004FF0FF338362FFF7C9FF0023F2E7D1E9B2 +:10642000003213605A60F3E7034610B51B689842C8 +:1064300003D09C688A689442F8D25A680B604A601C +:106440001160596010BD0000FFF7B0BF064BD9685E +:1064500081F824001868026853601A600122D8602D +:1064600080F82420F9F7CEBF684600200C4B30B5E9 +:10647000DD684B1C87B004460FD02B46094A68469E +:1064800000F09CF92046FFF7E1FF009B13B168463E +:1064900000F09EF9A86A07B030BDFFF7D7FFF9E713 +:1064A00068460020ED630008044B1A68DB689068BA +:1064B0009B68984294BF00200120704768460020E6 +:1064C000094B10B51C68D868226853601A60012215 +:1064D000DC6084F82420FFF779FF01462046BDE800 +:1064E0001040F9F78FBF00BF68460020044B1A68C0 +:1064F000DB6892689B689A4201D9FFF7E1BF704759 +:106500006846002038B50123084C002523706560DB +:1065100002F0F4FB02F01AFC0549064802F0F0FC18 +:106520000223237085F3118838BD00BF1049002075 +:10653000209900086846002000F080B9034A51689D +:1065400053685B1A9842FBD8704700BF001000E008 +:106550008B604B630023CA6100F128020B630223A6 +:106560000A618B840123886181F8263001F11003D0 +:10657000C26A4A611360C36201F12C030846CB6210 +:1065800070470000D0E90131026841F8183CA1F1E0 +:106590009C033839CB60036941F8243C436941F8D6 +:1065A000203C034B41F8043CC3680248FFF7D0BFCE +:1065B0001D0400086846002008B5FFF7E3FFBDE8AA +:1065C0000840FFF741BF000038B50E4BDC6804F10E +:1065D0002C05A062E06AA8420FD194F826303BB99E +:1065E00094F825309B0702BFD4E9043213605A6047 +:1065F0000F20BDE83840FFF729BF0368E362FFF7CB +:1066000023FFE7E768460020302383F31188FFF774 +:10661000DBBF000008B50146302383F31188082052 +:10662000FFF724FF002383F3118808BD054BDB68C7 +:1066300021B1036098620320FFF718BF4FF0FF30CD +:10664000704700BF6846002003682BB1002202603B +:1066500018469962FFF7F8BE70470000064BDB68EA +:1066600039B1426818605A60136043600420FFF734 +:10667000FDBE4FF0FF307047684600200368984227 +:1066800006D01A680260506018469962FFF7DCBEB7 +:106690007047000038B504460D462068844200D19A +:1066A00038BD036823605C608562FFF7CDFEF4E7C8 +:1066B000036810B59C68A2420CD85C688A600B60C5 +:1066C0004C602160596099688A1A9A604FF0FF33D4 +:1066D000836010BD121B1B68ECE700000A2938BF5D +:1066E0000A2170B504460D460A26601902F000FB27 +:1066F00002F0E8FA041BA54203D8751C04462E4696 +:10670000F3E70A2E04D90120BDE8704002F0C0BCB6 +:1067100070BD0000F8B5144B0D460A2A4FF00A0769 +:10672000D96103F11001826038BF0A224160196902 +:106730001446016048601861A81802F0C9FA02F016 +:10674000C1FA431B0646A34206D37C1C28192746E0 +:10675000354602F0CDFAF2E70A2F04D90120BDE850 +:10676000F84002F095BCF8BD68460020F8B5064632 +:106770000D4602F0A7FA0F4A134653F8107F9F42C6 +:1067800006D12A4601463046BDE8F840FFF7C2BFB1 +:10679000D169BB68441A2C1928BF2C46A34202D9E0 +:1067A0002946FFF79BFF224631460348BDE8F840E3 +:1067B000FFF77EBF6846002078460020C0E903232B +:1067C000002310B45DF8044B4361FFF7CFBF000016 +:1067D00010B5194C236998420DD08168D0E9003278 +:1067E00013605A609A680A449A60002303604FF06D +:1067F000FF33A36110BD0268234643F8102F536096 +:106800000022026022699A4203D1BDE8104002F0E2 +:1068100069BA936881680B44936002F053FA226965 +:10682000E1699268441AA242E4D91144BDE81040DB +:10683000091AFFF753BF00BF684600202DE9F04753 +:10684000DFF8BC8008F110072C4ED8F8105002F089 +:1068500039FAD8F81C40AA68031B9A423ED814445F +:106860004FF00009D5E90032C8F81C4013605A60A7 +:10687000C5F80090D8F81030B34201D102F032FAD6 +:1068800089F31188D5E9033128469847302383F3EB +:1068900011886B69002BD8D002F014FA6A69A0EB5A +:1068A000040982464A450DD2022002F0F1FB002283 +:1068B000D8F81030B34208D151462846BDE8F04719 +:1068C000FFF728BF121A2244F2E712EB0909294602 +:1068D000384638BF4A46FFF7EBFEB5E7D8F8103028 +:1068E000B34208D01444C8F81C00211AA960BDE8BE +:1068F000F047FFF7F3BEBDE8F08700BF7846002001 +:106900006846002038B502F0DDF9054AD2E90845AD +:10691000031B181945F10001C2E9080138BD00BF89 +:106920006846002010B560B9074804790368053C43 +:106930009B6818BF0124984708B144F0040420461E +:1069400010BD0124FBE700BFC8360020FFF7EABFF7 +:106950002DE9F047884617469A460446B0B90D4ED1 +:106960003579052D05D003240DE0013D15F0FF0517 +:106970000ED03268534639463046D2F8149042461B +:10698000C8470028F1D12046BDE8F0870424FAE783 +:106990000124F8E7C83600202DE9F047884617465D +:1069A0009A460446B0B90D4E3579052D05D003241D +:1069B0000DE0013D15F0FF050ED032685346394613 +:1069C0003046D2F818904246C8470028F1D12046F8 +:1069D000BDE8F0870424FAE70124F8E7C836002070 +:1069E00037B50C46154670B951B101290BD107488E +:1069F000694603681B6A984710B9019B04462B60DF +:106A0000204603B030BD0424FAE700BFC83600209A +:106A100000207047FEE70000704700004FF0FF3095 +:106A2000704700004B6843608B688360CB68C3602D +:106A30000B6943614B6903628B6943620B680360B6 +:106A40007047000008B53C4B40F2FF713B48D3F85B +:106A500088200A43C3F88820D3F8882022F4FF62F4 +:106A600022F00702C3F88820D3F88830344B1A6C20 +:106A70000A431A649A6E0A439A66324A9B6E11461A +:106A8000FFF7D0FF00F5806002F11C01FFF7CAFF9D +:106A900000F5806002F13801FFF7C4FF00F5806067 +:106AA00002F15401FFF7BEFF00F5806002F17001B2 +:106AB000FFF7B8FF00F5806002F18C01FFF7B2FF2D +:106AC00000F5806002F1A801FFF7ACFF00F58060DF +:106AD00002F1C401FFF7A6FF00F5806002F1E001BA +:106AE000FFF7A0FF00F5806002F1FC01FFF79AFFBD +:106AF00002F58C7100F58060FFF794FF01F09CFCBB +:106B0000114BD3F8902242F00102C3F89022D3F83F +:106B1000942242F00102C3F894220522C3F898207F +:106B20004FF06052C3F89C20084AC3F8A020BDE88B +:106B3000084000F0F3BC00BF0044025800000258B7 +:106B4000004502583499000800ED00E01F000803DA +:106B500008B501F079FEFFF7D5FC0D4BDA6B42F07A +:106B60004002DA635A6E22F040025A665B6E094BAD +:106B70001A6842F008021A601A6842F004021A60A9 +:106B800000F096FD00F032FBBDE8084000F0B4B81C +:106B90000045025800180248012070470020704745 +:106BA0007047000002290CD0032904D001290748AE +:106BB00018BF00207047032A05D8054800EBC20023 +:106BC0007047044870470020704700BF389B00089A +:106BD00054220020EC9A000870B59AB00546084689 +:106BE000144601A900F0C2F801A8FBF791F8431C74 +:106BF0000022C6B25B001046C5E9003423700323AF +:106C0000023404F8013C01ABD1B202348E4201D807 +:106C10001AB070BD13F8011B013204F8010C04F81E +:106C2000021CF1E708B5302383F311880348FFF70E +:106C30009FF8002383F3118808BD00BF1849002086 +:106C400090F8803003F01F02012A07D190F88120CC +:106C50000B2A03D10023C0E91D3315E003F06003C4 +:106C6000202B08D1B0F884302BB990F88120212A4C +:106C700003D81F2A04D8FFF75DB8222AEBD0FAE721 +:106C8000034A426707228267C3670120704700BF3B +:106C90004B22002007B5052917D8DFE801F01916A7 +:106CA00003191920302383F31188104A0121019020 +:106CB000FFF706F9019802210D4AFFF701F90D4887 +:106CC000FFF722F8002383F3118803B05DF804FB7B +:106CD000302383F311880748FEF7ECFFF2E73023F7 +:106CE00083F311880348FFF703F8EBE78C9A000859 +:106CF000B09A00081849002038B50C4D0C4C2A46B3 +:106D00000C4904F10800FFF767FF05F1CA0204F11E +:106D100010000949FFF760FF05F5CA7204F1180079 +:106D20000649BDE83840FFF757BF00BFF0610020BB +:106D300054220020689A0008729A0008819A00087C +:106D400070B5044608460D46FAF7E2FFC6B2204683 +:106D5000013403780BB9184670BD32462946FAF75C +:106D6000C3FF0028F3D10120F6E700002DE9F0472A +:106D700005460C46FAF7CCFF2B49C6B22846FFF76A +:106D8000DFFF08B10E36F6B228492846FFF7D8FFD4 +:106D900008B11036F6B2632E0BD8DFF88C80DFF81E +:106DA0008C90234FDFF894A02E7846B92670BDE86A +:106DB000F08729462046BDE8F04702F00DBA252E9F +:106DC0002ED1072241462846FAF78EFF70B9194B9B +:106DD000224603F1140153F8040B8B4242F8040BD2 +:106DE000F9D11B78073515341370DDE708224946C1 +:106DF0002846FAF779FF98B9A21C0F4B197802328E +:106E00000909C95D02F8041C13F8011B01F00F0108 +:106E10005345C95D02F8031CF0D118340835C3E7A7 +:106E2000013504F8016BBFE7589B0008819A000800 +:106E3000769B0008609B000800E8F11F0CE8F11F3A +:106E4000BFF34F8F044B1A695107FCD1D3F81021BF +:106E50005207F8D1704700BF0020005208B50D4B13 +:106E60001B78ABB9FFF7ECFF0B4BDA68D10704D501 +:106E70000A4A5A6002F188325A60D3F80C21D207CC +:106E800006D5064AC3F8042102F18832C3F804216A +:106E900008BD00BF4E64002000200052230167455A +:106EA00008B5114B1B78F3B9104B1A69510703D57C +:106EB000DA6842F04002DA60D3F81021520705D5B3 +:106EC000D3F80C2142F04002C3F80C21FFF7B8FFC1 +:106ED000064BDA6842F00102DA60D3F80C2142F086 +:106EE0000102C3F80C2108BD4E64002000200052AE +:106EF0000F289ABF00F58060400400207047000012 +:106F00004FF4003070470000102070470F2808B57C +:106F10000BD8FFF7EDFF00F500330268013204D112 +:106F200004308342F9D1012008BD0020FCE70000B5 +:106F30000F2838B505463FD8FFF782FF1F4CFFF7F3 +:106F40008DFF4FF0FF3307286361C4F814311DD85B +:106F50002361FFF775FF030243F02403E360E36856 +:106F600043F08003E36023695A07FCD42846FFF707 +:106F700067FFFFF7BDFF4FF4003100F0ABFA284682 +:106F8000FFF78EFFBDE83840FFF7C0BFC4F81031EF +:106F9000FFF756FFA0F108031B0243F02403C4F8D7 +:106FA0000C31D4F80C3143F08003C4F80C31D4F820 +:106FB00010315B07FBD4D9E7002038BD0020005218 +:106FC0002DE9F84F05460C46104645EA0203DE0659 +:106FD00002D00020BDE8F88F20F01F00DFF8BCB021 +:106FE000DFF8BCA0FFF73AFF04EB0008444503D1EB +:106FF0000120FFF755FFEDE720222946204602F049 +:10700000B3F810B920352034F0E72B4605F1200203 +:107010001F68791CDDD104339A42F9D105F1784318 +:107020001B481C4EB3F5801F1B4B38BF184603F19D +:10703000F80332BFD946D1461E46FFF701FF07606D +:10704000A5EB040C336804F11C0143F00203336028 +:10705000231FD9F8007017F00507FAD153F8042F51 +:107060008B424CF80320F4D1BFF34F8FFFF7E8FEBB +:107070004FF0FF332022214603602846336823F077 +:107080000203336002F070F80028BBD03846B0E746 +:10709000142100520C2000521420005210200052E3 +:1070A0001021005210B5084C237828B11BB9FFF706 +:1070B000D5FE0123237010BD002BFCD02070BDE84D +:1070C0001040FFF7EDBE00BF4E6400202DE9F04FE9 +:1070D0000D4685B0814658B111F00D0614BF20222F +:1070E000082211F00803019304D0431E034269D023 +:1070F000002435E0002E37D009F11F0121F01F09CF +:107100004FF00108314F05F00403DFF8CCA005EA89 +:10711000080BBBF1000F32D07869C0072FD408F1FB +:1071200001080C37B8F1060FF3D19EB9284D494636 +:10713000A819019201F02CFE0446002839D120360E +:10714000019AA02EF3D1494601F022FE0446002800 +:107150002FD1019A49461F4801F01AFE044660BB30 +:10716000204605B0BDE8F08F0029C9D10146284668 +:10717000029201F00DFE0446D8B9029AC0E713B19D +:1071800078694107CBD5AC0702D578698007C6D5A9 +:10719000019911B178690107C1D549460AEB481038 +:1071A000CDE9022301F0F4FD0446DDE902230028C5 +:1071B000B5D04A460021204601E04A460021FAF7B0 +:1071C000AFFDCDE70246002E96D199E7889B0008D7 +:1071D0009064002050640020706400200021FFF7BC +:1071E00075BF00000121FFF771BF000070B5144D9D +:1071F0000124144E40F2FF3200210120FAF790FDE5 +:1072000006EB441001342A6955F80C1F01F0ACFD5F +:10721000062CF5D137254FF4C0542046FFF7E2FF86 +:10722000014628B122460848BDE8704001F09CBDE7 +:10723000C4EBC404013D4FEAD404EED170BD00BFDD +:10724000889B000870640020506400200421FFF730 +:107250003DBF00004843FFF7C1BF000008B101F087 +:1072600009BE7047B0F5805F10B5044607D8FFF738 +:10727000EDFF28B92046BDE81040FFF7AFBF002062 +:1072800010BD0000FFF7EABF70B5AAB140EA0103E4 +:1072900013F01F030FD1094C0144A5686D0706D5F3 +:1072A0002568A84203D366683544A94204D903334C +:1072B0000C34122BF1D10022104670BD889B0008BF +:1072C00008B501F0EDFE034AD2E90032C01842EBE6 +:1072D000010108BD30650020434BD3E900232DE9AF +:1072E000F34113437CD0FFF7EBFF404A0023002714 +:1072F000F9F7A2F806460D463D4A0023F9F79CF837 +:107300000023144630462946394AF9F795F84FF4D8 +:1073100061613C23ADF80170B4FBF1F5B4FBF3F609 +:1073200001FB154103FB16464624B1FBF3F1314B3B +:10733000F6B28DF8004098423CD84FF0640C4FF400 +:10734000C87EA30704F26C7225D1B2FBFCF30CFBE0 +:10735000132313BBB2FBFEF30EFB1322B2FA82F32C +:107360005B0903F26D18621C8045D2B217D90FB1C8 +:107370008DF800400022204C4FF00C0C17460CFBFF +:107380000343D4B2013213F804C084450CD8A0EBF7 +:107390000C000127F5E70023E3E70123E1E7A0EB79 +:1073A000080014460127CCE70FB18DF80140431CBB +:1073B0008DF802309DF80100431C9DF80000503804 +:1073C000400640EA43509DF8023040EA034040EA5C +:1073D000560040EAC52040EA411002B0BDE8F08105 +:1073E0004FF40410F9E700BF3065002040420F0061 +:1073F0008051010090230B00D09B00080244074BF2 +:10740000D2B210B5904200D110BD441C00B253F866 +:10741000200041F8040BE0B2F4E700BF50400058F0 +:107420000E4B30B51C6F240405D41C6F1C671C6FF9 +:1074300044F400441C670A4C02442368D2B243F46B +:1074400080732360074B904200D130BD441C51F83B +:10745000045B00B243F82050E0B2F4E70044025865 +:10746000004802585040005807B5012201A90020E9 +:10747000FFF7C4FF019803B05DF804FB13B50446A1 +:10748000FFF7F2FFA04205D0012201A900200194DC +:10749000FFF7C6FF02B010BD10B56424013C4FF4E5 +:1074A0007A70FFF7B7F814F0FF04F7D1084B4FF0EC +:1074B000807214249A6103F5805308229A61013C7A +:1074C0004FF47A70FFF7A6F814F0FF04F7D110BD5F +:1074D000000002580144BFF34F8F064B884204D38B +:1074E000BFF34F8FBFF36F8F7047C3F85C0220303C +:1074F000F4E700BF00ED00E00144BFF34F8F064BFF +:10750000884204D3BFF34F8FBFF36F8F7047C3F828 +:1075100070022030F4E700BF00ED00E0114BDA69A3 +:1075200052021ED59A69D00704D50F4A9A6002F11B +:1075300044329A600B4BDA69D107FCD41A6A22F400 +:1075400080021A629A6942F002029A61DA69D207ED +:10755000FCD49A6942F001029A61024AD369DB07BE +:10756000FCD47047002000523B2A190870B505462C +:1075700016460C4601201021FFF76CFE286046736A +:107580003CB1204636B1FFF761FE2B68186000B1B0 +:107590009C6070BDFFF726FEF7E70000F8B50F46C8 +:1075A0001546044648B905F11F010126386821F047 +:1075B0001F01FFF78FFF3046F8BD427B2946386830 +:1075C000FFF762FE06460028EDD13B686360A368C2 +:1075D000AB4210D213B12068FFF740FE637B284610 +:1075E0002BB1FFF733FE206020B9A060E3E7FFF77F +:1075F000F9FDF8E7A560206805F11F01012621F0DB +:107600001F013860FFF766FF2673D4E710B5044604 +:1076100040B10068884205D1606808B1FAF75AFBAA +:107620000023237310BD0000F8B50F46144605462D +:1076300048B904F11F010126386821F01F01FFF746 +:107640005BFF3046F8BD427B21463868FFF71CFEE1 +:1076500006460028EDD1AB68A34210D213B12868CA +:10766000FFF7FCFD6B7B20462BB1FFF7EFFD286099 +:1076700020B9A860E5E7FFF7B5FDF8E7AC60396829 +:1076800019B122462868FAF725FB286804F11F0182 +:10769000012621F01F013860FFF72EFF2E73D0E77F +:1076A00020B103688B4204BF0023037370470000BE +:1076B000034B1A681AB9034AD2F8D0241A607047EB +:1076C000386500200040025808B5FFF7F1FF024B73 +:1076D0001868C0F3806008BD38650020EFF30983A7 +:1076E000054968334A6B22F001024A6383F3098833 +:1076F000002383F31188704700EF00E0302080F30F +:10770000118862B60D4B0E4AD96821F4E061090474 +:10771000090C0A430B49DA60D3F8FC2042F080726E +:10772000C3F8FC20084AC2F8B01F116841F00101FB +:1077300011602022DA7783F82200704700ED00E024 +:107740000003FA0555CEACC5001000E0302310B59B +:1077500083F311880E4B5B6813F4006314D0F1EED1 +:10776000103AEFF309844FF08073683CE361094BF2 +:10777000DB6B236684F30988FEF796FE10B1064B97 +:10778000A36110BD054BFBE783F31188F9E700BF48 +:1077900000ED00E000EF00E02F04000832040008D4 +:1077A00070B5BFF34F8FBFF36F8F1A4A0021C2F835 +:1077B0005012BFF34F8FBFF36F8F536943F4003301 +:1077C0005361BFF34F8FBFF36F8FC2F88410BFF3C5 +:1077D0004F8FD2F8803043F6E074C3F3C900C3F38F +:1077E0004E335B0103EA0406014646EA817501391E +:1077F000C2F86052F9D2203B13F1200FF2D1BFF34F +:107800004F8F536943F480335361BFF34F8FBFF3FE +:107810006F8F70BD00ED00E0FEE70000214B2248B5 +:10782000224A70B5904237D3214BC11EDA1C121A7E +:1078300022F003028B4238BF00220021FAF770FACF +:107840001C4A0023C2F88430BFF34F8FD2F8803037 +:1078500043F6E074C3F3C900C3F34E335B0103EA9C +:107860000406014646EA81750139C2F86C52F9D224 +:10787000203B13F1200FF2D1BFF34F8FBFF36F8F77 +:10788000BFF34F8FBFF36F8F0023C2F85032BFF3A7 +:107890004F8FBFF36F8F70BD53F8041B40F8041B6C +:1078A000C0E700BFD49C0008346700203467002084 +:1078B0003467002000ED00E0054B996B21EA0001E0 +:1078C00099631A6E22EA00021A661B6E704700BFA7 +:1078D0000045025870B5D0E9244300224FF0FF352F +:1078E0009E6804EB42135101D3F80009002805DA21 +:1078F000D3F8000940F08040C3F80009D3F8000B2A +:10790000002805DAD3F8000B40F08040C3F8000BE4 +:10791000013263189642C3F80859C3F8085BE0D2F5 +:107920004FF00113C4F81C3870BD0000890141F00C +:107930002001016103699B06FCD41220FEF7FEBD05 +:1079400010B50A4C2046FEF799FA094BC4F890305E +:10795000084BC4F89430084C2046FEF78FFA074BCA +:10796000C4F89030064BC4F8943010BD3C6500203C +:10797000000008400C9C0008D8650020000004406E +:10798000189C000870B503780546012B58D13F4B71 +:10799000D0F89040984254D13D4B0E2165209A6B0F +:1079A00042F000629A631A6E42F000621A661B6E21 +:1079B000384BD3F8802042F00062C3F88020D3F81F +:1079C000802022F00062C3F88020D3F88030FDF7D9 +:1079D00099FC314BE360314BC4F800380023D5F8F3 +:1079E0009060C4F8003EC02323604FF40413A363E7 +:1079F0003369002BFCDA01230C203361FEF79EFD76 +:107A00003369DB07FCD41220FEF798FD3369002BA5 +:107A1000FCDA00262846A660FFF75CFF6B68C4F816 +:107A20001068DB68C4F81468C4F81C6863BB1C4B9E +:107A3000A3614FF0FF336361A36843F00103A360C8 +:107A400070BD184B9842C9D1114B4FF080609A6BB2 +:107A500042F000729A631A6E42F000721A661B6E50 +:107A60000C4BD3F8802042F00072C3F88020D3F88A +:107A7000802022F00072C3F88020D3F88030FFF716 +:107A80001BFF0E214D20A2E7074BD1E73C650020EC +:107A900000450258004402584014004003002002F0 +:107AA000003C30C0D8650020083C30C0F8B5D0F8A4 +:107AB0009040054600214FF000662046FFF736FF54 +:107AC000D5F8941000234FF001128F684FF0FF306B +:107AD000C4F83438C4F81C2804EB431201339F4225 +:107AE000C2F80069C2F8006BC2F80809C2F8080BB6 +:107AF000F2D20B68D5F89020C5F898306362102355 +:107B00001361166916F01006FBD11220FEF716FD60 +:107B1000D4F8003823F4FE63C4F80038A36943F4B2 +:107B2000402343F01003A3610923C4F81038C4F8BC +:107B300014380B4BEB604FF0C043C4F8103B094BBB +:107B4000C4F8003BC4F81069C4F80039D5F898307F +:107B500003F1100243F48013C5F89820A362F8BD26 +:107B6000E89B000840800010D0F8902090F88A1020 +:107B7000D2F8003823F4FE6343EA0113C2F8003858 +:107B8000704700002DE9F84300EB8103D0F89050D6 +:107B90000C468046DA680FFA81F94801166806F04B +:107BA0000306731E022B05EB41134FF0000194BF37 +:107BB000B604384EC3F8101B4FF0010104F1100356 +:107BC00098BF06F1805601FA03F3916998BF06F554 +:107BD000004600293AD0578A04F158013743490139 +:107BE0006F50D5F81C180B430021C5F81C382B1812 +:107BF0000127C3F81019A7405369611E9BB3138A6C +:107C0000928B9B08012A88BF5343D8F89820981874 +:107C100042EA034301F140022146C8F89800284691 +:107C200005EB82025360FFF781FE08EB8900C36811 +:107C30001B8A43EA845348341E4364012E51D5F80D +:107C40001C381F43C5F81C78BDE8F88305EB4917BD +:107C5000D7F8001B21F40041C7F8001BD5F81C1809 +:107C600021EA0303C0E704F13F030B4A28462146FB +:107C700005EB83035A60FFF759FE05EB4910D0F876 +:107C8000003923F40043C0F80039D5F81C3823EA42 +:107C90000707D7E70080001000040002D0F8942006 +:107CA0001268C0F89820FFF715BE00005831D0F8D0 +:107CB000903049015B5813F4004004D013F4001FC6 +:107CC0000CBF0220012070474831D0F890304901A4 +:107CD0005B5813F4004004D013F4001F0CBF0220C3 +:107CE0000120704700EB8101CB68196A0B681360B3 +:107CF0004B6853607047000000EB810330B5DD68CE +:107D0000AA691368D36019B9402B84BF402313605C +:107D10006B8A1468D0F890201C4402EB4110013C9F +:107D200009B2B4FBF3F46343033323F0030343EAE0 +:107D3000C44343F0C043C0F8103B2B6803F0030377 +:107D4000012B0ED1D2F8083802EB411013F4807FDA +:107D5000D0F8003B14BF43F0805343F00053C0F809 +:107D6000003B02EB4112D2F8003B43F00443C2F85F +:107D7000003B30BD2DE9F041D0F8906005460C463F +:107D800006EB4113D3F8087B3A07C3F8087B08D504 +:107D9000D6F814381B0704D500EB8103DB685B6859 +:107DA0009847FA071FD5D6F81438DB071BD505EB23 +:107DB0008403D968CCB98B69488A5A68B2FBF0F65B +:107DC00000FB16228AB91868DA6890420DD2121A9E +:107DD000C3E90024302383F3118821462846FFF7A6 +:107DE0008BFF84F31188BDE8F081012303FA04F2CC +:107DF0006B8923EA02036B81CB68002BF3D0214609 +:107E00002846BDE8F041184700EB81034A0170B5F0 +:107E1000DD68D0F890306C692668E66056BB1A447D +:107E20004FF40020C2F810092A6802F00302012A68 +:107E30000AB20ED1D3F8080803EB421410F4807F85 +:107E4000D4F8000914BF40F0805040F00050C4F84E +:107E5000000903EB4212D2F8000940F00440C2F8D6 +:107E600000090122D3F8340802FA01F10143C3F8F2 +:107E7000341870BD19B9402E84BF4020206020689E +:107E80001A442E8A8419013CB4FBF6F440EAC4403B +:107E900040F00050C6E700002DE9F843D0F89060AC +:107EA00005460C464F0106EB4113D3F8088918F03C +:107EB000010FC3F808891CD0D6F81038DB0718D595 +:107EC00000EB8103D3F80CC0DCF81430D3F800E0E9 +:107ED000DA68964530D2A2EB0E024FF000091A6024 +:107EE000C3F80490302383F31188FFF78DFF89F3E3 +:107EF000118818F0800F1DD0D6F834380126A6401E +:107F0000334217D005EB84030134D5F89050D3F8F1 +:107F10000CC0E4B22F44DCF8142005EB0434D2F892 +:107F200000E05168714514D3D5F8343823EA0606C9 +:107F3000C5F83468BDE8F883012303FA01F2038928 +:107F400023EA02030381DCF80830002BD1D09847E4 +:107F5000CFE7AEEB0103BCF81000834228BF034615 +:107F6000D7F8180980B2B3EB800FE3D89068A0F17E +:107F7000040959F8048FC4F80080A0EB090898445C +:107F8000B8F1040FF5D818440B4490605360C8E76B +:107F90002DE9F84FD0F8905004466E69AB691E4049 +:107FA00016F480586E6103D0BDE8F84FFDF7D6BFD8 +:107FB000002E12DAD5F8003E9B0705D0D5F8003E1A +:107FC00023F00303C5F8003ED5F80438204623F01B +:107FD0000103C5F80438FDF7EFFF370505D5204646 +:107FE000FFF778FC2046FDF7D5FFB0040CD5D5F897 +:107FF000083813F0060FEB6823F470530CBF43F4FA +:10800000105343F4A053EB6031071BD56368DB6862 +:108010001BB9AB6923F00803AB612378052B0CD1A6 +:10802000D5F8003E9A0705D0D5F8003E23F00303AB +:10803000C5F8003E2046FDF7BFFF6368DB680BB163 +:1080400020469847F30200F1BA80B70226D5D4F84B +:10805000909000274FF0010A09EB4712D2F8003B3D +:1080600003F44023B3F5802F11D1D2F8003B002B4D +:108070000DDA62890AFA07F322EA0303638104EB4B +:108080008703DB68DB6813B1394620469847013720 +:10809000D4F89430FFB29B689F42DDD9F00619D521 +:1080A000D4F89000026AC2F30A1702F00F0302F438 +:1080B000F012B2F5802F00F0CA80B2F5402F09D13E +:1080C00004EB8303002200F58050DB681B6A9742B3 +:1080D00040F0B0803003D5F8185835D5E90303D502 +:1080E00000212046FFF746FEAA0303D501212046C2 +:1080F000FFF740FE6B0303D502212046FFF73AFE4F +:108100002F0303D503212046FFF734FEE80203D5F1 +:1081100004212046FFF72EFEA90203D505212046A3 +:10812000FFF728FE6A0203D506212046FFF722FE4C +:108130002B0203D507212046FFF71CFEEF0103D5D4 +:1081400008212046FFF716FE700340F1A780E907DB +:1081500003D500212046FFF79FFEAA0703D5012182 +:108160002046FFF799FE6B0703D502212046FFF753 +:1081700093FE2F0703D503212046FFF78DFEEE0661 +:1081800003D504212046FFF787FEA80603D5052165 +:108190002046FFF781FE690603D506212046FFF73A +:1081A0007BFE2A0603D507212046FFF775FEEB0567 +:1081B00074D520460821BDE8F84FFFF76DBED4F80E +:1081C00090904FF0000B4FF0010AD4F894305FFA12 +:1081D0008BF79B689F423FF638AF09EB4713D3F804 +:1081E000002902F44022B2F5802F20D1D3F80029D3 +:1081F000002A1CDAD3F8002942F09042C3F8002983 +:10820000D3F80029002AFBDB3946D4F89000FFF7A9 +:108210008DFB22890AFA07F322EA0303238104EB88 +:108220008703DB689B6813B13946204698470BF1FA +:10823000010BCAE7910701D1D0F80080072A02F1AB +:1082400001029CBF03F8018B4FEA18283FE704EBBB +:10825000830300F58050DA68D2F818C0DCF80820F3 +:10826000DCE9001CA1EB0C0C00218F4208D1DB687B +:108270009B699A683A449A605A683A445A6029E776 +:1082800011F0030F01D1D0F800808C4501F10101FC +:1082900084BF02F8018B4FEA1828E6E7BDE8F88FA3 +:1082A00008B50348FFF774FEBDE80840FFF74EBA73 +:1082B0003C65002008B50348FFF76AFEBDE80840AA +:1082C000FFF744BAD8650020D0F8903003EB411195 +:1082D000D1F8003B43F40013C1F8003B70470000A5 +:1082E000D0F8903003EB4111D1F8003943F400137A +:1082F000C1F8003970470000D0F8903003EB41110D +:10830000D1F8003B23F40013C1F8003B7047000094 +:10831000D0F8903003EB4111D1F8003923F4001369 +:10832000C1F8003970470000044BDA6B0243DA638E +:108330005A6E104358665B6E704700BF0045025886 +:1083400008B53C4B4FF0FF31D3F8802062F000427B +:10835000C3F88020D3F8802002F00042C3F88020C8 +:10836000D3F88020D3F88420C3F88410D3F8842075 +:108370000022C3F88420D3F88400D86F40F0FF4077 +:1083800040F4FF0040F4DF4040F07F00D867D86F32 +:1083900020F0FF4020F4FF0020F4DF4020F07F00B9 +:1083A000D867D86FD3F888006FEA40506FEA505012 +:1083B000C3F88800D3F88800C0F30A00C3F8880027 +:1083C000D3F88800D3F89000C3F89010D3F8900049 +:1083D000C3F89020D3F89000D3F89400C3F8941019 +:1083E000D3F89400C3F89420D3F89400D3F89800FD +:1083F000C3F89810D3F89800C3F89820D3F89800E1 +:10840000D3F88C00C3F88C10D3F88C00C3F88C2000 +:10841000D3F88C00D3F89C00C3F89C10D3F89C10C0 +:10842000C3F89C20D3F89C30FCF73AFABDE808402A +:1084300000F0D2B90044025808B50122504BC3F8ED +:108440000821504B5A6D42F002025A65DA6F42F031 +:108450000202DA670422DB6F4B4BDA605A68910440 +:10846000FCD54A4A1A6001229A60494ADA60002221 +:108470001A614FF440429A61434B9A699204FCD5C9 +:108480001A6842F480721A60424B1A6F12F4407FED +:1084900004D04FF480321A6700221A671A6842F03B +:1084A00001021A603B4B1A685007FCD500221A6182 +:1084B0001A6912F03802FBD1012119604FF0804196 +:1084C00059605A67344ADA62344A1A611A6842F4C7 +:1084D00080321A602F4B1A689103FCD51A6842F457 +:1084E00080521A601A689204FCD52D4A2D499A626E +:1084F00000225A63196301F57C01DA6301F5E77123 +:1085000099635A64284A1A64284ADA621A6842F05F +:10851000A8521A601F4B1A6802F02852B2F1285F65 +:10852000F9D148229A614FF48862DA6140221A62D6 +:108530001F4ADA641F4A1A651F4A5A651F4A9A651C +:1085400032231F4A1360136803F00F03022BFAD182 +:10855000104A136943F003031361136903F03803EE +:10856000182BFAD14FF00050FFF7DEFE4FF080409D +:10857000FFF7DAFE4FF00040BDE80840FFF7D4BE39 +:1085800000800051004502580048025800C000F029 +:1085900004000001004402580000FF010088900818 +:1085A0003220600063020901470E0508DD0BBF01A0 +:1085B00020000020000001100910E000000101105F +:1085C000002000524FF0B04208B5D2F8883003F0D6 +:1085D0000103C2F8883023B1044A13680BB1506814 +:1085E0009847BDE80840FFF7B1B800BFB466002067 +:1085F0004FF0B04208B5D2F8883003F00203C2F859 +:10860000883023B1044A93680BB1D0689847BDE81D +:108610000840FFF79BB800BFB46600204FF0B0429F +:1086200008B5D2F8883003F00403C2F8883023B1CB +:10863000044A13690BB150699847BDE80840FFF739 +:1086400085B800BFB46600204FF0B04208B5D2F83C +:10865000883003F00803C2F8883023B1044A9369D4 +:108660000BB1D0699847BDE80840FFF76FB800BF6D +:10867000B46600204FF0B04208B5D2F8883003F05D +:108680001003C2F8883023B1044A136A0BB1506A50 +:108690009847BDE80840FFF759B800BFB46600200E +:1086A0004FF0B04310B5D3F8884004F47872C3F8A3 +:1086B0008820A30604D5124A936A0BB1D06A984762 +:1086C000600604D50E4A136B0BB1506B9847210618 +:1086D00004D50B4A936B0BB1D06B9847E20504D5D8 +:1086E000074A136C0BB1506C9847A30504D5044A94 +:1086F000936C0BB1D06C9847BDE81040FFF726B8DB +:10870000B46600204FF0B04310B5D3F8884004F4AD +:108710007C42C3F88820620504D5164A136D0BB15C +:10872000506D9847230504D5124A936D0BB1D06D57 +:108730009847E00404D50F4A136E0BB1506E98476A +:10874000A10404D50B4A936E0BB1D06E9847620416 +:1087500004D5084A136F0BB1506F9847230404D512 +:10876000044A936F0BB1D06F9847BDE81040FEF7F5 +:10877000EDBF00BFB466002008B50348FCF73CFC21 +:10878000BDE80840FEF7E2BFC836002008B5034840 +:10879000FCF732FDBDE80840FEF7D8BF20390020C5 +:1087A00008B50348FCF728FDBDE80840FEF7CEBF3A +:1087B0008C39002008B50348FCF71EFDBDE80840D1 +:1087C000FEF7C4BFF839002008B500F0B7FCBDE8DB +:1087D0000840FEF7BBBF0000062108B50846FCF7BD +:1087E00091FD06210720FCF78DFD06210820FCF7EE +:1087F00089FD06210920FCF785FD06210A20FCF7EA +:1088000081FD06211720FCF77DFD06212820FCF7BD +:1088100079FD09217A20FCF775FD09213120FCF74B +:1088200071FD07213220FCF76DFD0C212620FCF79D +:1088300069FD0C212720FCF765FD0C215220BDE8C5 +:108840000840FCF75FBD000008B5FFF779FD00F0B8 +:1088500043FCFDF737F9FDF7D5F8FDF70DFBFDF704 +:10886000DFF9FEF79DF9BDE8084000F029BA0000E5 +:1088700030B50433039C0172002104FB0325C16061 +:10888000C0E90653049B0363059BC0E90000C0E9EF +:108890000422C0E90842C0E90A11436330BD000068 +:1088A0000022416AC260C0E90411C0E90A226FF0E7 +:1088B0000101FDF7EFBE0000D0E90432934201D17F +:1088C000C2680AB9181D7047002070470369196013 +:1088D0000021C2680132C260C269134482699342B6 +:1088E000036124BF436A0361FDF7C8BE38B504467F +:1088F0000D46E3683BB162690020131D1268A36254 +:108900001344E36207E0237A33B929462046FDF792 +:10891000A5FE0028EDDA38BD6FF00100FBE700008E +:10892000C368C269013BC3604369134482699342CF +:10893000436124BF436A436100238362036B03B135 +:108940001847704770B53023044683F31188866A50 +:108950003EB9FFF7CBFF054618B186F311882846CC +:1089600070BDA36AE26A13F8015B9342A36202D36B +:108970002046FFF7D5FF002383F31188EFE70000BF +:108980002DE9F84F04460E46174698464FF0300939 +:1089900089F311880025AA46D4F828B0BBF1000F4E +:1089A00009D141462046FFF7A1FF20B18BF3118882 +:1089B0002846BDE8F88FD4E90A12A7EB050B521A36 +:1089C000934528BF9346BBF1400F1BD9334601F1B5 +:1089D000400251F8040B914243F8040BF9D1A36A09 +:1089E000403640354033A362D4E90A239A4202D389 +:1089F0002046FFF795FF8AF31188BD42D8D289F34C +:108A00001188C9E730465A46F9F764F9A36A5E440B +:108A10005D445B44A362E7E710B5029C0433017236 +:108A200003FB0421C460C0E906130023C0E90A3334 +:108A3000039B0363049BC0E90000C0E90422C0E972 +:108A40000842436310BD0000026A6FF00101C2607A +:108A5000426AC0E904220022C0E90A22FDF71ABED8 +:108A6000D0E904239A4201D1C26822B9184650F8CD +:108A7000043B0B60704700231846FAE7C3680021E7 +:108A8000C2690133C36043691344826993424361FD +:108A900024BF436A4361FDF7F1BD000038B50446C9 +:108AA0000D46E3683BB1236900201A1DA262E2690A +:108AB0001344E36207E0237A33B929462046FDF7E1 +:108AC000CDFD0028EDDA38BD6FF00100FBE70000B6 +:108AD00003691960C268013AC260C26913448269BD +:108AE0009342036124BF436A036100238362036BE3 +:108AF00003B118477047000070B530230D46044697 +:108B0000114683F31188866A2EB9FFF7C7FF10B1AB +:108B100086F3118870BDA36A1D70A36AE26A0133EF +:108B20009342A36204D3E16920460439FFF7D0FFE2 +:108B3000002080F31188EDE72DE9F84F04460D463B +:108B4000904699464FF0300A8AF311880026B346C2 +:108B5000A76A4FB949462046FFF7A0FF20B187F327 +:108B600011883046BDE8F88FD4E90A073A1AA8EB15 +:108B70000607974228BF1746402F1BD905F140032F +:108B800055F8042B9D4240F8042BF9D1A36A4036D6 +:108B90004033A362D4E90A239A4204D3E169204610 +:108BA0000439FFF795FF8BF311884645D9D28AF334 +:108BB0001188CDE729463A46F9F78CF8A36A3D4477 +:108BC0003E443B44A362E5E7D0E904239A4217D12F +:108BD000C3689BB1836A8BB1043B9B1A0ED01360B0 +:108BE000C368013BC360C3691A4483699A42026146 +:108BF00024BF436A03610023836201231846704740 +:108C00000023FBE701F01F03F0B502F01F04560933 +:108C10005A1C0123B6EB511F50F8265003FA02F3F9 +:108C20004FEA511703F1FF333DBF50F82720C4F13D +:108C30002000134003EA05003BBF03FA00F225FAC7 +:108C400004F0E0401043F0BD70B57E227F21054660 +:108C5000FFF7D8FF18B1012819D0002070BD3E22BF +:108C600049212846FFF7CEFF2F220446312128460E +:108C7000FFF7C8FF0646013450220236532128462A +:108C8000B440FFF7BFFF093804FA00F0E6E73022EE +:108C900045212846FFF7B6FF01308002DEE70000DD +:108CA00090F8D63090F8D7201B0403EB026390F8BD +:108CB000D42090F8D500134403EB00207047000047 +:108CC00000F018BA014B586A704700BF000C004012 +:108CD000034B002258631A610222DA60704700BF1A +:108CE000000C0040014B0022DA607047000C00408D +:108CF000014B5863704700BF000C0040024B034A11 +:108D00001A60034A5A6070478C660020386700205A +:108D100000000220074B494210B55C68201A084049 +:108D20001968821A8A4203D3A24201D85A6010BD40 +:108D30000020FCE78C66002008B5302383F31188FF +:108D4000FFF7E8FF002383F3118808BD0448054BB3 +:108D500003600023C0E901330C3000F017B900BFF5 +:108D600094660020398D0008CB1D083A23F00703D4 +:108D7000591A521A10B4D2080024C0E90043846082 +:108D80000C301C605A605DF8044B00F0FFB8000026 +:108D90002DE9F74F364FCD1D8846002818BF0746EE +:108DA000082A4FEAD50538BF082207F10C003C1D00 +:108DB0009146019000F02CF9019809F10701C9F1E1 +:108DC000000E2246246864B900F02CF93B68CBB34E +:108DD00008224946E8009847044698B340E90278DB +:108DE00030E004EB010CD4F804A00CEA0E0C0AF1FC +:108DF0000106ACF1080304EBC6069E42E1D9A6EBDE +:108E00000C0CB5EBEC0F4FEAEC0BDAD89C421DD200 +:108E100004F10802AB45A3EB02024FEAE2026260F2 +:108E200009D9691CED4303EBC1025D445560256817 +:108E300043F8315022601C46C3F8048044F8087B94 +:108E400000F0F0F8204603B0BDE8F08FAA45216895 +:108E500002D111602346EEE7013504EBC50344F867 +:108E6000351003F10801761AF6105E601360F1E721 +:108E70009466002073B50446A0F1080550F8080C6C +:108E800054F8043C061D0C3007330190DB0844F80D +:108E9000043C00F0BDF8334601989E421A6801D0A8 +:108EA000AB4228D20AB1954225D244F8082C54F896 +:108EB000042C1D60013254F8081C05EBC206B142B7 +:108EC00006D14E68324444F8042C0A6844F8082C51 +:108ED0005E68711C03EBC1018D4207D154F8042C6C +:108EE000013232445A6054F8082C1A6002B0BDE8CE +:108EF000704000F097B81346CFE70000FEE700008F +:108F000070B51E4B0025044686B058600E460563BA +:108F10008163FEF7F3FB04F12803A5606563C4E9F0 +:108F20000A3304F11003C4E904334FF0FF33C4E9FA +:108F30000044C4E90635FFF7C5FE2B46024604F19E +:108F40003C012046C4E9082380230D4A6567FDF7EC +:108F5000FFFA7368E0600B4A03620123009280F815 +:108F600024306846F26801923269CDE90223064B4B +:108F7000CDE90435FDF720FB06B070BD1049002097 +:108F80002C9C0008249C0008FD8E00080023C0E9EA +:108F9000000083600361704770B51C4B0546846810 +:108FA000DE685CB3B44213D103690133036170BD61 +:108FB000A36094F8243083B1062B15D1A06A214612 +:108FC000D4E9003213605A60FDF72EFAA36A9C6858 +:108FD000B368A2689A42EBD306E0D4E90032204697 +:108FE00013605A60FDF730FA28463146FDF71CFA47 +:108FF000B5620620BDE87040FDF728BA03698660B7 +:1090000001330361336BC3603063D0E768460020EF +:1090100008B5302383F31188FFF7BEFF002383F3E5 +:10902000118808BD194BD96883688B4210B520D1CF +:10903000302383F311880269013A0261B2B90468EE +:10904000C368A0420B631ED04A6B9BB901238A60A0 +:10905000036103681A68026050601A6B8360C26023 +:1090600018631846FDF7F0F9FDF740FA002383F383 +:10907000118810BD1C68A34203D0A468A24238BF67 +:109080002246DB68E1E78260F0E700BF6846002027 +:10909000024A536B18435063704700BF6846002074 +:1090A00038B5EFF311859DB9EFF30584C4F30804D7 +:1090B000302334B183F31188FDF724FC85F3118844 +:1090C00038BD83F31188FDF71DFC84F3118838BD8A +:1090D000BDE83840FDF716BC0023054A19460133A8 +:1090E000102BC2E9001102F10802F8D1704700BF4D +:1090F000B46600200E4B9A6C42F008029A641A6F14 +:1091000042F008021A670B4A1B6FD36B43F0080347 +:10911000D363C722084B9A624FF0FF32DA62002213 +:109120009A615A63DA605A6001225A611A60704784 +:10913000004502580010005C000C0040094A08B5C8 +:109140001169D3680B40D9B29B076FEA0101116125 +:1091500007D5302383F31188FDF7EEF9002383F35D +:10916000118808BD000C004010B50139024490423E +:1091700001D1002005E0037811F8014FA34201D08E +:10918000181B10BD0130F2E7884210B501EB020454 +:1091900002D98442234607D8431EA14208D011F8C1 +:1091A000012B03F8012FF8E7024401468A4200D15F +:1091B00010BD13F8014D02F8014DF7E7C9B203469F +:1091C00010F8012B1AB18A42F9D1184670470029CC +:1091D00018BF0023F9E70000034611F8012B03F83C +:1091E000012B002AF9D1704710B50139034632B17D +:1091F00011F8014F03F8014B013A002CF7D11A4442 +:109200000021934200D110BD03F8011BF9E70000D3 +:109210004D4435002D2D0A002F6172647570696C04 +:109220006F742E6162696E002F6172647570696C73 +:109230006F742D7665726966792E6162696E002F92 +:109240006172647570696C6F742D666C6173682EE1 +:109250006162696E002F6172647570696C6F742D44 +:10926000666C61736865642E6162696E000000005F +:109270000000000000000000ED0E0008890F00084B +:1092800039110008C10F0008810F0008000000001C +:1092900000000000E90E0008950F00087111000899 +:1092A000E50E0008F10E000853544D333248373FA5 +:1092B0003F3F0053544D3332483733782F3732789D +:1092C0000053544D3332483734332F3735332F372B +:1092D0003530000001105A000310590001205800D9 +:1092E000032056002F000000537563636573736697 +:1092F000756C6C79206D6F756E7465642053444392 +:109300006172642028736C6F77646F776E3D25758A +:10931000290A0000EB769045584641542020200051 +:109320004641543332202020000000002A3A3C3EBF +:109330007C223F7F002B2C3B3D5B5D00435545412C +:109340004141414345454549494941414592924F33 +:109350004F4F5555594F554F9C4F9E9F41494F5523 +:10936000A5A5A6A7A8A9AAABACADAEAFB0B1B2B344 +:10937000B4414141B8B9BABBBCBDBEBFC0C1C2C394 +:10938000C4C54141C8C9CACBCCCDCECFD1D145454A +:109390004549494949D9DADBDCDD49DF4FE14F4F27 +:1093A0004F4FE6E8E85555555959EEEFF0F1F2F315 +:1093B000F4F5F6F7F8F9FAFBFCFDFEFF01030507EB +:1093C000090E10121416181C1E00000061001A036A +:1093D000E0001703F8000703FF0001007801000117 +:1093E000300132010601390110014A012E017901D3 +:1093F000060180014D004302810182018201840146 +:10940000840186018701870189018A018B018B0113 +:109410008D018E018F0190019101910193019401C1 +:10942000F60196019701980198013D029B019C016C +:109430009D0120029F01A001A001A201A201A4019F +:10944000A401A601A701A701A901AA01AB01AC01D2 +:10945000AC01AE01AF01AF01B101B201B301B30183 +:10946000B501B501B701B801B801BA01BB01BC0132 +:10947000BC01BE01F701C001C101C201C301C401A9 +:10948000C501C401C701C801C701CA01CB01CA0196 +:10949000CD011001DD0101008E01DE011201F30199 +:1094A0000300F101F401F401F80128012202120184 +:1094B0003A020900652C3B023B023D02662C3F024A +:1094C00040024102410246020A015302400081016A +:1094D0008601550289018A0158028F015A029001C2 +:1094E0005C025D025E025F0293016102620294010E +:1094F0006402650266026702970196016A02622CA5 +:109500006C026D026E029C01700271029D01730279 +:1095100074029F0176027702780279027A027B0256 +:109520007C02642C7E027F02A60181028202A901D4 +:109530008402850286028702AE014402B101B201B3 +:1095400045028D028E028F0290029102B7017B03C9 +:109550000300FD03FE03FF03AC030400860388033E +:1095600089038A03B1031103C2030200A303A30307 +:10957000C4030803CC0303008C038E038F03D803BA +:109580001801F2030A00F903F303F403F503F603E9 +:10959000F703F703F903FA03FA0330042003500436 +:1095A0001007600422018A043601C1040E01CF04B1 +:1095B0000100C004D004440161052604000000003D +:1095C0007D1D0100632C001E9601A01E5A01001F84 +:1095D0000806101F0606201F0806301F0806401F39 +:1095E0000606511F0700591F521F5B1F541F5D1FA6 +:1095F000561F5F1F601F0806701F0E00BA1FBB1F9B +:10960000C81FC91FCA1FCB1FDA1FDB1FF81FF91F96 +:10961000EA1FEB1FFA1FFB1F801F0806901F08069A +:10962000A01F0806B01F0400B81FB91FB21FBC1F3F +:10963000CC1F0100C31FD01F0206E01F0206E51F5A +:109640000100EC1FF31F0100FC1F4E21010032211D +:1096500070211002842101008321D0241A05302CAE +:109660002F04602C0201672C0601752C0201802C4E +:109670006401002D260841FF1A030000C700FC000A +:10968000E900E200E400E000E500E700EA00EB00AA +:10969000E800EF00EE00EC00C400C500C900E600E1 +:1096A000C600F400F600F200FB00F900FF00D6004F +:1096B000DC00F800A300D800D7009201E100ED0023 +:1096C000F300FA00F100D100AA00BA00BF00AE001A +:1096D000AC00BD00BC00A100AB00BB0091259225F1 +:1096E000932502252425C100C200C000A9006325DE +:1096F000512557255D25A200A500102514253425E8 +:109700002C251C2500253C25E300C3005A255425A3 +:1097100069256625602550256C25A400F000D00041 +:10972000CA00CB00C8003101CD00CE00CF00182503 +:109730000C2588258425A600CC008025D300DF00D9 +:10974000D400D200F500D500B500FE00DE00DA003E +:10975000DB00D900FD00DD00AF00B400AD00B100BA +:109760001720BE00B600A700F700B800B000A800A0 +:10977000B700B900B300B200A025A000100002405D +:10978000080002400008024000000B0028000240D0 +:10979000080002400408024006010C00400002409C +:1097A000080002400808024010020D005800024064 +:1097B000080002400C08024016030E007000024030 +:1097C0000C0002401008024000040F008800024014 +:1097D0000C0002401408024006051000A0000240E0 +:1097E0000C0002401808024010061100B8000240A8 +:1097F0000C0002401C08024016072F001004024013 +:1098000008040240200802400008380028040240F2 +:1098100008040240240802400609390040040240BE +:109820000804024028080240100A3A005804024086 +:10983000080402402C080240160B3B007004024052 +:109840000C04024030080240000C3C008804024036 +:109850000C04024034080240060D4400A0040240FB +:109860000C04024038080240100E4500B8040240C3 +:109870000C0402403C080240160F460001000000A4 +:109880000000000000960000000000000000000042 +:1098900000000000000000000000000000000000C8 +:1098A000996B00089D6B000899560008D159000873 +:1098B0002D560008555600087D560008155600081C +:1098C00000000000855A0008715A0008AD5A0008CF +:1098D000995A0008A55A0008915A00087D5A0008B4 +:1098E000695A0008B95A0008000000009D5B000892 +:1098F000895B0008C55B0008B15B0008BD5B000820 +:10990000A95B0008955B0008815B0008D15B00083B +:1099100000000000010000000000000063300000B3 +:109920001C9900080000000000000000E046002034 +:10993000104900200000812A00000000AAAAAAAA5B +:1099400000000024FFFE00000000000000A00A004C +:109950000001000000000000AAAAAAAA000000005E +:10996000FFFF000000000000000000001400AA56E5 +:1099700000000000AAAAAAAA14005554FFFF000084 +:1099800000000000CCCC0C0020681A000000000091 +:10999000AAAA8AAA10541500FFFF0000000C700745 +:1099A000770000004081020100100000AAAAAAAAC4 +:1099B00000410100F7FF00000000007007000000F8 +:1099C0000000000000000000AAAAAAAA00000000EF +:1099D000FFFF000000000000000000000000000089 +:1099E00000000000AAAAAAAA00000000FFFF0000D1 +:1099F0000000000000000000000000000000000067 +:109A0000AAAAAAAA00000000FFFF000000000000B0 +:109A1000000000000000000000000000AAAAAAAA9E +:109A200000000000FFFF0000000000000000000038 +:109A30000000000000000000AAAAAAAA000000007E +:109A4000FFFF000000000000000000000000000018 +:109A500000000000AAAAAAAA00000000FFFF000060 +:109A600000000000000000004375626550696C6FE3 +:109A70007400437562654F72616E67652B2D424CB1 +:109A8000002553455249414C2500000002000000CA +:109A900000000000BD5D00082D5E00084000400091 +:109AA000C0610020D0610020020000000000000022 +:109AB0000300000000000000755E000800000000C8 +:109AC00010000000E0610020000000000100000024 +:109AD000000000003C65002001010200956C0008B8 +:109AE000A56B0008416C0008256C000843000000CD +:109AF000F49A000809024300020100C03209040080 +:109B000000010202010005240010010524010001EA +:109B1000042402020524060001070582030800FF51 +:109B200009040100020A00000007050102400000CC +:109B3000070581024000000012000000409B000861 +:109B40001201100102000040AE2D58100002010267 +:109B5000030100000403090425424F41524425003B +:109B6000437562654F72616E6765506C75732D62E7 +:109B70006473686F740030313233343536373839B6 +:109B8000414243444546000000000020000002001E +:109B90000200000000000030000004000800000087 +:109BA0000000002400000800040000000004000081 +:109BB00000FC0000020000000000043000800000F3 +:109BC0000800000000000038000001000100000053 +:109BD0001F1C1F1E1F1E1F1F1E1F1E1F1F1D1F1E9F +:109BE0001F1E1F1F1E1F1E1F00000000D15F000848 +:109BF0008962000835630008400040007466002058 +:109C000074660020010000008466002080000000CF +:109C100040010000080000000001000000100000EA +:109C20000800000069646C65000000006D61696EE9 +:109C3000002C0438040438080C10141C2024252699 +:109C400000000000000064040100040000000000A7 +:109C5000000C0010283034001068FF7F0100000065 +:109C6000270400000000000000001E0000000000AB +:109C7000FF00000018490020203900208C39002006 +:109C8000F839002000000000A892000883040000BA +:109C9000B392000850040000C192000801000000C7 +:109CA0000000000000960000000008009600000080 +:109CB0000008000004000000549B000800000000A1 +:109CC0000000000000000000000000000000000094 +:049CD0000000000090 :00000001FF diff --git a/Tools/bootloaders/CubeOrangePlus_bl.bin b/Tools/bootloaders/CubeOrangePlus_bl.bin index 93755be351..84568faacb 100755 Binary files a/Tools/bootloaders/CubeOrangePlus_bl.bin and b/Tools/bootloaders/CubeOrangePlus_bl.bin differ diff --git a/Tools/bootloaders/CubeOrangePlus_bl.elf b/Tools/bootloaders/CubeOrangePlus_bl.elf index 262cba9f89..d906b0ce63 100755 Binary files a/Tools/bootloaders/CubeOrangePlus_bl.elf and b/Tools/bootloaders/CubeOrangePlus_bl.elf differ diff --git a/Tools/bootloaders/CubeOrangePlus_bl.hex b/Tools/bootloaders/CubeOrangePlus_bl.hex index 07d3f9ad04..59b5141778 100644 --- a/Tools/bootloaders/CubeOrangePlus_bl.hex +++ b/Tools/bootloaders/CubeOrangePlus_bl.hex @@ -1,34 +1,34 @@ :020000040800F2 :1000000000060020E1020008E3020008E302000805 :10001000E3020008E3020008E3020008E30200082C -:10002000E3020008E3020008E3020008358A000842 +:10002000E3020008E3020008E3020008DD760008AE :10003000E3020008E3020008E3020008E30200080C :10004000E3020008E3020008E3020008E3020008FC -:10005000E3020008E3020008E17E00080D7F0008CB -:10006000397F0008657F0008917F0008E3020008DF -:10007000E3020008E3020008E3020008E3020008CC -:10008000E3020008E3020008E3020008E3020008BC -:10009000E3020008E3020008E3020008BD7F000855 +:10005000E3020008E3020008C5850008F1850008F6 +:100060001D8600084986000875860008F1450008CD +:100070001946000845460008714600089D460008DC +:10008000C5460008F1460008E3020008E302000844 +:10009000E3020008E3020008E3020008A18600086A :1000A000E3020008E3020008E3020008E30200089C :1000B000E3020008E3020008E3020008E30200088C :1000C000E3020008E3020008E3020008E30200087C -:1000D000E3020008E3020008A9800008BD800008D0 -:1000E00021800008E3020008E3020008E3020008A0 -:1000F000E3020008E3020008E3020008E30200084C -:10010000E302000895800008E5800008E30200088B +:1000D000E3020008E30200088D870008A1870008FA +:1000E00005870008E3020008E3020008E3020008B5 +:1000F000E3020008E3020008E30200081D470008CD +:10010000E302000879870008C9870008E3020008B5 :10011000E3020008E3020008E3020008E30200082B -:10012000E3020008E3020008E3020008E30200081B -:10013000E3020008E3020008E3020008E30200080B +:1001200049470008714700089D470008C947000873 +:10013000F5470008E3020008E3020008E3020008B4 :10014000E3020008E3020008E3020008E3020008FB -:10015000E3020008E3020008E3020008E3020008EB +:100150001D4800084948000875480008E3020008E7 :10016000E3020008E3020008E3020008E3020008DB -:10017000E3020008D97B0008E3020008E30200085C -:10018000E3020008E3020008D1800008E30200084F +:10017000E3020008B5820008E3020008E302000879 +:10018000E3020008E3020008B5870008E302000864 :10019000E3020008E3020008E3020008E3020008AB :1001A000E3020008E3020008E3020008E30200089B :1001B000E3020008E3020008E3020008E30200088B :1001C000E3020008E3020008E3020008E30200087B -:1001D000E3020008C57B0008E3020008E302000810 +:1001D000E3020008A1820008E3020008E30200082D :1001E000E3020008E3020008E3020008E30200085B :1001F000E3020008E3020008E3020008E30200084B :10020000E3020008E3020008E3020008E30200083A @@ -51,22 +51,22 @@ :100310004F8FBFF36F8F40F20000C0F2F0004EF637 :100320008851CEF200010860BFF34F8FBFF36F8F8B :100330004FF00000E1EE100A4EF63C71CEF20001E3 -:100340000860062080F31488BFF36F8F06F0BAFEB2 -:1003500006F0D4F84FF055301F491B4A91423CBF7C +:100340000860062080F31488BFF36F8F07F028FA47 +:1003500006F078FB4FF055301F491B4A91423CBFD5 :1003600041F8040BFAE71D49184A91423CBF41F895 :10037000040BFAE71A491B4A1B4B9A423EBF51F83D :10038000040B42F8040BF8E700201849184A914280 -:100390003CBF41F8040BFAE706F0D2FE06F030F954 +:100390003CBF41F8040BFAE707F040FA06F0D8FB3F :1003A000144C154DAC4203DA54F8041B8847F9E7A6 :1003B00000F0C4F9114C124DAC4203DA54F8041B9E -:1003C0008847F9E706F0BABE0006002000220020A8 +:1003C0008847F9E707F028BA00060020002200203D :1003D0000000000808ED00E00000002000060020FA -:1003E0004896000800220020D8220020D8220020B1 -:1003F00020670020E0020008E0020008E002000898 +:1003E000589C00080022002074220020782200205F +:1003F00034670020E0020008E0020008E002000884 :10040000E00200082DE9F04F2DED108AC1F80CD064 :10041000D0F80CD0BDEC108ABDE8F08F002383F338 -:1004200011882846A047002005F05AFEFEE705F097 -:1004300099FD00DFFEE7000053B94AB9002908BF63 +:1004200011882846A047002006F0EEF8FEE706F007 +:1004300047F800DFFEE7000053B94AB9002908BFBA :1004400000281CBF4FF0FF314FF0FF3000F074B9AF :10045000ADF1080C6DE904CE00F006F8DDF804E01B :10046000DDE9022304B070472DE9F047089D0446FA @@ -114,29 +114,29 @@ :100700000646E3E61846F8E64B45A9D2B9EB0208DF :1007100064EB0C0E0138A3E74646EAE7204694E76F :100720004046D1E7D0467BE7023B614432E73046A2 -:1007300009E76444023842E7704700BF38B500F06B -:10074000D1FB06F0CDFB054606F0B2FC0446E0B94D -:10075000104B9D421BD001339D4241F2883504BFAE -:1007600001240025002006F0C5FB0CB100F07AF84A -:1007700001F02EFB01F0EAF900F01CFD08B100F0D9 -:1007800071F8284600F010F9F9E70025EAE7054678 -:10079000E8E700BF010007B008B501F0A3F9A0F138 +:1007300009E76444023842E7704700BF38B501F06A +:10074000F3F901F0A3FB06F08FFE054606F0BCFFAF +:100750000446D0B90F4B9D4219D001339D4241F25E +:10076000883504BF01240025002006F087FE0CB167 +:1007700000F078F801F02AFB00F01AFD08B100F053 +:1007800071F8284600F010F9F9E70025ECE7054676 +:10079000EAE700BF010007B008B501F091F9A0F148 :1007A00020035842584108BD07B541F21203022107 -:1007B00001A8ADF8043001F0B3F903B05DF804FB13 +:1007B00001A8ADF8043001F0A1F903B05DF804FB25 :1007C00038B5302383F31188174803680BB105F05F -:1007D0006BFD0023154A4FF47A71134805F05AFD5A +:1007D000FFFF0023154A4FF47A71134805F0EEFF2E :1007E000002383F31188124C236813B12368013B63 :1007F0002360636813B16368013B63600D4D2B7820 -:1008000033B963687BB9022001F05CFA322363607C -:100810002B78032B07D163682BB9022001F052FA21 -:100820004FF47A73636038BDD8220020C1070008F6 -:10083000F8230020F0220020084B187003280CD861 -:10084000DFE800F008050208022001F031BA0220BA -:1008500001F024BA024B00225A607047F0220020B7 -:10086000F8230020F8B5494B494A1C461968013164 +:1008000033B963687BB9022001F04AFA322363608E +:100810002B78032B07D163682BB9022001F040FA33 +:100820004FF47A73636038BD78220020C107000856 +:100830009823002090220020084B187003280CD821 +:10084000DFE800F008050208022001F01FBA0220CC +:1008500001F012BA024B00225A6070479022002029 +:1008600098230020F8B5494B494A1C4619680131C4 :1008700000F08A8004339342F8D16268454B9A4273 :1008800040F28280444B9B6803F1006303F5003320 -:100890009A4279D2002001F073F90220FFF7CCFFD1 +:100890009A4279D2002001F061F90220FFF7CCFFE3 :1008A0003E4B00219A6C99641A6F19671A6FDA6CC3 :1008B000D9645A6F59675A6F1A6D19659A6F99679B :1008C0009B6F374BD3F8802042F00062C3F8802042 @@ -154,15 +154,15 @@ :10098000854680F308882047F8BD00BF00000208B4 :1009900020000208FFFF0108002200200045025845 :1009A0000044025800ED00E02DE9F04F93B0B44B45 -:1009B0002022FF2100900AA89D6801F0B3F9B14AF6 +:1009B0002022FF2100900AA89D6801F0B1F9B14AF8 :1009C0001378A3B90121B04811700360302383F379 -:1009D000118803680BB105F067FC0023AB4A4FF4A4 -:1009E0007A71A94805F056FC002383F31188009B17 +:1009D000118803680BB105F0FBFE0023AB4A4FF40E +:1009E0007A71A94805F0EAFE002383F31188009B81 :1009F00013B1A74B009A1A60A64A1378032B03D0B1 :100A000000231370A24A53604FF0000A009CD346A3 -:100A10005646D146012001F04BF924B19C4B1B688E -:100A2000002B00F02682002001F05CF80390039B6D -:100A3000002BF2DB012001F031F9039B213B1F2B3E +:100A10005646D146012001F039F924B19C4B1B68A0 +:100A2000002B00F02682002001F04AF80390039B7F +:100A3000002BF2DB012001F01FF9039B213B1F2B50 :100A4000E8D801A252F823F0C90A0008F10A000808 :100A5000850B0008150A0008150A0008150A000889 :100A6000170C0008E70D0008010D0008630D0008D1 @@ -173,2248 +173,2339 @@ :100AB000150A0008150A0008150A0008150A00089A :100AC000150A0008850B00080220FFF765FE0028C4 :100AD00040F0F981009B022105A8BAF1000F08BF80 -:100AE0001C4641F21233ADF8143001F019F891E7C9 -:100AF0004FF47A7000F0F6FF071EEBDB0220FFF7E1 +:100AE0001C4641F21233ADF8143001F007F891E7DB +:100AF0004FF47A7000F0E4FF071EEBDB0220FFF7F3 :100B00004BFE0028E6D0013F052F00F2DE81DFE832 :100B100007F0030A0D1013360523042105A80593D9 -:100B200000F0FEFF17E004215548F9E704215A4878 +:100B200000F0ECFF17E004215548F9E704215A488A :100B3000F6E704215948F3E74FF01C08404608F156 -:100B4000040801F01FF80421059005A800F0E8FF53 +:100B4000040801F00DF80421059005A800F0D6FF77 :100B5000B8F12C0FF2D101204FF0000900FA07F78D -:100B600047EA0B0B5FFA8BFB01F028F926B10BF07B +:100B600047EA0B0B5FFA8BFB01F026F926B10BF07D :100B70000B030B2B08BF0024FFF716FE4AE70421E6 :100B80004748CDE7002EA5D00BF00B030B2BA1D1CE :100B90000220FFF701FE074600289BD00120002617 -:100BA00000F0EEFF0220FFF747FE1FFA86F84046EE -:100BB00000F0F6FF0446B0B1039940460136A1F1BA -:100BC00040025142514100F0FBFF0028EDD1BA46EE +:100BA00000F0DCFF0220FFF747FE1FFA86F8404600 +:100BB00000F0E4FF0446B0B1039940460136A1F1CC +:100BC00040025142514100F0E9FF0028EDD1BA4600 :100BD000044641F21213022105A83E46ADF8143036 -:100BE00000F09EFF16E725460120FFF725FE244B67 -:100BF0009B68AB4207D9284600F0C4FF013040F0A3 +:100BE00000F08CFF16E725460120FFF725FE244B79 +:100BF0009B68AB4207D9284600F0B2FF013040F0B5 :100C000067810435F3E70025224BBA463E461D7046 :100C10001F4B5D60A8E7002E3FF45CAF0BF00B03A9 :100C20000B2B7FF457AF0220FFF706FE322000F0B7 -:100C300059FFB0F10008FFF64DAF18F003077FF43D +:100C300047FFB0F10008FFF64DAF18F003077FF44F :100C400049AF0F4A08EB0503926893423FF642AF63 :100C5000B8F5807F3FF73EAF124BB845019323DDD7 -:100C60004FF47A7000F03EFF0390039A002AFFF6DB +:100C60004FF47A7000F02CFF0390039A002AFFF6ED :100C700031AF039A0137019B03F8012BEDE700BF69 -:100C800000220020F4230020D8220020C107000801 -:100C9000F8230020F0220020042200200822002057 -:100CA0000C220020F4220020C820FFF775FD074623 +:100C8000002200209423002078220020C1070008C1 +:100C90009823002090220020042200200822002017 +:100CA0000C22002094220020C820FFF775FD074683 :100CB00000283FF40FAF1F2D11D8C5F120020AAB59 :100CC00025F0030084494245184428BF424601925A -:100CD00001F002F8019AFF217F4801F023F84FEA62 -:100CE000A803C8F387027C492846019301F022F843 +:100CD00001F000F8019AFF217F4801F021F84FEA66 +:100CE000A803C8F387027C492846019301F020F845 :100CF000064600283FF46DAF019B05EB830533E703 -:100D00000220FFF749FD00283FF4E4AE00F076FF33 +:100D00000220FFF749FD00283FF4E4AE00F064FF45 :100D100000283FF4DFAE0027B846704B9B68BB420B :100D200018D91F2F11D80A9B01330ED027F00303C7 :100D300012AA134453F8203C05934046042205A907 -:100D4000043701F0A5F88046E7E7384600F01AFFBF -:100D50000590F2E7CDF81480042105A800F0E0FE2C -:100D600002E70023642104A8049300F0CFFE0028CA +:100D4000043701F003F98046E7E7384600F008FF72 +:100D50000590F2E7CDF81480042105A800F0CEFE3E +:100D600002E70023642104A8049300F0BDFE0028DC :100D70007FF4B0AE0220FFF70FFD00283FF4AAAECB -:100D8000049800F031FF0590E6E70023642104A8F1 -:100D9000049300F0BBFE00287FF49CAE0220FFF716 -:100DA000FBFC00283FF496AE049800F01FFFEAE732 -:100DB0000220FFF7F1FC00283FF48CAE00F02EFF7C +:100D8000049800F01FFF0590E6E70023642104A803 +:100D9000049300F0A9FE00287FF49CAE0220FFF728 +:100DA000FBFC00283FF496AE049800F00DFFEAE744 +:100DB0000220FFF7F1FC00283FF48CAE00F01CFF8E :100DC000E1E70220FFF7E8FC00283FF483AE05A925 -:100DD000142000F029FF07460421049004A800F025 -:100DE0009FFE3946B9E7322000F07CFE071EFFF671 +:100DD000142000F017FF07460421049004A800F037 +:100DE0008DFE3946B9E7322000F06AFE071EFFF695 :100DF00071AEBB077FF46EAE384A07EB0903926809 :100E000093423FF667AE0220FFF7C6FC00283FF48E :100E100061AE27F003074F44B9453FF4A5AE4846FD -:100E200009F1040900F0AEFE0421059005A800F0C8 -:100E300077FEF1E74FF47A70FFF7AEFC00283FF43D -:100E400049AE00F0DBFE002844D00A9B01330BD0F2 -:100E500008220AA9002000F06DFF00283AD02022C5 -:100E6000FF210AA800F05EFFFFF79EFC1C4805F07A -:100E70003DF913B0BDE8F08F002E3FF42BAE0BF020 +:100E200009F1040900F09CFE0421059005A800F0DA +:100E300065FEF1E74FF47A70FFF7AEFC00283FF44F +:100E400049AE00F0C9FE002844D00A9B01330BD004 +:100E500008220AA9002000F06BFF00283AD02022C7 +:100E6000FF210AA800F05CFFFFF79EFC1C4805F07C +:100E7000D1FB13B0BDE8F08F002E3FF42BAE0BF08A :100E80000B030B2B7FF426AE0023642105A80593EA -:100E900000F03CFE074600287FF41CAE0220FFF75E +:100E900000F02AFE074600287FF41CAE0220FFF770 :100EA0007BFC804600283FF415AEFFF77DFC41F245 -:100EB000883005F01BF9059800F0C8FF46463C460F -:100EC00000F07CFFA6E506464EE64FF0000901E67D -:100ED000BA467EE637467CE6F42200200022002057 +:100EB000883005F0AFFB059800F0C6FF46463C467B +:100EC00000F07AFFA6E506464EE64FF0000901E67F +:100ED000BA467EE637467CE69422002000220020B7 :100EE000A0860100704700007047000070470000B6 -:100EF000704700002DE9F04100F5803704461646A2 -:100F00003B7C5BB9C0681030204400F0E5FEE5682A -:100F10003544B5F5004FE56002D816B1BDE8F08163 -:100F2000DEB905F07F0605F110000021C6F180064C -:100F30002044F6B232462E4400F0F4FEA06804F1DC -:100F40001008324600F10060414600F5003005F01F -:100F50008FFD30B901233B74E0E74FF4004635467E -:100F6000ECE7A26805F11001404632442144A2603A -:100F7000E268521BE26000F0AFFE0220BDE8F041E3 -:100F800000F0A0BE183000F0E9BC000010B5044627 -:100F900007F0FAFD204610BD10B5044607F0F4FD39 -:100FA000204610BDC3B280B2A3F14102052A02D887 -:100FB000373800B27047613B052B94BF5738303843 -:100FC000F7E70000F8B504461546084603220C4929 -:100FD00000F08CFE014688B908346F1C15F9110029 -:100FE000FFF7E0FF064617F911000131FFF7DAFFBE -:100FF000102940EA061004F8010BEFD1F8BD00BF3C -:10100000008D00082DE9F04FADF53F7D07464168A2 -:1010100001222AA802F030FE002840F08780064610 -:10102000824681461125DFF80C81DFF80CB101AB57 -:101030004FF4805241462AA802F07EFF002875D165 -:10104000019AB2F5805F71D8002A65D00446019AF2 -:101050009442ECD2282D0FD008DC132D2DD01E2D5C -:1010600039D0112D13D00134A4B2F0E7322D2DD098 -:10107000372D2FD02D2DF6D13B68121B08EB040124 -:1010800038461B692D259847BDF80440EBE7121B35 -:10109000022A09D9594608EB040000F027FE18B9C6 -:1010A00002342825A4B2DEE718F804303A2B3DD0EC -:1010B0000A2B1CBFA1461325D5E718F804300A2BCC -:1010C00034D03A2B04BFA2463225CCE718F80430BE -:1010D000202BC8D0264618F804300A2B1AD1AAEBC8 -:1010E000090208EB090102A811254F2A28BF4F2247 -:1010F00007F0F2FDA21B08EB060116A84F2A28BF35 -:101100004F2207F0E9FD3B6816AA02A9DB683846C2 -:101110009847A8E71E25A6E73B68384604491B699F -:10112000984701200DF53F7DBDE8F08F0020F9E7DD -:10113000028E000800240020048D000800F1180130 -:1011400010B5044686B00846019100F0F1FB204638 -:10115000FFF758FF60B1019902A800F049FC102286 -:1011600004F1080102A807F033FDB0FA80F040094D -:1011700006B010BD70B504460025EEB2304600F052 -:101180000FFD58B100213046013500F019FD08B9B6 -:10119000002070BD022000F095FDEEE72046FFF72D -:1011A00031FF0028F4D004F58034207C80F0010069 -:1011B000EFE70000F0B5C9B005F0AAFE00F096FE1A -:1011C00018B90025284649B0F0BD69462A4802F002 -:1011D00075FF00284BD1294C204602F09FFF28487C -:1011E00002F09CFF274802F099FF2146224803F0B5 -:1011F00011F80028E5D1702007F0C8FC064610B1B0 -:10120000214B44600360336830469B68984705462D -:1012100000282ED01A4F1948394602F0FBFF054628 -:101220000028CED1194807F0B1FC044638B1184B5C -:101230004760036000F58033C0E902551D742368E0 -:1012400020469B689847054628B10E490C4802F095 -:10125000E1FF0028B5D1336830465B6898471CB180 -:10126000236820465B68984700F028FEAAE700251F -:10127000FAE70446EFE700BF088D0008188D000864 -:101280002F8D0008458D0008688D000814000100AE -:10129000848D00082DE9F04FD44A8DB00B68D0F84A -:1012A00004A001931A440368D14E1A44D1F81C904B -:1012B000DFF8B4C3DFF8B4B3D0E90234634003EA23 -:1012C0000A03634013444A6802920AEB7363029C68 -:1012D000C84A2244C468224484688AEA04051D403E -:1012E000654015448A68039203EB3555039CC24A56 -:1012F0002244846822448AEA03042C4084EA0A04D3 -:101300001444CA6805EBF4340492164483EA0502D7 -:10131000224056445A4032440E69059604EBB222EC -:10132000059FB64E3E441E4485EA040313406B40BD -:1013300033444E69069602EB7363069FB04E3E44FB -:101340002E4484EA02051D40654035448E690796A7 -:1013500003EB3555079FAB4E3E44264482EA030417 -:101360002C4054403444A84E4E4405EBF43416440B -:1013700083EA050222405A4032440E6A089604EB82 -:10138000B222089FA14E3E441E4485EA0403134046 -:101390006B4033444E6A099602EB7363099F9C4E7F -:1013A000D1F830E03E44D1F83880F3442E4484EA4A -:1013B00002051D40654035448E6AA6F5244703EBBF -:1013C00035550A964F3F274482EA03042C40544087 -:1013D0003C44CF6A0B9705EBF4340B9E8D4F37449A -:1013E000029E174483EA050222405A403A448A4F3B -:1013F000774404EBB2221F4485EA040313406B4098 -:101400003B444F6BBC4402EB7363654484EA020CBB -:101410000CEA030C8CEA040C6544DFF854C2C444A3 -:1014200003EB3555A44482EA03042C405440644441 -:10143000D1F83CC0794905EBF4346144114483EAA6 -:10144000050222405A400A44754904EBB222314455 -:10145000079E194484EA02032B4063400B44714900 -:1014600002EBF36331440B9E0D4482EA03012140F9 -:10147000514029446C4D03EBF1513544019E254404 -:1014800083EA010414405C402C44684D01EBB444F1 -:101490003544069E154481EA04021A404A402A4413 -:1014A000634D04EB323235440A9E1D4484EA020344 -:1014B0000B4063402B445F4D02EBF3633544059EC4 -:1014C0000D4482EA03012140514029445A4D03EB67 -:1014D000F1516544254483EA010414405C402C44E6 -:1014E000564D01EBB4443544099E154481EA04028B -:1014F0001A404A402A44524D04EB32323544049E8D -:101500001D4484EA02030B4063402B444D4D02EB23 -:10151000F36345440D4482EA0301214051402944CC -:10152000494D03EBF1513544089E2C4483EA0105F3 -:1015300015405D402C44454D01EBB4443544039EB9 -:101540002A4481EA04051D404D402A44404D04EBE5 -:1015500032323D442B4484EA020593440D406540F9 -:101560002B443C4D02EBF3633544069E294482EA4A -:101570000305254055402944374D03EBF1514D44B7 -:101580002C4483EA010515405D40254401EBB54537 -:1015900081EA050404EA03024A405A44A6F5B82B3E -:1015A000089E05EB3232ABF2BE6B54405B442344E1 -:1015B0002A4C344402EB33730B9E0C4485EA02013F -:1015C00059402144264C344403EB7151029E25447A -:1015D00082EA03044C402544224C444401EB354547 -:1015E000144483EA01026A40224443E078A46AD7A3 -:1015F000EECEBDC156B7C7E8DB702024AF0F7CF537 -:101600002AC68747134630A8019546FDD8988069B9 -:10161000AFF7448BBED75C892211906B2108B44987 -:1016200062251EF640B340C0515A5E26AAC7B6E9ED -:101630005D102FD65314440281E6A1D8C8FBD3E72E -:10164000E6CDE121D60737C3870DD5F4ED145A4511 -:1016500005E9E3A9F8A3EFFCD9026F6781F671876A -:1016600022619D6D0C38E5FD937198FD8A4C2A8DA1 -:101670008E4379A6934C344405EB7222059E1C449C -:1016800081EA0503534023448F4C344402EB337307 -:101690000A9E0C4485EA0201594021448B4C4C447B -:1016A00003EB7151254482EA03044C402C44884DDD -:1016B000354401EB3444019E154483EA0102624043 -:1016C0002A44844D3D4404EB72221D4481EA040304 -:1016D00053402B44804D354402EB3373049E294420 -:1016E00084EA02055D4029447C4D354403EB715189 -:1016F000079E254482EA03044C402C44784D35442F -:1017000001EB3444099E2A4483EA010565401544EF -:10171000744A324404EB7525039E134481EA0402A3 -:101720006A401A44704B734405EB32720B4484EAEE -:101730000501514019446D4B634402EB71511C4447 -:1017400085EA02034B401C44694B334401EB3444AB -:10175000019E1D4482EA010363402B44654D04EB66 -:1017600073233544069E154463EA010262402A440D -:10177000614D03EBB2624D4462EA040929445F4DB6 -:1017800089EA0309454449442C445D4D02EBB151BB -:101790003544049E61EA03081D4488EA0208444473 -:1017A00001EB744464EA02034B402B44554D04EBB7 -:1017B000F323754463EA010E15448EEA040E0EEB22 -:1017C0000502514D03EBB262354462EA040E29442E -:1017D0000A9D8EEA030EA5F580164C4D7144A6F6BF -:1017E000833602EBB151264461EA03045440344489 -:1017F000029E01EB7444354464EA02061D444E40E7 -:101800007319089E424D04EBF323354463EA010645 -:101810001544664072193F4D03EBB262654462EABB -:10182000040629443C4D5E403144079E02EBB15111 -:10183000354461EA03062C44384D56403D44344457 -:10184000059E1D4401EB744464EA02034B402B44A3 -:10185000334D04EBF32335440B9E154463EA010238 -:1018600062402A442F4D03EBB2623544039E0D447F -:1018700062EA0401594029442B4D02EBB151354431 -:101880002A4E254461EA030454402C44099D01EB8F -:1018900074442E4464EA02051E4485EA01039D193E -:1018A00003681A440AEB040303EBF5230260436068 -:1018B00083681C44C36819448460C1600DB0BDE8EE -:1018C000F08F00BF44EABEA4A9CFDE4B604BBBF64D -:1018D00070BCBFBEC67E9B28FA27A1EA8530EFD434 -:1018E000051D880439D0D4D9E599DBE6F87CA21F20 -:1018F0006556ACC4442229F497FF2A43A72394AB2E -:1019000039A093FCC3595B6592CC0C8FD15D848563 -:101910004F7EA86FE0E62CFE144301A3A111084EF0 -:10192000827E53F735F23ABDBBD2D72A91D386EBEC -:10193000094B036003F18833436003F12943A3F5A6 -:101940009613A3F68B638360A3F18833C3600023EF -:10195000C0E90433704700BF012345672DE9F84310 -:101960001446026905460E46E300C2F3C50800F1BD -:1019700018079B18036122BF43690133436112F4C6 -:10198000FC7F436903EB5473436114D0C8F14009F1 -:1019900007EB08004C4504D22246BDE8F84307F0A7 -:1019A00027B9403C4A464E4407F022F944443946A0 -:1019B0002846FFF76FFCA04606EB0409B8F13F0F7D -:1019C000A9EB08010AD94022384607F011F9394637 -:1019D0002846A8F14008FFF75DFCEFE7A1096FF08A -:1019E0003F02384602FB014206EB8111D5E70000B9 -:1019F00070B50B6901F1180506460C46C3F3C50323 -:101A0000EA18501C8022EA54C3F13F02072A1FD86B -:101A1000002100F087F929462046FFF73BFC3822D9 -:101A20000021284600F07EF92369294620462365D7 -:101A300063696365FFF72EFC21461022304607F0EC -:101A4000D7F8204658220021BDE8704000F06AB95E -:101A5000C3F137020021E5E72DE9F84F4FF47A731F -:101A600006460D46002402FB03F7DFF85080DFF83E -:101A7000509098F900305FFA84FA5A1C01D0A342C2 -:101A800010D159F824002A4631460368D3F820B013 -:101A90003B46D847854205D1074B012083F800A07B -:101AA000BDE8F88F0134042CE3D14FF4FA7004F050 -:101AB0001DFB0020F4E700BF44340020102200206A -:101AC0001422002070B504464FF47A76412C254646 -:101AD00028BF412506FB05F004F008FB641BF5D187 -:101AE00070BD0000002307B5024601210DF107007B -:101AF0008DF80730FFF7B0FF20B19DF8070003B065 -:101B00005DF804FB4FF0FF30F9E700000A460421BE -:101B100008B5FFF7A1FF80F00100C0B2404208BD48 -:101B2000074B0A4630B41978064B53F8214001465A -:101B300023682046DD69044BAC4630BC604700BFDB -:101B40004434002014220020A086010070B50A4E03 -:101B500000240A4D04F030FF308028683388834227 -:101B600008D904F025FF2B6804440133B4F5003F85 -:101B70002B60F2D370BD00BF46340020003400203B -:101B800004F0E8BF00F1006000F500300068704725 -:101B900000F10060920000F5003004F069BF000021 -:101BA000054B1A68054B1B889B1A834202D91044C7 -:101BB00004F0FEBE002070470034002046340020B0 -:101BC00038B50446074D29B128682044BDE838409F -:101BD00004F006BF2868204404F0F0FE0028F3D08B -:101BE00038BD00BF003400200020704700F1FF50D6 -:101BF00000F58F10D0F8000870470000064991F8F2 -:101C0000243033B100230822086A81F82430FFF71A -:101C1000BFBF0120704700BF04340020014B18688B -:101C2000704700BF0010005C194B013803220844C4 -:101C300070B51D68174BC5F30B042D0C1E88A6420A -:101C40000BD15C680A46013C824213460FD214F95C -:101C5000016F4EB102F8016BF6E7013A03F1080398 -:101C6000ECD181420B4602D22C2203F8012B042432 -:101C7000094A1688AE4204D1984284BF967803F888 -:101C8000016B013C02F10402F3D1581A70BD00BF90 -:101C90000010005C24220020C48D0008022803D11B -:101CA000024B4FF080529A61704700BF00100258FB -:101CB000022803D1024B4FF480529A61704700BF53 -:101CC00000100258022804D1024A536983F4805359 -:101CD0005361704700100258002310B5934203D09F -:101CE000CC5CC4540133F9E710BD0000013810B5D5 -:101CF00010F9013F3BB191F900409C4203D11AB168 -:101D00000131013AF4E71AB191F90020981A10BD97 -:101D10001046FCE703460246D01A12F9011B0029BF -:101D2000FAD1704702440346934202D003F8011BE4 -:101D3000FAE770472DE9F8431F4D144607468846D9 -:101D400095F8242052BBDFF870909CB395F82430AE -:101D50002BB92022FF2148462F62FFF7E3FF95F8B9 -:101D600024004146C0F1080205EB8000A24228BFD2 -:101D70002246D6B29200FFF7AFFF95F82430A41B9D -:101D800017441E449044E4B2F6B2082E85F824604D -:101D9000DBD1FFF733FF0028D7D108E02B6A03EB34 -:101DA00082038342CFD0FFF729FF0028CBD1002048 -:101DB000BDE8F8830120FBE704340020024B1A78C9 -:101DC000024B1A70704700BF4434002010220020DC -:101DD000F8B5194C194803F077FC2146174803F071 -:101DE0009FFC24684FF47A70154ED4F89020154D5E -:101DF000D2F80438114F43F00203C2F80438FFF759 -:101E000061FE2046104903F099FDD4F89020042487 -:101E1000D2F8043823F00203C2F804384FF4E13357 -:101E2000336055F8040BB84202D0314603F0AAFBE8 -:101E3000013CF6D1F8BD00BFC4940008F048002072 -:101E40002C34002014220020CC9400080C4B70B5D8 -:101E50000C4D04461E780C4B55F826209A420DD0A6 -:101E60000A4B002118221846FFF75CFF0460014668 -:101E700055F82600BDE8704003F084BB70BD00BF7C -:101E80004434002014220020F04800202C3400208C -:101E900030B50A44084D91420DD011F8013B58402D -:101EA000082340F30004013B2C4013F0FF0384EAB5 -:101EB0005000F6D1EFE730BD2083B8ED10B5084CE7 -:101EC00001220849002001F0B3FE23783BB1064807 -:101ED00003F0D0FA044803F003FB0023237010BD85 -:101EE00048340020D48D0008A43600201D482DE978 -:101EF000F041036D2BB901224FF48051503005F0B1 -:101F000049F8194E33780BB1FFF7D8FF0324174F68 -:101F10004FF00008134D15492846C7F8048003F018 -:101F2000D1FA284603F00AF948B1013C284603F0EB -:101F3000D7FA14F0FF04EED1204634700FE00C49BC -:101F400001220C4801F074FE014618B1284603F046 -:101F500091FAEAE7084800F011F801203070BDE876 -:101F6000F08100BFA4360020483400203C2200202D -:101F7000D48D00084C340020D88D00080FB4002008 -:101F800004B070470068704703460068596870479E -:101F90000B0A017043700B0C090E8370C1707047FF -:101FA000110A027003714170110C120E8170C2701F -:101FB0001A0A42711A0C1B0E8271C371704700001D -:101FC000C36A0239023B8B4283BF4389006C01FB29 -:101FD0000300002070470000C2F307238A76CB7607 -:101FE0000378032B01BF120C0A75120A4A75704759 -:101FF00000F10B010022D30143EA520310F8012B38 -:1020000052FA83F38842DAB2F5D1104670470000E5 -:1020100010B5417804460020013102464901022AE8 -:1020200016BFA35C032203EBC03302F101021EBF03 -:102030009BB203EB500398B29142F0D810BD000060 -:1020400002684AB1134613F8011B1F290DD93A291A -:10205000F9D1911C8B4202D04FF0FF3070471278BB -:10206000302AF9D1036000207047014B187870477F -:102070009836002038B50D46044618B909200023CB -:102080002B6038BD0368002BF8D01A78002AF5D0F1 -:102090008188DA889142F1D1587804F0B3F910F0D0 -:1020A0000100EBD12368EBE738B50D4640F2523121 -:1020B000144602F0B9F9FF2807D9012C0BD9030AFD -:1020C000022468702B70204638BD30B1002CFAD045 -:1020D00001242870F7E70024F5E70446F3E7000041 -:1020E0002DE9F8430026D0F8008005460C468E7690 -:1020F000836B002B4AD098F80030042B4BD1334629 -:102100003546402720E0B7F5187F80F0C480F906F7 -:1021100006F1010608BF0237D05B02372BB900F584 -:10212000205292B2B2F5006F0DD305F11A01C5F13C -:10213000FF0240EA03402144FFF7B6FF002800F009 -:10214000AA80054400200346D8F8102092F82310F6 -:10215000B142D8D8002B40F09E80002D00F09B802B -:1021600000232544AB766373D8F81020137903F06D -:102170003701DB0621730BD402F13800FFF704FFAF -:10218000C4E9000193896381D3892381BDE8F88381 -:1021900000200146F4E7C36C01335ED1EA6B0023F3 -:1021A0002E26551E184615F8011F013020290CD087 -:1021B000052908BFE521092804D10B2B9EBFE7188C -:1021C00001337E73E718013379730B28EBD1E118E3 -:1021D00000204873A17E00294BD1002B40D06FF026 -:1021E0000C0604F10D000825361B331810F8011BEE -:1021F000002938D02E298BB24AD0A3F141011929E8 -:1022000003D8117B0D4200D020330373EDE7B9F101 -:10221000000F05D100F520539BB2B3F5006F0BD32F -:1022200007F11A01C7F1FF0240EA09402144FFF714 -:102230003BFF48B10744002002368146D8F80C30F5 -:10224000985B0028E3D13846B9F1000F4FF0000247 -:1022500018BF002023189A76A0E7B1463746EDE76D -:102260003F23A3760123234400219976137B03B9EE -:102270006373D37A02F11C0003F03F03237300233E -:10228000FFF780FE20606360D38A6381138B7CE755 -:1022900010250B46B9E73F230125A37660E7000030 -:1022A00038B50546002435F8020B08B9204638BD7C -:1022B00002F0EEF86308C2B203EBC43312FA83F300 -:1022C0009AB2C0F3072303EB520303EBC2339CB271 -:1022D000E9E7000037B5C37804461BB90025284656 -:1022E00003B030BD00F14C01826C012340780191B4 -:1022F00004F0AEF8054680B9A36BE070A06C226BC9 -:10230000C31A9342EAD2A3780199022BE6D1024480 -:102310000123607804F09CF8E1E70125DFE7000085 -:1023200038B5836C05460C468B4210D0FFF7D2FFC0 -:1023300060B92246012305F14C01687804F064F885 -:1023400000281CBF4FF0FF340120AC6438BD0020D2 -:10235000FCE7000038B500230446C3704FF0FF339C -:102360008364FFF7DDFF00284BD1B4F84A524AF6E8 -:1023700055239D4207D10B22254904F14C0006F05C -:1023800027FC00283FD094F84C30EB2B03D01833B7 -:10239000DBB2012B2ED84AF655239D4206D10822E6 -:1023A0001C4904F19E0006F013FC48B3B4F8573002 -:1023B000B3F5007F1ED194F85930DBB15A1E1A4292 -:1023C00018D1B4F85A30ABB194F85C30013B012B12 -:1023D00010D8B4F85D306BB1B4F85F307F2B06D8FD -:1023E00004F16C00FFF7CEFDB0F5803F02D3B4F8E6 -:1023F000623053B94AF6552085420CBF02200320B3 -:1024000038BD0420FCE70120FAE70020F8E700BF10 -:10241000048E0008108E000802392DE9F04701F003 -:1024200007044FF0010A466C05460AFA04F4174601 -:10243000984606EB1136C1F3C809E4B23146284686 -:102440000136FFF76DFF18B10120BDE8F08799460E -:1024500005EB090292F84C30234214BF0121002100 -:10246000414513D06340013F82F84C3085F803A00A -:10247000EBD0640014F0FF04EAD109F10103012458 -:102480004FF00009B3F5007FE1D1D7E70220DCE788 -:1024900001290246F8B50C4640F28C800668F36AC2 -:1024A0008B4240F287803378013B032B00F282801D -:1024B000DFE803F00229384B04EB5405B16B3046DA -:1024C00001EB5521FFF72CFF10B14FF0FF30F8BDA5 -:1024D0006F1CC5F30805B16B3046354401EB57213D -:1024E00095F84C50FFF71CFF0028EED1C7F3080702 -:1024F000E3073E4496F84C0045EA00204CBF000933 -:10250000C0F30B00E3E7B16B304601EB1421FFF79A -:1025100007FF0028D9D1640004F4FF742644B6F8FC -:102520004C00D4E7B16B304601EBD411FFF7F8FE55 -:102530000028CAD1A40006F14C0004F4FE74204423 -:10254000FFF720FD20F07040C1E7D0E90430D579D5 -:1025500053EA000101D0916801B95DBB9168022D79 -:10256000A4EB01010DD1013B728940F1FF305B0A00 -:1025700043EAC053B3FBF2F399421BD81CD0601C52 -:10258000A5E7032D02D193698B42F8D8D3699BB993 -:10259000B16B304601EBD411FFF7C2FE002894D195 -:1025A000A0004C3600F4FE703044FFF7EBFC20F046 -:1025B00000408CE701208AE76FF0004087E70000C9 -:1025C000F8B5066804460D463378042B0CBF4FF06F -:1025D00080524FF400128A4201D80220F8BDCA0688 -:1025E000FBD182680163D2B9022B13D83389B3EBD4 -:1025F000551FF2D9F36BA363A36B6263002BECD07E -:1026000003EB55234C36C5F308050020A36335447E -:10261000E563E3E7F36BC271002BE7D01A467789D5 -:102620007F02BD42114604D23046FFF7C9FCA063C9 -:10263000E2E72046FFF72CFF431C024606D00128A4 -:10264000CBD9F36A8342C8D9ED1BEAE70120C5E77D -:1026500001292DE9F04706460C46174608D9C36AFA -:102660008B4205D90378022B62D003D8012B22D0EC -:10267000022552E0033B012BFAD8816B01EBD41108 -:10268000FFF74EFE0546002847D1A40006F14C0393 -:1026900004F4FE741C443378042B07D0204627F042 -:1026A0007047FFF76FFC00F0704007433946204643 -:1026B000FFF76EFC2FE001EB5108816B01EB582115 -:1026C000FFF72EFE054640BB14F0010406F14C094D -:1026D00008F1010AC8F3080808BFFBB230461FBF63 -:1026E00019F8083003F00F023B0103F0F00318BFA4 -:1026F000134309F808300123B16BF37001EB5A2141 -:10270000FFF70EFE054640B9CAF3080A44B1C7F305 -:10271000071709F80A700123F3702846BDE8F0870F -:1027200019F80A30C7F3032723F00F031F43F0E71C -:10273000816B01EB1421FFF7F3FD05460028ECD176 -:10274000640006F14C0304F4FF741F551919C7F314 -:1027500007274F70DFE70000F8B504460E4617461E -:10276000E3690BB91846F8BD012BA6EB03052068F9 -:1027700014BFAA1C3A46691CFFF76AFF0028F2D171 -:10278000E369013BE361EBE701292DE9F8430646E4 -:102790000C461746056802D80220BDE8F883EB6AAC -:1027A0008B42F9D97AB9A14621463046A046FFF7B7 -:1027B0006FFE0446B0B92B78042B02D1002F43D111 -:1027C000F7710020E9E72B78042B02D1C379022BA3 -:1027D000E9D04FF0FF3239462846FFF739FF00288D -:1027E000E1D0DAE70128D7D0421C01D10120D4E79B -:1027F0002B78042B19D1EA6AAB69023A93421CD3B5 -:1028000008F10102A2420CD02B78042B08D100233E -:10281000A2EB090249462846FFF7FEFD0028BCD17D -:10282000A146EB6AA342BFD8C5E70022414628462D -:10283000FFF70EFF0028DED0AFE70133AB612B7945 -:1028400043F001032B71DBE7F3798BB9B468BC4229 -:1028500002D10223F371B4E721463046FFF718FE98 -:10286000012899D9431CC1D001348442EFD0A8E794 -:10287000032BA6D1B368BB42A3D8B2691344BB42B1 -:102880009FD3E6E770B5C3790446032B06D1816870 -:102890008369CD18A94203D10023E371002070BDE4 -:1028A0004E1C20683246FFF7D3FE0028F7D1314690 -:1028B000F0E700002DE9F74305460191FFF70AFD17 -:1028C0000446002849D105F14C09019928464FF4E6 -:1028D0000072FFF775FB2146A86407464846FFF7DC -:1028E00021FA6C896402B4F5004F28BF4FF400440C -:1028F000B4F5007F2FD9204604F00CFA804630B1A1 -:1029000022460021640A0026FFF70CFA09E0640859 -:10291000EEE72346BA194146687803F099FD18B9E5 -:1029200026446B899E42F4D3404604F003FA68893A -:10293000801B18BF012003B0BDE8F08301366B890E -:102940009E42F4D20123BA194946687803F080FD0B -:102950000028F3D0EBE70026F1E70120EBE70000C9 -:10296000F8B50446FFF7B6FC0546002842D12378A7 -:10297000032B37D12779012F34D104F14C060146BE -:102980004FF400723046FFF7CDF9552341227221F2 -:1029900084F84A32AA2304F50D7084F84F2084F895 -:1029A0004B32522384F8301284F84C3084F84D3086 -:1029B000612384F8311284F84E3084F83332A169EF -:1029C00084F83222FFF7E4FA616904F50E70FFF72C -:1029D000DFFA626B3B46314601326078A26403F055 -:1029E00037FD257100226078114603F055FD00384F -:1029F00018BF0120F8BD000000232DE9F0430B6053 -:102A000085B00F461546FFF71BFB061EC0F2B281CC -:102A1000804B53F82640002C00F0AE813C6005F05E -:102A2000FE0523786BB1607803F0ECFCC70708D48F -:102A30001DB110F0040500D00A25284605B0BDE8F8 -:102A4000F0830023F0B22370607003F0C7FCC1076D -:102A500000F194810DB14207EED400212046FFF72A -:102A600079FC022840F099806E4604F2122304F2A9 -:102A70005221324618461033FFF784FA42F8040B0D -:102A80008B42F7D1002556F8041B00297DD0204643 -:102A9000FFF760FC012879D80128A26C40F0C080C3 -:102AA00004F1570304F18C0113F8015B002D7BD175 -:102AB0008B42F9D1B4F8B430B3F5807F74D194F877 -:102AC000B830092B70D104F19400FFF75DFA4FF094 -:102AD000FF33171841F10001BB4275EB010363D3CB -:102AE00004F1A000FFF74EFA94F8BA302063012BEE -:102AF000A37059D194F8B99003FA09F91FFA89F330 -:102B00006381002B50D0444B04F1A800FFF73AFA40 -:102B10000646984248D8831C626304F1A400E3622D -:102B2000FFF730FA00EB020804F19C00C4F8408083 -:102B3000FFF728FA10441FFA89F2A06306FB02F39C -:102B400013EB080345EB05029F4271EB02032BD305 -:102B50002E4604F1AC00FFF715FAE06365B963890E -:102B6000B34221D9E16B2046FFF72AFA81192046AA -:102B7000FFF7D6FB98B90136631993F84C30812BD7 -:102B800014D02035C5F30805E8E703200135042DEE -:102B90007FF479AF042807D101E0042801D1012591 -:102BA0004BE701287FF678AF0D2546E705F11400C5 -:102BB00004F14C063044FFF7E5F901280546F3D946 -:102BC000E36A8342F0D96189821E236C02FB0133E0 -:102BD0006364A16B204601EBD511FFF7A1FB002830 -:102BE000DDD105F07F0006EB8000FFF7CBF9431C39 -:102BF00003D00135A842ECD0D6E70425C4E905008E -:102C0000064A257000251388E56101339BB21380C5 -:102C1000E38012E79C360020FDFFFF7FA0360020F6 -:102C2000B4F85730B3F5007FBED1B4F8626026B96E -:102C300004F17000FFF7A6F9064694F85C302663AD -:102C4000591EA3700129AFD894F859506581002D01 -:102C5000AAD0691E2942A7D1B4F85D8018F00F0FE1 -:102C6000A4F80880A0D1B4F85F0018B904F16C0092 -:102C7000FFF788F9B4F85A10002995D006FB03FE37 -:102C800001EB181CF44460458ED3A0EB0C00A84265 -:102C9000B0FBF5F388D33E48834285D84FF6F570F4 -:102CA00083426DD903259F1C114402EB0C03032DB5 -:102CB000E7626263A16323644CD1B4F8763053EACF -:102CC00008037FF471AFBB0004F17800FFF75AF9F5 -:102CD000E06303F2FF13B6EB532FFFF465AF4FF041 -:102CE000FF33032DC4E905334FF08003237187D1EF -:102CF000B4F87C30012B83D1511C2046FFF710FB28 -:102D000000287FF47DAFB4F84A224AF6552320719B -:102D10009A427FF475AF1F4B04F14C00FFF732F974 -:102D200098427FF46DAF03F1FF5304F50C70FFF789 -:102D300029F903F50053203398427FF461AF04F57D -:102D40000D70FFF71FF9A06104F50E70FFF71AF977 -:102D5000606155E7B8F1000F3FF426AF7144022DD2 -:102D60004FEA4703E1631EBFD91907F0010303EBE4 -:102D70005103AEE70B2560E60C255EE603255CE615 -:102D800040F6F575AB428CBF022501258BE700BFED -:102D9000F5FFFF0F525261412DE9F84F07460568D4 -:102DA000884649B96E69C6B1EB6AB34298BF01263D -:102DB000AB69A3B9002405E0FFF76AFB01280446CC -:102DC00003D801242046BDE8F88F421C00F0D280D1 -:102DD000EB6A8342F6D84646EAE70126E8E72A7816 -:102DE000EB6A042A40F08380A6F1020A023B4FF00E -:102DF000010B9A4528BF4FF0000AD146696C28465E -:102E000001EB1931FFF78CFA00283BD109F00703D9 -:102E1000EA6AC9F3C8010BFA03F3901EDBB26A1821 -:102E20004C4609F1010992F84C20814502EA03025F -:102E300033BF5B0000234FF40071DBB228BF99461B -:102E4000B2B90234631E0333BCD80123214628469D -:102E50001A46FFF7E1FA0228B3D0012800F08A8071 -:102E6000B8F1000F13D10223FB710028A9D130E083 -:102E7000CA450AD0002BD2D10131B1F5007FBDD2B5 -:102E80000123CCE74FF0FF34DCE70024DAE7FB79DD -:102E9000022B07D1731CA342E7D0BB68F31ABB61B6 -:102EA0000323FB7108F10102FB69A24205D113B1B2 -:102EB0000133FB61D9E70223FBE70BB90123FB6177 -:102EC000224641463846FFF747FC00284FD10123F0 -:102ED000FB61EA6AAB69023A6C6193429CBF03F101 -:102EE000FF33AB612B7943F001032B716AE7464551 -:102EF00014D1741C3846A34298BF02242146FFF720 -:102F0000C7FA01283FF45DAF431C33D0E0B16B69D1 -:102F1000012B03D9EA6A934238BF1E463446013476 -:102F2000EB6AA34203D8012E7FF644AF0224214668 -:102F30003846FFF7ADFA48B101283FF442AF0130FF -:102F400018D0B442EBD135E7002CE7D04FF0FF3278 -:102F500021462846FFF77CFB48B9B8F1000FB8D0EE -:102F6000224641462846FFF773FB0028B1D00128CE -:102F70007FF427AF4FF0FF3424E700002DE9F8433A -:102F800006680446076B894633782037042B0CBF4C -:102F90004FF080534FF40013BB429CBF0023836368 -:102FA000836B73B1C7F30808B8F1000F3CD101334C -:102FB000416B836339B93389B3EB571F34D800238E -:102FC000A36304200AE07389013B13EA57232BD142 -:102FD000FFF75EFA0128054602D80220BDE8F88313 -:102FE000421C01D10120F9E7F36A834216D8B9F1F6 -:102FF000000FE4D0616B2046FFF7CEFE0546C8B156 -:103000000128EAD0431CEDD001463046FFF752FCC0 -:103010000028E7D1E37943F00403E3712946304601 -:103020006563FEF7CDFFA0634C360020276346445E -:10303000E663D3E70720D1E7F8B50E460021044642 -:103040000768FFF7BDFA98B90546A16B3846FFF748 -:1030500067F968B93A78E36B042A1B780CD11B0630 -:103060000ED5054601212046FFF788FF0028ECD049 -:10307000042808BF072006E0E52B01D0002BF0D183 -:103080000135B542EED1F8BDC16C4B1C2DE9F041C4 -:1030900004460568066B1FD1E5274FF00108A16BB8 -:1030A0002846FFF73DF998B92A78E36B042A09BF4F -:1030B0001A781F7002F07F021A7085F80380236B64 -:1030C000B3420DD200212046FFF758FF0028E6D07A -:1030D000042808BF022003E0FFF772FA0028DBD0C3 -:1030E000BDE8F0812DE9F04105460068A96B06694D -:1030F000FFF716F9044620B9EB6B1A78852A03D03E -:1031000002242046BDE8F081324603F1200153F845 -:10311000040B8B4242F8040BF9D1777801377F0119 -:10312000A7F16003B3F5007FEAD800212846FFF736 -:1031300025FF04280446E3D00028E2D1A96B2868C3 -:10314000FFF7EEF804460028DBD1EB6B1A78C02AB3 -:10315000D6D106F1200203F1200153F8040B8B4273 -:1031600042F8040BF9D196F823300F222C33B3FB2D -:10317000F2F3B7EB431FC3D34FF0400800212846BA -:10318000FFF7FCFE04280446BAD00028B9D1A96B89 -:103190002868FFF7C5F804460028B2D1EB6B1A780F -:1031A000C12AADD1B8F5187F09D206EB080203F1A8 -:1031B000200153F8040B8B4242F8040BF9D108F1BB -:1031C00020084745DAD8B8F5187F9AD83046FEF778 -:1031D0001FFF7388834294D092E700000B6800229F -:1031E00010B5036004460B6A83604B6AC261C37109 -:1031F00023F0FF03896AC0E90432C164FFF7E0F9F4 -:1032000020B92046BDE81040FFF76CBF10BD00009C -:10321000F8B50368054601271C692046FEF7F8FE4D -:10322000A070000A6678E0702846E96CFFF7C8F9DC -:1032300020B1022828BF0220C0B2F8BDA96B2868BF -:10324000FFF76EF80028F4D1EB6B04F1200254F87C -:10325000041B944243F8041BF9D12B68DF70002E45 -:10326000E7D000212846013EFFF788FEE0E7000096 -:103270002DE9F8434FF0FF08064607680424454649 -:103280004FF6FF79B16B11B9002C73D063E038466B -:10329000FFF746F8044600285DD1F06B0378002B59 -:1032A0006ED03A78042A11D1852B4DD1336B30463C -:1032B000F364FFF717FF044600284CD13B691B79E4 -:1032C00003F03F03B3712046BDE8F883C27AE52BD3 -:1032D00002F03F02B27143D02E2B41D022F02001E8 -:1032E00008293DD00F2A40D1590637D503F0BF0534 -:1032F000336B90F80D80F364437B434530D1428BB0 -:1033000072BB03780D21FC6823F04003DFF874E002 -:10331000013B4B4301211EF801CB30F80CC009B32F -:10332000FF2B1DD824F813C06146013301320D2A4A -:10333000F1D10278520605D521B1FF2B10D8002219 -:1033400024F81320013DEDB200213046FFF716FEB0 -:103350000446002896D00023B363B4E7AB42CBD039 -:10336000FF25F1E7CC45E1D0FAE72DB9FEF740FEA5 -:10337000404501D10024A6E74FF0FF33F364A2E7F4 -:103380000424E8E7AC8E00082DE9F04F002187B057 -:103390000446D0F80090FFF713F9804670B999F809 -:1033A0000030042B33D1D9F80C00FEF779FF074623 -:1033B0002046FFF75DFF054620B18046404607B036 -:1033C000BDE8F08FD9F810309A8CBA42F0D193F85A -:1033D00023B040265D4506D1D9F80C3033F81530BE -:1033E000002BE5D1EAE7F106D9F8103008BF023624 -:1033F000985B01F04DF8D9F80C30824633F815008F -:1034000001F046F88245D3D102360135E2E74FF0AC -:10341000FF0A4FF0FF3B5546C4F84CB0A16B48463D -:10342000FEF77EFF00285CD1E66B3778002F77D05F -:10343000F27AE52F02F03F03A37103D0120704D5FF -:103440000F2B04D0C4F84CB04FE00F2B54D194F89C -:103450004B3058063FD4790645D5236B07F0BF079C -:1034600096F80DA0E364737B53453ED1738B002B1C -:103470003BD135780121D9F80C3005F03F05019397 -:103480000D23013D5D43284B13F8012BB25A71B354 -:10349000FF2D059329D81046049200F0F9FF6B1C0C -:1034A00003900293019B33F8150000F0F1FF03999C -:1034B00081421AD1049A029D1146059B1B4A9342F0 -:1034C000E2D133785A0604D519B1019B33F815308F -:1034D0005BB97D1EEDB200212046FFF74FFD0028AD -:1034E0009CD080466AE7BD42BDD0FF25F3E74FF68A -:1034F000FF708242E2D0F8E72DB93046FEF778FD42 -:1035000050453FF45BAF94F84B30DB079AD40B2265 -:1035100004F14001304605F05BFB002892D14DE7F5 -:103520004FF004084AE700BFAC8E0008B98E0008CF -:103530002DE9F04F90F84BB099B004461BF0A00570 -:1035400040F068810668F26832F81530002B4AD1E5 -:103550003378042B40F087800F230E352046B5FBCF -:10356000F3F5A91CFFF768FD8146002877D1236B8E -:103570000135A3EB4515E3795A07E56435D523F00A -:1035800004032046E371FFF77DF950BB4FF0FF3293 -:10359000616B2046FFF7E0F818BBA3682BB3214608 -:1035A00004A8FFF71BFEE0B970894FF40071D4E95D -:1035B0000423E0FB01233069C4E904233830FEF71B -:1035C000EFFC3069D4E904232830FEF7E9FCE37905 -:1035D000326904A843F0010382F82130FFF718FE96 -:1035E00018B181463BE00135AEE7D6E903544022ED -:1035F00000212046FEF796FB8523012140222370FF -:10360000C0234FF0C10C04EB010884F820300023E4 -:103610001E469E46571C04F802C0F0B2023204F85F -:1036200007E021B135F8131009B10133DBB20F0AFD -:10363000A15408F802700232D706F2D135F813709F -:103640000136002FE6D184F82330831C28466370AE -:10365000FEF726FE84F82400000A84F82500484678 -:1036600019B0BDE8F08F04F140070DF1100A1BF00E -:10367000010F97E807008AE8070000F0D380402395 -:103680004FF0010884F84B30BC46F368B8F1050FE1 -:103690009AE80700ACE803002CF8022B4FEA12422C -:1036A0008CF8002059D9981E424630F8021F002994 -:1036B00042D10DF10F0C072102F00F0E91461209B5 -:1036C0000EF13000392888BF0EF1370001390CF8AF -:1036D000010902D0B9F10F0FEED818AB7E205A18AD -:1036E00002F8580C38460022914206D010F801CB5F -:1036F00002F1010EBCF1200F31D104F13F0C07297A -:1037000002F1010297BF18AB20205818013198BF71 -:1037100010F8580C072A0CF80200F0D92046FFF7E1 -:1037200033FE8146002878D108F10108B8F1640F12 -:10373000AAD14FF0070992E74FF0100C01F0010EEB -:1037400049080EEB4202D30344BF82F4883282F070 -:103750002102BCF1010CF1D1A7E74246A9E772466C -:10376000C2E7216B2046A1EB4511FEF729FF8146F8 -:1037700000287FF474AF4FF6FF783846FEF738FC28 -:103780000190A16B3046FEF7CBFD814600287FF407 -:1037900066AFE36BE9B2019A4FF00D0CD6F80CE07E -:1037A0005A734FF00F02DFF8E0A0DA724A1E187366 -:1037B0000CFB02F284469876D87640451AF8019BB5 -:1037C0000CF1010C18BF3EF8120003EB090B18BFF7 -:1037D000013203F809004FEA1029002808BF4046CB -:1037E000BCF10D0F8BF80190E7D1404502D03EF8B7 -:1037F00012200AB941F0400119700123002120462E -:10380000F370FFF7BBFB814600287FF428AF013D32 -:10381000B7D11BE04FF0060921E704287FF41FAF62 -:1038200084F84BB01BF0020F20461BBF0C350D2156 -:103830000125B5FBF1F518BF01352946FFF7FCFB63 -:10384000814600287FF40BAF013D8AD1A16B304641 -:10385000FEF766FD814600287FF401AF0146202275 -:10386000E06BFEF75FFAE36B03CF18605960BA783C -:1038700039889A72198194F84B30E26B03F018037F -:1038800013730123F370EAE6AC8E000810B504460A -:103890000A463430FEF776FB886004F13800FEF704 -:1038A00073FBC2E9040194F8213003F00203D371E1 -:1038B0000023D36110BD000003284B8B04BF8A8A0C -:1038C00043EA0243184670472DE9F04F0B7899B050 -:1038D000044689462F2BD0F800B001D05C2B09D1CB -:1038E0004A461378914601322F2BFAD05C2BF8D040 -:1038F000002301E0DBF81C30A3600023E3619BF8A8 -:103900000030042B1ED1A368E3B1DBF82030214640 -:1039100004A82362DBF824306362DBF82830A3625A -:10392000FFF75CFC0346002854D1DBF8102002F1BD -:103930003800FEF727FBC4E9040392F8213003F0B6 -:103940000203E37199F800301F2B00F235818023C8 -:103950000021204684F84B3019B0BDE8F04FFEF747 -:103960002FBE49460B78894601312F2BFAD05C2BAC -:10397000F8D01F2B8CBF00250425012F2FD11388D1 -:103980002E2B31D1002322F8173004F140029F4240 -:103990008CBF2E21202101330B2B02F8011BF6D105 -:1039A00045F02005204684F84B50FFF7EDFC94F8D5 -:1039B0004B30002800F0E78004280BD1990603F073 -:1039C000040240F1DC80002A00F0F6808023002011 -:1039D00084F84B3019B0BDE8F08F0425CDE7022FF5 -:1039E00002D153882E2BCAD0911E87BB002322F808 -:1039F0001730002F00F0118132F8130019460133FF -:103A00002028F9D009B92E2801D145F00305901ED0 -:103A100030F817302E2B01D0013FF9D14FF0203371 -:103A20004FF0000A6364D0462364C4F8473008238B -:103A3000481C32F811600090F6B1202E03D02E2ED3 -:103A40000DD1B84210D045F003050099F0E731F8E8 -:103A50001730202B01D02E2BC8D1013FC5E79A4546 -:103A600005D20099B9423BD10B2B30D101E00B2B91 -:103A700027D145F003050B2394F84020E52A04BF25 -:103A8000052284F84020082B04BF4FEA88085FFA1B -:103A900088F808F00C030C2B03D008F00303032B69 -:103AA00001D145F00205A8073FF57CAF18F0010FE2 -:103AB00018BF45F0100518F0040F18BF45F00805B1 -:103AC00070E70099B94202D045F00305D4D84FEA17 -:103AD00088080B234FF0080A00975FFA88F8B4E7CC -:103AE0007F2E15D9304640F25231CDE9022345F000 -:103AF0000203019300F098FC10F0800F0646DDE908 -:103B0000022316D000F07F0646498E5D019D46B324 -:103B100031464548CDE9012305F0C8F8DDE9012328 -:103B2000F8B9A6F1410189B219291ED848F0020856 -:103B300010E0FF28EAD9591E8A4503D345F0030552 -:103B40009A4682E704EB0A01000A0AF1010A019D84 -:103B500081F8400004EB0A010AF1010A81F8406093 -:103B600073E745F003055F26F4E7A6F1610189B22A -:103B700019299EBF203E48F00108B6B2EAE7002AA4 -:103B800008BF052026E75A073FF524AFA379DB06D7 -:103B900045D59BF80000042835D1A3682146E27979 -:103BA00023622369DBF8100023F0FF0313436362F1 -:103BB000E36CA362FFF76AFE23680027DA6819F84E -:103BC000010B00283FF409AF40F25231009200F09F -:103BD0004BFC054608B31F28009A7FF6FEAE2F283F -:103BE0003FF4BFAE5C283FF4BCAE7F2805D8014649 -:103BF0000E4805F05BF8009A78B9FF2F0DD022F837 -:103C000017500137DBE7216B0BF14C03C1F30801BF -:103C10001944FFF751FEA060CEE70620DAE6052042 -:103C2000D8E600BF2C8E0008258E00081C8E0008E8 -:103C30001FB5CDE9001003A814460391FEF700FA62 -:103C4000002815DB0B4A52F820300BB10021197007 -:103C5000019B0BB10021197042F820302CB10022D9 -:103C600001A96846FEF7C8FE0446204604B010BD10 -:103C70000B24FAE79C3600202DE9F04798B09046D7 -:103C800005460191002800F0528102F03F0603A989 -:103C900001A83246FEF7B0FE002840F04681039BA3 -:103CA0004FF48C60049303F035F80746002800F0C9 -:103CB0004081039B00F500720199D86004A81A6145 -:103CC000FFF702FE044620B99DF95B30002BB8BF18 -:103CD000062418F01C0F00F0CD80002C4CD0042CD2 -:103CE00040D104A8FFF724FC044600283AD146F04E -:103CF0000806039B1A78042A40F083801869294635 -:103D00002B60FFF7C3FD039B1E22002118690230C0 -:103D1000FEF708F8039C00211A2220692630FEF7DE -:103D200001F8236920221A71246903F011F8014671 -:103D3000012208342046FEF72BF9039B04A81B69D7 -:103D400083F82120FFF764FA044658B9A96801B343 -:103D500002462846FEF718FDAB68039A0446013B6D -:103D60005361B4B1384602F0E5FF0CB100232B607B -:103D7000204618B0BDE8F0879DF8163013F0110FFB -:103D800040F0848018F0040F40F0C98018F0080F4C -:103D9000AFD1039A31071399936C48BF46F04006A0 -:103DA000E964AB641078042872D1069B9DF8171063 -:103DB0002B62089B106923F0FF030B4329466B62BB -:103DC000179BAB62FFF762FDDDF80CA00024002218 -:103DD00005F15008BAF8063021464046C5F800A063 -:103DE000AB80002385F8306085F831406C64C5E90C -:103DF0000E234FF40072FDF795FFB20653D4002452 -:103E0000B0E702F0A5FF0146009013980E30FEF7D0 -:103E1000BFF8139800991630FEF7BAF8039C13996F -:103E20002078FFF749FD202300228046CB722046F0 -:103E30001399FEF7D1F8139B002201211A775A77C4 -:103E40009A77DA77039BD970B8F1000FA1D0414679 -:103E500004A8D3F84890FEF797FC0446002881D1C7 -:103E600049460398FEF75CFA039B044608F1FF30CD -:103E7000586176E7002C7FF475AF9DF81630DC06AC -:103E80004FD418F0020F84D0D80782D5072469E7F1 -:103E9000FFF712FD0023A86001F11C00FEF772F885 -:103EA0006B61286190E7D5E9046956EA0903A6D059 -:103EB000BAF80AA0A9684FEA4A2AC5E90E69B245CC -:103EC00074EB09031BD300242964002C7FF44AAF50 -:103ED000C6F30803002B92D0039C2046FEF770F82F -:103EE00008B3760A0123414646EAC95682196A6434 -:103EF000607802F089FA041E18BF012432E72846D0 -:103F0000FEF7C6FAB6EB0A06014669F10009012878 -:103F100003D9431CD3D10124D6E70224D4E70824D3 -:103F200020E704241EE702241CE704461EE70924B8 -:103F30001EE711241CE700002DE9F04F994685B0DB -:103F40000023884603A90446C9F800301646FEF748 -:103F500091F8054680BB94F831506DBB94F8303031 -:103F600013F00103009300F0A68004F1500AD4E995 -:103F70000432D4E90E011B1A62EB0102B34272F162 -:103F8000000238BF1E46BEB1D4E90E10C1F30803CB -:103F9000002B40F08280039B5A894B0A013A43EA86 -:103FA000C0531A401BD151EA000309D1A06801286F -:103FB0000DD8022584F83150284605B0BDE8F08FB1 -:103FC000216C20460192FEF763FA019AEFE7431C49 -:103FD00004D10123009D84F83130EDE72064DDF841 -:103FE0000CB0216C5846FDF7EBFF0028E1D0B6F588 -:103FF000007F02EB000731D3BBF80A1002EB56201A -:10400000730A88429BF8010088BF8B1A3A464146E2 -:10401000019302F0F9F90028DBD194F93020019BDB -:10402000002A0BDA606CC01B984207D24FF4007272 -:10403000514608EB4020FDF74FFE019B5F02D9F887 -:104040000030F61BB8443B44C9F80030D4E90E32C6 -:10405000DB1942F10002C4E90E3294E7626CBA4205 -:104060001AD094F93030002B0DDA012351469BF819 -:10407000010002F0EDF90028ABD194F8303003F0E4 -:104080007F0384F83030039801233A465146407844 -:1040900002F0BAF900289CD16764A16B4046C1F3D5 -:1040A0000801C1F500775144B74228BF37463A4668 -:1040B000FDF712FEC3E707257EE7000070B596B056 -:1040C0000E460022019002A901A8FEF795FC0446C5 -:1040D000E0B94FF48C6002F01DFE0546D8B1029B9A -:1040E00000F500720199D86002A81A61FFF7ECFB95 -:1040F000044640B99DF95330002B0ADB1EB131460E -:1041000002A8FDF7EDFF284602F014FE204616B087 -:1041100070BD0624F7E71124F8E7000070B5B8B0C9 -:104120000222019003A901A8FEF766FC044608BB21 -:10413000039B4FF48C60109302F0ECFD05460028C1 -:1041400066D0039B00F500720199D86010A81A612F -:10415000FFF7BAFB044650B99DF88B30980655D44A -:10416000190653D49DF84630DA0706D507242846A9 -:1041700002F0E0FD204638B070BD039B0493187830 -:10418000042814D104A91869FFF780FB069E9DF846 -:104190004630DB0610D410A8FEF776FF0446002850 -:1041A000E5D156BB0398FEF7DBFB0446DFE71F991A -:1041B000FFF782FB0646EAE7039BDA69B242D5D0F5 -:1041C00024930021269624A81B78042B01BFDDE947 -:1041D0000823CDE928239DF817308DF89730FEF796 -:1041E000EFF904460028C2D124A8FFF741F804469D -:1041F0000028BBD00428BAD1CDE70246314604A836 -:10420000FEF7C2FA04460028B1D1CBE70624AEE798 -:104210001124AFE7F0B5BDB0CDE900106846FDF759 -:104220000FFF022203A901A8FEF7E6FB04460028BF -:1042300041D1039B4FF48C60149302F06BFD054653 -:10424000002800F0EE80039B00F5007214AE019987 -:10425000D8601A613046FFF737FB044640BB9DF833 -:104260009B3013F0A00F40F0D880039B009F1A787A -:10427000042A68D11B6904AC03F1400C18680833A8 -:1042800053F8041C2246634503C21446F6D150225B -:10429000314628A8FDF720FD394628A8FFF714FB72 -:1042A000044600284CD12A9A169B9A4206D008242C -:1042B000284602F03FFD20463DB0F0BD349A209BD9 -:1042C0009A42F4D128A8FFF733F904460028EFD129 -:1042D000039B04AF1B6993F801E093F823C09C8C07 -:1042E0003A46083303CAB24243F8080C43F8041CA8 -:1042F0001746F5D1039B28A81B6983F801E0039BAF -:104300001A6982F823C01A6982F82440240A82F8C4 -:1043100025401A691379D9065CBF43F02003137155 -:10432000FEF776FF04460028C2D13046FEF7ACFE09 -:1043300004460028BCD10398FEF712FB0446B7E7F9 -:104340000428B5D1BEE7239A04AB02F1200C106813 -:10435000083252F8041C1C46624503C42346F6D1B9 -:104360005022314628A8FDF7B7FC394628A8FFF7A8 -:10437000ABFA044600284CD12A9A169B9A4296D151 -:10438000349A209B9A4292D128A8FFF7D1F804468C -:1043900000288DD137990DF11D030DF12D0001F18C -:1043A0000D0253F8044B834242F8044BF9D11888AC -:1043B000012710809B7893709DF81B30039CDA06D0 -:1043C00058BF43F02003CB72E770CB7ADB06ACD545 -:1043D000169A2A9B9A42A8D02078FFF76DFA0146D8 -:1043E0002046FDF7EDFD0146C8B12046FDF798FFD8 -:1043F000044600287FF45CAF039890F86D302E2BB4 -:1044000093D12A9A00F16C01FDF7E6FD039BDF7062 -:104410008BE704287FF44CAFB6E7062448E7022474 -:1044200046E7112447E700007F2810B501D880B285 -:1044300010BDB0F5803F13D240F2523399420FD1F4 -:104440000849002231F8024B93B2844203D103F1B0 -:104450008000C0B2ECE70132802AF3D11346F6E7C0 -:104460000020E5E76C9100087F280DD940F2523317 -:10447000994208D1FF2806D800F10040034B80384C -:1044800033F8100070470020704700BF6C9100089F -:10449000B0F5803FF0B522D21F4A83B21F49B0F574 -:1044A000805F28BF0A46141D34F8042C2146AAB1A7 -:1044B000934213D334F8025C2E0AEFB252FA85F518 -:1044C000A84222DA082E09D8DFE806F0050A101201 -:1044D0001416181A1C00801A34F810301846F0BD53 -:1044E000981A00F001001B1A9BB2F7E7103BFBE79C -:1044F000203BF9E7303BF7E71A3BF5E70833F3E7F2 -:10450000503BF1E7A3F5E353EEE70434002ECBD1A3 -:1045100001EB4702C7E700BFBC8E0008B09000085F -:10452000084BC26A994228BF1946836C50688B4277 -:1045300010B506D95A1E4C0002EB4103B3FBF4F34D -:10454000184410BD20BCBE0001F001038A0748BF1B -:1045500043F002034A0748BF43F008030A0748BF75 -:1045600043F00403CA0648BF43F010038A06426BB7 -:1045700048BF43F0200313434363704710B5074C13 -:10458000204600F093FF064B0022C4E91023054BA0 -:10459000A364054BE363054BE36410BDA436002020 -:1045A0000070005200B4C404F8360020F83800202F -:1045B000C36A0BB90E4BC3620379012B0CD10D4BAF -:1045C000984209D10C4B5A6B42F480325A63DA6D2F -:1045D00042F48032DA65DB6D436C00221A65DA62E0 -:1045E0001A605A605A624FF0FF329A63704700BFF8 -:1045F0006C920008A4360020004502580379012B74 -:1046000016D0436C00221A65DA621A605A605A6248 -:104610004FF0FF329A63074B984209D1064B5A6B11 -:1046200022F480325A63DA6D22F48032DA65DB6D6F -:10463000704700BFA43600200045025810B5446CF6 -:104640000649FFF76DFF6060236842F2107043F087 -:1046500003032360BDE8104001F048BD801A060046 -:104660000129F8B5466C0B4F09D175680A493D40E0 -:10467000FFF756FF054345F480557560F8BD746833 -:1046800006493C40FFF74CFF044344F480547460F7 -:10469000F4E700BF00ECFFFF80F0FA0240787D01F4 -:1046A000436C00225A601A6070470000426C012976 -:1046B000536823F4404304D0022905D001B9536064 -:1046C000704743F48043FAE743F40043F7E7000000 -:1046D000436C41F480519A60D9605A6B1206FCD544 -:1046E00080229A637047000010B541F48851446CF1 -:1046F000A260E160616B11F04502FBD0A26311F092 -:10470000040203D0FFF720FF012010BD61691046AD -:104710001960FAE710B541F48851446CA260E16079 -:10472000616B11F04502FBD0A26311F0050203D0CA -:10473000FFF70AFF012010BD616910461960FAE712 -:1047400073B5134604460E46302282F31188426C3C -:10475000D26B32B14FF0FF314030019301F0D2FC07 -:10476000019B606C00220265C263C262456B15F456 -:10477000807504D185F31188012002B070BD4FF01F -:10478000FF31816382F31188012E06D90C21204666 -:1047900002B0BDE87040FFF7BDBF1046EDE7000076 -:1047A00073B5446C0E4600250192616BA1632565CB -:1047B000E562FFF7C9FE012E07D9019B2A460C21AD -:1047C00002B0BDE87040FFF7A5BF02B070BD0000A9 -:1047D00010B541F49851446CA260E160616B11F036 -:1047E0004502FBD0A26311F03F0203D0FFF7ACFEFD -:1047F000012010BD216A10461960E1695960A16964 -:1048000099606169D960F4E72DE9F74304460191A5 -:10481000006D01A91746984602F0D4FB0646002811 -:104820004AD0626C2046DDF804905568C5F309054E -:1048300001356B00A56CB5FBF3F54FF47A73B5FB4E -:10484000F3F55D43556200F0F7FD50BB636C4FF02C -:10485000FF3201254146C3F8589020461D659A63F2 -:104860004FF49572DA6342F207029F62DA62E36CF8 -:104870000A9AFFF74FFFA0B9E26C104B11680B408A -:104880007BB929462046FFF75BFF054648B92E460F -:104890003A460199206D02F0BDFB304603B0BDE8F9 -:1048A000F0833A460199206D02F0B4FBE26C0121DD -:1048B0002046FFF775FFF0E70126EEE708E0FFFD71 -:1048C0002DE9F7431F46436C01924FF47A725D68FD -:1048D00004468846C5F3090501356E00856CB5FBB5 -:1048E000F6F5B5FBF2F555435D6200F0A5FD20B18C -:1048F0000125284603B0BDE8F0837E0201A9206DA2 -:10490000324602F05FFB05460028F1D0636C019A45 -:10491000D4F84C909A6501221A654FF0FF329A63E1 -:104920004FF49572DA639E62236BDB064B4658BFE9 -:104930004FEA4828012F42461BD912212046FFF793 -:10494000E9FEC0B9D9F80020104B13409BB9636C45 -:1049500042F2930239462046DA62E26CFFF7F0FE3B -:10496000804640B932460199206D454602F052FB1F -:10497000BFE71121E2E732460199206D02F04AFBC0 -:10498000E26C39462046FFF70BFFB2E708E0FFFD77 -:104990002DE9F3411F46436C01924FF47A725D6832 -:1049A00004468846C5F3090501356E00856CB5FBE4 -:1049B000F6F5B5FBF2F555435D6200F03DFD20B123 -:1049C0000125284602B0BDE8F0817E0201A9206DD4 -:1049D000324602F02DFB05460028F1D0636C019AA7 -:1049E0009A6501221A654FF0FF329A634FF48D7277 -:1049F000DA639E62236BE66CDB06334658BF4FEAF0 -:104A00004828012F424619D919212046FFF782FE76 -:104A1000B0B932680F4B134093B9636C42F2910204 -:104A200039462046DA62E26CFFF78AFE064638B95C -:104A300001993546206D02F027FBC2E71821E4E713 -:104A40000199206D02F020FBE26C39462046FFF709 -:104A5000A7FEB6E708E0FFFD12F0030F2DE9F041D5 -:104A600007460C4615461E4617D00E44B44202D1E6 -:104A70000020BDE8F0810123FA6B21463846FFF79C -:104A80001FFF0028F5D128464FF40072F96B05F599 -:104A900000750134FDF720F9E8E7BDE8F041FFF7C4 -:104AA0000FBF000012F0030F2DE9F04107460C463E -:104AB00015461E4617D00E44B44202D10020BDE870 -:104AC000F08129464FF40072F86B05F50075FDF78B -:104AD00003F90123FA6B21463846FFF759FF0028F6 -:104AE000EDD10134E8E7BDE8F041FFF751BF000028 -:104AF00000207047302310B583F311880024436CE5 -:104B000040302146DC6301F00BFB84F3118810BDBB -:104B1000026843681143016003B118477047000001 -:104B2000024A136843F0C00313607047004400401A -:104B3000024A136843F0C003136070470048004006 -:104B4000024A136843F0C0031360704700780040C6 -:104B5000044B9A6C02439A641A6F104318671B6FD8 -:104B6000704700BF0045025837B5274C274D2046F7 -:104B700000F0FCFC04F11400009400234FF40072D8 -:104B8000234900F097F94FF40072224904F13800EC -:104B90000094214B00F010FA204BC4E91735204C4B -:104BA000204600F0E3FC04F11400009400234FF4CD -:104BB00000721C4900F07EF94FF400721A4904F1AA -:104BC00038000094194B00F0F7F9194BC4E9173578 -:104BD000184C204600F0CAFC04F1140000234FF4E6 -:104BE00000721549009400F065F9144B4FF40072FF -:104BF000134904F13800009400F0DEF9114BC4E9C8 -:104C0000173503B030BD00BFFC38002000E1F505CA -:104C1000403A002040400020214B00080044004062 -:104C200068390020403C002040420020314B000801 -:104C300000480040D4390020403E0020414B00088D -:104C4000404400200078004038B5264D0446037CDF -:104C5000002918BF0D46012B06D1234B984230D1B5 -:104C60004FF40030FFF774FF2A68236EE16D03EB09 -:104C70005203A566B3FBF2F36A68100442BF23F047 -:104C8000070003F0070343EA4003CB60AB6843F03F -:104C900040034B60EB6843F001038B6042F4967372 -:104CA00043F001030B604FF0FF330B62510505D554 -:104CB00012F0102211D0B2F1805F10D084F864306D -:104CC00038BD0A4B984205D0094B9842CCD14FF0E1 -:104CD0008040C7E74FF48020C4E77F23EEE73F23FF -:104CE000ECE700BF74920008FC380020683900200F -:104CF000D43900202DE9F047C66D05463768F469C0 -:104D0000210734621AD014F0080118BF4FF48071E3 -:104D1000E20748BF41F02001A3074FF0300348BF2E -:104D200041F04001600748BF41F0800183F31188E2 -:104D3000281DFFF7EDFE002383F31188E2050AD555 -:104D4000302383F311884FF48061281DFFF7E0FEC4 -:104D5000002383F311884FF030094FF0000A14F05C -:104D6000200838D13B0616D54FF0300905F1380A36 -:104D7000200610D589F31188504600F051F900281B -:104D800036DA0821281DFFF7C3FE27F080033360C1 -:104D9000002383F31188790614D5620612D53023D7 -:104DA00083F31188D5E913239A4208D12B6C33B1D0 -:104DB00027F040071021281DFFF7AAFE37600023C7 -:104DC00083F31188E30618D5AA6E1369ABB1506955 -:104DD000BDE8F047184789F31188736A284695F8AB -:104DE0006410194000F0DCFB8AF31188F469B6E71F -:104DF000B06288F31188F469BAE7BDE8F087000073 -:104E0000F8B51546826804460B46AA4200D285686A -:104E1000A1692669761AB5420BD218462A46FCF7D4 -:104E20005BFFA3692B44A3612846A3685B1BA360B7 -:104E3000F8BD0CD9AF1B18463246FCF74DFF3A4679 -:104E4000E1683044FCF748FFE3683B44EBE7184671 -:104E50002A46FCF741FFE368E5E7000083689342D8 -:104E6000F7B50446154600D28568D4E90460361AC1 -:104E7000B5420BD22A46FCF72FFF63692B446361CE -:104E80002846A3685B1BA36003B0F0BD0DD9324672 -:104E9000AF1B0191FCF720FF01993A46E0683144CD -:104EA000FCF71AFFE3683B44E9E72A46FCF714FFE6 -:104EB000E368E4E710B50A440024C361029B846000 -:104EC000C16002610362C0E90000C0E9051110BDC4 -:104ED00008B5D0E90532934201D1826882B982686F -:104EE000013282605A1C426119700021D0E90432FB -:104EF0009A4224BFC368436101F02CF9002008BD29 -:104F00004FF0FF30FBE7000070B5302304460E463B -:104F100083F31188A568A5B1A368A269013BA360CA -:104F2000531CA36115782269934224BFE368A361EF -:104F3000E3690BB120469847002383F31188284684 -:104F400007E03146204601F0F5F80028E2DA85F363 -:104F5000118870BD2DE9F74F04460E461746984656 -:104F6000D0F81C904FF0300A8AF311884FF0000BF4 -:104F7000154665B12A4631462046FFF741FF0346F4 -:104F800060B94146204601F0D5F80028F1D0002351 -:104F900083F31188781B03B0BDE8F08FB9F1000FDF -:104FA00003D001902046C847019B8BF31188ED1A6E -:104FB0001E448AF31188DCE7C160C361009B8260F4 -:104FC0000362C0E905111144C0E9000001617047A6 -:104FD000F8B504460D461646302383F31188A768BA -:104FE000A7B1A368013BA36063695A1C62611D708D -:104FF000D4E904329A4224BFE3686361E3690BB1E8 -:1050000020469847002080F3118807E0314620466B -:1050100001F090F80028E2DA87F31188F8BD00006B -:10502000D0E9052310B59A4201D182687AB9826825 -:105030000021013282605A1C82611C7803699A4205 -:1050400024BFC368836101F085F8204610BD4FF08E -:10505000FF30FBE72DE9F74F04460E46174698460A -:10506000D0F81C904FF0300A8AF311884FF0000BF3 -:10507000154665B12A4631462046FFF7EFFE034646 -:1050800060B94146204601F055F80028F1D00023D0 -:1050900083F31188781B03B0BDE8F08FB9F1000FDE -:1050A00003D001902046C847019B8BF31188ED1A6D -:1050B0001E448AF31188DCE70379052B05BF836A58 -:1050C000002001204B6004BF4FF400730B60704759 -:1050D00070B55D1E866A04460D44B54205D9436B22 -:1050E00043F080034363012070BD06250571FFF77F -:1050F000B3FC05232371F7E770B55D1E866A04468D -:105100000D44B54205D9436B43F08003436301204E -:1051100070BD07250571FFF7C5FC05232371F7E76F -:1051200038B505790446052D05D108230371FFF72D -:10513000DFFC257138BD0120FCE700000323F0B53A -:10514000037185B00446FFF779FA00222046114624 -:10515000FFF7BEFA4FF4D57203AB08212046FFF7E4 -:10516000D9FA0246B8B901232363039BC3F303238F -:10517000012B09D103AB37212046FFF7CBFA18B931 -:10518000A44B039A1340ABB120460125FFF788FAE0 -:105190000223237137E103AB002237212046FFF7BA -:1051A000B9FA28B99B4A039B1A40002A00F0A7804D -:1051B00002232363236B03F00F03022B40F0A9802B -:1051C0006425954E42F2107000F090FF03AB32461A -:1051D00001212046FFF788FA0028D5D1039B002B38 -:1051E00080F293805A0003D5236B43F010032363AE -:1051F000002204F1080302212046FFF7E9FA0246E3 -:105200000028C1D104F1380303212046FFF782FAB8 -:105210000028B9D104F11805A26B092120462B46BC -:10522000FFF7D6FA0028AFD102ABA26B07212046C8 -:10523000FFF770FA06460028A6D1236B03F00F0390 -:10524000022B40F08F807E227F21284603F07EF9DA -:10525000012840F28780E76B42F2107000F046FFB1 -:1052600008234FF40072394620460096FFF7CCFA27 -:10527000002889D1384603F0B7F9236BA06203F008 -:105280000F03022B72D103AB644A06212046FFF7BD -:1052900041FA002871D15F49039B1940B1FA81F1AD -:1052A00049092046FFF7DCF902AB4FF400721021E8 -:1052B0002046FFF72FFA054600287FF465AF554ECC -:1052C000029B33427FF460AF236B13F00E0F03F0A9 -:1052D0000F0273D0022A7FF457AFE36A19780129CD -:1052E00000F09480022900F09380002900F089806A -:1052F0004B4F2046FFF7DAF903AB3A4676E011460A -:1053000020462263FFF7E4F954E7013D7FF45AAFEA -:105310003AE7444D6426444A3E4F012B18BF1546D8 -:1053200003AB002237212046FFF7F4F900287FF471 -:105330002BAF039B3B427FF427AF03AB2A462921C7 -:105340002046FFF7D1F900287FF41EAF039B002B06 -:10535000FFF648AF013E3FF417AF42F2107000F085 -:10536000C5FEDDE7284603F013F986E77E227F219C -:105370002846E66B03F0EAF808B9002191E700231C -:1053800040223146204600930623FFF73DFA0028CD -:10539000F3D1B3895BBA9B07EFD5244B402231464A -:1053A000204600930623FFF72FFA0028E5D1317C31 -:1053B00001F00F010F3918BF012172E7E36A197874 -:1053C000F9B101297FF4E0AE2046FFF76FF903AB96 -:1053D000A26B37212046FFF79DF900287FF4D4AE59 -:1053E000039B33427FF4D0AE03AB0222062120465A -:1053F000FFF790F900287FF4C7AE039B33427FF498 -:10540000C3AE05232371284605B0F0BD084F70E7F1 -:10541000084F6EE708E0FFFD0080FFC00001B90300 -:105420000000B7030080FF5000001080F1FFFF80F4 -:105430000001B7030002B70337B504460C4D01ABBA -:10544000A26B0D212046FFF765F978B9019B2B422D -:105450000BD1C3F34323042B08D0053B022B04D804 -:105460004FF47A7000F042FEE9E7012003B030BD4E -:1054700008E0FFFD70B53023054683F311880379FA -:105480000024022B03D184F31188204670BD04232D -:10549000037184F311880226FFF7CEFF04462846E5 -:1054A000FFF7FEF82E71F0E7FFF768B8044B0360D2 -:1054B0000123037100234363C0E90A33704700BF2F -:1054C0008C92000810B53023044683F31188C16222 -:1054D000FFF76EF802230020237180F3118810BDBE -:1054E00010B53023044683F31188FFF787F80023B3 -:1054F0000122E362227183F3118810BD02684368C0 -:105500001143016003B11847704700001430FFF7E2 -:1055100021BD00004FF0FF331430FFF71BBD00002A -:105520003830FFF797BD00004FF0FF333830FFF7FA -:1055300091BD00001430FFF7E7BC00004FF0FF31D1 -:105540001430FFF7E1BC00003830FFF741BD000028 -:105550004FF0FF323830FFF73BBD0000012914BF88 -:105560006FF0130000207047FFF7FEBA044B036092 -:1055700000234360C0E9023301230374704700BF76 -:10558000B092000810B53023044683F31188FFF76A -:105590005BFB02230020237480F3118810BD000000 -:1055A00038B5C36904460D461BB904210844FFF70A -:1055B000A5FF294604F11400FFF78AFC002806DA4B -:1055C000201D4FF40061BDE83840FFF797BF38BD9C -:1055D000026843681143016003B118477047000037 -:1055E00013B5406B00F58054D4F8A4381A681178CC -:1055F000042914D1017C022911D1197901231289BE -:105600008B4013420BD101A94C3002F0CDFED4F8EF -:10561000A4480246019B2179206800F0DFF902B01E -:1056200010BD0000143002F04FBE00004FF0FF33F9 -:10563000143002F049BE00004C3002F021BF0000DF -:105640004FF0FF334C3002F01BBF0000143002F06B -:105650001DBE00004FF0FF31143002F017BE0000F5 -:105660004C3002F0EDBE00004FF0FF324C3002F043 -:10567000E7BE00000020704710B500F58054D4F854 -:10568000A4381A681178042917D1017C022914D191 -:105690005979012352898B4013420ED1143002F004 -:1056A000AFFD024648B1D4F8A4484FF44073617985 -:1056B0002068BDE8104000F07FB910BD406BFFF7D7 -:1056C000DBBF0000704700007FB5124B01250426A8 -:1056D000044603600023057400F1840243602946F8 -:1056E000C0E902330C4B0290143001934FF4407325 -:1056F000009602F061FD094B04F69442294604F13C -:105700004C000294CDE900634FF4407302F028FE90 -:1057100004B070BDD8920008BD560008E1550008DD -:105720000A68302383F311880B790B3342F8230086 -:105730004B79133342F823008B7913B10B3342F8C2 -:10574000230000F58053C3F8A4180223037400203B -:1057500080F311887047000038B5037F044613B109 -:1057600090F85430ABB90125201D0221FFF730FF1E -:1057700004F114006FF00101257700F0F7FC04F14B -:105780004C0084F854506FF00101BDE8384000F03F -:10579000EDBC38BD10B5012104460430FFF718FFF9 -:1057A0000023237784F8543010BD000038B5044638 -:1057B0000025143002F018FD04F14C00257702F0AA -:1057C000E7FD201D84F854500121FFF701FF20461A -:1057D000BDE83840FFF750BF90F8803003F0600319 -:1057E000202B06D190F881200023212A03D81F2ADC -:1057F00006D800207047222AFBD1C0E91D3303E000 -:10580000034A426707228267C3670120704700BFCF -:105810004422002037B500F58055D5F8A4381A6821 -:10582000117804291AD1017C022917D11979012391 -:1058300012898B40134211D100F14C04204602F032 -:1058400067FE58B101A9204602F0AEFDD5F8A44884 -:105850000246019B2179206800F0C0F803B030BDFA -:1058600001F10B03F0B550F8236085B004460D46F6 -:10587000FEB1302383F3118804EB8507301D082126 -:10588000FFF7A6FEFB6806F14C005B691B681BB1C5 -:10589000019002F097FD019803A902F085FD0246F0 -:1058A00048B1039B2946204600F098F8002383F373 -:1058B000118805B0F0BDFB685A691268002AF5D05E -:1058C0001B8A013B1340F1D104F18002EAE700009A -:1058D000133138B550F82140ECB1302383F31188EF -:1058E00004F58053D3F8A4281368527903EB82039C -:1058F000DB689B695D6845B104216018FFF768FEAD -:10590000294604F1140002F085FC2046FFF7B4FE9E -:10591000002383F3118838BD7047000001F0A2BC5A -:1059200001234022002110B5044600F8303BFCF76B -:10593000F9F90023C4E9013310BD000010B530238C -:10594000044683F311882422416000210C30FCF7C7 -:10595000E9F9204601F0A8FC02230020237080F31F -:10596000118810BD70B500EB8103054650690E46E5 -:105970001446DA6018B110220021FCF7D3F9A069AF -:1059800018B110220021FCF7CDF931462846BDE8B8 -:10599000704001F089BD000083682022002103F0DF -:1059A000011310B5044683601030FCF7BBF92046A4 -:1059B000BDE8104001F004BEF0B4012500EB810405 -:1059C00047898D40E4683D43A469458123600023F5 -:1059D000A2606360F0BC01F021BE0000F0B40125BC -:1059E00000EB810407898D40E4683D4364690581CB -:1059F00023600023A2606360F0BC01F097BE00004A -:105A000070B5022300250446242203702946C0F8FD -:105A100088500C3040F8045CFCF784F9204684F888 -:105A2000705001F0D5FC63681B6823B129462046FD -:105A3000BDE87040184770BD0378052B10B50446CB -:105A40000AD080F88C300523037043681B680BB1C3 -:105A5000042198470023A36010BD000001780529A8 -:105A600006D190F88C20436802701B6803B1184778 -:105A70007047000070B590F87030044613B10023F1 -:105A800080F8703004F18002204601F0BDFD6368AB -:105A90009B68B3B994F8803013F0600535D00021CD -:105AA000204602F0AFF80021204602F09FF863681C -:105AB0001B6813B1062120469847062384F87030EE -:105AC00070BD204698470028E4D0B4F88630A26F15 -:105AD0009A4288BFA36794F98030A56F002B4FF0DE -:105AE000300380F20381002D00F0F280092284F857 -:105AF000702083F3118800212046D4E91D23FFF78D -:105B00006DFF002383F31188DAE794F8812003F016 -:105B10007F0343EA022340F20232934200F0C58041 -:105B200021D8B3F5807F48D00DD8012B3FD0022B70 -:105B300000F09380002BB2D104F188026267022248 -:105B4000A267E367C1E7B3F5817F00F09B80B3F5FF -:105B5000407FA4D194F88230012BA0D1B4F88830D2 -:105B600043F0020332E0B3F5006F4DD017D8B3F520 -:105B7000A06F31D0A3F5C063012B90D86368204695 -:105B800094F882205E6894F88310B4F88430B047AB -:105B9000002884D0436863670368A3671AE0B3F5FD -:105BA000106F36D040F6024293427FF478AF5C4BE0 -:105BB00063670223A3670023C3E794F88230012BB5 -:105BC0007FF46DAFB4F8883023F00203A4F8883076 -:105BD000C4E91D55E56778E7B4F88030B3F5A06FE8 -:105BE0000ED194F88230204684F88A3001F04EFCC1 -:105BF00063681B6813B10121204698470323237073 -:105C00000023C4E91D339CE704F18B036367012380 -:105C1000C3E72378042B10D1302383F31188204667 -:105C2000FFF7BAFE85F311880321636884F88B506F -:105C300021701B680BB12046984794F88230002BE6 -:105C4000DED084F88B300423237063681B68002B3C -:105C5000D6D0022120469847D2E794F884302046D7 -:105C60001D0603F00F010AD501F0C0FC012804D085 -:105C700002287FF414AF2B4B9AE72B4B98E701F0E7 -:105C8000A7FCF3E794F88230002B7FF408AF94F878 -:105C9000843013F00F01B3D01A06204602D501F06C -:105CA000C9FFADE701F0BAFFAAE794F88230002BF4 -:105CB0007FF4F5AE94F8843013F00F01A0D01B06EA -:105CC000204602D501F09EFF9AE701F08FFF97E78B -:105CD000142284F8702083F311882B462A46294623 -:105CE0002046FFF769FE85F31188E9E65DB11522CC -:105CF00084F8702083F3118800212046D4E91D2305 -:105D0000FFF75AFEFDE60B2284F8702083F311881A -:105D10002B462A4629462046FFF760FEE3E700BFF0 -:105D200008930008009300080493000838B590F821 -:105D300070300446002B3ED0063BDAB20F2A34D82E -:105D40000F2B32D8DFE803F03731310822323131FE -:105D50003131313131313737856FB0F886309D427E -:105D600014D2C3681B8AB5FBF3F203FB12556DB95D -:105D7000302383F311882B462A462946FFF72EFE4F -:105D800085F311880A2384F870300EE0142384F818 -:105D90007030302383F31188002320461A461946B9 -:105DA000FFF70AFE002383F3118838BDC36F03B1E8 -:105DB00098470023E7E70021204601F023FF002158 -:105DC000204601F013FF63681B6813B106212046CB -:105DD00098470623D7E7000010B590F870300446C6 -:105DE000142B29D017D8062B05D001D81BB110BD14 -:105DF000093B022BFBD80021204601F003FF0021C4 -:105E0000204601F0F3FE63681B6813B106212046AB -:105E10009847062319E0152BE9D10B2380F8703041 -:105E2000302383F3118800231A461946FFF7D6FD65 -:105E3000002383F31188DAE7C3689B695B68002B52 -:105E4000D5D1C36F03B19847002384F87030CEE7F3 -:105E50000023826880F8243083691B689968914226 -:105E6000FBD25A68036042601060586070470000BF -:105E70000023826880F8243083691B689968914206 -:105E8000FBD85A6803604260106058607047000099 -:105E900008B50846302383F3118891F82430032B8A -:105EA00005D0042B0DD02BB983F3118808BD8B6A64 -:105EB00000221A604FF0FF338362FFF7C9FF00230F -:105EC000F2E7D1E9003213605A60F3E7034610B5F8 -:105ED0001B68984203D09C688A689442F8D25A683A -:105EE0000B604A601160596010BD0000FFF7B0BF41 -:105EF000064BD96881F824001868026853601A605C -:105F00000122D86080F82420FAF77CBA40460020AD -:105F10000C4B30B5DD684B1C87B004460FD02B46C8 -:105F2000094A684600F0B6F92046FFF7E1FF009BFA -:105F300013B1684600F0B8F9A86A07B030BDFFF7A2 -:105F4000D7FFF9E740460020915E0008044B1A682D -:105F5000DB6890689B68984294BF002001207047DE -:105F600040460020094B10B51C68D8682268536071 -:105F70001A600122DC6084F82420FFF779FF0146D3 -:105F80002046BDE81040FAF73DBA00BF4046002069 -:105F9000044B1A68DB6892689B689A4201D9FFF744 -:105FA000E1BF70474046002038B50123084C00256A -:105FB0002370656002F046FB02F06CFB0549064861 -:105FC00002F042FC0223237085F3118838BD00BF24 -:105FD000E8480020109300084046002000F09AB9DD -:105FE000EFF3118020B9EFF30583302282F311889B -:105FF0007047000010B530B9EFF30584C4F308040E -:1060000014B180F3118810BDFFF7C2FF84F311882B -:10601000F9E70000034A516853685B1A9842FBD8BD -:10602000704700BF001000E08B604B630023CA6123 -:1060300000F128020B6302230A618B84012388612B -:1060400081F8263001F11003C26A4A611360C3620D -:1060500001F12C030846CB6270470000D0E9013102 -:10606000026841F8183CA1F19C033839CB60036900 -:1060700041F8243C436941F8203C034B41F8043C7F -:10608000C3680248FFF7D0BF1D0400084046002047 -:1060900008B5FFF7E3FFBDE80840FFF727BF0000A2 -:1060A00038B50E4BDC6804F12C05A062E06AA8420A -:1060B0000FD194F826303BB994F825309B0702BFE6 -:1060C000D4E9043213605A600F20BDE83840FFF76E -:1060D0000FBF0368E362FFF709FFE7E740460020D0 -:1060E000302383F31188FFF7DBBF000008B50146BA -:1060F000302383F311880820FFF70AFF002383F37E -:10610000118808BD054BDB6821B10360986203204C -:10611000FFF7FEBE4FF0FF30704700BF4046002043 -:1061200003682BB10022026018469962FFF7DEBEB9 -:1061300070470000064BDB6839B1426818605A604E -:10614000136043600420FFF7E3BE4FF0FF30704759 -:10615000404600200368984206D01A6802605060EA -:1061600018469962FFF7C2BE7047000038B5044672 -:106170000D462068844200D138BD036823605C600E -:106180008562FFF7B3FEF4E7036810B59C68A2428E -:106190000CD85C688A600B604C602160596099681B -:1061A0008A1A9A604FF0FF33836010BD121B1B6880 -:1061B000ECE700000A2938BF0A2170B504460D46F5 -:1061C0000A26601902F038FA02F020FA041BA542F0 -:1061D00003D8751C04462E46F3E70A2E04D9012085 -:1061E000BDE8704002F0F8BB70BD0000F8B5144B7C -:1061F0000D460A2A4FF00A07D96103F110018260A7 -:1062000038BF0A224160196914460160486018616C -:10621000A81802F001FA02F0F9F9431B0646A3425E -:1062200006D37C1C28192746354602F005FAF2E70A -:106230000A2F04D90120BDE8F84002F0CDBBF8BD1B -:1062400040460020F8B506460D4602F0DFF90F4A39 -:10625000134653F8107F9F4206D12A460146304626 -:10626000BDE8F840FFF7C2BFD169BB68441A2C19DA -:1062700028BF2C46A34202D92946FFF79BFF22469E -:1062800031460348BDE8F840FFF77EBF4046002096 -:1062900050460020C0E90323002310B45DF8044BEE -:1062A0004361FFF7CFBF000010B5194C2369984236 -:1062B0000DD08168D0E9003213605A609A680A44B0 -:1062C0009A60002303604FF0FF33A36110BD0268A2 -:1062D000234643F8102F53600022026022699A423D -:1062E00003D1BDE8104002F0A1B9936881680B4466 -:1062F000936002F08BF92269E1699268441AA24224 -:10630000E4D91144BDE81040091AFFF753BF00BF9C -:10631000404600202DE9F047DFF8BC8008F1100767 -:106320002C4ED8F8105002F071F9D8F81C40AA6829 -:10633000031B9A423ED814444FF00009D5E90032BD -:10634000C8F81C4013605A60C5F80090D8F81030A7 -:10635000B34201D102F06AF989F31188D5E903311A -:1063600028469847302383F311886B69002BD8D0D7 -:1063700002F04CF96A69A0EB040982464A450DD245 -:10638000022002F029FB0022D8F81030B34208D1D5 -:1063900051462846BDE8F047FFF728BF121A2244AD -:1063A000F2E712EB09092946384638BF4A46FFF79B -:1063B000EBFEB5E7D8F81030B34208D01444C8F863 -:1063C0001C00211AA960BDE8F047FFF7F3BEBDE845 -:1063D000F08700BF504600204046002010B560B94D -:1063E000074804790368053C9B6818BF0124984757 -:1063F00008B144F00404204610BD0124FBE700BFAF -:10640000A4360020FFF7EABF2DE9F047884617467B -:106410009A460446B0B90D4E3579052D05D00324B2 -:106420000DE0013D15F0FF050ED0326853463946A8 -:106430003046D2F814904246C8470028F1D1204691 -:10644000BDE8F0870424FAE70124F8E7A436002029 -:106450002DE9F047884617469A460446B0B90D4ED6 -:106460003579052D05D003240DE0013D15F0FF051C -:106470000ED03268534639463046D2F8189042461C -:10648000C8470028F1D12046BDE8F0870424FAE788 -:106490000124F8E7A436002037B50C46154670B93C -:1064A00051B101290BD10748694603681B6A984717 -:1064B00010B9019B04462B60204603B030BD042474 -:1064C000FAE700BFA436002000207047FEE7000076 -:1064D000704700004FF0FF30704700004B6843608A -:1064E0008B688360CB68C3600B6943614B6903624F -:1064F0008B6943620B6803607047000008B53A4B34 -:1065000040F2FF713948D3F888200A43C3F8882045 -:10651000D3F8882022F4FF6222F00702C3F8882013 -:10652000D3F88830324B1A6C0A431A649A6E0A43C5 -:106530009A66304A9B6E1146FFF7D0FF00F58060E7 -:1065400002F11C01FFF7CAFF00F5806002F138017B -:10655000FFF7C4FF00F5806002F15401FFF7BEFFB2 -:1065600000F5806002F17001FFF7B8FF00F5806070 -:1065700002F18C01FFF7B2FF00F5806002F1A80183 -:10658000FFF7ACFF00F5806002F1C401FFF7A6FF42 -:1065900000F5806002F1E001FFF7A0FF00F58060E8 -:1065A00002F1FC01FFF79AFF02F58C7100F58060A3 -:1065B000FFF794FF01F0CEFB0F4BD3F8902242F08F -:1065C0000102C3F89022D3F8942242F00102C3F8EA -:1065D00094220522C3F898204FF06052C3F89C2003 -:1065E000064AC3F8A02008BD004402580000025823 -:1065F000004502582493000800ED00E01F00080346 -:1066000008B501F0C5FDFFF7CFFC0D4BDA6B42F08A -:106610004002DA635A6E22F040025A665B6E094B02 -:106620001A6842F008021A601A6842F004021A60FE -:1066300000F032FD00F032FBBDE8084000F0B4B8D5 -:10664000004502580018024801207047002070479A -:106650007047000002290CD0032904D00129074803 -:1066600018BF00207047032A05D8054800EBC20078 -:106670007047044870470020704700BF2895000805 -:1066800054220020DC94000870B59AB005460846F4 -:10669000144601A900F0C2F801A8FBF73BFB431C1C -:1066A0000022C6B25B001046C5E900342370032304 -:1066B000023404F8013C01ABD1B202348E4201D85D -:1066C0001AB070BD13F8011B013204F8010C04F874 -:1066D000021CF1E708B5302383F311880348FFF764 -:1066E00099F8002383F3118808BD00BFF04800200B -:1066F00090F8803003F01F02012A07D190F8812022 -:106700000B2A03D10023C0E91D3315E003F0600319 -:10671000202B08D1B0F884302BB990F88120212AA1 -:1067200003D81F2A04D8FFF757B8222AEBD0FAE77C -:10673000034A426707228267C3670120704700BF90 -:106740004B22002007B5052917D8DFE801F01916FC -:1067500003191920302383F31188104A0121019075 -:10676000FFF700F9019802210D4AFFF7FBF80D48E9 -:10677000FFF71CF8002383F3118803B05DF804FBD6 -:10678000302383F311880748FEF7E6FFF2E7302352 -:1067900083F311880348FEF7FDFFEBE77C940008C4 -:1067A000A0940008F048002038B50C4D0C4C2A4647 -:1067B0000C4904F10800FFF767FF05F1CA0204F174 -:1067C00010000949FFF760FF05F5CA7204F11800CF -:1067D0000649BDE83840FFF757BF00BFC861002039 -:1067E0005422002058940008629400087194000814 -:1067F00070B5044608460D46FBF78CFAC6B2204633 -:10680000013403780BB9184670BD32462946FBF7B0 -:106810006DFA0028F3D10120F6E700002DE9F047DA -:1068200005460C46FBF776FA2B49C6B22846FFF719 -:10683000DFFF08B10736F6B228492846FFF7D8FF30 -:1068400008B11036F6B2632E0BD8DFF88C80DFF873 -:106850008C90234FDFF894A02E7846B92670BDE8BF -:10686000F08729462046BDE8F04702F02DBA252ED4 -:106870002ED1072241462846FBF738FA70B9194B4A -:10688000224603F10C0153F8040B8B4242F8040B2F -:10689000F9D11B8807350E341380DDE708224946FD -:1068A0002846FBF723FA98B9A21C0F4B197802323D -:1068B0000909C95D02F8041C13F8011B01F00F015E -:1068C0005345C95D02F8031CF0D118340835C3E7FD -:1068D000013504F8016BBFE7489500087194000882 -:1068E0005F9500085095000800E8F11F0CE8F11FC3 -:1068F000BFF34F8F044B1A695107FCD1D3F8102115 -:106900005207F8D1704700BF0020005208B50D4B68 -:106910001B78ABB9FFF7ECFF0B4BDA68D10704D556 -:106920000A4A5A6002F188325A60D3F80C21D20721 -:1069300006D5064AC3F8042102F18832C3F80421BF -:1069400008BD00BF266400200020005223016745D7 -:1069500008B5114B1B78F3B9104B1A69510703D5D1 -:10696000DA6842F04002DA60D3F81021520705D508 -:10697000D3F80C2142F04002C3F80C21FFF7B8FF16 -:10698000064BDA6842F00102DA60D3F80C2142F0DB -:106990000102C3F80C2108BD26640020002000522B -:1069A0000F289ABF00F58060400400207047000067 -:1069B0004FF4003070470000102070470F2808B5D2 -:1069C0000BD8FFF7EDFF00F500330268013204D168 -:1069D00004308342F9D1012008BD0020FCE700000B -:1069E0000F2838B505463FD8FFF782FF1F4CFFF749 -:1069F0008DFF4FF0FF3307286361C4F814311DD8B1 -:106A00002361FFF775FF030243F02403E360E368AB -:106A100043F08003E36023695A07FCD42846FFF75C -:106A200067FFFFF7BDFF4FF4003100F08FFA2846F3 -:106A3000FFF78EFFBDE83840FFF7C0BFC4F8103144 -:106A4000FFF756FFA0F108031B0243F02403C4F82C -:106A50000C31D4F80C3143F08003C4F80C31D4F875 -:106A600010315B07FBD4D9E7002038BD002000526D -:106A70002DE9F84F05460C46104645EA0203DE06AE -:106A800002D00020BDE8F88F20F01F00DFF8BCB076 -:106A9000DFF8BCA0FFF73AFF04EB0008444503D140 -:106AA0000120FFF755FFEDE720222946204602F09E -:106AB0008FF810B920352034F0E72B4605F120027D -:106AC0001F68791CDDD104339A42F9D105F178436E -:106AD0001B481C4EB3F5801F1B4B38BF184603F1F3 -:106AE000F80332BFD946D1461E46FFF701FF0760C3 -:106AF000A5EB040C336804F11C0143F0020333607E -:106B0000231FD9F8007017F00507FAD153F8042FA6 -:106B10008B424CF80320F4D1BFF34F8FFFF7E8FE10 -:106B20004FF0FF332022214603602846336823F0CC -:106B30000203336002F04CF80028BBD03846B0E7BF -:106B4000142100520C200052142000521020005238 -:106B50001021005210B5084C237828B11BB9FFF75B -:106B6000D5FE0123237010BD002BFCD02070BDE8A2 -:106B70001040FFF7EDBE00BF266400202DE9F04F66 -:106B80000D4685B0814658B111F00D0614BF202284 -:106B9000082211F00803019304D0431E034269D078 -:106BA000002435E0002E37D009F11F0121F01F0924 -:106BB0004FF00108314F05F00403DFF8CCA005EADF -:106BC000080BBBF1000F32D07869C0072FD408F151 -:106BD00001080C37B8F1060FF3D19EB9284D49468C -:106BE000A819019201F078FD0446002839D1203619 -:106BF000019AA02EF3D1494601F06EFD044600280B -:106C00002FD1019A49461F4801F066FD044660BB3A -:106C1000204605B0BDE8F08F0029C9D101462846BD -:106C2000029201F059FD0446D8B9029AC0E713B1A7 -:106C300078694107CBD5AC0702D578698007C6D5FE -:106C4000019911B178690107C1D549460AEB48108D -:106C5000CDE9022301F040FD0446DDE902230028CE -:106C6000B5D04A460021204601E04A460021FBF704 -:106C700059F8CDE70246002E96D199E770950008A5 -:106C80006864002028640020486400200021FFF789 -:106C900075BF00000121FFF771BF000070B5144DF2 -:106CA0000124144E40F2FF3200210120FBF73AF894 -:106CB00006EB441001342A6955F80C1F01F0F8FC6A -:106CC000062CF5D137254FF4C0542046FFF7E2FFDC -:106CD000014628B122460848BDE8704001F0E8BCF2 -:106CE000C4EBC404013D4FEAD404EED170BD00BF33 -:106CF0007095000848640020286400200421FFF7F4 -:106D00003DBF00004843FFF7C1BF000008B101F0DC -:106D100055BD7047B0F5805F10B5044607D8FFF742 -:106D2000EDFF28B92046BDE81040FFF7AFBF0020B7 -:106D300010BD0000FFF7EABF08B501F055FE034A99 -:106D4000D2E90032C01842EB010108BD08650020FD -:106D5000434BD3E900232DE9F34113437CD0FFF7E4 -:106D6000EBFF404A00230027F9F766FB06460D4675 -:106D70003D4A0023F9F760FB0023144630462946BC -:106D8000394AF9F759FB4FF461613C23ADF80170C2 -:106D9000B4FBF1F5B4FBF3F601FB154103FB16461A -:106DA0004624B1FBF3F1314BF6B28DF80040984226 -:106DB0003CD84FF0640C4FF4C87EA30704F26C7209 -:106DC00025D1B2FBFCF30CFB132313BBB2FBFEF388 -:106DD0000EFB1322B2FA82F35B0903F26D18621CF8 -:106DE0008045D2B217D90FB18DF800400022204C57 -:106DF0004FF00C0C17460CFB0343D4B2013213F8CE -:106E000004C084450CD8A0EB0C000127F5E7002353 -:106E1000E3E70123E1E7A0EB080014460127CCE7F4 -:106E20000FB18DF80140431C8DF802309DF8010030 -:106E3000431C9DF800005038400640EA43509DF83E -:106E4000023040EA034040EA560040EAC52040EAEA -:106E5000411002B0BDE8F0814FF40410F9E700BF23 -:106E60000865002040420F008051010090230B0074 -:106E7000B89500080244074BD2B210B5904200D139 -:106E800010BD441C00B253F8200041F8040BE0B2DE -:106E9000F4E700BF504000580E4B30B51C6F24047F -:106EA00005D41C6F1C671C6F44F400441C670A4C1B -:106EB00002442368D2B243F480732360074B9042AC -:106EC00000D130BD441C51F8045B00B243F820509F -:106ED000E0B2F4E70044025800480258504000581D -:106EE00007B5012201A90020FFF7C4FF019803B0F4 -:106EF0005DF804FB13B50446FFF7F2FFA04205D08E -:106F0000012201A900200194FFF7C6FF02B010BDC5 -:106F100010B56424013C4FF47A70FFF7E7F814F0E1 -:106F2000FF04F7D1084B4FF0807214249A6103F5E7 -:106F3000805308229A61013C4FF47A70FFF7D6F82B -:106F400014F0FF04F7D110BD000002580144BFF354 -:106F50004F8F064B884204D3BFF34F8FBFF36F8F21 -:106F60007047C3F85C022030F4E700BF00ED00E09A -:106F70000144BFF34F8F064B884204D3BFF34F8FBA -:106F8000BFF36F8F7047C3F870022030F4E700BF83 -:106F900000ED00E070B5054616460C4601201021B4 -:106FA000FFF7B0FE286046733CB1204636B1FFF7CC -:106FB000A5FE2B68186000B19C6070BDFFF76AFEEB -:106FC000F7E7000070B50E461546044600B30B689F -:106FD00043608368934210D213B10068FFF796FEB6 -:106FE000637B28462BB1FFF789FE206020B9A060A3 -:106FF00070BDFFF74FFEF8E7A560206805F11F019F -:10700000306021F01F01FFF7A1FF01202073EFE79F -:107010000120EDE710B5044640B10068884205D173 -:10702000606808B1FAF758FE0023237310BD000012 -:1070300070B50E461546044620B383689A4210D9AF -:1070400013B10068FFF762FE637B28462BB1FFF7A0 -:1070500055FE206020B9A06070BDFFF71BFEF8E769 -:10706000A560316819B12A462068FAF735FE206814 -:1070700005F11F01306021F01F01FFF779FF0120AA -:107080002073E9E70120E7E720B103688B4204BFE2 -:107090000023037370470000034B1A681AB9034AB0 -:1070A000D2F8D0241A6070471065002000400258C2 -:1070B00008B5FFF7F1FF024B1868C0F3806008BD08 -:1070C0001065002070B5BFF34F8FBFF36F8F1A4A62 -:1070D0000021C2F85012BFF34F8FBFF36F8F536977 -:1070E00043F400335361BFF34F8FBFF36F8FC2F888 -:1070F0008410BFF34F8FD2F8803043F6E074C3F3AF -:10710000C900C3F34E335B0103EA0406014646EAB5 -:1071100081750139C2F86052F9D2203B13F1200F7A -:10712000F2D1BFF34F8F536943F480335361BFF300 -:107130004F8FBFF36F8F70BD00ED00E0FEE70000E2 -:10714000214B2248224A70B5904237D3214BC11EB1 -:10715000DA1C121A22F003028B4238BF00220021EF -:10716000FAF7E0FD1C4A0023C2F88430BFF34F8FCA -:10717000D2F8803043F6E074C3F3C900C3F34E3352 -:107180005B0103EA0406014646EA81750139C2F84B -:107190006C52F9D2203B13F1200FF2D1BFF34F8F85 -:1071A000BFF36F8FBFF34F8FBFF36F8F0023C2F812 -:1071B0005032BFF34F8FBFF36F8F70BD53F8041B76 -:1071C00040F8041BC0E700BF20970008206700209C -:1071D000206700202067002000ED00E0054B996B40 -:1071E00021EA000199631A6E22EA00021A661B6EF8 -:1071F000704700BF0045025870B5D0E92443002213 -:107200004FF0FF359E6804EB42135101D3F800099B -:10721000002805DAD3F8000940F08040C3F80009DF -:10722000D3F8000B002805DAD3F8000B40F08040BB -:10723000C3F8000B013263189642C3F80859C3F82B -:10724000085BE0D24FF00113C4F81C3870BD000099 -:10725000890141F02001016103699B06FCD41220E1 -:10726000FEF7D8BE10B50A4C2046FEF759FB094B75 -:10727000C4F89030084BC4F89430084C2046FEF710 -:107280004FFB074BC4F89030064BC4F8943010BD48 -:107290001465002000000840F4950008B065002047 -:1072A000000004400096000870B503780546012BE5 -:1072B00058D13F4BD0F89040984254D13D4B0E21CD -:1072C00065209A6B42F000629A631A6E42F0006287 -:1072D0001A661B6E384BD3F8802042F00062C3F868 -:1072E0008020D3F8802022F00062C3F88020D3F8F9 -:1072F000803000F037FF314BE360314BC4F8003889 -:107300000023D5F89060C4F8003EC02323604FF4FA -:107310000413A3633369002BFCDA01230C203361CF -:10732000FEF778FE3369DB07FCD41220FEF772FE0D -:107330003369002BFCDA00262846A660FFF75CFFC5 -:107340006B68C4F81068DB68C4F81468C4F81C687B -:1073500063BB1C4BA3614FF0FF336361A36843F031 -:107360000103A36070BD184B9842C9D1114B4FF077 -:1073700080609A6B42F000729A631A6E42F000725B -:107380001A661B6E0C4BD3F8802042F00072C3F8D3 -:107390008020D3F8802022F00072C3F88020D3F838 -:1073A0008030FFF71BFF0E214D20A2E7074BD1E7EE -:1073B0001465002000450258004402584014004063 -:1073C00003002002003C30C0B0650020083C30C003 -:1073D000F8B5D0F89040054600214FF000662046F1 -:1073E000FFF736FFD5F8941000234FF001128F6895 -:1073F0004FF0FF30C4F83438C4F81C2804EB4312B3 -:1074000001339F42C2F80069C2F8006BC2F8080954 -:10741000C2F8080BF2D20B68D5F89020C5F8983066 -:10742000636210231361166916F01006FBD1122057 -:10743000FEF7F0FDD4F8003823F4FE63C4F80038FA -:10744000A36943F4402343F01003A3610923C4F864 -:107450001038C4F814380B4BEB604FF0C043C4F83D -:10746000103B094BC4F8003BC4F81069C4F800395C -:10747000D5F8983003F1100243F48013C5F8982032 -:10748000A362F8BDD095000840800010D0F890208D -:1074900090F88A10D2F8003823F4FE6343EA01130F -:1074A000C2F80038704700002DE9F84300EB810373 -:1074B000D0F890500C468046DA680FFA81F94801FE -:1074C000166806F00306731E022B05EB41134FF0FE -:1074D000000194BFB604384EC3F8101B4FF00101F1 -:1074E00004F1100398BF06F1805601FA03F3916985 -:1074F00098BF06F5004600293AD0578A04F1580192 -:10750000374349016F50D5F81C180B430021C5F8CB -:107510001C382B180127C3F81019A7405369611EA6 -:107520009BB3138A928B9B08012A88BF5343D8F8D8 -:107530009820981842EA034301F140022146C8F816 -:107540009800284605EB82025360FFF781FE08EBA6 -:107550008900C3681B8A43EA845348341E4364018C -:107560002E51D5F81C381F43C5F81C78BDE8F883A8 -:1075700005EB4917D7F8001B21F40041C7F8001BA1 -:10758000D5F81C1821EA0303C0E704F13F030B4AB6 -:107590002846214605EB83035A60FFF759FE05EBA9 -:1075A0004910D0F8003923F40043C0F80039D5F869 -:1075B0001C3823EA0707D7E7008000100004000208 -:1075C000D0F894201268C0F89820FFF715BE00008C -:1075D0005831D0F8903049015B5813F4004004D082 -:1075E00013F4001F0CBF0220012070474831D0F86F -:1075F000903049015B5813F4004004D013F4001F8D -:107600000CBF02200120704700EB8101CB68196A92 -:107610000B6813604B6853607047000000EB8103F8 -:1076200030B5DD68AA691368D36019B9402B84BFEF -:10763000402313606B8A1468D0F890201C4402EB3E -:107640004110013C09B2B4FBF3F46343033323F06C -:10765000030343EAC44343F0C043C0F8103B2B6824 -:1076600003F00303012B0ED1D2F8083802EB4110CE -:1076700013F4807FD0F8003B14BF43F0805343F0F5 -:107680000053C0F8003B02EB4112D2F8003B43F03C -:107690000443C2F8003B30BD2DE9F041D0F89060C2 -:1076A00005460C4606EB4113D3F8087B3A07C3F8AE -:1076B000087B08D5D6F814381B0704D500EB8103E6 -:1076C000DB685B689847FA071FD5D6F81438DB07E4 -:1076D0001BD505EB8403D968CCB98B69488A5A68F5 -:1076E000B2FBF0F600FB16228AB91868DA689042FD -:1076F0000DD2121AC3E90024302383F311882146E6 -:107700002846FFF78BFF84F31188BDE8F081012341 -:1077100003FA04F26B8923EA02036B81CB68002B26 -:10772000F3D021462846BDE8F041184700EB81031D -:107730004A0170B5DD68D0F890306C692668E66063 -:1077400056BB1A444FF40020C2F810092A6802F010 -:107750000302012A0AB20ED1D3F8080803EB42143F -:1077600010F4807FD4F8000914BF40F0805040F03E -:107770000050C4F8000903EB4212D2F8000940F0AF -:107780000440C2F800090122D3F8340802FA01F1DA -:107790000143C3F8341870BD19B9402E84BF40208E -:1077A000206020681A442E8A8419013CB4FBF6F448 -:1077B00040EAC44040F00050C6E700002DE9F8431D -:1077C000D0F8906005460C464F0106EB4113D3F804 -:1077D000088918F0010FC3F808891CD0D6F81038B2 -:1077E000DB0718D500EB8103D3F80CC0DCF81430AC -:1077F000D3F800E0DA68964530D2A2EB0E024FF0E3 -:1078000000091A60C3F80490302383F31188FFF74E -:107810008DFF89F3118818F0800F1DD0D6F8343809 -:107820000126A640334217D005EB84030134D5F876 -:107830009050D3F80CC0E4B22F44DCF8142005EBD0 -:107840000434D2F800E05168714514D3D5F83438C7 -:1078500023EA0606C5F83468BDE8F883012303FA75 -:1078600001F2038923EA02030381DCF80830002BCC -:10787000D1D09847CFE7AEEB0103BCF810008342AC -:1078800028BF0346D7F8180980B2B3EB800FE3D8BE -:107890009068A0F1040959F8048FC4F80080A0EBA7 -:1078A00009089844B8F1040FF5D818440B449060C7 -:1078B0005360C8E72DE9F84FD0F8905004466E6940 -:1078C000AB691E4016F480586E6103D0BDE8F84FD6 -:1078D000FEF796B8002E12DAD5F8003E9B0705D0C9 -:1078E000D5F8003E23F00303C5F8003ED5F8043870 -:1078F000204623F00103C5F80438FEF7AFF837053A -:1079000005D52046FFF778FC2046FEF795F8B00431 -:107910000CD5D5F8083813F0060FEB6823F4705334 -:107920000CBF43F4105343F4A053EB6031071BD555 -:107930006368DB681BB9AB6923F00803AB6123788C -:10794000052B0CD1D5F8003E9A0705D0D5F8003E9E -:1079500023F00303C5F8003E2046FEF77FF8636876 -:10796000DB680BB120469847F30200F1BA80B702FA -:1079700026D5D4F8909000274FF0010A09EB471262 -:10798000D2F8003B03F44023B3F5802F11D1D2F895 -:10799000003B002B0DDA62890AFA07F322EA03039F -:1079A000638104EB8703DB68DB6813B1394620464B -:1079B00098470137D4F89430FFB29B689F42DDD9D5 -:1079C000F00619D5D4F89000026AC2F30A1702F043 -:1079D0000F0302F4F012B2F5802F00F0CA80B2F566 -:1079E000402F09D104EB8303002200F58050DB68AF -:1079F0001B6A974240F0B0803003D5F8185835D54F -:107A0000E90303D500212046FFF746FEAA0303D56C -:107A100001212046FFF740FE6B0303D502212046DB -:107A2000FFF73AFE2F0303D503212046FFF734FE6C -:107A3000E80203D504212046FFF72EFEA90203D554 -:107A400005212046FFF728FE6A0203D506212046BD -:107A5000FFF722FE2B0203D507212046FFF71CFE6D -:107A6000EF0103D508212046FFF716FE700340F111 -:107A7000A780E90703D500212046FFF79FFEAA074C -:107A800003D501212046FFF799FE6B0703D502219C -:107A90002046FFF793FE2F0703D503212046FFF76B -:107AA0008DFEEE0603D504212046FFF787FEA806CB -:107AB00003D505212046FFF781FE690603D506217F -:107AC0002046FFF77BFE2A0603D507212046FFF755 -:107AD00075FEEB0574D520460821BDE8F84FFFF789 -:107AE0006DBED4F890904FF0000B4FF0010AD4F81F -:107AF00094305FFA8BF79B689F423FF638AF09EBF3 -:107B00004713D3F8002902F44022B2F5802F20D188 -:107B1000D3F80029002A1CDAD3F8002942F0904259 -:107B2000C3F80029D3F80029002AFBDB3946D4F832 -:107B30009000FFF78DFB22890AFA07F322EA03037C -:107B4000238104EB8703DB689B6813B13946204629 -:107B500098470BF1010BCAE7910701D1D0F80080DB -:107B6000072A02F101029CBF03F8018B4FEA182893 -:107B70003FE704EB830300F58050DA68D2F818C0C1 -:107B8000DCF80820DCE9001CA1EB0C0C00218F4282 -:107B900008D1DB689B699A683A449A605A683A440B -:107BA0005A6029E711F0030F01D1D0F800808C450D -:107BB00001F1010184BF02F8018B4FEA1828E6E7C2 -:107BC000BDE8F88F08B50348FFF774FEBDE808402C -:107BD00000F068BF1465002008B50348FFF76AFE8F -:107BE000BDE8084000F05EBFB0650020D0F89030DE -:107BF00003EB4111D1F8003B43F40013C1F8003B03 -:107C000070470000D0F8903003EB4111D1F80039F3 -:107C100043F40013C1F8003970470000D0F89030E9 -:107C200003EB4111D1F8003B23F40013C1F8003BF2 -:107C300070470000D0F8903003EB4111D1F80039C3 -:107C400023F40013C1F8003970470000044BDA6BCD -:107C50000243DA635A6E104358665B6E704700BF8A -:107C6000004502583A4B4FF0FF31D3F8802062F0C4 -:107C70000042C3F88020D3F8802002F00042C3F80D -:107C80008020D3F88020D3F88420C3F88410D3F860 -:107C900084200022C3F88420D3F88400D86F40F0F9 -:107CA000FF4040F4FF0040F4DF4040F07F00D86721 -:107CB000D86F20F0FF4020F4FF0020F4DF4020F0D8 -:107CC0007F00D867D86FD3F888006FEA40506FEA1A -:107CD0005050C3F88800D3F88800C0F30A00C3F8F6 -:107CE0008800D3F88800D3F89000C3F89010D3F838 -:107CF0009000C3F89020D3F89000D3F89400C3F814 -:107D00009410D3F89400C3F89420D3F89400D3F8D7 -:107D10009800C3F89810D3F89800C3F89820D3F8C7 -:107D20009800D3F88C00C3F88C10D3F88C00C3F8FB -:107D30008C20D3F88C00D3F89C00C3F89C10D3F8A7 -:107D40009C10C3F89C20D3F89C3000F0D3B900BF3E -:107D50000044025808B50122504BC3F80821504B8B -:107D60005A6D42F002025A65DA6F42F00202DA6797 -:107D70000422DB6F4B4BDA605A689104FCD54A4A07 -:107D80001A6001229A60494ADA6000221A614FF4AF -:107D900040429A61434B9A699204FCD51A6842F4B6 -:107DA00080721A60424B1A6F12F4407F04D04FF475 -:107DB00080321A6700221A671A6842F001021A60BC -:107DC0003B4B1A685007FCD500221A611A6912F061 -:107DD0003802FBD1012119604FF0804159605A6788 -:107DE000344ADA62344A1A611A6842F480321A60FC -:107DF0002F4B1A689103FCD51A6842F480521A601E -:107E00001A689204FCD52D4A2D499A6200225A63C1 -:107E1000196301F57C01DA6301F5E77199635A642E -:107E2000284A1A64284ADA621A6842F0A8521A608C -:107E30001F4B1A6802F02852B2F1285FF9D148228C -:107E40009A614FF48862DA6140221A621F4ADA644A -:107E50001F4A1A651F4A5A651F4A9A6532231F4AEC -:107E60001360136803F00F03022BFAD1104A136951 -:107E700043F003031361136903F03803182BFAD19D -:107E80004FF00050FFF7E2FE4FF08040FFF7DEFEBC -:107E90004FF00040BDE80840FFF7D8BE0080005119 -:107EA000004502580048025800C000F004000001DC -:107EB000004402580000FF01008890083220600052 -:107EC00063020901470E0508DD0BBF0120000020F9 -:107ED000000001100910E000000101100020005214 -:107EE0004FF0B04208B5D2F8883003F00103C2F871 -:107EF000883023B1044A13680BB150689847BDE835 -:107F0000084000F0CFBD00BF986600204FF0B0429F -:107F100008B5D2F8883003F00203C2F8883023B1E4 -:107F2000044A93680BB1D0689847BDE8084000F058 -:107F3000B9BD00BF986600204FF0B04208B5D2F836 -:107F4000883003F00403C2F8883023B1044A13696F -:107F50000BB150699847BDE8084000F0A3BD00BFD1 -:107F6000986600204FF0B04208B5D2F8883003F090 -:107F70000803C2F8883023B1044A93690BB1D06971 -:107F80009847BDE8084000F08DBD00BF986600200E -:107F90004FF0B04208B5D2F8883003F01003C2F8B1 -:107FA000883023B1044A136A0BB1506A9847BDE880 -:107FB000084000F077BD00BF986600204FF0B04346 -:107FC00010B5D3F8884004F47872C3F88820A3066B -:107FD00004D5124A936A0BB1D06A9847600604D55B -:107FE0000E4A136B0BB1506B9847210604D50B4A10 -:107FF000936B0BB1D06B9847E20504D5074A136C1D -:108000000BB1506C9847A30504D5044A936C0BB18F -:10801000D06C9847BDE8104000F044BD9866002041 -:108020004FF0B04310B5D3F8884004F47C42C3F855 -:108030008820620504D5164A136D0BB1506D984720 -:10804000230504D5124A936D0BB1D06D9847E00417 -:1080500004D50F4A136E0BB1506E9847A10404D596 -:108060000B4A936E0BB1D06E9847620404D5084A50 -:10807000136F0BB1506F9847230404D5044A936FD4 -:108080000BB1D06F9847BDE8104000F00BBD00BFAA -:108090009866002008B50348FCF72CFDBDE80840B1 -:1080A00000F000BDA436002008B50348FCF722FE0E -:1080B000BDE8084000F0F6BCFC38002008B50348D5 -:1080C000FCF718FEBDE8084000F0ECBC6839002061 -:1080D00008B50348FCF70EFEBDE8084000F0E2BC1E -:1080E000D439002008B500F039FDBDE8084000F0A3 -:1080F000D9BC0000062108B5084600F033F8062177 -:10810000072000F02FF80621082000F02BF80621A8 -:10811000092000F027F806210A2000F023F80621A4 -:10812000172000F01FF80621282000F01BF8092175 -:108130007A2000F017F80921312000F013F8072108 -:10814000322000F00FF80C21262000F00BF80C2153 -:10815000272000F007F80C215220BDE8084000F06D -:1081600001B80000090100F16043012203F56143F9 -:10817000C9B283F8001300F01F039A4043099B0023 -:1081800003F1604303F56143C3F880211A6070472F -:1081900008B5FFF767FD00F0AFFCFDF7E5F9FDF767 -:1081A00083F9FDF7BBFBFDF78DFAFEF751FABDE849 -:1081B000084000F029BA000030B50433039C017276 -:1081C000002104FB0325C160C0E90653049B03633F -:1081D000059BC0E90000C0E90422C0E90842C0E9EB -:1081E0000A11436330BD00000022416AC260C0E949 -:1081F0000411C0E90A226FF00101FDF7B7BF0000CA -:10820000D0E90432934201D1C2680AB9181D7047FF -:1082100000207047036919600021C2680132C26002 -:10822000C269134482699342036124BF436A0361B4 -:10823000FDF790BF38B504460D46E3683BB162696F -:108240000020131D1268A3621344E36207E0237A3F -:1082500033B929462046FDF76DFF0028EDDA38BD19 -:108260006FF00100FBE70000C368C269013BC36017 -:108270004369134482699342436124BF436A436163 -:1082800000238362036B03B11847704770B5302336 -:10829000044683F31188866A3EB9FFF7CBFF054693 -:1082A00018B186F31188284670BDA36AE26A13F8F4 -:1082B000015B9342A36202D32046FFF7D5FF002360 -:1082C00083F31188EFE700002DE9F84F04460E46CE -:1082D000174698464FF0300989F311880025AA46C1 -:1082E000D4F828B0BBF1000F09D141462046FFF772 -:1082F000A1FF20B18BF311882846BDE8F88FD4E99F -:108300000A12A7EB050B521A934528BF9346BBF1FF -:10831000400F1BD9334601F1400251F8040B914242 -:1083200043F8040BF9D1A36A403640354033A362C9 -:10833000D4E90A239A4202D32046FFF795FF8AF335 -:108340001188BD42D8D289F31188C9E730465A4610 -:10835000F9F7C2FCA36A5E445D445B44A362E7E7AD -:1083600010B5029C0433017203FB0421C460C0E910 -:1083700006130023C0E90A33039B0363049BC0E98F -:108380000000C0E90422C0E90842436310BD0000B8 -:10839000026A6FF00101C260426AC0E90422002251 -:1083A000C0E90A22FDF7E2BED0E904239A4201D1D6 -:1083B000C26822B9184650F8043B0B60704700238E -:1083C0001846FAE7C3680021C2690133C3604369F4 -:1083D000134482699342436124BF436A4361FDF7BA -:1083E000B9BE000038B504460D46E3683BB12369C9 -:1083F00000201A1DA262E2691344E36207E0237AB7 -:1084000033B929462046FDF795FE0028EDDA38BD40 -:108410006FF00100FBE7000003691960C268013AD0 -:10842000C260C269134482699342036124BF436AF4 -:10843000036100238362036B03B118477047000098 -:1084400070B530230D460446114683F31188866AC1 -:108450002EB9FFF7C7FF10B186F3118870BDA36A6C -:108460001D70A36AE26A01339342A36204D3E169F7 -:1084700020460439FFF7D0FF002080F31188EDE794 -:108480002DE9F84F04460D46904699464FF0300AC4 -:108490008AF311880026B346A76A4FB94946204699 -:1084A000FFF7A0FF20B187F311883046BDE8F88FB1 -:1084B000D4E90A073A1AA8EB0607974228BF1746DD -:1084C000402F1BD905F1400355F8042B9D4240F87D -:1084D000042BF9D1A36A40364033A362D4E90A23BE -:1084E0009A4204D3E16920460439FFF795FF8BF3E4 -:1084F00011884645D9D28AF31188CDE729463A46F4 -:10850000F9F7EAFBA36A3D443E443B44A362E5E736 -:10851000D0E904239A4217D1C3689BB1836A8BB117 -:10852000043B9B1A0ED01360C368013BC360C36950 -:108530001A4483699A42026124BF436A036100239B -:1085400083620123184670470023FBE701F01F03F5 -:10855000F0B502F01F0456095A1C0123B6EB511F57 -:1085600050F8265003FA02F34FEA511703F1FF3394 -:108570003DBF50F82720C4F12000134003EA050056 -:108580003BBF03FA00F225FA04F0E0401043F0BDCF -:1085900070B57E227F210546FFF7D8FF18B101286C -:1085A00019D0002070BD3E2249212846FFF7CEFF9A -:1085B0002F22044631212846FFF7C8FF0646013422 -:1085C0005022023653212846B440FFF7BFFF093836 -:1085D00004FA00F0E6E7302245212846FFF7B6FF0F -:1085E00001308002DEE7000090F8D63090F8D72006 -:1085F0001B0403EB026390F8D42090F8D5001344D9 -:1086000003EB00207047000000F084BA014B586A69 -:10861000704700BF000C0040034B002258631A61F2 -:108620000222DA60704700BF000C0040014B0022BC -:10863000DA607047000C0040014B5863704700BF80 -:10864000000C0040024B034A1A60034A5A6070470C -:10865000646600202067002000000220074B49428A -:1086600010B55C68201A08401968821A8A4203D340 -:10867000A24201D85A6010BD0020FCE764660020C9 -:1086800008B5302383F31188FFF7E8FF002383F355 -:10869000118808BD0448054B03600023C0E901337D -:1086A0000C3000F017B900BF6C660020818600080E -:1086B000CB1D083A23F00703591A521A10B4D208F6 -:1086C0000024C0E9004384600C301C605A605DF8EF -:1086D000044B00F0FFB800002DE9F74F364FCD1DD9 -:1086E0008846002818BF0746082A4FEAD50538BF34 -:1086F000082207F10C003C1D9146019000F02CF976 -:10870000019809F10701C9F1000E2246246864B9F5 -:1087100000F02CF93B68CBB308224946E8009847A3 -:10872000044698B340E9027830E004EB010CD4F839 -:1087300004A00CEA0E0C0AF10106ACF1080304EBEC -:10874000C6069E42E1D9A6EB0C0CB5EBEC0F4FEA46 -:10875000EC0BDAD89C421DD204F10802AB45A3EB26 -:1087600002024FEAE202626009D9691CED4303EBA1 -:10877000C1025D445560256843F8315022601C46B3 -:10878000C3F8048044F8087B00F0F0F8204603B0FA -:10879000BDE8F08FAA45216802D111602346EEE7BB -:1087A000013504EBC50344F8351003F10801761ACE -:1087B000F6105E601360F1E76C66002073B5044646 -:1087C000A0F1080550F8080C54F8043C061D0C30C4 -:1087D00007330190DB0844F8043C00F0BDF8334651 -:1087E00001989E421A6801D0AB4228D20AB1954244 -:1087F00025D244F8082C54F8042C1D60013254F89A -:10880000081C05EBC206B14206D14E68324444F85A -:10881000042C0A6844F8082C5E68711C03EBC10143 -:108820008D4207D154F8042C013232445A6054F876 -:10883000082C1A6002B0BDE8704000F097B81346EB -:10884000CFE70000FEE7000070B51E4B0025044690 -:1088500086B058600E460563816300F0FBF804F1B2 -:108860002803A5606563C4E90A3304F11003C4E971 -:1088700004334FF0FF33C4E90044C4E90635FFF781 -:10888000C5FE2B46024604F13C012046C4E90823FC -:1088900080230D4A6567FDF7C7FB7368E0600B4AEC -:1088A00003620123009280F824306846F268019246 -:1088B0003269CDE90223064BCDE90435FDF7E8FB2B -:1088C00006B070BDE8480020149600080C96000819 -:1088D000458800080023C0E90000836003617047F9 -:1088E00070B51C4B05468468DE685CB3B44213D196 -:1088F00003690133036170BDA36094F8243083B130 -:10890000062B15D1A06A2146D4E9003213605A60C3 -:10891000FDF7DCFAA36A9C68B368A2689A42EBD3BD -:1089200006E0D4E90032204613605A60FDF7DEFA13 -:1089300028463146FDF7CAFAB5620620BDE8704008 -:10894000FDF7D6BA0369866001330361336BC360F8 -:108950003063D0E74046002008B5302383F3118808 -:10896000FFF7BEFF002383F3118808BD194BD968B8 -:1089700083688B4210B520D1302383F311880269BC -:10898000013A0261B2B90468C368A0420B631ED009 -:108990004A6B9BB901238A60036103681A6802600D -:1089A00050601A6B8360C26018631846FDF79EFA28 -:1089B000FDF7EEFA002383F3118810BD1C68A34273 -:1089C00003D0A468A24238BF2246DB68E1E7826098 -:1089D000F0E700BF40460020024A536B1843506343 -:1089E000704700BF4046002070B5104E82B0FDF7C2 -:1089F000F7FA0546FFF70AFE3268034690423360F5 -:108A000037BF0B4A0A495168146836BF0131D1E9B2 -:108A1000004151600419284641F100010191FDF720 -:108A2000E9FA2046019902B070BD00BF8C660020B3 -:108A300090660020EFF30983054968334A6B22F002 -:108A400001024A6383F30988002383F31188704786 -:108A500000EF00E0302080F3118862B60D4B0E4A23 -:108A6000D96821F4E0610904090C0A430B49DA6072 -:108A7000D3F8FC2042F08072C3F8FC20084AC2F808 -:108A8000B01F116841F0010111602022DA7783F8EC -:108A90002200704700ED00E00003FA0555CEACC59A -:108AA000001000E0302310B583F311880E4B5B6893 -:108AB00013F4006314D0F1EE103AEFF309844FF091 -:108AC0008073683CE361094BDB6B236684F30988A0 -:108AD000FDF73CFA10B1064BA36110BD054BFBE757 -:108AE00083F31188F9E700BF00ED00E000EF00E03C -:108AF0002F040008320400080023054A19460133F8 -:108B0000102BC2E9001102F10802F8D1704700BF32 -:108B1000986600200E4B9A6C42F008029A641A6F15 -:108B200042F008021A670B4A1B6FD36B43F008032D -:108B3000D363C722084B9A624FF0FF32DA620022F9 -:108B40009A615A63DA605A6001225A611A6070476A -:108B5000004502580010005C000C0040094A08B5AE -:108B60001169D3680B40D9B29B076FEA010111610B -:108B700007D5302383F31188FDF730FA002383F300 -:108B8000118808BD000C0040FEF7C0B8012838BFAE -:108B9000012010B504462046FEF778F830B900F001 -:108BA00007F808B900F00CF88047F4E710BD0000A2 -:108BB000024B1868BFF35B8F704700BF1867002037 -:108BC00008B5062000F056F80120FDF77FFC0000F4 -:108BD00010B501390244904201D1002005E003782C -:108BE00011F8014FA34201D0181B10BD0130F2E76C -:108BF000884210B501EB020402D98442234607D80B -:108C0000431EA14208D011F8012B03F8012FF8E709 -:108C1000024401468A4200D110BD13F8014D02F80A -:108C2000014DF7E71F2938B504460D4604D9162330 -:108C300003604FF0FF3038BD426C12B152F8213062 -:108C40004BB9204600F030F82A4601462046BDE8E0 -:108C5000384000F017B8012B0AD0591C03D1162355 -:108C600003600120E7E7002442F8254028469847A2 -:108C70000020E0E7024B01461868FFF7D3BF00BFB2 -:108C80007422002038B5074D0023044608461146DB -:108C90002B60FDF71FFC431C02D12B6803B123603E -:108CA00038BD00BF1C670020FDF70EBCC9B20346EB -:108CB00010F8012B1AB18A42F9D1184670470029E1 -:108CC00018BF0023F9E70000034611F8012B03F851 -:108CD000012B002AF9D1704710B50139034632B192 -:108CE00011F8014F03F8014B013A002CF7D11A4457 -:108CF0000021934200D110BD03F8011BF9E70000E9 -:108D00004D4435002D2D0A002F6172647570696C19 -:108D10006F742E6162696E002F6172647570696C88 -:108D20006F742D7665726966792E6162696E002FA7 -:108D30006172647570696C6F742D666C6173682EF6 -:108D40006162696E002F6172647570696C6F742D59 -:108D5000666C61736865642E6162696E0000000074 -:108D60000000000000000000F10E00088D0F000858 -:108D70003D110008C50F0008850F00080000000025 -:108D800000000000ED0E0008990F000875110008A2 -:108D9000E90E0008F50E000853544D333248373FB2 -:108DA0003F3F0053544D3332483733782F373278B2 -:108DB0000053544D3332483734332F3735332F3740 -:108DC0003530000001105A000310590001205800EE -:108DD000032056002F0000005375636365737366AC -:108DE000756C6C79206D6F756E74656420534443A7 -:108DF0006172642028736C6F77646F776E3D2575A0 -:108E0000290A0000EB769045584641542020200066 -:108E10004641543332202020000000002A3A3C3ED4 -:108E20007C223F7F002B2C3B3D5B5D004355454141 -:108E30004141414345454549494941414592924F48 -:108E40004F4F5555594F554F9C4F9E9F41494F5538 -:108E5000A5A5A6A7A8A9AAABACADAEAFB0B1B2B359 -:108E6000B4414141B8B9BABBBCBDBEBFC0C1C2C3A9 -:108E7000C4C54141C8C9CACBCCCDCECFD1D145455F -:108E80004549494949D9DADBDCDD49DF4FE14F4F3C -:108E90004F4FE6E8E85555555959EEEFF0F1F2F32A -:108EA000F4F5F6F7F8F9FAFBFCFDFEFF0103050700 -:108EB000090E10121416181C1E00000061001A037F -:108EC000E0001703F8000703FF000100780100012C -:108ED000300132010601390110014A012E017901E8 -:108EE000060180014D00430281018201820184015B -:108EF000840186018701870189018A018B018B0129 -:108F00008D018E018F0190019101910193019401D6 -:108F1000F60196019701980198013D029B019C0181 -:108F20009D0120029F01A001A001A201A201A401B4 -:108F3000A401A601A701A701A901AA01AB01AC01E7 -:108F4000AC01AE01AF01AF01B101B201B301B30198 -:108F5000B501B501B701B801B801BA01BB01BC0147 -:108F6000BC01BE01F701C001C101C201C301C401BE -:108F7000C501C401C701C801C701CA01CB01CA01AB -:108F8000CD011001DD0101008E01DE011201F301AE -:108F90000300F101F401F401F80128012202120199 -:108FA0003A020900652C3B023B023D02662C3F025F -:108FB00040024102410246020A015302400081017F -:108FC0008601550289018A0158028F015A029001D7 -:108FD0005C025D025E025F02930161026202940123 -:108FE0006402650266026702970196016A02622CBA -:108FF0006C026D026E029C01700271029D0173028F -:1090000074029F0176027702780279027A027B026B -:109010007C02642C7E027F02A60181028202A901E9 -:109020008402850286028702AE014402B101B201C8 -:1090300045028D028E028F0290029102B7017B03DE -:109040000300FD03FE03FF03AC0304008603880353 -:1090500089038A03B1031103C2030200A303A3031C -:10906000C4030803CC0303008C038E038F03D803CF -:109070001801F2030A00F903F303F403F503F603FE -:10908000F703F703F903FA03FA033004200350044B -:109090001007600422018A043601C1040E01CF04C6 -:1090A0000100C004D0044401610526040000000052 -:1090B0007D1D0100632C001E9601A01E5A01001F99 -:1090C0000806101F0606201F0806301F0806401F4E -:1090D0000606511F0700591F521F5B1F541F5D1FBB -:1090E000561F5F1F601F0806701F0E00BA1FBB1FB0 -:1090F000C81FC91FCA1FCB1FDA1FDB1FF81FF91FAC -:10910000EA1FEB1FFA1FFB1F801F0806901F0806AF -:10911000A01F0806B01F0400B81FB91FB21FBC1F54 -:10912000CC1F0100C31FD01F0206E01F0206E51F6F -:109130000100EC1FF31F0100FC1F4E210100322132 -:1091400070211002842101008321D0241A05302CC3 -:109150002F04602C0201672C0601752C0201802C63 -:109160006401002D260841FF1A030000C700FC001F -:10917000E900E200E400E000E500E700EA00EB00BF -:10918000E800EF00EE00EC00C400C500C900E600F6 -:10919000C600F400F600F200FB00F900FF00D60064 -:1091A000DC00F800A300D800D7009201E100ED0038 -:1091B000F300FA00F100D100AA00BA00BF00AE002F -:1091C000AC00BD00BC00A100AB00BB009125922506 -:1091D000932502252425C100C200C000A9006325F3 -:1091E000512557255D25A200A500102514253425FD -:1091F0002C251C2500253C25E300C3005A255425B9 -:1092000069256625602550256C25A400F000D00056 -:10921000CA00CB00C8003101CD00CE00CF00182518 -:109220000C2588258425A600CC008025D300DF00EE -:10923000D400D200F500D500B500FE00DE00DA0053 -:10924000DB00D900FD00DD00AF00B400AD00B100CF -:109250001720BE00B600A700F700B800B000A800B5 -:10926000B700B900B300B200A025A00001000000C3 -:109270000000000000960000000000000000000058 -:1092800000000000000000000000000000000000DE -:10929000496600084D6600083D51000875540008F5 -:1092A000D1500008F950000821510008B9500008B9 -:1092B0000000000029550008155500085155000808 -:1092C0003D5500084955000835550008215500084E -:1092D0000D5500085D5500080000000041560008CB -:1092E0002D560008695600085556000861560008BA -:1092F0004D560008395600082556000875560008D6 -:1093000000000000010000000000000063300000C9 -:109310000C9300080000000000000000B846002088 -:10932000E84800200000812A00000000AAAAAAAA9A -:1093300000000024FFFE00000000000000A00A0062 -:109340000001000000000000AAAAAAAA0000000074 -:10935000FFFF000000000000000000001400AA56FB -:1093600000000000AAAAAAAA14005554FFFF00009A -:1093700000000000CCCC0C0020681A0000000000A7 -:10938000AAAA8AAA10541500FFFF0000000C70075B -:10939000770000004081020100100000AAAAAAAADA -:1093A00000410100F7FF000000000070070000000E -:1093B0000000000000000000AAAAAAAA0000000005 -:1093C000FFFF00000000000000000000000000009F -:1093D00000000000AAAAAAAA00000000FFFF0000E7 -:1093E000000000000000000000000000000000007D -:1093F000AAAAAAAA00000000FFFF000000000000C7 -:10940000000000000000000000000000AAAAAAAAB4 -:1094100000000000FFFF000000000000000000004E -:109420000000000000000000AAAAAAAA0000000094 -:10943000FFFF00000000000000000000000000002E -:1094400000000000AAAAAAAA00000000FFFF000076 -:1094500000000000000000004375626550696C6FF9 -:109460007400437562654F72616E67652B2D424CC7 -:10947000002553455249414C2500000002000000E0 -:109480000000000061580008D1580008400040006A -:1094900098610020A8610020020000000000000088 -:1094A000030000000000000019590008000000003F -:1094B00010000000B8610020000000000100000062 -:1094C000000000001465002001010200456700084B -:1094D00055660008F1660008D566000843000000E4 -:1094E000E494000809024300020100C032090400AC -:1094F0000001020201000524001001052401000101 -:10950000042402020524060001070582030800FF67 -:1095100009040100020A00000007050102400000E2 -:10952000070581024000000012000000309500088D -:109530001201100102000040AE2D5810000201027D -:10954000030100000403090425424F415244250051 -:10955000437562654F72616E6765506C757300305C -:109560003132333435363738394142434445460089 -:109570000000002000000200020000000000003097 -:1095800000000400080000000000002400000800A3 -:10959000040000000004000000FC000002000000C5 -:1095A00000000430008000000800000000000038C7 -:1095B00000000100010000001F1C1F1E1F1E1F1FB6 -:1095C0001E1F1E1F1F1D1F1E1F1E1F1F1E1F1E1FB3 -:1095D00000000000755A00082D5D0008D95D0008E4 -:1095E000400040004C6600204C6600200100000056 -:1095F0005C660020800000004001000008000000C0 -:1096000000010000001000000800000069646C65A3 -:10961000000000006D61696E002C043804043808F5 -:109620000C10141C202425260000000000006404F7 -:109630000100040000000000000C0010283034007D -:10964000286EFF7F010000002704000000000000DA -:1096500000001E0000000000FF000000F048002095 -:10966000FC38002068390020D439002000000000B8 -:10967000988D000883040000A38D000850040000AA -:10968000B18D0008010000000000000000960000FD -:109690000000080096000000000800000400000020 -:1096A00044950008000000000000000000000000D9 -:1096B00000000000000000000000000078220020F0 -:1096C000000000000000000000000000000000009A -:1096D000000000000000000000000000000000008A -:1096E000000000000000000000000000000000007A -:1096F000000000000000000000000000000000006A -:109700000000000000000000000000000000000059 -:109710000000000000000000000000000000000049 +:100EF0002DE9F04100F58037044616463B7C5BB98E +:100F0000C0681030204400F0E5FEE5683544B5F5D2 +:100F1000004FE56002D816B1BDE8F081DEB905F0FA +:100F20007F0605F110000021C6F180062044F6B2CC +:100F300032462E4400F0F4FEA06804F11008324658 +:100F400000F10060414600F5003006F039F830B994 +:100F500001233B74E0E74FF400463546ECE7A26816 +:100F600005F11001404632442144A260E268521B60 +:100F7000E26000F0AFFE0220BDE8F04100F090BE5C +:100F8000183000F0E9BC000010B5044600F0FAFF8C +:100F9000204610BD10B5044600F0F4FF204610BDF9 +:100FA000C3B280B2A3F14102052A02D8373800B299 +:100FB0007047613B052B94BF57383038F7E7000086 +:100FC000F8B504461546084603220C4900F08CFE8D +:100FD000014688B908346F1C15F91100FFF7E0FFCE +:100FE000064617F911000131FFF7DAFF102940EA30 +:100FF000061004F8010BEFD1F8BD00BF10920008F5 +:101000002DE9F04FADF53F7D0746416801222AA842 +:1010100002F09AFE002840F087800646824681460C +:101020001125DFF80C81DFF80CB101AB4FF48052D1 +:1010300041462AA802F0E8FF002875D1019AB2F5CE +:10104000805F71D8002A65D00446019A9442ECD2A0 +:10105000282D0FD008DC132D2DD01E2D39D0112DA9 +:1010600013D00134A4B2F0E7322D2DD0372D2FD07C +:101070002D2DF6D13B68121B08EB040138461B6985 +:101080002D259847BDF80440EBE7121B022A09D929 +:10109000594608EB040000F027FE18B90234282551 +:1010A000A4B2DEE718F804303A2B3DD00A2B1CBF5F +:1010B000A1461325D5E718F804300A2B34D03A2B73 +:1010C00004BFA2463225CCE718F80430202BC8D044 +:1010D000264618F804300A2B1AD1AAEB090208EBAD +:1010E000090102A811254F2A28BF4F2208F07CF8D9 +:1010F000A21B08EB060116A84F2A28BF4F2208F0B2 +:1011000073F83B6816AA02A9DB6838469847A8E737 +:101110001E25A6E73B68384604491B69984701200D +:101120000DF53F7DBDE8F08F0020F9E71293000830 +:10113000A02300201492000800F1180110B5044605 +:1011400086B00846019100F0F1FB2046FFF758FFFA +:1011500060B1019902A800F049FC102204F10801D5 +:1011600002A808F001F8B0FA80F0400906B010BDFE +:1011700070B504460025EEB2304600F0FFFC58B1D1 +:1011800000213046013500F009FD08B9002070BD8E +:10119000022000F085FDEEE72046FFF731FF002832 +:1011A000F4D004F58034207C80F00100EFE70000EB +:1011B000F0B5C9B006F070F900F000FF18B90025CD +:1011C000284649B0F0BD69462A4802F0DFFF0028F2 +:1011D0004BD1294C204603F009F8284803F006F8C3 +:1011E000274803F003F82146224803F07BF8002843 +:1011F000E5D1702000F0C0FE064610B1214B4460DE +:101200000360336830469B689847054600282ED017 +:101210001A4F1948394603F065F805460028CED123 +:10122000194800F0A9FE044638B1184B4760036026 +:1012300000F58033C0E902551D74236820469B6881 +:101240009847054628B10E490C4803F04BF8002892 +:10125000B5D1336830465B6898471CB12368204697 +:101260005B68984700F092FEAAE70025FAE704467B +:10127000EFE700BF18920008289200083F9200088C +:10128000559200087892000814000100949200081A +:101290002DE9F04FD44A8DB00B68D0F804A001932B +:1012A0001A440368D14E1A44D1F81C90DFF8B4C335 +:1012B000DFF8B4B3D0E90234634003EA0A036340C1 +:1012C00013444A6802920AEB7363029CC84A2244A0 +:1012D000C468224484688AEA04051D4065401544B8 +:1012E0008A68039203EB3555039CC24A2244846802 +:1012F00022448AEA03042C4084EA0A041444CA689B +:1013000005EBF4340492164483EA05022240564465 +:101310005A4032440E69059604EBB222059FB64E40 +:101320003E441E4485EA040313406B4033444E6937 +:10133000069602EB7363069FB04E3E442E4484EA49 +:1013400002051D40654035448E69079603EB35550F +:10135000079FAB4E3E44264482EA03042C4054408F +:101360003444A84E4E4405EBF434164483EA050297 +:1013700022405A4032440E6A089604EBB222089F7B +:10138000A14E3E441E4485EA040313406B4033449F +:101390004E6A099602EB7363099F9C4ED1F830E0C8 +:1013A0003E44D1F83880F3442E4484EA02051D40BF +:1013B000654035448E6AA6F5244703EB35550A96F9 +:1013C0004F3F274482EA03042C4054403C44CF6AF8 +:1013D0000B9705EBF4340B9E8D4F3744029E174458 +:1013E00083EA050222405A403A448A4F774404EB8C +:1013F000B2221F4485EA040313406B403B444F6B09 +:10140000BC4402EB7363654484EA020C0CEA030CEF +:101410008CEA040C6544DFF854C2C44403EB355530 +:10142000A44482EA03042C4054406444D1F83CC0F4 +:10143000794905EBF4346144114483EA0502224002 +:101440005A400A44754904EBB2223144079E1944BC +:1014500084EA02032B4063400B44714902EBF363BF +:1014600031440B9E0D4482EA03012140514029443E +:101470006C4D03EBF1513544019E254483EA010490 +:1014800014405C402C44684D01EBB4443544069E46 +:10149000154481EA04021A404A402A44634D04EB91 +:1014A000323235440A9E1D4484EA02030B406340F5 +:1014B0002B445F4D02EBF3633544059E0D4482EAF5 +:1014C00003012140514029445A4D03EBF151654439 +:1014D000254483EA010414405C402C44564D01EB42 +:1014E000B4443544099E154481EA04021A404A4036 +:1014F0002A44524D04EB32323544049E1D4484EAA2 +:1015000002030B4063402B444D4D02EBF363454413 +:101510000D4482EA0301214051402944494D03EB27 +:10152000F1513544089E2C4483EA010515405D4085 +:101530002C44454D01EBB4443544039E2A4481EAD2 +:1015400004051D404D402A44404D04EB32323D44D9 +:101550002B4484EA020593440D4065402B443C4DE6 +:1015600002EBF3633544069E294482EA03052540D5 +:1015700055402944374D03EBF1514D442C4483EA47 +:10158000010515405D40254401EBB54581EA0504A0 +:1015900004EA03024A405A44A6F5B82B089E05EB1C +:1015A0003232ABF2BE6B54405B4423442A4C344489 +:1015B00002EB33730B9E0C4485EA0201594021442F +:1015C000264C344403EB7151029E254482EA030405 +:1015D0004C402544224C444401EB3545144483EAF5 +:1015E00001026A40224443E078A46AD7EECEBDC12E +:1015F00056B7C7E8DB702024AF0F7CF52AC68747B3 +:10160000134630A8019546FDD8988069AFF7448B02 +:10161000BED75C892211906B2108B44962251EF661 +:1016200040B340C0515A5E26AAC7B6E95D102FD616 +:101630005314440281E6A1D8C8FBD3E7E6CDE121EB +:10164000D60737C3870DD5F4ED145A4505E9E3A94C +:10165000F8A3EFFCD9026F6781F6718722619D6D57 +:101660000C38E5FD937198FD8A4C2A8D8E4379A63E +:10167000934C344405EB7222059E1C4481EA050319 +:10168000534023448F4C344402EB33730A9E0C4482 +:1016900085EA0201594021448B4C4C4403EB7151C3 +:1016A000254482EA03044C402C44884D354401EB28 +:1016B0003444019E154483EA010262402A44844D69 +:1016C0003D4404EB72221D4481EA040353402B4441 +:1016D000804D354402EB3373049E294484EA0205AD +:1016E0005D4029447C4D354403EB7151079E2544F0 +:1016F00082EA03044C402C44784D354401EB3444D9 +:10170000099E2A4483EA010565401544744A32441F +:1017100004EB7525039E134481EA04026A401A44CF +:10172000704B734405EB32720B4484EA050151405F +:1017300019446D4B634402EB71511C4485EA02036A +:101740004B401C44694B334401EB3444019E1D441F +:1017500082EA010363402B44654D04EB7323354457 +:10176000069E154463EA010262402A44614D03EB80 +:10177000B2624D4462EA040929445F4D89EA0309D3 +:10178000454449442C445D4D02EBB1513544049E1F +:1017900061EA03081D4488EA0208444401EB7444EA +:1017A00064EA02034B402B44554D04EBF32375448C +:1017B00063EA010E15448EEA040E0EEB0502514D4C +:1017C00003EBB262354462EA040E29440A9D8EEAB4 +:1017D000030EA5F580164C4D7144A6F6833602EB38 +:1017E000B151264461EA030454403444029E01EBA3 +:1017F0007444354464EA02061D444E407319089E41 +:10180000424D04EBF323354463EA01061544664078 +:1018100072193F4D03EBB262654462EA0406294443 +:101820003C4D5E403144079E02EBB151354461EAC4 +:1018300003062C44384D56403D443444059E1D4417 +:1018400001EB744464EA02034B402B44334D04EB38 +:10185000F32335440B9E154463EA010262402A4497 +:101860002F4D03EBB2623544039E0D4462EA04013E +:10187000594029442B4D02EBB15135442A4E2544A1 +:1018800061EA030454402C44099D01EB74442E4446 +:1018900064EA02051E4485EA01039D1903681A449F +:1018A0000AEB040303EBF5230260436083681C44E6 +:1018B000C36819448460C1600DB0BDE8F08F00BFFB +:1018C00044EABEA4A9CFDE4B604BBBF670BCBFBEE2 +:1018D000C67E9B28FA27A1EA8530EFD4051D88042F +:1018E00039D0D4D9E599DBE6F87CA21F6556ACC4A3 +:1018F000442229F497FF2A43A72394AB39A093FCF1 +:10190000C3595B6592CC0C8FD15D84854F7EA86FE7 +:10191000E0E62CFE144301A3A111084E827E53F78A +:1019200035F23ABDBBD2D72A91D386EB094B03607F +:1019300003F18833436003F12943A3F59613A3F61B +:101940008B638360A3F18833C3600023C0E9043351 +:10195000704700BF012345672DE9F843144602692B +:1019600005460E46E300C2F3C50800F118079B18B0 +:10197000036122BF43690133436112F4FC7F436971 +:1019800003EB5473436114D0C8F1400907EB08001E +:101990004C4504D22246BDE8F84307F0F5BB403C75 +:1019A0004A464E4407F0F0FB444439462846FFF7C8 +:1019B0006FFCA04606EB0409B8F13F0FA9EB080144 +:1019C0000AD94022384607F0DFFB39462846A8F1FD +:1019D0004008FFF75DFCEFE7A1096FF03F023846D2 +:1019E00002FB014206EB8111D5E7000070B50B69DF +:1019F00001F1180506460C46C3F3C503EA18501C4E +:101A00008022EA54C3F13F02072A1FD8002100F0C8 +:101A100087F929462046FFF73BFC3822002128465B +:101A200000F07EF9236929462046236563696365D2 +:101A3000FFF72EFC21461022304607F0A5FB20467A +:101A400058220021BDE8704000F06AB9C3F13702A6 +:101A50000021E5E72DE9F84F4FF47A7306460D466D +:101A6000002402FB03F7DFF85080DFF8509098F96C +:101A700000305FFA84FA5A1C01D0A34210D159F801 +:101A800024002A4631460368D3F820B03B46D847A5 +:101A9000854205D1074B012083F800A0BDE8F88FEF +:101AA0000134042CE3D14FF4FA7004F0B3FD0020AC +:101AB000F4E700BFE43300201022002014220020AD +:101AC000002307B5024601210DF107008DF807300C +:101AD000FFF7C0FF20B19DF8070003B05DF804FBDD +:101AE0004FF0FF30F9E700000A46042108B5FFF780 +:101AF000B1FF80F00100C0B2404208BD074B0A466A +:101B000030B41978064B53F821400146236820462B +:101B1000DD69044BAC4630BC604700BFE4330020B5 +:101B200014220020A086010070B50A4E00240A4D40 +:101B300005F0EAF9308028683388834208D905F037 +:101B4000DFF92B6804440133B4F5003F2B60F2D376 +:101B500070BD00BFE6330020A033002005F0A2BA1C +:101B600000F1006000F500300068704700F100608F +:101B7000920000F5003005F023BA0000054B1A680A +:101B8000054B1B889B1A834202D9104405F0B8B953 +:101B900000207047A0330020E633002038B504460B +:101BA000074D29B128682044BDE8384005F0C0B988 +:101BB0002868204405F0AAF90028F3D038BD00BFFA +:101BC000A03300200020704700F1FF5000F58F1077 +:101BD000D0F8000870470000064991F8243033B16E +:101BE00000230822086A81F82430FFF7BFBF0120D4 +:101BF000704700BFA4330020014B1868704700BF36 +:101C00000010005C194B01380322084470B51D68B0 +:101C1000174BC5F30B042D0C1E88A6420BD15C6834 +:101C20000A46013C824213460FD214F9016F4EB1AD +:101C300002F8016BF6E7013A03F10803ECD18142A7 +:101C40000B4602D22C2203F8012B0424094A1688E1 +:101C5000AE4204D1984284BF967803F8016B013CF0 +:101C600002F10402F3D1581A70BD00BF0010005CED +:101C700024220020D4920008022803D1024B4FF006 +:101C800080529A61704700BF00100258022803D1A9 +:101C9000024B4FF480529A61704700BF0010025807 +:101CA000022804D1024A536983F480535361704778 +:101CB0000010025870B504464FF47A764CB1412CAE +:101CC000254628BF412506FB05F0641B04F0A2FC55 +:101CD000F4E770BD002310B5934203D0CC5CC4542C +:101CE0000133F9E710BD0000013810B510F9013FCC +:101CF0003BB191F900409C4203D11AB10131013A44 +:101D0000F4E71AB191F90020981A10BD1046FCE7CB +:101D100003460246D01A12F9011B0029FAD1704776 +:101D200002440346934202D003F8011BFAE77047CE +:101D30002DE9F8431F4D14460746884695F82420A0 +:101D400052BBDFF870909CB395F824302BB9202259 +:101D5000FF2148462F62FFF7E3FF95F82400414634 +:101D6000C0F1080205EB8000A24228BF2246D6B28D +:101D70009200FFF7AFFF95F82430A41B17441E44D0 +:101D80009044E4B2F6B2082E85F82460DBD1FFF768 +:101D900023FF0028D7D108E02B6A03EB820383429C +:101DA000CFD0FFF719FF0028CBD10020BDE8F88382 +:101DB0000120FBE7A4330020024B1A78024B1A7073 +:101DC000704700BFE433002010220020F8B5194C02 +:101DD000194803F027FF2146174803F04FFF2468F6 +:101DE0004FF47A70154ED4F89020154DD2F804387F +:101DF000114F43F00203C2F80438FFF75BFF20469F +:101E0000104904F049F8D4F890200424D2F804389A +:101E100023F00203C2F804384FF4E133336055F87D +:101E2000040BB84202D0314603F05AFE013CF6D111 +:101E3000F8BD00BFD49A000818490020CC33002018 +:101E400014220020DC9A00080C4B70B50C4D04469F +:101E50001E780C4B55F826209A420DD00A4B0021D3 +:101E600018221846FFF75CFF0460014655F826006B +:101E7000BDE8704003F034BE70BD00BFE433002005 +:101E80001422002018490020CC330020F8B571B688 +:101E9000002301201A46194602F08AFD04468020DC +:101EA00005F0A0F9002849D00025254A80274FF4E5 +:101EB000D06C3D26136913F0C06F26D1D2F81031D3 +:101EC00013F0C06F21D1236805F100619960236888 +:101ED000D86023685F602368C3F800C021680B687E +:101EE00043F001030B6021680B6823F01E030B60B5 +:101EF00021680B68DB07FCD4237B8035616806FA18 +:101F000003F3B5F5001F0B60D4D1204602F086FD27 +:101F1000B5F5001F11D000240A4E0B4D012005F02D +:101F2000C1F83388A34205D928682044013404F05D +:101F3000FFFFF6E7002005F0B5F861B6F8BD00BF79 +:101F400000200052E6330020A033002030B50A44C0 +:101F5000084D91420DD011F8013B5840082340F341 +:101F60000004013B2C4013F0FF0384EA5000F6D13B +:101F7000EFE730BD2083B8ED0121884238BF084625 +:101F800005F068B908B105F069B9704710B5084C9B +:101F900001220849002001F0B3FE23783BB1064836 +:101FA00003F016FD044803F049FD0023237010BD23 +:101FB000E8330020E4920008C83600201D482DE9CF +:101FC000F041036D2BB901224FF48051503005F0E0 +:101FD000CDFA194E33780BB1FFF7D8FF0324174F12 +:101FE0004FF00008134D15492846C7F8048003F048 +:101FF00017FD284603F050FB48B1013C284603F08A +:102000001DFD14F0FF04EED1204634700FE00C49A2 +:1020100001220C4801F074FE014618B1284603F075 +:10202000D7FCEAE7084800F011F801203070BDE85D +:10203000F08100BFC8360020E83300203C22002099 +:10204000E4920008EC330020E89200080FB400206E +:1020500004B07047006870470346006859687047CD +:102060000B0A017043700B0C090E8370C17070472E +:10207000110A027003714170110C120E8170C2704E +:102080001A0A42711A0C1B0E8271C371704700004C +:10209000C36A0239023B8B4283BF4389006C01FB58 +:1020A0000300002070470000C2F307238A76CB7636 +:1020B0000378032B01BF120C0A75120A4A75704788 +:1020C00000F10B010022D30143EA520310F8012B67 +:1020D00052FA83F38842DAB2F5D110467047000015 +:1020E00010B5417804460020013102464901022A18 +:1020F00016BFA35C032203EBC03302F101021EBF33 +:102100009BB203EB500398B29142F0D810BD00008F +:1021100002684AB1134613F8011B1F290DD93A2949 +:10212000F9D1911C8B4202D04FF0FF3070471278EA +:10213000302AF9D1036000207047014B18787047AE +:102140003836002038B50D46044618B9092000235A +:102150002B6038BD0368002BF8D01A78002AF5D020 +:102160008188DA889142F1D1587804F0EFFB10F0C1 +:102170000100EBD12368EBE738B50D4640F2523150 +:10218000144602F0B9F9FF2807D9012C0BD9030A2C +:10219000022468702B70204638BD30B1002CFAD074 +:1021A00001242870F7E70024F5E70446F3E7000070 +:1021B0002DE9F8430026D0F8008005460C468E76BF +:1021C000836B002B4AD098F80030042B4BD1334658 +:1021D0003546402720E0B7F5187F80F0C480F90627 +:1021E00006F1010608BF0237D05B02372BB900F5B4 +:1021F000205292B2B2F5006F0DD305F11A01C5F16C +:10220000FF0240EA03402144FFF7B6FF002800F038 +:10221000AA80054400200346D8F8102092F8231025 +:10222000B142D8D8002B40F09E80002D00F09B805A +:1022300000232544AB766373D8F81020137903F09C +:102240003701DB0621730BD402F13800FFF704FFDE +:10225000C4E9000193896381D3892381BDE8F883B0 +:1022600000200146F4E7C36C01335ED1EA6B002322 +:102270002E26551E184615F8011F013020290CD0B6 +:10228000052908BFE521092804D10B2B9EBFE718BB +:1022900001337E73E718013379730B28EBD1E11812 +:1022A00000204873A17E00294BD1002B40D06FF055 +:1022B0000C0604F10D000825361B331810F8011B1D +:1022C000002938D02E298BB24AD0A3F14101192917 +:1022D00003D8117B0D4200D020330373EDE7B9F131 +:1022E000000F05D100F520539BB2B3F5006F0BD35F +:1022F00007F11A01C7F1FF0240EA09402144FFF744 +:102300003BFF48B10744002002368146D8F80C3024 +:10231000985B0028E3D13846B9F1000F4FF0000276 +:1023200018BF002023189A76A0E7B1463746EDE79C +:102330003F23A3760123234400219976137B03B91D +:102340006373D37A02F11C0003F03F03237300236D +:10235000FFF780FE20606360D38A6381138B7CE784 +:1023600010250B46B9E73F230125A37660E700005F +:1023700038B50546002435F8020B08B9204638BDAB +:1023800002F0EEF86308C2B203EBC43312FA83F32F +:102390009AB2C0F3072303EB520303EBC2339CB2A0 +:1023A000E9E7000037B5C37804461BB90025284685 +:1023B00003B030BD00F14C01826C012340780191E3 +:1023C00004F0EAFA054680B9A36BE070A06C226BBA +:1023D000C31A9342EAD2A3780199022BE6D10244B0 +:1023E0000123607804F0D8FAE1E70125DFE7000077 +:1023F00038B5836C05460C468B4210D0FFF7D2FFF0 +:1024000060B92246012305F14C01687804F0A0FA76 +:1024100000281CBF4FF0FF340120AC6438BD002001 +:10242000FCE7000038B500230446C3704FF0FF33CB +:102430008364FFF7DDFF00284BD1B4F84A524AF617 +:1024400055239D4207D10B22254904F14C0006F08B +:102450008BFE00283FD094F84C30EB2B03D0183380 +:10246000DBB2012B2ED84AF655239D4206D1082215 +:102470001C4904F19E0006F077FE48B3B4F85730CB +:10248000B3F5007F1ED194F85930DBB15A1E1A42C1 +:1024900018D1B4F85A30ABB194F85C30013B012B41 +:1024A00010D8B4F85D306BB1B4F85F307F2B06D82C +:1024B00004F16C00FFF7CEFDB0F5803F02D3B4F815 +:1024C000623053B94AF6552085420CBF02200320E2 +:1024D00038BD0420FCE70120FAE70020F8E700BF40 +:1024E000149300082093000802392DE9F04701F009 +:1024F00007044FF0010A466C05460AFA04F4174631 +:10250000984606EB1136C1F3C809E4B231462846B5 +:102510000136FFF76DFF18B10120BDE8F08799463D +:1025200005EB090292F84C30234214BF012100212F +:10253000414513D06340013F82F84C3085F803A039 +:10254000EBD0640014F0FF04EAD109F10103012487 +:102550004FF00009B3F5007FE1D1D7E70220DCE7B7 +:1025600001290246F8B50C4640F28C800668F36AF1 +:102570008B4240F287803378013B032B00F282804C +:10258000DFE803F00229384B04EB5405B16B304609 +:1025900001EB5521FFF72CFF10B14FF0FF30F8BDD4 +:1025A0006F1CC5F30805B16B3046354401EB57216C +:1025B00095F84C50FFF71CFF0028EED1C7F3080731 +:1025C000E3073E4496F84C0045EA00204CBF000962 +:1025D000C0F30B00E3E7B16B304601EB1421FFF7CA +:1025E00007FF0028D9D1640004F4FF742644B6F82C +:1025F0004C00D4E7B16B304601EBD411FFF7F8FE85 +:102600000028CAD1A40006F14C0004F4FE74204452 +:10261000FFF720FD20F07040C1E7D0E90430D57904 +:1026200053EA000101D0916801B95DBB9168022DA8 +:10263000A4EB01010DD1013B728940F1FF305B0A2F +:1026400043EAC053B3FBF2F399421BD81CD0601C81 +:10265000A5E7032D02D193698B42F8D8D3699BB9C2 +:10266000B16B304601EBD411FFF7C2FE002894D1C4 +:10267000A0004C3600F4FE703044FFF7EBFC20F075 +:1026800000408CE701208AE76FF0004087E70000F8 +:10269000F8B5066804460D463378042B0CBF4FF09E +:1026A00080524FF400128A4201D80220F8BDCA06B7 +:1026B000FBD182680163D2B9022B13D83389B3EB03 +:1026C000551FF2D9F36BA363A36B6263002BECD0AD +:1026D00003EB55234C36C5F308050020A3633544AE +:1026E000E563E3E7F36BC271002BE7D01A46778905 +:1026F0007F02BD42114604D23046FFF7C9FCA063F9 +:10270000E2E72046FFF72CFF431C024606D00128D3 +:10271000CBD9F36A8342C8D9ED1BEAE70120C5E7AC +:1027200001292DE9F04706460C46174608D9C36A29 +:102730008B4205D90378022B62D003D8012B22D01B +:10274000022552E0033B012BFAD8816B01EBD41137 +:10275000FFF74EFE0546002847D1A40006F14C03C2 +:1027600004F4FE741C443378042B07D0204627F071 +:102770007047FFF76FFC00F0704007433946204672 +:10278000FFF76EFC2FE001EB5108816B01EB582144 +:10279000FFF72EFE054640BB14F0010406F14C097C +:1027A00008F1010AC8F3080808BFFBB230461FBF92 +:1027B00019F8083003F00F023B0103F0F00318BFD3 +:1027C000134309F808300123B16BF37001EB5A2170 +:1027D000FFF70EFE054640B9CAF3080A44B1C7F335 +:1027E000071709F80A700123F3702846BDE8F0873F +:1027F00019F80A30C7F3032723F00F031F43F0E74C +:10280000816B01EB1421FFF7F3FD05460028ECD1A5 +:10281000640006F14C0304F4FF741F551919C7F343 +:1028200007274F70DFE70000F8B504460E4617464D +:10283000E3690BB91846F8BD012BA6EB0305206828 +:1028400014BFAA1C3A46691CFFF76AFF0028F2D1A0 +:10285000E369013BE361EBE701292DE9F843064613 +:102860000C461746056802D80220BDE8F883EB6ADB +:102870008B42F9D97AB9A14621463046A046FFF7E6 +:102880006FFE0446B0B92B78042B02D1002F43D140 +:10289000F7710020E9E72B78042B02D1C379022BD2 +:1028A000E9D04FF0FF3239462846FFF739FF0028BC +:1028B000E1D0DAE70128D7D0421C01D10120D4E7CA +:1028C0002B78042B19D1EA6AAB69023A93421CD3E4 +:1028D00008F10102A2420CD02B78042B08D100236E +:1028E000A2EB090249462846FFF7FEFD0028BCD1AD +:1028F000A146EB6AA342BFD8C5E70022414628465D +:10290000FFF70EFF0028DED0AFE70133AB612B7974 +:1029100043F001032B71DBE7F3798BB9B468BC4258 +:1029200002D10223F371B4E721463046FFF718FEC7 +:10293000012899D9431CC1D001348442EFD0A8E7C3 +:10294000032BA6D1B368BB42A3D8B2691344BB42E0 +:102950009FD3E6E770B5C3790446032B06D181689F +:102960008369CD18A94203D10023E371002070BD13 +:102970004E1C20683246FFF7D3FE0028F7D13146BF +:10298000F0E700002DE9F74305460191FFF70AFD46 +:102990000446002849D105F14C09019928464FF415 +:1029A0000072FFF775FB2146A86407464846FFF70B +:1029B000B7F96C896402B4F5004F28BF4FF40044A6 +:1029C000B4F5007F2FD9204604F04CFC804630B18E +:1029D00022460021640A0026FFF7A2F909E06408F4 +:1029E000EEE72346BA194146687803F0D5FF18B9D7 +:1029F00026446B899E42F4D3404604F043FC688928 +:102A0000801B18BF012003B0BDE8F08301366B893D +:102A10009E42F4D20123BA194946687803F0BCFFFC +:102A20000028F3D0EBE70026F1E70120EBE70000F8 +:102A3000F8B50446FFF7B6FC0546002842D12378D6 +:102A4000032B37D12779012F34D104F14C060146ED +:102A50004FF400723046FFF763F95523412272218B +:102A600084F84A32AA2304F50D7084F84F2084F8C4 +:102A70004B32522384F8301284F84C3084F84D30B5 +:102A8000612384F8311284F84E3084F83332A1691E +:102A900084F83222FFF7E4FA616904F50E70FFF75B +:102AA000DFFA626B3B46314601326078A26403F084 +:102AB00073FF257100226078114603F091FF003802 +:102AC00018BF0120F8BD000000232DE9F0430B6082 +:102AD00085B00F461546FFF71BFB061EC0F2B281FC +:102AE000804B53F82640002C00F0AE813C6005F08E +:102AF000FE0523786BB1607803F028FFC70708D480 +:102B00001DB110F0040500D00A25284605B0BDE827 +:102B1000F0830023F0B22370607003F003FFC1075D +:102B200000F194810DB14207EED400212046FFF759 +:102B300079FC022840F099806E4604F2122304F2D8 +:102B40005221324618461033FFF784FA42F8040B3C +:102B50008B42F7D1002556F8041B00297DD0204672 +:102B6000FFF760FC012879D80128A26C40F0C080F2 +:102B700004F1570304F18C0113F8015B002D7BD1A4 +:102B80008B42F9D1B4F8B430B3F5807F74D194F8A6 +:102B9000B830092B70D104F19400FFF75DFA4FF0C3 +:102BA000FF33171841F10001BB4275EB010363D3FA +:102BB00004F1A000FFF74EFA94F8BA302063012B1D +:102BC000A37059D194F8B99003FA09F91FFA89F35F +:102BD0006381002B50D0444B04F1A800FFF73AFA70 +:102BE0000646984248D8831C626304F1A400E3625D +:102BF000FFF730FA00EB020804F19C00C4F84080B3 +:102C0000FFF728FA10441FFA89F2A06306FB02F3CB +:102C100013EB080345EB05029F4271EB02032BD334 +:102C20002E4604F1AC00FFF715FAE06365B963893D +:102C3000B34221D9E16B2046FFF72AFA81192046D9 +:102C4000FFF7D6FB98B90136631993F84C30812B06 +:102C500014D02035C5F30805E8E703200135042D1D +:102C60007FF479AF042807D101E0042801D10125C0 +:102C70004BE701287FF678AF0D2546E705F11400F4 +:102C800004F14C063044FFF7E5F901280546F3D975 +:102C9000E36A8342F0D96189821E236C02FB01330F +:102CA0006364A16B204601EBD511FFF7A1FB00285F +:102CB000DDD105F07F0006EB8000FFF7CBF9431C68 +:102CC00003D00135A842ECD0D6E70425C4E90500BD +:102CD000064A257000251388E56101339BB21380F5 +:102CE000E38012E73C360020FDFFFF7F40360020E6 +:102CF000B4F85730B3F5007FBED1B4F8626026B99E +:102D000004F17000FFF7A6F9064694F85C302663DC +:102D1000591EA3700129AFD894F859506581002D30 +:102D2000AAD0691E2942A7D1B4F85D8018F00F0F10 +:102D3000A4F80880A0D1B4F85F0018B904F16C00C1 +:102D4000FFF788F9B4F85A10002995D006FB03FE66 +:102D500001EB181CF44460458ED3A0EB0C00A84294 +:102D6000B0FBF5F388D33E48834285D84FF6F57023 +:102D700083426DD903259F1C114402EB0C03032DE4 +:102D8000E7626263A16323644CD1B4F8763053EAFE +:102D900008037FF471AFBB0004F17800FFF75AF924 +:102DA000E06303F2FF13B6EB532FFFF465AF4FF070 +:102DB000FF33032DC4E905334FF08003237187D11E +:102DC000B4F87C30012B83D1511C2046FFF710FB57 +:102DD00000287FF47DAFB4F84A224AF655232071CB +:102DE0009A427FF475AF1F4B04F14C00FFF732F9A4 +:102DF00098427FF46DAF03F1FF5304F50C70FFF7B9 +:102E000029F903F50053203398427FF461AF04F5AC +:102E10000D70FFF71FF9A06104F50E70FFF71AF9A6 +:102E2000606155E7B8F1000F3FF426AF7144022D01 +:102E30004FEA4703E1631EBFD91907F0010303EB13 +:102E40005103AEE70B2560E60C255EE603255CE644 +:102E500040F6F575AB428CBF022501258BE700BF1C +:102E6000F5FFFF0F525261412DE9F84F0746056803 +:102E7000884649B96E69C6B1EB6AB34298BF01266C +:102E8000AB69A3B9002405E0FFF76AFB01280446FB +:102E900003D801242046BDE8F88F421C00F0D28000 +:102EA000EB6A8342F6D84646EAE70126E8E72A7845 +:102EB000EB6A042A40F08380A6F1020A023B4FF03D +:102EC000010B9A4528BF4FF0000AD146696C28468D +:102ED00001EB1931FFF78CFA00283BD109F0070309 +:102EE000EA6AC9F3C8010BFA03F3901EDBB26A1851 +:102EF0004C4609F1010992F84C20814502EA03028F +:102F000033BF5B0000234FF40071DBB228BF99464A +:102F1000B2B90234631E0333BCD8012321462846CC +:102F20001A46FFF7E1FA0228B3D0012800F08A80A0 +:102F3000B8F1000F13D10223FB710028A9D130E0B2 +:102F4000CA450AD0002BD2D10131B1F5007FBDD2E4 +:102F50000123CCE74FF0FF34DCE70024DAE7FB790C +:102F6000022B07D1731CA342E7D0BB68F31ABB61E5 +:102F70000323FB7108F10102FB69A24205D113B1E1 +:102F80000133FB61D9E70223FBE70BB90123FB61A6 +:102F9000224641463846FFF747FC00284FD101231F +:102FA000FB61EA6AAB69023A6C6193429CBF03F130 +:102FB000FF33AB612B7943F001032B716AE7464580 +:102FC00014D1741C3846A34298BF02242146FFF74F +:102FD000C7FA01283FF45DAF431C33D0E0B16B6901 +:102FE000012B03D9EA6A934238BF1E4634460134A6 +:102FF000EB6AA34203D8012E7FF644AF0224214698 +:103000003846FFF7ADFA48B101283FF442AF01302E +:1030100018D0B442EBD135E7002CE7D04FF0FF32A7 +:1030200021462846FFF77CFB48B9B8F1000FB8D01D +:10303000224641462846FFF773FB0028B1D00128FD +:103040007FF427AF4FF0FF3424E700002DE9F84369 +:1030500006680446076B894633782037042B0CBF7B +:103060004FF080534FF40013BB429CBF0023836397 +:10307000836B73B1C7F30808B8F1000F3CD101337B +:10308000416B836339B93389B3EB571F34D80023BD +:10309000A36304200AE07389013B13EA57232BD171 +:1030A000FFF75EFA0128054602D80220BDE8F88342 +:1030B000421C01D10120F9E7F36A834216D8B9F125 +:1030C000000FE4D0616B2046FFF7CEFE0546C8B185 +:1030D0000128EAD0431CEDD001463046FFF752FCF0 +:1030E0000028E7D1E37943F00403E3712946304631 +:1030F0006563FEF7CDFFA0634C360020276346448E +:10310000E663D3E70720D1E7F8B50E460021044671 +:103110000768FFF7BDFA98B90546A16B3846FFF777 +:1031200067F968B93A78E36B042A1B780CD11B065F +:103130000ED5054601212046FFF788FF0028ECD078 +:10314000042808BF072006E0E52B01D0002BF0D1B2 +:103150000135B542EED1F8BDC16C4B1C2DE9F041F3 +:1031600004460568066B1FD1E5274FF00108A16BE7 +:103170002846FFF73DF998B92A78E36B042A09BF7E +:103180001A781F7002F07F021A7085F80380236B93 +:10319000B3420DD200212046FFF758FF0028E6D0A9 +:1031A000042808BF022003E0FFF772FA0028DBD0F2 +:1031B000BDE8F0812DE9F04105460068A96B06697C +:1031C000FFF716F9044620B9EB6B1A78852A03D06D +:1031D00002242046BDE8F081324603F1200153F875 +:1031E000040B8B4242F8040BF9D1777801377F0149 +:1031F000A7F16003B3F5007FEAD800212846FFF766 +:1032000025FF04280446E3D00028E2D1A96B2868F2 +:10321000FFF7EEF804460028DBD1EB6B1A78C02AE2 +:10322000D6D106F1200203F1200153F8040B8B42A2 +:1032300042F8040BF9D196F823300F222C33B3FB5C +:10324000F2F3B7EB431FC3D34FF0400800212846E9 +:10325000FFF7FCFE04280446BAD00028B9D1A96BB8 +:103260002868FFF7C5F804460028B2D1EB6B1A783E +:10327000C12AADD1B8F5187F09D206EB080203F1D7 +:10328000200153F8040B8B4242F8040BF9D108F1EA +:1032900020084745DAD8B8F5187F9AD83046FEF7A7 +:1032A0001FFF7388834294D092E700000B680022CE +:1032B00010B5036004460B6A83604B6AC261C37138 +:1032C00023F0FF03896AC0E90432C164FFF7E0F923 +:1032D00020B92046BDE81040FFF76CBF10BD0000CC +:1032E000F8B50368054601271C692046FEF7F8FE7D +:1032F000A070000A6678E0702846E96CFFF7C8F90C +:1033000020B1022828BF0220C0B2F8BDA96B2868EE +:10331000FFF76EF80028F4D1EB6B04F1200254F8AB +:10332000041B944243F8041BF9D12B68DF70002E74 +:10333000E7D000212846013EFFF788FEE0E70000C5 +:103340002DE9F8434FF0FF08064607680424454678 +:103350004FF6FF79B16B11B9002C73D063E038469A +:10336000FFF746F8044600285DD1F06B0378002B88 +:103370006ED03A78042A11D1852B4DD1336B30466B +:10338000F364FFF717FF044600284CD13B691B7913 +:1033900003F03F03B3712046BDE8F883C27AE52B02 +:1033A00002F03F02B27143D02E2B41D022F0200117 +:1033B00008293DD00F2A40D1590637D503F0BF0563 +:1033C000336B90F80D80F364437B434530D1428BDF +:1033D00072BB03780D21FC6823F04003DFF874E032 +:1033E000013B4B4301211EF801CB30F80CC009B35F +:1033F000FF2B1DD824F813C06146013301320D2A7A +:10340000F1D10278520605D521B1FF2B10D8002248 +:1034100024F81320013DEDB200213046FFF716FEDF +:103420000446002896D00023B363B4E7AB42CBD068 +:10343000FF25F1E7CC45E1D0FAE72DB9FEF740FED4 +:10344000404501D10024A6E74FF0FF33F364A2E723 +:103450000424E8E7BC9300082DE9F04F002187B071 +:103460000446D0F80090FFF713F9804670B999F838 +:103470000030042B33D1D9F80C00FEF779FF074652 +:103480002046FFF75DFF054620B18046404607B065 +:10349000BDE8F08FD9F810309A8CBA42F0D193F889 +:1034A00023B040265D4506D1D9F80C3033F81530ED +:1034B000002BE5D1EAE7F106D9F8103008BF023653 +:1034C000985B01F04DF8D9F80C30824633F81500BE +:1034D00001F046F88245D3D102360135E2E74FF0DC +:1034E000FF0A4FF0FF3B5546C4F84CB0A16B48466D +:1034F000FEF77EFF00285CD1E66B3778002F77D08F +:10350000F27AE52F02F03F03A37103D0120704D52E +:103510000F2B04D0C4F84CB04FE00F2B54D194F8CB +:103520004B3058063FD4790645D5236B07F0BF07CB +:1035300096F80DA0E364737B53453ED1738B002B4B +:103540003BD135780121D9F80C3005F03F050193C6 +:103550000D23013D5D43284B13F8012BB25A71B383 +:10356000FF2D059329D81046049200F0F9FF6B1C3B +:1035700003900293019B33F8150000F0F1FF0399CB +:1035800081421AD1049A029D1146059B1B4A93421F +:10359000E2D133785A0604D519B1019B33F81530BE +:1035A0005BB97D1EEDB200212046FFF74FFD0028DC +:1035B0009CD080466AE7BD42BDD0FF25F3E74FF6B9 +:1035C000FF708242E2D0F8E72DB93046FEF778FD71 +:1035D00050453FF45BAF94F84B30DB079AD40B2295 +:1035E00004F14001304605F0BFFD002892D14DE7BF +:1035F0004FF004084AE700BFBC930008C9930008D5 +:103600002DE9F04F90F84BB099B004461BF0A0059F +:1036100040F068810668F26832F81530002B4AD114 +:103620003378042B40F087800F230E352046B5FBFE +:10363000F3F5A91CFFF768FD8146002877D1236BBD +:103640000135A3EB4515E3795A07E56435D523F039 +:1036500004032046E371FFF77DF950BB4FF0FF32C2 +:10366000616B2046FFF7E0F818BBA3682BB3214637 +:1036700004A8FFF71BFEE0B970894FF40071D4E98C +:103680000423E0FB01233069C4E904233830FEF74A +:10369000EFFC3069D4E904232830FEF7E9FCE37934 +:1036A000326904A843F0010382F82130FFF718FEC5 +:1036B00018B181463BE00135AEE7D6E9035440221C +:1036C00000212046FEF72CFB852301214022237098 +:1036D000C0234FF0C10C04EB010884F82030002314 +:1036E0001E469E46571C04F802C0F0B2023204F88F +:1036F00007E021B135F8131009B10133DBB20F0A2D +:10370000A15408F802700232D706F2D135F81370CE +:103710000136002FE6D184F82330831C28466370DD +:10372000FEF726FE84F82400000A84F825004846A7 +:1037300019B0BDE8F08F04F140070DF1100A1BF03D +:10374000010F97E807008AE8070000F0D3804023C4 +:103750004FF0010884F84B30BC46F368B8F1050F10 +:103760009AE80700ACE803002CF8022B4FEA12425B +:103770008CF8002059D9981E424630F8021F0029C3 +:1037800042D10DF10F0C072102F00F0E91461209E4 +:103790000EF13000392888BF0EF1370001390CF8DE +:1037A000010902D0B9F10F0FEED818AB7E205A18DC +:1037B00002F8580C38460022914206D010F801CB8E +:1037C00002F1010EBCF1200F31D104F13F0C0729A9 +:1037D00002F1010297BF18AB20205818013198BFA1 +:1037E00010F8580C072A0CF80200F0D92046FFF711 +:1037F00033FE8146002878D108F10108B8F1640F42 +:10380000AAD14FF0070992E74FF0100C01F0010E1A +:1038100049080EEB4202D30344BF82F4883282F09F +:103820002102BCF1010CF1D1A7E74246A9E772469B +:10383000C2E7216B2046A1EB4511FEF729FF814627 +:1038400000287FF474AF4FF6FF783846FEF738FC57 +:103850000190A16B3046FEF7CBFD814600287FF436 +:1038600066AFE36BE9B2019A4FF00D0CD6F80CE0AD +:103870005A734FF00F02DFF8E0A0DA724A1E187395 +:103880000CFB02F284469876D87640451AF8019BE4 +:103890000CF1010C18BF3EF8120003EB090B18BF26 +:1038A000013203F809004FEA1029002808BF4046FA +:1038B000BCF10D0F8BF80190E7D1404502D03EF8E6 +:1038C00012200AB941F0400119700123002120465D +:1038D000F370FFF7BBFB814600287FF428AF013D62 +:1038E000B7D11BE04FF0060921E704287FF41FAF92 +:1038F00084F84BB01BF0020F20461BBF0C350D2186 +:103900000125B5FBF1F518BF01352946FFF7FCFB92 +:10391000814600287FF40BAF013D8AD1A16B304670 +:10392000FEF766FD814600287FF401AF01462022A4 +:10393000E06BFEF7F5F9E36B03CF18605960BA78D6 +:1039400039889A72198194F84B30E26B03F01803AE +:1039500013730123F370EAE6BC93000810B5044624 +:103960000A463430FEF776FB886004F13800FEF733 +:1039700073FBC2E9040194F8213003F00203D37110 +:103980000023D36110BD000003284B8B04BF8A8A3B +:1039900043EA0243184670472DE9F04F0B7899B07F +:1039A000044689462F2BD0F800B001D05C2B09D1FA +:1039B0004A461378914601322F2BFAD05C2BF8D06F +:1039C000002301E0DBF81C30A3600023E3619BF8D7 +:1039D0000030042B1ED1A368E3B1DBF82030214670 +:1039E00004A82362DBF824306362DBF82830A3628A +:1039F000FFF75CFC0346002854D1DBF8102002F1ED +:103A00003800FEF727FBC4E9040392F8213003F0E5 +:103A10000203E37199F800301F2B00F235818023F7 +:103A20000021204684F84B3019B0BDE8F04FFEF776 +:103A30002FBE49460B78894601312F2BFAD05C2BDB +:103A4000F8D01F2B8CBF00250425012F2FD1138800 +:103A50002E2B31D1002322F8173004F140029F426F +:103A60008CBF2E21202101330B2B02F8011BF6D134 +:103A700045F02005204684F84B50FFF7EDFC94F804 +:103A80004B30002800F0E78004280BD1990603F0A2 +:103A9000040240F1DC80002A00F0F6808023002040 +:103AA00084F84B3019B0BDE8F08F0425CDE7022F24 +:103AB00002D153882E2BCAD0911E87BB002322F837 +:103AC0001730002F00F0118132F81300194601332E +:103AD0002028F9D009B92E2801D145F00305901E00 +:103AE00030F817302E2B01D0013FF9D14FF02033A1 +:103AF0004FF0000A6364D0462364C4F847300823BB +:103B0000481C32F811600090F6B1202E03D02E2E02 +:103B10000DD1B84210D045F003050099F0E731F817 +:103B20001730202B01D02E2BC8D1013FC5E79A4575 +:103B300005D20099B9423BD10B2B30D101E00B2BC0 +:103B400027D145F003050B2394F84020E52A04BF54 +:103B5000052284F84020082B04BF4FEA88085FFA4A +:103B600088F808F00C030C2B03D008F00303032B98 +:103B700001D145F00205A8073FF57CAF18F0010F11 +:103B800018BF45F0100518F0040F18BF45F00805E0 +:103B900070E70099B94202D045F00305D4D84FEA46 +:103BA00088080B234FF0080A00975FFA88F8B4E7FB +:103BB0007F2E15D9304640F25231CDE9022345F02F +:103BC0000203019300F098FC10F0800F0646DDE937 +:103BD000022316D000F07F0646498E5D019D46B354 +:103BE00031464548CDE9012305F0E8FADDE9012336 +:103BF000F8B9A6F1410189B219291ED848F0020886 +:103C000010E0FF28EAD9591E8A4503D345F0030581 +:103C10009A4682E704EB0A01000A0AF1010A019DB3 +:103C200081F8400004EB0A010AF1010A81F84060C2 +:103C300073E745F003055F26F4E7A6F1610189B259 +:103C400019299EBF203E48F00108B6B2EAE7002AD3 +:103C500008BF052026E75A073FF524AFA379DB0606 +:103C600045D59BF80000042835D1A3682146E279A8 +:103C700023622369DBF8100023F0FF031343636220 +:103C8000E36CA362FFF76AFE23680027DA6819F87D +:103C9000010B00283FF409AF40F25231009200F0CE +:103CA0004BFC054608B31F28009A7FF6FEAE2F286E +:103CB0003FF4BFAE5C283FF4BCAE7F2805D8014678 +:103CC0000E4805F07BFA009A78B9FF2F0DD022F844 +:103CD00017500137DBE7216B0BF14C03C1F30801EF +:103CE0001944FFF751FEA060CEE70620DAE6052072 +:103CF000D8E600BF3C930008359300082C930008D9 +:103D00001FB5CDE9001003A814460391FEF700FA91 +:103D1000002815DB0B4A52F820300BB10021197036 +:103D2000019B0BB10021197042F820302CB1002208 +:103D300001A96846FEF7C8FE0446204604B010BD3F +:103D40000B24FAE73C3600202DE9F04798B0904666 +:103D500005460191002800F0528102F03F0603A9B8 +:103D600001A83246FEF7B0FE002840F04681039BD2 +:103D70004FF48C60049303F075FA0746002800F0B6 +:103D80004081039B00F500720199D86004A81A6174 +:103D9000FFF702FE044620B99DF95B30002BB8BF47 +:103DA000062418F01C0F00F0CD80002C4CD0042C01 +:103DB00040D104A8FFF724FC044600283AD146F07D +:103DC0000806039B1A78042A40F083801869294664 +:103DD0002B60FFF7C3FD039B1E22002118690230F0 +:103DE000FDF79EFF039C00211A2220692630FDF773 +:103DF00097FF236920221A71246903F06DFA0146A6 +:103E0000012208342046FEF72BF9039B04A81B6906 +:103E100083F82120FFF764FA044658B9A96801B372 +:103E200002462846FEF718FDAB68039A0446013B9C +:103E30005361B4B1384603F025FA0CB100232B606E +:103E4000204618B0BDE8F0879DF8163013F0110F2A +:103E500040F0848018F0040F40F0C98018F0080F7B +:103E6000AFD1039A31071399936C48BF46F04006CF +:103E7000E964AB641078042872D1069B9DF8171092 +:103E80002B62089B106923F0FF030B4329466B62EA +:103E9000179BAB62FFF762FDDDF80CA00024002247 +:103EA00005F15008BAF8063021464046C5F800A092 +:103EB000AB80002385F8306085F831406C64C5E93B +:103EC0000E234FF40072FDF72BFFB20653D40024EB +:103ED000B0E703F001FA0146009013980E30FEF7A8 +:103EE000BFF8139800991630FEF7BAF8039C13999F +:103EF0002078FFF749FD202300228046CB72204620 +:103F00001399FEF7D1F8139B002201211A775A77F3 +:103F10009A77DA77039BD970B8F1000FA1D04146A8 +:103F200004A8D3F84890FEF797FC0446002881D1F6 +:103F300049460398FEF75CFA039B044608F1FF30FC +:103F4000586176E7002C7FF475AF9DF81630DC06DB +:103F50004FD418F0020F84D0D80782D5072469E720 +:103F6000FFF712FD0023A86001F11C00FEF772F8B4 +:103F70006B61286190E7D5E9046956EA0903A6D088 +:103F8000BAF80AA0A9684FEA4A2AC5E90E69B245FB +:103F900074EB09031BD300242964002C7FF44AAF7F +:103FA000C6F30803002B92D0039C2046FEF770F85E +:103FB00008B3760A0123414646EAC95682196A6463 +:103FC000607802F0C5FC041E18BF012432E72846C1 +:103FD000FEF7C6FAB6EB0A06014669F100090128A8 +:103FE00003D9431CD3D10124D6E70224D4E7082403 +:103FF00020E704241EE702241CE704461EE70924E8 +:104000001EE711241CE700002DE9F04F994685B00A +:104010000023884603A90446C9F800301646FEF777 +:1040200091F8054680BB94F831506DBB94F8303060 +:1040300013F00103009300F0A68004F1500AD4E9C4 +:104040000432D4E90E011B1A62EB0102B34272F191 +:10405000000238BF1E46BEB1D4E90E10C1F30803FA +:10406000002B40F08280039B5A894B0A013A43EAB5 +:10407000C0531A401BD151EA000309D1A06801289E +:104080000DD8022584F83150284605B0BDE8F08FE0 +:10409000216C20460192FEF763FA019AEFE7431C78 +:1040A00004D10123009D84F83130EDE72064DDF870 +:1040B0000CB0216C5846FDF7EBFF0028E1D0B6F5B7 +:1040C000007F02EB000731D3BBF80A1002EB562049 +:1040D000730A88429BF8010088BF8B1A3A46414612 +:1040E000019302F035FC0028DBD194F93020019BCC +:1040F000002A0BDA606CC01B984207D24FF40072A2 +:10410000514608EB4020FDF7E5FD019B5F02D9F821 +:104110000030F61BB8443B44C9F80030D4E90E32F5 +:10412000DB1942F10002C4E90E3294E7626CBA4234 +:104130001AD094F93030002B0DDA012351469BF848 +:10414000010002F029FC0028ABD194F8303003F0D4 +:104150007F0384F83030039801233A465146407873 +:1041600002F0F6FB00289CD16764A16B4046C1F3C6 +:104170000801C1F500775144B74228BF37463A4697 +:10418000FDF7A8FDC3E707257EE7000070B596B0F0 +:104190000E460022019002A901A8FEF795FC0446F4 +:1041A000E0B94FF48C6003F05DF80546D8B1029B8E +:1041B00000F500720199D86002A81A61FFF7ECFBC4 +:1041C000044640B99DF95330002B0ADB1EB131463D +:1041D00002A8FDF7EDFF284603F054F8204616B07C +:1041E00070BD0624F7E71124F8E7000070B5B8B0F9 +:1041F0000222019003A901A8FEF766FC044608BB51 +:10420000039B4FF48C60109303F02CF805460028B4 +:1042100066D0039B00F500720199D86010A81A615E +:10422000FFF7BAFB044650B99DF88B30980655D479 +:10423000190653D49DF84630DA0706D507242846D8 +:1042400003F020F8204638B070BD039B0493187823 +:10425000042814D104A91869FFF780FB069E9DF875 +:104260004630DB0610D410A8FEF776FF044600287F +:10427000E5D156BB0398FEF7DBFB0446DFE71F9949 +:10428000FFF782FB0646EAE7039BDA69B242D5D024 +:1042900024930021269624A81B78042B01BFDDE976 +:1042A0000823CDE928239DF817308DF89730FEF7C5 +:1042B000EFF904460028C2D124A8FFF741F80446CC +:1042C0000028BBD00428BAD1CDE70246314604A865 +:1042D000FEF7C2FA04460028B1D1CBE70624AEE7C8 +:1042E0001124AFE7F0B5BDB0CDE900106846FDF789 +:1042F0000FFF022203A901A8FEF7E6FB04460028EF +:1043000041D1039B4FF48C60149302F0ABFF054640 +:10431000002800F0EE80039B00F5007214AE0199B6 +:10432000D8601A613046FFF737FB044640BB9DF862 +:104330009B3013F0A00F40F0D880039B009F1A78A9 +:10434000042A68D11B6904AC03F1400C18680833D7 +:1043500053F8041C2246634503C21446F6D150228A +:10436000314628A8FDF7B6FC394628A8FFF714FB0C +:10437000044600284CD12A9A169B9A4206D008245B +:10438000284602F07FFF20463DB0F0BD349A209BC6 +:104390009A42F4D128A8FFF733F904460028EFD158 +:1043A000039B04AF1B6993F801E093F823C09C8C36 +:1043B0003A46083303CAB24243F8080C43F8041CD7 +:1043C0001746F5D1039B28A81B6983F801E0039BDE +:1043D0001A6982F823C01A6982F82440240A82F8F4 +:1043E00025401A691379D9065CBF43F02003137185 +:1043F000FEF776FF04460028C2D13046FEF7ACFE39 +:1044000004460028BCD10398FEF712FB0446B7E728 +:104410000428B5D1BEE7239A04AB02F1200C106842 +:10442000083252F8041C1C46624503C42346F6D1E8 +:104430005022314628A8FDF74DFC394628A8FFF741 +:10444000ABFA044600284CD12A9A169B9A4296D180 +:10445000349A209B9A4292D128A8FFF7D1F80446BB +:1044600000288DD137990DF11D030DF12D0001F1BB +:104470000D0253F8044B834242F8044BF9D11888DB +:10448000012710809B7893709DF81B30039CDA06FF +:1044900058BF43F02003CB72E770CB7ADB06ACD574 +:1044A000169A2A9B9A42A8D02078FFF76DFA014607 +:1044B0002046FDF7EDFD0146C8B12046FDF798FF07 +:1044C000044600287FF45CAF039890F86D302E2BE3 +:1044D00093D12A9A00F16C01FDF7E6FD039BDF7092 +:1044E0008BE704287FF44CAFB6E7062448E70224A4 +:1044F00046E7112447E700007F2810B501D880B2B5 +:1045000010BDB0F5803F13D240F2523399420FD123 +:104510000849002231F8024B93B2844203D103F1DF +:104520008000C0B2ECE70132802AF3D11346F6E7EF +:104530000020E5E77C9600087F280DD940F2523331 +:10454000994208D1FF2806D800F10040034B80387B +:1045500033F8100070470020704700BF7C960008B9 +:10456000B0F5803FF0B522D21F4A83B21F49B0F5A3 +:10457000805F28BF0A46141D34F8042C2146AAB1D6 +:10458000934213D334F8025C2E0AEFB252FA85F547 +:10459000A84222DA082E09D8DFE806F0050A101230 +:1045A0001416181A1C00801A34F810301846F0BD82 +:1045B000981A00F001001B1A9BB2F7E7103BFBE7CB +:1045C000203BF9E7303BF7E71A3BF5E70833F3E721 +:1045D000503BF1E7A3F5E353EEE70434002ECBD1D3 +:1045E00001EB4702C7E700BFCC930008C095000865 +:1045F00008B5074B074A196801F03D0199605368F7 +:104600000BB190689847BDE8084003F09FB800BF21 +:10461000000002404436002008B5084B196889099B +:1046200001F03D018A019A60054AD3680BB1106917 +:104630009847BDE8084003F089B800BF0000024079 +:104640004436002008B5084B1968090C01F03D01FB +:104650000A049A60054A53690BB190699847BDE80E +:10466000084003F073B800BF000002404436002049 +:1046700008B5084B1968890D01F03D018A059A605B +:10468000054AD3690BB1106A9847BDE8084003F0AA +:104690005DB800BF000002404436002008B5074B5B +:1046A000074A596801F03D01D960536A0BB1906A1D +:1046B0009847BDE8084003F049B800BF0000024039 +:1046C0004436002008B5084B5968890901F03D01BE +:1046D0008A01DA60054AD36A0BB1106B9847BDE8CE +:1046E000084003F033B800BF000002404436002009 +:1046F00008B5084B5968090C01F03D010A04DA605D +:10470000054A536B0BB1906B9847BDE8084003F026 +:104710001DB800BF000002404436002008B5084B19 +:104720005968890D01F03D018A05DA60054AD36BAD +:104730000BB1106C9847BDE8084003F007B800BF04 +:10474000000002404436002008B5074B074A1968AC +:1047500001F03D019960536C0BB1906C9847BDE836 +:10476000084002F0F3BF00BF0004024044360020BE +:1047700008B5084B1968890901F03D018A019A6062 +:10478000054AD36C0BB1106D9847BDE8084002F0A4 +:10479000DDBF00BF000402404436002008B5084BCE +:1047A0001968090C01F03D010A049A60054A536D2D +:1047B0000BB1906D9847BDE8084002F0C7BF00BF3D +:1047C000000402404436002008B5084B1968890DE2 +:1047D00001F03D018A059A60054AD36D0BB1106E58 +:1047E0009847BDE8084002F0B1BF00BF0004024096 +:1047F0004436002008B5074B074A596801F03D01CF +:10480000D960536E0BB1906E9847BDE8084002F036 +:104810009DBF00BF000402404436002008B5084B8D +:104820005968890901F03D018A01DA60054AD36EB1 +:104830000BB1106F9847BDE8084002F087BF00BF7A +:10484000000402404436002008B5084B5968090CA2 +:1048500001F03D010A04DA60054A536F0BB1906F15 +:104860009847BDE8084002F071BF00BF0004024055 +:104870004436002008B5084B5968890D01F03D0108 +:104880008A05DA60054AD36F13B1D2F880009847E1 +:10489000BDE8084002F05ABF000402404436002040 +:1048A00000230C4910B51A460B4C0B6054F823003A +:1048B000026001EB430004334260402BF6D1074A0B +:1048C0004FF0FF339360D360C2F80834C2F80C3461 +:1048D00010BD00BF443600207C9700080000024055 +:1048E0000F28F8B510D9102810D0112811D012288F +:1048F00008D10F240720DFF8B4E00126DEF80050CD +:10490000A04208D9002649E00446F4E70F2400201D +:10491000F1E70724FBE706FA00F73D4240D1214CBE +:104920004FEA001C3D4304EB00160EEBC000CEF82E +:104930000050C0E90123FBB24BB11B48836B43F02D +:1049400001038363036E43F001030366036E17F4F0 +:104950007F4F09D01448836B43F002038363036ED7 +:1049600043F002030366036E54F80C00036823F05F +:104970001F030360056815F00105FBD104EB0C0370 +:104980003D2493F80CC05F6804FA0CF43C602124C9 +:104990000560446112B1987B00F0B4FC3046F8BD6C +:1049A0000130ADE77C9700080045025844360020EE +:1049B00010B5302484F31188FFF792FF002383F3AE +:1049C000118810BD10B50446807B00F0B1FC0123B6 +:1049D0001049627B03FA02F20B6823EA0203DAB29F +:1049E0000B604AB90C4A916B21F001019163116E81 +:1049F00021F001011166126E13F47F4F09D1064BAD +:104A00009A6B22F002029A631A6E22F002021A6670 +:104A10001B6E10BD443600200045025808B53023F7 +:104A200083F31188FFF7CEFF002383F3118808BDBD +:104A3000836CC26A8B42506810B506D95A1E4C006E +:104A400002EB4103B3FBF4F3184410BD01F0010382 +:104A50008A0748BF43F002034A0748BF43F00803F0 +:104A60000A0748BF43F00403CA0648BF43F01003D7 +:104A70008A06426B48BF43F02003134343637047E9 +:104A800010B5074C204600F0BFFF064B0022C4E9DA +:104A90001023054BA364054BE363054BE36410BD92 +:104AA000C83600200070005200B4C4041C37002037 +:104AB0001C390020C36A0BB90E4BC3620379012B6A +:104AC0000CD10D4B984209D10C4B5A6B42F48032F9 +:104AD0005A63DA6D42F48032DA65DB6D436C002292 +:104AE0001A65DA621A605A605A624FF0FF329A63AE +:104AF000704700BF7C980008C83600200045025867 +:104B00000379012B16D0436C00221A65DA621A6011 +:104B10005A605A624FF0FF329A63074B984209D1AC +:104B2000064B5A6B22F480325A63DA6D22F48032DB +:104B3000DA65DB6D704700BFC836002000450258BB +:104B400010B5446C0649FFF773FF6060236842F2BA +:104B5000107043F003032360BDE8104001F05ABD1C +:104B6000801A06000129F8B5466C0B4F09D175680B +:104B70000A493D40FFF75CFF054345F480557560E9 +:104B8000F8BD746806493C40FFF752FF044344F403 +:104B900080547460F4E700BF00ECFFFF80F0FA027D +:104BA00040787D01436C00225A601A607047000013 +:104BB000426C0129536823F4404304D0022905D0F4 +:104BC00001B95360704743F48043FAE743F400436C +:104BD000F7E70000436C41F480519A60D9605A6B4A +:104BE0001206FCD580229A637047000010B541F48C +:104BF0008851446CA260E160616B11F04502FBD00A +:104C0000A26311F0040203D0FFF720FF012010BDC2 +:104C1000616910461960FAE710B541F48851446C97 +:104C2000A260E160616B11F04502FBD0A26311F05C +:104C3000050203D0FFF70AFF012010BD616910468D +:104C40001960FAE773B5134604460E46302282F324 +:104C50001188426CD26B32B14FF0FF31403001937A +:104C600001F0E4FC019B606C00220265C263C26239 +:104C7000456B15F4807504D185F31188012002B0CD +:104C800070BD4FF0FF31816382F31188012E06D988 +:104C90000C21204602B0BDE87040FFF7BDBF1046B2 +:104CA000EDE7000073B5446C0E4600250192616B80 +:104CB000A1632565E562FFF7C9FE012E07D9019BB7 +:104CC0002A460C2102B0BDE87040FFF7A5BF02B034 +:104CD00070BD000010B541F49851446CA260E160D1 +:104CE000616B11F04502FBD0A26311F03F0203D0CB +:104CF000FFF7ACFE012010BD216A10461960E16982 +:104D00005960A16999606169D960F4E72DE9F743B9 +:104D100004460191006D01A91746984602F03EFC39 +:104D2000064600284AD0626C2046DDF8049055689B +:104D3000C5F3090501356B00A56CB5FBF3F54FF420 +:104D40007A73B5FBF3F55D43556200F023FE50BB6B +:104D5000636C4FF0FF3201254146C3F8589020465E +:104D60001D659A634FF49572DA6342F207029F62FF +:104D7000DA62E36C0A9AFFF74FFFA0B9E26C104BBE +:104D800011680B407BB929462046FFF75BFF0546BB +:104D900048B92E463A460199206D02F037FC30465C +:104DA00003B0BDE8F0833A460199206D02F02EFC75 +:104DB000E26C01212046FFF775FFF0E70126EEE7E0 +:104DC00008E0FFFD2DE9F7431F46436C01924FF4C5 +:104DD0007A725D6804468846C5F3090501356E00A0 +:104DE000856CB5FBF6F5B5FBF2F555435D6200F059 +:104DF000D1FD20B10125284603B0BDE8F0837E0235 +:104E000001A9206D324602F0C9FB05460028F1D009 +:104E1000636C019AD4F84C909A6501221A654FF0A0 +:104E2000FF329A634FF49572DA639E62236BDB065E +:104E30004B4658BF4FEA4828012F42461BD9122142 +:104E40002046FFF7E9FEC0B9D9F80020104B134007 +:104E50009BB9636C42F2930239462046DA62E26CF7 +:104E6000FFF7F0FE804640B932460199206D454675 +:104E700002F0CCFBBFE71121E2E732460199206D39 +:104E800002F0C4FBE26C39462046FFF70BFFB2E7A5 +:104E900008E0FFFD2DE9F3411F46436C01924FF4FA +:104EA0007A725D6804468846C5F3090501356E00CF +:104EB000856CB5FBF6F5B5FBF2F555435D6200F088 +:104EC00069FD20B10125284602B0BDE8F0817E02CF +:104ED00001A9206D324602F0A7FB05460028F1D05B +:104EE000636C019A9A6501221A654FF0FF329A634A +:104EF0004FF48D72DA639E62236BE66CDB063346F9 +:104F000058BF4FEA4828012F424619D91921204697 +:104F1000FFF782FEB0B932680F4B134093B9636C50 +:104F200042F2910239462046DA62E26CFFF78AFECD +:104F3000064638B901993546206D02F0B1FBC2E74B +:104F40001821E4E70199206D02F0AAFBE26C3946D2 +:104F50002046FFF7A7FEB6E708E0FFFD12F0030FBB +:104F60002DE9F04107460C4615461E4617D00E4463 +:104F7000B44202D10020BDE8F0810123FA6B214642 +:104F80003846FFF71FFF0028F5D128464FF400727E +:104F9000F96B05F500750134FCF79CFEE8E7BDE808 +:104FA000F041FFF70FBF000012F0030F2DE9F041B1 +:104FB00007460C4615461E4617D00E44B44202D191 +:104FC0000020BDE8F08129464FF40072F86B05F52A +:104FD0000075FCF77FFE0123FA6B21463846FFF788 +:104FE00059FF0028EDD10134E8E7BDE8F041FFF7B3 +:104FF00051BF000000207047302310B583F31188A3 +:105000000024436C40302146DC6301F01DFB84F337 +:10501000118810BD026843681143016003B118474D +:1050200070470000024A136843F0C00313607047E2 +:1050300000440040024A136843F0C0031360704705 +:1050400000480040024A136843F0C00313607047F1 +:1050500000780040044B9A6C02439A641A6F104324 +:1050600018671B6F704700BF0045025837B5274CC3 +:10507000274D204600F028FD04F114000094002381 +:105080004FF40072234900F0C3F94FF40072224933 +:1050900004F138000094214B00F03CFA204BC4E9A5 +:1050A0001735204C204600F00FFD04F11400009449 +:1050B00000234FF400721C4900F0AAF94FF400726B +:1050C0001A4904F138000094194B00F023FA194BE7 +:1050D000C4E91735184C204600F0F6FC04F1140022 +:1050E00000234FF400721549009400F091F9144B1D +:1050F0004FF40072134904F13800009400F00AFAEA +:10510000114BC4E9173503B030BD00BF2039002072 +:1051100000E1F505643A00206440002025500008B5 +:10512000004400408C390020643C00206442002090 +:105130003550000800480040F8390020643E002047 +:1051400045500008644400200078004038B5264DE2 +:105150000446037C002918BF0D46012B06D1234BC2 +:10516000984230D14FF40030FFF774FF2A68236E65 +:10517000E16D03EB5203A566B3FBF2F36A6810041A +:1051800042BF23F0070003F0070343EA4003CB606C +:10519000AB6843F040034B60EB6843F001038B6066 +:1051A00042F4967343F001030B604FF0FF330B6240 +:1051B000510505D512F0102211D0B2F1805F10D048 +:1051C00084F8643038BD0A4B984205D0094B9842A8 +:1051D000CCD14FF08040C7E74FF48020C4E77F2355 +:1051E000EEE73F23ECE700BF849800082039002059 +:1051F0008C390020F83900202DE9F047C66D0546AE +:105200003768F469210734621AD014F0080118BF16 +:105210004FF48071E20748BF41F02001A3074FF02F +:10522000300348BF41F04001600748BF41F08001B2 +:1052300083F31188281DFFF7EDFE002383F3118807 +:10524000E2050AD5302383F311884FF48061281DCD +:10525000FFF7E0FE002383F311884FF030094FF091 +:10526000000A14F0200838D13B0616D54FF030095B +:1052700005F1380A200610D589F31188504600F050 +:105280007DF9002836DA0821281DFFF7C3FE27F034 +:1052900080033360002383F31188790614D56206F6 +:1052A00012D5302383F31188D5E913239A4208D10C +:1052B0002B6C33B127F040071021281DFFF7AAFE01 +:1052C0003760002383F31188E30618D5AA6E1369AB +:1052D000ABB15069BDE8F047184789F31188736A8C +:1052E000284695F86410194000F008FC8AF31188EC +:1052F000F469B6E7B06288F31188F469BAE7BDE8EB +:10530000F0870000090100F16043012203F56143C9 +:10531000C9B283F8001300F01F039A4043099B00B1 +:1053200003F1604303F56143C3F880211A607047BD +:1053300000F01F0301229A40430900F160409B00E6 +:1053400000F5614003F1604303F56143C3F8802039 +:10535000C3F88021002380F800337047F8B5154664 +:10536000826804460B46AA4200D28568A169266974 +:10537000761AB5420BD218462A46FCF7ABFCA36955 +:105380002B44A3612846A3685B1BA360F8BD0CD91E +:10539000AF1B18463246FCF79DFC3A46E1683044A4 +:1053A000FCF798FCE3683B44EBE718462A46FCF719 +:1053B00091FCE368E5E7000083689342F7B5044693 +:1053C000154600D28568D4E90460361AB5420BD27E +:1053D0002A46FCF77FFC63692B4463612846A36877 +:1053E0005B1BA36003B0F0BD0DD93246AF1B01912A +:1053F000FCF770FC01993A46E0683144FCF76AFC1E +:10540000E3683B44E9E72A46FCF764FCE368E4E729 +:1054100010B50A440024C361029B8460C16002612C +:105420000362C0E90000C0E9051110BD08B5D0E96C +:105430000532934201D1826882B98268013282606A +:105440005A1C426119700021D0E904329A4224BFEB +:10545000C368436101F012F9002008BD4FF0FF302E +:10546000FBE7000070B5302304460E4683F3118835 +:10547000A568A5B1A368A269013BA360531CA36101 +:1054800015782269934224BFE368A361E3690BB1F5 +:1054900020469847002383F31188284607E03146C9 +:1054A000204601F0DBF80028E2DA85F3118870BDB0 +:1054B0002DE9F74F04460E4617469846D0F81C9043 +:1054C0004FF0300A8AF311884FF0000B154665B192 +:1054D0002A4631462046FFF741FF034660B9414660 +:1054E000204601F0BBF80028F1D0002383F3118897 +:1054F000781B03B0BDE8F08FB9F1000F03D0019025 +:105500002046C847019B8BF31188ED1A1E448AF38D +:105510001188DCE7C160C361009B82600362C0E95F +:1055200005111144C0E9000001617047F8B5044657 +:105530000D461646302383F31188A768A7B1A368E8 +:10554000013BA36063695A1C62611D70D4E9043297 +:105550009A4224BFE3686361E3690BB12046984730 +:10556000002080F3118807E03146204601F076F8EC +:105570000028E2DA87F31188F8BD0000D0E905239E +:1055800010B59A4201D182687AB98268002101324D +:1055900082605A1C82611C7803699A4224BFC368E6 +:1055A000836101F06BF8204610BD4FF0FF30FBE740 +:1055B0002DE9F74F04460E4617469846D0F81C9042 +:1055C0004FF0300A8AF311884FF0000B154665B191 +:1055D0002A4631462046FFF7EFFE034660B94146B2 +:1055E000204601F03BF80028F1D0002383F3118816 +:1055F000781B03B0BDE8F08FB9F1000F03D0019024 +:105600002046C847019B8BF31188ED1A1E448AF38C +:105610001188DCE70379052B05BF836A0020012090 +:105620004B6004BF4FF400730B60704770B55D1E94 +:10563000866A04460D44B54205D9436B43F08003A6 +:105640004363012070BD06250571FFF787FC052324 +:105650002371F7E770B55D1E866A04460D44B542B6 +:1056600005D9436B43F080034363012070BD0725D8 +:105670000571FFF799FC05232371F7E738B5057924 +:105680000446052D05D108230371FFF7B3FC2571EE +:1056900038BD0120FCE700000323F0B5037185B09D +:1056A0000446FFF74DFA002220461146FFF792FA12 +:1056B0004FF4D57203AB08212046FFF7ADFA02463E +:1056C000B8B901232363039BC3F30323012B09D13F +:1056D00003AB37212046FFF79FFA18B9A44B039A72 +:1056E0001340ABB120460125FFF75CFA022323717A +:1056F00037E103AB002237212046FFF78DFA28B9A6 +:105700009B4A039B1A40002A00F0A78002232363D0 +:10571000236B03F00F03022B40F0A9806425954E04 +:1057200042F2107000F076FF03AB324601212046B2 +:10573000FFF75CFA0028D5D1039B002B80F2938001 +:105740005A0003D5236B43F010032363002204F1B6 +:10575000080302212046FFF7BDFA02460028C1D106 +:1057600004F1380303212046FFF756FA0028B9D187 +:1057700004F11805A26B092120462B46FFF7AAFA6F +:105780000028AFD102ABA26B07212046FFF744FAF5 +:1057900006460028A6D1236B03F00F03022B40F02E +:1057A0008F807E227F21284603F02CFA012840F2C8 +:1057B0008780E76B42F2107000F02CFF08234FF453 +:1057C0000072394620460096FFF7A0FA002889D1DA +:1057D000384603F065FA236BA06203F00F03022B37 +:1057E00072D103AB644A06212046FFF715FA002860 +:1057F00071D15F49039B1940B1FA81F149092046F3 +:10580000FFF7B0F902AB4FF4007210212046FFF70A +:1058100003FA054600287FF465AF554E029B3342DC +:105820007FF460AF236B13F00E0F03F00F0273D001 +:10583000022A7FF457AFE36A1978012900F09480B7 +:10584000022900F09380002900F089804B4F204608 +:10585000FFF7AEF903AB3A4676E0114620462263E5 +:10586000FFF7B8F954E7013D7FF45AAF3AE7444DEA +:105870006426444A3E4F012B18BF154603AB002255 +:1058800037212046FFF7C8F900287FF42BAF039B90 +:105890003B427FF427AF03AB2A4629212046FFF77E +:1058A000A5F900287FF41EAF039B002BFFF648AF3D +:1058B000013E3FF417AF42F2107000F0ABFEDDE79F +:1058C000284603F0C1F986E77E227F212846E66B51 +:1058D00003F098F908B9002191E7002340223146EE +:1058E000204600930623FFF711FA0028F3D1B3896D +:1058F0005BBA9B07EFD5244B4022314620460093EC +:105900000623FFF703FA0028E5D1317C01F00F01EF +:105910000F3918BF012172E7E36A1978F9B101293B +:105920007FF4E0AE2046FFF743F903ABA26B3721CB +:105930002046FFF771F900287FF4D4AE039B334271 +:105940007FF4D0AE03AB022206212046FFF764F9B4 +:1059500000287FF4C7AE039B33427FF4C3AE052318 +:105960002371284605B0F0BD084F70E7084F6EE779 +:1059700008E0FFFD0080FFC00001B9030000B7038D +:105980000080FF5000001080F1FFFF800001B7038E +:105990000002B70337B504460C4D01ABA26B0D21D5 +:1059A0002046FFF739F978B9019B2B420BD1C3F39D +:1059B0004323042B08D0053B022B04D84FF47A7004 +:1059C00000F028FEE9E7012003B030BD08E0FFFD4C +:1059D00070B53023054683F3118803790024022B28 +:1059E00003D184F31188204670BD0423037184F32E +:1059F00011880226FFF7CEFF04462846FFF7D2F8AB +:105A00002E71F0E7FFF73CB8044B036001230371EC +:105A100000234363C0E90A33704700BF9C98000825 +:105A200010B53023044683F31188C162FFF742F8B2 +:105A300002230020237180F3118810BD10B530239C +:105A4000044683F31188FFF75BF800230122E36229 +:105A5000227183F3118810BD02684368114301600D +:105A600003B11847704700001430FFF721BD000054 +:105A70004FF0FF331430FFF71BBD00003830FFF745 +:105A800097BD00004FF0FF333830FFF791BD0000A5 +:105A90001430FFF7E7BC00004FF0FF311430FFF780 +:105AA000E1BC00003830FFF741BD00004FF0FF328D +:105AB0003830FFF73BBD0000012914BF6FF0130021 +:105AC00000207047FFF7D2BA044B03600023436005 +:105AD000C0E9023301230374704700BFC098000877 +:105AE00010B53023044683F31188FFF72FFB022300 +:105AF0000020237480F3118810BD000038B5C369FD +:105B000004460D461BB904210844FFF7A5FF2946AA +:105B100004F11400FFF78AFC002806DA201D4FF478 +:105B20000061BDE83840FFF797BF38BD02684368A1 +:105B30001143016003B118477047000013B5406B73 +:105B400000F58054D4F8A4381A681178042914D1C7 +:105B5000017C022911D11979012312898B4013424A +:105B60000BD101A94C3002F07BFFD4F8A4480246C7 +:105B7000019B2179206800F0DFF902B010BD000020 +:105B8000143002F0FDBE00004FF0FF33143002F07D +:105B9000F7BE00004C3002F0CFBF00004FF0FF33E3 +:105BA0004C3002F0C9BF0000143002F0CBBE000040 +:105BB0004FF0FF31143002F0C5BE00004C3002F04F +:105BC0009BBF00004FF0FF324C3002F095BF000049 +:105BD0000020704710B500F58054D4F8A4381A6836 +:105BE0001178042917D1017C022914D15979012394 +:105BF00052898B4013420ED1143002F05DFE0246F2 +:105C000048B1D4F8A4484FF4407361792068BDE8E6 +:105C1000104000F07FB910BD406BFFF7DBBF000004 +:105C2000704700007FB5124B01250426044603602F +:105C30000023057400F1840243602946C0E9023361 +:105C40000C4B0290143001934FF44073009602F015 +:105C50000FFE094B04F69442294604F14C000294CD +:105C6000CDE900634FF4407302F0D6FE04B070BD7E +:105C7000E8980008195C00083D5B00080A683023BA +:105C800083F311880B790B3342F823004B791333DC +:105C900042F823008B7913B10B3342F8230000F54F +:105CA0008053C3F8A41802230374002080F31188E2 +:105CB0007047000038B5037F044613B190F85430A4 +:105CC000ABB90125201D0221FFF730FF04F11400BC +:105CD0006FF00101257700F0DDFC04F14C0084F841 +:105CE00054506FF00101BDE8384000F0D3BC38BD1E +:105CF00010B5012104460430FFF718FF0023237775 +:105D000084F8543010BD000038B504460025143026 +:105D100002F0C6FD04F14C00257702F095FE201D2F +:105D200084F854500121FFF701FF2046BDE83840B8 +:105D3000FFF750BF90F8803003F06003202B06D1AE +:105D400090F881200023212A03D81F2A06D800209A +:105D50007047222AFBD1C0E91D3303E0034A4267A2 +:105D600007228267C3670120704700BF44220020DA +:105D700037B500F58055D5F8A4381A68117804298C +:105D80001AD1017C022917D11979012312898B407C +:105D9000134211D100F14C04204602F015FF58B116 +:105DA00001A9204602F05CFED5F8A4480246019BFA +:105DB0002179206800F0C0F803B030BD01F10B0379 +:105DC000F0B550F8236085B004460D46FEB130238F +:105DD00083F3118804EB8507301D0821FFF7A6FE29 +:105DE000FB6806F14C005B691B681BB1019002F077 +:105DF00045FE019803A902F033FE024648B1039B19 +:105E00002946204600F098F8002383F3118805B056 +:105E1000F0BDFB685A691268002AF5D01B8A013B65 +:105E20001340F1D104F18002EAE70000133138B5E4 +:105E300050F82140ECB1302383F3118804F58053EE +:105E4000D3F8A4281368527903EB8203DB689B69BB +:105E50005D6845B104216018FFF768FE294604F12A +:105E6000140002F033FD2046FFF7B4FE002383F355 +:105E7000118838BD7047000001F062BD0123402247 +:105E8000002110B5044600F8303BFBF749FF002322 +:105E9000C4E9013310BD000010B53023044683F37C +:105EA00011882422416000210C30FBF739FF204685 +:105EB00001F068FD02230020237080F3118810BDDB +:105EC00070B500EB8103054650690E461446DA6052 +:105ED00018B110220021FBF723FFA06918B110228E +:105EE0000021FBF71DFF31462846BDE8704001F058 +:105EF00049BE000083682022002103F0011310B581 +:105F0000044683601030FBF70BFF2046BDE81040CD +:105F100001F0C4BEF0B4012500EB810447898D4037 +:105F2000E4683D43A469458123600023A260636067 +:105F3000F0BC01F0E1BE0000F0B4012500EB8104EB +:105F400007898D40E4683D4364690581236000232F +:105F5000A2606360F0BC01F057BF000070B502237F +:105F600000250446242203702946C0F888500C30CE +:105F700040F8045CFBF7D4FE204684F8705001F032 +:105F800095FD63681B6823B129462046BDE8704033 +:105F9000184770BD0378052B10B504460AD080F869 +:105FA0008C300523037043681B680BB104219847AC +:105FB0000023A36010BD00000178052906D190F8E8 +:105FC0008C20436802701B6803B1184770470000BB +:105FD00070B590F87030044613B1002380F870302B +:105FE00004F18002204601F07DFE63689B68B3B92E +:105FF00094F8803013F0600535D00021204602F07F +:106000006FF90021204602F05FF963681B6813B145 +:10601000062120469847062384F8703070BD20463C +:1060200098470028E4D0B4F88630A26F9A4288BF1F +:10603000A36794F98030A56F002B4FF0300380F2F6 +:106040000381002D00F0F280092284F8702083F390 +:10605000118800212046D4E91D23FFF76DFF00239E +:1060600083F31188DAE794F8812003F07F0343EA91 +:10607000022340F20232934200F0C58021D8B3F5EA +:10608000807F48D00DD8012B3FD0022B00F09380A9 +:10609000002BB2D104F1880262670222A267E36793 +:1060A000C1E7B3F5817F00F09B80B3F5407FA4D1B9 +:1060B00094F88230012BA0D1B4F8883043F0020369 +:1060C00032E0B3F5006F4DD017D8B3F5A06F31D0E3 +:1060D000A3F5C063012B90D86368204694F8822012 +:1060E0005E6894F88310B4F88430B047002884D0F8 +:1060F000436863670368A3671AE0B3F5106F36D08F +:1061000040F6024293427FF478AF5C4B6367022310 +:10611000A3670023C3E794F88230012B7FF46DAFAF +:10612000B4F8883023F00203A4F88830C4E91D5580 +:10613000E56778E7B4F88030B3F5A06F0ED194F836 +:106140008230204684F88A3001F00EFD63681B68B7 +:1061500013B1012120469847032323700023C4E98B +:106160001D339CE704F18B0363670123C3E72378A6 +:10617000042B10D1302383F311882046FFF7BAFE99 +:1061800085F311880321636884F88B5021701B68A4 +:106190000BB12046984794F88230002BDED084F86B +:1061A0008B300423237063681B68002BD6D0022138 +:1061B00020469847D2E794F8843020461D0603F025 +:1061C0000F010AD501F080FD012804D002287FF4D8 +:1061D00014AF2B4B9AE72B4B98E701F067FDF3E7E1 +:1061E00094F88230002B7FF408AF94F8843013F0D9 +:1061F0000F01B3D01A06204602D502F089F8ADE7A8 +:1062000002F07AF8AAE794F88230002B7FF4F5AE1A +:1062100094F8843013F00F01A0D01B06204602D55D +:1062200002F05EF89AE702F04FF897E7142284F83C +:10623000702083F311882B462A4629462046FFF713 +:1062400069FE85F31188E9E65DB1152284F87020B6 +:1062500083F3118800212046D4E91D23FFF75AFE5D +:10626000FDE60B2284F8702083F311882B462A4622 +:1062700029462046FFF760FEE3E700BF18990008B3 +:10628000109900081499000838B590F87030044649 +:10629000002B3ED0063BDAB20F2A34D80F2B32D86F +:1062A000DFE803F037313108223231313131313119 +:1062B00031313737856FB0F886309D4214D2C368CC +:1062C0001B8AB5FBF3F203FB12556DB9302383F340 +:1062D00011882B462A462946FFF72EFE85F31188A2 +:1062E0000A2384F870300EE0142384F870303023D1 +:1062F00083F31188002320461A461946FFF70AFE49 +:10630000002383F3118838BDC36F03B1984700237E +:10631000E7E70021204601F0E3FF0021204601F0DD +:10632000D3FF63681B6813B10621204698470623F4 +:10633000D7E7000010B590F870300446142B29D030 +:1063400017D8062B05D001D81BB110BD093B022B75 +:10635000FBD80021204601F0C3FF0021204601F0B8 +:10636000B3FF63681B6813B10621204698470623D4 +:1063700019E0152BE9D10B2380F87030302383F31B +:10638000118800231A461946FFF7D6FD002383F330 +:106390001188DAE7C3689B695B68002BD5D1C36FAE +:1063A00003B19847002384F87030CEE70023826859 +:1063B00080F8243083691B6899689142FBD25A683F +:1063C00003604260106058607047000000238268DC +:1063D00080F8243083691B6899689142FBD85A6819 +:1063E00003604260106058607047000008B50846BE +:1063F000302383F3118891F82430032B05D0042B2C +:106400000DD02BB983F3118808BD8B6A00221A6066 +:106410004FF0FF338362FFF7C9FF0023F2E7D1E9B2 +:10642000003213605A60F3E7034610B51B689842C8 +:1064300003D09C688A689442F8D25A680B604A601C +:106440001160596010BD0000FFF7B0BF064BD9685E +:1064500081F824001868026853601A600122D8602D +:1064600080F82420F9F7CEBF684600200C4B30B5E9 +:10647000DD684B1C87B004460FD02B46094A68469E +:1064800000F09CF92046FFF7E1FF009B13B168463E +:1064900000F09EF9A86A07B030BDFFF7D7FFF9E713 +:1064A00068460020ED630008044B1A68DB689068BA +:1064B0009B68984294BF00200120704768460020E6 +:1064C000094B10B51C68D868226853601A60012215 +:1064D000DC6084F82420FFF779FF01462046BDE800 +:1064E0001040F9F78FBF00BF68460020044B1A68C0 +:1064F000DB6892689B689A4201D9FFF7E1BF704759 +:106500006846002038B50123084C002523706560DB +:1065100002F0F4FB02F01AFC0549064802F0F0FC18 +:106520000223237085F3118838BD00BF1049002075 +:10653000209900086846002000F080B9034A51689D +:1065400053685B1A9842FBD8704700BF001000E008 +:106550008B604B630023CA6100F128020B630223A6 +:106560000A618B840123886181F8263001F11003D0 +:10657000C26A4A611360C36201F12C030846CB6210 +:1065800070470000D0E90131026841F8183CA1F1E0 +:106590009C033839CB60036941F8243C436941F8D6 +:1065A000203C034B41F8043CC3680248FFF7D0BFCE +:1065B0001D0400086846002008B5FFF7E3FFBDE8AA +:1065C0000840FFF741BF000038B50E4BDC6804F10E +:1065D0002C05A062E06AA8420FD194F826303BB99E +:1065E00094F825309B0702BFD4E9043213605A6047 +:1065F0000F20BDE83840FFF729BF0368E362FFF7CB +:1066000023FFE7E768460020302383F31188FFF774 +:10661000DBBF000008B50146302383F31188082052 +:10662000FFF724FF002383F3118808BD054BDB68C7 +:1066300021B1036098620320FFF718BF4FF0FF30CD +:10664000704700BF6846002003682BB1002202603B +:1066500018469962FFF7F8BE70470000064BDB68EA +:1066600039B1426818605A60136043600420FFF734 +:10667000FDBE4FF0FF307047684600200368984227 +:1066800006D01A680260506018469962FFF7DCBEB7 +:106690007047000038B504460D462068844200D19A +:1066A00038BD036823605C608562FFF7CDFEF4E7C8 +:1066B000036810B59C68A2420CD85C688A600B60C5 +:1066C0004C602160596099688A1A9A604FF0FF33D4 +:1066D000836010BD121B1B68ECE700000A2938BF5D +:1066E0000A2170B504460D460A26601902F000FB27 +:1066F00002F0E8FA041BA54203D8751C04462E4696 +:10670000F3E70A2E04D90120BDE8704002F0C0BCB6 +:1067100070BD0000F8B5144B0D460A2A4FF00A0769 +:10672000D96103F11001826038BF0A224160196902 +:106730001446016048601861A81802F0C9FA02F016 +:10674000C1FA431B0646A34206D37C1C28192746E0 +:10675000354602F0CDFAF2E70A2F04D90120BDE850 +:10676000F84002F095BCF8BD68460020F8B5064632 +:106770000D4602F0A7FA0F4A134653F8107F9F42C6 +:1067800006D12A4601463046BDE8F840FFF7C2BFB1 +:10679000D169BB68441A2C1928BF2C46A34202D9E0 +:1067A0002946FFF79BFF224631460348BDE8F840E3 +:1067B000FFF77EBF6846002078460020C0E903232B +:1067C000002310B45DF8044B4361FFF7CFBF000016 +:1067D00010B5194C236998420DD08168D0E9003278 +:1067E00013605A609A680A449A60002303604FF06D +:1067F000FF33A36110BD0268234643F8102F536096 +:106800000022026022699A4203D1BDE8104002F0E2 +:1068100069BA936881680B44936002F053FA226965 +:10682000E1699268441AA242E4D91144BDE81040DB +:10683000091AFFF753BF00BF684600202DE9F04753 +:10684000DFF8BC8008F110072C4ED8F8105002F089 +:1068500039FAD8F81C40AA68031B9A423ED814445F +:106860004FF00009D5E90032C8F81C4013605A60A7 +:10687000C5F80090D8F81030B34201D102F032FAD6 +:1068800089F31188D5E9033128469847302383F3EB +:1068900011886B69002BD8D002F014FA6A69A0EB5A +:1068A000040982464A450DD2022002F0F1FB002283 +:1068B000D8F81030B34208D151462846BDE8F04719 +:1068C000FFF728BF121A2244F2E712EB0909294602 +:1068D000384638BF4A46FFF7EBFEB5E7D8F8103028 +:1068E000B34208D01444C8F81C00211AA960BDE8BE +:1068F000F047FFF7F3BEBDE8F08700BF7846002001 +:106900006846002038B502F0DDF9054AD2E90845AD +:10691000031B181945F10001C2E9080138BD00BF89 +:106920006846002010B560B9074804790368053C43 +:106930009B6818BF0124984708B144F0040420461E +:1069400010BD0124FBE700BFC8360020FFF7EABFF7 +:106950002DE9F047884617469A460446B0B90D4ED1 +:106960003579052D05D003240DE0013D15F0FF0517 +:106970000ED03268534639463046D2F8149042461B +:10698000C8470028F1D12046BDE8F0870424FAE783 +:106990000124F8E7C83600202DE9F047884617465D +:1069A0009A460446B0B90D4E3579052D05D003241D +:1069B0000DE0013D15F0FF050ED032685346394613 +:1069C0003046D2F818904246C8470028F1D12046F8 +:1069D000BDE8F0870424FAE70124F8E7C836002070 +:1069E00037B50C46154670B951B101290BD107488E +:1069F000694603681B6A984710B9019B04462B60DF +:106A0000204603B030BD0424FAE700BFC83600209A +:106A100000207047FEE70000704700004FF0FF3095 +:106A2000704700004B6843608B688360CB68C3602D +:106A30000B6943614B6903628B6943620B680360B6 +:106A40007047000008B53C4B40F2FF713B48D3F85B +:106A500088200A43C3F88820D3F8882022F4FF62F4 +:106A600022F00702C3F88820D3F88830344B1A6C20 +:106A70000A431A649A6E0A439A66324A9B6E11461A +:106A8000FFF7D0FF00F5806002F11C01FFF7CAFF9D +:106A900000F5806002F13801FFF7C4FF00F5806067 +:106AA00002F15401FFF7BEFF00F5806002F17001B2 +:106AB000FFF7B8FF00F5806002F18C01FFF7B2FF2D +:106AC00000F5806002F1A801FFF7ACFF00F58060DF +:106AD00002F1C401FFF7A6FF00F5806002F1E001BA +:106AE000FFF7A0FF00F5806002F1FC01FFF79AFFBD +:106AF00002F58C7100F58060FFF794FF01F09CFCBB +:106B0000114BD3F8902242F00102C3F89022D3F83F +:106B1000942242F00102C3F894220522C3F898207F +:106B20004FF06052C3F89C20084AC3F8A020BDE88B +:106B3000084000F0F3BC00BF0044025800000258B7 +:106B4000004502583499000800ED00E01F000803DA +:106B500008B501F079FEFFF7D5FC0D4BDA6B42F07A +:106B60004002DA635A6E22F040025A665B6E094BAD +:106B70001A6842F008021A601A6842F004021A60A9 +:106B800000F096FD00F032FBBDE8084000F0B4B81C +:106B90000045025800180248012070470020704745 +:106BA0007047000002290CD0032904D001290748AE +:106BB00018BF00207047032A05D8054800EBC20023 +:106BC0007047044870470020704700BF389B00089A +:106BD00054220020EC9A000870B59AB00546084689 +:106BE000144601A900F0C2F801A8FBF791F8431C74 +:106BF0000022C6B25B001046C5E9003423700323AF +:106C0000023404F8013C01ABD1B202348E4201D807 +:106C10001AB070BD13F8011B013204F8010C04F81E +:106C2000021CF1E708B5302383F311880348FFF70E +:106C30009FF8002383F3118808BD00BF1849002086 +:106C400090F8803003F01F02012A07D190F88120CC +:106C50000B2A03D10023C0E91D3315E003F06003C4 +:106C6000202B08D1B0F884302BB990F88120212A4C +:106C700003D81F2A04D8FFF75DB8222AEBD0FAE721 +:106C8000034A426707228267C3670120704700BF3B +:106C90004B22002007B5052917D8DFE801F01916A7 +:106CA00003191920302383F31188104A0121019020 +:106CB000FFF706F9019802210D4AFFF701F90D4887 +:106CC000FFF722F8002383F3118803B05DF804FB7B +:106CD000302383F311880748FEF7ECFFF2E73023F7 +:106CE00083F311880348FFF703F8EBE78C9A000859 +:106CF000B09A00081849002038B50C4D0C4C2A46B3 +:106D00000C4904F10800FFF767FF05F1CA0204F11E +:106D100010000949FFF760FF05F5CA7204F1180079 +:106D20000649BDE83840FFF757BF00BFF0610020BB +:106D300054220020689A0008729A0008819A00087C +:106D400070B5044608460D46FAF7E2FFC6B2204683 +:106D5000013403780BB9184670BD32462946FAF75C +:106D6000C3FF0028F3D10120F6E700002DE9F0472A +:106D700005460C46FAF7CCFF2B49C6B22846FFF76A +:106D8000DFFF08B10736F6B228492846FFF7D8FFDB +:106D900008B11036F6B2632E0BD8DFF88C80DFF81E +:106DA0008C90234FDFF894A02E7846B92670BDE86A +:106DB000F08729462046BDE8F04702F00DBA252E9F +:106DC0002ED1072241462846FAF78EFF70B9194B9B +:106DD000224603F10C0153F8040B8B4242F8040BDA +:106DE000F9D11B8807350E341380DDE708224946A8 +:106DF0002846FAF779FF98B9A21C0F4B197802328E +:106E00000909C95D02F8041C13F8011B01F00F0108 +:106E10005345C95D02F8031CF0D118340835C3E7A7 +:106E2000013504F8016BBFE7589B0008819A000800 +:106E30006F9B0008609B000800E8F11F0CE8F11F41 +:106E4000BFF34F8F044B1A695107FCD1D3F81021BF +:106E50005207F8D1704700BF0020005208B50D4B13 +:106E60001B78ABB9FFF7ECFF0B4BDA68D10704D501 +:106E70000A4A5A6002F188325A60D3F80C21D207CC +:106E800006D5064AC3F8042102F18832C3F804216A +:106E900008BD00BF4E64002000200052230167455A +:106EA00008B5114B1B78F3B9104B1A69510703D57C +:106EB000DA6842F04002DA60D3F81021520705D5B3 +:106EC000D3F80C2142F04002C3F80C21FFF7B8FFC1 +:106ED000064BDA6842F00102DA60D3F80C2142F086 +:106EE0000102C3F80C2108BD4E64002000200052AE +:106EF0000F289ABF00F58060400400207047000012 +:106F00004FF4003070470000102070470F2808B57C +:106F10000BD8FFF7EDFF00F500330268013204D112 +:106F200004308342F9D1012008BD0020FCE70000B5 +:106F30000F2838B505463FD8FFF782FF1F4CFFF7F3 +:106F40008DFF4FF0FF3307286361C4F814311DD85B +:106F50002361FFF775FF030243F02403E360E36856 +:106F600043F08003E36023695A07FCD42846FFF707 +:106F700067FFFFF7BDFF4FF4003100F0ABFA284682 +:106F8000FFF78EFFBDE83840FFF7C0BFC4F81031EF +:106F9000FFF756FFA0F108031B0243F02403C4F8D7 +:106FA0000C31D4F80C3143F08003C4F80C31D4F820 +:106FB00010315B07FBD4D9E7002038BD0020005218 +:106FC0002DE9F84F05460C46104645EA0203DE0659 +:106FD00002D00020BDE8F88F20F01F00DFF8BCB021 +:106FE000DFF8BCA0FFF73AFF04EB0008444503D1EB +:106FF0000120FFF755FFEDE720222946204602F049 +:10700000B3F810B920352034F0E72B4605F1200203 +:107010001F68791CDDD104339A42F9D105F1784318 +:107020001B481C4EB3F5801F1B4B38BF184603F19D +:10703000F80332BFD946D1461E46FFF701FF07606D +:10704000A5EB040C336804F11C0143F00203336028 +:10705000231FD9F8007017F00507FAD153F8042F51 +:107060008B424CF80320F4D1BFF34F8FFFF7E8FEBB +:107070004FF0FF332022214603602846336823F077 +:107080000203336002F070F80028BBD03846B0E746 +:10709000142100520C2000521420005210200052E3 +:1070A0001021005210B5084C237828B11BB9FFF706 +:1070B000D5FE0123237010BD002BFCD02070BDE84D +:1070C0001040FFF7EDBE00BF4E6400202DE9F04FE9 +:1070D0000D4685B0814658B111F00D0614BF20222F +:1070E000082211F00803019304D0431E034269D023 +:1070F000002435E0002E37D009F11F0121F01F09CF +:107100004FF00108314F05F00403DFF8CCA005EA89 +:10711000080BBBF1000F32D07869C0072FD408F1FB +:1071200001080C37B8F1060FF3D19EB9284D494636 +:10713000A819019201F02CFE0446002839D120360E +:10714000019AA02EF3D1494601F022FE0446002800 +:107150002FD1019A49461F4801F01AFE044660BB30 +:10716000204605B0BDE8F08F0029C9D10146284668 +:10717000029201F00DFE0446D8B9029AC0E713B19D +:1071800078694107CBD5AC0702D578698007C6D5A9 +:10719000019911B178690107C1D549460AEB481038 +:1071A000CDE9022301F0F4FD0446DDE902230028C5 +:1071B000B5D04A460021204601E04A460021FAF7B0 +:1071C000AFFDCDE70246002E96D199E7809B0008DF +:1071D0009064002050640020706400200021FFF7BC +:1071E00075BF00000121FFF771BF000070B5144D9D +:1071F0000124144E40F2FF3200210120FAF790FDE5 +:1072000006EB441001342A6955F80C1F01F0ACFD5F +:10721000062CF5D137254FF4C0542046FFF7E2FF86 +:10722000014628B122460848BDE8704001F09CBDE7 +:10723000C4EBC404013D4FEAD404EED170BD00BFDD +:10724000809B000870640020506400200421FFF738 +:107250003DBF00004843FFF7C1BF000008B101F087 +:1072600009BE7047B0F5805F10B5044607D8FFF738 +:10727000EDFF28B92046BDE81040FFF7AFBF002062 +:1072800010BD0000FFF7EABF70B5AAB140EA0103E4 +:1072900013F01F030FD1094C0144A5686D0706D5F3 +:1072A0002568A84203D366683544A94204D903334C +:1072B0000C34122BF1D10022104670BD809B0008C7 +:1072C00008B501F0EDFE034AD2E90032C01842EBE6 +:1072D000010108BD30650020434BD3E900232DE9AF +:1072E000F34113437CD0FFF7EBFF404A0023002714 +:1072F000F9F7A2F806460D463D4A0023F9F79CF837 +:107300000023144630462946394AF9F795F84FF4D8 +:1073100061613C23ADF80170B4FBF1F5B4FBF3F609 +:1073200001FB154103FB16464624B1FBF3F1314B3B +:10733000F6B28DF8004098423CD84FF0640C4FF400 +:10734000C87EA30704F26C7225D1B2FBFCF30CFBE0 +:10735000132313BBB2FBFEF30EFB1322B2FA82F32C +:107360005B0903F26D18621C8045D2B217D90FB1C8 +:107370008DF800400022204C4FF00C0C17460CFBFF +:107380000343D4B2013213F804C084450CD8A0EBF7 +:107390000C000127F5E70023E3E70123E1E7A0EB79 +:1073A000080014460127CCE70FB18DF80140431CBB +:1073B0008DF802309DF80100431C9DF80000503804 +:1073C000400640EA43509DF8023040EA034040EA5C +:1073D000560040EAC52040EA411002B0BDE8F08105 +:1073E0004FF40410F9E700BF3065002040420F0061 +:1073F0008051010090230B00C89B00080244074BFA +:10740000D2B210B5904200D110BD441C00B253F866 +:10741000200041F8040BE0B2F4E700BF50400058F0 +:107420000E4B30B51C6F240405D41C6F1C671C6FF9 +:1074300044F400441C670A4C02442368D2B243F46B +:1074400080732360074B904200D130BD441C51F83B +:10745000045B00B243F82050E0B2F4E70044025865 +:10746000004802585040005807B5012201A90020E9 +:10747000FFF7C4FF019803B05DF804FB13B50446A1 +:10748000FFF7F2FFA04205D0012201A900200194DC +:10749000FFF7C6FF02B010BD10B56424013C4FF4E5 +:1074A0007A70FFF7B7F814F0FF04F7D1084B4FF0EC +:1074B000807214249A6103F5805308229A61013C7A +:1074C0004FF47A70FFF7A6F814F0FF04F7D110BD5F +:1074D000000002580144BFF34F8F064B884204D38B +:1074E000BFF34F8FBFF36F8F7047C3F85C0220303C +:1074F000F4E700BF00ED00E00144BFF34F8F064BFF +:10750000884204D3BFF34F8FBFF36F8F7047C3F828 +:1075100070022030F4E700BF00ED00E0114BDA69A3 +:1075200052021ED59A69D00704D50F4A9A6002F11B +:1075300044329A600B4BDA69D107FCD41A6A22F400 +:1075400080021A629A6942F002029A61DA69D207ED +:10755000FCD49A6942F001029A61024AD369DB07BE +:10756000FCD47047002000523B2A190870B505462C +:1075700016460C4601201021FFF76CFE286046736A +:107580003CB1204636B1FFF761FE2B68186000B1B0 +:107590009C6070BDFFF726FEF7E70000F8B50F46C8 +:1075A0001546044648B905F11F010126386821F047 +:1075B0001F01FFF78FFF3046F8BD427B2946386830 +:1075C000FFF762FE06460028EDD13B686360A368C2 +:1075D000AB4210D213B12068FFF740FE637B284610 +:1075E0002BB1FFF733FE206020B9A060E3E7FFF77F +:1075F000F9FDF8E7A560206805F11F01012621F0DB +:107600001F013860FFF766FF2673D4E710B5044604 +:1076100040B10068884205D1606808B1FAF75AFBAA +:107620000023237310BD0000F8B50F46144605462D +:1076300048B904F11F010126386821F01F01FFF746 +:107640005BFF3046F8BD427B21463868FFF71CFEE1 +:1076500006460028EDD1AB68A34210D213B12868CA +:10766000FFF7FCFD6B7B20462BB1FFF7EFFD286099 +:1076700020B9A860E5E7FFF7B5FDF8E7AC60396829 +:1076800019B122462868FAF725FB286804F11F0182 +:10769000012621F01F013860FFF72EFF2E73D0E77F +:1076A00020B103688B4204BF0023037370470000BE +:1076B000034B1A681AB9034AD2F8D0241A607047EB +:1076C000386500200040025808B5FFF7F1FF024B73 +:1076D0001868C0F3806008BD38650020EFF30983A7 +:1076E000054968334A6B22F001024A6383F3098833 +:1076F000002383F31188704700EF00E0302080F30F +:10770000118862B60D4B0E4AD96821F4E061090474 +:10771000090C0A430B49DA60D3F8FC2042F080726E +:10772000C3F8FC20084AC2F8B01F116841F00101FB +:1077300011602022DA7783F82200704700ED00E024 +:107740000003FA0555CEACC5001000E0302310B59B +:1077500083F311880E4B5B6813F4006314D0F1EED1 +:10776000103AEFF309844FF08073683CE361094BF2 +:10777000DB6B236684F30988FEF796FE10B1064B97 +:10778000A36110BD054BFBE783F31188F9E700BF48 +:1077900000ED00E000EF00E02F04000832040008D4 +:1077A00070B5BFF34F8FBFF36F8F1A4A0021C2F835 +:1077B0005012BFF34F8FBFF36F8F536943F4003301 +:1077C0005361BFF34F8FBFF36F8FC2F88410BFF3C5 +:1077D0004F8FD2F8803043F6E074C3F3C900C3F38F +:1077E0004E335B0103EA0406014646EA817501391E +:1077F000C2F86052F9D2203B13F1200FF2D1BFF34F +:107800004F8F536943F480335361BFF34F8FBFF3FE +:107810006F8F70BD00ED00E0FEE70000214B2248B5 +:10782000224A70B5904237D3214BC11EDA1C121A7E +:1078300022F003028B4238BF00220021FAF770FACF +:107840001C4A0023C2F88430BFF34F8FD2F8803037 +:1078500043F6E074C3F3C900C3F34E335B0103EA9C +:107860000406014646EA81750139C2F86C52F9D224 +:10787000203B13F1200FF2D1BFF34F8FBFF36F8F77 +:10788000BFF34F8FBFF36F8F0023C2F85032BFF3A7 +:107890004F8FBFF36F8F70BD53F8041B40F8041B6C +:1078A000C0E700BFCC9C000834670020346700208C +:1078B0003467002000ED00E0054B996B21EA0001E0 +:1078C00099631A6E22EA00021A661B6E704700BFA7 +:1078D0000045025870B5D0E9244300224FF0FF352F +:1078E0009E6804EB42135101D3F80009002805DA21 +:1078F000D3F8000940F08040C3F80009D3F8000B2A +:10790000002805DAD3F8000B40F08040C3F8000BE4 +:10791000013263189642C3F80859C3F8085BE0D2F5 +:107920004FF00113C4F81C3870BD0000890141F00C +:107930002001016103699B06FCD41220FEF7FEBD05 +:1079400010B50A4C2046FEF799FA094BC4F890305E +:10795000084BC4F89430084C2046FEF78FFA074BCA +:10796000C4F89030064BC4F8943010BD3C6500203C +:1079700000000840049C0008D86500200000044076 +:10798000109C000870B503780546012B58D13F4B79 +:10799000D0F89040984254D13D4B0E2165209A6B0F +:1079A00042F000629A631A6E42F000621A661B6E21 +:1079B000384BD3F8802042F00062C3F88020D3F81F +:1079C000802022F00062C3F88020D3F88030FDF7D9 +:1079D00099FC314BE360314BC4F800380023D5F8F3 +:1079E0009060C4F8003EC02323604FF40413A363E7 +:1079F0003369002BFCDA01230C203361FEF79EFD76 +:107A00003369DB07FCD41220FEF798FD3369002BA5 +:107A1000FCDA00262846A660FFF75CFF6B68C4F816 +:107A20001068DB68C4F81468C4F81C6863BB1C4B9E +:107A3000A3614FF0FF336361A36843F00103A360C8 +:107A400070BD184B9842C9D1114B4FF080609A6BB2 +:107A500042F000729A631A6E42F000721A661B6E50 +:107A60000C4BD3F8802042F00072C3F88020D3F88A +:107A7000802022F00072C3F88020D3F88030FFF716 +:107A80001BFF0E214D20A2E7074BD1E73C650020EC +:107A900000450258004402584014004003002002F0 +:107AA000003C30C0D8650020083C30C0F8B5D0F8A4 +:107AB0009040054600214FF000662046FFF736FF54 +:107AC000D5F8941000234FF001128F684FF0FF306B +:107AD000C4F83438C4F81C2804EB431201339F4225 +:107AE000C2F80069C2F8006BC2F80809C2F8080BB6 +:107AF000F2D20B68D5F89020C5F898306362102355 +:107B00001361166916F01006FBD11220FEF716FD60 +:107B1000D4F8003823F4FE63C4F80038A36943F4B2 +:107B2000402343F01003A3610923C4F81038C4F8BC +:107B300014380B4BEB604FF0C043C4F8103B094BBB +:107B4000C4F8003BC4F81069C4F80039D5F898307F +:107B500003F1100243F48013C5F89820A362F8BD26 +:107B6000E09B000840800010D0F8902090F88A1028 +:107B7000D2F8003823F4FE6343EA0113C2F8003858 +:107B8000704700002DE9F84300EB8103D0F89050D6 +:107B90000C468046DA680FFA81F94801166806F04B +:107BA0000306731E022B05EB41134FF0000194BF37 +:107BB000B604384EC3F8101B4FF0010104F1100356 +:107BC00098BF06F1805601FA03F3916998BF06F554 +:107BD000004600293AD0578A04F158013743490139 +:107BE0006F50D5F81C180B430021C5F81C382B1812 +:107BF0000127C3F81019A7405369611E9BB3138A6C +:107C0000928B9B08012A88BF5343D8F89820981874 +:107C100042EA034301F140022146C8F89800284691 +:107C200005EB82025360FFF781FE08EB8900C36811 +:107C30001B8A43EA845348341E4364012E51D5F80D +:107C40001C381F43C5F81C78BDE8F88305EB4917BD +:107C5000D7F8001B21F40041C7F8001BD5F81C1809 +:107C600021EA0303C0E704F13F030B4A28462146FB +:107C700005EB83035A60FFF759FE05EB4910D0F876 +:107C8000003923F40043C0F80039D5F81C3823EA42 +:107C90000707D7E70080001000040002D0F8942006 +:107CA0001268C0F89820FFF715BE00005831D0F8D0 +:107CB000903049015B5813F4004004D013F4001FC6 +:107CC0000CBF0220012070474831D0F890304901A4 +:107CD0005B5813F4004004D013F4001F0CBF0220C3 +:107CE0000120704700EB8101CB68196A0B681360B3 +:107CF0004B6853607047000000EB810330B5DD68CE +:107D0000AA691368D36019B9402B84BF402313605C +:107D10006B8A1468D0F890201C4402EB4110013C9F +:107D200009B2B4FBF3F46343033323F0030343EAE0 +:107D3000C44343F0C043C0F8103B2B6803F0030377 +:107D4000012B0ED1D2F8083802EB411013F4807FDA +:107D5000D0F8003B14BF43F0805343F00053C0F809 +:107D6000003B02EB4112D2F8003B43F00443C2F85F +:107D7000003B30BD2DE9F041D0F8906005460C463F +:107D800006EB4113D3F8087B3A07C3F8087B08D504 +:107D9000D6F814381B0704D500EB8103DB685B6859 +:107DA0009847FA071FD5D6F81438DB071BD505EB23 +:107DB0008403D968CCB98B69488A5A68B2FBF0F65B +:107DC00000FB16228AB91868DA6890420DD2121A9E +:107DD000C3E90024302383F3118821462846FFF7A6 +:107DE0008BFF84F31188BDE8F081012303FA04F2CC +:107DF0006B8923EA02036B81CB68002BF3D0214609 +:107E00002846BDE8F041184700EB81034A0170B5F0 +:107E1000DD68D0F890306C692668E66056BB1A447D +:107E20004FF40020C2F810092A6802F00302012A68 +:107E30000AB20ED1D3F8080803EB421410F4807F85 +:107E4000D4F8000914BF40F0805040F00050C4F84E +:107E5000000903EB4212D2F8000940F00440C2F8D6 +:107E600000090122D3F8340802FA01F10143C3F8F2 +:107E7000341870BD19B9402E84BF4020206020689E +:107E80001A442E8A8419013CB4FBF6F440EAC4403B +:107E900040F00050C6E700002DE9F843D0F89060AC +:107EA00005460C464F0106EB4113D3F8088918F03C +:107EB000010FC3F808891CD0D6F81038DB0718D595 +:107EC00000EB8103D3F80CC0DCF81430D3F800E0E9 +:107ED000DA68964530D2A2EB0E024FF000091A6024 +:107EE000C3F80490302383F31188FFF78DFF89F3E3 +:107EF000118818F0800F1DD0D6F834380126A6401E +:107F0000334217D005EB84030134D5F89050D3F8F1 +:107F10000CC0E4B22F44DCF8142005EB0434D2F892 +:107F200000E05168714514D3D5F8343823EA0606C9 +:107F3000C5F83468BDE8F883012303FA01F2038928 +:107F400023EA02030381DCF80830002BD1D09847E4 +:107F5000CFE7AEEB0103BCF81000834228BF034615 +:107F6000D7F8180980B2B3EB800FE3D89068A0F17E +:107F7000040959F8048FC4F80080A0EB090898445C +:107F8000B8F1040FF5D818440B4490605360C8E76B +:107F90002DE9F84FD0F8905004466E69AB691E4049 +:107FA00016F480586E6103D0BDE8F84FFDF7D6BFD8 +:107FB000002E12DAD5F8003E9B0705D0D5F8003E1A +:107FC00023F00303C5F8003ED5F80438204623F01B +:107FD0000103C5F80438FDF7EFFF370505D5204646 +:107FE000FFF778FC2046FDF7D5FFB0040CD5D5F897 +:107FF000083813F0060FEB6823F470530CBF43F4FA +:10800000105343F4A053EB6031071BD56368DB6862 +:108010001BB9AB6923F00803AB612378052B0CD1A6 +:10802000D5F8003E9A0705D0D5F8003E23F00303AB +:10803000C5F8003E2046FDF7BFFF6368DB680BB163 +:1080400020469847F30200F1BA80B70226D5D4F84B +:10805000909000274FF0010A09EB4712D2F8003B3D +:1080600003F44023B3F5802F11D1D2F8003B002B4D +:108070000DDA62890AFA07F322EA0303638104EB4B +:108080008703DB68DB6813B1394620469847013720 +:10809000D4F89430FFB29B689F42DDD9F00619D521 +:1080A000D4F89000026AC2F30A1702F00F0302F438 +:1080B000F012B2F5802F00F0CA80B2F5402F09D13E +:1080C00004EB8303002200F58050DB681B6A9742B3 +:1080D00040F0B0803003D5F8185835D5E90303D502 +:1080E00000212046FFF746FEAA0303D501212046C2 +:1080F000FFF740FE6B0303D502212046FFF73AFE4F +:108100002F0303D503212046FFF734FEE80203D5F1 +:1081100004212046FFF72EFEA90203D505212046A3 +:10812000FFF728FE6A0203D506212046FFF722FE4C +:108130002B0203D507212046FFF71CFEEF0103D5D4 +:1081400008212046FFF716FE700340F1A780E907DB +:1081500003D500212046FFF79FFEAA0703D5012182 +:108160002046FFF799FE6B0703D502212046FFF753 +:1081700093FE2F0703D503212046FFF78DFEEE0661 +:1081800003D504212046FFF787FEA80603D5052165 +:108190002046FFF781FE690603D506212046FFF73A +:1081A0007BFE2A0603D507212046FFF775FEEB0567 +:1081B00074D520460821BDE8F84FFFF76DBED4F80E +:1081C00090904FF0000B4FF0010AD4F894305FFA12 +:1081D0008BF79B689F423FF638AF09EB4713D3F804 +:1081E000002902F44022B2F5802F20D1D3F80029D3 +:1081F000002A1CDAD3F8002942F09042C3F8002983 +:10820000D3F80029002AFBDB3946D4F89000FFF7A9 +:108210008DFB22890AFA07F322EA0303238104EB88 +:108220008703DB689B6813B13946204698470BF1FA +:10823000010BCAE7910701D1D0F80080072A02F1AB +:1082400001029CBF03F8018B4FEA18283FE704EBBB +:10825000830300F58050DA68D2F818C0DCF80820F3 +:10826000DCE9001CA1EB0C0C00218F4208D1DB687B +:108270009B699A683A449A605A683A445A6029E776 +:1082800011F0030F01D1D0F800808C4501F10101FC +:1082900084BF02F8018B4FEA1828E6E7BDE8F88FA3 +:1082A00008B50348FFF774FEBDE80840FFF74EBA73 +:1082B0003C65002008B50348FFF76AFEBDE80840AA +:1082C000FFF744BAD8650020D0F8903003EB411195 +:1082D000D1F8003B43F40013C1F8003B70470000A5 +:1082E000D0F8903003EB4111D1F8003943F400137A +:1082F000C1F8003970470000D0F8903003EB41110D +:10830000D1F8003B23F40013C1F8003B7047000094 +:10831000D0F8903003EB4111D1F8003923F4001369 +:10832000C1F8003970470000044BDA6B0243DA638E +:108330005A6E104358665B6E704700BF0045025886 +:1083400008B53C4B4FF0FF31D3F8802062F000427B +:10835000C3F88020D3F8802002F00042C3F88020C8 +:10836000D3F88020D3F88420C3F88410D3F8842075 +:108370000022C3F88420D3F88400D86F40F0FF4077 +:1083800040F4FF0040F4DF4040F07F00D867D86F32 +:1083900020F0FF4020F4FF0020F4DF4020F07F00B9 +:1083A000D867D86FD3F888006FEA40506FEA505012 +:1083B000C3F88800D3F88800C0F30A00C3F8880027 +:1083C000D3F88800D3F89000C3F89010D3F8900049 +:1083D000C3F89020D3F89000D3F89400C3F8941019 +:1083E000D3F89400C3F89420D3F89400D3F89800FD +:1083F000C3F89810D3F89800C3F89820D3F89800E1 +:10840000D3F88C00C3F88C10D3F88C00C3F88C2000 +:10841000D3F88C00D3F89C00C3F89C10D3F89C10C0 +:10842000C3F89C20D3F89C30FCF73AFABDE808402A +:1084300000F0D2B90044025808B50122504BC3F8ED +:108440000821504B5A6D42F002025A65DA6F42F031 +:108450000202DA670422DB6F4B4BDA605A68910440 +:10846000FCD54A4A1A6001229A60494ADA60002221 +:108470001A614FF440429A61434B9A699204FCD5C9 +:108480001A6842F480721A60424B1A6F12F4407FED +:1084900004D04FF480321A6700221A671A6842F03B +:1084A00001021A603B4B1A685007FCD500221A6182 +:1084B0001A6912F03802FBD1012119604FF0804196 +:1084C00059605A67344ADA62344A1A611A6842F4C7 +:1084D00080321A602F4B1A689103FCD51A6842F457 +:1084E00080521A601A689204FCD52D4A2D499A626E +:1084F00000225A63196301F57C01DA6301F5E77123 +:1085000099635A64284A1A64284ADA621A6842F05F +:10851000A8521A601F4B1A6802F02852B2F1285F65 +:10852000F9D148229A614FF48862DA6140221A62D6 +:108530001F4ADA641F4A1A651F4A5A651F4A9A651C +:1085400032231F4A1360136803F00F03022BFAD182 +:10855000104A136943F003031361136903F03803EE +:10856000182BFAD14FF00050FFF7DEFE4FF080409D +:10857000FFF7DAFE4FF00040BDE80840FFF7D4BE39 +:1085800000800051004502580048025800C000F029 +:1085900004000001004402580000FF010088900818 +:1085A0003220600063020901470E0508DD0BBF01A0 +:1085B00020000020000001100910E000000101105F +:1085C000002000524FF0B04208B5D2F8883003F0D6 +:1085D0000103C2F8883023B1044A13680BB1506814 +:1085E0009847BDE80840FFF7B1B800BFB466002067 +:1085F0004FF0B04208B5D2F8883003F00203C2F859 +:10860000883023B1044A93680BB1D0689847BDE81D +:108610000840FFF79BB800BFB46600204FF0B0429F +:1086200008B5D2F8883003F00403C2F8883023B1CB +:10863000044A13690BB150699847BDE80840FFF739 +:1086400085B800BFB46600204FF0B04208B5D2F83C +:10865000883003F00803C2F8883023B1044A9369D4 +:108660000BB1D0699847BDE80840FFF76FB800BF6D +:10867000B46600204FF0B04208B5D2F8883003F05D +:108680001003C2F8883023B1044A136A0BB1506A50 +:108690009847BDE80840FFF759B800BFB46600200E +:1086A0004FF0B04310B5D3F8884004F47872C3F8A3 +:1086B0008820A30604D5124A936A0BB1D06A984762 +:1086C000600604D50E4A136B0BB1506B9847210618 +:1086D00004D50B4A936B0BB1D06B9847E20504D5D8 +:1086E000074A136C0BB1506C9847A30504D5044A94 +:1086F000936C0BB1D06C9847BDE81040FFF726B8DB +:10870000B46600204FF0B04310B5D3F8884004F4AD +:108710007C42C3F88820620504D5164A136D0BB15C +:10872000506D9847230504D5124A936D0BB1D06D57 +:108730009847E00404D50F4A136E0BB1506E98476A +:10874000A10404D50B4A936E0BB1D06E9847620416 +:1087500004D5084A136F0BB1506F9847230404D512 +:10876000044A936F0BB1D06F9847BDE81040FEF7F5 +:10877000EDBF00BFB466002008B50348FCF73CFC21 +:10878000BDE80840FEF7E2BFC836002008B5034840 +:10879000FCF732FDBDE80840FEF7D8BF20390020C5 +:1087A00008B50348FCF728FDBDE80840FEF7CEBF3A +:1087B0008C39002008B50348FCF71EFDBDE80840D1 +:1087C000FEF7C4BFF839002008B500F0B7FCBDE8DB +:1087D0000840FEF7BBBF0000062108B50846FCF7BD +:1087E00091FD06210720FCF78DFD06210820FCF7EE +:1087F00089FD06210920FCF785FD06210A20FCF7EA +:1088000081FD06211720FCF77DFD06212820FCF7BD +:1088100079FD09217A20FCF775FD09213120FCF74B +:1088200071FD07213220FCF76DFD0C212620FCF79D +:1088300069FD0C212720FCF765FD0C215220BDE8C5 +:108840000840FCF75FBD000008B5FFF779FD00F0B8 +:1088500043FCFDF737F9FDF7D5F8FDF70DFBFDF704 +:10886000DFF9FEF79DF9BDE8084000F029BA0000E5 +:1088700030B50433039C0172002104FB0325C16061 +:10888000C0E90653049B0363059BC0E90000C0E9EF +:108890000422C0E90842C0E90A11436330BD000068 +:1088A0000022416AC260C0E90411C0E90A226FF0E7 +:1088B0000101FDF7EFBE0000D0E90432934201D17F +:1088C000C2680AB9181D7047002070470369196013 +:1088D0000021C2680132C260C269134482699342B6 +:1088E000036124BF436A0361FDF7C8BE38B504467F +:1088F0000D46E3683BB162690020131D1268A36254 +:108900001344E36207E0237A33B929462046FDF792 +:10891000A5FE0028EDDA38BD6FF00100FBE700008E +:10892000C368C269013BC3604369134482699342CF +:10893000436124BF436A436100238362036B03B135 +:108940001847704770B53023044683F31188866A50 +:108950003EB9FFF7CBFF054618B186F311882846CC +:1089600070BDA36AE26A13F8015B9342A36202D36B +:108970002046FFF7D5FF002383F31188EFE70000BF +:108980002DE9F84F04460E46174698464FF0300939 +:1089900089F311880025AA46D4F828B0BBF1000F4E +:1089A00009D141462046FFF7A1FF20B18BF3118882 +:1089B0002846BDE8F88FD4E90A12A7EB050B521A36 +:1089C000934528BF9346BBF1400F1BD9334601F1B5 +:1089D000400251F8040B914243F8040BF9D1A36A09 +:1089E000403640354033A362D4E90A239A4202D389 +:1089F0002046FFF795FF8AF31188BD42D8D289F34C +:108A00001188C9E730465A46F9F764F9A36A5E440B +:108A10005D445B44A362E7E710B5029C0433017236 +:108A200003FB0421C460C0E906130023C0E90A3334 +:108A3000039B0363049BC0E90000C0E90422C0E972 +:108A40000842436310BD0000026A6FF00101C2607A +:108A5000426AC0E904220022C0E90A22FDF71ABED8 +:108A6000D0E904239A4201D1C26822B9184650F8CD +:108A7000043B0B60704700231846FAE7C3680021E7 +:108A8000C2690133C36043691344826993424361FD +:108A900024BF436A4361FDF7F1BD000038B50446C9 +:108AA0000D46E3683BB1236900201A1DA262E2690A +:108AB0001344E36207E0237A33B929462046FDF7E1 +:108AC000CDFD0028EDDA38BD6FF00100FBE70000B6 +:108AD00003691960C268013AC260C26913448269BD +:108AE0009342036124BF436A036100238362036BE3 +:108AF00003B118477047000070B530230D46044697 +:108B0000114683F31188866A2EB9FFF7C7FF10B1AB +:108B100086F3118870BDA36A1D70A36AE26A0133EF +:108B20009342A36204D3E16920460439FFF7D0FFE2 +:108B3000002080F31188EDE72DE9F84F04460D463B +:108B4000904699464FF0300A8AF311880026B346C2 +:108B5000A76A4FB949462046FFF7A0FF20B187F327 +:108B600011883046BDE8F88FD4E90A073A1AA8EB15 +:108B70000607974228BF1746402F1BD905F140032F +:108B800055F8042B9D4240F8042BF9D1A36A4036D6 +:108B90004033A362D4E90A239A4204D3E169204610 +:108BA0000439FFF795FF8BF311884645D9D28AF334 +:108BB0001188CDE729463A46F9F78CF8A36A3D4477 +:108BC0003E443B44A362E5E7D0E904239A4217D12F +:108BD000C3689BB1836A8BB1043B9B1A0ED01360B0 +:108BE000C368013BC360C3691A4483699A42026146 +:108BF00024BF436A03610023836201231846704740 +:108C00000023FBE701F01F03F0B502F01F04560933 +:108C10005A1C0123B6EB511F50F8265003FA02F3F9 +:108C20004FEA511703F1FF333DBF50F82720C4F13D +:108C30002000134003EA05003BBF03FA00F225FAC7 +:108C400004F0E0401043F0BD70B57E227F21054660 +:108C5000FFF7D8FF18B1012819D0002070BD3E22BF +:108C600049212846FFF7CEFF2F220446312128460E +:108C7000FFF7C8FF0646013450220236532128462A +:108C8000B440FFF7BFFF093804FA00F0E6E73022EE +:108C900045212846FFF7B6FF01308002DEE70000DD +:108CA00090F8D63090F8D7201B0403EB026390F8BD +:108CB000D42090F8D500134403EB00207047000047 +:108CC00000F018BA014B586A704700BF000C004012 +:108CD000034B002258631A610222DA60704700BF1A +:108CE000000C0040014B0022DA607047000C00408D +:108CF000014B5863704700BF000C0040024B034A11 +:108D00001A60034A5A6070478C660020386700205A +:108D100000000220074B494210B55C68201A084049 +:108D20001968821A8A4203D3A24201D85A6010BD40 +:108D30000020FCE78C66002008B5302383F31188FF +:108D4000FFF7E8FF002383F3118808BD0448054BB3 +:108D500003600023C0E901330C3000F017B900BFF5 +:108D600094660020398D0008CB1D083A23F00703D4 +:108D7000591A521A10B4D2080024C0E90043846082 +:108D80000C301C605A605DF8044B00F0FFB8000026 +:108D90002DE9F74F364FCD1D8846002818BF0746EE +:108DA000082A4FEAD50538BF082207F10C003C1D00 +:108DB0009146019000F02CF9019809F10701C9F1E1 +:108DC000000E2246246864B900F02CF93B68CBB34E +:108DD00008224946E8009847044698B340E90278DB +:108DE00030E004EB010CD4F804A00CEA0E0C0AF1FC +:108DF0000106ACF1080304EBC6069E42E1D9A6EBDE +:108E00000C0CB5EBEC0F4FEAEC0BDAD89C421DD200 +:108E100004F10802AB45A3EB02024FEAE2026260F2 +:108E200009D9691CED4303EBC1025D445560256817 +:108E300043F8315022601C46C3F8048044F8087B94 +:108E400000F0F0F8204603B0BDE8F08FAA45216895 +:108E500002D111602346EEE7013504EBC50344F867 +:108E6000351003F10801761AF6105E601360F1E721 +:108E70009466002073B50446A0F1080550F8080C6C +:108E800054F8043C061D0C3007330190DB0844F80D +:108E9000043C00F0BDF8334601989E421A6801D0A8 +:108EA000AB4228D20AB1954225D244F8082C54F896 +:108EB000042C1D60013254F8081C05EBC206B142B7 +:108EC00006D14E68324444F8042C0A6844F8082C51 +:108ED0005E68711C03EBC1018D4207D154F8042C6C +:108EE000013232445A6054F8082C1A6002B0BDE8CE +:108EF000704000F097B81346CFE70000FEE700008F +:108F000070B51E4B0025044686B058600E460563BA +:108F10008163FEF7F3FB04F12803A5606563C4E9F0 +:108F20000A3304F11003C4E904334FF0FF33C4E9FA +:108F30000044C4E90635FFF7C5FE2B46024604F19E +:108F40003C012046C4E9082380230D4A6567FDF7EC +:108F5000FFFA7368E0600B4A03620123009280F815 +:108F600024306846F26801923269CDE90223064B4B +:108F7000CDE90435FDF720FB06B070BD1049002097 +:108F8000249C00081C9C0008FD8E00080023C0E9FA +:108F9000000083600361704770B51C4B0546846810 +:108FA000DE685CB3B44213D103690133036170BD61 +:108FB000A36094F8243083B1062B15D1A06A214612 +:108FC000D4E9003213605A60FDF72EFAA36A9C6858 +:108FD000B368A2689A42EBD306E0D4E90032204697 +:108FE00013605A60FDF730FA28463146FDF71CFA47 +:108FF000B5620620BDE87040FDF728BA03698660B7 +:1090000001330361336BC3603063D0E768460020EF +:1090100008B5302383F31188FFF7BEFF002383F3E5 +:10902000118808BD194BD96883688B4210B520D1CF +:10903000302383F311880269013A0261B2B90468EE +:10904000C368A0420B631ED04A6B9BB901238A60A0 +:10905000036103681A68026050601A6B8360C26023 +:1090600018631846FDF7F0F9FDF740FA002383F383 +:10907000118810BD1C68A34203D0A468A24238BF67 +:109080002246DB68E1E78260F0E700BF6846002027 +:10909000024A536B18435063704700BF6846002074 +:1090A00038B5EFF311859DB9EFF30584C4F30804D7 +:1090B000302334B183F31188FDF724FC85F3118844 +:1090C00038BD83F31188FDF71DFC84F3118838BD8A +:1090D000BDE83840FDF716BC0023054A19460133A8 +:1090E000102BC2E9001102F10802F8D1704700BF4D +:1090F000B46600200E4B9A6C42F008029A641A6F14 +:1091000042F008021A670B4A1B6FD36B43F0080347 +:10911000D363C722084B9A624FF0FF32DA62002213 +:109120009A615A63DA605A6001225A611A60704784 +:10913000004502580010005C000C0040094A08B5C8 +:109140001169D3680B40D9B29B076FEA0101116125 +:1091500007D5302383F31188FDF7EEF9002383F35D +:10916000118808BD000C004010B50139024490423E +:1091700001D1002005E0037811F8014FA34201D08E +:10918000181B10BD0130F2E7884210B501EB020454 +:1091900002D98442234607D8431EA14208D011F8C1 +:1091A000012B03F8012FF8E7024401468A4200D15F +:1091B00010BD13F8014D02F8014DF7E7C9B203469F +:1091C00010F8012B1AB18A42F9D1184670470029CC +:1091D00018BF0023F9E70000034611F8012B03F83C +:1091E000012B002AF9D1704710B50139034632B17D +:1091F00011F8014F03F8014B013A002CF7D11A4442 +:109200000021934200D110BD03F8011BF9E70000D3 +:109210004D4435002D2D0A002F6172647570696C04 +:109220006F742E6162696E002F6172647570696C73 +:109230006F742D7665726966792E6162696E002F92 +:109240006172647570696C6F742D666C6173682EE1 +:109250006162696E002F6172647570696C6F742D44 +:10926000666C61736865642E6162696E000000005F +:109270000000000000000000ED0E0008890F00084B +:1092800039110008C10F0008810F0008000000001C +:1092900000000000E90E0008950F00087111000899 +:1092A000E50E0008F10E000853544D333248373FA5 +:1092B0003F3F0053544D3332483733782F3732789D +:1092C0000053544D3332483734332F3735332F372B +:1092D0003530000001105A000310590001205800D9 +:1092E000032056002F000000537563636573736697 +:1092F000756C6C79206D6F756E7465642053444392 +:109300006172642028736C6F77646F776E3D25758A +:10931000290A0000EB769045584641542020200051 +:109320004641543332202020000000002A3A3C3EBF +:109330007C223F7F002B2C3B3D5B5D00435545412C +:109340004141414345454549494941414592924F33 +:109350004F4F5555594F554F9C4F9E9F41494F5523 +:10936000A5A5A6A7A8A9AAABACADAEAFB0B1B2B344 +:10937000B4414141B8B9BABBBCBDBEBFC0C1C2C394 +:10938000C4C54141C8C9CACBCCCDCECFD1D145454A +:109390004549494949D9DADBDCDD49DF4FE14F4F27 +:1093A0004F4FE6E8E85555555959EEEFF0F1F2F315 +:1093B000F4F5F6F7F8F9FAFBFCFDFEFF01030507EB +:1093C000090E10121416181C1E00000061001A036A +:1093D000E0001703F8000703FF0001007801000117 +:1093E000300132010601390110014A012E017901D3 +:1093F000060180014D004302810182018201840146 +:10940000840186018701870189018A018B018B0113 +:109410008D018E018F0190019101910193019401C1 +:10942000F60196019701980198013D029B019C016C +:109430009D0120029F01A001A001A201A201A4019F +:10944000A401A601A701A701A901AA01AB01AC01D2 +:10945000AC01AE01AF01AF01B101B201B301B30183 +:10946000B501B501B701B801B801BA01BB01BC0132 +:10947000BC01BE01F701C001C101C201C301C401A9 +:10948000C501C401C701C801C701CA01CB01CA0196 +:10949000CD011001DD0101008E01DE011201F30199 +:1094A0000300F101F401F401F80128012202120184 +:1094B0003A020900652C3B023B023D02662C3F024A +:1094C00040024102410246020A015302400081016A +:1094D0008601550289018A0158028F015A029001C2 +:1094E0005C025D025E025F0293016102620294010E +:1094F0006402650266026702970196016A02622CA5 +:109500006C026D026E029C01700271029D01730279 +:1095100074029F0176027702780279027A027B0256 +:109520007C02642C7E027F02A60181028202A901D4 +:109530008402850286028702AE014402B101B201B3 +:1095400045028D028E028F0290029102B7017B03C9 +:109550000300FD03FE03FF03AC030400860388033E +:1095600089038A03B1031103C2030200A303A30307 +:10957000C4030803CC0303008C038E038F03D803BA +:109580001801F2030A00F903F303F403F503F603E9 +:10959000F703F703F903FA03FA0330042003500436 +:1095A0001007600422018A043601C1040E01CF04B1 +:1095B0000100C004D004440161052604000000003D +:1095C0007D1D0100632C001E9601A01E5A01001F84 +:1095D0000806101F0606201F0806301F0806401F39 +:1095E0000606511F0700591F521F5B1F541F5D1FA6 +:1095F000561F5F1F601F0806701F0E00BA1FBB1F9B +:10960000C81FC91FCA1FCB1FDA1FDB1FF81FF91F96 +:10961000EA1FEB1FFA1FFB1F801F0806901F08069A +:10962000A01F0806B01F0400B81FB91FB21FBC1F3F +:10963000CC1F0100C31FD01F0206E01F0206E51F5A +:109640000100EC1FF31F0100FC1F4E21010032211D +:1096500070211002842101008321D0241A05302CAE +:109660002F04602C0201672C0601752C0201802C4E +:109670006401002D260841FF1A030000C700FC000A +:10968000E900E200E400E000E500E700EA00EB00AA +:10969000E800EF00EE00EC00C400C500C900E600E1 +:1096A000C600F400F600F200FB00F900FF00D6004F +:1096B000DC00F800A300D800D7009201E100ED0023 +:1096C000F300FA00F100D100AA00BA00BF00AE001A +:1096D000AC00BD00BC00A100AB00BB0091259225F1 +:1096E000932502252425C100C200C000A9006325DE +:1096F000512557255D25A200A500102514253425E8 +:109700002C251C2500253C25E300C3005A255425A3 +:1097100069256625602550256C25A400F000D00041 +:10972000CA00CB00C8003101CD00CE00CF00182503 +:109730000C2588258425A600CC008025D300DF00D9 +:10974000D400D200F500D500B500FE00DE00DA003E +:10975000DB00D900FD00DD00AF00B400AD00B100BA +:109760001720BE00B600A700F700B800B000A800A0 +:10977000B700B900B300B200A025A000100002405D +:10978000080002400008024000000B0028000240D0 +:10979000080002400408024006010C00400002409C +:1097A000080002400808024010020D005800024064 +:1097B000080002400C08024016030E007000024030 +:1097C0000C0002401008024000040F008800024014 +:1097D0000C0002401408024006051000A0000240E0 +:1097E0000C0002401808024010061100B8000240A8 +:1097F0000C0002401C08024016072F001004024013 +:1098000008040240200802400008380028040240F2 +:1098100008040240240802400609390040040240BE +:109820000804024028080240100A3A005804024086 +:10983000080402402C080240160B3B007004024052 +:109840000C04024030080240000C3C008804024036 +:109850000C04024034080240060D4400A0040240FB +:109860000C04024038080240100E4500B8040240C3 +:109870000C0402403C080240160F460001000000A4 +:109880000000000000960000000000000000000042 +:1098900000000000000000000000000000000000C8 +:1098A000996B00089D6B000899560008D159000873 +:1098B0002D560008555600087D560008155600081C +:1098C00000000000855A0008715A0008AD5A0008CF +:1098D000995A0008A55A0008915A00087D5A0008B4 +:1098E000695A0008B95A0008000000009D5B000892 +:1098F000895B0008C55B0008B15B0008BD5B000820 +:10990000A95B0008955B0008815B0008D15B00083B +:1099100000000000010000000000000063300000B3 +:109920001C9900080000000000000000E046002034 +:10993000104900200000812A00000000AAAAAAAA5B +:1099400000000024FFFE00000000000000A00A004C +:109950000001000000000000AAAAAAAA000000005E +:10996000FFFF000000000000000000001400AA56E5 +:1099700000000000AAAAAAAA14005554FFFF000084 +:1099800000000000CCCC0C0020681A000000000091 +:10999000AAAA8AAA10541500FFFF0000000C700745 +:1099A000770000004081020100100000AAAAAAAAC4 +:1099B00000410100F7FF00000000007007000000F8 +:1099C0000000000000000000AAAAAAAA00000000EF +:1099D000FFFF000000000000000000000000000089 +:1099E00000000000AAAAAAAA00000000FFFF0000D1 +:1099F0000000000000000000000000000000000067 +:109A0000AAAAAAAA00000000FFFF000000000000B0 +:109A1000000000000000000000000000AAAAAAAA9E +:109A200000000000FFFF0000000000000000000038 +:109A30000000000000000000AAAAAAAA000000007E +:109A4000FFFF000000000000000000000000000018 +:109A500000000000AAAAAAAA00000000FFFF000060 +:109A600000000000000000004375626550696C6FE3 +:109A70007400437562654F72616E67652B2D424CB1 +:109A8000002553455249414C2500000002000000CA +:109A900000000000BD5D00082D5E00084000400091 +:109AA000C0610020D0610020020000000000000022 +:109AB0000300000000000000755E000800000000C8 +:109AC00010000000E0610020000000000100000024 +:109AD000000000003C65002001010200956C0008B8 +:109AE000A56B0008416C0008256C000843000000CD +:109AF000F49A000809024300020100C03209040080 +:109B000000010202010005240010010524010001EA +:109B1000042402020524060001070582030800FF51 +:109B200009040100020A00000007050102400000CC +:109B3000070581024000000012000000409B000861 +:109B40001201100102000040AE2D58100002010267 +:109B5000030100000403090425424F41524425003B +:109B6000437562654F72616E6765506C7573003046 +:109B70003132333435363738394142434445460073 +:109B80000000002000000200020000000000003081 +:109B9000000004000800000000000024000008008D +:109BA000040000000004000000FC000002000000AF +:109BB00000000430008000000800000000000038B1 +:109BC00000000100010000001F1C1F1E1F1E1F1FA0 +:109BD0001E1F1E1F1F1D1F1E1F1E1F1F1E1F1E1F9D +:109BE00000000000D15F00088962000835630008AA +:109BF00040004000746600207466002001000000F0 +:109C00008466002080000000400100000800000081 +:109C100000010000001000000800000069646C658D +:109C2000000000006D61696E002C043804043808DF +:109C30000C10141C202425260000000000006404E1 +:109C40000100040000000000000C00102830340067 +:109C50001868FF7F010000002704000000000000DA +:109C600000001E0000000000FF0000001849002056 +:109C7000203900208C390020F83900200000000035 +:109C8000A892000883040000B3920008500400006A +:109C9000C1920008010000000000000000960000D2 +:109CA000000008009600000000080000040000000A +:109CB000549B0008000000000000000000000000AD +:0C9CC00000000000000000000000000098 :00000001FF diff --git a/Tools/bootloaders/CubeOrange_bl.bin b/Tools/bootloaders/CubeOrange_bl.bin index cd5b57818b..d569f83448 100755 Binary files a/Tools/bootloaders/CubeOrange_bl.bin and b/Tools/bootloaders/CubeOrange_bl.bin differ diff --git a/Tools/bootloaders/CubeOrange_bl.elf b/Tools/bootloaders/CubeOrange_bl.elf index f8477f312e..0aed51f975 100755 Binary files a/Tools/bootloaders/CubeOrange_bl.elf and b/Tools/bootloaders/CubeOrange_bl.elf differ diff --git a/Tools/bootloaders/CubeOrange_bl.hex b/Tools/bootloaders/CubeOrange_bl.hex index aea4d36ed1..c3335dd4d6 100644 --- a/Tools/bootloaders/CubeOrange_bl.hex +++ b/Tools/bootloaders/CubeOrange_bl.hex @@ -1,34 +1,34 @@ :020000040800F2 :1000000000060020E1020008E3020008E302000805 :10001000E3020008E3020008E3020008E30200082C -:10002000E3020008E3020008E30200089D8A0008DA +:10002000E3020008E3020008E3020008F17600089A :10003000E3020008E3020008E3020008E30200080C :10004000E3020008E3020008E3020008E3020008FC -:10005000E3020008E3020008497F0008757F0008FA -:10006000A17F0008CD7F0008F97F0008E3020008A7 -:10007000E3020008E3020008E3020008E3020008CC -:10008000E3020008E3020008E3020008E3020008BC -:10009000E3020008E3020008E302000825800008EC +:10005000E3020008E3020008FD8500082986000885 +:100060005586000881860008AD860008094600080C +:10007000314600085D46000889460008B54600087C +:10008000DD46000809470008E3020008E302000813 +:10009000E3020008E3020008E3020008D986000832 :1000A000E3020008E3020008E3020008E30200089C :1000B000E3020008E3020008E3020008E30200088C :1000C000E3020008E3020008E3020008E30200087C -:1000D000E3020008E30200081181000825810008FE -:1000E00089800008E3020008E3020008E302000838 -:1000F000E3020008E3020008E3020008E30200084C -:10010000E3020008FD8000084D810008E3020008BA +:1000D000E3020008E3020008C5870008D98700088A +:1000E0003D870008E3020008E3020008E30200087D +:1000F000E3020008E3020008E302000835470008B5 +:10010000E3020008B187000801880008E302000844 :10011000E3020008E3020008E3020008E30200082B -:10012000E3020008E3020008E3020008E30200081B -:10013000E3020008E3020008E3020008E30200080B +:100120006147000889470008B5470008E147000813 +:100130000D480008E3020008E3020008E30200089B :10014000E3020008E3020008E3020008E3020008FB -:10015000E3020008E3020008E3020008E3020008EB +:1001500035480008614800088D480008E30200089F :10016000E3020008E3020008E3020008E3020008DB -:10017000E3020008317C0008E3020008E302000803 -:10018000E3020008E302000839810008E3020008E6 +:10017000E3020008DD820008E3020008E302000851 +:10018000E3020008E3020008ED870008E30200082C :10019000E3020008E3020008E3020008E3020008AB :1001A000E3020008E3020008E3020008E30200089B :1001B000E3020008E3020008E3020008E30200088B :1001C000E3020008E3020008E3020008E30200087B -:1001D000E30200081D7C0008E3020008E3020008B7 +:1001D000E3020008C9820008E3020008E302000805 :1001E000E3020008E3020008E3020008E30200085B :1001F000E3020008E3020008E3020008E30200084B :10020000E3020008E3020008E3020008E30200083A @@ -51,22 +51,22 @@ :100310004F8FBFF36F8F40F20000C0F2F0004EF637 :100320008851CEF200010860BFF34F8FBFF36F8F8B :100330004FF00000E1EE100A4EF63C71CEF20001E3 -:100340000860062080F31488BFF36F8F06F0DCFE90 -:1003500006F0ECF84FF055301F491B4A91423CBF64 +:100340000860062080F31488BFF36F8F07F032FA3D +:1003500006F0A4FB4FF055301F491B4A91423CBFA9 :1003600041F8040BFAE71D49184A91423CBF41F895 :10037000040BFAE71A491B4A1B4B9A423EBF51F83D :10038000040B42F8040BF8E700201849184A914280 -:100390003CBF41F8040BFAE706F0F4FE06F04AF918 +:100390003CBF41F8040BFAE707F04AFA06F002FC0A :1003A000144C154DAC4203DA54F8041B8847F9E7A6 :1003B00000F0C4F9114C124DAC4203DA54F8041B9E -:1003C0008847F9E706F0DCBE000600200022002086 +:1003C0008847F9E707F032BA000600200022002033 :1003D0000000000808ED00E00000002000060020FA -:1003E000B896000800220020D8220020D822002041 -:1003F00020670020E0020008E0020008E002000898 +:1003E000989C00080022002074220020782200201F +:1003F00034670020E0020008E0020008E002000884 :10040000E00200082DE9F04F2DED108AC1F80CD064 :10041000D0F80CD0BDEC108ABDE8F08F002383F338 -:1004200011882846A047002005F072FEFEE705F07F -:10043000B1FD00DFFEE7000053B94AB9002908BF4B +:1004200011882846A047002006F01AF9FEE706F0DA +:1004300073F800DFFEE7000053B94AB9002908BF8E :1004400000281CBF4FF0FF314FF0FF3000F074B9AF :10045000ADF1080C6DE904CE00F006F8DDF804E01B :10046000DDE9022304B070472DE9F047089D0446FA @@ -114,29 +114,29 @@ :100700000646E3E61846F8E64B45A9D2B9EB0208DF :1007100064EB0C0E0138A3E74646EAE7204694E76F :100720004046D1E7D0467BE7023B614432E73046A2 -:1007300009E76444023842E7704700BF38B500F06B -:10074000DDFB06F0EFFB054606F0D4FC0446E0B9FD -:10075000104B9D421BD001339D4241F2883504BFAE -:1007600001240025002006F0E7FB0CB100F07AF828 -:1007700001F03AFB01F0F6F900F028FD08B100F0B5 -:1007800071F8284600F01CF9F9E70025EAE705466C -:10079000E8E700BF010007B008B501F0AFF9A0F12C +:1007300009E76444023842E7704700BF38B501F06A +:10074000FFF901F0AFFB06F0C1FE054606F0C6FF5B +:100750000446D0B90F4B9D4219D001339D4241F25E +:10076000883504BF01240025002006F0B9FE0CB135 +:1007700000F078F801F036FB00F026FD08B100F03B +:1007800071F8284600F01CF9F9E70025ECE705466A +:10079000EAE700BF010007B008B501F09DF9A0F13C :1007A00020035842584108BD07B541F21203022107 -:1007B00001A8ADF8043001F0BFF903B05DF804FB07 -:1007C00038B5302383F31188174803680BB105F05F -:1007D00083FD0023154A4FF47A71134805F072FD2A +:1007B00001A8ADF8043001F0ADF903B05DF804FB19 +:1007C00038B5302383F31188174803680BB106F05E +:1007D0002BF80023154A4FF47A71134806F01AF8E3 :1007E000002383F31188124C236813B12368013B63 :1007F0002360636813B16368013B63600D4D2B7820 -:1008000033B963687BB9022001F068FA3223636070 -:100810002B78032B07D163682BB9022001F05EFA15 -:100820004FF47A73636038BDD8220020C1070008F6 -:10083000F8230020F0220020084B187003280CD861 -:10084000DFE800F008050208022001F03DBA0220AE -:1008500001F030BA024B00225A607047F0220020AB -:10086000F8230020F8B5504B504A1C461968013156 +:1008000033B963687BB9022001F056FA3223636082 +:100810002B78032B07D163682BB9022001F04CFA27 +:100820004FF47A73636038BD78220020C107000856 +:100830009823002090220020084B187003280CD821 +:10084000DFE800F008050208022001F02BBA0220C0 +:1008500001F01EBA024B00225A607047902200201D +:1008600098230020F8B5504B504A1C4619680131B6 :1008700000F0998004339342F8D162684C4B9A425D :1008800040F291804B4B9B6803F1006303F500330A -:100890009A4280F08880002001F07EF90220FFF764 +:100890009A4280F08880002001F06CF90220FFF776 :1008A000CBFF454B0021D3F8E820C3F8E810D3F87C :1008B0001021C3F81011D3F81021D3F8EC20C3F89D :1008C000EC10D3F81421C3F81411D3F81421D3F881 @@ -156,15 +156,15 @@ :1009A00080F308882047F8BD0000020820000208F4 :1009B000FFFF0108002200200044025800ED00E083 :1009C0002DE9F04F93B0B44B2022FF2100900AA8EC -:1009D0009D6801F0B3F9B14A1378A3B90121B04879 +:1009D0009D6801F0B1F9B14A1378A3B90121B0487B :1009E00011700360302383F3118803680BB105F0A5 -:1009F00073FC0023AB4A4FF47A71A94805F062FCFE +:1009F0001BFF0023AB4A4FF47A71A94805F00AFFA8 :100A0000002383F31188009B13B1A74B009A1A604F :100A1000A64A1378032B03D000231370A24A536015 :100A20004FF0000A009CD3465646D146012001F003 -:100A30004BF924B19C4B1B68002B00F02682002050 -:100A400001F05CF80390039B002BF2DB012001F026 -:100A500031F9039B213B1F2BE8D801A252F823F068 +:100A300039F924B19C4B1B68002B00F02682002062 +:100A400001F04AF80390039B002BF2DB012001F038 +:100A50001FF9039B213B1F2BE8D801A252F823F07A :100A6000E10A0008090B00089D0B00082D0A000888 :100A70002D0A00082D0A00082F0C0008FF0D0008A1 :100A8000190D00087B0D0008A30D0008C90D000812 @@ -175,2253 +175,2341 @@ :100AD0002D0A00082D0A00082D0A00089D0B0008A9 :100AE0000220FFF759FE002840F0F981009B022107 :100AF00005A8BAF1000F08BF1C4641F21233ADF849 -:100B0000143001F019F891E74FF47A7000F0F6FF15 +:100B0000143001F007F891E74FF47A7000F0E4FF39 :100B1000071EEBDB0220FFF73FFE0028E6D0013F77 :100B2000052F00F2DE81DFE807F0030A0D1013360F -:100B30000523042105A8059300F0FEFF17E004211A +:100B30000523042105A8059300F0ECFF17E004212C :100B40005548F9E704215A48F6E704215948F3E7E4 -:100B50004FF01C08404608F1040801F01FF804217A -:100B6000059005A800F0E8FFB8F12C0FF2D10120A4 +:100B50004FF01C08404608F1040801F00DF804218C +:100B6000059005A800F0D6FFB8F12C0FF2D10120B6 :100B70004FF0000900FA07F747EA0B0B5FFA8BFB0F -:100B800001F028F926B10BF00B030B2B08BF002452 +:100B800001F026F926B10BF00B030B2B08BF002454 :100B9000FFF70AFE4AE704214748CDE7002EA5D01B :100BA0000BF00B030B2BA1D10220FFF7F5FD07463D -:100BB00000289BD00120002600F0EEFF0220FFF766 -:100BC0003BFE1FFA86F8404600F0F6FF0446B0B13F +:100BB00000289BD00120002600F0DCFF0220FFF778 +:100BC0003BFE1FFA86F8404600F0E4FF0446B0B151 :100BD000039940460136A1F140025142514100F0D3 -:100BE000FBFF0028EDD1BA46044641F21213022160 -:100BF00005A83E46ADF8143000F09EFF16E72546E6 +:100BE000E9FF0028EDD1BA46044641F21213022172 +:100BF00005A83E46ADF8143000F08CFF16E72546F8 :100C00000120FFF719FE244B9B68AB4207D9284609 -:100C100000F0C4FF013040F067810435F3E70025A0 +:100C100000F0B2FF013040F067810435F3E70025B2 :100C2000224BBA463E461D701F4B5D60A8E7002E62 :100C30003FF45CAF0BF00B030B2B7FF457AF02209C -:100C4000FFF7FAFD322000F059FFB0F10008FFF67F +:100C4000FFF7FAFD322000F047FFB0F10008FFF691 :100C50004DAF18F003077FF449AF0F4A08EB0503C7 :100C6000926893423FF642AFB8F5807F3FF73EAFC0 -:100C7000124BB845019323DD4FF47A7000F03EFF2C +:100C7000124BB845019323DD4FF47A7000F02CFF3E :100C80000390039A002AFFF631AF039A0137019BC4 -:100C900003F8012BEDE700BF00220020F423002021 -:100CA000D8220020C1070008F8230020F0220020ED -:100CB00004220020082200200C220020F422002020 +:100C900003F8012BEDE700BF002200209423002081 +:100CA00078220020C107000898230020902200200D +:100CB00004220020082200200C2200209422002080 :100CC000C820FFF769FD074600283FF40FAF1F2D2E :100CD00011D8C5F120020AAB25F003008449424532 -:100CE000184428BF4246019201F002F8019AFF2100 -:100CF0007F4801F023F84FEAA803C8F387027C4934 -:100D00002846019301F022F8064600283FF46DAF13 +:100CE000184428BF4246019201F000F8019AFF2102 +:100CF0007F4801F021F84FEAA803C8F387027C4936 +:100D00002846019301F020F8064600283FF46DAF15 :100D1000019B05EB830533E70220FFF73DFD00282B -:100D20003FF4E4AE00F076FF00283FF4DFAE00278A +:100D20003FF4E4AE00F064FF00283FF4DFAE00279C :100D3000B846704B9B68BB4218D91F2F11D80A9B2D :100D400001330ED027F0030312AA134453F8203CBA -:100D500005934046042205A9043701F0A5F8804612 -:100D6000E7E7384600F01AFF0590F2E7CDF8148067 -:100D7000042105A800F0E0FE02E70023642104A896 -:100D8000049300F0CFFE00287FF4B0AE0220FFF7FE -:100D900003FD00283FF4AAAE049800F031FF05904F -:100DA000E6E70023642104A8049300F0BBFE0028BA +:100D500005934046042205A9043701F003F98046B3 +:100D6000E7E7384600F008FF0590F2E7CDF8148079 +:100D7000042105A800F0CEFE02E70023642104A8A8 +:100D8000049300F0BDFE00287FF4B0AE0220FFF710 +:100D900003FD00283FF4AAAE049800F01FFF059061 +:100DA000E6E70023642104A8049300F0A9FE0028CC :100DB0007FF49CAE0220FFF7EFFC00283FF496AED4 -:100DC000049800F01FFFEAE70220FFF7E5FC002887 -:100DD0003FF48CAE00F02EFFE1E70220FFF7DCFCD1 -:100DE00000283FF483AE05A9142000F029FF074630 -:100DF0000421049004A800F09FFE3946B9E7322090 -:100E000000F07CFE071EFFF671AEBB077FF46EAEEE +:100DC000049800F00DFFEAE70220FFF7E5FC002899 +:100DD0003FF48CAE00F01CFFE1E70220FFF7DCFCE3 +:100DE00000283FF483AE05A9142000F017FF074642 +:100DF0000421049004A800F08DFE3946B9E73220A2 +:100E000000F06AFE071EFFF671AEBB077FF46EAE00 :100E1000384A07EB0903926893423FF667AE022017 :100E2000FFF7BAFC00283FF461AE27F003074F44F8 -:100E3000B9453FF4A5AE484609F1040900F0AEFEFD -:100E40000421059005A800F077FEF1E74FF47A70D1 -:100E5000FFF7A2FC00283FF449AE00F0DBFE0028BB +:100E3000B9453FF4A5AE484609F1040900F09CFE0F +:100E40000421059005A800F065FEF1E74FF47A70E3 +:100E5000FFF7A2FC00283FF449AE00F0C9FE0028CD :100E600044D00A9B01330BD008220AA9002000F0CD -:100E70006DFF00283AD02022FF210AA800F05EFF73 -:100E8000FFF792FC1C4805F049F913B0BDE8F08F5C +:100E70006BFF00283AD02022FF210AA800F05CFF77 +:100E8000FFF792FC1C4805F0F1FB13B0BDE8F08FB2 :100E9000002E3FF42BAE0BF00B030B2B7FF426AE92 -:100EA0000023642105A8059300F03CFE07460028B6 +:100EA0000023642105A8059300F02AFE07460028C8 :100EB0007FF41CAE0220FFF76FFC804600283FF451 -:100EC00015AEFFF771FC41F2883005F027F905985F -:100ED00000F0C8FF46463C4600F07CFFA6E506460B +:100EC00015AEFFF771FC41F2883005F0CFFB0598B5 +:100ED00000F0C6FF46463C4600F07AFFA6E506460F :100EE0004EE64FF0000901E6BA467EE637467CE65C -:100EF000F422002000220020A0860100704700009C -:100F00007047000070470000704700002DE9F04175 -:100F100000F58037044616463B7C5BB9C06810304C -:100F2000204400F0E5FEE5683544B5F5004FE56086 -:100F300002D816B1BDE8F081DEB905F07F0605F1F3 -:100F400010000021C6F180062044F6B232462E443D -:100F500000F0F4FEA06804F11008324600F10060D1 -:100F6000414600F5003005F0A5FD30B901233B7482 -:100F7000E0E74FF400463546ECE7A26805F11001C2 -:100F8000404632442144A260E268521BE26000F015 -:100F9000AFFE0220BDE8F04100F0A0BE183000F026 -:100FA000E9BC000010B5044607F028FE204610BD3D -:100FB00010B5044607F022FE204610BDC3B280B231 -:100FC000A3F14102052A02D8373800B27047613BCD -:100FD000052B94BF57383038F7E70000F8B50446C2 -:100FE0001546084603220C4900F08CFE014688B9DC -:100FF00008346F1C15F91100FFF7E0FF064617F9DA -:1010000011000131FFF7DAFF102940EA061004F859 -:10101000010BEFD1F8BD00BF748D00082DE9F04F32 -:10102000ADF53F7D0746416801222AA802F030FE57 -:10103000002840F087800646824681461125DFF869 -:101040000C81DFF80CB101AB4FF4805241462AA865 -:1010500002F07EFF002875D1019AB2F5805F71D849 -:10106000002A65D00446019A9442ECD2282D0FD074 -:1010700008DC132D2DD01E2D39D0112D13D00134A5 -:10108000A4B2F0E7322D2DD0372D2FD02D2DF6D153 -:101090003B68121B08EB040138461B692D25984755 -:1010A000BDF80440EBE7121B022A09D9594608EBA8 -:1010B000040000F027FE18B902342825A4B2DEE7A8 -:1010C00018F804303A2B3DD00A2B1CBFA14613253B -:1010D000D5E718F804300A2B34D03A2B04BFA246C7 -:1010E0003225CCE718F80430202BC8D0264618F853 -:1010F00004300A2B1AD1AAEB090208EB090102A855 -:1011000011254F2A28BF4F2207F020FEA21B08EB13 -:10111000060116A84F2A28BF4F2207F017FE3B688A -:1011200016AA02A9DB6838469847A8E71E25A6E755 -:101130003B68384604491B69984701200DF53F7DFF -:10114000BDE8F08F0020F9E7768E0008002400202B -:10115000788D000800F1180110B5044686B00846E5 -:10116000019100F0F1FB2046FFF758FF60B10199B3 -:1011700002A800F049FC102204F1080102A807F0BF -:1011800061FDB0FA80F0400906B010BD70B50446AC -:101190000025EEB2304600F00FFD58B10021304678 -:1011A000013500F019FD08B9002070BD022000F0E3 -:1011B00095FDEEE72046FFF731FF0028F4D004F557 -:1011C0008034207C80F00100EFE70000F0B5C9B06A -:1011D00005F0C0FE00F096FE18B90025284649B07B -:1011E000F0BD69462A4802F075FF00284BD1294C12 -:1011F000204602F09FFF284802F09CFF274802F09B -:1012000099FF2146224803F011F80028E5D170200B -:1012100007F0F6FC064610B1214B446003603368CA -:1012200030469B689847054600282ED01A4F19482B -:10123000394602F0FBFF05460028CED1194807F0D9 -:10124000DFFC044638B1184B4760036000F580337B -:10125000C0E902551D74236820469B6898470546DF -:1012600028B10E490C4802F0E1FF0028B5D13368DF -:1012700030465B6898471CB1236820465B689847F6 -:1012800000F028FEAAE70025FAE70446EFE700BFD2 -:101290007C8D00088C8D0008A38D0008B98D000896 -:1012A000DC8D000814000100F88D00082DE9F04FD6 -:1012B000D44A8DB00B68D0F804A001931A44036897 -:1012C000D14E1A44D1F81C90DFF8B4C3DFF8B4B3A0 -:1012D000D0E90234634003EA0A03634013444A68D6 -:1012E00002920AEB7363029CC84A2244C4682244F7 -:1012F00084688AEA04051D40654015448A680392A3 -:1013000003EB3555039CC24A2244846822448AEA8E -:1013100003042C4084EA0A041444CA6805EBF4343C -:101320000492164483EA0502224056445A4032444D -:101330000E69059604EBB222059FB64E3E441E444C -:1013400085EA040313406B4033444E69069602EB72 -:101350007363069FB04E3E442E4484EA02051D404E -:10136000654035448E69079603EB3555079FAB4EB4 -:101370003E44264482EA03042C4054403444A84EA0 -:101380004E4405EBF434164483EA050222405A40E9 -:1013900032440E6A089604EBB222089FA14E3E44E6 -:1013A0001E4485EA040313406B4033444E6A099699 -:1013B00002EB7363099F9C4ED1F830E03E44D1F8B4 -:1013C0003880F3442E4484EA02051D4065403544CC -:1013D0008E6AA6F5244703EB35550A964F3F2744FE -:1013E00082EA03042C4054403C44CF6A0B9705EB3F -:1013F000F4340B9E8D4F3744029E174483EA050256 -:1014000022405A403A448A4F774404EBB2221F44A8 -:1014100085EA040313406B403B444F6BBC4402EB32 -:101420007363654484EA020C0CEA030C8CEA040C36 -:101430006544DFF854C2C44403EB3555A44482EA42 -:1014400003042C4054406444D1F83CC0794905EB76 -:10145000F4346144114483EA050222405A400A44AC -:10146000754904EBB2223144079E194484EA020311 -:101470002B4063400B44714902EBF36331440B9EF4 -:101480000D4482EA03012140514029446C4D03EB95 -:10149000F1513544019E254483EA010414405C4027 -:1014A0002C44684D01EBB4443544069E154481EA52 -:1014B00004021A404A402A44634D04EB3232354458 -:1014C0000A9E1D4484EA02030B4063402B445F4D97 -:1014D00002EBF3633544059E0D4482EA030121408B -:1014E000514029445A4D03EBF1516544254483EAA8 -:1014F000010414405C402C44564D01EBB444354487 -:10150000099E154481EA04021A404A402A44524D79 -:1015100004EB32323544049E1D4484EA02030B403E -:1015200063402B444D4D02EBF36345440D4482EA86 -:101530000301214051402944494D03EBF151354409 -:10154000089E2C4483EA010515405D402C44454D1E -:1015500001EBB4443544039E2A4481EA04051D404E -:101560004D402A44404D04EB32323D442B4484EA42 -:10157000020593440D4065402B443C4D02EBF36360 -:101580003544069E294482EA0305254055402944F6 -:10159000374D03EBF1514D442C4483EA01051540CE -:1015A0005D40254401EBB54581EA050404EA0302E8 -:1015B0004A405A44A6F5B82B089E05EB3232ABF2EE -:1015C000BE6B54405B4423442A4C344402EB3373D7 -:1015D0000B9E0C4485EA020159402144264C3444B8 -:1015E00003EB7151029E254482EA03044C402544DA -:1015F000224C444401EB3545144483EA01026A401D -:10160000224443E078A46AD7EECEBDC156B7C7E8FE -:10161000DB702024AF0F7CF52AC68747134630A81D -:10162000019546FDD8988069AFF7448BBED75C8999 -:101630002211906B2108B44962251EF640B340C0C8 -:10164000515A5E26AAC7B6E95D102FD6531444023C -:1016500081E6A1D8C8FBD3E7E6CDE121D60737C3A1 -:10166000870DD5F4ED145A4505E9E3A9F8A3EFFC7D -:10167000D9026F6781F6718722619D6D0C38E5FD97 -:10168000937198FD8A4C2A8D8E4379A6934C3444ED -:1016900005EB7222059E1C4481EA05035340234456 -:1016A0008F4C344402EB33730A9E0C4485EA0201EA -:1016B000594021448B4C4C4403EB7151254482EA40 -:1016C00003044C402C44884D354401EB3444019EC6 -:1016D000154483EA010262402A44844D3D4404EBF0 -:1016E00072221D4481EA040353402B44804D35444B -:1016F00002EB3373049E294484EA02055D402944C9 -:101700007C4D354403EB7151079E254482EA030466 -:101710004C402C44784D354401EB3444099E2A4416 -:1017200083EA010565401544744A324404EB75258B -:10173000039E134481EA04026A401A44704B7344C6 -:1017400005EB32720B4484EA0501514019446D4B9C -:10175000634402EB71511C4485EA02034B401C4474 -:10176000694B334401EB3444019E1D4482EA01037A -:1017700063402B44654D04EB73233544069E1544AA -:1017800063EA010262402A44614D03EBB2624D44B8 -:1017900062EA040929445F4D89EA03094544494442 -:1017A0002C445D4D02EBB1513544049E61EA0308BF -:1017B0001D4488EA0208444401EB744464EA0203CD -:1017C0004B402B44554D04EBF323754463EA010E63 -:1017D00015448EEA040E0EEB0502514D03EBB26286 -:1017E000354462EA040E29440A9D8EEA030EA5F5EB -:1017F00080164C4D7144A6F6833602EBB151264457 -:1018000061EA030454403444029E01EB74443544BD -:1018100064EA02061D444E407319089E424D04EBD3 -:10182000F323354463EA01061544664072193F4DBF -:1018300003EBB262654462EA040629443C4D5E4013 -:101840003144079E02EBB151354461EA03062C4452 -:10185000384D56403D443444059E1D4401EB7444CC -:1018600064EA02034B402B44334D04EBF32335442D -:101870000B9E154463EA010262402A442F4D03EB9C -:10188000B2623544039E0D4462EA04015940294482 -:101890002B4D02EBB15135442A4E254461EA030435 -:1018A00054402C44099D01EB74442E4464EA020523 -:1018B0001E4485EA01039D1903681A440AEB0403D8 -:1018C00003EBF5230260436083681C44C36819443A -:1018D0008460C1600DB0BDE8F08F00BF44EABEA4D3 -:1018E000A9CFDE4B604BBBF670BCBFBEC67E9B284B -:1018F000FA27A1EA8530EFD4051D880439D0D4D960 -:10190000E599DBE6F87CA21F6556ACC4442229F4B5 -:1019100097FF2A43A72394AB39A093FCC3595B6577 -:1019200092CC0C8FD15D84854F7EA86FE0E62CFEB3 -:10193000144301A3A111084E827E53F735F23ABD3C -:10194000BBD2D72A91D386EB094B036003F18833CE -:10195000436003F12943A3F59613A3F68B638360D9 -:10196000A3F18833C3600023C0E90433704700BF8C -:10197000012345672DE9F8431446026905460E46E2 -:10198000E300C2F3C50800F118079B18036122BFEA -:1019900043690133436112F4FC7F436903EB5473E1 -:1019A000436114D0C8F1400907EB08004C4504D24C -:1019B0002246BDE8F84307F055B9403C4A464E443C -:1019C00007F050F9444439462846FFF76FFCA0461B -:1019D00006EB0409B8F13F0FA9EB08010AD9402230 -:1019E000384607F03FF939462846A8F14008FFF786 -:1019F0005DFCEFE7A1096FF03F02384602FB0142B0 -:101A000006EB8111D5E7000070B50B6901F11805EF -:101A100006460C46C3F3C503EA18501C8022EA545C -:101A2000C3F13F02072A1FD8002100F087F9294699 -:101A30002046FFF73BFC38220021284600F07EF9C3 -:101A4000236929462046236563696365FFF72EFCF9 -:101A500021461022304607F005F920465822002181 -:101A6000BDE8704000F06AB9C3F137020021E5E734 -:101A70002DE9F84F4FF47A7306460D46002402FB19 -:101A800003F7DFF85080DFF8509098F900305FFAE4 -:101A900084FA5A1C01D0A34210D159F824002A46D6 -:101AA00031460368D3F820B03B46D847854205D17C -:101AB000074B012083F800A0BDE8F88F0134042C07 -:101AC000E3D14FF4FA7004F029FB0020F4E700BFE3 -:101AD00044340020102200201422002070B5044657 -:101AE0004FF47A76412C254628BF412506FB05F0A8 -:101AF00004F014FB641BF5D170BD0000002307B592 -:101B0000024601210DF107008DF80730FFF7B0FF05 -:101B100020B19DF8070003B05DF804FB4FF0FF30E3 -:101B2000F9E700000A46042108B5FFF7A1FF80F09D -:101B30000100C0B2404208BD074B0A4630B41978D4 -:101B4000064B53F82140014623682046DD69044BCB -:101B5000AC4630BC604700BF443400201422002053 -:101B6000A086010070B50A4E00240A4D04F046FF1D -:101B7000308028683388834208D904F03BFF2B6803 -:101B800004440133B4F5003F2B60F2D370BD00BFB5 -:101B9000463400200034002004F0FEBF00F1006055 -:101BA00000F500300068704700F10060920000F519 -:101BB000003004F07FBF0000054B1A68054B1B88FE -:101BC0009B1A834202D9104404F014BF00207047CE -:101BD000003400204634002038B50446074D29B1B2 -:101BE00028682044BDE8384004F01CBF2868204421 -:101BF00004F006FF0028F3D038BD00BF00340020F9 -:101C00000020704700F1FF5000F58F10D0F8000859 -:101C100070470000064991F8243033B100230822B0 -:101C2000086A81F82430FFF7BFBF0120704700BF6A -:101C300004340020014B1868704700BF0010005C9E -:101C4000194B01380322084470B51D68174BC5F3C2 -:101C50000B042D0C1E88A6420BD15C680A46013C81 -:101C6000824213460FD214F9016F4EB102F8016B94 -:101C7000F6E7013A03F10803ECD181420B4602D2A8 -:101C80002C2203F8012B0424094A1688AE4204D101 -:101C9000984284BF967803F8016B013C02F104027C -:101CA000F3D1581A70BD00BF0010005C2422002040 -:101CB000388E0008022803D1024B4FF080529A61FF -:101CC000704700BF00100258022803D1024B4FF4A6 -:101CD00080529A61704700BF00100258022804D158 -:101CE000024A536983F480535361704700100258CD -:101CF000002310B5934203D0CC5CC4540133F9E700 -:101D000010BD0000013810B510F9013F3BB191F949 -:101D100000409C4203D11AB10131013AF4E71AB1F3 -:101D200091F90020981A10BD1046FCE703460246C0 -:101D3000D01A12F9011B0029FAD170470244034658 -:101D4000934202D003F8011BFAE770472DE9F843EC -:101D50001F4D14460746884695F8242052BBDFF8ED -:101D600070909CB395F824302BB92022FF2148466F -:101D70002F62FFF7E3FF95F824004146C0F1080207 -:101D800005EB8000A24228BF2246D6B29200FFF7A0 -:101D9000AFFF95F82430A41B17441E449044E4B2CE -:101DA000F6B2082E85F82460DBD1FFF733FF002858 -:101DB000D7D108E02B6A03EB82038342CFD0FFF731 -:101DC00029FF0028CBD10020BDE8F8830120FBE7E4 -:101DD00004340020024B1A78024B1A70704700BF7F -:101DE0004434002010220020F8B5194C194803F0A3 -:101DF00083FC2146174803F0ABFC24684FF47A704B -:101E0000154ED4F89020154DD2F80438114F43F0F8 -:101E10000203C2F80438FFF761FE2046104903F0C0 -:101E2000A5FDD4F890200424D2F8043823F002034E -:101E3000C2F804384FF4E133336055F8040BB8426C -:101E400002D0314603F0B6FB013CF6D1F8BD00BF2D -:101E500038950008F04800202C340020142200207F -:101E6000409500080C4B70B50C4D04461E780C4B89 -:101E700055F826209A420DD00A4B00211822184608 -:101E8000FFF75CFF0460014655F82600BDE870408E -:101E900003F090BB70BD00BF44340020142200202A -:101EA000F04800202C34002030B50A44084D9142FF -:101EB0000DD011F8013B5840082340F30004013BCA -:101EC0002C4013F0FF0384EA5000F6D1EFE730BD59 -:101ED0002083B8ED10B5084C01220849002001F01C -:101EE000B3FE23783BB1064803F0DCFA044803F064 -:101EF0000FFB0023237010BD48340020488E0008DB -:101F0000A43600201D482DE9F041036D2BB90122B4 -:101F10004FF48051503005F05FF8194E33780BB113 -:101F2000FFF7D8FF0324174F4FF00008134D154952 -:101F30002846C7F8048003F0DDFA284603F016F9B6 -:101F400048B1013C284603F0E3FA14F0FF04EED157 -:101F5000204634700FE00C4901220C4801F074FE59 -:101F6000014618B1284603F09DFAEAE7084800F058 -:101F700011F801203070BDE8F08100BFA4360020C8 -:101F8000483400203C220020488E00084C340020B9 -:101F90004C8E00080FB4002004B0704700687047F2 -:101FA00003460068596870470B0A017043700B0CB8 -:101FB000090E8370C1707047110A0270037141707D -:101FC000110C120E8170C2701A0A42711A0C1B0E8B -:101FD0008271C37170470000C36A0239023B8B42B1 -:101FE00083BF4389006C01FB0300002070470000A1 -:101FF000C2F307238A76CB760378032B01BF120C3A -:102000000A75120A4A75704700F10B010022D301CC -:1020100043EA520310F8012B52FA83F38842DAB2F2 -:10202000F5D110467047000010B5417804460020F5 -:10203000013102464901022A16BFA35C032203EBC9 -:10204000C03302F101021EBF9BB203EB500398B2F2 -:102050009142F0D810BD000002684AB1134613F84F -:10206000011B1F290DD93A29F9D1911C8B4202D0AD -:102070004FF0FF3070471278302AF9D1036000200A -:102080007047014B187870479836002038B50D46D8 -:10209000044618B9092000232B6038BD0368002BC3 -:1020A000F8D01A78002AF5D08188DA889142F1D1E7 -:1020B000587804F0BFF910F00100EBD12368EBE78A -:1020C00038B50D4640F25231144602F0B9F9FF28F6 -:1020D00007D9012C0BD9030A022468702B70204603 -:1020E00038BD30B1002CFAD001242870F7E7002465 -:1020F000F5E70446F3E700002DE9F8430026D0F8A1 -:10210000008005460C468E76836B002B4AD098F8EB -:102110000030042B4BD133463546402720E0B7F53D -:10212000187F80F0C480F90606F1010608BF023767 -:10213000D05B02372BB900F5205292B2B2F5006F96 -:102140000DD305F11A01C5F1FF0240EA0340214415 -:10215000FFF7B6FF002800F0AA80054400200346E0 -:10216000D8F8102092F82310B142D8D8002B40F0B4 -:102170009E80002D00F09B8000232544AB76637386 -:10218000D8F81020137903F03701DB0621730BD444 -:1021900002F13800FFF704FFC4E90001938963816D -:1021A000D3892381BDE8F88300200146F4E7C36C9E -:1021B00001335ED1EA6B00232E26551E184615F812 -:1021C000011F013020290CD0052908BFE52109286D -:1021D00004D10B2B9EBFE71801337E73E718013340 -:1021E00079730B28EBD1E11800204873A17E0029F8 -:1021F0004BD1002B40D06FF00C0604F10D000825E8 -:10220000361B331810F8011B002938D02E298BB249 -:102210004AD0A3F14101192903D8117B0D4200D006 -:1022200020330373EDE7B9F1000F05D100F520531A -:102230009BB2B3F5006F0BD307F11A01C7F1FF0290 -:1022400040EA09402144FFF73BFF48B10744002022 -:1022500002368146D8F80C30985B0028E3D1384626 -:10226000B9F1000F4FF0000218BF002023189A7632 -:10227000A0E7B1463746EDE73F23A3760123234489 -:1022800000219976137B03B96373D37A02F11C00A2 -:1022900003F03F0323730023FFF780FE2060636099 -:1022A000D38A6381138B7CE710250B46B9E73F2364 -:1022B0000125A37660E7000038B50546002435F80F -:1022C000020B08B9204638BD02F0EEF86308C2B22E -:1022D00003EBC43312FA83F39AB2C0F3072303EB80 -:1022E000520303EBC2339CB2E9E7000037B5C37871 -:1022F00004461BB90025284603B030BD00F14C014F -:10230000826C01234078019104F0BAF8054680B947 -:10231000A36BE070A06C226BC31A9342EAD2A3783D -:102320000199022BE6D102440123607804F0A8F859 -:10233000E1E70125DFE7000038B5836C05460C4670 -:102340008B4210D0FFF7D2FF60B92246012305F17E -:102350004C01687804F070F800281CBF4FF0FF347F -:102360000120AC6438BD0020FCE7000038B5002334 -:102370000446C3704FF0FF338364FFF7DDFF00288E -:102380004BD1B4F84A524AF655239D4207D10B224D -:10239000254904F14C0006F055FC00283FD094F884 -:1023A0004C30EB2B03D01833DBB2012B2ED84AF67E -:1023B00055239D4206D108221C4904F19E0006F0D7 -:1023C00041FC48B3B4F85730B3F5007F1ED194F800 -:1023D0005930DBB15A1E1A4218D1B4F85A30ABB199 -:1023E00094F85C30013B012B10D8B4F85D306BB130 -:1023F000B4F85F307F2B06D804F16C00FFF7CEFDF8 -:10240000B0F5803F02D3B4F8623053B94AF6552094 -:1024100085420CBF0220032038BD0420FCE70120C8 -:10242000FAE70020F8E700BF788E0008848E0008E5 -:1024300002392DE9F04701F007044FF0010A466C1C -:1024400005460AFA04F41746984606EB1136C1F31E -:10245000C809E4B2314628460136FFF76DFF18B1CE -:102460000120BDE8F087994605EB090292F84C304F -:10247000234214BF01210021414513D06340013F95 -:1024800082F84C3085F803A0EBD0640014F0FF0410 -:10249000EAD109F1010301244FF00009B3F5007FEF -:1024A000E1D1D7E70220DCE701290246F8B50C4666 -:1024B00040F28C800668F36A8B4240F28780337862 -:1024C000013B032B00F28280DFE803F00229384B46 -:1024D00004EB5405B16B304601EB5521FFF72CFF9F -:1024E00010B14FF0FF30F8BD6F1CC5F30805B16B9C -:1024F0003046354401EB572195F84C50FFF71CFF4F -:102500000028EED1C7F30807E3073E4496F84C00D5 -:1025100045EA00204CBF0009C0F30B00E3E7B16BB4 -:10252000304601EB1421FFF707FF0028D9D16400E2 -:1025300004F4FF742644B6F84C00D4E7B16B30467F -:1025400001EBD411FFF7F8FE0028CAD1A40006F170 -:102550004C0004F4FE742044FFF720FD20F070408E -:10256000C1E7D0E90430D57953EA000101D0916880 -:1025700001B95DBB9168022DA4EB01010DD1013BB6 -:10258000728940F1FF305B0A43EAC053B3FBF2F3B8 -:1025900099421BD81CD0601CA5E7032D02D193697A -:1025A0008B42F8D8D3699BB9B16B304601EBD4119B -:1025B000FFF7C2FE002894D1A0004C3600F4FE7054 -:1025C0003044FFF7EBFC20F000408CE701208AE765 -:1025D0006FF0004087E70000F8B5066804460D4636 -:1025E0003378042B0CBF4FF080524FF400128A4214 -:1025F00001D80220F8BDCA06FBD182680163D2B9B6 -:10260000022B13D83389B3EB551FF2D9F36BA363B5 -:10261000A36B6263002BECD003EB55234C36C5F360 -:1026200008050020A3633544E563E3E7F36BC2715B -:10263000002BE7D01A4677897F02BD42114604D2AB -:102640003046FFF7C9FCA063E2E72046FFF72CFF06 -:10265000431C024606D00128CBD9F36A8342C8D96D -:10266000ED1BEAE70120C5E701292DE9F047064601 -:102670000C46174608D9C36A8B4205D90378022B4A -:1026800062D003D8012B22D0022552E0033B012B5C -:10269000FAD8816B01EBD411FFF74EFE05460028F6 -:1026A00047D1A40006F14C0304F4FE741C443378B3 -:1026B000042B07D0204627F07047FFF76FFC00F08F -:1026C0007040074339462046FFF76EFC2FE001EBD0 -:1026D0005108816B01EB5821FFF72EFE054640BBE8 -:1026E00014F0010406F14C0908F1010AC8F30808C6 -:1026F00008BFFBB230461FBF19F8083003F00F02C5 -:102700003B0103F0F00318BF134309F8083001231D -:10271000B16BF37001EB5A21FFF70EFE054640B98D -:10272000CAF3080A44B1C7F3071709F80A7001236E -:10273000F3702846BDE8F08719F80A30C7F303277D -:1027400023F00F031F43F0E7816B01EB1421FFF728 -:10275000F3FD05460028ECD1640006F14C0304F4B7 -:10276000FF741F551919C7F307274F70DFE70000E3 -:10277000F8B504460E461746E3690BB91846F8BD8E -:10278000012BA6EB0305206814BFAA1C3A46691C5E -:10279000FFF76AFF0028F2D1E369013BE361EBE751 -:1027A00001292DE9F84306460C461746056802D86C -:1027B0000220BDE8F883EB6A8B42F9D97AB9A146C9 -:1027C00021463046A046FFF76FFE0446B0B92B788D -:1027D000042B02D1002F43D1F7710020E9E72B78B9 -:1027E000042B02D1C379022BE9D04FF0FF323946D6 -:1027F0002846FFF739FF0028E1D0DAE70128D7D0D3 -:10280000421C01D10120D4E72B78042B19D1EA6AAC -:10281000AB69023A93421CD308F10102A2420CD0E8 -:102820002B78042B08D10023A2EB09024946284645 -:10283000FFF7FEFD0028BCD1A146EB6AA342BFD83A -:10284000C5E7002241462846FFF70EFF0028DED0EC -:10285000AFE70133AB612B7943F001032B71DBE769 -:10286000F3798BB9B468BC4202D10223F371B4E7A7 -:1028700021463046FFF718FE012899D9431CC1D0E4 -:1028800001348442EFD0A8E7032BA6D1B368BB4242 -:10289000A3D8B2691344BB429FD3E6E770B5C379AE -:1028A0000446032B06D181688369CD18A94203D160 -:1028B0000023E371002070BD4E1C20683246FFF7F4 -:1028C000D3FE0028F7D13146F0E700002DE9F743A9 -:1028D00005460191FFF70AFD0446002849D105F19C -:1028E0004C09019928464FF40072FFF775FB214609 -:1028F000A86407464846FFF721FA6C896402B4F5DC -:10290000004F28BF4FF40044B4F5007F2FD9204674 -:1029100004F022FA804630B122460021640A0026E3 -:10292000FFF70CFA09E06408EEE72346BA194146BE -:10293000687803F0A5FD18B926446B899E42F4D34C -:10294000404604F019FA6889801B18BF012003B0C3 -:10295000BDE8F08301366B899E42F4D20123BA1997 -:102960004946687803F08CFD0028F3D0EBE7002699 -:10297000F1E70120EBE70000F8B50446FFF7B6FCED -:102980000546002842D12378032B37D12779012F20 -:1029900034D104F14C0601464FF400723046FFF783 -:1029A000CDF955234122722184F84A32AA2304F535 -:1029B0000D7084F84F2084F84B32522384F8301283 -:1029C00084F84C3084F84D30612384F8311284F857 -:1029D0004E3084F83332A16984F83222FFF7E4FAEA -:1029E000616904F50E70FFF7DFFA626B3B46314612 -:1029F00001326078A26403F043FD25710022607803 -:102A0000114603F061FD003818BF0120F8BD000039 -:102A100000232DE9F0430B6085B00F461546FFF704 -:102A20001BFB061EC0F2B281804B53F82640002CDF -:102A300000F0AE813C6005F0FE0523786BB1607854 -:102A400003F0F8FCC70708D41DB110F0040500D04E -:102A50000A25284605B0BDE8F0830023F0B22370B4 -:102A6000607003F0D3FCC10700F194810DB14207FF -:102A7000EED400212046FFF779FC022840F099802F -:102A80006E4604F2122304F25221324618461033E5 -:102A9000FFF784FA42F8040B8B42F7D1002556F871 -:102AA000041B00297DD02046FFF760FC012879D85F -:102AB0000128A26C40F0C08004F1570304F18C019E -:102AC00013F8015B002D7BD18B42F9D1B4F8B430FF -:102AD000B3F5807F74D194F8B830092B70D104F12C -:102AE0009400FFF75DFA4FF0FF33171841F1000132 -:102AF000BB4275EB010363D304F1A000FFF74EFA6C -:102B000094F8BA302063012BA37059D194F8B9908E -:102B100003FA09F91FFA89F36381002B50D0444B63 -:102B200004F1A800FFF73AFA0646984248D8831CF9 -:102B3000626304F1A400E362FFF730FA00EB0208DD -:102B400004F19C00C4F84080FFF728FA10441FFAF3 -:102B500089F2A06306FB02F313EB080345EB0502C1 -:102B60009F4271EB02032BD32E4604F1AC00FFF71A -:102B700015FAE06365B96389B34221D9E16B204658 -:102B8000FFF72AFA81192046FFF7D6FB98B90136DC -:102B9000631993F84C30812B14D02035C5F3080508 -:102BA000E8E703200135042D7FF479AF042807D12D -:102BB00001E0042801D101254BE701287FF678AF19 -:102BC0000D2546E705F1140004F14C063044FFF7EB -:102BD000E5F901280546F3D9E36A8342F0D9618912 -:102BE000821E236C02FB01336364A16B204601EB60 -:102BF000D511FFF7A1FB0028DDD105F07F0006EB22 -:102C00008000FFF7CBF9431C03D00135A842ECD07C -:102C1000D6E70425C4E90500064A25700025138877 -:102C2000E56101339BB21380E38012E79C360020FC -:102C3000FDFFFF7FA0360020B4F85730B3F5007FCA -:102C4000BED1B4F8626026B904F17000FFF7A6F9AE -:102C5000064694F85C302663591EA3700129AFD84C -:102C600094F859506581002DAAD0691E2942A7D138 -:102C7000B4F85D8018F00F0FA4F80880A0D1B4F864 -:102C80005F0018B904F16C00FFF788F9B4F85A1026 -:102C9000002995D006FB03FE01EB181CF4446045A7 -:102CA0008ED3A0EB0C00A842B0FBF5F388D33E48CE -:102CB000834285D84FF6F57083426DD903259F1C5A -:102CC000114402EB0C03032DE7626263A1632364EA -:102CD0004CD1B4F8763053EA08037FF471AFBB00EF -:102CE00004F17800FFF75AF9E06303F2FF13B6EB43 -:102CF000532FFFF465AF4FF0FF33032DC4E90533C5 -:102D00004FF08003237187D1B4F87C30012B83D13D -:102D1000511C2046FFF710FB00287FF47DAFB4F86C -:102D20004A224AF6552320719A427FF475AF1F4B11 -:102D300004F14C00FFF732F998427FF46DAF03F1D4 -:102D4000FF5304F50C70FFF729F903F50053203306 -:102D500098427FF461AF04F50D70FFF71FF9A06191 -:102D600004F50E70FFF71AF9606155E7B8F1000F2E -:102D70003FF426AF7144022D4FEA4703E1631EBFC3 -:102D8000D91907F0010303EB5103AEE70B2560E609 -:102D90000C255EE603255CE640F6F575AB428CBF7C -:102DA000022501258BE700BFF5FFFF0F525261415D -:102DB0002DE9F84F07460568884649B96E69C6B1DE -:102DC000EB6AB34298BF0126AB69A3B9002405E0C2 -:102DD000FFF76AFB0128044603D801242046BDE81A -:102DE000F88F421C00F0D280EB6A8342F6D8464648 -:102DF000EAE70126E8E72A78EB6A042A40F08380B4 -:102E0000A6F1020A023B4FF0010B9A4528BF4FF092 -:102E1000000AD146696C284601EB1931FFF78CFA9C -:102E200000283BD109F00703EA6AC9F3C8010BFA8D -:102E300003F3901EDBB26A184C4609F1010992F8BF -:102E40004C20814502EA030233BF5B0000234FF4AC -:102E50000071DBB228BF9946B2B90234631E033356 -:102E6000BCD80123214628461A46FFF7E1FA02287A -:102E7000B3D0012800F08A80B8F1000F13D10223EB -:102E8000FB710028A9D130E0CA450AD0002BD2D16D -:102E90000131B1F5007FBDD20123CCE74FF0FF3403 -:102EA000DCE70024DAE7FB79022B07D1731CA3428D -:102EB000E7D0BB68F31ABB610323FB7108F1010281 -:102EC000FB69A24205D113B10133FB61D9E70223AB -:102ED000FBE70BB90123FB61224641463846FFF769 -:102EE00047FC00284FD10123FB61EA6AAB69023A33 -:102EF0006C6193429CBF03F1FF33AB612B7943F0CC -:102F000001032B716AE7464514D1741C3846A3426D -:102F100098BF02242146FFF7C7FA01283FF45DAFAE -:102F2000431C33D0E0B16B69012B03D9EA6A9342A9 -:102F300038BF1E4634460134EB6AA34203D8012E43 -:102F40007FF644AF022421463846FFF7ADFA48B178 -:102F500001283FF442AF013018D0B442EBD135E73D -:102F6000002CE7D04FF0FF3221462846FFF77CFBCC -:102F700048B9B8F1000FB8D0224641462846FFF7BD -:102F800073FB0028B1D001287FF427AF4FF0FF3446 -:102F900024E700002DE9F84306680446076B8946DC -:102FA00033782037042B0CBF4FF080534FF40013BD -:102FB000BB429CBF00238363836B73B1C7F30808D4 -:102FC000B8F1000F3CD10133416B836339B93389C8 -:102FD000B3EB571F34D80023A36304200AE073899E -:102FE000013B13EA57232BD1FFF75EFA0128054670 -:102FF00002D80220BDE8F883421C01D10120F9E784 -:10300000F36A834216D8B9F1000FE4D0616B204611 -:10301000FFF7CEFE0546C8B10128EAD0431CEDD02B -:1030200001463046FFF752FC0028E7D1E37943F030 -:103030000403E371294630466563FEF7CDFFA063C4 -:103040004C36002027634644E663D3E70720D1E7E8 -:10305000F8B50E46002104460768FFF7BDFA98B997 -:103060000546A16B3846FFF767F968B93A78E36B14 -:10307000042A1B780CD11B060ED5054601212046DB -:10308000FFF788FF0028ECD0042808BF072006E0DF -:10309000E52B01D0002BF0D10135B542EED1F8BDC2 -:1030A000C16C4B1C2DE9F04104460568066B1FD12D -:1030B000E5274FF00108A16B2846FFF73DF998B9C5 -:1030C0002A78E36B042A09BF1A781F7002F07F0286 -:1030D0001A7085F80380236BB3420DD2002120467D -:1030E000FFF758FF0028E6D0042808BF022003E0BD -:1030F000FFF772FA0028DBD0BDE8F0812DE9F0413E -:1031000005460068A96B0669FFF716F9044620B961 -:10311000EB6B1A78852A03D002242046BDE8F081A3 -:10312000324603F1200153F8040B8B4242F8040BA2 -:10313000F9D1777801377F01A7F16003B3F5007FFC -:10314000EAD800212846FFF725FF04280446E3D0EB -:103150000028E2D1A96B2868FFF7EEF804460028A2 -:10316000DBD1EB6B1A78C02AD6D106F1200203F12D -:10317000200153F8040B8B4242F8040BF9D196F866 -:1031800023300F222C33B3FBF2F3B7EB431FC3D32F -:103190004FF0400800212846FFF7FCFE04280446B3 -:1031A000BAD00028B9D1A96B2868FFF7C5F8044642 -:1031B0000028B2D1EB6B1A78C12AADD1B8F5187FCF -:1031C00009D206EB080203F1200153F8040B8B42ED -:1031D00042F8040BF9D108F120084745DAD8B8F5D0 -:1031E000187F9AD83046FEF71FFF7388834294D029 -:1031F00092E700000B68002210B5036004460B6ADA -:1032000083604B6AC261C37123F0FF03896AC0E91E -:103210000432C164FFF7E0F920B92046BDE8104050 -:10322000FFF76CBF10BD0000F8B503680546012725 -:103230001C692046FEF7F8FEA070000A6678E07070 -:103240002846E96CFFF7C8F920B1022828BF022000 -:10325000C0B2F8BDA96B2868FFF76EF80028F4D15A -:10326000EB6B04F1200254F8041B944243F8041B56 -:10327000F9D12B68DF70002EE7D000212846013EEF -:10328000FFF788FEE0E700002DE9F8434FF0FF0864 -:1032900006460768042445464FF6FF79B16B11B91D -:1032A000002C73D063E03846FFF746F80446002848 -:1032B0005DD1F06B0378002B6ED03A78042A11D1DF -:1032C000852B4DD1336B3046F364FFF717FF04466F -:1032D00000284CD13B691B7903F03F03B3712046B2 -:1032E000BDE8F883C27AE52B02F03F02B27143D009 -:1032F0002E2B41D022F0200108293DD00F2A40D1A9 -:10330000590637D503F0BF05336B90F80D80F36491 -:10331000437B434530D1428B72BB03780D21FC685F -:1033200023F04003DFF874E0013B4B4301211EF81A -:1033300001CB30F80CC009B3FF2B1DD824F813C003 -:103340006146013301320D2AF1D10278520605D5CA -:1033500021B1FF2B10D8002224F81320013DEDB23B -:1033600000213046FFF716FE0446002896D00023C1 -:10337000B363B4E7AB42CBD0FF25F1E7CC45E1D056 -:10338000FAE72DB9FEF740FE404501D10024A6E73B -:103390004FF0FF33F364A2E70424E8E7208F00082E -:1033A0002DE9F04F002187B00446D0F80090FFF7D8 -:1033B00013F9804670B999F80030042B33D1D9F84D -:1033C0000C00FEF779FF07462046FFF75DFF054634 -:1033D00020B18046404607B0BDE8F08FD9F81030E4 -:1033E0009A8CBA42F0D193F823B040265D4506D1BD -:1033F000D9F80C3033F81530002BE5D1EAE7F106A7 -:10340000D9F8103008BF0236985B01F04DF8D9F8B2 -:103410000C30824633F8150001F046F88245D3D1CE -:1034200002360135E2E74FF0FF0A4FF0FF3B554609 -:10343000C4F84CB0A16B4846FEF77EFF00285CD173 -:10344000E66B3778002F77D0F27AE52F02F03F0352 -:10345000A37103D0120704D50F2B04D0C4F84CB0CD -:103460004FE00F2B54D194F84B3058063FD47906D7 -:1034700045D5236B07F0BF0796F80DA0E364737B77 -:1034800053453ED1738B002B3BD135780121D9F8C0 -:103490000C3005F03F0501930D23013D5D43284BA2 -:1034A00013F8012BB25A71B3FF2D059329D810469A -:1034B000049200F0F9FF6B1C03900293019B33F818 -:1034C000150000F0F1FF039981421AD1049A029D80 -:1034D0001146059B1B4A9342E2D133785A0604D524 -:1034E00019B1019B33F815305BB97D1EEDB2002197 -:1034F0002046FFF74FFD00289CD080466AE7BD427A -:10350000BDD0FF25F3E74FF6FF708242E2D0F8E727 -:103510002DB93046FEF778FD50453FF45BAF94F887 -:103520004B30DB079AD40B2204F14001304605F002 -:1035300089FB002892D14DE74FF004084AE700BF0D -:10354000208F00082D8F00082DE9F04F90F84BB028 -:1035500099B004461BF0A00540F068810668F26847 -:1035600032F81530002B4AD13378042B40F0878095 -:103570000F230E352046B5FBF3F5A91CFFF768FDB8 -:103580008146002877D1236B0135A3EB4515E379FC -:103590005A07E56435D523F004032046E371FFF7AD -:1035A0007DF950BB4FF0FF32616B2046FFF7E0F82A -:1035B00018BBA3682BB3214604A8FFF71BFEE0B994 -:1035C00070894FF40071D4E90423E0FB01233069D2 -:1035D000C4E904233830FEF7EFFC3069D4E9042352 -:1035E0002830FEF7E9FCE379326904A843F00103CF -:1035F00082F82130FFF718FE18B181463BE0013513 -:10360000AEE7D6E90354402200212046FEF796FBA0 -:103610008523012140222370C0234FF0C10C04EB0D -:10362000010884F8203000231E469E46571C04F8EB -:1036300002C0F0B2023204F807E021B135F81310ED -:1036400009B10133DBB20F0AA15408F8027002324B -:10365000D706F2D135F813700136002FE6D184F881 -:103660002330831C28466370FEF726FE84F824006E -:10367000000A84F82500484619B0BDE8F08F04F12F -:1036800040070DF1100A1BF0010F97E807008AE8C8 -:10369000070000F0D38040234FF0010884F84B303E -:1036A000BC46F368B8F1050F9AE80700ACE80300E0 -:1036B0002CF8022B4FEA12428CF8002059D9981EA0 -:1036C000424630F8021F002942D10DF10F0C0721AC -:1036D00002F00F0E914612090EF13000392888BF12 -:1036E0000EF1370001390CF8010902D0B9F10F0FC2 -:1036F000EED818AB7E205A1802F8580C3846002233 -:10370000914206D010F801CB02F1010EBCF1200F5E -:1037100031D104F13F0C072902F1010297BF18AB28 -:1037200020205818013198BF10F8580C072A0CF8BF -:103730000200F0D92046FFF733FE8146002878D1F9 -:1037400008F10108B8F1640FAAD14FF0070992E718 -:103750004FF0100C01F0010E49080EEB4202D303AA -:1037600044BF82F4883282F02102BCF1010CF1D115 -:10377000A7E74246A9E77246C2E7216B2046A1EBC4 -:103780004511FEF729FF814600287FF474AF4FF6FC -:10379000FF783846FEF738FC0190A16B3046FEF703 -:1037A000CBFD814600287FF466AFE36BE9B2019A56 -:1037B0004FF00D0CD6F80CE05A734FF00F02DFF803 -:1037C000E0A0DA724A1E18730CFB02F28446987667 -:1037D000D87640451AF8019B0CF1010C18BF3EF851 -:1037E000120003EB090B18BF013203F809004FEA7E -:1037F0001029002808BF4046BCF10D0F8BF801903E -:10380000E7D1404502D03EF812200AB941F040010C -:103810001970012300212046F370FFF7BBFB81469E -:1038200000287FF428AF013DB7D11BE04FF0060917 -:1038300021E704287FF41FAF84F84BB01BF0020F80 -:1038400020461BBF0C350D210125B5FBF1F518BF36 -:1038500001352946FFF7FCFB814600287FF40BAFBA -:10386000013D8AD1A16B3046FEF766FD81460028F6 -:103870007FF401AF01462022E06BFEF75FFAE36BB5 -:1038800003CF18605960BA7839889A72198194F810 -:103890004B30E26B03F0180313730123F370EAE675 -:1038A000208F000810B504460A463430FEF776FB38 -:1038B000886004F13800FEF773FBC2E9040194F854 -:1038C000213003F00203D3710023D36110BD000047 -:1038D00003284B8B04BF8A8A43EA02431846704789 -:1038E0002DE9F04F0B7899B0044689462F2BD0F87C -:1038F00000B001D05C2B09D14A46137891460132C1 -:103900002F2BFAD05C2BF8D0002301E0DBF81C3021 -:10391000A3600023E3619BF80030042B1ED1A36851 -:10392000E3B1DBF82030214604A82362DBF8243021 -:103930006362DBF82830A362FFF75CFC03460028D3 -:1039400054D1DBF8102002F13800FEF727FBC4E960 -:10395000040392F8213003F00203E37199F8003078 -:103960001F2B00F2358180230021204684F84B3044 -:1039700019B0BDE8F04FFEF72FBE49460B788946D7 -:1039800001312F2BFAD05C2BF8D01F2B8CBF0025D8 -:103990000425012F2FD113882E2B31D1002322F89B -:1039A000173004F140029F428CBF2E2120210133A9 -:1039B0000B2B02F8011BF6D145F02005204684F8B8 -:1039C0004B50FFF7EDFC94F84B30002800F0E780F7 -:1039D00004280BD1990603F0040240F1DC80002A90 -:1039E00000F0F6808023002084F84B3019B0BDE849 -:1039F000F08F0425CDE7022F02D153882E2BCAD099 -:103A0000911E87BB002322F81730002F00F0118190 -:103A100032F81300194601332028F9D009B92E28AD -:103A200001D145F00305901E30F817302E2B01D040 -:103A3000013FF9D14FF020334FF0000A6364D046C4 -:103A40002364C4F847300823481C32F81160009002 -:103A5000F6B1202E03D02E2E0DD1B84210D045F055 -:103A600003050099F0E731F81730202B01D02E2BF9 -:103A7000C8D1013FC5E79A4505D20099B9423BD16B -:103A80000B2B30D101E00B2B27D145F003050B2385 -:103A900094F84020E52A04BF052284F84020082B32 -:103AA00004BF4FEA88085FFA88F808F00C030C2B73 -:103AB00003D008F00303032B01D145F00205A8074A -:103AC0003FF57CAF18F0010F18BF45F0100518F056 -:103AD000040F18BF45F0080570E70099B94202D0FD -:103AE00045F00305D4D84FEA88080B234FF0080AA5 -:103AF00000975FFA88F8B4E77F2E15D9304640F278 -:103B00005231CDE9022345F00203019300F098FC05 -:103B100010F0800F0646DDE9022316D000F07F0684 -:103B200046498E5D019D46B331464548CDE90123A6 -:103B300005F0F6F8DDE90123F8B9A6F1410189B2F3 -:103B400019291ED848F0020810E0FF28EAD9591EAA -:103B50008A4503D345F003059A4682E704EB0A0140 -:103B6000000A0AF1010A019D81F8400004EB0A01F4 -:103B70000AF1010A81F8406073E745F003055F260A -:103B8000F4E7A6F1610189B219299EBF203E48F0F1 -:103B90000108B6B2EAE7002A08BF052026E75A075F -:103BA0003FF524AFA379DB0645D59BF80000042838 -:103BB00035D1A3682146E27923622369DBF810003E -:103BC00023F0FF0313436362E36CA362FFF76AFE13 -:103BD00023680027DA6819F8010B00283FF409AFC1 -:103BE00040F25231009200F04BFC054608B31F280A -:103BF000009A7FF6FEAE2F283FF4BFAE5C283FF45C -:103C0000BCAE7F2805D801460E4805F089F8009A19 -:103C100078B9FF2F0DD022F817500137DBE7216B61 -:103C20000BF14C03C1F308011944FFF751FEA060EA -:103C3000CEE70620DAE60520D8E600BFA08E000811 -:103C4000998E0008908E00081FB5CDE9001003A8DA -:103C500014460391FEF700FA002815DB0B4A52F8D0 -:103C600020300BB100211970019B0BB1002119709C -:103C700042F820302CB1002201A96846FEF7C8FEA8 -:103C80000446204604B010BD0B24FAE79C36002001 -:103C90002DE9F04798B0904605460191002800F0C4 -:103CA000528102F03F0603A901A83246FEF7B0FE9A -:103CB000002840F04681039B4FF48C60049303F08E -:103CC0004BF80746002800F04081039B00F5007286 -:103CD0000199D86004A81A61FFF702FE044620B9D2 -:103CE0009DF95B30002BB8BF062418F01C0F00F0C4 -:103CF000CD80002C4CD0042C40D104A8FFF724FC2C -:103D0000044600283AD146F00806039B1A78042A94 -:103D100040F08380186929462B60FFF7C3FD039BA1 -:103D20001E22002118690230FEF708F8039C0021CA -:103D30001A2220692630FEF701F8236920221A7121 -:103D4000246903F027F80146012208342046FEF7D3 -:103D50002BF9039B04A81B6983F82120FFF764FA61 -:103D6000044658B9A96801B302462846FEF718FD73 -:103D7000AB68039A0446013B5361B4B1384602F084 -:103D8000FBFF0CB100232B60204618B0BDE8F08784 -:103D90009DF8163013F0110F40F0848018F0040FD6 -:103DA00040F0C98018F0080FAFD1039A310713997A -:103DB000936C48BF46F04006E964AB641078042871 -:103DC00072D1069B9DF817102B62089B106923F097 -:103DD000FF030B4329466B62179BAB62FFF762FD43 -:103DE000DDF80CA00024002205F15008BAF80630D6 -:103DF00021464046C5F800A0AB80002385F830601E -:103E000085F831406C64C5E90E234FF40072FDF76C -:103E100095FFB20653D40024B0E702F0BBFF014681 -:103E2000009013980E30FEF7BFF8139800991630E3 -:103E3000FEF7BAF8039C13992078FFF749FD202379 -:103E400000228046CB7220461399FEF7D1F8139BCF -:103E5000002201211A775A779A77DA77039BD97073 -:103E6000B8F1000FA1D0414604A8D3F84890FEF75E -:103E700097FC0446002881D149460398FEF75CFA76 -:103E8000039B044608F1FF30586176E7002C7FF46D -:103E900075AF9DF81630DC064FD418F0020F84D0B1 -:103EA000D80782D5072469E7FFF712FD0023A86031 -:103EB00001F11C00FEF772F86B61286190E7D5E90B -:103EC000046956EA0903A6D0BAF80AA0A9684FEA1D -:103ED0004A2AC5E90E69B24574EB09031BD30024D5 -:103EE0002964002C7FF44AAFC6F30803002B92D05C -:103EF000039C2046FEF770F808B3760A012341467A -:103F000046EAC95682196A64607802F095FA041E7E -:103F100018BF012432E72846FEF7C6FAB6EB0A06B8 -:103F2000014669F10009012803D9431CD3D10124BA -:103F3000D6E70224D4E7082420E704241EE702245D -:103F40001CE704461EE709241EE711241CE70000B5 -:103F50002DE9F04F994685B00023884603A9044611 -:103F6000C9F800301646FEF791F8054680BB94F874 -:103F700031506DBB94F8303013F00103009300F022 -:103F8000A68004F1500AD4E90432D4E90E011B1AC8 -:103F900062EB0102B34272F1000238BF1E46BEB1AD -:103FA000D4E90E10C1F30803002B40F08280039B7C -:103FB0005A894B0A013A43EAC0531A401BD151EACD -:103FC000000309D1A06801280DD8022584F83150DA -:103FD000284605B0BDE8F08F216C20460192FEF71F -:103FE00063FA019AEFE7431C04D10123009D84F892 -:103FF0003130EDE72064DDF80CB0216C5846FDF758 -:10400000EBFF0028E1D0B6F5007F02EB000731D3CB -:10401000BBF80A1002EB5620730A88429BF8010095 -:1040200088BF8B1A3A464146019302F005FA0028F0 -:10403000DBD194F93020019B002A0BDA606CC01BA5 -:10404000984207D24FF40072514608EB4020FDF72A -:104050004FFE019B5F02D9F80030F61BB8443B4489 -:10406000C9F80030D4E90E32DB1942F10002C4E98C -:104070000E3294E7626CBA421AD094F93030002BB9 -:104080000DDA012351469BF8010002F0F9F90028EE -:10409000ABD194F8303003F07F0384F830300398CC -:1040A00001233A465146407802F0C6F900289CD1D7 -:1040B0006764A16B4046C1F30801C1F50077514424 -:1040C000B74228BF37463A46FDF712FEC3E7072539 -:1040D0007EE7000070B596B00E460022019002A95E -:1040E00001A8FEF795FC0446E0B94FF48C6002F09D -:1040F00033FE0546D8B1029B00F500720199D860E5 -:1041000002A81A61FFF7ECFB044640B99DF9533051 -:10411000002B0ADB1EB1314602A8FDF7EDFF284651 -:1041200002F02AFE204616B070BD0624F7E71124DF -:10413000F8E7000070B5B8B00222019003A901A809 -:10414000FEF766FC044608BB039B4FF48C6010939B -:1041500002F002FE0546002866D0039B00F50072BF -:104160000199D86010A81A61FFF7BAFB044650B94C -:104170009DF88B30980655D4190653D49DF84630D7 -:10418000DA0706D50724284602F0F6FD204638B0A7 -:1041900070BD039B04931878042814D104A91869EE -:1041A000FFF780FB069E9DF84630DB0610D410A872 -:1041B000FEF776FF04460028E5D156BB0398FEF7CC -:1041C000DBFB0446DFE71F99FFF782FB0646EAE7C1 -:1041D000039BDA69B242D5D024930021269624A805 -:1041E0001B78042B01BFDDE90823CDE928239DF8C6 -:1041F00017308DF89730FEF7EFF904460028C2D14A -:1042000024A8FFF741F804460028BBD00428BAD1FF -:10421000CDE70246314604A8FEF7C2FA044600285C -:10422000B1D1CBE70624AEE71124AFE7F0B5BDB0BE -:10423000CDE900106846FDF70FFF022203A901A88F -:10424000FEF7E6FB0446002841D1039B4FF48C6047 -:10425000149302F081FD0546002800F0EE80039BD8 -:1042600000F5007214AE0199D8601A613046FFF76C -:1042700037FB044640BB9DF89B3013F0A00F40F085 -:10428000D880039B009F1A78042A68D11B6904AC6C -:1042900003F1400C1868083353F8041C22466345A8 -:1042A00003C21446F6D15022314628A8FDF720FD5E -:1042B000394628A8FFF714FB044600284CD12A9A57 -:1042C000169B9A4206D00824284602F055FD204647 -:1042D0003DB0F0BD349A209B9A42F4D128A8FFF754 -:1042E00033F904460028EFD1039B04AF1B6993F810 -:1042F00001E093F823C09C8C3A46083303CAB242CB -:1043000043F8080C43F8041C1746F5D1039B28A872 -:104310001B6983F801E0039B1A6982F823C01A69BC -:1043200082F82440240A82F825401A691379D906B4 -:104330005CBF43F020031371FEF776FF04460028AC -:10434000C2D13046FEF7ACFE04460028BCD103982B -:10435000FEF712FB0446B7E70428B5D1BEE7239A5F -:1043600004AB02F1200C1068083252F8041C1C4601 -:10437000624503C42346F6D15022314628A8FDF7F2 -:10438000B7FC394628A8FFF7ABFA044600284CD101 -:104390002A9A169B9A4296D1349A209B9A4292D19D -:1043A00028A8FFF7D1F8044600288DD137990DF1E0 -:1043B0001D030DF12D0001F10D0253F8044B834252 -:1043C00042F8044BF9D11888012710809B7893702C -:1043D0009DF81B30039CDA0658BF43F02003CB72D4 -:1043E000E770CB7ADB06ACD5169A2A9B9A42A8D006 -:1043F0002078FFF76DFA01462046FDF7EDFD0146F6 -:10440000C8B12046FDF798FF044600287FF45CAF52 -:10441000039890F86D302E2B93D12A9A00F16C01FD -:10442000FDF7E6FD039BDF708BE704287FF44CAFBC -:10443000B6E7062448E7022446E7112447E70000D0 -:104440007F2810B501D880B210BDB0F5803F13D2DF -:1044500040F2523399420FD10849002231F8024B01 -:1044600093B2844203D103F18000C0B2ECE7013281 -:10447000802AF3D11346F6E70020E5E7E091000833 -:104480007F280DD940F25233994208D1FF2806D82F -:1044900000F10040034B803833F8100070470020D3 -:1044A000704700BFE0910008B0F5803FF0B522D220 -:1044B0001F4A83B21F49B0F5805F28BF0A46141D0A -:1044C00034F8042C2146AAB1934213D334F8025C89 -:1044D0002E0AEFB252FA85F5A84222DA082E09D840 -:1044E000DFE806F0050A10121416181A1C00801ACC -:1044F00034F810301846F0BD981A00F001001B1A6D -:104500009BB2F7E7103BFBE7203BF9E7303BF7E7CF -:104510001A3BF5E70833F3E7503BF1E7A3F5E35324 -:10452000EEE70434002ECBD101EB4702C7E700BF12 -:10453000308F000824910008084BC26A994228BFB6 -:104540001946836C50688B4210B506D95A1E4C0030 -:1045500002EB4103B3FBF4F3184410BD20BCBE00D2 -:1045600001F001038A0748BF43F002034A0748BF2E -:1045700043F008030A0748BF43F00403CA0648BFD4 -:1045800043F010038A06426B48BF43F020031343F5 -:104590004363704710B5074C204600F09FFF064B61 -:1045A0000022C4E91023054BA364054BE363054BCC -:1045B000E36410BDA43600200070005200B4C404AF -:1045C000F8360020F8380020C36A0BB9104BC362DC -:1045D0000379012B11D10F4B98420ED10E4BD3F81A -:1045E000D42042F48032C3F8D420D3F8FC2042F423 -:1045F0008032C3F8FC20D3F8FC30436C00221A65EB -:10460000DA621A605A605A624FF0FF329A6370475A -:10461000E0920008A4360020004402580379012BE0 -:104620001BD0436C00221A65DA621A605A605A6223 -:104630004FF0FF329A63094B98420ED1084BD3F8E2 -:10464000D42022F48032C3F8D420D3F8FC2022F402 -:104650008032C3F8FC20D3F8FC307047A436002029 -:104660000044025810B5446C0649FFF765FF6060CE -:10467000236842F2107043F003032360BDE810404A -:1046800001F04CBD801A06000129F8B5466C0B4FAD -:1046900009D175680A493D40FFF74EFF054345F4CF -:1046A00080557560F8BD746806493C40FFF744FFCB -:1046B000044344F480547460F4E700BF00ECFFFF4F -:1046C00080F0FA0240787D01436C00225A601A6043 -:1046D00070470000426C0129536823F4404304D022 -:1046E000022905D001B95360704743F48043FAE7CB -:1046F00043F40043F7E70000436C41F480519A60B3 -:10470000D9605A6B1206FCD580229A63704700006C -:1047100010B541F48851446CA260E160616B11F006 -:104720004502FBD0A26311F0040203D0FFF718FF8B -:10473000012010BD616910461960FAE710B541F417 -:104740008851446CA260E160616B11F04502FBD0BE -:10475000A26311F0050203D0FFF702FF012010BD94 -:10476000616910461960FAE773B5134604460E46B0 -:10477000302282F31188426CD26B32B14FF0FF319C -:104780004030019301F0D6FC019B606C0022026571 -:10479000C263C262456B15F4807504D185F311883C -:1047A000012002B070BD4FF0FF31816382F31188A8 -:1047B000012E06D90C21204602B0BDE87040FFF75B -:1047C000BDBF1046EDE7000073B5446C0E460025F2 -:1047D0000192616BA1632565E562FFF7C1FE012EC1 -:1047E00007D9019B2A460C2102B0BDE87040FFF7B3 -:1047F000A5BF02B070BD000010B541F49851446CE3 -:10480000A260E160616B11F04502FBD0A26311F080 -:104810003F0203D0FFF7A4FE012010BD216A10461D -:104820001960E1695960A16999606169D960F4E72B -:104830002DE9F74304460191006D01A917469846FA -:1048400002F0E2FB064600284AD0626C2046DDF802 -:1048500004905568C5F3090501356B00A56CB5FBDF -:10486000F3F54FF47A73B5FBF3F55D43556200F051 -:10487000FBFD50BB636C4FF0FF3201254146C3F88E -:10488000589020461D659A634FF49572DA6342F2A0 -:1048900007029F62DA62E36C0A9AFFF74FFFA0B942 -:1048A000E26C104B11680B407BB929462046FFF79C -:1048B0005BFF054648B92E463A460199206D02F045 -:1048C000CBFB304603B0BDE8F0833A460199206D3A -:1048D00002F0C2FBE26C01212046FFF775FFF0E712 -:1048E0000126EEE708E0FFFD2DE9F7431F46436C84 -:1048F00001924FF47A725D6804468846C5F3090553 -:1049000001356E00856CB5FBF6F5B5FBF2F5554348 -:104910005D6200F0A9FD20B10125284603B0BDE885 -:10492000F0837E0201A9206D324602F06DFB054640 -:104930000028F1D0636C019AD4F84C909A6501225A -:104940001A654FF0FF329A634FF49572DA639E62F4 -:10495000236BDB064B4658BF4FEA4828012F4246DF -:104960001BD912212046FFF7E9FEC0B9D9F8002073 -:10497000104B13409BB9636C42F2930239462046B8 -:10498000DA62E26CFFF7F0FE804640B932460199E8 -:10499000206D454602F060FBBFE71121E2E7324699 -:1049A0000199206D02F058FBE26C39462046FFF772 -:1049B0000BFFB2E708E0FFFD2DE9F3411F46436C12 -:1049C00001924FF47A725D6804468846C5F3090582 -:1049D00001356E00856CB5FBF6F5B5FBF2F5554378 -:1049E0005D6200F041FD20B10125284602B0BDE81E -:1049F000F0817E0201A9206D324602F03BFB0546A4 -:104A00000028F1D0636C019A9A6501221A654FF073 -:104A1000FF329A634FF48D72DA639E62236BE66C09 -:104A2000DB06334658BF4FEA4828012F424619D9C2 -:104A300019212046FFF782FEB0B932680F4B1340B0 -:104A400093B9636C42F2910239462046DA62E26C15 -:104A5000FFF78AFE064638B901993546206D02F007 -:104A600035FBC2E71821E4E70199206D02F02EFB27 -:104A7000E26C39462046FFF7A7FEB6E708E0FFFDE7 -:104A800012F0030F2DE9F04107460C4615461E466D -:104A900017D00E44B44202D10020BDE8F0810123BA -:104AA000FA6B21463846FFF71FFF0028F5D128464C -:104AB0004FF40072F96B05F500750134FDF718F934 -:104AC000E8E7BDE8F041FFF70FBF000012F0030F69 -:104AD0002DE9F04107460C4615461E4617D00E44F8 -:104AE000B44202D10020BDE8F08129464FF40072A3 -:104AF000F86B05F50075FDF7FBF80123FA6B21460D -:104B00003846FFF759FF0028EDD10134E8E7BDE84A -:104B1000F041FFF751BF000000207047302310B56F -:104B200083F311880024436C40302146DC6301F09C -:104B30000FFB84F3118810BD0268436811430160C4 -:104B400003B1184770470000024A136843F0C003DE -:104B50001360704700440040024A136843F0C003EA -:104B60001360704700480040024A136843F0C003D6 -:104B70001360704700780040064BD3F8E8200243EA -:104B8000C3F8E820D3F810211043C3F81001D3F87C -:104B9000103170470044025837B5274C274D204646 -:104BA00000F0FCFC04F11400009400234FF40072A8 -:104BB000234900F097F94FF40072224904F13800BC -:104BC0000094214B00F010FA204BC4E91735204C1B -:104BD000204600F0E3FC04F11400009400234FF49D -:104BE00000721C4900F07EF94FF400721A4904F17A -:104BF00038000094194B00F0F7F9194BC4E9173548 -:104C0000184C204600F0CAFC04F1140000234FF4B5 -:104C100000721549009400F065F9144B4FF40072CE -:104C2000134904F13800009400F0DEF9114BC4E997 -:104C3000173503B030BD00BFFC38002000E1F5059A -:104C4000403A002040400020494B0008004400400A -:104C500068390020403C002040420020594B0008A9 -:104C600000480040D4390020403E0020694B000835 -:104C7000404400200078004038B5264D0446037CAF -:104C8000002918BF0D46012B06D1234B984230D185 -:104C90004FF40030FFF770FF2A68236EE16D03EBDD -:104CA0005203A566B3FBF2F36A68100442BF23F017 -:104CB000070003F0070343EA4003CB60AB6843F00F -:104CC00040034B60EB6843F001038B6042F4967342 -:104CD00043F001030B604FF0FF330B62510505D524 -:104CE00012F0102211D0B2F1805F10D084F864303D -:104CF00038BD0A4B984205D0094B9842CCD14FF0B1 -:104D00008040C7E74FF48020C4E77F23EEE73F23CE -:104D1000ECE700BFE8920008FC380020683900206A -:104D2000D43900202DE9F047C66D05463768F4698F -:104D3000210734621AD014F0080118BF4FF48071B3 -:104D4000E20748BF41F02001A3074FF0300348BFFE -:104D500041F04001600748BF41F0800183F31188B2 -:104D6000281DFFF7E9FE002383F31188E2050AD529 -:104D7000302383F311884FF48061281DFFF7DCFE98 -:104D8000002383F311884FF030094FF0000A14F02C -:104D9000200838D13B0616D54FF0300905F1380A06 -:104DA000200610D589F31188504600F051F90028EB -:104DB00036DA0821281DFFF7BFFE27F08003336095 -:104DC000002383F31188790614D5620612D53023A7 -:104DD00083F31188D5E913239A4208D12B6C33B1A0 -:104DE00027F040071021281DFFF7A6FE376000239B -:104DF00083F31188E30618D5AA6E1369ABB1506925 -:104E0000BDE8F047184789F31188736A284695F87A -:104E10006410194000F0DCFB8AF31188F469B6E7EE -:104E2000B06288F31188F469BAE7BDE8F087000042 -:104E3000F8B51546826804460B46AA4200D285683A -:104E4000A1692669761AB5420BD218462A46FCF7A4 -:104E50004FFFA3692B44A3612846A3685B1BA36093 -:104E6000F8BD0CD9AF1B18463246FCF741FF3A4655 -:104E7000E1683044FCF73CFFE3683B44EBE718464D -:104E80002A46FCF735FFE368E5E7000083689342B4 -:104E9000F7B50446154600D28568D4E90460361A91 -:104EA000B5420BD22A46FCF723FF63692B446361AA -:104EB0002846A3685B1BA36003B0F0BD0DD9324642 -:104EC000AF1B0191FCF714FF01993A46E0683144A9 -:104ED000FCF70EFFE3683B44E9E72A46FCF708FFCE -:104EE000E368E4E710B50A440024C361029B8460D0 -:104EF000C16002610362C0E90000C0E9051110BD94 -:104F000008B5D0E90532934201D1826882B982683E -:104F1000013282605A1C426119700021D0E90432CA -:104F20009A4224BFC368436101F02CF9002008BDF8 -:104F30004FF0FF30FBE7000070B5302304460E460B -:104F400083F31188A568A5B1A368A269013BA3609A -:104F5000531CA36115782269934224BFE368A361BF -:104F6000E3690BB120469847002383F31188284654 -:104F700007E03146204601F0F5F80028E2DA85F333 -:104F8000118870BD2DE9F74F04460E461746984626 -:104F9000D0F81C904FF0300A8AF311884FF0000BC4 -:104FA000154665B12A4631462046FFF741FF0346C4 -:104FB00060B94146204601F0D5F80028F1D0002321 -:104FC00083F31188781B03B0BDE8F08FB9F1000FAF -:104FD00003D001902046C847019B8BF31188ED1A3E -:104FE0001E448AF31188DCE7C160C361009B8260C4 -:104FF0000362C0E905111144C0E900000161704776 -:10500000F8B504460D461646302383F31188A76889 -:10501000A7B1A368013BA36063695A1C62611D705C -:10502000D4E904329A4224BFE3686361E3690BB1B7 -:1050300020469847002080F3118807E0314620463B -:1050400001F090F80028E2DA87F31188F8BD00003B -:10505000D0E9052310B59A4201D182687AB98268F5 -:105060000021013282605A1C82611C7803699A42D5 -:1050700024BFC368836101F085F8204610BD4FF05E -:10508000FF30FBE72DE9F74F04460E4617469846DA -:10509000D0F81C904FF0300A8AF311884FF0000BC3 -:1050A000154665B12A4631462046FFF7EFFE034616 -:1050B00060B94146204601F055F80028F1D00023A0 -:1050C00083F31188781B03B0BDE8F08FB9F1000FAE -:1050D00003D001902046C847019B8BF31188ED1A3D -:1050E0001E448AF31188DCE70379052B05BF836A28 -:1050F000002001204B6004BF4FF400730B60704729 -:1051000070B55D1E866A04460D44B54205D9436BF1 -:1051100043F080034363012070BD06250571FFF74E -:10512000AFFC05232371F7E770B55D1E866A044660 -:105130000D44B54205D9436B43F08003436301201E -:1051400070BD07250571FFF7C1FC05232371F7E743 -:1051500038B505790446052D05D108230371FFF7FD -:10516000DBFC257138BD0120FCE700000323F0B50E -:10517000037185B00446FFF775FA002220461146F8 -:10518000FFF7BAFA4FF4D57203AB08212046FFF7B8 -:10519000D5FA0246B8B901232363039BC3F3032363 -:1051A000012B09D103AB37212046FFF7C7FA18B905 -:1051B000A44B039A1340ABB120460125FFF784FAB4 -:1051C0000223237137E103AB002237212046FFF78A -:1051D000B5FA28B99B4A039B1A40002A00F0A78021 -:1051E00002232363236B03F00F03022B40F0A980FB -:1051F0006425954E42F2107000F090FF03AB3246EA -:1052000001212046FFF784FA0028D5D1039B002B0B -:1052100080F293805A0003D5236B43F0100323637D -:10522000002204F1080302212046FFF7E5FA0246B6 -:105230000028C1D104F1380303212046FFF77EFA8C -:105240000028B9D104F11805A26B092120462B468C -:10525000FFF7D2FA0028AFD102ABA26B072120469C -:10526000FFF76CFA06460028A6D1236B03F00F0364 -:10527000022B40F08F807E227F21284603F09AF98E -:10528000012840F28780E76B42F2107000F046FF81 -:1052900008234FF40072394620460096FFF7C8FAFB -:1052A000002889D1384603F0D3F9236BA06203F0BC -:1052B0000F03022B72D103AB644A06212046FFF78D -:1052C0003DFA002871D15F49039B1940B1FA81F181 -:1052D00049092046FFF7D8F902AB4FF400721021BC -:1052E0002046FFF72BFA054600287FF465AF554EA0 -:1052F000029B33427FF460AF236B13F00E0F03F079 -:105300000F0273D0022A7FF457AFE36A197801299C -:1053100000F09480022900F09380002900F0898039 -:105320004B4F2046FFF7D6F903AB3A4676E01146DD -:1053300020462263FFF7E0F954E7013D7FF45AAFBE -:105340003AE7444D6426444A3E4F012B18BF1546A8 -:1053500003AB002237212046FFF7F0F900287FF445 -:105360002BAF039B3B427FF427AF03AB2A46292197 -:105370002046FFF7CDF900287FF41EAF039B002BDA -:10538000FFF648AF013E3FF417AF42F2107000F055 -:10539000C5FEDDE7284603F02FF986E77E227F2150 -:1053A0002846E66B03F006F908B9002191E70023CF -:1053B00040223146204600930623FFF739FA0028A1 -:1053C000F3D1B3895BBA9B07EFD5244B402231461A -:1053D000204600930623FFF72BFA0028E5D1317C05 -:1053E00001F00F010F3918BF012172E7E36A197844 -:1053F000F9B101297FF4E0AE2046FFF76BF903AB6A -:10540000A26B37212046FFF799F900287FF4D4AE2C -:10541000039B33427FF4D0AE03AB02220621204629 -:10542000FFF78CF900287FF4C7AE039B33427FF46B -:10543000C3AE05232371284605B0F0BD084F70E7C1 -:10544000084F6EE708E0FFFD0080FFC00001B903D0 -:105450000000B7030080FF5000001080F1FFFF80C4 -:105460000001B7030002B70337B504460C4D01AB8A -:10547000A26B0D212046FFF761F978B9019B2B4201 -:105480000BD1C3F34323042B08D0053B022B04D8D4 -:105490004FF47A7000F042FEE9E7012003B030BD1E -:1054A00008E0FFFD70B53023054683F311880379CA -:1054B0000024022B03D184F31188204670BD0423FD -:1054C000037184F311880226FFF7CEFF04462846B5 -:1054D000FFF7FAF82E71F0E7FFF75CB8044B0360B2 -:1054E0000123037100234363C0E90A33704700BFFF -:1054F0000093000810B53023044683F31188C1627D -:10550000FFF762F802230020237180F3118810BD99 -:1055100010B53023044683F31188FFF77FF800238A -:105520000122E362227183F3118810BD026843688F -:105530001143016003B11847704700001430FFF7B2 -:1055400021BD00004FF0FF331430FFF71BBD0000FA -:105550003830FFF797BD00004FF0FF333830FFF7CA -:1055600091BD00001430FFF7E7BC00004FF0FF31A1 -:105570001430FFF7E1BC00003830FFF741BD0000F8 -:105580004FF0FF323830FFF73BBD0000012914BF58 -:105590006FF0130000207047FFF7FEBA044B036062 -:1055A00000234360C0E9023301230374704700BF46 -:1055B0002493000810B53023044683F31188FFF7C5 -:1055C0005BFB02230020237480F3118810BD0000D0 -:1055D00038B5C36904460D461BB904210844FFF7DA -:1055E000A5FF294604F11400FFF78AFC002806DA1B -:1055F000201D4FF40061BDE83840FFF797BF38BD6C -:10560000026843681143016003B118477047000006 -:1056100013B5406B00F58054D4F8A4381A6811789B -:10562000042914D1017C022911D11979012312898D -:105630008B4013420BD101A94C3002F0E9FED4F8A3 -:10564000A4480246019B2179206800F0DFF902B0EE -:1056500010BD0000143002F06BBE00004FF0FF33AD -:10566000143002F065BE00004C3002F03DBF000077 -:105670004FF0FF334C3002F037BF0000143002F01F -:1056800039BE00004FF0FF31143002F033BE00008D -:105690004C3002F009BF00004FF0FF324C3002F0F6 -:1056A00003BF00000020704710B500F58054D4F807 -:1056B000A4381A681178042917D1017C022914D161 -:1056C0005979012352898B4013420ED1143002F0D4 -:1056D000CBFD024648B1D4F8A4484FF44073617939 -:1056E0002068BDE8104000F07FB910BD406BFFF7A7 -:1056F000DBBF0000704700007FB5124B0125042678 -:10570000044603600023057400F1840243602946C7 -:10571000C0E902330C4B0290143001934FF44073F4 -:10572000009602F07DFD094B04F69442294604F1EF -:105730004C000294CDE900634FF4407302F044FE44 -:1057400004B070BD4C930008ED56000811560008D7 -:105750000A68302383F311880B790B3342F8230056 -:105760004B79133342F823008B7913B10B3342F892 -:10577000230000F58053C3F8A4180223037400200B -:1057800080F311887047000038B5037F044613B1D9 -:1057900090F85430ABB90125201D0221FFF730FFEE -:1057A00004F114006FF00101257700F0F7FC04F11B -:1057B0004C0084F854506FF00101BDE8384000F00F -:1057C000EDBC38BD10B5012104460430FFF718FFC9 -:1057D0000023237784F8543010BD000038B5044608 -:1057E0000025143002F034FD04F14C00257702F05E -:1057F00003FE201D84F854500121FFF701FF2046CD -:10580000BDE83840FFF750BF90F8803003F06003E8 -:10581000202B06D190F881200023212A03D81F2AAB -:1058200006D800207047222AFBD1C0E91D3303E0CF -:10583000034A426707228267C3670120704700BF9F -:105840004422002037B500F58055D5F8A4381A68F1 -:10585000117804291AD1017C022917D11979012361 -:1058600012898B40134211D100F14C04204602F002 -:1058700083FE58B101A9204602F0CAFDD5F8A4481C -:105880000246019B2179206800F0C0F803B030BDCA -:1058900001F10B03F0B550F8236085B004460D46C6 -:1058A000FEB1302383F3118804EB8507301D0821F6 -:1058B000FFF7A6FEFB6806F14C005B691B681BB195 -:1058C000019002F0B3FD019803A902F0A1FD024688 -:1058D00048B1039B2946204600F098F8002383F343 -:1058E000118805B0F0BDFB685A691268002AF5D02E -:1058F0001B8A013B1340F1D104F18002EAE700006A -:10590000133138B550F82140ECB1302383F31188BE -:1059100004F58053D3F8A4281368527903EB82036B -:10592000DB689B695D6845B104216018FFF768FE7C -:10593000294604F1140002F0A1FC2046FFF7B4FE52 -:10594000002383F3118838BD7047000001F0B0BC1C -:1059500001234022002110B5044600F8303BFCF73B -:10596000EDF90023C4E9013310BD000010B5302368 -:10597000044683F311882422416000210C30FCF797 -:10598000DDF9204601F0B6FC02230020237080F3ED -:10599000118810BD70B500EB8103054650690E46B5 -:1059A0001446DA6018B110220021FCF7C7F9A0698B -:1059B00018B110220021FCF7C1F931462846BDE894 -:1059C000704001F09DBD000083682022002103F09B -:1059D000011310B5044683601030FCF7AFF9204680 -:1059E000BDE8104001F018BEF0B4012500EB8104C1 -:1059F00047898D40E4683D43A469458123600023C5 -:105A0000A2606360F0BC01F035BE0000F0B4012577 -:105A100000EB810407898D40E4683D43646905819A -:105A200023600023A2606360F0BC01F0ABBE000005 -:105A300070B5022300250446242203702946C0F8CD -:105A400088500C3040F8045CFCF778F9204684F864 -:105A5000705001F0E9FC63681B6823B129462046B9 -:105A6000BDE87040184770BD0378052B10B504469B -:105A70000AD080F88C300523037043681B680BB193 -:105A8000042198470023A36010BD00000178052978 -:105A900006D190F88C20436802701B6803B1184748 -:105AA0007047000070B590F87030044613B10023C1 -:105AB00080F8703004F18002204601F0D1FD636867 -:105AC0009B68B3B994F8803013F0600535D000219D -:105AD000204602F0C3F80021204602F0B3F86368C4 -:105AE0001B6813B1062120469847062384F87030BE -:105AF00070BD204698470028E4D0B4F88630A26FE5 -:105B00009A4288BFA36794F98030A56F002B4FF0AD -:105B1000300380F20381002D00F0F280092284F826 -:105B2000702083F3118800212046D4E91D23FFF75C -:105B30006DFF002383F31188DAE794F8812003F0E6 -:105B40007F0343EA022340F20232934200F0C58011 -:105B500021D8B3F5807F48D00DD8012B3FD0022B40 -:105B600000F09380002BB2D104F188026267022218 -:105B7000A267E367C1E7B3F5817F00F09B80B3F5CF -:105B8000407FA4D194F88230012BA0D1B4F88830A2 -:105B900043F0020332E0B3F5006F4DD017D8B3F5F0 -:105BA000A06F31D0A3F5C063012B90D86368204665 -:105BB00094F882205E6894F88310B4F88430B0477B -:105BC000002884D0436863670368A3671AE0B3F5CD -:105BD000106F36D040F6024293427FF478AF5C4BB0 -:105BE00063670223A3670023C3E794F88230012B85 -:105BF0007FF46DAFB4F8883023F00203A4F8883046 -:105C0000C4E91D55E56778E7B4F88030B3F5A06FB7 -:105C10000ED194F88230204684F88A3001F062FC7C -:105C200063681B6813B10121204698470323237042 -:105C30000023C4E91D339CE704F18B036367012350 -:105C4000C3E72378042B10D1302383F31188204637 -:105C5000FFF7BAFE85F311880321636884F88B503F -:105C600021701B680BB12046984794F88230002BB6 -:105C7000DED084F88B300423237063681B68002B0C -:105C8000D6D0022120469847D2E794F884302046A7 -:105C90001D0603F00F010AD501F0D4FC012804D041 -:105CA00002287FF414AF2B4B9AE72B4B98E701F0B7 -:105CB000BBFCF3E794F88230002B7FF408AF94F834 -:105CC000843013F00F01B3D01A06204602D501F03C -:105CD000DDFFADE701F0CEFFAAE794F88230002B9C -:105CE0007FF4F5AE94F8843013F00F01A0D01B06BA -:105CF000204602D501F0B2FF9AE701F0A3FF97E733 -:105D0000142284F8702083F311882B462A462946F2 -:105D10002046FFF769FE85F31188E9E65DB115229B -:105D200084F8702083F3118800212046D4E91D23D4 -:105D3000FFF75AFEFDE60B2284F8702083F31188EA -:105D40002B462A4629462046FFF760FEE3E700BFC0 -:105D50007C930008749300087893000838B590F895 -:105D600070300446002B3ED0063BDAB20F2A34D8FE -:105D70000F2B32D8DFE803F03731310822323131CE -:105D80003131313131313737856FB0F886309D424E -:105D900014D2C3681B8AB5FBF3F203FB12556DB92D -:105DA000302383F311882B462A462946FFF72EFE1F -:105DB00085F311880A2384F870300EE0142384F8E8 -:105DC0007030302383F31188002320461A46194689 -:105DD000FFF70AFE002383F3118838BDC36F03B1B8 -:105DE00098470023E7E70021204601F037FF002114 -:105DF000204601F027FF63681B6813B10621204687 -:105E000098470623D7E7000010B590F87030044695 -:105E1000142B29D017D8062B05D001D81BB110BDE3 -:105E2000093B022BFBD80021204601F017FF00217F -:105E3000204601F007FF63681B6813B10621204666 -:105E40009847062319E0152BE9D10B2380F8703011 -:105E5000302383F3118800231A461946FFF7D6FD35 -:105E6000002383F31188DAE7C3689B695B68002B22 -:105E7000D5D1C36F03B19847002384F87030CEE7C3 -:105E80000023826880F8243083691B6899689142F6 -:105E9000FBD25A680360426010605860704700008F -:105EA0000023826880F8243083691B6899689142D6 -:105EB000FBD85A6803604260106058607047000069 -:105EC00008B50846302383F3118891F82430032B5A -:105ED00005D0042B0DD02BB983F3118808BD8B6A34 -:105EE00000221A604FF0FF338362FFF7C9FF0023DF -:105EF000F2E7D1E9003213605A60F3E7034610B5C8 -:105F00001B68984203D09C688A689442F8D25A6809 -:105F10000B604A601160596010BD0000FFF7B0BF10 -:105F2000064BD96881F824001868026853601A602B -:105F30000122D86080F82420FAF764BA4046002095 -:105F40000C4B30B5DD684B1C87B004460FD02B4698 -:105F5000094A684600F0B6F92046FFF7E1FF009BCA -:105F600013B1684600F0B8F9A86A07B030BDFFF772 -:105F7000D7FFF9E740460020C15E0008044B1A68CD -:105F8000DB6890689B68984294BF002001207047AE -:105F900040460020094B10B51C68D8682268536041 -:105FA0001A600122DC6084F82420FFF779FF0146A3 -:105FB0002046BDE81040FAF725BA00BF4046002051 -:105FC000044B1A68DB6892689B689A4201D9FFF714 -:105FD000E1BF70474046002038B50123084C00253A -:105FE0002370656002F062FB02F088FB05490648F9 -:105FF00002F05EFC0223237085F3118838BD00BFD8 -:10600000E8480020849300084046002000F09AB938 -:10601000EFF3118020B9EFF30583302282F311886A -:106020007047000010B530B9EFF30584C4F30804DD -:1060300014B180F3118810BDFFF7C2FF84F31188FB -:10604000F9E70000034A516853685B1A9842FBD88D -:10605000704700BF001000E08B604B630023CA61F3 -:1060600000F128020B6302230A618B8401238861FB -:1060700081F8263001F11003C26A4A611360C362DD -:1060800001F12C030846CB6270470000D0E90131D2 -:10609000026841F8183CA1F19C033839CB600369D0 -:1060A00041F8243C436941F8203C034B41F8043C4F -:1060B000C3680248FFF7D0BF1D0400084046002017 -:1060C00008B5FFF7E3FFBDE80840FFF727BF000072 -:1060D00038B50E4BDC6804F12C05A062E06AA842DA -:1060E0000FD194F826303BB994F825309B0702BFB6 -:1060F000D4E9043213605A600F20BDE83840FFF73E -:106100000FBF0368E362FFF709FFE7E7404600209F -:10611000302383F31188FFF7DBBF000008B5014689 -:10612000302383F311880820FFF70AFF002383F34D -:10613000118808BD054BDB6821B10360986203201C -:10614000FFF7FEBE4FF0FF30704700BF4046002013 -:1061500003682BB10022026018469962FFF7DEBE89 -:1061600070470000064BDB6839B1426818605A601E -:10617000136043600420FFF7E3BE4FF0FF30704729 -:10618000404600200368984206D01A6802605060BA -:1061900018469962FFF7C2BE7047000038B5044642 -:1061A0000D462068844200D138BD036823605C60DE -:1061B0008562FFF7B3FEF4E7036810B59C68A2425E -:1061C0000CD85C688A600B604C60216059609968EB -:1061D0008A1A9A604FF0FF33836010BD121B1B6850 -:1061E000ECE700000A2938BF0A2170B504460D46C5 -:1061F0000A26601902F054FA02F03CFA041BA54288 -:1062000003D8751C04462E46F3E70A2E04D9012054 -:10621000BDE8704002F014BC70BD0000F8B5144B2E -:106220000D460A2A4FF00A07D96103F11001826076 -:1062300038BF0A224160196914460160486018613C -:10624000A81802F01DFA02F015FA431B0646A342F5 -:1062500006D37C1C28192746354602F021FAF2E7BE -:106260000A2F04D90120BDE8F84002F0E9BBF8BDCF -:1062700040460020F8B506460D4602F0FBF90F4AED -:10628000134653F8107F9F4206D12A4601463046F6 -:10629000BDE8F840FFF7C2BFD169BB68441A2C19AA -:1062A00028BF2C46A34202D92946FFF79BFF22466E -:1062B00031460348BDE8F840FFF77EBF4046002066 -:1062C00050460020C0E90323002310B45DF8044BBE -:1062D0004361FFF7CFBF000010B5194C2369984206 -:1062E0000DD08168D0E9003213605A609A680A4480 -:1062F0009A60002303604FF0FF33A36110BD026872 -:10630000234643F8102F53600022026022699A420C -:1063100003D1BDE8104002F0BDB9936881680B4419 -:10632000936002F0A7F92269E1699268441AA242D7 -:10633000E4D91144BDE81040091AFFF753BF00BF6C -:10634000404600202DE9F047DFF8BC8008F1100737 -:106350002C4ED8F8105002F08DF9D8F81C40AA68DD -:10636000031B9A423ED814444FF00009D5E900328D -:10637000C8F81C4013605A60C5F80090D8F8103077 -:10638000B34201D102F086F989F31188D5E90331CE -:1063900028469847302383F311886B69002BD8D0A7 -:1063A00002F068F96A69A0EB040982464A450DD2F9 -:1063B000022002F045FB0022D8F81030B34208D189 -:1063C00051462846BDE8F047FFF728BF121A22447D -:1063D000F2E712EB09092946384638BF4A46FFF76B -:1063E000EBFEB5E7D8F81030B34208D01444C8F833 -:1063F0001C00211AA960BDE8F047FFF7F3BEBDE815 -:10640000F08700BF504600204046002010B560B91C -:10641000074804790368053C9B6818BF0124984726 -:1064200008B144F00404204610BD0124FBE700BF7E -:10643000A4360020FFF7EABF2DE9F047884617464B -:106440009A460446B0B90D4E3579052D05D0032482 -:106450000DE0013D15F0FF050ED032685346394678 -:106460003046D2F814904246C8470028F1D1204661 -:10647000BDE8F0870424FAE70124F8E7A4360020F9 -:106480002DE9F047884617469A460446B0B90D4EA6 -:106490003579052D05D003240DE0013D15F0FF05EC -:1064A0000ED03268534639463046D2F818904246EC -:1064B000C8470028F1D12046BDE8F0870424FAE758 -:1064C0000124F8E7A436002037B50C46154670B90C -:1064D00051B101290BD10748694603681B6A9847E7 -:1064E00010B9019B04462B60204603B030BD042444 -:1064F000FAE700BFA436002000207047FEE7000046 -:10650000704700004FF0FF30704700004B68436059 -:106510008B688360CB68C3600B6943614B6903621E -:106520008B6943620B6803607047000008B53C4B01 -:1065300040F2FF713B48D3F888200A43C3F8882013 -:10654000D3F8882022F4FF6222F00702C3F88820E3 -:10655000D3F88820D3F8E0200A43C3F8E020D3F82A -:1065600008210A43C3F808212F4AD3F808311146FD -:10657000FFF7CCFF00F5806002F11C01FFF7C6FFBA -:1065800000F5806002F13801FFF7C0FF00F5806080 -:1065900002F15401FFF7BAFF00F5806002F17001CB -:1065A000FFF7B4FF00F5806002F18C01FFF7AEFF4A -:1065B00000F5806002F1A801FFF7A8FF00F58060F8 -:1065C00002F1C401FFF7A2FF00F5806002F1E001D3 -:1065D000FFF79CFF00F5806002F1FC01FFF796FFDA -:1065E00002F58C7100F58060FFF790FF01F0E2FB8F -:1065F0000E4BD3F8902242F00102C3F89022D3F858 -:10660000942242F00102C3F894220522C3F8982094 -:106610004FF06052C3F89C20054AC3F8A02008BD83 -:1066200000440258000002589893000800ED00E072 -:106630001F00080308B501F0DFFDFFF7CDFC104B8C -:10664000D3F8DC2042F04002C3F8DC20D3F8042168 -:1066500022F04002C3F80421D3F80431094B1A6830 -:1066600042F008021A601A6842F004021A6000F050 -:1066700035FD00F035FBBDE8084000F0B5B800BFBF -:10668000004402580018024801207047002070475B -:106690007047000002290CD0032904D001290748C3 -:1066A00018BF00207047032A05D8054800EBC20038 -:1066B0007047044870470020704700BF9C95000851 -:1066C000542200205095000870B59AB0054608463F -:1066D000144601A900F0C2F801A8FBF727FB431CF0 -:1066E0000022C6B25B001046C5E9003423700323C4 -:1066F000023404F8013C01ABD1B202348E4201D81D -:106700001AB070BD13F8011B013204F8010C04F833 -:10671000021CF1E708B5302383F311880348FFF723 -:1067200091F8002383F3118808BD00BFF0480020D2 -:1067300090F8803003F01F02012A07D190F88120E1 -:106740000B2A03D10023C0E91D3315E003F06003D9 -:10675000202B08D1B0F884302BB990F88120212A61 -:1067600003D81F2A04D8FFF74FB8222AEBD0FAE744 -:10677000034A426707228267C3670120704700BF50 -:106780004B22002007B5052917D8DFE801F01916BC -:1067900003191920302383F31188104A0121019035 -:1067A000FFF7F8F8019802210D4AFFF7F3F80D48BA -:1067B000FFF714F8002383F3118803B05DF804FB9E -:1067C000302383F311880748FEF7DEFFF2E730231A -:1067D00083F311880348FEF7F5FFEBE7F094000818 -:1067E00014950008F048002038B50C4D0C4C2A4692 -:1067F0000C4904F10800FFF767FF05F1CA0204F134 -:1068000010000949FFF760FF05F5CA7204F118008E -:106810000649BDE83840FFF757BF00BFC8610020F8 -:1068200054220020CC940008D9940008E494000875 -:1068300070B5044608460D46FBF778FAC6B2204606 -:10684000013403780BB9184670BD32462946FBF770 -:1068500059FA0028F3D10120F6E700002DE9F84F9E -:1068600005460C46FBF762FA2C49C6B22846FFF7EC -:10687000DFFF08B10336F6B229492846FFF7D8FFF3 -:1068800008B11036F6B2632E0DD8DFF89080DFF82D -:106890009090244FDFF894A0DFF894B02E7846B99A -:1068A0002670BDE8F88F29462046BDE8F84F02F073 -:1068B00045BA252E2ED1072241462846FBF722FA5B -:1068C00070B9DBF8003007350A3444F80A3CDBF8CD -:1068D000043044F8063CBBF8083024F8023CDDE7FD -:1068E000082249462846FBF70DFA98B9A21C0E4B20 -:1068F000197802320909C95D02F8041C13F8011B5A -:1069000001F00F015345C95D02F8031CF0D11834A2 -:106910000835C3E7013504F8016BBFE7BC950008F3 -:10692000E4940008CF95000800E8F11F0CE8F11F7F -:10693000C4950008BFF34F8F044B1A695107FCD16F -:10694000D3F810215207F8D1704700BF0020005241 -:1069500008B50D4B1B78ABB9FFF7ECFF0B4BDA68B2 -:10696000D10704D50A4A5A6002F188325A60D3F836 -:106970000C21D20706D5064AC3F8042102F1883259 -:10698000C3F8042108BD00BF266400200020005287 -:106990002301674508B5114B1B78F3B9104B1A69F1 -:1069A000510703D5DA6842F04002DA60D3F81021CB -:1069B000520705D5D3F80C2142F04002C3F80C2150 -:1069C000FFF7B8FF064BDA6842F00102DA60D3F84D -:1069D0000C2142F00102C3F80C2108BD26640020FE -:1069E000002000520F289ABF00F58060400400206C -:1069F000704700004FF400307047000010207047CF -:106A00000F2808B50BD8FFF7EDFF00F5003302683B -:106A1000013204D104308342F9D1012008BD0020A5 -:106A2000FCE700000F2838B505463FD8FFF782FF86 -:106A30001F4CFFF78DFF4FF0FF3307286361C4F849 -:106A400014311DD82361FFF775FF030243F02403BF -:106A5000E360E36843F08003E36023695A07FCD4F2 -:106A60002846FFF767FFFFF7BDFF4FF4003100F046 -:106A70008FFA2846FFF78EFFBDE83840FFF7C0BF0A -:106A8000C4F81031FFF756FFA0F108031B0243F0D2 -:106A90002403C4F80C31D4F80C3143F08003C4F85B -:106AA0000C31D4F810315B07FBD4D9E7002038BD96 -:106AB000002000522DE9F84F05460C46104645EAE5 -:106AC0000203DE0602D00020BDE8F88F20F01F0090 -:106AD000DFF8BCB0DFF8BCA0FFF73AFF04EB00081A -:106AE000444503D10120FFF755FFEDE72022294659 -:106AF000204602F0A7F810B920352034F0E72B46E5 -:106B000005F120021F68791CDDD104339A42F9D1C6 -:106B100005F178431B481C4EB3F5801F1B4B38BF53 -:106B2000184603F1F80332BFD946D1461E46FFF797 -:106B300001FF0760A5EB040C336804F11C0143F06E -:106B400002033360231FD9F8007017F00507FAD14C -:106B500053F8042F8B424CF80320F4D1BFF34F8F2E -:106B6000FFF7E8FE4FF0FF3320222146036028465E -:106B7000336823F00203336002F064F80028BBD0CE -:106B80003846B0E7142100520C2000521420005265 -:106B9000102000521021005210B5084C237828B163 -:106BA0001BB9FFF7D5FE0123237010BD002BFCD0CD -:106BB0002070BDE81040FFF7EDBE00BF2664002046 -:106BC0002DE9F04F0D4685B0814658B111F00D0604 -:106BD00014BF2022082211F00803019304D0431EA1 -:106BE000034269D0002435E0002E37D009F11F019F -:106BF00021F01F094FF00108314F05F00403DFF8C1 -:106C0000CCA005EA080BBBF1000F32D07869C007B1 -:106C10002FD408F101080C37B8F1060FF3D19EB953 -:106C2000284D4946A819019201F08AFD0446002822 -:106C300039D12036019AA02EF3D1494601F080FDCA -:106C4000044600282FD1019A49461F4801F078FDDB -:106C5000044660BB204605B0BDE8F08F0029C9D1CD -:106C600001462846029201F06BFD0446D8B9029A0B -:106C7000C0E713B178694107CBD5AC0702D5786975 -:106C80008007C6D5019911B178690107C1D5494678 -:106C90000AEB4810CDE9022301F052FD0446DDE97C -:106CA00002230028B5D04A460021204601E04A468A -:106CB0000021FBF743F8CDE70246002E96D199E775 -:106CC000E0950008686400202864002048640020E3 -:106CD0000021FFF775BF00000121FFF771BF000021 -:106CE00070B5144D0124144E40F2FF3200210120F2 -:106CF000FBF724F806EB441001342A6955F80C1F01 -:106D000001F00AFD062CF5D137254FF4C05420467A -:106D1000FFF7E2FF014628B122460848BDE870406F -:106D200001F0FABCC4EBC404013D4FEAD404EED137 -:106D300070BD00BFE0950008486400202864002072 -:106D40000421FFF73DBF00004843FFF7C1BF00002B -:106D500008B101F067BD7047B0F5805F10B504461B -:106D600007D8FFF7EDFF28B92046BDE81040FFF730 -:106D7000AFBF002010BD0000FFF7EABF08B501F06B -:106D800067FE034AD2E90032C01842EB010108BD98 -:106D900008650020434BD3E900232DE9F341134359 -:106DA0007CD0FFF7EBFF404A00230027F9F744FBB4 -:106DB00006460D463D4A0023F9F73EFB00231446E4 -:106DC00030462946394AF9F737FB4FF461613C23D5 -:106DD000ADF80170B4FBF1F5B4FBF3F601FB15411E -:106DE00003FB16464624B1FBF3F1314BF6B28DF8A6 -:106DF000004098423CD84FF0640C4FF4C87EA30783 -:106E000004F26C7225D1B2FBFCF30CFB132313BB11 -:106E1000B2FBFEF30EFB1322B2FA82F35B0903F21C -:106E20006D18621C8045D2B217D90FB18DF80040A1 -:106E30000022204C4FF00C0C17460CFB0343D4B23D -:106E4000013213F804C084450CD8A0EB0C000127D4 -:106E5000F5E70023E3E70123E1E7A0EB0800144690 -:106E60000127CCE70FB18DF80140431C8DF80230AB -:106E70009DF80100431C9DF800005038400640EA90 -:106E800043509DF8023040EA034040EA560040EA91 -:106E9000C52040EA411002B0BDE8F0814FF4041073 -:106EA000F9E700BF0865002040420F008051010053 -:106EB00090230B00289600080244074BD2B210B56D -:106EC000904200D110BD441C00B253F8200041F89C -:106ED000040BE0B2F4E700BF504000580E4B30B551 -:106EE0001C6F240405D41C6F1C671C6F44F4004401 -:106EF0001C670A4C02442368D2B243F480732360B7 -:106F0000074B904200D130BD441C51F8045B00B2E5 -:106F100043F82050E0B2F4E7004402580048025819 -:106F20005040005807B5012201A90020FFF7C4FF17 -:106F3000019803B05DF804FB13B50446FFF7F2FFB8 -:106F4000A04205D0012201A900200194FFF7C6FF4D -:106F500002B010BD10B56424013C4FF47A70FFF705 -:106F6000DDF814F0FF04F7D1084B4FF080721424C1 -:106F70009A6103F5805308229A61013C4FF47A70BC -:106F8000FFF7CCF814F0FF04F7D110BD0000025851 -:106F90000144BFF34F8F064B884204D3BFF34F8F9A -:106FA000BFF36F8F7047C3F85C022030F4E700BF77 -:106FB00000ED00E00144BFF34F8F064B884204D33D -:106FC000BFF34F8FBFF36F8F7047C3F8700220304D -:106FD000F4E700BF00ED00E070B5054616460C462C -:106FE00001201021FFF7B0FE286046733CB1204617 -:106FF00036B1FFF7A5FE2B68186000B19C6070BD2C -:10700000FFF76AFEF7E7000070B50E461546044626 -:1070100000B30B6843608368934210D213B10068D9 -:10702000FFF796FE637B28462BB1FFF789FE2060B1 -:1070300020B9A06070BDFFF74FFEF8E7A56020689B -:1070400005F11F01306021F01F01FFF7A1FF0120B2 -:107050002073EFE70120EDE710B5044640B100686A -:10706000884205D1606808B1FAF742FE0023237315 -:1070700010BD000070B50E461546044620B3836867 -:107080009A4210D913B10068FFF762FE637B28466D -:107090002BB1FFF755FE206020B9A06070BDFFF74F -:1070A0001BFEF8E7A560316819B12A462068FAF797 -:1070B0001FFE206805F11F01306021F01F01FFF75E -:1070C00079FF01202073E9E70120E7E720B1036899 -:1070D0008B4204BF0023037370470000034B1A6800 -:1070E0001AB9034AD2F8D0241A60704710650020FC -:1070F0000040025808B5FFF7F1FF024B1868C0F3D3 -:10710000806008BD1065002070B5BFF34F8FBFF3DE -:107110006F8F1A4A0021C2F85012BFF34F8FBFF38E -:107120006F8F536943F400335361BFF34F8FBFF345 -:107130006F8FC2F88410BFF34F8FD2F8803043F6C0 -:10714000E074C3F3C900C3F34E335B0103EA0406E2 -:10715000014646EA81750139C2F86052F9D2203BF6 -:1071600013F1200FF2D1BFF34F8F536943F48033F3 -:107170005361BFF34F8FBFF36F8F70BD00ED00E021 -:10718000FEE70000214B2248224A70B5904237D3D7 -:10719000214BC11EDA1C121A22F003028B4238BFA7 -:1071A00000220021FAF7CAFD1C4A0023C2F88430ED -:1071B000BFF34F8FD2F8803043F6E074C3F3C900B9 -:1071C000C3F34E335B0103EA0406014646EA8175C8 -:1071D0000139C2F86C52F9D2203B13F1200FF2D1E1 -:1071E000BFF34F8FBFF36F8FBFF34F8FBFF36F8F1F -:1071F0000023C2F85032BFF34F8FBFF36F8F70BDC3 -:1072000053F8041B40F8041BC0E700BF9097000828 -:1072100020670020206700202067002000ED00E0AC -:10722000074BD3F8D81021EA0001C3F8D810D3F8DF -:10723000002122EA0002C3F80021D3F80031704790 -:107240000044025870B5D0E9244300224FF0FF35C6 -:107250009E6804EB42135101D3F80009002805DAB7 -:10726000D3F8000940F08040C3F80009D3F8000BC0 -:10727000002805DAD3F8000B40F08040C3F8000B7B -:10728000013263189642C3F80859C3F8085BE0D28C -:107290004FF00113C4F81C3870BD0000890141F0A3 -:1072A0002001016103699B06FCD41220FEF7CABECF -:1072B00010B50A4C2046FEF74BFB094BC4F8903042 -:1072C000084BC4F89430084C2046FEF741FB074BAE -:1072D000C4F89030064BC4F8943010BD14650020FB -:1072E0000000084064960008B065002000000440DB -:1072F0007096000870B503780546012B5CD1434BAE -:10730000D0F89040984258D1414B0E216520D3F8D7 -:10731000D82042F00062C3F8D820D3F8002142F010 -:107320000062C3F80021D3F80021D3F8802042F096 -:107330000062C3F88020D3F8802022F00062C3F8F6 -:107340008020D3F8803000F041FF324BE360324BB5 -:10735000C4F800380023D5F89060C4F8003EC0237C -:1073600023604FF40413A3633369002BFCDA012379 -:107370000C203361FEF766FE3369DB07FCD4122074 -:10738000FEF760FE3369002BFCDA00262846A66073 -:10739000FFF758FF6B68C4F81068DB68C4F814681E -:1073A000C4F81C6883BB1D4BA3614FF0FF336361BE -:1073B000A36843F00103A36070BD194B9842C9D183 -:1073C000134B4FF08060D3F8D82042F00072C3F81E -:1073D000D820D3F8002142F00072C3F80021D3F87E -:1073E0000021D3F8802042F00072C3F88020D3F847 -:1073F000802022F00072C3F88020D3F88030FFF79D -:107400000FFF0E214D209EE7064BCDE714650020AF -:10741000004402584014004003002002003C30C0E9 -:10742000B0650020083C30C0F8B5D0F89040054663 -:1074300000214FF000662046FFF730FFD5F894108A -:1074400000234FF001128F684FF0FF30C4F834383A -:10745000C4F81C2804EB431201339F42C2F80069B0 -:10746000C2F8006BC2F80809C2F8080BF2D20B6828 -:10747000D5F89020C5F8983063621023136116691F -:1074800016F01006FBD11220FEF7DCFDD4F8003810 -:1074900023F4FE63C4F80038A36943F4402343F0A7 -:1074A0001003A3610923C4F81038C4F814380B4B37 -:1074B000EB604FF0C043C4F8103B094BC4F8003BED -:1074C000C4F81069C4F80039D5F8983003F11002F7 -:1074D00043F48013C5F89820A362F8BD40960008D5 -:1074E00040800010D0F8902090F88A10D2F8003830 -:1074F00023F4FE6343EA0113C2F80038704700002A -:107500002DE9F84300EB8103D0F890500C468046FB -:10751000DA680FFA81F94801166806F00306731E4F -:10752000022B05EB41134FF0000194BFB604384E17 -:10753000C3F8101B4FF0010104F1100398BF06F1CE -:10754000805601FA03F3916998BF06F500460029B9 -:107550003AD0578A04F15801374349016F50D5F8A2 -:107560001C180B430021C5F81C382B180127C3F841 -:107570001019A7405369611E9BB3138A928B9B0815 -:10758000012A88BF5343D8F89820981842EA034349 -:1075900001F140022146C8F89800284605EB820216 -:1075A0005360FFF77BFE08EB8900C3681B8A43EA40 -:1075B000845348341E4364012E51D5F81C381F43B0 -:1075C000C5F81C78BDE8F88305EB4917D7F8001B10 -:1075D00021F40041C7F8001BD5F81C1821EA030369 -:1075E000C0E704F13F030B4A2846214605EB83031D -:1075F0005A60FFF753FE05EB4910D0F8003923F429 -:107600000043C0F80039D5F81C3823EA0707D7E74C -:107610000080001000040002D0F894201268C0F826 -:107620009820FFF70FBE00005831D0F89030490184 -:107630005B5813F4004004D013F4001F0CBF022069 -:10764000012070474831D0F8903049015B5813F45D -:10765000004004D013F4001F0CBF0220012070472B -:1076600000EB8101CB68196A0B6813604B685360AB -:107670007047000000EB810330B5DD68AA6913682C -:10768000D36019B9402B84BF402313606B8A146800 -:10769000D0F890201C4402EB4110013C09B2B4FB2D -:1076A000F3F46343033323F0030343EAC44343F097 -:1076B000C043C0F8103B2B6803F00303012B0ED12D -:1076C000D2F8083802EB411013F4807FD0F8003B69 -:1076D00014BF43F0805343F00053C0F8003B02EB6B -:1076E0004112D2F8003B43F00443C2F8003B30BDE6 -:1076F0002DE9F041D0F8906005460C4606EB4113A9 -:10770000D3F8087B3A07C3F8087B08D5D6F81438B5 -:107710001B0704D500EB8103DB685B689847FA0719 -:107720001FD5D6F81438DB071BD505EB8403D968C1 -:10773000CCB98B69488A5A68B2FBF0F600FB162276 -:107740008AB91868DA6890420DD2121AC3E9002487 -:10775000302383F3118821462846FFF78BFF84F3FB -:107760001188BDE8F081012303FA04F26B8923EA52 -:1077700002036B81CB68002BF3D021462846BDE87D -:10778000F041184700EB81034A0170B5DD68D0F87D -:1077900090306C692668E66056BB1A444FF40020AE -:1077A000C2F810092A6802F00302012A0AB20ED1B7 -:1077B000D3F8080803EB421410F4807FD4F80009D2 -:1077C00014BF40F0805040F00050C4F8000903EBB3 -:1077D0004212D2F8000940F00440C2F80009012228 -:1077E000D3F8340802FA01F10143C3F8341870BD2C -:1077F00019B9402E84BF4020206020681A442E8A88 -:107800008419013CB4FBF6F440EAC44040F0005057 -:10781000C6E700002DE9F843D0F8906005460C4615 -:107820004F0106EB4113D3F8088918F0010FC3F894 -:1078300008891CD0D6F81038DB0718D500EB810377 -:10784000D3F80CC0DCF81430D3F800E0DA689645C1 -:1078500030D2A2EB0E024FF000091A60C3F8049078 -:10786000302383F31188FFF78DFF89F3118818F017 -:10787000800F1DD0D6F834380126A640334217D0E9 -:1078800005EB84030134D5F89050D3F80CC0E4B272 -:107890002F44DCF8142005EB0434D2F800E05168E2 -:1078A000714514D3D5F8343823EA0606C5F8346890 -:1078B000BDE8F883012303FA01F2038923EA0203F6 -:1078C0000381DCF80830002BD1D09847CFE7AEEB2E -:1078D0000103BCF81000834228BF0346D7F81809FB -:1078E00080B2B3EB800FE3D89068A0F1040959F897 -:1078F000048FC4F80080A0EB09089844B8F1040F85 -:10790000F5D818440B4490605360C8E72DE9F84F50 -:10791000D0F8905004466E69AB691E4016F480584A -:107920006E6103D0BDE8F84FFEF782B8002E12DA80 -:10793000D5F8003E9B0705D0D5F8003E23F00303A1 -:10794000C5F8003ED5F80438204623F00103C5F8F9 -:107950000438FEF79BF8370505D52046FFF772FC83 -:107960002046FEF781F8B0040CD5D5F8083813F09E -:10797000060FEB6823F470530CBF43F4105343F429 -:10798000A053EB6031071BD56368DB681BB9AB699B -:1079900023F00803AB612378052B0CD1D5F8003E0A -:1079A0009A0705D0D5F8003E23F00303C5F8003E42 -:1079B0002046FEF76BF86368DB680BB120469847FA -:1079C000F30200F1BA80B70226D5D4F890900027D0 -:1079D0004FF0010A09EB4712D2F8003B03F44023B1 -:1079E000B3F5802F11D1D2F8003B002B0DDA62895C -:1079F0000AFA07F322EA0303638104EB8703DB68D7 -:107A0000DB6813B13946204698470137D4F89430E3 -:107A1000FFB29B689F42DDD9F00619D5D4F89000DB -:107A2000026AC2F30A1702F00F0302F4F012B2F571 -:107A3000802F00F0CA80B2F5402F09D104EB8303F8 -:107A4000002200F58050DB681B6A974240F0B0804E -:107A50003003D5F8185835D5E90303D50021204661 -:107A6000FFF746FEAA0303D501212046FFF740FE9B -:107A70006B0303D502212046FFF73AFE2F0303D5FF -:107A800003212046FFF734FEE80203D504212046F7 -:107A9000FFF72EFEA90203D505212046FFF728FE99 -:107AA0006A0203D506212046FFF722FE2B0203D5EA -:107AB00007212046FFF71CFEEF0103D508212046D1 -:107AC000FFF716FE700340F1A780E90703D50021F8 -:107AD0002046FFF79FFEAA0703D501212046FFF7A6 -:107AE00099FE6B0703D502212046FFF793FE2F076F -:107AF00003D503212046FFF78DFEEE0603D50421B2 -:107B00002046FFF787FEA80603D505212046FFF78C -:107B100081FE690603D506212046FFF77BFE2A0673 -:107B200003D507212046FFF775FEEB0574D52046E7 -:107B30000821BDE8F84FFFF76DBED4F890904FF0E4 -:107B4000000B4FF0010AD4F894305FFA8BF79B6872 -:107B50009F423FF638AF09EB4713D3F8002902F4F0 -:107B60004022B2F5802F20D1D3F80029002A1CDA58 -:107B7000D3F8002942F09042C3F80029D3F8002935 -:107B8000002AFBDB3946D4F89000FFF787FB2289F7 -:107B90000AFA07F322EA0303238104EB8703DB6875 -:107BA0009B6813B13946204698470BF1010BCAE791 -:107BB000910701D1D0F80080072A02F101029CBF91 -:107BC00003F8018B4FEA18283FE704EB830300F525 -:107BD0008050DA68D2F818C0DCF80820DCE9001C14 -:107BE000A1EB0C0C00218F4208D1DB689B699A68DD -:107BF0003A449A605A683A445A6029E711F0030FF0 -:107C000001D1D0F800808C4501F1010184BF02F858 -:107C1000018B4FEA1828E6E7BDE8F88F08B503485E -:107C2000FFF774FEBDE8084000F070BF1465002047 -:107C300008B50348FFF76AFEBDE8084000F066BFDC -:107C4000B0650020D0F8903003EB4111D1F8003B33 -:107C500043F40013C1F8003B70470000D0F89030A7 -:107C600003EB4111D1F8003943F40013C1F8003996 -:107C700070470000D0F8903003EB4111D1F8003B81 -:107C800023F40013C1F8003B70470000D0F8903097 -:107C900003EB4111D1F8003923F40013C1F8003986 -:107CA00070470000064BD3F8DC200243C3F8DC2009 -:107CB000D3F804211043C3F80401D3F8043170470A -:107CC000004402583A4B4FF0FF31D3F8802062F065 -:107CD0000042C3F88020D3F8802002F00042C3F8AD -:107CE0008020D3F88020D3F88420C3F88410D3F800 -:107CF00084200022C3F88420D3F88400D86F40F099 -:107D0000FF4040F4FF0040F4DF4040F07F00D867C0 -:107D1000D86F20F0FF4020F4FF0020F4DF4020F077 -:107D20007F00D867D86FD3F888006FEA40506FEAB9 -:107D30005050C3F88800D3F88800C0F30A00C3F895 -:107D40008800D3F88800D3F89000C3F89010D3F8D7 -:107D50009000C3F89020D3F89000D3F89400C3F8B3 -:107D60009410D3F89400C3F89420D3F89400D3F877 -:107D70009800C3F89810D3F89800C3F89820D3F867 -:107D80009800D3F88C00C3F88C10D3F88C00C3F89B -:107D90008C20D3F88C00D3F89C00C3F89C10D3F847 -:107DA0009C10C3F89C20D3F89C3000F0D7B900BFDA -:107DB0000044025808B50122534BC3F80821534B25 -:107DC000D3F8F42042F00202C3F8F420D3F81C21C7 -:107DD00042F00202C3F81C210222D3F81C314C4BA2 -:107DE000DA605A689104FCD54A4A1A6001229A6006 -:107DF000494ADA6000221A614FF440429A61444BCA -:107E00009A699204FCD51A6842F480721A603F4B5A -:107E10001A6F12F4407F04D04FF480321A670022A8 -:107E20001A671A6842F001021A60384B1A68500744 -:107E3000FCD500221A611A6912F03802FBD1012127 -:107E400019604FF0804159605A67344ADA62344A07 -:107E50001A611A6842F480321A602C4B1A68910336 -:107E6000FCD51A6842F480521A601A689204FCD554 -:107E70002C4A2D499A6200225A63196301F57C014C -:107E8000DA6301F5E77199635A64284A1A64284A4B -:107E9000DA621A6842F0A8521A601C4B1A6802F0A3 -:107EA0002852B2F1285FF9D148229A614FF48862D2 -:107EB000DA6140221A621F4ADA641F4A1A651F4AB1 -:107EC0005A651F4A9A6532231E4A1360136803F0ED -:107ED0000F03022BFAD10D4A136943F00303136118 -:107EE000136903F03803182BFAD14FF00050FFF755 -:107EF000D9FE4FF08040FFF7D5FE4FF00040BDE8BF -:107F00000840FFF7CFBE00BF008000510044025878 -:107F10000048025800C000F0020000010000FF010C -:107F2000008890083220600063020901470E0508AE -:107F3000DD0BBF0120000020000001100910E0004F -:107F400000010110002000524FF0B04208B5D2F8F5 -:107F5000883003F00103C2F8883023B1044A136863 -:107F60000BB150689847BDE8084000F0CFBD00BF96 -:107F7000986600204FF0B04208B5D2F8883003F080 -:107F80000203C2F8883023B1044A93680BB1D06869 -:107F90009847BDE8084000F0B9BD00BF98660020D2 -:107FA0004FF0B04208B5D2F8883003F00403C2F8AD -:107FB000883023B1044A13690BB150699847BDE872 -:107FC000084000F0A3BD00BF986600204FF0B0420B -:107FD00008B5D2F8883003F00803C2F8883023B11E -:107FE000044A93690BB1D0699847BDE8084000F096 -:107FF0008DBD00BF986600204FF0B04208B5D2F8A2 -:10800000883003F01003C2F8883023B1044A136AA1 -:108010000BB1506A9847BDE8084000F077BD00BF3B -:10802000986600204FF0B04310B5D3F8884004F4B0 -:108030007872C3F88820A30604D5124A936A0BB15C -:10804000D06A9847600604D50E4A136B0BB1506B8B -:108050009847210604D50B4A936B0BB1D06B984718 -:10806000E20504D5074A136C0BB1506C9847A30581 -:1080700004D5044A936C0BB1D06C9847BDE810400E -:1080800000F044BD986600204FF0B04310B5D3F81F -:10809000884004F47C42C3F88820620504D5164A5F -:1080A000136D0BB1506D9847230504D5124A936D9B -:1080B0000BB1D06D9847E00404D50F4A136E0BB195 -:1080C000506E9847A10404D50B4A936E0BB1D06E45 -:1080D0009847620404D5084A136F0BB1506F984754 -:1080E000230404D5044A936F0BB1D06F9847BDE8C1 -:1080F000104000F00BBD00BF9866002008B5034893 -:10810000FCF70CFDBDE8084000F000BDA4360020DF -:1081100008B50348FCF706FEBDE8084000F0F6BCD1 -:10812000FC38002008B50348FCF7FCFDBDE808401A -:1081300000F0ECBC6839002008B50348FCF7F2FDFC -:10814000BDE8084000F0E2BCD439002008B500F0DA -:108150003FFDBDE8084000F0D9BC0000062108B58D -:10816000084600F033F80621072000F02FF806211A -:10817000082000F02BF80621092000F027F806213E -:108180000A2000F023F80621172000F01FF806212E -:10819000282000F01BF809217A2000F017F80921A7 -:1081A000312000F013F80721322000F00FF80C21E5 -:1081B000262000F00BF80C21272000F007F80C21F6 -:1081C0005220BDE8084000F001B80000090100F1AC -:1081D0006043012203F56143C9B283F8001300F044 -:1081E0001F039A4043099B0003F1604303F5614379 -:1081F000C3F880211A60704708B5FFF763FD00F0EF -:10820000AFFCFDF7C9F9FDF767F9FDF79FFBFDF737 -:1082100071FAFEF73DFABDE8084000F029BA000007 -:1082200030B50433039C0172002104FB0325C160B7 -:10823000C0E90653049B0363059BC0E90000C0E945 -:108240000422C0E90842C0E90A11436330BD0000BE -:108250000022416AC260C0E90411C0E90A226FF03D -:108260000101FDF79BBF0000D0E90432934201D128 -:10827000C2680AB9181D7047002070470369196069 -:108280000021C2680132C260C2691344826993420C -:10829000036124BF436A0361FDF774BF38B5044628 -:1082A0000D46E3683BB162690020131D1268A362AA -:1082B0001344E36207E0237A33B929462046FDF7E9 -:1082C00051FF0028EDDA38BD6FF00100FBE7000038 -:1082D000C368C269013BC360436913448269934226 -:1082E000436124BF436A436100238362036B03B18C -:1082F0001847704770B53023044683F31188866AA7 -:108300003EB9FFF7CBFF054618B186F31188284622 -:1083100070BDA36AE26A13F8015B9342A36202D3C1 -:108320002046FFF7D5FF002383F31188EFE7000015 -:108330002DE9F84F04460E46174698464FF030098F -:1083400089F311880025AA46D4F828B0BBF1000FA4 -:1083500009D141462046FFF7A1FF20B18BF31188D8 -:108360002846BDE8F88FD4E90A12A7EB050B521A8C -:10837000934528BF9346BBF1400F1BD9334601F10B -:10838000400251F8040B914243F8040BF9D1A36A5F -:10839000403640354033A362D4E90A239A4202D3DF -:1083A0002046FFF795FF8AF31188BD42D8D289F3A2 -:1083B0001188C9E730465A46F9F79AFCA36A5E4429 -:1083C0005D445B44A362E7E710B5029C043301728D -:1083D00003FB0421C460C0E906130023C0E90A338B -:1083E000039B0363049BC0E90000C0E90422C0E9C9 -:1083F0000842436310BD0000026A6FF00101C260D1 -:10840000426AC0E904220022C0E90A22FDF7C6BE82 -:10841000D0E904239A4201D1C26822B9184650F823 -:10842000043B0B60704700231846FAE7C36800213D -:10843000C2690133C3604369134482699342436153 -:1084400024BF436A4361FDF79DBE000038B5044672 -:108450000D46E3683BB1236900201A1DA262E26960 -:108460001344E36207E0237A33B929462046FDF737 -:1084700079FE0028EDDA38BD6FF00100FBE700005F -:1084800003691960C268013AC260C2691344826913 -:108490009342036124BF436A036100238362036B39 -:1084A00003B118477047000070B530230D460446ED -:1084B000114683F31188866A2EB9FFF7C7FF10B102 -:1084C00086F3118870BDA36A1D70A36AE26A013346 -:1084D0009342A36204D3E16920460439FFF7D0FF39 -:1084E000002080F31188EDE72DE9F84F04460D4692 -:1084F000904699464FF0300A8AF311880026B34619 -:10850000A76A4FB949462046FFF7A0FF20B187F37D -:1085100011883046BDE8F88FD4E90A073A1AA8EB6B -:108520000607974228BF1746402F1BD905F1400385 -:1085300055F8042B9D4240F8042BF9D1A36A40362C -:108540004033A362D4E90A239A4204D3E169204666 -:108550000439FFF795FF8BF311884645D9D28AF38A -:108560001188CDE729463A46F9F7C2FBA36A3D4494 -:108570003E443B44A362E5E7D0E904239A4217D185 -:10858000C3689BB1836A8BB1043B9B1A0ED0136006 -:10859000C368013BC360C3691A4483699A4202619C -:1085A00024BF436A03610023836201231846704796 -:1085B0000023FBE701F01F03F0B502F01F0456098A -:1085C0005A1C0123B6EB511F50F8265003FA02F350 -:1085D0004FEA511703F1FF333DBF50F82720C4F194 -:1085E0002000134003EA05003BBF03FA00F225FA1E -:1085F00004F0E0401043F0BD70B57E227F210546B7 -:10860000FFF7D8FF18B1012819D0002070BD3E2215 -:1086100049212846FFF7CEFF2F2204463121284664 -:10862000FFF7C8FF06460134502202365321284680 -:10863000B440FFF7BFFF093804FA00F0E6E7302244 -:1086400045212846FFF7B6FF01308002DEE7000033 -:1086500090F8D63090F8D7201B0403EB026390F813 -:10866000D42090F8D500134403EB0020704700009D -:1086700000F084BA014B586A704700BF000C0040FC -:10868000034B002258631A610222DA60704700BF70 -:10869000000C0040014B0022DA607047000C0040E3 -:1086A000014B5863704700BF000C0040024B034A67 -:1086B0001A60034A5A6070476466002020670020F1 -:1086C00000000220074B494210B55C68201A0840A0 -:1086D0001968821A8A4203D3A24201D85A6010BD97 -:1086E0000020FCE76466002008B5302383F311887E -:1086F000FFF7E8FF002383F3118808BD0448054B0A -:1087000003600023C0E901330C3000F017B900BF4B -:108710006C660020E9860008CB1D083A23F00703A9 -:10872000591A521A10B4D2080024C0E900438460D8 -:108730000C301C605A605DF8044B00F0FFB800007C -:108740002DE9F74F364FCD1D8846002818BF074644 -:10875000082A4FEAD50538BF082207F10C003C1D56 -:108760009146019000F02CF9019809F10701C9F137 -:10877000000E2246246864B900F02CF93B68CBB3A4 -:1087800008224946E8009847044698B340E9027831 -:1087900030E004EB010CD4F804A00CEA0E0C0AF152 -:1087A0000106ACF1080304EBC6069E42E1D9A6EB34 -:1087B0000C0CB5EBEC0F4FEAEC0BDAD89C421DD257 -:1087C00004F10802AB45A3EB02024FEAE202626049 -:1087D00009D9691CED4303EBC1025D44556025686E -:1087E00043F8315022601C46C3F8048044F8087BEB -:1087F00000F0F0F8204603B0BDE8F08FAA452168EC -:1088000002D111602346EEE7013504EBC50344F8BD -:10881000351003F10801761AF6105E601360F1E777 -:108820006C66002073B50446A0F1080550F8080CEA -:1088300054F8043C061D0C3007330190DB0844F863 -:10884000043C00F0BDF8334601989E421A6801D0FE -:10885000AB4228D20AB1954225D244F8082C54F8EC -:10886000042C1D60013254F8081C05EBC206B1420D -:1088700006D14E68324444F8042C0A6844F8082CA7 -:108880005E68711C03EBC1018D4207D154F8042CC2 -:10889000013232445A6054F8082C1A6002B0BDE824 -:1088A000704000F097B81346CFE70000FEE70000E5 -:1088B00070B51E4B0025044686B058600E46056311 -:1088C000816300F0FBF804F12803A5606563C4E947 -:1088D0000A3304F11003C4E904334FF0FF33C4E951 -:1088E0000044C4E90635FFF7C5FE2B46024604F1F5 -:1088F0003C012046C4E9082380230D4A6567FDF743 -:10890000ABFB7368E0600B4A03620123009280F8BE -:1089100024306846F26801923269CDE90223064BA1 -:10892000CDE90435FDF7CCFB06B070BDE84800206A -:10893000849600087C960008AD8800080023C0E9F2 -:10894000000083600361704770B51C4B0546846866 -:10895000DE685CB3B44213D103690133036170BDB7 -:10896000A36094F8243083B1062B15D1A06A214668 -:10897000D4E9003213605A60FDF7C0FAA36A9C681C -:10898000B368A2689A42EBD306E0D4E900322046ED -:1089900013605A60FDF7C2FA28463146FDF7AEFA79 -:1089A000B5620620BDE87040FDF7BABA036986607B -:1089B00001330361336BC3603063D0E7404600206E -:1089C00008B5302383F31188FFF7BEFF002383F33C -:1089D000118808BD194BD96883688B4210B520D126 -:1089E000302383F311880269013A0261B2B9046845 -:1089F000C368A0420B631ED04A6B9BB901238A60F7 -:108A0000036103681A68026050601A6B8360C26079 -:108A100018631846FDF782FAFDF7D2FA002383F3B4 -:108A2000118810BD1C68A34203D0A468A24238BFBD -:108A30002246DB68E1E78260F0E700BF40460020A5 -:108A4000024A536B18435063704700BF40460020F2 -:108A500070B5104E82B0FDF7DBFA0546FFF70AFE4F -:108A6000326803469042336037BF0B4A0A49516867 -:108A7000146836BF0131D1E900415160041928461C -:108A800041F100010191FDF7CDFA2046019902B0B4 -:108A900070BD00BF8C66002090660020EFF3098354 -:108AA000054968334A6B22F001024A6383F309885F -:108AB000002383F31188704700EF00E0302080F33B -:108AC000118862B60D4B0E4AD96821F4E0610904A1 -:108AD000090C0A430B49DA60D3F8FC2042F080729B -:108AE000C3F8FC20084AC2F8B01F116841F0010128 -:108AF00011602022DA7783F82200704700ED00E051 -:108B00000003FA0555CEACC5001000E0302310B5C7 -:108B100083F311880E4B5B6813F4006314D0F1EEFD -:108B2000103AEFF309844FF08073683CE361094B1E -:108B3000DB6B236684F30988FDF720FA10B1064B3E -:108B4000A36110BD054BFBE783F31188F9E700BF74 -:108B500000ED00E000EF00E02F0400083204000800 -:108B60000023054A19460133102BC2E9001102F116 -:108B70000802F8D1704700BF98660020114BD3F867 -:108B8000E82042F00802C3F8E820D3F8102142F0B0 -:108B90000802C3F810210C4AD3F81031D36B43F00C -:108BA0000803D363C722094B9A624FF0FF32DA629F -:108BB00000229A615A63DA605A6001225A611A608F -:108BC000704700BF004402580010005C000C0040D9 -:108BD000094A08B51169D3680B40D9B29B076FEAFF -:108BE0000101116107D5302383F31188FDF70EFAD7 -:108BF000002383F3118808BD000C0040FEF7A8B8DD -:108C0000012838BF012010B504462046FEF760F861 -:108C100030B900F007F808B900F00CF88047F4E725 -:108C200010BD0000024B1868BFF35B8F704700BF98 -:108C30001867002008B5062000F056F80120FDF75F -:108C40005DFC000010B501390244904201D10020C2 -:108C500005E0037811F8014FA34201D0181B10BDA5 -:108C60000130F2E7884210B501EB020402D98442D8 -:108C7000234607D8431EA14208D011F8012B03F860 -:108C8000012FF8E7024401468A4200D110BD13F8D3 -:108C9000014D02F8014DF7E71F2938B504460D468E -:108CA00004D9162303604FF0FF3038BD426C12B177 -:108CB00052F821304BB9204600F030F82A460146E0 -:108CC0002046BDE8384000F017B8012B0AD0591CE7 -:108CD00003D1162303600120E7E7002442F8254072 -:108CE000284698470020E0E7024B01461868FFF746 -:108CF000D3BF00BF7422002038B5074D00230446BF -:108D0000084611462B60FDF7FDFB431C02D12B6882 -:108D100003B1236038BD00BF1C670020FDF7ECBB2A -:108D2000C9B2034610F8012B1AB18A42F9D118468C -:108D30007047002918BF0023F9E70000034611F827 -:108D4000012B03F8012B002AF9D1704710B5013926 -:108D5000034632B111F8014F03F8014B013A002CE0 -:108D6000F7D11A440021934200D110BD03F8011B32 -:108D7000F9E700004D4435002D2D0A002F61726483 -:108D80007570696C6F742E6162696E002F61726418 -:108D90007570696C6F742D7665726966792E616283 -:108DA000696E002F6172647570696C6F742D666CEA -:108DB0006173682E6162696E002F617264757069FB -:108DC0006C6F742D666C61736865642E6162696E88 -:108DD000000000000000000000000000090F000873 -:108DE000A50F000855110008DD0F00089D0F0008B1 -:108DF0000000000000000000050F0008B10F00088F -:108E00008D110008010F00080D0F000853544D3359 -:108E10003248373F3F3F0053544D33324837337861 -:108E20002F3732780053544D3332483734332F378D -:108E300035332F373530000001105A000310590028 -:108E400001205800032056002F0000005375636373 -:108E500065737366756C6C79206D6F756E7465647F -:108E6000205344436172642028736C6F77646F777A -:108E70006E3D2575290A0000EB7690455846415411 -:108E800020202000464154333220202000000000E2 -:108E90002A3A3C3E7C223F7F002B2C3B3D5B5D0011 -:108EA0004355454141414143454545494949414172 -:108EB0004592924F4F4F5555594F554F9C4F9E9F3E -:108EC00041494F55A5A5A6A7A8A9AAABACADAEAF81 -:108ED000B0B1B2B3B4414141B8B9BABBBCBDBEBF79 -:108EE000C0C1C2C3C4C54141C8C9CACBCCCDCECF15 -:108EF000D1D145454549494949D9DADBDCDD49DF6E -:108F00004FE14F4F4F4FE6E8E85555555959EEEFB1 -:108F1000F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFFD9 -:108F200001030507090E10121416181C1E0000007C -:108F300061001A03E0001703F8000703FF000100B7 -:108F400078010001300132010601390110014A01A6 -:108F50002E017901060180014D0043028101820149 -:108F600082018401840186018701870189018A01C8 -:108F70008B018B018D018E018F0190019101910177 -:108F800093019401F60196019701980198013D0221 -:108F90009B019C019D0120029F01A001A001A20153 -:108FA000A201A401A401A601A701A701A901AA0188 -:108FB000AB01AC01AC01AE01AF01AF01B101B20137 -:108FC000B301B301B501B501B701B801B801BA01E8 -:108FD000BB01BC01BC01BE01F701C001C101C2015E -:108FE000C301C401C501C401C701C801C701CA0149 -:108FF000CB01CA01CD011001DD0101008E01DE01AE -:109000001201F3010300F101F401F401F801280158 -:10901000220212013A020900652C3B023B023D028A -:10902000662C3F0240024102410246020A015302FD -:10903000400081018601550289018A0158028F0191 -:109040005A0290015C025D025E025F0293016102BE -:10905000620294016402650266026702970196014A -:109060006A02622C6C026D026E029C017002710237 -:109070009D01730274029F017602770278027902E1 -:109080007A027B027C02642C7E027F02A6018102AE -:109090008202A9018402850286028702AE0144028F -:1090A000B101B20145028D028E028F02900291023F -:1090B000B7017B030300FD03FE03FF03AC030400C1 -:1090C0008603880389038A03B1031103C2030200E4 -:1090D000A303A303C4030803CC0303008C038E0380 -:1090E0008F03D8031801F2030A00F903F303F40312 -:1090F000F503F603F703F703F903FA03FA03300461 -:10910000200350041007600422018A043601C104C0 -:109110000E01CF040100C004D004440161052604FF -:10912000000000007D1D0100632C001E9601A01EA2 -:109130005A01001F0806101F0606201F0806301FD0 -:109140000806401F0606511F0700591F521F5B1FCC -:10915000541F5D1F561F5F1F601F0806701F0E0003 -:10916000BA1FBB1FC81FC91FCA1FCB1FDA1FDB1FB7 -:10917000F81FF91FEA1FEB1FFA1FFB1F801F0806CD -:10918000901F0806A01F0806B01F0400B81FB91FD3 -:10919000B21FBC1FCC1F0100C31FD01F0206E01F5F -:1091A0000206E51F0100EC1FF31F0100FC1F4E210A -:1091B0000100322170211002842101008321D0247A -:1091C0001A05302C2F04602C0201672C0601752C27 -:1091D0000201802C6401002D260841FF1A030000C3 -:1091E000C700FC00E900E200E400E000E500E70061 -:1091F000EA00EB00E800EF00EE00EC00C400C50060 -:10920000C900E600C600F400F600F200FB00F90019 -:10921000FF00D600DC00F800A300D800D7009201C0 -:10922000E100ED00F300FA00F100D100AA00BA005D -:10923000BF00AE00AC00BD00BC00A100AB00BB0095 -:1092400091259225932502252425C100C200C00046 -:10925000A9006325512557255D25A200A5001025ED -:10926000142534252C251C2500253C25E300C300AE -:109270005A25542569256625602550256C25A400AE -:10928000F000D000CA00CB00C8003101CD00CE00F4 -:10929000CF0018250C2588258425A600CC00802524 -:1092A000D300DF00D400D200F500D500B500FE00E9 -:1092B000DE00DA00DB00D900FD00DD00AF00B40005 -:1092C000AD00B1001720BE00B600A700F700B8003F -:1092D000B000A800B700B900B300B200A025A000FC -:1092E00001000000000000000096000000000000E7 -:1092F000000000000000000000000000000000006E -:1093000000000000896600088D6600086D510008A5 -:10931000A5540008015100082951000851510008C6 -:10932000E9500008000000005955000845550008A4 -:10933000815500086D5500087955000865550008ED -:10934000515500083D5500088D55000800000000EB -:10935000715600085D5600089956000885560008A9 -:10936000915600087D5600086956000855560008B9 -:10937000A5560008000000000100000000000000E9 -:10938000633000008093000800000000000000002F -:10939000B8460020E84800200000812A00000000B4 -:1093A000AAAAAAAA00000024FFFE000000000000F4 -:1093B00000A00A000001000000000000AAAAAAAA5A -:1093C00000000000FFFF000000000000000000009F -:1093D0001400AA5600000000AAAAAAAA1400555414 -:1093E000FFFF000000000000CCCC0C0020681A0039 -:1093F00000000000AAAA8AAA10541500FFFF00006E -:10940000000C70077700000040810201001000008E -:10941000AAAAAAAA00410100F7FF000000000070FC -:10942000070000000000000000000000AAAAAAAA8D -:1094300000000000FFFF000000000000000000002E -:109440000000000000000000AAAAAAAA0000000074 -:10945000FFFF00000000000000000000000000000E -:1094600000000000AAAAAAAA00000000FFFF000056 -:1094700000000000000000000000000000000000EC -:10948000AAAAAAAA00000000FFFF00000000000036 -:10949000000000000000000000000000AAAAAAAA24 -:1094A00000000000FFFF00000000000000000000BE -:1094B0000000000000000000AAAAAAAA0000000004 -:1094C000FFFF000000000000000000004865782F4A -:1094D00050726F6669434E430025424F4152442506 -:1094E0002D424C002553455249414C2500000000B7 -:1094F0000200000000000000915800080159000817 -:109500004000400098610020A86100200200000097 -:10951000000000000300000000000000495900089E -:109520000000000010000000B861002000000000F2 -:10953000010000000000000014650020010102008D -:109540008567000895660008316700081567000800 -:10955000430000005895000809024300020100C0C2 -:109560003209040000010202010005240010010577 -:1095700024010001042402020524060001070582DB -:10958000030800FF09040100020A000000070501AA -:1095900002400000070581024000000012000000A8 -:1095A000A49500081201100102000040AE2D161013 -:1095B00000020102030100000403090425424F4197 -:1095C00052442500437562654F72616E67650030D5 -:1095D0003132333435363738394142434445460019 -:1095E0000000002000000200020000000000003027 -:1095F0000000040008000000000000240000080033 -:10960000040000000004000000FC00000200000054 -:109610000000043000800000080000000000003856 -:1096200000000100010000001F1C1F1E1F1E1F1F45 -:109630001E1F1E1F1F1D1F1E1F1E1F1F1E1F1E1F42 -:1096400000000000A55A00085D5D0008095E0008E2 -:10965000400040004C6600204C66002001000000E5 -:109660005C6600208000000040010000080000004F -:1096700000010000001000000800000069646C6533 -:10968000000000006D61696E002C04380404380885 -:109690000C10141C20242526000000000000640487 -:1096A0000100040000000000000C0010283034000D -:1096B000B86DFF7F010000008C000000000000007A -:1096C00000001E0000000000FF000000F048002025 -:1096D000FC38002068390020D43900200000000048 -:1096E0000C8E000883040000178E00085004000050 -:1096F000258E000801000000000000000096000018 -:1097000000000800960000000008000004000000AF -:10971000B8950008000000000000000000000000F4 -:10972000000000000000000000000000782200207F -:109730000000000000000000000000000000000029 -:109740000000000000000000000000000000000019 -:109750000000000000000000000000000000000009 -:1097600000000000000000000000000000000000F9 -:1097700000000000000000000000000000000000E9 -:1097800000000000000000000000000000000000D9 +:100EF0009422002000220020A086010070470000FC +:100F000070470000704700002DE9F04100F5803780 +:100F1000044616463B7C5BB9C0681030204400F0A4 +:100F2000E5FEE5683544B5F5004FE56002D816B139 +:100F3000BDE8F081DEB905F07F0605F11000002163 +:100F4000C6F180062044F6B232462E4400F0F4FE8C +:100F5000A06804F11008324600F10060414600F537 +:100F6000003006F05FF830B901233B74E0E74FF43E +:100F700000463546ECE7A26805F1100140463244D0 +:100F80002144A260E268521BE26000F0AFFE022042 +:100F9000BDE8F04100F090BE183000F0E9BC000060 +:100FA00010B5044600F0FAFF204610BD10B5044607 +:100FB00000F0F4FF204610BDC3B280B2A3F141029D +:100FC000052A02D8373800B27047613B052B94BF21 +:100FD00057383038F7E70000F8B50446154608469C +:100FE00003220C4900F08CFE014688B908346F1CBE +:100FF00015F91100FFF7E0FF064617F9110001315E +:10100000FFF7DAFF102940EA061004F8010BEFD1D0 +:10101000F8BD00BF549200082DE9F04FADF53F7DBB +:101020000746416801222AA802F09AFE002840F0F3 +:1010300087800646824681461125DFF80C81DFF85D +:101040000CB101AB4FF4805241462AA802F0E8FFF0 +:10105000002875D1019AB2F5805F71D8002A65D059 +:101060000446019A9442ECD2282D0FD008DC132DAF +:101070002DD01E2D39D0112D13D00134A4B2F0E79C +:10108000322D2DD0372D2FD02D2DF6D13B68121BB0 +:1010900008EB040138461B692D259847BDF804402C +:1010A000EBE7121B022A09D9594608EB040000F0AD +:1010B00027FE18B902342825A4B2DEE718F8043058 +:1010C0003A2B3DD00A2B1CBFA1461325D5E718F8B3 +:1010D00004300A2B34D03A2B04BFA2463225CCE789 +:1010E00018F80430202BC8D0264618F804300A2BF4 +:1010F0001AD1AAEB090208EB090102A811254F2A0F +:1011000028BF4F2208F092F8A21B08EB060116A890 +:101110004F2A28BF4F2208F089F83B6816AA02A977 +:10112000DB6838469847A8E71E25A6E73B6838469F +:1011300004491B69984701200DF53F7DBDE8F08FFC +:101140000020F9E756930008A023002058920008D9 +:1011500000F1180110B5044686B00846019100F070 +:10116000F1FB2046FFF758FF60B1019902A800F09B +:1011700049FC102204F1080102A808F017F8B0FA9F +:1011800080F0400906B010BD70B504460025EEB2EF +:10119000304600F0FFFC58B100213046013500F028 +:1011A00009FD08B9002070BD022000F085FDEEE7C2 +:1011B0002046FFF731FF0028F4D004F58034207C6E +:1011C00080F00100EFE70000F0B5C9B006F096F935 +:1011D00000F000FF18B90025284649B0F0BD694667 +:1011E0002A4802F0DFFF00284BD1294C204603F0AB +:1011F00009F8284803F006F8274803F003F82146C9 +:10120000224803F07BF80028E5D1702000F0C0FEF2 +:10121000064610B1214B44600360336830469B683A +:101220009847054600282ED01A4F1948394603F032 +:1012300065F805460028CED1194800F0A9FE0446FD +:1012400038B1184B4760036000F58033C0E90255A0 +:101250001D74236820469B689847054628B10E49AF +:101260000C4803F04BF80028B5D1336830465B6872 +:1012700098471CB1236820465B68984700F092FEAF +:10128000AAE70025FAE70446EFE700BF5C920008F2 +:101290006C9200088392000899920008BC920008A2 +:1012A00014000100D89200082DE9F04FD44A8DB007 +:1012B0000B68D0F804A001931A440368D14E1A4475 +:1012C000D1F81C90DFF8B4C3DFF8B4B3D0E902342E +:1012D000634003EA0A03634013444A6802920AEB3C +:1012E0007363029CC84A2244C468224484688AEA20 +:1012F00004051D40654015448A68039203EB35558B +:10130000039CC24A2244846822448AEA03042C4093 +:1013100084EA0A041444CA6805EBF43404921644BF +:1013200083EA0502224056445A4032440E6905962B +:1013300004EBB222059FB64E3E441E4485EA0403E8 +:1013400013406B4033444E69069602EB7363069F6D +:10135000B04E3E442E4484EA02051D4065403544AB +:101360008E69079603EB3555079FAB4E3E442644E6 +:1013700082EA03042C4054403444A84E4E4405EB0A +:10138000F434164483EA050222405A4032440E6A7D +:10139000089604EBB222089FA14E3E441E4485EA03 +:1013A000040313406B4033444E6A099602EB7363A7 +:1013B000099F9C4ED1F830E03E44D1F83880F34488 +:1013C0002E4484EA02051D40654035448E6AA6F528 +:1013D000244703EB35550A964F3F274482EA03041E +:1013E0002C4054403C44CF6A0B9705EBF4340B9EE1 +:1013F0008D4F3744029E174483EA050222405A402B +:101400003A448A4F774404EBB2221F4485EA04032E +:1014100013406B403B444F6BBC4402EB7363654429 +:1014200084EA020C0CEA030C8CEA040C6544DFF835 +:1014300054C2C44403EB3555A44482EA03042C404F +:1014400054406444D1F83CC0794905EBF43461441C +:10145000114483EA050222405A400A44754904EBCC +:10146000B2223144079E194484EA02032B406340B0 +:101470000B44714902EBF36331440B9E0D4482EA45 +:1014800003012140514029446C4D03EBF151354497 +:10149000019E254483EA010414405C402C44684DBD +:1014A00001EBB4443544069E154481EA04021A4017 +:1014B0004A402A44634D04EB323235440A9E1D44AF +:1014C00084EA02030B4063402B445F4D02EBF3635D +:1014D0003544059E0D4482EA0301214051402944D0 +:1014E0005A4D03EBF1516544254483EA010414404D +:1014F0005C402C44564D01EBB4443544099E1544E0 +:1015000081EA04021A404A402A44524D04EB323226 +:101510003544049E1D4484EA02030B4063402B447F +:101520004D4D02EBF36345440D4482EA0301214033 +:1015300051402944494D03EBF1513544089E2C4458 +:1015400083EA010515405D402C44454D01EBB44450 +:101550003544039E2A4481EA04051D404D402A4437 +:10156000404D04EB32323D442B4484EA020593445F +:101570000D4065402B443C4D02EBF3633544069E21 +:10158000294482EA0305254055402944374D03EBA1 +:10159000F1514D442C4483EA010515405D4025443A +:1015A00001EBB54581EA050404EA03024A405A44C6 +:1015B000A6F5B82B089E05EB3232ABF2BE6B544059 +:1015C0005B4423442A4C344402EB33730B9E0C449B +:1015D00085EA020159402144264C344403EB715101 +:1015E000029E254482EA03044C402544224C444494 +:1015F00001EB3545144483EA01026A40224443E08A +:1016000078A46AD7EECEBDC156B7C7E8DB702024F8 +:10161000AF0F7CF52AC68747134630A8019546FDD3 +:10162000D8988069AFF7448BBED75C892211906B44 +:101630002108B44962251EF640B340C0515A5E26C7 +:10164000AAC7B6E95D102FD65314440281E6A1D88B +:10165000C8FBD3E7E6CDE121D60737C3870DD5F424 +:10166000ED145A4505E9E3A9F8A3EFFCD9026F6729 +:1016700081F6718722619D6D0C38E5FD937198FDAF +:101680008A4C2A8D8E4379A6934C344405EB722202 +:10169000059E1C4481EA0503534023448F4C344487 +:1016A00002EB33730A9E0C4485EA0201594021443F +:1016B0008B4C4C4403EB7151254482EA03044C40AB +:1016C0002C44884D354401EB3444019E154483EA93 +:1016D000010262402A44844D3D4404EB72221D44C1 +:1016E00081EA040353402B44804D354402EB3373AD +:1016F000049E294484EA02055D4029447C4D35441A +:1017000003EB7151079E254482EA03044C402C44AC +:10171000784D354401EB3444099E2A4483EA01059F +:1017200065401544744A324404EB7525039E134406 +:1017300081EA04026A401A44704B734405EB32722A +:101740000B4484EA0501514019446D4B634402EB9C +:1017500071511C4485EA02034B401C44694B3344DD +:1017600001EB3444019E1D4482EA010363402B4493 +:10177000654D04EB73233544069E154463EA01026C +:1017800062402A44614D03EBB2624D4462EA0409AF +:1017900029445F4D89EA0309454449442C445D4D81 +:1017A00002EBB1513544049E61EA03081D4488EA06 +:1017B0000208444401EB744464EA02034B402B44A6 +:1017C000554D04EBF323754463EA010E15448EEA8C +:1017D000040E0EEB0502514D03EBB262354462EA92 +:1017E000040E29440A9D8EEA030EA5F580164C4D81 +:1017F0007144A6F6833602EBB151264461EA030434 +:1018000054403444029E01EB7444354464EA0206B9 +:101810001D444E407319089E424D04EBF32335449A +:1018200063EA01061544664072193F4D03EBB2624C +:10183000654462EA040629443C4D5E403144079EFB +:1018400002EBB151354461EA03062C44384D564051 +:101850003D443444059E1D4401EB744464EA020394 +:101860004B402B44334D04EBF32335440B9E15447E +:1018700063EA010262402A442F4D03EBB262354411 +:10188000039E0D4462EA0401594029442B4D02EBAA +:10189000B15135442A4E254461EA030454402C4496 +:1018A000099D01EB74442E4464EA02051E4485EA56 +:1018B00001039D1903681A440AEB040303EBF523A3 +:1018C0000260436083681C44C36819448460C1603B +:1018D0000DB0BDE8F08F00BF44EABEA4A9CFDE4B37 +:1018E000604BBBF670BCBFBEC67E9B28FA27A1EA40 +:1018F0008530EFD4051D880439D0D4D9E599DBE6CD +:10190000F87CA21F6556ACC4442229F497FF2A43F1 +:10191000A72394AB39A093FCC3595B6592CC0C8F81 +:10192000D15D84854F7EA86FE0E62CFE144301A3B1 +:10193000A111084E827E53F735F23ABDBBD2D72AA9 +:1019400091D386EB094B036003F18833436003F1C5 +:101950002943A3F59613A3F68B638360A3F1883321 +:10196000C3600023C0E90433704700BF012345670B +:101970002DE9F8431446026905460E46E300C2F31A +:10198000C50800F118079B18036122BF43690133A2 +:10199000436112F4FC7F436903EB5473436114D039 +:1019A000C8F1400907EB08004C4504D22246BDE8C7 +:1019B000F84307F00BBC403C4A464E4407F006FC97 +:1019C000444439462846FFF76FFCA04606EB04095D +:1019D000B8F13F0FA9EB08010AD94022384607F0B9 +:1019E000F5FB39462846A8F14008FFF75DFCEFE714 +:1019F000A1096FF03F02384602FB014206EB81115C +:101A0000D5E7000070B50B6901F1180506460C46D4 +:101A1000C3F3C503EA18501C8022EA54C3F13F0205 +:101A2000072A1FD8002100F087F929462046FFF732 +:101A30003BFC38220021284600F07EF92369294624 +:101A40002046236563696365FFF72EFC214610225B +:101A5000304607F0BBFB204658220021BDE870400D +:101A600000F06AB9C3F137020021E5E72DE9F84F2C +:101A70004FF47A7306460D46002402FB03F7DFF8A5 +:101A80005080DFF8509098F900305FFA84FA5A1CC1 +:101A900001D0A34210D159F824002A4631460368E8 +:101AA000D3F820B03B46D847854205D1074B0120EB +:101AB00083F800A0BDE8F88F0134042CE3D14FF483 +:101AC000FA7004F0D3FD0020F4E700BFE4330020F7 +:101AD0001022002014220020002307B50246012115 +:101AE0000DF107008DF80730FFF7C0FF20B19DF81A +:101AF000070003B05DF804FB4FF0FF30F9E700008A +:101B00000A46042108B5FFF7B1FF80F00100C0B21A +:101B1000404208BD074B0A4630B41978064B53F8CB +:101B20002140014623682046DD69044BAC4630BCA9 +:101B3000604700BFE433002014220020A08601008B +:101B400070B50A4E00240A4D05F010FA308028685E +:101B50003388834208D905F005FA2B680444013321 +:101B6000B4F5003F2B60F2D370BD00BFE633002018 +:101B7000A033002005F0C8BA00F1006000F5003085 +:101B80000068704700F10060920000F5003005F039 +:101B900049BA0000054B1A68054B1B889B1A834203 +:101BA00002D9104405F0DEB900207047A0330020B0 +:101BB000E633002038B50446074D29B12868204493 +:101BC000BDE8384005F0E6B92868204405F0D0F9B2 +:101BD0000028F3D038BD00BFA0330020002070479C +:101BE00000F1FF5000F58F10D0F80008704700009A +:101BF000064991F8243033B100230822086A81F89D +:101C00002430FFF7BFBF0120704700BFA43300207E +:101C1000014B1868704700BF0010005C194B013879 +:101C20000322084470B51D68174BC5F30B042D0C37 +:101C30001E88A6420BD15C680A46013C82421346CC +:101C40000FD214F9016F4EB102F8016BF6E7013AB9 +:101C500003F10803ECD181420B4602D22C2203F897 +:101C6000012B0424094A1688AE4204D1984284BF4D +:101C7000967803F8016B013C02F10402F3D1581A83 +:101C800070BD00BF0010005C2422002018930008E3 +:101C9000022803D1024B4FF080529A61704700BF77 +:101CA00000100258022803D1024B4FF480529A616F +:101CB000704700BF00100258022804D1024A53693D +:101CC00083F48053536170470010025870B5044686 +:101CD0004FF47A764CB1412C254628BF412506FBAE +:101CE00005F0641B04F0C2FCF4E770BD002310B5DE +:101CF000934203D0CC5CC4540133F9E710BD00001B +:101D0000013810B510F9013F3BB191F900409C42F8 +:101D100003D11AB10131013AF4E71AB191F9002067 +:101D2000981A10BD1046FCE703460246D01A12F975 +:101D3000011B0029FAD1704702440346934202D0A6 +:101D400003F8011BFAE770472DE9F8431F4D1446CD +:101D50000746884695F8242052BBDFF870909CB364 +:101D600095F824302BB92022FF2148462F62FFF737 +:101D7000E3FF95F824004146C0F1080205EB80001E +:101D8000A24228BF2246D6B29200FFF7AFFF95F8D5 +:101D90002430A41B17441E449044E4B2F6B2082E2B +:101DA00085F82460DBD1FFF723FF0028D7D108E0B6 +:101DB0002B6A03EB82038342CFD0FFF719FF002881 +:101DC000CBD10020BDE8F8830120FBE7A43300203D +:101DD000024B1A78024B1A70704700BFE4330020A0 +:101DE00010220020F8B5194C194803F047FF21468E +:101DF000174803F06FFF24684FF47A70154ED4F83B +:101E00009020154DD2F80438114F43F00203C2F868 +:101E10000438FFF75BFF2046104904F069F8D4F856 +:101E200090200424D2F8043823F00203C2F80438C6 +:101E30004FF4E133336055F8040BB84202D0314619 +:101E400003F07AFE013CF6D1F8BD00BF189B0008F4 +:101E500018490020CC33002014220020209B0008C9 +:101E60000C4B70B50C4D04461E780C4B55F82620D3 +:101E70009A420DD00A4B002118221846FFF75CFF4A +:101E80000460014655F82600BDE8704003F054BEDA +:101E900070BD00BFE4330020142200201849002048 +:101EA000CC330020F8B571B6002301201A4619463C +:101EB00002F094FD0446802005F0C6F9002849D0C0 +:101EC0000025254A80274FF4D06C3D26136913F076 +:101ED000C06F26D1D2F8103113F0C06F21D1236822 +:101EE00005F1006199602368D86023685F6023680A +:101EF000C3F800C021680B6843F001030B60216840 +:101F00000B6823F01E030B6021680B68DB07FCD411 +:101F1000237B8035616806FA03F3B5F5001F0B607B +:101F2000D4D1204602F09AFDB5F5001F11D000244F +:101F30000A4E0B4D012005F0E7F83388A34205D97E +:101F400028682044013405F025F8F6E7002005F064 +:101F5000DBF861B6F8BD00BF00200052E633002078 +:101F6000A033002030B50A44084D91420DD011F83D +:101F7000013B5840082340F30004013B2C4013F080 +:101F8000FF0384EA5000F6D1EFE730BD2083B8EDBF +:101F90000121884238BF084605F08EB908B105F026 +:101FA0008FB9704710B5084C01220849002001F094 +:101FB000B3FE23783BB1064803F036FD044803F036 +:101FC00069FD0023237010BDE8330020289300082A +:101FD000C83600201D482DE9F041036D2BB90122C0 +:101FE0004FF48051503005F0CBFA194E33780BB1D5 +:101FF000FFF7D8FF0324174F4FF00008134D154982 +:102000002846C7F8048003F037FD284603F070FB2C +:1020100048B1013C284603F03DFD14F0FF04EED129 +:10202000204634700FE00C4901220C4801F074FE88 +:10203000014618B1284603F0F7FCEAE7084800F02B +:1020400011F801203070BDE8F08100BFC8360020D3 +:10205000E83300203C22002028930008EC330020C5 +:102060002C9300080FB4002004B07047006870473C +:1020700003460068596870470B0A017043700B0CE7 +:10208000090E8370C1707047110A027003714170AC +:10209000110C120E8170C2701A0A42711A0C1B0EBA +:1020A0008271C37170470000C36A0239023B8B42E0 +:1020B00083BF4389006C01FB0300002070470000D0 +:1020C000C2F307238A76CB760378032B01BF120C69 +:1020D0000A75120A4A75704700F10B010022D301FC +:1020E00043EA520310F8012B52FA83F38842DAB222 +:1020F000F5D110467047000010B541780446002025 +:10210000013102464901022A16BFA35C032203EBF8 +:10211000C03302F101021EBF9BB203EB500398B221 +:102120009142F0D810BD000002684AB1134613F87E +:10213000011B1F290DD93A29F9D1911C8B4202D0DC +:102140004FF0FF3070471278302AF9D10360002039 +:102150007047014B187870473836002038B50D4667 +:10216000044618B9092000232B6038BD0368002BF2 +:10217000F8D01A78002AF5D08188DA889142F1D116 +:10218000587804F00FFC10F00100EBD12368EBE766 +:1021900038B50D4640F25231144602F0B9F9FF2825 +:1021A00007D9012C0BD9030A022468702B70204632 +:1021B00038BD30B1002CFAD001242870F7E7002494 +:1021C000F5E70446F3E700002DE9F8430026D0F8D0 +:1021D000008005460C468E76836B002B4AD098F81B +:1021E0000030042B4BD133463546402720E0B7F56D +:1021F000187F80F0C480F90606F1010608BF023797 +:10220000D05B02372BB900F5205292B2B2F5006FC5 +:102210000DD305F11A01C5F1FF0240EA0340214444 +:10222000FFF7B6FF002800F0AA800544002003460F +:10223000D8F8102092F82310B142D8D8002B40F0E3 +:102240009E80002D00F09B8000232544AB766373B5 +:10225000D8F81020137903F03701DB0621730BD473 +:1022600002F13800FFF704FFC4E90001938963819C +:10227000D3892381BDE8F88300200146F4E7C36CCD +:1022800001335ED1EA6B00232E26551E184615F841 +:10229000011F013020290CD0052908BFE52109289C +:1022A00004D10B2B9EBFE71801337E73E71801336F +:1022B00079730B28EBD1E11800204873A17E002927 +:1022C0004BD1002B40D06FF00C0604F10D00082517 +:1022D000361B331810F8011B002938D02E298BB279 +:1022E0004AD0A3F14101192903D8117B0D4200D036 +:1022F00020330373EDE7B9F1000F05D100F520534A +:102300009BB2B3F5006F0BD307F11A01C7F1FF02BF +:1023100040EA09402144FFF73BFF48B10744002051 +:1023200002368146D8F80C30985B0028E3D1384655 +:10233000B9F1000F4FF0000218BF002023189A7661 +:10234000A0E7B1463746EDE73F23A37601232344B8 +:1023500000219976137B03B96373D37A02F11C00D1 +:1023600003F03F0323730023FFF780FE20606360C8 +:10237000D38A6381138B7CE710250B46B9E73F2393 +:102380000125A37660E7000038B50546002435F83E +:10239000020B08B9204638BD02F0EEF86308C2B25D +:1023A00003EBC43312FA83F39AB2C0F3072303EBAF +:1023B000520303EBC2339CB2E9E7000037B5C378A0 +:1023C00004461BB90025284603B030BD00F14C017E +:1023D000826C01234078019104F00AFB054680B924 +:1023E000A36BE070A06C226BC31A9342EAD2A3786D +:1023F0000199022BE6D102440123607804F0F8FA37 +:10240000E1E70125DFE7000038B5836C05460C469F +:102410008B4210D0FFF7D2FF60B92246012305F1AD +:102420004C01687804F0C0FA00281CBF4FF0FF345C +:102430000120AC6438BD0020FCE7000038B5002363 +:102440000446C3704FF0FF338364FFF7DDFF0028BD +:102450004BD1B4F84A524AF655239D4207D10B227C +:10246000254904F14C0006F0A1FE00283FD094F865 +:102470004C30EB2B03D01833DBB2012B2ED84AF6AD +:1024800055239D4206D108221C4904F19E0006F006 +:102490008DFE48B3B4F85730B3F5007F1ED194F8E1 +:1024A0005930DBB15A1E1A4218D1B4F85A30ABB1C8 +:1024B00094F85C30013B012B10D8B4F85D306BB15F +:1024C000B4F85F307F2B06D804F16C00FFF7CEFD27 +:1024D000B0F5803F02D3B4F8623053B94AF65520C4 +:1024E00085420CBF0220032038BD0420FCE70120F8 +:1024F000FAE70020F8E700BF58930008649300084B +:1025000002392DE9F04701F007044FF0010A466C4B +:1025100005460AFA04F41746984606EB1136C1F34D +:10252000C809E4B2314628460136FFF76DFF18B1FD +:102530000120BDE8F087994605EB090292F84C307E +:10254000234214BF01210021414513D06340013FC4 +:1025500082F84C3085F803A0EBD0640014F0FF043F +:10256000EAD109F1010301244FF00009B3F5007F1E +:10257000E1D1D7E70220DCE701290246F8B50C4695 +:1025800040F28C800668F36A8B4240F28780337891 +:10259000013B032B00F28280DFE803F00229384B75 +:1025A00004EB5405B16B304601EB5521FFF72CFFCE +:1025B00010B14FF0FF30F8BD6F1CC5F30805B16BCB +:1025C0003046354401EB572195F84C50FFF71CFF7E +:1025D0000028EED1C7F30807E3073E4496F84C0005 +:1025E00045EA00204CBF0009C0F30B00E3E7B16BE4 +:1025F000304601EB1421FFF707FF0028D9D1640012 +:1026000004F4FF742644B6F84C00D4E7B16B3046AE +:1026100001EBD411FFF7F8FE0028CAD1A40006F19F +:102620004C0004F4FE742044FFF720FD20F07040BD +:10263000C1E7D0E90430D57953EA000101D09168AF +:1026400001B95DBB9168022DA4EB01010DD1013BE5 +:10265000728940F1FF305B0A43EAC053B3FBF2F3E7 +:1026600099421BD81CD0601CA5E7032D02D19369A9 +:102670008B42F8D8D3699BB9B16B304601EBD411CA +:10268000FFF7C2FE002894D1A0004C3600F4FE7083 +:102690003044FFF7EBFC20F000408CE701208AE794 +:1026A0006FF0004087E70000F8B5066804460D4665 +:1026B0003378042B0CBF4FF080524FF400128A4243 +:1026C00001D80220F8BDCA06FBD182680163D2B9E5 +:1026D000022B13D83389B3EB551FF2D9F36BA363E5 +:1026E000A36B6263002BECD003EB55234C36C5F390 +:1026F00008050020A3633544E563E3E7F36BC2718B +:10270000002BE7D01A4677897F02BD42114604D2DA +:102710003046FFF7C9FCA063E2E72046FFF72CFF35 +:10272000431C024606D00128CBD9F36A8342C8D99C +:10273000ED1BEAE70120C5E701292DE9F047064630 +:102740000C46174608D9C36A8B4205D90378022B79 +:1027500062D003D8012B22D0022552E0033B012B8B +:10276000FAD8816B01EBD411FFF74EFE0546002825 +:1027700047D1A40006F14C0304F4FE741C443378E2 +:10278000042B07D0204627F07047FFF76FFC00F0BE +:102790007040074339462046FFF76EFC2FE001EBFF +:1027A0005108816B01EB5821FFF72EFE054640BB17 +:1027B00014F0010406F14C0908F1010AC8F30808F5 +:1027C00008BFFBB230461FBF19F8083003F00F02F4 +:1027D0003B0103F0F00318BF134309F8083001234D +:1027E000B16BF37001EB5A21FFF70EFE054640B9BD +:1027F000CAF3080A44B1C7F3071709F80A7001239E +:10280000F3702846BDE8F08719F80A30C7F30327AC +:1028100023F00F031F43F0E7816B01EB1421FFF757 +:10282000F3FD05460028ECD1640006F14C0304F4E6 +:10283000FF741F551919C7F307274F70DFE7000012 +:10284000F8B504460E461746E3690BB91846F8BDBD +:10285000012BA6EB0305206814BFAA1C3A46691C8D +:10286000FFF76AFF0028F2D1E369013BE361EBE780 +:1028700001292DE9F84306460C461746056802D89B +:102880000220BDE8F883EB6A8B42F9D97AB9A146F8 +:1028900021463046A046FFF76FFE0446B0B92B78BC +:1028A000042B02D1002F43D1F7710020E9E72B78E8 +:1028B000042B02D1C379022BE9D04FF0FF32394605 +:1028C0002846FFF739FF0028E1D0DAE70128D7D002 +:1028D000421C01D10120D4E72B78042B19D1EA6ADC +:1028E000AB69023A93421CD308F10102A2420CD018 +:1028F0002B78042B08D10023A2EB09024946284675 +:10290000FFF7FEFD0028BCD1A146EB6AA342BFD869 +:10291000C5E7002241462846FFF70EFF0028DED01B +:10292000AFE70133AB612B7943F001032B71DBE798 +:10293000F3798BB9B468BC4202D10223F371B4E7D6 +:1029400021463046FFF718FE012899D9431CC1D013 +:1029500001348442EFD0A8E7032BA6D1B368BB4271 +:10296000A3D8B2691344BB429FD3E6E770B5C379DD +:102970000446032B06D181688369CD18A94203D18F +:102980000023E371002070BD4E1C20683246FFF723 +:10299000D3FE0028F7D13146F0E700002DE9F743D8 +:1029A00005460191FFF70AFD0446002849D105F1CB +:1029B0004C09019928464FF40072FFF775FB214638 +:1029C000A86407464846FFF7B7F96C896402B4F576 +:1029D000004F28BF4FF40044B4F5007F2FD92046A4 +:1029E00004F072FC804630B122460021640A0026C1 +:1029F000FFF7A2F909E06408EEE72346BA19414659 +:102A0000687803F0F5FF18B926446B899E42F4D329 +:102A1000404604F069FC6889801B18BF012003B0A0 +:102A2000BDE8F08301366B899E42F4D20123BA19C6 +:102A30004946687803F0DCFF0028F3D0EBE7002676 +:102A4000F1E70120EBE70000F8B50446FFF7B6FC1C +:102A50000546002842D12378032B37D12779012F4F +:102A600034D104F14C0601464FF400723046FFF7B2 +:102A700063F955234122722184F84A32AA2304F5CE +:102A80000D7084F84F2084F84B32522384F83012B2 +:102A900084F84C3084F84D30612384F8311284F886 +:102AA0004E3084F83332A16984F83222FFF7E4FA19 +:102AB000616904F50E70FFF7DFFA626B3B46314641 +:102AC00001326078A26403F093FF257100226078E0 +:102AD000114603F0B1FF003818BF0120F8BD000017 +:102AE00000232DE9F0430B6085B00F461546FFF734 +:102AF0001BFB061EC0F2B281804B53F82640002C0F +:102B000000F0AE813C6005F0FE0523786BB1607883 +:102B100003F048FFC70708D41DB110F0040500D02A +:102B20000A25284605B0BDE8F0830023F0B22370E3 +:102B3000607003F023FFC10700F194810DB14207DB +:102B4000EED400212046FFF779FC022840F099805E +:102B50006E4604F2122304F2522132461846103314 +:102B6000FFF784FA42F8040B8B42F7D1002556F8A0 +:102B7000041B00297DD02046FFF760FC012879D88E +:102B80000128A26C40F0C08004F1570304F18C01CD +:102B900013F8015B002D7BD18B42F9D1B4F8B4302E +:102BA000B3F5807F74D194F8B830092B70D104F15B +:102BB0009400FFF75DFA4FF0FF33171841F1000161 +:102BC000BB4275EB010363D304F1A000FFF74EFA9B +:102BD00094F8BA302063012BA37059D194F8B990BE +:102BE00003FA09F91FFA89F36381002B50D0444B93 +:102BF00004F1A800FFF73AFA0646984248D8831C29 +:102C0000626304F1A400E362FFF730FA00EB02080C +:102C100004F19C00C4F84080FFF728FA10441FFA22 +:102C200089F2A06306FB02F313EB080345EB0502F0 +:102C30009F4271EB02032BD32E4604F1AC00FFF749 +:102C400015FAE06365B96389B34221D9E16B204687 +:102C5000FFF72AFA81192046FFF7D6FB98B901360B +:102C6000631993F84C30812B14D02035C5F3080537 +:102C7000E8E703200135042D7FF479AF042807D15C +:102C800001E0042801D101254BE701287FF678AF48 +:102C90000D2546E705F1140004F14C063044FFF71A +:102CA000E5F901280546F3D9E36A8342F0D9618941 +:102CB000821E236C02FB01336364A16B204601EB8F +:102CC000D511FFF7A1FB0028DDD105F07F0006EB51 +:102CD0008000FFF7CBF9431C03D00135A842ECD0AC +:102CE000D6E70425C4E90500064A257000251388A7 +:102CF000E56101339BB21380E38012E73C3600208C +:102D0000FDFFFF7F40360020B4F85730B3F5007F59 +:102D1000BED1B4F8626026B904F17000FFF7A6F9DD +:102D2000064694F85C302663591EA3700129AFD87B +:102D300094F859506581002DAAD0691E2942A7D167 +:102D4000B4F85D8018F00F0FA4F80880A0D1B4F893 +:102D50005F0018B904F16C00FFF788F9B4F85A1055 +:102D6000002995D006FB03FE01EB181CF4446045D6 +:102D70008ED3A0EB0C00A842B0FBF5F388D33E48FD +:102D8000834285D84FF6F57083426DD903259F1C89 +:102D9000114402EB0C03032DE7626263A163236419 +:102DA0004CD1B4F8763053EA08037FF471AFBB001E +:102DB00004F17800FFF75AF9E06303F2FF13B6EB72 +:102DC000532FFFF465AF4FF0FF33032DC4E90533F4 +:102DD0004FF08003237187D1B4F87C30012B83D16D +:102DE000511C2046FFF710FB00287FF47DAFB4F89C +:102DF0004A224AF6552320719A427FF475AF1F4B41 +:102E000004F14C00FFF732F998427FF46DAF03F103 +:102E1000FF5304F50C70FFF729F903F50053203335 +:102E200098427FF461AF04F50D70FFF71FF9A061C0 +:102E300004F50E70FFF71AF9606155E7B8F1000F5D +:102E40003FF426AF7144022D4FEA4703E1631EBFF2 +:102E5000D91907F0010303EB5103AEE70B2560E638 +:102E60000C255EE603255CE640F6F575AB428CBFAB +:102E7000022501258BE700BFF5FFFF0F525261418C +:102E80002DE9F84F07460568884649B96E69C6B10D +:102E9000EB6AB34298BF0126AB69A3B9002405E0F1 +:102EA000FFF76AFB0128044603D801242046BDE849 +:102EB000F88F421C00F0D280EB6A8342F6D8464677 +:102EC000EAE70126E8E72A78EB6A042A40F08380E3 +:102ED000A6F1020A023B4FF0010B9A4528BF4FF0C2 +:102EE000000AD146696C284601EB1931FFF78CFACC +:102EF00000283BD109F00703EA6AC9F3C8010BFABD +:102F000003F3901EDBB26A184C4609F1010992F8EE +:102F10004C20814502EA030233BF5B0000234FF4DB +:102F20000071DBB228BF9946B2B90234631E033385 +:102F3000BCD80123214628461A46FFF7E1FA0228A9 +:102F4000B3D0012800F08A80B8F1000F13D102231A +:102F5000FB710028A9D130E0CA450AD0002BD2D19C +:102F60000131B1F5007FBDD20123CCE74FF0FF3432 +:102F7000DCE70024DAE7FB79022B07D1731CA342BC +:102F8000E7D0BB68F31ABB610323FB7108F10102B0 +:102F9000FB69A24205D113B10133FB61D9E70223DA +:102FA000FBE70BB90123FB61224641463846FFF798 +:102FB00047FC00284FD10123FB61EA6AAB69023A62 +:102FC0006C6193429CBF03F1FF33AB612B7943F0FB +:102FD00001032B716AE7464514D1741C3846A3429D +:102FE00098BF02242146FFF7C7FA01283FF45DAFDE +:102FF000431C33D0E0B16B69012B03D9EA6A9342D9 +:1030000038BF1E4634460134EB6AA34203D8012E72 +:103010007FF644AF022421463846FFF7ADFA48B1A7 +:1030200001283FF442AF013018D0B442EBD135E76C +:10303000002CE7D04FF0FF3221462846FFF77CFBFB +:1030400048B9B8F1000FB8D0224641462846FFF7EC +:1030500073FB0028B1D001287FF427AF4FF0FF3475 +:1030600024E700002DE9F84306680446076B89460B +:1030700033782037042B0CBF4FF080534FF40013EC +:10308000BB429CBF00238363836B73B1C7F3080803 +:10309000B8F1000F3CD10133416B836339B93389F7 +:1030A000B3EB571F34D80023A36304200AE07389CD +:1030B000013B13EA57232BD1FFF75EFA012805469F +:1030C00002D80220BDE8F883421C01D10120F9E7B3 +:1030D000F36A834216D8B9F1000FE4D0616B204641 +:1030E000FFF7CEFE0546C8B10128EAD0431CEDD05B +:1030F00001463046FFF752FC0028E7D1E37943F060 +:103100000403E371294630466563FEF7CDFFA063F3 +:103110004C36002027634644E663D3E70720D1E717 +:10312000F8B50E46002104460768FFF7BDFA98B9C6 +:103130000546A16B3846FFF767F968B93A78E36B43 +:10314000042A1B780CD11B060ED50546012120460A +:10315000FFF788FF0028ECD0042808BF072006E00E +:10316000E52B01D0002BF0D10135B542EED1F8BDF1 +:10317000C16C4B1C2DE9F04104460568066B1FD15C +:10318000E5274FF00108A16B2846FFF73DF998B9F4 +:103190002A78E36B042A09BF1A781F7002F07F02B5 +:1031A0001A7085F80380236BB3420DD200212046AC +:1031B000FFF758FF0028E6D0042808BF022003E0EC +:1031C000FFF772FA0028DBD0BDE8F0812DE9F0416D +:1031D00005460068A96B0669FFF716F9044620B991 +:1031E000EB6B1A78852A03D002242046BDE8F081D3 +:1031F000324603F1200153F8040B8B4242F8040BD2 +:10320000F9D1777801377F01A7F16003B3F5007F2B +:10321000EAD800212846FFF725FF04280446E3D01A +:103220000028E2D1A96B2868FFF7EEF804460028D1 +:10323000DBD1EB6B1A78C02AD6D106F1200203F15C +:10324000200153F8040B8B4242F8040BF9D196F895 +:1032500023300F222C33B3FBF2F3B7EB431FC3D35E +:103260004FF0400800212846FFF7FCFE04280446E2 +:10327000BAD00028B9D1A96B2868FFF7C5F8044671 +:103280000028B2D1EB6B1A78C12AADD1B8F5187FFE +:1032900009D206EB080203F1200153F8040B8B421C +:1032A00042F8040BF9D108F120084745DAD8B8F5FF +:1032B000187F9AD83046FEF71FFF7388834294D058 +:1032C00092E700000B68002210B5036004460B6A09 +:1032D00083604B6AC261C37123F0FF03896AC0E94E +:1032E0000432C164FFF7E0F920B92046BDE8104080 +:1032F000FFF76CBF10BD0000F8B503680546012755 +:103300001C692046FEF7F8FEA070000A6678E0709F +:103310002846E96CFFF7C8F920B1022828BF02202F +:10332000C0B2F8BDA96B2868FFF76EF80028F4D189 +:10333000EB6B04F1200254F8041B944243F8041B85 +:10334000F9D12B68DF70002EE7D000212846013E1E +:10335000FFF788FEE0E700002DE9F8434FF0FF0893 +:1033600006460768042445464FF6FF79B16B11B94C +:10337000002C73D063E03846FFF746F80446002877 +:103380005DD1F06B0378002B6ED03A78042A11D10E +:10339000852B4DD1336B3046F364FFF717FF04469E +:1033A00000284CD13B691B7903F03F03B3712046E1 +:1033B000BDE8F883C27AE52B02F03F02B27143D038 +:1033C0002E2B41D022F0200108293DD00F2A40D1D8 +:1033D000590637D503F0BF05336B90F80D80F364C1 +:1033E000437B434530D1428B72BB03780D21FC688F +:1033F00023F04003DFF874E0013B4B4301211EF84A +:1034000001CB30F80CC009B3FF2B1DD824F813C032 +:103410006146013301320D2AF1D10278520605D5F9 +:1034200021B1FF2B10D8002224F81320013DEDB26A +:1034300000213046FFF716FE0446002896D00023F0 +:10344000B363B4E7AB42CBD0FF25F1E7CC45E1D085 +:10345000FAE72DB9FEF740FE404501D10024A6E76A +:103460004FF0FF33F364A2E70424E8E70094000878 +:103470002DE9F04F002187B00446D0F80090FFF707 +:1034800013F9804670B999F80030042B33D1D9F87C +:103490000C00FEF779FF07462046FFF75DFF054663 +:1034A00020B18046404607B0BDE8F08FD9F8103013 +:1034B0009A8CBA42F0D193F823B040265D4506D1EC +:1034C000D9F80C3033F81530002BE5D1EAE7F106D6 +:1034D000D9F8103008BF0236985B01F04DF8D9F8E2 +:1034E0000C30824633F8150001F046F88245D3D1FE +:1034F00002360135E2E74FF0FF0A4FF0FF3B554639 +:10350000C4F84CB0A16B4846FEF77EFF00285CD1A2 +:10351000E66B3778002F77D0F27AE52F02F03F0381 +:10352000A37103D0120704D50F2B04D0C4F84CB0FC +:103530004FE00F2B54D194F84B3058063FD4790606 +:1035400045D5236B07F0BF0796F80DA0E364737BA6 +:1035500053453ED1738B002B3BD135780121D9F8EF +:103560000C3005F03F0501930D23013D5D43284BD1 +:1035700013F8012BB25A71B3FF2D059329D81046C9 +:10358000049200F0F9FF6B1C03900293019B33F847 +:10359000150000F0F1FF039981421AD1049A029DAF +:1035A0001146059B1B4A9342E2D133785A0604D553 +:1035B00019B1019B33F815305BB97D1EEDB20021C6 +:1035C0002046FFF74FFD00289CD080466AE7BD42A9 +:1035D000BDD0FF25F3E74FF6FF708242E2D0F8E757 +:1035E0002DB93046FEF778FD50453FF45BAF94F8B7 +:1035F0004B30DB079AD40B2204F14001304605F032 +:10360000D5FD002892D14DE74FF004084AE700BFEE +:10361000009400080D9400082DE9F04F90F84BB08D +:1036200099B004461BF0A00540F068810668F26876 +:1036300032F81530002B4AD13378042B40F08780C4 +:103640000F230E352046B5FBF3F5A91CFFF768FDE7 +:103650008146002877D1236B0135A3EB4515E3792B +:103660005A07E56435D523F004032046E371FFF7DC +:103670007DF950BB4FF0FF32616B2046FFF7E0F859 +:1036800018BBA3682BB3214604A8FFF71BFEE0B9C3 +:1036900070894FF40071D4E90423E0FB0123306901 +:1036A000C4E904233830FEF7EFFC3069D4E9042381 +:1036B0002830FEF7E9FCE379326904A843F00103FE +:1036C00082F82130FFF718FE18B181463BE0013542 +:1036D000AEE7D6E90354402200212046FEF72CFB3A +:1036E0008523012140222370C0234FF0C10C04EB3D +:1036F000010884F8203000231E469E46571C04F81B +:1037000002C0F0B2023204F807E021B135F813101C +:1037100009B10133DBB20F0AA15408F8027002327A +:10372000D706F2D135F813700136002FE6D184F8B0 +:103730002330831C28466370FEF726FE84F824009D +:10374000000A84F82500484619B0BDE8F08F04F15E +:1037500040070DF1100A1BF0010F97E807008AE8F7 +:10376000070000F0D38040234FF0010884F84B306D +:10377000BC46F368B8F1050F9AE80700ACE803000F +:103780002CF8022B4FEA12428CF8002059D9981ECF +:10379000424630F8021F002942D10DF10F0C0721DB +:1037A00002F00F0E914612090EF13000392888BF41 +:1037B0000EF1370001390CF8010902D0B9F10F0FF1 +:1037C000EED818AB7E205A1802F8580C3846002262 +:1037D000914206D010F801CB02F1010EBCF1200F8E +:1037E00031D104F13F0C072902F1010297BF18AB58 +:1037F00020205818013198BF10F8580C072A0CF8EF +:103800000200F0D92046FFF733FE8146002878D128 +:1038100008F10108B8F1640FAAD14FF0070992E747 +:103820004FF0100C01F0010E49080EEB4202D303D9 +:1038300044BF82F4883282F02102BCF1010CF1D144 +:10384000A7E74246A9E77246C2E7216B2046A1EBF3 +:103850004511FEF729FF814600287FF474AF4FF62B +:10386000FF783846FEF738FC0190A16B3046FEF732 +:10387000CBFD814600287FF466AFE36BE9B2019A85 +:103880004FF00D0CD6F80CE05A734FF00F02DFF832 +:10389000E0A0DA724A1E18730CFB02F28446987696 +:1038A000D87640451AF8019B0CF1010C18BF3EF880 +:1038B000120003EB090B18BF013203F809004FEAAD +:1038C0001029002808BF4046BCF10D0F8BF801906D +:1038D000E7D1404502D03EF812200AB941F040013C +:1038E0001970012300212046F370FFF7BBFB8146CE +:1038F00000287FF428AF013DB7D11BE04FF0060947 +:1039000021E704287FF41FAF84F84BB01BF0020FAF +:1039100020461BBF0C350D210125B5FBF1F518BF65 +:1039200001352946FFF7FCFB814600287FF40BAFE9 +:10393000013D8AD1A16B3046FEF766FD8146002825 +:103940007FF401AF01462022E06BFEF7F5F9E36B4F +:1039500003CF18605960BA7839889A72198194F83F +:103960004B30E26B03F0180313730123F370EAE6A4 +:103970000094000810B504460A463430FEF776FB82 +:10398000886004F13800FEF773FBC2E9040194F883 +:10399000213003F00203D3710023D36110BD000076 +:1039A00003284B8B04BF8A8A43EA024318467047B8 +:1039B0002DE9F04F0B7899B0044689462F2BD0F8AB +:1039C00000B001D05C2B09D14A46137891460132F0 +:1039D0002F2BFAD05C2BF8D0002301E0DBF81C3051 +:1039E000A3600023E3619BF80030042B1ED1A36881 +:1039F000E3B1DBF82030214604A82362DBF8243051 +:103A00006362DBF82830A362FFF75CFC0346002802 +:103A100054D1DBF8102002F13800FEF727FBC4E98F +:103A2000040392F8213003F00203E37199F80030A7 +:103A30001F2B00F2358180230021204684F84B3073 +:103A400019B0BDE8F04FFEF72FBE49460B78894606 +:103A500001312F2BFAD05C2BF8D01F2B8CBF002507 +:103A60000425012F2FD113882E2B31D1002322F8CA +:103A7000173004F140029F428CBF2E2120210133D8 +:103A80000B2B02F8011BF6D145F02005204684F8E7 +:103A90004B50FFF7EDFC94F84B30002800F0E78026 +:103AA00004280BD1990603F0040240F1DC80002ABF +:103AB00000F0F6808023002084F84B3019B0BDE878 +:103AC000F08F0425CDE7022F02D153882E2BCAD0C8 +:103AD000911E87BB002322F81730002F00F01181C0 +:103AE00032F81300194601332028F9D009B92E28DD +:103AF00001D145F00305901E30F817302E2B01D070 +:103B0000013FF9D14FF020334FF0000A6364D046F3 +:103B10002364C4F847300823481C32F81160009031 +:103B2000F6B1202E03D02E2E0DD1B84210D045F084 +:103B300003050099F0E731F81730202B01D02E2B28 +:103B4000C8D1013FC5E79A4505D20099B9423BD19A +:103B50000B2B30D101E00B2B27D145F003050B23B4 +:103B600094F84020E52A04BF052284F84020082B61 +:103B700004BF4FEA88085FFA88F808F00C030C2BA2 +:103B800003D008F00303032B01D145F00205A80779 +:103B90003FF57CAF18F0010F18BF45F0100518F085 +:103BA000040F18BF45F0080570E70099B94202D02C +:103BB00045F00305D4D84FEA88080B234FF0080AD4 +:103BC00000975FFA88F8B4E77F2E15D9304640F2A7 +:103BD0005231CDE9022345F00203019300F098FC35 +:103BE00010F0800F0646DDE9022316D000F07F06B4 +:103BF00046498E5D019D46B331464548CDE90123D6 +:103C000005F0FEFADDE90123F8B9A6F1410189B218 +:103C100019291ED848F0020810E0FF28EAD9591ED9 +:103C20008A4503D345F003059A4682E704EB0A016F +:103C3000000A0AF1010A019D81F8400004EB0A0123 +:103C40000AF1010A81F8406073E745F003055F2639 +:103C5000F4E7A6F1610189B219299EBF203E48F020 +:103C60000108B6B2EAE7002A08BF052026E75A078E +:103C70003FF524AFA379DB0645D59BF80000042867 +:103C800035D1A3682146E27923622369DBF810006D +:103C900023F0FF0313436362E36CA362FFF76AFE42 +:103CA00023680027DA6819F8010B00283FF409AFF0 +:103CB00040F25231009200F04BFC054608B31F2839 +:103CC000009A7FF6FEAE2F283FF4BFAE5C283FF48B +:103CD000BCAE7F2805D801460E4805F091FA009A3F +:103CE00078B9FF2F0DD022F817500137DBE7216B91 +:103CF0000BF14C03C1F308011944FFF751FEA0601A +:103D0000CEE70620DAE60520D8E600BF809300085B +:103D100079930008709300081FB5CDE9001003A83F +:103D200014460391FEF700FA002815DB0B4A52F8FF +:103D300020300BB100211970019B0BB100211970CB +:103D400042F820302CB1002201A96846FEF7C8FED7 +:103D50000446204604B010BD0B24FAE73C36002090 +:103D60002DE9F04798B0904605460191002800F0F3 +:103D7000528102F03F0603A901A83246FEF7B0FEC9 +:103D8000002840F04681039B4FF48C60049303F0BD +:103D90009BFA0746002800F04081039B00F5007263 +:103DA0000199D86004A81A61FFF702FE044620B901 +:103DB0009DF95B30002BB8BF062418F01C0F00F0F3 +:103DC000CD80002C4CD0042C40D104A8FFF724FC5B +:103DD000044600283AD146F00806039B1A78042AC4 +:103DE00040F08380186929462B60FFF7C3FD039BD1 +:103DF0001E22002118690230FDF79EFF039C00215E +:103E00001A2220692630FDF797FF236920221A71B4 +:103E1000246903F093FA0146012208342046FEF794 +:103E20002BF9039B04A81B6983F82120FFF764FA90 +:103E3000044658B9A96801B302462846FEF718FDA2 +:103E4000AB68039A0446013B5361B4B1384603F0B2 +:103E50004BFA0CB100232B60204618B0BDE8F08768 +:103E60009DF8163013F0110F40F0848018F0040F05 +:103E700040F0C98018F0080FAFD1039A31071399A9 +:103E8000936C48BF46F04006E964AB6410780428A0 +:103E900072D1069B9DF817102B62089B106923F0C6 +:103EA000FF030B4329466B62179BAB62FFF762FD72 +:103EB000DDF80CA00024002205F15008BAF8063005 +:103EC00021464046C5F800A0AB80002385F830604D +:103ED00085F831406C64C5E90E234FF40072FDF79C +:103EE0002BFFB20653D40024B0E703F027FA0146B3 +:103EF000009013980E30FEF7BFF813980099163013 +:103F0000FEF7BAF8039C13992078FFF749FD2023A8 +:103F100000228046CB7220461399FEF7D1F8139BFE +:103F2000002201211A775A779A77DA77039BD970A2 +:103F3000B8F1000FA1D0414604A8D3F84890FEF78D +:103F400097FC0446002881D149460398FEF75CFAA5 +:103F5000039B044608F1FF30586176E7002C7FF49C +:103F600075AF9DF81630DC064FD418F0020F84D0E0 +:103F7000D80782D5072469E7FFF712FD0023A86060 +:103F800001F11C00FEF772F86B61286190E7D5E93A +:103F9000046956EA0903A6D0BAF80AA0A9684FEA4C +:103FA0004A2AC5E90E69B24574EB09031BD3002404 +:103FB0002964002C7FF44AAFC6F30803002B92D08B +:103FC000039C2046FEF770F808B3760A01234146A9 +:103FD00046EAC95682196A64607802F0E5FC041E5C +:103FE00018BF012432E72846FEF7C6FAB6EB0A06E8 +:103FF000014669F10009012803D9431CD3D10124EA +:10400000D6E70224D4E7082420E704241EE702248C +:104010001CE704461EE709241EE711241CE70000E4 +:104020002DE9F04F994685B00023884603A9044640 +:10403000C9F800301646FEF791F8054680BB94F8A3 +:1040400031506DBB94F8303013F00103009300F051 +:10405000A68004F1500AD4E90432D4E90E011B1AF7 +:1040600062EB0102B34272F1000238BF1E46BEB1DC +:10407000D4E90E10C1F30803002B40F08280039BAB +:104080005A894B0A013A43EAC0531A401BD151EAFC +:10409000000309D1A06801280DD8022584F8315009 +:1040A000284605B0BDE8F08F216C20460192FEF74E +:1040B00063FA019AEFE7431C04D10123009D84F8C1 +:1040C0003130EDE72064DDF80CB0216C5846FDF787 +:1040D000EBFF0028E1D0B6F5007F02EB000731D3FB +:1040E000BBF80A1002EB5620730A88429BF80100C5 +:1040F00088BF8B1A3A464146019302F055FC0028CE +:10410000DBD194F93020019B002A0BDA606CC01BD4 +:10411000984207D24FF40072514608EB4020FDF759 +:10412000E5FD019B5F02D9F80030F61BB8443B4423 +:10413000C9F80030D4E90E32DB1942F10002C4E9BB +:104140000E3294E7626CBA421AD094F93030002BE8 +:104150000DDA012351469BF8010002F049FC0028CA +:10416000ABD194F8303003F07F0384F830300398FB +:1041700001233A465146407802F016FC00289CD1B3 +:104180006764A16B4046C1F30801C1F50077514453 +:10419000B74228BF37463A46FDF7A8FDC3E70725D3 +:1041A0007EE7000070B596B00E460022019002A98D +:1041B00001A8FEF795FC0446E0B94FF48C6003F0CB +:1041C00083F80546D8B1029B00F500720199D860CA +:1041D00002A81A61FFF7ECFB044640B99DF9533081 +:1041E000002B0ADB1EB1314602A8FDF7EDFF284681 +:1041F00003F07AF8204616B070BD0624F7E71124C4 +:10420000F8E7000070B5B8B00222019003A901A838 +:10421000FEF766FC044608BB039B4FF48C601093CA +:1042200003F052F80546002866D0039B00F50072A3 +:104230000199D86010A81A61FFF7BAFB044650B97B +:104240009DF88B30980655D4190653D49DF8463006 +:10425000DA0706D50724284603F046F8204638B08A +:1042600070BD039B04931878042814D104A918691D +:10427000FFF780FB069E9DF84630DB0610D410A8A1 +:10428000FEF776FF04460028E5D156BB0398FEF7FB +:10429000DBFB0446DFE71F99FFF782FB0646EAE7F0 +:1042A000039BDA69B242D5D024930021269624A834 +:1042B0001B78042B01BFDDE90823CDE928239DF8F5 +:1042C00017308DF89730FEF7EFF904460028C2D179 +:1042D00024A8FFF741F804460028BBD00428BAD12F +:1042E000CDE70246314604A8FEF7C2FA044600288C +:1042F000B1D1CBE70624AEE71124AFE7F0B5BDB0EE +:10430000CDE900106846FDF70FFF022203A901A8BE +:10431000FEF7E6FB0446002841D1039B4FF48C6076 +:10432000149302F0D1FF0546002800F0EE80039BB5 +:1043300000F5007214AE0199D8601A613046FFF79B +:1043400037FB044640BB9DF89B3013F0A00F40F0B4 +:10435000D880039B009F1A78042A68D11B6904AC9B +:1043600003F1400C1868083353F8041C22466345D7 +:1043700003C21446F6D15022314628A8FDF7B6FCF8 +:10438000394628A8FFF714FB044600284CD12A9A86 +:10439000169B9A4206D00824284602F0A5FF204624 +:1043A0003DB0F0BD349A209B9A42F4D128A8FFF783 +:1043B00033F904460028EFD1039B04AF1B6993F83F +:1043C00001E093F823C09C8C3A46083303CAB242FA +:1043D00043F8080C43F8041C1746F5D1039B28A8A2 +:1043E0001B6983F801E0039B1A6982F823C01A69EC +:1043F00082F82440240A82F825401A691379D906E4 +:104400005CBF43F020031371FEF776FF04460028DB +:10441000C2D13046FEF7ACFE04460028BCD103985A +:10442000FEF712FB0446B7E70428B5D1BEE7239A8E +:1044300004AB02F1200C1068083252F8041C1C4630 +:10444000624503C42346F6D15022314628A8FDF721 +:104450004DFC394628A8FFF7ABFA044600284CD19A +:104460002A9A169B9A4296D1349A209B9A4292D1CC +:1044700028A8FFF7D1F8044600288DD137990DF10F +:104480001D030DF12D0001F10D0253F8044B834281 +:1044900042F8044BF9D11888012710809B7893705B +:1044A0009DF81B30039CDA0658BF43F02003CB7203 +:1044B000E770CB7ADB06ACD5169A2A9B9A42A8D035 +:1044C0002078FFF76DFA01462046FDF7EDFD014625 +:1044D000C8B12046FDF798FF044600287FF45CAF82 +:1044E000039890F86D302E2B93D12A9A00F16C012D +:1044F000FDF7E6FD039BDF708BE704287FF44CAFEC +:10450000B6E7062448E7022446E7112447E70000FF +:104510007F2810B501D880B210BDB0F5803F13D20E +:1045200040F2523399420FD10849002231F8024B30 +:1045300093B2844203D103F18000C0B2ECE70132B0 +:10454000802AF3D11346F6E70020E5E7C09600087D +:104550007F280DD940F25233994208D1FF2806D85E +:1045600000F10040034B803833F810007047002002 +:10457000704700BFC0960008B0F5803FF0B522D26A +:104580001F4A83B21F49B0F5805F28BF0A46141D39 +:1045900034F8042C2146AAB1934213D334F8025CB8 +:1045A0002E0AEFB252FA85F5A84222DA082E09D86F +:1045B000DFE806F0050A10121416181A1C00801AFB +:1045C00034F810301846F0BD981A00F001001B1A9C +:1045D0009BB2F7E7103BFBE7203BF9E7303BF7E7FF +:1045E0001A3BF5E70833F3E7503BF1E7A3F5E35354 +:1045F000EEE70434002ECBD101EB4702C7E700BF42 +:10460000109400080496000808B5074B074A19687B +:1046100001F03D01996053680BB190689847BDE87F +:10462000084003F09DB800BF00000240443600205F +:1046300008B5084B1968890901F03D018A019A60A3 +:10464000054AD3680BB110699847BDE8084003F0EC +:1046500087B800BF000002404436002008B5084B70 +:104660001968090C01F03D010A049A60054A536972 +:104670000BB190699847BDE8084003F071B800BFDE +:10468000000002404436002008B5084B1968890D27 +:1046900001F03D018A059A60054AD3690BB1106AA1 +:1046A0009847BDE8084003F05BB800BF0000024037 +:1046B0004436002008B5074B074A596801F03D0110 +:1046C000D960536A0BB1906A9847BDE8084003F07F +:1046D00047B800BF000002404436002008B5084B30 +:1046E0005968890901F03D018A01DA60054AD36AF7 +:1046F0000BB1106B9847BDE8084003F031B800BF1C +:10470000000002404436002008B5084B5968090CE7 +:1047100001F03D010A04DA60054A536B0BB1906B5E +:104720009847BDE8084003F01BB800BF00000240F6 +:104730004436002008B5084B5968890D01F03D0149 +:104740008A05DA60054AD36B0BB1106C9847BDE857 +:10475000084003F005B800BF0000024044360020C6 +:1047600008B5074B074A196801F03D019960536C81 +:104770000BB1906C9847BDE8084002F0F1BF00BF54 +:10478000000402404436002008B5084B1968890926 +:1047900001F03D018A019A60054AD36C0BB1106D9E +:1047A0009847BDE8084002F0DBBF00BF00040240AC +:1047B0004436002008B5084B1968090C01F03D018A +:1047C0000A049A60054A536D0BB1906D9847BDE895 +:1047D000084002F0C5BF00BF00040240443600207C +:1047E00008B5084B1968890D01F03D018A059A60EA +:1047F000054AD36D0BB1106E9847BDE8084002F032 +:10480000AFBF00BF000402404436002008B5074B8C +:10481000074A596801F03D01D960536E0BB1906EA3 +:104820009847BDE8084002F09BBF00BF000402406B +:104830004436002008B5084B5968890901F03D014C +:104840008A01DA60054AD36E0BB1106F9847BDE854 +:10485000084002F085BF00BF00040240443600203B +:1048600008B5084B5968090C01F03D010A04DA60EB +:10487000054A536F0BB1906F9847BDE8084002F0AE +:104880006FBF00BF000402404436002008B5084B4B +:104890005968890D01F03D018A05DA60054AD36F38 +:1048A00013B1D2F880009847BDE8084002F058BF25 +:1048B000000402404436002000230C4910B51A467B +:1048C0000B4C0B6054F82300026001EB43000433EF +:1048D0004260402BF6D1074A4FF0FF339360D3601C +:1048E000C2F80834C2F80C3410BD00BF44360020B2 +:1048F000C0970008000002400F28F8B510D9102812 +:1049000010D0112811D0122808D10F240720DFF869 +:10491000C8E00126DEF80050A04208D9002653E086 +:104920000446F4E70F240020F1E70724FBE706FA2A +:1049300000F73D424AD1264C4FEA001C3D4304EBB0 +:1049400000160EEBC000CEF80050C0E90123FBB208 +:1049500073B12048D0F8D83043F00103C0F8D83004 +:10496000D0F8003143F00103C0F80031D0F8003135 +:1049700017F47F4F0ED01748D0F8D83043F0020319 +:10498000C0F8D830D0F8003143F00203C0F800314D +:10499000D0F8003154F80C00036823F01F030360C3 +:1049A000056815F00105FBD104EB0C033D2493F8D9 +:1049B0000CC05F6804FA0CF43C602124056044617B +:1049C00012B1987B00F0CAFC3046F8BD0130A3E775 +:1049D000C0970008004402584436002010B5302427 +:1049E00084F31188FFF788FF002383F3118810BD3B +:1049F00010B50446807B00F0C7FC01231549627B9B +:104A000003FA02F20B6823EA0203DAB20B6072B90E +:104A1000114AD2F8D81021F00101C2F8D810D2F80A +:104A2000001121F00101C2F80011D2F8002113F4A5 +:104A30007F4F0ED1084BD3F8D82022F00202C3F8E2 +:104A4000D820D3F8002122F00202C3F80021D3F8C5 +:104A5000003110BD443600200044025808B5302310 +:104A600083F31188FFF7C4FF002383F3118808BD87 +:104A7000836CC26A8B42506810B506D95A1E4C002E +:104A800002EB4103B3FBF4F3184410BD01F0010342 +:104A90008A0748BF43F002034A0748BF43F00803B0 +:104AA0000A0748BF43F00403CA0648BF43F0100397 +:104AB0008A06426B48BF43F02003134343637047A9 +:104AC00010B5074C204600F0CBFF064B0022C4E98E +:104AD0001023054BA364054BE363054BE36410BD52 +:104AE000C83600200070005200B4C4041C370020F7 +:104AF0001C390020C36A0BB9104BC3620379012B28 +:104B000011D10F4B98420ED10E4BD3F8D42042F462 +:104B10008032C3F8D420D3F8FC2042F48032C3F8AA +:104B2000FC20D3F8FC30436C00221A65DA621A606C +:104B30005A605A624FF0FF329A637047C09800087B +:104B4000C8360020004402580379012B1BD0436C67 +:104B500000221A65DA621A605A605A624FF0FF3218 +:104B60009A63094B98420ED1084BD3F8D42022F413 +:104B70008032C3F8D420D3F8FC2022F48032C3F86A +:104B8000FC20D3F8FC307047C8360020004402589F +:104B900010B5446C0649FFF76BFF6060236842F272 +:104BA000107043F003032360BDE8104001F05EBDC8 +:104BB000801A06000129F8B5466C0B4F09D17568BB +:104BC0000A493D40FFF754FF054345F480557560A1 +:104BD000F8BD746806493C40FFF74AFF044344F4BB +:104BE00080547460F4E700BF00ECFFFF80F0FA022D +:104BF00040787D01436C00225A601A6070470000C3 +:104C0000426C0129536823F4404304D0022905D0A3 +:104C100001B95360704743F48043FAE743F400431B +:104C2000F7E70000436C41F480519A60D9605A6BF9 +:104C30001206FCD580229A637047000010B541F43B +:104C40008851446CA260E160616B11F04502FBD0B9 +:104C5000A26311F0040203D0FFF718FF012010BD7A +:104C6000616910461960FAE710B541F48851446C47 +:104C7000A260E160616B11F04502FBD0A26311F00C +:104C8000050203D0FFF702FF012010BD6169104645 +:104C90001960FAE773B5134604460E46302282F3D4 +:104CA0001188426CD26B32B14FF0FF31403001932A +:104CB00001F0E8FC019B606C00220265C263C262E5 +:104CC000456B15F4807504D185F31188012002B07D +:104CD00070BD4FF0FF31816382F31188012E06D938 +:104CE0000C21204602B0BDE87040FFF7BDBF104662 +:104CF000EDE7000073B5446C0E4600250192616B30 +:104D0000A1632565E562FFF7C1FE012E07D9019B6E +:104D10002A460C2102B0BDE87040FFF7A5BF02B0E3 +:104D200070BD000010B541F49851446CA260E16080 +:104D3000616B11F04502FBD0A26311F03F0203D07A +:104D4000FFF7A4FE012010BD216A10461960E16939 +:104D50005960A16999606169D960F4E72DE9F74369 +:104D600004460191006D01A91746984602F020FC07 +:104D7000064600284AD0626C2046DDF8049055684B +:104D8000C5F3090501356B00A56CB5FBF3F54FF4D0 +:104D90007A73B5FBF3F55D43556200F027FE50BB17 +:104DA000636C4FF0FF3201254146C3F8589020460E +:104DB0001D659A634FF49572DA6342F207029F62AF +:104DC000DA62E36C0A9AFFF74FFFA0B9E26C104B6E +:104DD00011680B407BB929462046FFF75BFF05466B +:104DE00048B92E463A460199206D02F019FC30462A +:104DF00003B0BDE8F0833A460199206D02F010FC43 +:104E0000E26C01212046FFF775FFF0E70126EEE78F +:104E100008E0FFFD2DE9F7431F46436C01924FF474 +:104E20007A725D6804468846C5F3090501356E004F +:104E3000856CB5FBF6F5B5FBF2F555435D6200F008 +:104E4000D5FD20B10125284603B0BDE8F0837E02E0 +:104E500001A9206D324602F0ABFB05460028F1D0D7 +:104E6000636C019AD4F84C909A6501221A654FF050 +:104E7000FF329A634FF49572DA639E62236BDB060E +:104E80004B4658BF4FEA4828012F42461BD91221F2 +:104E90002046FFF7E9FEC0B9D9F80020104B1340B7 +:104EA0009BB9636C42F2930239462046DA62E26CA7 +:104EB000FFF7F0FE804640B932460199206D454625 +:104EC00002F0AEFBBFE71121E2E732460199206D07 +:104ED00002F0A6FBE26C39462046FFF70BFFB2E773 +:104EE00008E0FFFD2DE9F3411F46436C01924FF4AA +:104EF0007A725D6804468846C5F3090501356E007F +:104F0000856CB5FBF6F5B5FBF2F555435D6200F037 +:104F10006DFD20B10125284602B0BDE8F0817E027A +:104F200001A9206D324602F089FB05460028F1D028 +:104F3000636C019A9A6501221A654FF0FF329A63F9 +:104F40004FF48D72DA639E62236BE66CDB063346A8 +:104F500058BF4FEA4828012F424619D91921204647 +:104F6000FFF782FEB0B932680F4B134093B9636C00 +:104F700042F2910239462046DA62E26CFFF78AFE7D +:104F8000064638B901993546206D02F093FBC2E719 +:104F90001821E4E70199206D02F08CFBE26C3946A0 +:104FA0002046FFF7A7FEB6E708E0FFFD12F0030F6B +:104FB0002DE9F04107460C4615461E4617D00E4413 +:104FC000B44202D10020BDE8F0810123FA6B2146F2 +:104FD0003846FFF71FFF0028F5D128464FF400722E +:104FE000F96B05F500750134FCF780FEE8E7BDE8D4 +:104FF000F041FFF70FBF000012F0030F2DE9F04161 +:1050000007460C4615461E4617D00E44B44202D140 +:105010000020BDE8F08129464FF40072F86B05F5D9 +:105020000075FCF763FE0123FA6B21463846FFF753 +:1050300059FF0028EDD10134E8E7BDE8F041FFF762 +:1050400051BF000000207047302310B583F3118852 +:105050000024436C40302146DC6301F021FB84F3E3 +:10506000118810BD026843681143016003B11847FD +:1050700070470000024A136843F0C0031360704792 +:1050800000440040024A136843F0C00313607047B5 +:1050900000480040024A136843F0C00313607047A1 +:1050A00000780040064BD3F8E8200243C3F8E8201C +:1050B000D3F810211043C3F81001D3F81031704712 +:1050C0000044025837B5274C274D204600F028FDF4 +:1050D00004F11400009400234FF40072234900F0FF +:1050E000C3F94FF40072224904F138000094214BB7 +:1050F00000F03CFA204BC4E91735204C204600F064 +:105100000FFD04F11400009400234FF400721C49B9 +:1051100000F0AAF94FF400721A4904F13800009423 +:10512000194B00F023FA194BC4E91735184C2046E7 +:1051300000F0F6FC04F1140000234FF4007215494E +:10514000009400F091F9144B4FF40072134904F1EC +:105150003800009400F00AFA114BC4E9173503B087 +:1051600030BD00BF2039002000E1F505643A002081 +:105170006440002075500008004400408C39002035 +:10518000643C002064420020855000080048004034 +:10519000F8390020643E0020955000086444002047 +:1051A0000078004038B5264D0446037C002918BF1E +:1051B0000D46012B06D1234B984230D14FF40030DD +:1051C000FFF770FF2A68236EE16D03EB5203A566BB +:1051D000B3FBF2F36A68100442BF23F0070003F048 +:1051E000070343EA4003CB60AB6843F040034B60E6 +:1051F000EB6843F001038B6042F4967343F00103C4 +:105200000B604FF0FF330B62510505D512F01022F1 +:1052100011D0B2F1805F10D084F8643038BD0A4BF1 +:10522000984205D0094B9842CCD14FF08040C7E757 +:105230004FF48020C4E77F23EEE73F23ECE700BF75 +:10524000C8980008203900208C390020F839002047 +:105250002DE9F047C66D05463768F46921073462C9 +:105260001AD014F0080118BF4FF48071E20748BF4C +:1052700041F02001A3074FF0300348BF41F0400147 +:10528000600748BF41F0800183F31188281DFFF7B4 +:10529000E9FE002383F31188E2050AD5302383F366 +:1052A00011884FF48061281DFFF7DCFE002383F393 +:1052B00011884FF030094FF0000A14F0200838D15F +:1052C0003B0616D54FF0300905F1380A200610D5F7 +:1052D00089F31188504600F07DF9002836DA08215C +:1052E000281DFFF7BFFE27F080033360002383F300 +:1052F0001188790614D5620612D5302383F31188FC +:10530000D5E913239A4208D12B6C33B127F040071B +:105310001021281DFFF7A6FE3760002383F31188B4 +:10532000E30618D5AA6E1369ABB15069BDE8F04722 +:10533000184789F31188736A284695F86410194054 +:1053400000F008FC8AF31188F469B6E7B06288F3CC +:105350001188F469BAE7BDE8F0870000090100F19F +:105360006043012203F56143C9B283F8001300F0E2 +:105370001F039A4043099B0003F1604303F5614317 +:10538000C3F880211A60704700F01F0301229A4081 +:10539000430900F160409B0000F5614003F1604368 +:1053A00003F56143C3F88020C3F88021002380F80F +:1053B00000337047F8B51546826804460B46AA428A +:1053C00000D28568A1692669761AB5420BD21846C3 +:1053D0002A46FCF78BFCA3692B44A3612846A368EB +:1053E0005B1BA360F8BD0CD9AF1B18463246FCF717 +:1053F0007DFC3A46E1683044FCF778FCE3683B44C6 +:10540000EBE718462A46FCF771FCE368E5E7000085 +:1054100083689342F7B50446154600D28568D4E9FF +:105420000460361AB5420BD22A46FCF75FFC63696A +:105430002B4463612846A3685B1BA36003B0F0BDE7 +:105440000DD93246AF1B0191FCF750FC01993A4649 +:10545000E0683144FCF74AFCE3683B44E9E72A464C +:10546000FCF744FCE368E4E710B50A440024C36198 +:10547000029B8460C16002610362C0E90000C0E970 +:10548000051110BD08B5D0E90532934201D18268FB +:1054900082B98268013282605A1C4261197000210F +:1054A000D0E904329A4224BFC368436101F012F983 +:1054B000002008BD4FF0FF30FBE7000070B530233F +:1054C00004460E4683F31188A568A5B1A368A269B6 +:1054D000013BA360531CA36115782269934224BF4A +:1054E000E368A361E3690BB120469847002383F387 +:1054F0001188284607E03146204601F0DBF80028F5 +:10550000E2DA85F3118870BD2DE9F74F04460E46A7 +:1055100017469846D0F81C904FF0300A8AF311884D +:105520004FF0000B154665B12A4631462046FFF77D +:1055300041FF034660B94146204601F0BBF8002810 +:10554000F1D0002383F31188781B03B0BDE8F08FFE +:10555000B9F1000F03D001902046C847019B8BF39F +:105560001188ED1A1E448AF31188DCE7C160C3611B +:10557000009B82600362C0E905111144C0E900008C +:1055800001617047F8B504460D461646302383F393 +:105590001188A768A7B1A368013BA36063695A1C7F +:1055A00062611D70D4E904329A4224BFE3686361EA +:1055B000E3690BB120469847002080F3118807E08B +:1055C0003146204601F076F80028E2DA87F31188A8 +:1055D000F8BD0000D0E9052310B59A4201D18268D8 +:1055E0007AB982680021013282605A1C82611C787B +:1055F00003699A4224BFC368836101F06BF82046B7 +:1056000010BD4FF0FF30FBE72DE9F74F04460E4683 +:1056100017469846D0F81C904FF0300A8AF311884C +:105620004FF0000B154665B12A4631462046FFF77C +:10563000EFFE034660B94146204601F03BF80028E2 +:10564000F1D0002383F31188781B03B0BDE8F08FFD +:10565000B9F1000F03D001902046C847019B8BF39E +:105660001188ED1A1E448AF31188DCE70379052BB3 +:1056700005BF836A002001204B6004BF4FF4007314 +:105680000B60704770B55D1E866A04460D44B542D6 +:1056900005D9436B43F080034363012070BD0625A9 +:1056A0000571FFF783FC05232371F7E770B55D1ED5 +:1056B000866A04460D44B54205D9436B43F0800326 +:1056C0004363012070BD07250571FFF795FC052395 +:1056D0002371F7E738B505790446052D05D1082370 +:1056E0000371FFF7AFFC257138BD0120FCE7000016 +:1056F0000323F0B5037185B00446FFF749FA002291 +:1057000020461146FFF78EFA4FF4D57203AB0821FD +:105710002046FFF7A9FA0246B8B901232363039B89 +:10572000C3F30323012B09D103AB37212046FFF735 +:105730009BFA18B9A44B039A1340ABB1204601253C +:10574000FFF758FA0223237137E103AB0022372118 +:105750002046FFF789FA28B99B4A039B1A40002A82 +:1057600000F0A78002232363236B03F00F03022BB7 +:1057700040F0A9806425954E42F2107000F076FF4B +:1057800003AB324601212046FFF758FA0028D5D155 +:10579000039B002B80F293805A0003D5236B43F0C8 +:1057A00010032363002204F1080302212046FFF7BF +:1057B000B9FA02460028C1D104F13803032120467A +:1057C000FFF752FA0028B9D104F11805A26B09219C +:1057D00020462B46FFF7A6FA0028AFD102ABA26BFA +:1057E00007212046FFF740FA06460028A6D1236B82 +:1057F00003F00F03022B40F08F807E227F2128468A +:1058000003F01CFA012840F28780E76B42F2107027 +:1058100000F02CFF08234FF4007239462046009612 +:10582000FFF79CFA002889D1384603F055FA236B1C +:10583000A06203F00F03022B72D103AB644A06216E +:105840002046FFF711FA002871D15F49039B1940E8 +:10585000B1FA81F149092046FFF7ACF902AB4FF4E8 +:10586000007210212046FFF7FFF9054600287FF45B +:1058700065AF554E029B33427FF460AF236B13F04C +:105880000E0F03F00F0273D0022A7FF457AFE36AC2 +:105890001978012900F09480022900F093800029F2 +:1058A00000F089804B4F2046FFF7AAF903AB3A4638 +:1058B00076E0114620462263FFF7B4F954E7013D34 +:1058C0007FF45AAF3AE7444D6426444A3E4F012BD9 +:1058D00018BF154603AB002237212046FFF7C4F955 +:1058E00000287FF42BAF039B3B427FF427AF03AB31 +:1058F0002A4629212046FFF7A1F900287FF41EAF90 +:10590000039B002BFFF648AF013E3FF417AF42F276 +:10591000107000F0ABFEDDE7284603F0B1F986E732 +:105920007E227F212846E66B03F088F908B9002122 +:1059300091E7002340223146204600930623FFF7DB +:105940000DFA0028F3D1B3895BBA9B07EFD5244B3E +:1059500040223146204600930623FFF7FFF9002836 +:10596000E5D1317C01F00F010F3918BF012172E739 +:10597000E36A1978F9B101297FF4E0AE2046FFF718 +:105980003FF903ABA26B37212046FFF76DF90028E2 +:105990007FF4D4AE039B33427FF4D0AE03AB02223C +:1059A00006212046FFF760F900287FF4C7AE039B6D +:1059B00033427FF4C3AE05232371284605B0F0BD02 +:1059C000084F70E7084F6EE708E0FFFD0080FFC05A +:1059D0000001B9030000B7030080FF5000001080F1 +:1059E000F1FFFF800001B7030002B70337B504469B +:1059F0000C4D01ABA26B0D212046FFF735F978B9AC +:105A0000019B2B420BD1C3F34323042B08D0053B4E +:105A1000022B04D84FF47A7000F028FEE9E7012049 +:105A200003B030BD08E0FFFD70B53023054683F3B9 +:105A3000118803790024022B03D184F311882046B6 +:105A400070BD0423037184F311880226FFF7CEFF93 +:105A500004462846FFF7CEF82E71F0E7FFF730B87E +:105A6000044B03600123037100234363C0E90A333D +:105A7000704700BFE098000810B53023044683F358 +:105A80001188C162FFF736F802230020237180F3EA +:105A9000118810BD10B53023044683F31188FFF739 +:105AA00053F800230122E362227183F3118810BDB1 +:105AB000026843681143016003B118477047000052 +:105AC0001430FFF721BD00004FF0FF331430FFF713 +:105AD0001BBD00003830FFF797BD00004FF0FF33CB +:105AE0003830FFF791BD00001430FFF7E7BC00002D +:105AF0004FF0FF311430FFF7E1BC00003830FFF702 +:105B000041BD00004FF0FF323830FFF73BBD0000D1 +:105B1000012914BF6FF0130000207047FFF7D2BABD +:105B2000044B036000234360C0E902330123037484 +:105B3000704700BF0499000810B53023044683F372 +:105B40001188FFF72FFB02230020237480F31188B4 +:105B500010BD000038B5C36904460D461BB90421C9 +:105B60000844FFF7A5FF294604F11400FFF78AFC5B +:105B7000002806DA201D4FF40061BDE83840FFF729 +:105B800097BF38BD026843681143016003B11847ED +:105B90007047000013B5406B00F58054D4F8A4386A +:105BA0001A681178042914D1017C022911D11979BC +:105BB000012312898B4013420BD101A94C3002F012 +:105BC0006BFFD4F8A4480246019B2179206800F0BD +:105BD000DFF902B010BD0000143002F0EDBE00008D +:105BE0004FF0FF33143002F0E7BE00004C3002F0FB +:105BF000BFBF00004FF0FF334C3002F0B9BF0000D0 +:105C0000143002F0BBBE00004FF0FF31143002F040 +:105C1000B5BE00004C3002F08BBF00004FF0FF32E9 +:105C20004C3002F085BF00000020704710B500F531 +:105C30008054D4F8A4381A681178042917D1017C4B +:105C4000022914D15979012352898B4013420ED174 +:105C5000143002F04DFE024648B1D4F8A4484FF487 +:105C6000407361792068BDE8104000F07FB910BD35 +:105C7000406BFFF7DBBF0000704700007FB5124BA1 +:105C800001250426044603600023057400F1840204 +:105C900043602946C0E902330C4B02901430019353 +:105CA0004FF44073009602F0FFFD094B04F6944256 +:105CB000294604F14C000294CDE900634FF440738F +:105CC00002F0C6FE04B070BD2C990008715C00089B +:105CD000955B00080A68302383F311880B790B3336 +:105CE00042F823004B79133342F823008B7913B128 +:105CF0000B3342F8230000F58053C3F8A4180223A5 +:105D00000374002080F311887047000038B5037FCA +:105D1000044613B190F85430ABB90125201D02217F +:105D2000FFF730FF04F114006FF00101257700F058 +:105D3000DDFC04F14C0084F854506FF00101BDE823 +:105D4000384000F0D3BC38BD10B501210446043002 +:105D5000FFF718FF0023237784F8543010BD0000AC +:105D600038B504460025143002F0B6FD04F14C00AD +:105D7000257702F085FE201D84F854500121FFF79D +:105D800001FF2046BDE83840FFF750BF90F8803053 +:105D900003F06003202B06D190F881200023212AF4 +:105DA00003D81F2A06D800207047222AFBD1C0E959 +:105DB0001D3303E0034A426707228267C36701205D +:105DC000704700BF4422002037B500F58055D5F854 +:105DD000A4381A68117804291AD1017C022917D134 +:105DE0001979012312898B40134211D100F14C041F +:105DF000204602F005FF58B101A9204602F04CFEF2 +:105E0000D5F8A4480246019B2179206800F0C0F82B +:105E100003B030BD01F10B03F0B550F8236085B03D +:105E200004460D46FEB1302383F3118804EB850749 +:105E3000301D0821FFF7A6FEFB6806F14C005B69E8 +:105E40001B681BB1019002F035FE019803A902F016 +:105E500023FE024648B1039B2946204600F098F8ED +:105E6000002383F3118805B0F0BDFB685A691268FE +:105E7000002AF5D01B8A013B1340F1D104F18002C6 +:105E8000EAE70000133138B550F82140ECB1302377 +:105E900083F3118804F58053D3F8A428136852794A +:105EA00003EB8203DB689B695D6845B104216018E0 +:105EB000FFF768FE294604F1140002F023FD204696 +:105EC000FFF7B4FE002383F3118838BD704700004C +:105ED00001F044BD01234022002110B5044600F822 +:105EE000303BFBF729FF0023C4E9013310BD00005C +:105EF00010B53023044683F3118824224160002129 +:105F00000C30FBF719FF204601F04AFD0223002068 +:105F1000237080F3118810BD70B500EB8103054636 +:105F200050690E461446DA6018B110220021FBF7C2 +:105F300003FFA06918B110220021FBF7FDFE3146D6 +:105F40002846BDE8704001F031BE00008368202281 +:105F5000002103F0011310B5044683601030FBF7F5 +:105F6000EBFE2046BDE8104001F0ACBEF0B40125C8 +:105F700000EB810447898D40E4683D43A469458175 +:105F800023600023A2606360F0BC01F0C9BE000082 +:105F9000F0B4012500EB810407898D40E4683D439E +:105FA0006469058123600023A2606360F0BC01F096 +:105FB0003FBF000070B50223002504462422037071 +:105FC0002946C0F888500C3040F8045CFBF7B4FE5A +:105FD000204684F8705001F07DFD63681B6823B192 +:105FE00029462046BDE87040184770BD0378052B50 +:105FF00010B504460AD080F88C300523037043683E +:106000001B680BB1042198470023A36010BD00005A +:106010000178052906D190F88C20436802701B682E +:1060200003B118477047000070B590F8703004460F +:1060300013B1002380F8703004F18002204601F093 +:1060400065FE63689B68B3B994F8803013F060050F +:1060500035D00021204602F057F90021204602F0F9 +:1060600047F963681B6813B1062120469847062349 +:1060700084F8703070BD204698470028E4D0B4F80A +:106080008630A26F9A4288BFA36794F98030A56FCB +:10609000002B4FF0300380F20381002D00F0F280DE +:1060A000092284F8702083F3118800212046D4E966 +:1060B0001D23FFF76DFF002383F31188DAE794F8BF +:1060C000812003F07F0343EA022340F2023293422D +:1060D00000F0C58021D8B3F5807F48D00DD8012BC2 +:1060E0003FD0022B00F09380002BB2D104F1880244 +:1060F00062670222A267E367C1E7B3F5817F00F020 +:106100009B80B3F5407FA4D194F88230012BA0D1BD +:10611000B4F8883043F0020332E0B3F5006F4DD09D +:1061200017D8B3F5A06F31D0A3F5C063012B90D879 +:106130006368204694F882205E6894F88310B4F86F +:106140008430B047002884D0436863670368A3673E +:106150001AE0B3F5106F36D040F6024293427FF456 +:1061600078AF5C4B63670223A3670023C3E794F80F +:106170008230012B7FF46DAFB4F8883023F0020336 +:10618000A4F88830C4E91D55E56778E7B4F8803095 +:10619000B3F5A06F0ED194F88230204684F88A308F +:1061A00001F0F6FC63681B6813B101212046984793 +:1061B000032323700023C4E91D339CE704F18B0300 +:1061C00063670123C3E72378042B10D1302383F3C3 +:1061D00011882046FFF7BAFE85F311880321636812 +:1061E00084F88B5021701B680BB12046984794F8B7 +:1061F0008230002BDED084F88B3004232370636858 +:106200001B68002BD6D0022120469847D2E794F88D +:10621000843020461D0603F00F010AD501F068FD09 +:10622000012804D002287FF414AF2B4B9AE72B4BA4 +:1062300098E701F04FFDF3E794F88230002B7FF4EC +:1062400008AF94F8843013F00F01B3D01A0620463B +:1062500002D502F071F8ADE702F062F8AAE794F80F +:106260008230002B7FF4F5AE94F8843013F00F01E8 +:10627000A0D01B06204602D502F046F89AE702F0AD +:1062800037F897E7142284F8702083F311882B469F +:106290002A4629462046FFF769FE85F31188E9E67C +:1062A0005DB1152284F8702083F311880021204607 +:1062B000D4E91D23FFF75AFEFDE60B2284F8702077 +:1062C00083F311882B462A4629462046FFF760FEB5 +:1062D000E3E700BF5C99000854990008589900084A +:1062E00038B590F870300446002B3ED0063BDAB249 +:1062F0000F2A34D80F2B32D8DFE803F037313108BA +:10630000223231313131313131313737856FB0F8A7 +:1063100086309D4214D2C3681B8AB5FBF3F203FB9F +:1063200012556DB9302383F311882B462A4629462E +:10633000FFF72EFE85F311880A2384F870300EE0F3 +:10634000142384F87030302383F31188002320460F +:106350001A461946FFF70AFE002383F3118838BD59 +:10636000C36F03B198470023E7E70021204601F0FF +:10637000CBFF0021204601F0BBFF63681B6813B10F +:106380000621204698470623D7E7000010B590F86D +:1063900070300446142B29D017D8062B05D001D80D +:1063A0001BB110BD093B022BFBD80021204601F098 +:1063B000ABFF0021204601F09BFF63681B6813B10F +:1063C000062120469847062319E0152BE9D10B2317 +:1063D00080F87030302383F3118800231A46194661 +:1063E000FFF7D6FD002383F31188DAE7C3689B69C2 +:1063F0005B68002BD5D1C36F03B19847002384F8A5 +:106400007030CEE70023826880F8243083691B68EF +:1064100099689142FBD25A680360426010605860EC +:10642000704700000023826880F8243083691B686D +:1064300099689142FBD85A680360426010605860C6 +:106440007047000008B50846302383F3118891F89F +:106450002430032B05D0042B0DD02BB983F31188E6 +:1064600008BD8B6A00221A604FF0FF338362FFF78A +:10647000C9FF0023F2E7D1E9003213605A60F3E765 +:10648000034610B51B68984203D09C688A68944202 +:10649000F8D25A680B604A601160596010BD000064 +:1064A000FFF7B0BF064BD96881F82400186802686E +:1064B00053601A600122D86080F82420F9F7A2BF47 +:1064C000684600200C4B30B5DD684B1C87B0044695 +:1064D0000FD02B46094A684600F09CF92046FFF78A +:1064E000E1FF009B13B1684600F09EF9A86A07B06F +:1064F00030BDFFF7D7FFF9E7684600204564000884 +:10650000044B1A68DB6890689B68984294BF00202F +:106510000120704768460020094B10B51C68D868F8 +:10652000226853601A600122DC6084F82420FFF79F +:1065300079FF01462046BDE81040F9F763BF00BF70 +:1065400068460020044B1A68DB6892689B689A4290 +:1065500001D9FFF7E1BF70476846002038B5012335 +:10656000084C00252370656002F0E4FB02F00AFC91 +:106570000549064802F0E0FC0223237085F31188E8 +:1065800038BD00BF1049002064990008684600200B +:1065900000F080B9034A516853685B1A9842FBD8EF +:1065A000704700BF001000E08B604B630023CA619E +:1065B00000F128020B6302230A618B8401238861A6 +:1065C00081F8263001F11003C26A4A611360C36288 +:1065D00001F12C030846CB6270470000D0E901317D +:1065E000026841F8183CA1F19C033839CB6003697B +:1065F00041F8243C436941F8203C034B41F8043CFA +:10660000C3680248FFF7D0BF1D0400086846002099 +:1066100008B5FFF7E3FFBDE80840FFF741BF000002 +:1066200038B50E4BDC6804F12C05A062E06AA84284 +:106630000FD194F826303BB994F825309B0702BF60 +:10664000D4E9043213605A600F20BDE83840FFF7E8 +:1066500029BF0368E362FFF723FFE7E768460020EE +:10666000302383F31188FFF7DBBF000008B5014634 +:10667000302383F311880820FFF724FF002383F3DE +:10668000118808BD054BDB6821B1036098620320C7 +:10669000FFF718BF4FF0FF30704700BF684600207B +:1066A00003682BB10022026018469962FFF7F8BE1A +:1066B00070470000064BDB6839B1426818605A60C9 +:1066C000136043600420FFF7FDBE4FF0FF307047BA +:1066D000684600200368984206D01A68026050603D +:1066E00018469962FFF7DCBE7047000038B50446D3 +:1066F0000D462068844200D138BD036823605C6089 +:106700008562FFF7CDFEF4E7036810B59C68A242EE +:106710000CD85C688A600B604C6021605960996895 +:106720008A1A9A604FF0FF33836010BD121B1B68FA +:10673000ECE700000A2938BF0A2170B504460D466F +:106740000A26601902F0F0FA02F0D8FA041BA542FA +:1067500003D8751C04462E46F3E70A2E04D90120FF +:10676000BDE8704002F0B0BC70BD0000F8B5144B3D +:106770000D460A2A4FF00A07D96103F11001826021 +:1067800038BF0A22416019691446016048601861E7 +:10679000A81802F0B9FA02F0B1FA431B0646A34268 +:1067A00006D37C1C28192746354602F0BDFAF2E7CD +:1067B0000A2F04D90120BDE8F84002F085BCF8BDDD +:1067C00068460020F8B506460D4602F097FA0F4AD3 +:1067D000134653F8107F9F4206D12A4601463046A1 +:1067E000BDE8F840FFF7C2BFD169BB68441A2C1955 +:1067F00028BF2C46A34202D92946FFF79BFF224619 +:1068000031460348BDE8F840FFF77EBF68460020E8 +:1068100078460020C0E90323002310B45DF8044B40 +:106820004361FFF7CFBF000010B5194C23699842B0 +:106830000DD08168D0E9003213605A609A680A442A +:106840009A60002303604FF0FF33A36110BD02681C +:10685000234643F8102F53600022026022699A42B7 +:1068600003D1BDE8104002F059BA936881680B4427 +:10687000936002F043FA2269E1699268441AA242E5 +:10688000E4D91144BDE81040091AFFF753BF00BF17 +:10689000684600202DE9F047DFF8BC8008F11007BA +:1068A0002C4ED8F8105002F029FAD8F81C40AA68EB +:1068B000031B9A423ED814444FF00009D5E9003238 +:1068C000C8F81C4013605A60C5F80090D8F8103022 +:1068D000B34201D102F022FA89F31188D5E90331DC +:1068E00028469847302383F311886B69002BD8D052 +:1068F00002F004FA6A69A0EB040982464A450DD207 +:10690000022002F0E1FB0022D8F81030B34208D197 +:1069100051462846BDE8F047FFF728BF121A224427 +:10692000F2E712EB09092946384638BF4A46FFF715 +:10693000EBFEB5E7D8F81030B34208D01444C8F8DD +:106940001C00211AA960BDE8F047FFF7F3BEBDE8BF +:10695000F08700BF784600206846002038B502F076 +:10696000CDF9054AD2E90845031B181945F1000184 +:10697000C2E9080138BD00BF6846002010B560B903 +:10698000074804790368053C9B6818BF01249847B1 +:1069900008B144F00404204610BD0124FBE700BF09 +:1069A000C8360020FFF7EABF2DE9F04788461746B2 +:1069B0009A460446B0B90D4E3579052D05D003240D +:1069C0000DE0013D15F0FF050ED032685346394603 +:1069D0003046D2F814904246C8470028F1D12046EC +:1069E000BDE8F0870424FAE70124F8E7C836002060 +:1069F0002DE9F047884617469A460446B0B90D4E31 +:106A00003579052D05D003240DE0013D15F0FF0576 +:106A10000ED03268534639463046D2F81890424676 +:106A2000C8470028F1D12046BDE8F0870424FAE7E2 +:106A30000124F8E7C836002037B50C46154670B972 +:106A400051B101290BD10748694603681B6A984771 +:106A500010B9019B04462B60204603B030BD0424CE +:106A6000FAE700BFC836002000207047FEE70000AC +:106A7000704700004FF0FF30704700004B684360E4 +:106A80008B688360CB68C3600B6943614B690362A9 +:106A90008B6943620B6803607047000008B53C4B8C +:106AA00040F2FF713B48D3F888200A43C3F888209E +:106AB000D3F8882022F4FF6222F00702C3F888206E +:106AC000D3F88820D3F8E0200A43C3F8E020D3F8B5 +:106AD00008210A43C3F808212F4AD3F80831114688 +:106AE000FFF7CCFF00F5806002F11C01FFF7C6FF45 +:106AF00000F5806002F13801FFF7C0FF00F580600B +:106B000002F15401FFF7BAFF00F5806002F1700155 +:106B1000FFF7B4FF00F5806002F18C01FFF7AEFFD4 +:106B200000F5806002F1A801FFF7A8FF00F5806082 +:106B300002F1C401FFF7A2FF00F5806002F1E0015D +:106B4000FFF79CFF00F5806002F1FC01FFF796FF64 +:106B500002F58C7100F58060FFF790FF01F084FC76 +:106B60000E4BD3F8902242F00102C3F89022D3F8E2 +:106B7000942242F00102C3F894220522C3F898201F +:106B80004FF06052C3F89C20054AC3F8A02008BD0E +:106B900000440258000002587899000800ED00E017 +:106BA0001F00080308B501F06BFEFFF7D7FC104B80 +:106BB000D3F8DC2042F04002C3F8DC20D3F80421F3 +:106BC00022F04002C3F80421D3F80431094B1A68BB +:106BD00042F008021A601A6842F004021A6000F0DB +:106BE00071FD00F035FBBDE8084000F0B5B800BF0E +:106BF00000440258001802480120704700207047E6 +:106C00007047000002290CD0032904D0012907484D +:106C100018BF00207047032A05D8054800EBC200C2 +:106C20007047044870470020704700BF7C9B0008F5 +:106C300054220020309B000870B59AB005460846E3 +:106C4000144601A900F0C2F801A8FBF76DF8431C37 +:106C50000022C6B25B001046C5E90034237003234E +:106C6000023404F8013C01ABD1B202348E4201D8A7 +:106C70001AB070BD13F8011B013204F8010C04F8BE +:106C8000021CF1E708B5302383F311880348FFF7AE +:106C90009BF8002383F3118808BD00BF184900202A +:106CA00090F8803003F01F02012A07D190F881206C +:106CB0000B2A03D10023C0E91D3315E003F0600364 +:106CC000202B08D1B0F884302BB990F88120212AEC +:106CD00003D81F2A04D8FFF759B8222AEBD0FAE7C5 +:106CE000034A426707228267C3670120704700BFDB +:106CF0004B22002007B5052917D8DFE801F0191647 +:106D000003191920302383F31188104A01210190BF +:106D1000FFF702F9019802210D4AFFF7FDF80D482F +:106D2000FFF71EF8002383F3118803B05DF804FB1E +:106D3000302383F311880748FEF7E8FFF2E730239A +:106D400083F311880348FEF7FFFFEBE7D09A0008B2 +:106D5000F49A00081849002038B50C4D0C4C2A460E +:106D60000C4904F10800FFF767FF05F1CA0204F1BE +:106D700010000949FFF760FF05F5CA7204F1180019 +:106D80000649BDE83840FFF757BF00BFF06100205B +:106D900054220020AC9A0008B99A0008C49A00084E +:106DA00070B5044608460D46FAF7BEFFC6B2204647 +:106DB000013403780BB9184670BD32462946FAF7FC +:106DC0009FFF0028F3D10120F6E700002DE9F84FDE +:106DD00005460C46FAF7A8FF2C49C6B22846FFF72D +:106DE000DFFF08B10336F6B229492846FFF7D8FF7E +:106DF00008B11036F6B2632E0DD8DFF89080DFF8B8 +:106E00009090244FDFF894A0DFF894B02E7846B924 +:106E10002670BDE8F88F29462046BDE8F84F02F0FD +:106E2000FDB9252E2ED1072241462846FAF768FFE4 +:106E300070B9DBF8003007350A3444F80A3CDBF857 +:106E4000043044F8063CBBF8083024F8023CDDE787 +:106E5000082249462846FAF753FF98B9A21C0E4B60 +:106E6000197802320909C95D02F8041C13F8011BE4 +:106E700001F00F015345C95D02F8031CF0D118342D +:106E80000835C3E7013504F8016BBFE79C9B000898 +:106E9000C49A0008AF9B000800E8F11F0CE8F11F3E +:106EA000A49B0008BFF34F8F044B1A695107FCD114 +:106EB000D3F810215207F8D1704700BF00200052CC +:106EC00008B50D4B1B78ABB9FFF7ECFF0B4BDA683D +:106ED000D10704D50A4A5A6002F188325A60D3F8C1 +:106EE0000C21D20706D5064AC3F8042102F18832E4 +:106EF000C3F8042108BD00BF4E64002000200052EA +:106F00002301674508B5114B1B78F3B9104B1A697B +:106F1000510703D5DA6842F04002DA60D3F8102155 +:106F2000520705D5D3F80C2142F04002C3F80C21DA +:106F3000FFF7B8FF064BDA6842F00102DA60D3F8D7 +:106F40000C2142F00102C3F80C2108BD4E64002060 +:106F5000002000520F289ABF00F5806040040020F6 +:106F6000704700004FF40030704700001020704759 +:106F70000F2808B50BD8FFF7EDFF00F500330268C6 +:106F8000013204D104308342F9D1012008BD002030 +:106F9000FCE700000F2838B505463FD8FFF782FF11 +:106FA0001F4CFFF78DFF4FF0FF3307286361C4F8D4 +:106FB00014311DD82361FFF775FF030243F024034A +:106FC000E360E36843F08003E36023695A07FCD47D +:106FD0002846FFF767FFFFF7BDFF4FF4003100F0D1 +:106FE000ABFA2846FFF78EFFBDE83840FFF7C0BF79 +:106FF000C4F81031FFF756FFA0F108031B0243F05D +:107000002403C4F80C31D4F80C3143F08003C4F8E5 +:107010000C31D4F810315B07FBD4D9E7002038BD20 +:10702000002000522DE9F84F05460C46104645EA6F +:107030000203DE0602D00020BDE8F88F20F01F001A +:10704000DFF8BCB0DFF8BCA0FFF73AFF04EB0008A4 +:10705000444503D10120FFF755FFEDE720222946E3 +:10706000204602F0A3F810B920352034F0E72B4673 +:1070700005F120021F68791CDDD104339A42F9D151 +:1070800005F178431B481C4EB3F5801F1B4B38BFDE +:10709000184603F1F80332BFD946D1461E46FFF722 +:1070A00001FF0760A5EB040C336804F11C0143F0F9 +:1070B00002033360231FD9F8007017F00507FAD1D7 +:1070C00053F8042F8B424CF80320F4D1BFF34F8FB9 +:1070D000FFF7E8FE4FF0FF332022214603602846E9 +:1070E000336823F00203336002F060F80028BBD05D +:1070F0003846B0E7142100520C20005214200052F0 +:10710000102000521021005210B5084C237828B1ED +:107110001BB9FFF7D5FE0123237010BD002BFCD057 +:107120002070BDE81040FFF7EDBE00BF4E640020A8 +:107130002DE9F04F0D4685B0814658B111F00D068E +:1071400014BF2022082211F00803019304D0431E2B +:10715000034269D0002435E0002E37D009F11F0129 +:1071600021F01F094FF00108314F05F00403DFF84B +:10717000CCA005EA080BBBF1000F32D07869C0073C +:107180002FD408F101080C37B8F1060FF3D19EB9DE +:10719000284D4946A819019201F016FE0446002820 +:1071A00039D12036019AA02EF3D1494601F00CFEC8 +:1071B000044600282FD1019A49461F4801F004FED9 +:1071C000044660BB204605B0BDE8F08F0029C9D158 +:1071D00001462846029201F0F7FD0446D8B9029A0A +:1071E000C0E713B178694107CBD5AC0702D5786900 +:1071F0008007C6D5019911B178690107C1D5494603 +:107200000AEB4810CDE9022301F0DEFD0446DDE97A +:1072100002230028B5D04A460021204601E04A4614 +:107220000021FAF789FDCDE70246002E96D199E7B5 +:10723000C09B00089064002050640020706400200F +:107240000021FFF775BF00000121FFF771BF0000AB +:1072500070B5144D0124144E40F2FF32002101207C +:10726000FAF76AFD06EB441001342A6955F80C1F41 +:1072700001F096FD062CF5D137254FF4C054204679 +:10728000FFF7E2FF014628B122460848BDE87040FA +:1072900001F086BDC4EBC404013D4FEAD404EED135 +:1072A00070BD00BFC09B00087064002050640020C7 +:1072B0000421FFF73DBF00004843FFF7C1BF0000B6 +:1072C00008B101F0F3BD7047B0F5805F10B504461A +:1072D00007D8FFF7EDFF28B92046BDE81040FFF7BB +:1072E000AFBF002010BD0000FFF7EABF70B5AAB124 +:1072F00040EA010313F01F030FD1094C0144A568B4 +:107300006D0706D52568A84203D366683544A942AF +:1073100004D903330C34122BF1D10022104670BD76 +:10732000C09B000808B501F0D7FE034AD2E900323D +:10733000C01842EB010108BD30650020434BD3E982 +:1073400000232DE9F34113437CD0FFF7EBFF404AC4 +:1073500000230027F9F770F806460D463D4A002342 +:10736000F9F76AF80023144630462946394AF9F7F6 +:1073700063F84FF461613C23ADF80170B4FBF1F5A3 +:10738000B4FBF3F601FB154103FB16464624B1FBA3 +:10739000F3F1314BF6B28DF8004098423CD84FF0F3 +:1073A000640C4FF4C87EA30704F26C7225D1B2FBC3 +:1073B000FCF30CFB132313BBB2FBFEF30EFB1322F7 +:1073C000B2FA82F35B0903F26D18621C8045D2B2F7 +:1073D00017D90FB18DF800400022204C4FF00C0C53 +:1073E00017460CFB0343D4B2013213F804C08445A2 +:1073F0000CD8A0EB0C000127F5E70023E3E70123FD +:10740000E1E7A0EB080014460127CCE70FB18DF8A7 +:107410000140431C8DF802309DF80100431C9DF88B +:1074200000005038400640EA43509DF8023040EAE0 +:10743000034040EA560040EAC52040EA411002B04D +:10744000BDE8F0814FF40410F9E700BF306500207B +:1074500040420F008051010090230B00089C00085F +:107460000244074BD2B210B5904200D110BD441C6B +:1074700000B253F8200041F8040BE0B2F4E700BF7B +:10748000504000580E4B30B51C6F240405D41C6FBF +:107490001C671C6F44F400441C670A4C02442368B8 +:1074A000D2B243F480732360074B904200D130BDC9 +:1074B000441C51F8045B00B243F82050E0B2F4E7FA +:1074C00000440258004802585040005807B50122B5 +:1074D00001A90020FFF7C4FF019803B05DF804FB89 +:1074E00013B50446FFF7F2FFA04205D0012201A91F +:1074F00000200194FFF7C6FF02B010BD10B5642450 +:10750000013C4FF47A70FFF7B1F814F0FF04F7D1A3 +:10751000084B4FF0807214249A6103F580530822BF +:107520009A61013C4FF47A70FFF7A0F814F0FF0461 +:10753000F7D110BD000002580144BFF34F8F064B36 +:10754000884204D3BFF34F8FBFF36F8F7047C3F8E8 +:107550005C022030F4E700BF00ED00E00144BFF31F +:107560004F8F064B884204D3BFF34F8FBFF36F8F0B +:107570007047C3F870022030F4E700BF00ED00E070 +:1075800070B5054616460C4601201021FFF794FE03 +:10759000286046733CB1204636B1FFF789FE2B6860 +:1075A000186000B19C6070BDFFF74EFEF7E7000069 +:1075B000F8B50F461546044648B905F11F010126E6 +:1075C000386821F01F01FFF7B7FF3046F8BD427B56 +:1075D00029463868FFF78AFE06460028EDD13B6849 +:1075E0006360A368AB4210D213B12068FFF768FE56 +:1075F000637B28462BB1FFF75BFE206020B9A060BB +:10760000E3E7FFF721FEF8E7A560206805F11F0119 +:10761000012621F01F013860FFF78EFF2673D4E7A3 +:1076200010B5044640B10068884205D1606808B1D1 +:10763000FAF75CFB0023237310BD0000F8B50F467A +:107640001446054648B904F11F010126386821F0A7 +:107650001F01FFF783FF3046F8BD427B21463868A3 +:10766000FFF744FE06460028EDD1AB68A34210D2D6 +:1076700013B12868FFF724FE6B7B20462BB1FFF780 +:1076800017FE286020B9A860E5E7FFF7DDFDF8E701 +:10769000AC60396819B122462868FAF727FB2868D8 +:1076A00004F11F01012621F01F013860FFF756FF8A +:1076B0002E73D0E720B103688B4204BF002303730D +:1076C00070470000034B1A681AB9034AD2F8D02455 +:1076D0001A607047386500200040025808B5FFF76F +:1076E000F1FF024B1868C0F3806008BD38650020C8 +:1076F000EFF30983054968334A6B22F001024A63BC +:1077000083F30988002383F31188704700EF00E0BA +:10771000302080F3118862B60D4B0E4AD96821F4EF +:10772000E0610904090C0A430B49DA60D3F8FC2034 +:1077300042F08072C3F8FC20084AC2F8B01F1168FA +:1077400041F0010111602022DA7783F822007047AE +:1077500000ED00E00003FA0555CEACC5001000E0D6 +:10776000302310B583F311880E4B5B6813F400636C +:1077700014D0F1EE103AEFF309844FF08073683CB7 +:10778000E361094BDB6B236684F30988FEF7B8FEDF +:1077900010B1064BA36110BD054BFBE783F31188C5 +:1077A000F9E700BF00ED00E000EF00E02F04000863 +:1077B0003204000870B5BFF34F8FBFF36F8F1A4AC2 +:1077C0000021C2F85012BFF34F8FBFF36F8F536980 +:1077D00043F400335361BFF34F8FBFF36F8FC2F891 +:1077E0008410BFF34F8FD2F8803043F6E074C3F3B8 +:1077F000C900C3F34E335B0103EA0406014646EABF +:1078000081750139C2F86052F9D2203B13F1200F83 +:10781000F2D1BFF34F8F536943F480335361BFF309 +:107820004F8FBFF36F8F70BD00ED00E0FEE70000EB +:10783000214B2248224A70B5904237D3214BC11EBA +:10784000DA1C121A22F003028B4238BF00220021F8 +:10785000FAF772FA1C4A0023C2F88430BFF34F8F44 +:10786000D2F8803043F6E074C3F3C900C3F34E335B +:107870005B0103EA0406014646EA81750139C2F854 +:107880006C52F9D2203B13F1200FF2D1BFF34F8F8E +:10789000BFF36F8FBFF34F8FBFF36F8F0023C2F81B +:1078A0005032BFF34F8FBFF36F8F70BD53F8041B7F +:1078B00040F8041BC0E700BF0C9D0008346700209F +:1078C000346700203467002000ED00E0074BD3F858 +:1078D000D81021EA0001C3F8D810D3F8002122EA19 +:1078E0000002C3F80021D3F8003170470044025869 +:1078F00070B5D0E9244300224FF0FF359E6804EBB9 +:1079000042135101D3F80009002805DAD3F8000921 +:1079100040F08040C3F80009D3F8000B002805DAD6 +:10792000D3F8000B40F08040C3F8000B013263181D +:107930009642C3F80859C3F8085BE0D24FF0011330 +:10794000C4F81C3870BD0000890141F020010161BC +:1079500003699B06FCD41220FEF71CBE10B50A4C2E +:107960002046FEF7B7FA094BC4F89030084BC4F82C +:107970009430084C2046FEF7ADFA074BC4F890301F +:10798000064BC4F8943010BD3C6500200000084050 +:10799000449C0008D865002000000440509C00086A +:1079A00070B503780546012B5CD1434BD0F890406D +:1079B000984258D1414B0E216520D3F8D82042F08F +:1079C0000062C3F8D820D3F8002142F00062C3F867 +:1079D0000021D3F80021D3F8802042F00062C3F8E0 +:1079E0008020D3F8802022F00062C3F88020D3F8F2 +:1079F0008030FDF7B3FC324BE360324BC4F8003803 +:107A00000023D5F89060C4F8003EC02323604FF4F3 +:107A10000413A3633369002BFCDA01230C203361C8 +:107A2000FEF7B8FD3369DB07FCD41220FEF7B2FD88 +:107A30003369002BFCDA00262846A660FFF758FFC2 +:107A40006B68C4F81068DB68C4F81468C4F81C6874 +:107A500083BB1D4BA3614FF0FF336361A36843F009 +:107A60000103A36070BD194B9842C9D1134B4FF06D +:107A70008060D3F8D82042F00072C3F8D820D3F841 +:107A8000002142F00072C3F80021D3F80021D3F89E +:107A9000802042F00072C3F88020D3F8802022F0CA +:107AA0000072C3F88020D3F88030FFF70FFF0E215B +:107AB0004D209EE7064BCDE73C6500200044025870 +:107AC0004014004003002002003C30C0D865002074 +:107AD000083C30C0F8B5D0F89040054600214FF082 +:107AE00000662046FFF730FFD5F8941000234FF0D2 +:107AF00001128F684FF0FF30C4F83438C4F81C28E6 +:107B000004EB431201339F42C2F80069C2F8006BD4 +:107B1000C2F80809C2F8080BF2D20B68D5F8902019 +:107B2000C5F89830636210231361166916F01006C9 +:107B3000FBD11220FEF72EFDD4F8003823F4FE63AB +:107B4000C4F80038A36943F4402343F01003A36151 +:107B50000923C4F81038C4F814380B4BEB604FF00D +:107B6000C043C4F8103B094BC4F8003BC4F810698B +:107B7000C4F80039D5F8983003F1100243F48013AB +:107B8000C5F89820A362F8BD209C00084080001032 +:107B9000D0F8902090F88A10D2F8003823F4FE63D1 +:107BA00043EA0113C2F80038704700002DE9F8439A +:107BB00000EB8103D0F890500C468046DA680FFA4B +:107BC00081F94801166806F00306731E022B05EBC7 +:107BD00041134FF0000194BFB604384EC3F8101B98 +:107BE0004FF0010104F1100398BF06F1805601FA2D +:107BF00003F3916998BF06F5004600293AD0578AE9 +:107C000004F15801374349016F50D5F81C180B4354 +:107C10000021C5F81C382B180127C3F81019A740FC +:107C20005369611E9BB3138A928B9B08012A88BFFC +:107C30005343D8F89820981842EA034301F14002D0 +:107C40002146C8F89800284605EB82025360FFF7EA +:107C50007BFE08EB8900C3681B8A43EA84534834DF +:107C60001E4364012E51D5F81C381F43C5F81C78FB +:107C7000BDE8F88305EB4917D7F8001B21F4004154 +:107C8000C7F8001BD5F81C1821EA0303C0E704F16C +:107C90003F030B4A2846214605EB83035A60FFF752 +:107CA00053FE05EB4910D0F8003923F40043C0F827 +:107CB0000039D5F81C3823EA0707D7E70080001001 +:107CC00000040002D0F894201268C0F89820FFF752 +:107CD0000FBE00005831D0F8903049015B5813F4C2 +:107CE000004004D013F4001F0CBF02200120704795 +:107CF0004831D0F8903049015B5813F4004004D06B +:107D000013F4001F0CBF02200120704700EB81011B +:107D1000CB68196A0B6813604B68536070470000AA +:107D200000EB810330B5DD68AA691368D36019B927 +:107D3000402B84BF402313606B8A1468D0F89020D6 +:107D40001C4402EB4110013C09B2B4FBF3F4634361 +:107D5000033323F0030343EAC44343F0C043C0F8B2 +:107D6000103B2B6803F00303012B0ED1D2F8083827 +:107D700002EB411013F4807FD0F8003B14BF43F0B6 +:107D8000805343F00053C0F8003B02EB4112D2F89D +:107D9000003B43F00443C2F8003B30BD2DE9F04105 +:107DA000D0F8906005460C4606EB4113D3F8087BEB +:107DB0003A07C3F8087B08D5D6F814381B0704D552 +:107DC00000EB8103DB685B689847FA071FD5D6F89C +:107DD0001438DB071BD505EB8403D968CCB98B6954 +:107DE000488A5A68B2FBF0F600FB16228AB9186876 +:107DF000DA6890420DD2121AC3E90024302383F3CB +:107E0000118821462846FFF78BFF84F31188BDE8CF +:107E1000F081012303FA04F26B8923EA02036B81E8 +:107E2000CB68002BF3D021462846BDE8F041184727 +:107E300000EB81034A0170B5DD68D0F890306C69C1 +:107E40002668E66056BB1A444FF40020C2F81009B9 +:107E50002A6802F00302012A0AB20ED1D3F80808F8 +:107E600003EB421410F4807FD4F8000914BF40F0F3 +:107E7000805040F00050C4F8000903EB4212D2F8E1 +:107E8000000940F00440C2F800090122D3F8340888 +:107E900002FA01F10143C3F8341870BD19B9402E3C +:107EA00084BF4020206020681A442E8A8419013C37 +:107EB000B4FBF6F440EAC44040F00050C6E70000CE +:107EC0002DE9F843D0F8906005460C464F0106EBCB +:107ED0004113D3F8088918F0010FC3F808891CD0A2 +:107EE000D6F81038DB0718D500EB8103D3F80CC0A7 +:107EF000DCF81430D3F800E0DA68964530D2A2EB13 +:107F00000E024FF000091A60C3F80490302383F387 +:107F10001188FFF78DFF89F3118818F0800F1DD0AD +:107F2000D6F834380126A640334217D005EB840337 +:107F30000134D5F89050D3F80CC0E4B22F44DCF8EB +:107F4000142005EB0434D2F800E05168714514D3D5 +:107F5000D5F8343823EA0606C5F83468BDE8F88356 +:107F6000012303FA01F2038923EA02030381DCF807 +:107F70000830002BD1D09847CFE7AEEB0103BCF817 +:107F80001000834228BF0346D7F8180980B2B3EB2C +:107F9000800FE3D89068A0F1040959F8048FC4F861 +:107FA0000080A0EB09089844B8F1040FF5D81844F4 +:107FB0000B4490605360C8E72DE9F84FD0F890501B +:107FC00004466E69AB691E4016F480586E6103D09A +:107FD000BDE8F84FFDF7EEBF002E12DAD5F8003EEF +:107FE0009B0705D0D5F8003E23F00303C5F8003EFB +:107FF000D5F80438204623F00103C5F80438FEF70D +:1080000007F8370505D52046FFF772FC2046FDF737 +:10801000EDFFB0040CD5D5F8083813F0060FEB6867 +:1080200023F470530CBF43F4105343F4A053EB609C +:1080300031071BD56368DB681BB9AB6923F0080304 +:10804000AB612378052B0CD1D5F8003E9A0705D0FB +:10805000D5F8003E23F00303C5F8003E2046FDF7A7 +:10806000D7FF6368DB680BB120469847F30200F145 +:10807000BA80B70226D5D4F8909000274FF0010AB5 +:1080800009EB4712D2F8003B03F44023B3F5802FED +:1080900011D1D2F8003B002B0DDA62890AFA07F3FE +:1080A00022EA0303638104EB8703DB68DB6813B117 +:1080B0003946204698470137D4F89430FFB29B6880 +:1080C0009F42DDD9F00619D5D4F89000026AC2F3B8 +:1080D0000A1702F00F0302F4F012B2F5802F00F03D +:1080E000CA80B2F5402F09D104EB8303002200F5CA +:1080F0008050DB681B6A974240F0B0803003D5F8AF +:10810000185835D5E90303D500212046FFF746FE70 +:10811000AA0303D501212046FFF740FE6B0303D5D8 +:1081200002212046FFF73AFE2F0303D50321204604 +:10813000FFF734FEE80203D504212046FFF72EFEA8 +:10814000A90203D505212046FFF728FE6A0203D5C0 +:1081500006212046FFF722FE2B0203D507212046E9 +:10816000FFF71CFEEF0103D508212046FFF716FE9E +:10817000700340F1A780E90703D500212046FFF7EF +:108180009FFEAA0703D501212046FFF799FE6B0742 +:1081900003D502212046FFF793FE2F0703D50321C5 +:1081A0002046FFF78DFEEE0603D504212046FFF79B +:1081B00087FEA80603D505212046FFF781FE690644 +:1081C00003D506212046FFF77BFE2A0603D50721AB +:1081D0002046FFF775FEEB0574D520460821BDE863 +:1081E000F84FFFF76DBED4F890904FF0000B4FF0B2 +:1081F000010AD4F894305FFA8BF79B689F423FF6F0 +:1082000038AF09EB4713D3F8002902F44022B2F546 +:10821000802F20D1D3F80029002A1CDAD3F80029B6 +:1082200042F09042C3F80029D3F80029002AFBDB72 +:108230003946D4F89000FFF787FB22890AFA07F342 +:1082400022EA0303238104EB8703DB689B6813B1F5 +:108250003946204698470BF1010BCAE7910701D137 +:10826000D0F80080072A02F101029CBF03F8018BBD +:108270004FEA18283FE704EB830300F58050DA68E3 +:10828000D2F818C0DCF80820DCE9001CA1EB0C0CCB +:1082900000218F4208D1DB689B699A683A449A6052 +:1082A0005A683A445A6029E711F0030F01D1D0F817 +:1082B00000808C4501F1010184BF02F8018B4FEA77 +:1082C0001828E6E7BDE8F88F08B50348FFF774FE05 +:1082D000BDE80840FFF744BA3C65002008B50348F4 +:1082E000FFF76AFEBDE80840FFF73ABAD8650020FC +:1082F000D0F8903003EB4111D1F8003B43F4001368 +:10830000C1F8003B70470000D0F8903003EB4111FA +:10831000D1F8003943F40013C1F800397047000068 +:10832000D0F8903003EB4111D1F8003B23F4001357 +:10833000C1F8003B70470000D0F8903003EB4111CA +:10834000D1F8003923F40013C1F800397047000058 +:10835000064BD3F8DC200243C3F8DC20D3F8042119 +:108360001043C3F80401D3F80431704700440258A5 +:1083700008B53C4B4FF0FF31D3F8802062F000424B +:10838000C3F88020D3F8802002F00042C3F8802098 +:10839000D3F88020D3F88420C3F88410D3F8842045 +:1083A0000022C3F88420D3F88400D86F40F0FF4047 +:1083B00040F4FF0040F4DF4040F07F00D867D86F02 +:1083C00020F0FF4020F4FF0020F4DF4020F07F0089 +:1083D000D867D86FD3F888006FEA40506FEA5050E2 +:1083E000C3F88800D3F88800C0F30A00C3F88800F7 +:1083F000D3F88800D3F89000C3F89010D3F8900019 +:10840000C3F89020D3F89000D3F89400C3F89410E8 +:10841000D3F89400C3F89420D3F89400D3F89800CC +:10842000C3F89810D3F89800C3F89820D3F89800B0 +:10843000D3F88C00C3F88C10D3F88C00C3F88C20D0 +:10844000D3F88C00D3F89C00C3F89C10D3F89C1090 +:10845000C3F89C20D3F89C30FCF72EFABDE8084006 +:1084600000F0D6B90044025808B50122534BC3F8B6 +:108470000821534BD3F8F42042F00202C3F8F42051 +:10848000D3F81C2142F00202C3F81C210222D3F8C7 +:108490001C314C4BDA605A689104FCD54A4A1A6088 +:1084A00001229A60494ADA6000221A614FF4404280 +:1084B0009A61444B9A699204FCD51A6842F480721E +:1084C0001A603F4B1A6F12F4407F04D04FF4803291 +:1084D0001A6700221A671A6842F001021A60384BC4 +:1084E0001A685007FCD500221A611A6912F0380286 +:1084F000FBD1012119604FF0804159605A67344A1D +:10850000DA62344A1A611A6842F480321A602C4BDB +:108510001A689103FCD51A6842F480521A601A68EE +:108520009204FCD52C4A2D499A6200225A631963A1 +:1085300001F57C01DA6301F5E77199635A64284A11 +:108540001A64284ADA621A6842F0A8521A601C4B70 +:108550001A6802F02852B2F1285FF9D148229A61D4 +:108560004FF48862DA6140221A621F4ADA641F4AB5 +:108570001A651F4A5A651F4A9A6532231E4A1360BC +:10858000136803F00F03022BFAD10D4A136943F06D +:1085900003031361136903F03803182BFAD14FF06A +:1085A0000050FFF7D5FE4FF08040FFF7D1FE4FF0AF +:1085B0000040BDE80840FFF7CBBE00BF008000517F +:1085C000004402580048025800C000F002000001B8 +:1085D0000000FF010088900832206000630209015A +:1085E000470E0508DD0BBF01200000200000011030 +:1085F0000910E00000010110002000524FF0B042CD +:1086000008B5D2F8883003F00103C2F8883023B1EE +:10861000044A13680BB150689847BDE80840FFF75B +:108620009FB800BFB46600204FF0B04208B5D2F842 +:10863000883003F00203C2F8883023B1044A9368FB +:108640000BB1D0689847BDE80840FFF789B800BF74 +:10865000B46600204FF0B04208B5D2F8883003F07D +:108660000403C2F8883023B1044A13690BB150697E +:108670009847BDE80840FFF773B800BFB466002014 +:108680004FF0B04208B5D2F8883003F00803C2F8C2 +:10869000883023B1044A93690BB1D0699847BDE88B +:1086A0000840FFF75DB800BFB46600204FF0B0424D +:1086B00008B5D2F8883003F01003C2F8883023B12F +:1086C000044A136A0BB1506A9847BDE80840FFF7A7 +:1086D00047B800BFB46600204FF0B04310B5D3F8E0 +:1086E000884004F47872C3F88820A30604D5124A9F +:1086F000936A0BB1D06A9847600604D50E4A136B93 +:108700000BB1506B9847210604D50B4A936B0BB104 +:10871000D06B9847E20504D5074A136C0BB1506C37 +:108720009847A30504D5044A936C0BB1D06C9847C5 +:10873000BDE81040FFF714B8B46600204FF0B04316 +:1087400010B5D3F8884004F47C42C3F88820620551 +:1087500004D5164A136D0BB1506D9847230504D507 +:10876000124A936D0BB1D06D9847E00404D50F4ABF +:10877000136E0BB1506E9847A10404D50B4A936E4B +:108780000BB1D06E9847620404D5084A136F0BB141 +:10879000506F9847230404D5044A936F0BB1D06FF0 +:1087A0009847BDE81040FEF7DBBF00BFB46600206D +:1087B00008B50348FCF748FCBDE80840FEF7D0BF09 +:1087C000C836002008B50348FCF742FDBDE8084064 +:1087D000FEF7C6BF2039002008B50348FCF738FD76 +:1087E000BDE80840FEF7BCBF8C39002008B503483F +:1087F000FCF72EFDBDE80840FEF7B2BFF8390020B7 +:1088000008B500F0BDFCBDE80840FEF7A9BF0000B8 +:10881000062108B50846FCF7A1FD06210720FCF754 +:108820009DFD06210820FCF799FD06210920FCF793 +:1088300095FD06210A20FCF791FD06211720FCF783 +:108840008DFD06212820FCF789FD09217A20FCF7FF +:1088500085FD09213120FCF781FD07213220FCF73D +:108860007DFD0C212620FCF779FD0C212720FCF74B +:1088700075FD0C215220BDE80840FCF76FBD0000DB +:1088800008B5FFF775FD00F043FCFDF747F9FDF76C +:10889000E5F8FDF71DFBFDF7EFF9FEF7B1F9BDE8CF +:1088A000084000F029BA000030B50433039C01727F +:1088B000002104FB0325C160C0E90653049B036348 +:1088C000059BC0E90000C0E90422C0E90842C0E9F4 +:1088D0000A11436330BD00000022416AC260C0E952 +:1088E0000411C0E90A226FF00101FDF7FFBE00008C +:1088F000D0E90432934201D1C2680AB9181D704709 +:1089000000207047036919600021C2680132C2600B +:10891000C269134482699342036124BF436A0361BD +:10892000FDF7D8BE38B504460D46E3683BB1626931 +:108930000020131D1268A3621344E36207E0237A48 +:1089400033B929462046FDF7B5FE0028EDDA38BDDB +:108950006FF00100FBE70000C368C269013BC36020 +:108960004369134482699342436124BF436A43616C +:1089700000238362036B03B11847704770B530233F +:10898000044683F31188866A3EB9FFF7CBFF05469C +:1089900018B186F31188284670BDA36AE26A13F8FD +:1089A000015B9342A36202D32046FFF7D5FF002369 +:1089B00083F31188EFE700002DE9F84F04460E46D7 +:1089C000174698464FF0300989F311880025AA46CA +:1089D000D4F828B0BBF1000F09D141462046FFF77B +:1089E000A1FF20B18BF311882846BDE8F88FD4E9A8 +:1089F0000A12A7EB050B521A934528BF9346BBF109 +:108A0000400F1BD9334601F1400251F8040B91424B +:108A100043F8040BF9D1A36A403640354033A362D2 +:108A2000D4E90A239A4202D32046FFF795FF8AF33E +:108A30001188BD42D8D289F31188C9E730465A4619 +:108A4000F9F754F9A36A5E445D445B44A362E7E727 +:108A500010B5029C0433017203FB0421C460C0E919 +:108A600006130023C0E90A33039B0363049BC0E998 +:108A70000000C0E90422C0E90842436310BD0000C1 +:108A8000026A6FF00101C260426AC0E9042200225A +:108A9000C0E90A22FDF72ABED0E904239A4201D197 +:108AA000C26822B9184650F8043B0B607047002397 +:108AB0001846FAE7C3680021C2690133C3604369FD +:108AC000134482699342436124BF436A4361FDF7C3 +:108AD00001BE000038B504460D46E3683BB123698A +:108AE00000201A1DA262E2691344E36207E0237AC0 +:108AF00033B929462046FDF7DDFD0028EDDA38BD03 +:108B00006FF00100FBE7000003691960C268013AD9 +:108B1000C260C269134482699342036124BF436AFD +:108B2000036100238362036B03B1184770470000A1 +:108B300070B530230D460446114683F31188866ACA +:108B40002EB9FFF7C7FF10B186F3118870BDA36A75 +:108B50001D70A36AE26A01339342A36204D3E16900 +:108B600020460439FFF7D0FF002080F31188EDE79D +:108B70002DE9F84F04460D46904699464FF0300ACD +:108B80008AF311880026B346A76A4FB949462046A2 +:108B9000FFF7A0FF20B187F311883046BDE8F88FBA +:108BA000D4E90A073A1AA8EB0607974228BF1746E6 +:108BB000402F1BD905F1400355F8042B9D4240F886 +:108BC000042BF9D1A36A40364033A362D4E90A23C7 +:108BD0009A4204D3E16920460439FFF795FF8BF3ED +:108BE00011884645D9D28AF31188CDE729463A46FD +:108BF000F9F77CF8A36A3D443E443B44A362E5E7B1 +:108C0000D0E904239A4217D1C3689BB1836A8BB120 +:108C1000043B9B1A0ED01360C368013BC360C36959 +:108C20001A4483699A42026124BF436A03610023A4 +:108C300083620123184670470023FBE701F01F03FE +:108C4000F0B502F01F0456095A1C0123B6EB511F60 +:108C500050F8265003FA02F34FEA511703F1FF339D +:108C60003DBF50F82720C4F12000134003EA05005F +:108C70003BBF03FA00F225FA04F0E0401043F0BDD8 +:108C800070B57E227F210546FFF7D8FF18B1012875 +:108C900019D0002070BD3E2249212846FFF7CEFFA3 +:108CA0002F22044631212846FFF7C8FF064601342B +:108CB0005022023653212846B440FFF7BFFF09383F +:108CC00004FA00F0E6E7302245212846FFF7B6FF18 +:108CD00001308002DEE7000090F8D63090F8D7200F +:108CE0001B0403EB026390F8D42090F8D5001344E2 +:108CF00003EB00207047000000F018BA014B586ADF +:108D0000704700BF000C0040034B002258631A61FB +:108D10000222DA60704700BF000C0040014B0022C5 +:108D2000DA607047000C0040014B5863704700BF89 +:108D3000000C0040024B034A1A60034A5A60704715 +:108D40008C6600203867002000000220074B494253 +:108D500010B55C68201A08401968821A8A4203D349 +:108D6000A24201D85A6010BD0020FCE78C660020AA +:108D700008B5302383F31188FFF7E8FF002383F35E +:108D8000118808BD0448054B03600023C0E9013386 +:108D90000C3000F017B900BF94660020718D0008F8 +:108DA000CB1D083A23F00703591A521A10B4D208FF +:108DB0000024C0E9004384600C301C605A605DF8F8 +:108DC000044B00F0FFB800002DE9F74F364FCD1DE2 +:108DD0008846002818BF0746082A4FEAD50538BF3D +:108DE000082207F10C003C1D9146019000F02CF97F +:108DF000019809F10701C9F1000E2246246864B9FF +:108E000000F02CF93B68CBB308224946E8009847AC +:108E1000044698B340E9027830E004EB010CD4F842 +:108E200004A00CEA0E0C0AF10106ACF1080304EBF5 +:108E3000C6069E42E1D9A6EB0C0CB5EBEC0F4FEA4F +:108E4000EC0BDAD89C421DD204F10802AB45A3EB2F +:108E500002024FEAE202626009D9691CED4303EBAA +:108E6000C1025D445560256843F8315022601C46BC +:108E7000C3F8048044F8087B00F0F0F8204603B003 +:108E8000BDE8F08FAA45216802D111602346EEE7C4 +:108E9000013504EBC50344F8351003F10801761AD7 +:108EA000F6105E601360F1E79466002073B5044627 +:108EB000A0F1080550F8080C54F8043C061D0C30CD +:108EC00007330190DB0844F8043C00F0BDF833465A +:108ED00001989E421A6801D0AB4228D20AB195424D +:108EE00025D244F8082C54F8042C1D60013254F8A3 +:108EF000081C05EBC206B14206D14E68324444F864 +:108F0000042C0A6844F8082C5E68711C03EBC1014C +:108F10008D4207D154F8042C013232445A6054F87F +:108F2000082C1A6002B0BDE8704000F097B81346F4 +:108F3000CFE70000FEE7000070B51E4B0025044699 +:108F400086B058600E4605638163FEF7E1FB04F1CD +:108F50002803A5606563C4E90A3304F11003C4E97A +:108F600004334FF0FF33C4E90044C4E90635FFF78A +:108F7000C5FE2B46024604F13C012046C4E9082305 +:108F800080230D4A6567FDF70FFB7368E0600B4AAD +:108F900003620123009280F824306846F26801924F +:108FA0003269CDE90223064BCDE90435FDF730FBEC +:108FB00006B070BD10490020649C00085C9C00084D +:108FC000358F00080023C0E900008360036170470B +:108FD00070B51C4B05468468DE685CB3B44213D19F +:108FE00003690133036170BDA36094F8243083B139 +:108FF000062B15D1A06A2146D4E9003213605A60CD +:10900000FDF73EFAA36A9C68B368A2689A42EBD364 +:1090100006E0D4E90032204613605A60FDF740FABA +:1090200028463146FDF72CFAB5620620BDE87040AF +:10903000FDF738BA0369866001330361336BC3609F +:109040003063D0E76846002008B5302383F31188E9 +:10905000FFF7BEFF002383F3118808BD194BD968C1 +:1090600083688B4210B520D1302383F311880269C5 +:10907000013A0261B2B90468C368A0420B631ED012 +:109080004A6B9BB901238A60036103681A68026016 +:1090900050601A6B8360C26018631846FDF700FACF +:1090A000FDF750FA002383F3118810BD1C68A3421A +:1090B00003D0A468A24238BF2246DB68E1E78260A1 +:1090C000F0E700BF68460020024A536B1843506324 +:1090D000704700BF6846002038B5EFF311859DB991 +:1090E000EFF30584C4F30804302334B183F311880B +:1090F000FDF734FC85F3118838BD83F31188FDF743 +:109100002DFC84F3118838BDBDE83840FDF726BC3E +:109110000023054A19460133102BC2E9001102F160 +:109120000802F8D1704700BFB4660020114BD3F895 +:10913000E82042F00802C3F8E820D3F8102142F0FA +:109140000802C3F810210C4AD3F81031D36B43F056 +:109150000803D363C722094B9A624FF0FF32DA62E9 +:1091600000229A615A63DA605A6001225A611A60D9 +:10917000704700BF004402580010005C000C004023 +:10918000094A08B51169D3680B40D9B29B076FEA49 +:109190000101116107D5302383F31188FDF7F8F938 +:1091A000002383F3118808BD000C004010B501397D +:1091B0000244904201D1002005E0037811F8014FEC +:1091C000A34201D0181B10BD0130F2E7884210B550 +:1091D00001EB020402D98442234607D8431EA14270 +:1091E00008D011F8012B03F8012FF8E702440146DB +:1091F0008A4200D110BD13F8014D02F8014DF7E786 +:10920000C9B2034610F8012B1AB18A42F9D11846A7 +:109210007047002918BF0023F9E70000034611F842 +:10922000012B03F8012B002AF9D1704710B5013941 +:10923000034632B111F8014F03F8014B013A002CFB +:10924000F7D11A440021934200D110BD03F8011B4D +:10925000F9E700004D4435002D2D0A002F6172649E +:109260007570696C6F742E6162696E002F61726433 +:109270007570696C6F742D7665726966792E61629E +:10928000696E002F6172647570696C6F742D666C05 +:109290006173682E6162696E002F61726475706916 +:1092A0006C6F742D666C61736865642E6162696EA3 +:1092B000000000000000000000000000050F000892 +:1092C000A10F000851110008D90F0008990F0008DC +:1092D0000000000000000000010F0008AD0F0008B2 +:1092E00089110008FD0E0008090F000853544D3382 +:1092F0003248373F3F3F0053544D3332483733787D +:109300002F3732780053544D3332483734332F37A8 +:1093100035332F373530000001105A000310590043 +:1093200001205800032056002F000000537563638E +:1093300065737366756C6C79206D6F756E7465649A +:10934000205344436172642028736C6F77646F7795 +:109350006E3D2575290A0000EB769045584641542C +:1093600020202000464154333220202000000000FD +:109370002A3A3C3E7C223F7F002B2C3B3D5B5D002C +:10938000435545414141414345454549494941418D +:109390004592924F4F4F5555594F554F9C4F9E9F59 +:1093A00041494F55A5A5A6A7A8A9AAABACADAEAF9C +:1093B000B0B1B2B3B4414141B8B9BABBBCBDBEBF94 +:1093C000C0C1C2C3C4C54141C8C9CACBCCCDCECF30 +:1093D000D1D145454549494949D9DADBDCDD49DF89 +:1093E0004FE14F4F4F4FE6E8E85555555959EEEFCD +:1093F000F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFFF5 +:1094000001030507090E10121416181C1E00000097 +:1094100061001A03E0001703F8000703FF000100D2 +:1094200078010001300132010601390110014A01C1 +:109430002E017901060180014D0043028101820164 +:1094400082018401840186018701870189018A01E3 +:109450008B018B018D018E018F0190019101910192 +:1094600093019401F60196019701980198013D023C +:109470009B019C019D0120029F01A001A001A2016E +:10948000A201A401A401A601A701A701A901AA01A3 +:10949000AB01AC01AC01AE01AF01AF01B101B20152 +:1094A000B301B301B501B501B701B801B801BA0103 +:1094B000BB01BC01BC01BE01F701C001C101C20179 +:1094C000C301C401C501C401C701C801C701CA0164 +:1094D000CB01CA01CD011001DD0101008E01DE01C9 +:1094E0001201F3010300F101F401F401F801280174 +:1094F000220212013A020900652C3B023B023D02A6 +:10950000662C3F0240024102410246020A01530218 +:10951000400081018601550289018A0158028F01AC +:109520005A0290015C025D025E025F0293016102D9 +:109530006202940164026502660267029701960165 +:109540006A02622C6C026D026E029C017002710252 +:109550009D01730274029F017602770278027902FC +:109560007A027B027C02642C7E027F02A6018102C9 +:109570008202A9018402850286028702AE014402AA +:10958000B101B20145028D028E028F02900291025A +:10959000B7017B030300FD03FE03FF03AC030400DC +:1095A0008603880389038A03B1031103C2030200FF +:1095B000A303A303C4030803CC0303008C038E039B +:1095C0008F03D8031801F2030A00F903F303F4032D +:1095D000F503F603F703F703F903FA03FA0330047C +:1095E000200350041007600422018A043601C104DC +:1095F0000E01CF040100C004D0044401610526041B +:10960000000000007D1D0100632C001E9601A01EBD +:109610005A01001F0806101F0606201F0806301FEB +:109620000806401F0606511F0700591F521F5B1FE7 +:10963000541F5D1F561F5F1F601F0806701F0E001E +:10964000BA1FBB1FC81FC91FCA1FCB1FDA1FDB1FD2 +:10965000F81FF91FEA1FEB1FFA1FFB1F801F0806E8 +:10966000901F0806A01F0806B01F0400B81FB91FEE +:10967000B21FBC1FCC1F0100C31FD01F0206E01F7A +:109680000206E51F0100EC1FF31F0100FC1F4E2125 +:109690000100322170211002842101008321D02495 +:1096A0001A05302C2F04602C0201672C0601752C42 +:1096B0000201802C6401002D260841FF1A030000DE +:1096C000C700FC00E900E200E400E000E500E7007C +:1096D000EA00EB00E800EF00EE00EC00C400C5007B +:1096E000C900E600C600F400F600F200FB00F90035 +:1096F000FF00D600DC00F800A300D800D7009201DC +:10970000E100ED00F300FA00F100D100AA00BA0078 +:10971000BF00AE00AC00BD00BC00A100AB00BB00B0 +:1097200091259225932502252425C100C200C00061 +:10973000A9006325512557255D25A200A500102508 +:10974000142534252C251C2500253C25E300C300C9 +:109750005A25542569256625602550256C25A400C9 +:10976000F000D000CA00CB00C8003101CD00CE000F +:10977000CF0018250C2588258425A600CC0080253F +:10978000D300DF00D400D200F500D500B500FE0004 +:10979000DE00DA00DB00D900FD00DD00AF00B40020 +:1097A000AD00B1001720BE00B600A700F700B8005A +:1097B000B000A800B700B900B300B200A025A00017 +:1097C00010000240080002400008024000000B00A8 +:1097D00028000240080002400408024006010C0074 +:1097E00040000240080002400808024010020D003C +:1097F00058000240080002400C08024016030E0008 +:10980000700002400C0002401008024000040F00EB +:10981000880002400C0002401408024006051000B7 +:10982000A00002400C00024018080240100611007F +:10983000B80002400C0002401C08024016072F002E +:1098400010040240080402402008024000083800CA +:109850002804024008040240240802400609390096 +:10986000400402400804024028080240100A3A005E +:1098700058040240080402402C080240160B3B002A +:10988000700402400C04024030080240000C3C000E +:10989000880402400C04024034080240060D4400D3 +:1098A000A00402400C04024038080240100E45009B +:1098B000B80402400C0402403C080240160F460067 +:1098C0000100000000000000009600000000000001 +:1098D0000000000000000000000000000000000088 +:1098E00000000000F96B0008FD6B0008F15600084D +:1098F000295A000885560008AD560008D5560008BC +:109900006D56000800000000DD5A0008C95A000822 +:10991000055B0008F15A0008FD5A0008E95A0008E2 +:10992000D55A0008C15A0008115B00080000000069 +:10993000F55B0008E15B00081D5C0008095C00089D +:10994000155C0008015C0008ED5B0008D95B0008AD +:10995000295C000800000000010000000000000079 +:109960006330000060990008000000000000000063 +:10997000E0460020104900200000812A000000007D +:10998000AAAAAAAA00000024FFFE0000000000000E +:1099900000A00A000001000000000000AAAAAAAA74 +:1099A00000000000FFFF00000000000000000000B9 +:1099B0001400AA5600000000AAAAAAAA140055542E +:1099C000FFFF000000000000CCCC0C0020681A0053 +:1099D00000000000AAAA8AAA10541500FFFF000088 +:1099E000000C7007770000004081020100100000A9 +:1099F000AAAAAAAA00410100F7FF00000000007017 +:109A0000070000000000000000000000AAAAAAAAA7 +:109A100000000000FFFF0000000000000000000048 +:109A20000000000000000000AAAAAAAA000000008E +:109A3000FFFF000000000000000000000000000028 +:109A400000000000AAAAAAAA00000000FFFF000070 +:109A50000000000000000000000000000000000006 +:109A6000AAAAAAAA00000000FFFF00000000000050 +:109A7000000000000000000000000000AAAAAAAA3E +:109A800000000000FFFF00000000000000000000D8 +:109A90000000000000000000AAAAAAAA000000001E +:109AA000FFFF000000000000000000004865782F64 +:109AB00050726F6669434E430025424F4152442520 +:109AC0002D424C002553455249414C2500000000D1 +:109AD0000200000000000000155E0008855E00081E +:109AE00040004000C0610020D06100200200000062 +:109AF000000000000300000000000000CD5E000830 +:109B00000000000010000000E061002000000000E4 +:109B100001000000000000003C650020010102007F +:109B2000F56C0008056C0008A16C0008856C000845 +:109B300043000000389B000809024300020100C0F6 +:109B40003209040000010202010005240010010591 +:109B500024010001042402020524060001070582F5 +:109B6000030800FF09040100020A000000070501C4 +:109B700002400000070581024000000012000000C2 +:109B8000849B00081201100102000040AE2D161047 +:109B900000020102030100000403090425424F41B1 +:109BA00052442500437562654F72616E67650030EF +:109BB0003132333435363738394142434445460033 +:109BC0000000002000000200020000000000003041 +:109BD000000004000800000000000024000008004D +:109BE000040000000004000000FC0000020000006F +:109BF0000000043000800000080000000000003871 +:109C000000000100010000001F1C1F1E1F1E1F1F5F +:109C10001E1F1E1F1F1D1F1E1F1E1F1F1E1F1E1F5C +:109C20000000000029600008E16200088D63000860 +:109C300040004000746600207466002001000000AF +:109C40008466002080000000400100000800000041 +:109C500000010000001000000800000069646C654D +:109C6000000000006D61696E002C0438040438089F +:109C70000C10141C202425260000000000006404A1 +:109C80000100040000000000000C00102830340027 +:109C9000D867FF7F010000008C000000000000007A +:109CA00000001E0000000000FF0000001849002016 +:109CB000203900208C390020F839002000000000F5 +:109CC000EC92000883040000F792000850040000A2 +:109CD000059300080100000000000000009600004D +:109CE00000000800960000000008000004000000CA +:109CF000989B000800000000000000000000000029 +:0C9D000000000000000000000000000057 :00000001FF diff --git a/Tools/bootloaders/CubePilot-CANMod_bl.bin b/Tools/bootloaders/CubePilot-CANMod_bl.bin index 164019d4b6..abd206d7b8 100755 Binary files a/Tools/bootloaders/CubePilot-CANMod_bl.bin and b/Tools/bootloaders/CubePilot-CANMod_bl.bin differ diff --git a/Tools/bootloaders/CubePilot-CANMod_bl.hex b/Tools/bootloaders/CubePilot-CANMod_bl.hex index 7944303087..bdd4d6c5d0 100644 --- a/Tools/bootloaders/CubePilot-CANMod_bl.hex +++ b/Tools/bootloaders/CubePilot-CANMod_bl.hex @@ -1,34 +1,34 @@ :020000040800F2 -:1000000000070020F1020008FD320008B5320008A8 -:10001000DD320008B5320008D5320008F3020008CE -:10002000F3020008F3020008F3020008E1420008AE +:1000000000070020F1020008853300083D33000896 +:10001000653300083D3300085D330008F302000833 +:10002000F3020008F3020008F3020008714300081D :10003000F3020008F3020008F3020008F3020008CC :10004000F3020008F3020008F3020008F3020008BC -:10005000F3020008F3020008E17600080D770008BB -:10006000397700086577000891770008A5430008F4 -:10007000CD430008F9430008254400085144000816 -:1000800079440008A5440008F302000895320008EE -:10009000F3020008A5320008F3020008BD7700084B +:10005000F3020008F3020008057C0008317C000868 +:100060005D7C0008897C0008B57C000835440008E8 +:100070005D44000889440008B5440008E1440008D4 +:100080000945000835450008F30200081D33000843 +:10009000F30200082D330008F3020008E17C000899 :1000A000F3020008F3020008F3020008F30200085C :1000B000F3020008F3020008F3020008F30200084C :1000C000F3020008F3020008F3020008F30200083C :1000D000F3020008F3020008F3020008F30200082C -:1000E00021780008F3020008F3020008F302000878 -:1000F000F3020008F3020008F3020008D1440008EC -:10010000F3020008F3020008A9780008F3020008CF +:1000E000457D0008F3020008F3020008F30200084F +:1000F000F3020008F3020008F3020008614500085B +:10010000F3020008F3020008CD7D0008F3020008A6 :10011000F3020008F3020008F3020008F3020008EB -:10012000FD44000825450008514500087D450008AC -:10013000A9450008F3020008F3020008F3020008D2 +:100120008D450008B5450008E14500080D4600086A +:1001300039460008F3020008F3020008F302000841 :10014000F3020008F3020008F3020008F3020008BB -:10015000D1450008FD45000829460008F3020008C3 +:10015000614600088D460008B9460008F302000811 :10016000F3020008F3020008F3020008F30200089B -:10017000F30200088D6D0008F3020008F302000886 -:10018000F3020008F302000895780008F302000863 +:10017000F302000831700008F3020008F3020008DF +:10018000F3020008F3020008B97D0008F30200083A :10019000F3020008F3020008F3020008F30200086B :1001A000F3020008F3020008F3020008F30200085B :1001B000F3020008F3020008F3020008F30200084B :1001C000F3020008F3020008F3020008F30200083B -:1001D000F3020008796D0008F3020008F30200083A +:1001D000F30200081D700008F3020008F302000893 :1001E000F3020008F3020008F3020008F30200081B :1001F000F3020008F3020008F3020008F30200080B :10020000F3020008F3020008F3020008F3020008FA @@ -52,49 +52,49 @@ :100320004F8FBFF36F8F40F20000C0F2F0004EF627 :100330008851CEF200010860BFF34F8FBFF36F8F7B :100340004FF00000E1EE100A4EF63C71CEF20001D3 -:100350000860062080F31488BFF36F8F05F08CFFD0 -:1003600006F090FF4FF055301F491B4A91423CBFA9 +:100350000860062080F31488BFF36F8F06F0DEF884 +:1003600007F01CFA4FF055301F491B4A91423CBF21 :1003700041F8040BFAE71D49184A91423CBF41F885 :10038000040BFAE71A491B4A1B4B9A423EBF51F82D :10039000040B42F8040BF8E700201849184A914270 -:1003A0003CBF41F8040BFAE705F0A4FF06F0ECFFB0 +:1003A0003CBF41F8040BFAE706F0F6F807F07CFAD8 :1003B000144C154DAC4203DA54F8041B8847F9E796 :1003C00000F042F8114C124DAC4203DA54F8041B11 -:1003D0008847F9E705F08CBF0007002000230020C4 +:1003D0008847F9E706F0DEB8000700200023002078 :1003E0000000000808ED00E00001002000070020E8 -:1003F000607F000800230020D0230020D0230020AD -:1004000000740020E0020008E4020008E402000892 +:1003F00070840008002300206C230020702300205C +:1004000068740020E0020008E4020008E40200082A :10041000E40200082DE9F04F2DED108AC1F80CD050 :10042000D0F80CD0BDEC108ABDE8F08F002383F328 -:1004300011882846A047002005F004FAFEE705F0E1 -:1004400083F900DFFEE70000F8B501F0BFF901F025 -:1004500061FB05F095FE074605F004FF0546A8BBC5 +:1004300011882846A047002005F070FAFEE705F075 +:10044000EBF900DFFEE70000F8B501F0BFF901F0BD +:1004500061FB05F0BFFF074606F056F80546A8BB4E :100460001F4B9F4232D001339F4232D027F0FF0210 :100470001C4B9A4230D12E4642F21074F8B200F072 -:1004800079FF00F07DFF08B10024264601F08AFDC7 +:1004800079FF00F07DFF08B10024264601F0CAFD87 :1004900020B10024032000F079F8264635B1124B34 -:1004A0009F4203D0002405F0D5FE2646002005F02B -:1004B00071FE0EB100F080F801F0CAFA00F094FF6E +:1004A0009F4203D0002406F027F82646002005F0DE +:1004B0009BFF0EB100F080F801F0CAFA00F094FF43 :1004C000204600F02BF900F077F8F9E72E460024DB :1004D000D7E704460126D4E7064641F28834D0E740 :1004E000010007B0000008B0263A09B008B501F0D5 :1004F00039F9A0F120035842584108BD07B541F22F :100500001203022101A8ADF8043001F049F903B04B :100510005DF804FB38B5302383F31188174803686E -:100520000BB105F05BFA0023154A4FF47A711348BA -:1005300005F04AFA002383F31188124C236813B1A3 +:100520000BB105F0C7FA0023154A4FF47A7113484E +:1005300005F0B6FA002383F31188124C236813B137 :100540002368013B2360636813B16368013B636008 :100550000D4D2B7833B963687BB9022001F0EAF9BD :10056000322363602B78032B07D163682BB90220F9 -:1005700001F0E0F94FF47A73636038BDD0230020B6 -:1005800015050008F0240020E8230020084B18700F +:1005700001F0E0F94FF47A73636038BD7023002016 +:10058000150500089024002088230020084B1870CF :1005900003280CD8DFE800F008050208022001F06B :1005A000C7B9022001F0C2B9024B00225A6070475D -:1005B000E8230020F0240020F8B501F0F3FC30B16E +:1005B0008823002090240020F8B501F033FD30B1ED :1005C0004D4B03221A7000224C4B5A60F8BD4C4B25 :1005D0004C4A1C4619680131F8D004339342F9D1D2 :1005E0006268494B9A42F1D9484B9B6803F100631A -:1005F00003F580239A42E9D205F000FE05F012FED1 +:1005F00003F580239A42E9D205F052FF05F064FF2B :10060000002001F009F90220FFF7C0FF404B002154 :100610009A6C99641A6F19671A6FDA6CD9645A6FF9 :1006200059675A6F1A6D19659A6F99679B6F394BA5 @@ -110,13 +110,13 @@ :1006C000BFF34F8FBFF36F8FBFF34F8FBFF36F8FAA :1006D000536923F4003353610023C2F85032BFF34F :1006E0004F8FBFF36F8F302383F31188854680F3DC -:1006F000088820476AE700BFE8230020F024002094 +:1006F000088820476AE700BF882300209024002054 :100700000000040820000408FFFF03080023002065 :10071000004502580044025800ED00E02DE9F04F7A :1007200093B0B74B2022FF2100900AA89D6801F0EA :1007300039F9B44A1378A3B90121B34811700360A1 -:10074000302383F3118803680BB105F047F90023C8 -:10075000AE4A4FF47A71AC4805F036F9002383F3C2 +:10074000302383F3118803680BB105F0B3F900235C +:10075000AE4A4FF47A71AC4805F0A2F9002383F356 :100760001188009B13B1AA4B009A1A60A94A13780A :10077000032B03D000231370A54A53604FF0000AE7 :10078000009CD3465646D146012001F0D1F824B151 @@ -159,9 +159,9 @@ :1009D000B8F5807F3FF73EAF124BB845019323DD5A :1009E0004FF47A7000F0BEFE0390039A002AFFF6DF :1009F00031AF039A0137019B03F8012BEDE700BFEC -:100A000000230020EC240020D0230020150500083E -:100A1000F0240020E82300200423002008230020E5 -:100A20000C230020EC230020C820FFF75FFD0746C1 +:100A0000002300208C2400207023002015050008FE +:100A100090240020882300200423002008230020A5 +:100A20000C2300208C230020C820FFF75FFD074621 :100A300000283FF40FAF1F2D11D8C5F120020AABDB :100A400025F0030084494245184428BF42460192DC :100A500000F082FF019AFF217F4800F0A3FF4FEAD8 @@ -171,7 +171,7 @@ :100A900000283FF4DFAE0027B846704B9B68BB428E :100AA00018D91F2F11D80A9B01330ED027F003034A :100AB00012AA134453F8203C05934046042205A98A -:100AC000043701F059FA8046E7E7384600F0A6FE01 +:100AC000043701F099FA8046E7E7384600F0A6FEC1 :100AD0000590F2E7CDF81480042105A800F060FE2F :100AE00002E70023642104A8049300F04FFE0028CD :100AF0007FF4B0AE0220FFF7F9FC00283FF4AAAE65 @@ -190,13 +190,13 @@ :100BC00049AE00F063FE002844D00A9B01330BD0ED :100BD00008220AA9002000F0EDFE00283AD02022C9 :100BE000FF210AA800F0DEFEFFF788FC1C4804F095 -:100BF0002FFE13B0BDE8F08F002E3FF42BAE0BF0AC +:100BF0009BFE13B0BDE8F08F002E3FF42BAE0BF040 :100C00000B030B2B7FF426AE0023642105A805936C :100C100000F0BCFD074600287FF41CAE0220FFF761 :100C200065FC804600283FF415AEFFF767FC41F2F3 -:100C3000883004F00DFE059800F04AFF46463C4619 +:100C3000883004F079FE059800F04AFF46463C46AD :100C400000F0FCFEA0E506464EE64FF0000901E686 -:100C5000BA467EE637467CE6EC23002000230020DF +:100C5000BA467EE637467CE68C230020002300203F :100C6000A0860100094A49F26900136899B21B0C79 :100C700000FB013344F250611360054B186882B2E7 :100C8000000C01FB0200186080B2704714230020A2 @@ -205,48 +205,48 @@ :100CB00000E8F11F2DE9F041ADF5507D0D46002112 :100CC00040F275126EAC074610A80F9100F06AFE54 :100CD0004FF4C4720021204600F064FE0DF13C0880 -:100CE00002F014FB4FF47A72264BB0FBF2F018605E +:100CE00002F058FB4FF47A72264BB0FBF2F018601A :100CF00093E80700022384E807000DF5ED702382D6 -:100D0000FFF7C8FF43F204731F4907A8238406F0C6 -:100D10006FFE1E230DF2EB220DF1340C84F83231FC +:100D0000FFF7C8FF43F204731F4907A8238407F0C5 +:100D1000F7F81E230DF2EB220DF1340C84F832317A :100D200007AB1E46083203CE664542F8080C42F86F :100D3000041C3346F5D13068414610602046B38824 -:100D40009380012200F03CFF002380B2E97E0393F0 +:100D40009380012200F042FF002380B2E97E0393EA :100D5000AB7E029305F1190301930123009307A3CE -:100D6000D3E90023CDE90480384602F08DFE0DF56D +:100D6000D3E90023CDE90480384602F0D1FE0DF529 :100D7000507DBDE8F08100BFAFF300809E6AC421C2 -:100D8000818A46EEF8240020007A00082DE9F0411F +:100D8000818A46EE98240020107F00082DE9F0416A :100D90002C4CDAB080460D46237A5BBB27A9284647 -:100DA00001F01CF80746002842D19DF89D60C82E2E +:100DA00001F036F80746002842D19DF89D60C82E14 :100DB0003ED801464FF4A662204600F0F3FD4FF402 :100DC000807332460DF19E01C4F8F8314FF4007380 :100DD00004F109002644C4F80C334FF44073C4F8FE :100DE000203400F0B9FD9DF89C30777223720BB966 :100DF000EB7E237206AC8122002127A800F0D2FDF1 -:100E00000122214627A801F025F8002380B2E97EBF +:100E00000122214627A801F049F8002380B2E97E9B :100E10000393AB7E029305F1190301932823CDE9D7 -:100E200004400093404605A3D3E9002302F02CFEC2 +:100E200004400093404605A3D3E9002302F070FE7E :100E30005AB0BDE8F08100BFAFF300802641727266 -:100E4000DF25D7B7004A0020F0B5254E4FF48A754C +:100E4000DF25D7B7A0490020F0B5254E4FF48A75AD :100E5000F1B0002405FB006596F8D830D822214671 :100E600085F8DC303AA885F8E84006AF00F09AFD36 :100E700006F1090000F08EFDD5F8E430C2B206F1AB :100E800009018DF8F0000DF1F100CDE93A3400F0E0 -:100E900063FD394601223AA801F008F8082380B220 +:100E900063FD394601223AA801F036F8082380B2F2 :100EA000317ACDE9047001270E48CDE9023706F109 :100EB000D80301933023009307A3D3E9002302F062 -:100EC000E3FDA04206DD02F021FAC5F8E000384655 +:100EC00027FEA04206DD02F065FAC5F8E0003846CC :100ED00071B0F0BD2046FBE778F6339F93CACD8D05 -:100EE000004A0020103500202DE9F0411D4D86B04C -:100EF0001D4E1E4F284602F0F3FD034658B3002452 +:100EE000A0490020B03400202DE9F0411D4D86B00E +:100EF0001D4E1E4F284602F037FE034658B300240D :100F0000DFF86C80ADF814400294CDE90344027B15 :100F10008DF8142003AA9968406803C21B6843F047 -:100F20000043029302F0F4F982190094384641F12B -:100F3000000302A901F030FAA04205DD284602F0C4 -:100F4000D3FD88F80040D5E798F80030072B05D886 +:100F20000043029302F038FA82190094384641F1E6 +:100F3000000302A901F074FAA04205DD284602F080 +:100F400017FE88F80040D5E798F80030072B05D841 :100F5000013388F8003006B0BDE8F081014802F0A6 -:100F6000C3FDF8E71035002040420F004035002057 -:100F7000354F002070B50D4614461E4602F0E0FCC9 +:100F600007FEF8E7B034002040420F00E0340020D4 +:100F7000D54E002070B50D4614461E4602F024FDE5 :100F800050B9022E10D1012C0ED112A3D3E90023A7 :100F90000120C5E9002307E0282C10D005D8012C3A :100FA00009D0052C0FD0002070BD302CFBD10BA335 @@ -258,21 +258,21 @@ :101000000E4C0021013500F02FFCA4F82C55B4F84B :101010002C0500F011FC78B1B4F82C0500F01CFC94 :10102000014648B9B4F82C0500F01EFCB4F82C3584 -:101030000133A4F82C35EAE738BD00BF004A002090 +:101030000133A4F82C35EAE738BD00BFA0490020F1 :101040000A4B0B4A10B51A6003F5805393F84820F9 -:101050003AB95C6C2CB1204601F022F8204606F02B -:101060007DFC0448BDE8104001F01AB8403500206E -:10107000B07A0008704500202DE9F04F8FB005468A -:101080000C4600AF02F05CFC002849D1237E022B05 -:101090001BD1E38A012B18D102F038F90646FFF77D +:101050003AB95C6C2CB1204601F062F8204601F0F0 +:101060009BF90448BDE8104001F05AB8E034002074 +:10107000C07F0008104500202DE9F04F8FB00546D5 +:101080000C4600AF02F0A0FC002849D1237E022BC1 +:101090001BD1E38A012B18D102F07CF90646FFF739 :1010A000E1FD03464FF4C87006F51676DFF8C082FE :1010B000B3FBF0F202FB103316FA83F3C8F80030EA :1010C000E37E33B9A34B00221A703C37BD46BDE81E -:1010D000F08F07F12401204600F03EFE0028F4D1F5 +:1010D000F08F07F12401204600F04EFE0028F4D1E5 :1010E00007F11400FFF7D6FD97F8264007F1140129 -:1010F00007F12700224606F049FC0028E2D10F2C18 +:1010F00007F12700224606F0D1FE0028E2D10F2C8E :1011000008D8944B1C70D8F80030A3F51673C8F8B3 -:101110000030DAE797F82410284602F009FCD4E7FB +:101110000030DAE797F82410284602F04DFCD4E7B7 :10112000E38A282B2BD010D8012B23D0052BCCD130 :10113000BFF34F8F8849894BCA6802F4E0621343BA :10114000CB60BFF34F8F00BFFDE7302BBDD1844E86 @@ -293,14 +293,14 @@ :10123000D42005EB0209C6F8D49000F0FDFA8145F0 :1012400009D396F8D220D6F8D4000132001B86F8D4 :10125000D220C6F8D400FF2D0FD80024347200F03D -:1012600015FB204600F0D8FA00F09CFE3D4B18819B +:1012600015FB204600F0D8FA00F0DCFE3D4B18815B :1012700008B9FFF7A1F9C54627E7BB6896F8D9007A :101280000AFB0362FB68D2F8E41082F8E83001F54B :101290008061C2F8E030C2F8E410FFF7D5FDFFF737 :1012A00023FE96F8D920013202F0030286F8D920F5 :1012B000B6E74FF48A7A20460AFB02F505F1EA0107 -:1012C000314400F01FFEF86000287FF4FEAE0122DA -:1012D000354485F8E82002F019F8D5F8E020D6ED7D +:1012C000314400F053FEF86000287FF4FEAE0122A6 +:1012D000354485F8E82002F05DF8D5F8E020D6ED39 :1012E000007A801A40F6B832B8EE677ADFED1E6AEF :1012F000192838BF1920904228BF104607EE900ADF :10130000F8EEE77A67EEA67ADFED186AE7EE267A5E @@ -308,92 +308,92 @@ :1013200073680AFB02F4321992F8E81059B1D2F846 :10133000E410E8468B423FF427AF002182F8E81022 :10134000C2F8E010C5467368064A9B0A0133138150 -:10135000BBE600BF0935002000ED00E00400FA05FF -:10136000004A0020F8240020CDCCCC3D6666663FC4 -:101370000C350020014B1870704700BF0425002079 +:10135000BBE600BFA934002000ED00E00400FA0560 +:10136000A049002098240020CDCCCC3D6666663F85 +:10137000AC340020014B1870704700BFA42400203B :1013800038B54FF00054144B22689A4221D1627D47 :101390000025124B12481A70C922237D09301149C9 :1013A00000F8013C4FF48073C0F8DB50C0F8EF3117 :1013B0004FF40073C0F803334FF44073C0F8173490 :1013C00000F0CAFAE0222946204600F0EBFA01209C -:1013D00038BD0020FCE700BF9AAD44C504250020BD -:1013E000004A00201600002037B500F0DBFD194D43 +:1013D00038BD0020FCE700BF9AAD44C5A42400201E +:1013E000A04900201600002037B500F01BFE194D63 :1013F00002230022184928816B710123174801F04C -:1014000047FB002316494FF480520193154B1648B1 -:101410000093164B02F064FA154B197811B112487B -:1014200002F086FA01F072FF0446FFF71BFC4FF44E +:101400008BFB002316494FF480520193154B16486D +:101410000093164B02F0A8FA154B197811B1124837 +:1014200002F0CAFA01F0B6FF0446FFF71BFC4FF4C6 :10143000C873B0FBF3F202FB130304F5167010FA45 -:1014400083F00C4B186004F00DFF08B10F232B81C3 -:1014500003B030BDF824002040420F00403500208A -:1014600008250020750F00081035002079100008AD -:10147000042500200C3500202DE9F04F8C4C2DED7B +:1014400083F00C4B186005F05FF808B10F232B8177 +:1014500003B030BD9824002040420F00E03400204B +:10146000A8240020750F0008B0340020791000086F +:10147000A4240020AC3400202DE9F04F8C4C2DED3D :10148000028B85A7D7E9006795B00FF21429D9E937 :1014900000899FED858BFFF727FD0DAD0023DFF859 :1014A00024B20C93ADF83C300D936B6000234FF0E9 :1014B000010A0DF1250209A958468DF825308DF84D -:1014C00024A08DED008B01F089FE9DF824200023DF -:1014D000002A40F0AE80204602F032FA054600288D -:1014E00047D1DFF8E4B101F011FFDBF8003098429A -:1014F0003FD301F00BFF0790FFF7B4FB4FF4C87325 +:1014C00024A08DED008B01F0CDFE9DF8242000239B +:1014D000002A40F0AE80204602F076FA0546002849 +:1014E00047D1DFF8E4B101F055FFDBF80030984256 +:1014F0003FD301F04FFF0790FFF7B4FB4FF4C873E1 :10150000079AB0FBF3F101FB130302F5167010FA12 :1015100083F0CBF8000010A8DFF8B0B19BF8001002 :10152000002914BF2B46534607918DF83030FFF742 :10153000B1FB079910AB0DF13100C1F11002194454 :10154000D2B2062A28BF0622079200F005FA079AAF :101550000CAB2046039301321823D2B20293554BB1 -:1015600004923246CDE900A33B4602F02FFA8BF8F5 -:10157000005001F0CBFE504A504D1368C31AB3F52A -:101580007A7F32D3106001F0C3FE02460B4620463C -:1015900002F0B4FA204602F0D3F930B32B7A0DF101 +:1015600004923246CDE900A33B4602F073FA8BF8B1 +:10157000005001F00FFF504A504D1368C31AB3F5E5 +:101580007A7F32D3106001F007FF02460B462046F7 +:1015900002F0F8FA204602F017FA30B32B7A0DF178 :1015A000400BDFF82CA1002B14BF032302238AF881 -:1015B000053001F0ABFE4FF47A7301225946B0FBBF -:1015C000F3F0CAF80000504600F09EFB182380B2EA +:1015B000053001F0EFFE4FF47A7301225946B0FB7B +:1015C000F3F0CAF80000504600F0AEFB182380B2DA :1015D000424602933A4B019340F25513CDE903B0D2 -:1015E000009320464B4602F0F1F92B7AABB101F0A3 -:1015F0008DFE4FF0000A83464FF48A7295F8D900A9 +:1015E000009320464B4602F035FA2B7AABB101F05E +:1015F000D1FE4FF0000A83464FF48A7295F8D90065 :10160000504400F0030002FB005393F8E81071B35C -:101610000AF1010ABAF1040FF0D1C82004F018F958 +:101610000AF1010ABAF1040FF0D1C82004F084F9EC :101620002B7A002B7FF435AF15B0BDEC028BBDE8F3 :10163000F08F1946102210A800F0B4F90DF126031E -:101640000AAA0CA9584601F0B3F811AB95E80300BB +:101640000AAA0CA9584601F0F7F811AB95E8030077 :1016500083E803009DF83C3010A920468DF84C30FB -:101660000C9B1093DDE90A2302F01CFC1EE7D3F863 +:101660000C9B1093DDE90A2302F060FC1EE7D3F81F :10167000E01049B12B68ABEB0101FA2B38BFFA231C :101680000533B1EB430FC3D3FFF7DEFB4FF48A7290 :101690000028BDD1C1E700BF401DA12026812A0B33 :1016A000F1C6A7C1D068080F0000000000000000CC -:1016B0001035002008350020304F0020004A00205F -:1016C000344F0020403500200C3500200935002023 -:1016D000F824002008B5054801F012F9044A05492C -:1016E0000020BDE8084006F033B900BF40350020B7 -:1016F0008C4F0020411000082DE9F84F4FF47A7309 +:1016B000B0340020A8340020D04E0020A0490020E3 +:1016C000D44E0020E0340020AC340020A9340020A7 +:1016D0009824002008B5054801F056F9044A054948 +:1016E0000020BDE8084006F0C5BB00BFE034002084 +:1016F0002C4F0020411000082DE9F84F4FF47A7369 :1017000006460D46002402FB03F7DFF85080DFF8A1 :10171000509098F900305FFA84FA5A1C01D0A34225 :1017200012D159F824002A4631460368D3F820B074 :101730003B46D847854207D1074B012083F800A0DC :10174000BDE8F88F0124E4E7002CFBD04FF4FA70D9 -:1017500004F07EF80020F3E77C4F002018230020DF +:1017500004F0EAF80020F3E71C4F002018230020D3 :101760001C230020002307B5024601210DF10700CC :101770008DF80730FFF7C0FF20B19DF8070003B0D8 :101780005DF804FB4FF0FF30F9E700000A46042142 :1017900008B5FFF7B1FF80F00100C0B2404208BDBC :1017A000074B0A4630B41978064B53F821400146DE :1017B00023682046DD69044BAC4630BC604700BF5F -:1017C0007C4F00201C230020A086010070B5104C27 -:1017D0000025104E04F066FB208030682388834289 -:1017E0000CD800252088013804F058FB23880544D4 -:1017F000013BB5F5802F2380F4D370BD04F04EFB80 +:1017C0001C4F00201C230020A086010070B5104C87 +:1017D0000025104E04F0D2FB20803068238883421D +:1017E0000CD800252088013804F0C4FB2388054468 +:1017F000013BB5F5802F2380F4D370BD04F0BAFB14 :10180000336805440133B5F5802F3360E5D3E8E74D -:101810007E4F0020384F002004F012BC00F1006021 +:101810001E4F0020D84E002004F07EBC00F1006076 :1018200000F580200068704700F10060920000F52C -:10183000802004F093BB0000054B1A68054B1B8801 -:101840009B1A834202D9104404F028BB0020704741 -:10185000384F00207E4F0020024B1B68184404F0D4 -:1018600023BB00BF384F0020024B1B68184404F014 -:101870002DBB00BF384F00200020704700F1FF5003 +:10183000802004F0FFBB0000054B1A68054B1B8895 +:101840009B1A834202D9104404F094BB00207047D5 +:10185000D84E00201E4F0020024B1B68184404F095 +:101860008FBB00BFD84E0020024B1B68184404F009 +:1018700099BB00BFD84E00200020704700F1FF50F8 :1018800000F58F10D0F8000870470000064991F865 :10189000243033B100230822086A81F82430FFF78E -:1018A000C3BF0120704700BF3C4F0020014B1868A8 +:1018A000C3BF0120704700BFDC4E0020014B186809 :1018B000704700BF0010005C194B01380322084438 :1018C00070B51D68174BC5F30B042D0C1E88A6427E :1018D0000BD15C680A46013C824213460FD214F9D0 @@ -401,10 +401,10 @@ :1018F000ECD181420B4602D22C2203F8012B0424A6 :10190000094A1688AE4204D1984284BF967803F8FB :10191000016B013C02F10402F3D1581A70BD00BF03 -:101920000010005C242300204C7A0008704700005F +:101920000010005C242300205C7F0008704700004A :10193000704700007047000070B504464FF47A7697 :101940004CB1412C254628BF412506FB05F0641B00 -:1019500003F07EFFF4E770BD002310B5934203D07F +:1019500003F0EAFFF4E770BD002310B5934203D013 :10196000CC5CC4540133F9E710BD0000013810B558 :1019700010F9013F3BB191F900409C4203D11AB1EB :101980000131013AF4E71AB191F90020981A10BD1B @@ -418,1636 +418,1711 @@ :101A000017441E449044E4B2F6B2082E85F82460D0 :101A1000DBD1FFF73BFF0028D7D108E02B6A03EBAF :101A200082038342CFD0FFF731FF0028CBD10020C3 -:101A3000BDE8F8830120FBE73C4F0020024B1A78F9 -:101A4000024B1A70704700BF7C4F00201823002003 -:101A500038B51A4C1A4D204603F03EFA2946204666 -:101A600003F066FA2D684FF47A70D5F89020D2F81A +:101A3000BDE8F8830120FBE7DC4E0020024B1A785A +:101A4000024B1A70704700BF1C4F00201823002063 +:101A500038B51A4C1A4D204603F086FA294620461E +:101A600003F0AEFA2D684FF47A70D5F89020D2F8D2 :101A7000043843F00203C2F80438FFF75DFF114950 -:101A8000284603F063FBD5F890200F4DD2F80438B8 +:101A8000284603F0ABFBD5F890200F4DD2F8043870 :101A9000286823F002030D49A042C2F804384FF42D -:101AA000E1330B6001D003F075F96868A04204D0FF -:101AB0000649BDE8384003F06DB938BDF056002046 -:101AC000FC7C0008047D00081C230020644F0020DB +:101AA000E1330B6001D003F0BDF96868A04204D0B7 +:101AB0000649BDE8384003F0B5B938BD905600205E +:101AC0000C820008148200081C230020044F002010 :101AD0000C4B70B50C4D04461E780C4B55F8262067 :101AE0009A420DD00A4B002118221846FFF75AFFE0 -:101AF0000460014655F82600BDE8704003F04AB97D -:101B000070BD00BF7C4F00201C230020F056002039 -:101B1000644F0020F0B5A1B071B60023012000246D -:101B200080261A46194602F01DFE4FF4D067214A5E -:101B30003D25136923BBD2F810310BBB036804F1B8 -:101B4000006199600368C3F80CD003685E600368A5 -:101B50001F6001680B6843F001030B6001680B68AC -:101B600023F01E030B6001680B68DB07FCD4037BCA -:101B70008034416805FA03F3B4F5001F0B60D8D137 -:101B800002F026FEB4F5001F11D000240A4E0B4DC2 -:101B9000012004F055FA3388A34205D9286820446F -:101BA000013404F093F9F6E7002004F049FA61B635 -:101BB00021B0F0BD002000527E4F0020384F0020A1 -:101BC0002DE9F0470D46044600219046284640F294 -:101BD0007912FFF7E7FE234620220021284604F170 -:101BE000220702F001F9231D022220212846C026E7 -:101BF00002F0FAF8631D03222221284602F0F4F8CD -:101C0000A31D03222521284602F0EEF804F1080363 -:101C100010222821284602F0E7F804F110030822D8 -:101C20003821284602F0E0F804F11103082240218F -:101C3000284602F0D9F804F1120308224821284668 -:101C400002F0D2F804F1140320225021284602F0B9 -:101C5000CBF804F1180340227021284602F0C4F8A2 -:101C600004F120030822B021284602F0BDF804F157 -:101C700021030822B821284602F0B6F8314608367A -:101C80003B4608222846013702F0AEF8B6F5A07FA1 -:101C9000F4D1002704F1330A04F13203082231465B -:101CA000284602F0A1F894F832304FEAC7099F4263 -:101CB00009F5A47615D3B8F1000F08D1314609F221 -:101CC0004F1604F599730722284602F08DF827462F -:101CD0003B1B94F8322193420CD3F01DC008BDE8A1 -:101CE000F0870AEB0703082231462846013702F045 -:101CF0007BF8D8E707F23313314608222846083626 -:101D0000013702F071F8E3E713B5044608460021F5 -:101D10002022234601900160C0F8031002F064F80D -:101D2000231D01980222202102F05EF8631D019814 -:101D30000322222102F058F8A31D01980322252135 -:101D400002F052F8019804F108031022282102F051 -:101D50004BF8072002B010BD0023F7B50E46047FF4 -:101D6000072200911946054601F002FF731C01226B -:101D7000072100932846002301F0FAFEC4B9B31CE2 -:101D8000052208212846009323460D2401F0F0FE89 -:101D90003746BB1BB278934211D307342B7FA88AF6 -:101DA000E408BBB9844294BF0020012003B0F0BD19 -:101DB000AB8A0824DB00083BDB08B370E8E7FB1CB8 -:101DC000214608222846009300230834013701F0F9 -:101DD000CFFEDEE7201A18BF0120E7E70023F7B5A2 -:101DE0000E46047F082200911946054601F0C0FE08 -:101DF000731CC4B9082200932346102411462846B8 -:101E000001F0B6FE01235F1C7278013B934211D3AF -:101E100007342B7FA88AE408BBB9844294BF002012 -:101E2000012003B0F0BDAB8A0824DB00083BDB08CF -:101E30007370E7E7F3192146082228460093002330 -:101E400001F096FE08343B46DDE7201A18BF01205A -:101E5000E7E70000F8B50E4605461446002181224A -:101E60003046FFF79FFD2B4608220021304601F047 -:101E7000BBFF7CB90F246B1C07220821304601F000 -:101E8000B3FF01235F1C6A78013B934204D3E01D3A -:101E9000C008F8BD0824F4E7EB19214608223046B3 -:101EA00001F0A2FF08343B46ECE70000F8B50E460F -:101EB000054614460021CE223046FFF773FD2B461F -:101EC00028220021304601F08FFF7CB9302405F133 -:101ED000080308222821304601F086FF2F467B1B8D -:101EE0002A7A934204D3E01DC008F8BD2824F5E700 -:101EF00007F109032146082230460834013701F072 -:101F000073FFECE7F7B5047F0E4600910123102222 -:101F10000021054601F02CFEC4B9B31C0922102192 -:101F2000284600932346192401F022FE3746728882 -:101F3000BB1B9A4211D807342B7FA88AE408BBB98F -:101F4000844294BF0020012003B0F0BDAB8A10246E -:101F5000DB00103BDB087380E8E73B1D21460822CD -:101F60002846009300230834013701F001FEDEE724 -:101F7000201A18BF0120E7E730B50A44084D914206 -:101F80000DD011F8013B5840082340F30004013BF9 -:101F90002C4013F0FF0384EA5000F6D1EFE730BD88 -:101FA0002083B8EDF7B5384A6B46106851686A4629 -:101FB00003C308233549364805F0F8FC04460028D9 -:101FC00033D10A25334A6B46106851686A4603C309 -:101FD000082331492E4805F0E9FC0446002849D081 -:101FE0000369B3F5E01F45D8B0F8661040F23742F8 -:101FF00091423FD1294A024402F15C018B4239D31C -:102000005C3B234900209E1AFFF7B6FF04F16401F0 -:10201000074632460020FFF7AFFFA3689F4229D151 -:10202000E368984208BF002524E00369B3F5E01F88 -:1020300027D8418B40F23742914220D1174A0244BF -:1020400002F110018B4218D3103B114900209D1A58 -:10205000FFF792FF04F1180106462A460020FFF719 -:102060008BFFA3689E4202D1E368984201D00D2500 -:10207000A8E70025284603B0F0BD1025A2E70C25EF -:10208000A0E70B259EE700BF5C7A0008DCFF1B0081 -:1020900000000408657A000890FF1B000800FCF7A8 -:1020A00010B5037C044613B9006805F067FC2046B0 -:1020B00010BD00000023BFF35B8FC360BFF35B8FD5 -:1020C000BFF35B8F8360BFF35B8F7047BFF35B8FA2 -:1020D0000068BFF35B8F704770B505460C30FFF7A3 -:1020E000F5FF044605F108063046FFF7EFFFA04272 -:1020F00006D96D683046FFF7E9FF2544281A70BD00 -:102100003046FFF7E3FF201AF9E7000070B50546F7 -:102110004068A0B105F10C0605F10800FFF7D6FFF5 -:1021200004463046FFF7D2FF844204F1FF343046C4 -:1021300094BF6D680025FFF7C9FF2C44201A70BDBD -:1021400038B50C460546FFF7C7FFA04210D305F18E -:102150000800FFF7BBFF04446868BFF35B8FB4FB64 -:10216000F0F100FB11440120AC60BFF35B8F38BD80 -:102170000020FCE72DE9F041144607460D46FFF725 -:10218000C5FF844228BF0446D4B1B84658F80C6B4A -:102190004046FFF79BFF3044286040467E68FFF7CB -:1021A00095FF331A9C4203D801206C60BDE8F08192 -:1021B000A41B6B603B682044AB60E8600220F5E73D -:1021C0002046F3E738B50C460546FFF79FFFA042CF -:1021D00010D305F10C00FFF779FF04446868BFF3E2 -:1021E0005B8FB4FBF0F100FB11440120EC60BFF306 -:1021F0005B8F38BD0020FCE72DE9FF41884669462A -:1022000007466C46FFF7B6FF002506B204EBC6068C -:10221000B4420AD0626808EB050120680834FFF771 -:102220009BFB54F8043C1D44F2E729463846FFF76F -:10223000C9FF284604B0BDE8F0810000F8B50546A6 -:102240000C300F46FFF742FF05F108060446304602 -:10225000FFF73CFFA042304688BF6C68FFF736FFAF -:10226000201A386020B12C683046FFF72FFF204439 -:10227000F8BD000073B5144606460D46FFF72CFF67 -:102280008442019028BF0446DCB101A93046FFF723 -:10229000D5FF019B33B93268C5E90233C5E9002493 -:1022A00001200CE09C42286038BF019401988442D0 -:1022B0006860F5D93368241A0220AB60EC6002B084 -:1022C00070BD2046FBE700002DE9FF410F4669463F -:1022D0006C46FFF7CFFF00B2002604EBC005AC420E -:1022E00009D0D4F80480B81954F8081B4246464473 -:1022F000FFF732FBF3E7304604B0BDE8F0810000A1 -:1023000038B50546FFF7E0FF044601462846FFF7CB -:1023100017FF204638BD00007047000010B4134678 -:10232000026814680022A4465DF8044B6047000070 -:1023300000F5805090F859047047000000F5805077 -:1023400090F852047047000000F5805090F958044E -:10235000704700004E207047302383F3118800F54A -:102360008052D2F89C34D2F898041844D2F89434AD -:102370001844D2F87C341844D2F88C341844D2F87B -:1023800088341844002383F31188704700F5805087 -:10239000C0F85414012070472DE9F04F0C4600F5A9 -:1023A000805185B01F4691F8523405469046BDF8DD -:1023B00038909BB1D1F878340133C1F87834236870 -:1023C000980006D4237B082B0BD9627B0AB10F2B14 -:1023D00007D9D1F87C340133C1F87C344FF0FF3099 -:1023E00010E0302383F31188EB6AD3F8C42012F491 -:1023F000001B0AD0D1F8803400200133C1F88034AA -:1024000080F3118805B0BDE8F08F20684822D3F82A -:10241000C4300028C3F3044A6B6AB4BF40F0804064 -:10242000800412FB0A334FEA4A16186022685200F1 -:102430004FEA0A6244BF40F000501860207B42EA35 -:1024400000425A60607B10B342F440125A60D1F8E7 -:10245000B0240132C1F8B024AA1902F58352117BCD -:1024600041F020011173207B039300F0ABFF033098 -:10247000039B80105FFA8BF20BF1010B82420DDAA5 -:1024800004EB820103EB820249689160F2E7AA192A -:1024900002F58352117B60F34511E3E70122EB6AF9 -:1024A00005EB4A1102FA0AF201F58251C3F8D02075 -:1024B000AB19183104F10C0203F58253C3E9048708 -:1024C000234653F8040B934241F8040BF9D11B88BF -:1024D0002E440B8041F2680346F803A006F58056AF -:1024E00009F0030396F86C2043F0100322F01F025A -:1024F000134386F86C30002383F3118842463B4631 -:1025000021462846CDF8009000F022FF012079E70F -:102510002DE9F04700F58056044696F85254002DF8 -:1025200040F00381037C032B40F0948028462B4627 -:102530002F465FFA80FC944510DA01EBCC0E51F87F -:102540003CC0BCF1000F04DBDEF804C0BCF1000F9E -:1025500002DB01370130ECE70133FBE7302080F389 -:102560001188E06AF3B9D0F8803043F00203C0F874 -:1025700080304E23E06A002F6FD1D0F8803043F0D6 -:102580000103C0F880306A4B6A4A1B6803F180532C -:1025900003F52C539B009342A36240F2B08066483F -:1025A00000F0AEFE4D2B42D8DFF884814FEA034E97 -:1025B000DFF88891D8F800C04EEA8C0EC0F884E0AD -:1025C0000CF1805000F52C508000606103EB0C0092 -:1025D000D4F82CC0C3F14E03C8F80000DCF880002A -:1025E00040F03000CCF880004FF0000CD4F814809C -:1025F000E6465FFA8CF08242BCDD01EBC00A51F87E -:102600003000002810DBDAF804A0BAF1000F0BDA72 -:1026100009EA00400AF07F0A40EA0A0040F0084058 -:1026200048F82E000EF1010E0CF1010CE1E7836970 -:1026300023F00103836100F069FE0646E36A9B69AB -:10264000D90704D500F062FE831BFA2BF6D90023CC -:1026500083F311882846BDE8F087B7EB530F3DD2CE -:10266000DFF8CCE04FEA074CDEF800304CEA830C90 -:10267000C0F888C003F1805003EB4703002700F542 -:102680002C50CEF80030BC468000A061E06AD0F843 -:10269000803043F00C03C0F88030D4F818E0FBB26F -:1026A0009A427FF770AF51F8330001EBC30800285E -:1026B000D8F8043001DB002B0EDB20F0604023F063 -:1026C000604340F0005043F000434EF83C000EEBF6 -:1026D000CC000CF1010C43600137E0E7836923F083 -:1026E0000103836100F012FE0646E36A9B69DA0784 -:1026F000ADD500F00BFE831BFA2BF6D9A7E7E26AF3 -:10270000936923F00103936100F000FE0746E36A3A -:102710009B69DB0705D500F0F9FDC31BFA2BF6D941 -:1027200095E7012586F8525491E7002592E700BF0E -:10273000884F0020FCB50040707A00080000FF07B9 -:1027400013B500F580540191606CFFF7DFFC1F2882 -:102750000AD920220199606CFFF74EFDA0F12003F9 -:102760005842584102B010BD0020FBE708B53023A5 -:1027700083F3118800F58050406CFFF79BFC002329 -:1027800083F3118808BD000000220260828142604C -:10279000826070470022002310B5C0E900230023A7 -:1027A00004460C3020F8043CFFF7EEFF204610BD35 -:1027B0002DE9F0479A4688B007468846914630236F -:1027C00083F3118807F580546846FFF7E3FF606CD8 -:1027D000FFF782FC1F282ED920226946606CFFF784 -:1027E0008FFD202827D194F8523423B303AD4446FB -:1027F00005AB2E46083403CE9E4244F8080C44F83C -:10280000041C3546F5D130682060B388A380DDE92B -:102810000023C9E90023BDF80830AAF800300023DE -:1028200083F3118853464A464146384608B0BDE80E -:10283000F04700F07BBD002080F3118808B0BDE8B0 -:10284000F08700002DE9F84F0023064600F581547B -:10285000054688461034C0E90133264B46F8303B24 -:10286000374638462037FFF795FFA742F9D105F5DF -:1028700080544FF4805305F5A3594FF0000A2663A6 -:102880000026676405F5835709F110094FF0000B26 -:102890001037E663C4E90D36012384F8403084F82C -:1028A0004830A7F11800203747E910ABFFF76CFF5D -:1028B00047F8286C4F45F4D184F85884A4F85A643A -:1028C000A4F85C64A4F85E6484F86064A4F86264AC -:1028D000A4F86464A4F8666484F86864B8F1000F2E -:1028E00002D0054800F00CFD044B2846EB62BDE821 -:1028F000F88F00BFB07A0008947A000800A000406A -:10290000044B10B5197804464A1C1A70FFF79AFF59 -:10291000204610BD854F00202DE9F04300295AD0F4 -:102920002E4E2F48B6FBF1F481428CBF0A201120B5 -:10293000431EB4FBF0F700FB1740DDB220B1022BC1 -:102940001846F5D8002032E07B1EB3F5806F2ED2FA -:10295000C5EBC5084FF47A7308F103044FEAE40E9F -:10296000C4F3C7040EF10109281B0EFB033E5FFAF6 -:1029700080FC59FA80F0BEFBF0F0B0F5617F18DC06 -:1029800083B2601C5CFA80F07843B6FBF0F08142C1 -:10299000D8D1611E0F29D5D80CF1FF310729D1D824 -:1029A0000120138057801071547182F806C0BDE871 -:1029B000F08308F1FF34E010C4F3C70400F1010E06 -:1029C0002D1B00FB03335FFA85FC5EFA85F5B3FB34 -:1029D000F5F39BB2D5E70846E9E700BF00B4C404AD -:1029E0003F420F0030B50D4B05200D4D1C786C4358 -:1029F0008C420ED159780120518099785171D97843 -:102A00009171197911715B7903EB83035B0013807A -:102A100030BD013803F10603E8D1F9E7F07A000888 -:102A200040420F0038B540F27772C36A154CC3F8C4 -:102A3000BC200722C36AC3F8C8202268C16A930079 -:102A400043F4C023C1F8A03002F1805302F16C01BD -:102A5000C56A03F52C53EA3289009B00226041F0DD -:102A6000E061094AC361C5F8C01003F5D87103F5E8 -:102A70006A7341629342836202D9044800F040FCC9 -:102A800038BD00BF884F0020FCB50040707A0008B8 -:102A90002DE9F04F00F580551F4689B0044695F8A2 -:102AA000583489469046012B04D90026304609B097 -:102AB000BDE8F08FA04A52F8231009B942F823006C -:102AC0009E48C4F80C9001782774C9B9302383F369 -:102AD00011889B4BD3F8EC2042F48072C3F8EC20B1 -:102AE000D3F8942042F48072C3F89420D3F8942051 -:102AF00022F48072C3F894200123037081F31188BB -:102B000095F851647EB9302383F311880321132093 -:102B100001F074FF0321152001F070FF012385F8F7 -:102B2000513486F31188302383F31188E26A936964 -:102B300023F01003936100F0E9FB8246E36A9E698B -:102B400016F0080609D000F0E1FBA0EB0A03FA2B0F -:102B5000F4D9002686F31188A8E79A6942F00102A9 -:102B60009A6100F0D3FB8246E36A9A69D00706D4E3 -:102B700000F0CCFBA0EB0A03FA2BF5D9E9E79A6940 -:102B80004FF0000A42F002029A61E36AC3F854A0CF -:102B90008AF3118804F5825B686CFFF78BFA0BF1FE -:102BA000100B202200216846FEF7FCFE02A8FFF76A -:102BB000EBFD6A460BEB06030DF1180ECDF818A0DD -:102BC00094460833BCE80300F44543F8080C43F886 -:102BD000041C6246F4D1DCF8000020361860B6F51B -:102BE000806F9CF804201A71DBD1002304F5A252F7 -:102BF000494620461A3285F8503485F85334FFF799 -:102C00008BFE064690B9E26A936923F00103936153 -:102C100000F07CFB0546E36A9B69D9077FF545AF69 -:102C200000F074FB431BFA2BF5D93EE795F85E34B0 -:102C3000C5F86C94591E95F85F34E26A013B1B029B -:102C400043EA416395F8601401390B43B5F85C140D -:102C5000013943EA0143D361B8F1000F36D004F5DE -:102C6000A352414620460232FFF7BCFE90B9E26A09 -:102C7000936923F00103936100F048FB0546E36A82 -:102C80009B69DA077FF511AF00F040FB431BFA2B7D -:102C9000F5D90AE795F86724C5F87084511E95F8B0 -:102CA0006824E36A013A120142EA012295F86614A7 -:102CB00001390A43B5F86414013942EA014242F489 -:102CC0000002DA604FF42062E36A9A64E36A4FF02C -:102CD00000082046C3F8BC80FFF7A4FE85F859849D -:102CE0006FF04042E36A1A65164AE36A5A654FF08C -:102CF0000222E36A9A654FF0FF32E36AC3F8E020EC -:102D00000322E36A9742DA653FF4D0AEE26A936940 -:102D100023F00103936100F0F9FA0746E36A9B6927 -:102D2000DB0705D500F0F2FAC31BFA2BF6D9BCE697 -:102D3000012385F85234B9E6804F0020844F0020EB -:102D400000440258550200022DE9F04F054689B0B3 -:102D500090469946002741F2680A00F58056EB6AD2 -:102D6000D3F8D830FB40D80751D505EB47124FEACE -:102D7000471B52441379190749D4D6F884340133D8 -:102D8000C6F8843405F5A553C3E9008913799A067A -:102D900005EB0B0248BFD6F8B434524444BF0133AC -:102DA000C6F8B434137943F008031371DB0723D555 -:102DB00096F8533403B305F582546846FFF7EAFCEE -:102DC00003AB18345C4404F1080C2068083454F850 -:102DD000041C1A46644503C21346F6D120686946AE -:102DE00010602846A2889A800123ADF808302B682D -:102DF000CDE90089DB6B9847D6F8A834D6F854049F -:102E00000133C6F8A83410B103681B69984701372D -:102E1000202FA4D109B0BDE8F08F00002DE9F04FBC -:102E20000F468DB0044600F073FA82468946002FA3 -:102E30005BD1E36AD3F8A02012F4FE0F03D1002087 -:102E40000DB0BDE8F08FD3F8A420920141BF04F586 -:102E50008051D1F898240132C1F89824D3F8A420E5 -:102E60005606ECD0D3F8A450E669C5F305254823EF -:102E7000E8464FF0000B03FB05664046FFF784FC75 -:102E8000326851004ABF22F06043C2F38A4343F0E4 -:102E90000043920048BF43F080430093736813F4EB -:102EA00000131BBF012304F580528DF80D308DF8FF -:102EB0000D301EBFD2F8B8340133C2F8B834F388ED -:102EC00003F00F038DF80C309DF80C0000F07AFA37 -:102ED0005FFA8BF3984225D9F2180CA90BF1010B7C -:102EE000127A0B4403F82C2CEEE7012FA7D1E36AEA -:102EF000D3F8B02012F4FE0FA1D0D3F8B42095017E -:102F000041BF04F58051D1F898240132C1F89824CA -:102F1000D3F8B420500692D0D3F8B450266AC5F343 -:102F20000525A4E7EFB9E36AC3F8A85004A807ADE4 -:102F3000FFF730FC98E80F0007C52B8000232046E0 -:102F400004A9ADF81830236804F58054DB6BCDE993 -:102F500004A9984758B1D4F890340133C4F8903498 -:102F60006EE7012FE2D1E36AC3F8B850DEE7D4F888 -:102F7000943401200133C4F8943461E72DE9F04121 -:102F800005460F4600F58054012639462846FFF7CE -:102F900045FF10B184F85364F7E7D4F8A834D4F8A7 -:102FA00054040133C4F8A83420B10368BDE8F041EB -:102FB0001B691847BDE8F081C36AF0B51A6C12F4BA -:102FC0007F0F2BD01B6C00F5805441F268054FF049 -:102FD000010CC4F8AC340023471900EB43125E0126 -:102FE0002A44117911F0020F15D0490713D4B959A9 -:102FF000C66A0CFA01F1D6F8CCE011EA0E0F0AD03D -:10300000C6F8D410117941F004011171D4F88C2460 -:103010000132C4F88C240133202BDED1F0BD000036 -:1030200010B5264C264B22680AB340B31A6D9205A0 -:103030000FD54FF400721A6500F06AF950EA0102E8 -:103040000B4602D0013861F1000302462068FFF709 -:103050007BFE1B4A136D9B012AD523684FF000713C -:1030600003F580531165012283F8592420E00122E1 -:103070001A6510221A654FF480521A6510BD196D39 -:10308000C80702D4196D490705D5052110461965F1 -:103090000021FFF773FF0A4B1A6DD00602D41A6D98 -:1030A000510605D5502201211A652068FFF766FFF9 -:1030B0002068BDE81040FFF77FBF00BF804F0020B1 -:1030C00000A0004008B5302383F31188FFF774FF98 -:1030D000002383F3118808BDC36AD3F8C00010F041 -:1030E0007C5005D0D3F8C40080F40010C0F34050E9 -:1030F0007047000008B5302383F3118800F5805035 -:10310000406CFEF7E9FF002383F3118843090CBFED -:103110000120002008BD000000F5805393F85924D9 -:1031200062B1C16A8A6922F001028A61D3F89C24E3 -:103130000132C3F89C24002283F859247047000010 -:103140002DE9F743302181F3118800F582510025E4 -:1031500041F2680E4FF00108103100F5805C00EB81 -:1031600045147444267977071CD4F6061AD58E695F -:10317000D0F82C9008FA06F6D9F8CC703E4211D05F -:103180004F6801970F689742019F9F410AD2C9F883 -:10319000D460267946F004062671DCF888440134B0 -:1031A000CCF8884401352031202DD8D1002383F379 -:1031B000118803B0BDE8F083F8B51E4600230F4622 -:1031C000054613701446FFF795FF80F00100387034 -:1031D0001EB12846FFF780FF2070F8BD2DE9F04FA3 -:1031E00085B099460D468046164691F800B0DDE957 -:1031F0000EA302931378019300F08AF82B7804460B -:103200000F4613B93378002B41D022463B46404647 -:10321000FFF796FFFFF756FFFFF77EFF4B4632465C -:103220002946FFF7C9FF2B7833B1BBF1000F03D05C -:10323000012005B0BDE8F08F337813B1019B002B5E -:10324000F6D108F5805303935445029B77EB0303B3 -:103250001DD2039BD3F85404C8B10368AAEB040140 -:103260001B6898474B46324629464046FFF7A4FF65 -:103270002B7813B1BBF1000FDAD1337813B1019B76 -:10328000002BD5D100F044F804460F46DCE70020BF -:10329000CFE7000008B50020FFF7C2FEBDE80840F8 -:1032A00001F056B808B50120FFF7BAFEBDE80840A6 -:1032B00001F04EB800B59BB0EFF309816822684673 -:1032C000FEF74AFBEFF30583014B9B6BFEE700BF64 -:1032D00000ED00E008B5FFF7EDFF000000B59BB082 -:1032E000EFF3098168226846FEF736FBEFF30583AA -:1032F000014B5B6BFEE700BF00ED00E0FEE7000066 -:103300000FB408B5029802F049FAFEE702F0DABEFF -:1033100002F0BCBE13B56C46031D84E8060094E8B9 -:10332000030083E80500012002B010BD73B5856875 -:10333000019155B11B885B0707D4D0E900369B6B20 -:103340009847019AC1B23046A847012002B070BD2B -:10335000F0B5866889B005460C465EB1BDF83830D8 -:103360005B070AD4D0E900379B6B98472246C1B26D -:103370003846B047012009B0F0BD0022002301F11A -:103380000806CDE9002300230A46ADF8083003AB58 -:103390001068083252F8041C1C46B24203C423468B -:1033A000F6D1106820609288A280FFF7B1FF042355 -:1033B000ADF808302B68CDE90001DB6B6946284683 -:1033C0009847D7E7082817D909280CD00A280CD025 -:1033D0000B280CD00C280CD00D280CD00E2814BFB4 -:1033E0004020302070470C20704710207047142078 -:1033F0007047182070472020704700002DE9F041E9 -:10340000456A15B94162BDE8F0814B68AC4623F0CE -:103410006047C3F38A464FEAD37EC3F3807816EA47 -:10342000230638BF3E462B465A68BEEBD27F22F0B9 -:1034300060440AD0002A18DAA40CB44217D19D4285 -:103440000FD10D60DEE71346EEE7A74207D102F089 -:103450008044C2F3807242450BD054B1EFE708D2EA -:10346000EDE7CCF800100B60CDE7B44201D0B442D8 -:10347000E5D81A689C46002AE5D11960C3E7000028 -:103480002DE9F047089D01F0070400EBD1004FF44F -:103490007F494FEAD508224405F00705944201D13F -:1034A000BDE8F08704F0070705F0070A111B08EBD9 -:1034B000D50E57453E4613F80EC038BF5646C6F1E6 -:1034C00008068E4228BF0E46E108415C344435446C -:1034D000B94029FA06F721FA0AF1FFB28CEA010194 -:1034E00047FA0AF739408CEA010C03F80EC0D5E719 -:1034F00080EA0120082341F2210201B2013B400091 -:10350000002980B2B8BF504013F0FF03F5D17047D7 -:1035100038B50C468D18A54200D138BD14F8011BF2 -:10352000FFF7E6FFF7E7000042684AB113688189B8 -:103530004360438901339BB29942438138BF838101 -:103540001046704770B588B0044620220D46684684 -:103550000021FEF727FA20460495FFF7E5FF024613 -:1035600060B16B46054608AE1C46083503CCB44234 -:1035700045F8080C45F8041C2346F5D1104608B060 -:1035800070BD0000082817D909280CD00A280CD0D3 -:103590000B280CD00C280CD00D280CD00E2814BFF2 -:1035A0004020302070470C207047102070471420B6 -:1035B000704718207047202070470000082817D94E -:1035C0000C280CD910280CD914280CD918280CD97F -:1035D00020280CD930288CBF0F200E2070470920DE -:1035E00070470A2070470B2070470C2070470D2051 -:1035F000704700002DE9F843078C0446072F1ED9B9 -:1036000000254FF6FF73D0E90298C5F12006A5F119 -:10361000200029FA05F1083508FA06F628FA00F024 -:10362000314301431846C9B2FFF762FF402D0346FC -:10363000EBD13A46E169BDE8F843FFF769BF4FF6C1 -:10364000FF70BDE8F883000010B54B6823B9CA8A43 -:1036500063F30902CA8210BD04691A681C60036121 -:10366000C38A013BC3824A60EFE700002DE9F84FAF -:103670001D46CB8A0F468146C3F3090192460529B0 -:103680000B4630D00020AAB207F11A049EB21FFAEE -:1036900080F8042E0FD8904503F1010306D30A44A5 -:1036A000FB8A62F309030120FB821AE01AF800602A -:1036B0000130E654EAE79045F1D2A1F1050B1C2355 -:1036C0007C68BBFBF3F203FB12BB1FFA8BF6002CEA -:1036D00045D14846FFF728FF044638B978606FF0B7 -:1036E0000200BDE8F88F4FF00008E6E7002606600C -:1036F0007860ADB24FF0000B454510D90AEB0803D6 -:10370000221D13F8011B08F101089155B1B21FFAEF -:1037100088F81B292BD0454506F10106F1D8FB8A14 -:10372000C3F30902154465F30903BCE701321C46E3 -:1037300092B22368002BF9D16B1F0B441C21B3FB01 -:10374000F1F301339BB29A42D3D2BBF1000FD0D137 -:103750004846FFF7E9FE20B9C4F800B0BFE70122F0 -:10376000E7E7C0F800B05E4620600446C1E7454583 -:10377000D5D94846FFF7D8FE08B92060AFE7C0F8B2 -:1037800000B0002620600446B6E700002DE9F04FA7 -:103790001C46074688462DED028B83B05B6901927B -:1037A000002B00F09A80238C2BB1E269002A00F0F4 -:1037B0009480072B35D807F10C00FFF7B5FE0546BE -:1037C00038B96FF00205284603B0BDEC028BBDE8A6 -:1037D000F08F14220021FEF7E5F8228CE16905F153 -:1037E0000800FEF7B9F8208C48F00041013080B2A3 -:1037F000FFF7E4FEFFF7C6FE013880B220840130F7 -:10380000287438466369228C1B782A4403F01F030E -:1038100063F03F03137269602946FFF7EFFD01254E -:10382000D1E74FF0000900F10C034FF0800A4E463B -:103830004D4608EE103A18EE100AFFF775FE834663 -:103840000028BED014220021FEF7ACF8002E3AD199 -:10385000019B0222ABF808300BF1080E1FFA82FC24 -:10386000218C0CF10100BCF1060F80B201D88E4210 -:103870002BD3FFF7A3FE8E4208BF4FF0400AFFF79D -:1038800081FE62690138013512781BFA80F101303E -:1038900002F01F022DB242EA491289F001094AEAF8 -:1038A000020A48F0004281F808A059468BF810003F -:1038B0003846CBF804204FF0000AFFF79FFD238C19 -:1038C000B342B8D17FE70022C6E7E169895D0136DE -:1038D0000EF80210B6B20132C0E76FF0010572E7D0 -:1038E000F8B515460E463022002104461F46FEF765 -:1038F00059F8069BB5F5001FA760636004F110003E -:10390000079B34BF6A094FF6FF72E661A36200238A -:1039100097B29A4206D800230360A782E3822383EA -:10392000E360F8BD0660013330462036F1E7000061 -:1039300003781BB94BB2002BC8BF01707047000061 -:1039400000787047F8B50C46C969074611B9238C51 -:10395000002B37D1257E1F2D34D8387828BB228CF8 -:10396000072A2CD8268A36F003032BD14FF6FF7096 -:10397000FFF7CEFD20F0010031024FF6FF72400448 -:1039800041EA0561400C41EA402523462946384674 -:10399000FFF7FCFE002807DD626913780133DBB214 -:1039A0001F2B88BF00231370F8BD218A2D0645EA1E -:1039B000012505432046FFF71DFE0246E5E76FF0AF -:1039C0000300F1E76FF00100EEE7000070B58AB088 -:1039D000044616460021282268461D46FDF7E2FFF0 -:1039E000BDF8383069462046ADF810300F9B05937E -:1039F0009DF840308DF81830119B0793BDF8483082 -:103A0000CDE90265ADF82030FFF79CFF0AB070BD2C -:103A10002DE9F041D36905460C4616460BB9138CC7 -:103A20005BBB377E1F2F28D895F80080B8F1000FB8 -:103A300026D03046FFF7DEFD3378210202462846C5 -:103A400041EAC331338A41EA080141EA076141EAA8 -:103A50000341334641F08001FFF798FE00280ADD5C -:103A60003378012B07D1726913780133DBB21F2B36 -:103A700088BF00231370BDE8F0816FF00100FAE702 -:103A80006FF00300F7E70000F0B58BB004460D4679 -:103A900017460021282268461E46FDF783FF9DF841 -:103AA0004C30294620465A1E534253416A468DF8EF -:103AB00000309DF84030ADF81030119B05939DF813 -:103AC00048308DF81830149B0793BDF85430CDE979 -:103AD0000276ADF82030FFF79BFF0BB0F0BD000081 -:103AE000406A00B104307047436A1A684262026952 -:103AF0001A600361C38A013BC38270472DE9F0411C -:103B0000D0F8208014461D46184E4146002709B9BA -:103B1000BDE8F081D1E90223A21A65EB03039642C6 -:103B200077EB03031ED2036A8B420DD1FFF78CFDA6 -:103B3000036A1B68036203690B60C38A0161013B6E -:103B4000016AC3828846E2E7FFF77EFD0B68C8F88A -:103B5000003003690B60C38A0161013BC382D8F85E -:103B60000010D4E788460968D1E700BF80841E00B2 -:103B70002DE9F04F8BB00D4614469B46DDF8509072 -:103B80008046002800F01881B9F1000F00F0148180 -:103B9000531E3F2B00F21081012A03D1BBF1000F0D -:103BA00040F00A810023CDE90833B8F81430B5EBB2 -:103BB000C30F4FEAC30703D300200BB0BDE8F08F5B -:103BC0002B199F42D8F80C3036BF7F1B2746FFB217 -:103BD0001BB9D8F81030002B7AD0272D4DD8C5F15D -:103BE000280600232946B742009308ABD8F80800FE -:103BF0002CBFF6B23E46A7EB060A354432465FFAC2 -:103C00008AFAFFF73DFCB8F81430282103F100537D -:103C1000053BDB000493D8F80C300393039B13B1EE -:103C2000BAF1000F2CD1D8F8100040B1BAF1000F52 -:103C300005D008AB5246691A0096FFF721FC38B24E -:103C4000002FB9D066070AD00AAB624203EBD40159 -:103C500002F0070211F8083C134101F8083C082C57 -:103C60003DD9102C40F2B580202C40F2B780BBF13A -:103C7000000F00F09C80082335E0BA460026C2E71A -:103C8000049BE02B28BFE02306930B44AB42059333 -:103C900015D95A1B0398691A0096924508AB00F192 -:103CA000040034BF5246D2B20792FFF7E9FB079AED -:103CB0001644AAEB020A1544F6B25FFA8AFA049B8C -:103CC000069A05999B1A0493039B1B680393A5E727 -:103CD00000933A4608AB2946D8F80800ADE7BBF197 -:103CE000000F13D00123B4EBC30F6BD0082C12D8F4 -:103CF0009DF82030621E23FA02F2D50706D54FF058 -:103D0000FF3202FA04F423438DF820309DF820306E -:103D100089F8003051E7102C12D8BDF82030621E0F -:103D200023FA02F2D10706D54FF0FF3202FA04F46B -:103D30002343ADF82030BDF82030A9F800303CE72F -:103D4000202C0FD80899631E21FA03F3DA0705D552 -:103D50004FF0FF3202FA04F40C430894089BC9F8B0 -:103D600000302AE7402C2AD0611EC4F12102A4F1C0 -:103D70002103DDE9086526FA01F105FA02F225FAC8 -:103D800003F311431943CB0711D50122A4F12003FA -:103D9000C4F1200102FA03F322FA01F1A2400B431D -:103DA000524263EB430332432B43CDE90823DDE961 -:103DB0000823C9E9002300E76FF00100FDE66FF07A -:103DC0000800FAE6082CA1D9102CB4D9202CEED882 -:103DD000C4E7BBF1000FAED0022384E7BBF1000FB4 -:103DE000BCD004237FE70000012A30B5144638BF59 -:103DF000012485B00025402C28BF4024012ACDE9AC -:103E0000025518D81B788DF8083063070AD004AB28 -:103E1000624203EBD40502F0070215F8083C934018 -:103E200005F8083C034600912246002102A8FFF74E -:103E300027FB05B030BD082AE4D9102A03D81B8817 -:103E4000ADF80830E1E7202A95BF1B68D3E90023CD -:103E50000293CDE90223D8E710B5CB681BB98B607C -:103E60000B618B8210BD04691A681C600361C38AF0 -:103E7000013BC382CA60F0E703064CBFC0F3C03009 -:103E80000220704708B50246FFF7F6FF022806D168 -:103E90005306C2F30F2001D100F0030008BDC2F3A6 -:103EA0000740FBE72DE9F04F93B004460D46CDE9FE -:103EB00003230A681046FFF7DFFF0228824614BF7B -:103EC000C2F306260026002A80F2F38112F0C049D0 -:103ED00040F0EF81097B002900F0EB81022803D03C -:103EE0002378B34240F0E881C2F3046310462944CA -:103EF000069302F07F030593FFF7C4FF059B0022A2 -:103F000083464FEA8348002348EA0A4848EA46685D -:103F1000CE78CDE90823F30948EA0008029368D077 -:103F2000059B024608A92046009353466768B84798 -:103F3000002800F0C481276A4FB9414604F10C0003 -:103F4000FFF700FB074690B96FF0020055E03B69B0 -:103F500098450DD03F68002FF9D1414604F10C007F -:103F6000FFF7F0FA07460028EED0236A3B6027628D -:103F700097F817C006F01F08CCF3840CACEB0800D0 -:103F8000A8EB0C031FFA80FE0028B8BF0EF120003A -:103F90001FFA83FEB8BF00B2002B0793B8BF0EF123 -:103FA0002003D7E90221BCBF1BB2079352EA0103E9 -:103FB00038D0039B4FF0000CDFF820E39A1A049BE3 -:103FC00063EB010196457CEB01032BD36B7B97F8E8 -:103FD0001AE0734519D1029B002B78D0012821DC0F -:103FE0007868F8B9DFF8F0C2944570EB010316D396 -:103FF00037E0276A27B96FF00C0013B0BDE8F08FE7 -:104000003B699845B4D03F68F4E7B34890427CEBF5 -:10401000010301D30020F0E7029B002BFAD0079B9D -:104020000F2B17DCFA7DB3003946204602F003025D -:1040300003F07C031343FB75FFF706FB6B7BBB763A -:10404000029B3BB9FB7DC3F38402013262F386031A -:10405000FB75D0E76A7BBB7E9A42DBD1029B002BCB -:1040600035D0B309022B32D0039B142200210DA8B6 -:10407000BB60049BFB60FDF795FC039B0AA92046EF -:104080000A93049BADF83EB00B932B1D8DF840A016 -:104090000C932B7B8DF84180013BDBB2ADF83C30BB -:1040A000069B8DF84230059B8DF8433094F82C30F8 -:1040B00083F001038DF84430A3689847FB7DC3F378 -:1040C0008403013303F01F039B02FB82A2E7FB7D05 -:1040D000C6F34012B2EBD31F40F0F480C3F3840365 -:1040E000434540F0F280029AB6092B7B002A4DD05E -:1040F000F2075DD4032B40F2EB80039BAE1D3946E3 -:1041000004F10C00BB603246049BFB602B7B033B3D -:10411000DBB2FFF7ABFA00280CDA39462046FFF78E -:1041200093FAFB7DC3F38403013303F01F039B0267 -:10413000FB8209E7AB88DDE908843B834FF6FF7318 -:10414000C9F12000A9F1200228FA09F109F10809B2 -:1041500004FA00F024FA02F2014318461143C9B2EE -:10416000FFF7C6F9B9F1400F0346E9D1B8823146ED -:104170002A7B033AD2B2FFF7CBF9FB7DB882DA4350 -:10418000C2F3C01262F3C713FB7543E786B92E1D55 -:10419000013B394604F10C00DBB23246FFF766FA08 -:1041A0000028BADB2A7B3146B88A013AD2B2E2E76C -:1041B000F98A013BC1F30901DAB204295BD8281D51 -:1041C000002307F11B069A4208D910F801CB0133EE -:1041D00006F801C00131DBB20529F4D103999342FD -:1041E0000A9138BF043304992CBF002355FA83F396 -:1041F0000B9107F11B010C9179680E930D91291D0C -:10420000FB8AADF83EB0C3F309038DF840A08DF8EA -:1042100041801A44069B8DF84230059BADF83C2046 -:104220008DF8433094F82C3083F001038DF844303E -:104230000023B88A7B602A7B013AFFF769F93B8B40 -:10424000B882834203D1A3680AA920469847204632 -:104250000AA9FFF701FEFB7DBA8AC3F38403013389 -:1042600003F01F039B02FB823B8B9A420CBF002092 -:104270006FF01000C1E67B68002BAFD0052001E095 -:104280001C3033461E68002EFAD1091A2E1D081D57 -:10429000184401EB090C5FFA89F3BCF11B0F9DD8A0 -:1042A0009A429BD916F8013B09F1010900F8013B3C -:1042B000EFE76FF00900A0E66FF00A009DE66FF0EF -:1042C0000B009AE66FF00D0097E66FF00E0094E693 -:1042D0006FF00F0091E600BF40420F0080841E0087 -:1042E000EFF30983054968334A6B22F001024A6300 -:1042F00083F30988002383F31188704700EF00E0FF -:10430000302080F3118862B60D4B0E4AD96821F433 -:10431000E0610904090C0A430B49DA60D3F8FC2078 -:1043200042F08072C3F8FC20084AC2F8B01F11683E -:1043300041F0010111602022DA7783F822007047F2 -:1043400000ED00E00003FA0555CEACC5001000E01A -:10435000302310B583F311880E4B5B6813F40063B0 -:1043600014D0F1EE103AEFF309844FF08073683CFB -:10437000E361094BDB6B236684F3098801F0D8F90C -:1043800010B1064BA36110BD054BFBE783F3118809 -:10439000F9E700BF00ED00E000EF00E03F04000897 -:1043A0004204000808B5074B074A196801F03D01AF -:1043B000996053680BB190689847BDE80840FFF7D3 -:1043C000C7BF00BF00000240904F002008B5084B57 -:1043D0001968890901F03D018A019A60054AD3688C -:1043E0000BB110699847BDE80840FFF7B1BF00BFA7 -:1043F00000000240904F002008B5084B1968090CD6 -:1044000001F03D010A049A60054A53690BB19069B5 -:104410009847BDE80840FFF79BBF00BF000002407F -:10442000904F002008B5084B1968890D01F03D0137 -:104430008A059A60054AD3690BB1106A9847BDE8AE -:104440000840FFF785BF00BF00000240904F0020EA -:1044500008B5074B074A596801F03D01D960536A16 -:104460000BB1906A9847BDE80840FFF771BF00BFE5 -:1044700000000240904F002008B5084B5968890998 -:1044800001F03D018A01DA60054AD36A0BB1106B75 -:104490009847BDE80840FFF75BBF00BF000002403F -:1044A000904F002008B5084B5968090C01F03D01F8 -:1044B0000A04DA60054A536B0BB1906B9847BDE86C -:1044C0000840FFF745BF00BF00000240904F0020AA -:1044D00008B5084B5968890D01F03D018A05DA607D -:1044E000054AD36B0BB1106C9847BDE80840FFF745 -:1044F0002FBF00BF00000240904F002008B5074BBF -:10450000074A196801F03D019960536C0BB1906C3A -:104510009847BDE80840FFF71BBF00BF00040240FA -:10452000904F002008B5084B1968890901F03D013A -:104530008A019A60054AD36C0BB1106D9847BDE8AB -:104540000840FFF705BF00BF00040240904F002065 -:1045500008B5084B1968090C01F03D010A049A607E -:10456000054A536D0BB1906D9847BDE80840FFF7C1 -:10457000EFBE00BF00040240904F002008B5084B7A -:104580001968890D01F03D018A059A60054AD36DCD -:104590000BB1106E9847BDE80840FFF7D9BE00BFC9 -:1045A00000040240904F002008B5074B074A5968A5 -:1045B00001F03D01D960536E0BB1906E9847BDE894 -:1045C0000840FFF7C5BE00BF00040240904F002026 -:1045D00008B5084B5968890901F03D018A01DA6084 -:1045E000054AD36E0BB1106F9847BDE80840FFF73E -:1045F000AFBE00BF00040240904F002008B5084B3A -:104600005968090C01F03D010A04DA60054A536F4C -:104610000BB1906F9847BDE80840FFF799BE00BF07 -:1046200000040240904F002008B5084B5968890DDE -:1046300001F03D018A05DA60054AD36F13B1D2F863 -:1046400080009847BDE80840FFF782BE00040240A2 -:10465000904F002000230C4910B51A460B4C0B60FC -:1046600054F82300026001EB430004334260402B06 -:10467000F6D1074A4FF0FF339360D360C2F8083495 -:10468000C2F80C3410BD00BF904F0020107B000812 -:10469000000002400F28F8B510D9102810D01128BA -:1046A00011D0122808D10F240720DFF8B4E001262A -:1046B000DEF80050A04208D9002649E00446F4E79D -:1046C0000F240020F1E70724FBE706FA00F73D423C -:1046D00040D1214C4FEA001C3D4304EB00160EEB89 -:1046E000C000CEF80050C0E90123FBB24BB11B481B -:1046F000836B43F001038363036E43F0010303669E -:10470000036E17F47F4F09D01448836B43F0020304 -:104710008363036E43F002030366036E54F80C00D8 -:10472000036823F01F030360056815F00105FBD142 -:1047300004EB0C033D2493F80CC05F6804FA0CF4FE -:104740003C6021240560446112B1987B00F056F969 -:104750003046F8BD0130ADE7107B00080045025837 -:10476000904F002010B5302484F31188FFF792FF9A -:10477000002383F3118810BD10B50446807B00F040 -:1047800053F901231049627B03FA02F20B6823EA12 -:104790000203DAB20B604AB90C4A916B21F00101B5 -:1047A0009163116E21F001011166126E13F47F4FB7 -:1047B00009D1064B9A6B22F002029A631A6E22F01C -:1047C00002021A661B6E10BD904F00200045025871 -:1047D00008B5302383F31188FFF7CEFF002383F35E -:1047E000118808BD026843681143016003B118478E -:1047F00070470000024A136843F0C003136070471B -:104800000078004013B50E4C204600F0B7FA04F1D2 -:10481000140000234FF400720A49009400F074F968 -:10482000094B4FF40072094904F13800009400F07C -:10483000EDF9074A074BC4E9172302B010BD00BFCA -:104840001450002080500020F547000880520020BE -:104850000078004000E1F505037C30B5214C0029CB -:1048600018BF0C46012B0CD11F4B984209D11F4B8E -:104870009A6C42F080429A641A6F42F080421A6742 -:104880001B6F2268036EC16D03EB52038466B3FB9A -:10489000F2F36268150442BF23F0070503F0070333 -:1048A00043EA4503CB60A36843F040034B60E368F1 -:1048B00043F001038B6042F4967343F001030B60F5 -:1048C0004FF0FF330B62510505D512F0102205D0D1 -:1048D000B2F1805F04D080F8643030BD7F23FAE706 -:1048E0003F23F8E7107C00081450002000450258D0 -:1048F0002DE9F047C66D05463768F4692107346233 -:104900001AD014F0080118BF4FF48071E20748BFB5 -:1049100041F02001A3074FF0300348BF41F04001B0 -:10492000600748BF41F0800183F31188281DFFF71D -:1049300059FF002383F31188E2050AD5302383F35E -:1049400011884FF48061281DFFF74CFF002383F38B -:1049500011884FF030094FF0000A14F0200838D1C8 -:104960003B0616D54FF0300905F1380A200610D560 -:1049700089F31188504600F07DF9002836DA0821C5 -:10498000281DFFF72FFF27F080033360002383F3F8 -:104990001188790614D5620612D5302383F3118865 -:1049A000D5E913239A4208D12B6C33B127F0400785 -:1049B0001021281DFFF716FF3760002383F31188AD -:1049C000E30618D5AA6E1369ABB15069BDE8F0478C -:1049D000184789F31188736A284695F864101940BE -:1049E00000F0E6F98AF31188F469B6E7B06288F35B -:1049F0001188F469BAE7BDE8F0870000090100F109 -:104A00006043012203F56143C9B283F8001300F04B -:104A10001F039A4043099B0003F1604303F5614380 -:104A2000C3F880211A60704700F01F0301229A40EA -:104A3000430900F160409B0000F5614003F16043D1 -:104A400003F56143C3F88020C3F88021002380F878 -:104A500000337047F8B51546826804460B46AA42F3 -:104A600000D28568A1692669761AB5420BD218462C -:104A70002A46FCF771FFA3692B44A3612846A3686B -:104A80005B1BA360F8BD0CD9AF1B18463246FCF780 -:104A900063FF3A46E1683044FCF75EFFE3683B445D -:104AA000EBE718462A46FCF757FFE368E5E7000006 -:104AB00083689342F7B50446154600D28568D4E969 -:104AC0000460361AB5420BD22A46FCF745FF6369EB -:104AD0002B4463612846A3685B1BA36003B0F0BD51 -:104AE0000DD93246AF1B0191FCF736FF01993A46CA -:104AF000E0683144FCF730FFE3683B44E9E72A46CD -:104B0000FCF72AFFE368E4E710B50A440024C36118 -:104B1000029B8460C16002610362C0E90000C0E9D9 -:104B2000051110BD08B5D0E90532934201D1826864 -:104B300082B98268013282605A1C42611970002178 -:104B4000D0E904329A4224BFC368436100F09CFE5E -:104B5000002008BD4FF0FF30FBE7000070B53023A8 -:104B600004460E4683F31188A568A5B1A368A2691F -:104B7000013BA360531CA36115782269934224BFB3 -:104B8000E368A361E3690BB120469847002383F3F0 -:104B90001188284607E03146204600F065FE0028CF -:104BA000E2DA85F3118870BD2DE9F74F04460E4611 -:104BB00017469846D0F81C904FF0300A8AF31188B7 -:104BC0004FF0000B154665B12A4631462046FFF7E7 -:104BD00041FF034660B94146204600F045FE0028EB -:104BE000F1D0002383F31188781B03B0BDE8F08F68 -:104BF000B9F1000F03D001902046C847019B8BF309 -:104C00001188ED1A1E448AF31188DCE7C160C36184 -:104C1000009B82600362C0E905111144C0E90000F5 -:104C200001617047F8B504460D461646302383F3FC -:104C30001188A768A7B1A368013BA36063695A1CE8 -:104C400062611D70D4E904329A4224BFE368636153 -:104C5000E3690BB120469847002080F3118807E0F4 -:104C60003146204600F000FE0028E2DA87F3118882 -:104C7000F8BD0000D0E9052310B59A4201D1826841 -:104C80007AB982680021013282605A1C82611C78E4 -:104C900003699A4224BFC368836100F0F5FD204692 -:104CA00010BD4FF0FF30FBE72DE9F74F04460E46ED -:104CB00017469846D0F81C904FF0300A8AF31188B6 -:104CC0004FF0000B154665B12A4631462046FFF7E6 -:104CD000EFFE034660B94146204600F0C5FD0028BE -:104CE000F1D0002383F31188781B03B0BDE8F08F67 -:104CF000B9F1000F03D001902046C847019B8BF308 -:104D00001188ED1A1E448AF31188DCE702684368B3 -:104D10001143016003B11847704700001430FFF7DA -:104D200043BF00004FF0FF331430FFF73DBF0000DA -:104D30003830FFF7B9BF00004FF0FF333830FFF7CE -:104D4000B3BF00001430FFF709BF00004FF0FF3180 -:104D50001430FFF703BF00003830FFF763BF0000D7 -:104D60004FF0FF323830FFF75DBF0000012914BF5C -:104D70006FF0130000207047FFF744BD044B036041 -:104D800000234360C0E9023301230374704700BF6E -:104D9000287C000810B53023044683F31188FFF700 -:104DA0005BFD02230020237480F3118810BD0000F6 -:104DB00038B5C36904460D461BB904210844FFF702 -:104DC000A5FF294604F11400FFF7ACFE002806DA1F -:104DD000201D4FF40061BDE83840FFF797BF38BD94 -:104DE000026843681143016003B11847704700002F -:104DF00013B5406B00F58054D4F8A4381A681178C4 -:104E0000042914D1017C022911D1197901231289B5 -:104E10008B4013420BD101A94C3002F0E9F8D4F8D1 -:104E2000A4480246019B2179206800F0DFF902B016 -:104E300010BD0000143002F06BB800004FF0FF33DB -:104E4000143002F065B800004C3002F03DB90000AB -:104E50004FF0FF334C3002F037B90000143002F04D -:104E600039B800004FF0FF31143002F033B80000C1 -:104E70004C3002F009B900004FF0FF324C3002F024 -:104E800003B900000020704710B500F58054D4F835 -:104E9000A4381A681178042917D1017C022914D189 -:104EA0005979012352898B4013420ED1143001F0FD -:104EB000CBFF024648B1D4F8A4484FF4407361795F -:104EC0002068BDE8104000F07FB910BD406BFFF7CF -:104ED000DBBF0000704700007FB5124B01250426A0 -:104EE000044603600023057400F1840243602946F0 -:104EF000C0E902330C4B0290143001934FF440731D -:104F0000009601F07DFF094B04F69442294604F116 -:104F10004C000294CDE900634FF4407302F044F872 -:104F200004B070BD507C0008CD4E0008F14D000863 -:104F30000A68302383F311880B790B3342F823007E -:104F40004B79133342F823008B7913B10B3342F8BA -:104F5000230000F58053C3F8A41802230374002033 -:104F600080F311887047000038B5037F044613B101 -:104F700090F85430ABB90125201D0221FFF730FF16 -:104F800004F114006FF00101257700F089FC04F1B1 -:104F90004C0084F854506FF00101BDE8384000F037 -:104FA0007FBC38BD10B5012104460430FFF718FF5F -:104FB0000023237784F8543010BD000038B5044630 -:104FC0000025143001F034FF04F14C00257702F085 -:104FD00003F8201D84F854500121FFF701FF2046FB -:104FE000BDE83840FFF750BF90F8803003F0600311 -:104FF000202B06D190F881200023212A03D81F2AD4 -:1050000006D800207047222AFBD1C0E91D3303E0F7 -:10501000034A426707228267C3670120704700BFC7 -:105020003C23002037B500F58055D5F8A4381A6820 -:10503000117804291AD1017C022917D11979012389 -:1050400012898B40134211D100F14C04204602F02A -:1050500083F858B101A9204601F0CAFFD5F8A44849 -:105060000246019B2179206800F0C0F803B030BDF2 -:1050700001F10B03F0B550F8236085B004460D46EE -:10508000FEB1302383F3118804EB8507301D08211E -:10509000FFF7A6FEFB6806F14C005B691B681BB1BD -:1050A000019001F0B3FF019803A901F0A1FF0246AE -:1050B00048B1039B2946204600F098F8002383F36B -:1050C000118805B0F0BDFB685A691268002AF5D056 -:1050D0001B8A013B1340F1D104F18002EAE7000092 -:1050E000133138B550F82140ECB1302383F31188E7 -:1050F00004F58053D3F8A4281368527903EB820394 -:10510000DB689B695D6845B104216018FFF768FEA4 -:10511000294604F1140001F0A1FE2046FFF7B4FE79 -:10512000002383F3118838BD7047000001F074B983 -:1051300001234022002110B5044600F8303BFCF763 -:1051400031FC0023C4E9013310BD000010B5302349 -:10515000044683F311882422416000210C30FCF7BF -:1051600021FC204601F07AF902230020237080F30D -:10517000118810BD70B500EB8103054650690E46DD -:105180001446DA6018B110220021FCF70BFCA0696C -:1051900018B110220021FCF705FC31462846BDE875 -:1051A000704001F05BBA000083682022002103F008 -:1051B000011310B5044683601030FCF7F3FB204662 -:1051C000BDE8104001F0D6BAF0B4012500EB81042F -:1051D00047898D40E4683D43A469458123600023ED -:1051E000A2606360F0BC01F0F3BA0000F0B40125E6 -:1051F00000EB810407898D40E4683D4364690581C3 -:1052000023600023A2606360F0BC01F069BB000072 -:1052100070B5022300250446242203702946C0F8F5 -:1052200088500C3040F8045CFCF7BCFB204684F846 -:10523000705001F0A7F963681B6823B12946204626 -:10524000BDE87040184770BD0378052B10B50446C3 -:105250000AD080F88C300523037043681B680BB1BB -:10526000042198470023A36010BD000001780529A0 -:1052700006D190F88C20436802701B6803B1184770 -:105280007047000070B590F87030044613B10023E9 -:1052900080F8703004F18002204601F08FFA6368D4 -:1052A0009B68B3B994F8803013F0600535D00021C5 -:1052B000204601F081FD0021204601F071FD636868 -:1052C0001B6813B1062120469847062384F87030E6 -:1052D00070BD204698470028E4D0B4F88630A26F0D -:1052E0009A4288BFA36794F98030A56F002B4FF0D6 -:1052F000300380F20381002D00F0F280092284F84F -:10530000702083F3118800212046D4E91D23FFF784 -:105310006DFF002383F31188DAE794F8812003F00E -:105320007F0343EA022340F20232934200F0C58039 -:1053300021D8B3F5807F48D00DD8012B3FD0022B68 -:1053400000F09380002BB2D104F188026267022240 -:10535000A267E367C1E7B3F5817F00F09B80B3F5F7 -:10536000407FA4D194F88230012BA0D1B4F88830CA -:1053700043F0020332E0B3F5006F4DD017D8B3F518 -:10538000A06F31D0A3F5C063012B90D8636820468D -:1053900094F882205E6894F88310B4F88430B047A3 -:1053A000002884D0436863670368A3671AE0B3F5F5 -:1053B000106F36D040F6024293427FF478AF5C4BD8 -:1053C00063670223A3670023C3E794F88230012BAD -:1053D0007FF46DAFB4F8883023F00203A4F888306E -:1053E000C4E91D55E56778E7B4F88030B3F5A06FE0 -:1053F0000ED194F88230204684F88A3001F020F9EA -:1054000063681B6813B1012120469847032323706A -:105410000023C4E91D339CE704F18B036367012378 -:10542000C3E72378042B10D1302383F3118820465F -:10543000FFF7BAFE85F311880321636884F88B5067 -:1054400021701B680BB12046984794F88230002BDE -:10545000DED084F88B300423237063681B68002B34 -:10546000D6D0022120469847D2E794F884302046CF -:105470001D0603F00F010AD501F092F9012804D0AE -:1054800002287FF414AF2B4B9AE72B4B98E701F0DF -:1054900079F9F3E794F88230002B7FF408AF94F8A1 -:1054A000843013F00F01B3D01A06204602D501F064 -:1054B0009BFCADE701F08CFCAAE794F88230002B4E -:1054C0007FF4F5AE94F8843013F00F01A0D01B06E2 -:1054D000204602D501F070FC9AE701F061FC97E7E5 -:1054E000142284F8702083F311882B462A4629461B -:1054F0002046FFF769FE85F31188E9E65DB11522C4 -:1055000084F8702083F3118800212046D4E91D23FC -:10551000FFF75AFEFDE60B2284F8702083F3118812 -:105520002B462A4629462046FFF760FEE3E700BFE8 -:10553000807C0008787C00087C7C000838B590F8F6 -:1055400070300446002B3ED0063BDAB20F2A34D826 -:105550000F2B32D8DFE803F03731310822323131F6 -:105560003131313131313737856FB0F886309D4276 -:1055700014D2C3681B8AB5FBF3F203FB12556DB955 -:10558000302383F311882B462A462946FFF72EFE47 -:1055900085F311880A2384F870300EE0142384F810 -:1055A0007030302383F31188002320461A461946B1 -:1055B000FFF70AFE002383F3118838BDC36F03B1E0 -:1055C00098470023E7E70021204601F0F5FB002182 -:1055D000204601F0E5FB63681B6813B106212046F5 -:1055E00098470623D7E7000010B590F870300446BE -:1055F000142B29D017D8062B05D001D81BB110BD0C -:10560000093B022BFBD80021204601F0D5FB0021ED -:10561000204601F0C5FB63681B6813B106212046D4 -:105620009847062319E0152BE9D10B2380F8703039 -:10563000302383F3118800231A461946FFF7D6FD5D -:10564000002383F31188DAE7C3689B695B68002B4A -:10565000D5D1C36F03B19847002384F87030CEE7EB -:1056600000238268037503691B6899689142FBD225 -:105670005A68036042601060586070470023826877 -:10568000037503691B6899689142FBD85A680360E7 -:10569000426010605860704708B50846302383F3B5 -:1056A00011880B7D032B05D0042B0DD02BB983F370 -:1056B000118808BD8B6900221A604FF0FF338361A7 -:1056C000FFF7CEFF0023F2E7D1E9003213605A6002 -:1056D000F3E70000FFF7C4BF054BD96808751868E9 -:1056E000026853601A600122D8600275FAF792BE10 -:1056F000805400200C4B30B5DD684B1C87B004464D -:105700000FD02B46094A684600F05EF92046FFF7A5 -:10571000E3FF009B13B1684600F060F9A86907B089 -:1057200030BDFFF7D9FFF9E78054002099560008F3 -:10573000044B1A68DB6890689B68984294BF00200D -:105740000120704780540020084B10B51C68D868B1 -:10575000226853601A600122DC602275FFF78EFF19 -:1057600001462046BDE81040FAF754BE80540020A0 -:1057700038B5074C012300250649074823706560AA -:1057800001F028FD0223237085F3118838BD00BF86 -:10579000E8560020887C00088054002008B572B6C6 -:1057A000044B186500F060FC00F026FD024B03225C -:1057B0001A70FEE780540020E856002000F044B93B -:1057C000034A516853685B1A9842FBD8704700BF80 -:1057D000001000E08B600223086108468B8270474E -:1057E0008368A3F1840243F8142C026943F8442C23 -:1057F000426943F8402C094A43F8242CC268A3F1BB -:10580000200043F8182C022203F80C2C002203F885 -:105810000B2C034A43F8102C704700BF2D040008DE -:105820008054002008B5FFF7DBFFBDE80840FFF714 -:1058300051BF0000024BDB6898610F20FFF74CBF9F -:1058400080540020302383F31188FFF7F3BF00005A -:1058500008B50146302383F311880820FFF74AFF7B -:10586000002383F3118808BD064BDB6839B1426819 -:1058700018605A60136043600420FFF73BBF4FF08D -:10588000FF307047805400200368984206D01A68A1 -:105890000260506018469961FFF71CBF7047000016 -:1058A00038B504460D462068844200D138BD0368EF -:1058B00023605C608561FFF70DFFF4E7036810B5B6 -:1058C0009C68A2420CD85C688A600B604C602160C6 -:1058D000596099688A1A9A604FF0FF33836010BD4F -:1058E000121B1B68ECE700000A2938BF0A2170B5BB -:1058F00004460D460A26601901F064FC01F04CFCD8 -:10590000041BA54203D8751C04462E46F3E70A2E55 -:1059100004D90120BDE8704001F09CBC70BD0000BE -:10592000F8B5144B0D460A2A4FF00A07D96103F166 -:105930001001826038BF0A22416019691446016073 -:1059400048601861A81801F02DFC01F025FC431BEC -:105950000646A34206D37C1C28192746354601F08B -:1059600031FCF2E70A2F04D90120BDE8F84001F02C -:1059700071BCF8BD80540020F8B506460D4601F014 -:105980000BFC0F4A134653F8107F9F4206D12A465C -:1059900001463046BDE8F840FFF7C2BFD169BB6899 -:1059A000441A2C1928BF2C46A34202D92946FFF7D6 -:1059B0009BFF224631460348BDE8F840FFF77EBF13 -:1059C0008054002090540020C0E90323002310B429 -:1059D0005DF8044B4361FFF7CFBF000010B5194CD1 -:1059E000236998420DD08168D0E9003213605A6073 -:1059F0009A680A449A60002303604FF0FF33A36162 -:105A000010BD0268234643F8102F53600022026045 -:105A100022699A4203D1BDE8104001F0CDBB9368E2 -:105A200081680B44936001F0B7FB2269E1699268D9 -:105A3000441AA242E4D91144BDE81040091AFFF704 -:105A400053BF00BF805400202DE9F047DFF8BC8031 -:105A500008F110072C4ED8F8105001F09DFBD8F833 -:105A60001C40AA68031B9A423ED814444FF0000918 -:105A7000D5E90032C8F81C4013605A60C5F80090A0 -:105A8000D8F81030B34201D101F096FB89F31188A8 -:105A9000D5E9033128469847302383F311886B6991 -:105AA000002BD8D001F078FB6A69A0EB040982468C -:105AB0004A450DD2022001F0CDFB0022D8F810306B -:105AC000B34208D151462846BDE8F047FFF728BF4A -:105AD000121A2244F2E712EB09092946384638BF68 -:105AE0004A46FFF7EBFEB5E7D8F81030B34208D0CE -:105AF0001444C8F81C00211AA960BDE8F047FFF75C -:105B0000F3BEBDE8F08700BF905400208054002011 -:105B100038B501F041FB054AD2E90845031B1819C5 -:105B200045F10001C2E9080138BD00BF80540020E2 -:105B300000207047FEE70000704700004FF0FF3084 -:105B40007047000002290CD0032904D0012907481E -:105B500018BF00207047032A05D8054800EBC20093 -:105B60007047044870470020704700BF607D000800 -:105B70004C230020147D000870B59AB005460846F5 -:105B8000144601A900F0C2F801A8FBF703FF431C6B -:105B90000022C6B25B001046C5E90034237003231F -:105BA000023404F8013C01ABD1B202348E4201D878 -:105BB0001AB070BD13F8011B013204F8010C04F88F -:105BC000021CF1E708B5302383F311880348FFF77F -:105BD00029FA002383F3118808BD00BFF056002086 -:105BE00090F8803003F01F02012A07D190F881203D -:105BF0000B2A03D10023C0E91D3315E003F0600335 -:105C0000202B08D1B0F884302BB990F88120212ABC -:105C100003D81F2A04D8FFF7E7B9222AEBD0FAE706 -:105C2000034A426707228267C3670120704700BFAB -:105C30004323002007B5052917D8DFE801F019161E -:105C400003191920302383F31188104A0121019090 -:105C5000FFF790FA019802210D4AFFF78BFA0D48E1 -:105C6000FFF7ACF9002383F3118803B05DF804FB60 -:105C7000302383F311880748FFF776F9F2E73023E2 -:105C800083F311880348FFF78DF9EBE7B47C000834 -:105C9000D87C0008F056002038B50C4D0C4C2A4634 -:105CA0000C4904F10800FFF767FF05F1CA0204F18F -:105CB00010000949FFF760FF05F5CA7204F11800EA -:105CC0000649BDE83840FFF757BF00BFC86F002046 -:105CD0004C230020947C00089E7C0008A97C0008CE -:105CE00070B5044608460D46FBF754FEC6B2204682 -:105CF000013403780BB9184670BD32462946FBF7CC -:105D000035FE0028F3D10120F6E700002DE9F04729 -:105D100005460C46FBF73EFE2A49C6B22846FFF769 -:105D2000DFFF08B10936F6B227492846FFF7D8FF4A -:105D300008B11036F6B2632E0BD8DFF88880DFF892 -:105D40008890224FDFF890A02E7846B92670BDE8E3 -:105D5000F08729462046BDE8F04701F049BE252ED0 -:105D60002CD1072241462846FBF700FE60B9184BAC -:105D7000224603F1100153F8040B8B4242F8040B46 -:105D8000F9D107351034DFE7082249462846FBF7EA -:105D9000EDFD98B9A21C0F4B197802320909C95DB3 -:105DA00002F8041C13F8011B01F00F015345C95DF3 -:105DB00002F8031CF0D118340835C5E7013504F8A2 -:105DC000016BC1E7807D0008A97C0008887D000880 -:105DD0000E7A000800E8F11F0CE8F11FBFF34F8FA7 -:105DE000044B1A695107FCD1D3F810215207F8D19E -:105DF000704700BF0020005208B50D4B1B78ABB9AF -:105E0000FFF7ECFF0B4BDA68D10704D50A4A5A605A -:105E100002F188325A60D3F80C21D20706D5064A1F -:105E2000C3F8042102F18832C3F8042108BD00BF81 -:105E300026720020002000522301674508B5114B4F -:105E40001B78F3B9104B1A69510703D5DA6842F091 -:105E50004002DA60D3F81021520705D5D3F80C219F -:105E600042F04002C3F80C21FFF7B8FF064BDA6896 -:105E700042F00102DA60D3F80C2142F00102C3F8CB -:105E80000C2108BD26720020002000520F289ABF66 -:105E900000F5806040040020704700004FF400309F -:105EA00070470000102070470F2808B50BD8FFF787 -:105EB000EDFF00F500330268013204D10430834263 -:105EC000F9D1012008BD0020FCE700000F2838B5FB -:105ED00005463FD8FFF782FF1F4CFFF78DFF4FF0BD -:105EE000FF3307286361C4F814311DD82361FFF71D -:105EF00075FF030243F02403E360E36843F080038B -:105F0000E36023695A07FCD42846FFF767FFFFF7D1 -:105F1000BDFF4FF4003100F04BF92846FFF78EFF2C -:105F2000BDE83840FFF7C0BFC4F81031FFF756FF97 -:105F3000A0F108031B0243F02403C4F80C31D4F889 -:105F40000C3143F08003C4F80C31D4F810315B07F6 -:105F5000FBD4D9E7002038BD002000522DE9F84FCE -:105F600005460C46104645EA0203DE0602D0002034 -:105F7000BDE8F88F20F01F00DFF8BCB0DFF8BCA050 -:105F8000FFF73AFF04EB0008444503D10120FFF777 -:105F900055FFEDE720222946204601F0F7FC10B915 -:105FA00020352034F0E72B4605F120021F68791CCC -:105FB000DDD104339A42F9D105F178431B481C4ED8 -:105FC000B3F5801F1B4B38BF184603F1F80332BFEF -:105FD000D946D1461E46FFF701FF0760A5EB040C2A -:105FE000336804F11C0143F002033360231FD9F826 -:105FF000007017F00507FAD153F8042F8B424CF8C4 -:106000000320F4D1BFF34F8FFFF7E8FE4FF0FF33CB -:106010002022214603602846336823F002033360C0 -:1060200001F0B4FC0028BBD03846B0E71421005280 -:106030000C20005214200052102000521021005257 -:1060400010B5084C237828B11BB9FFF7D5FE012302 -:10605000237010BD002BFCD02070BDE81040FFF76E -:10606000EDBE00BF2672002038B5054D0024033474 -:10607000696855F80C0B00F0ADF8122CF7D138BD5B -:106080009C7D0008084601F079BC000038B5EFF3AC -:1060900011859DB9EFF30584C4F30804302334B1AE -:1060A00083F31188FFF734FD85F3118838BD83F33E -:1060B0001188FFF72DFD84F3118838BDBDE8384005 -:1060C000FFF726BD10B5FFF7E1FF104CC008104ADE -:1060D000002340EA4170C908A0FB04ECA0FB020EBB -:1060E0001CEB0000A1FB044CA1FB02125B41001958 -:1060F00043EB0C0011EB0E0142F10002411842F19A -:106100000000090941EA007010BD00BFCFF753E35A -:10611000A59BC4200244074BD2B210B5904200D1D7 -:1061200010BD441C00B253F8200041F8040BE0B24B -:10613000F4E700BF504000580E4B30B51C6F2404EC -:1061400005D41C6F1C671C6F44F400441C670A4C88 -:1061500002442368D2B243F480732360074B904219 -:1061600000D130BD441C51F8045B00B243F820500C -:10617000E0B2F4E70044025800480258504000588A -:1061800007B5012201A90020FFF7C4FF019803B061 -:106190005DF804FB13B50446FFF7F2FFA04205D0FB -:1061A000012201A900200194FFF7C6FF02B010BD33 -:1061B0000144BFF34F8F064B884204D3BFF34F8F88 -:1061C000BFF36F8F7047C3F85C022030F4E700BF65 -:1061D00000ED00E00144BFF34F8F064B884204D32B -:1061E000BFF34F8FBFF36F8F7047C3F8700220303B -:1061F000F4E700BF00ED00E070470000074B45F2F8 -:1062000055521A6002225A6040F6FF729A604CF6AC -:10621000CC421A600122024B1A70704700480058A5 -:106220002C720020034B1B781BB1034B4AF6AA22A9 -:106230001A6070472C72002000480058034B1A68FF -:106240001AB9034AD2F8D0241A6070472872002085 -:1062500000400258024B4FF48032C3F8D0247047FC -:106260000040025808B5FFF7E9FF024B1868C0F379 -:10627000806008BD2872002070B5BFF34F8FBFF358 -:106280006F8F1A4A0021C2F85012BFF34F8FBFF32D -:106290006F8F536943F400335361BFF34F8FBFF3E4 -:1062A0006F8FC2F88410BFF34F8FD2F8803043F65F -:1062B000E074C3F3C900C3F34E335B0103EA040681 -:1062C000014646EA81750139C2F86052F9D2203B95 -:1062D00013F1200FF2D1BFF34F8F536943F4803392 -:1062E0005361BFF34F8FBFF36F8F70BD00ED00E0C0 -:1062F000FEE70000214B2248224A70B5904237D376 -:10630000214BC11EDA1C121A22F003028B4238BF45 -:1063100000220021FBF746FB1C4A0023C2F8843010 -:10632000BFF34F8FD2F8803043F6E074C3F3C90057 -:10633000C3F34E335B0103EA0406014646EA817566 -:106340000139C2F86C52F9D2203B13F1200FF2D17F -:10635000BFF34F8FBFF36F8FBFF34F8FBFF36F8FBD -:106360000023C2F85032BFF34F8FBFF36F8F70BD61 -:1063700053F8041B40F8041BC0E700BF308000083E -:1063800000740020007400200074002000ED00E084 -:10639000054B996B21EA000199631A6E22EA00020B -:1063A0001A661B6E704700BF0045025870B5D0E9F1 -:1063B000244300224FF0FF359E6804EB4213510145 -:1063C000D3F80009002805DAD3F8000940F080402E -:1063D000C3F80009D3F8000B002805DAD3F8000B46 -:1063E00040F08040C3F8000B013263189642C3F8B6 -:1063F0000859C3F8085BE0D24FF00113C4F81C3809 -:1064000070BD0000890141F02001016103699B0614 -:10641000FCD41220FFF7D4B910B50A4C2046FEF781 -:1064200087FE094BC4F89030084BC4F89430084CF0 -:106430002046FEF77DFE074BC4F89030064BC4F8AB -:10644000943010BD3072002000000840087E000823 -:10645000CC72002000000440147E000870B5037860 -:106460000546012B58D13F4BD0F89040984254D16B -:106470003D4B0E2165209A6B42F000629A631A6EC2 -:1064800042F000621A661B6E384BD3F8802042F04F -:106490000062C3F88020D3F8802022F00062C3F8A5 -:1064A0008020D3F88030FEF7A9FA314BE360314BFE -:1064B000C4F800380023D5F89060C4F8003EC0232B -:1064C00023604FF40413A3633369002BFCDA012328 -:1064D0000C203361FFF774F93369DB07FCD4122019 -:1064E000FFF76EF93369002BFCDA00262846A66018 -:1064F000FFF75CFF6B68C4F81068DB68C4F81468C9 -:10650000C4F81C6863BB1C4BA3614FF0FF3363618D -:10651000A36843F00103A36070BD184B9842C9D132 -:10652000114B4FF080609A6B42F000729A631A6EC2 -:1065300042F000721A661B6E0C4BD3F8802042F0BA -:106540000072C3F88020D3F8802022F00072C3F8D4 -:106550008020D3F88030FFF71BFF0E214D20A2E7EB -:10656000074BD1E730720020004502580044025822 -:106570004014004003002002003C30C0CC720020D8 -:10658000083C30C0F8B5D0F89040054600214FF0E7 -:1065900000662046FFF736FFD5F8941000234FF031 -:1065A00001128F684FF0FF30C4F83438C4F81C284B -:1065B00004EB431201339F42C2F80069C2F8006B3A -:1065C000C2F80809C2F8080BF2D20B68D5F890207F -:1065D000C5F89830636210231361166916F010062F -:1065E000FBD11220FFF7ECF8D4F8003823F4FE6357 -:1065F000C4F80038A36943F4402343F01003A361B7 -:106600000923C4F81038C4F814380B4BEB604FF072 -:10661000C043C4F8103B094BC4F8003BC4F81069F0 -:10662000C4F80039D5F8983003F1100243F4801310 -:10663000C5F89820A362F8BDE47D000840800010F2 -:10664000D0F8902090F88A10D2F8003823F4FE6336 -:1066500043EA0113C2F80038704700002DE9F843FF -:1066600000EB8103D0F890500C468046DA680FFAB0 -:1066700081F94801166806F00306731E022B05EB2C -:1066800041134FF0000194BFB604384EC3F8101BFD -:106690004FF0010104F1100398BF06F1805601FA92 -:1066A00003F3916998BF06F5004600293AD0578A4E -:1066B00004F15801374349016F50D5F81C180B43BA -:1066C0000021C5F81C382B180127C3F81019A74062 -:1066D0005369611E9BB3138A928B9B08012A88BF62 -:1066E0005343D8F89820981842EA034301F1400236 -:1066F0002146C8F89800284605EB82025360FFF750 -:1067000081FE08EB8900C3681B8A43EA845348343E -:106710001E4364012E51D5F81C381F43C5F81C7860 -:10672000BDE8F88305EB4917D7F8001B21F40041B9 -:10673000C7F8001BD5F81C1821EA0303C0E704F1D1 -:106740003F030B4A2846214605EB83035A60FFF7B7 -:1067500059FE05EB4910D0F8003923F40043C0F886 -:106760000039D5F81C3823EA0707D7E70080001066 -:1067700000040002D0F894201268C0F89820FFF7B7 -:1067800015BE00005831D0F8903049015B5813F421 -:10679000004004D013F4001F0CBF022001207047FA -:1067A0004831D0F8903049015B5813F4004004D0D0 -:1067B00013F4001F0CBF02200120704700EB810181 -:1067C000CB68196A0B6813604B6853607047000010 -:1067D00000EB810330B5DD68AA691368D36019B98D -:1067E000402B84BF402313606B8A1468D0F890203C -:1067F0001C4402EB4110013C09B2B4FBF3F46343C7 -:10680000033323F0030343EAC44343F0C043C0F817 -:10681000103B2B6803F00303012B0ED1D2F808388C -:1068200002EB411013F4807FD0F8003B14BF43F01B -:10683000805343F00053C0F8003B02EB4112D2F802 -:10684000003B43F00443C2F8003B30BD2DE9F0416A -:10685000D0F8906005460C4606EB4113D3F8087B50 -:106860003A07C3F8087B08D5D6F814381B0704D5B7 -:1068700000EB8103DB685B689847FA071FD5D6F801 -:106880001438DB071BD505EB8403D968CCB98B69B9 -:10689000488A5A68B2FBF0F600FB16228AB91868DB -:1068A000DA6890420DD2121AC3E90024302383F330 -:1068B000118821462846FFF78BFF84F31188BDE835 -:1068C000F081012303FA04F26B8923EA02036B814E -:1068D000CB68002BF3D021462846BDE8F04118478D -:1068E00000EB81034A0170B5DD68D0F890306C6927 -:1068F0002668E66056BB1A444FF40020C2F810091F -:106900002A6802F00302012A0AB20ED1D3F808085D -:1069100003EB421410F4807FD4F8000914BF40F058 -:10692000805040F00050C4F8000903EB4212D2F846 -:10693000000940F00440C2F800090122D3F83408ED -:1069400002FA01F10143C3F8341870BD19B9402EA1 -:1069500084BF4020206020681A442E8A8419013C9C -:10696000B4FBF6F440EAC44040F00050C6E7000033 -:106970002DE9F843D0F8906005460C464F0106EB30 -:106980004113D3F8088918F0010FC3F808891CD007 -:10699000D6F81038DB0718D500EB8103D3F80CC00C -:1069A000DCF81430D3F800E0DA68964530D2A2EB78 -:1069B0000E024FF000091A60C3F80490302383F3ED -:1069C0001188FFF78DFF89F3118818F0800F1DD013 -:1069D000D6F834380126A640334217D005EB84039D -:1069E0000134D5F89050D3F80CC0E4B22F44DCF851 -:1069F000142005EB0434D2F800E05168714514D33B -:106A0000D5F8343823EA0606C5F83468BDE8F883BB -:106A1000012303FA01F2038923EA02030381DCF86C -:106A20000830002BD1D09847CFE7AEEB0103BCF87C -:106A30001000834228BF0346D7F8180980B2B3EB91 -:106A4000800FE3D89068A0F1040959F8048FC4F8C6 -:106A50000080A0EB09089844B8F1040FF5D8184459 -:106A60000B4490605360C8E72DE9F84FD0F8905080 -:106A700004466E69AB691E4016F480586E6103D0FF -:106A8000BDE8F84FFEF7C4BB002E12DAD5F8003E81 -:106A90009B0705D0D5F8003E23F00303C5F8003E60 -:106AA000D5F80438204623F00103C5F80438FEF772 -:106AB000DDFB370505D52046FFF778FC2046FEF7BD -:106AC000C3FBB0040CD5D5F8083813F0060FEB68FB -:106AD00023F470530CBF43F4105343F4A053EB6002 -:106AE00031071BD56368DB681BB9AB6923F008036A -:106AF000AB612378052B0CD1D5F8003E9A0705D061 -:106B0000D5F8003E23F00303C5F8003E2046FEF70B -:106B1000ADFB6368DB680BB120469847F30200F1D8 -:106B2000BA80B70226D5D4F8909000274FF0010A1A -:106B300009EB4712D2F8003B03F44023B3F5802F52 -:106B400011D1D2F8003B002B0DDA62890AFA07F363 -:106B500022EA0303638104EB8703DB68DB6813B17C -:106B60003946204698470137D4F89430FFB29B68E5 -:106B70009F42DDD9F00619D5D4F89000026AC2F31D -:106B80000A1702F00F0302F4F012B2F5802F00F0A2 -:106B9000CA80B2F5402F09D104EB8303002200F52F -:106BA0008050DB681B6A974240F0B0803003D5F814 -:106BB000185835D5E90303D500212046FFF746FED6 -:106BC000AA0303D501212046FFF740FE6B0303D53E -:106BD00002212046FFF73AFE2F0303D5032120466A -:106BE000FFF734FEE80203D504212046FFF72EFE0E -:106BF000A90203D505212046FFF728FE6A0203D526 -:106C000006212046FFF722FE2B0203D5072120464E -:106C1000FFF71CFEEF0103D508212046FFF716FE03 -:106C2000700340F1A780E90703D500212046FFF754 -:106C30009FFEAA0703D501212046FFF799FE6B07A7 -:106C400003D502212046FFF793FE2F0703D503212A -:106C50002046FFF78DFEEE0603D504212046FFF700 -:106C600087FEA80603D505212046FFF781FE6906A9 -:106C700003D506212046FFF77BFE2A0603D5072110 -:106C80002046FFF775FEEB0574D520460821BDE8C8 -:106C9000F84FFFF76DBED4F890904FF0000B4FF017 -:106CA000010AD4F894305FFA8BF79B689F423FF655 -:106CB00038AF09EB4713D3F8002902F44022B2F5AC -:106CC000802F20D1D3F80029002A1CDAD3F800291C -:106CD00042F09042C3F80029D3F80029002AFBDBD8 -:106CE0003946D4F89000FFF78DFB22890AFA07F3A2 -:106CF00022EA0303238104EB8703DB689B6813B15B -:106D00003946204698470BF1010BCAE7910701D19C -:106D1000D0F80080072A02F101029CBF03F8018B22 -:106D20004FEA18283FE704EB830300F58050DA6848 -:106D3000D2F818C0DCF80820DCE9001CA1EB0C0C30 -:106D400000218F4208D1DB689B699A683A449A60B7 -:106D50005A683A445A6029E711F0030F01D1D0F87C -:106D600000808C4501F1010184BF02F8018B4FEADC -:106D70001828E6E7BDE8F88F08B50348FFF774FE6A -:106D8000BDE80840FDF7E4BA3072002008B50348BA -:106D9000FFF76AFEBDE80840FDF7DABACC720020C2 -:106DA000D0F8903003EB4111D1F8003B43F40013CD -:106DB000C1F8003B70470000D0F8903003EB411160 -:106DC000D1F8003943F40013C1F8003970470000CE -:106DD000D0F8903003EB4111D1F8003B23F40013BD -:106DE000C1F8003B70470000D0F8903003EB411130 -:106DF000D1F8003923F40013C1F8003970470000BE -:106E000030B50433039C0172002104FB0325C160EB -:106E1000C0E90653049B0363059BC0E90000C0E979 -:106E20000422C0E90842C0E90A11436330BD0000F2 -:106E30000022416AC260C0E90411C0E90A226FF071 -:106E40000101FEF72DBD0000D0E90432934201D1CB -:106E5000C2680AB9181D704700207047036919609D -:106E60000021C2680132C260C26913448269934240 -:106E7000036124BF436A0361FEF706BD38B50446CB -:106E80000D46E3683BB162690020131D1268A362DE -:106E90001344E36207E0237A33B929462046FEF71C -:106EA000E3FC0028EDDA38BD6FF00100FBE70000DD -:106EB000C368C269013BC36043691344826993425A -:106EC000436124BF436A436100238362036B03B1C0 -:106ED0001847704770B53023044683F31188866ADB -:106EE0003EB9FFF7CBFF054618B186F31188284657 -:106EF00070BDA36AE26A13F8015B9342A36202D3F6 -:106F00002046FFF7D5FF002383F31188EFE7000049 -:106F10002DE9F84F04460E46174698464FF03009C3 -:106F200089F311880025AA46D4F828B0BBF1000FD8 -:106F300009D141462046FFF7A1FF20B18BF311880C -:106F40002846BDE8F88FD4E90A12A7EB050B521AC0 -:106F5000934528BF9346BBF1400F1BD9334601F13F -:106F6000400251F8040B914243F8040BF9D1A36A93 -:106F7000403640354033A362D4E90A239A4202D313 -:106F80002046FFF795FF8AF31188BD42D8D289F3D6 -:106F90001188C9E730465A46FAF7DEFCA36A5E4418 -:106FA0005D445B44A362E7E710B5029C04330172C1 -:106FB00003FB0421C460C0E906130023C0E90A33BF -:106FC000039B0363049BC0E90000C0E90422C0E9FD -:106FD0000842436310BD0000026A6FF00101C26005 -:106FE000426AC0E904220022C0E90A22FEF758BC26 -:106FF000D0E904239A4201D1C26822B9184650F858 -:10700000043B0B60704700231846FAE7C368002171 -:10701000C2690133C3604369134482699342436187 -:1070200024BF436A4361FEF72FBC000038B5044615 -:107030000D46E3683BB1236900201A1DA262E26994 -:107040001344E36207E0237A33B929462046FEF76A -:107050000BFC0028EDDA38BD6FF00100FBE7000003 -:1070600003691960C268013AC260C2691344826947 -:107070009342036124BF436A036100238362036B6D -:1070800003B118477047000070B530230D46044621 -:10709000114683F31188866A2EB9FFF7C7FF10B136 -:1070A00086F3118870BDA36A1D70A36AE26A01337A -:1070B0009342A36204D3E16920460439FFF7D0FF6D -:1070C000002080F31188EDE72DE9F84F04460D46C6 -:1070D000904699464FF0300A8AF311880026B3464D -:1070E000A76A4FB949462046FFF7A0FF20B187F3B2 -:1070F00011883046BDE8F88FD4E90A073A1AA8EBA0 -:107100000607974228BF1746402F1BD905F14003B9 -:1071100055F8042B9D4240F8042BF9D1A36A403660 -:107120004033A362D4E90A239A4204D3E16920469A -:107130000439FFF795FF8BF311884645D9D28AF3BE -:107140001188CDE729463A46FAF706FCA36A3D4482 -:107150003E443B44A362E5E7D0E904239A4217D1B9 -:10716000C3689BB1836A8BB1043B9B1A0ED013603A -:10717000C368013BC360C3691A4483699A420261D0 -:1071800024BF436A036100238362012318467047CA -:107190000023FBE700F01CB9014B586A704700BFA1 -:1071A000000C0040034B002258631A610222DA608F -:1071B000704700BF000C0040014B0022DA607047AE -:1071C000000C0040014B5863704700BF000C0040AA -:1071D000FEE7000070B51B4B0025044686B05860E2 -:1071E0000E4685620163FDF78BF804F11003A5607C -:1071F000E562C4E904334FF0FF33C4E90044C4E955 -:107200000635FFF7C9FF2B46024604F1340120463C -:10721000C4E9082380230C4A2565FEF7DBFA012325 -:107220000A4AE06000920375684672680192B2688B -:10723000CDE90223064BCDE90435FEF7F3FA06B09B -:1072400070BD00BFE8560020207E0008257E0008A3 -:10725000D1710008024AD36A1843D062704700BF58 -:10726000805400204B6843608B688360CB68C360A8 -:107270000B6943614B6903628B6943620B6803606E -:107280007047000008B53A4B40F2FF713948D3F817 -:1072900088200A43C3F88820D3F8882022F4FF62AC -:1072A00022F00702C3F88820D3F88830324B1A6CDA -:1072B0000A431A649A6E0A439A66304A9B6E1146D4 -:1072C000FFF7D0FF00F5806002F11C01FFF7CAFF55 -:1072D00000F5806002F13801FFF7C4FF00F580601F -:1072E00002F15401FFF7BEFF00F5806002F170016A -:1072F000FFF7B8FF00F5806002F18C01FFF7B2FFE5 -:1073000000F5806002F1A801FFF7ACFF00F5806096 -:1073100002F1C401FFF7A6FF00F5806002F1E00171 -:10732000FFF7A0FF00F5806002F1FC01FFF79AFF74 -:1073300002F58C7100F58060FFF794FF00F00AF908 -:107340000F4BD3F8902242F00102C3F89022D3F8F9 -:10735000942242F00102C3F894220522C3F8982037 -:107360004FF06052C3F89C20064AC3F8A02008BD25 -:107370000044025800000258004502582C7E0008C4 -:1073800000ED00E01F00080308B500F0C1FAFEF7A9 -:10739000EFF90C4BDA6B42F04002DA635A6E22F0DE -:1073A00040025A665B6E084B1A6842F008021A6087 -:1073B0001A6842F004021A60FEF740FFBDE8084078 -:1073C000FEF76ABC004502580018024870470000EA -:1073D0000E4B9A6C42F008029A641A6F42F008024F -:1073E0001A670B4A1B6FD36B43F00803D363C722A2 -:1073F000084B9A624FF0FF32DA6200229A615A63B8 -:10740000DA605A6001225A611A60704700450258DA -:107410000010005C000C0040094A08B51169D368EF -:107420000B40D9B29B076FEA0101116107D53023E8 -:1074300083F31188FEF7C2F9002383F3118808BD96 -:10744000000C0040044BDA6B0243DA635A6E1043BF -:1074500058665B6E704700BF0045025808B53C4B4C -:107460004FF0FF31D3F8802062F00042C3F8802053 -:10747000D3F8802002F00042C3F88020D3F88020A7 -:10748000D3F88420C3F88410D3F884200022C3F8F2 -:107490008420D3F88400D86F40F0FF4040F4FF0010 -:1074A00040F4DF4040F07F00D867D86F20F0FF4005 -:1074B00020F4FF0020F4DF4020F07F00D867D86F71 -:1074C000D3F888006FEA40506FEA5050C3F8880044 -:1074D000D3F88800C0F30A00C3F88800D3F8880006 -:1074E000D3F89000C3F89010D3F89000C3F8902020 -:1074F000D3F89000D3F89400C3F89410D3F8940014 -:10750000C3F89420D3F89400D3F89800C3F89810E7 -:10751000D3F89800C3F89820D3F89800D3F88C00DB -:10752000C3F88C10D3F88C00C3F88C20D3F88C00EF -:10753000D3F89C00C3F89C10D3F89C10C3F89C208F -:10754000D3F89C30FDF786F8BDE8084000F0B4B9E8 -:107550000044025808B50122504BC3F80821504B93 -:107560005A6D42F002025A65DA6F42F00202DA679F -:107570000422DB6F4B4BDA605A689104FCD54A4A0F -:107580001A6001229A60494ADA6000221A614FF4B7 -:1075900040429A61434B9A699204FCD51A6842F4BE -:1075A00080721A60424B1A6F12F4407F04D04FF47D -:1075B00080321A6700221A671A6842F001021A60C4 -:1075C0003B4B1A685007FCD500221A611A6912F069 -:1075D0003802FBD1012119604FF0804159605A6790 -:1075E000344ADA62344A1A611A6842F480321A6004 -:1075F0002F4B1A689103FCD51A6842F480521A6026 -:107600001A689204FCD52D4A2D499A6200225A63C9 -:10761000196301F57C01DA6301F5E77199635A6436 -:10762000284A1A64284ADA621A6842F0A8521A6094 -:107630001F4B1A6802F02852B2F1285FF9D1482294 -:107640009A614FF48862DA6140221A621F4ADA6452 -:107650001F4A1A651F4A5A651F4A9A6532231F4AF4 -:107660001360136803F00F03022BFAD1104A136959 -:1076700043F003031361136903F03803182BFAD1A5 -:107680004FF00050FFF7DEFE4FF08040FFF7DAFECC -:107690004FF00040BDE80840FFF7D4BE0080005125 -:1076A000004502580048025800C000F004000001E4 -:1076B000004402580000FF0100889008322060005A -:1076C00063020901470E0508DD0BBF012000002001 -:1076D000000001100910E00000010110002000521C -:1076E0004FF0B04208B5D2F8883003F00103C2F879 -:1076F000883023B1044A13680BB150689847BDE83D -:107700000840FCF725BE00BF807300204FF0B04258 -:1077100008B5D2F8883003F00203C2F8883023B1EC -:10772000044A93680BB1D0689847BDE80840FCF75D -:107730000FBE00BF807300204FF0B04208B5D2F8F2 -:10774000883003F00403C2F8883023B1044A136977 -:107750000BB150699847BDE80840FCF7F9BD00BF80 -:10776000807300204FF0B04208B5D2F8883003F0A3 -:107770000803C2F8883023B1044A93690BB1D06979 -:107780009847BDE80840FCF7E3BD00BF80730020C8 -:107790004FF0B04208B5D2F8883003F01003C2F8B9 -:1077A000883023B1044A136A0BB1506A9847BDE888 -:1077B0000840FCF7CDBD00BF807300204FF0B04300 -:1077C00010B5D3F8884004F47872C3F88820A30673 -:1077D00004D5124A936A0BB1D06A9847600604D563 -:1077E0000E4A136B0BB1506B9847210604D50B4A18 -:1077F000936B0BB1D06B9847E20504D5074A136C25 -:107800000BB1506C9847A30504D5044A936C0BB197 -:10781000D06C9847BDE81040FCF79ABD80730020FB -:107820004FF0B04310B5D3F8884004F47C42C3F85D -:107830008820620504D5164A136D0BB1506D984728 -:10784000230504D5124A936D0BB1D06D9847E0041F -:1078500004D50F4A136E0BB1506E9847A10404D59E -:107860000B4A936E0BB1D06E9847620404D5084A58 -:10787000136F0BB1506F9847230404D5044A936FDC -:107880000BB1D06F9847BDE81040FCF761BD00BF59 -:107890008073002008B50348FDF72AF8BDE80840CA -:1078A000FCF756BD1450002008B5FFF7B5FDBDE844 -:1078B0000840FCF74DBD0000062108B50846FDF75D -:1078C0009DF806210720FDF799F806210820FDF70D -:1078D00095F806210920FDF791F806210A20FDF709 -:1078E0008DF806211720FDF789F806212820FDF7DD -:1078F00085F809217A20FDF781F807213220FDF76C -:107900007DF80C215220BDE80840FDF777B8000053 -:1079100008B5FFF7A3FD00F00DF8FDF72DFAFDF710 -:1079200005FCFDF7D7FAFFF751FDBDE80840FFF76A -:1079300031BC00000023054A19460133102BC2E96F -:10794000001102F10802F8D1704700BF80730020D7 -:107950000B460146184600F003B8000000F00EB8D0 -:1079600010B5054C13462CB10A4601460220AFF370 -:10797000008010BD2046FCE700000000024B0146DD -:107980001868FEF77FBB00BF6C23002010B50139DB -:107990000244904201D1002005E0037811F8014F24 -:1079A000A34201D0181B10BD0130F2E72DE9F041D0 -:1079B000A3B1C91A17780144044603F1FF3C8C4275 -:1079C000204601D9002009E00578BD4204F10104F8 -:1079D000F5D10CEB0405D618A54201D1BDE8F08124 -:1079E00015F8018D16F801EDF045F5D0E7E7000038 -:1079F000034611F8012B03F8012B002AF9D1704737 -:107A00006F72672E6172647570696C6F742E437546 -:107A1000626550696C6F742D43414E4D6F64000078 -:107A200053544D333248373F3F3F0053544D333268 -:107A3000483733782F3732780053544D3332483734 -:107A400034332F3735332F373530000001105A00CB -:107A500003105900012058000320560040A2E4F111 -:107A6000646891060041A3E5F26569920700000091 -:107A700043414E464449666163653A204D657373E0 -:107A80006167652052414D204F766572666C6F7755 -:107A9000210000004261642043414E4966616365F4 -:107AA00020696E6465782E00000000000000000070 -:107AB000912A00081D230008DD3100088D230008ED -:107AC00099230008B1270008112500085523000854 -:107AD0005923000831230008192300086D270008E6 -:107AE0003D230008153300084923000841270008FA -:107AF00001040E05054B02020E05054B04010E059F -:107B0000054B05010B04044B080106030346000066 -:107B100010000240080002400008024000000B0074 -:107B200028000240080002400408024006010C0040 -:107B300040000240080002400808024010020D0008 -:107B400058000240080002400C08024016030E00D4 -:107B5000700002400C0002401008024000040F00B8 -:107B6000880002400C000240140802400605100084 -:107B7000A00002400C00024018080240100611004C -:107B8000B80002400C0002401C08024016072F00FB -:107B90001004024008040240200802400008380097 -:107BA0002804024008040240240802400609390063 -:107BB000400402400804024028080240100A3A002B -:107BC00058040240080402402C080240160B3B00F7 -:107BD000700402400C04024030080240000C3C00DB -:107BE000880402400C04024034080240060D4400A0 -:107BF000A00402400C04024038080240100E450068 -:107C0000B80402400C0402403C080240160F460033 -:107C100000960000000000000000000000000000CE -:107C2000000000000000000000000000394D0008C6 -:107C3000254D0008614D00084D4D0008594D0008C4 -:107C4000454D0008314D00081D4D00086D4D0008E0 -:107C500000000000514E00083D4E0008794E00081B -:107C6000654E0008714E00085D4E0008494E000840 -:107C7000354E0008854E000800000000010000009D -:107C80000000000063300000847C0008D85400200D -:107C9000E85600204172647550696C6F740025428B -:107CA0004F415244252D424C002553455249414CE9 -:107CB00025000000020000000000000071500008D4 -:107CC000E150000840004000986F0020A86F00209D -:107CD000020000000000000003000000000000009F -:107CE000295100080000000010000000B86F0020BB -:107CF00000000000010000000000000030720020C1 -:107D000001010200355C0008455B0008E15B0008EA -:107D1000C55B0008430000001C7D00080902430009 -:107D2000020100C032090400000102020100052422 -:107D300000100105240100010424020205240600AC -:107D400001070582030800FF09040100020A000080 -:107D50000007050102400000070581024000000005 -:107D600012000000687D00081201100102000040AE -:107D70000912415700020102030100000403090433 -:107D800025424F41524425003031323334353637A5 -:107D900038394142434445460000000000010020BC -:107DA00000FF01000200000000000030000004009D -:107DB000080000000000002400000800040000008B -:107DC0000004000000FC000002000000000004307D -:107DD00000800000080000000000003800000100E2 -:107DE0000100000000000000855200083D55000819 -:107DF000E9550008400040006873002068730020C7 -:107E000001000000787300208000000040010000A5 -:107E10000800000000010000001000000800000041 -:107E20006D61696E0069646C650000000000802A65 -:107E300000000000AAAAAAAA00000024FFFF000078 -:107E40000000000000A00A00000000000000000088 -:107E5000AAAAAAAA00000000FFFF0000000000007C -:107E6000000000000000000000000000AAAAAAAA6A -:107E700000000000FFFF0000000000000000000004 -:107E80000A00000000000000AAAAAAAA0000000040 -:107E9000FFFF0000990000000000000000800200C9 -:107EA00000000000AAAAAAAA00400100FFFF0000EB -:107EB000000000700700000000000000000000004B -:107EC000AAAAAAAA00000000FFFF0000000000000C -:107ED000000000000500000000000000A5AAAAAAFA -:107EE00000000000FCFF0000000000000000000097 -:107EF0000000000000000000AAAAAAAA00000000DA -:107F0000FFFF000000000000000000000000000073 -:107F100000000000AAAAAAAA00000000FFFF0000BB -:107F20000000000000000000000000000000000051 -:107F3000AAAAAAAA00000000FFFF0000000000009B -:107F4000000000000000000000000000AAAAAAAA89 -:107F500000000000FFFF0000000000000000000023 -:107F600037040000000000000000180000000000BE -:107F7000FE2A0100D2040000FF000000F05600209D -:107F80001450002000000000207A00088304000044 -:107F90002B7A000850040000397A0008009600008F -:107FA0000000080096000000000800000400000027 -:107FB0007C7D0008000000000000000000000000C0 -:107FC00000000000000000000000000070230020FE -:107FD00000000000000000000000000000000000A1 -:107FE0000000000000000000000000000000000091 -:107FF0000000000000000000000000000000000081 -:108000000000000000000000000000000000000070 -:108010000000000000000000000000000000000060 -:108020000000000000000000000000000000000050 +:101AF0000460014655F82600BDE8704003F092B935 +:101B000070BD00BF1C4F00201C23002090560020F9 +:101B1000044F0020F8B571B6002301201A4619467B +:101B200002F068FE0446802004F094FB002845D0B3 +:101B30000025234A80274FF4D06C3D26136923BB30 +:101B4000D2F810310BBB236805F10061996023685E +:101B5000D86023685F602368C3F800C021680B6801 +:101B600043F001030B6021680B6823F01E030B6038 +:101B700021680B68DB07FCD4237B8035616806FA9B +:101B800003F3B5F5001F0B60D8D1204602F068FEC4 +:101B9000B5F5001F11D000240A4E0B4D012004F0B2 +:101BA000BBFA3388A34205D928682044013404F0E5 +:101BB000F9F9F6E7002004F0AFFA61B6F8BD00BF0E +:101BC000002000521E4F0020D84E00202DE9F8437F +:101BD0000D46044600219046284640F27912FFF750 +:101BE000E1FE234620220021284604F1220702F0CC +:101BF0003FF9231D022220212846C02602F038F991 +:101C0000631D03222221284602F032F9A31D03227C +:101C10002521284602F02CF904F10803102228217E +:101C2000284602F025F904F110030822382128463D +:101C300002F01EF904F1110308224021284602F0A7 +:101C400017F904F1120308224821284602F010F97E +:101C500004F1140320225021284602F009F904F16E +:101C6000180340227021284602F002F904F12003F3 +:101C70000822B021284602F0FBF804F121030822D3 +:101C8000B821284602F0F4F8314608363B460822CF +:101C90002846013702F0ECF8B6F5A07FF4D13146C2 +:101CA00004F132030822284602F0E2F8002794F8F3 +:101CB000326004F13309F900BE4201F5A4711FD866 +:101CC000F70007F5A476B8F1000F08D1314607F206 +:101CD0004F1604F599730722284602F0C9F894F8C4 +:101CE0003201B046502828BF5020074604EB0009B7 +:101CF000A1450DD106EBC7000730C008BDE8F88349 +:101D000009EB070308222846013702F0B1F8D2E7B1 +:101D100004F2331341460822284608F1080801342A +:101D200002F0A6F8E4E7000013B5044608460021D7 +:101D30002022234601900160C0F8031002F098F8B9 +:101D4000231D01980222202102F092F8631D0198C0 +:101D50000322222102F08CF8A31D019803222521E1 +:101D600002F086F8019804F108031022282102F0FD +:101D70007FF8072002B010BDF7B5047F05460E4678 +:101D80002CB1838A122B02D9012003B0F0BD0023AD +:101D9000072228460096194601F02EFF731C0122E7 +:101DA000072100932846002301F026FFD4B9B31C75 +:101DB000052208212846009323460D2401F01CFF2C +:101DC000B378102BE0D83746BB1BB278934210D3C0 +:101DD00007342B7FA88AE408B3B9844294BF00205B +:101DE0000120D2E7AB8A0824DB00083BDB08B37094 +:101DF000E6E7FB1C2146082228460093002308340E +:101E0000013701F0F9FEDFE7201A18BF0120BCE717 +:101E1000F7B5047F05460E462CB1838ACA2B02D93A +:101E2000012003B0F0BD0023082228460096194681 +:101E300001F0E2FE731CD4B908220093234610245B +:101E40001146284601F0D8FE7378C82BE8D8012344 +:101E50005F1C7278013B934210D307342B7FA88A12 +:101E6000E408B3B9844294BF00200120D9E7AB8ACB +:101E70000824DB00083BDB087370E5E7F319214613 +:101E8000082228460093002301F0B6FE08343B46A2 +:101E9000DEE7201A18BF0120C3E700002DE9F84350 +:101EA0000D4604461646002181222846FFF77AFD9A +:101EB000234608220021284601F0DAFFC6B90F2682 +:101EC000631C07220821284601F0D2FF94F9013053 +:101ED000B0466778002BB8BF7F2704EB07094C4555 +:101EE00008D10736082010FB0760C008BDE8F8835A +:101EF0000826EBE7A31C41460822284608F10808FB +:101F0000013401F0B5FFEAE72DE9F0410D46044642 +:101F100016460021CE222846FFF744FD23462822FC +:101F20000021284601F0A4FFBEB9302604F10803C1 +:101F300008222821284601F09BFF14F8080F0027EB +:101F4000C82828BFC8208046B84506EBC70106D878 +:101F500006EBC800C008BDE8F0812826EDE7013790 +:101F600008222846E31901F083FFEDE7F7B5047F67 +:101F700005460E4634B1838AB3F5827F02D901202B +:101F800003B0F0BD0123102200212846009601F085 +:101F900033FEDCB9B31C09221021284600932346E6 +:101FA000192401F029FE7388B3F5807FE7D83746FE +:101FB000BB1B7288934210D307342B7FA88AE40896 +:101FC000B3B9844294BF00200120D9E7AB8A102422 +:101FD000DB00103BDB087380E5E73B1D2146082250 +:101FE0002846009300230834013701F005FEDFE79F +:101FF000201A18BF0120C3E730B50A44084D9142AA +:102000000DD011F8013B5840082340F30004013B78 +:102010002C4013F0FF0384EA5000F6D1EFE730BD07 +:102020002083B8EDF7B5384A6B46106851686A46A8 +:1020300003C308233549364805F040FF044600280D +:1020400033D10A25334A6B46106851686A4603C388 +:10205000082331492E4805F031FF0446002849D0B5 +:102060000369B3F5E01F45D8B0F8661040F2374277 +:1020700091423FD1294A024402F15C018B4239D39B +:102080005C3B234900209E1AFFF7B6FF04F1640170 +:10209000074632460020FFF7AFFFA3689F4229D1D1 +:1020A000E368984208BF002524E00369B3F5E01F08 +:1020B00027D8418B40F23742914220D1174A02443F +:1020C00002F110018B4218D3103B114900209D1AD8 +:1020D000FFF792FF04F1180106462A460020FFF799 +:1020E0008BFFA3689E4202D1E368984201D00D2580 +:1020F000A8E70025284603B0F0BD1025A2E70C256F +:10210000A0E70B259EE700BF6C7F0008DCFF1B00EB +:1021100000000408757F000890FF1B000800FCF712 +:1021200010B5037C044613B9006804F0C7F82046D4 +:1021300010BD00000023BFF35B8FC360BFF35B8F54 +:10214000BFF35B8F8360BFF35B8F7047BFF35B8F21 +:102150000068BFF35B8F704770B505460C30FFF722 +:10216000F5FF044605F108063046FFF7EFFFA042F1 +:1021700006D96D683046FFF7E9FF2544281A70BD7F +:102180003046FFF7E3FF201AF9E7000070B5054677 +:102190004068A0B105F10C0605F10800FFF7D6FF75 +:1021A00004463046FFF7D2FF844204F1FF34304644 +:1021B00094BF6D680025FFF7C9FF2C44201A70BD3D +:1021C00038B50C460546FFF7C7FFA04210D305F10E +:1021D0000800FFF7BBFF04446868BFF35B8FB4FBE4 +:1021E000F0F100FB11440120AC60BFF35B8F38BD00 +:1021F0000020FCE72DE9F041144607460D46FFF7A5 +:10220000C5FF844228BF0446D4B1B84658F80C6BC9 +:102210004046FFF79BFF3044286040467E68FFF74A +:1022200095FF331A9C4203D801206C60BDE8F08111 +:10223000A41B6B603B682044AB60E8600220F5E7BC +:102240002046F3E738B50C460546FFF79FFFA0424E +:1022500010D305F10C00FFF779FF04446868BFF361 +:102260005B8FB4FBF0F100FB11440120EC60BFF385 +:102270005B8F38BD0020FCE72DE9FF4188466946A9 +:1022800007466C46FFF7B6FF002506B204EBC6060C +:10229000B4420AD0626808EB050120680834FFF7F1 +:1022A0005BFB54F8043C1D44F2E729463846FFF72F +:1022B000C9FF284604B0BDE8F0810000F8B5054626 +:1022C0000C300F46FFF742FF05F108060446304682 +:1022D000FFF73CFFA042304688BF6C68FFF736FF2F +:1022E000201A386020B12C683046FFF72FFF2044B9 +:1022F000F8BD000073B5144606460D46FFF72CFFE7 +:102300008442019028BF0446DCB101A93046FFF7A2 +:10231000D5FF019B33B93268C5E90233C5E9002412 +:1023200001200CE09C42286038BF0194019884424F +:102330006860F5D93368241A0220AB60EC6002B003 +:1023400070BD2046FBE700002DE9FF410F466946BE +:102350006C46FFF7CFFF00B2002604EBC005AC428D +:1023600009D0D4F80480B81954F8081B42464644F2 +:10237000FFF7F2FAF3E7304604B0BDE8F081000061 +:1023800038B50546FFF7E0FF044601462846FFF74B +:1023900017FF204638BD000008B103F08FBF70471B +:1023A0007047000010B41346026814680022A44667 +:1023B0005DF8044B6047000000F5805090F8590428 +:1023C0007047000000F5805090F8520470470000FC +:1023D00000F5805090F95804704700004E20704777 +:1023E000302383F3118800F58052D2F89C34D2F860 +:1023F00098041844D2F894341844D2F87C34184421 +:10240000D2F88C341844D2F888341844002383F36B +:102410001188704700F58050C0F8541401207047AF +:102420002DE9F04F0C4600F5805185B01F4691F81C +:10243000523405469046BDF838909BB1D1F87834B7 +:102440000133C1F878342368980006D4237B082B25 +:102450000BD9627B0AB10F2B07D9D1F87C34013339 +:10246000C1F87C344FF0FF3010E0302383F3118843 +:10247000EB6AD3F8C42012F4001B0AD0D1F88034E0 +:1024800000200133C1F8803480F3118805B0BDE825 +:10249000F08F20684822D3F8C4300028C3F3044AE0 +:1024A0006B6AB4BF40F08040800412FB0A334FEAED +:1024B0004A161860226852004FEA0A6244BF40F090 +:1024C00000501860207B42EA00425A60607B10B3E3 +:1024D00042F440125A60D1F8B0240132C1F8B0245D +:1024E000AA1902F58352117B41F020011173207B60 +:1024F000039300F0ABFF0330039B80105FFA8BF275 +:102500000BF1010B82420DDA04EB820103EB820234 +:1025100049689160F2E7AA1902F58352117B60F3D2 +:102520004511E3E70122EB6A05EB4A1102FA0AF2D0 +:1025300001F58251C3F8D020AB19183104F10C0217 +:1025400003F58253C3E90487234653F8040B9342EF +:1025500041F8040BF9D11B882E440B8041F268032B +:1025600046F803A006F5805609F0030396F86C20A0 +:1025700043F0100322F01F02134386F86C3000234F +:1025800083F3118842463B4621462846CDF8009009 +:1025900000F022FF012079E72DE9F04700F5805691 +:1025A000044696F85254002D40F00381037C032B1F +:1025B00040F0948028462B462F465FFA80FC9445D5 +:1025C00010DA01EBCC0E51F83CC0BCF1000F04DB7B +:1025D000DEF804C0BCF1000F02DB01370130ECE78C +:1025E0000133FBE7302080F31188E06AF3B9D0F8BB +:1025F000803043F00203C0F880304E23E06A002FA1 +:102600006FD1D0F8803043F00103C0F880306A4BBE +:102610006A4A1B6803F1805303F52C539B009342D5 +:10262000A36240F2B080664800F0AEFE4D2B42D867 +:10263000DFF884814FEA034EDFF88891D8F800C0B4 +:102640004EEA8C0EC0F884E00CF1805000F52C505E +:102650008000606103EB0C00D4F82CC0C3F14E0382 +:10266000C8F80000DCF8800040F03000CCF88000B2 +:102670004FF0000CD4F81480E6465FFA8CF08242EA +:10268000BCDD01EBC00A51F83000002810DBDAF89D +:1026900004A0BAF1000F0BDA09EA00400AF07F0A41 +:1026A00040EA0A0040F0084048F82E000EF1010E02 +:1026B0000CF1010CE1E7836923F00103836100F071 +:1026C00069FE0646E36A9B69D90704D500F062FEFD +:1026D000831BFA2BF6D9002383F311882846BDE823 +:1026E000F087B7EB530F3DD2DFF8CCE04FEA074C51 +:1026F000DEF800304CEA830CC0F888C003F180504B +:1027000003EB4703002700F52C50CEF80030BC4601 +:102710008000A061E06AD0F8803043F00C03C0F87C +:102720008030D4F818E0FBB29A427FF770AF51F8CE +:10273000330001EBC3080028D8F8043001DB002B7C +:102740000EDB20F0604023F0604340F0005043F087 +:1027500000434EF83C000EEBCC000CF1010C436042 +:102760000137E0E7836923F00103836100F012FE83 +:102770000646E36A9B69DA07ADD500F00BFE831BC2 +:10278000FA2BF6D9A7E7E26A936923F00103936174 +:1027900000F000FE0746E36A9B69DB0705D500F001 +:1027A000F9FDC31BFA2BF6D995E7012586F852549B +:1027B00091E7002592E700BF284F0020FCB50040BC +:1027C000807F00080000FF0713B500F580540191D9 +:1027D000606CFFF7DBFC1F280AD920220199606C8E +:1027E000FFF74AFDA0F120035842584102B010BD46 +:1027F0000020FBE708B5302383F3118800F58050F3 +:10280000406CFFF797FC002383F3118808BD00009C +:1028100000220260828142608260704700220023B1 +:1028200010B5C0E90023002304460C3020F8043C16 +:10283000FFF7EEFF204610BD2DE9F0479A4688B01D +:10284000074688469146302383F3118807F5805464 +:102850006846FFF7E3FF606CFFF77EFC1F282ED968 +:1028600020226946606CFFF78BFD202827D194F861 +:10287000523423B303AD444605AB2E46083403CE91 +:102880009E4244F8080C44F8041C3546F5D13068E3 +:102890002060B388A380DDE90023C9E90023BDF8E7 +:1028A0000830AAF80030002383F3118853464A46C3 +:1028B0004146384608B0BDE8F04700F07BBD002037 +:1028C00080F3118808B0BDE8F08700002DE9F84FCB +:1028D0000023064600F58154054688461034C0E9B9 +:1028E0000133264B46F8303B374638462037FFF752 +:1028F00095FFA742F9D105F580544FF4805305F5B3 +:10290000A3594FF0000A26630026676405F5835734 +:1029100009F110094FF0000B1037E663C4E90D36DA +:10292000012384F8403084F84830A7F1180020379C +:1029300047E910ABFFF76CFF47F8286C4F45F4D11F +:1029400084F85884A4F85A64A4F85C64A4F85E641B +:1029500084F86064A4F86264A4F86464A4F866640B +:1029600084F86864B8F1000F02D0054800F00CFD4F +:10297000044B2846EB62BDE8F88F00BFC07F00081B +:10298000A47F000800A00040044B10B5197804464D +:102990004A1C1A70FFF79AFF204610BD254F0020F1 +:1029A0002DE9F04300295AD02E4E2F48B6FBF1F402 +:1029B00081428CBF0A201120431EB4FBF0F700FBBC +:1029C0001740DDB220B1022B1846F5D8002032E0C6 +:1029D0007B1EB3F5806F2ED2C5EBC5084FF47A731A +:1029E00008F103044FEAE40EC4F3C7040EF1010931 +:1029F000281B0EFB033E5FFA80FC59FA80F0BEFBF9 +:102A0000F0F0B0F5617F18DC83B2601C5CFA80F0F6 +:102A10007843B6FBF0F08142D8D1611E0F29D5D89A +:102A20000CF1FF310729D1D8012013805780107194 +:102A3000547182F806C0BDE8F08308F1FF34E0105D +:102A4000C4F3C70400F1010E2D1B00FB03335FFA32 +:102A500085FC5EFA85F5B3FBF5F39BB2D5E7084636 +:102A6000E9E700BF00B4C4043F420F0030B50D4B8E +:102A700005200D4D1C786C438C420ED159780120F5 +:102A8000518099785171D9789171197911715B7967 +:102A900003EB83035B00138030BD013803F10603B1 +:102AA000E8D1F9E70080000840420F0038B540F255 +:102AB0007772C36A154CC3F8BC200722C36AC3F8F7 +:102AC000C8202268C16A930043F4C023C1F8A03033 +:102AD00002F1805302F16C01C56A03F52C53EA320E +:102AE00089009B00226041F0E061094AC361C5F89A +:102AF000C01003F5D87103F56A7341629342836293 +:102B000002D9044800F040FC38BD00BF284F002027 +:102B1000FCB50040807F00082DE9F04F00F580559E +:102B20001F4689B0044695F8583489469046012BD3 +:102B300004D90026304609B0BDE8F08FA04A52F80B +:102B4000231009B942F823009E48C4F80C9001787C +:102B50002774C9B9302383F311889B4BD3F8EC2039 +:102B600042F48072C3F8EC20D3F8942042F48072CF +:102B7000C3F89420D3F8942022F48072C3F89420F0 +:102B80000123037081F3118895F851647EB93023D5 +:102B900083F311880321132001F078FF032115200E +:102BA00001F074FF012385F8513486F31188302336 +:102BB00083F31188E26A936923F01003936100F0B4 +:102BC000E9FB8246E36A9E6916F0080609D000F028 +:102BD000E1FBA0EB0A03FA2BF4D9002686F3118857 +:102BE000A8E79A6942F001029A6100F0D3FB82469D +:102BF000E36A9A69D00706D400F0CCFBA0EB0A0385 +:102C0000FA2BF5D9E9E79A694FF0000A42F002027F +:102C10009A61E36AC3F854A08AF3118804F5825BD1 +:102C2000686CFFF787FA0BF1100B20220021684631 +:102C3000FEF7B8FE02A8FFF7EBFD6A460BEB0603B2 +:102C40000DF1180ECDF818A094460833BCE8030027 +:102C5000F44543F8080C43F8041C6246F4D1DCF850 +:102C6000000020361860B6F5806F9CF804201A71B9 +:102C7000DBD1002304F5A252494620461A3285F8DA +:102C8000503485F85334FFF78BFE064690B9E26A5C +:102C9000936923F00103936100F07CFB0546E36A2E +:102CA0009B69D9077FF545AF00F074FB431BFA2BF6 +:102CB000F5D93EE795F85E34C5F86C94591E95F841 +:102CC0005F34E26A013B1B0243EA416395F86014FA +:102CD00001390B43B5F85C14013943EA0143D36170 +:102CE000B8F1000F36D004F5A35241462046023217 +:102CF000FFF7BCFE90B9E26A936923F00103936188 +:102D000000F048FB0546E36A9B69DA077FF511AFDF +:102D100000F040FB431BFA2BF5D90AE795F867242E +:102D2000C5F87084511E95F86824E36A013A1201CF +:102D300042EA012295F8661401390A43B5F8641491 +:102D4000013942EA014242F40002DA604FF42062A3 +:102D5000E36A9A64E36A4FF000082046C3F8BC8037 +:102D6000FFF7A4FE85F859846FF04042E36A1A65C4 +:102D7000164AE36A5A654FF00222E36A9A654FF0F9 +:102D8000FF32E36AC3F8E0200322E36A9742DA6580 +:102D90003FF4D0AEE26A936923F00103936100F03F +:102DA000F9FA0746E36A9B69DB0705D500F0F2FAFA +:102DB000C31BFA2BF6D9BCE6012385F85234B9E6D9 +:102DC000204F0020244F00200044025855020002EA +:102DD0002DE9F04F054689B090469946002741F20B +:102DE000680A00F58056EB6AD3F8D830FB40D80764 +:102DF00051D505EB47124FEA471B52441379190787 +:102E000049D4D6F884340133C6F8843405F5A55383 +:102E1000C3E9008913799A0605EB0B0248BFD6F87F +:102E2000B434524444BF0133C6F8B434137943F088 +:102E300008031371DB0723D596F8533403B305F564 +:102E400082546846FFF7EAFC03AB18345C4404F193 +:102E5000080C2068083454F8041C1A46644503C260 +:102E60001346F6D12068694610602846A2889A80E9 +:102E70000123ADF808302B68CDE90089DB6B98475A +:102E8000D6F8A834D6F854040133C6F8A83410B1E3 +:102E900003681B6998470137202FA4D109B0BDE80A +:102EA000F08F00002DE9F04F0F468DB0044600F082 +:102EB00073FA82468946002F5BD1E36AD3F8A020DB +:102EC00012F4FE0F03D100200DB0BDE8F08FD3F84F +:102ED000A420920141BF04F58051D1F89824013219 +:102EE000C1F89824D3F8A4205606ECD0D3F8A45007 +:102EF000E669C5F305254823E8464FF0000B03FBC0 +:102F000005664046FFF784FC326851004ABF22F054 +:102F10006043C2F38A4343F00043920048BF43F04A +:102F200080430093736813F400131BBF012304F55F +:102F300080528DF80D308DF80D301EBFD2F8B834A8 +:102F40000133C2F8B834F38803F00F038DF80C3066 +:102F50009DF80C0000F07AFA5FFA8BF3984225D9BD +:102F6000F2180CA90BF1010B127A0B4403F82C2C6C +:102F7000EEE7012FA7D1E36AD3F8B02012F4FE0FD9 +:102F8000A1D0D3F8B420950141BF04F58051D1F808 +:102F900098240132C1F89824D3F8B420500692D076 +:102FA000D3F8B450266AC5F30525A4E7EFB9E36A60 +:102FB000C3F8A85004A807ADFFF730FC98E80F004D +:102FC00007C52B800023204604A9ADF818302368DC +:102FD00004F58054DB6BCDE904A9984758B1D4F8C7 +:102FE00090340133C4F890346EE7012FE2D1E36AE4 +:102FF000C3F8B850DEE7D4F8943401200133C4F8A4 +:10300000943461E72DE9F04105460F4600F5805400 +:10301000012639462846FFF745FF10B184F853646E +:10302000F7E7D4F8A834D4F854040133C4F8A8342A +:1030300020B10368BDE8F0411B691847BDE8F08185 +:10304000C36AF0B51A6C12F47F0F2BD01B6C00F51D +:10305000805441F268054FF0010CC4F8AC340023F1 +:10306000471900EB43125E012A44117911F0020F57 +:1030700015D0490713D4B959C66A0CFA01F1D6F82C +:10308000CCE011EA0E0F0AD0C6F8D410117941F045 +:1030900004011171D4F88C240132C4F88C2401335A +:1030A000202BDED1F0BD000010B5264C264B226847 +:1030B0000AB340B31A6D92050FD54FF400721A652A +:1030C00000F06AF950EA01020B4602D0013861F1C2 +:1030D000000302462068FFF77BFE1B4A136D9B012D +:1030E0002AD523684FF0007103F580531165012242 +:1030F00083F8592420E001221A6510221A654FF442 +:1031000080521A6510BD196DC80702D4196D4907A0 +:1031100005D50521104619650021FFF773FF0A4BFD +:103120001A6DD00602D41A6D510605D55022012120 +:103130001A652068FFF766FF2068BDE81040FFF7BA +:103140007FBF00BF204F002000A0004008B5302303 +:1031500083F31188FFF774FF002383F3118808BD00 +:10316000C36AD3F8C00010F07C5005D0D3F8C40077 +:1031700080F40010C0F340507047000008B53023C1 +:1031800083F3118800F58050406CFEF7E5FF0023C3 +:1031900083F3118843090CBF0120002008BD000003 +:1031A00000F5805393F8592462B1C16A8A6922F00C +:1031B00001028A61D3F89C240132C3F89C240022C6 +:1031C00083F85924704700002DE9F743302181F33B +:1031D000118800F58251002541F2680E4FF0010878 +:1031E000103100F5805C00EB4514744426797707B4 +:1031F0001CD4F6061AD58E69D0F82C9008FA06F67B +:10320000D9F8CC703E4211D04F6801970F689742B1 +:10321000019F9F410AD2C9F8D460267946F004067E +:103220002671DCF888440134CCF88844013520311B +:10323000202DD8D1002383F3118803B0BDE8F0839B +:10324000F8B51E4600230F46054613701446FFF7D7 +:1032500095FF80F0010038701EB12846FFF780FF0F +:103260002070F8BD2DE9F04F85B099460D46804697 +:10327000164691F800B0DDE90EA30293137801938E +:1032800000F08AF82B7804460F4613B93378002BE8 +:1032900041D022463B464046FFF796FFFFF756FFD8 +:1032A000FFF77EFF4B4632462946FFF7C9FF2B78D2 +:1032B00033B1BBF1000F03D0012005B0BDE8F08FA2 +:1032C000337813B1019B002BF6D108F5805303939B +:1032D0005445029B77EB03031DD2039BD3F85404A0 +:1032E000C8B10368AAEB04011B6898474B463246F5 +:1032F00029464046FFF7A4FF2B7813B1BBF1000F1E +:10330000DAD1337813B1019B002BD5D100F044F80A +:1033100004460F46DCE70020CFE7000008B5002098 +:10332000FFF7C2FEBDE8084001F05AB808B5012019 +:10333000FFF7BAFEBDE8084001F052B800B59BB0F7 +:10334000EFF3098168226846FEF706FBEFF3058379 +:10335000014B9B6BFEE700BF00ED00E008B5FFF7F7 +:10336000EDFF000000B59BB0EFF3098168226846CD +:10337000FEF7F2FAEFF30583014B5B6BFEE700BF4C +:1033800000ED00E0FEE700000FB408B5029802F07F +:1033900071FAFEE702F0C0BF02F0A2BF13B56C469F +:1033A000031D84E8060094E8030083E8050001207B +:1033B00002B010BD73B58568019155B11B885B07DC +:1033C00007D4D0E900369B6B9847019AC1B23046CA +:1033D000A847012002B070BDF0B5866889B00546E7 +:1033E0000C465EB1BDF838305B070AD4D0E900372F +:1033F0009B6B98472246C1B23846B047012009B0BE +:10340000F0BD0022002301F10806CDE900230023CE +:103410000A46ADF8083003AB1068083252F8041CB5 +:103420001C46B24203C42346F6D11068206092883D +:10343000A280FFF7B1FF0423ADF808302B68CDE977 +:103440000001DB6B694628469847D7E7082817D95B +:1034500009280CD00A280CD00B280CD00C280CD032 +:103460000D280CD00E2814BF4020302070470C20AF +:103470007047102070471420704718207047202094 +:10348000704700002DE9F041456A15B94162BDE879 +:10349000F0814B68AC4623F06047C3F38A464FEA9D +:1034A000D37EC3F3807816EA230638BF3E462B4608 +:1034B0005A68BEEBD27F22F060440AD0002A18DAA4 +:1034C000A40CB44217D19D420FD10D60DEE7134624 +:1034D000EEE7A74207D102F08044C2F38072424572 +:1034E0000BD054B1EFE708D2EDE7CCF800100B6039 +:1034F000CDE7B44201D0B442E5D81A689C46002A10 +:10350000E5D11960C3E700002DE9F047089D01F0FF +:10351000070400EBD1004FF47F494FEAD50822445D +:1035200005F00705944201D1BDE8F08704F00707D4 +:1035300005F0070A111B08EBD50E57453E4613F858 +:103540000EC038BF5646C6F108068E4228BF0E464A +:10355000E108415C34443544B94029FA06F721FAC0 +:103560000AF1FFB28CEA010147FA0AF739408CEA06 +:10357000010C03F80EC0D5E780EA0120082341F2D0 +:10358000210201B2013B4000002980B2B8BF504087 +:1035900013F0FF03F5D1704738B50C468D18A542DE +:1035A00000D138BD14F8011BFFF7E6FFF7E7000074 +:1035B00042684AB1136881894360438901339BB2F1 +:1035C0009942438138BF83811046704770B588B0F7 +:1035D000044620220D4668460021FEF7E3F9204606 +:1035E0000495FFF7E5FF024660B16B46054608AE5D +:1035F0001C46083503CCB44245F8080C45F8041CB9 +:103600002346F5D1104608B070BD0000082817D930 +:1036100009280CD00A280CD00B280CD00C280CD070 +:103620000D280CD00E2814BF4020302070470C20ED +:1036300070471020704714207047182070472020D2 +:1036400070470000082817D90C280CD910280CD96D +:1036500014280CD918280CD920280CD930288CBF54 +:103660000F200E207047092070470A2070470B205A +:1036700070470C2070470D20704700002DE9F8437B +:10368000078C0446072F1ED900254FF6FF73D0E99B +:103690000298C5F12006A5F1200029FA05F10835A8 +:1036A00008FA06F628FA00F0314301431846C9B279 +:1036B000FFF762FF402D0346EBD13A46E169BDE8D2 +:1036C000F843FFF769BF4FF6FF70BDE8F8830000CD +:1036D00010B54B6823B9CA8A63F30902CA8210BDC8 +:1036E00004691A681C600361C38A013BC3824A6093 +:1036F000EFE700002DE9F84F1D46CB8A0F468146C3 +:10370000C3F30901924605290B4630D00020AAB226 +:1037100007F11A049EB21FFA80F8042E0FD89045C4 +:1037200003F1010306D30A44FB8A62F30903012073 +:10373000FB821AE01AF800600130E654EAE790458F +:10374000F1D2A1F1050B1C237C68BBFBF3F203FB58 +:1037500012BB1FFA8BF6002C45D14846FFF728FF15 +:10376000044638B978606FF00200BDE8F88F4FF07A +:103770000008E6E7002606607860ADB24FF0000B67 +:10378000454510D90AEB0803221D13F8011B08F167 +:1037900001089155B1B21FFA88F81B292BD0454575 +:1037A00006F10106F1D8FB8AC3F30902154465F35B +:1037B0000903BCE701321C4692B22368002BF9D101 +:1037C0006B1F0B441C21B3FBF1F301339BB29A42F4 +:1037D000D3D2BBF1000FD0D14846FFF7E9FE20B9A4 +:1037E000C4F800B0BFE70122E7E7C0F800B05E46CA +:1037F00020600446C1E74545D5D94846FFF7D8FEC5 +:1038000008B92060AFE7C0F800B000262060044689 +:10381000B6E700002DE9F04F1C46074688462DED1F +:10382000028B83B05B690192002B00F09A80238C9D +:103830002BB1E269002A00F09480072B35D807F1FC +:103840000C00FFF7B5FE054638B96FF002052846B3 +:1038500003B0BDEC028BBDE8F08F14220021FEF70F +:10386000A1F8228CE16905F10800FEF775F8208CBB +:1038700048F00041013080B2FFF7E4FEFFF7C6FEDA +:10388000013880B220840130287438466369228C64 +:103890001B782A4403F01F0363F03F03137269602F +:1038A0002946FFF7EFFD0125D1E74FF0000900F1B0 +:1038B0000C034FF0800A4E464D4608EE103A18EEC3 +:1038C000100AFFF775FE83460028BED0142200219F +:1038D000FEF768F8002E3AD1019B0222ABF80830BF +:1038E0000BF1080E1FFA82FC218C0CF10100BCF1D7 +:1038F000060F80B201D88E422BD3FFF7A3FE8E4273 +:1039000008BF4FF0400AFFF781FE626901380135B8 +:1039100012781BFA80F1013002F01F022DB242EA48 +:10392000491289F001094AEA020A48F0004281F886 +:1039300008A059468BF810003846CBF804204FF009 +:10394000000AFFF79FFD238CB342B8D17FE7002226 +:10395000C6E7E169895D01360EF80210B6B20132A0 +:10396000C0E76FF0010572E7F8B515460E46302244 +:10397000002104461F46FEF715F8069BB5F5001F0B +:10398000A760636004F11000079B34BF6A094FF61B +:10399000FF72E661A362002397B29A4206D8002321 +:1039A0000360A782E3822383E360F8BD06600133EE +:1039B00030462036F1E7000003781BB94BB2002BEC +:1039C000C8BF01707047000000787047F8B50C461A +:1039D000C969074611B9238C002B37D1257E1F2DCD +:1039E00034D8387828BB228C072A2CD8268A36F07F +:1039F00003032BD14FF6FF70FFF7CEFD20F001003F +:103A000031024FF6FF72400441EA0561400C41EA81 +:103A10004025234629463846FFF7FCFE002807DDEF +:103A2000626913780133DBB21F2B88BF0023137048 +:103A3000F8BD218A2D0645EA012505432046FFF7FA +:103A40001DFE0246E5E76FF00300F1E76FF00100AD +:103A5000EEE7000070B58AB0044616460021282221 +:103A600068461D46FDF79EFFBDF838306946204682 +:103A7000ADF810300F9B05939DF840308DF818304D +:103A8000119B0793BDF84830CDE90265ADF82030B1 +:103A9000FFF79CFF0AB070BD2DE9F041D3690546E0 +:103AA0000C4616460BB9138C5BBB377E1F2F28D8EC +:103AB00095F80080B8F1000F26D03046FFF7DEFD04 +:103AC000337821020246284641EAC331338A41EA6B +:103AD000080141EA076141EA0341334641F08001B0 +:103AE000FFF798FE00280ADD3378012B07D17269B1 +:103AF00013780133DBB21F2B88BF00231370BDE89E +:103B0000F0816FF00100FAE76FF00300F7E70000C3 +:103B1000F0B58BB004460D461746002128226846B2 +:103B20001E46FDF73FFF9DF84C30294620465A1EA1 +:103B3000534253416A468DF800309DF84030ADF84D +:103B40001030119B05939DF848308DF81830149B68 +:103B50000793BDF85430CDE90276ADF82030FFF779 +:103B60009BFF0BB0F0BD0000406A00B1043070470D +:103B7000436A1A68426202691A600361C38A013BA0 +:103B8000C38270472DE9F041D0F8208014461D46CD +:103B9000184E4146002709B9BDE8F081D1E902235A +:103BA000A21A65EB0303964277EB03031ED2036A66 +:103BB0008B420DD1FFF78CFD036A1B68036203691A +:103BC0000B60C38A0161013B016AC3828846E2E758 +:103BD000FFF77EFD0B68C8F8003003690B60C38AED +:103BE0000161013BC382D8F80010D4E78846096818 +:103BF000D1E700BF80841E002DE9F04F8BB00D4649 +:103C000014469B46DDF850908046002800F018814D +:103C1000B9F1000F00F01481531E3F2B00F2108108 +:103C2000012A03D1BBF1000F40F00A810023CDE946 +:103C30000833B8F81430B5EBC30F4FEAC30703D30A +:103C400000200BB0BDE8F08F2B199F42D8F80C3044 +:103C500036BF7F1B2746FFB21BB9D8F81030002BA8 +:103C60007AD0272D4DD8C5F1280600232946B74222 +:103C7000009308ABD8F808002CBFF6B23E46A7EB7D +:103C8000060A354432465FFA8AFAFFF73DFCB8F877 +:103C90001430282103F10053053BDB000493D8F8CE +:103CA0000C300393039B13B1BAF1000F2CD1D8F859 +:103CB000100040B1BAF1000F05D008AB5246691AA6 +:103CC0000096FFF721FC38B2002FB9D066070AD062 +:103CD0000AAB624203EBD40102F0070211F8083C80 +:103CE000134101F8083C082C3DD9102C40F2B58056 +:103CF000202C40F2B780BBF1000F00F09C8008231D +:103D000035E0BA460026C2E7049BE02B28BFE0233B +:103D100006930B44AB42059315D95A1B0398691AB5 +:103D20000096924508AB00F1040034BF5246D2B26F +:103D30000792FFF7E9FB079A1644AAEB020A15441B +:103D4000F6B25FFA8AFA049B069A05999B1A0493C5 +:103D5000039B1B680393A5E700933A4608AB2946EB +:103D6000D8F80800ADE7BBF1000F13D00123B4EB86 +:103D7000C30F6BD0082C12D89DF82030621E23FA96 +:103D800002F2D50706D54FF0FF3202FA04F42343BE +:103D90008DF820309DF8203089F8003051E7102C44 +:103DA00012D8BDF82030621E23FA02F2D10706D5E0 +:103DB0004FF0FF3202FA04F42343ADF82030BDF88F +:103DC0002030A9F800303CE7202C0FD80899631E5A +:103DD00021FA03F3DA0705D54FF0FF3202FA04F4B3 +:103DE0000C430894089BC9F800302AE7402C2AD0DD +:103DF000611EC4F12102A4F12103DDE9086526FA60 +:103E000001F105FA02F225FA03F311431943CB0736 +:103E100011D50122A4F12003C4F1200102FA03F319 +:103E200022FA01F1A2400B43524263EB43033243B7 +:103E30002B43CDE90823DDE90823C9E9002300E786 +:103E40006FF00100FDE66FF00800FAE6082CA1D93A +:103E5000102CB4D9202CEED8C4E7BBF1000FAED0A3 +:103E6000022384E7BBF1000FBCD004237FE70000EE +:103E7000012A30B5144638BF012485B00025402CF6 +:103E800028BF4024012ACDE9025518D81B788DF8A7 +:103E9000083063070AD004AB624203EBD40502F09A +:103EA000070215F8083C934005F8083C03460091CA +:103EB0002246002102A8FFF727FB05B030BD082AE3 +:103EC000E4D9102A03D81B88ADF80830E1E7202A8E +:103ED00095BF1B68D3E900230293CDE90223D8E7FD +:103EE00010B5CB681BB98B600B618B8210BD046968 +:103EF0001A681C600361C38A013BC382CA60F0E791 +:103F000003064CBFC0F3C0300220704708B502461C +:103F1000FFF7F6FF022806D15306C2F30F2001D1A6 +:103F200000F0030008BDC2F30740FBE72DE9F04FA6 +:103F300093B004460D46CDE903230A681046FFF707 +:103F4000DFFF0228824614BFC2F306260026002A9D +:103F500080F2F88112F0C04940F0F481097B002919 +:103F600000F0F081022803D02378B34240F0ED81C5 +:103F7000C2F3046310462944069302F07F030593BD +:103F8000FFF7C4FF059B002283464FEA83480023C6 +:103F900048EA0A4848EA4668CE78CDE90823F3099A +:103FA00048EA0008029368D0059B024608A920460B +:103FB000009353466768B847002800F0C981276A14 +:103FC0004FB9414604F10C00FFF700FB074690B9DA +:103FD0006FF0020055E03B6998450DD03F68002F17 +:103FE000F9D1414604F10C00FFF7F0FA074600282A +:103FF000EED0236A3B60276297F817C006F01F08CF +:10400000CCF3840CACEB0800A8EB0C031FFA80FE89 +:104010000028B8BF0EF120001FFA83FEB8BF00B21F +:10402000002B0793B8BF0EF12003D7E90221BCBFD4 +:104030001BB2079352EA010338D0039B4FF0000CE8 +:10404000DFF81CE39A1A049B63EB010196457CEBB5 +:1040500001032BD36B7B97F81AE0734519D1029BB0 +:10406000002B78D0012821DC7868F8B9DFF8ECC2A1 +:10407000944570EB010316D337E0276A27B96FF038 +:104080000C0013B0BDE8F08F3B699845B4D03F6891 +:10409000F4E7B24890427CEB010301D30020F0E743 +:1040A000029B002BFAD0079B0F2B17DCFA7DB30085 +:1040B0003946204602F0030203F07C031343FB75EC +:1040C000FFF706FB6B7BBB76029B3BB9FB7DC3F323 +:1040D0008402013262F38603FB75D0E76A7BBB7E04 +:1040E0009A42DBD1029B002B35D0B309022B32D090 +:1040F000039B142200210DA8BB60049BFB60FDF70D +:1041000051FC039B0AA920460A93049BADF83EB0DC +:104110000B932B1D8DF840A00C932B7B8DF84180C9 +:10412000013BDBB2ADF83C30069B8DF84230059B7D +:104130008DF8433094F82C3083F001038DF844302F +:10414000A3689847FB7DC3F38403013303F01F0387 +:104150009B02FB82A2E7FB7DC6F34012B2EBD31FAA +:1041600040F0F980C3F38403434540F0FB80029A9A +:10417000B6092B7B002A52D016F0010661D1032B21 +:1041800040F2F380039B394604F10C00BB60049BB2 +:10419000FB60FB8A66F30903AE1DFB8232462B7B74 +:1041A000033BDBB2FFF7A6FA00280CDA39462046BB +:1041B000FFF78EFAFB7DC3F38403013303F01F0383 +:1041C0009B02FB8204E7AB88DDE908843B834FF662 +:1041D000FF73C9F12000A9F1200228FA09F109F1C1 +:1041E000080904FA00F024FA02F2014318461143C8 +:1041F000C9B2FFF7C1F9B9F1400F0346E9D1B8825E +:1042000031462A7B033AD2B2FFF7C6F9FB7DB8826A +:10421000DA43C2F3C01262F3C713FB753EE786B9F7 +:104220002E1D013B394604F10C00DBB23246FFF78C +:1042300061FA0028BADB2A7B3146B88A013AD2B249 +:10424000E2E7F98A013BC1F30901DAB204295BD83C +:10425000281D002307F11B069A4208D910F801CB4C +:10426000013306F801C00131DBB20529F4D103990D +:1042700093420A9138BF043304992CBF002355FAA6 +:1042800083F30B9107F11B010C9179680E930D914B +:10429000291DFB8AADF83EB0C3F309038DF840A099 +:1042A0008DF841801A44069B8DF84230059BADF88D +:1042B0003C208DF8433094F82C3083F001038DF8C6 +:1042C00044300023B88A7B602A7B013AFFF764F907 +:1042D0003B8BB882834203D1A3680AA92046984742 +:1042E00020460AA9FFF7FCFDFB7DBA8AC3F38403CD +:1042F000013303F01F039B02FB823B8B9A420CBFEE +:1043000000206FF01000BCE67B68002BAFD00520CA +:1043100001E01C3033461E68002EFAD1091A2E1D0A +:10432000081D184401EB090C5FFA89F3BCF11B0F5F +:104330009DD89A429BD916F8013B09F1010900F872 +:10434000013BEFE76FF009009BE66FF00A0098E68B +:104350006FF00B0095E66FF00D0092E640420F0003 +:1043600080841E006FF00E008BE66FF00F0088E671 +:10437000EFF30983054968334A6B22F001024A636F +:1043800083F30988002383F31188704700EF00E06E +:10439000302080F3118862B60D4B0E4AD96821F4A3 +:1043A000E0610904090C0A430B49DA60D3F8FC20E8 +:1043B00042F08072C3F8FC20084AC2F8B01F1168AE +:1043C00041F0010111602022DA7783F82200704762 +:1043D00000ED00E00003FA0555CEACC5001000E08A +:1043E000302310B583F311880E4B5B6813F4006320 +:1043F00014D0F1EE103AEFF309844FF08073683C6B +:10440000E361094BDB6B236684F3098801F0F8F95B +:1044100010B1064BA36110BD054BFBE783F3118878 +:10442000F9E700BF00ED00E000EF00E03F04000806 +:104430004204000808B5074B074A196801F03D011E +:10444000996053680BB190689847BDE80840FFF742 +:10445000C7BF00BF00000240304F002008B5084B26 +:104460001968890901F03D018A019A60054AD368FB +:104470000BB110699847BDE80840FFF7B1BF00BF16 +:1044800000000240304F002008B5084B1968090CA5 +:1044900001F03D010A049A60054A53690BB1906925 +:1044A0009847BDE80840FFF79BBF00BF00000240EF +:1044B000304F002008B5084B1968890D01F03D0107 +:1044C0008A059A60054AD3690BB1106A9847BDE81E +:1044D0000840FFF785BF00BF00000240304F0020BA +:1044E00008B5074B074A596801F03D01D960536A86 +:1044F0000BB1906A9847BDE80840FFF771BF00BF55 +:1045000000000240304F002008B5084B5968890967 +:1045100001F03D018A01DA60054AD36A0BB1106BE4 +:104520009847BDE80840FFF75BBF00BF00000240AE +:10453000304F002008B5084B5968090C01F03D01C7 +:104540000A04DA60054A536B0BB1906B9847BDE8DB +:104550000840FFF745BF00BF00000240304F002079 +:1045600008B5084B5968890D01F03D018A05DA60EC +:10457000054AD36B0BB1106C9847BDE80840FFF7B4 +:104580002FBF00BF00000240304F002008B5074B8E +:10459000074A196801F03D019960536C0BB1906CAA +:1045A0009847BDE80840FFF71BBF00BF000402406A +:1045B000304F002008B5084B1968890901F03D010A +:1045C0008A019A60054AD36C0BB1106D9847BDE81B +:1045D0000840FFF705BF00BF00040240304F002035 +:1045E00008B5084B1968090C01F03D010A049A60EE +:1045F000054A536D0BB1906D9847BDE80840FFF731 +:10460000EFBE00BF00040240304F002008B5084B49 +:104610001968890D01F03D018A059A60054AD36D3C +:104620000BB1106E9847BDE80840FFF7D9BE00BF38 +:1046300000040240304F002008B5074B074A596874 +:1046400001F03D01D960536E0BB1906E9847BDE803 +:104650000840FFF7C5BE00BF00040240304F0020F5 +:1046600008B5084B5968890901F03D018A01DA60F3 +:10467000054AD36E0BB1106F9847BDE80840FFF7AD +:10468000AFBE00BF00040240304F002008B5084B09 +:104690005968090C01F03D010A04DA60054A536FBC +:1046A0000BB1906F9847BDE80840FFF799BE00BF77 +:1046B00000040240304F002008B5084B5968890DAE +:1046C00001F03D018A05DA60054AD36F13B1D2F8D3 +:1046D00080009847BDE80840FFF782BE0004024012 +:1046E000304F002000230C4910B51A460B4C0B60CC +:1046F00054F82300026001EB430004334260402B76 +:10470000F6D1074A4FF0FF339360D360C2F8083404 +:10471000C2F80C3410BD00BF304F002020800008CC +:10472000000002400F28F8B510D9102810D0112829 +:1047300011D0122808D10F240720DFF8B4E0012699 +:10474000DEF80050A04208D9002649E00446F4E70C +:104750000F240020F1E70724FBE706FA00F73D42AB +:1047600040D1214C4FEA001C3D4304EB00160EEBF8 +:10477000C000CEF80050C0E90123FBB24BB11B488A +:10478000836B43F001038363036E43F0010303660D +:10479000036E17F47F4F09D01448836B43F0020374 +:1047A0008363036E43F002030366036E54F80C0048 +:1047B000036823F01F030360056815F00105FBD1B2 +:1047C00004EB0C033D2493F80CC05F6804FA0CF46E +:1047D0003C6021240560446112B1987B00F056F9D9 +:1047E0003046F8BD0130ADE7208000080045025892 +:1047F000304F002010B5302484F31188FFF792FF6A +:10480000002383F3118810BD10B50446807B00F0AF +:1048100053F901231049627B03FA02F20B6823EA81 +:104820000203DAB20B604AB90C4A916B21F0010124 +:104830009163116E21F001011166126E13F47F4F26 +:1048400009D1064B9A6B22F002029A631A6E22F08B +:1048500002021A661B6E10BD304F00200045025840 +:1048600008B5302383F31188FFF7CEFF002383F3CD +:10487000118808BD026843681143016003B11847FD +:1048800070470000024A136843F0C003136070478A +:104890000078004013B50E4C204600F0B7FA04F142 +:1048A000140000234FF400720A49009400F074F9D8 +:1048B000094B4FF40072094904F13800009400F0EC +:1048C000EDF9074A074BC4E9172302B010BD00BF3A +:1048D000B44F0020205000208548000820520020BE +:1048E0000078004000E1F505037C30B5214C00293B +:1048F00018BF0C46012B0CD11F4B984209D11F4BFE +:104900009A6C42F080429A641A6F42F080421A67B1 +:104910001B6F2268036EC16D03EB52038466B3FB09 +:10492000F2F36268150442BF23F0070503F00703A2 +:1049300043EA4503CB60A36843F040034B60E36860 +:1049400043F001038B6042F4967343F001030B6064 +:104950004FF0FF330B62510505D512F0102205D040 +:10496000B2F1805F04D080F8643030BD7F23FAE775 +:104970003F23F8E720810008B44F0020004502588B +:104980002DE9F047C66D05463768F46921073462A2 +:104990001AD014F0080118BF4FF48071E20748BF25 +:1049A00041F02001A3074FF0300348BF41F0400120 +:1049B000600748BF41F0800183F31188281DFFF78D +:1049C00059FF002383F31188E2050AD5302383F3CE +:1049D00011884FF48061281DFFF74CFF002383F3FB +:1049E00011884FF030094FF0000A14F0200838D138 +:1049F0003B0616D54FF0300905F1380A200610D5D0 +:104A000089F31188504600F07DF9002836DA082134 +:104A1000281DFFF72FFF27F080033360002383F367 +:104A20001188790614D5620612D5302383F31188D4 +:104A3000D5E913239A4208D12B6C33B127F04007F4 +:104A40001021281DFFF716FF3760002383F311881C +:104A5000E30618D5AA6E1369ABB15069BDE8F047FB +:104A6000184789F31188736A284695F8641019402D +:104A700000F0E6F98AF31188F469B6E7B06288F3CA +:104A80001188F469BAE7BDE8F0870000090100F178 +:104A90006043012203F56143C9B283F8001300F0BB +:104AA0001F039A4043099B0003F1604303F56143F0 +:104AB000C3F880211A60704700F01F0301229A405A +:104AC000430900F160409B0000F5614003F1604341 +:104AD00003F56143C3F88020C3F88021002380F8E8 +:104AE00000337047F8B51546826804460B46AA4263 +:104AF00000D28568A1692669761AB5420BD218469C +:104B00002A46FCF729FFA3692B44A3612846A36822 +:104B10005B1BA360F8BD0CD9AF1B18463246FCF7EF +:104B20001BFF3A46E1683044FCF716FFE3683B445C +:104B3000EBE718462A46FCF70FFFE368E5E70000BD +:104B400083689342F7B50446154600D28568D4E9D8 +:104B50000460361AB5420BD22A46FCF7FDFE6369A3 +:104B60002B4463612846A3685B1BA36003B0F0BDC0 +:104B70000DD93246AF1B0191FCF7EEFE01993A4682 +:104B8000E0683144FCF7E8FEE3683B44E9E72A4685 +:104B9000FCF7E2FEE368E4E710B50A440024C361D1 +:104BA000029B8460C16002610362C0E90000C0E949 +:104BB000051110BD08B5D0E90532934201D18268D4 +:104BC00082B98268013282605A1C426119700021E8 +:104BD000D0E904329A4224BFC368436100F0C0FEAA +:104BE000002008BD4FF0FF30FBE7000070B5302318 +:104BF00004460E4683F31188A568A5B1A368A2698F +:104C0000013BA360531CA36115782269934224BF22 +:104C1000E368A361E3690BB120469847002383F35F +:104C20001188284607E03146204600F089FE00281A +:104C3000E2DA85F3118870BD2DE9F74F04460E4680 +:104C400017469846D0F81C904FF0300A8AF3118826 +:104C50004FF0000B154665B12A4631462046FFF756 +:104C600041FF034660B94146204600F069FE002836 +:104C7000F1D0002383F31188781B03B0BDE8F08FD7 +:104C8000B9F1000F03D001902046C847019B8BF378 +:104C90001188ED1A1E448AF31188DCE7C160C361F4 +:104CA000009B82600362C0E905111144C0E9000065 +:104CB00001617047F8B504460D461646302383F36C +:104CC0001188A768A7B1A368013BA36063695A1C58 +:104CD00062611D70D4E904329A4224BFE3686361C3 +:104CE000E3690BB120469847002080F3118807E064 +:104CF0003146204600F024FE0028E2DA87F31188CE +:104D0000F8BD0000D0E9052310B59A4201D18268B0 +:104D10007AB982680021013282605A1C82611C7853 +:104D200003699A4224BFC368836100F019FE2046DC +:104D300010BD4FF0FF30FBE72DE9F74F04460E465C +:104D400017469846D0F81C904FF0300A8AF3118825 +:104D50004FF0000B154665B12A4631462046FFF755 +:104D6000EFFE034660B94146204600F0E9FD002809 +:104D7000F1D0002383F31188781B03B0BDE8F08FD6 +:104D8000B9F1000F03D001902046C847019B8BF377 +:104D90001188ED1A1E448AF31188DCE70268436823 +:104DA0001143016003B11847704700001430FFF74A +:104DB00043BF00004FF0FF331430FFF73DBF00004A +:104DC0003830FFF7B9BF00004FF0FF333830FFF73E +:104DD000B3BF00001430FFF709BF00004FF0FF31F0 +:104DE0001430FFF703BF00003830FFF763BF000047 +:104DF0004FF0FF323830FFF75DBF0000012914BFCC +:104E00006FF0130000207047FFF744BD044B0360B0 +:104E100000234360C0E9023301230374704700BFDD +:104E20003881000810B53023044683F31188FFF75A +:104E30005BFD02230020237480F3118810BD000065 +:104E400038B5C36904460D461BB904210844FFF771 +:104E5000A5FF294604F11400FFF7ACFE002806DA8E +:104E6000201D4FF40061BDE83840FFF797BF38BD03 +:104E7000026843681143016003B11847704700009E +:104E800013B5406B00F58054D4F8A4381A68117833 +:104E9000042914D1017C022911D119790123128925 +:104EA0008B4013420BD101A94C3002F0F3F9D4F836 +:104EB000A4480246019B2179206800F0DFF902B086 +:104EC00010BD0000143002F075B900004FF0FF3340 +:104ED000143002F06FB900004C3002F047BA000005 +:104EE0004FF0FF334C3002F041BA0000143002F0B2 +:104EF00043B900004FF0FF31143002F03DB900001B +:104F00004C3002F013BA00004FF0FF324C3002F088 +:104F10000DBA00000020704710B500F58054D4F899 +:104F2000A4381A681178042917D1017C022914D1F8 +:104F30005979012352898B4013420ED1143002F06B +:104F4000D5F8024648B1D4F8A4484FF440736179CB +:104F50002068BDE8104000F07FB910BD406BFFF73E +:104F6000DBBF0000704700007FB5124B012504260F +:104F7000044603600023057400F18402436029465F +:104F8000C0E902330C4B0290143001934FF440738C +:104F9000009602F087F8094B04F69442294604F182 +:104FA0004C000294CDE900634FF4407302F04EF9D7 +:104FB00004B070BD608100085D4F0008814E00089C +:104FC0000A68302383F311880B790B3342F82300EE +:104FD0004B79133342F823008B7913B10B3342F82A +:104FE000230000F58053C3F8A418022303740020A3 +:104FF00080F311887047000038B5037F044613B171 +:1050000090F85430ABB90125201D0221FFF730FF85 +:1050100004F114006FF00101257700F0ADFC04F1FC +:105020004C0084F854506FF00101BDE8384000F0A6 +:10503000A3BC38BD10B5012104460430FFF718FFAA +:105040000023237784F8543010BD000038B504469F +:105050000025143002F03EF804F14C00257702F0F0 +:105060000DF9201D84F854500121FFF701FF20465F +:10507000BDE83840FFF750BF90F8803003F0600380 +:10508000202B06D190F881200023212A03D81F2A43 +:1050900006D800207047222AFBD1C0E91D3303E067 +:1050A000034A426707228267C3670120704700BF37 +:1050B0003C23002037B500F58055D5F8A4381A6890 +:1050C000117804291AD1017C022917D119790123F9 +:1050D00012898B40134211D100F14C04204602F09A +:1050E0008DF958B101A9204602F0D4F8D5F8A448AA +:1050F0000246019B2179206800F0C0F803B030BD62 +:1051000001F10B03F0B550F8236085B004460D465D +:10511000FEB1302383F3118804EB8507301D08218D +:10512000FFF7A6FEFB6806F14C005B691B681BB12C +:10513000019002F0BDF8019803A902F0ABF8024615 +:1051400048B1039B2946204600F098F8002383F3DA +:10515000118805B0F0BDFB685A691268002AF5D0C5 +:105160001B8A013B1340F1D104F18002EAE7000001 +:10517000133138B550F82140ECB1302383F3118856 +:1051800004F58053D3F8A4281368527903EB820303 +:10519000DB689B695D6845B104216018FFF768FE14 +:1051A000294604F1140001F0ABFF2046FFF7B4FEDE +:1051B000002383F3118838BD7047000001F07EBAE8 +:1051C00001234022002110B5044600F8303BFCF7D3 +:1051D000E9FB0023C4E9013310BD000010B5302302 +:1051E000044683F311882422416000210C30FCF72F +:1051F000D9FB204601F084FA02230020237080F3BB +:10520000118810BD70B500EB8103054650690E464C +:105210001446DA6018B110220021FCF7C3FBA06924 +:1052200018B110220021FCF7BDFB31462846BDE82D +:10523000704001F065BB000083682022002103F06C +:10524000011310B5044683601030FCF7ABFB204619 +:10525000BDE8104001F0E0BBF0B4012500EB810493 +:1052600047898D40E4683D43A4694581236000235C +:10527000A2606360F0BC01F0FDBB0000F0B401254A +:1052800000EB810407898D40E4683D436469058132 +:1052900023600023A2606360F0BC01F073BC0000D7 +:1052A00070B5022300250446242203702946C0F865 +:1052B00088500C3040F8045CFCF774FB204684F8FE +:1052C000705001F0B1FA63681B6823B1294620468B +:1052D000BDE87040184770BD0378052B10B5044633 +:1052E0000AD080F88C300523037043681B680BB12B +:1052F000042198470023A36010BD00000178052910 +:1053000006D190F88C20436802701B6803B11847DF +:105310007047000070B590F87030044613B1002358 +:1053200080F8703004F18002204601F099FB636838 +:105330009B68B3B994F8803013F0600535D0002134 +:10534000204601F08BFE0021204601F07BFE6368C1 +:105350001B6813B1062120469847062384F8703055 +:1053600070BD204698470028E4D0B4F88630A26F7C +:105370009A4288BFA36794F98030A56F002B4FF045 +:10538000300380F20381002D00F0F280092284F8BE +:10539000702083F3118800212046D4E91D23FFF7F4 +:1053A0006DFF002383F31188DAE794F8812003F07E +:1053B0007F0343EA022340F20232934200F0C580A9 +:1053C00021D8B3F5807F48D00DD8012B3FD0022BD8 +:1053D00000F09380002BB2D104F1880262670222B0 +:1053E000A267E367C1E7B3F5817F00F09B80B3F567 +:1053F000407FA4D194F88230012BA0D1B4F888303A +:1054000043F0020332E0B3F5006F4DD017D8B3F587 +:10541000A06F31D0A3F5C063012B90D863682046FC +:1054200094F882205E6894F88310B4F88430B04712 +:10543000002884D0436863670368A3671AE0B3F564 +:10544000106F36D040F6024293427FF478AF5C4B47 +:1054500063670223A3670023C3E794F88230012B1C +:105460007FF46DAFB4F8883023F00203A4F88830DD +:10547000C4E91D55E56778E7B4F88030B3F5A06F4F +:105480000ED194F88230204684F88A3001F02AFA4E +:1054900063681B6813B101212046984703232370DA +:1054A0000023C4E91D339CE704F18B0363670123E8 +:1054B000C3E72378042B10D1302383F311882046CF +:1054C000FFF7BAFE85F311880321636884F88B50D7 +:1054D00021701B680BB12046984794F88230002B4E +:1054E000DED084F88B300423237063681B68002BA4 +:1054F000D6D0022120469847D2E794F8843020463F +:105500001D0603F00F010AD501F09CFA012804D012 +:1055100002287FF414AF2B4B9AE72B4B98E701F04E +:1055200083FAF3E794F88230002B7FF408AF94F805 +:10553000843013F00F01B3D01A06204602D501F0D3 +:10554000A5FDADE701F096FDAAE794F88230002BA7 +:105550007FF4F5AE94F8843013F00F01A0D01B0651 +:10556000204602D501F07AFD9AE701F06BFD97E73E +:10557000142284F8702083F311882B462A4629468A +:105580002046FFF769FE85F31188E9E65DB1152233 +:1055900084F8702083F3118800212046D4E91D236C +:1055A000FFF75AFEFDE60B2284F8702083F3118882 +:1055B0002B462A4629462046FFF760FEE3E700BF58 +:1055C00090810008888100088C81000838B590F827 +:1055D00070300446002B3ED0063BDAB20F2A34D896 +:1055E0000F2B32D8DFE803F0373131082232313166 +:1055F0003131313131313737856FB0F886309D42E6 +:1056000014D2C3681B8AB5FBF3F203FB12556DB9C4 +:10561000302383F311882B462A462946FFF72EFEB6 +:1056200085F311880A2384F870300EE0142384F87F +:105630007030302383F31188002320461A46194620 +:10564000FFF70AFE002383F3118838BDC36F03B14F +:1056500098470023E7E70021204601F0FFFC0021E6 +:10566000204601F0EFFC63681B6813B10621204659 +:1056700098470623D7E7000010B590F8703004462D +:10568000142B29D017D8062B05D001D81BB110BD7B +:10569000093B022BFBD80021204601F0DFFC002152 +:1056A000204601F0CFFC63681B6813B10621204639 +:1056B0009847062319E0152BE9D10B2380F87030A9 +:1056C000302383F3118800231A461946FFF7D6FDCD +:1056D000002383F31188DAE7C3689B695B68002BBA +:1056E000D5D1C36F03B19847002384F87030CEE75B +:1056F00000238268037503691B6899689142FBD295 +:105700005A680360426010605860704700238268E6 +:10571000037503691B6899689142FBD85A68036056 +:10572000426010605860704708B50846302383F324 +:1057300011880A7D0023052A06D8DFE802F00B0550 +:105740000503120E826913604FF0FF338361FFF788 +:10575000CFFF002383F3118808BD8269936801336A +:105760009360D0E9003213605A60EDE7FFF7C0BFE5 +:10577000054BD96808751868026853601A600122E1 +:10578000D8600275FAF746BE205400200C4B30B5A5 +:10579000DD684B1C87B004460FD02B46094A68468B +:1057A00000F07EF92046FFF7E3FF009B13B1684647 +:1057B00000F080F9A86907B030BDFFF7D9FFF9E71D +:1057C000205400202957000838B50C4D044681614B +:1057D000EB6881689A68914203D8BDE83840FFF7CA +:1057E00087BF1846FFF792FF01230146EC60204671 +:1057F0002375BDE83840FAF70DBE00BF20540020E5 +:10580000044B1A68DB6890689B68984294BF00203C +:105810000120704720540020084B10B51C68D86840 +:10582000226853601A600122DC602275FFF76EFF68 +:1058300001462046BDE81040FAF7ECBD2054002098 +:1058400038B50123084C00252370656001F012FE75 +:1058500001F038FE0549064801F00CFF02232370D1 +:1058600085F3118838BD00BF885600209881000854 +:105870002054002008B572B6044B186500F022FDD4 +:1058800000F0E4FD024B03221A70FEE720540020D2 +:105890008856002000F044B9034A516853685B1AE7 +:1058A0009842FBD8704700BF001000E08B600223D5 +:1058B000086108468B8270478368A3F1840243F82D +:1058C000142C026943F8442C426943F8402C094ADD +:1058D00043F8242CC268A3F1200043F8182C0222BC +:1058E00003F80C2C002203F80B2C034A43F8102C6D +:1058F000704700BF2D0400082054002008B5FFF7B2 +:10590000DBFFBDE80840FFF731BF0000024BDB685A +:1059100098610F20FFF72CBF20540020302383F321 +:105920001188FFF7F3BF000008B50146302383F369 +:1059300011880820FFF72AFF002383F3118808BD90 +:10594000064BDB6839B1426818605A6013604360E7 +:105950000420FFF71BBF4FF0FF307047205400209A +:105960000368984206D01A68026050601846996130 +:10597000FFF7FCBE7047000038B504460D462068AE +:10598000844200D138BD036823605C608561FFF705 +:10599000EDFEF4E7036810B59C68A2420CD85C6881 +:1059A0008A600B604C602160596099688A1A9A601D +:1059B0004FF0FF33836010BD121B1B68ECE7000043 +:1059C0000A2938BF0A2170B504460D460A26601917 +:1059D00001F04AFD01F032FD041BA54203D8751CFD +:1059E00004462E46F3E70A2E04D90120BDE8704094 +:1059F00001F080BE70BD0000F8B5144B0D460A2AB8 +:105A00004FF00A07D96103F11001826038BF0A2202 +:105A1000416019691446016048601861A81801F0D6 +:105A200013FD01F00BFD431B0646A34206D37C1C6D +:105A300028192746354601F017FDF2E70A2F04D949 +:105A40000120BDE8F84001F055BEF8BD205400200B +:105A5000F8B506460D4601F0F1FC0F4A134653F81F +:105A6000107F9F4206D12A4601463046BDE8F840E5 +:105A7000FFF7C2BFD169BB68441A2C1928BF2C4656 +:105A8000A34202D92946FFF79BFF2246314603482D +:105A9000BDE8F840FFF77EBF2054002030540020BE +:105AA000C0E90323002310B45DF8044B4361FFF702 +:105AB000CFBF000010B5194C236998420DD0816802 +:105AC000D0E9003213605A609A680A449A60002351 +:105AD00003604FF0FF33A36110BD0268234643F813 +:105AE000102F53600022026022699A4203D1BDE860 +:105AF000104001F0B3BC936881680B44936001F0DF +:105B00009DFC2269E1699268441AA242E4D91144D9 +:105B1000BDE81040091AFFF753BF00BF2054002012 +:105B20002DE9F047DFF8BC8008F110072C4ED8F8BB +:105B3000105001F083FCD8F81C40AA68031B9A425D +:105B40003ED814444FF00009D5E90032C8F81C4093 +:105B500013605A60C5F80090D8F81030B34201D1F4 +:105B600001F07CFC89F31188D5E903312846984778 +:105B7000302383F311886B69002BD8D001F05EFCD1 +:105B80006A69A0EB040982464A450DD2022001F061 +:105B9000B1FD0022D8F81030B34208D15146284652 +:105BA000BDE8F047FFF728BF121A2244F2E712EBD4 +:105BB00009092946384638BF4A46FFF7EBFEB5E7E4 +:105BC000D8F81030B34208D01444C8F81C00211A89 +:105BD000A960BDE8F047FFF7F3BEBDE8F08700BF5E +:105BE000305400202054002038B501F027FC054A2D +:105BF000D2E90845031B181945F10001C2E9080163 +:105C000038BD00BF2054002000207047FEE7000090 +:105C1000704700004FF0FF307047000002290CD0A1 +:105C2000032904D00129074818BF00207047032A20 +:105C300005D8054800EBC2007047044870470020B3 +:105C4000704700BF708200084C23002024820008A7 +:105C500070B59AB005460846144601A900F0C2F88E +:105C600001A8FBF797FE431C0022C6B25B0010465A +:105C7000C5E9003423700323023404F8013C01AB6E +:105C8000D1B202348E4201D81AB070BD13F8011B94 +:105C9000013204F8010C04F8021CF1E708B53023C6 +:105CA00083F311880348FFF705FA002383F3118873 +:105CB00008BD00BF9056002090F8803003F01F020E +:105CC000012A07D190F881200B2A03D10023C0E9D3 +:105CD0001D3315E003F06003202B08D1B0F88430A9 +:105CE0002BB990F88120212A03D81F2A04D8FFF766 +:105CF000C3B9222AEBD0FAE7034A42670722826738 +:105D0000C3670120704700BF4323002007B5052962 +:105D100017D8DFE801F0191603191920302383F38F +:105D20001188104A01210190FFF76CFA01980221B5 +:105D30000D4AFFF767FA0D48FFF788F9002383F350 +:105D4000118803B05DF804FB302383F31188074802 +:105D5000FFF752F9F2E7302383F311880348FFF786 +:105D600069F9EBE7C4810008E8810008905600203B +:105D700038B50C4D0C4C2A460C4904F10800FFF7CD +:105D800067FF05F1CA0204F110000949FFF760FF3F +:105D900005F5CA7204F118000649BDE83840FFF75E +:105DA00057BF00BF686F00204C230020A48100086B +:105DB000AE810008B981000870B5044608460D465A +:105DC000FBF7E8FDC6B22046013403780BB918464C +:105DD00070BD32462946FBF7C9FD0028F3D10120EA +:105DE000F6E700002DE9F04705460C46FBF7D2FD2B +:105DF0002A49C6B22846FFF7DFFF08B10936F6B2D6 +:105E000027492846FFF7D8FF08B11036F6B2632EAF +:105E10000BD8DFF88880DFF88890224FDFF890A059 +:105E20002E7846B92670BDE8F08729462046BDE8A1 +:105E3000F04702F065B8252E2CD1072241462846AE +:105E4000FBF794FD60B9184B224603F1100153F89B +:105E5000040B8B4242F8040BF9D107351034DFE70D +:105E6000082249462846FBF781FD98B9A21C0F4B32 +:105E7000197802320909C95D02F8041C13F8011BE4 +:105E800001F00F015345C95D02F8031CF0D118342D +:105E90000835C5E7013504F8016BC1E790820008B9 +:105EA000B9810008988200081E7F000800E8F11FF1 +:105EB0000CE8F11FBFF34F8F044B1A695107FCD157 +:105EC000D3F810215207F8D1704700BF00200052CC +:105ED00008B50D4B1B78ABB9FFF7ECFF0B4BDA683D +:105EE000D10704D50A4A5A6002F188325A60D3F8C1 +:105EF0000C21D20706D5064AC3F8042102F18832E4 +:105F0000C3F8042108BD00BFC67100200020005264 +:105F10002301674508B5114B1B78F3B9104B1A697B +:105F2000510703D5DA6842F04002DA60D3F8102155 +:105F3000520705D5D3F80C2142F04002C3F80C21DA +:105F4000FFF7B8FF064BDA6842F00102DA60D3F8D7 +:105F50000C2142F00102C3F80C2108BDC6710020DB +:105F6000002000520F289ABF00F5806040040020F6 +:105F7000704700004FF40030704700001020704759 +:105F80000F2808B50BD8FFF7EDFF00F500330268C6 +:105F9000013204D104308342F9D1012008BD002030 +:105FA000FCE700000F2838B505463FD8FFF782FF11 +:105FB0001F4CFFF78DFF4FF0FF3307286361C4F8D4 +:105FC00014311DD82361FFF775FF030243F024034A +:105FD000E360E36843F08003E36023695A07FCD47D +:105FE0002846FFF767FFFFF7BDFF4FF4003100F0D1 +:105FF00009FA2846FFF78EFFBDE83840FFF7C0BF1B +:10600000C4F81031FFF756FFA0F108031B0243F05C +:106010002403C4F80C31D4F80C3143F08003C4F8E5 +:106020000C31D4F810315B07FBD4D9E7002038BD20 +:10603000002000522DE9F84F05460C46104645EA6F +:106040000203DE0602D00020BDE8F88F20F01F001A +:10605000DFF8BCB0DFF8BCA0FFF73AFF04EB0008A4 +:10606000444503D10120FFF755FFEDE720222946E3 +:10607000204601F013FF10B920352034F0E72B46FD +:1060800005F120021F68791CDDD104339A42F9D151 +:1060900005F178431B481C4EB3F5801F1B4B38BFDE +:1060A000184603F1F80332BFD946D1461E46FFF722 +:1060B00001FF0760A5EB040C336804F11C0143F0F9 +:1060C00002033360231FD9F8007017F00507FAD1D7 +:1060D00053F8042F8B424CF80320F4D1BFF34F8FB9 +:1060E000FFF7E8FE4FF0FF332022214603602846E9 +:1060F000336823F00203336001F0D0FE0028BBD0E8 +:106100003846B0E7142100520C20005214200052EF +:10611000102000521021005210B5084C237828B1ED +:106120001BB9FFF7D5FE0123237010BD002BFCD057 +:106130002070BDE81040FFF7EDBE00BFC671002023 +:106140002DE9F04F0D4685B0814658B111F00D068E +:1061500014BF2022082211F00803019304D0431E2B +:1061600003426AD0002435E0002E37D009F11F0128 +:1061700021F01F094FF00108324F05F00403DFF84A +:10618000D0A005EA080BBBF1000F32D07869C00738 +:106190002FD408F101080C37B8F1060FF3D19EB9DE +:1061A000294D4946A819019201F0AEF9044600288C +:1061B0003AD11836019A782EF3D1494601F0A4F964 +:1061C0000446002830D1019A4946204801F09CF944 +:1061D000044668BB204605B0BDE8F08F0029C9D150 +:1061E00001462846029201F08FF90446E0B9029A6E +:1061F000C0E713B178694107CBD5AC0702D5786900 +:106200008007C6D5019911B178690107C1D5182059 +:10621000494600FB08A0CDE9022301F075F90446C8 +:10622000DDE902230028B4D04A460021204601E0DF +:106230004A460021FBF7B6FBCCE70246002E95D17B +:1062400098E700BFAC820008F8710020C8710020F8 +:10625000E07100200121FFF773BF0000F8B5144D75 +:1062600001241827134E40F2FF3200210120FBF7D2 +:1062700099FB07FB046001342A6955F80C1F01F0F3 +:106280002FF9062CF5D137254FF4C0542046FFF7DF +:10629000E1FF014628B122460748BDE8F84001F079 +:1062A0001FB9C4EBC404013D4FEAD404EED1F8BDDC +:1062B000AC820008E0710020C871002008B101F034 +:1062C00095B9704738B5054D00240334696855F811 +:1062D0000C0B00F0A9F8122CF7D138BDAC820008E5 +:1062E00038B5EFF311859DB9EFF30584C4F30804C5 +:1062F000302334B183F31188FFF776FC85F31188DE +:1063000038BD83F31188FFF76FFC84F3118838BD23 +:10631000BDE83840FFF768BC10B5FFF7E1FF104C4F +:10632000C008104A002340EA4170C908A0FB04ECF1 +:10633000A0FB020E1CEB0000A1FB044CA1FB02120F +:106340005B41001943EB0C0011EB0E0142F100021E +:10635000411842F10000090941EA007010BD00BF78 +:10636000CFF753E3A59BC4200244074BD2B210B52C +:10637000904200D110BD441C00B253F8200041F8F7 +:10638000040BE0B2F4E700BF504000580E4B30B5AC +:106390001C6F240405D41C6F1C671C6F44F400445C +:1063A0001C670A4C02442368D2B243F48073236012 +:1063B000074B904200D130BD441C51F8045B00B241 +:1063C00043F82050E0B2F4E7004402580048025875 +:1063D0005040005807B5012201A90020FFF7C4FF73 +:1063E000019803B05DF804FB13B50446FFF7F2FF14 +:1063F000A04205D0012201A900200194FFF7C6FFA9 +:1064000002B010BD0144BFF34F8F064B884204D346 +:10641000BFF34F8FBFF36F8F7047C3F85C0220301C +:10642000F4E700BF00ED00E00144BFF34F8F064BDF +:10643000884204D3BFF34F8FBFF36F8F7047C3F809 +:1064400070022030F4E700BF00ED00E0704700006C +:10645000114BDA6952021ED59A69D00704D50F4A4A +:106460009A6002F144329A600B4BDA69D107FCD48E +:106470001A6A22F480021A629A6942F002029A6150 +:10648000DA69D207FCD49A6942F001029A61024AA1 +:10649000D369DB07FCD47047002000523B2A19085F +:1064A000074B45F255521A6002225A6040F6FF72BD +:1064B0009A604CF6CC421A600122024B1A70704767 +:1064C0000048005874720020034B1B781BB1034B2B +:1064D0004AF6AA221A6070477472002000480058D9 +:1064E000034B1A681AB9034AD2F8D0241A607047CD +:1064F0007072002000400258024B4FF48032C3F803 +:10650000D02470470040025808B5FFF7E9FF024B5E +:106510001868C0F3806008BD7072002070B5BFF3CA +:106520004F8FBFF36F8F1A4A0021C2F85012BFF38A +:106530004F8FBFF36F8F536943F400335361BFF341 +:106540004F8FBFF36F8FC2F88410BFF34F8FD2F815 +:10655000803043F6E074C3F3C900C3F34E335B01EC +:1065600003EA0406014646EA81750139C2F8605221 +:10657000F9D2203B13F1200FF2D1BFF34F8F5369B3 +:1065800043F480335361BFF34F8FBFF36F8F70BD00 +:1065900000ED00E0FEE70000214B2248224A70B5E2 +:1065A000904237D3214BC11EDA1C121A22F003028B +:1065B0008B4238BF00220021FBF7F4F91C4A00236C +:1065C000C2F88430BFF34F8FD2F8803043F6E074C6 +:1065D000C3F3C900C3F34E335B0103EA040601466B +:1065E00046EA81750139C2F86C52F9D2203B13F1A9 +:1065F000200FF2D1BFF34F8FBFF36F8FBFF34F8FD9 +:10660000BFF36F8F0023C2F85032BFF34F8FBFF339 +:106610006F8F70BD53F8041B40F8041BC0E700BF28 +:10662000DC8400086874002068740020687400200E +:1066300000ED00E0054B996B21EA000199631A6EA9 +:1066400022EA00021A661B6E704700BF004502581E +:1066500070B5D0E9244300224FF0FF359E6804EB6B +:1066600042135101D3F80009002805DAD3F80009D4 +:1066700040F08040C3F80009D3F8000B002805DA89 +:10668000D3F8000B40F08040C3F8000B01326318D0 +:106690009642C3F80859C3F8085BE0D24FF00113E3 +:1066A000C4F81C3870BD0000890141F0200101616F +:1066B00003699B06FCD41220FFF7EEB810B50A4C14 +:1066C0002046FEF77DFD094BC4F89030084BC4F816 +:1066D0009430084C2046FEF773FD074BC4F8903009 +:1066E000064BC4F8943010BD7872002000000840BA +:1066F000188300081473002000000440248300085D +:1067000070B503780546012B58D13F4BD0F8904027 +:10671000984254D13D4B0E2165209A6B42F00062A5 +:106720009A631A6E42F000621A661B6E384BD3F8F9 +:10673000802042F00062C3F88020D3F8802022F04D +:106740000062C3F88020D3F88030FEF79FF9314B08 +:10675000E360314BC4F800380023D5F89060C4F8EA +:10676000003EC02323604FF40413A3633369002B5E +:10677000FCDA01230C203361FFF78EF83369DB0765 +:10678000FCD41220FFF788F83369002BFCDA0026CE +:106790002846A660FFF75CFF6B68C4F81068DB68EA +:1067A000C4F81468C4F81C6863BB1C4BA3614FF0A9 +:1067B000FF336361A36843F00103A36070BD184B0E +:1067C0009842C9D1114B4FF080609A6B42F0007231 +:1067D0009A631A6E42F000721A661B6E0C4BD3F865 +:1067E000802042F00072C3F88020D3F8802022F08D +:1067F0000072C3F88020D3F88030FFF71BFF0E2112 +:106800004D20A2E7074BD1E77872002000450258DF +:10681000004402584014004003002002003C30C0F5 +:1068200014730020083C30C0F8B5D0F890400546FD +:1068300000214FF000662046FFF736FFD5F8941090 +:1068400000234FF001128F684FF0FF30C4F8343846 +:10685000C4F81C2804EB431201339F42C2F80069BC +:10686000C2F8006BC2F80809C2F8080BF2D20B6834 +:10687000D5F89020C5F8983063621023136116692B +:1068800016F01006FBD11220FFF706F8D4F80038F6 +:1068900023F4FE63C4F80038A36943F4402343F0B3 +:1068A0001003A3610923C4F81038C4F814380B4B43 +:1068B000EB604FF0C043C4F8103B094BC4F8003BF9 +:1068C000C4F81069C4F80039D5F8983003F1100203 +:1068D00043F48013C5F89820A362F8BDF482000841 +:1068E00040800010D0F8902090F88A10D2F800383C +:1068F00023F4FE6343EA0113C2F800387047000036 +:106900002DE9F84300EB8103D0F890500C46804607 +:10691000DA680FFA81F94801166806F00306731E5B +:10692000022B05EB41134FF0000194BFB604384E23 +:10693000C3F8101B4FF0010104F1100398BF06F1DA +:10694000805601FA03F3916998BF06F500460029C5 +:106950003AD0578A04F15801374349016F50D5F8AE +:106960001C180B430021C5F81C382B180127C3F84D +:106970001019A7405369611E9BB3138A928B9B0821 +:10698000012A88BF5343D8F89820981842EA034355 +:1069900001F140022146C8F89800284605EB820222 +:1069A0005360FFF781FE08EB8900C3681B8A43EA46 +:1069B000845348341E4364012E51D5F81C381F43BC +:1069C000C5F81C78BDE8F88305EB4917D7F8001B1C +:1069D00021F40041C7F8001BD5F81C1821EA030375 +:1069E000C0E704F13F030B4A2846214605EB830329 +:1069F0005A60FFF759FE05EB4910D0F8003923F42F +:106A00000043C0F80039D5F81C3823EA0707D7E758 +:106A10000080001000040002D0F894201268C0F832 +:106A20009820FFF715BE00005831D0F8903049018A +:106A30005B5813F4004004D013F4001F0CBF022075 +:106A4000012070474831D0F8903049015B5813F469 +:106A5000004004D013F4001F0CBF02200120704737 +:106A600000EB8101CB68196A0B6813604B685360B7 +:106A70007047000000EB810330B5DD68AA69136838 +:106A8000D36019B9402B84BF402313606B8A14680C +:106A9000D0F890201C4402EB4110013C09B2B4FB39 +:106AA000F3F46343033323F0030343EAC44343F0A3 +:106AB000C043C0F8103B2B6803F00303012B0ED139 +:106AC000D2F8083802EB411013F4807FD0F8003B75 +:106AD00014BF43F0805343F00053C0F8003B02EB77 +:106AE0004112D2F8003B43F00443C2F8003B30BDF2 +:106AF0002DE9F041D0F8906005460C4606EB4113B5 +:106B0000D3F8087B3A07C3F8087B08D5D6F81438C1 +:106B10001B0704D500EB8103DB685B689847FA0725 +:106B20001FD5D6F81438DB071BD505EB8403D968CD +:106B3000CCB98B69488A5A68B2FBF0F600FB162282 +:106B40008AB91868DA6890420DD2121AC3E9002493 +:106B5000302383F3118821462846FFF78BFF84F307 +:106B60001188BDE8F081012303FA04F26B8923EA5E +:106B700002036B81CB68002BF3D021462846BDE889 +:106B8000F041184700EB81034A0170B5DD68D0F889 +:106B900090306C692668E66056BB1A444FF40020BA +:106BA000C2F810092A6802F00302012A0AB20ED1C3 +:106BB000D3F8080803EB421410F4807FD4F80009DE +:106BC00014BF40F0805040F00050C4F8000903EBBF +:106BD0004212D2F8000940F00440C2F80009012234 +:106BE000D3F8340802FA01F10143C3F8341870BD38 +:106BF00019B9402E84BF4020206020681A442E8A94 +:106C00008419013CB4FBF6F440EAC44040F0005063 +:106C1000C6E700002DE9F843D0F8906005460C4621 +:106C20004F0106EB4113D3F8088918F0010FC3F8A0 +:106C300008891CD0D6F81038DB0718D500EB810383 +:106C4000D3F80CC0DCF81430D3F800E0DA689645CD +:106C500030D2A2EB0E024FF000091A60C3F8049084 +:106C6000302383F31188FFF78DFF89F3118818F023 +:106C7000800F1DD0D6F834380126A640334217D0F5 +:106C800005EB84030134D5F89050D3F80CC0E4B27E +:106C90002F44DCF8142005EB0434D2F800E05168EE +:106CA000714514D3D5F8343823EA0606C5F834689C +:106CB000BDE8F883012303FA01F2038923EA020302 +:106CC0000381DCF80830002BD1D09847CFE7AEEB3A +:106CD0000103BCF81000834228BF0346D7F8180907 +:106CE00080B2B3EB800FE3D89068A0F1040959F8A3 +:106CF000048FC4F80080A0EB09089844B8F1040F91 +:106D0000F5D818440B4490605360C8E72DE9F84F5C +:106D1000D0F8905004466E69AB691E4016F4805856 +:106D20006E6103D0BDE8F84FFEF7BABA002E12DA52 +:106D3000D5F8003E9B0705D0D5F8003E23F00303AD +:106D4000C5F8003ED5F80438204623F00103C5F805 +:106D50000438FEF7D3FA370505D52046FFF778FC4F +:106D60002046FEF7B9FAB0040CD5D5F8083813F070 +:106D7000060FEB6823F470530CBF43F4105343F435 +:106D8000A053EB6031071BD56368DB681BB9AB69A7 +:106D900023F00803AB612378052B0CD1D5F8003E16 +:106DA0009A0705D0D5F8003E23F00303C5F8003E4E +:106DB0002046FEF7A3FA6368DB680BB120469847CC +:106DC000F30200F1BA80B70226D5D4F890900027DC +:106DD0004FF0010A09EB4712D2F8003B03F44023BD +:106DE000B3F5802F11D1D2F8003B002B0DDA628968 +:106DF0000AFA07F322EA0303638104EB8703DB68E3 +:106E0000DB6813B13946204698470137D4F89430EF +:106E1000FFB29B689F42DDD9F00619D5D4F89000E7 +:106E2000026AC2F30A1702F00F0302F4F012B2F57D +:106E3000802F00F0CA80B2F5402F09D104EB830304 +:106E4000002200F58050DB681B6A974240F0B0805A +:106E50003003D5F8185835D5E90303D5002120466D +:106E6000FFF746FEAA0303D501212046FFF740FEA7 +:106E70006B0303D502212046FFF73AFE2F0303D50B +:106E800003212046FFF734FEE80203D50421204603 +:106E9000FFF72EFEA90203D505212046FFF728FEA5 +:106EA0006A0203D506212046FFF722FE2B0203D5F6 +:106EB00007212046FFF71CFEEF0103D508212046DD +:106EC000FFF716FE700340F1A780E90703D5002104 +:106ED0002046FFF79FFEAA0703D501212046FFF7B2 +:106EE00099FE6B0703D502212046FFF793FE2F077B +:106EF00003D503212046FFF78DFEEE0603D50421BE +:106F00002046FFF787FEA80603D505212046FFF798 +:106F100081FE690603D506212046FFF77BFE2A067F +:106F200003D507212046FFF775FEEB0574D52046F3 +:106F30000821BDE8F84FFFF76DBED4F890904FF0F0 +:106F4000000B4FF0010AD4F894305FFA8BF79B687E +:106F50009F423FF638AF09EB4713D3F8002902F4FC +:106F60004022B2F5802F20D1D3F80029002A1CDA64 +:106F7000D3F8002942F09042C3F80029D3F8002941 +:106F8000002AFBDB3946D4F89000FFF78DFB2289FD +:106F90000AFA07F322EA0303238104EB8703DB6881 +:106FA0009B6813B13946204698470BF1010BCAE79D +:106FB000910701D1D0F80080072A02F101029CBF9D +:106FC00003F8018B4FEA18283FE704EB830300F531 +:106FD0008050DA68D2F818C0DCF80820DCE9001C20 +:106FE000A1EB0C0C00218F4208D1DB689B699A68E9 +:106FF0003A449A605A683A445A6029E711F0030FFC +:1070000001D1D0F800808C4501F1010184BF02F864 +:10701000018B4FEA1828E6E7BDE8F88F08B503486A +:10702000FFF774FEBDE80840FDF7DAB9787200207A +:1070300008B50348FFF76AFEBDE80840FDF7D0B980 +:1070400014730020D0F8903003EB4111D1F8003BCD +:1070500043F40013C1F8003B70470000D0F89030B3 +:1070600003EB4111D1F8003943F40013C1F80039A2 +:1070700070470000D0F8903003EB4111D1F8003B8D +:1070800023F40013C1F8003B70470000D0F89030A3 +:1070900003EB4111D1F8003923F40013C1F8003992 +:1070A0007047000030B50433039C0172002104FBDB +:1070B0000325C160C0E90653049B0363059BC0E937 +:1070C0000000C0E90422C0E90842C0E90A11436394 +:1070D00030BD00000022416AC260C0E90411C0E96D +:1070E0000A226FF00101FEF747BC0000D0E904322C +:1070F000934201D1C2680AB9181D70470020704739 +:10710000036919600021C2680132C260C269134478 +:1071100082699342036124BF436A0361FEF720BC86 +:1071200038B504460D46E3683BB162690020131D83 +:107130001268A3621344E36207E0237A33B9294655 +:107140002046FEF7FDFB0028EDDA38BD6FF00100A8 +:10715000FBE70000C368C269013BC3604369134495 +:1071600082699342436124BF436A4361002383627F +:10717000036B03B11847704770B53023044683F39F +:107180001188866A3EB9FFF7CBFF054618B186F332 +:107190001188284670BDA36AE26A13F8015B934226 +:1071A000A36202D32046FFF7D5FF002383F31188A3 +:1071B000EFE700002DE9F84F04460E4617469846C3 +:1071C0004FF0300989F311880025AA46D4F828B079 +:1071D000BBF1000F09D141462046FFF7A1FF20B1C6 +:1071E0008BF311882846BDE8F88FD4E90A12A7EB83 +:1071F000050B521A934528BF9346BBF1400F1BD98C +:10720000334601F1400251F8040B914243F8040B5C +:10721000F9D1A36A403640354033A362D4E90A234A +:107220009A4202D32046FFF795FF8AF31188BD42A8 +:10723000D8D289F31188C9E730465A46FAF78CFB51 +:10724000A36A5E445D445B44A362E7E710B5029C19 +:107250000433017203FB0421C460C0E90613002358 +:10726000C0E90A33039B0363049BC0E90000C0E943 +:107270000422C0E90842436310BD0000026A6FF0B7 +:107280000101C260426AC0E904220022C0E90A2268 +:10729000FEF772BBD0E904239A4201D1C26822B939 +:1072A000184650F8043B0B60704700231846FAE775 +:1072B000C3680021C2690133C36043691344826912 +:1072C0009342436124BF436A4361FEF749BB000018 +:1072D00038B504460D46E3683BB1236900201A1D0A +:1072E000A262E2691344E36207E0237A33B92946D4 +:1072F0002046FEF725FB0028EDDA38BD6FF00100CF +:10730000FBE7000003691960C268013AC260C26904 +:10731000134482699342036124BF436A03610023DB +:107320008362036B03B118477047000070B53023C8 +:107330000D460446114683F31188866A2EB9FFF77D +:10734000C7FF10B186F3118870BDA36A1D70A36AD0 +:10735000E26A01339342A36204D3E169204604390F +:10736000FFF7D0FF002080F31188EDE72DE9F84FFB +:1073700004460D46904699464FF0300A8AF311882C +:107380000026B346A76A4FB949462046FFF7A0FF3B +:1073900020B187F311883046BDE8F88FD4E90A0799 +:1073A0003A1AA8EB0607974228BF1746402F1BD969 +:1073B00005F1400355F8042B9D4240F8042BF9D108 +:1073C000A36A40364033A362D4E90A239A4204D325 +:1073D000E16920460439FFF795FF8BF31188464594 +:1073E000D9D28AF31188CDE729463A46FAF7B4FA9A +:1073F000A36A3D443E443B44A362E5E7D0E904234D +:107400009A4217D1C3689BB1836A8BB1043B9B1A24 +:107410000ED01360C368013BC360C3691A4483691B +:107420009A42026124BF436A0361002383620123FD +:10743000184670470023FBE700F05CBA014B586A1E +:10744000704700BF000C0040034B002258631A61D4 +:107450000222DA60704700BF000C0040014B00229E +:10746000DA607047000C0040014B5863704700BF62 +:10747000000C0040024B034A1A60034A5A607047EE +:10748000C87300206874002000000220074B4942A6 +:1074900010B55C68201A08401968821A8A4203D322 +:1074A000A24201D85A6010BD0020FCE7C87300203A +:1074B00008B5302383F31188FFF7E8FF002383F337 +:1074C000118808BD04480121044B03600023C0E972 +:1074D00001330C3000F016B9D0730020B1740008ED +:1074E000CB1D083A23F00703591A521A012110B490 +:1074F000D2080024C0E9004384600C301C605A604C +:107500005DF8044B00F0FEB82DE9F84F364ECD1D66 +:107510000F46002818BF0646082A4FEAD50538BF8F +:10752000082206F10C08341D9146404600F006F989 +:1075300009F10701C9F1000E224624686CB94046E2 +:1075400000F006F93368CBB308224946E8009847B3 +:10755000044698B340E9026730E004EB010CD4F82C +:1075600004A00CEA0E0C0AF10100ACF1080304EBD4 +:10757000C0009842E0D9A0EB0C0CB5EBEC0F4FEA41 +:10758000EC0BD9D89C421CD204F10802AB45A3EB0A +:1075900002024FEAE202626009D9691CED432068E9 +:1075A00003EBC1025D44556043F8310022601C4684 +:1075B0005F60404644F8086B00F0CAF82046BDE81A +:1075C000F88FAA45216802D111602346EFE7013503 +:1075D00004EBC50344F8351003F10801401AC0104C +:1075E00058601360F1E700BFD0730020F8B550F881 +:1075F000043C044650F8085CA0F1080607332F1D30 +:107600000C35DB0840F8043C284600F097F83B4670 +:107610009F421A6801D0B34228D20AB1964225D2BD +:1076200044F8082C54F8042C1E60013254F8081C4D +:1076300006EBC200814206D14868024444F8042C9B +:107640000A6844F8082C5868411C03EBC1018E42BB +:1076500007D154F8042C013202445A6054F8082C23 +:107660001A602846BDE8F84000F072B81346CFE72C +:10767000FEE7000070B51B4B0025044686B058603D +:107680000E4685620163FCF783FE04F11003A560DA +:10769000E562C4E904334FF0FF33C4E90044C4E9B0 +:1076A0000635FFF7CBFE2B46024604F13401204697 +:1076B000C4E9082380230C4A2565FEF7F7F8012367 +:1076C0000A4AE06000920375684672680192B268E7 +:1076D000CDE90223064BCDE90435FEF70FF906B0DC +:1076E00070BD00BF88560020308300083583000835 +:1076F00071760008024AD36A1843D062704700BF0F +:1077000020540020C0E90000816070478368013B7D +:10771000002B10B583600CDA074BDC684368A0616E +:10772000206063601C6044600520FEF721F8A069BA +:1077300010BD0020FCE700BF2054002008B5302316 +:1077400083F31188FFF7E2FF002383F3118808BD5C +:1077500008B5302383F3118883680133002B8360DD +:1077600007DC036800211A68026050601846FEF7C3 +:107770002BF8002383F3118808BD00004B68436099 +:107780008B688360CB68C3600B6943614B6903629C +:107790008B6943620B6803607047000008B53C4B7F +:1077A00040F2FF713B48D3F888200A43C3F8882091 +:1077B000D3F8882022F4FF6222F00702C3F8882061 +:1077C000D3F88830344B1A6C0A431A649A6E0A4311 +:1077D0009A66324A9B6E1146FFF7D0FF00F5806033 +:1077E00002F11C01FFF7CAFF00F5806002F13801C9 +:1077F000FFF7C4FF00F5806002F15401FFF7BEFF00 +:1078000000F5806002F17001FFF7B8FF00F58060BD +:1078100002F18C01FFF7B2FF00F5806002F1A801D0 +:10782000FFF7ACFF00F5806002F1C401FFF7A6FF8F +:1078300000F5806002F1E001FFF7A0FF00F5806035 +:1078400002F1FC01FFF79AFF02F58C7100F58060F0 +:10785000FFF794FF00F010F9114BD3F8902242F09B +:107860000102C3F89022D3F8942242F00102C3F837 +:1078700094220522C3F898204FF06052C3F89C2050 +:10788000084AC3F8A020BDE80840FEF7E1BD00BFEC +:107890000044025800000258004502583C8300088A +:1078A00000ED00E01F00080308B500F0C3FAFDF783 +:1078B000C7FF0D4BDA6B42F04002DA635A6E22F0DA +:1078C00040025A665B6E094B1A6842F008021A6061 +:1078D0001A6842F004021A60FEF702FEFEF7BEFCD0 +:1078E000BDE80840FEF744BA0045025800180248B7 +:1078F000704700000E4B9A6C42F008029A641A6FAF +:1079000042F008021A670B4A1B6FD36B43F008035F +:10791000D363C722084B9A624FF0FF32DA6200222B +:107920009A615A63DA605A6001225A611A6070479C +:10793000004502580010005C000C0040094A08B5E0 +:107940001169D3680B40D9B29B076FEA010111613D +:1079500007D5302383F31188FDF79CFF002383F3C1 +:10796000118808BD000C0040044BDA6B0243DA6357 +:107970005A6E104358665B6E704700BF0045025850 +:1079800008B53C4B4FF0FF31D3F8802062F0004245 +:10799000C3F88020D3F8802002F00042C3F8802092 +:1079A000D3F88020D3F88420C3F88410D3F884203F +:1079B0000022C3F88420D3F88400D86F40F0FF4041 +:1079C00040F4FF0040F4DF4040F07F00D867D86FFC +:1079D00020F0FF4020F4FF0020F4DF4020F07F0083 +:1079E000D867D86FD3F888006FEA40506FEA5050DC +:1079F000C3F88800D3F88800C0F30A00C3F88800F1 +:107A0000D3F88800D3F89000C3F89010D3F8900012 +:107A1000C3F89020D3F89000D3F89400C3F89410E2 +:107A2000D3F89400C3F89420D3F89400D3F89800C6 +:107A3000C3F89810D3F89800C3F89820D3F89800AA +:107A4000D3F88C00C3F88C10D3F88C00C3F88C20CA +:107A5000D3F88C00D3F89C00C3F89C10D3F89C108A +:107A6000C3F89C20D3F89C30FCF73CFEBDE80840EE +:107A700000F0B4B90044025808B50122504BC3F8D5 +:107A80000821504B5A6D42F002025A65DA6F42F0FB +:107A90000202DA670422DB6F4B4BDA605A6891040A +:107AA000FCD54A4A1A6001229A60494ADA600022EB +:107AB0001A614FF440429A61434B9A699204FCD593 +:107AC0001A6842F480721A60424B1A6F12F4407FB7 +:107AD00004D04FF480321A6700221A671A6842F005 +:107AE00001021A603B4B1A685007FCD500221A614C +:107AF0001A6912F03802FBD1012119604FF0804160 +:107B000059605A67344ADA62344A1A611A6842F490 +:107B100080321A602F4B1A689103FCD51A6842F420 +:107B200080521A601A689204FCD52D4A2D499A6237 +:107B300000225A63196301F57C01DA6301F5E771EC +:107B400099635A64284A1A64284ADA621A6842F029 +:107B5000A8521A601F4B1A6802F02852B2F1285F2F +:107B6000F9D148229A614FF48862DA6140221A62A0 +:107B70001F4ADA641F4A1A651F4A5A651F4A9A65E6 +:107B800032231F4A1360136803F00F03022BFAD14C +:107B9000104A136943F003031361136903F03803B8 +:107BA000182BFAD14FF00050FFF7DEFE4FF0804067 +:107BB000FFF7DAFE4FF00040BDE80840FFF7D4BE03 +:107BC00000800051004502580048025800C000F0F3 +:107BD00004000001004402580000FF0100889008E2 +:107BE0003220600063020901470E0508DD0BBF016A +:107BF00020000020000001100910E0000001011029 +:107C0000002000524FF0B04208B5D2F8883003F09F +:107C10000103C2F8883023B1044A13680BB15068DD +:107C20009847BDE80840FCF7DBBB00BFE8730020C5 +:107C30004FF0B04208B5D2F8883003F00203C2F822 +:107C4000883023B1044A93680BB1D0689847BDE8E7 +:107C50000840FCF7C5BB00BFE87300204FF0B042FE +:107C600008B5D2F8883003F00403C2F8883023B195 +:107C7000044A13690BB150699847BDE80840FCF706 +:107C8000AFBB00BFE87300204FF0B04208B5D2F898 +:107C9000883003F00803C2F8883023B1044A93699E +:107CA0000BB1D0699847BDE80840FCF799BB00BF0D +:107CB000E87300204FF0B04208B5D2F8883003F0E6 +:107CC0001003C2F8883023B1044A136A0BB1506A1A +:107CD0009847BDE80840FCF783BB00BFE87300206D +:107CE0004FF0B04310B5D3F8884004F47872C3F86D +:107CF0008820A30604D5124A936A0BB1D06A98472C +:107D0000600604D50E4A136B0BB1506B98472106E1 +:107D100004D50B4A936B0BB1D06B9847E20504D5A1 +:107D2000074A136C0BB1506C9847A30504D5044A5D +:107D3000936C0BB1D06C9847BDE81040FCF750BB7A +:107D4000E87300204FF0B04310B5D3F8884004F436 +:107D50007C42C3F88820620504D5164A136D0BB126 +:107D6000506D9847230504D5124A936D0BB1D06D21 +:107D70009847E00404D50F4A136E0BB1506E984734 +:107D8000A10404D50B4A936E0BB1D06E98476204E0 +:107D900004D5084A136F0BB1506F9847230404D5DC +:107DA000044A936F0BB1D06F9847BDE81040FCF7C1 +:107DB00017BB00BFE873002008B50348FCF7E0FDDF +:107DC000BDE80840FCF70CBBB44F002008B5FFF736 +:107DD000B5FDBDE80840FCF703BB0000062108B56F +:107DE0000846FCF753FE06210720FCF74FFE06214C +:107DF0000820FCF74BFE06210920FCF747FE062170 +:107E00000A20FCF743FE06211720FCF73FFE06215F +:107E10002820FCF73BFE09217A20FCF737FE0721DA +:107E20003220FCF733FE0C215220BDE80840FCF75D +:107E30002DBE000008B5FFF7A3FD00F00DF8FCF71C +:107E4000E3FFFDF7BBF9FDF78DF8FFF751FDBDE846 +:107E50000840FFF7F1BA00000023054A1946013334 +:107E6000102BC2E9001102F10802F8D1704700BFDF +:107E7000E87300200B460146184600F001B80000E8 +:107E800010B5054C13462CB10A4601460220AFF34B +:107E9000008010BD2046FCE70000000010B501394D +:107EA0000244904201D1002005E0037811F8014F0F +:107EB000A34201D0181B10BD0130F2E72DE9F041BB +:107EC000A3B1C91A17780144044603F1FF3C8C4260 +:107ED000204601D9002009E00578BD4204F10104E3 +:107EE000F5D10CEB0405D618A54201D1BDE8F0810F +:107EF00015F8018D16F801EDF045F5D0E7E7000023 +:107F0000034611F8012B03F8012B002AF9D1704721 +:107F10006F72672E6172647570696C6F742E437531 +:107F2000626550696C6F742D43414E4D6F64000063 +:107F300053544D333248373F3F3F0053544D333253 +:107F4000483733782F3732780053544D333248371F +:107F500034332F3735332F373530000001105A00B6 +:107F600003105900012058000320560040A2E4F1FC +:107F7000646891060041A3E5F2656992070000007C +:107F800043414E464449666163653A204D657373CB +:107F90006167652052414D204F766572666C6F7740 +:107FA000210000004261642043414E4966616365DF +:107FB00020696E6465782E0000000000000000005B +:107FC000192B0008A52300086532000815240008B5 +:107FD000212400083928000899250008DD2300081D +:107FE000E1230008B9230008A1230008F5270008B1 +:107FF000C52300089D330008D1230008C9270008C5 +:1080000001040E05054B02020E05054B04010E0589 +:10801000054B05010B04044B080106030346000051 +:1080200010000240080002400008024000000B005F +:1080300028000240080002400408024006010C002B +:1080400040000240080002400808024010020D00F3 +:1080500058000240080002400C08024016030E00BF +:10806000700002400C0002401008024000040F00A3 +:10807000880002400C00024014080240060510006F +:10808000A00002400C000240180802401006110037 +:10809000B80002400C0002401C08024016072F00E6 +:1080A0001004024008040240200802400008380082 +:1080B000280402400804024024080240060939004E +:1080C000400402400804024028080240100A3A0016 +:1080D00058040240080402402C080240160B3B00E2 +:1080E000700402400C04024030080240000C3C00C6 +:1080F000880402400C04024034080240060D44008B +:10810000A00402400C04024038080240100E450052 +:10811000B80402400C0402403C080240160F46001E +:1081200000960000000000000000000000000000B9 +:10813000000000000000000000000000C94D000821 +:10814000B54D0008F14D0008DD4D0008E94D00086F +:10815000D54D0008C14D0008AD4D0008FD4D00088B +:1081600000000000E14E0008CD4E0008094F000855 +:10817000F54E0008014F0008ED4E0008D94E0008EA +:10818000C54E0008154F0008000000000100000067 +:108190000000000063300000948100087854002043 +:1081A000885600204172647550696C6F74002542D6 +:1081B0004F415244252D424C002553455249414CD4 +:1081C000250000000200000000000000015100082E +:1081D0007151000840004000386F0020486F0020B7 +:1081E000020000000000000003000000000000008A +:1081F000B95100080000000010000000586F002076 +:108200000000000001000000000000007872002063 +:10821000010102000D5D00081D5C0008B95C00084A +:108220009D5C0008430000002C8200080902430006 +:10823000020100C03209040000010202010005240D +:108240000010010524010001042402020524060097 +:1082500001070582030800FF09040100020A00006B +:1082600000070501024000000705810240000000F0 +:108270001200000078820008120110010200004084 +:10828000091241570002010203010000040309041E +:1082900025424F4152442500303132333435363790 +:1082A00038394142434445460000000000010020A7 +:1082B00000FF010002000000000000300000040088 +:1082C0000800000000000024000008000400000076 +:1082D0000004000000FC0000020000000000043068 +:1082E00000800000080000000000003800000100CD +:1082F000010000000000000015530008CD550008E3 +:108300007956000840004000B0730020B073002090 +:1083100001000000C0730020800000004001000048 +:10832000080000000001000000100000080000002C +:108330006D61696E0069646C650000000000802A50 +:1083400000000000AAAAAAAA00000024FFFF000063 +:108350000000000000A00A00000000000000000073 +:10836000AAAAAAAA00000000FFFF00000000000067 +:10837000000000000000000000000000AAAAAAAA55 +:1083800000000000FFFF00000000000000000000EF +:108390000A00000000000000AAAAAAAA000000002B +:1083A000FFFF0000990000000000000000800200B4 +:1083B00000000000AAAAAAAA00400100FFFF0000D6 +:1083C0000000007007000000000000000000000036 +:1083D000AAAAAAAA00000000FFFF000000000000F7 +:1083E000000000000500000000000000A5AAAAAAE5 +:1083F00000000000FCFF0000000000000000000082 +:108400000000000000000000AAAAAAAA00000000C4 +:10841000FFFF00000000000000000000000000005E +:1084200000000000AAAAAAAA00000000FFFF0000A6 +:10843000000000000000000000000000000000003C +:10844000AAAAAAAA00000000FFFF00000000000086 +:10845000000000000000000000000000AAAAAAAA74 +:1084600000000000FFFF000000000000000000000E +:1084700037040000000000000000180000000000A9 +:10848000FE2A0100D2040000FF00000090560020E8 +:10849000B44F002000000000307F0008830400007B +:1084A0003B7F000850040000497F00080096000050 +:1084B0000000080096000000000800000400000012 +:1084C0008C82000800000000000000000000000096 +:0C84D000000000000000000000000000A0 :00000001FF diff --git a/Tools/bootloaders/CubePilot-PPPGW_bl.bin b/Tools/bootloaders/CubePilot-PPPGW_bl.bin index 517887441d..7d19a35945 100755 Binary files a/Tools/bootloaders/CubePilot-PPPGW_bl.bin and b/Tools/bootloaders/CubePilot-PPPGW_bl.bin differ diff --git a/Tools/bootloaders/CubePurple_bl.bin b/Tools/bootloaders/CubePurple_bl.bin index 10a70fa490..ef7c565312 100755 Binary files a/Tools/bootloaders/CubePurple_bl.bin and b/Tools/bootloaders/CubePurple_bl.bin differ diff --git a/Tools/bootloaders/CubePurple_bl.hex b/Tools/bootloaders/CubePurple_bl.hex index 1c01087082..3c36448102 100644 --- a/Tools/bootloaders/CubePurple_bl.hex +++ b/Tools/bootloaders/CubePurple_bl.hex @@ -1,1019 +1,1009 @@ :020000040800F2 -:1000000000040020E10100081D0F0008210F000876 -:10001000750F0008210F0008490F0008E3010008D0 -:10002000E3010008E3010008E30100080D280008CF +:1000000000060020E1010008E3010008E301000808 +:10001000E3010008E3010008E3010008E301000830 +:10002000E3010008E3010008E301000801360008CD :10003000E3010008E3010008E3010008E301000810 :10004000E3010008E3010008E3010008E301000800 -:10005000E3010008E301000875390008A139000830 -:10006000CD390008F9390008253A0008E3010008F5 +:10005000E3010008E3010008B1380008D9380008BE +:10006000013900082939000851390008E301000866 :10007000E3010008E3010008E3010008E3010008D0 :10008000E3010008E3010008E3010008E3010008C0 -:10009000E3010008E3010008E3010008513A000809 +:10009000E3010008E3010008E301000879390008E2 :1000A000E3010008E3010008E3010008E3010008A0 :1000B000E3010008E3010008E3010008E301000890 :1000C000E3010008E3010008E3010008E301000880 -:1000D000E3010008E30100082511000839110008B8 -:1000E000B93A0008E3010008E3010008E301000851 +:1000D000E3010008E30100084D3A0008E3010008CD +:1000E000DD390008E3010008E3010008E30100082E :1000F000E3010008E3010008E3010008E301000850 -:10010000E3010008E301000885370008E301000867 +:10010000E3010008E3010008613A0008E301000888 :10011000E3010008E3010008E3010008E30100082F :10012000E3010008E3010008E3010008E30100081F :10013000E3010008E3010008E3010008E30100080F -:10014000E3010008E3010008E3010008F92E0008BC +:10014000E3010008E3010008E3010008A92D00080D :10015000E3010008E3010008E3010008E3010008EF :10016000E3010008E3010008E3010008E3010008DF :10017000E3010008E3010008E3010008E3010008CF -:10018000E3010008E30100084D110008E301000845 +:10018000E3010008E3010008E3010008E3010008BF :10019000E3010008E3010008E3010008E3010008AF :1001A000E3010008E3010008E3010008E30100089F :1001B000E3010008E3010008E3010008E30100088F :1001C000E3010008E3010008E3010008E30100087F :1001D000E3010008E3010008E3010008E30100086F -:1001E00002E000F000F8FEE772B6394880F30888B4 -:1001F000384880F3098838484EF60851CEF200019D -:10020000086040F20000CCF200004EF63471CEF2ED -:1002100000010860BFF34F8FBFF36F8F40F2000003 -:10022000C0F2F0004EF68851CEF200010860BFF334 -:100230004F8FBFF36F8F4FF00000E1EE100A4EF6C4 -:100240003C71CEF200010860062080F31488BFF3F1 -:100250006F8F02F019FB03F02BFA4FF055301F4956 -:100260001B4A91423CBF41F8040BFAE71C49194A6A -:1002700091423CBF41F8040BFAE71A491A4A1B4B5A -:100280009A423EBF51F8040B42F8040BF8E70020F5 -:100290001749184A91423CBF41F8040BFAE702F0B3 -:1002A000F7FA03F061FA144C144DAC4203DA54F837 -:1002B000041B8847F9E700F03FF8114C114DAC42A0 -:1002C00003DA54F8041B8847F9E702F0DFBA0000AC -:1002D000000400200024002000000008000000208E -:1002E00000040020603F0008002400202824002093 -:1002F00028240020903D0020E0010008E0010008D3 -:10030000E0010008E00100082DE9F04F2DED108A12 -:10031000C1F80CD0C3689D46BDEC108ABDE8F08FD3 -:10032000002383F311882846A047002001F0ECFE4B -:1003300001F09CFE00DFFEE770B5204C092300258C -:1003400023706FF03F061F236570A570E57025715F -:100350006571A571E57125726672A372E57200F090 -:10036000FFFC20B10F2325726672A372E57202F0C2 -:100370001FFA044602F044FA0546D8B9104B9C42D5 -:100380001AD001339C4218BF054641F2883404BF9D -:1003900001250024002002F015FA0DB100F0B6F896 -:1003A00000F062FD00F01AFC204600F00DF900F0AC -:1003B000ADF8F9E70024EDE70446EBE72824002038 -:1003C000010007B008B500F087FBA0F120035842F8 -:1003D000584108BD07B5054B02211B88ADF8043014 -:1003E00001A800F0E5FB03B05DF804FBA03B0008AA -:1003F000064991F8243033B100230822086A81F8B5 -:10040000243000F00DBC0120704700BF48240020BC -:100410002DE9F84F234C94F82430054688461746BA -:100420008BBB2E46DFF87C90002F38D094F824A0A8 -:10043000BAF1000F05D12022FF214846266200F0C4 -:1004400001FDCAF10805BD4228BF3D465FFA85FBA4 -:10045000AD0041462A4604EB8A0000F0C9FC94F83E -:100460002430A7EB0B079B445FFA8BFBBBF1080F13 -:100470002E44A844FFB284F824B0D5D1FFF7B8FFCA -:100480000028D1D108E0266A06EB8306B042C9D025 -:10049000FFF7AEFF0028C4D10020BDE8F88F01208F -:1004A000BDE8F88F4824002010B5202383F311887D -:1004B0001248C3680BB101F0ADFE0023104A0F488B -:1004C0004FF47A7101F06AFE002383F311880D4C1A -:1004D000236813B12368013B2360636813B1636829 -:1004E000013B6360084B1B7833B9636823B9022072 -:1004F00000F074FC3223636010BD00BF3424002080 -:10050000A9040008782500207024002010B5254B90 -:10051000254953F8042F013200D110BD8B42F8D188 -:10052000224C234B22689A423AD9224B9B6803F112 -:10053000006303F580439A4232D2002000F068FB4A -:100540001D4B0220187000F03FFC1C4B1A6C00225F -:100550001A64196E1A66196E596C5A64596E5A6685 -:100560005A6E5A6942F080025A615A6922F080023A -:100570005A615A691A6942F000521A611A6922F0E6 -:1005800000521A611B6972B60D4A0E4B13601B684C -:100590002268202181F311889D4683F30888104743 -:1005A00010BD00BFFC3F00081C40000804400008CC -:1005B000FF3F00082824002070240020003802405B -:1005C00008ED00E0004000082DE9F04F99B0B34C71 -:1005D00001902022FF2110A8A66800F033FCB04A49 -:1005E0001378A346A3B9AF480121C360117020233B -:1005F00083F31188C3680BB101F00CFE0023AA4AF3 -:10060000A8484FF47A7101F0C9FD002383F31188E3 -:10061000019B13B1A54B019A1A60A54AA349019FFA -:100620000292002313704B6099461C461D46984663 -:10063000012000F0C9FB002F00F012829B4B1B68C9 -:10064000002B40F00D8219B0BDE8F08F0220FFF7BB -:10065000B9FE002840F0FB81019BB9F1000F08BFF3 -:100660001F46944B1B88ADF82C3002210BA800F0DC -:100670009FFADDE74FF47A7000F02EFA031E039321 -:10068000EADB0220FFF79EFE82460028E4D0039BAF -:10069000581E042800F2DD81DFE800F0030E11147B -:1006A000170018A8052340F8343D042100F080FA13 -:1006B00054464FF0000856E004217848F6E704213C -:1006C0007D48F3E704217D48F0E71C24204600F034 -:1006D000A1FA04340B9004210BA800F069FA2C2C29 -:1006E000F4D1E5E7002DB7D0002CB5D00220FFF7FC -:1006F00069FE0546002800F0AF8101206C4C00F037 -:1007000087FA0220207000F05FFB4FF000095FFACB -:1007100089FA504600F08CFA074658B1504600F06E -:1007200097FA09F101090028F1D12C46A9460027C2 -:10073000634B97E701230220237000F03BFB3E460A -:10074000DBF808309E4206D2304600F063FA0130F2 -:10075000EBD10436F4E7029B00261E70534BA946EA -:100760005E602C46374600F075FB15B1002C18BFB3 -:100770000027FFF72FFE5BE7002D3FF46DAF002C45 -:100780003FF46AAF029B0220187000F01DFB32207C -:1007900000F0A2F9B0F1000AC0F25E811AF0030580 -:1007A00040F05A81DBF8082006EB0A03934200F27E -:1007B0005381BAF5807F00F24F8155450DDA4FF431 -:1007C0007A7000F089F90490049B002BC0F24481F8 -:1007D0003C4A049BAB540135EFE7C820FFF7F2FD1C -:1007E0000546002800F038811F2E11D8C6F12004DC -:1007F000544528BF544610AB26F003002246314929 -:10080000184400F0F5FA2246FF212E4800F01AFBAA -:100810004FEAAA0A5FFA8AF22A493046FFF7F8FD42 -:100820000446002800F01A8106EB8A0605469AE77E -:100830000220FFF7C7FD00283FF40EAFFFF7D8FDF9 -:1008400000283FF409AF4FF0000A5346DBF80820B8 -:1008500092451CD2BAF11F0F12D8109A01320FD054 -:100860002AF0030218A90A4452F8202C0B921846C9 -:1008700004220BA900F092FB0AF1040A0346E5E703 -:100880005046039300F0C6F9039B0B90EFE718A8BE -:10089000042140F84C3D00F08BF964E72824002047 -:1008A0007425002034240020A904000878250020A5 -:1008B00070240020A23B00082C24002030240020BB -:1008C000A43B00087424002018A8002340F8343DFD -:1008D000642100F039F900287FF4BEAE0220FFF752 -:1008E00071FD00283FF4B8AE0B9800F0C3F918ABC7 -:1008F00043F8480D04211846CDE718A8002340F816 -:10090000343D642100F020F900287FF4A5AE0220D8 -:10091000FFF758FD00283FF49FAE0B9800F0B8F9A0 -:1009200018AB43F8440DE5E70220FFF74BFD002824 -:100930003FF492AE00F0B2F918AB43F8400DD9E79E -:100940000220FFF73FFD00283FF486AE0BA91420DC -:1009500000F0AAF9824618A8042140F83CAD00F046 -:1009600027F951460BA896E7322000F0B5F8B0F110 -:10097000000AFFF671AE1AF0030F7FF46DAEDBF8DC -:1009800008200AEB080393423FF666AE0220FFF709 -:1009900019FD00283FF460AE2AF0030AC244D04596 -:1009A0003FF4E1AE404600F035F904210A900AA870 -:1009B00000F0FEF808F10408F1E74FF47A70FFF751 -:1009C00001FD00283FF448AEFFF712FD00283FF478 -:1009D000AFAE109B01330CD0082210A90020FFF706 -:1009E00017FD00283FF4A4AE2022FF2110A800F03C -:1009F00029FAFFF7EFFC374801F08CFB23E6002DC6 -:100A00003FF42AAE002C3FF427AE18A8002340F88C -:100A1000343D642100F098F8824600287FF41CAE33 -:100A20000220FFF7CFFC00283FF416AE0390FFF73B -:100A3000D1FC41F2883001F06DFB0B9800F04EFACA -:100A400000F008FA039B57461C461D46F0E5054694 -:100A500089E64FF00008FFE52546FDE52C4667E6F0 -:100A6000002000F039F80490049B002BFFF6E3AD62 -:100A7000012000F09FF9049B213B122B3FF6D8ADDB -:100A800001A252F823F000BF4D06000875060008C9 -:100A9000E5060008310600083106000831060008A6 -:100AA000790700086909000831080008C90800082A -:100AB000FB08000829090008310600084109000860 -:100AC00031060008BB090008670700083106000866 -:100AD000FF090008A08601002DE9F34702AE0024BB -:100AE0004FF47A7506F8014D144FDFF858804543EE -:100AF00097F900305A1C5FFA84F901D0A34212D151 -:100B000058F8240003680122D3F820A031462B4670 -:100B1000D047012807D10A4B9DF8070083F80090C1 -:100B200002B0BDE8F0870134042CE1D14FF4FA7033 -:100B300001F0F0FA4FF0FF30F2E700BF0024002090 -:100B400098250020F83B00082DE9F0474FF47A750E -:100B5000144FDFF8588006464D43002497F90030C3 -:100B60005A1C5FFA84F901D0A34210D158F824002E -:100B700003680422D3F820A031462B46D04704282E -:100B800005D1094B83F800900020BDE8F0870134BF -:100B9000042CE3D14FF4FA7001F0BCFA4FF0FF30AF -:100BA000BDE8F0870024002098250020F83B0008CD -:100BB00030B4074B1A78074B53F822402368DD699D -:100BC000054B0A46AC460146204630BC604700BF94 -:100BD00098250020F83B0008A086010070B501F0C0 -:100BE000E3FC094C094E20700025306823788342CD -:100BF00008D901F0D3FC336805440133B5F5804FC3 -:100C00003360F2D370BD00BF9925002080250020FD -:100C100001F080BD00F1006000F580400068704781 -:100C200000F10060920000F5804001F00BBD000073 -:100C3000054B1A68054B1B789B1A834202D9104456 -:100C400001F0ACBC002070478025002099250020D1 -:100C500038B5074D04462868204401F0A7FC28B9A0 -:100C600028682044BDE8384001F0B8BC38BD00BF5A -:100C70008025002010F0030308D1B0F5007F05D8CF -:100C800000F10050A0F50840006870470020704750 -:100C9000014BC058704700BF107AFF1F014B186806 -:100CA000704700BF002004E070B52A4B1C68C4F3F5 -:100CB0000B03240C63B140F21342934231D040F253 -:100CC000194293422FD040F2214293422DD1032367 -:100CD000214A0C2505FB03235D6893F9082042F2A5 -:100CE00001039C4224D0B4F5805F23D041F201037C -:100CF0009C4221D041F203039C421FD041F20703E2 -:100D00009C4208BF3122441E0C44013D0B46A342C5 -:100D10001ED215F9016F581C96B1034600F8016CFC -:100D2000F5E70123D4E70223D2E73F220B4DD6E7B4 -:100D30003322E3E74122E1E75A22E4E75922E2E7DE -:100D40002C2584421D7001D9981C5A70401A70BD20 -:100D50001846FBE7002004E0C83B0008A83B000859 -:100D6000124B5A8842F201018A4293B214D0B3F571 -:100D7000805F13D041F20102934211D041F203028D -:100D800093420FD041F2070293420DD10423084A47 -:100D900002EB8303D87870470023F8E70123F6E7D6 -:100DA0000223F4E70323F2E700207047002004E069 -:100DB000B43B0008022802BF024B4FF480529A61F4 -:100DC000704700BF00100240022802BF024B4FF0E4 -:100DD00080529A61704700BF00100240022801BF94 -:100DE000024A536983F480535361704700100240F4 -:100DF00010B50023934203D0CC5CC4540133F9E70F -:100E000010BD000030B5441E14F9010F0B4660B14F -:100E100093F90050854201F1010106D11AB993F905 -:100E20000020801A30BD013AEEE7002AF7D11046C3 -:100E300030BD000002460346981A13F9011B002931 -:100E4000FAD1704702440346934202D003F8011BD3 -:100E5000FAE77047024B1A78024B1A70704700BFCE -:100E60009825002000240020F8B5164C1648174D90 -:100E7000174E154F00F096FC2146134800F0BEFCBB -:100E800024681448626D936B23F40023936301F08C -:100E900041F92046104900F0BDFD626D936B43F4AB -:100EA000002393634FF4E1332B60002456F82400B1 -:100EB000B84202D0294600F0D3FB0134042CF5D10E -:100EC000F8BD00BFE03C00089433002084250020DA -:100ED000F83B000840420F000C3D000838B50B4BB2 -:100EE0001A780B4B53F822400A4B9C4205460CD013 -:100EF000094B002118461422FFF7A4FF05600146A4 -:100F00002046BDE8384000F0ABBB38BD9825002036 -:100F1000F83B00089433002084250020FEE7000001 -:100F200000B59BB0EFF3098168226846FFF760FFC8 -:100F3000EFF30583034B9A6B9A6A9A6A9A6A9A6AE4 -:100F40009B6AFEE700ED00E000B59BB0EFF309817E -:100F500068226846FFF74CFFEFF30583044B9A6B5A -:100F60009A6A9A6A9A6A9A6A9A6A9B6AFEE700BFC4 -:100F700000ED00E000B59BB0EFF309816822684600 -:100F8000FFF736FFEFF30583034B5A6B9A6A9A6AB1 -:100F90009A6A9A6A9B6AFEE700ED00E030B5084D58 -:100FA0000A4491420BD011F8013B09245840013CFE -:100FB000F7D040F300032B4083EA5000F7E730BD41 -:100FC0002083B8ED002304491A465A50C818083344 -:100FD000802B4260F9D170479C250020026843684D -:100FE0001143016003B1184770470000024AD368FB -:100FF00043F0C003D360704700440040024AD36806 -:1010000043F0C003D360704700480040024AD368F1 -:1010100043F0C003D3607047007800402DE9F041F1 -:10102000D0F85C64F7683368DA0505469CB20DD5E4 -:10103000202383F311884FF400710430FFF7CEFFB3 -:101040006FF480733360002383F31188202383F3CC -:10105000118805F1040814F02F0333D183F31188AC -:10106000380615D5210613D5202383F3118805F101 -:10107000380000F053FA002846DA0821281DFFF74F -:10108000ADFF4FF67F733B40F360002383F311887D -:101090007A060ED563060CD5202383F31188EA6CFB -:1010A0002B6D9A4202D12B6C002B2FD1002383F39E -:1010B0001188D5F86424D368002B31D01069BDE8BD -:1010C000F0411847230713D014F0080F0CBF00217C -:1010D0008021E00748BF41F02001A20748BF41F04E -:1010E0004001630748BF41F480714046FFF776FF37 -:1010F000A406736805D595F860142846194000F0D9 -:10110000BDFA3468A4B2A6E77060BEE727F04007D6 -:101110003F041021281D3F0CFFF760FFF760C5E773 -:10112000BDE8F08108B50348FFF778FFBDE8084047 -:1011300001F07CBB1C26002008B50348FFF76EFFBA -:10114000BDE8084001F072BB842A002008B50348BE -:10115000FFF764FFBDE8084001F068BBEC2E0020FB -:1011600010B50E4C0E4A2046002100F057FA0D4BE8 -:10117000C4F85C340C4C0D4A2046002100F04EFAB5 -:101180000B4BC4F85C340B4C0B4A0021204600F09A -:1011900045FA0A4BC4F85C3410BD00BF1C26002081 -:1011A000ED0F000800440040842A0020FD0F0008D5 -:1011B00000480040EC2E00200D1000080078004090 -:1011C00038B5394D037C002918BF0D46012B044664 -:1011D000C0F8645410D1354B984242D1344B1A6C4C -:1011E00042F400321A641A6E42F400321A661B6E20 -:1011F0000B21262000F06AF82E4BD4F85C249A428A -:101200002B6802D02C498A424BD12C4901EB530167 -:10121000B1FBF3F3A988080442BF23F0070003F0F1 -:10122000070343EA40039360EB8843F040039BB21B -:1012300013612B8943F001039BB2536141F40453C2 -:1012400043F02C03D36001F4A05100231360B1F5E7 -:10125000806F136853680CBF7F23FF2384F86034CA -:1012600038BD174B98420CD1114B1A6C42F48022B6 -:101270001A641A6E42F480221A661B6E0B21272014 -:10128000B8E7104B9842B7D1094B1A6C42F0804234 -:101290001A641A6E42F080421A661B6E0B215220AD -:1012A000A8E70949B2E700BF283C00081C26002037 -:1012B00000380240001001400014014000BD01054B -:1012C000842A0020EC2E002080DE800200F16043A2 -:1012D00000F01F02400903F5614309018000C9B213 -:1012E00000F1604083F8001300F561400123934052 -:1012F000C0F8803103607047F8B51546826806690A -:10130000AA420B46816938BF8568761AB542044601 -:1013100007D218462A46FFF76BFDA3692B44A36149 -:101320000DE011D932461846FFF762FDAF1B3A4671 -:10133000E1683044FFF75CFDE2683A44A261A368CB -:101340005B1BA3602846F8BD18462A46FFF750FDF0 -:10135000E368E4E783682DE9F041044693421546CB -:10136000266938BF85684069361AB5420F4606D2ED -:101370002A46FFF73DFD63692B4463610DE012D9F6 -:101380003246A5EB0608FFF733FD4246B919E0687F -:10139000FFF72EFDE26842446261A3685B1BA36015 -:1013A0002846BDE8F0812A46FFF722FDE368E4E71E -:1013B00010B50A440024C361029B00604060846051 -:1013C000C160816141610261036210BD08B582693B -:1013D0004369934201D1826882B982680132826096 -:1013E0005A1C42611970426903699A4201D3C36869 -:1013F0004361002100F0AAFE002008BD4FF0FF303D -:1014000008BD000070B5202304460E4683F3118802 -:10141000A568A5B1A368A269013BA360531CA361A1 -:1014200015782269934224BFE368A361E3690BB195 -:1014300020469847002383F31188284670BD314623 -:10144000204600F073FE0028E2DA85F3118870BDB3 -:101450002DE9F74F05460F4690469A46D0F81C9066 -:10146000202686F311884FF0000B144664B1224603 -:1014700039462846FFF740FF034668B951462846DB -:1014800000F054FE0028F1D0002383F31188A8EB6C -:10149000040003B0BDE8F08FB9F1000F03D0019054 -:1014A0002846C847019B8BF31188E41A1F4486F332 -:1014B0001188DBE7C16081614161C3611144009B18 -:1014C000006040608260016103627047F8B50446C5 -:1014D0000E461746202383F31188A568A5B1A3689B -:1014E000013BA36063695A1C62611E7023696269D3 -:1014F0009A4224BFE3686361E3690BB120469847D1 -:10150000002080F31188F8BD3946204600F00EFE19 -:101510000028E2DA85F31188F8BD0000836942698A -:101520009A4210B501D182687AB98268013282602C -:101530005A1C82611C7803699A4201D3C368836193 -:10154000002100F003FE204610BD4FF0FF3010BD1B -:101550002DE9F74F05460F4690469A46D0F81C9065 -:10156000202686F311884FF0000B144664B1224602 -:1015700039462846FFF7EEFE034668B9514628462D -:1015800000F0D4FD0028F1D0002383F31188A8EBEC -:10159000040003B0BDE8F08FB9F1000F03D0019053 -:1015A0002846C847019B8BF31188E41A1F4486F331 -:1015B0001188DBE7026843681143016003B11847F3 -:1015C000704700001430FFF743BF00004FF0FF33B7 -:1015D0001430FFF73DBF00003830FFF7B9BF0000FF -:1015E0004FF0FF333830FFF7B3BF00001430FFF780 -:1015F00009BF00004FF0FF311430FFF703BF0000B8 -:101600003830FFF763BF00004FF0FF323830FFF78C -:101610005DBF000000207047FFF7A2BD37B50F4B3C -:101620000360002343608360C360012304460374A6 -:10163000154600900B464FF4007200F15C01143027 -:10164000FFF7B6FE00942B464FF4007204F51771B5 -:1016500004F13800FFF72EFF03B030BD3C3C00081A -:1016600010B52023044683F31188FFF7A9FD022358 -:101670002374002383F3118810BD000038B5C369BB -:1016800004460D461BB904210844FFF793FF294681 -:1016900004F11400FFF79AFE002806DA201D4FF42B -:1016A0008061BDE83840FFF785BF38BD02684368F8 -:1016B0001143016003B118477047000013B5446B34 -:1016C000D4F894341A681178042915D1217C0229A0 -:1016D00012D11979128901238B4013420CD101A92F -:1016E00004F14C0001F058FED4F89444019B217998 -:1016F0000246206800F0DAF902B010BD143001F0A3 -:10170000DBBD00004FF0FF33143001F0D5BD000009 -:101710004C3001F0ADBE00004FF0FF334C3001F013 -:10172000A7BE0000143001F0A9BD00004FF0FF314A -:10173000143001F0A3BD00004C3001F079BE000070 -:101740004FF0FF324C3001F073BE0000D0F894240B -:1017500038B5136819780429054601D0012038BD31 -:10176000017C0229FAD112795C8901209040044061 -:10177000F4D105F1140001F03BFD02460028EDD044 -:10178000D5F894544FF480732868697900F07CF997 -:10179000204638BD406BFFF7D9BF000000207047DE -:1017A000704700007FB5124B0360002343608360E5 -:1017B000C360012502260F4B057404460290019375 -:1017C00000F18402294600964FF48073143001F032 -:1017D000EBFC094B0193029400964FF4807304F5DF -:1017E0002372294604F14C0001F0B2FD04B070BD33 -:1017F000643C000895170008BD1600080B682022FD -:1018000082F311880A7903EB820290614A790932E6 -:1018100043F822008A7912B103EB82039861022314 -:101820000374C0F89414002383F3118870470000F8 -:1018300038B5037F044613B190F85430ABB9201D7E -:1018400001250221FFF732FF04F1140025776FF024 -:10185000010100F087FC84F8545004F14C006FF053 -:101860000101BDE8384000F07DBC38BD10B5012154 -:1018700004460430FFF71AFF0023237784F854301E -:1018800010BD000038B504460025143001F0A4FC5A -:1018900004F14C00257701F073FD201D84F85450AD -:1018A0000121FFF703FF2046BDE83840FFF74EBF98 -:1018B00090F8443003F06003202B19D190F84520B4 -:1018C000212A0AD0222A4FF000030ED0202A0FD15D -:1018D000084A82630722C26304E0064B836307233E -:1018E000C36300230364012070478363C363F9E784 -:1018F0000020704701240020D0F8943437B51A68CE -:101900001178042904461AD1017C022917D11979CA -:10191000128901238B40134211D100F14C05284656 -:1019200001F0EEFD58B101A9284601F035FDD4F8CB -:101930009444019B21790246206800F0B7F803B077 -:1019400030BD000000EB8103F7B59C6905460E46EB -:10195000F4B1202383F3118805EB8607201D0821AD -:10196000FFF7A4FEFB685B691B684C3413B120468B -:1019700001F020FD01A9204601F00EFD024648B10C -:10198000019B3146284600F091F8002383F311882B -:1019900003B0F0BDFB685A691268002AF5D01B8AB3 -:1019A000013B1340F1D105F14402EAE7093138B5B2 -:1019B00050F82140DCB1202383F31188D4F894241B -:1019C0001368527903EB8203DB689B695D6845B15C -:1019D00004216018FFF76AFE294604F1140001F0A3 -:1019E00011FC2046FFF7B2FE002383F3118838BDB7 -:1019F0007047000000F0D2BF012303700023436052 -:101A0000C36183620362C3624362036303814381F0 -:101A10007047000038B50446202383F31188002561 -:101A20004160C56005614561856100F0C7FF022323 -:101A3000237085F3118838BD70B500EB810305462E -:101A40005069DA600E46144618B110220021FFF7E3 -:101A5000F9F9A06918B110220021FFF7F3F9314616 -:101A60002846BDE8704001F073B80000028902F01A -:101A700001020281428902F00102428100220261D8 -:101A80004261826101F0F8B8F0B400EB810447894B -:101A9000E4680125A4698D403D434581236000230E -:101AA000A2606360F0BC01F013B90000F0B400EB79 -:101AB00081040789E468012564698D403D430581FF -:101AC00023600023A2606360F0BC01F08DB90000C8 -:101AD00070B50223002504460370A0F84C5080F82E -:101AE0004E5080F84F5005814581C56005614561C4 -:101AF000856180F8345000F0C7FF63681B6823B12C -:101B000029462046BDE87040184770BD43680278FA -:101B10001B6880F85020052202700BB10421184781 -:101B200070470000436890F850201B6802700BB1AA -:101B3000052118477047000090F8343070B504460E -:101B400013B1002380F8343004F14402204601F040 -:101B5000B5F863689B6863BB94F8445015F0600661 -:101B600015D194F8453005F07F0545EA032540F28C -:101B700002339D4200F00E815BD8022D00F0DC8024 -:101B80003FD8002D00F08780012D00F0CF8000218C -:101B9000204601F0EBFA0021204601F0DDFA6368EF -:101BA0001B6813B1062120469847062384F8343079 -:101BB00070BD204698470028CED094F84B2094F86A -:101BC0004A3043EA0223E26B934238BFE36394F95D -:101BD0004430E56B002B4FF0200380F2FD80002D98 -:101BE00000F0EC80092284F8342083F3118800216E -:101BF000E36BA26B2046FFF759FF002383F31188A4 -:101C000070BDB5F5817F00F0B180B5F5407F49D05A -:101C1000B5F5807FBBD194F84630012BB7D1B4F82D -:101C20004C3023F00203A4F84C30A663E66326642C -:101C3000C3E740F201639D421ED8B5F5C06F3BD2A9 -:101C4000B5F5A06FA3D1B4F84430B3F5A06F0ED1B1 -:101C500094F8463084F84E30204600F06DFF6368FB -:101C60001B6813B1012120469847032323700023EA -:101C7000A363E3632364A0E7B5F5106F32D040F6A9 -:101C800002439D4252D0B5F5006F80D104F14F035D -:101C9000A363012324E004F14C03A3630223E36361 -:101CA00025648AE794F84630012B7FF470AFB4F8CE -:101CB0004C3043F00203B6E794F84920616894F889 -:101CC00048304D6894F8471043EA0223204694F8C0 -:101CD0004620A84700283FF45AAF4368A36303682F -:101CE000E363A4E72378042B10D1202383F3118826 -:101CF0002046FFF7BBFE86F31188636884F84F60C7 -:101D00001B68032121700BB12046984794F8463098 -:101D1000002BACD084F84F300423237063681B6819 -:101D2000002BA4D0022120469847A0E7374BA3639D -:101D30000223E36300239DE794F8481011F0800F1D -:101D4000204601F00F010ED000F0AAFF012806D0B6 -:101D500002287FF41CAF2E4BA363E06367E72D4B93 -:101D6000A363E56363E700F08DFFEFE794F8463087 -:101D7000002B7FF40CAF94F8483013F00F013FF4C0 -:101D800076AF1A06204602D501F004FA6FE701F09B -:101D9000F7F96CE794F84630002B7FF4F8AE94F82E -:101DA000483013F00F013FF462AF1B06204602D506 -:101DB00001F0DCF95BE701F0CFF958E7142284F871 -:101DC000342083F311882B462A4629462046FFF704 -:101DD0005BFE85F3118870BD5DB1152284F8342057 -:101DE00083F311880021E36BA26B2046FFF74CFEC2 -:101DF00003E70B2284F8342083F311882B462A460C -:101E000029462046FFF752FEE3E700BF943C000856 -:101E10008C3C0008903C000838B590F834300446FB -:101E2000152B29D8DFE803F03E28282828283E284B -:101E3000280B293928282828282828283E3E90F8C9 -:101E40004B1090F84A20C36B42EA01229A4214D9FF -:101E5000C268128AB3FBF2F502FB15356DB9202377 -:101E600083F311882B462A462946FFF71FFE85F388 -:101E700011880A2384F8343038BD142384F83430B0 -:101E8000202383F3118800231A4619462046FFF7C2 -:101E9000FBFD002383F3118838BD036C03B1984721 -:101EA0000023E7E7002101F061F90021204601F05D -:101EB00053F963681B6813B106212046984706232F -:101EC000D8E7000090F83420152A38B5044622D807 -:101ED0000123934040F6416213421DD113F4801553 -:101EE0000FD19B0217D50B2380F83430202383F3C6 -:101EF00011882B462A462946FFF7D8FD85F311881D -:101F000038BDC3689B695B682BB9036C03B1984704 -:101F1000002384F8343038BD002101F027F9002176 -:101F2000204601F019F963681B6813B106212046A9 -:101F300098470623EDE70000024B00221B605B6020 -:101F40009A60704754330020002303748268054B65 -:101F50001B6899689142FBD25A6803604260106026 -:101F6000586070475433002008B5202383F311884C -:101F7000037C032B05D0042B0DD02BB983F31188E0 -:101F800008BD436900221A604FF0FF334361FFF739 -:101F9000DBFF0023F2E790E80C001A600268536050 -:101FA000F2E70000002303748268054B1B68996800 -:101FB0009142FBD85A6803604260106058607047D5 -:101FC00054330020054B19690874186802681A60B8 -:101FD0005360186101230374FEF796B9543300204F -:101FE00030B54B1C87B005460A4C10D023690A4A0D -:101FF00001A800F0D3F82846FFF7E4FF049B13B1D3 -:1020000001A800F007F92369586907B030BDFFF750 -:10201000D9FFF8E754330020691F000838B50C4D8C -:1020200041612B6981689A689142044603D8BDE8F2 -:102030003840FFF789BF1846FFF786FF01232C6160 -:10204000014623742046BDE83840FEF75DB900BF65 -:1020500054330020044B1A681B6990689B689842AF -:1020600094BF0020012070475433002010B5084C65 -:10207000236820691A6822605460012223611A745F -:10208000FFF790FF01462069BDE81040FEF73CB91C -:10209000543300208260022202740022427470478E -:1020A0008368A3F17C0243F80C2C026943F83C2CB2 -:1020B000426943F8382C074A43F81C2CC26843F89D -:1020C000102C022203F8082C002203F8072CA3F19D -:1020D000180070472103000810B5202383F31188EE -:1020E000FFF7DEFF00210446FFF798FF002383F38C -:1020F0001188204610BD0000024B1B6958610F205B -:10210000FFF760BF54330020202383F31188FFF7CB -:10211000F3BF000008B50146202383F3118808208F -:10212000FFF75EFF002383F3118808BD49B1064B1A -:1021300042681B6918605A60136043600420FFF70F -:102140004FBF4FF0FF307047543300200368984270 -:1021500006D01A680260506059611846FFF7F4BE55 -:102160007047000038B504460D462068844200D10F -:1021700038BD036823605C604561FFF7E5FEF4E766 -:10218000054B03F114025A619A614FF0FF32DA6194 -:1021900000221A62704700BF54330020F8B5036173 -:1021A0001A4BC2605C6A1A4B1A46022952F8145F35 -:1021B00038BF0221954206461F460AD158619861F0 -:1021C0001C620560456081600819BDE8F84001F0B7 -:1021D000B9B9186AAB68241A0C1902D3E41A2D682D -:1021E00004E09C4202D2204401F0BCF9AB689C425E -:1021F000F4D86B68736035601E606E60B460A96867 -:102200004FF0FF33091BA960FB61F8BD000C0040D3 -:102210005433002010B41A4C234653F8141F814243 -:1022200010D0416802680A60026851609A424FF01B -:102230000001C16003D0936881680B4493605DF82E -:10224000044B70470A68626100209A425360C8607C -:1022500003D15DF8044B01F07FB9936888680344AB -:102260009360084A206A526A121A9342E7D9991A6F -:10227000012998BF931C18445DF8044B01F072B912 -:1022800054330020000C004000207047FEE700009F -:10229000704700004FF0FF3070470000022906D061 -:1022A000032906D00129064818BF002070470548B9 -:1022B0007047032A9ABF044800EBC2000020704711 -:1022C000683D00081C3D00080824002070B59AB045 -:1022D00001AD064608462946144600F095F8284602 -:1022E000FEF7A8FDC0B2431C5B0086E8180023700F -:1022F00003236370002302341946DAB2904204F1DA -:10230000020401D81AB070BDEA5C04F8022C04F88B -:10231000011C0133F1E7000008B5202383F3118885 -:102320000348FFF7E9FA002383F3118808BD00BFD3 -:102330009433002010B50446052916D8DFE801F0D3 -:1023400016150316161D202383F311880E4A01214A -:10235000FFF772FB20460D4A0221FFF76DFB0C4888 -:10236000FFF790FA002383F3118810BD202383F335 -:1023700011880748FFF75CFAF4E7202383F31188FC -:102380000348FFF773FAEDE7983C0008BC3C0008EF -:102390009433002038B50C4D0C4C0D492A4604F1FD -:1023A0000800FFF793FF05F1CA0204F11000094984 -:1023B000FFF78CFF05F5CA7204F118000649BDE865 -:1023C0003840FFF783BF00BF5C380020082400209E -:1023D000E83C0008F53C0008033D000870B50446E1 -:1023E00008460D46FEF726FDC6B2204601340378A6 -:1023F0000BB9184670BD32462946FEF703FD00288A -:10240000F3D1012070BD00002DE9F84F05460C46C0 -:10241000FEF710FD2B49C6B22846FFF7DFFF08B1D3 -:102420000336F6B228492846FFF7D8FF08B1103620 -:10243000F6B2632E0DD8DFF88C80DFF88C90234F36 -:10244000DFF890A0DFF890B02E7846B92670BDE88E -:10245000F88F29462046BDE8F84F01F099BB252E9C -:102460002CD1072241462846FEF7CCFC58B9DBF8B0 -:1024700000302360DBF804306360BBF80830238150 -:1024800007350A34E0E7082249462846FEF7BAFC39 -:10249000A0B90F4BA21C13F8011F09095345C95DD0 -:1024A00002F8021C197801F00F0102F10202C95D65 -:1024B00002F8031CEFD118340835C5E72670013542 -:1024C0000134C1E7883D0008033D00089B3D00083A -:1024D0000F7AFF1F1B7AFF1F903D0008BFF34F8F3D -:1024E000024AD368DB03FCD4704700BF003C0240C3 -:1024F00008B5094B1B7873B9FFF7F0FF074B1A6952 -:10250000002ABFBF064A5A6002F188325A601A6830 -:1025100022F480621A6008BDBA3A0020003C0240F2 -:102520002301674508B50B4B1B7893B9FFF7D6FF1E -:10253000094B1A6942F000421A611A6842F480524B -:102540001A601A6822F480521A601A6842F4806293 -:102550001A6008BDBA3A0020003C0240172870B546 -:1025600013D80B4A0B4C137863B90B4E4FF0006134 -:1025700044F8231056F823500133182B2944F7D17F -:102580000123137054F8200070BD002070BD00BFFF -:102590001C3B0020BC3A0020AC3D0008014B53F826 -:1025A00020007047AC3D000818207047172810B570 -:1025B000044601D9002010BDFFF7D0FF064B53F8A9 -:1025C00024301844C21A0BB9012010BD1268013220 -:1025D000F0D1043BF6E700BFAC3D0008172810B56A -:1025E000044629D8FFF77AFFFFF782FF1349F32348 -:1025F000CB600C23B0FBF3F203FB1200D30143EAE0 -:10260000C003DBB243F4007343F002030B610B69B8 -:1026100043F480330B61FFF761FF2046FFF79EFF15 -:10262000074B53F8241000F0DDF8FFF77BFF20463E -:10263000BDE81040FFF7BABF002010BD003C0240CB -:10264000AC3D00082DE9F84312F00103154640D1D6 -:102650008218B2F1026F3CD22C4B1B6813F00103BD -:1026600037D02B4CFFF744FFF323E360FFF736FF2F -:1026700040F20127032D01D9830713D0244C0F46C4 -:10268000401A40F20118EB1B0B44012B00EB07062C -:10269000236924D823F001032361FFF743FF0120BE -:1026A000BDE8F883236923F44073236123693B4326 -:1026B000236151F8046B0660BFF34F8FFFF70EFFE5 -:1026C00003689E4208D0236923F001032361FFF7CA -:1026D00029FF0020BDE8F883043D0430CAE723F455 -:1026E00040732361236943EA08032361B94637F83D -:1026F000023B3380BFF34F8FFFF7F0FE3688B9F807 -:102700000030B6B2B342BED0DDE700BF00380240B1 -:10271000003C0240084908B50B7828B153B9FFF7CF -:10272000E7FE01230B7008BD23B1BDE80840087027 -:10273000FFF7F8BE08BD00BFBA3A002010B502444A -:10274000064B0439D2B2904200D110BD441C00B2F5 -:1027500053F8200041F8040FE0B2F4E7502800409D -:10276000104B30B51C6F240407D41C6F44F4007464 -:102770001C671C6F44F400441C670B4C236843F433 -:10278000807323600244094B0439D2B2904200D1D5 -:1027900030BD441C00B251F8045F43F82050E0B251 -:1027A000F4E700BF003802400070004050280040AD -:1027B00007B5012201A90020FFF7C0FF019803B06F -:1027C0005DF804FB13B50446FFF7F2FFA04206D004 -:1027D00002A9012241F8044D0020FFF7C1FF02B019 -:1027E00010BD000070470000034B1B689B0042BFF8 -:1027F000024B01221A707047743802401D3B0020C2 -:10280000014B1878704700BF1D3B0020064A5368F3 -:1028100023F001035360EFF30983683383F30988DE -:10282000002383F31188704730EF00E010B52023B8 -:1028300083F31188104B5B6813F4006318D0F1EE3A -:10284000103AEFF309844FF0807344F84C3C0B4B83 -:10285000DB6844F8083CA4F1680383F30988FFF7B8 -:10286000F9FB18B1064B44F8503C10BD054BFAE794 -:1028700083F3118810BD00BF00ED00E030EF00E0F1 -:10288000310300083403000870470000FEE7000031 -:10289000084A094B09498B4204D3094A0021934253 -:1028A00005D3704752F8040F43F8040BF3E743F8DD -:1028B000041BF4E7843F0008903D0020903D002079 -:1028C000903D0020836D30B500229D68446D114617 -:1028D0004FF0FF3004EB421301329542C3F8001968 -:1028E000C3F81019C3F80809C3F8001BC3F8101B7C -:1028F000C3F8080BEED24FF00113C4F81C3830BDFA -:10290000890141F02001016103699B06FCD412207A -:1029100000F0B4BE204B03EB80022DE9F047D2F863 -:102920000CE05D6DDEF81420461CD2F800C005EB0B -:10293000063605EB4018516861450BD3D5F83428AD -:10294000012303FA00F022EA0000C5F83408184613 -:10295000BDE8F087BEF81040ACEB0103A34228BFEE -:102960002346D8F81849A4B2B3EB840F10D8946862 -:102970001F46A4F1040959F804AFC6F800A0042FBB -:1029800001D9043FF7E71C440B4494605360D2E73D -:102990000020BDE8F08700BF203B002010B5054CAB -:1029A0002046FFF729F84FF0A0436365024BA3656B -:1029B00010BD00BF203B0020303E00080378012BF3 -:1029C00070B5054650D12A4B446D98421BD1294B16 -:1029D0005A6B42F080025A635A6D42F080025A6587 -:1029E0005A6D5A6942F080025A615A6922F0800297 -:1029F0005A610E2143205B69FEF768FC1E4BE360C1 -:102A00001E4BC4F800380023C4F8003EC0232360E6 -:102A10006E6D4FF45023A3633369002BFCDA01235E -:102A200033610C2000F02AFE3369DB07FCD412204E -:102A300000F024FE3369002BFCDA0026A66028464D -:102A4000FFF740FF6B68C4F81068DB68C4F81468CF -:102A5000C4F81C684BB90A4BA3614FF0FF336361A4 -:102A6000A36843F00103A36070BD064BF4E700BF09 -:102A7000203B0020003802404014004003002002A8 -:102A8000003C30C0083C30C0F8B5446D054600211C -:102A90002046FFF735FFA96D00234FF001128F6824 -:102AA000C4F834384FF00066C4F81C284FF0FF30EB -:102AB00004EB431201339F42C2F80069C2F8006B75 -:102AC000C2F80809C2F8080BF2D20B686A6DEB6510 -:102AD000636210231361166916F01006FBD11220F1 -:102AE00000F0CCFDD4F8003823F4FE63C4F80038BD -:102AF000A36943F4402343F01003A3610923C4F8FE -:102B00001038C4F814380A4BEB604FF0C043C4F8D7 -:102B1000103B084BC4F8003BC4F81069C4F80039F6 -:102B2000EB6D03F1100243F48013EA65A362F8BD74 -:102B30000C3E000840800010426D90F84E10D2F814 -:102B4000003823F4FE6343EA0113C2F800387047EB -:102B50002DE9F0410EB200EB86080D46D8F80C10B6 -:102B60000F6807F00303022B50D0032B50D03D4ACF -:102B70003D4F012B18BF1746446D4FEA451E04EB2D -:102B80000E030022C3F8102B8A6905F1100C002AED -:102B900040D04A8A05F158035B013A43E2500123D1 -:102BA000D4F81C2803FA0CF31343A6444A69C4F86A -:102BB0001C380023CEF8103905F13F03002A39D024 -:102BC0000A8A898B9208012988BF4A43C16D04EBA8 -:102BD0008303561841EA0242C66529465A602046D8 -:102BE000FFF78EFED8F80C301B8A43EA85531F434B -:102BF00005F148035B01E7500123D4F81C2803FAD0 -:102C000005F51543C4F81C58BDE8F081174FB3E72C -:102C1000174FB1E704EB4613D3F8002B22F4004220 -:102C2000C3F8002BD4F81C28012303FA0CF322EA82 -:102C30000303BAE704EB83030E4A5A6004EB46161B -:102C400029462046FFF75CFED6F8003923F40043FE -:102C5000C6F80039D4F81C38012202FA05F523EA37 -:102C60000505CFE7008000100080041000800810E8 -:102C700000800C1000040002826D1268C265FFF72C -:102C800021BE00005831436D49015B5813F40040E8 -:102C900004D013F4001F14BF01200220704700006D -:102CA0004831436D49015B5813F4004004D013F4DC -:102CB000001F14BF012002207047000000EB8101BB -:102CC000CB68196A0B6813604B685360704700004B -:102CD00000EB810330B5DD68AA691368D36019B9C8 -:102CE000402B84BF402313606B8A1468426D1C44E0 -:102CF000013CB4FBF3F46343033323F0030302EB1F -:102D0000411043EAC44343F0C043C0F8103B2B6872 -:102D100003F00303012B09B20ED1D2F8083802EBFD -:102D2000411013F4807FD0F8003B14BF43F0805370 -:102D300043F00053C0F8003B02EB4112D2F8003BD5 -:102D400043F00443C2F8003B30BD00002DE9F041E0 -:102D5000244D6E6D06EB40130446D3F8087BC3F890 -:102D6000087B38070AD5D6F81438190706D505EBBD -:102D700084032146DB6828465B689847FA072FD50D -:102D8000D6F81438DB072BD505EB8403D968CCB90A -:102D90008B69488A5E68B6FBF0F200FB12628AB962 -:102DA0001868DA6890420DD2121A83E814002023C2 -:102DB00083F311880B482146FFF78AFF84F31188BB -:102DC000BDE8F081012303FA04F26B8923EA0203D0 -:102DD0006B81CB6823B121460248BDE8F04118471A -:102DE000BDE8F081203B002000EB810370B5DD6879 -:102DF000436D6C692668E6604A0156BB1A444FF47D -:102E00000020C2F810092A6802F00302012A0AB25F -:102E10000ED1D3F8080803EB421410F4807FD4F8E5 -:102E2000000914BF40F0805040F00050C4F8000981 -:102E300003EB4212D2F8000940F00440C2F8000946 -:102E4000D3F83408012202FA01F10143C3F834181F -:102E500070BD19B9402E84BF4020206020682E8AA2 -:102E6000841940F00050013C1A44B4FBF6F440EAE7 -:102E7000C440C6E7F8B504461E48456D05EB44134B -:102E8000D3F80869C3F80869F10717D5D5F81038E1 -:102E9000DA0713D500EB8403D9684B691F68DA6839 -:102EA000974218D2D21B00271A605F60202383F359 -:102EB00011882146FFF798FF87F31188330617D54D -:102EC000D5F834280123A340134211D02046BDE891 -:102ED000F840FFF71FBD012303FA04F2038923EA38 -:102EE000020303818B68002BE8D021469847E5E771 -:102EF000F8BD00BF203B002096482DE9F84F456DF6 -:102F00006E69AB691E4016F4805F6E61044605D0A1 -:102F1000FEF7DEFDBDE8F84FFFF788BC002E12DAA1 -:102F2000D5F8003E8B489B071EBFD5F8003E23F026 -:102F30000303C5F8003ED5F8043823F00103C5F8B3 -:102F40000438FEF7EFFD370502D58248FEF7DEFDB7 -:102F5000B0040CD5D5F8083813F0060FEB6823F44D -:102F600070530CBF43F4105343F4A053EB6031078C -:102F700004D56368DB680BB176489847F2025AD4EF -:102F8000B3020CD5D4F85480DFF8C8A100274FF065 -:102F90000109A36D9B68F9B28B4280F08780F70628 -:102FA00019D5616D0A6AC2F30A1702F00F0302F421 -:102FB000F012B2F5802F00F0A180B2F5402F0AD1B7 -:102FC00004EB830301F58051DB68186A00231A467D -:102FD0009F4240F087803003D5F8184813D5E103AD -:102FE00002D50020FFF7B2FEA20302D50120FFF7B1 -:102FF000ADFE630302D50220FFF7A8FE270302D52A -:103000000320FFF7A3FE750384D5E00702D5002057 -:10301000FFF730FFA10702D50120FFF72BFF620762 -:1030200002D50220FFF726FF23077FF573AF0320A9 -:10303000FFF720FF6EE7D4F85480DFF818A10027CF -:103040004FF00109A36D9B685FFA87FB5B4597D33F -:1030500008EB4B13D3F8002902F44022B2F5802F7D -:1030600022D1D3F80029002A1EDAD3F8002942F031 -:103070009042C3F80029D3F80029002AFBDB594607 -:10308000606DFFF73DFC228909FA0BF322EA030386 -:10309000238104EB8B03DB689B6813B159465046D0 -:1030A00098475846FFF736FC0137CBE708EB41124B -:1030B000D2F8003B03F44023B3F5802F10D1D2F8AF -:1030C000003B002B0CDA628909FA01F322EA0303C0 -:1030D000638104EB8103DB68DB680BB150469847E2 -:1030E000013756E79C0708BF0A68072B98BF027094 -:1030F00003F101039CBF120A013069E7023304EBBC -:10310000830201F58051526890690268D0F808C0C6 -:103110004068A2EB000E0022104697420AD104EB51 -:10312000830463689B699A683A449A605A681744B2 -:103130005F6050E712F0030F08BF0868964588BF2C -:103140008CF8000002F1010284BF000A0CF1010CAE -:10315000E3E700BF203B0020436D03EB4111D1F8B2 -:10316000003B43F40013C1F8003B7047436D03EB91 -:103170004111D1F8003943F40013C1F80039704708 -:10318000436D03EB4111D1F8003B23F40013C1F868 -:10319000003B7047436D03EB4111D1F8003923F434 -:1031A0000013C1F80039704730B5039C0172043335 -:1031B00004FB0325C361049B03630021059B00609E -:1031C0004060C16042610261856104624262816265 -:1031D000C162436330BD00000022416A4161016168 -:1031E000C2608262C2626FF00101FEF7BBBF0000E5 -:1031F00003694269934203D1C2680AB10020704753 -:10320000181D704703691960C2680132C260C26943 -:10321000134482690361934224BF436A036100211E -:10322000FEF794BF38B504460D46E3683BB16269CA -:10323000131D1268A3621344E362002038BD237A91 -:1032400033B929462046FEF771FF0028EDDA38BD74 -:103250006FF00100FBE70000C368C269013BC36077 -:103260004369134482694361934224BF436A4361C3 -:1032700000238362036B03B11847704770B52023A6 -:10328000044683F31188866A3EB9FFF7CBFF0546F3 -:1032900018B186F31188284670BDA36AE26A13F854 -:1032A000015BA362934202D32046FFF7D5FF0023C0 -:1032B00083F31188EFE700002DE9F84F04460E462E -:1032C00090469946202787F311880025AA46D4F80E -:1032D00028B0BBF1000F09D149462046FFF7A2FFF5 -:1032E00020B18BF311882846BDE8F88FA16AE36A04 -:1032F000A8EB050B5B1A9B4528BF9B46BBF1400F13 -:103300001BD9334601F1400251F8040B43F8040B7A -:103310009142F9D1A36A40334036A3624035A26A94 -:10332000E36A9A4202D32046FFF796FF8AF3118898 -:103330004545D8D287F31188C9E730465A46FDF78C -:1033400057FDA36A5B445E44A3625D44E7E7000067 -:1033500010B5029C0172043303FB0421C3610023F6 -:103360008362C362039B0363049B00604060C4608C -:1033700042610261816104624262436310BD0000E8 -:10338000026AC260426A4261026100228262C262D3 -:103390006FF00101FEF7E6BE436902699A4203D16C -:1033A000C2680AB100207047184650F8043B0B6011 -:1033B00070470000C368C2690133C36043691344A6 -:1033C00082694361934224BF436A43610021FEF74F -:1033D000BDBE000038B504460D46E3683BB1236925 -:1033E0001A1DA262E2691344E362002038BD237A09 -:1033F00033B929462046FEF799FE0028EDDA38BD9C -:103400006FF00100FBE7000003691960C268013A30 -:10341000C260C269134482690361934224BF436A54 -:10342000036100238362036B03B1184770470000F8 -:1034300070B5202304460E4683F31188856A35B99A -:103440001146FFF7C7FF10B185F3118870BDA36A5D -:103450001E70A36AE26A01339342A36204D3E16956 -:1034600020460439FFF7D0FF002080F3118870BD9B -:103470002DE9F84F04460D4691469A464FF0200834 -:1034800088F311880026B346A76A4FB951462046F3 -:10349000FFF7A0FF20B187F311883046BDE8F88F11 -:1034A000A06AE76AA9EB06033F1A9F4228BF1F469E -:1034B000402F1BD905F1400355F8042B40F8042B8D -:1034C0009D42F9D1A36A4033A3624036A26AE36AFF -:1034D0009A4204D3E16920460439FFF795FF8BF344 -:1034E00011884E45D9D288F31188CDE729463A464E -:1034F000FDF77EFCA36A3B443D44A3623E44E5E7FE -:10350000026943699A4203D1C3681BB918467047E0 -:103510000023FBE7836A002BF8D0043B9B1AF5D00D -:103520001360C368013BC360C3691A4483690261C5 -:103530009A4224BF436A0361002383620123E5E7C3 -:1035400000F034B9034B002258631A610222DA609A -:10355000704700BF000C0040014B0022DA6070474A -:10356000000C0040014B5863704700BF000C004046 -:10357000FEE7000010B5174CFEF7DEFCFEF700FE7C -:10358000802215492046FEF785FD012344F8180CDA -:103590000374124B124AD96821F4E0610904090C42 -:1035A0000A431049DA60CA6842F08072CA600E4964 -:1035B0000A6842F001020A601022DA77202283F8BA -:1035C0002220002383F3118862B60848BDE810402A -:1035D000FEF782BD7C3300203C3E000800ED00E099 -:1035E0000003FA05F0ED00E0001000E0443E0008A2 -:1035F0002DE9F84F1F4CDFF88090656904F114073E -:103600004FF00008D9F82430266AAA689E1B96421B -:103610001DD34FF0200AAA68236AD5F80CB01344D2 -:1036200023622B68BB425F60A6EB02066361C5F8AC -:103630000C8001D1FFF790FF88F311882869D847E3 -:103640008AF311886569AB689E42E4D2DAE7626961 -:10365000BA420CD0916823628E1B9660A86802283B -:103660002CBF1818981CBDE8F84FFFF77BBFBDE8CA -:10367000F88F00BF54330020000C0040034B596802 -:103680005A68521A9042FBD8704700BF001000E001 -:103690004B6843608B688360CB68C3600B69436190 -:1036A0004B6903628B6943620B68036070470000DB -:1036B00008B5224B22481A6940F2FF110A431A61E9 -:1036C0001A6922F4FF7222F001021A611A691A6B58 -:1036D0000A431A631A6D0A431A651A4A1B6D11468A -:1036E000FFF7D6FF184802F11C01FFF7D1FF17487A -:1036F00002F13801FFF7CCFF154802F15401FFF742 -:10370000C7FF144802F17001FFF7C2FF124802F12F -:103710008C01FFF7BDFF114802F1A801FFF7B8FFC8 -:103720000F4802F1C401FFF7B3FF0E4802F1E001B8 -:10373000FFF7AEFFBDE8084000F0A4B80038024033 -:1037400000000240643E00080004024000080240FD -:10375000000C024000100240001402400018024019 -:10376000001C02400020024008B500F0FFF9FFF7FE -:1037700001FFFFF739F8BDE80840FEF70BBE000077 -:1037800070470000084B1A69920710B508D500244D -:103790001C61202383F31188FFF72AFF84F311882B -:1037A000BDE81040FFF742B8000C0040104B1A6C07 -:1037B00042F008021A641A6E42F008021A660D4AB4 -:1037C0001B6E936843F0080393600B4B53229A627D -:1037D0004FF0FF32DA6200229A615A63DA605A606F -:1037E00001225A6108211A603220FDF76FBD00BF27 -:1037F00000380240002004E0000C00401F4B1A6912 -:103800006FEAC2526FEAD2521A611A69C2F3080211 -:103810001A614FF0FF301A695A69586100215A69DC -:1038200059615A691A6A62F080521A621A6A02F081 -:1038300080521A621A6A5A6A58625A6A59625A6AF5 -:103840001A6C42F080521A641A6E42F080521A6664 -:103850001A6E0B4A106840F480701060186F00F404 -:103860004070B0F5007F1EBF4FF4803018671967B5 -:10387000536823F40073536000F058B900380240D5 -:1038800000700040324B4FF080521A64314A4FF4BE -:10389000404111601A6842F001021A601A689207EA -:1038A000FCD59A6822F003029A60294B19469A685F -:1038B00012F00C02FBD1186800F0F90018609A6051 -:1038C0001A6842F480321A600B689B03FCD54B6F78 -:1038D00043F001034B671E4B5A6F9007FCD51E4AFD -:1038E0005A601A6842F080721A601A4A5368590482 -:1038F000FCD5174B1A689201FCD5184A9A6003222E -:10390000C3F88C20164B1A68164B9A42164B1BD1E3 -:10391000164A1168164A914216D140F205121A60F1 -:103920000B4B9A6842F002029A609A6802F00C020D -:10393000082AFAD15A6C42F480425A645A6E42F410 -:1039400080425A665B6E704740F20572E7E700BF3F -:103950000038024000700040185440070094883836 -:10396000002004E011640020003C024000ED00E073 -:1039700041C20F41084A08B5536911680B4003F072 -:103980000103536123B1054A13680BB1506898478E -:10399000BDE80840FEF74ABF003C01409C250020DE -:1039A000084A08B5536911680B4003F002035361DC -:1039B00023B1054A93680BB1D0689847BDE8084029 -:1039C000FEF734BF003C01409C250020084A08B5A2 -:1039D000536911680B4003F00403536123B1054A96 -:1039E00013690BB150699847BDE80840FEF71EBF48 -:1039F000003C01409C250020084A08B55369116825 -:103A00000B4003F00803536123B1054A93690BB1DE -:103A1000D0699847BDE80840FEF708BF003C014068 -:103A20009C250020084A08B5536911680B4003F033 -:103A30001003536123B1054A136A0BB1506A9847CA -:103A4000BDE80840FEF7F2BE003C01409C25002086 -:103A5000174B10B55C691A68144004F478725A6107 -:103A6000A30604D5134A936A0BB1D06A984760063F -:103A700004D5104A136B0BB1506B9847210604D53F -:103A80000C4A936B0BB1D06B9847E20504D5094AF9 -:103A9000136C0BB1506C9847A30504D5054A936C81 -:103AA0000BB1D06C9847BDE81040FEF7BFBE00BF19 -:103AB000003C01409C2500201A4B10B55C691A6837 -:103AC000144004F47C425A61620504D5164A136D11 -:103AD0000BB1506D9847230504D5134A936D0BB174 -:103AE000D06D9847E00404D50F4A136E0BB1506EA9 -:103AF0009847A10404D50C4A936E0BB1D06E984739 -:103B0000620404D5084A136F0BB1506F9847230421 -:103B100004D5054A936F0BB1D06F9847BDE81040AC -:103B2000FEF784BE003C01409C250020062108B51C -:103B30000846FDF7CBFB06210720FDF7C7FB062152 -:103B40000820FDF7C3FB06210920FDF7BFFB062176 -:103B50000A20FDF7BBFB06211720FDF7B7FB062166 -:103B60002820BDE80840FDF7B1BB000008B5FFF70D -:103B700045FEFDF727FAFDF74FFDFDF73BFFFDF78B -:103B80000FFEFFF7FDFDBDE80840FFF7D9BC0000C0 -:103B9000034611F8012B03F8012B002AF9D17047D5 -:103BA000121012131211000053544D3332463F3F8E -:103BB0003F000000012033000010410101105A01B4 -:103BC000031059010710310100000000A83B000854 -:103BD0003F00000013040000083C00083F00000004 -:103BE00019040000123C00083F00000021040000FE -:103BF0001C3C00083F000000943300201C260020DD -:103C0000842A0020EC2E002053544D3332463430A9 -:103C1000780053544D3332463432780053544D3388 -:103C20003246343436585800009600000000000038 -:103C30000000000000000000000000000000000084 -:103C4000E1150008CD15000809160008F515000853 -:103C500001160008ED150008D9150008C515000863 -:103C600015160008000000001917000805170008C5 -:103C7000411700082D1700083917000825170008FC -:103C800011170008FD1600089D170008000000002D -:103C90000100000000000000020000000000000021 -:103CA00045190008AD190008400040002C380020DC -:103CB0003C3800200200000000000000030000006B -:103CC00000000000F11900080000000010000000D2 -:103CD0004C3800200000000001000000000000003F -:103CE000203B0020010102004865782F50726F666A -:103CF00069434E430043756265507572706C652D63 -:103D0000424C002553455249414C250035230008BB -:103D10009D220008B1180008192300084300000084 -:103D2000243D000809024300020100C032090400DA -:103D30000001020201000524001001052401000118 -:103D4000042402020524060001070582030800FF7F -:103D500009040100020A00000007050102400000FA -:103D6000070581024000000012000000703D0008BD -:103D70001201100102000040AE2D051000020102E8 -:103D8000030100000403090425424F415244250069 -:103D900043756265507572706C6500303132333432 -:103DA000353637383941424344454600004000002B -:103DB0000040000000400000004000000000010042 -:103DC00000000200000002000000020000000200EB -:103DD000000002000000020000000200004000009D -:103DE0000040000000400000004000000000010012 -:103DF00000000200000002000000020000000200BB -:103E000000000200000002000000020000000000AC -:103E1000391B0008191E0008C51E0008400040009C -:103E2000803B0020803B002001000000903B0020F0 -:103E30008000000040010000030000006D61696E19 -:103E4000000000005C3E0008983B0020903D0020F0 -:103E500001000000713500080000000069646C6515 -:103E6000000000000500802A00020000AAAAAAAAF9 -:103E70000A000000FCFF00000000000000A00A0093 -:103E80000004050000000000AAAAAAAA00080A006F -:103E9000DFFC0000000000000000000014000054DF -:103EA00000000000AAAAAAAA14000054FFFF000004 -:103EB000000000000000000080699A01000000007E -:103EC000AAAA8AAA40555501FFFF0000007070079A -:103ED000777000000081020100000000AAAAAAAACF -:103EE00000410100FFFF000000000080080000000A -:103EF0000000000000000000AAAAAAAA000000001A -:103F0000FFFF0000000000000000000000000000B3 -:103F100000000000AAAAAAAA00000000FFFF0000FB -:103F20000000000000000000000000000000000091 -:103F30000A00000000000000030000000000000074 -:103F40000000000000000000000000000000000071 -:103F50000000000000000000000000000000000061 -:103F6000FF0096000000000804000000843D0008E7 -:103F70000000000000000000000000000000000041 -:083F8000000000000000000039 +:1001E00002E000F000F8FEE772B6374880F30888B6 +:1001F000364880F3098836483649086040F20000E6 +:10020000CCF200004EF63471CEF200010860BFF36C +:100210004F8FBFF36F8F40F20000C0F2F0004EF638 +:100220008851CEF200010860BFF34F8FBFF36F8F8C +:100230004FF00000E1EE100A4EF63C71CEF20001E4 +:100240000860062080F31488BFF36F8F02F074FA01 +:1002500003F074F94FF055301F491B4A91423CBFDF +:1002600041F8040BFAE71D49184A91423CBF41F896 +:10027000040BFAE71A491B4A1B4B9A423EBF51F83E +:10028000040B42F8040BF8E700201849184A914281 +:100290003CBF41F8040BFAE702F052FA03F0A2F96E +:1002A000144C154DAC4203DA54F8041B8847F9E7A7 +:1002B00000F042F8114C124DAC4203DA54F8041B22 +:1002C0008847F9E702F03ABA000600200022002031 +:1002D0000000000808ED00E00000002000060020FB +:1002E000A03E0008002200204C22002050220020C6 +:1002F00020310020E0010008E0010008E0010008D2 +:10030000E00100082DE9F04F2DED108AC1F80CD066 +:10031000C3689D46BDEC108ABDE8F08F002383F3CF +:1003200011882846A047002001F098FDFEE701F063 +:1003300027FD00DFFEE7000038B500F0DFFB02F02C +:10034000CFF940B1164B6FF03F01002259720F21D7 +:100350001A729972DA7202F0A9F9054602F0E2F90E +:100360000446C8B90F4B9D4218D001339D4218BFB7 +:10037000044641F2883504BF01240025002002F024 +:100380009FF90CB100F076F800F018FD284600F057 +:10039000C1F800F06FF8F9E70025EFE70546EDE753 +:1003A00000220020010007B008B500F073FBA0F1A7 +:1003B00020035842584108BD07B541F212030221FB +:1003C00001A8ADF8043000F083FB03B05DF804FB36 +:1003D00038B5302383F31188174803680BB101F057 +:1003E00009FE164A144800234FF47A7101F0F8FD13 +:1003F000002383F31188124C236813B12368013B57 +:100400002360636813B16368013B63600D4D2B7813 +:1004100033B963687BB9022000F03AFC3223636091 +:100420002B78032B07D163682BB9022000F030FC36 +:100430004FF47A73636038BD50220020D103000866 +:100440007023002068220020084B187003280CD865 +:10045000DFE800F008050208022000F00FBC0220CF +:1004600000F002BC024B00225A6070476822002054 +:1004700070230020234B244A10B51C461968013113 +:100480003FD004339342F9D16268A24239D31F4B63 +:100490009B6803F1006303F580439A4231D2002048 +:1004A00000F046FB0220FFF7CFFF194B1A6C002229 +:1004B0001A64196E1A66196E596C5A64596E5A6626 +:1004C0005A6E5A6942F080025A615A6922F08002DB +:1004D0005A615A691A6942F000521A611A6922F087 +:1004E00000521A611B6972B64FF0E0233021C3F845 +:1004F000084DD4E9003281F311889D4683F30888C2 +:10050000104710BD004000082040000800220020D5 +:10051000003802402DE9F04F93B0AA4B0090202202 +:10052000FF210AA89D6800F0F3FBA74A1378A3B93E +:10053000A648012103601170302383F311880368FA +:100540000BB101F057FDA24AA04800234FF47A7185 +:1005500001F046FD002383F31188009B13B19D4BEE +:10056000009A1A609C4A009C1378032B1EBF00233C +:100570001370984A4FF0000A18BF5360D34656468E +:10058000D146012000F07AFB24B1924B1B68002B6E +:1005900000F01182002000F07DFA0390039B002BF5 +:1005A000F2DB012000F060FB039B213B162BE8D817 +:1005B00001A252F823F000BF150600083D0600080E +:1005C000D10600088305000883050008830500089C +:1005D0005B0700082B09000845080008A708000869 +:1005E000CF080008F508000883050008070900087F +:1005F0008305000879090008B5060008830500088E +:10060000BD09000821060008B5060008830500089A +:10061000A70800080220FFF7C7FE002840F0F58178 +:10062000009B0221BAF1000F08BF1C4605A841F249 +:100630001233ADF8143000F04BFAA2E74FF47A70A1 +:1006400000F028FA071EEBDB0220FFF7ADFE0028C2 +:10065000E6D0013F052F00F2DA81DFE807F0030A58 +:100660000D10133605230593042105A800F030FA78 +:1006700017E054480421F9E758480421F6E75848A0 +:100680000421F3E74FF01C08404600F053FA08F14C +:1006900004080590042105A800F01AFAB8F12C0FFF +:1006A000F2D1012000FA07F747EA0B0B5FFA8BFB48 +:1006B0004FF0000900F078FB26B10BF00B030B2B79 +:1006C00008BF0024FFF778FE5BE746480421CDE72A +:1006D000002EA5D00BF00B030B2BA1D10220FFF7AE +:1006E00063FE074600289BD0012000F021FA02207B +:1006F000FFF7AAFE00261FFA86F8404600F028FA07 +:10070000044690B10021404600F032FA013600283C +:10071000F1D1BA46044641F21213022105A8ADF800 +:1007200014303E4600F0D4F92BE70120FFF78CFE91 +:100730002546244B9B68AB4207D9284600F0FAF9BE +:10074000013040F067810435F3E7234B00251D702D +:10075000204BBA465D603E46ACE7002E3FF460AFEA +:100760000BF00B030B2B7FF45BAF0220FFF76CFE4B +:10077000322000F08FF9B0F10008FFF651AF18F009 +:1007800003077FF44DAF0F4A926808EB05039342CD +:100790003FF646AFB8F5807F3FF742AF124B01936B +:1007A000B84523DD4FF47A7000F074F90390039A92 +:1007B000002AFFF635AF019B039A03F8012B01379E +:1007C000EDE700BF002200206C2300205022002013 +:1007D000D10300087023002068220020042200209A +:1007E000082200200C2200206C220020C820FFF7E5 +:1007F000DBFD074600283FF413AF1F2D11D8C5F1CC +:10080000200242450AAB25F0030028BF4246834937 +:100810000192184400F056FA019A8048FF2100F036 +:1008200077FA4FEAA8037D490193C8F38702284667 +:1008300000F076FA064600283FF46DAF019B05EB09 +:10084000830537E70220FFF7AFFD00283FF4E8AE4D +:1008500000F0BAF900283FF4E3AE0027B846704B29 +:100860009B68BB4218D91F2F11D80A9B01330ED0A9 +:1008700027F0030312AA134453F8203C0593404683 +:10088000042205A900F0F6FA04378046E7E7384667 +:1008900000F050F90590F2E7CDF81480042105A886 +:1008A00000F016F906E70023642104A8049300F081 +:1008B00005F900287FF4B4AE0220FFF775FD00288B +:1008C0003FF4AEAE049800F067F90590E6E7002328 +:1008D000642104A8049300F0F1F800287FF4A0AE8E +:1008E0000220FFF761FD00283FF49AAE049800F063 +:1008F00063F9EAE70220FFF757FD00283FF490AEC6 +:1009000000F072F9E1E70220FFF74EFD00283FF406 +:1009100087AE05A9142000F06DF904210746049064 +:1009200004A800F0D5F83946B9E7322000F0B2F853 +:10093000071EFFF675AEBB077FF472AE384A9268A9 +:1009400007EB090393423FF66BAE0220FFF72CFD45 +:1009500000283FF465AE27F003074F44B9453FF444 +:10096000A9AE484600F0E6F80421059005A800F07D +:10097000AFF809F10409F1E74FF47A70FFF714FDBD +:1009800000283FF44DAE00F01FF9002844D00A9B28 +:1009900001330BD008220AA9002000F0C1F9002879 +:1009A0003AD02022FF210AA800F0B2F9FFF704FD97 +:1009B0001C4801F059FA13B0BDE8F08F002E3FF447 +:1009C0002FAE0BF00B030B2B7FF42AAE0023642118 +:1009D00005A8059300F072F8074600287FF420AEC2 +:1009E0000220FFF7E1FC804600283FF419AEFFF734 +:1009F000E3FC41F2883001F037FA059800F018FA6C +:100A0000464600F0D1F93C46BBE5064652E64FF0BB +:100A1000000905E6BA467EE637467CE66C220020F1 +:100A200000220020A08601002DE9F84F4FF47A73D0 +:100A3000DFF85880DFF8589006460D4602FB03F7B2 +:100A4000002498F900305A1C5FFA84FA01D0A342BE +:100A500012D159F8240003682A46D3F820B0314651 +:100A60003B46D847854207D1074B012083F800A0B9 +:100A7000BDE8F88F0124E4E7002CFBD04FF4FA70B6 +:100A800001F0F2F90020F3E7B82300201022002043 +:100A90001422002007B50023024601210DF10700B2 +:100AA0008DF80730FFF7C0FF20B19DF8070003B0B5 +:100AB0005DF804FB4FF0FF30F9E700000A4608B587 +:100AC0000421FFF7B1FF80F00100C0B2404208BD31 +:100AD00030B4074B0A461978064B53F82140236877 +:100AE000DD69054B0146AC46204630BC604700BF7F +:100AF000B823002014220020A086010070B501F068 +:100B0000D3FC094E094D3080002428683388834285 +:100B100008D901F0C3FC2B6804440133B4F5804FBD +:100B20002B60F2D370BD00BFBA23002078230020D1 +:100B300001F070BD00F1006000F580400068704772 +:100B400000F10060920000F5804001F0FBBC000065 +:100B5000054B1A68054B1B889B1A834202D9104427 +:100B600001F09CBC0020704778230020BA230020AD +:100B700038B5084D044629B128682044BDE83840FE +:100B800001F0ACBC2868204401F090FC0028F3D0B0 +:100B900038BD00BF7823002010F003030AD1B0F560 +:100BA000047F05D200F10050A0F51040D0F80038C5 +:100BB000184670470023FBE700F10050A0F51040F5 +:100BC000D0F8100A70470000064991F8243033B17C +:100BD0000023086A81F824300822FFF7B1BF012002 +:100BE000704700BF7C230020014B1868704700BF8E +:100BF000002004E070B5194B1D68194B0138C5F38E +:100C00000B0408442D0C04221E88A6420BD15C68FC +:100C10000A46013C824213460FD214F9016F4EB1CD +:100C200002F8016BF6E7013A03F10803ECD18142C7 +:100C30000B4602D22C2203F8012B0A4A05241688FF +:100C4000AE4204D1984284BF967803F8016B013C10 +:100C500002F10402F3D1581A70BD00BF002004E075 +:100C6000503B00083C3B0008022802BF024B4FF4F7 +:100C700080529A61704700BF00100240022802BFF4 +:100C8000024B4FF080529A61704700BF0010024043 +:100C9000022801BF024A536983F4805353617047AD +:100CA0000010024070B504464FF47A764CB1412CE6 +:100CB000254628BF412506FB05F001F0D5F8641B49 +:100CC000F4E770BD10B50023934203D0CC5CC4544C +:100CD0000133F9E710BD000010B5013810F9013FEC +:100CE0003BB191F900409C4203D11AB10131013A64 +:100CF000F4E71AB191F90020981A10BD1046FCE7EC +:100D000003460246D01A12F9011B0029FAD1704796 +:100D100002440346934202D003F8011BFAE77047EE +:100D20002DE9F8431F4D144695F8242007468846C0 +:100D300052BBDFF870909CB395F824302BB9202279 +:100D4000FF2148462F62FFF7E3FF95F82400C0F12A +:100D50000802A24228BF2246D6B24146920005EBC5 +:100D60008000FFF7AFFF95F82430A41B1E44F6B2B5 +:100D7000082E17449044E4B285F82460DBD1FFF7D5 +:100D800023FF0028D7D108E02B6A03EB82038342BC +:100D9000CFD0FFF719FF0028CBD10020BDE8F883A2 +:100DA0000120FBE77C230020024B1A78024B1A70CB +:100DB000704700BFB82300201022002038B5174C20 +:100DC000174D204600F0B6FB2946204600F0DEFB1A +:100DD0002D686A6D936B23F4002393634FF47A704C +:100DE000FFF760FF0F49284600F0D6FC6A6D0E4DF4 +:100DF000936B28680D4943F400239363A0424FF49A +:100E0000E1330B6001D000F0F5FA6868A04204D02D +:100E1000BDE83840054900F0EDBA38BD98280020FB +:100E20005C3C0008643C000814220020A42300203D +:100E300070B50C4B0C4D1E780C4B55F826209A4281 +:100E400004460DD00A4B002114221846FFF760FF1C +:100E50000460014655F82600BDE8704000F0CABAAB +:100E600070BD00BFB8230020142200209828002065 +:100E7000A423002030B5094D0A4491420DD011F849 +:100E8000013B5840082340F30004013B2C4013F081 +:100E9000FF0384EA5000F6D1EFE730BD2083B8EDC0 +:100EA000026843681143016003B1184770470000AE +:100EB000024AD36843F0C003D36070470044004047 +:100EC00010B5054C054A0021204600F071FA044A8D +:100ED000044BC4E9972310BDBC230020B10E0008C9 +:100EE0000044004080DE8002234A037C002918BFB2 +:100EF0000A46012B30B5C0F868220CD11F4B98422E +:100F000009D11F4B196C41F400311964196E41F479 +:100F1000003119661B6EB2F904501468D0F86032C3 +:100F2000D0F85C12002D03EB5403B3FBF4F3BEBF07 +:100F300023F0070503F0070343EA450394888B6019 +:100F4000D38843F040030B61138943F001034B61E5 +:100F500044F4045343F02C03CB6004F4A054002366 +:100F60000B60B4F5806F0B684B680CBF7F23FF23C9 +:100F700080F8643230BD00BF703B0008BC23002005 +:100F8000003802402DE9F041D0F85C62F768336820 +:100F9000DA0504469DB20DD5302383F311884FF452 +:100FA00080610430FFF77CFF6FF4807333600023AF +:100FB00083F31188302383F3118804F1040815F0BA +:100FC0002F033AD183F31188380615D5290613D596 +:100FD000302383F3118804F1380000F065F900280C +:100FE0004EDA0821201DFFF75BFF4FF67F733B4071 +:100FF000F360002383F311887A0616D56B0614D5A7 +:10100000302383F31188D4E913239A420AD1236C45 +:1010100043B127F040073F041021201D3F0CFFF78C +:101020003FFFF760002383F31188D4F86822D36868 +:1010300043B3BDE8F041106918472B0714D015F0F1 +:10104000080F0CBF00214FF48071E80748BF41F042 +:101050002001AA0748BF41F040016B0748BF41F09B +:1010600080014046FFF71CFFAD06736805D594F874 +:1010700064122046194000F0CBF93568ADB29EE706 +:101080007060B6E7BDE8F081F8B51546826806697C +:10109000AA420B46816938BF8568761AB542044674 +:1010A0000BD218462A46FFF70DFEA3692B44A36115 +:1010B000A3685B1BA3602846F8BD0CD918463246CE +:1010C000FFF700FEAF1BE1683A463044FFF7FAFD38 +:1010D000E3683B44EBE718462A46FFF7F3FDE36875 +:1010E000E5E7000083689342F7B51546044638BF2C +:1010F0008568D0E90460361AB5420BD22A46FFF75C +:10110000E1FD63692B446361A36828465B1BA36010 +:1011100003B0F0BD0DD932460191FFF7D3FD01991F +:10112000E068AF1B3A463144FFF7CCFDE3683B442F +:10113000E9E72A46FFF7C6FDE368E4E710B50A448D +:101140000024C361029B8460C0E90000C0E905116E +:10115000C1600261036210BD08B5D0E90532934257 +:1011600001D1826882B98268013282605A1C426170 +:101170001970D0E904329A4224BFC3684361002148 +:1011800000F08EFE002008BD4FF0FF30FBE70000AE +:1011900070B5302304460E4683F31188A568A5B1C7 +:1011A000A368A269013BA360531CA361157822695F +:1011B000934224BFE368A361E3690BB120469847DB +:1011C000002383F31188284607E03146204600F0CB +:1011D00057FE0028E2DA85F3118870BD2DE9F74F3C +:1011E00004460E4617469846D0F81C904FF0300A39 +:1011F0008AF311884FF0000B154665B12A46314637 +:101200002046FFF741FF034660B94146204600F003 +:1012100037FE0028F1D0002383F31188781B03B038 +:10122000BDE8F08FB9F1000F03D001902046C84708 +:10123000019B8BF31188ED1A1E448AF31188DCE7B9 +:10124000C0E90511C160C3611144009B8260C0E91F +:101250000000016103627047F8B504460D4616466A +:10126000302383F31188A768A7B1A368013BA3606B +:1012700063695A1C62611D70D4E904329A4224BF2A +:10128000E3686361E3690BB120469847002080F36F +:10129000118807E03146204600F0F2FD0028E2DA2E +:1012A00087F31188F8BD0000D0E905239A4210B5F4 +:1012B00001D182687AB98268013282605A1C8261E7 +:1012C0001C7803699A4224BFC3688361002100F03F +:1012D000E7FD204610BD4FF0FF30FBE72DE9F74F4B +:1012E00004460E4617469846D0F81C904FF0300A38 +:1012F0008AF311884FF0000B154665B12A46314636 +:101300002046FFF7EFFE034660B94146204600F055 +:10131000B7FD0028F1D0002383F31188781B03B0B8 +:10132000BDE8F08FB9F1000F03D001902046C84707 +:10133000019B8BF31188ED1A1E448AF31188DCE7B8 +:10134000026843681143016003B118477047000009 +:101350001430FFF743BF00004FF0FF331430FFF7A6 +:101360003DBF00003830FFF7B9BF00004FF0FF333A +:101370003830FFF7B3BF00001430FFF709BF00009B +:101380004FF0FF311430FFF703BF00003830FFF794 +:1013900063BF00004FF0FF323830FFF75DBF000041 +:1013A000012914BF6FF0130000207047FFF788BDBC +:1013B00037B515460E4A026000224260C0E902229B +:1013C0000122044602740B46009000F15C014FF4C8 +:1013D00080721430FFF7B2FE00942B464FF48072F7 +:1013E00004F5AE7104F13800FFF72AFF03B030BDF9 +:1013F000843B000810B53023044683F31188FFF7BF +:1014000073FD02232374002080F3118810BD0000B7 +:1014100038B5C36904460D461BB904210844FFF7DB +:101420008FFF294604F11400FFF796FE002806DA24 +:10143000201D4FF40061BDE83840FFF781BF38BD83 +:10144000026843681143016003B118477047000008 +:1014500013B5446BD4F894341A681178042915D163 +:10146000217C022912D11979128901238B40134260 +:101470000CD101A904F14C0001F016FFD4F89444FA +:10148000019B21790246206800F0D0F902B010BD1E +:10149000143001F099BE00004FF0FF33143001F01A +:1014A00093BE00004C3001F06BBF00004FF0FF33E3 +:1014B0004C3001F065BF0000143001F067BE000041 +:1014C0004FF0FF31143001F061BE00004C3001F0EC +:1014D00037BF00004FF0FF324C3001F031BF000049 +:1014E0000020704710B5D0F894341A681178042998 +:1014F000044617D1017C022914D15979528901235C +:101500008B4013420ED1143001F0FAFD024648B16F +:10151000D4F894444FF4807361792068BDE810409A +:1015200000F072B910BD0000406BFFF7DBBF000098 +:10153000704700007FB5124B036000234360C0E991 +:101540000233012502260F4B0574044602900193D5 +:1015500000F18402294600964FF48073143001F0A4 +:10156000ABFD094B0294CDE9006304F523724FF4FF +:101570008073294604F14C0001F072FE04B070BD86 +:10158000AC3B000829150008511400080B683022F4 +:1015900082F311880A7903EB820290614A79093259 +:1015A00043F822008A7912B103EB82039861022387 +:1015B000C0F894140374002080F311887047000071 +:1015C00038B5037F044613B190F85430ABB9201DF1 +:1015D00001250221FFF734FF04F1140025776FF095 +:1015E000010100F069FC84F8545004F14C006FF0E4 +:1015F0000101BDE8384000F05FBC38BD10B50121E5 +:1016000004460430FFF71CFF0023237784F854308E +:1016100010BD000038B504460025143001F064FD0B +:1016200004F14C00257701F033FE201D84F854505E +:101630000121FFF705FF2046BDE83840FFF752BF04 +:1016400090F8443003F06003202B07D190F8452038 +:10165000212A4FF0000303D81F2A06D80020704724 +:10166000222AFBD1C0E90E3303E0034A826307223A +:10167000C2630364012070471C22002037B5D0F8F4 +:1016800094341A681178042904461AD1017C02297D +:1016900017D11979128901238B40134211D100F11E +:1016A0004C05284601F0B4FE58B101A9284601F0C6 +:1016B000FBFDD4F89444019B21790246206800F098 +:1016C000B5F803B030BD0000F0B500EB810385B084 +:1016D0009E6904460D46FEB1302383F3118804EB66 +:1016E0008507301D0821FFF7ABFEFB685B691B68AF +:1016F00006F14C001BB1019001F0E4FD019803A933 +:1017000001F0D2FD024648B1039B2946204600F075 +:101710008DF8002383F3118805B0F0BDFB685A698A +:101720001268002AF5D01B8A013B1340F1D104F165 +:101730004402EAE7093138B550F82140DCB13023E2 +:1017400083F31188D4F894241368527903EB82034D +:10175000DB689B695D6845B104216018FFF770FE86 +:10176000294604F1140001F0D5FC2046FFF7BAFE2B +:10177000002383F3118838BD7047000001F034B8AE +:10178000012303700023C0E90133C3618362036254 +:10179000C36243620363704738B50446302383F362 +:1017A00011880025C0E90355C0E90555416001F0E5 +:1017B0002BF80223237085F31188284638BD0000DA +:1017C00070B500EB810305465069DA600E46144699 +:1017D00018B110220021FFF79BFAA06918B110225E +:1017E0000021FFF795FA31462846BDE8704001F028 +:1017F000D5B80000826802F0011282600022C0E9C0 +:101800000422826101F056B9F0B400EB81044789EB +:10181000E4680125A4698D403D4345812360002390 +:10182000A2606360F0BC01F071B90000F0B400EB9D +:1018300081040789E468012564698D403D43058181 +:1018400023600023A2606360F0BC01F0EBB90000EC +:1018500070B50223002504460370C0E90255C0E9B3 +:101860000455C564856180F8345001F033F863682D +:101870001B6823B129462046BDE87040184770BD5B +:101880000378052B10B504460AD080F850300523A4 +:10189000037043681B680BB1042198470023A360C1 +:1018A00010BD00000178052906D190F8502043684A +:1018B00002701B6803B118477047000070B590F8BC +:1018C0003430044613B1002380F8343004F144026C +:1018D000204601F011F963689B68B3B994F844306D +:1018E00013F0600535D00021204601F0B1FB002146 +:1018F000204601F0A3FB63681B6813B10621204654 +:101900009847062384F8343070BD20469847002855 +:10191000E4D0B4F84A30E26B9A4288BFE36394F9AA +:101920004430E56B002B4FF0300380F20381002D33 +:1019300000F0F280092284F8342083F3118800211A +:10194000D4E90E232046FFF771FF002383F31188AB +:10195000DAE794F8452003F07F0343EA022340F2DC +:101960000232934200F0C58021D8B3F5807F48D081 +:101970000DD8012B3FD0022B00F09380002BB2D169 +:1019800004F14C02A2630222E2632364C1E7B3F5CF +:10199000817F00F09B80B3F5407FA4D194F846305E +:1019A000012BA0D1B4F84C3043F0020332E0B3F580 +:1019B000006F4DD017D8B3F5A06F31D0A3F5C06339 +:1019C000012B90D8636894F846205E6894F847101D +:1019D000B4F848302046B047002884D04368A36359 +:1019E0000368E3631AE0B3F5106F36D040F60242A5 +:1019F00093427FF478AF5C4BA3630223E36300233D +:101A0000C3E794F84630012B7FF46DAFB4F84C3047 +:101A100023F00203C4E90E55A4F84C30256478E79E +:101A2000B4F84430B3F5A06F0ED194F8463084F882 +:101A30004E30204600F0A6FF63681B6813B10121F9 +:101A400020469847032323700023C4E90E339CE704 +:101A500004F14F03A3630123C3E72378042B10D1C0 +:101A6000302383F311882046FFF7C4FE85F31188E5 +:101A70000321636884F84F5021701B680BB1204626 +:101A8000984794F84630002BDED084F84F3004237A +:101A9000237063681B68002BD6D00221204698472C +:101AA000D2E794F848301D0603F00F0120460AD50E +:101AB00001F014F8012804D002287FF414AF2B4B56 +:101AC0009AE72B4B98E700F0FBFFF3E794F84630DA +:101AD000002B7FF408AF94F8483013F00F01B3D017 +:101AE0001A06204602D501F0C7FAADE701F0BAFAAE +:101AF000AAE794F84630002B7FF4F5AE94F848300E +:101B000013F00F01A0D01B06204602D501F0A0FA69 +:101B10009AE701F093FA97E7142284F8342083F3CC +:101B200011882B462A4629462046FFF76DFE85F38D +:101B30001188E9E65DB1152284F8342083F3118819 +:101B40000021D4E90E232046FFF75EFEFDE60B22BE +:101B500084F8342083F311882B462A4629462046F0 +:101B6000FFF764FEE3E700BFDC3B0008D43B00085E +:101B7000D83B000838B590F834300446002B3ED0EE +:101B8000063BDAB20F2A34D80F2B32D8DFE803F045 +:101B9000373131082232313131313131313137375A +:101BA000C56BB0F84A309D4214D2C3681B8AB5FB9E +:101BB000F3F203FB12556DB9302383F311882B46E2 +:101BC0002A462946FFF732FE85F311880A2384F856 +:101BD00034300EE0142384F83430302383F311883A +:101BE00000231A4619462046FFF70EFE002383F312 +:101BF000118838BD036C03B198470023E7E7002143 +:101C0000204601F025FA0021204601F017FA63680A +:101C10001B6813B10621204698470623D7E700002A +:101C200010B590F83430142B044629D017D8062B61 +:101C300005D001D81BB110BD093B022BFBD80021F8 +:101C4000204601F005FA0021204601F0F7F963680B +:101C50001B6813B1062120469847062319E0152B6F +:101C6000E9D10B2380F83430302383F3118800232B +:101C70001A461946FFF7DAFD002383F31188DAE7E5 +:101C8000C3689B695B68002BD5D1036C03B198478F +:101C9000002384F83430CEE700230375826803699B +:101CA0001B6899689142FBD25A68036042601060D9 +:101CB0005860704700230375826803691B68996840 +:101CC0009142FBD85A6803604260106058607047C8 +:101CD00008B50846302383F311880B7D032B05D00C +:101CE000042B0DD02BB983F3118808BD8B6900221A +:101CF0001A604FF0FF338361FFF7CEFF0023F2E756 +:101D0000D1E9003213605A60F3E70000FFF7C4BF67 +:101D1000054BD9680875186802681A60536001227B +:101D20000275D860FEF7EEBA2826002030B50C4BBD +:101D3000DD684B1C87B004460FD02B46094A684625 +:101D400000F04EF92046FFF7E3FF009B13B1684611 +:101D500000F050F9A86907B030BDFFF7D9FFF9E7E7 +:101D600028260020D11C0008044B1A68DB68906804 +:101D70009B68984294BF00200120704728260020CD +:101D8000084B10B51C68D86822681A60536001229D +:101D90002275DC60FFF78EFF01462046BDE810404B +:101DA000FEF7B0BA2826002038B5074C0749084886 +:101DB000012300252370656001F068FB0223237076 +:101DC00085F3118838BD00BF90280020E43B00084F +:101DD0002826002000F044B9034A516853685B1A72 +:101DE0009842FBD8704700BF001000E08B600223D0 +:101DF00008618B82084670478368A3F1840243F828 +:101E0000142C026943F8442C426943F8402C094AD7 +:101E100043F8242CC26843F8182C022203F80C2C37 +:101E2000002203F80B2C044A43F8102CA3F12000E5 +:101E3000704700BF1D0300082826002008B5FFF7E3 +:101E4000DBFFBDE80840FFF761BF0000024BDB6825 +:101E500098610F20FFF75CBF28260020302383F312 +:101E60001188FFF7F3BF000008B50146302383F364 +:101E700011880820FFF75AFF002383F3118808BD5B +:101E8000064BDB6839B1426818605A6013604360E2 +:101E90000420FFF74BBF4FF0FF307047282600208B +:101EA0000368984206D01A6802605060996118462B +:101EB000FFF72CBF7047000038B504460D46206878 +:101EC000844200D138BD036823605C608561FFF700 +:101ED0001DFFF4E710B503689C68A2420CD85C684B +:101EE0008A600B604C602160596099688A1A9A6018 +:101EF0004FF0FF33836010BD1B68121BECE700003E +:101F00000A2938BF0A2170B504460D460A26601911 +:101F100001F0B4FA01F09CFA041BA54203D8751C29 +:101F20002E460446F3E70A2E04D9BDE8704001208E +:101F300001F0ECBA70BD0000F8B5144B0D46D96144 +:101F400003F1100141600A2A1969826038BF0A2230 +:101F5000016048601861A818144601F07FFA0A274A +:101F600001F076FA431BA342064606D37C1C2819CF +:101F700001F084FA27463546F2E70A2F04D9BDE876 +:101F8000F840012001F0C2BAF8BD00BF28260020A9 +:101F9000F8B506460D4601F05BFA0F4A134653F8B2 +:101FA000107F9F4206D12A4601463046BDE8F840E0 +:101FB000FFF7C2BFD169BB68441A2C1928BF2C4651 +:101FC000A34202D92946FFF79BFF22463146034828 +:101FD000BDE8F840FFF77EBF282600203826002005 +:101FE00010B4C0E9032300235DF8044B4361FFF7FD +:101FF000CFBF000010B5194C236998420DD0D0E92D +:102000000032816813605A609A680A449A6000231B +:1020100003604FF0FF33A36110BD2346026843F80D +:10202000102F53600022026022699A4203D1BDE85A +:10203000104001F01DBA936881680B44936001F071 +:1020400007FA2269E1699268441AA242E4D911446C +:10205000BDE81040091AFFF753BF00BF2826002033 +:102060002DE9F047DFF8BC8008F110072C4ED8F8B6 +:10207000105001F0EDF9D8F81C40AA68031B9A42F1 +:102080003ED81444D5E900324FF00009C8F81C408E +:1020900013605A60C5F80090D8F81030B34201D1EF +:1020A00001F0E6F989F31188D5E90331284698470C +:1020B000302383F311886B69002BD8D001F0C8F965 +:1020C0006A69A0EB04094A4582460DD2022001F05C +:1020D0001DFA0022D8F81030B34208D151462846E4 +:1020E000BDE8F047FFF728BF121A2244F2E712EBCF +:1020F000090938BF4A4629463846FFF7EBFEB5E7DF +:10210000D8F81030B34208D01444211AC8F81C0083 +:10211000A960BDE8F047FFF7F3BEBDE8F08700BF58 +:10212000382600202826002000207047FEE7000007 +:10213000704700004FF0FF307047000002290CD0BC +:10214000032904D00129074818BF00207047032A3B +:1021500005D8054800EBC2007047044870470020CE +:10216000704700BFC03C00082C220020743C0008CF +:1021700070B59AB00546084601A9144600F0C2F8A9 +:1021800001A8FEF7BDFD431C5B00C5E90034002239 +:10219000237003236370C6B201AB02341046D1B280 +:1021A0008E4204F1020401D81AB070BD13F8011B6D +:1021B00004F8021C04F8010C0132F0E708B53023E2 +:1021C00083F311880348FFF759FA002383F311883A +:1021D00008BD00BF9828002090F8443003F01F028B +:1021E000012A07D190F845200B2A03D10023C0E92A +:1021F0000E3315E003F06003202B08D1B0F848300F +:102200002BB990F84520212A03D81F2A04D8FFF7BC +:1022100017BA222AEBD0FAE7034A82630722C26385 +:1022200003640120704700BF2322002007B5052961 +:1022300017D8DFE801F0191603191920302383F3AA +:102240001188104A01900121FFF7BAFA01980E4A4D +:102250000221FFF7B5FA0D48FFF7DCF9002383F3FD +:10226000118803B05DF804FB302383F3118807481D +:10227000FFF7A6F9F2E7302383F311880348FFF74D +:10228000BDF9EBE7143C0008383C00089828002012 +:1022900038B50C4D0C4C0D492A4604F10800FFF7E7 +:1022A00067FF05F1CA0204F110000949FFF760FF5A +:1022B00005F5CA7204F118000649BDE83840FFF779 +:1022C00057BF00BF602D00202C220020F03B0008EB +:1022D000FD3B0008083C000870B5044608460D4662 +:1022E000FEF70EFDC6B22046013403780BB918463E +:1022F00070BD32462946FEF7EFFC0028F3D10120DD +:10230000F6E700002DE9F84F05460C46FEF7F8FC0D +:102310002B49C6B22846FFF7DFFF08B10336F6B2F5 +:1023200028492846FFF7D8FF08B11036F6B2632EC9 +:102330000DD8DFF88C80DFF88C90234FDFF890A069 +:10234000DFF890B02E7846B92670BDE8F88F2946A0 +:102350002046BDE8F84F01F0D3BB252E2BD1072234 +:1023600041462846FEF7B8FC58B9DBF80030236038 +:10237000DBF804306360BBF80830238107350A348A +:10238000E0E7082249462846FEF7A6FC98B90F4B1D +:10239000A21C197809090232C95D02F8041C13F85D +:1023A000011B01F00F015345C95D02F8031CF0D178 +:1023B00018340835C6E704F8016B0135C2E700BFE1 +:1023C000E03C0008083C0008F33C0008107AFF1FBE +:1023D0001C7AFF1FE83C0008BFF34F8F024AD36806 +:1023E000DB03FCD4704700BF003C024008B5094B3A +:1023F0001B7873B9FFF7F0FF074B1A69002ABFBFBC +:10240000064A5A6002F188325A601A6822F48062E1 +:102410001A6008BDBE2F0020003C02402301674522 +:1024200008B50B4B1B7893B9FFF7D6FF094B1A6918 +:1024300042F000421A611A6842F480521A601A6827 +:1024400022F480521A601A6842F480621A6008BD51 +:10245000BE2F0020003C02401728F0B516D80C4CC7 +:102460000C4923787BB90C4D0E4618234FF00062BF +:1024700055F8047B46F8042B013B13F0FF033A4464 +:10248000F6D10123237051F82000F0BD0020FCE7B5 +:1024900020300020C02F0020043D0008014B53F8DD +:1024A00020007047043D000818207047172810B519 +:1024B000044601D9002010BDFFF7CEFF064B53F8AC +:1024C00024301844C21A0BB90120F4E71268013213 +:1024D000F0D1043BF6E700BF043D0008172838B5EB +:1024E000044628D81549FFF777FFFFF77FFFF3234E +:1024F000CB600C23B0FBF3F203FB1205D30143EADC +:10250000C503DBB243F4007343F002030B610B69B4 +:1025100043F480330B61FFF75FFFFFF79DFF084B2C +:1025200053F8241000F0DAF8FFF77AFF2046BDE8F0 +:102530003840FFF7BBBF002038BD00BF003C024061 +:10254000043D0008F8B512F00103144642D1821888 +:10255000B2F1026F57D82D4B1B6813F0010352D014 +:102560002B4DFFF743FFF323EB60FFF735FF40F2FE +:102570000127032C15D824F001046618244C401AB6 +:1025800040F20117B142236900EB010524D123F089 +:1025900001032361FFF744FF0120F8BD043C043030 +:1025A000E7E78307E7D12B6923F440732B612B699D +:1025B0003B432B6151F8046B0660BFF34F8FFFF76D +:1025C0000BFF03689E42E9D02B6923F001032B61C6 +:1025D000FFF726FF0020E0E723F44073236123691F +:1025E0003B4323610B882B80BFF34F8FFFF7F4FE33 +:1025F0002D8831F8023BADB2AB42C3D0236923F042 +:1026000001032361E4E71846C7E700BF0038024032 +:10261000003C0240084908B50B7828B11BB9FFF708 +:10262000E5FE01230B7008BD002BFCD0BDE808407F +:102630000870FFF7F5BE00BFBE2F002010B50244A2 +:10264000064BD2B2904200D110BD441C00B253F8E8 +:10265000200041F8040BE0B2F4E700BF502800402E +:102660000F4B30B51C6F240407D41C6F44F4007466 +:102670001C671C6F44F400441C670A4C236843F435 +:10268000807323600244084BD2B2904200D130BD27 +:10269000441C00B251F8045B43F82050E0B2F4E768 +:1026A00000380240007000405028004007B5012269 +:1026B00001A90020FFF7C2FF019803B05DF804FBF9 +:1026C00013B50446FFF7F2FFA04205D0012201A98D +:1026D00000200194FFF7C4FF02B010BD7047000056 +:1026E000094B5A88B2F5805F10460BD022F00203E6 +:1026F00041F20102934205D041F20703C31A584246 +:102700005841704701207047002004E0034B1A68CD +:102710001AB9034AD2F874281A607047243000208E +:102720000030024008B5FFF7F1FF024B1868C0F314 +:10273000407008BD2430002070470000FEE7000014 +:102740000A4B0B480B4A90420BD30B4BDA1C121A64 +:10275000C11E22F003028B4238BF00220021FEF787 +:10276000D7BA53F8041B40F8041BECE7EC3E000812 +:1027700020310020203100202031002070B5D0E928 +:1027800015439E6800224FF0FF3504EB42135101C0 +:10279000D3F800090028BEBFD3F8000940F08040FC +:1027A000C3F80009D3F8000B0028BEBFD3F8000B14 +:1027B00040F08040C3F8000B013263189642C3F822 +:1027C0000859C3F8085BE0D24FF00113C4F81C3875 +:1027D00070BD0000890141F02001016103699B0681 +:1027E000FCD41220FFF7F8BA10B5054C2046FEF7CE +:1027F000C7FF4FF0A0436365024BA36510BD00BF48 +:1028000028300020883D000870B50378012B05466C +:1028100050D12A4B446D98421BD1294B5A6B42F040 +:1028200080025A635A6D42F080025A655A6D5A69A5 +:1028300042F080025A615A6922F080025A610E21E8 +:1028400043205B6900F022FC1E4BE3601E4BC4F882 +:1028500000380023C4F8003EC02323606E6D4FF49F +:102860005023A3633369002BFCDA012333610C206E +:10287000FFF7B2FA3369DB07FCD41220FFF7ACFA9A +:102880003369002BFCDA0026A6602846FFF776FFA6 +:102890006B68C4F81068DB68C4F81468C4F81C6876 +:1028A0004BB90A4BA3614FF0FF336361A36843F058 +:1028B0000103A36070BD064BF4E700BF2830002081 +:1028C000003802404014004003002002003C30C0A9 +:1028D000083C30C0F8B5446D054600212046FFF79E +:1028E00079FFA96D00234FF001128F68C4F83438C6 +:1028F0004FF00066C4F81C284FF0FF3004EB431281 +:1029000001339F42C2F80069C2F8006BC2F808099F +:10291000C2F8080BF2D20B686A6DEB656362102394 +:102920001361166916F01006FBD11220FFF754FA56 +:10293000D4F8003823F4FE63C4F80038A36943F4E4 +:10294000402343F01003A3610923C4F81038C4F8EE +:1029500014380A4BEB604FF0C043C4F8103B084BEF +:10296000C4F8003BC4F81069C4F80039EB6D03F1FA +:10297000100243F48013EA65A362F8BD643D0008C9 +:1029800040800010426D90F84E10D2F8003823F4C9 +:10299000FE6343EA0113C2F8003870472DE9F8439B +:1029A00000EB8103456DDA68166806F00306731EB6 +:1029B000022B05EB41130C4680460FFA81F94FEAD2 +:1029C00041104FF00001C3F8101B4FF0010104F15A +:1029D000100398BFB60401FA03F391698EBF334E1A +:1029E00006F1805606F5004600293AD0578A04F1D0 +:1029F0005801490137436F50D5F81C180B43C5F8EF +:102A00001C382B180021C3F8101953690127611EC7 +:102A1000A7409BB3138A928B9B08012A88BF53431C +:102A2000D8F85C20981842EA034301F1400205EB14 +:102A30008202C8F85C00214653602846FFF7CAFEB0 +:102A400008EB8900C3681B8A43EA84534834640155 +:102A50001E432E51D5F81C381F43C5F81C78BDE81D +:102A6000F88305EB4917D7F8001B21F40041C7F89C +:102A7000001BD5F81C1821EA0303C0E704F13F034B +:102A800005EB83030A4A5A6028462146FFF7A2FE57 +:102A900005EB4910D0F8003923F40043C0F80039A1 +:102AA000D5F81C3823EA0707D7E700BF00800010DD +:102AB00000040002826D1268C265FFF75FBE00006D +:102AC0005831436D49015B5813F4004004D013F4AE +:102AD000001F0CBF02200120704700004831436DE9 +:102AE00049015B5813F4004004D013F4001F0CBFDD +:102AF000022001207047000000EB8101CB68196AB9 +:102B00000B6813604B6853607047000000EB810353 +:102B100030B5DD68AA691368D36019B9402B84BF4A +:102B2000402313606B8A1468426D1C44013CB4FB63 +:102B3000F3F46343033323F0030302EB411043EA4E +:102B4000C44343F0C043C0F8103B2B6803F00303B9 +:102B5000012B09B20ED1D2F8083802EB411013F460 +:102B6000807FD0F8003B14BF43F0805343F0005304 +:102B7000C0F8003B02EB4112D2F8003B43F00443A3 +:102B8000C2F8003B30BD00002DE9F041244D6E6DD0 +:102B900006EB40130446D3F8087BC3F8087B3807DC +:102BA0000AD5D6F81438190706D505EB8403214653 +:102BB000DB6828465B689847FA071FD5D6F81438B3 +:102BC000DB071BD505EB8403D968CCB98B69488A30 +:102BD0005A68B2FBF0F600FB16228AB91868DA6868 +:102BE00090420DD2121AC3E90024302383F31188D6 +:102BF0000B482146FFF78AFF84F31188BDE8F08176 +:102C0000012303FA04F26B8923EA02036B81CB6888 +:102C1000002BF3D021460248BDE8F041184700BF21 +:102C20002830002000EB810370B5DD68436D6C69CE +:102C30002668E6604A0156BB1A444FF40020C2F8E9 +:102C400010092A6802F00302012A0AB20ED1D3F851 +:102C5000080803EB421410F4807FD4F8000914BF75 +:102C600040F0805040F00050C4F8000903EB4212DD +:102C7000D2F8000940F00440C2F80009D3F8340843 +:102C8000012202FA01F10143C3F8341870BD19B9E9 +:102C9000402E84BF4020206020682E8A8419013C89 +:102CA000B4FBF6F440EAC44040F000501A44C6E7D2 +:102CB0002DE9F8433B4D6E6D06EB40130446D3F807 +:102CC0000889C3F8088918F0010F4FEA40171AD095 +:102CD000D6F81038DB0716D505EB8003D9684B69A9 +:102CE0001868DA68904230D2121A4FF000091A6060 +:102CF000C3F80490302383F3118821462846FFF758 +:102D000091FF89F3118818F0800F1CD0D6F8343861 +:102D10000126A640334216D005EB84036D6DD3F82F +:102D20000CC0DCF814200134E4B2D2F800E005EB6A +:102D300004342F445168714515D3D5F8343823EA4B +:102D40000606C5F83468BDE8F883012303FA04F2E7 +:102D50002B8923EA02032B818B68002BD3D02146D9 +:102D600028469847CFE7BCF81000AEEB010383423A +:102D700028BF0346D7F8180980B2B3EB800FE2D81A +:102D80009068A0F1040959F8048FC4F80080A0EB02 +:102D900009089844B8F1040FF5D818440B44906022 +:102DA0005360C7E7283000202DE9F74FA24C656D2E +:102DB0006E69AB691E4016F480586E6107D02046DC +:102DC000FEF746FD03B0BDE8F04F00F04DBC002E0D +:102DD00012DAD5F8003E98489B071EBFD5F8003E92 +:102DE00023F00303C5F8003ED5F8043823F00103AF +:102DF000C5F80438FEF756FD370505D58E48FFF7B0 +:102E0000BDFC8D48FEF73CFDB0040CD5D5F8083864 +:102E100013F0060FEB6823F470530CBF43F4105308 +:102E200043F4A053EB6031071BD56368DB681BB923 +:102E3000AB6923F00803AB612378052B0CD1D5F8DF +:102E4000003E7D489A071EBFD5F8003E23F00303DD +:102E5000C5F8003EFEF726FD6368DB680BB17648D7 +:102E60009847F30274D4B70227D5D4F85490DFF80A +:102E7000C8B100274FF0010A09EB4712D2F8003B16 +:102E800003F44023B3F5802F11D1D2F8003B002B7F +:102E90000DDA62890AFA07F322EA0303638104EB7D +:102EA0008703DB68DB6813B1394658469847A36D42 +:102EB00001379B68FFB29F42DED9F00617D5676DD8 +:102EC0003A6AC2F30A1002F00F0302F4F012B2F5EC +:102ED000802F00F08580B2F5402F08D104EB8303EA +:102EE0000022DB681B6A07F5805790426AD13003E5 +:102EF000D5F8184813D5E10302D50020FFF744FEAA +:102F0000A20302D50120FFF73FFE630302D5022092 +:102F1000FFF73AFE270302D50320FFF735FE7503BE +:102F20007FF550AFE00702D50020FFF7C1FEA107F3 +:102F300002D50120FFF7BCFE620702D50220FFF791 +:102F4000B7FE23077FF53EAF0320FFF7B1FE39E759 +:102F5000636DDFF8E4A0019300274FF00109A36D32 +:102F60009B685FFA87FB9B453FF67DAF019B03EBB8 +:102F70004B13D3F8001901F44021B1F5802F1FD174 +:102F8000D3F8001900291BDAD3F8001941F0904159 +:102F9000C3F80019D3F800190029FBDB5946606D0E +:102FA000FFF718FC218909FA0BF321EA03032381B7 +:102FB00004EB8B03DB689B6813B159465046984776 +:102FC0000137CCE7910708BFD7F80080072A98BFE0 +:102FD00003F8018B02F1010298BF4FEA182884E739 +:102FE000023304EB830207F580575268D2F818C009 +:102FF000DCF80820DCE9001CA1EB0C0C0021884265 +:103000000AD104EB830463689B699A6802449A605E +:103010005A6802445A606AE711F0030F08BFD7F8F4 +:1030200000808C4588BF02F8018B01F1010188BF47 +:103030004FEA1828E3E700BF28300020436D03EB78 +:103040004111D1F8003B43F40013C1F8003B704735 +:10305000436D03EB4111D1F8003943F40013C1F87B +:1030600000397047436D03EB4111D1F8003B23F465 +:103070000013C1F8003B7047436D03EB4111D1F8D9 +:10308000003923F40013C1F80039704700F16043A0 +:1030900003F561430901C9B283F80013012200F06E +:1030A0001F039A4043099B0003F1604303F561430A +:1030B000C3F880211A60704730B5039C0172043355 +:1030C00004FB0325C0E90653049B03630021059B11 +:1030D000C160C0E90000C0E90422C0E90842C0E9BB +:1030E0000A11436330BD0000416A0022C0E90411A7 +:1030F000C0E90A22C2606FF00101FEF7DDBE0000E8 +:10310000D0E90432934201D1C2680AB9181D704750 +:103110000020704703691960C2680132C260C26949 +:10312000134482690361934224BF436A036100210F +:10313000FEF7B6BE38B504460D46E3683BB162699A +:10314000131D1268A3621344E362002007E0237A90 +:1031500033B929462046FEF793FE0028EDDA38BD44 +:103160006FF00100FBE70000C368C269013BC36068 +:103170004369134482694361934224BF436A4361B4 +:1031800000238362036B03B11847704770B5302387 +:10319000044683F31188866A3EB9FFF7CBFF0546E4 +:1031A00018B186F31188284670BDA36AE26A13F845 +:1031B000015BA362934202D32046FFF7D5FF0023B1 +:1031C00083F31188EFE700002DE9F84F04460E461F +:1031D000174698464FF0300989F311880025AA4612 +:1031E000D4F828B0BBF1000F09D141462046FFF7C3 +:1031F000A1FF20B18BF311882846BDE8F88FD4E9F0 +:103200000A12A7EB050B521A934528BF9346BBF150 +:10321000400F1BD9334601F1400251F8040B43F82B +:10322000040B9142F9D1A36A40334036A362403582 +:10323000D4E90A239A4202D32046FFF795FF8AF386 +:103240001188BD42D8D289F31188C9E730465A4661 +:10325000FDF738FDA36A5B445E44A3625D44E7E783 +:1032600010B5029C0172043303FB0421C0E906136C +:103270000023C0E90A33039B0363049BC460C0E9D5 +:103280000000C0E90422C0E90842436310BD000009 +:10329000026AC260426AC0E904220022C0E90A222E +:1032A0006FF00101FEF708BED0E904239A4201D174 +:1032B000C26822B9184650F8043B0B6070470023DF +:1032C0001846FAE7C368C2690133C360436913440F +:1032D00082694361934224BF436A43610021FEF740 +:1032E000DFBD000038B504460D46E3683BB12369F5 +:1032F0001A1DA262E2691344E362002007E0237A08 +:1033000033B929462046FEF7BBFD0028EDDA38BD6B +:103310006FF00100FBE7000003691960C268013A21 +:10332000C260C269134482690361934224BF436A45 +:10333000036100238362036B03B1184770470000E9 +:1033400070B530230D460446114683F31188866A12 +:103350002EB9FFF7C7FF10B186F3118870BDA36ABD +:103360001D70A36AE26A01339342A36204D3E16948 +:1033700020460439FFF7D0FF002080F31188EDE7E5 +:103380002DE9F84F04460D46904699464FF0300A15 +:103390008AF311880026B346A76A4FB949462046EA +:1033A000FFF7A0FF20B187F311883046BDE8F88F02 +:1033B000D4E90A073A1AA8EB0607974228BF17462E +:1033C000402F1BD905F1400355F8042B40F8042B7E +:1033D0009D42F9D1A36A4033A3624036D4E90A235F +:1033E0009A4204D3E16920460439FFF795FF8BF335 +:1033F00011884645D9D28AF31188CDE729463A4645 +:10340000FDF760FCA36A3B443D44A3623E44E5E70C +:10341000D0E904239A4217D1C3689BB1836A8BB168 +:10342000043B9B1A0ED01360C368013BC360C369A1 +:103430001A44836902619A4224BF436A03610023EC +:1034400083620123184670470023FBE700F036B97A +:10345000014B586A704700BF000C0040034B00222C +:1034600058631A610222DA60704700BF000C004006 +:10347000014B0022DA607047000C0040014B58639A +:10348000704700BF000C0040FEE7000070B51B4B0A +:1034900001630025044686B0586085620E4600F040 +:1034A000BFF804F11003C4E904334FF0FF33C4E95B +:1034B0000635C4E90044A560E562FFF7C9FF2B4665 +:1034C0000246C4E9082304F134010D4A256580232E +:1034D0002046FEF78BFC0123E0600A4A0375009248 +:1034E00072680192B268CDE90223074B6846CDE9C4 +:1034F0000435FEF7A3FC06B070BD00BF9028002085 +:10350000943D0008993D000889340008024AD36AB6 +:103510001843D062704700BF282600204B684360E4 +:103520008B688360CB68C3600B6943614B6903623E +:103530008B6943620B6803607047000008B5264B37 +:1035400026481A6940F2FF110A431A611A6922F4E7 +:10355000FF7222F001021A611A691A6B0A431A6398 +:103560001A6D0A431A651E4A1B6D1146FFF7D6FFF6 +:1035700002F11C0100F58060FFF7D0FF02F1380175 +:1035800000F58060FFF7CAFF02F1540100F580608A +:10359000FFF7C4FF02F1700100F58060FFF7BEFF86 +:1035A00002F18C0100F58060FFF7B8FF02F1A8017D +:1035B00000F58060FFF7B2FF02F1C40100F5806002 +:1035C000FFF7ACFF02F1E00100F58060FFF7A6FF16 +:1035D000BDE8084000F0F0B80038024000000240AA +:1035E000A03D000808B500F06BFAFEF7DDFBFFF721 +:1035F0008DF8BDE80840FEF74BBE000070470000A4 +:10360000EFF3098305494A6B22F001024A636833EC +:1036100083F30988002383F31188704700EF00E0EB +:10362000302080F3118862B60C4B0D4AD96821F422 +:10363000E0610904090C0A43DA60D3F8FC20094967 +:1036400042F08072C3F8FC200A6842F001020A606E +:103650002022DA7783F82200704700BF00ED00E0F7 +:103660000003FA05001000E010B5302383F3118841 +:103670000E4B5B6813F4006314D0F1EE103AEFF3D5 +:103680000984683C4FF08073E361094BDB6B236670 +:1036900084F30988FEF768FB10B1064BA36110BDE7 +:1036A000054BFBE783F31188F9E700BF00ED00E06D +:1036B00000EF00E02F030008320300080E4B1A6CE5 +:1036C00042F008021A641A6E42F008021A660B4AA7 +:1036D0001B6E936843F008039360094B53229A6270 +:1036E0004FF0FF32DA6200229A615A63DA605A6060 +:1036F00001225A611A60704700380240002004E03D +:10370000000C0040094A08B51169D3680B40D9B2D2 +:10371000C9439B07116107D5302383F31188FEF756 +:1037200059FB002383F3118808BD00BF000C004043 +:103730001F4B1A696FEAC2526FEAD2521A611A69B4 +:10374000C2F308021A614FF0FF301A695A695861D2 +:1037500000215A6959615A691A6A62F080521A62E4 +:103760001A6A02F080521A621A6A5A6A58625A6ACF +:1037700059625A6A1A6C42F080521A641A6E42F008 +:1037800080521A661A6E0B4A106840F480701060FE +:10379000186F00F44070B0F5007F1EBF4FF480300A +:1037A00018671967536823F40073536000F060B919 +:1037B0000038024000700040344B4FF080521A64D1 +:1037C000334A4FF4404111601A6842F001021A6016 +:1037D0001A689107FCD59A6822F003029A602B4B75 +:1037E0009A6812F00C02FBD1196801F0F901196016 +:1037F0009A601A6842F480321A601A689203FCD503 +:103800005A6F42F001025A67204B5A6F9007FCD55D +:10381000204A5A601A6842F080721A601C4A536843 +:103820005904FCD5194B1A689201FCD51A4A9A60C2 +:103830000322C3F88C20194B1A68194B9A42194B72 +:1038400021D1194A1168194A91421CD140F205123E +:103850001A60144A136803F00F03052BFAD10B4BBF +:103860009A6842F002029A609A6802F00C02082AF2 +:10387000FAD15A6C42F480425A645A6E42F4804241 +:103880005A665B6E704740F20572E1E7003802400D +:10389000007000401854400700948838002004E06D +:1038A00011640020003C024000ED00E041C20F41E5 +:1038B000074A08B5536903F00103536123B1054A70 +:1038C00013680BB150689847BDE80840FFF7CCBEBD +:1038D000003C0140A0300020074A08B5536903F0BE +:1038E0000203536123B1054A93680BB1D06898472E +:1038F000BDE80840FFF7B8BE003C0140A030002002 +:10390000074A08B5536903F00403536123B1054A1C +:1039100013690BB150699847BDE80840FFF7A4BE92 +:10392000003C0140A0300020074A08B5536903F06D +:103930000803536123B1054A93690BB1D0699847D5 +:10394000BDE80840FFF790BE003C0140A0300020D9 +:10395000074A08B5536903F01003536123B1054AC0 +:10396000136A0BB1506A9847BDE80840FFF77CBE68 +:10397000003C0140A0300020164B10B55C6904F4F7 +:1039800078725A61A30604D5134A936A0BB1D06AC0 +:103990009847600604D5104A136B0BB1506B9847DB +:1039A000210604D50C4A936B0BB1D06B9847E20506 +:1039B00004D5094A136C0BB1506C9847A30504D584 +:1039C000054A936C0BB1D06C9847BDE81040FFF7E7 +:1039D0004BBE00BF003C0140A0300020194B10B589 +:1039E0005C6904F47C425A61620504D5164A136D81 +:1039F0000BB1506D9847230504D5134A936D0BB155 +:103A0000D06D9847E00404D50F4A136E0BB1506E89 +:103A10009847A10404D50C4A936E0BB1D06E984719 +:103A2000620404D5084A136F0BB1506F9847230402 +:103A300004D5054A936F0BB1D06F9847BDE810408D +:103A4000FFF712BE003C0140A030002008B503483B +:103A5000FDF798FABDE80840FFF706BEBC2300203A +:103A600008B5FFF74FFEBDE80840FFF7FDBD0000B9 +:103A7000062108B50846FFF709FB06210720FFF7D6 +:103A800005FB06210820FFF701FB06210920FFF7AF +:103A9000FDFA06210A20FFF7F9FA06211720FFF7A1 +:103AA000F5FA06212820FFF7F1FA07213220FFF767 +:103AB000EDFABDE808400C212620FFF7E7BA000028 +:103AC00008B5FFF735FE00F00DF8FDF76FFCFDF7C8 +:103AD00055FEFDF72DFDFFF791FDBDE80840FFF70E +:103AE000B5BC00000023054A19460133102BC2E97A +:103AF000001102F10802F8D1704700BFA030002089 +:103B0000034611F8012B03F8012B002AF9D1704765 +:103B100053544D3332463F3F3F0053544D333246AA +:103B20003430780053544D33324634327800535495 +:103B30004D333246343436585800000001203300EB +:103B40000010410001105A00031059000710310005 +:103B500000000000103B0008130400001A3B00089E +:103B600019040000243B0008210400002E3B00083B +:103B700000960000000000000000000000000000AF +:103B800000000000000000006D1300085913000839 +:103B900095130008811300088D130008791300089D +:103BA0006513000851130008A1130008000000006D +:103BB000AD14000899140008D5140008C1140008B9 +:103BC000CD140008B9140008A514000891140008C9 +:103BD000E1140008000000000100000000000000E7 +:103BE00063300000E03B0008802600209028002081 +:103BF0004865782F50726F6669434E430025424FE7 +:103C0000415244252D424C002553455249414C25F3 +:103C1000000000000200000000000000C9160008BB +:103C20003517000840004000302D0020402D0020B6 +:103C3000020000000000000003000000000000007F +:103C4000791700080000000010000000502D00202F +:103C500000000000010000000000000028300020EB +:103C6000010102002D2200083D210008D921000891 +:103C7000BD210008430000007C3C0008090243000D +:103C8000020100C032090400000102020100052403 +:103C9000001001052401000104240202052406008D +:103CA00001070582030800FF09040100020A000061 +:103CB00000070501024000000705810240000000E6 +:103CC00012000000C83C0008120110010200004070 +:103CD000AE2D0510000201020301000004030904D7 +:103CE00025424F41524425004375626550757270FC +:103CF0006C65003031323334353637383941424320 +:103D00004445460000400000004000000040000024 +:103D1000004000000000010000000200000002005E +:103D2000000002000000020000000200000002008B +:103D300000000200004000000040000000400000C1 +:103D4000004000000000010000000200000002002E +:103D5000000002000000020000000200000002005B +:103D60000000020000000000BD180008751B0008DC +:103D7000211C0008400040008830002088300020CE +:103D80000100000098300020800000004001000089 +:103D9000030000006D61696E0069646C65000000DD +:103DA0000500802A00020000AAAAAAAA0A0000248C +:103DB000FCFF00000000000000A00A000004050055 +:103DC00000000000AAAAAAAA00080A00DFFC00005E +:103DD000000000000000000014000054000000007B +:103DE000AAAAAAAA14000054FFFF000000000000C5 +:103DF000000000008069100000000000AAAA8AAA42 +:103E000040561000FFFF0000007070070000000027 +:103E10000001000100000000AAAAAAAA00010000F7 +:103E2000FFFF000000000000000000000000000094 +:103E300000000000AAAAAAAA00000000FFFF0000DC +:103E40000000000000000000000000000000000072 +:103E5000AAAAAAAA00000000FFFF000000000000BC +:103E60000000000000000000000000000A00000048 +:103E7000000000000300000000000000000000003F +:103E80000000000000000000000000000000000032 +:103E90000000000000000000000000000000000022 +:103EA000090000000000000000C01F00000000002A +:103EB000FF00000098280020BC230020009600008E +:103EC0000000080096000000000800000400000048 +:103ED000DC3C0008000000000000000000000000C2 +:0C3EE000000000000000000000000000D6 :00000001FF diff --git a/Tools/bootloaders/CubeRedPrimary-PPPGW_bl.bin b/Tools/bootloaders/CubeRedPrimary-PPPGW_bl.bin index 60d444d053..825898a872 100755 Binary files a/Tools/bootloaders/CubeRedPrimary-PPPGW_bl.bin and b/Tools/bootloaders/CubeRedPrimary-PPPGW_bl.bin differ diff --git a/Tools/bootloaders/CubeRedPrimary_bl.bin b/Tools/bootloaders/CubeRedPrimary_bl.bin index 1a7434b27d..f36ac6e09d 100755 Binary files a/Tools/bootloaders/CubeRedPrimary_bl.bin and b/Tools/bootloaders/CubeRedPrimary_bl.bin differ diff --git a/Tools/bootloaders/CubeRedPrimary_bl.hex b/Tools/bootloaders/CubeRedPrimary_bl.hex index 24cf9e99d0..af096624e2 100644 --- a/Tools/bootloaders/CubeRedPrimary_bl.hex +++ b/Tools/bootloaders/CubeRedPrimary_bl.hex @@ -1,39 +1,39 @@ :020000040800F2 -:1000000000070020F102000835230008E92200085B -:1000100011230008E922000809230008F302000860 -:10002000F3020008F3020008F3020008894F0008F9 +:1000000000070020F102000849230008FD22000833 +:1000100025230008FD2200081D230008F302000824 +:10002000F3020008F3020008F3020008ED4F000895 :10003000F3020008F3020008F3020008F3020008CC :10004000F3020008F3020008F3020008F3020008BC -:10005000F3020008F3020008456800087168000810 -:100060009D680008C9680008F5680008ED280008C8 -:1000700015290008412900086D2900089929000860 -:10008000C1290008ED290008F3020008F302000866 -:10009000F3020008F3020008F302000821690008D7 +:10005000F3020008F3020008B1680008DD68000838 +:10006000096900083569000861690008012900086C +:10007000292900085529000881290008AD29000810 +:10008000D5290008012A0008F3020008F30200083D +:10009000F3020008F3020008F30200088D6900086B :1000A000F3020008F3020008F3020008F30200085C :1000B000F3020008F3020008F3020008F30200084C :1000C000F3020008F3020008F3020008F30200083C -:1000D000F3020008F30200080D6A0008F3020008AA -:1000E00085690008F3020008F3020008F302000823 -:1000F000F3020008F3020008F3020008192A0008BE -:10010000F3020008F3020008356A0008F302000851 +:1000D000F3020008F3020008796A0008F30200083E +:1000E000F1690008F3020008F3020008F3020008B7 +:1000F000F3020008F3020008F30200082D2A0008AA +:10010000F3020008F3020008A16A0008F3020008E5 :10011000F3020008F3020008F3020008F3020008EB -:10012000452A00086D2A0008992A0008C52A0008F7 -:10013000F12A0008F3020008F3020008F3020008A5 +:10012000592A0008812A0008AD2A0008D92A0008A7 +:10013000052B0008F3020008F3020008F302000890 :10014000F3020008F3020008F3020008F3020008BB -:10015000192B0008452B0008712B0008F30200083A +:100150002D2B0008592B0008852B0008F3020008FE :10016000F3020008F3020008F3020008F30200089B -:10017000F3020008115D0008F3020008F302000812 -:10018000F3020008F3020008216A0008F3020008E5 +:10017000F3020008755D0008F3020008F3020008AE +:10018000F3020008F30200088D6A0008F302000879 :10019000F3020008F3020008F3020008F30200086B :1001A000F3020008F3020008F3020008F30200085B -:1001B000F9690008F3020008F3020008F3020008DE +:1001B000656A0008F3020008F3020008F302000871 :1001C000F3020008F3020008F3020008F30200083B -:1001D000F3020008FD5C0008F3020008F3020008C7 +:1001D000F3020008615D0008F3020008F302000862 :1001E000F3020008F3020008F3020008F30200081B :1001F000F3020008F3020008F3020008F30200080B :10020000F3020008F3020008F3020008F3020008FA :10021000F3020008F3020008F3020008F3020008EA -:10022000F3020008F30200087D510008F302000801 +:10022000F3020008F3020008E1510008F30200089D :10023000F3020008F3020008F3020008F3020008CA :10024000F3020008F3020008F3020008F3020008BA :10025000F3020008F3020008F3020008F3020008AA @@ -45,46 +45,46 @@ :1002B000F3020008F3020008F3020008F30200084A :1002C000F3020008F3020008F3020008F30200083A :1002D000F3020008F3020008F3020008F30200082A -:1002E000D5040008B11F0008C1220008000000006A +:1002E000D5040008C51F0008D52200080000000042 :1002F00002E000F000F8FEE772B6374880F30888A5 :10030000364880F3098836483649086040F20000D4 :10031000CCF200004EF63471CEF200010860BFF35B :100320004F8FBFF36F8F40F20000C0F2F0004EF627 :100330008851CEF200010860BFF34F8FBFF36F8F7B :100340004FF00000E1EE100A4EF63C71CEF20001D3 -:100350000860062080F31488BFF36F8F04F076FEE8 -:1003600006F050F84FF055301F491B4A91423CBFF0 +:100350000860062080F31488BFF36F8F04F0A8FEB6 +:1003600006F082F84FF055301F491B4A91423CBFBE :1003700041F8040BFAE71D49184A91423CBF41F885 :10038000040BFAE71A491B4A1B4B9A423EBF51F82D :10039000040B42F8040BF8E700201849184A914270 -:1003A0003CBF41F8040BFAE704F08EFE06F09AF821 +:1003A0003CBF41F8040BFAE704F0C0FE06F0D0F8B9 :1003B000144C154DAC4203DA54F8041B8847F9E796 :1003C00000F050F8114C124DAC4203DA54F8041B03 -:1003D0008847F9E704F076BE0007002000230020DC +:1003D0008847F9E704F0A8BE0007002000230020AA :1003E0000000000808ED00E00001002000070020E8 -:1003F00050730008002300206C230020702300208D +:1003F000B8730008002300206C2300207023002025 :1004000028690020E0020008EC020008EC02000865 :10041000EC0200082DE9F04F2DED108AC1F80CD048 :10042000D0F80CD0BDEC108ABDE8F08F002383F328 -:1004300011882846A047002003F0D6FEFEE703F00F -:1004400015FE00DFFEE70000054B10B50446036013 +:1004300011882846A047002003F0E0FEFEE703F005 +:100440001FFE00DFFEE70000054B10B50446036009 :10045000806810B103685B689847204610BD00BFF4 -:10046000BC6C000870B500F0A5FD00F0FBFF04F0C7 -:1004700091FC054604F07EFD0446B8B9134B9D423D +:10046000286D000870B500F0A5FD00F0FBFF04F05A +:100470009BFC054604F0B0FD0446B8B9134B9D4201 :1004800016D001339D4241F2883512BF0446002543 -:1004900001240F4E002004F087FC304601F0AAFB37 -:1004A00040B944F6206003F0A5FEF6E70025F0E72A +:1004900001240F4E002004F091FC304601F0B4FB23 +:1004A00040B944F6206003F0AFFEF6E70025F0E720 :1004B0000546EEE70CB100F08FF800F011FF28467A :1004C00000F038F900F088F8F9E700BF010007B044 :1004D000702300200448054B054A036000230549AA -:1004E000836006F005BB00BF70230020BC6C0008D1 +:1004E000836006F03BBB00BF70230020286D00082E :1004F000C42500204904000808B500F027FDA0F13C :1005000020035842584108BD07B5042101900DEB66 :10051000010000F039FD03B05DF804FB07B541F2BE :100520001203022101A8ADF8043000F02DFD03B044 :100530005DF804FB38B5302383F31188174803684E -:100540000BB103F035FF0023154A4FF47A711348BD -:1005500003F024FF002383F31188124C236813B1A6 +:100540000BB103F03FFF0023154A4FF47A711348B3 +:1005500003F02EFF002383F31188124C236813B19C :100560002368013B2360636813B16368013B6360E8 :100570000D4D2B7833B963687BB9022000F0E0FDA4 :10058000322363602B78032B07D163682BB90220D9 @@ -93,7 +93,7 @@ :1005B00003280CD8DFE800F008050208022000F04C :1005C000B7BD022000F0AABD024B00225A6070475E :1005D0001824002020250020F7B54E4801A901F07D -:1005E00089FC002800F094804B4B4C4A1C4619684B +:1005E00093FC002800F094804B4B4C4A1C46196841 :1005F000013100F08A8004339342F8D16268484B9D :100600009A4240F28280474B9B6803F1006303F5F6 :1006100000339A4279D2002000F0F2FC0220FFF76A @@ -111,14 +111,14 @@ :1006D00013F1200FF2D1BFF34F8FBFF36F8FBFF332 :1006E0004F8FBFF36F8F536923F40033536100239F :1006F000C2F85032BFF34F8FBFF36F8F302383F3B5 -:100700001188854680F308882047024800F03AFFA8 +:100700001188854680F308882047024800F044FF9E :1007100003B0F0BD70230020000002082000020892 :10072000FFFF010800230020004502580044025842 :1007300000ED00E02DE9F04FB24B9DB02022FF21EB :10074000079014A89E68DB68069300F073FDAE4A1C :100750001378A3B90121AD4811700360302383F3EE -:10076000118803680BB103F023FE0023A84A4FF45D -:100770007A71A64803F012FE002383F31188079BC9 +:10076000118803680BB103F02DFE0023A84A4FF453 +:100770007A71A64803F01CFE002383F31188079BBF :1007800013B1A44B079A1A60A34A1378032B03D022 :10079000002313709F4A53600023079D1F469B460A :1007A000CDE90433012000F0C3FC00F0E9FD2DB1D8 @@ -161,17 +161,17 @@ :1009F000203053430D9A93421AD20B4800F0AAFBC1 :100A000034E700BF002300201C2500200024002024 :100A1000350500082025002018240020042300208C -:100A2000082300200C230020606B000870230020A6 +:100A2000082300200C230020CC6B0008702300203A :100A3000BE484746C24600F08DFBFFF76FFD01211F :100A40000DF12F0000F0A0FA0D9B534541D9002372 -:100A50000EAA39464846CDE90E330FAB00F096FD9D -:100A6000002884D001F06EFC0E9B00EB03080121EE -:100A70000DF12F0000F088FA01F064FC404520D908 -:100A8000484600F0BDFF80B964210D9BA84801379E +:100A50000EAA39464846CDE90E330FAB00F0A0FD93 +:100A6000002884D001F078FC0E9B00EB03080121E4 +:100A70000DF12F0000F088FA01F06EFC404520D9FE +:100A8000484600F0C7FF80B964210D9BA848013794 :100A900001FB0AF1B1FBF3F18DF82F10C9B200F0A0 -:100AA00059FBD9F820309A44CEE701F04BFC0F9B5C -:100AB000184440453FF65BAF01F044FC0E9B00EB51 -:100AC00003080E9B4FF47A70A3FB000303F092FB24 +:100AA00059FBD9F820309A44CEE701F055FC0F9B52 +:100AB000184440453FF65BAF01F04EFC0E9B00EB47 +:100AC00003080E9B4FF47A70A3FB000303F09CFB1A :100AD000CDE7642301210DF12F0027468DF82F303B :100AE00000F052FA002306930AE7002F3FF4BEAE4F :100AF000049B03F00B030B2B7FF4B8AE0220FFF72F @@ -184,10 +184,10 @@ :100B600085AE0027DFF8D491CDE90E77B8F1000FFC :100B700002D12746089BB6E70FAB6F4A0699484655 :100B800002930EAB3A44394401930DAB00934346B4 -:100B900001F018F900283FF4EAAE01F0D5FB0D9BF7 -:100BA0008A4609901F44A8EB030801F0CDFB099A7F +:100B900001F022F900283FF4EAAE01F0DFFB0D9BE3 +:100BA0008A4609901F44A8EB030801F0D7FB099A75 :100BB0000E9B9B184AF10002834272EB0103F4D2B0 -:100BC000484600F01DFF0028EFD1CFE7002F3FF48B +:100BC000484600F027FF0028EFD1CFE7002F3FF481 :100BD0004DAE049B03F00B030B2B7FF447AE0220BA :100BE000FFF7E4FC322000F0B1F9B0F10008FFF6A5 :100BF0003DAE18F003047FF439AE4E4A08EB06030D @@ -203,16 +203,16 @@ :100C90003FF4ECAD00F0F2F900283FF4E7AD00249A :100CA000A046244B9B68A34258D91F2C11D8149BF3 :100CB00001330ED024F003031CAA134453F8203C44 -:100CC0000F93404604220FA9043401F079F98046BD +:100CC0000F93404604220FA9043401F083F98046B3 :100CD000E7E7204600F096F90F90F2E764210EA8AE :100CE00000F048F9044600287FF4C0AD0220FFF769 :100CF00003FC00283FF4BAAD0E9BA046DFF83CA0F1 :100D000003F003090E99A1EB0901A14218D921466C -:100D100004230FAA504601F0A1F8404604220FA96F -:100D200001F04EF904348046ECE700BF856B000803 -:100D30009D6B0008002300201C240020702300204D -:100D4000B9F1000F0AD04B460FAA624801F086F8AD -:100D500040464A460FA901F033F980464046FFF766 +:100D100004230FAA504601F0ABF8404604220FA965 +:100D200001F058F904348046ECE700BFF16B00088D +:100D3000096C0008002300201C24002070230020E0 +:100D4000B9F1000F0AD04B460FAA624801F090F8A3 +:100D500040464A460FA901F03DF980464046FFF75C :100D6000D3FBCDE5002364210FA80F9300F002F917 :100D700000287FF47BAD0220FFF7BEFB00283FF484 :100D800075AD0F9800F070F9E9E7002364210FA812 @@ -229,12 +229,12 @@ :100E30007A70FFF761FB00283FF418AD00F01EF94F :100E4000002845D0149B01330BD0082214A90020A0 :100E500000F0F8F900283BD02022FF2114A800F070 -:100E6000E9F9FFF75BFB1D4803F0C4F91DB0BDE8CD +:100E6000E9F9FFF75BFB1D4803F0CEF91DB0BDE8C3 :100E7000F08F002F3FF4FAAC049B03F00B030B2B15 :100E80007FF4F4AC002364210FA80F9300F072F8F4 :100E9000044600287FF4EAAC0220FFF72DFB8046D1 :100EA00000283FF4E3ACFFF739FB41F2883003F050 -:100EB000A1F90F9800F0B0FA4746254600F006FA6F +:100EB000ABF90F9800F0B0FA4746254600F006FA65 :100EC00070E407461CE54FF0000BCFE405944EE5B7 :100ED0003C464CE57023002000230020A086010042 :100EE0002DE9F84F4FF47A7306460D46002402FBB5 @@ -242,7 +242,7 @@ :100F000084FA5A1C01D0A34212D159F824002A466F :100F100031460368D3F820B03B46D847854207D115 :100F2000074B012083F800A0BDE8F88F0124E4E717 -:100F3000002CFBD04FF4FA7003F05CF90020F3E7CB +:100F3000002CFBD04FF4FA7003F066F90020F3E7C1 :100F4000882500201023002014230020002307B54B :100F5000024601210DF107008DF80730FFF7C0FFB1 :100F600020B19DF8070003B05DF804FB4FF0FF309F @@ -250,17 +250,17 @@ :100F80000100C0B2404208BD074B0A4630B4197890 :100F9000064B53F82140014623682046DD69044B87 :100FA000AC4630BC604700BF8825002014230020D9 -:100FB000A086010070B5104C0025104E03F096FC81 +:100FB000A086010070B5104C0025104E03F0A0FC77 :100FC00020803068238883420CD80025208801388F -:100FD00003F088FC23880544013BB5F5802F23806E -:100FE000F4D370BD03F07EFC336805440133B5F5DE +:100FD00003F092FC23880544013BB5F5802F238064 +:100FE000F4D370BD03F088FC336805440133B5F5D4 :100FF000003F3360E5D3E8E78A2500204025002044 -:1010000003F042BD00F1006000F500300068704759 -:1010100000F10060920000F5003003F0C3BC000056 +:1010000003F04CBD00F1006000F50030006870474F +:1010100000F10060920000F5003003F0CDBC00004C :10102000054B1A68054B1B889B1A834202D9104452 -:1010300003F058BC00207047402500208A2500207E +:1010300003F062BC00207047402500208A25002074 :1010400038B50446074D29B128682044BDE838402A -:1010500003F060BC2868204403F04AFC0028F3D069 +:1010500003F06ABC2868204403F054FC0028F3D055 :1010600038BD00BF402500200020704700F1FF5030 :1010700000F58F10D0F8000870470000064991F87D :10108000243033B100230822086A81F82430FFF7A6 @@ -272,18 +272,18 @@ :1010E000ECD181420B4602D22C2203F8012B0424BE :1010F000094A1688AE4204D1984284BF967803F814 :10110000016B013C02F10402F3D1581A70BD00BF1B -:101110000010005C1C230020D86B0008022803D1BB +:101110000010005C1C230020446C0008022803D14E :10112000024B4FF400129A61704700BF001802583A :10113000022802D1014B20229A6170470018025800 :10114000022804D1024A536983F020035361704797 :10115000001802580FB4124B30B51A78B5B042B926 :101160000122104910481A704FF461430B6002F0DD -:1011700005FA39AB0C4C389AC82102A8019301F04A -:10118000B1F82368C8280246DD6902A9074B28BFC9 +:101170000FFA39AB0C4C389AC82102A8019301F040 +:10118000BBF82368C8280246DD6902A9074B28BFBF :10119000C8222046A84735B0BDE8304004B07047AB :1011A0008C250020902500206C260020A0860100C0 :1011B00070B504464FF47A764CB1412C254628BFD1 -:1011C000412506FB05F0641B03F014F8F4E770BD3D +:1011C000412506FB05F0641B03F01EF8F4E770BD33 :1011D000002310B5934203D0CC5CC4540133F9E72B :1011E00010BD0000013810B510F9013F3BB191F975 :1011F00000409C4203D11AB10131013AF4E71AB11F @@ -301,1554 +301,1561 @@ :1012B00082038342CFD0FFF7E1FE0028CBD100208C :1012C000BDE8F8830120FBE748250020024B1A788F :1012D000024B1A70704700BF8825002010230020A1 -:1012E00070B5204D204E2846204C02F0E9F93146D9 -:1012F000284602F011FA204602F0E2F91C49204685 -:1013000002F00AFA36684FF47A70D6F89020D2F8D4 +:1012E00070B5204D204E2846204C02F0F3F93146CF +:1012F000284602F01BFA204602F0ECF91C49204671 +:1013000002F014FA36684FF47A70D6F89020D2F8CA :10131000043843F00203C2F80438FFF749FF1549C7 -:10132000304602F007FBD6F89020134ED2F804386E +:10132000304602F011FBD6F89020134ED2F8043864 :10133000306823F002031149A842C2F804384FF480 -:10134000E1330B6003D0A04201D002F017F97068BE +:10134000E1330B6003D0A04201D002F021F97068B4 :10135000A84206D0A04204D00849BDE8704002F07F -:101360000DB970BDB831002048700008604A0020F7 -:1013700050700008587000081423002070250020C9 +:1013600017B970BDB8310020B4700008604A002081 +:10137000BC700008C47000081423002070250020F1 :101380002049214BF0B50A68ADF5017D9A4206D09F -:101390000B604FF400431D488B6002F0EFF81C4CCB +:101390000B604FF400431D488B6002F0F9F81C4CC1 :1013A0004FF4007269461B4E236820461D6A0023D5 :1013B000A847021E154D0ADD2B6869462846DF69DD -:1013C0000023B84700F0BEFF00F57A7030602B684C +:1013C0000023B84700F0C8FF00F57A7030602B6842 :1013D0004FF4007269460D481D6A0023A847021E9B :1013E00005DD236869460A48DC690023A04700F050 -:1013F000A9FF3368984294BF002001200DF5017DBC +:1013F000B3FF336898422CBF002001200DF5017D1A :10140000F0BD00BF2825002080841E00D8260020C3 :10141000604A0020442500200D4B0E4A70B50E4D49 :1014200004461E7855F82630934210D00B4A93425A :101430000DD00B4B002118221846FFF7FBFE04606D -:10144000014655F82600BDE8704002F097B870BD1F +:10144000014655F82600BDE8704002F0A1B870BD15 :1014500088250020B831002014230020604A002095 -:1014600070250020F0B5A1B071B600230120002442 -:1014700080261A46194601F019FC4FF4D067214A1C -:101480003D25136923BBD2F810310BBB036804F16F -:10149000006199600368C3F80CD003685E6003685C -:1014A0001F6001680B6843F001030B6001680B6863 -:1014B00023F01E030B6001680B68DB07FCD4037B81 -:1014C0008034416805FA03F3B4F5001F0B60D8D1EE -:1014D00001F022FCB4F5001F11D000240A4E0B4D80 -:1014E000012003F0D1FA3388A34205D928682044AB -:1014F000013403F00FFAF6E7002003F0C5FA61B6F5 -:1015000021B0F0BD002000528A2500204025002097 -:1015100080697047C0697047006A7047406A7047C9 -:10152000806A7047F0B5ADF2044D0E4605460021C5 -:101530004FF47F7201A80091FFF77CFE2C6A744380 -:1015400001362B6A7343A34216D92B686A4621469B -:1015500028465F684FF48063B84770B16A464FF41D -:10156000806312F8011BFF290AD1013B9BB2002BBB -:10157000F7D104F58064E4E701200DF2044DF0BDDD -:101580000020FAE780680368DB69184730B5456AD0 -:1015900085B004468D420FD30568CDE90023026A69 -:1015A00003ABAD6A5143A84720B1206A039BC31A1D -:1015B0005842584105B030BD0020FBE7F0B5C56981 -:1015C00087B004468D4212D30C9F8669056871432B -:1015D000CDE9013705AB00936D69036AA84720B1D7 -:1015E000A069059BC31A5842584107B0F0BD0020BE -:1015F000FBE70000F0B5662389B0002405464FF4F0 -:1016000080768068079403A9CDE90336CDE90544C7 -:1016100003685B699847A8682246214603680094DE -:101620001F692346B847A8689923079403A9CDE901 -:101630000336CDE9054403685B699847A8682246EC -:101640002146036800941D692346A84709B0F0BDF0 -:10165000254B2DE9F04F1B789FB0002504468DF8EF -:1016600028304FF09F0E80684FF00123ADF82950CD -:1016700005A90995CDE905E3CDE9075503685B693F -:101680009847A06803222946036800922A461E69EB -:101690000AABB04730B394F88C200C21134B01FBFC -:1016A00002339DF828101A7991421BD19DF8292008 -:1016B0005B799A4216D1A0684FF05A0C0C4B082661 -:1016C00005A90996CDE905C3CDE9075503685B690E -:1016D0009847A0682A462946036800961F690AAB06 -:1016E000B84738B900204BE1486B0008906C0008FF -:1016F000002500010422B3490AA805F00DFA0546A9 -:101700000028EFD1BDF82C306FF48277A3813B44E1 -:10171000012BE7D8079605A9CDE90A00A068036860 -:101720005B699847A0682A462946036800961E69A7 -:101730000AABB0470028D5D0DDE90A361A0202F418 -:10174000706242EA1662FF2ACCD11B0E26F07F4659 -:1017500050222946142B26610AA828BF1423A373FC -:10176000FFF768FDA068079605A903685B699847BD -:10177000A068A37B294602689B0000930AAB166908 -:101780002A46B0470028ADD00B990029AADBC9082A -:101790006FF07E43149D4FF0010E994228BF194609 -:1017A000C5F303130EFA03F221FA03F30391616107 -:1017B000A261E361002B95D02646A44600274FF096 -:1017C00002081EAAC7F3460302EB830353F834ACA6 -:1017D00007F001031B01DA1D0EFA03F908FA02F201 -:1017E000A2EB090202EA0A02DA401AD003F1080960 -:1017F0000F330EFA02F2216A08FA03F30EFA09FB1C -:10180000CCF830208A42A3EB0B0B0BEA0A0A2AFA27 -:1018100009F98CF82C90A36A88BF2262934288BF92 -:10182000A26201370CF1100C042FCAD1236A4FF0C9 -:10183000020C039A4FF0010E139F9A4224BFB2FB91 -:10184000F3F1616207F00F0138BF01234FF0090285 -:1018500001F1010138BF63624900336B33B3531C9C -:101860000EFA02F8A2F105090CFA03F30EFA09FACE -:10187000A3EB080302F1FF380CFA08F83B40A8EB91 -:101880000A08D34008EA070828FA09F87BD0012B98 -:101890007BD0022B7BD0032B08BF4FF47A735FFA07 -:1018A00088F808FB033373634B43B3630732103686 -:1018B000252AD2D115F0C04FC5F3417369D0012B51 -:1018C00069D0022B0CBF4FF47A634FF47A43C5F30F -:1018D000046202FB0333E3664B432367199B9E07B5 -:1018E0005CD0062384F8743015F4005F05F00F0314 -:1018F000C5F3042514BF40220822013305FB02254D -:101900005B00A5675D430A9B9F02E5677FF5EAAE32 -:101910000C9BC3F30722C3F3421103F01F0384F8A7 -:10192000802084F8881084F88130002A3FF4DAAEF1 -:10193000189BC3F3025213F4401F84F883207FF4F2 -:10194000D1AEDE0602D5042A7FF4CCAE03F40072D9 -:10195000002A14BF0122002284F8872004D0DD036E -:1019600024D5002384F88930179B1A0722D5002339 -:1019700084F88630702384F88530012384F88D3014 -:101980001FB0BDE8F08F012389E7102387E780238C -:1019900085E710239BE74FF4807398E7590701D53B -:1019A00050239FE713F0780F9ED09BE69903DBD579 -:1019B0000123D7E75B07E0D5012384F886300523B0 -:1019C000D9E700BFE86B000830B58BB000240546AE -:1019D000806803924FF00122059105A9CDE9062404 -:1019E000CDE90844026852699047A8680121039B29 -:1019F00002680091214615692246A8470BB030BD08 -:101A000013B50446A0680368DB6C98470028F9D139 -:101A10000DF1070294F885102046FFF7D5FF94F8E2 -:101A200086309DF807001BB100F0010002B010BD28 -:101A3000C043C0F3C010F9E730B54FF001238BB0BD -:101A40000024054680688DF80F20059105A9CDE991 -:101A50000634CDE9084403685B699847A868012209 -:101A60000DF10F01036800941D692346A8470BB0D0 -:101A700030BD0000F7B517460DF1070206461D46BA -:101A8000FFF7A2FF68B19DF8074039469DF8202076 -:101A9000304624EA05042A4022438DF80720FFF748 -:101AA000CBFF03B0F0BD000030B54FF4807389B0B8 -:101AB000002405468068039103A9CDE90434CDE9EB -:101AC000064403685B699847A86822462146036874 -:101AD00000941D692346A84709B030BD10B50446DF -:101AE00023682046DB6A98470028F9D110BD000022 -:101AF00010B590F8743004465BB1FFF7EFFF012397 -:101B000094F87410204684F88E30BDE81040FFF73A -:101B1000CBBF012010BD000010B590F87430044612 -:101B200053B1FFF7DBFF01232046042184F88E30F8 -:101B3000BDE81040FFF7B8BF012010BDF0B590F828 -:101B400083308BB00446042B50D100270DF10E02D8 -:101B500005218DF80E708DF80F70FFF735FF002806 -:101B60002FD00DF10F0235212046FFF72DFF40B396 -:101B700020461F4EFFF7BCFF2046FFF7AFFF05AD25 -:101B80000FCE0FC5336805A99DF80E202B609DF878 -:101B90000F30A06843F002038DF810208DF80F304D -:101BA0008DF8113003685B699847A068022204A988 -:101BB000036800971D693B46A84720B92046FFF7F8 -:101BC000ABFF002010E02046FFF7A6FF0DF10F024B -:101BD00035212046FFF7F8FE0028F2D09DF80F309F -:101BE0009B07EED5012363600BB0F0BD0120FBE73E -:101BF0004C6B00082DE9F341002304468068A36084 -:101C000010B103685B6898470025264E264F0C23C9 -:101C100001A839465FFA85F86B439A5900F072FAC9 -:101C2000019BA0680022A360019210B103685B6869 -:101C30009847019810B103685B689847A368E3B1BF -:101C400041F2883084F88C8002F0D4FA2046FFF705 -:101C5000D1FC1E2002F0CEFA2046FFF7F9FC054623 -:101C600088B994F88C300C2210485343F158FFF790 -:101C700071FA284602B0BDE8F0810135032DC6D1C6 -:101C80000B4800F059FB2046FFF758FF0C2294F850 -:101C90008C3005465343F15808B90648E7E7064833 -:101CA000E5E700BF906C0008A8250020F06B000855 -:101CB000666C00081A6C0008446C00082DE9F041BD -:101CC000044688B00F461646FFF712FF2046FFF77E -:101CD00005FF0025C722A0684FF48073079503A96C -:101CE000CDE90323CDE9055503685B699847A068F2 -:101CF0002A46294603680095D3F810802B46C04732 -:101D0000054630B92046FFF707FF284608B0BDE872 -:101D1000F081E36E3B60236F3360F3E72DE9F04120 -:101D2000002588B01F4604460E460E9B00F1400C6D -:101D3000A8463D60016B81B1A9420ED391420CD8F7 -:101D4000B6FBF1FE01FB1E6139B9416B90F82C80A6 -:101D50000F9D1960816B2960154610306045E9D1EF -:101D60006DB3AB196269934229D82046FFF7C0FED4 -:101D70002046FFF7B3FE4FF41453A06803A9CDF833 -:101D80000C80CDE904360026CDE9066603685B6960 -:101D90009847A0683246314603680096D3F8108011 -:101DA0003346C047064620462EB9FFF7B5FE3046FB -:101DB00008B0BDE8F081FFF7AFFE3D60F7E7002611 -:101DC000F5E700002DE9F0418669054688B00F4629 -:101DD000B3429046B1FBF6FC06FB1C1C28BF334601 -:101DE000A6EB0C0C00269C45644628BF1C46FFF75A -:101DF0007FFE2846FFF772FE0222A86803A9164B51 -:101E00000597CDE90323CDE9066603685B6998472A -:101E1000A86822464146036800961F693346B847C2 -:101E2000064628462EB9FFF777FE304608B0BDE8D3 -:101E3000F081FFF771FE0E9B1C60AB6FAA696343D4 -:101E4000B3FBF2F30F9A1360EA6F109B5443AA6935 -:101E5000B4FBF2F41C60E8E7002500012DE9F04F27 -:101E6000CE18436989B004469E420F46914639D840 -:101E70003D464FF40458DFF878A0FFF72FFEAE423E -:101E800034D994F88030A6EB050B94F8882003A988 -:101E900003930023BBF5806FA0680693636828BF97 -:101EA0004FF4806B0595012B14BF43465346012A1E -:101EB000049394F8813008BF03F1FF33079303685C -:101EC0005B699847A068A9EB07030268CDF800B0EA -:101ED0002B44D2F810B000221146D84718B105F5AE -:101EE0008065CCE7002009B0BDE8F08F0120FAE75B -:101EF00000ED0003F0B5044689B00E46FFF7EEFD95 -:101F000094F887502DB194F889302BB1012B24D04F -:101F10000025284609B0F0BD94F880300393F023E3 -:101F200006934FF4045304936368012B04BF1D4BC5 -:101F300004930023059394F88130A06803A90793C4 -:101F400003685B699847A068314603689B699847B6 -:101F50000546642002F04EF9DBE720460027FFF734 -:101F6000C7FD2046FFF7BAFD0823812285212046C0 -:101F70000097FFF77FFD054618B92046FFF7CCFD17 -:101F8000C7E794F8803006970393074B0493636880 -:101F9000012B04BF054B04930023059394F8813073 -:101FA000013BCAE700ED00030021001000ED001323 -:101FB000014B024A1A607047A8250020B86D00083E -:101FC00030B50A44084D91420DD011F8013B5840FC -:101FD000082340F30004013B2C4013F0FF0384EA84 -:101FE0005000F6D1EFE730BD2083B8ED7047000018 -:101FF00070470000002070470020704713B56C4602 -:1020000000F1140384E8060094E8030083E8050067 -:1020100002B010BD0020704713B56C4600F10C03F0 -:1020200084E8060094E8030083E8050002B010BDD0 -:102030000023C0E90333704782B002AB03E9060016 -:1020400002B07047704700000020704770470000E2 -:1020500000207047002070470120704782B00020A8 -:1020600002A901E90C0002B070470000002070478F -:1020700000207047036B1A79034B53F832309B6989 -:102080009868C0F340107047506D00080B68836378 -:102090004B6843638B68C363CB6803640B69436419 -:1020A0007047000038B5036B0446154D1B7955F891 -:1020B000330001F03FFFD4E90B231B7955F83310AF -:1020C00002F130034968994218D000231363E26A91 -:1020D0005363D4E90B12537C581E137C92681B0483 -:1020E00043EA002313438B63D4E90B131B7930318C -:1020F00055F83300BDE8384001F0B0BE38BD00BF30 -:10210000506D0008F8B51D4F05460E46114638685B -:10211000FFF77CF878BB74683B7924B394F82C20E3 -:102120009A420BD02468F8E70122B52100F01AF991 -:10213000736823603B79746084F82C30482000F089 -:1021400005F968B100220271C0E90322C0E9052245 -:10215000027A42F007020272094AC0E90B470260A4 -:1021600028602846F8BD402000F0F0F8044600281A -:10217000DAD12C60F5E700232B60F2E7B0250020D0 -:10218000606D0008044B10B504460360406A08B156 -:1021900000F0E6F8204610BD046D000810B50446B6 -:1021A000FFF7F0FF204600F0D7F8204610BD0000F2 -:1021B00008B519B1FFF776FF012008BD036B1A7946 -:1021C000024B53F8320001F0B9FEF5E7506D0008FC -:1021D0002DE9FF41DDF828800546174603911FFAD7 -:1021E00088F60293FFF75EFF02ABBAB203A9E86A72 -:1021F000009600F0CBF8044638B900212846FFF7D6 -:10220000D7FF204604B0BDE8F081AFB92B6B05F1D4 -:1022100034011A79134B53F83200B8F1000F19D179 -:1022200001F02AFE80F00104E4B23346E86ADDE9F9 -:10223000022100F0D1F8E0E7029B83B92B6B3A460C -:10224000084805F134011C79039B50F8340001F073 -:1022500029FEE7E7029B424601F03AFEE2E700244E -:10226000E3E700BF506D000813B504460191FFF786 -:1022700019FF019A236B04F134011879054B53F8C7 -:10228000300001F03BFE00212046FFF791FF0120C6 -:1022900002B010BD506D000810B50446FFF702FFF4 -:1022A000236B1A79054B53F8320001F035FE0021FB -:1022B0002046FFF77DFF012010BD00BF506D0008D4 -:1022C000054B064A1A6000221A719A60044ADA60C5 -:1022D00040F21F121A827047B0250020876C000858 -:1022E00000E1F50500F08ABA00B59BB0EFF3098173 -:1022F00068226846FEF76CFFEFF30583014B9B6B8A -:10230000FEE700BF00ED00E008B5FFF7EDFF0000BD -:1023100000B59BB0EFF3098168226846FEF758FFCD -:10232000EFF30583014B5B6BFEE700BF00ED00E0C0 -:10233000FEE70000FEE700000FB408B5029801F0C8 -:10234000FFFEFEE702F0C8BC02F0AABC01218842F1 -:1023500038BF084602F072BC08B102F073BC704787 -:10236000FFF7FABF38B5084B0446154601754360C0 -:102370000A21243002F04CFD04F128002A460A21EB -:1023800002F046FD204638BDCC6D0008F8B51E466B -:102390001B6805460C4617461BB9236863B9012420 -:1023A00008E0BDF818203146806A02F049FD002897 -:1023B000F3D100242046F8BD21463A46686A02F06F -:1023C00085FD04460028EAD13368002BF1D0A86AC5 -:1023D00002F0C0FDEEE7000038B50D461146044698 -:1023E0001A4611B1806A02F063FD2DB12946606A78 -:1023F000BDE8384002F0A6BD38BD000003680021EA -:102400001B68184703790BB1002202711846704708 -:1024100003685B681847000003791BB90123037147 -:1024200018467047002070477047000010B50446FA -:10243000FFF792FF204610BDF0B500F10B042346D4 -:102440000D46B1FBF2F102FB115707F13006392EB0 -:10245000C8BF07F13706954203F8016DF0D2421E5E -:10246000E11A13F8015B9C4202F8015FF9D10844BC -:10247000F0BD00002DE9F04F804687B015464FF0C3 -:1024800000090C4614F8013B002B3BD0252B08D04B -:10249000D8F800201946404609F10109D268904752 -:1024A00049E14B782D2B06BF8C1C0123002301939F -:1024B00023782B2B06BF01340127002794F800A0B6 -:1024C000BAF1300F0CBF01344FF0200A23782A2BC9 -:1024D0001CD16178023455F804BB2E2943D12178F0 -:1024E00081B12A2921D0661C0020A1F13002344696 -:1024F000D2B2092A1DD80A2316F8011B03FB0020BB -:102500000029F2D1484607B0BDE8F08F4FF0000B2C -:1025100014F8011B0029F5D0A1F13002D2B2092A2A -:10252000DBD80A2303FB0B2BF2E76178023455F862 -:10253000040B01F0DF024C2A17D121780029E1D0E9 -:10254000782904F101041FD8622900F2008158297A -:102550001AD84E2900F23081442900F0918049298F -:1025600000F08E8010E00020E3E7A1F1410278291D -:10257000D2B209D862290BD8582905D84E293BD8A0 -:10258000442978D0492976D02E468DF80C1056E093 -:10259000A1F16306152EF7D80FF2040C5CF826F0B3 -:1025A00031260008772600088925000889250008BB -:1025B0008925000889250008772600088925000854 -:1025C0008925000889250008892500088925000833 -:1025D00007270008F5270008892500088925000835 -:1025E0004726000889250008F127000889250008EA -:1025F00089250008F5270008A1F14F02092AC3D850 -:1026000001A050F822F000BF07270008F5270008B6 -:1026100089250008892500088925000889250008E2 -:10262000F12700088925000889250008F5270008FA -:102630002E464FF0200A56F8042B8DF80C2003ADDF -:102640000DF10D002BE02E4647F6FF726A4B56F84F -:10265000045B002808BF1046002D08BF1D462A460F -:102660002F18104612F8011B11B1B91A0029F8DA17 -:102670004FF0200A13E02E46192A56F8041B02D800 -:102680002E4656F8041B002936DA2D2249428DF8D1 -:102690000C200DF10D000A2203ADFFF7CDFE471B04 -:1026A0000199ABEB070323EAE372002945D1002B24 -:1026B000C2F1000B1EDD29782D2901D02B290DD167 -:1026C000BAF1300F0AD1D8F800304046019209F132 -:1026D0000109DB68013F98470135019AD8F80030BD -:1026E000514640460192DB6898471BF1010B019A65 -:1026F000F4D191443B4615E01FB12B228DF80C20FC -:10270000C7E703A8C7E708222E4603A856F8041B0C -:10271000C2E7D8F80020404615F8011BD2680193A3 -:102720009047019B013BF4D5002FA8BFB9445D46FB -:102730002DB9D94435462146A3E69346DAE7D8F8C1 -:10274000003051464046013DDB689847F0E7A1F173 -:102750006302152A3FF618AF01A353F822F000BF19 -:1027600031260008812600088925000889250008EF -:102770008925000889250008812600088925000888 -:102780008925000889250008892500088925000871 -:1027900007270008F5270008892500088925000873 -:1027A0004726000889250008F12700088925000828 -:1027B00089250008F5270008A1F14F02092A3FF6F4 -:1027C000E3AE01A353F822F007270008F52700081D -:1027D0008925000889250008892500088925000821 -:1027E000F12700088925000889250008F527000839 -:1027F0000A2289E7102287E7E46D0008F0B5054654 -:1028000087B016461F460C4689B14A1E002329464A -:1028100001A800F05FF83A46314601A8FFF72AFE0A -:10282000049BA3423CBF0022EA5407B0F0BD0A4615 -:10283000ECE70000D0E902239A421FBF4268D1545E -:10284000C36801331ABFC36000206FF001007047F6 -:10285000D0E903239A421FBF4268D25C013303616F -:1028600014BF10466FF001007047000003692BB1E0 -:10287000013B426803610020D15470476FF00100B2 -:102880007047000038B504460846D4E903315B1AA6 -:10289000934228BF13461D4663682A461944FEF733 -:1028A00097FC236928462B44236138BD38B504467C -:1028B000D0E902301B1A934228BF13461D466368B5 -:1028C0002A461844FEF784FCE36828462B44E3605C -:1028D00038BD000010B5C0E90223034C0023C0E955 -:1028E0000041036110BD00BFEC6D000808B5074B47 -:1028F000074A196801F03D01996053680BB190686F -:102900009847BDE8084002F077BB00BF00000240D6 -:10291000C825002008B5084B1968890901F03D0158 -:102920008A019A60054AD3680BB110699847BDE8DF -:10293000084002F061BB00BF00000240C825002033 -:1029400008B5084B1968090C01F03D010A049A60AA -:10295000054A53690BB190699847BDE8084002F0F9 -:102960004BBB00BF00000240C825002008B5084B43 -:102970001968890D01F03D018A059A60054AD369FD -:102980000BB1106A9847BDE8084002F035BB00BFA4 -:1029900000000240C825002008B5074B074A5968C7 -:1029A00001F03D01D960536A0BB1906A9847BDE8C8 -:1029B000084002F021BB00BF00000240C8250020F3 -:1029C00008B5084B5968890901F03D018A01DA60B0 -:1029D000054AD36A0BB1106B9847BDE8084002F076 -:1029E0000BBB00BF00000240C825002008B5084B03 -:1029F0005968090C01F03D010A04DA60054A536B7D -:102A00000BB1906B9847BDE8084002F0F5BA00BFE3 -:102A100000000240C825002008B5084B5968890D00 -:102A200001F03D018A05DA60054AD36B0BB1106CE9 -:102A30009847BDE8084002F0DFBA00BF000002403E -:102A4000C825002008B5074B074A196801F03D0169 -:102A50009960536C0BB1906C9847BDE8084002F048 -:102A6000CBBA00BF00040240C825002008B5084BBF -:102A70001968890901F03D018A019A60054AD36C01 -:102A80000BB1106D9847BDE8084002F0B5BA00BF21 -:102A900000040240C825002008B5084B1968090C3D -:102AA00001F03D010A049A60054A536D0BB1906D27 -:102AB0009847BDE8084002F09FBA00BF00040240FA -:102AC000C825002008B5084B1968890D01F03D01A3 -:102AD0008A059A60054AD36D0BB1106E9847BDE820 -:102AE000084002F089BA00BF00040240C825002057 -:102AF00008B5074B074A596801F03D01D960536E8C -:102B00000BB1906E9847BDE8084002F075BA00BF5F -:102B100000040240C825002008B5084B59688909FF -:102B200001F03D018A01DA60054AD36E0BB1106FE6 -:102B30009847BDE8084002F05FBA00BF00040240B9 -:102B4000C825002008B5084B5968090C01F03D0163 -:102B50000A04DA60054A536F0BB1906F9847BDE8DD -:102B6000084002F049BA00BF00040240C825002016 -:102B700008B5084B5968890D01F03D018A05DA60F6 -:102B8000054AD36F13B1D2F880009847BDE80840DA -:102B900002F032BA00040240C825002000230C498C -:102BA00010B51A460B4C0B6054F82300026001EB81 -:102BB000430004334260402BF6D1074A4FF0FF3305 -:102BC0009360D360C2F80834C2F80C3410BD00BF63 -:102BD000C8250020046E0008000002400F28F8B548 -:102BE00010D9102810D0112811D0122808D10F2484 -:102BF0000720DFF8B4E00126DEF80050A04208D933 -:102C0000002649E00446F4E70F240020F1E70724FA -:102C1000FBE706FA00F73D4240D1214C4FEA001C89 -:102C20003D4304EB00160EEBC000CEF80050C0E9A7 -:102C30000123FBB24BB11B48836B43F00103836359 -:102C4000036E43F001030366036E17F47F4F09D050 -:102C50001448836B43F002038363036E43F0020363 -:102C60000366036E54F80C00036823F01F0303602F -:102C7000056815F00105FBD104EB0C033D2493F826 -:102C80000CC05F6804FA0CF43C60212405604461C8 -:102C900012B1987B00F0A6FA3046F8BD0130ADE7DE -:102CA000046E000800450258C825002010B53024E5 -:102CB00084F31188FFF792FF002383F3118810BD7E -:102CC00010B50446807B00F0A3FA01231049627B13 -:102CD00003FA02F20B6823EA0203DAB20B604AB984 -:102CE0000C4A916B21F001019163116E21F00101F9 -:102CF0001166126E13F47F4F09D1064B9A6B22F0C6 -:102D000002029A631A6E22F002021A661B6E10BD4E -:102D1000C82500200045025808B5302383F31188E8 -:102D2000FFF7CEFF002383F3118808BD8A0710B593 -:102D300004461DD50378042B1AD143681B682BB1B8 -:102D40000522027098472378052B01D102232370B6 -:102D5000302383F31188002104F1080001F064FAA4 -:102D6000002383F31188E069BDE8104002F0C4BA83 -:102D7000CB0704D50248BDE8104001F0E1B910BD11 -:102D8000046F000810B5044C204601F05FF8034AB8 -:102D90000023C4E9062310BD4C2600200050005239 -:102DA00010B503780446012B12D10E4B98420FD177 -:102DB00002460D49102002F071FA0C4BE0615A6B8B -:102DC00042F480425A63DA6D42F48042DA65DB6D88 -:102DD0006268A36992685A60054A1A601B22DA6029 -:102DE00010BD00BF4C2600202D2D000800450258C4 -:102DF0001500020182691B2310B5D360D1E90030B0 -:102E000013F44C4406D19B011461D06103F4404398 -:102E1000536110BD0024184313F4406F1461CC6853 -:102E2000D4615061F5D08B689361F2E730B5846965 -:102E30001B25C069E5600068836104F12003C3615C -:102E400002234261013A03614223C3601623836275 -:102E5000CB682261E361D1E90023134312F4406F90 -:102E6000636101D08B68A361C36843F00103C36051 -:102E700030BD000030B5D0E90640006804F12005FF -:102E80008561C36108234261013A036146230D69EC -:102E9000C36016238362CB682261E361D1E900231A -:102EA000134312F4406F43EA854343F08063636148 -:102EB00001D08B68A361C36843F00103C36030BDD8 -:102EC0008069036823F0040310B5CC680360002315 -:102ED0000361C4618361D1E900430969234343EA83 -:102EE000814343F04063436112B14FF010431360DC -:102EF00010BD000083691A6842F002021A601A6865 -:102F00009207FCD41A6842F004021A60704700006D -:102F10008269936810B5D3609B0704461DD503787A -:102F2000032B1AD143681B682BB105220270984706 -:102F30002378052B01D102232370302383F31188DA -:102F4000002104F1080001F06FF9002383F31188D8 -:102F5000E069BDE8104002F0CFB910BD02684368D7 -:102F60001143016003B1184770470000024A13681B -:102F700043F0C0031360704700440040024A1368E6 -:102F800043F0C003136070470078004037B51A4C17 -:102F90001A4D204600F0E6FA04F1140000940023D4 -:102FA0004FF40072164900F0A3F94FF4007215496E -:102FB00004F138000094144B00F01CFA134BC4E9E0 -:102FC0001735134C204600F0CDFA04F1140000230D -:102FD0004FF400720F49009400F08AF90E4B4FF441 -:102FE00000720E4904F13800009400F003FA0C4B13 -:102FF000C4E9173503B030BD6C26002000E1F505AB -:1030000044270020442B00206D2F0008004400407E -:10301000D8260020442900207D2F0008442D0020C0 -:1030200000780040037C30B5274C002918BF0C46BF -:10303000012B0CD1254B984236D1254B9A6C42F48A -:1030400000329A641A6F42F400321A671B6F2268CA -:10305000036EC16D03EB52038466B3FBF2F3626847 -:10306000150442BF23F0070503F0070343EA4503B5 -:10307000CB60A36843F040034B60E36843F0010377 -:103080008B6042F4967343F001030B604FF0FF3303 -:103090000B62510505D512F0102211D0B2F1805FFC -:1030A00010D080F8643030BD0A4B9842CFD1084B25 -:1030B0009A6C42F080429A641A6F42F08042C4E7F0 -:1030C0007F23EEE73F23ECE7146F00086C26002017 -:1030D00000450258D82600202DE9F047C66D054668 -:1030E0003768F469210734621AD014F0080118BF58 -:1030F0004FF48071E20748BF41F02001A3074FF071 -:10310000300348BF41F04001600748BF41F08001F3 -:1031100083F31188281DFFF721FF002383F3118813 -:10312000E2050AD5302383F311884FF48061281D0E -:10313000FFF714FF002383F311884FF030094FF09D -:10314000000A14F0200838D13B0616D54FF030099C -:1031500005F1380A200610D589F31188504600F091 -:103160007DF9002836DA0821281DFFF7F7FE27F041 -:1031700080033360002383F31188790614D5620637 -:1031800012D5302383F31188D5E913239A4208D14D -:103190002B6C33B127F040071021281DFFF7DEFE0E -:1031A0003760002383F31188E30618D5AA6E1369EC -:1031B000ABB15069BDE8F047184789F31188736ACD -:1031C000284695F86410194000F0E6F98AF3118852 -:1031D000F469B6E7B06288F31188F469BAE7BDE82C -:1031E000F0870000090100F16043012203F561430B -:1031F000C9B283F8001300F01F039A4043099B00F3 -:1032000003F1604303F56143C3F880211A607047FE -:1032100000F01F0301229A40430900F160409B0027 -:1032200000F5614003F1604303F56143C3F880207A -:10323000C3F88021002380F800337047F8B51546A5 -:10324000826804460B46AA4200D28568A1692669B5 -:10325000761AB5420BD218462A46FDF7B9FFA36984 -:103260002B44A3612846A3685B1BA360F8BD0CD95F -:10327000AF1B18463246FDF7ABFF3A46E1683044D3 -:10328000FDF7A6FFE3683B44EBE718462A46FDF747 -:103290009FFFE368E5E7000083689342F7B50446C3 -:1032A000154600D28568D4E90460361AB5420BD2BF -:1032B0002A46FDF78DFF63692B4463612846A368A6 -:1032C0005B1BA36003B0F0BD0DD93246AF1B01916B -:1032D000FDF77EFF01993A46E0683144FDF778FF3B -:1032E000E3683B44E9E72A46FDF772FFE368E4E759 -:1032F00010B50A440024C361029B8460C16002616E -:103300000362C0E90000C0E9051110BD08B5D0E9AD -:103310000532934201D1826882B9826801328260AB -:103320005A1C426119700021D0E904329A4224BF2C -:10333000C368436100F092FF002008BD4FF0FF30EA -:10334000FBE7000070B5302304460E4683F3118876 -:10335000A568A5B1A368A269013BA360531CA36142 -:1033600015782269934224BFE368A361E3690BB136 -:1033700020469847002383F31188284607E031460A -:10338000204600F05BFF0028E2DA85F3118870BD6B -:103390002DE9F74F04460E4617469846D0F81C9084 -:1033A0004FF0300A8AF311884FF0000B154665B1D3 -:1033B0002A4631462046FFF741FF034660B94146A1 -:1033C000204600F03BFF0028F1D0002383F3118852 -:1033D000781B03B0BDE8F08FB9F1000F03D0019066 -:1033E0002046C847019B8BF31188ED1A1E448AF3CF -:1033F0001188DCE7C160C361009B82600362C0E9A1 -:1034000005111144C0E9000001617047F8B5044698 -:103410000D461646302383F31188A768A7B1A36829 -:10342000013BA36063695A1C62611D70D4E90432D8 -:103430009A4224BFE3686361E3690BB12046984771 -:10344000002080F3118807E03146204600F0F6FEA8 -:103450000028E2DA87F31188F8BD0000D0E90523DF -:1034600010B59A4201D182687AB98268002101328E -:1034700082605A1C82611C7803699A4224BFC36827 -:10348000836100F0EBFE204610BD4FF0FF30FBE7FC -:103490002DE9F74F04460E4617469846D0F81C9083 -:1034A0004FF0300A8AF311884FF0000B154665B1D2 -:1034B0002A4631462046FFF7EFFE034660B94146F3 -:1034C000204600F0BBFE0028F1D0002383F31188D2 -:1034D000781B03B0BDE8F08FB9F1000F03D0019065 -:1034E0002046C847019B8BF31188ED1A1E448AF3CE -:1034F0001188DCE7026843681143016003B1184793 -:10350000704700001430FFF743BF00004FF0FF3357 -:103510001430FFF73DBF00003830FFF7B9BF00009F -:103520004FF0FF333830FFF7B3BF00001430FFF720 -:1035300009BF00004FF0FF311430FFF703BF000058 -:103540003830FFF763BF00004FF0FF323830FFF72D -:103550005DBF0000012914BF6FF013000020704709 -:10356000FFF714BD044B036000234360C0E902333E -:1035700001230374704700BF2C6F000810B530237F -:10358000044683F31188FFF74DFD022300202374C6 -:1035900080F3118810BD000038B5C36904460D469C -:1035A0001BB904210844FFF7A5FF294604F11400C4 -:1035B000FFF7ACFE002806DA201D4FF40061BDE8DD -:1035C0003840FFF797BF38BD026843681143016078 -:1035D00003B118477047000013B5406B00F58054E5 -:1035E000D4F8A4381A681178042914D1017C02296E -:1035F00011D11979012312898B4013420BD101A9F2 -:103600004C3002F0B7FCD4F8A4480246019B217963 -:10361000206800F0DFF902B010BD0000143002F0A5 -:1036200039BC00004FF0FF33143002F033BC00000F -:103630004C3002F00BBD00004FF0FF334C3002F075 -:1036400005BD0000143002F007BC00004FF0FF3150 -:10365000143002F001BC00004C3002F0D7BC000076 -:103660004FF0FF324C3002F0D1BC00000020704718 -:1036700010B500F58054D4F8A4381A6811780429DC -:1036800017D1017C022914D15979012352898B4029 -:1036900013420ED1143002F099FB024648B1D4F81F -:1036A000A4484FF4407361792068BDE8104000F0F1 -:1036B0007FB910BD406BFFF7DBBF00007047000013 -:1036C0007FB5124B012504260446036000230574D0 -:1036D00000F1840243602946C0E902330C4B02909A -:1036E000143001934FF44073009602F04BFB094BEA -:1036F00004F69442294604F14C000294CDE900639B -:103700004FF4407302F012FC04B070BD546F000817 -:10371000B5360008D93500080A68302383F31188CC -:103720000B790B3342F823004B79133342F8230013 -:103730008B7913B10B3342F8230000F58053C3F8A3 -:10374000A41802230374002080F31188704700003E -:1037500038B5037F044613B190F85430ABB9012556 -:10376000201D0221FFF730FF04F114006FF001016A -:10377000257700F07FFD04F14C0084F854506FF081 -:103780000101BDE8384000F075BD38BD10B501211C -:1037900004460430FFF718FF0023237784F85430E1 -:1037A00010BD000038B504460025143002F002FBBD -:1037B00004F14C00257702F0D1FB201D84F8545011 -:1037C0000121FFF701FF2046BDE83840FFF750BF59 -:1037D00090F8803003F06003202B06D190F8812010 -:1037E0000023212A03D81F2A06D800207047222A46 -:1037F000FBD1C0E91D3303E0034A42670722826719 -:10380000C3670120704700BF3423002037B500F59F -:103810008055D5F8A4381A68117804291AD1017C8A -:10382000022917D11979012312898B40134211D132 -:1038300000F14C04204602F051FC58B101A9204689 -:1038400002F098FBD5F8A4480246019B2179206834 -:1038500000F0C0F803B030BD01F10B03F0B550F833 -:10386000236085B004460D46FEB1302383F31188F2 -:1038700004EB8507301D0821FFF7A6FEFB6806F163 -:103880004C005B691B681BB1019002F081FB019841 -:1038900003A902F06FFB024648B1039B294620466C -:1038A00000F098F8002383F3118805B0F0BDFB68A1 -:1038B0005A691268002AF5D01B8A013B1340F1D1E6 -:1038C00004F18002EAE70000133138B550F82140D6 -:1038D000ECB1302383F3118804F58053D3F8A42886 -:1038E0001368527903EB8203DB689B695D6845B11D -:1038F00004216018FFF768FE294604F1140002F065 -:103900006FFA2046FFF7B4FE002383F3118838BD19 -:103910007047000001F042BD01234022002110B594 -:10392000044600F8303BFDF785FC0023C4E9013371 -:1039300010BD000010B53023044683F31188242203 -:10394000416000210C30FDF775FC204601F048FD78 -:1039500002230020237080F3118810BD70B500EBA6 -:103960008103054650690E461446DA6018B11022EC -:103970000021FDF75FFCA06918B110220021FDF7BE -:1039800059FC31462846BDE8704001F029BE0000D0 -:1039900083682022002103F0011310B504468360E0 -:1039A0001030FDF747FC2046BDE8104001F0A4BEF2 -:1039B000F0B4012500EB810447898D40E4683D4364 -:1039C000A469458123600023A2606360F0BC01F01C -:1039D000C1BE0000F0B4012500EB810407898D40D1 -:1039E000E4683D436469058123600023A26063604D -:1039F000F0BC01F037BF000070B50223002504467B -:103A0000242203702946C0F888500C3040F8045C2A -:103A1000FDF710FC204684F8705001F075FD6368D6 -:103A20001B6823B129462046BDE87040184770BD89 -:103A30000378052B10B504460AD080F88C30052396 -:103A4000037043681B680BB1042198470023A360EF -:103A500010BD00000178052906D190F88C2043683C -:103A600002701B6803B118477047000070B590F8EA -:103A70007030044613B1002380F8703004F18002E6 -:103A8000204601F05DFE63689B68B3B994F880300E -:103A900013F0600535D00021204602F04FF90021D7 -:103AA000204602F03FF963681B6813B106212046E7 -:103AB0009847062384F8703070BD20469847002848 -:103AC000E4D0B4F88630A26F9A4288BFA36794F915 -:103AD0008030A56F002B4FF0300380F20381002D62 -:103AE00000F0F280092284F8702083F3118800210D -:103AF0002046D4E91D23FFF76DFF002383F31188CF -:103B0000DAE794F8812003F07F0343EA022340F2CE -:103B10000232934200F0C58021D8B3F5807F48D0AF -:103B20000DD8012B3FD0022B00F09380002BB2D197 -:103B300004F1880262670222A267E367C1E7B3F576 -:103B4000817F00F09B80B3F5407FA4D194F8823050 -:103B5000012BA0D1B4F8883043F0020332E0B3F572 -:103B6000006F4DD017D8B3F5A06F31D0A3F5C06367 -:103B7000012B90D86368204694F882205E6894F800 -:103B80008310B4F88430B047002884D0436863675A -:103B90000368A3671AE0B3F5106F36D040F602420F -:103BA00093427FF478AF5C4B63670223A3670023E3 -:103BB000C3E794F88230012B7FF46DAFB4F88830FE -:103BC00023F00203A4F88830C4E91D55E56778E7BF -:103BD000B4F88030B3F5A06F0ED194F8823020464F -:103BE00084F88A3001F0EEFC63681B6813B1012190 -:103BF00020469847032323700023C4E91D339CE724 -:103C000004F18B0363670123C3E72378042B10D1EE -:103C1000302383F311882046FFF7BAFE85F311881D -:103C20000321636884F88B5021701B680BB1204618 -:103C3000984794F88230002BDED084F88B30042330 -:103C4000237063681B68002BD6D00221204698475A -:103C5000D2E794F8843020461D0603F00F010AD500 -:103C600001F060FD012804D002287FF414AF2B4B33 -:103C70009AE72B4B98E701F047FDF3E794F8823081 -:103C8000002B7FF408AF94F8843013F00F01B3D009 -:103C90001A06204602D502F069F8ADE702F05AF89C -:103CA000AAE794F88230002B7FF4F5AE94F88430C4 -:103CB00013F00F01A0D01B06204602D502F03EF8FB -:103CC0009AE702F02FF897E7142284F8702083F324 -:103CD00011882B462A4629462046FFF769FE85F3C0 -:103CE0001188E9E65DB1152284F8702083F311880C -:103CF00000212046D4E91D23FFF75AFEFDE60B22E2 -:103D000084F8702083F311882B462A4629462046E2 -:103D1000FFF760FEE3E700BF846F00087C6F0008D8 -:103D2000806F000838B590F870300446002B3ED004 -:103D3000063BDAB20F2A34D80F2B32D8DFE803F073 -:103D40003731310822323131313131313131373788 -:103D5000856FB0F886309D4214D2C3681B8AB5FBCC -:103D6000F3F203FB12556DB9302383F311882B4610 -:103D70002A462946FFF72EFE85F311880A2384F888 -:103D800070300EE0142384F87030302383F31188F0 -:103D9000002320461A461946FFF70AFE002383F344 -:103DA000118838BDC36F03B198470023E7E70021AE -:103DB000204601F0C3FF0021204601F0B3FF6368F5 -:103DC0001B6813B10621204698470623D7E7000059 -:103DD00010B590F870300446142B29D017D8062B54 -:103DE00005D001D81BB110BD093B022BFBD8002127 -:103DF000204601F0A3FF0021204601F093FF6368F5 -:103E00001B6813B1062120469847062319E0152B9D -:103E1000E9D10B2380F87030302383F3118800231D -:103E20001A461946FFF7D6FD002383F31188DAE717 -:103E3000C3689B695B68002BD5D1C36F03B19847FA -:103E4000002384F87030CEE7FEF79CBF01210023E9 -:103E50000170C0E901330C3000F01CB910B53023FB -:103E6000044683F311884160FEF79AFF0223002085 -:103E7000237080F3118810BD10B53023044683F3FE -:103E80001188032304F8083BFEF7B4FF4FF0FF311D -:103E9000204600F0BBF9002383F31188C01A18BF35 -:103EA000012010BD38B50446302585F3118803255F -:103EB00004F8085BFEF7BAFF4FF0FF31204600F030 -:103EC000A5F9002383F31188C01A18BF012038BD5B -:103ED00038B50446302585F31188042504F8085BBD -:103EE000FEF7C8FF4FF0FF31204600F08FF90023A6 -:103EF00083F31188C01A18BF012038BD10B53023D4 -:103F0000044683F31188FEF7DBFF062323700023AA -:103F100083F3118810BD000010B53023044683F3ED -:103F20001188FEF7E7FF02232370002383F3118833 -:103F300010BD00000C3000F0C9B800000C3000F0DB -:103F4000CFB8000000238268037503691B68996875 -:103F50009142FBD25A68036042601060586070471B -:103F600000238268037503691B6899689142FBD836 -:103F70005A680360426010605860704708B5084690 -:103F8000302383F311880A7D0023052A06D8DFE851 -:103F900002F00B050503120E826913604FF0FF3328 -:103FA0008361FFF7CFFF002383F3118808BD826987 -:103FB000936801339360D0E9003213605A60EDE7F3 -:103FC000FFF7C0BF054BD9680875186802685360D1 -:103FD0001A600122D8600275FCF71CBA482F002035 -:103FE0000C4B30B5DD684B1C87B004460FD02B4618 -:103FF000094A684600F0D2F92046FFF7E3FF009B2C -:1040000013B1684600F0D4F9A86907B030BDFFF7D6 -:10401000D9FFF9E7482F00207D3F000838B50C4D47 -:1040200004468161EB6881689A68914203D8BDE8D3 -:104030003840FFF787BF1846FFF792FF012301467C -:10404000EC6020462375BDE83840FCF7E3B900BFBB -:10405000482F0020044B1A68DB6890689B689842E0 -:1040600094BF002001207047482F0020084B10B556 -:104070001C68D868226853601A600122DC602275CF -:10408000FFF76EFF01462046BDE81040FCF7C2B9BD -:10409000482F0020C0E90000816070478368013B21 -:1040A000002B10B583600CDA074BDC684368A06115 -:1040B000206063601C6044600520FFF783FFA069F7 -:1040C00010BD0020FCE700BF482F002008B53023BA -:1040D00083F31188FFF7E2FF002383F3118808BD03 -:1040E00008B5302383F3118883680133002B836084 -:1040F00007DC036800211A68026050601846FFF769 -:104100008DFF002383F3118808BD000038B501231B -:10411000084C00252370656002F01CF802F042F89C -:104120000549064802F016F90223237085F3118829 -:1041300038BD00BFB03100208C6F0008482F002030 -:1041400008B572B6044B186500F080FD00F05EFE05 -:10415000024B03221A70FEE7482F0020B0310020E6 -:1041600000F05CB9034A516853685B1A9842FBD867 -:10417000704700BF001000E08B6002230861084612 -:104180008B8270478368A3F1840243F8142C026980 -:1041900043F8442C426943F8402C094A43F8242C44 -:1041A000C268A3F1200043F8182C022203F80C2C5B -:1041B000002203F80B2C034A43F8102C704700BF71 -:1041C0002D040008482F002008B5FFF7DBFFBDE8ED -:1041D0000840FFF7F5BE0000024BDB6898610F2036 -:1041E000FFF7F0BE482F0020302383F31188FFF73C -:1041F000F3BF000008B50146302383F3118808207F -:10420000FFF7EEFE002383F3118808BD054BDB6842 -:1042100021B1036098610320FFF7E2BE4FF0FF3049 -:10422000704700BF482F002003682BB100220260B6 -:1042300018469961FFF7C4BE70470000064BDB6863 -:1042400039B1426818605A60136043600420FFF778 -:10425000C7BE4FF0FF307047482F002003689842D8 -:1042600006D01A680260506018469961FFF7A8BE30 -:104270007047000038B504460D462068844200D1DE -:1042800038BD036823605C608561FFF799FEF4E741 -:10429000036810B59C68A2420CD85C688A600B6009 -:1042A0004C602160596099688A1A9A604FF0FF3318 -:1042B000836010BD121B1B68ECE700000A2938BFA1 -:1042C0000A2170B504460D460A26601901F03CFF2C -:1042D00001F024FF041BA54203D8751C04462E469A -:1042E000F3E70A2E04D90120BDE8704002F072B84D -:1042F00070BD0000F8B5144B0D460A2A4FF00A07AE -:10430000D96103F11001826038BF0A224160196946 -:104310001446016048601861A81801F005FF01F01B -:10432000FDFE431B0646A34206D37C1C28192746E4 -:10433000354601F009FFF2E70A2F04D90120BDE854 -:10434000F84002F047B8F8BD482F0020F8B50646FF -:104350000D4601F0E3FE0F4A134653F8107F9F42CB -:1043600006D12A4601463046BDE8F840FFF7C2BFF5 -:10437000D169BB68441A2C1928BF2C46A34202D924 -:104380002946FFF79BFF224631460348BDE8F84027 -:10439000FFF77EBF482F0020582F0020C0E90323DD -:1043A000002310B45DF8044B4361FFF7CFBF00005A -:1043B00010B5194C236998420DD08168D0E90032BC -:1043C00013605A609A680A449A60002303604FF0B1 -:1043D000FF33A36110BD0268234643F8102F5360DA -:1043E0000022026022699A4203D1BDE8104001F028 -:1043F000A5BE936881680B44936001F08FFE22692B -:10440000E1699268441AA242E4D91144BDE810401F -:10441000091AFFF753BF00BF482F00202DE9F047CE -:10442000DFF8BC8008F110072C4ED8F8105001F0CE -:1044300075FED8F81C40AA68031B9A423ED8144463 -:104440004FF00009D5E90032C8F81C4013605A60EB -:10445000C5F80090D8F81030B34201D101F06EFEDB -:1044600089F31188D5E9033128469847302383F32F -:1044700011886B69002BD8D001F050FE6A69A0EB5F -:10448000040982464A450DD2022001F0A3FF002212 -:10449000D8F81030B34208D151462846BDE8F0475D -:1044A000FFF728BF121A2244F2E712EB0909294646 -:1044B000384638BF4A46FFF7EBFEB5E7D8F810306C -:1044C000B34208D01444C8F81C00211AA960BDE802 -:1044D000F047FFF7F3BEBDE8F08700BF582F00207C -:1044E000482F002038B501F019FE054AD2E90845E9 -:1044F000031B181945F10001C2E9080138BD00BFCE -:10450000482F002000207047FEE7000070470000A1 -:104510004FF0FF307047000002290CD0032904D06F -:104520000129074818BF00207047032A05D805480D -:1045300000EBC2007047044870470020704700BF7E -:10454000007100084C2300206870000870B59AB014 -:1045500005460846144601A900F0FAF801A8FCF740 -:1045600061FE431C0022C6B25B001046C5E9003460 -:1045700023700323023404F8013C01ABD1B20234AE -:104580008E4201D81AB070BD13F8011B013204F835 -:10459000010C04F8021CF1E708B5302383F31188FD -:1045A0000448FFF733F90448FFF730F9002383F399 -:1045B000118808BDB8310020604A002090F8803092 -:1045C00003F01F02012A07D190F881200B2A03D1A2 -:1045D0000023C0E91D3319E003F06003202B27D12D -:1045E00090F88430ABB990F885300BBB90F88120FF -:1045F000212A03D0222AEBD0202A19D1C3EBC303EE -:104600000C4A13444367072383670023C3670120D1 -:104610007047022B0CD190F885304BB990F881305F -:10462000212B03D0222BD3D0202B01D10123E5E76E -:10463000FFF7CEB83B23002013B5052927D8DFE8C4 -:1046400001F02D26032D2D37302383F311880478B4 -:10465000042C1ED11B4A01210190FFF77FF91A4A51 -:1046600002210198FFF77AF9184A03210198FFF710 -:1046700075F9174A21460198FFF770F91548FFF7B9 -:1046800091F81548FFF78EF8002383F3118802B0E4 -:1046900010BD032CF8D1FFF77BF9F5E7302383F346 -:1046A00011880C48FFF754F80B48FFF751F8EBE777 -:1046B000302383F311880748FFF768F80648FFF7AF -:1046C00065F8E1E7B86F0008DC6F000800700008CB -:1046D00024700008B8310020604A002038B50C4D25 -:1046E0000C4C2A460C4904F10800FFF72FFF05F196 -:1046F000CA0204F110000949FFF728FF05F5CA7244 -:1047000004F118000649BDE83840FFF71FBF00BF9D -:10471000686300204C230020986F0008A26F0008F7 -:10472000AD6F000870B5044608460D46FCF77AFDEB -:10473000C6B22046013403780BB9184670BD324624 -:104740002946FCF74FFD0028F3D10120F6E70000D1 -:104750002DE9F04705460C46FCF764FD2B49C6B22F -:104760002846FFF7DFFF08B10736F6B2284928468A -:10477000FFF7D8FF08B11036F6B2632E0BD8DFF87A -:104780008C80DFF88C90234FDFF894A02E7846B908 -:104790002670BDE8F08729462046BDE8F04702F0C4 -:1047A000CBB9252E2ED1072241462846FCF71AFD0B -:1047B00070B9194B224603F10C0153F8040B8B42DC -:1047C00042F8040BF9D11B8807350E341380DDE75E -:1047D000082249462846FCF705FD98B9A21C0F4B54 -:1047E000197802320909C95D02F8041C13F8011B8B -:1047F00001F00F015345C95D02F8031CF0D11834D4 -:104800000835C3E7013504F8016BBFE720710008E4 -:10481000AD6F0008377100082871000800E8F11F2B -:104820000CE8F11FBFF34F8F044B1A695107FCD1FD -:10483000D3F810215207F8D1704700BF0020005272 -:1048400008B50D4B1B78ABB9FFF7ECFF0B4BDA68E3 -:10485000D10704D50A4A5A6002F188325A60D3F867 -:104860000C21D20706D5064AC3F8042102F188328A -:10487000C3F8042108BD00BFC66500200020005217 -:104880002301674508B5114B1B78F3B9104B1A6922 -:10489000510703D5DA6842F04002DA60D3F81021FC -:1048A000520705D5D3F80C2142F04002C3F80C2181 -:1048B000FFF7B8FF064BDA6842F00102DA60D3F87E -:1048C0000C2142F00102C3F80C2108BDC66500208E -:1048D000002000520F289ABF00F58060400400209D -:1048E000704700004FF40030704700001020704700 -:1048F0000F2808B50BD8FFF7EDFF00F5003302686D -:10490000013204D104308342F9D1012008BD0020D6 -:10491000FCE700000F2838B505463FD8FFF782FFB7 -:104920001F4CFFF78DFF4FF0FF3307286361C4F87A -:1049300014311DD82361FFF775FF030243F02403F0 -:10494000E360E36843F08003E36023695A07FCD423 -:104950002846FFF767FFFFF7BDFF4FF4003100F077 -:1049600031FA2846FFF78EFFBDE83840FFF7C0BF99 -:10497000C4F81031FFF756FFA0F108031B0243F003 -:104980002403C4F80C31D4F80C3143F08003C4F88C -:104990000C31D4F810315B07FBD4D9E7002038BDC7 -:1049A000002000522DE9F84F05460C46104645EA16 -:1049B0000203DE0602D00020BDE8F88F20F01F00C1 -:1049C000DFF8BCB0DFF8BCA0FFF73AFF04EB00084B -:1049D000444503D10120FFF755FFEDE7202229468A -:1049E000204602F099F810B920352034F0E72B4624 -:1049F00005F120021F68791CDDD104339A42F9D1F8 -:104A000005F178431B481C4EB3F5801F1B4B38BF84 -:104A1000184603F1F80332BFD946D1461E46FFF7C8 -:104A200001FF0760A5EB040C336804F11C0143F09F -:104A300002033360231FD9F8007017F00507FAD17D -:104A400053F8042F8B424CF80320F4D1BFF34F8F5F -:104A5000FFF7E8FE4FF0FF3320222146036028468F -:104A6000336823F00203336002F056F80028BBD00D -:104A70003846B0E7142100520C2000521420005296 -:104A8000102000521021005210B5084C237828B194 -:104A90001BB9FFF7D5FE0123237010BD002BFCD0FE -:104AA0002070BDE81040FFF7EDBE00BFC6650020D6 -:104AB0002DE9F04F0D4685B0814658B111F00D0635 -:104AC00014BF2022082211F00803019304D0431ED2 -:104AD00003426AD0002435E0002E37D009F11F01CF -:104AE00021F01F094FF00108324F05F00403DFF8F1 -:104AF000D0A005EA080BBBF1000F32D07869C007DF -:104B00002FD408F101080C37B8F1060FF3D19EB984 -:104B1000294D4946A819019201F066FB0446002878 -:104B20003AD11836019A782EF3D1494601F05CFB50 -:104B30000446002830D1019A4946204801F054FB30 -:104B4000044668BB204605B0BDE8F08F0029C9D1F6 -:104B500001462846029201F047FB0446E0B9029A5A -:104B6000C0E713B178694107CBD5AC0702D57869A6 -:104B70008007C6D5019911B178690107C1D5182000 -:104B8000494600FB08A0CDE9022301F02DFB0446B5 -:104B9000DDE902230028B4D04A460021204601E086 -:104BA0004A460021FCF746FBCCE70246002E95D191 -:104BB00098E700BF48710008F8650020C86500202C -:104BC000E06500200021FFF773BF00000121FFF71F -:104BD0006FBF0000F8B5144D01241827134E40F2A2 -:104BE000FF3200210120FCF725FB07FB04600134A4 -:104BF0002A6955F80C1F01F0E3FA062CF5D1372588 -:104C00004FF4C0542046FFF7E1FF014628B1224689 -:104C10000748BDE8F84001F0D3BAC4EBC404013D35 -:104C20004FEAD404EED1F8BD48710008E0650020D9 -:104C3000C86500200421FFF73BBF00004843FFF791 -:104C4000C1BF000008B101F041BB704738B5054D48 -:104C500000240334696855F80C0B00F0C5F8122CD9 -:104C6000F7D138BD4871000870B5AAB140EA010318 -:104C700013F01F030FD1094C0144A5686D0706D539 -:104C80002568A84203D366683544A94204D9033392 -:104C90000C34122BF1D10022104670BD487100086F -:104CA00038B5EFF311859DB9EFF30584C4F308041B -:104CB000302334B183F31188FFF714FC85F3118896 -:104CC00038BD83F31188FFF70DFC84F3118838BDDC -:104CD000BDE83840FFF706BC10B5FFF7E1FF104C08 -:104CE000C008104A002340EA4170C908A0FB04EC48 -:104CF000A0FB020E1CEB0000A1FB044CA1FB021266 -:104D00005B41001943EB0C0011EB0E0142F1000274 -:104D1000411842F10000090941EA007010BD00BFCE -:104D2000CFF753E3A59BC4200244074BD2B210B582 -:104D3000904200D110BD441C00B253F8200041F84D -:104D4000040BE0B2F4E700BF504000580E4B30B502 -:104D50001C6F240405D41C6F1C671C6F44F40044B2 -:104D60001C670A4C02442368D2B243F48073236068 -:104D7000074B904200D130BD441C51F8045B00B297 -:104D800043F82050E0B2F4E70044025800480258CB -:104D90005040005807B5012201A90020FFF7C4FFC9 -:104DA000019803B05DF804FB13B50446FFF7F2FF6A -:104DB000A04205D0012201A900200194FFF7C6FFFF -:104DC00002B010BD0144BFF34F8F064B884204D39D -:104DD000BFF34F8FBFF36F8F7047C3F85C02203073 -:104DE000F4E700BF00ED00E00144BFF34F8F064B36 -:104DF000884204D3BFF34F8FBFF36F8F7047C3F860 -:104E000070022030F4E700BF00ED00E070470000C2 -:104E100070B5054616460C4601201021FFF70EFF1F -:104E2000286046733CB1204636B1FFF703FF2B687C -:104E3000186000B19C6070BDFFF7C8FEF7E7000086 -:104E4000F8B50F461546044648B905F11F0101267D -:104E5000386821F01F01FFF7B5FF3046F8BD427BEF -:104E600029463868FFF700FF06460028EDD13B6869 -:104E70006360A368AB4210D213B12068FFF7E2FE73 -:104E8000637B28462BB1FFF7D5FE206020B9A060D8 -:104E9000E3E7FFF79BFEF8E7A560206805F11F0137 -:104EA000012621F01F013860FFF78CFF2673D4E73D -:104EB00010B5044640B10068884205D1606808B169 -:104EC000FCF786F90023237310BD0000F8B50F46E8 -:104ED0001446054648B904F11F010126386821F03F -:104EE0001F01FFF781FF3046F8BD427B214638683D -:104EF000FFF7BAFE06460028EDD1AB68A34210D2F8 -:104F000013B12868FFF79EFE6B7B20462BB1FFF79D -:104F100091FE286020B9A860E5E7FFF757FEF8E7A3 -:104F2000AC60396819B122462868FCF751F9286845 -:104F300004F11F01012621F01F013860FFF754FF23 -:104F40002E73D0E720B103688B4204BF00230373A4 -:104F50007047000008B1002303737047034B1A68C1 -:104F60001AB9034AD2F8D0241A607047706600203C -:104F70000040025808B5FFF7F1FF024B1868C0F374 -:104F8000806008BD70660020EFF30983054968332F -:104F90004A6B22F001024A6383F30988002383F3FA -:104FA0001188704700EF00E0302080F3118862B66E -:104FB0000D4B0E4AD96821F4E0610904090C0A433B -:104FC0000B49DA60D3F8FC2042F08072C3F8FC2071 -:104FD000084AC2F8B01F116841F001011160202297 -:104FE000DA7783F82200704700ED00E00003FA054D -:104FF00055CEACC5001000E0302310B583F3118806 -:105000000E4B5B6813F4006314D0F1EE103AEFF32B -:1050100009844FF08073683CE361094BDB6B2366C6 -:1050200084F30988FFF716F810B1064BA36110BD91 -:10503000054BFBE783F31188F9E700BF00ED00E0C3 -:1050400000EF00E03F0400084204000870B5BFF321 -:105050004F8FBFF36F8F1A4A0021C2F85012BFF36F -:105060004F8FBFF36F8F536943F400335361BFF326 -:105070004F8FBFF36F8FC2F88410BFF34F8FD2F8FA -:10508000803043F6E074C3F3C900C3F34E335B01D1 -:1050900003EA0406014646EA81750139C2F8605206 -:1050A000F9D2203B13F1200FF2D1BFF34F8F536998 -:1050B00043F480335361BFF34F8FBFF36F8F70BDE5 -:1050C00000ED00E0FEE70000214B2248224A70B5C7 -:1050D000904237D3214BC11EDA1C121A22F0030270 -:1050E0008B4238BF00220021FCF7A4F81C4A0023A1 -:1050F000C2F88430BFF34F8FD2F8803043F6E074AB -:10510000C3F3C900C3F34E335B0103EA040601464F -:1051100046EA81750139C2F86C52F9D2203B13F18D -:10512000200FF2D1BFF34F8FBFF36F8FBFF34F8FBD -:10513000BFF36F8F0023C2F85032BFF34F8FBFF31E -:105140006F8F70BD53F8041B40F8041BC0E700BF0D -:10515000BC73000828690020286900202869002005 -:1051600000ED00E003681A6899685A6043681BB153 -:1051700042EA014180681847704700004FF0A4439D -:1051800010B51C68E00702D52848FFF7EBFFA10720 -:1051900002D52748FFF7E6FF620702D52548FFF74B -:1051A000E1FF230702D52448FFF7DCFFE00602D524 -:1051B0002248FFF7D7FFA10602D52148FFF7D2FF0B -:1051C000620602D51F48FFF7CDFF230602D51E4811 -:1051D000FFF7C8FFE00502D51C48FFF7C3FFA10594 -:1051E00002D51B48FFF7BEFF620502D51948FFF73D -:1051F000B9FF230502D51848FFF7B4FFE00402D534 -:105200001648FFF7AFFFA10402D51548FFF7AAFF24 -:10521000620402D51348FFF7A5FF230402D5124804 -:10522000FFF7A0FFBDE81040FFF7E6BE786600205C -:1052300084660020906600209C660020A8660020FE -:10524000B4660020C0660020CC660020D86600202E -:10525000E4660020F0660020FC660020086700205D -:1052600014670020206700202C67002030B5094B10 -:105270000021094C10200725196054F8042B01382F -:10528000C3E90121D16003F10C0311615560F4D130 -:1052900030BD00BF74660020907100080F28F0B583 -:1052A0000AD9102806D10F230020114C01272568A8 -:1052B000984203D9002018E00346F6E707FA00F603 -:1052C000354213D10C23354343432560181D234435 -:1052D000C3E90212074B20445A6B42F001025A63A1 -:1052E000DA6D42F00102DA65DB6DF0BD0130DFE717 -:1052F00074660020004502580368D968DA68C90757 -:1053000022F03F02DA6002D51A689207FCD5072224 -:105310005A607047054B996B21EA000199631A6E38 -:1053200022EA00021A661B6E704700BF0045025851 -:1053300070B5D0E9244300224FF0FF359E6804EB9E -:1053400042135101D3F80009002805DAD3F8000907 -:1053500040F08040C3F80009D3F8000B002805DABC -:10536000D3F8000B40F08040C3F8000B0132631803 -:105370009642C3F80859C3F8085BE0D24FF0011316 -:10538000C4F81C3870BD0000890141F020010161A2 -:1053900003699B06FCD41220FEF7E4BE10B50A4C4C -:1053A0002046FEF7B9FA094BC4F89030084BC4F810 -:1053B0009430084C2046FEF7AFFA074BC4F8903003 -:1053C000064BC4F8943010BD386700200000084038 -:1053D000F4710008D4670020000004400072000847 -:1053E00070B503780546012B58D13F4BD0F890405B -:1053F000984254D13D4B0E2165209A6B42F00062D9 -:105400009A631A6E42F000621A661B6E384BD3F82C -:10541000802042F00062C3F88020D3F8802022F080 -:105420000062C3F88020D3F88030FDF7DBFE314BFB -:10543000E360314BC4F800380023D5F89060C4F81D -:10544000003EC02323604FF40413A3633369002B91 -:10545000FCDA01230C203361FEF784FE3369DB079D -:10546000FCD41220FEF77EFE3369002BFCDA002606 -:105470002846A660FFF75CFF6B68C4F81068DB681D -:10548000C4F81468C4F81C6863BB1C4BA3614FF0DC -:10549000FF336361A36843F00103A36070BD184B41 -:1054A0009842C9D1114B4FF080609A6B42F0007264 -:1054B0009A631A6E42F000721A661B6E0C4BD3F898 -:1054C000802042F00072C3F88020D3F8802022F0C0 -:1054D0000072C3F88020D3F88030FFF71BFF0E2145 -:1054E0004D20A2E7074BD1E738670020004502585E -:1054F000004402584014004003002002003C30C029 -:10550000D4670020083C30C0F8B5D0F8904005467C -:1055100000214FF000662046FFF736FFD5F89410C3 -:1055200000234FF001128F684FF0FF30C4F8343879 -:10553000C4F81C2804EB431201339F42C2F80069EF -:10554000C2F8006BC2F80809C2F8080BF2D20B6867 -:10555000D5F89020C5F8983063621023136116695E -:1055600016F01006FBD11220FEF7FCFDD4F800382F -:1055700023F4FE63C4F80038A36943F4402343F0E6 -:105580001003A3610923C4F81038C4F814380B4B76 -:10559000EB604FF0C043C4F8103B094BC4F8003B2C -:1055A000C4F81069C4F80039D5F8983003F1100236 -:1055B00043F48013C5F89820A362F8BDD0710008A9 -:1055C00040800010D0F8902090F88A10D2F800386F -:1055D00023F4FE6343EA0113C2F800387047000069 -:1055E0002DE9F84300EB8103D0F890500C4680463B -:1055F000DA680FFA81F94801166806F00306731E8F -:10560000022B05EB41134FF0000194BFB604384E56 -:10561000C3F8101B4FF0010104F1100398BF06F10D -:10562000805601FA03F3916998BF06F500460029F8 -:105630003AD0578A04F15801374349016F50D5F8E1 -:105640001C180B430021C5F81C382B180127C3F880 -:105650001019A7405369611E9BB3138A928B9B0854 -:10566000012A88BF5343D8F89820981842EA034388 -:1056700001F140022146C8F89800284605EB820255 -:105680005360FFF781FE08EB8900C3681B8A43EA79 -:10569000845348341E4364012E51D5F81C381F43EF -:1056A000C5F81C78BDE8F88305EB4917D7F8001B4F -:1056B00021F40041C7F8001BD5F81C1821EA0303A8 -:1056C000C0E704F13F030B4A2846214605EB83035C -:1056D0005A60FFF759FE05EB4910D0F8003923F462 -:1056E0000043C0F80039D5F81C3823EA0707D7E78C -:1056F0000080001000040002D0F894201268C0F866 -:105700009820FFF715BE00005831D0F890304901BD -:105710005B5813F4004004D013F4001F0CBF0220A8 -:10572000012070474831D0F8903049015B5813F49C -:10573000004004D013F4001F0CBF0220012070476A -:1057400000EB8101CB68196A0B6813604B685360EA -:105750007047000000EB810330B5DD68AA6913686B -:10576000D36019B9402B84BF402313606B8A14683F -:10577000D0F890201C4402EB4110013C09B2B4FB6C -:10578000F3F46343033323F0030343EAC44343F0D6 -:10579000C043C0F8103B2B6803F00303012B0ED16C -:1057A000D2F8083802EB411013F4807FD0F8003BA8 -:1057B00014BF43F0805343F00053C0F8003B02EBAA -:1057C0004112D2F8003B43F00443C2F8003B30BD25 -:1057D0002DE9F041D0F8906005460C4606EB4113E8 -:1057E000D3F8087B3A07C3F8087B08D5D6F81438F5 -:1057F0001B0704D500EB8103DB685B689847FA0759 -:105800001FD5D6F81438DB071BD505EB8403D96800 -:10581000CCB98B69488A5A68B2FBF0F600FB1622B5 -:105820008AB91868DA6890420DD2121AC3E90024C6 -:10583000302383F3118821462846FFF78BFF84F33A -:105840001188BDE8F081012303FA04F26B8923EA91 -:1058500002036B81CB68002BF3D021462846BDE8BC -:10586000F041184700EB81034A0170B5DD68D0F8BC -:1058700090306C692668E66056BB1A444FF40020ED -:10588000C2F810092A6802F00302012A0AB20ED1F6 -:10589000D3F8080803EB421410F4807FD4F8000911 -:1058A00014BF40F0805040F00050C4F8000903EBF2 -:1058B0004212D2F8000940F00440C2F80009012267 -:1058C000D3F8340802FA01F10143C3F8341870BD6B -:1058D00019B9402E84BF4020206020681A442E8AC7 -:1058E0008419013CB4FBF6F440EAC44040F0005097 -:1058F000C6E700002DE9F843D0F8906005460C4655 -:105900004F0106EB4113D3F8088918F0010FC3F8D3 -:1059100008891CD0D6F81038DB0718D500EB8103B6 -:10592000D3F80CC0DCF81430D3F800E0DA68964500 -:1059300030D2A2EB0E024FF000091A60C3F80490B7 -:10594000302383F31188FFF78DFF89F3118818F056 -:10595000800F1DD0D6F834380126A640334217D028 -:1059600005EB84030134D5F89050D3F80CC0E4B2B1 -:105970002F44DCF8142005EB0434D2F800E0516821 -:10598000714514D3D5F8343823EA0606C5F83468CF -:10599000BDE8F883012303FA01F2038923EA020335 -:1059A0000381DCF80830002BD1D09847CFE7AEEB6D -:1059B0000103BCF81000834228BF0346D7F818093A -:1059C00080B2B3EB800FE3D89068A0F1040959F8D6 -:1059D000048FC4F80080A0EB09089844B8F1040FC4 -:1059E000F5D818440B4490605360C8E72DE9F84F90 -:1059F000D0F8905004466E69AB691E4016F480588A -:105A00006E6103D0BDE8F84FFDF7F6BF002E12DA45 -:105A1000D5F8003E9B0705D0D5F8003E23F00303E0 -:105A2000C5F8003ED5F80438204623F00103C5F838 -:105A30000438FEF70FF8370505D52046FFF778FC48 -:105A40002046FDF7F5FFB0040CD5D5F8083813F063 -:105A5000060FEB6823F470530CBF43F4105343F468 -:105A6000A053EB6031071BD56368DB681BB9AB69DA -:105A700023F00803AB612378052B0CD1D5F8003E49 -:105A80009A0705D0D5F8003E23F00303C5F8003E81 -:105A90002046FDF7DFFF6368DB680BB120469847BF -:105AA000F30200F1BA80B70226D5D4F8909000270F -:105AB0004FF0010A09EB4712D2F8003B03F44023F0 -:105AC000B3F5802F11D1D2F8003B002B0DDA62899B -:105AD0000AFA07F322EA0303638104EB8703DB6816 -:105AE000DB6813B13946204698470137D4F8943023 -:105AF000FFB29B689F42DDD9F00619D5D4F890001B -:105B0000026AC2F30A1702F00F0302F4F012B2F5B0 -:105B1000802F00F0CA80B2F5402F09D104EB830337 -:105B2000002200F58050DB681B6A974240F0B0808D -:105B30003003D5F8185835D5E90303D500212046A0 -:105B4000FFF746FEAA0303D501212046FFF740FEDA -:105B50006B0303D502212046FFF73AFE2F0303D53E -:105B600003212046FFF734FEE80203D50421204636 -:105B7000FFF72EFEA90203D505212046FFF728FED8 -:105B80006A0203D506212046FFF722FE2B0203D529 -:105B900007212046FFF71CFEEF0103D50821204610 -:105BA000FFF716FE700340F1A780E90703D5002137 -:105BB0002046FFF79FFEAA0703D501212046FFF7E5 -:105BC00099FE6B0703D502212046FFF793FE2F07AE -:105BD00003D503212046FFF78DFEEE0603D50421F1 -:105BE0002046FFF787FEA80603D505212046FFF7CC -:105BF00081FE690603D506212046FFF77BFE2A06B3 -:105C000003D507212046FFF775FEEB0574D5204626 -:105C10000821BDE8F84FFFF76DBED4F890904FF023 -:105C2000000B4FF0010AD4F894305FFA8BF79B68B1 -:105C30009F423FF638AF09EB4713D3F8002902F42F -:105C40004022B2F5802F20D1D3F80029002A1CDA97 -:105C5000D3F8002942F09042C3F80029D3F8002974 -:105C6000002AFBDB3946D4F89000FFF78DFB228930 -:105C70000AFA07F322EA0303238104EB8703DB68B4 -:105C80009B6813B13946204698470BF1010BCAE7D0 -:105C9000910701D1D0F80080072A02F101029CBFD0 -:105CA00003F8018B4FEA18283FE704EB830300F564 -:105CB0008050DA68D2F818C0DCF80820DCE9001C53 -:105CC000A1EB0C0C00218F4208D1DB689B699A681C -:105CD0003A449A605A683A445A6029E711F0030F2F -:105CE00001D1D0F800808C4501F1010184BF02F898 -:105CF000018B4FEA1828E6E7BDE8F88F08B503489E -:105D0000FFF774FEBDE80840FFF776B9386700205A -:105D100008B50348FFF76AFEBDE80840FFF76CB915 -:105D2000D4670020D0F8903003EB4111D1F8003B4C -:105D300043F40013C1F8003B70470000D0F89030E6 -:105D400003EB4111D1F8003943F40013C1F80039D5 -:105D500070470000D0F8903003EB4111D1F8003BC0 -:105D600023F40013C1F8003B70470000D0F89030D6 -:105D700003EB4111D1F8003923F40013C1F80039C5 -:105D80007047000030B50433039C0172002104FB0E -:105D90000325C160C0E90653049B0363059BC0E96A -:105DA0000000C0E90422C0E90842C0E90A114363C7 -:105DB00030BD00000022416AC260C0E90411C0E9A0 -:105DC0000A226FF00101FEF755BA0000D0E9043253 -:105DD000934201D1C2680AB9181D7047002070476C -:105DE000036919600021C2680132C260C2691344AC -:105DF00082699342036124BF436A0361FEF72EBAAE -:105E000038B504460D46E3683BB162690020131DB6 -:105E10001268A3621344E36207E0237A33B9294688 -:105E20002046FEF70BFA0028EDDA38BD6FF00100CE -:105E3000FBE70000C368C269013BC36043691344C8 -:105E400082699342436124BF436A436100238362B2 -:105E5000036B03B11847704770B53023044683F3D2 -:105E60001188866A3EB9FFF7CBFF054618B186F365 -:105E70001188284670BDA36AE26A13F8015B934259 -:105E8000A36202D32046FFF7D5FF002383F31188D6 -:105E9000EFE700002DE9F84F04460E4617469846F6 -:105EA0004FF0300989F311880025AA46D4F828B0AC -:105EB000BBF1000F09D141462046FFF7A1FF20B1F9 -:105EC0008BF311882846BDE8F88FD4E90A12A7EBB6 -:105ED000050B521A934528BF9346BBF1400F1BD9BF -:105EE000334601F1400251F8040B914243F8040B90 -:105EF000F9D1A36A403640354033A362D4E90A237E -:105F00009A4202D32046FFF795FF8AF31188BD42DB -:105F1000D8D289F31188C9E730465A46FBF758F9B9 -:105F2000A36A5E445D445B44A362E7E710B5029C4C -:105F30000433017203FB0421C460C0E9061300238B -:105F4000C0E90A33039B0363049BC0E90000C0E976 -:105F50000422C0E90842436310BD0000026A6FF0EA -:105F60000101C260426AC0E904220022C0E90A229B -:105F7000FEF780B9D0E904239A4201D1C26822B960 -:105F8000184650F8043B0B60704700231846FAE7A8 -:105F9000C3680021C2690133C36043691344826945 -:105FA0009342436124BF436A4361FEF757B900003F -:105FB00038B504460D46E3683BB1236900201A1D3D -:105FC000A262E2691344E36207E0237A33B9294607 -:105FD0002046FEF733F90028EDDA38BD6FF00100F6 -:105FE000FBE7000003691960C268013AC260C26938 -:105FF000134482699342036124BF436A036100230F -:106000008362036B03B118477047000070B53023FB -:106010000D460446114683F31188866A2EB9FFF7B0 -:10602000C7FF10B186F3118870BDA36A1D70A36A03 -:10603000E26A01339342A36204D3E1692046043942 -:10604000FFF7D0FF002080F31188EDE72DE9F84F2E -:1060500004460D46904699464FF0300A8AF311885F -:106060000026B346A76A4FB949462046FFF7A0FF6E -:1060700020B187F311883046BDE8F88FD4E90A07CC -:106080003A1AA8EB0607974228BF1746402F1BD99C -:1060900005F1400355F8042B9D4240F8042BF9D13B -:1060A000A36A40364033A362D4E90A239A4204D358 -:1060B000E16920460439FFF795FF8BF311884645C7 -:1060C000D9D28AF31188CDE729463A46FBF780F802 -:1060D000A36A3D443E443B44A362E5E7D0E9042380 -:1060E0009A4217D1C3689BB1836A8BB1043B9B1A58 -:1060F0000ED01360C368013BC360C3691A4483694F -:106100009A42026124BF436A036100238362012330 -:10611000184670470023FBE700F00ABA014B586AA3 -:10612000704700BF000C0040034B002258631A6107 -:106130000222DA60704700BF000C0040014B0022D1 -:10614000DA607047000C0040014B5863704700BF95 -:10615000000C0040024B034A1A60034A5A60704721 -:10616000886800202869002000000220074B49426F -:1061700010B55C68201A08401968821A8A4203D355 -:10618000A24201D85A6010BD0020FCE788680020B8 -:1061900008B5302383F31188FFF7E8FF002383F36A -:1061A000118808BD04480121044B03600023C0E9A5 -:1061B00001330C30FDF76EBF90680020916100083C -:1061C000CB1D083A23F00703591A521A012110B4C3 -:1061D000D2080024C0E9004384600C301C605A607F -:1061E0005DF8044BFDF756BF2DE9F84F364ECD1D37 -:1061F0000F46002818BF0646082A4FEAD50538BFC3 -:10620000082206F10C08341D91464046FDF75EFF5A -:1062100009F10701C9F1000E224624686CB9404615 -:10622000FDF75EFF3368CBB308224946E800984784 -:10623000044698B340E9026730E004EB010CD4F85F -:1062400004A00CEA0E0C0AF10100ACF1080304EB07 -:10625000C0009842E0D9A0EB0C0CB5EBEC0F4FEA74 -:10626000EC0BD9D89C421CD204F10802AB45A3EB3D -:1062700002024FEAE202626009D9691CED4320681C -:1062800003EBC1025D44556043F8310022601C46B7 -:106290005F60404644F8086BFDF722FF2046BDE8EA -:1062A000F88FAA45216802D111602346EFE7013536 -:1062B00004EBC50344F8351003F10801401AC0107F -:1062C00058601360F1E700BF90680020F8B550F8FF -:1062D000043C044650F8085CA0F1080607332F1D63 -:1062E0000C35DB0840F8043C2846FDF7EFFE3B4642 -:1062F0009F421A6801D0B34228D20AB1964225D2F1 -:1063000044F8082C54F8042C1E60013254F8081C80 -:1063100006EBC200814206D14868024444F8042CCE -:106320000A6844F8082C5868411C03EBC1018E42EE -:1063300007D154F8042C013202445A6054F8082C56 -:106340001A602846BDE8F840FDF7CABE1346CFE7FD -:10635000FEE7000070B51B4B0025044686B0586070 -:106360000E4685620163FEF71FFE04F11003A5606F -:10637000E562C4E904334FF0FF33C4E90044C4E9E3 -:106380000635FFF7CBFE2B46024604F134012046CA -:10639000C4E9082380230C4A2565FDF7EDFE01239F -:1063A0000A4AE06000920375684672680192B2681A -:1063B000CDE90223064BCDE90435FDF705FF06B014 -:1063C00070BD00BFB03100200C72000811720008CF -:1063D00051630008024AD36A1843D062704700BF75 -:1063E000482F00204B6843608B688360CB68C36094 -:1063F0000B6943614B6903628B6943620B680360FD -:106400007047000008B5324B40F2FF70196C014331 -:1064100019649A6E02432F489A662F4A9B6E114662 -:10642000FFF7E0FF00F5806002F11C01FFF7DAFFE3 -:1064300000F5806002F13801FFF7D4FF00F58060BD -:1064400002F15401FFF7CEFF00F5806002F1700108 -:10645000FFF7C8FF00F5806002F18C01FFF7C2FF73 -:1064600000F5806002F1A801FFF7BCFF00F5806035 -:1064700002F1C401FFF7B6FF00F5806002F1E00110 -:10648000FFF7B0FF00F5806002F1FC01FFF7AAFF03 -:1064900002F58C7100F58060FFF7A4FF00F00CF9A5 -:1064A0000E4BD3F8902242F00102C3F89022D3F8A9 -:1064B000942242F00102C3F894220522C3F89820E6 -:1064C0004FF06052C3F89C20054AC3F8A02008BDD5 -:1064D00000450258000002581872000800ED00E064 -:1064E0001F00080308B500F0E1FAFDF70FFE0D4BA1 -:1064F000DA6B42F04002DA635A6E22F040025A66CA -:106500005B6E094B1A6842F008021A601A6842F082 -:1065100004021A60FEF722FDFEF75CFBBDE80840AE -:10652000FEF7DCB80045025800180248704700002A -:106530000E4B9A6C42F008029A641A6F42F00802FD -:106540001A670B4A1B6FD36B43F00803D363C72250 -:10655000084B9A624FF0FF32DA6200229A615A6366 -:10656000DA605A6001225A611A6070470045025889 -:106570000010005C000C0040094A08B51169D3689E -:106580000B40D9B29B076FEA0101116107D5302397 -:1065900083F31188FDF7E4FD002383F3118808BD20 -:1065A000000C0040044BDA6B0243DA635A6E10436E -:1065B00058665B6E704700BF0045025808B53D4BFA -:1065C0004FF0FF31D3F8802062F00042C3F8802002 -:1065D000D3F8802002F00042C3F88020D3F8802056 -:1065E000D3F88420C3F88410D3F884200022C3F8A1 -:1065F0008420D3F88400D86F40F0FF4040F4FF00BF -:1066000040F4DF4040F07F00D867D86F20F0FF40B3 -:1066100020F4FF0020F4DF4020F07F00D867D86F1F -:10662000D3F888006FEA40506FEA5050C3F88800F2 -:10663000D3F88800C0F30A00C3F88800D3F88800B4 -:10664000D3F89000C3F89010D3F89000C3F89020CE -:10665000D3F89000D3F89400C3F89410D3F89400C2 -:10666000C3F89420D3F89400D3F89800C3F8981096 -:10667000D3F89800C3F89820D3F89800D3F88C008A -:10668000C3F88C10D3F88C00C3F88C20D3F88C009E -:10669000D3F89C00C3F89C10D3F89C10C3F89C203E -:1066A000D3F89C30FCF77AFAFEF7E0FDBDE808402D -:1066B00000F0C8B90044025808B50122504BC3F895 -:1066C0000821504B5A6D42F002025A65DA6F42F0CF -:1066D0000202DA670422DB6F4B4BDA605A689104DE -:1066E000FCD54A4A1A6001229A60494ADA600022BF -:1066F0001A614FF440429A61434B9A699204FCD567 -:106700001A6842F480721A60424B1A6F12F4407F8A -:1067100004D04FF480321A6700221A671A6842F0D8 -:1067200001021A603B4B1A685007FCD500221A611F -:106730001A6912F03802FBD1012119604FF0804133 -:1067400059605A67344ADA62344A1A611A6842F464 -:1067500080321A602F4B1A689103FCD51A6842F4F4 -:1067600080521A601A689204FCD52D4A2D499A620B -:1067700000225A63196301F57C01DA6301F5E771C0 -:1067800099635A64284A1A64284ADA621A6842F0FD -:10679000A8521A601F4B1A6802F02852B2F1285F03 -:1067A000F9D148229A614FF48862DA6140221A6274 -:1067B0001F4ADA641F4A1A651F4A5A651F4A9A65BA -:1067C00032231F4A1360136803F00F03022BFAD120 -:1067D000104A136943F003031361136903F038038C -:1067E000182BFAD14FF00050FFF7DCFE4FF080403D -:1067F000FFF7D8FE4FF00040BDE80840FFF7D2BEDB -:1068000000800051004502580048025800C000F0C6 -:1068100004000001004402580000FF0100889008B5 -:106820003220600063020901470E0508DD0BBF013D -:1068300020000020000001100910E00000010110FC -:10684000002000524FF0B04208B5D2F8883003F073 -:106850000103C2F8883023B1044A13680BB15068B1 -:106860009847BDE80840FEF7C7BB00BFA8680020F6 -:106870004FF0B04208B5D2F8883003F00203C2F8F6 -:10688000883023B1044A93680BB1D0689847BDE8BB -:106890000840FEF7B1BB00BFA86800204FF0B0422F -:1068A00008B5D2F8883003F00403C2F8883023B169 -:1068B000044A13690BB150699847BDE80840FEF7D8 -:1068C0009BBB00BFA86800204FF0B04208B5D2F8CB -:1068D000883003F00803C2F8883023B1044A936972 -:1068E0000BB1D0699847BDE80840FEF785BB00BFF3 -:1068F000A86800204FF0B04208B5D2F8883003F005 -:106900001003C2F8883023B1044A136A0BB1506AED -:106910009847BDE80840FEF76FBB00BFA86800209D -:106920004FF0B04310B5D3F8884004F47872C3F840 -:106930008820A30604D5124A936A0BB1D06A9847FF -:10694000600604D50E4A136B0BB1506B98472106B5 -:1069500004D50B4A936B0BB1D06B9847E20504D575 -:10696000074A136C0BB1506C9847A30504D5044A31 -:10697000936C0BB1D06C9847BDE81040FEF73CBB60 -:10698000A86800204FF0B04310B5D3F8884004F455 -:106990007C42C3F88820620504D5164A136D0BB1FA -:1069A000506D9847230504D5124A936D0BB1D06DF5 -:1069B0009847E00404D50F4A136E0BB1506E984708 -:1069C000A10404D50B4A936E0BB1D06E98476204B4 -:1069D00004D5084A136F0BB1506F9847230404D5B0 -:1069E000044A936F0BB1D06F9847BDE81040FEF793 -:1069F00003BB00BFA868002008B50348FCF788FA6D -:106A0000BDE80840FEF7F8BA4C26002008B5034858 -:106A1000FCF762FBBDE80840FEF7EEBA6C260020EA -:106A200008B50348FCF758FBBDE80840FEF7E4BA98 -:106A3000D826002008B5FFF79FFDBDE80840FEF707 -:106A4000DBBA0000062108B50846FCF7CBFB06219F -:106A50000720FCF7C7FB06210820FCF7C3FB062133 -:106A60000920FCF7BFFB06210A20FCF7BBFB06212F -:106A70001720FCF7B7FB06212820FCF7B3FB092100 -:106A80007A20FCF7AFFB0A215C20FCF7ABFB072167 -:106A90003220FCF7A7FB0C212620FCF7A3FB0C21DE -:106AA0005220BDE80840FCF79DBB000008B5FFF789 -:106AB00085FD00F00FF8FCF753FDFCF72BFFFCF70A -:106AC000FDFDFDF7C1F9FFF731FDBDE80840FFF717 -:106AD00023BB00000023054A19460133102BC2E9ED -:106AE000001102F10802F8D1704700BFA868002029 -:106AF0000B460146184600F001B8000010B5054CE1 -:106B000013462CB10A4601460220AFF3008010BDA7 -:106B10002046FCE70000000010B501390244904215 -:106B200001D1002005E0037811F8014FA34201D004 -:106B3000181B10BD0130F2E7034611F8012B03F8D2 -:106B4000012B002AF9D1704700000000010000006D -:106B50000001000100000000000000000000000033 -:106B600052657175657374656420746F2065726118 -:106B70007365206D6F7265207468616E2077652083 -:106B800063616E0A00457261736520436F6D6D61CC -:106B90006E642052656365697665640A00504354EB -:106BA00020444F4E453A2025640A000053544D338B -:106BB0003248373F3F3F0053544D333248373378E4 -:106BC0002F3732780053544D3332483734332F3710 -:106BD00035332F373530000001105A0003105900AB -:106BE0000120580003205600534644500000000086 -:106BF0004A454445433A204661696C656420746F98 -:106C00002064657465637420666C617368206465D4 -:106C1000766963653A2025730A004A454445433A3C -:106C2000204661696C656420746F20636F6E6669CD -:106C30006720666C617368206465766963653A20D5 -:106C400025730A004A454445433A20446574656308 -:106C500074656420466C6173682044657669636579 -:106C60003A2025730A0045787420466C61736820C9 -:106C70004E6F7420466F756E642100006D7432355E -:106C800071007732357100773235712D647472007E -:106C90007C6C000820BA000000000000826C000834 -:106CA000EF40000000000000876C0008EF7000005B -:106CB000000000000000000000000000F51B0008BC -:106CC0005D1E00081115000815150008BD15000807 -:106CD000C51D0008191500081D150008BD1C000879 -:106CE0008D1500081D1D0008011A00082515000853 -:106CF00021150008F51E0008851500080000000099 -:106D0000000000000000000000000000ED1F00086F -:106D10003123000831230008F11F0008F51F000887 -:106D2000F91F0008FD1F0008312300083123000867 -:106D30003123000815200008192000083120000820 -:106D40003920000845200008492000084D2000088F -:106D50004C260020010000000000000000000000A0 -:106D6000852100089D210008ED1F0008592000081A -:106D7000D12100088D20000869220008992200080E -:106D8000FD1F0008712000085D2000086D2000082C -:106D900015200008192000083120000839200008BB -:106DA00045200008492000084D20000875200008F3 -:106DB000000000000000000005210008512000082C -:106DC0005520000800000000000000001124000809 -:106DD00019240008FD2300080524000829240008C0 -:106DE0002D240008286E756C6C290000000000003E -:106DF000AD2800088528000835280008512800081B -:106E00006D280008100002400800024000080240FF -:106E100000000B0028000240080002400408024065 -:106E200006010C0040000240080002400808024031 -:106E300010020D0058000240080002400C080240F9 -:106E400016030E00700002400C00024010080240C1 -:106E500000040F00880002400C00024014080240A9 -:106E600006051000A00002400C0002401808024075 -:106E700010061100B80002400C0002401C0802403D -:106E800016072F00100402400804024020080240A8 -:106E90000008380028040240080402402408024088 -:106EA0000609390040040240080402402808024054 -:106EB000100A3A0058040240080402402C0802401C -:106EC000160B3B00700402400C04024030080240E4 -:106ED000000C3C00880402400C04024034080240CC -:106EE000060D4400A00402400C0402403808024091 -:106EF000100E4500B80402400C0402403C08024059 -:106F0000160F46004D444D41206661696C757265EF -:106F100000000000009600000000000000000000DB -:106F20000000000000000000000000000000000061 -:106F3000213500080D3500084935000835350008B1 -:106F4000413500082D3500081935000805350008C1 -:106F500055350008000000003936000825360008C5 -:106F6000613600084D3600085936000845360008DD -:106F7000313600081D3600086D360008000000009C -:106F8000010000000000000063300000886F00086E -:106F9000A02F0020B03100204375626550696C6FEE -:106FA0007400437562655265642D424C002553455B -:106FB0005249414C25000000030000000000000081 -:106FC00011390008000000001000000008630020D4 -:106FD00000000000010000000000000002000000AE -:106FE0000000000059380008C9380008400040007F -:106FF0001863002028630020020000000000000049 -:10700000030000000000000011390008000000002B -:1070100010000000386300200000000001000000A4 -:1070200000000000020000000000000059380008C5 -:10703000C938000840004000486300205863002021 -:10704000020000000000000038670020020201007A -:107050003867002004040300394600081945000879 -:10706000BD450008994500088D00000070700008BB -:1070700009028D00040100C032080B000202020167 -:1070800000090400000102020100052400100105AE -:1070900024010301042402020524060001070581DE -:1070A0000310000109040100020A000000070502A4 -:1070B0000240000007058202400000080B020202A5 -:1070C000020100090402000102020100052400106F -:1070D0000105240103030424020205240602030718 -:1070E00005830310000109040300020A00000007E1 -:1070F0000504024000000705840240000000000073 -:10710000120000000871000812010002EF020140A5 -:10711000AE2D59100002010203010000040309040E -:1071200025424F41524425004375626552656450C3 -:1071300072696D61727900303132333435363738E7 -:1071400039414243444546000001002000FF010050 -:1071500002000000000000300000040008000000F1 -:1071600000000024000008000400000000040000EB -:1071700000FC00000200000000000430008000005D -:1071800008000000000000380000010001000000BD -:107190004000005280000052C00000520001005226 -:1071A0004001005280010052C00100520002005212 -:1071B0004002005280020052C002005200030052FE -:1071C0004003005280030052C003005200040052EA -:1071D000000000006D3A0008253D0008D13D000880 -:1071E000400040007068002070680020010000002E -:1071F00080680020800000004001000008000000BE -:107200000001000000100000080000006D61696EC0 -:107210000069646C650000000000802A0000000026 -:10722000AAAAAAAA00000024FFFF00000000000094 -:1072300000A00A002000200000000000AAAAAAAABC -:1072400000000000FFFF000000090000000900002E -:107250000000000000000000AAAAAAAA0000000086 -:10726000FFFF000000000000000000000028800A6E -:1072700000000000AAAAAAAA00140000FFFF000054 -:1072800000007007009099002080020000000000BC -:10729000AAAAAAAA00400100FFFF0000000900708E -:1072A000070000001000000000000000AAAAAAAA1F -:1072B00000000000FBFF00000000000000000000D4 -:1072C0000104000000000000AAAAAAAA0000000011 -:1072D000FEFF0000000000000000000000000000B1 -:1072E00000000000AAAAAAAA00000000FFFF0000F8 -:1072F000000000000000000000000000000000008E -:10730000AAAAAAAA00000000FFFF000000000000D7 -:10731000000000000000000000000000AAAAAAAAC5 -:1073200000000000FFFF000000000000000000005F -:107330000000000000000000AAAAAAAA00000000A5 -:10734000FFFF00000000000000000000000000003F -:107350002D0400000000000000001A0000000002E0 -:10736000FF000000B83100206C2600200000000063 -:10737000AC6B000883040000B76B000850040000E9 -:10738000C56B000800960000000008009600000091 -:107390000008009600000000080000000400000043 -:1073A0001C71000800000000000000000000000048 -:0C73B000000000000000000000000000D1 +:1014600070250020F8B571B6002301201A461946F0 +:1014700001F026FC0446802003F0B2FB002849D08E +:101480000025254A80274FF4D06C3D26136913F0C0 +:10149000C06F26D1D2F8103113F0C06F21D123686C +:1014A00005F1006199602368D86023685F60236854 +:1014B000C3F800C021680B6843F001030B6021688A +:1014C0000B6823F01E030B6021680B68DB07FCD45C +:1014D000237B8035616806FA03F3B5F5001F0B60C6 +:1014E000D4D1204601F022FCB5F5001F11D0002414 +:1014F0000A4E0B4D012003F0D1FA3388A34205D9DF +:1015000028682044013403F00FFAF6E7002003F0C6 +:10151000C5FA61B6F8BD00BF002000528A25002040 +:101520004025002080697047C0697047006A704795 +:10153000406A7047806A7047F0B5ADF2044D0E46C0 +:10154000054600214FF47F7201A80091FFF772FE5B +:101550002C6A744301362B6A7343A34216D92B6855 +:101560006A46214628465F684FF48063B84770B1E9 +:101570006A464FF4806312F8011BFF290AD1013B30 +:101580009BB2002BF7D104F58064E4E701200DF253 +:10159000044DF0BD0020FAE780680368DB69184756 +:1015A00030B5456A85B004468D420FD30568CDE954 +:1015B0000023026A03ABAD6A5143A84720B1206AF9 +:1015C000039BC31A5842584105B030BD0020FBE7C9 +:1015D000F0B5C56987B004468D4212D30C9F866969 +:1015E00005687143CDE9013705AB00936D69036A66 +:1015F000A84720B1A069059BC31A5842584107B0BB +:10160000F0BD0020FBE70000F0B5662389B00024A0 +:1016100005464FF480768068079403A9CDE9033628 +:10162000CDE9054403685B699847A86822462146CE +:10163000036800941F692346B847A8689923079454 +:1016400003A9CDE90336CDE9054403685B699847F2 +:10165000A86822462146036800941D692346A847CE +:1016600009B0F0BD254B2DE9F04F1B789FB0002548 +:1016700004468DF828304FF09F0E80684FF001230C +:10168000ADF8295005A90995CDE905E3CDE9075540 +:1016900003685B699847A0680322294603680092A3 +:1016A0002A461E690AABB04730B394F88C200C214F +:1016B000134B01FB02339DF828101A7991421BD17C +:1016C0009DF829205B799A4216D1A0684FF05A0CF8 +:1016D0000C4B082605A90996CDE905C3CDE90755A8 +:1016E00003685B699847A0682A4629460368009604 +:1016F0001F690AABB84738B900204BE1B46B00084A +:10170000FC6C0008002500010422B3490AA805F07A +:1017100039FA05460028EFD1BDF82C306FF48277F6 +:10172000A3813B44012BE7D8079605A9CDE90A0020 +:10173000A06803685B699847A0682A462946036841 +:1017400000961E690AABB0470028D5D0DDE90A36FD +:101750001A0202F4706242EA1662FF2ACCD11B0E12 +:1017600026F07F4650222946142B26610AA828BF5E +:101770001423A373FFF75EFDA068079605A903680D +:101780005B699847A068A37B294602689B00009389 +:101790000AAB16692A46B0470028ADD00B9900293C +:1017A000AADBC9086FF07E43149D4FF0010E9942E9 +:1017B00028BF1946C5F303130EFA03F221FA03F307 +:1017C00003916161A261E361002B95D02646A44696 +:1017D00000274FF002081EAAC7F3460302EB83035B +:1017E00053F834AC07F001031B01DA1D0EFA03F9BC +:1017F00008FA02F2A2EB090202EA0A02DA401AD05F +:1018000003F108090F330EFA02F2216A08FA03F312 +:101810000EFA09FBCCF830208A42A3EB0B0B0BEA43 +:101820000A0A2AFA09F98CF82C90A36A88BF226266 +:10183000934288BFA26201370CF1100C042FCAD169 +:10184000236A4FF0020C039A4FF0010E139F9A4245 +:1018500024BFB2FBF3F1616207F00F0138BF01232F +:101860004FF0090201F1010138BF63624900336B97 +:1018700033B3531C0EFA02F8A2F105090CFA03F374 +:101880000EFA09FAA3EB080302F1FF380CFA08F884 +:101890003B40A8EB0A08D34008EA070828FA09F8F1 +:1018A0007BD0012B7BD0022B7BD0032B08BF4FF4C6 +:1018B0007A735FFA88F808FB033373634B43B363AF +:1018C00007321036252AD2D115F0C04FC5F3417327 +:1018D00069D0012B69D0022B0CBF4FF47A634FF40F +:1018E0007A43C5F3046202FB0333E3664B43236789 +:1018F000199B9E075CD0062384F8743015F4005FB2 +:1019000005F00F03C5F3042514BF4022082201335C +:1019100005FB02255B00A5675D430A9B9F02E56707 +:101920007FF5EAAE0C9BC3F30722C3F3421103F029 +:101930001F0384F8802084F8881084F88130002AFE +:101940003FF4DAAE189BC3F3025213F4401F84F83D +:1019500083207FF4D1AEDE0602D5042A7FF4CCAE1C +:1019600003F40072002A14BF0122002284F88720A9 +:1019700004D0DD0324D5002384F88930179B1A078F +:1019800022D5002384F88630702384F88530012323 +:1019900084F88D301FB0BDE8F08F012389E7102354 +:1019A00087E7802385E710239BE74FF4807398E750 +:1019B000590701D550239FE713F0780F9ED09BE67F +:1019C0009903DBD50123D7E75B07E0D5012384F832 +:1019D00086300523D9E700BF546C000830B58BB0C2 +:1019E00000240546806803924FF00122059105A965 +:1019F000CDE90624CDE90844026852699047A868F9 +:101A00000121039B02680091214615692246A847DF +:101A10000BB030BD13B50446A0680368DB6C984773 +:101A20000028F9D10DF1070294F885102046FFF740 +:101A3000D5FF94F886309DF807001BB100F0010037 +:101A400002B010BDC043C0F3C010F9E730B54FF08D +:101A500001238BB00024054680688DF80F20059186 +:101A600005A9CDE90634CDE9084403685B699847C8 +:101A7000A86801220DF10F01036800941D69234637 +:101A8000A8470BB030BD0000F7B517460DF10702AF +:101A900006461D46FFF7A2FF68B19DF8074039468C +:101AA0009DF82020304624EA05042A4022438DF880 +:101AB0000720FFF7CBFF03B0F0BD000030B54FF4B7 +:101AC000807389B0002405468068039103A9CDE99D +:101AD0000434CDE9064403685B699847A868224648 +:101AE0002146036800941D692346A84709B030BD0C +:101AF00010B5044623682046DB6A98470028F9D1D0 +:101B000010BD000010B590F8743004465BB1FFF7CB +:101B1000EFFF012394F87410204684F88E30BDE85E +:101B20001040FFF7CBBF012010BD000010B590F8AA +:101B30007430044653B1FFF7DBFF01232046042134 +:101B400084F88E30BDE81040FFF7B8BF012010BD0B +:101B5000F0B590F883308BB00446042B50D10027A9 +:101B60000DF10E0205218DF80E708DF80F70FFF744 +:101B700035FF00282FD00DF10F0235212046FFF749 +:101B80002DFF40B320461F4EFFF7BCFF2046FFF756 +:101B9000AFFF05AD0FCE0FC5336805A99DF80E2028 +:101BA0002B609DF80F30A06843F002038DF81020E1 +:101BB0008DF80F308DF8113003685B699847A06885 +:101BC000022204A9036800971D693B46A84720B973 +:101BD0002046FFF7ABFF002010E02046FFF7A6FFEE +:101BE0000DF10F0235212046FFF7F8FE0028F2D054 +:101BF0009DF80F309B07EED5012363600BB0F0BD5D +:101C00000120FBE7B86B00082DE9F34100230446EF +:101C10008068A36010B103685B6898470025264E72 +:101C2000264F0C2301A839465FFA85F86B439A5971 +:101C300000F072FA019BA0680022A360019210B12B +:101C400003685B689847019810B103685B68984720 +:101C5000A368E3B141F2883084F88C8002F0D4FAB2 +:101C60002046FFF7D1FC1E2002F0CEFA2046FFF7F7 +:101C7000F9FC054688B994F88C300C22104853437F +:101C8000F158FFF767FA284602B0BDE8F081013548 +:101C9000032DC6D10B4800F059FB2046FFF758FF33 +:101CA0000C2294F88C3005465343F15808B9064885 +:101CB000E7E70648E5E700BFFC6C0008A825002020 +:101CC0005C6C0008D26C0008866C0008B06C0008E0 +:101CD0002DE9F041044688B00F461646FFF712FF83 +:101CE0002046FFF705FF0025C722A0684FF4807348 +:101CF000079503A9CDE90323CDE9055503685B6981 +:101D00009847A0682A46294603680095D3F81080B2 +:101D10002B46C047054630B92046FFF707FF284647 +:101D200008B0BDE8F081E36E3B60236F3360F3E7FA +:101D30002DE9F041002588B01F4604460E460E9B53 +:101D400000F1400CA8463D60016B81B1A9420ED361 +:101D500091420CD8B6FBF1FE01FB1E6139B9416B13 +:101D600090F82C800F9D1960816B2960154610300A +:101D70006045E9D16DB3AB196269934229D8204619 +:101D8000FFF7C0FE2046FFF7B3FE4FF41453A068E0 +:101D900003A9CDF80C80CDE904360026CDE906660E +:101DA00003685B699847A06832463146036800962D +:101DB000D3F810803346C047064620462EB9FFF7B9 +:101DC000B5FE304608B0BDE8F081FFF7AFFE3D60DC +:101DD000F7E70026F5E700002DE9F04186690546A2 +:101DE00088B00F46B3429046B1FBF6FC06FB1C1CC4 +:101DF00028BF3346A6EB0C0C00269C45644628BF42 +:101E00001C46FFF77FFE2846FFF772FE0222A868F5 +:101E100003A9164B0597CDE90323CDE906660368B0 +:101E20005B699847A86822464146036800961F6987 +:101E30003346B847064628462EB9FFF777FE3046A8 +:101E400008B0BDE8F081FFF771FE0E9B1C60AB6F20 +:101E5000AA696343B3FBF2F30F9A1360EA6F109B16 +:101E60005443AA69B4FBF2F41C60E8E700250001C2 +:101E70002DE9F04FCE18436989B004469E420F46C3 +:101E8000914639D83D464FF40458DFF878A0FFF763 +:101E90002FFEAE4234D994F88030A6EB050B94F8AF +:101EA000882003A903930023BBF5806FA0680693E5 +:101EB000636828BF4FF4806B0595012B14BF434620 +:101EC0005346012A049394F8813008BF03F1FF338D +:101ED000079303685B699847A068A9EB070302684A +:101EE000CDF800B02B44D2F810B000221146D847EC +:101EF00018B105F58065CCE7002009B0BDE8F08F8A +:101F00000120FAE700ED0003F0B5044689B00E4663 +:101F1000FFF7EEFD94F887502DB194F889302BB17E +:101F2000012B24D00025284609B0F0BD94F880305C +:101F30000393F02306934FF4045304936368012B37 +:101F400004BF1D4B04930023059394F88130A068CF +:101F500003A9079303685B699847A0683146036843 +:101F60009B6998470546642002F04EF9DBE720465E +:101F70000027FFF7C7FD2046FFF7BAFD082381229F +:101F8000852120460097FFF77FFD054618B92046BA +:101F9000FFF7CCFDC7E794F8803006970393074B13 +:101FA00004936368012B04BF054B0493002305933E +:101FB00094F88130013BCAE700ED000300210010D6 +:101FC00000ED0013014B024A1A607047A82500205B +:101FD000246E000830B50A44084D91420DD011F826 +:101FE000013B5840082340F30004013B2C4013F010 +:101FF000FF0384EA5000F6D1EFE730BD2083B8ED4F +:1020000070470000704700000020704700207047B4 +:1020100013B56C4600F1140384E8060094E803004D +:1020200083E8050002B010BD0020704713B56C4670 +:1020300000F10C0384E8060094E8030083E805003F +:1020400002B010BD0023C0E90333704782B002AB79 +:1020500003E9060002B07047704700000020704797 +:102060007047000000207047002070470120704733 +:1020700082B0002002A901E90C0002B07047000004 +:102080000020704700207047036B1A79034B53F808 +:1020900032309B699868C0F340107047BC6D0008EF +:1020A0000B6883634B6843638B68C363CB680364CB +:1020B0000B6943647047000038B5036B0446154D47 +:1020C0001B7955F8330001F03FFFD4E90B231B794E +:1020D00055F8331002F130034968994218D00023B3 +:1020E0001363E26A5363D4E90B12537C581E137CCA +:1020F00092681B0443EA002313438B63D4E90B1358 +:102100001B79303155F83300BDE8384001F0B0BEDE +:1021100038BD00BFBC6D0008F8B51D4F05460E4622 +:1021200011463868FFF772F878BB74683B7924B3BE +:1021300094F82C209A420BD02468F8E70122B521AC +:1021400000F01AF9736823603B79746084F82C30CE +:10215000482000F005F968B100220271C0E90322AD +:10216000C0E90522027A42F007020272094AC0E978 +:102170000B47026028602846F8BD402000F0F0F8C8 +:1021800004460028DAD12C60F5E700232B60F2E743 +:10219000B0250020CC6D0008044B10B50446036048 +:1021A000406A08B100F0E6F8204610BD706D0008E6 +:1021B00010B50446FFF7F0FF204600F0D7F82046A0 +:1021C00010BD000008B519B1FFF776FF012008BD6A +:1021D000036B1A79024B53F8320001F0B9FEF5E7B0 +:1021E000BC6D00082DE9FF41DDF828800546174643 +:1021F00003911FFA88F60293FFF75EFF02ABBAB2B3 +:1022000003A9E86A009600F0CBF8044638B900212B +:102210002846FFF7D7FF204604B0BDE8F081AFB9EC +:102220002B6B05F134011A79134B53F83200B8F1D6 +:10223000000F19D101F02AFE80F00104E4B2334608 +:10224000E86ADDE9022100F0D1F8E0E7029B83B9FA +:102250002B6B3A46084805F134011C79039B50F872 +:10226000340001F029FEE7E7029B424601F03AFE06 +:10227000E2E70024E3E700BFBC6D000813B50446A5 +:102280000191FFF719FF019A236B04F134011879CA +:10229000054B53F8300001F03BFE00212046FFF7CC +:1022A00091FF012002B010BDBC6D000810B50446BE +:1022B000FFF702FF236B1A79054B53F8320001F048 +:1022C00035FE00212046FFF77DFF012010BD00BF35 +:1022D000BC6D0008054B064A1A6000221A719A600C +:1022E000044ADA6040F21F121A827047B0250020BB +:1022F000F36C000800E1F50500F08ABA00B59BB068 +:10230000EFF3098168226846FEF762FFEFF3058369 +:10231000014B9B6BFEE700BF00ED00E008B5FFF747 +:10232000EDFF000000B59BB0EFF30981682268461D +:10233000FEF74EFFEFF30583014B5B6BFEE700BF3B +:1023400000ED00E0FEE70000FEE700000FB408B576 +:10235000029801F0FFFEFEE702F0C8BC02F0AABC42 +:102360000121884238BF084602F072BC08B102F071 +:1023700073BC7047FFF7FABF38B5084B04461546E3 +:10238000017543600A21243002F074FD04F1280035 +:102390002A460A2102F06EFD204638BD386E00083C +:1023A000F8B51E461B6805460C4617461BB9236840 +:1023B00063B9012408E0BDF818203146806A02F0B4 +:1023C00071FD0028F3D100242046F8BD21463A468D +:1023D000686A02F0ADFD04460028EAD13368002B9C +:1023E000F1D0A86A02F0E8FDEEE7000038B50D462E +:1023F000114604461A4611B1806A02F08BFD2DB1D8 +:102400002946606ABDE8384002F0CEBD38BD000004 +:10241000036800211B68184703790BB10022027181 +:102420001846704703685B681847000003791BB9BA +:102430000123037118467047002070477047000061 +:1024400010B50446FFF792FF204610BDF0B500F12D +:102450000B0423460D46B1FBF2F102FB115707F1C5 +:102460003006392EC8BF07F13706954203F8016DD3 +:10247000F0D2421EE11A13F8015B9C4202F8015FA0 +:10248000F9D10844F0BD00002DE9F04F804687B037 +:1024900015464FF000090C4614F8013B002B3BD0C9 +:1024A000252B08D0D8F800201946404609F101092B +:1024B000D268904749E14B782D2B06BF8C1C012335 +:1024C0000023019323782B2B06BF0134012700271B +:1024D00094F800A0BAF1300F0CBF01344FF0200A7D +:1024E00023782A2B1CD16178023455F804BB2E299D +:1024F00043D1217881B12A2921D0661C0020A1F185 +:1025000030023446D2B2092A1DD80A2316F8011B1C +:1025100003FB00200029F2D1484607B0BDE8F08F48 +:102520004FF0000B14F8011B0029F5D0A1F1300287 +:10253000D2B2092ADBD80A2303FB0B2BF2E761781E +:10254000023455F8040B01F0DF024C2A17D1217830 +:102550000029E1D0782904F101041FD8622900F292 +:10256000008158291AD84E2900F23081442900F000 +:102570009180492900F08E8010E00020E3E7A1F16E +:1025800041027829D2B209D862290BD8582905D836 +:102590004E293BD8442978D0492976D02E468DF84B +:1025A0000C1056E0A1F16306152EF7D80FF2040CBB +:1025B0005CF826F0452600088B2600089D250008BB +:1025C0009D2500089D2500089D2500088B260008F4 +:1025D0009D2500089D2500089D2500089D250008D3 +:1025E0009D2500081B270008092800089D250008D4 +:1025F0009D2500085B2600089D2500080528000889 +:102600009D2500089D25000809280008A1F14F021A +:10261000092AC3D801A050F822F000BF1B270008E8 +:10262000092800089D2500089D2500089D25000813 +:102630009D250008052800089D2500089D25000807 +:10264000092800082E464FF0200A56F8042B8DF872 +:102650000C2003AD0DF10D002BE02E4647F6FF7266 +:102660006A4B56F8045B002808BF1046002D08BFCF +:102670001D462A462F18104612F8011B11B1B91A2F +:102680000029F8DA4FF0200A13E02E46192A56F8EE +:10269000041B02D82E4656F8041B002936DA2D22D8 +:1026A00049428DF80C200DF10D000A2203ADFFF711 +:1026B000CDFE471B0199ABEB070323EAE372002928 +:1026C00045D1002BC2F1000B1EDD29782D2901D048 +:1026D0002B290DD1BAF1300F0AD1D8F8003040467D +:1026E000019209F10109DB68013F98470135019A20 +:1026F000D8F80030514640460192DB6898471BF1FC +:10270000010B019AF4D191443B4615E01FB12B22F5 +:102710008DF80C20C7E703A8C7E708222E4603A8B8 +:1027200056F8041BC2E7D8F80020404615F8011BF4 +:10273000D26801939047019B013BF4D5002FA8BFBD +:10274000B9445D462DB9D94435462146A3E69346A2 +:10275000DAE7D8F8003051464046013DDB6898473B +:10276000F0E7A1F16302152A3FF618AF01A353F871 +:1027700022F000BF45260008952600089D25000888 +:102780009D2500089D2500089D2500089526000828 +:102790009D2500089D2500089D2500089D25000811 +:1027A0009D2500081B270008092800089D25000812 +:1027B0009D2500085B2600089D25000805280008C7 +:1027C0009D2500089D25000809280008A1F14F0259 +:1027D000092A3FF6E3AE01A353F822F01B270008B5 +:1027E000092800089D2500089D2500089D25000852 +:1027F0009D250008052800089D2500089D25000846 +:10280000092800080A2289E7102287E7506E00088D +:10281000F0B5054687B016461F460C4689B14A1EDC +:102820000023294601A800F05FF83A46314601A886 +:10283000FFF72AFE049BA3423CBF0022EA5407B0E4 +:10284000F0BD0A46ECE70000D0E902239A421FBF20 +:102850004268D154C36801331ABFC36000206FF0CF +:1028600001007047D0E903239A421FBF4268D25C3F +:102870000133036114BF10466FF001007047000080 +:1028800003692BB1013B426803610020D1547047BA +:102890006FF001007047000038B504460846D4E9DF +:1028A00003315B1A934228BF13461D4663682A46CC +:1028B0001944FEF78DFC236928462B44236138BD5B +:1028C00038B50446D0E902301B1A934228BF13469C +:1028D0001D4663682A461844FEF77AFCE3682846DA +:1028E0002B44E36038BD000010B5C0E90223034C5F +:1028F0000023C0E90041036110BD00BF586E00080D +:1029000008B5074B074A196801F03D019960536803 +:102910000BB190689847BDE8084002F09FBB00BF2C +:1029200000000240C825002008B5084B1968890935 +:1029300001F03D018A019A60054AD3680BB1106924 +:102940009847BDE8084002F089BB00BF0000024084 +:10295000C825002008B5084B1968090C01F03D0195 +:102960000A049A60054A53690BB190699847BDE81B +:10297000084002F073BB00BF00000240C8250020E1 +:1029800008B5084B1968890D01F03D018A059A6068 +:10299000054AD3690BB1106A9847BDE8084002F0B8 +:1029A0005DBB00BF00000240C825002008B5074BF2 +:1029B000074A596801F03D01D960536A0BB1906A2A +:1029C0009847BDE8084002F049BB00BF0000024044 +:1029D000C825002008B5084B5968890901F03D0158 +:1029E0008A01DA60054AD36A0BB1106B9847BDE8DB +:1029F000084002F033BB00BF00000240C8250020A1 +:102A000008B5084B5968090C01F03D010A04DA6069 +:102A1000054A536B0BB1906B9847BDE8084002F034 +:102A20001DBB00BF00000240C825002008B5084BB0 +:102A30005968890D01F03D018A05DA60054AD36BBA +:102A40000BB1106C9847BDE8084002F007BB00BF0F +:102A500000000240C825002008B5074B074A196846 +:102A600001F03D019960536C0BB1906C9847BDE843 +:102A7000084002F0F3BA00BF00040240C82500205D +:102A800008B5084B1968890901F03D018A019A606F +:102A9000054AD36C0BB1106D9847BDE8084002F0B1 +:102AA000DDBA00BF00040240C825002008B5084B6D +:102AB0001968090C01F03D010A049A60054A536D3A +:102AC0000BB1906D9847BDE8084002F0C7BA00BF4F +:102AD00000040240C825002008B5084B1968890D7C +:102AE00001F03D018A059A60054AD36D0BB1106E65 +:102AF0009847BDE8084002F0B1BA00BF00040240A8 +:102B0000C825002008B5074B074A596801F03D0168 +:102B1000D960536E0BB1906E9847BDE8084002F043 +:102B20009DBA00BF00040240C825002008B5084B2C +:102B30005968890901F03D018A01DA60054AD36EBE +:102B40000BB1106F9847BDE8084002F087BA00BF8C +:102B500000040240C825002008B5084B5968090C3C +:102B600001F03D010A04DA60054A536F0BB1906F22 +:102B70009847BDE8084002F071BA00BF0004024067 +:102B8000C825002008B5084B5968890D01F03D01A2 +:102B90008A05DA60054AD36F13B1D2F880009847EE +:102BA000BDE8084002F05ABA00040240C8250020DF +:102BB00000230C4910B51A460B4C0B6054F8230047 +:102BC000026001EB430004334260402BF6D1074A18 +:102BD0004FF0FF339360D360C2F80834C2F80C346E +:102BE00010BD00BFC8250020706E00080000024024 +:102BF0000F28F8B510D9102810D0112811D012289C +:102C000008D10F240720DFF8B4E00126DEF80050D9 +:102C1000A04208D9002649E00446F4E70F2400202A +:102C2000F1E70724FBE706FA00F73D4240D1214CCB +:102C30004FEA001C3D4304EB00160EEBC000CEF83B +:102C40000050C0E90123FBB24BB11B48836B43F03A +:102C500001038363036E43F001030366036E17F4FD +:102C60007F4F09D01448836B43F002038363036EE4 +:102C700043F002030366036E54F80C00036823F06C +:102C80001F030360056815F00105FBD104EB0C037D +:102C90003D2493F80CC05F6804FA0CF43C602124D6 +:102CA0000560446112B1987B00F0A6FA3046F8BD89 +:102CB0000130ADE7706E000800450258C8250020BD +:102CC00010B5302484F31188FFF792FF002383F3BB +:102CD000118810BD10B50446807B00F0A3FA0123D3 +:102CE0001049627B03FA02F20B6823EA0203DAB2AC +:102CF0000B604AB90C4A916B21F001019163116E8E +:102D000021F001011166126E13F47F4F09D1064BB9 +:102D10009A6B22F002029A631A6E22F002021A667D +:102D20001B6E10BDC82500200045025808B5302391 +:102D300083F31188FFF7CEFF002383F3118808BDCA +:102D40008A0710B504461DD50378042B1AD14368B1 +:102D50001B682BB10522027098472378052B01D1FF +:102D600002232370302383F31188002104F108002B +:102D700001F064FA002383F31188E069BDE8104094 +:102D800002F0ECBACB0704D50248BDE8104001F0D0 +:102D9000E1B910BD706F000810B5044C204601F079 +:102DA0005FF8034A0023C4E9062310BD4C26002027 +:102DB0000050005210B503780446012B12D10E4B7F +:102DC00098420FD102460D49102002F099FA0C4B9F +:102DD000E0615A6B42F480425A63DA6D42F48042F9 +:102DE000DA65DB6D6268A36992685A60054A1A6009 +:102DF0001B22DA6010BD00BF4C260020412D0008C8 +:102E0000004502581500020182691B2310B5D360EA +:102E1000D1E9003013F44C4406D19B011461D06118 +:102E200003F44043536110BD0024184313F4406F72 +:102E30001461CC68D4615061F5D08B689361F2E77E +:102E400030B584691B25C069E5600068836104F1C1 +:102E50002003C36102234261013A03614223C3603C +:102E600016238362CB682261E361D1E90023134317 +:102E700012F4406F636101D08B68A361C36843F0B3 +:102E80000103C36030BD000030B5D0E906400068E2 +:102E900004F120058561C36108234261013A0361A1 +:102EA00046230D69C36016238362CB682261E36108 +:102EB000D1E90023134312F4406F43EA854343F002 +:102EC0008063636101D08B68A361C36843F0010331 +:102ED000C36030BD8069036823F0040310B5CC687B +:102EE000036000230361C4618361D1E90043096980 +:102EF000234343EA814343F04063436112B14FF0FF +:102F00001043136010BD000083691A6842F002028A +:102F10001A601A689207FCD41A6842F004021A6018 +:102F2000704700008269936810B5D3609B07044620 +:102F30001DD50378032B1AD143681B682BB10522DA +:102F4000027098472378052B01D102232370302388 +:102F500083F31188002104F1080001F06FF90023C8 +:102F600083F31188E069BDE8104002F0F7B910BDA5 +:102F7000026843681143016003B1184770470000BD +:102F8000024A136843F0C0031360704700440040D6 +:102F9000024A136843F0C003136070470078004092 +:102FA00037B51A4C1A4D204600F0E6FA04F1140029 +:102FB000009400234FF40072164900F0A3F94FF477 +:102FC0000072154904F138000094144B00F01CFA0B +:102FD000134BC4E91735134C204600F0CDFA04F129 +:102FE000140000234FF400720F49009400F08AF996 +:102FF0000E4B4FF400720E4904F13800009400F0BB +:1030000003FA0C4BC4E9173503B030BD6C26002021 +:1030100000E1F50544270020442B0020812F000803 +:1030200000440040D826002044290020912F0008A9 +:10303000442D002000780040037C30B5274C002947 +:1030400018BF0C46012B0CD1254B984236D1254B8D +:103050009A6C42F400329A641A6F42F400321A6792 +:103060001B6F2268036EC16D03EB52038466B3FBD2 +:10307000F2F36268150442BF23F0070503F007036B +:1030800043EA4503CB60A36843F040034B60E36829 +:1030900043F001038B6042F4967343F001030B602D +:1030A0004FF0FF330B62510505D512F0102211D0FD +:1030B000B2F1805F10D080F8643030BD0A4B984286 +:1030C000CFD1084B9A6C42F080429A641A6F42F05A +:1030D0008042C4E77F23EEE73F23ECE7806F0008E0 +:1030E0006C26002000450258D82600202DE9F04724 +:1030F000C66D05463768F469210734621AD014F0AA +:10310000080118BF4FF48071E20748BF41F0200169 +:10311000A3074FF0300348BF41F04001600748BFAC +:1031200041F0800183F31188281DFFF721FF002360 +:1031300083F31188E2050AD5302383F311884FF415 +:103140008061281DFFF714FF002383F311884FF0DF +:1031500030094FF0000A14F0200838D13B0616D58C +:103160004FF0300905F1380A200610D589F311888F +:10317000504600F07DF9002836DA0821281DFFF7B7 +:10318000F7FE27F080033360002383F3118879066C +:1031900014D5620612D5302383F31188D5E91323A1 +:1031A0009A4208D12B6C33B127F040071021281D1B +:1031B000FFF7DEFE3760002383F31188E30618D59E +:1031C000AA6E1369ABB15069BDE8F047184789F39F +:1031D0001188736A284695F86410194000F0E6F9E2 +:1031E0008AF31188F469B6E7B06288F31188F4694C +:1031F000BAE7BDE8F0870000090100F16043012251 +:1032000003F56143C9B283F8001300F01F039A402D +:1032100043099B0003F1604303F56143C3F8802138 +:103220001A60704700F01F0301229A40430900F121 +:1032300060409B0000F5614003F1604303F561438A +:10324000C3F88020C3F88021002380F80033704742 +:10325000F8B51546826804460B46AA4200D2856836 +:10326000A1692669761AB5420BD218462A46FDF79F +:10327000AFFFA3692B44A3612846A3685B1BA3602F +:10328000F8BD0CD9AF1B18463246FDF7A1FF3A46F0 +:10329000E1683044FDF79CFFE3683B44EBE71846E8 +:1032A0002A46FDF795FFE368E5E70000836893424F +:1032B000F7B50446154600D28568D4E90460361A8D +:1032C000B5420BD22A46FDF783FF63692B44636145 +:1032D0002846A3685B1BA36003B0F0BD0DD932463E +:1032E000AF1B0191FDF774FF01993A46E068314444 +:1032F000FDF76EFFE3683B44E9E72A46FDF768FF08 +:10330000E368E4E710B50A440024C361029B8460CB +:10331000C16002610362C0E90000C0E9051110BD8F +:1033200008B5D0E90532934201D1826882B982683A +:10333000013282605A1C426119700021D0E90432C6 +:103340009A4224BFC368436100F092FF002008BD89 +:103350004FF0FF30FBE7000070B5302304460E4607 +:1033600083F31188A568A5B1A368A269013BA36096 +:10337000531CA36115782269934224BFE368A361BB +:10338000E3690BB120469847002383F31188284650 +:1033900007E03146204600F05BFF0028E2DA85F3C3 +:1033A000118870BD2DE9F74F04460E461746984622 +:1033B000D0F81C904FF0300A8AF311884FF0000BC0 +:1033C000154665B12A4631462046FFF741FF0346C0 +:1033D00060B94146204600F03BFF0028F1D00023B1 +:1033E00083F31188781B03B0BDE8F08FB9F1000FAB +:1033F00003D001902046C847019B8BF31188ED1A3A +:103400001E448AF31188DCE7C160C361009B8260BF +:103410000362C0E905111144C0E900000161704771 +:10342000F8B504460D461646302383F31188A76885 +:10343000A7B1A368013BA36063695A1C62611D7058 +:10344000D4E904329A4224BFE3686361E3690BB1B3 +:1034500020469847002080F3118807E03146204637 +:1034600000F0F6FE0028E2DA87F31188F8BD0000CC +:10347000D0E9052310B59A4201D182687AB98268F1 +:103480000021013282605A1C82611C7803699A42D1 +:1034900024BFC368836100F0EBFE204610BD4FF0EF +:1034A000FF30FBE72DE9F74F04460E4617469846D6 +:1034B000D0F81C904FF0300A8AF311884FF0000BBF +:1034C000154665B12A4631462046FFF7EFFE034612 +:1034D00060B94146204600F0BBFE0028F1D0002331 +:1034E00083F31188781B03B0BDE8F08FB9F1000FAA +:1034F00003D001902046C847019B8BF31188ED1A39 +:103500001E448AF31188DCE70268436811430160B6 +:1035100003B11847704700001430FFF743BF0000A5 +:103520004FF0FF331430FFF73DBF00003830FFF796 +:10353000B9BF00004FF0FF333830FFF7B3BF0000D2 +:103540001430FFF709BF00004FF0FF311430FFF7D0 +:1035500003BF00003830FFF763BF00004FF0FF32B9 +:103560003830FFF75DBF0000012914BF6FF0130072 +:1035700000207047FFF714BD044B03600023436035 +:10358000C0E9023301230374704700BF986F00083D +:1035900010B53023044683F31188FFF74DFD022355 +:1035A0000020237480F3118810BD000038B5C36972 +:1035B00004460D461BB904210844FFF7A5FF294620 +:1035C00004F11400FFF7ACFE002806DA201D4FF4CA +:1035D0000061BDE83840FFF797BF38BD0268436817 +:1035E0001143016003B118477047000013B5406BE9 +:1035F00000F58054D4F8A4381A681178042914D13D +:10360000017C022911D11979012312898B401342BF +:103610000BD101A94C3002F0DFFCD4F8A4480246DB +:10362000019B2179206800F0DFF902B010BD000095 +:10363000143002F061BC00004FF0FF33143002F090 +:103640005BBC00004C3002F033BD00004FF0FF3394 +:103650004C3002F02DBD0000143002F02FBC0000F1 +:103660004FF0FF31143002F029BC00004C3002F062 +:10367000FFBC00004FF0FF324C3002F0F9BC0000FC +:103680000020704710B500F58054D4F8A4381A68AB +:103690001178042917D1017C022914D15979012309 +:1036A00052898B4013420ED1143002F0C1FB024606 +:1036B00048B1D4F8A4484FF4407361792068BDE85C +:1036C000104000F07FB910BD406BFFF7DBBF00007A +:1036D000704700007FB5124B0125042604460360A5 +:1036E0000023057400F1840243602946C0E90233D7 +:1036F0000C4B0290143001934FF44073009602F08B +:1037000073FB094B04F69442294604F14C000294E1 +:10371000CDE900634FF4407302F03AFC04B070BD91 +:10372000C06F0008C9360008ED3500080A6830236C +:1037300083F311880B790B3342F823004B79133351 +:1037400042F823008B7913B10B3342F8230000F5C4 +:103750008053C3F8A41802230374002080F3118857 +:103760007047000038B5037F044613B190F8543019 +:10377000ABB90125201D0221FFF730FF04F1140031 +:103780006FF00101257700F07FFD04F14C0084F813 +:1037900054506FF00101BDE8384000F075BD38BDF0 +:1037A00010B5012104460430FFF718FF00232377EA +:1037B00084F8543010BD000038B50446002514309C +:1037C00002F02AFB04F14C00257702F0F9FB201DE2 +:1037D00084F854500121FFF701FF2046BDE838402E +:1037E000FFF750BF90F8803003F06003202B06D124 +:1037F00090F881200023212A03D81F2A06D8002010 +:103800007047222AFBD1C0E91D3303E0034A426717 +:1038100007228267C3670120704700BF342300205E +:1038200037B500F58055D5F8A4381A681178042901 +:103830001AD1017C022917D11979012312898B40F1 +:10384000134211D100F14C04204602F079FC58B12A +:1038500001A9204602F0C0FBD5F8A4480246019B0E +:103860002179206800F0C0F803B030BD01F10B03EE +:10387000F0B550F8236085B004460D46FEB1302304 +:1038800083F3118804EB8507301D0821FFF7A6FE9E +:10389000FB6806F14C005B691B681BB1019002F0EC +:1038A000A9FB019803A902F097FB024648B1039BCC +:1038B0002946204600F098F8002383F3118805B0CC +:1038C000F0BDFB685A691268002AF5D01B8A013BDB +:1038D0001340F1D104F18002EAE70000133138B55A +:1038E00050F82140ECB1302383F3118804F5805364 +:1038F000D3F8A4281368527903EB8203DB689B6931 +:103900005D6845B104216018FFF768FE294604F19F +:10391000140002F097FA2046FFF7B4FE002383F369 +:10392000118838BD7047000001F06ABD01234022B4 +:10393000002110B5044600F8303BFDF77BFC002366 +:10394000C4E9013310BD000010B53023044683F3F1 +:1039500011882422416000210C30FDF76BFC2046C9 +:1039600001F070FD02230020237080F3118810BD48 +:1039700070B500EB8103054650690E461446DA60C7 +:1039800018B110220021FDF755FCA06918B11022D2 +:103990000021FDF74FFC31462846BDE8704001F09C +:1039A00051BE000083682022002103F0011310B5EE +:1039B000044683601030FDF73DFC2046BDE8104012 +:1039C00001F0CCBEF0B4012500EB810447898D40A5 +:1039D000E4683D43A469458123600023A2606360DD +:1039E000F0BC01F0E9BE0000F0B4012500EB810459 +:1039F00007898D40E4683D436469058123600023A5 +:103A0000A2606360F0BC01F05FBF000070B50223EC +:103A100000250446242203702946C0F888500C3043 +:103A200040F8045CFDF706FC204684F8705001F075 +:103A30009DFD63681B6823B129462046BDE87040A0 +:103A4000184770BD0378052B10B504460AD080F8DE +:103A50008C300523037043681B680BB10421984721 +:103A60000023A36010BD00000178052906D190F85D +:103A70008C20436802701B6803B118477047000030 +:103A800070B590F87030044613B1002380F87030A0 +:103A900004F18002204601F085FE63689B68B3B99B +:103AA00094F8803013F0600535D00021204602F0F4 +:103AB00077F90021204602F067F963681B6813B1AB +:103AC000062120469847062384F8703070BD2046B2 +:103AD00098470028E4D0B4F88630A26F9A4288BF95 +:103AE000A36794F98030A56F002B4FF0300380F26C +:103AF0000381002D00F0F280092284F8702083F306 +:103B0000118800212046D4E91D23FFF76DFF002313 +:103B100083F31188DAE794F8812003F07F0343EA06 +:103B2000022340F20232934200F0C58021D8B3F55F +:103B3000807F48D00DD8012B3FD0022B00F093801E +:103B4000002BB2D104F1880262670222A267E36708 +:103B5000C1E7B3F5817F00F09B80B3F5407FA4D12E +:103B600094F88230012BA0D1B4F8883043F00203DE +:103B700032E0B3F5006F4DD017D8B3F5A06F31D058 +:103B8000A3F5C063012B90D86368204694F8822087 +:103B90005E6894F88310B4F88430B047002884D06D +:103BA000436863670368A3671AE0B3F5106F36D004 +:103BB00040F6024293427FF478AF5C4B6367022386 +:103BC000A3670023C3E794F88230012B7FF46DAF25 +:103BD000B4F8883023F00203A4F88830C4E91D55F6 +:103BE000E56778E7B4F88030B3F5A06F0ED194F8AC +:103BF0008230204684F88A3001F016FD63681B6825 +:103C000013B1012120469847032323700023C4E900 +:103C10001D339CE704F18B0363670123C3E723781B +:103C2000042B10D1302383F311882046FFF7BAFE0E +:103C300085F311880321636884F88B5021701B6819 +:103C40000BB12046984794F88230002BDED084F8E0 +:103C50008B300423237063681B68002BD6D00221AD +:103C600020469847D2E794F8843020461D0603F09A +:103C70000F010AD501F088FD012804D002287FF445 +:103C800014AF2B4B9AE72B4B98E701F06FFDF3E74E +:103C900094F88230002B7FF408AF94F8843013F04E +:103CA0000F01B3D01A06204602D502F091F8ADE715 +:103CB00002F082F8AAE794F88230002B7FF4F5AE88 +:103CC00094F8843013F00F01A0D01B06204602D5D3 +:103CD00002F066F89AE702F057F897E7142284F8A2 +:103CE000702083F311882B462A4629462046FFF789 +:103CF00069FE85F31188E9E65DB1152284F870202C +:103D000083F3118800212046D4E91D23FFF75AFED2 +:103D1000FDE60B2284F8702083F311882B462A4697 +:103D200029462046FFF760FEE3E700BFF06F00087A +:103D3000E86F0008EC6F000838B590F87030044662 +:103D4000002B3ED0063BDAB20F2A34D80F2B32D8E4 +:103D5000DFE803F03731310822323131313131318E +:103D600031313737856FB0F886309D4214D2C36841 +:103D70001B8AB5FBF3F203FB12556DB9302383F3B5 +:103D800011882B462A462946FFF72EFE85F3118817 +:103D90000A2384F870300EE0142384F87030302346 +:103DA00083F31188002320461A461946FFF70AFEBE +:103DB000002383F3118838BDC36F03B198470023F4 +:103DC000E7E70021204601F0EBFF0021204601F04B +:103DD000DBFF63681B6813B1062120469847062362 +:103DE000D7E7000010B590F870300446142B29D0A6 +:103DF00017D8062B05D001D81BB110BD093B022BEB +:103E0000FBD80021204601F0CBFF0021204601F025 +:103E1000BBFF63681B6813B1062120469847062341 +:103E200019E0152BE9D10B2380F87030302383F390 +:103E3000118800231A461946FFF7D6FD002383F3A5 +:103E40001188DAE7C3689B695B68002BD5D1C36F23 +:103E500003B19847002384F87030CEE7FEF79CBF8B +:103E6000012100230170C0E901330C3000F01CB9BE +:103E700010B53023044683F311884160FEF79AFFA2 +:103E800002230020237080F3118810BD10B5302369 +:103E9000044683F31188032304F8083BFEF7B4FFBC +:103EA0004FF0FF31204600F0BBF9002383F3118867 +:103EB000C01A18BF012010BD38B50446302585F35F +:103EC0001188032504F8085BFEF7BAFF4FF0FF31B5 +:103ED000204600F0A5F9002383F31188C01A18BF0B +:103EE000012038BD38B50446302585F311880425F6 +:103EF00004F8085BFEF7C8FF4FF0FF31204600F0E2 +:103F00008FF9002383F31188C01A18BF012038BD30 +:103F100010B53023044683F31188FEF7DBFF062338 +:103F20002370002383F3118810BD000010B53023E7 +:103F3000044683F31188FEF7E7FF02232370002372 +:103F400083F3118810BD00000C3000F0C9B80000E8 +:103F50000C3000F0CFB800000023826803750369BD +:103F60001B6899689142FBD25A68036042601060F6 +:103F70005860704700238268037503691B6899685D +:103F80009142FBD85A6803604260106058607047E5 +:103F900008B50846302383F311880A7D0023052ADB +:103FA00006D8DFE802F00B050503120E82691360E4 +:103FB0004FF0FF338361FFF7CFFF002383F31188B6 +:103FC00008BD8269936801339360D0E900321360C1 +:103FD0005A60EDE7FFF7C0BF054BD9680875186850 +:103FE000026853601A600122D8600275FCF712BAA9 +:103FF000482F00200C4B30B5DD684B1C87B00446C1 +:104000000FD02B46094A684600F0D2F92046FFF748 +:10401000E3FF009B13B1684600F0D4F9A86907B02C +:1040200030BDFFF7D9FFF9E7482F0020913F000886 +:1040300038B50C4D04468161EB6881689A689142FD +:1040400003D8BDE83840FFF787BF1846FFF792FF57 +:1040500001230146EC6020462375BDE83840FCF79B +:10406000D9B900BF482F0020044B1A68DB6890685C +:104070009B68984294BF002001207047482F002081 +:10408000084B10B51C68D868226853601A6001227A +:10409000DC602275FFF76EFF01462046BDE8104048 +:1040A000FCF7B8B9482F0020C0E9000081607047D4 +:1040B0008368013B002B10B583600CDA074BDC688A +:1040C0004368A061206063601C6044600520FFF7C6 +:1040D00083FFA06910BD0020FCE700BF482F00202F +:1040E00008B5302383F31188FFF7E2FF002383F341 +:1040F000118808BD08B5302383F311888368013324 +:10410000002B836007DC036800211A68026050609E +:104110001846FFF78DFF002383F3118808BD0000C8 +:1041200038B50123084C00252370656002F044F87F +:1041300002F06AF80549064802F03EF902232370AE +:1041400085F3118838BD00BFB0310020F86F00083A +:10415000482F002008B572B6044B186500F080FDAA +:1041600000F05EFE024B03221A70FEE7482F00208B +:10417000B031002000F05CB9034A516853685B1A03 +:104180009842FBD8704700BF001000E08B6002230C +:10419000086108468B8270478368A3F1840243F864 +:1041A000142C026943F8442C426943F8402C094A14 +:1041B00043F8242CC268A3F1200043F8182C0222F3 +:1041C00003F80C2C002203F80B2C034A43F8102CA4 +:1041D000704700BF2D040008482F002008B5FFF7E6 +:1041E000DBFFBDE80840FFF7F5BE0000024BDB68CF +:1041F00098610F20FFF7F0BE482F0020302383F393 +:104200001188FFF7F3BF000008B50146302383F3A0 +:1042100011880820FFF7EEFE002383F3118808BD04 +:10422000054BDB6821B1036098610320FFF7E2BE14 +:104230004FF0FF30704700BF482F002003682BB1BC +:104240000022026018469961FFF7C4BE7047000063 +:10425000064BDB6839B1426818605A6013604360EE +:104260000420FFF7C7BE4FF0FF307047482F0020F3 +:104270000368984206D01A68026050601846996137 +:10428000FFF7A8BE7047000038B504460D46206809 +:10429000844200D138BD036823605C608561FFF70C +:1042A00099FEF4E7036810B59C68A2420CD85C68DC +:1042B0008A600B604C602160596099688A1A9A6024 +:1042C0004FF0FF33836010BD121B1B68ECE700004A +:1042D0000A2938BF0A2170B504460D460A2660191E +:1042E00001F064FF01F04CFF041BA54203D8751CCC +:1042F00004462E46F3E70A2E04D90120BDE870409B +:1043000002F09AB870BD0000F8B5144B0D460A2AA9 +:104310004FF00A07D96103F11001826038BF0A2209 +:10432000416019691446016048601861A81801F0DD +:104330002DFF01F025FF431B0646A34206D37C1C3C +:1043400028192746354601F031FFF2E70A2F04D934 +:104350000120BDE8F84002F06FB8F8BD482F0020FA +:10436000F8B506460D4601F00BFF0F4A134653F809 +:10437000107F9F4206D12A4601463046BDE8F840EC +:10438000FFF7C2BFD169BB68441A2C1928BF2C465D +:10439000A34202D92946FFF79BFF22463146034834 +:1043A000BDE8F840FFF77EBF482F0020582F0020BF +:1043B000C0E90323002310B45DF8044B4361FFF709 +:1043C000CFBF000010B5194C236998420DD0816809 +:1043D000D0E9003213605A609A680A449A60002358 +:1043E00003604FF0FF33A36110BD0268234643F81A +:1043F000102F53600022026022699A4203D1BDE867 +:10440000104001F0CDBE936881680B44936001F0C9 +:10441000B7FE2269E1699268441AA242E4D91144C4 +:10442000BDE81040091AFFF753BF00BF482F002016 +:104430002DE9F047DFF8BC8008F110072C4ED8F8C2 +:10444000105001F09DFED8F81C40AA68031B9A4248 +:104450003ED814444FF00009D5E90032C8F81C409A +:1044600013605A60C5F80090D8F81030B34201D1FB +:1044700001F096FE89F31188D5E903312846984763 +:10448000302383F311886B69002BD8D001F078FEBC +:104490006A69A0EB040982464A450DD2022001F068 +:1044A000CBFF0022D8F81030B34208D1514628463D +:1044B000BDE8F047FFF728BF121A2244F2E712EBDB +:1044C00009092946384638BF4A46FFF7EBFEB5E7EB +:1044D000D8F81030B34208D01444C8F81C00211A90 +:1044E000A960BDE8F047FFF7F3BEBDE8F08700BF65 +:1044F000582F0020482F002038B501F041FE054A12 +:10450000D2E90845031B181945F10001C2E9080169 +:1045100038BD00BF482F002000207047FEE7000094 +:10452000704700004FF0FF307047000002290CD0A8 +:10453000032904D00129074818BF00207047032A27 +:1045400005D8054800EBC2007047044870470020BA +:10455000704700BF6C7100084C230020D470000825 +:1045600070B59AB005460846144601A900F0FAF85D +:1045700001A8FCF757FE431C0022C6B25B001046A0 +:10458000C5E9003423700323023404F8013C01AB75 +:10459000D1B202348E4201D81AB070BD13F8011B9B +:1045A000013204F8010C04F8021CF1E708B53023CD +:1045B00083F311880448FFF733F90448FFF730F913 +:1045C000002383F3118808BDB8310020604A002021 +:1045D00090F8803003F01F02012A07D190F8812063 +:1045E0000B2A03D10023C0E91D3319E003F0600357 +:1045F000202B27D190F88430ABB990F885300BBBD5 +:1046000090F88120212A03D0222AEBD0202A19D128 +:10461000C3EBC3030C4A1344436707238367002398 +:10462000C36701207047022B0CD190F885304BB93D +:1046300090F88130212B03D0222BD3D0202B01D115 +:104640000123E5E7FFF7CEB83B23002013B505298A +:1046500027D8DFE801F02D26032D2D37302383F3F3 +:1046600011880478042C1ED11B4A01210190FFF708 +:104670007FF91A4A02210198FFF77AF9184A0321B3 +:104680000198FFF775F9174A21460198FFF770F96D +:104690001548FFF791F81548FFF78EF8002383F3CC +:1046A000118802B010BD032CF8D1FFF77BF9F5E7B4 +:1046B000302383F311880C48FFF754F80B48FFF7B9 +:1046C00051F8EBE7302383F311880748FFF768F8C8 +:1046D0000648FFF765F8E1E7247000084870000815 +:1046E0006C70000890700008B8310020604A00200B +:1046F00038B50C4D0C4C2A460C4904F10800FFF764 +:104700002FFF05F1CA0204F110000949FFF728FF45 +:1047100005F5CA7204F118000649BDE83840FFF7F4 +:104720001FBF00BF686300204C23002004700008F6 +:104730000E7000081970000870B5044608460D4652 +:10474000FCF770FDC6B22046013403780BB9184659 +:1047500070BD32462946FCF745FD0028F3D1012003 +:10476000F6E700002DE9F04705460C46FCF75AFD38 +:104770002B49C6B22846FFF7DFFF08B10736F6B26D +:1047800028492846FFF7D8FF08B11036F6B2632E45 +:104790000BD8DFF88C80DFF88C90234FDFF894A0E3 +:1047A0002E7846B92670BDE8F08729462046BDE838 +:1047B000F04702F0F7B9252E2ED1072241462846B0 +:1047C000FCF710FD70B9194B224603F10C0153F8A8 +:1047D000040B8B4242F8040BF9D11B8807350E34C9 +:1047E0001380DDE7082249462846FCF7FBFC98B910 +:1047F000A21C0F4B197802320909C95D02F8041C8A +:1048000013F8011B01F00F015345C95D02F8031CA9 +:10481000F0D118340835C3E7013504F8016BBFE760 +:104820008C71000819700008A371000894710008C9 +:1048300000E8F11F0CE8F11FBFF34F8F044B1A691A +:104840005107FCD1D3F810215207F8D1704700BFAF +:104850000020005208B50D4B1B78ABB9FFF7ECFFF9 +:104860000B4BDA68D10704D50A4A5A6002F1883244 +:104870005A60D3F80C21D20706D5064AC3F80421A2 +:1048800002F18832C3F8042108BD00BFC6650020CC +:10489000002000522301674508B5114B1B78F3B97E +:1048A000104B1A69510703D5DA6842F04002DA600A +:1048B000D3F81021520705D5D3F80C2142F040025D +:1048C000C3F80C21FFF7B8FF064BDA6842F001028B +:1048D000DA60D3F80C2142F00102C3F80C2108BDC4 +:1048E000C6650020002000520F289ABF00F58060A6 +:1048F00040040020704700004FF400307047000073 +:10490000102070470F2808B50BD8FFF7EDFF00F512 +:1049100000330268013204D104308342F9D101200E +:1049200008BD0020FCE700000F2838B505463FD839 +:10493000FFF782FF1F4CFFF78DFF4FF0FF33072873 +:104940006361C4F814311DD82361FFF775FF0302BA +:1049500043F02403E360E36843F08003E3602369EA +:104960005A07FCD42846FFF767FFFFF7BDFF4FF457 +:10497000003100F031FA2846FFF78EFFBDE83840DD +:10498000FFF7C0BFC4F81031FFF756FFA0F10803CE +:104990001B0243F02403C4F80C31D4F80C3143F06B +:1049A0008003C4F80C31D4F810315B07FBD4D9E78D +:1049B000002038BD002000522DE9F84F05460C4676 +:1049C000104645EA0203DE0602D00020BDE8F88F5B +:1049D00020F01F00DFF8BCB0DFF8BCA0FFF73AFF03 +:1049E00004EB0008444503D10120FFF755FFEDE734 +:1049F00020222946204602F0C5F810B9203520347F +:104A0000F0E72B4605F120021F68791CDDD1043345 +:104A10009A42F9D105F178431B481C4EB3F5801F2B +:104A20001B4B38BF184603F1F80332BFD946D146B5 +:104A30001E46FFF701FF0760A5EB040C336804F185 +:104A40001C0143F002033360231FD9F8007017F0F4 +:104A50000507FAD153F8042F8B424CF80320F4D108 +:104A6000BFF34F8FFFF7E8FE4FF0FF3320222146C0 +:104A700003602846336823F00203336002F082F8B3 +:104A80000028BBD03846B0E7142100520C20005259 +:104A900014200052102000521021005210B5084C72 +:104AA000237828B11BB9FFF7D5FE0123237010BD71 +:104AB000002BFCD02070BDE81040FFF7EDBE00BF1A +:104AC000C66500202DE9F04F0D4685B0814658B1EE +:104AD00011F00D0614BF2022082211F008030193E3 +:104AE00004D0431E03426AD0002435E0002E37D0A4 +:104AF00009F11F0121F01F094FF00108324F05F0A5 +:104B00000403DFF8D0A005EA080BBBF1000F32D098 +:104B10007869C0072FD408F101080C37B8F1060FE7 +:104B2000F3D19EB9294D4946A819019201F08EFB97 +:104B3000044600283AD11836019A782EF3D1494616 +:104B400001F084FB0446002830D1019A49462048F0 +:104B500001F07CFB044668BB204605B0BDE8F08F41 +:104B60000029C9D101462846029201F06FFB044694 +:104B7000E0B9029AC0E713B178694107CBD5AC0719 +:104B800002D578698007C6D5019911B17869010706 +:104B9000C1D51820494600FB08A0CDE9022301F049 +:104BA00055FB0446DDE902230028B4D04A46002123 +:104BB000204601E04A460021FCF73CFBCCE70246D8 +:104BC000002E95D198E700BFB4710008F865002069 +:104BD000C8650020E06500200021FFF773BF0000DA +:104BE0000121FFF76FBF0000F8B5144D012418270D +:104BF000134E40F2FF3200210120FCF71BFB07FBA4 +:104C0000046001342A6955F80C1F01F00BFB062CD7 +:104C1000F5D137254FF4C0542046FFF7E1FF014698 +:104C200028B122460748BDE8F84001F0FBBAC4EBC2 +:104C3000C404013D4FEAD404EED1F8BDB4710008BC +:104C4000E0650020C86500200421FFF73BBF00009D +:104C50004843FFF7C1BF000008B101F069BB7047CE +:104C600038B5054D00240334696855F80C0B00F085 +:104C7000C5F8122CF7D138BDB471000870B5AAB1CF +:104C800040EA010313F01F030FD1094C0144A5684A +:104C90006D0706D52568A84203D366683544A94246 +:104CA00004D903330C34122BF1D10022104670BD0D +:104CB000B471000838B5EFF311859DB9EFF30584A1 +:104CC000C4F30804302334B183F31188FFF714FCD4 +:104CD00085F3118838BD83F31188FFF70DFC84F349 +:104CE000118838BDBDE83840FFF706BC10B5FFF7A6 +:104CF000E1FF104CC008104A002340EA4170C90887 +:104D0000A0FB04ECA0FB020E1CEB0000A1FB044C7A +:104D1000A1FB02125B41001943EB0C0011EB0E01E9 +:104D200042F10002411842F10000090941EA007015 +:104D300010BD00BFCFF753E3A59BC4200244074B2F +:104D4000D2B210B5904200D110BD441C00B253F84D +:104D5000200041F8040BE0B2F4E700BF50400058D7 +:104D60000E4B30B51C6F240405D41C6F1C671C6FE0 +:104D700044F400441C670A4C02442368D2B243F452 +:104D800080732360074B904200D130BD441C51F822 +:104D9000045B00B243F82050E0B2F4E7004402584C +:104DA000004802585040005807B5012201A90020D0 +:104DB000FFF7C4FF019803B05DF804FB13B5044688 +:104DC000FFF7F2FFA04205D0012201A900200194C3 +:104DD000FFF7C6FF02B010BD0144BFF34F8F064B73 +:104DE000884204D3BFF34F8FBFF36F8F7047C3F870 +:104DF0005C022030F4E700BF00ED00E00144BFF3A7 +:104E00004F8F064B884204D3BFF34F8FBFF36F8F92 +:104E10007047C3F870022030F4E700BF00ED00E0F7 +:104E200070470000114BDA6952021ED59A69D0070B +:104E300004D50F4A9A6002F144329A600B4BDA694A +:104E4000D107FCD41A6A22F480021A629A6942F0ED +:104E500002029A61DA69D207FCD49A6942F001022F +:104E60009A61024AD369DB07FCD4704700200052E4 +:104E70003B2A190870B5054616460C46012010213C +:104E8000FFF7E6FE286046733CB1204636B1FFF7D7 +:104E9000DBFE2B68186000B19C6070BDFFF7A0FEC0 +:104EA000F7E70000F8B50F461546044648B905F186 +:104EB0001F010126386821F01F01FFF78DFF3046E2 +:104EC000F8BD427B29463868FFF7D8FE0646002821 +:104ED000EDD13B686360A368AB4210D213B1206888 +:104EE000FFF7BAFE637B28462BB1FFF7ADFE2060CB +:104EF00020B9A060E3E7FFF773FEF8E7A56020683C +:104F000005F11F01012621F01F013860FFF764FF42 +:104F10002673D4E710B5044640B10068884205D135 +:104F2000606808B1FCF754F90023237310BD00003A +:104F3000F8B50F461446054648B904F11F0101268D +:104F4000386821F01F01FFF759FF3046F8BD427B5A +:104F500021463868FFF792FE06460028EDD1AB687F +:104F6000A34210D213B12868FFF776FE6B7B204670 +:104F70002BB1FFF769FE286020B9A860E5E7FFF7CD +:104F80002FFEF8E7AC60396819B122462868FCF7B3 +:104F90001FF9286804F11F01012621F01F01386064 +:104FA000FFF72CFF2E73D0E720B103688B4204BFBC +:104FB000002303737047000008B100230373704798 +:104FC000034B1A681AB9034AD2F8D0241A60704702 +:104FD000706600200040025808B5FFF7F1FF024B51 +:104FE0001868C0F3806008BD70660020EFF3098385 +:104FF000054968334A6B22F001024A6383F309884A +:10500000002383F31188704700EF00E0302080F325 +:10501000118862B60D4B0E4AD96821F4E06109048B +:10502000090C0A430B49DA60D3F8FC2042F0807285 +:10503000C3F8FC20084AC2F8B01F116841F0010112 +:1050400011602022DA7783F82200704700ED00E03B +:105050000003FA0555CEACC5001000E0302310B5B2 +:1050600083F311880E4B5B6813F4006314D0F1EEE8 +:10507000103AEFF309844FF08073683CE361094B09 +:10508000DB6B236684F30988FEF7EEFF10B1064B55 +:10509000A36110BD054BFBE783F31188F9E700BF5F +:1050A00000ED00E000EF00E03F04000842040008CB +:1050B00070B5BFF34F8FBFF36F8F1A4A0021C2F84C +:1050C0005012BFF34F8FBFF36F8F536943F4003318 +:1050D0005361BFF34F8FBFF36F8FC2F88410BFF3DC +:1050E0004F8FD2F8803043F6E074C3F3C900C3F3A6 +:1050F0004E335B0103EA0406014646EA8175013935 +:10510000C2F86052F9D2203B13F1200FF2D1BFF365 +:105110004F8F536943F480335361BFF34F8FBFF315 +:105120006F8F70BD00ED00E0FEE70000214B2248CC +:10513000224A70B5904237D3214BC11EDA1C121A95 +:1051400022F003028B4238BF00220021FCF772F8E4 +:105150001C4A0023C2F88430BFF34F8FD2F880304E +:1051600043F6E074C3F3C900C3F34E335B0103EAB3 +:105170000406014646EA81750139C2F86C52F9D23B +:10518000203B13F1200FF2D1BFF34F8FBFF36F8F8E +:10519000BFF34F8FBFF36F8F0023C2F85032BFF3BE +:1051A0004F8FBFF36F8F70BD53F8041B40F8041B83 +:1051B000C0E700BF24740008286900202869002087 +:1051C0002869002000ED00E003681A6899685A60B9 +:1051D00043681BB142EA01418068184770470000EC +:1051E0004FF0A44310B51C68E00702D52848FFF72C +:1051F000EBFFA10702D52748FFF7E6FF620702D5BC +:105200002548FFF7E1FF230702D52448FFF7DCFF1D +:10521000E00602D52248FFF7D7FFA10602D52148B4 +:10522000FFF7D2FF620602D51F48FFF7CDFF230626 +:1052300002D51E48FFF7C8FFE00502D51C48FFF75E +:10524000C3FFA10502D51B48FFF7BEFF620502D5CB +:105250001948FFF7B9FF230502D51848FFF7B4FF37 +:10526000E00402D51648FFF7AFFFA10402D51548A8 +:10527000FFF7AAFF620402D51348FFF7A5FF230436 +:1052800002D51248FFF7A0FFBDE81040FFF7E6BEC9 +:105290007866002084660020906600209C660020CE +:1052A000A8660020B4660020C0660020CC660020FE +:1052B000D8660020E4660020F0660020FC6600202E +:1052C0000867002014670020206700202C6700205A +:1052D00030B5094B0021094C10200725196054F8FE +:1052E000042B0138C3E90121D16003F10C031161E2 +:1052F0005560F4D130BD00BF74660020FC71000819 +:105300000F28F0B50AD9102806D10F230020114C20 +:1053100001272568984203D9002018E00346F6E7E4 +:1053200007FA00F6354213D10C2335434343256079 +:10533000181D2344C3E90212074B20445A6B42F064 +:1053400001025A63DA6D42F00102DA65DB6DF0BDED +:105350000130DFE774660020004502580368D96811 +:10536000DA68C90722F03F02DA6002D51A689207AC +:10537000FCD507225A607047054B996B21EA000162 +:1053800099631A6E22EA00021A661B6E704700BF0C +:105390000045025870B5D0E9244300224FF0FF3594 +:1053A0009E6804EB42135101D3F80009002805DA86 +:1053B000D3F8000940F08040C3F80009D3F8000B8F +:1053C000002805DAD3F8000B40F08040C3F8000B4A +:1053D000013263189642C3F80859C3F8085BE0D25B +:1053E0004FF00113C4F81C3870BD0000890141F072 +:1053F0002001016103699B06FCD41220FEF7BCBEAC +:1054000010B50A4C2046FEF791FA094BC4F89030CB +:10541000084BC4F89430084C2046FEF787FA074B37 +:10542000C4F89030064BC4F8943010BD38670020A3 +:105430000000084060720008D467002000000440AB +:105440006C72000870B503780546012B58D13F4BAC +:10545000D0F89040984254D13D4B0E2165209A6B74 +:1054600042F000629A631A6E42F000621A661B6E86 +:10547000384BD3F8802042F00062C3F88020D3F884 +:10548000802022F00062C3F88020D3F88030FDF73E +:10549000B3FE314BE360314BC4F800380023D5F83C +:1054A0009060C4F8003EC02323604FF40413A3634C +:1054B0003369002BFCDA01230C203361FEF75CFE1C +:1054C0003369DB07FCD41220FEF756FE3369002B4C +:1054D000FCDA00262846A660FFF75CFF6B68C4F87C +:1054E0001068DB68C4F81468C4F81C6863BB1C4B04 +:1054F000A3614FF0FF336361A36843F00103A3602E +:1055000070BD184B9842C9D1114B4FF080609A6B17 +:1055100042F000729A631A6E42F000721A661B6EB5 +:105520000C4BD3F8802042F00072C3F88020D3F8EF +:10553000802022F00072C3F88020D3F88030FFF77B +:105540001BFF0E214D20A2E7074BD1E73867002053 +:105550000045025800440258401400400300200255 +:10556000003C30C0D4670020083C30C0F8B5D0F80B +:105570009040054600214FF000662046FFF736FFB9 +:10558000D5F8941000234FF001128F684FF0FF30D0 +:10559000C4F83438C4F81C2804EB431201339F428A +:1055A000C2F80069C2F8006BC2F80809C2F8080B1B +:1055B000F2D20B68D5F89020C5F8983063621023BA +:1055C0001361166916F01006FBD11220FEF7D4FD08 +:1055D000D4F8003823F4FE63C4F80038A36943F418 +:1055E000402343F01003A3610923C4F81038C4F822 +:1055F00014380B4BEB604FF0C043C4F8103B094B21 +:10560000C4F8003BC4F81069C4F80039D5F89830E4 +:1056100003F1100243F48013C5F89820A362F8BD8B +:105620003C72000840800010D0F8902090F88A105A +:10563000D2F8003823F4FE6343EA0113C2F80038BD +:10564000704700002DE9F84300EB8103D0F890503B +:105650000C468046DA680FFA81F94801166806F0B0 +:105660000306731E022B05EB41134FF0000194BF9C +:10567000B604384EC3F8101B4FF0010104F11003BB +:1056800098BF06F1805601FA03F3916998BF06F5B9 +:10569000004600293AD0578A04F15801374349019E +:1056A0006F50D5F81C180B430021C5F81C382B1877 +:1056B0000127C3F81019A7405369611E9BB3138AD1 +:1056C000928B9B08012A88BF5343D8F898209818DA +:1056D00042EA034301F140022146C8F898002846F7 +:1056E00005EB82025360FFF781FE08EB8900C36877 +:1056F0001B8A43EA845348341E4364012E51D5F873 +:105700001C381F43C5F81C78BDE8F88305EB491722 +:10571000D7F8001B21F40041C7F8001BD5F81C186E +:1057200021EA0303C0E704F13F030B4A2846214660 +:1057300005EB83035A60FFF759FE05EB4910D0F8DB +:10574000003923F40043C0F80039D5F81C3823EAA7 +:105750000707D7E70080001000040002D0F894206B +:105760001268C0F89820FFF715BE00005831D0F835 +:10577000903049015B5813F4004004D013F4001F2B +:105780000CBF0220012070474831D0F89030490109 +:105790005B5813F4004004D013F4001F0CBF022028 +:1057A0000120704700EB8101CB68196A0B68136018 +:1057B0004B6853607047000000EB810330B5DD6833 +:1057C000AA691368D36019B9402B84BF40231360C2 +:1057D0006B8A1468D0F890201C4402EB4110013C05 +:1057E00009B2B4FBF3F46343033323F0030343EA46 +:1057F000C44343F0C043C0F8103B2B6803F00303DD +:10580000012B0ED1D2F8083802EB411013F4807F3F +:10581000D0F8003B14BF43F0805343F00053C0F86E +:10582000003B02EB4112D2F8003B43F00443C2F8C4 +:10583000003B30BD2DE9F041D0F8906005460C46A4 +:1058400006EB4113D3F8087B3A07C3F8087B08D569 +:10585000D6F814381B0704D500EB8103DB685B68BE +:105860009847FA071FD5D6F81438DB071BD505EB88 +:105870008403D968CCB98B69488A5A68B2FBF0F6C0 +:1058800000FB16228AB91868DA6890420DD2121A03 +:10589000C3E90024302383F3118821462846FFF70B +:1058A0008BFF84F31188BDE8F081012303FA04F231 +:1058B0006B8923EA02036B81CB68002BF3D021466E +:1058C0002846BDE8F041184700EB81034A0170B556 +:1058D000DD68D0F890306C692668E66056BB1A44E3 +:1058E0004FF40020C2F810092A6802F00302012ACE +:1058F0000AB20ED1D3F8080803EB421410F4807FEB +:10590000D4F8000914BF40F0805040F00050C4F8B3 +:10591000000903EB4212D2F8000940F00440C2F83B +:1059200000090122D3F8340802FA01F10143C3F857 +:10593000341870BD19B9402E84BF40202060206803 +:105940001A442E8A8419013CB4FBF6F440EAC440A0 +:1059500040F00050C6E700002DE9F843D0F8906011 +:1059600005460C464F0106EB4113D3F8088918F0A1 +:10597000010FC3F808891CD0D6F81038DB0718D5FA +:1059800000EB8103D3F80CC0DCF81430D3F800E04E +:10599000DA68964530D2A2EB0E024FF000091A6089 +:1059A000C3F80490302383F31188FFF78DFF89F348 +:1059B000118818F0800F1DD0D6F834380126A64083 +:1059C000334217D005EB84030134D5F89050D3F857 +:1059D0000CC0E4B22F44DCF8142005EB0434D2F8F8 +:1059E00000E05168714514D3D5F8343823EA06062F +:1059F000C5F83468BDE8F883012303FA01F203898E +:105A000023EA02030381DCF80830002BD1D0984749 +:105A1000CFE7AEEB0103BCF81000834228BF03467A +:105A2000D7F8180980B2B3EB800FE3D89068A0F1E3 +:105A3000040959F8048FC4F80080A0EB09089844C1 +:105A4000B8F1040FF5D818440B4490605360C8E7D0 +:105A50002DE9F84FD0F8905004466E69AB691E40AE +:105A600016F480586E6103D0BDE8F84FFDF7CEBF45 +:105A7000002E12DAD5F8003E9B0705D0D5F8003E7F +:105A800023F00303C5F8003ED5F80438204623F080 +:105A90000103C5F80438FDF7E7FF370505D52046B3 +:105AA000FFF778FC2046FDF7CDFFB0040CD5D5F804 +:105AB000083813F0060FEB6823F470530CBF43F45F +:105AC000105343F4A053EB6031071BD56368DB68C8 +:105AD0001BB9AB6923F00803AB612378052B0CD10C +:105AE000D5F8003E9A0705D0D5F8003E23F0030311 +:105AF000C5F8003E2046FDF7B7FF6368DB680BB1D1 +:105B000020469847F30200F1BA80B70226D5D4F8B0 +:105B1000909000274FF0010A09EB4712D2F8003BA2 +:105B200003F44023B3F5802F11D1D2F8003B002BB2 +:105B30000DDA62890AFA07F322EA0303638104EBB0 +:105B40008703DB68DB6813B1394620469847013785 +:105B5000D4F89430FFB29B689F42DDD9F00619D586 +:105B6000D4F89000026AC2F30A1702F00F0302F49D +:105B7000F012B2F5802F00F0CA80B2F5402F09D1A3 +:105B800004EB8303002200F58050DB681B6A974218 +:105B900040F0B0803003D5F8185835D5E90303D567 +:105BA00000212046FFF746FEAA0303D50121204627 +:105BB000FFF740FE6B0303D502212046FFF73AFEB4 +:105BC0002F0303D503212046FFF734FEE80203D557 +:105BD00004212046FFF72EFEA90203D50521204609 +:105BE000FFF728FE6A0203D506212046FFF722FEB2 +:105BF0002B0203D507212046FFF71CFEEF0103D53A +:105C000008212046FFF716FE700340F1A780E90740 +:105C100003D500212046FFF79FFEAA0703D50121E7 +:105C20002046FFF799FE6B0703D502212046FFF7B8 +:105C300093FE2F0703D503212046FFF78DFEEE06C6 +:105C400003D504212046FFF787FEA80603D50521CA +:105C50002046FFF781FE690603D506212046FFF79F +:105C60007BFE2A0603D507212046FFF775FEEB05CC +:105C700074D520460821BDE8F84FFFF76DBED4F873 +:105C800090904FF0000B4FF0010AD4F894305FFA77 +:105C90008BF79B689F423FF638AF09EB4713D3F869 +:105CA000002902F44022B2F5802F20D1D3F8002938 +:105CB000002A1CDAD3F8002942F09042C3F80029E8 +:105CC000D3F80029002AFBDB3946D4F89000FFF70F +:105CD0008DFB22890AFA07F322EA0303238104EBEE +:105CE0008703DB689B6813B13946204698470BF160 +:105CF000010BCAE7910701D1D0F80080072A02F111 +:105D000001029CBF03F8018B4FEA18283FE704EB20 +:105D1000830300F58050DA68D2F818C0DCF8082058 +:105D2000DCE9001CA1EB0C0C00218F4208D1DB68E0 +:105D30009B699A683A449A605A683A445A6029E7DB +:105D400011F0030F01D1D0F800808C4501F1010161 +:105D500084BF02F8018B4FEA1828E6E7BDE8F88F08 +:105D600008B50348FFF774FEBDE80840FFF776B9B1 +:105D70003867002008B50348FFF76AFEBDE8084011 +:105D8000FFF76CB9D4670020D0F8903003EB4111D5 +:105D9000D1F8003B43F40013C1F8003B704700000A +:105DA000D0F8903003EB4111D1F8003943F40013DF +:105DB000C1F8003970470000D0F8903003EB411172 +:105DC000D1F8003B23F40013C1F8003B70470000FA +:105DD000D0F8903003EB4111D1F8003923F40013CF +:105DE000C1F800397047000030B50433039C0172DC +:105DF000002104FB0325C160C0E90653049B036333 +:105E0000059BC0E90000C0E90422C0E90842C0E9DE +:105E10000A11436330BD00000022416AC260C0E93C +:105E20000411C0E90A226FF00101FEF72DBA00004B +:105E3000D0E90432934201D1C2680AB9181D7047F3 +:105E400000207047036919600021C2680132C260F6 +:105E5000C269134482699342036124BF436A0361A8 +:105E6000FEF706BA38B504460D46E3683BB16269F1 +:105E70000020131D1268A3621344E36207E0237A33 +:105E800033B929462046FEF7E3F90028EDDA38BD9C +:105E90006FF00100FBE70000C368C269013BC3600B +:105EA0004369134482699342436124BF436A436157 +:105EB00000238362036B03B11847704770B530232A +:105EC000044683F31188866A3EB9FFF7CBFF054687 +:105ED00018B186F31188284670BDA36AE26A13F8E8 +:105EE000015B9342A36202D32046FFF7D5FF002354 +:105EF00083F31188EFE700002DE9F84F04460E46C2 +:105F0000174698464FF0300989F311880025AA46B4 +:105F1000D4F828B0BBF1000F09D141462046FFF765 +:105F2000A1FF20B18BF311882846BDE8F88FD4E992 +:105F30000A12A7EB050B521A934528BF9346BBF1F3 +:105F4000400F1BD9334601F1400251F8040B914236 +:105F500043F8040BF9D1A36A403640354033A362BD +:105F6000D4E90A239A4202D32046FFF795FF8AF329 +:105F70001188BD42D8D289F31188C9E730465A4604 +:105F8000FBF726F9A36A5E445D445B44A362E7E73E +:105F900010B5029C0433017203FB0421C460C0E904 +:105FA00006130023C0E90A33039B0363049BC0E983 +:105FB0000000C0E90422C0E90842436310BD0000AC +:105FC000026A6FF00101C260426AC0E90422002245 +:105FD000C0E90A22FEF758B9D0E904239A4201D158 +:105FE000C26822B9184650F8043B0B607047002382 +:105FF0001846FAE7C3680021C2690133C3604369E8 +:10600000134482699342436124BF436A4361FEF7AC +:106010002FB9000038B504460D46E3683BB123694B +:1060200000201A1DA262E2691344E36207E0237AAA +:1060300033B929462046FEF70BF90028EDDA38BDC2 +:106040006FF00100FBE7000003691960C268013AC4 +:10605000C260C269134482699342036124BF436AE8 +:10606000036100238362036B03B11847704700008C +:1060700070B530230D460446114683F31188866AB5 +:106080002EB9FFF7C7FF10B186F3118870BDA36A60 +:106090001D70A36AE26A01339342A36204D3E169EB +:1060A00020460439FFF7D0FF002080F31188EDE788 +:1060B0002DE9F84F04460D46904699464FF0300AB8 +:1060C0008AF311880026B346A76A4FB9494620468D +:1060D000FFF7A0FF20B187F311883046BDE8F88FA5 +:1060E000D4E90A073A1AA8EB0607974228BF1746D1 +:1060F000402F1BD905F1400355F8042B9D4240F871 +:10610000042BF9D1A36A40364033A362D4E90A23B1 +:106110009A4204D3E16920460439FFF795FF8BF3D7 +:1061200011884645D9D28AF31188CDE729463A46E7 +:10613000FBF74EF8A36A3D443E443B44A362E5E7C7 +:10614000D0E904239A4217D1C3689BB1836A8BB10B +:10615000043B9B1A0ED01360C368013BC360C36944 +:106160001A4483699A42026124BF436A036100238F +:1061700083620123184670470023FBE700F00EBA44 +:10618000014B586A704700BF000C0040034B0022CF +:1061900058631A610222DA60704700BF000C0040A9 +:1061A000014B0022DA607047000C0040014B58633D +:1061B000704700BF000C0040024B034A1A60034ABC +:1061C0005A6070478868002028690020000002207B +:1061D000074B494210B55C68201A08401968821ABA +:1061E0008A4203D3A24201D85A6010BD0020FCE7C6 +:1061F0008868002008B5302383F31188FFF7E8FF93 +:10620000002383F3118808BD04480121044B036077 +:106210000023C0E901330C30FDF746BF9068002031 +:10622000F5610008CB1D083A23F00703591A521AEA +:10623000012110B4D2080024C0E9004384600C306E +:106240001C605A605DF8044BFDF72EBF2DE9F84F36 +:10625000364ECD1D0F46002818BF0646082A4FEAC5 +:10626000D50538BF082206F10C08341D914640467A +:10627000FDF736FF09F10701C9F1000E2246246837 +:106280006CB94046FDF736FF3368CBB30822494668 +:10629000E8009847044698B340E9026730E004EB11 +:1062A000010CD4F804A00CEA0E0C0AF10100ACF1C8 +:1062B000080304EBC0009842E0D9A0EB0C0CB5EB4E +:1062C000EC0F4FEAEC0BD9D89C421CD204F1080227 +:1062D000AB45A3EB02024FEAE202626009D9691CF6 +:1062E000ED43206803EBC1025D44556043F8310083 +:1062F00022601C465F60404644F8086BFDF7FAFEDA +:106300002046BDE8F88FAA45216802D111602346D6 +:10631000EFE7013504EBC50344F8351003F108013C +:10632000401AC01058601360F1E700BF9068002069 +:10633000F8B550F8043C044650F8085CA0F1080693 +:1063400007332F1D0C35DB0840F8043C2846FDF7C9 +:10635000C7FE3B469F421A6801D0B34228D20AB119 +:10636000964225D244F8082C54F8042C1E600132C1 +:1063700054F8081C06EBC200814206D1486802446A +:1063800044F8042C0A6844F8082C5868411C03EBB4 +:10639000C1018E4207D154F8042C013202445A60E4 +:1063A00054F8082C1A602846BDE8F840FDF7A2BE54 +:1063B0001346CFE7FEE7000070B51B4B00250446EF +:1063C00086B058600E4685620163FEF71FFE04F139 +:1063D0001003A560E562C4E904334FF0FF33C4E95C +:1063E0000044C4E90635FFF7CBFE2B46024604F114 +:1063F00034012046C4E9082380230C4A2565FDF7B3 +:10640000C5FE01230A4AE06000920375684672687F +:106410000192B268CDE90223064BCDE90435FDF7C0 +:10642000DDFE06B070BD00BFB031002078720008FC +:106430007D720008B5630008024AD36A1843D0622F +:10644000704700BF482F00204B6843608B68836013 +:10645000CB68C3600B6943614B6903628B6943621C +:106460000B6803607047000008B5344B40F2FF70C2 +:10647000196C014319649A6E024331489A66314A95 +:106480009B6E1146FFF7E0FF00F5806002F11C01F2 +:10649000FFF7DAFF00F5806002F13801FFF7D4FF63 +:1064A00000F5806002F15401FFF7CEFF00F5806037 +:1064B00002F17001FFF7C8FF00F5806002F18C0166 +:1064C000FFF7C2FF00F5806002F1A801FFF7BCFFF3 +:1064D00000F5806002F1C401FFF7B6FF00F58060AF +:1064E00002F1E001FFF7B0FF00F5806002F1FC016E +:1064F000FFF7AAFF02F58C7100F58060FFF7A4FF9B +:1065000000F010F9104BD3F8902242F00102C3F8CA +:106510009022D3F8942242F00102C3F8942205227B +:10652000C3F898204FF06052C3F89C20074AC3F884 +:10653000A020BDE80840FEF775BC00BF004502582A +:10654000000002588472000800ED00E01F000803FC +:1065500008B500F0E1FAFDF7E3FD0D4BDA6B42F010 +:106560004002DA635A6E22F040025A665B6E094BB3 +:106570001A6842F008021A601A6842F004021A60AF +:10658000FEF71EFDFEF730FBBDE80840FEF7B0B891 +:106590000045025800180248704700000E4B9A6CE4 +:1065A00042F008029A641A6F42F008021A670B4A16 +:1065B0001B6FD36B43F00803D363C722084B9A6267 +:1065C0004FF0FF32DA6200229A615A63DA605A6051 +:1065D00001225A611A607047004502580010005CA1 +:1065E000000C0040094A08B51169D3680B40D9B2C4 +:1065F0009B076FEA0101116107D5302383F31188EE +:10660000FDF7B8FD002383F3118808BD000C00409E +:10661000044BDA6B0243DA635A6E104358665B6EC2 +:10662000704700BF0045025808B53D4B4FF0FF31A1 +:10663000D3F8802062F00042C3F88020D3F8802095 +:1066400002F00042C3F88020D3F88020D3F88420E1 +:10665000C3F88410D3F884200022C3F88420D3F830 +:106660008400D86F40F0FF4040F4FF0040F4DF406A +:1066700040F07F00D867D86F20F0FF4020F4FF0083 +:1066800020F4DF4020F07F00D867D86FD3F888006F +:106690006FEA40506FEA5050C3F88800D3F8880082 +:1066A000C0F30A00C3F88800D3F88800D3F890003C +:1066B000C3F89010D3F89000C3F89020D3F890005E +:1066C000D3F89400C3F89410D3F89400C3F894203E +:1066D000D3F89400D3F89800C3F89810D3F8980032 +:1066E000C3F89820D3F89800D3F88C00C3F88C1026 +:1066F000D3F88C00C3F88C20D3F88C00D3F89C001E +:10670000C3F89C10D3F89C10C3F89C20D3F89C309D +:10671000FCF74EFAFEF7DCFDBDE8084000F0C8B912 +:106720000044025808B50122504BC3F80821504BD1 +:106730005A6D42F002025A65DA6F42F00202DA67DD +:106740000422DB6F4B4BDA605A689104FCD54A4A4D +:106750001A6001229A60494ADA6000221A614FF4F5 +:1067600040429A61434B9A699204FCD51A6842F4FC +:1067700080721A60424B1A6F12F4407F04D04FF4BB +:1067800080321A6700221A671A6842F001021A6002 +:106790003B4B1A685007FCD500221A611A6912F0A7 +:1067A0003802FBD1012119604FF0804159605A67CE +:1067B000344ADA62344A1A611A6842F480321A6042 +:1067C0002F4B1A689103FCD51A6842F480521A6064 +:1067D0001A689204FCD52D4A2D499A6200225A6308 +:1067E000196301F57C01DA6301F5E77199635A6475 +:1067F000284A1A64284ADA621A6842F0A8521A60D3 +:106800001F4B1A6802F02852B2F1285FF9D14822D2 +:106810009A614FF48862DA6140221A621F4ADA6490 +:106820001F4A1A651F4A5A651F4A9A6532231F4A32 +:106830001360136803F00F03022BFAD1104A136997 +:1068400043F003031361136903F03803182BFAD1E3 +:106850004FF00050FFF7DCFE4FF08040FFF7D8FE0E +:106860004FF00040BDE80840FFF7D2BE0080005165 +:10687000004502580048025800C000F00400000122 +:10688000004402580000FF01008890083220600098 +:1068900063020901470E0508DD0BBF01200000203F +:1068A000000001100910E00000010110002000525A +:1068B0004FF0B04208B5D2F8883003F00103C2F8B7 +:1068C000883023B1044A13680BB150689847BDE87B +:1068D0000840FEF7C3BB00BFA86800204FF0B042DD +:1068E00008B5D2F8883003F00203C2F8883023B12B +:1068F000044A93680BB1D0689847BDE80840FEF79A +:10690000ADBB00BFA86800204FF0B04208B5D2F878 +:10691000883003F00403C2F8883023B1044A1369B5 +:106920000BB150699847BDE80840FEF797BB00BF20 +:10693000A86800204FF0B04208B5D2F8883003F0C4 +:106940000803C2F8883023B1044A93690BB1D069B7 +:106950009847BDE80840FEF781BB00BFA86800204B +:106960004FF0B04208B5D2F8883003F01003C2F8F7 +:10697000883023B1044A136A0BB1506A9847BDE8C6 +:106980000840FEF76BBB00BFA86800204FF0B04383 +:1069900010B5D3F8884004F47872C3F88820A306B1 +:1069A00004D5124A936A0BB1D06A9847600604D5A1 +:1069B0000E4A136B0BB1506B9847210604D50B4A56 +:1069C000936B0BB1D06B9847E20504D5074A136C63 +:1069D0000BB1506C9847A30504D5044A936C0BB1D6 +:1069E000D06C9847BDE81040FEF738BBA86800207F +:1069F0004FF0B04310B5D3F8884004F47C42C3F89C +:106A00008820620504D5164A136D0BB1506D984766 +:106A1000230504D5124A936D0BB1D06D9847E0045D +:106A200004D50F4A136E0BB1506E9847A10404D5DC +:106A30000B4A936E0BB1D06E9847620404D5084A96 +:106A4000136F0BB1506F9847230404D5044A936F1A +:106A50000BB1D06F9847BDE81040FEF7FFBA00BFFA +:106A6000A868002008B50348FCF75CFABDE80840B8 +:106A7000FEF7F4BA4C26002008B50348FCF736FBB5 +:106A8000BDE80840FEF7EABA6C26002008B50348C6 +:106A9000FCF72CFBBDE80840FEF7E0BAD826002042 +:106AA00008B5FFF79FFDBDE80840FEF7D7BA000024 +:106AB000062108B50846FCF79FFB06210720FCF7D6 +:106AC0009BFB06210820FCF797FB06210920FCF719 +:106AD00093FB06210A20FCF78FFB06211720FCF709 +:106AE0008BFB06212820FCF787FB09217A20FCF785 +:106AF00083FB0A215C20FCF77FFB07213220FCF797 +:106B00007BFB0C212620FCF777FB0C215220BDE8F3 +:106B10000840FCF771BB000008B5FFF785FD00F0E9 +:106B20000FF8FCF727FDFCF7FFFEFCF7D1FDFDF7A2 +:106B300095F9FFF731FDBDE80840FFF71FBB0000E6 +:106B40000023054A19460133102BC2E9001102F156 +:106B50000802F8D1704700BFA86800200B46014624 +:106B6000184600F001B8000010B5054C13462CB1D2 +:106B70000A4601460220AFF3008010BD2046FCE724 +:106B80000000000010B501390244904201D10020FC +:106B900005E0037811F8014FA34201D0181B10BD86 +:106BA0000130F2E7034611F8012B03F8012B002A0C +:106BB000F9D1704700000000010000000001000151 +:106BC0000000000000000000000000005265717528 +:106BD000657374656420746F206572617365206DE0 +:106BE0006F7265207468616E2077652063616E0A3C +:106BF00000457261736520436F6D6D616E64205254 +:106C0000656365697665640A0050435420444F4EBD +:106C1000453A2025640A000053544D333248373F2B +:106C20003F3F0053544D3332483733782F37327853 +:106C30000053544D3332483734332F3735332F37E1 +:106C40003530000001105A0003105900012058008F +:106C50000320560053464450000000004A45444576 +:106C6000433A204661696C656420746F20646574E2 +:106C700065637420666C617368206465766963651A +:106C80003A2025730A004A454445433A2046616943 +:106C90006C656420746F20636F6E66696720666C34 +:106CA000617368206465766963653A2025730A001C +:106CB0004A454445433A20446574656374656420DD +:106CC000466C617368204465766963653A20257374 +:106CD0000A0045787420466C617368204E6F7420FA +:106CE000466F756E642100006D7432357100773225 +:106CF000357100773235712D64747200E86C0008CC +:106D000020BA000000000000EE6C0008EF40000018 +:106D100000000000F36C0008EF70000000000000AD +:106D20000000000000000000091C0008711E00089F +:106D30002515000829150008D1150008D91D0008DF +:106D40002D15000831150008D11C0008A1150008F8 +:106D5000311D0008151A00083915000835150008FE +:106D6000091F00089915000800000000000000003D +:106D7000000000000000000001200008452300087A +:106D80004523000805200008092000080D20000800 +:106D9000112000084523000845230008452300086A +:106DA000292000082D200008452000084D2000085B +:106DB000592000085D200008612000084C260020B2 +:106DC0000100000000000000000000009921000800 +:106DD000B1210008012000086D200008E52100080D +:106DE000A12000087D220008AD2200081120000823 +:106DF0008520000871200008812000082920000853 +:106E00002D200008452000084D20000859200008CA +:106E10005D200008612000088920000800000000B3 +:106E20000000000019210008652000086920000802 +:106E30000000000000000000252400082D240008A8 +:106E400011240008192400083D24000841240008EA +:106E5000286E756C6C29000000000000C128000835 +:106E6000992800084928000865280008812800089A +:106E700010000240080002400008024000000B0021 +:106E800028000240080002400408024006010C00ED +:106E900040000240080002400808024010020D00B5 +:106EA00058000240080002400C08024016030E0081 +:106EB000700002400C0002401008024000040F0065 +:106EC000880002400C000240140802400605100031 +:106ED000A00002400C0002401808024010061100F9 +:106EE000B80002400C0002401C08024016072F00A8 +:106EF0001004024008040240200802400008380044 +:106F0000280402400804024024080240060939000F +:106F1000400402400804024028080240100A3A00D7 +:106F200058040240080402402C080240160B3B00A3 +:106F3000700402400C04024030080240000C3C0087 +:106F4000880402400C04024034080240060D44004C +:106F5000A00402400C04024038080240100E450014 +:106F6000B80402400C0402403C080240160F4600E0 +:106F70004D444D41206661696C75726500000000EA +:106F8000009600000000000000000000000000006B +:106F9000000000000000000000000000353500087F +:106FA000213500085D3500084935000855350008D1 +:106FB000413500082D3500081935000869350008ED +:106FC000000000004D36000839360008753600080C +:106FD000613600086D36000859360008453600084D +:106FE0003136000881360008000000000100000072 +:106FF0000000000063300000F46F0008A02F0020A4 +:10700000B03100204375626550696C6F7400437540 +:1070100062655265642D424C002553455249414CEE +:1070200025000000030000000000000025390008D2 +:1070300000000000100000000863002000000000B5 +:10704000010000000000000002000000000000003D +:107050006D380008DD38000840004000186300204B +:107060002863002002000000000000000300000070 +:10707000000000002539000800000000100000009A +:107080003863002000000000010000000000000044 +:1070900002000000000000006D380008DD38000824 +:1070A00040004000486300205863002002000000B8 +:1070B000000000003867002002020100386700204D +:1070C000040403004D4600082D450008D145000882 +:1070D000AD4500088D000000DC70000809028D003D +:1070E000040100C032080B00020202010009040082 +:1070F0000001020201000524001001052401030122 +:107100000424020205240600010705810310000182 +:1071100009040100020A0000000705020240000005 +:1071200007058202400000080B020202020100096A +:1071300004020001020201000524001001052401DF +:107140000303042402020524060203070583031037 +:10715000000109040300020A0000000705040240C0 +:10716000000007058402400000000000120000003B +:107170007471000812010002EF020140AE2D591097 +:1071800000020102030100000403090425424F41EB +:1071900052442500437562655265645072696D61A1 +:1071A0007279003031323334353637383941424321 +:1071B000444546000001002000FF010002000000DD +:1071C000000000300000040008000000000000245F +:1071D00000000800040000000004000000FC0000A3 +:1071E00002000000000004300080000008000000E1 +:1071F00000000038000001000100000040000052C3 +:1072000080000052C00000520001005240010052B4 +:1072100080010052C00100520002005240020052A0 +:1072200080020052C002005200030052400300528C +:1072300080030052C003005200040052000000000E +:10724000813A0008393D0008E53D00084000400053 +:107250007068002070680020010000008068002035 +:107260008000000040010000080000000001000054 +:1072700000100000080000006D61696E0069646C18 +:10728000650000000000802A00000000AAAAAAAA47 +:1072900000000024FFFF00000000000000A00A0022 +:1072A0002000200000000000AAAAAAAA00000000F6 +:1072B000FFFF0000000900000009000000000000BE +:1072C00000000000AAAAAAAA00000000FFFF000018 +:1072D00000000000000000000028800A00000000FC +:1072E000AAAAAAAA00140000FFFF0000000070076D +:1072F000009099002080020000000000AAAAAAAA1B +:1073000000400100FFFF00000009007007000000BE +:107310001000000000000000AAAAAAAA00000000B5 +:10732000FBFF00000000000000000000010400005E +:1073300000000000AAAAAAAA00000000FEFF0000A8 +:10734000000000000000000000000000000000003D +:10735000AAAAAAAA00000000FFFF00000000000087 +:10736000000000000000000000000000AAAAAAAA75 +:1073700000000000FFFF000000000000000000000F +:107380000000000000000000AAAAAAAA0000000055 +:10739000FFFF0000000000000000000000000000EF +:1073A00000000000AAAAAAAA00000000FFFF000037 +:1073B00000000000000000002D040000000000009C +:1073C00000001A0000000002FF000000B831002099 +:1073D0006C26002000000000186C000883040000E8 +:1073E000236C000850040000316C00080096000077 +:1073F0000000080096000000000800960000000051 +:10740000080000000400000088710008000000006F +:10741000000000000000000000000000000000006C +:047420000000000068 :00000001FF diff --git a/Tools/bootloaders/CubeRedSecondary_bl.bin b/Tools/bootloaders/CubeRedSecondary_bl.bin index 403e7e859e..821fb93fed 100755 Binary files a/Tools/bootloaders/CubeRedSecondary_bl.bin and b/Tools/bootloaders/CubeRedSecondary_bl.bin differ diff --git a/Tools/bootloaders/CubeRedSecondary_bl.hex b/Tools/bootloaders/CubeRedSecondary_bl.hex index 6f4adbe5be..e16421d261 100644 --- a/Tools/bootloaders/CubeRedSecondary_bl.hex +++ b/Tools/bootloaders/CubeRedSecondary_bl.hex @@ -1,29 +1,29 @@ :020000040800F2 :1000000000060020E1020008E3020008E302000805 :10001000E3020008E3020008E3020008E30200082C -:10002000E3020008E3020008E3020008F1200008F0 +:10002000E3020008E3020008E30200089D24000840 :10003000E3020008E3020008E3020008E30200080C :10004000E3020008E3020008E3020008E3020008FC -:10005000E3020008E3020008BD240008E9240008C8 -:1000600015250008412500086D250008E302000859 -:10007000E3020008E3020008E3020008E3020008CC -:10008000E3020008E3020008E3020008E3020008BC -:10009000E3020008E3020008E302000899250008D3 +:10005000E3020008E3020008BD2D0008E92D0008B6 +:10006000152E0008412E00086D2E0008F10F000823 +:100070001910000845100008711000089D100008B4 +:10008000C5100008F1100008E3020008E3020008B0 +:10009000E3020008E3020008E3020008992E0008CA :1000A000E3020008E3020008E3020008E30200089C :1000B000E3020008E3020008E3020008E30200088C :1000C000E3020008E3020008E3020008E30200087C :1000D000E3020008E3020008E3020008E30200086C -:1000E000FD250008E3020008E3020008E30200081F -:1000F000E3020008E3020008E3020008E30200084C -:10010000E3020008E302000899260008E302000861 +:1000E000FD2E0008E3020008E3020008E302000816 +:1000F000E3020008E3020008E30200081D11000803 +:10010000E3020008E3020008992F0008E302000858 :10011000E3020008E3020008E3020008E30200082B -:10012000E3020008E3020008E3020008E30200081B -:10013000E3020008E3020008E3020008E30200080B +:1001200049110008711100089D110008C91100084B +:10013000F5110008E3020008E3020008E3020008EA :10014000E3020008E3020008E3020008E3020008FB -:10015000E3020008E3020008E3020008E3020008EB +:100150001D1200084912000875120008E302000889 :10016000E3020008E3020008E3020008E3020008DB :10017000E3020008E3020008E3020008E3020008CB -:10018000E3020008E3020008712600088526000843 +:10018000E3020008E3020008712F0008852F000831 :10019000E3020008E3020008E3020008E3020008AB :1001A000E3020008E3020008E3020008E30200089B :1001B000E3020008E3020008E3020008E30200088B @@ -51,43 +51,43 @@ :100310004F8FBFF36F8F40F20000C0F2F0004EF637 :100320008851CEF200010860BFF34F8FBFF36F8F8B :100330004FF00000E1EE100A4EF63C71CEF20001E3 -:100340000860062080F31488BFF36F8F01F028FD4A -:1003500001F02AFE4FF055301F491B4A91423CBF25 +:100340000860062080F31488BFF36F8F02F008F96D +:1003500002F002FB4FF055301F491B4A91423CBF4F :1003600041F8040BFAE71D49184A91423CBF41F895 :10037000040BFAE71A491B4A1B4B9A423EBF51F83D :10038000040B42F8040BF8E700201849184A914280 -:100390003CBF41F8040BFAE701F040FD01F086FE96 +:100390003CBF41F8040BFAE702F020F902F062FBDF :1003A000144C154DAC4203DA54F8041B8847F9E7A6 :1003B00000F042F8114C124DAC4203DA54F8041B21 -:1003C0008847F9E701F028BD000600200022002040 +:1003C0008847F9E702F008B9000600200022002063 :1003D0000000000808ED00E00000002000060020FA -:1003E000582900080022002030220020302200205E -:1003F000702F0020E0020008E0020008E002000880 +:1003E0007833000800220020302200203022002034 +:1003F000C0300020E0020008E0020008E00200082F :10040000E00200082DE9F04F2DED108AC1F80CD064 :10041000D0F80CD0BDEC108ABDE8F08F002383F338 -:1004200011882846A047002001F08CF9FEE701F072 -:10043000FFF800DFFEE7000038B500F0ADFB01F08B -:100440006FFC054601F0A2FC0446D0B90F4B9D425B -:1004500019D001339D4242F2107512BF04460025A7 -:100460000124002001F066FC0CB100F077F800F0E8 -:1004700023FD00F0EFFB284600F0F0F800F06EF8E6 -:10048000F9E70025EDE70546EBE700BF010007B0FF -:1004900008B500F0ABFBA0F120035842584108BD5D +:1004200011882846A047002001F034FCFEE701F0C7 +:10043000C9FB00DFFEE7000038B500F009FC00F062 +:1004400061FD01F0C3FF054602F01EF80446C0B985 +:100450000E4B9D4217D001339D4242F2107512BFE0 +:10046000044600250124002001F0BAFF0CB100F081 +:1004700075F800F01FFD284600F0F0F800F06EF867 +:10048000F9E70025EFE70546EDE700BF010007B0FB +:1004900008B500F0A9FBA0F120035842584108BD5F :1004A00007B541F21203022101A8ADF8043000F0B3 -:1004B000BBFB03B05DF804FB38B5302383F3118830 -:1004C000174803680BB101F0FBF90023154A4FF4FC -:1004D0007A71134801F0EAF9002383F31188124C72 +:1004B000B9FB03B05DF804FB38B5302383F3118832 +:1004C000174803680BB101F0A3FC0023154A4FF451 +:1004D0007A71134801F092FC002383F31188124CC7 :1004E000236813B12368013B2360636813B1636819 :1004F000013B63600D4D2B7833B963687BB90220F3 -:1005000000F070FC322363602B78032B07D1636803 -:100510002BB9022000F066FC4FF47A73636038BD9B +:1005000000F06EFC322363602B78032B07D1636805 +:100510002BB9022000F064FC4FF47A73636038BD9D :1005200030220020B9040008502300204822002077 :10053000084B187003280CD8DFE800F00805020803 -:10054000022000F045BC022000F038BC024B002223 +:10054000022000F043BC022000F036BC024B002227 :100550005A6070474822002050230020F8B5394BDC :10056000394A1C46196801316BD004339342F9D1E2 :100570006268364B9A4264D9354B9B6803F100633D -:1005800003F500339A425CD2002000F089FB022080 +:1005800003F500339A425CD2002000F087FB022082 :10059000FFF7CEFF2F4B00219A6C99641A6F1967F1 :1005A0001A6FDA6CD9645A6F59675A6F1A6D1965E8 :1005B0009A6F99679B6F72B64FF0E023C3F8084DAE @@ -102,14 +102,14 @@ :100640002047F8BD0000020820000208FFFF010853 :10065000002200200045025800ED00E02DE9F04F97 :1006600093B0B44B2022FF2100900AA89D6800F0AF -:10067000CDFBB14A1378A3B90121B04811700360D2 -:10068000302383F3118803680BB101F019F90023BB -:10069000AB4A4FF47A71A94801F008F9002383F3BB +:10067000CBFBB14A1378A3B90121B04811700360D4 +:10068000302383F3118803680BB101F0C1FB002311 +:10069000AB4A4FF47A71A94801F0B0FB002383F311 :1006A0001188009B13B1A74B009A1A60A64A1378D1 :1006B000032B03D000231370A24A53604FF0000AAB -:1006C000009CD3465646D146012000F081FB24B160 -:1006D0009C4B1B68002B00F02682002000F086FA5D -:1006E0000390039B002BF2DB012000F067FB039BD0 +:1006C000009CD3465646D146012000F07FFB24B162 +:1006D0009C4B1B68002B00F02682002000F084FA5F +:1006E0000390039B002BF2DB012000F065FB039BD2 :1006F000213B1F2BE8D801A252F823F07D07000808 :10070000A507000839080008C9060008C90600083E :10071000C9060008CB0800089B0A0008B5090008B4 @@ -121,547 +121,709 @@ :10077000C9060008C9060008390800080220FFF76A :1007800087FE002840F0F981009B022105A8BAF1FC :10079000000F08BF1C4641F21233ADF8143000F0D0 -:1007A00043FA91E74FF47A7000F020FA071EEBDB72 +:1007A00041FA91E74FF47A7000F01EFA071EEBDB76 :1007B0000220FFF76DFE0028E6D0013F052F00F272 :1007C000DE81DFE807F0030A0D101336052304214C -:1007D00005A8059300F028FA17E004215548F9E729 +:1007D00005A8059300F026FA17E004215548F9E72B :1007E00004215A48F6E704215948F3E74FF01C0862 -:1007F000404608F1040800F055FA0421059005A8C8 -:1008000000F012FAB8F12C0FF2D101204FF00009DC -:1008100000FA07F747EA0B0B5FFA8BFB00F042FB8D +:1007F000404608F1040800F053FA0421059005A8CA +:1008000000F010FAB8F12C0FF2D101204FF00009DE +:1008100000FA07F747EA0B0B5FFA8BFB00F040FB8F :1008200026B10BF00B030B2B08BF0024FFF738FE9B :100830004AE704214748CDE7002EA5D00BF00B0373 :100840000B2BA1D10220FFF723FE074600289BD0E7 -:100850000120002600F024FA0220FFF769FE5FFA6B -:1008600086F8404600F02CFA0446B0B103994046A1 -:100870000136A1F140025142514100F031FA002805 +:100850000120002600F022FA0220FFF769FE1FFAAD +:1008600086F8404600F02AFA0446B0B103994046A3 +:100870000136A1F140025142514100F02FFA002807 :10088000EDD1BA46044641F21213022105A83E46B4 -:10089000ADF8143000F0C8F916E725460120FFF73F -:1008A00047FE244B9B68AB4207D9284600F0FAF973 +:10089000ADF8143000F0C6F916E725460120FFF741 +:1008A00047FE244B9B68AB4207D9284600F0F8F975 :1008B000013040F067810435F3E70025224BBA464A :1008C0003E461D701F4B5D60A8E7002E3FF45CAFF5 :1008D0000BF00B030B2B7FF457AF0220FFF728FE22 -:1008E000322000F083F9B0F10008FFF64DAF18F0A8 +:1008E000322000F081F9B0F10008FFF64DAF18F0AA :1008F00003077FF449AF0F4A08EB05039268934260 :100900003FF642AFB8F5807F3FF73EAF124BB84598 -:10091000019323DD4FF47A7000F068F90390039A95 +:10091000019323DD4FF47A7000F066F90390039A97 :10092000002AFFF631AF039A0137019B03F8012B30 :10093000EDE700BF002200204C23002030220020E1 :10094000B90400085023002048220020042200207F :10095000082200200C2200204C220020C820FFF793 :1009600097FD074600283FF40FAF1F2D11D8C5F1A2 :1009700020020AAB25F0030084494245184428BFF1 -:100980004246019200F038FA019AFF217F4800F0B8 -:100990003DFA4FEAA803C8F387027C492846019331 -:1009A00000F03CFA064600283FF46DAF019B05EBD2 +:100980004246019200F036FA019AFF217F4800F0BA +:100990003BFA4FEAA803C8F387027C492846019333 +:1009A00000F03AFA064600283FF46DAF019B05EBD4 :1009B000830533E70220FFF76BFD00283FF4E4AE28 -:1009C00000F0ACF900283FF4DFAE0027B846704BCA +:1009C00000F0AAF900283FF4DFAE0027B846704BCC :1009D0009B68BB4218D91F2F11D80A9B01330ED038 :1009E00027F0030312AA134453F8203C0593404612 -:1009F000042205A9043700F087FA8046E7E7384665 -:100A000000F050F90590F2E7CDF81480042105A814 -:100A100000F00AF902E70023642104A8049300F01F -:100A2000F9F800287FF4B0AE0220FFF731FD00286E -:100A30003FF4AAAE049800F067F90590E6E70023BA -:100A4000642104A8049300F0E5F800287FF49CAE2C +:1009F000042205A9043700F0E5FA8046E7E7384607 +:100A000000F04EF90590F2E7CDF81480042105A816 +:100A100000F008F902E70023642104A8049300F021 +:100A2000F7F800287FF4B0AE0220FFF731FD002870 +:100A30003FF4AAAE049800F065F90590E6E70023BC +:100A4000642104A8049300F0E3F800287FF49CAE2E :100A50000220FFF71DFD00283FF496AE049800F039 -:100A600055F9EAE70220FFF713FD00283FF48CAEAA -:100A700000F064F9E1E70220FFF70AFD00283FF4E7 -:100A800083AE05A9142000F05FF907460421049005 -:100A900004A800F0C9F83946B9E7322000F0A6F8FA +:100A600053F9EAE70220FFF713FD00283FF48CAEAC +:100A700000F062F9E1E70220FFF70AFD00283FF4E9 +:100A800083AE05A9142000F05DF907460421049007 +:100A900004A800F0C7F83946B9E7322000F0A4F8FE :100AA000071EFFF671AEBB077FF46EAE384A07EB48 :100AB0000903926893423FF667AE0220FFF7E8FC15 :100AC00000283FF461AE27F003074F44B9453FF4D7 -:100AD000A5AE484609F1040900F0E4F804210590A8 -:100AE00005A800F0A1F8F1E74FF47A70FFF7D0FC09 -:100AF00000283FF449AE00F011F9002844D00A9BC9 -:100B000001330BD008220AA9002000F087F9002841 -:100B10003AD02022FF210AA800F078F9FFF7C0FCA4 -:100B20001C4800F015FE13B0BDE8F08F002E3FF416 +:100AD000A5AE484609F1040900F0E2F804210590AA +:100AE00005A800F09FF8F1E74FF47A70FFF7D0FC0B +:100AF00000283FF449AE00F00FF9002844D00A9BCB +:100B000001330BD008220AA9002000F085F9002843 +:100B10003AD02022FF210AA800F076F9FFF7C0FCA6 +:100B20001C4801F0BDF813B0BDE8F08F002E3FF473 :100B30002BAE0BF00B030B2B7FF426AE00236421AE -:100B400005A8059300F066F8074600287FF41CAE60 +:100B400005A8059300F064F8074600287FF41CAE62 :100B50000220FFF79DFC804600283FF415AEFFF70A -:100B60009FFC41F2883000F0F3FD059800F0B2F9E7 -:100B700046463C4600F096F9A6E506464EE64FF09E +:100B60009FFC41F2883001F09BF8059800F0B0F945 +:100B700046463C4600F094F9A6E506464EE64FF0A0 :100B8000000901E6BA467EE637467CE64C220020A4 -:100B900000220020A086010070470000104B70B5B5 -:100BA0001B780C460133DBB2012B12D80D4B1D68AC -:100BB0004FF47A732968A2FB033222460E6A01467B -:100BC0002846B047844204D1074B002201201A7006 -:100BD00070BD4FF4FA7000F0BBFD0020F8E700BFD5 -:100BE00010220020142200209C230020002307B59F -:100BF000024601210DF107008DF80730FFF7CEFF07 -:100C000020B19DF8070003B05DF804FB4FF0FF3002 -:100C1000F9E700000A46042108B5FFF7BFFF80F09E -:100C20000100C0B2404208BD074B0A4630B41978F3 -:100C3000064B53F82140014623682046DD69044BEA -:100C4000AC4630BC604700BF9C230020142200202B -:100C5000A086010070B5104C0025104E00F038FF42 -:100C600020803068238883420CD8002520880138F2 -:100C700000F02AFF23880544013BB5F5802F23802F -:100C8000F4D370BD00F020FF336805440133B5F59F -:100C9000003F3360E5D3E8E79E230020582300207F -:100CA00000F0F4BF00F1006000F50030006870470C -:100CB00000F10060920000F5003000F06BBF000012 -:100CC000054B1A68054B1B889B1A834202D91044B6 -:100CD00000F0FABE00207047582300209E23002019 -:100CE00038B50446074D29B128682044BDE838408E -:100CF00000F002BF2868204400F0ECFE0028F3D08A -:100D000038BD00BF582300200020704700F1FF507D -:100D100000F58F10D0F8000870470000064991F8E0 -:100D2000243033B100230822086A81F82430FFF709 -:100D3000BFBF0120704700BF5C230020014B186833 -:100D4000704700BF0010005C194B013803220844B3 -:100D500070B51D68174BC5F30B042D0C1E88A642F9 -:100D60000BD15C680A46013C824213460FD214F94B -:100D7000016F4EB102F8016BF6E7013A03F1080387 -:100D8000ECD181420B4602D22C2203F8012B042421 -:100D9000094A1688AE4204D1984284BF967803F877 -:100DA000016B013C02F10402F3D1581A70BD00BF7F -:100DB0000010005C18220020B8270008022803D188 -:100DC000024B4FF080629A61704700BF000C0258DE -:100DD000022803D1024B4FF480629A61704700BF32 -:100DE000000C0258022804D1024A536983F480633C -:100DF00053617047000C0258002310B5934203D092 -:100E0000CC5CC4540133F9E710BD00000244034632 -:100E1000934202D003F8011BFAE770472DE9F8432B -:100E20001F4D14460746884695F8242052BBDFF82C -:100E300070909CB395F824302BB92022FF214846AE -:100E40002F62FFF7E3FF95F824004146C0F1080246 -:100E500005EB8000A24228BF2246D6B29200FFF7DF -:100E6000CBFF95F82430A41B17441E449044E4B2F1 -:100E7000F6B2082E85F82460DBD1FFF74FFF00287B -:100E8000D7D108E02B6A03EB82038342CFD0FFF770 -:100E900045FF0028CBD10020BDE8F8830120FBE707 -:100EA0005C230020024B1A78024B1A70704700BF77 -:100EB0009C23002010220020034B04490B60044BAC -:100EC000186800F01BBB00BF80841E008423002034 -:100ED00014220020094B1822002110B504461846A0 -:100EE000FFF794FF064A074B01461278046053F857 -:100EF0002200BDE8104000F001BB00BF84230020A9 -:100F00009C2300201422002030B50A44084D914251 -:100F10000DD011F8013B5840082340F30004013B79 -:100F20002C4013F0FF0384EA5000F6D1EFE730BD08 -:100F30002083B8ED026843681143016003B118478C -:100F400070470000024A136843F0C0031360704703 -:100F500000780040024A136843F0C00313607047F2 -:100F6000007C004037B51A4C1A4D204600F0BAFA02 -:100F700004F11400009400234FF40072164900F0AD -:100F800077F94FF40072154904F138000094144BBE -:100F900000F0F0F9134BC4E91735134C204600F06C -:100FA000A1FA04F1140000234FF400720F490094D9 -:100FB00000F05EF90E4B4FF400720E4904F1380058 -:100FC000009400F0D7F90C4BC4E9173503B030BDDD -:100FD000A023002000E1F5057824002078280020D7 -:100FE000450F0008007800400C24002078260020DF -:100FF000550F0008782A0020007C0040037C30B5A3 -:10100000274C002918BF0C46012B0CD1254B9842C8 -:1010100036D1254B9A6C42F080429A641A6F42F0A6 -:1010200080421A671B6F2268036EC16D03EB520387 -:101030008466B3FBF2F36268150442BF23F0070530 -:1010400003F0070343EA4503CB60A36843F0400382 -:101050004B60E36843F001038B6042F4967343F006 -:1010600001030B604FF0FF330B62510505D512F001 -:10107000102211D0B2F1805F10D080F8643030BD02 -:101080000A4B9842CFD1084B9A6C42F000429A64C6 -:101090001A6F42F00042C4E77F23EEE73F23ECE7FC -:1010A000C8270008A0230020004502580C24002077 -:1010B0002DE9F047C66D05463768F46921073462AB -:1010C0001AD014F0080118BF4FF48071E20748BF2E -:1010D00041F02001A3074FF0300348BF41F0400129 -:1010E000600748BF41F0800183F31188281DFFF796 -:1010F00021FF002383F31188E2050AD5302383F30F -:1011000011884FF48061281DFFF714FF002383F33B -:1011100011884FF030094FF0000A14F0200838D140 -:101120003B0616D54FF0300905F1380A200610D5D8 -:1011300089F31188504600F051F9002836DA082169 -:10114000281DFFF7F7FE27F080033360002383F3A9 -:101150001188790614D5620612D5302383F31188DD -:10116000D5E913239A4208D12B6C33B127F04007FD -:101170001021281DFFF7DEFE3760002383F311885E -:10118000E30618D5AA6E1369ABB15069BDE8F04704 -:10119000184789F31188736A284695F86410194036 -:1011A00000F0BAF98AF31188F469B6E7B06288F3FF -:1011B0001188F469BAE7BDE8F0870000F8B5154674 -:1011C000826804460B46AA4200D28568A169266956 -:1011D000761AB5420BD218462A46FFF70DFEA369D0 -:1011E0002B44A3612846A3685B1BA360F8BD0CD900 -:1011F000AF1B18463246FFF7FFFD3A46E168304420 -:10120000FFF7FAFDE3683B44EBE718462A46FFF791 -:10121000F3FDE368E5E7000083689342F7B5044611 -:10122000154600D28568D4E90460361AB5420BD25F -:101230002A46FFF7E1FD63692B4463612846A368F2 -:101240005B1BA36003B0F0BD0DD93246AF1B01910B -:10125000FFF7D2FD01993A46E0683144FFF7CCFD33 -:10126000E3683B44E9E72A46FFF7C6FDE368E4E7A5 -:1012700010B50A440024C361029B8460C16002610E -:101280000362C0E90000C0E9051110BD08B5D0E94E -:101290000532934201D1826882B98268013282604C -:1012A0005A1C426119700021D0E904329A4224BFCD -:1012B000C368436100F068FA002008BD4FF0FF30BA -:1012C000FBE7000070B5302304460E4683F3118817 -:1012D000A568A5B1A368A269013BA360531CA361E3 -:1012E00015782269934224BFE368A361E3690BB1D7 -:1012F00020469847002383F31188284607E03146AB -:10130000204600F031FA0028E2DA85F3118870BD3A -:101310002DE9F74F04460E4617469846D0F81C9024 -:101320004FF0300A8AF311884FF0000B154665B173 -:101330002A4631462046FFF741FF034660B9414641 -:10134000204600F011FA0028F1D0002383F3118821 -:10135000781B03B0BDE8F08FB9F1000F03D0019006 -:101360002046C847019B8BF31188ED1A1E448AF36F -:101370001188DCE7C160C361009B82600362C0E941 -:1013800005111144C0E9000001617047F8B5044639 -:101390000D461646302383F31188A768A7B1A368CA -:1013A000013BA36063695A1C62611D70D4E9043279 -:1013B0009A4224BFE3686361E3690BB12046984712 -:1013C000002080F3118807E03146204600F0CCF978 -:1013D0000028E2DA87F31188F8BD0000D0E9052380 -:1013E00010B59A4201D182687AB98268002101322F -:1013F00082605A1C82611C7803699A4224BFC368C8 -:10140000836100F0C1F9204610BD4FF0FF30FBE7CB -:101410002DE9F74F04460E4617469846D0F81C9023 -:101420004FF0300A8AF311884FF0000B154665B172 -:101430002A4631462046FFF7EFFE034660B9414693 -:10144000204600F091F90028F1D0002383F31188A1 -:10145000781B03B0BDE8F08FB9F1000F03D0019005 -:101460002046C847019B8BF31188ED1A1E448AF36E -:101470001188DCE7026843681143016003B1184733 -:10148000704700001430FFF743BF00004FF0FF33F8 -:101490001430FFF73DBF00003830FFF7B9BF000040 -:1014A0004FF0FF333830FFF7B3BF00001430FFF7C1 -:1014B00009BF00004FF0FF311430FFF703BF0000F9 -:1014C0003830FFF763BF00004FF0FF323830FFF7CE -:1014D0005DBF0000012914BF6FF0130000207047AA -:1014E000FFF740BD044B036000234360C0E90233B3 -:1014F00001230374704700BFE027000810B53023B4 -:10150000044683F31188FFF779FD0223002023743A -:1015100080F3118810BD000038B5C36904460D463C -:101520001BB904210844FFF7A5FF294604F1140064 -:10153000FFF7ACFE002806DA201D4FF40061BDE87D -:101540003840FFF797BF38BD0023826803750369F1 -:101550001B6899689142FBD25A6803604260106030 -:101560005860704700238268037503691B68996897 -:101570009142FBD85A68036042601060586070471F -:1015800008B50846302383F311880B7D032B05D063 -:10159000042B0DD02BB983F3118808BD8B69002271 -:1015A0001A604FF0FF338361FFF7CEFF0023F2E7AD -:1015B000D1E9003213605A60F3E70000FFF7C4BFBF -:1015C000054BD96808751868026853601A600122D3 -:1015D000D8600275FEF716BF782C00200C4B30B592 -:1015E000DD684B1C87B004460FD02B46094A68467D -:1015F00000F05CF92046FFF7E3FF009B13B168465B -:1016000000F05EF9A86907B030BDFFF7D9FFF9E730 -:10161000782C002081150008044B1A68DB6890685C -:101620009B68984294BF002001207047782C0020CE -:10163000084B10B51C68D868226853601A600122F4 -:10164000DC602275FFF78EFF01462046BDE81040A2 -:10165000FEF7D8BE782C0020044B1A68DB6892682D -:101660009B689A4201D9FFF7E3BF7047782C0020AE -:1016700038B5074C012300250649074823706560EB -:1016800000F03AFC0223237085F3118838BD00BFB7 -:10169000E02E00200C280008782C002000F046B92D -:1016A000EFF3118020B9EFF30583302282F3118824 -:1016B0007047000010B530B9EFF30584C4F3080497 -:1016C00014B180F3118810BDFFF7C6FF84F31188B1 -:1016D000F9E700008B600223086108468B8270479F -:1016E0008368A3F1840243F8142C026943F8442C64 -:1016F000426943F8402C094A43F8242CC268A3F1FC -:10170000200043F8182C022203F80C2C002203F8C6 -:101710000B2C034A43F8102C704700BF1D0400082F -:10172000782C002008B5FFF7DBFFBDE80840FFF785 -:1017300045BF0000024BDB6898610F20FFF740BFF8 -:10174000782C0020302383F31188FFF7F3BF0000CB -:1017500008B50146302383F311880820FFF73EFFC8 -:10176000002383F3118808BD064BDB6839B142685A -:1017700018605A60136043600420FFF72FBF4FF0DA -:10178000FF307047782C00200368984206D01A6812 -:101790000260506018469961FFF710BF7047000063 -:1017A000036810B59C68A2420CD85C688A600B6024 -:1017B0004C602160596099688A1A9A604FF0FF3333 -:1017C000836010BD121B1B68ECE700000A2938BFBC -:1017D0000A2170B504460D460A26601900F084FB04 -:1017E00000F06CFB041BA54203D8751C04462E4672 -:1017F000F3E70A2E04D90120BDE8704000F0BCBB1D -:1018000070BD0000F8B5144B0D460A2A4FF00A07C8 -:10181000D96103F11001826038BF0A224160196961 -:101820001446016048601861A81800F04DFB00F0F4 -:1018300045FB431B0646A34206D37C1C28192746BA -:10184000354600F051FBF2E70A2F04D90120BDE82C -:10185000F84000F091BBF8BD782C0020F8B50646A2 -:101860000D4600F02BFB0F4A134653F8107F9F42A2 -:1018700006D12A4601463046BDE8F840FFF7C2BF10 -:10188000D169BB68441A2C1928BF2C46A34202D93F -:101890002946FFF79BFF224631460348BDE8F84042 -:1018A000FFF77EBF782C0020882C0020C0E903239E -:1018B000002310B45DF8044B4361FFF7CFBF000075 -:1018C00010B5194C236998420DD08168D0E90032D7 -:1018D00013605A609A680A449A60002303604FF0CC -:1018E000FF33A36110BD0268234643F8102F5360F5 -:1018F0000022026022699A4203D1BDE8104000F044 -:10190000EDBA936881680B44936000F0D7FA2269BE -:10191000E1699268441AA242E4D91144BDE810403A -:10192000091AFFF753BF00BF782C00202DE9F047BC -:10193000DFF8BC8008F110072C4ED8F8105000F0EA -:10194000BDFAD8F81C40AA68031B9A423ED814443A -:101950004FF00009D5E90032C8F81C4013605A6006 -:10196000C5F80090D8F81030B34201D100F0B6FAB3 -:1019700089F31188D5E9033128469847302383F34A -:1019800011886B69002BD8D000F098FA6A69A0EB37 -:10199000040982464A450DD2022000F0EDFA0022E9 -:1019A000D8F81030B34208D151462846BDE8F04778 -:1019B000FFF728BF121A2244F2E712EB0909294661 -:1019C000384638BF4A46FFF7EBFEB5E7D8F8103087 -:1019D000B34208D01444C8F81C00211AA960BDE81D -:1019E000F047FFF7F3BEBDE8F08700BF882C00206A -:1019F000782C002000207047FEE7000070470000B0 -:101A00004FF0FF3070470000BFF34F8F044B1A694F -:101A10005107FCD1D3F810215207F8D1704700BF0D -:101A20000020005208B50D4B1B78ABB9FFF7ECFF57 -:101A30000B4BDA68D10704D50A4A5A6002F18832A2 -:101A40005A60D3F80C21D20706D5064AC3F8042100 -:101A500002F18832C3F8042108BD00BFE82E00203F -:101A6000002000522301674508B5114B1B78F3B9DC -:101A7000104B1A69510703D5DA6842F04002DA6068 -:101A8000D3F81021520705D5D3F80C2142F04002BB -:101A9000C3F80C21FFF7B8FF064BDA6842F00102E9 -:101AA000DA60D3F80C2142F00102C3F80C2108BD22 -:101AB000E82E0020002000520F289ABF00F5806019 -:101AC00040040020704700004FF4003070470000D1 -:101AD000102070470F2808B50BD8FFF7EDFF00F571 -:101AE00000330268013204D104308342F9D101206D -:101AF00008BD0020FCE700000F2870B5054645D85A -:101B0000FFF7CEFD224CFFF77FFF0646FFF78AFF67 -:101B10004FF0FF33072D6361C4F8143120D82361DF -:101B2000FFF772FF2B0243F02403E360E36843F006 -:101B30008003E36023695A07FCD42846FFF764FF5B -:101B40004FF40031FFF7B8FF00F002F93046FFF71D -:101B50008BFFFFF7AFFD2846BDE87040FFF7BABF27 -:101B6000C4F81031FFF750FFA5F108031B0243F042 -:101B70002403C4F80C31D4F80C3143F08003C4F8CA -:101B80000C31D4F810315B07FBD4D6E7002070BDD0 -:101B9000002000522DE9F84F40EA020305460C46AA -:101BA0001746D80602D00020BDE8F88F27F01F079F -:101BB000DFF8D4B0FFF736FF2744BC4203D1012041 -:101BC000FFF752FFF0E720222946204600F0CEFD25 -:101BD00010B920352034F0E72B4605F120021E68AD -:101BE000711CE0D104339A42F9D1FFF759FD05F198 -:101BF0007843234AB3F5801F224B28BF9A4603F14E -:101C0000040338BF9046A2F1080228BF9846A3F10A -:101C100008033ABF9146DA469946FFF7F5FEC8F841 -:101C20000060A5EB040CD9F8002004F11C0142F07F -:101C30000202C9F80020221FDAF8006016F005063B -:101C4000FAD152F8043F8A424CF80230F4D1BFF383 -:101C50004F8FFFF7D9FE4FF0FF32C8F80020D9F8B8 -:101C6000002022F00202C9F80020FFF723FD202205 -:101C70002146284600F07AFD0028AAD030469FE78A -:101C800014200052102100521020005210B5084CB0 -:101C9000237828B11BB9FFF7C5FE0123237010BDBF -:101CA000002BFCD02070BDE81040FFF7DDBE00BF68 -:101CB000E82E00200244074BD2B210B5904200D16A -:101CC00010BD441C00B253F8200041F8040BE0B2F0 -:101CD000F4E700BF504000580E4B30B51C6F240491 -:101CE00005D41C6F1C671C6F44F400441C670A4C2D -:101CF00002442368D2B243F480732360074B9042BE -:101D000000D130BD441C51F8045B00B243F82050B0 -:101D1000E0B2F4E70044025800480258504000582E -:101D200007B5012201A90020FFF7C4FF019803B005 -:101D30005DF804FB13B50446FFF7F2FFA04205D09F -:101D4000012201A900200194FFF7C6FF02B010BDD7 -:101D50000144BFF34F8F064B884204D3BFF34F8F2C -:101D6000BFF36F8F7047C3F85C022030F4E700BF09 -:101D700000ED00E0034B1A681AB9034AD2F8D024E8 -:101D80001A607047EC2E00200040025808B5FFF79B -:101D9000F1FF024B1868C0F3806008BDEC2E0020F4 -:101DA00070B5BFF34F8FBFF36F8F1A4A0021C2F88F -:101DB0005012BFF34F8FBFF36F8F536943F400335B -:101DC0005361BFF34F8FBFF36F8FC2F88410BFF31F -:101DD0004F8FD2F8803043F6E074C3F3C900C3F3E9 -:101DE0004E335B0103EA0406014646EA8175013978 -:101DF000C2F86052F9D2203B13F1200FF2D1BFF3A9 -:101E00004F8F536943F480335361BFF34F8FBFF358 -:101E10006F8F70BD00ED00E0FEE70000214B22480F -:101E2000224A70B5904237D3214BC11EDA1C121AD8 -:101E300022F003028B4238BF00220021FEF7E6FFAA -:101E40001C4A0023C2F88430BFF34F8FD2F8803091 -:101E500043F6E074C3F3C900C3F34E335B0103EAF6 -:101E60000406014646EA81750139C2F86C52F9D27E -:101E7000203B13F1200FF2D1BFF34F8FBFF36F8FD1 -:101E8000BFF34F8FBFF36F8F0023C2F85032BFF301 -:101E90004F8FBFF36F8F70BD53F8041B40F8041BC6 -:101EA000C0E700BF88290008702F0020702F002095 -:101EB000702F002000ED00E000F07CB9014B586A63 -:101EC000704700BF000C0040034B002258631A61AA -:101ED0000222DA60704700BF000C0040014B002274 -:101EE000DA607047000C0040014B5863704700BF38 -:101EF000000C0040FEE7000070B51B4B00250446B7 -:101F000086B058600E468562016300F001F904F165 -:101F10001003A560E562C4E904334FF0FF33C4E960 -:101F20000044C4E90635FFF7C9FF2B46024604F119 -:101F300034012046C4E9082380230C4A2565FFF7B5 -:101F4000C9FB01230A4AE060009203756846726883 -:101F50000192B268CDE90223064BCDE90435FFF7C3 -:101F6000E1FB06B070BD00BFE02E0020182800087D -:101F70001D280008F51E0008024AD36A1843D062E3 -:101F8000704700BF782C00204B6843608B688360EB -:101F9000CB68C3600B6943614B6903628B69436221 -:101FA0000B6803607047000008B53A4B40F2FF71C0 -:101FB0003948D3F888200A43C3F88820D3F888200A -:101FC00022F4FF6222F00702C3F88820D3F8883099 -:101FD000324B1A6C0A431A649A6E0A439A66304A64 -:101FE0009B6E1146FFF7D0FF00F5806002F11C01E7 -:101FF000FFF7CAFF00F5806002F13801FFF7C4FF68 -:1020000000F5806002F15401FFF7BEFF00F580602B -:1020100002F17001FFF7B8FF00F5806002F18C015A -:10202000FFF7B2FF00F5806002F1A801FFF7ACFFF7 -:1020300000F5806002F1C401FFF7A6FF00F58060A3 -:1020400002F1E001FFF7A0FF00F5806002F1FC0162 -:10205000FFF79AFF02F58C7100F58060FFF794FF9F -:1020600000F066F90F4BD3F8902242F00102C3F85A -:102070009022D3F8942242F00102C3F89422052260 -:10208000C3F898204FF06052C3F89C20064AC3F86A -:10209000A02008BD00440258000002580045025824 -:1020A0002428000800ED00E01F00080308B500F038 -:1020B00041FBFFF7DDFA0B4BDA6B42F04002DA63CB -:1020C0005A6E22F040025A665B6E074B1A6842F065 -:1020D00008021A601A6842F004021A60BDE808405B -:1020E000FFF748BE0045025800180248704700003C -:1020F000EFF30983054968334A6B22F001024A6312 -:1021000083F30988002383F31188704700EF00E010 -:10211000302080F3118862B60D4B0E4AD96821F445 -:10212000E0610904090C0A430B49DA60D3F8FC208A -:1021300042F08072C3F8FC20084AC2F8B01F116850 -:1021400041F0010111602022DA7783F82200704704 -:1021500000ED00E00003FA0555CEACC5001000E02C -:10216000302310B583F311880E4B5B6813F40063C2 -:1021700014D0F1EE103AEFF309844FF08073683C0D -:10218000E361094BDB6B236684F30988FFF744FAAC -:1021900010B1064BA36110BD054BFBE783F311881B -:1021A000F9E700BF00ED00E000EF00E02F040008B9 -:1021B000320400080E4B9A6C42F008029A641A6FBF -:1021C00042F008021A670B4A1B6FD36B43F00803F7 -:1021D000D363C722084B9A624FF0FF32DA620022C3 -:1021E0009A615A63DA605A6001225A611A60704734 -:1021F000004502580010005C000C0040094A08B578 -:102200001169D3680B40D9B29B076FEA01011161D4 -:1022100007D5302383F31188FFF740FA002383F3B7 -:10222000118808BD000C0040044BDA6B0243DA63EE -:102230005A6E104358665B6E704700BF00450258E7 -:102240003A4B4FF0FF31D3F8802062F00042C3F8E0 -:102250008020D3F8802002F00042C3F88020D3F819 -:102260008020D3F88420C3F88410D3F8842000227F -:10227000C3F88420D3F88400D86F40F0FF4040F4C6 -:10228000FF0040F4DF4040F07F00D867D86F20F0B7 -:10229000FF4020F4FF0020F4DF4020F07F00D867EB -:1022A000D86FD3F888006FEA40506FEA5050C3F8F7 -:1022B0008800D3F88800C0F30A00C3F88800D3F878 -:1022C0008800D3F89000C3F89010D3F89000C3F8BA -:1022D0009020D3F89000D3F89400C3F89410D3F86A -:1022E0009400C3F89420D3F89400D3F89800C3F86E -:1022F0009810D3F89800C3F89820D3F89800D3F832 -:102300008C00C3F88C10D3F88C00C3F88C20D3F861 -:102310008C00D3F89C00C3F89C10D3F89C10C3F831 -:102320009C20D3F89C3000F0BFB900BF0044025895 -:1023300008B50122504BC3F80821504B5A6D42F0AA -:1023400002025A65DA6F42F00202DA670422DB6F9A -:102350004B4BDA605A689104FCD54A4A1A60012254 -:102360009A60494ADA6000221A614FF440429A6149 -:10237000434B9A699204FCD51A6842F480721A6041 -:10238000424B1A6F12F4407F04D04FF480321A6728 -:1023900000221A671A6842F001021A603B4B1A6861 -:1023A0005007FCD500221A611A6912F03802FBD1DD -:1023B000012119604FF0804159605A67344ADA624E -:1023C000344A1A611A6842F480321A602F4B1A6834 -:1023D0009103FCD51A6842F480521A601A6892047C -:1023E000FCD52D4A2D499A6200225A63196301F5E2 -:1023F0007C01DA6301F5E77199635A64284A1A642B -:10240000284ADA621A6842F0A8521A601F4B1A680A -:1024100002F02852B2F1285FF9D148229A614FF4B4 -:102420008862DA6140221A621F4ADA641F4A1A651A -:102430001F4A5A651F4A9A6532231F4A1360136860 -:1024400003F00F03022BFAD1104A136943F0030380 -:102450001361136903F03803182BFAD14FF00050C1 -:10246000FFF7E2FE4FF08040FFF7DEFE4FF0004046 -:10247000BDE80840FFF7D8BE008000510045025873 -:102480000048025800C000F0040000010044025857 -:102490000000FF01008890083220600063020901FB -:1024A000470E0508DD0BBF012000002000000110D1 -:1024B0000910E00000010110002000524FF0B0426E -:1024C00008B5D2F8883003F00103C2F8883023B190 -:1024D000044A13680BB150689847BDE80840FFF7FD -:1024E0003FBE00BFF02E00204FF0B04208B5D2F83A -:1024F000883003F00203C2F8883023B1044A93689D -:102500000BB1D0689847BDE80840FFF729BE00BF6F -:10251000F02E00204FF0B04208B5D2F8883003F01A -:102520000403C2F8883023B1044A13690BB150691F -:102530009847BDE80840FFF713BE00BFF02E00200B -:102540004FF0B04208B5D2F8883003F00803C2F863 -:10255000883023B1044A93690BB1D0699847BDE82C -:102560000840FFF7FDBD00BFF02E00204FF0B04245 -:1025700008B5D2F8883003F01003C2F8883023B1D0 -:10258000044A136A0BB1506A9847BDE80840FFF748 -:10259000E7BD00BFF02E00204FF0B04310B5D3F8D8 -:1025A000884004F47872C3F88820A30604D5124A40 -:1025B000936A0BB1D06A9847600604D50E4A136B34 -:1025C0000BB1506B9847210604D50B4A936B0BB1A6 -:1025D000D06B9847E20504D5074A136C0BB1506CD9 -:1025E0009847A30504D5044A936C0BB1D06C984767 -:1025F000BDE81040FFF7B4BDF02E00204FF0B0430F -:1026000010B5D3F8884004F47C42C3F888206205F2 -:1026100004D5164A136D0BB1506D9847230504D5A8 -:10262000124A936D0BB1D06D9847E00404D50F4A60 -:10263000136E0BB1506E9847A10404D50B4A936EEC -:102640000BB1D06E9847620404D5084A136F0BB1E2 -:10265000506F9847230404D5044A936F0BB1D06F91 -:102660009847BDE81040FFF77BBD00BFF02E00206B -:1026700008B50348FEF71CFDBDE80840FFF770BD34 -:10268000A023002008B50348FEF712FDBDE808406E -:10269000FFF766BD0C24002008B5FFF7AFFDBDE8CD -:1026A0000840FFF75DBD0000062108B5084600F0B0 -:1026B0002BF80621072000F027F80621082000F05B -:1026C00023F80621092000F01FF806210A2000F057 -:1026D0001BF80621172000F017F80621282000F02B -:1026E00013F809217A2000F00FF80721322000F0BA -:1026F0000BF80C21522000F007F80C215320BDE804 -:10270000084000F001B80000090100F16043012217 -:1027100003F56143C9B283F8001300F01F039A4028 -:1027200043099B0003F1604303F56143C3F8802133 -:102730001A60704708B5FFF783FD00F009F8FEF74F -:10274000CFFEFFF7D3FCBDE80840FFF7B5BB0000A4 -:102750000023054A19460133102BC2E9001102F18A -:102760000802F8D1704700BFF02E002010B50139E3 -:102770000244904201D1002005E0037811F8014F96 -:10278000A34201D0181B10BD0130F2E753544D3362 -:102790003248373F3F3F0053544D33324837337848 -:1027A0002F3732780053544D3332483734332F3774 -:1027B00035332F373530000001105A00031059000F -:1027C0000120580003205600009600000000000081 -:1027D00000000000000000000000000000000000F9 -:1027E00000000000A11400088D140008C91400089E -:1027F000B5140008C1140008AD14000899140008AD -:1028000085140008D514000863300000082800086B -:10281000D02C0020E02E00206D61696E0069646C90 -:10282000650000000000002800000000AAAAAAAA73 -:1028300000000024FFFF0000000000000000000076 -:102840000000000000000000AAAAAAAA00000000E0 -:10285000FFFF00000000000000000000000000007A -:1028600000000000AAAAAAAA00000000FFFF0000C2 -:102870000000000000000000000010000000000048 -:10288000AAAAAAAA00000000FFFF000000000000A2 -:10289000000000000A80020000000000AAAAAAAA04 -:1028A00005400100FFFF00008800007007000000E5 -:1028B0000000000000000000AAAAAAAA0000000070 -:1028C000FFFF00000000000000000000000000000A -:1028D00000000000AAAAAAAA00000000FFFF000052 -:1028E00000000000000000000000000000000000E8 -:1028F000AAAAAAAA00000000FFFF00000000000032 -:10290000000000000000000000000000AAAAAAAA1F -:1029100000000000FFFF00000000000000000000B9 -:102920000000000000000000AAAAAAAA00000000FF -:10293000FFFF000000000000000000000000000099 -:1029400000000000AAAAAAAA00000000FFFF0000E1 -:1029500000000000000000002E0400000000000045 -:1029600000001A0000000000FF000000A02300206B -:10297000000000008C27000883040000972700084F -:0829800050040000A527000827 +:100B900000220020A0860100104B70B51B780C4687 +:100BA0000133DBB2012B12D80D4B1D684FF47A7361 +:100BB0002968A2FB033222460E6A01462846B04746 +:100BC000844204D1074B002201201A7070BD4FF4FB +:100BD000FA7001F065F80020F8E700BF102200204D +:100BE000142200209C230020002307B50246012187 +:100BF0000DF107008DF80730FFF7CEFF20B19DF80B +:100C0000070003B05DF804FB4FF0FF30F9E7000088 +:100C10000A46042108B5FFF7BFFF80F00100C0B20B +:100C2000404208BD074B0A4630B41978064B53F8CA +:100C30002140014623682046DD69044BAC4630BCA8 +:100C4000604700BF9C23002014220020A0860100E2 +:100C500070B5104C0025104E01F0E2F9208030688C +:100C6000238883420CD800252088013801F0D4F96C +:100C700023880544013BB5F5802F2380F4D370BD54 +:100C800001F0CAF9336805440133B5F5003F33601C +:100C9000E5D3E8E79E2300205823002001F08EBA18 +:100CA00000F1006000F500300068704700F100605E +:100CB000920000F5003001F00FBA0000054B1A68F1 +:100CC000054B1B889B1A834202D9104401F0A4B93A +:100CD00000207047582300209E23002038B504468A +:100CE000074D29B128682044BDE8384001F0ACB96F +:100CF0002868204401F096F90028F3D038BD00BFE1 +:100D0000582300200020704700F1FF5000F58F109D +:100D1000D0F8000870470000064991F8243033B13C +:100D200000230822086A81F82430FFF7BFBF0120A2 +:100D3000704700BF5C230020014B1868704700BF5C +:100D40000010005C194B01380322084470B51D687F +:100D5000174BC5F30B042D0C1E88A6420BD15C6803 +:100D60000A46013C824213460FD214F9016F4EB17C +:100D700002F8016BF6E7013A03F10803ECD1814276 +:100D80000B4602D22C2203F8012B0424094A1688B0 +:100D9000AE4204D1984284BF967803F8016B013CBF +:100DA00002F10402F3D1581A70BD00BF0010005CBC +:100DB000182200208C300008022803D1024B4FF08B +:100DC00080629A61704700BF000C0258022803D16C +:100DD000024B4FF480629A61704700BF000C0258CA +:100DE000022804D1024A536983F480635361704737 +:100DF000000C0258002310B5934203D0CC5CC454BD +:100E00000133F9E710BD000002440346934202D0CB +:100E100003F8011BFAE770472DE9F8431F4D14460C +:100E20000746884695F8242052BBDFF870909CB3A3 +:100E300095F824302BB92022FF2148462F62FFF776 +:100E4000E3FF95F824004146C0F1080205EB80005D +:100E5000A24228BF2246D6B29200FFF7CBFF95F8F8 +:100E60002430A41B17441E449044E4B2F6B2082E6A +:100E700085F82460DBD1FFF74FFF0028D7D108E0C9 +:100E80002B6A03EB82038342CFD0FFF745FF002894 +:100E9000CBD10020BDE8F8830120FBE75C230020D4 +:100EA000024B1A78024B1A70704700BF9C23002037 +:100EB00010220020034B04490B60044B186800F01B +:100EC000C7BD00BF80841E008423002014220020A0 +:100ED000094B1822002110B504461846FFF794FF6D +:100EE000064A074B01461278046053F82200BDE819 +:100EF000104000F0ADBD00BF842300209C230020E3 +:100F000014220020F8B571B6002301201A461946B4 +:100F100000F04EFA0446802001F0EEF9002849D096 +:100F20000025254A80274FF4D06C3D26136913F025 +:100F3000C06F26D1D2F8103113F0C06F21D12368D1 +:100F400005F1006199602368D86023685F602368B9 +:100F5000C3F800C021680B6843F001030B602168EF +:100F60000B6823F01E030B6021680B68DB07FCD4C1 +:100F7000237B8035616806FA03F3B5F5001F0B602B +:100F8000D4D1204600F04AFAB5F5001F11D0002454 +:100F90000A4E0B4D012001F011F93388A34205D907 +:100FA00028682044013401F04FF8F6E7002001F0F2 +:100FB00005F961B6F8BD00BF002000529E23002055 +:100FC0005823002030B50A44084D91420DD011F845 +:100FD000013B5840082340F30004013B2C4013F030 +:100FE000FF0384EA5000F6D1EFE730BD2083B8ED6F +:100FF00008B5074B074A196801F03D01996053682D +:101000000BB190689847BDE8084001F07FBA00BF77 +:1010100000000240A023002008B5084B1968890988 +:1010200001F03D018A019A60054AD3680BB110694D +:101030009847BDE8084001F069BA00BF00000240CF +:10104000A023002008B5084B1968090C01F03D01E8 +:101050000A049A60054A53690BB190699847BDE844 +:10106000084001F053BA00BF00000240A023002056 +:1010700008B5084B1968890D01F03D018A059A6091 +:10108000054AD3690BB1106A9847BDE8084001F0E2 +:101090003DBA00BF00000240A023002008B5074B66 +:1010A000074A596801F03D01D960536A0BB1906A53 +:1010B0009847BDE8084001F029BA00BF000002408F +:1010C000A023002008B5084B5968890901F03D01AB +:1010D0008A01DA60054AD36A0BB1106B9847BDE804 +:1010E000084001F013BA00BF00000240A023002016 +:1010F00008B5084B5968090C01F03D010A04DA6093 +:10110000054A536B0BB1906B9847BDE8084001F05E +:10111000FDB900BF00000240A023002008B5084B25 +:101120005968890D01F03D018A05DA60054AD36BE3 +:101130000BB1106C9847BDE8084001F0E7B900BF5B +:1011400000000240A023002008B5074B074A196899 +:1011500001F03D019960536C0BB1906C9847BDE86C +:10116000084001F0D3B900BF00040240A0230020D2 +:1011700008B5084B1968890901F03D018A019A6098 +:10118000054AD36C0BB1106D9847BDE8084001F0DB +:10119000BDB900BF00040240A023002008B5084BE1 +:1011A0001968090C01F03D010A049A60054A536D63 +:1011B0000BB1906D9847BDE8084001F0A7B900BF9A +:1011C00000040240A023002008B5084B1968890DCF +:1011D00001F03D018A059A60054AD36D0BB1106E8E +:1011E0009847BDE8084001F091B900BF00040240F3 +:1011F000A023002008B5074B074A596801F03D01BC +:10120000D960536E0BB1906E9847BDE8084001F06D +:101210007DB900BF00040240A023002008B5084BA0 +:101220005968890901F03D018A01DA60054AD36EE7 +:101230000BB1106F9847BDE8084001F067B900BFD7 +:1012400000040240A023002008B5084B5968090C8F +:1012500001F03D010A04DA60054A536F0BB1906F4B +:101260009847BDE8084001F051B900BF00040240B2 +:10127000A023002008B5084B5968890D01F03D01F5 +:101280008A05DA60054AD36F13B1D2F88000984717 +:10129000BDE8084001F03AB900040240A023002054 +:1012A00000230C4910B51A460B4C0B6054F8230070 +:1012B000026001EB430004334260402BF6D1074A41 +:1012C0004FF0FF339360D360C2F80834C2F80C3497 +:1012D00010BD00BFA02300209C3000080000024089 +:1012E0000F28F8B510D9102810D0112811D01228C5 +:1012F00008D10F240720DFF8B4E00126DEF8005003 +:10130000A04208D9002649E00446F4E70F24002053 +:10131000F1E70724FBE706FA00F73D4240D1214CF4 +:101320004FEA001C3D4304EB00160EEBC000CEF864 +:101330000050C0E90123FBB24BB11B48836B43F063 +:1013400001038363036E43F001030366036E17F426 +:101350007F4F09D01448836B43F002038363036E0D +:1013600043F002030366036E54F80C00036823F095 +:101370001F030360056815F00105FBD104EB0C03A6 +:101380003D2493F80CC05F6804FA0CF43C602124FF +:101390000560446112B1987B00F08EF93046F8BDCB +:1013A0000130ADE79C30000800450258A023002022 +:1013B00010B5302484F31188FFF792FF002383F3E4 +:1013C000118810BD10B50446807B00F08BF9012315 +:1013D0001049627B03FA02F20B6823EA0203DAB2D5 +:1013E0000B604AB90C4A916B21F001019163116EB7 +:1013F00021F001011166126E13F47F4F09D1064BE3 +:101400009A6B22F002029A631A6E22F002021A66A6 +:101410001B6E10BDA02300200045025808B53023E4 +:1014200083F31188FFF7CEFF002383F3118808BDF3 +:10143000026843681143016003B118477047000018 +:10144000024A136843F0C0031360704700780040FD +:10145000024A136843F0C00313607047007C0040E9 +:1014600037B51A4C1A4D204600F0E6FA04F1140084 +:10147000009400234FF40072164900F0A3F94FF4D2 +:101480000072154904F138000094144B00F01CFA66 +:10149000134BC4E91735134C204600F0CDFA04F184 +:1014A000140000234FF400720F49009400F08AF9F1 +:1014B0000E4B4FF400720E4904F13800009400F016 +:1014C00003FA0C4BC4E9173503B030BD24240020C7 +:1014D00000E1F505FC240020FC2800204114000850 +:1014E0000078004090240020FC26002051140008C1 +:1014F000FC2A0020007C0040037C30B5274C0029EA +:1015000018BF0C46012B0CD1254B984236D1254BE8 +:101510009A6C42F080429A641A6F42F080421A67D5 +:101520001B6F2268036EC16D03EB52038466B3FB2D +:10153000F2F36268150442BF23F0070503F00703C6 +:1015400043EA4503CB60A36843F040034B60E36884 +:1015500043F001038B6042F4967343F001030B6088 +:101560004FF0FF330B62510505D512F0102211D058 +:10157000B2F1805F10D080F8643030BD0A4B9842E1 +:10158000CFD1084B9A6C42F000429A641A6F42F035 +:101590000042C4E77F23EEE73F23ECE79C310008DD +:1015A0002424002000450258902400202DE9F04713 +:1015B000C66D05463768F469210734621AD014F005 +:1015C000080118BF4FF48071E20748BF41F02001C5 +:1015D000A3074FF0300348BF41F04001600748BF08 +:1015E00041F0800183F31188281DFFF721FF0023BC +:1015F00083F31188E2050AD5302383F311884FF471 +:101600008061281DFFF714FF002383F311884FF03A +:1016100030094FF0000A14F0200838D13B0616D5E7 +:101620004FF0300905F1380A200610D589F31188EA +:10163000504600F07DF9002836DA0821281DFFF712 +:10164000F7FE27F080033360002383F311887906C7 +:1016500014D5620612D5302383F31188D5E91323FC +:101660009A4208D12B6C33B127F040071021281D76 +:10167000FFF7DEFE3760002383F31188E30618D5F9 +:10168000AA6E1369ABB15069BDE8F047184789F3FA +:101690001188736A284695F86410194000F0E6F93D +:1016A0008AF31188F469B6E7B06288F31188F469A7 +:1016B000BAE7BDE8F0870000090100F160430122AC +:1016C00003F56143C9B283F8001300F01F039A4089 +:1016D00043099B0003F1604303F56143C3F8802194 +:1016E0001A60704700F01F0301229A40430900F17D +:1016F00060409B0000F5614003F1604303F56143E6 +:10170000C3F88020C3F88021002380F8003370479D +:10171000F8B51546826804460B46AA4200D2856891 +:10172000A1692669761AB5420BD218462A46FFF7F8 +:1017300061FBA3692B44A3612846A3685B1BA360DC +:10174000F8BD0CD9AF1B18463246FFF753FB3A469B +:10175000E1683044FFF74EFBE3683B44EBE7184693 +:101760002A46FFF747FBE368E5E7000083689342FA +:10177000F7B50446154600D28568D4E90460361AE8 +:10178000B5420BD22A46FFF735FB63692B446361F0 +:101790002846A3685B1BA36003B0F0BD0DD9324699 +:1017A000AF1B0191FFF726FB01993A46E0683144EF +:1017B000FFF720FBE3683B44E9E72A46FFF71AFB03 +:1017C000E368E4E710B50A440024C361029B846027 +:1017D000C16002610362C0E90000C0E9051110BDEB +:1017E00008B5D0E90532934201D1826882B9826896 +:1017F000013282605A1C426119700021D0E9043222 +:101800009A4224BFC368436100F066FA002008BD15 +:101810004FF0FF30FBE7000070B5302304460E4662 +:1018200083F31188A568A5B1A368A269013BA360F1 +:10183000531CA36115782269934224BFE368A36116 +:10184000E3690BB120469847002383F311882846AB +:1018500007E03146204600F02FFA0028E2DA85F34F +:10186000118870BD2DE9F74F04460E46174698467D +:10187000D0F81C904FF0300A8AF311884FF0000B1B +:10188000154665B12A4631462046FFF741FF03461B +:1018900060B94146204600F00FFA0028F1D000233D +:1018A00083F31188781B03B0BDE8F08FB9F1000F06 +:1018B00003D001902046C847019B8BF31188ED1A95 +:1018C0001E448AF31188DCE7C160C361009B82601B +:1018D0000362C0E905111144C0E9000001617047CD +:1018E000F8B504460D461646302383F31188A768E1 +:1018F000A7B1A368013BA36063695A1C62611D70B4 +:10190000D4E904329A4224BFE3686361E3690BB10E +:1019100020469847002080F3118807E03146204692 +:1019200000F0CAF90028E2DA87F31188F8BD000058 +:10193000D0E9052310B59A4201D182687AB982684C +:101940000021013282605A1C82611C7803699A422C +:1019500024BFC368836100F0BFF9204610BD4FF07B +:10196000FF30FBE72DE9F74F04460E461746984631 +:10197000D0F81C904FF0300A8AF311884FF0000B1A +:10198000154665B12A4631462046FFF7EFFE03466D +:1019900060B94146204600F08FF90028F1D00023BD +:1019A00083F31188781B03B0BDE8F08FB9F1000F05 +:1019B00003D001902046C847019B8BF31188ED1A94 +:1019C0001E448AF31188DCE7026843681143016012 +:1019D00003B11847704700001430FFF743BF000001 +:1019E0004FF0FF331430FFF73DBF00003830FFF7F2 +:1019F000B9BF00004FF0FF333830FFF7B3BF00002E +:101A00001430FFF709BF00004FF0FF311430FFF72B +:101A100003BF00003830FFF763BF00004FF0FF3214 +:101A20003830FFF75DBF0000012914BF6FF01300CD +:101A300000207047FFF714BD044B03600023436090 +:101A4000C0E9023301230374704700BFB4310008BA +:101A500010B53023044683F31188FFF74DFD0223B0 +:101A60000020237480F3118810BD000038B5C369CD +:101A700004460D461BB904210844FFF7A5FF29467B +:101A800004F11400FFF7ACFE002806DA201D4FF425 +:101A90000061BDE83840FFF797BF38BD002382687A +:101AA000037503691B6899689142FBD25A68036009 +:101AB00042601060586070470023826803750369B4 +:101AC0001B6899689142FBD85A68036042601060B5 +:101AD0005860704708B50846302383F311880A7DA3 +:101AE0000023052A06D8DFE802F00B050503120ED5 +:101AF000826913604FF0FF338361FFF7CFFF00234C +:101B000083F3118808BD8269936801339360D0E93B +:101B1000003213605A60EDE7FFF7C0BF054BD9688C +:101B200008751868026853601A600122D86002754F +:101B3000FEF768BC002D00200C4B30B5DD684B1C57 +:101B400087B004460FD02B46094A684600F056F984 +:101B50002046FFF7E3FF009B13B1684600F058F9F9 +:101B6000A86907B030BDFFF7D9FFF9E7002D0020C5 +:101B7000D51A000838B50C4D04468161EB688168C0 +:101B80009A68914203D8BDE83840FFF787BF1846EE +:101B9000FFF792FF01230146EC6020462375BDE864 +:101BA0003840FEF72FBC00BF002D0020044B1A6800 +:101BB000DB6890689B68984294BF002001207047C2 +:101BC000002D0020084B10B51C68D86822685360AF +:101BD0001A600122DC602275FFF76EFF0146204685 +:101BE000BDE81040FEF70EBC002D002038B50123E3 +:101BF000084C00252370656000F05CFD00F082FD5C +:101C00000549064800F014FE0223237085F311886D +:101C100038BD00BF682F0020E0310008002D0020F3 +:101C200000F02CB98B600223086108468B82704754 +:101C30008368A3F1840243F8142C026943F8442C0E +:101C4000426943F8402C094A43F8242CC268A3F1A6 +:101C5000200043F8182C022203F80C2C002203F871 +:101C60000B2C034A43F8102C704700BF1D040008DA +:101C7000002D002008B5FFF7DBFFBDE80840FFF7A7 +:101C80004BBF0000024BDB6898610F20FFF746BF97 +:101C9000002D0020302383F31188FFF7F3BF0000ED +:101CA00008B50146302383F311880820FFF744FF6D +:101CB000002383F3118808BD064BDB6839B1426805 +:101CC00018605A60136043600420FFF735BF4FF07F +:101CD000FF307047002D00200368984206D01A6834 +:101CE0000260506018469961FFF716BF7047000008 +:101CF000036810B59C68A2420CD85C688A600B60CF +:101D00004C602160596099688A1A9A604FF0FF33DD +:101D1000836010BD121B1B68ECE700000A2938BF66 +:101D20000A2170B504460D460A26601900F0BCFC75 +:101D300000F0A4FC041BA54203D8751C04462E46E3 +:101D4000F3E70A2E04D90120BDE8704000F0B0BDD1 +:101D500070BD0000F8B5144B0D460A2A4FF00A0773 +:101D6000D96103F11001826038BF0A22416019690C +:101D70001446016048601861A81800F085FC00F066 +:101D80007DFC431B0646A34206D37C1C281927462C +:101D9000354600F089FCF2E70A2F04D90120BDE89E +:101DA000F84000F085BDF8BD002D0020F8B50646CE +:101DB0000D4600F063FC0F4A134653F8107F9F4214 +:101DC00006D12A4601463046BDE8F840FFF7C2BFBB +:101DD000D169BB68441A2C1928BF2C46A34202D9EA +:101DE0002946FFF79BFF224631460348BDE8F840ED +:101DF000FFF77EBF002D0020102D0020C0E9032337 +:101E0000002310B45DF8044B4361FFF7CFBF00001F +:101E100010B5194C236998420DD08168D0E9003281 +:101E200013605A609A680A449A60002303604FF076 +:101E3000FF33A36110BD0268234643F8102F53609F +:101E40000022026022699A4203D1BDE8104000F0EE +:101E500025BC936881680B44936000F00FFC2269F5 +:101E6000E1699268441AA242E4D91144BDE81040E5 +:101E7000091AFFF753BF00BF002D00202DE9F047DE +:101E8000DFF8BC8008F110072C4ED8F8105000F095 +:101E9000F5FBD8F81C40AA68031B9A423ED81444AC +:101EA0004FF00009D5E90032C8F81C4013605A60B1 +:101EB000C5F80090D8F81030B34201D100F0EEFB25 +:101EC00089F31188D5E9033128469847302383F3F5 +:101ED00011886B69002BD8D000F0D0FB6A69A0EBA9 +:101EE000040982464A450DD2022000F0E1FC00229E +:101EF000D8F81030B34208D151462846BDE8F04723 +:101F0000FFF728BF121A2244F2E712EB090929460B +:101F1000384638BF4A46FFF7EBFEB5E7D8F8103031 +:101F2000B34208D01444C8F81C00211AA960BDE8C7 +:101F3000F047FFF7F3BEBDE8F08700BF102D00208B +:101F4000002D002000207047FEE7000070470000D1 +:101F50004FF0FF3070470000BFF34F8F044B1A69FA +:101F60005107FCD1D3F810215207F8D1704700BFB8 +:101F70000020005208B50D4B1B78ABB9FFF7ECFF02 +:101F80000B4BDA68D10704D50A4A5A6002F188324D +:101F90005A60D3F80C21D20706D5064AC3F80421AB +:101FA00002F18832C3F8042108BD00BF702F002061 +:101FB000002000522301674508B5114B1B78F3B987 +:101FC000104B1A69510703D5DA6842F04002DA6013 +:101FD000D3F81021520705D5D3F80C2142F0400266 +:101FE000C3F80C21FFF7B8FF064BDA6842F0010294 +:101FF000DA60D3F80C2142F00102C3F80C2108BDCD +:10200000702F0020002000520F289ABF00F580603A +:1020100040040020704700004FF40030704700007B +:10202000102070470F2808B50BD8FFF7EDFF00F51B +:1020300000330268013204D104308342F9D1012017 +:1020400008BD0020FCE700000F2838B505463FD842 +:10205000FFF782FF1F4CFFF78DFF4FF0FF3307287C +:102060006361C4F814311DD82361FFF775FF0302C3 +:1020700043F02403E360E36843F08003E3602369F3 +:102080005A07FCD42846FFF767FFFFF7BDFF4FF460 +:10209000003100F0B3F92846FFF78EFFBDE8384065 +:1020A000FFF7C0BFC4F81031FFF756FFA0F10803D7 +:1020B0001B0243F02403C4F80C31D4F80C3143F074 +:1020C0008003C4F80C31D4F810315B07FBD4D9E796 +:1020D000002038BD002000522DE9F84F05460C467F +:1020E000104645EA0203DE0602D00020BDE8F88F64 +:1020F00020F01F00DFF8BCB0DFF8BCA0FFF73AFF0C +:1021000004EB0008444503D10120FFF755FFEDE73C +:1021100020222946204600F093FF10B920352034B4 +:10212000F0E72B4605F120021F68791CDDD104334E +:102130009A42F9D105F178431B481C4EB3F5801F34 +:102140001B4B38BF184603F1F80332BFD946D146BE +:102150001E46FFF701FF0760A5EB040C336804F18E +:102160001C0143F002033360231FD9F8007017F0FD +:102170000507FAD153F8042F8B424CF80320F4D111 +:10218000BFF34F8FFFF7E8FE4FF0FF3320222146C9 +:1021900003602846336823F00203336000F050FFE9 +:1021A0000028BBD03846B0E7142100520C20005262 +:1021B00014200052102000521021005210B5084C7B +:1021C000237828B11BB9FFF7D5FE0123237010BD7A +:1021D000002BFCD02070BDE81040FFF7EDBE00BF23 +:1021E000702F00202DE9F04F0D4685B0814658B183 +:1021F00011F00D0614BF2022082211F008030193EC +:1022000004D0431E03426AD0002435E0002E37D0AC +:1022100009F11F0121F01F094FF00108324F05F0AD +:102220000403DFF8D0A005EA080BBBF1000F32D0A1 +:102230007869C0072FD408F101080C37B8F1060FF0 +:10224000F3D19EB9294D4946A819019200F07CFAB4 +:10225000044600283AD11836019A782EF3D149461F +:1022600000F072FA0446002830D1019A494620480D +:1022700000F06AFA044668BB204605B0BDE8F08F5E +:102280000029C9D101462846029200F05DFA0446B1 +:10229000E0B9029AC0E713B178694107CBD5AC0722 +:1022A00002D578698007C6D5019911B1786901070F +:1022B000C1D51820494600FB08A0CDE9022300F053 +:1022C00043FA0446DDE902230028B4D04A4600213F +:1022D000204601E04A460021FEF796FDCCE7024683 +:1022E000002E95D198E700BFEC310008A42F002004 +:1022F000742F00208C2F00200121FFF773BF0000F6 +:10230000F8B5144D01241827134E40F2FF32002176 +:102310000120FEF779FD07FB046001342A6955F8B6 +:102320000C1F00F0FDF9062CF5D137254FF4C054F1 +:102330002046FFF7E1FF014628B122460748BDE8E5 +:10234000F84000F0EDB9C4EBC404013D4FEAD404F9 +:10235000EED1F8BDEC3100088C2F0020742F002046 +:102360000244074BD2B210B5904200D110BD441CBC +:1023700000B253F8200041F8040BE0B2F4E700BFCC +:10238000504000580E4B30B51C6F240405D41C6F10 +:102390001C671C6F44F400441C670A4C0244236809 +:1023A000D2B243F480732360074B904200D130BD1A +:1023B000441C51F8045B00B243F82050E0B2F4E74B +:1023C00000440258004802585040005807B5012206 +:1023D00001A90020FFF7C4FF019803B05DF804FBDA +:1023E00013B50446FFF7F2FFA04205D0012201A970 +:1023F00000200194FFF7C6FF02B010BD0144BFF3F7 +:102400004F8F064B884204D3BFF34F8FBFF36F8FBC +:102410007047C3F85C022030F4E700BF00ED00E035 +:10242000114BDA6952021ED59A69D00704D50F4ABA +:102430009A6002F144329A600B4BDA69D107FCD4FE +:102440001A6A22F480021A629A6942F002029A61C0 +:10245000DA69D207FCD49A6942F001029A61024A11 +:10246000D369DB07FCD47047002000523B2A1908CF +:10247000034B1A681AB9034AD2F8D0241A6070477D +:102480001C3000200040025808B5FFF7F1FF024B56 +:102490001868C0F3806008BD1C300020EFF309838A +:1024A000054968334A6B22F001024A6383F30988C5 +:1024B000002383F31188704700EF00E0302080F3A1 +:1024C000118862B60D4B0E4AD96821F4E061090407 +:1024D000090C0A430B49DA60D3F8FC2042F0807201 +:1024E000C3F8FC20084AC2F8B01F116841F001018E +:1024F00011602022DA7783F82200704700ED00E0B7 +:102500000003FA0555CEACC5001000E0302310B52D +:1025100083F311880E4B5B6813F4006314D0F1EE63 +:10252000103AEFF309844FF08073683CE361094B84 +:10253000DB6B236684F30988FFF738FB10B1064B89 +:10254000A36110BD054BFBE783F31188F9E700BFDA +:1025500000ED00E000EF00E02F0400083204000866 +:1025600070B5BFF34F8FBFF36F8F1A4A0021C2F8C7 +:102570005012BFF34F8FBFF36F8F536943F4003393 +:102580005361BFF34F8FBFF36F8FC2F88410BFF357 +:102590004F8FD2F8803043F6E074C3F3C900C3F321 +:1025A0004E335B0103EA0406014646EA81750139B0 +:1025B000C2F86052F9D2203B13F1200FF2D1BFF3E1 +:1025C0004F8F536943F480335361BFF34F8FBFF391 +:1025D0006F8F70BD00ED00E0FEE70000214B224848 +:1025E000224A70B5904237D3214BC11EDA1C121A11 +:1025F00022F003028B4238BF00220021FEF704FCC8 +:102600001C4A0023C2F88430BFF34F8FD2F88030C9 +:1026100043F6E074C3F3C900C3F34E335B0103EA2E +:102620000406014646EA81750139C2F86C52F9D2B6 +:10263000203B13F1200FF2D1BFF34F8FBFF36F8F09 +:10264000BFF34F8FBFF36F8F0023C2F85032BFF339 +:102650004F8FBFF36F8F70BD53F8041B40F8041BFE +:10266000C0E700BFA8330008C0300020C030002001 +:10267000C030002000ED00E000F018BA014B586AAD +:10268000704700BF000C0040034B002258631A61E2 +:102690000222DA60704700BF000C0040014B0022AC +:1026A000DA607047000C0040014B5863704700BF70 +:1026B000000C0040024B034A1A60034A5A607047FC +:1026C00020300020C030002000000220074B49428B +:1026D00010B55C68201A08401968821A8A4203D330 +:1026E000A24201D85A6010BD0020FCE72030002033 +:1026F00008B5302383F31188FFF7E8FF002383F345 +:10270000118808BD04480121044B03600023C0E97F +:1027100001330C3000F0D4B828300020F126000836 +:10272000CB1D083A23F00703591A521A012110B49D +:10273000D2080024C0E9004384600C301C605A6059 +:102740005DF8044B00F0BCB82DE9F84F364ECD1DB6 +:102750000F46002818BF0646082A4FEAD50538BF9D +:10276000082206F10C08341D9146404600F0C4F8DA +:1027700009F10701C9F1000E224624686CB94046F0 +:1027800000F0C4F83368CBB308224946E800984704 +:10279000044698B340E9026730E004EB010CD4F83A +:1027A00004A00CEA0E0C0AF10100ACF1080304EBE2 +:1027B000C0009842E0D9A0EB0C0CB5EBEC0F4FEA4F +:1027C000EC0BD9D89C421CD204F10802AB45A3EB18 +:1027D00002024FEAE202626009D9691CED432068F7 +:1027E00003EBC1025D44556043F8310022601C4692 +:1027F0005F60404644F8086B00F088F82046BDE86A +:10280000F88FAA45216802D111602346EFE7013510 +:1028100004EBC50344F8351003F10801401AC01059 +:1028200058601360F1E700BF28300020FEE7000089 +:1028300070B51B4B0025044686B058600E46856275 +:102840000163FFF73BFE04F11003A560E562C4E9F4 +:1028500004334FF0FF33C4E90044C4E90635FFF701 +:102860000DFF2B46024604F134012046C4E908233B +:1028700080230C4A2565FFF7D5F901230A4AE06059 +:1028800000920375684672680192B268CDE902232E +:10289000064BCDE90435FFF7EDF906B070BD00BF7A +:1028A000682F002034320008393200082D28000833 +:1028B000024AD36A1843D062704700BF002D00203F +:1028C000C0E90000816070478368013B002B10B5B0 +:1028D00083600CDA074BDC684368A06120606360AA +:1028E0001C6044600520FFF719F9A06910BD0020A5 +:1028F000FCE700BF002D002008B5302383F31188CA +:10290000FFF7E2FF002383F3118808BD08B53023E9 +:1029100083F3118883680133002B836007DC03682D +:1029200000211A68026050601846FFF723F900235F +:1029300083F3118808BD00004B6843608B68836097 +:10294000CB68C3600B6943614B6903628B69436267 +:102950000B6803607047000008B53C4B40F2FF7104 +:102960003B48D3F888200A43C3F88820D3F888204E +:1029700022F4FF6222F00702C3F88820D3F88830DF +:10298000344B1A6C0A431A649A6E0A439A66324AA6 +:102990009B6E1146FFF7D0FF00F5806002F11C012D +:1029A000FFF7CAFF00F5806002F13801FFF7C4FFAE +:1029B00000F5806002F15401FFF7BEFF00F5806072 +:1029C00002F17001FFF7B8FF00F5806002F18C01A1 +:1029D000FFF7B2FF00F5806002F1A801FFF7ACFF3E +:1029E00000F5806002F1C401FFF7A6FF00F58060EA +:1029F00002F1E001FFF7A0FF00F5806002F1FC01A9 +:102A0000FFF79AFF02F58C7100F58060FFF794FFE5 +:102A100000F00EF9114BD3F8902242F00102C3F8F6 +:102A20009022D3F8942242F00102C3F894220522A6 +:102A3000C3F898204FF06052C3F89C20084AC3F8AE +:102A4000A020BDE80840FFF7EBBC00BF00440258DF +:102A500000000258004502584032000800ED00E036 +:102A60001F00080308B500F0CFFAFFF7BFF80C4BC2 +:102A7000DA6B42F04002DA635A6E22F040025A6684 +:102A80005B6E084B1A6842F008021A601A6842F03E +:102A900004021A60FFF7ECFCBDE80840FFF730BC09 +:102AA0000045025800180248704700000E4B9A6C0F +:102AB00042F008029A641A6F42F008021A670B4A41 +:102AC0001B6FD36B43F00803D363C722084B9A6292 +:102AD0004FF0FF32DA6200229A615A63DA605A607C +:102AE00001225A611A607047004502580010005CCC +:102AF000000C0040094A08B51169D3680B40D9B2EF +:102B00009B076FEA0101116107D5302383F3118818 +:102B1000FFF786F8002383F3118808BD000C0040FE +:102B2000044BDA6B0243DA635A6E104358665B6EED +:102B3000704700BF0045025808B53C4B4FF0FF31CD +:102B4000D3F8802062F00042C3F88020D3F88020C0 +:102B500002F00042C3F88020D3F88020D3F884200C +:102B6000C3F88410D3F884200022C3F88420D3F85B +:102B70008400D86F40F0FF4040F4FF0040F4DF4095 +:102B800040F07F00D867D86F20F0FF4020F4FF00AE +:102B900020F4DF4020F07F00D867D86FD3F888009A +:102BA0006FEA40506FEA5050C3F88800D3F88800AD +:102BB000C0F30A00C3F88800D3F88800D3F8900067 +:102BC000C3F89010D3F89000C3F89020D3F8900089 +:102BD000D3F89400C3F89410D3F89400C3F8942069 +:102BE000D3F89400D3F89800C3F89810D3F898005D +:102BF000C3F89820D3F89800D3F88C00C3F88C1051 +:102C0000D3F88C00C3F88C20D3F88C00D3F89C0048 +:102C1000C3F89C10D3F89C10C3F89C20D3F89C30C8 +:102C2000FEF73EFBBDE8084000F0BEB90044025884 +:102C300008B50122504BC3F80821504B5A6D42F0A1 +:102C400002025A65DA6F42F00202DA670422DB6F91 +:102C50004B4BDA605A689104FCD54A4A1A6001224B +:102C60009A60494ADA6000221A614FF440429A6140 +:102C7000434B9A699204FCD51A6842F480721A6038 +:102C8000424B1A6F12F4407F04D04FF480321A671F +:102C900000221A671A6842F001021A603B4B1A6858 +:102CA0005007FCD500221A611A6912F03802FBD1D4 +:102CB000012119604FF0804159605A67344ADA6245 +:102CC000344A1A611A6842F480321A602F4B1A682B +:102CD0009103FCD51A6842F480521A601A68920473 +:102CE000FCD52D4A2D499A6200225A63196301F5D9 +:102CF0007C01DA6301F5E77199635A64284A1A6422 +:102D0000284ADA621A6842F0A8521A601F4B1A6801 +:102D100002F02852B2F1285FF9D148229A614FF4AB +:102D20008862DA6140221A621F4ADA641F4A1A6511 +:102D30001F4A5A651F4A9A6532231F4A1360136857 +:102D400003F00F03022BFAD1104A136943F0030377 +:102D50001361136903F03803182BFAD14FF00050B8 +:102D6000FFF7DEFE4FF08040FFF7DAFE4FF0004045 +:102D7000BDE80840FFF7D4BE00800051004502586E +:102D80000048025800C000F004000001004402584E +:102D90000000FF01008890083220600063020901F2 +:102DA000470E0508DD0BBF012000002000000110C8 +:102DB0000910E00000010110002000524FF0B04265 +:102DC00008B5D2F8883003F00103C2F8883023B187 +:102DD000044A13680BB150689847BDE80840FFF7F4 +:102DE00095BB00BF403000204FF0B04208B5D2F88C +:102DF000883003F00203C2F8883023B1044A936894 +:102E00000BB1D0689847BDE80840FFF77FBB00BF13 +:102E1000403000204FF0B04208B5D2F8883003F0BF +:102E20000403C2F8883023B1044A13690BB1506916 +:102E30009847BDE80840FFF769BB00BF403000205D +:102E40004FF0B04208B5D2F8883003F00803C2F85A +:102E5000883023B1044A93690BB1D0699847BDE823 +:102E60000840FFF753BB00BF403000204FF0B04296 +:102E700008B5D2F8883003F01003C2F8883023B1C7 +:102E8000044A136A0BB1506A9847BDE80840FFF73F +:102E90003DBB00BF403000204FF0B04310B5D3F829 +:102EA000884004F47872C3F88820A30604D5124A37 +:102EB000936A0BB1D06A9847600604D50E4A136B2B +:102EC0000BB1506B9847210604D50B4A936B0BB19D +:102ED000D06B9847E20504D5074A136C0BB1506CD0 +:102EE0009847A30504D5044A936C0BB1D06C98475E +:102EF000BDE81040FFF70ABB403000204FF0B04360 +:102F000010B5D3F8884004F47C42C3F888206205E9 +:102F100004D5164A136D0BB1506D9847230504D59F +:102F2000124A936D0BB1D06D9847E00404D50F4A57 +:102F3000136E0BB1506E9847A10404D50B4A936EE3 +:102F40000BB1D06E9847620404D5084A136F0BB1D9 +:102F5000506F9847230404D5044A936F0BB1D06F88 +:102F60009847BDE81040FFF7D1BA00BF40300020BD +:102F700008B50348FEF71AFBBDE80840FFF7C6BADC +:102F80002424002008B50348FEF710FBBDE80840E4 +:102F9000FFF7BCBA9024002008B5FFF7ABFDBDE8F1 +:102FA0000840FFF7B3BA0000062108B50846FEF74F +:102FB00083FB06210720FEF77FFB06210820FEF792 +:102FC0007BFB06210920FEF777FB06210A20FEF78E +:102FD00073FB06211720FEF76FFB06212820FEF762 +:102FE0006BFB09217A20FEF767FB07213220FEF7F1 +:102FF00063FB0C215220FEF75FFB0C215320BDE840 +:103000000840FEF759BB000008B5FFF795FD00F03A +:1030100009F8FEF70FFDFFF747FDBDE80840FFF791 +:103020002BBB00000023054A19460133102BC2E9CF +:10303000001102F10802F8D1704700BF40300020B3 +:1030400010B501390244904201D1002005E0037817 +:1030500011F8014FA34201D0181B10BD0130F2E757 +:1030600053544D333248373F3F3F0053544D333272 +:10307000483733782F3732780053544D333248373E +:1030800034332F3735332F373530000001105A00D5 +:103090000310590001205800032056001000024080 +:1030A000080002400008024000000B002800024017 +:1030B000080002400408024006010C0040000240E3 +:1030C000080002400808024010020D0058000240AB +:1030D000080002400C08024016030E007000024077 +:1030E0000C0002401008024000040F00880002405B +:1030F0000C0002401408024006051000A000024027 +:103100000C0002401808024010061100B8000240EE +:103110000C0002401C08024016072F001004024059 +:103120000804024020080240000838002804024039 +:103130000804024024080240060939004004024005 +:103140000804024028080240100A3A0058040240CD +:10315000080402402C080240160B3B007004024099 +:103160000C04024030080240000C3C00880402407D +:103170000C04024034080240060D4400A004024042 +:103180000C04024038080240100E4500B80402400A +:103190000C0402403C080240160F46000096000056 +:1031A000000000000000000000000000000000001F +:1031B0000000000000000000F5190008E1190008F7 +:1031C0001D1A0008091A0008151A0008011A00083B +:1031D000ED190008D9190008291A00086330000009 +:1031E000DC310008582D0020682F0020000000204E +:1031F0000000020002000000000000300000040097 +:103200000800000000000024000008000400000086 +:103210000004000000FC0000020000000000043078 +:1032200000800000080000000000003800000100DD +:10323000010000006D61696E0069646C650000004A +:103240000000002800000000AAAAAAAA000000248A +:10325000FFFF000000000000000000000000000070 +:1032600000000000AAAAAAAA00000000FFFF0000B8 +:10327000000000000000000000000000000000004E +:10328000AAAAAAAA00000000FFFF00000000000098 +:10329000000000000000100000000000AAAAAAAA76 +:1032A00000000000FFFF0000000000000000000020 +:1032B0000A80020000000000AAAAAAAA0540010094 +:1032C000FFFF000088000070070000000000000001 +:1032D00000000000AAAAAAAA00000000FFFF000048 +:1032E00000000000000000000000000000000000DE +:1032F000AAAAAAAA00000000FFFF00000000000028 +:10330000000000000000000000000000AAAAAAAA15 +:1033100000000000FFFF00000000000000000000AF +:103320000000000000000000AAAAAAAA00000000F5 +:10333000FFFF00000000000000000000000000008F +:1033400000000000AAAAAAAA00000000FFFF0000D7 +:10335000000000000000000000000000000000006D +:10336000AAAAAAAA00000000FFFF000000000000B7 +:1033700000000000000000002E040000000000001B +:1033800000001A0000000000FF00000024240020BC +:103390000000000060300008830400006B3000086B +:0833A000500400007930000820 :00000001FF diff --git a/Tools/bootloaders/CubeSolo_bl.bin b/Tools/bootloaders/CubeSolo_bl.bin index 0c2e9ac65c..b4ec2d94a1 100755 Binary files a/Tools/bootloaders/CubeSolo_bl.bin and b/Tools/bootloaders/CubeSolo_bl.bin differ diff --git a/Tools/bootloaders/CubeSolo_bl.hex b/Tools/bootloaders/CubeSolo_bl.hex index bde42dfb8f..e096a9af73 100644 --- a/Tools/bootloaders/CubeSolo_bl.hex +++ b/Tools/bootloaders/CubeSolo_bl.hex @@ -1,1019 +1,1009 @@ :020000040800F2 -:1000000000040020E10100081D0F0008210F000876 -:10001000750F0008210F0008490F0008E3010008D0 -:10002000E3010008E3010008E301000809280008D3 +:1000000000060020E1010008E3010008E301000808 +:10001000E3010008E3010008E3010008E301000830 +:10002000E3010008E3010008E3010008F9350008D6 :10003000E3010008E3010008E3010008E301000810 :10004000E3010008E3010008E3010008E301000800 -:10005000E3010008E3010008713900089D39000838 -:10006000C9390008F5390008213A0008E301000801 +:10005000E3010008E3010008A9380008D1380008CE +:10006000F93800082139000849390008E30100087F :10007000E3010008E3010008E3010008E3010008D0 :10008000E3010008E3010008E3010008E3010008C0 -:10009000E3010008E3010008E30100084D3A00080D +:10009000E3010008E3010008E301000871390008EA :1000A000E3010008E3010008E3010008E3010008A0 :1000B000E3010008E3010008E3010008E301000890 :1000C000E3010008E3010008E3010008E301000880 -:1000D000E3010008E30100082511000839110008B8 -:1000E000B53A0008E3010008E3010008E301000855 +:1000D000E3010008E3010008453A0008E3010008D5 +:1000E000D5390008E3010008E3010008E301000836 :1000F000E3010008E3010008E3010008E301000850 -:10010000E3010008E301000881370008E30100086B +:10010000E3010008E3010008593A0008E301000890 :10011000E3010008E3010008E3010008E30100082F :10012000E3010008E3010008E3010008E30100081F :10013000E3010008E3010008E3010008E30100080F -:10014000E3010008E3010008E3010008F52E0008C0 +:10014000E3010008E3010008E3010008A12D000815 :10015000E3010008E3010008E3010008E3010008EF :10016000E3010008E3010008E3010008E3010008DF :10017000E3010008E3010008E3010008E3010008CF -:10018000E3010008E30100084D110008E301000845 +:10018000E3010008E3010008E3010008E3010008BF :10019000E3010008E3010008E3010008E3010008AF :1001A000E3010008E3010008E3010008E30100089F :1001B000E3010008E3010008E3010008E30100088F :1001C000E3010008E3010008E3010008E30100087F :1001D000E3010008E3010008E3010008E30100086F -:1001E00002E000F000F8FEE772B6394880F30888B4 -:1001F000384880F3098838484EF60851CEF200019D -:10020000086040F20000CCF200004EF63471CEF2ED -:1002100000010860BFF34F8FBFF36F8F40F2000003 -:10022000C0F2F0004EF68851CEF200010860BFF334 -:100230004F8FBFF36F8F4FF00000E1EE100A4EF6C4 -:100240003C71CEF200010860062080F31488BFF3F1 -:100250006F8F02F017FB03F029FA4FF055301F495A -:100260001B4A91423CBF41F8040BFAE71C49194A6A -:1002700091423CBF41F8040BFAE71A491A4A1B4B5A -:100280009A423EBF51F8040B42F8040BF8E70020F5 -:100290001749184A91423CBF41F8040BFAE702F0B3 -:1002A000F5FA03F05FFA144C144DAC4203DA54F83B -:1002B000041B8847F9E700F03FF8114C114DAC42A0 -:1002C00003DA54F8041B8847F9E702F0DDBA0000AE -:1002D000000400200024002000000008000000208E -:1002E00000040020603F0008002400202824002093 -:1002F00028240020903D0020E0010008E0010008D3 -:10030000E0010008E00100082DE9F04F2DED108A12 -:10031000C1F80CD0C3689D46BDEC108ABDE8F08FD3 -:10032000002383F311882846A047002001F0ECFE4B -:1003300001F09CFE00DFFEE770B5204C092300258C -:1003400023706FF03F061F236570A570E57025715F -:100350006571A571E57125726672A372E57200F090 -:10036000FFFC20B10F2325726672A372E57202F0C2 -:100370001DFA044602F042FA0546D8B9104B9C42D9 -:100380001AD001339C4218BF054641F2883404BF9D -:1003900001250024002002F013FA0DB100F0B6F898 -:1003A00000F062FD00F01AFC204600F00DF900F0AC -:1003B000ADF8F9E70024EDE70446EBE72824002038 -:1003C000010007B008B500F087FBA0F120035842F8 -:1003D000584108BD07B5054B02211B88ADF8043014 -:1003E00001A800F0E5FB03B05DF804FB9C3B0008AE -:1003F000064991F8243033B100230822086A81F8B5 -:10040000243000F00DBC0120704700BF48240020BC -:100410002DE9F84F234C94F82430054688461746BA -:100420008BBB2E46DFF87C90002F38D094F824A0A8 -:10043000BAF1000F05D12022FF214846266200F0C4 -:1004400001FDCAF10805BD4228BF3D465FFA85FBA4 -:10045000AD0041462A4604EB8A0000F0C9FC94F83E -:100460002430A7EB0B079B445FFA8BFBBBF1080F13 -:100470002E44A844FFB284F824B0D5D1FFF7B8FFCA -:100480000028D1D108E0266A06EB8306B042C9D025 -:10049000FFF7AEFF0028C4D10020BDE8F88F01208F -:1004A000BDE8F88F4824002010B5202383F311887D -:1004B0001248C3680BB101F0ADFE0023104A0F488B -:1004C0004FF47A7101F06AFE002383F311880D4C1A -:1004D000236813B12368013B2360636813B1636829 -:1004E000013B6360084B1B7833B9636823B9022072 -:1004F00000F074FC3223636010BD00BF3424002080 -:10050000A9040008782500207024002010B5254B90 -:10051000254953F8042F013200D110BD8B42F8D188 -:10052000224C234B22689A423AD9224B9B6803F112 -:10053000006303F580439A4232D2002000F068FB4A -:100540001D4B0220187000F03FFC1C4B1A6C00225F -:100550001A64196E1A66196E596C5A64596E5A6685 -:100560005A6E5A6942F080025A615A6922F080023A -:100570005A615A691A6942F000521A611A6922F0E6 -:1005800000521A611B6972B60D4A0E4B13601B684C -:100590002268202181F311889D4683F30888104743 -:1005A00010BD00BFFC3F00081C40000804400008CC -:1005B000FF3F00082824002070240020003802405B -:1005C00008ED00E0004000082DE9F04F99B0B34C71 -:1005D00001902022FF2110A8A66800F033FCB04A49 -:1005E0001378A346A3B9AF480121C360117020233B -:1005F00083F31188C3680BB101F00CFE0023AA4AF3 -:10060000A8484FF47A7101F0C9FD002383F31188E3 -:10061000019B13B1A54B019A1A60A54AA349019FFA -:100620000292002313704B6099461C461D46984663 -:10063000012000F0C9FB002F00F012829B4B1B68C9 -:10064000002B40F00D8219B0BDE8F08F0220FFF7BB -:10065000B9FE002840F0FB81019BB9F1000F08BFF3 -:100660001F46944B1B88ADF82C3002210BA800F0DC -:100670009FFADDE74FF47A7000F02EFA031E039321 -:10068000EADB0220FFF79EFE82460028E4D0039BAF -:10069000581E042800F2DD81DFE800F0030E11147B -:1006A000170018A8052340F8343D042100F080FA13 -:1006B00054464FF0000856E004217848F6E704213C -:1006C0007D48F3E704217D48F0E71C24204600F034 -:1006D000A1FA04340B9004210BA800F069FA2C2C29 -:1006E000F4D1E5E7002DB7D0002CB5D00220FFF7FC -:1006F00069FE0546002800F0AF8101206C4C00F037 -:1007000087FA0220207000F05FFB4FF000095FFACB -:1007100089FA504600F08CFA074658B1504600F06E -:1007200097FA09F101090028F1D12C46A9460027C2 -:10073000634B97E701230220237000F03BFB3E460A -:10074000DBF808309E4206D2304600F063FA0130F2 -:10075000EBD10436F4E7029B00261E70534BA946EA -:100760005E602C46374600F075FB15B1002C18BFB3 -:100770000027FFF72FFE5BE7002D3FF46DAF002C45 -:100780003FF46AAF029B0220187000F01DFB32207C -:1007900000F0A2F9B0F1000AC0F25E811AF0030580 -:1007A00040F05A81DBF8082006EB0A03934200F27E -:1007B0005381BAF5807F00F24F8155450DDA4FF431 -:1007C0007A7000F089F90490049B002BC0F24481F8 -:1007D0003C4A049BAB540135EFE7C820FFF7F2FD1C -:1007E0000546002800F038811F2E11D8C6F12004DC -:1007F000544528BF544610AB26F003002246314929 -:10080000184400F0F5FA2246FF212E4800F01AFBAA -:100810004FEAAA0A5FFA8AF22A493046FFF7F8FD42 -:100820000446002800F01A8106EB8A0605469AE77E -:100830000220FFF7C7FD00283FF40EAFFFF7D8FDF9 -:1008400000283FF409AF4FF0000A5346DBF80820B8 -:1008500092451CD2BAF11F0F12D8109A01320FD054 -:100860002AF0030218A90A4452F8202C0B921846C9 -:1008700004220BA900F092FB0AF1040A0346E5E703 -:100880005046039300F0C6F9039B0B90EFE718A8BE -:10089000042140F84C3D00F08BF964E72824002047 -:1008A0007425002034240020A904000878250020A5 -:1008B000702400209E3B00082C24002030240020BF -:1008C000A03B00087424002018A8002340F8343D01 -:1008D000642100F039F900287FF4BEAE0220FFF752 -:1008E00071FD00283FF4B8AE0B9800F0C3F918ABC7 -:1008F00043F8480D04211846CDE718A8002340F816 -:10090000343D642100F020F900287FF4A5AE0220D8 -:10091000FFF758FD00283FF49FAE0B9800F0B8F9A0 -:1009200018AB43F8440DE5E70220FFF74BFD002824 -:100930003FF492AE00F0B2F918AB43F8400DD9E79E -:100940000220FFF73FFD00283FF486AE0BA91420DC -:1009500000F0AAF9824618A8042140F83CAD00F046 -:1009600027F951460BA896E7322000F0B5F8B0F110 -:10097000000AFFF671AE1AF0030F7FF46DAEDBF8DC -:1009800008200AEB080393423FF666AE0220FFF709 -:1009900019FD00283FF460AE2AF0030AC244D04596 -:1009A0003FF4E1AE404600F035F904210A900AA870 -:1009B00000F0FEF808F10408F1E74FF47A70FFF751 -:1009C00001FD00283FF448AEFFF712FD00283FF478 -:1009D000AFAE109B01330CD0082210A90020FFF706 -:1009E00017FD00283FF4A4AE2022FF2110A800F03C -:1009F00029FAFFF7EFFC374801F08CFB23E6002DC6 -:100A00003FF42AAE002C3FF427AE18A8002340F88C -:100A1000343D642100F098F8824600287FF41CAE33 -:100A20000220FFF7CFFC00283FF416AE0390FFF73B -:100A3000D1FC41F2883001F06DFB0B9800F04EFACA -:100A400000F008FA039B57461C461D46F0E5054694 -:100A500089E64FF00008FFE52546FDE52C4667E6F0 -:100A6000002000F039F80490049B002BFFF6E3AD62 -:100A7000012000F09FF9049B213B122B3FF6D8ADDB -:100A800001A252F823F000BF4D06000875060008C9 -:100A9000E5060008310600083106000831060008A6 -:100AA000790700086909000831080008C90800082A -:100AB000FB08000829090008310600084109000860 -:100AC00031060008BB090008670700083106000866 -:100AD000FF090008A08601002DE9F34702AE0024BB -:100AE0004FF47A7506F8014D144FDFF858804543EE -:100AF00097F900305A1C5FFA84F901D0A34212D151 -:100B000058F8240003680122D3F820A031462B4670 -:100B1000D047012807D10A4B9DF8070083F80090C1 -:100B200002B0BDE8F0870134042CE1D14FF4FA7033 -:100B300001F0F0FA4FF0FF30F2E700BF0024002090 -:100B400098250020F43B00082DE9F0474FF47A7512 -:100B5000144FDFF8588006464D43002497F90030C3 -:100B60005A1C5FFA84F901D0A34210D158F824002E -:100B700003680422D3F820A031462B46D04704282E -:100B800005D1094B83F800900020BDE8F0870134BF -:100B9000042CE3D14FF4FA7001F0BCFA4FF0FF30AF -:100BA000BDE8F0870024002098250020F43B0008D1 -:100BB00030B4074B1A78074B53F822402368DD699D -:100BC000054B0A46AC460146204630BC604700BF94 -:100BD00098250020F43B0008A086010070B501F0C4 -:100BE000E1FC094C094E20700025306823788342CF -:100BF00008D901F0D1FC336805440133B5F5804FC5 -:100C00003360F2D370BD00BF9925002080250020FD -:100C100001F07EBD00F1006000F580400068704783 -:100C200000F10060920000F5804001F009BD000075 -:100C3000054B1A68054B1B789B1A834202D9104456 -:100C400001F0AABC002070478025002099250020D3 -:100C500038B5074D04462868204401F0A5FC28B9A2 -:100C600028682044BDE8384001F0B6BC38BD00BF5C -:100C70008025002010F0030308D1B0F5007F05D8CF -:100C800000F10050A0F50840006870470020704750 -:100C9000014BC058704700BF107AFF1F014B186806 -:100CA000704700BF002004E070B52A4B1C68C4F3F5 -:100CB0000B03240C63B140F21342934231D040F253 -:100CC000194293422FD040F2214293422DD1032367 -:100CD000214A0C2505FB03235D6893F9082042F2A5 -:100CE00001039C4224D0B4F5805F23D041F201037C -:100CF0009C4221D041F203039C421FD041F20703E2 -:100D00009C4208BF3122441E0C44013D0B46A342C5 -:100D10001ED215F9016F581C96B1034600F8016CFC -:100D2000F5E70123D4E70223D2E73F220B4DD6E7B4 -:100D30003322E3E74122E1E75A22E4E75922E2E7DE -:100D40002C2584421D7001D9981C5A70401A70BD20 -:100D50001846FBE7002004E0C43B0008A43B000861 -:100D6000124B5A8842F201018A4293B214D0B3F571 -:100D7000805F13D041F20102934211D041F203028D -:100D800093420FD041F2070293420DD10423084A47 -:100D900002EB8303D87870470023F8E70123F6E7D6 -:100DA0000223F4E70323F2E700207047002004E069 -:100DB000B03B0008022802BF024B4FF480529A61F8 -:100DC000704700BF00100240022802BF024B4FF0E4 -:100DD00080529A61704700BF00100240022801BF94 -:100DE000024A536983F480535361704700100240F4 -:100DF00010B50023934203D0CC5CC4540133F9E70F -:100E000010BD000030B5441E14F9010F0B4660B14F -:100E100093F90050854201F1010106D11AB993F905 -:100E20000020801A30BD013AEEE7002AF7D11046C3 -:100E300030BD000002460346981A13F9011B002931 -:100E4000FAD1704702440346934202D003F8011BD3 -:100E5000FAE77047024B1A78024B1A70704700BFCE -:100E60009825002000240020F8B5164C1648174D90 -:100E7000174E154F00F096FC2146134800F0BEFCBB -:100E800024681448626D936B23F40023936301F08C -:100E900041F92046104900F0BDFD626D936B43F4AB -:100EA000002393634FF4E1332B60002456F82400B1 -:100EB000B84202D0294600F0D3FB0134042CF5D10E -:100EC000F8BD00BFDC3C00089433002084250020DE -:100ED000F43B000840420F00083D000838B50B4BBA -:100EE0001A780B4B53F822400A4B9C4205460CD013 -:100EF000094B002118461422FFF7A4FF05600146A4 -:100F00002046BDE8384000F0ABBB38BD9825002036 -:100F1000F43B00089433002084250020FEE7000005 -:100F200000B59BB0EFF3098168226846FFF760FFC8 -:100F3000EFF30583034B9A6B9A6A9A6A9A6A9A6AE4 -:100F40009B6AFEE700ED00E000B59BB0EFF309817E -:100F500068226846FFF74CFFEFF30583044B9A6B5A -:100F60009A6A9A6A9A6A9A6A9A6A9B6AFEE700BFC4 -:100F700000ED00E000B59BB0EFF309816822684600 -:100F8000FFF736FFEFF30583034B5A6B9A6A9A6AB1 -:100F90009A6A9A6A9B6AFEE700ED00E030B5084D58 -:100FA0000A4491420BD011F8013B09245840013CFE -:100FB000F7D040F300032B4083EA5000F7E730BD41 -:100FC0002083B8ED002304491A465A50C818083344 -:100FD000802B4260F9D170479C250020026843684D -:100FE0001143016003B1184770470000024AD368FB -:100FF00043F0C003D360704700440040024AD36806 -:1010000043F0C003D360704700480040024AD368F1 -:1010100043F0C003D3607047007800402DE9F041F1 -:10102000D0F85C64F7683368DA0505469CB20DD5E4 -:10103000202383F311884FF400710430FFF7CEFFB3 -:101040006FF480733360002383F31188202383F3CC -:10105000118805F1040814F02F0333D183F31188AC -:10106000380615D5210613D5202383F3118805F101 -:10107000380000F053FA002846DA0821281DFFF74F -:10108000ADFF4FF67F733B40F360002383F311887D -:101090007A060ED563060CD5202383F31188EA6CFB -:1010A0002B6D9A4202D12B6C002B2FD1002383F39E -:1010B0001188D5F86424D368002B31D01069BDE8BD -:1010C000F0411847230713D014F0080F0CBF00217C -:1010D0008021E00748BF41F02001A20748BF41F04E -:1010E0004001630748BF41F480714046FFF776FF37 -:1010F000A406736805D595F860142846194000F0D9 -:10110000BDFA3468A4B2A6E77060BEE727F04007D6 -:101110003F041021281D3F0CFFF760FFF760C5E773 -:10112000BDE8F08108B50348FFF778FFBDE8084047 -:1011300001F07ABB1C26002008B50348FFF76EFFBC -:10114000BDE8084001F070BB842A002008B50348C0 -:10115000FFF764FFBDE8084001F066BBEC2E0020FD -:1011600010B50E4C0E4A2046002100F057FA0D4BE8 -:10117000C4F85C340C4C0D4A2046002100F04EFAB5 -:101180000B4BC4F85C340B4C0B4A0021204600F09A -:1011900045FA0A4BC4F85C3410BD00BF1C26002081 -:1011A000ED0F000800440040842A0020FD0F0008D5 -:1011B00000480040EC2E00200D1000080078004090 -:1011C00038B5394D037C002918BF0D46012B044664 -:1011D000C0F8645410D1354B984242D1344B1A6C4C -:1011E00042F400321A641A6E42F400321A661B6E20 -:1011F0000B21262000F06AF82E4BD4F85C249A428A -:101200002B6802D02C498A424BD12C4901EB530167 -:10121000B1FBF3F3A988080442BF23F0070003F0F1 -:10122000070343EA40039360EB8843F040039BB21B -:1012300013612B8943F001039BB2536141F40453C2 -:1012400043F02C03D36001F4A05100231360B1F5E7 -:10125000806F136853680CBF7F23FF2384F86034CA -:1012600038BD174B98420CD1114B1A6C42F48022B6 -:101270001A641A6E42F480221A661B6E0B21272014 -:10128000B8E7104B9842B7D1094B1A6C42F0804234 -:101290001A641A6E42F080421A661B6E0B215220AD -:1012A000A8E70949B2E700BF243C00081C2600203B -:1012B00000380240001001400014014000BD01054B -:1012C000842A0020EC2E002080DE800200F16043A2 -:1012D00000F01F02400903F5614309018000C9B213 -:1012E00000F1604083F8001300F561400123934052 -:1012F000C0F8803103607047F8B51546826806690A -:10130000AA420B46816938BF8568761AB542044601 -:1013100007D218462A46FFF76BFDA3692B44A36149 -:101320000DE011D932461846FFF762FDAF1B3A4671 -:10133000E1683044FFF75CFDE2683A44A261A368CB -:101340005B1BA3602846F8BD18462A46FFF750FDF0 -:10135000E368E4E783682DE9F041044693421546CB -:10136000266938BF85684069361AB5420F4606D2ED -:101370002A46FFF73DFD63692B4463610DE012D9F6 -:101380003246A5EB0608FFF733FD4246B919E0687F -:10139000FFF72EFDE26842446261A3685B1BA36015 -:1013A0002846BDE8F0812A46FFF722FDE368E4E71E -:1013B00010B50A440024C361029B00604060846051 -:1013C000C160816141610261036210BD08B582693B -:1013D0004369934201D1826882B982680132826096 -:1013E0005A1C42611970426903699A4201D3C36869 -:1013F0004361002100F0AAFE002008BD4FF0FF303D -:1014000008BD000070B5202304460E4683F3118802 -:10141000A568A5B1A368A269013BA360531CA361A1 -:1014200015782269934224BFE368A361E3690BB195 -:1014300020469847002383F31188284670BD314623 -:10144000204600F073FE0028E2DA85F3118870BDB3 -:101450002DE9F74F05460F4690469A46D0F81C9066 -:10146000202686F311884FF0000B144664B1224603 -:1014700039462846FFF740FF034668B951462846DB -:1014800000F054FE0028F1D0002383F31188A8EB6C -:10149000040003B0BDE8F08FB9F1000F03D0019054 -:1014A0002846C847019B8BF31188E41A1F4486F332 -:1014B0001188DBE7C16081614161C3611144009B18 -:1014C000006040608260016103627047F8B50446C5 -:1014D0000E461746202383F31188A568A5B1A3689B -:1014E000013BA36063695A1C62611E7023696269D3 -:1014F0009A4224BFE3686361E3690BB120469847D1 -:10150000002080F31188F8BD3946204600F00EFE19 -:101510000028E2DA85F31188F8BD0000836942698A -:101520009A4210B501D182687AB98268013282602C -:101530005A1C82611C7803699A4201D3C368836193 -:10154000002100F003FE204610BD4FF0FF3010BD1B -:101550002DE9F74F05460F4690469A46D0F81C9065 -:10156000202686F311884FF0000B144664B1224602 -:1015700039462846FFF7EEFE034668B9514628462D -:1015800000F0D4FD0028F1D0002383F31188A8EBEC -:10159000040003B0BDE8F08FB9F1000F03D0019053 -:1015A0002846C847019B8BF31188E41A1F4486F331 -:1015B0001188DBE7026843681143016003B11847F3 -:1015C000704700001430FFF743BF00004FF0FF33B7 -:1015D0001430FFF73DBF00003830FFF7B9BF0000FF -:1015E0004FF0FF333830FFF7B3BF00001430FFF780 -:1015F00009BF00004FF0FF311430FFF703BF0000B8 -:101600003830FFF763BF00004FF0FF323830FFF78C -:101610005DBF000000207047FFF7A2BD37B50F4B3C -:101620000360002343608360C360012304460374A6 -:10163000154600900B464FF4007200F15C01143027 -:10164000FFF7B6FE00942B464FF4007204F51771B5 -:1016500004F13800FFF72EFF03B030BD383C00081E -:1016600010B52023044683F31188FFF7A9FD022358 -:101670002374002383F3118810BD000038B5C369BB -:1016800004460D461BB904210844FFF793FF294681 -:1016900004F11400FFF79AFE002806DA201D4FF42B -:1016A0008061BDE83840FFF785BF38BD02684368F8 -:1016B0001143016003B118477047000013B5446B34 -:1016C000D4F894341A681178042915D1217C0229A0 -:1016D00012D11979128901238B4013420CD101A92F -:1016E00004F14C0001F056FED4F89444019B21799A -:1016F0000246206800F0DAF902B010BD143001F0A3 -:10170000D9BD00004FF0FF33143001F0D3BD00000D -:101710004C3001F0ABBE00004FF0FF334C3001F015 -:10172000A5BE0000143001F0A7BD00004FF0FF314E -:10173000143001F0A1BD00004C3001F077BE000074 -:101740004FF0FF324C3001F071BE0000D0F894240D -:1017500038B5136819780429054601D0012038BD31 -:10176000017C0229FAD112795C8901209040044061 -:10177000F4D105F1140001F039FD02460028EDD046 -:10178000D5F894544FF480732868697900F07CF997 -:10179000204638BD406BFFF7D9BF000000207047DE -:1017A000704700007FB5124B0360002343608360E5 -:1017B000C360012502260F4B057404460290019375 -:1017C00000F18402294600964FF48073143001F032 -:1017D000E9FC094B0193029400964FF4807304F5E1 -:1017E0002372294604F14C0001F0B0FD04B070BD35 -:1017F000603C000895170008BD1600080B68202201 -:1018000082F311880A7903EB820290614A790932E6 -:1018100043F822008A7912B103EB82039861022314 -:101820000374C0F89414002383F3118870470000F8 -:1018300038B5037F044613B190F85430ABB9201D7E -:1018400001250221FFF732FF04F1140025776FF024 -:10185000010100F087FC84F8545004F14C006FF053 -:101860000101BDE8384000F07DBC38BD10B5012154 -:1018700004460430FFF71AFF0023237784F854301E -:1018800010BD000038B504460025143001F0A2FC5C -:1018900004F14C00257701F071FD201D84F85450AF -:1018A0000121FFF703FF2046BDE83840FFF74EBF98 -:1018B00090F8443003F06003202B19D190F84520B4 -:1018C000212A0AD0222A4FF000030ED0202A0FD15D -:1018D000084A82630722C26304E0064B836307233E -:1018E000C36300230364012070478363C363F9E784 -:1018F0000020704701240020D0F8943437B51A68CE -:101900001178042904461AD1017C022917D11979CA -:10191000128901238B40134211D100F14C05284656 -:1019200001F0ECFD58B101A9284601F033FDD4F8CF -:101930009444019B21790246206800F0B7F803B077 -:1019400030BD000000EB8103F7B59C6905460E46EB -:10195000F4B1202383F3118805EB8607201D0821AD -:10196000FFF7A4FEFB685B691B684C3413B120468B -:1019700001F01EFD01A9204601F00CFD024648B110 -:10198000019B3146284600F091F8002383F311882B -:1019900003B0F0BDFB685A691268002AF5D01B8AB3 -:1019A000013B1340F1D105F14402EAE7093138B5B2 -:1019B00050F82140DCB1202383F31188D4F894241B -:1019C0001368527903EB8203DB689B695D6845B15C -:1019D00004216018FFF76AFE294604F1140001F0A3 -:1019E0000FFC2046FFF7B2FE002383F3118838BDB9 -:1019F0007047000000F0D0BF012303700023436054 -:101A0000C36183620362C3624362036303814381F0 -:101A10007047000038B50446202383F31188002561 -:101A20004160C56005614561856100F0C5FF022325 -:101A3000237085F3118838BD70B500EB810305462E -:101A40005069DA600E46144618B110220021FFF7E3 -:101A5000F9F9A06918B110220021FFF7F3F9314616 -:101A60002846BDE8704001F071B80000028902F01C -:101A700001020281428902F00102428100220261D8 -:101A80004261826101F0F6B8F0B400EB810447894D -:101A9000E4680125A4698D403D434581236000230E -:101AA000A2606360F0BC01F011B90000F0B400EB7B -:101AB00081040789E468012564698D403D430581FF -:101AC00023600023A2606360F0BC01F08BB90000CA -:101AD00070B50223002504460370A0F84C5080F82E -:101AE0004E5080F84F5005814581C56005614561C4 -:101AF000856180F8345000F0C5FF63681B6823B12E -:101B000029462046BDE87040184770BD43680278FA -:101B10001B6880F85020052202700BB10421184781 -:101B200070470000436890F850201B6802700BB1AA -:101B3000052118477047000090F8343070B504460E -:101B400013B1002380F8343004F14402204601F040 -:101B5000B3F863689B6863BB94F8445015F0600663 -:101B600015D194F8453005F07F0545EA032540F28C -:101B700002339D4200F00E815BD8022D00F0DC8024 -:101B80003FD8002D00F08780012D00F0CF8000218C -:101B9000204601F0E9FA0021204601F0DBFA6368F3 -:101BA0001B6813B1062120469847062384F8343079 -:101BB00070BD204698470028CED094F84B2094F86A -:101BC0004A3043EA0223E26B934238BFE36394F95D -:101BD0004430E56B002B4FF0200380F2FD80002D98 -:101BE00000F0EC80092284F8342083F3118800216E -:101BF000E36BA26B2046FFF759FF002383F31188A4 -:101C000070BDB5F5817F00F0B180B5F5407F49D05A -:101C1000B5F5807FBBD194F84630012BB7D1B4F82D -:101C20004C3023F00203A4F84C30A663E66326642C -:101C3000C3E740F201639D421ED8B5F5C06F3BD2A9 -:101C4000B5F5A06FA3D1B4F84430B3F5A06F0ED1B1 -:101C500094F8463084F84E30204600F06BFF6368FD -:101C60001B6813B1012120469847032323700023EA -:101C7000A363E3632364A0E7B5F5106F32D040F6A9 -:101C800002439D4252D0B5F5006F80D104F14F035D -:101C9000A363012324E004F14C03A3630223E36361 -:101CA00025648AE794F84630012B7FF470AFB4F8CE -:101CB0004C3043F00203B6E794F84920616894F889 -:101CC00048304D6894F8471043EA0223204694F8C0 -:101CD0004620A84700283FF45AAF4368A36303682F -:101CE000E363A4E72378042B10D1202383F3118826 -:101CF0002046FFF7BBFE86F31188636884F84F60C7 -:101D00001B68032121700BB12046984794F8463098 -:101D1000002BACD084F84F300423237063681B6819 -:101D2000002BA4D0022120469847A0E7374BA3639D -:101D30000223E36300239DE794F8481011F0800F1D -:101D4000204601F00F010ED000F0A8FF012806D0B8 -:101D500002287FF41CAF2E4BA363E06367E72D4B93 -:101D6000A363E56363E700F08BFFEFE794F8463089 -:101D7000002B7FF40CAF94F8483013F00F013FF4C0 -:101D800076AF1A06204602D501F002FA6FE701F09D -:101D9000F5F96CE794F84630002B7FF4F8AE94F830 -:101DA000483013F00F013FF462AF1B06204602D506 -:101DB00001F0DAF95BE701F0CDF958E7142284F875 -:101DC000342083F311882B462A4629462046FFF704 -:101DD0005BFE85F3118870BD5DB1152284F8342057 -:101DE00083F311880021E36BA26B2046FFF74CFEC2 -:101DF00003E70B2284F8342083F311882B462A460C -:101E000029462046FFF752FEE3E700BF903C00085A -:101E1000883C00088C3C000838B590F83430044603 -:101E2000152B29D8DFE803F03E28282828283E284B -:101E3000280B293928282828282828283E3E90F8C9 -:101E40004B1090F84A20C36B42EA01229A4214D9FF -:101E5000C268128AB3FBF2F502FB15356DB9202377 -:101E600083F311882B462A462946FFF71FFE85F388 -:101E700011880A2384F8343038BD142384F83430B0 -:101E8000202383F3118800231A4619462046FFF7C2 -:101E9000FBFD002383F3118838BD036C03B1984721 -:101EA0000023E7E7002101F05FF90021204601F05F -:101EB00051F963681B6813B1062120469847062331 -:101EC000D8E7000090F83420152A38B5044622D807 -:101ED0000123934040F6416213421DD113F4801553 -:101EE0000FD19B0217D50B2380F83430202383F3C6 -:101EF00011882B462A462946FFF7D8FD85F311881D -:101F000038BDC3689B695B682BB9036C03B1984704 -:101F1000002384F8343038BD002101F025F9002178 -:101F2000204601F017F963681B6813B106212046AB -:101F300098470623EDE70000024B00221B605B6020 -:101F40009A60704754330020002303748268054B65 -:101F50001B6899689142FBD25A6803604260106026 -:101F6000586070475433002008B5202383F311884C -:101F7000037C032B05D0042B0DD02BB983F31188E0 -:101F800008BD436900221A604FF0FF334361FFF739 -:101F9000DBFF0023F2E790E80C001A600268536050 -:101FA000F2E70000002303748268054B1B68996800 -:101FB0009142FBD85A6803604260106058607047D5 -:101FC00054330020054B19690874186802681A60B8 -:101FD0005360186101230374FEF796B9543300204F -:101FE00030B54B1C87B005460A4C10D023690A4A0D -:101FF00001A800F0D3F82846FFF7E4FF049B13B1D3 -:1020000001A800F007F92369586907B030BDFFF750 -:10201000D9FFF8E754330020691F000838B50C4D8C -:1020200041612B6981689A689142044603D8BDE8F2 -:102030003840FFF789BF1846FFF786FF01232C6160 -:10204000014623742046BDE83840FEF75DB900BF65 -:1020500054330020044B1A681B6990689B689842AF -:1020600094BF0020012070475433002010B5084C65 -:10207000236820691A6822605460012223611A745F -:10208000FFF790FF01462069BDE81040FEF73CB91C -:10209000543300208260022202740022427470478E -:1020A0008368A3F17C0243F80C2C026943F83C2CB2 -:1020B000426943F8382C074A43F81C2CC26843F89D -:1020C000102C022203F8082C002203F8072CA3F19D -:1020D000180070472103000810B5202383F31188EE -:1020E000FFF7DEFF00210446FFF798FF002383F38C -:1020F0001188204610BD0000024B1B6958610F205B -:10210000FFF760BF54330020202383F31188FFF7CB -:10211000F3BF000008B50146202383F3118808208F -:10212000FFF75EFF002383F3118808BD49B1064B1A -:1021300042681B6918605A60136043600420FFF70F -:102140004FBF4FF0FF307047543300200368984270 -:1021500006D01A680260506059611846FFF7F4BE55 -:102160007047000038B504460D462068844200D10F -:1021700038BD036823605C604561FFF7E5FEF4E766 -:10218000054B03F114025A619A614FF0FF32DA6194 -:1021900000221A62704700BF54330020F8B5036173 -:1021A0001A4BC2605C6A1A4B1A46022952F8145F35 -:1021B00038BF0221954206461F460AD158619861F0 -:1021C0001C620560456081600819BDE8F84001F0B7 -:1021D000B7B9186AAB68241A0C1902D3E41A2D682F -:1021E00004E09C4202D2204401F0BAF9AB689C4260 -:1021F000F4D86B68736035601E606E60B460A96867 -:102200004FF0FF33091BA960FB61F8BD000C0040D3 -:102210005433002010B41A4C234653F8141F814243 -:1022200010D0416802680A60026851609A424FF01B -:102230000001C16003D0936881680B4493605DF82E -:10224000044B70470A68626100209A425360C8607C -:1022500003D15DF8044B01F07DB9936888680344AD -:102260009360084A206A526A121A9342E7D9991A6F -:10227000012998BF931C18445DF8044B01F070B914 -:1022800054330020000C004000207047FEE700009F -:10229000704700004FF0FF3070470000022906D061 -:1022A000032906D00129064818BF002070470548B9 -:1022B0007047032A9ABF044800EBC2000020704711 -:1022C000643D0008183D00080824002070B59AB04D -:1022D00001AD064608462946144600F095F8284602 -:1022E000FEF7A8FDC0B2431C5B0086E8180023700F -:1022F00003236370002302341946DAB2904204F1DA -:10230000020401D81AB070BDEA5C04F8022C04F88B -:10231000011C0133F1E7000008B5202383F3118885 -:102320000348FFF7E9FA002383F3118808BD00BFD3 -:102330009433002010B50446052916D8DFE801F0D3 -:1023400016150316161D202383F311880E4A01214A -:10235000FFF772FB20460D4A0221FFF76DFB0C4888 -:10236000FFF790FA002383F3118810BD202383F335 -:1023700011880748FFF75CFAF4E7202383F31188FC -:102380000348FFF773FAEDE7943C0008B83C0008F7 -:102390009433002038B50C4D0C4C0D492A4604F1FD -:1023A0000800FFF793FF05F1CA0204F11000094984 -:1023B000FFF78CFF05F5CA7204F118000649BDE865 -:1023C0003840FFF783BF00BF5C380020082400209E -:1023D000E43C0008F13C0008FE3C000870B50446EF -:1023E00008460D46FEF726FDC6B2204601340378A6 -:1023F0000BB9184670BD32462946FEF703FD00288A -:10240000F3D1012070BD00002DE9F84F05460C46C0 -:10241000FEF710FD2A49C6B22846FFF7DFFF08B1D4 -:102420000136F6B227492846FFF7D8FF08B1103623 -:10243000F6B2632E0DD8DFF88890DFF888A0224F1F -:10244000DFF88CB0DFF88C802E7846B92670BDE8B6 -:10245000F88F29462046BDE8F84F01F097BB252E9E -:1024600029D1072249462846FEF7CCFC40B9D8F8C6 -:1024700000302360D8F80430636007350834E3E7A0 -:10248000082251462846FEF7BDFCA0B90F4BA21CFE -:1024900013F8011F09095B45C95D02F8021C197890 -:1024A00001F00F0102F10202C95D02F8031CEFD135 -:1024B00018340835C8E7267001350134C4E700BF79 -:1024C000843D0008FE3C0008953D00080F7AFF1F80 -:1024D0001B7AFF1F8C3D0008BFF34F8F024AD36861 -:1024E000DB03FCD4704700BF003C024008B5094B39 -:1024F0001B7873B9FFF7F0FF074B1A69002ABFBFBB -:10250000064A5A6002F188325A601A6822F48062E0 -:102510001A6008BDBA3A0020003C0240230167451A -:1025200008B50B4B1B7893B9FFF7D6FF094B1A6917 -:1025300042F000421A611A6842F480521A601A6826 -:1025400022F480521A601A6842F480621A6008BD50 -:10255000BA3A0020003C0240172870B513D80B4A45 -:102560000B4C137863B90B4E4FF0006144F8231005 -:1025700056F823500133182B2944F7D10123137047 -:1025800054F8200070BD002070BD00BF1C3B00202F -:10259000BC3A0020A83D0008014B53F820007047CA -:1025A000A83D000818207047172810B5044601D927 -:1025B000002010BDFFF7D0FF064B53F8243018441D -:1025C000C21A0BB9012010BD12680132F0D1043BD0 -:1025D000F6E700BFA83D0008172810B5044629D823 -:1025E000FFF77AFFFFF782FF1349F323CB600C2339 -:1025F000B0FBF3F203FB1200D30143EAC003DBB2EA -:1026000043F4007343F002030B610B6943F480331E -:102610000B61FFF761FF2046FFF79EFF074B53F862 -:10262000241000F0DDF8FFF77BFF2046BDE81040E6 -:10263000FFF7BABF002010BD003C0240A83D0008D3 -:102640002DE9F84312F00103154640D18218B2F18A -:10265000026F3CD22C4B1B6813F0010337D02B4C7C -:10266000FFF744FFF323E360FFF736FF40F2012753 -:10267000032D01D9830713D0244C0F46401A40F292 -:102680000118EB1B0B44012B00EB0706236924D830 -:1026900023F001032361FFF743FF0120BDE8F88326 -:1026A000236923F44073236123693B43236151F879 -:1026B000046B0660BFF34F8FFFF70EFF03689E4267 -:1026C00008D0236923F001032361FFF729FF0020CD -:1026D000BDE8F883043D0430CAE723F44073236166 -:1026E000236943EA08032361B94637F8023B338084 -:1026F000BFF34F8FFFF7F0FE3688B9F80030B6B25F -:10270000B342BED0DDE700BF00380240003C0240CB -:10271000084908B50B7828B153B9FFF7E7FE012344 -:102720000B7008BD23B1BDE808400870FFF7F8BE84 -:1027300008BD00BFBA3A002010B50244064B043968 -:10274000D2B2904200D110BD441C00B253F8200018 -:1027500041F8040FE0B2F4E750280040104B30B5C8 -:102760001C6F240407D41C6F44F400741C671C6F96 -:1027700044F400441C670B4C236843F480732360CB -:102780000244094B0439D2B2904200D130BD441CFE -:1027900000B251F8045F43F82050E0B2F4E700BF04 -:1027A00000380240007000405028004007B5012268 -:1027B00001A90020FFF7C0FF019803B05DF804FBFA -:1027C00013B50446FFF7F2FFA04206D002A901228A -:1027D00041F8044D0020FFF7C1FF02B010BD00001A -:1027E00070470000034B1B689B0042BF024B012255 -:1027F0001A707047743802401D3B0020014B187856 -:10280000704700BF1D3B0020064A536823F00103B8 -:102810005360EFF30983683383F30988002383F35C -:102820001188704730EF00E010B5202383F3118842 -:10283000104B5B6813F4006318D0F1EE103AEFF31D -:1028400009844FF0807344F84C3C0B4BDB6844F830 -:10285000083CA4F1680383F30988FFF7FBFB18B178 -:10286000064B44F8503C10BD054BFAE783F3118842 -:1028700010BD00BF00ED00E030EF00E031030008C4 -:102880003403000870470000FEE70000084A094BC7 -:1028900009498B4204D3094A0021934205D370476A -:1028A00052F8040F43F8040BF3E743F8041BF4E772 -:1028B000843F0008903D0020903D0020903D002086 -:1028C000836D30B500229D68446D11464FF0FF3096 -:1028D00004EB421301329542C3F80019C3F81019F2 -:1028E000C3F80809C3F8001BC3F8101BC3F8080B92 -:1028F000EED24FF00113C4F81C3830BD890141F00D -:102900002001016103699B06FCD4122000F0B4BED3 -:10291000204B03EB80022DE9F047D2F80CE05D6D0F -:10292000DEF81420461CD2F800C005EB063605EB95 -:102930004018516861450BD3D5F83428012303FAB8 -:1029400000F022EA0000C5F834081846BDE8F08718 -:10295000BEF81040ACEB0103A34228BF2346D8F8D1 -:102960001849A4B2B3EB840F10D894681F46A4F1A1 -:10297000040959F804AFC6F800A0042F01D9043F98 -:10298000F7E71C440B4494605360D2E70020BDE895 -:10299000F08700BF203B002010B5054C2046FFF714 -:1029A0002BF84FF0A0436365024BA36510BD00BF39 -:1029B000203B00202C3E00080378012B70B5054613 -:1029C00050D12A4B446D98421BD1294B5A6B42F08F -:1029D00080025A635A6D42F080025A655A6D5A69F4 -:1029E00042F080025A615A6922F080025A610E2137 -:1029F00043205B69FEF76AFC1E4BE3601E4BC4F884 -:102A000000380023C4F8003EC02323606E6D4FF4ED -:102A10005023A3633369002BFCDA012333610C20BC -:102A200000F02AFE3369DB07FCD4122000F024FEFC -:102A30003369002BFCDA0026A6602846FFF740FF2A -:102A40006B68C4F81068DB68C4F81468C4F81C68C4 -:102A50004BB90A4BA3614FF0FF336361A36843F0A6 -:102A60000103A36070BD064BF4E700BF203B0020CC -:102A7000003802404014004003002002003C30C0F7 -:102A8000083C30C0F8B5446D054600212046FFF7EC -:102A900035FFA96D00234FF001128F68C4F8343858 -:102AA0004FF00066C4F81C284FF0FF3004EB4312CF -:102AB00001339F42C2F80069C2F8006BC2F80809EE -:102AC000C2F8080BF2D20B686A6DEB6563621023E3 -:102AD0001361166916F01006FBD1122000F0CCFD30 -:102AE000D4F8003823F4FE63C4F80038A36943F433 -:102AF000402343F01003A3610923C4F81038C4F83D -:102B000014380A4BEB604FF0C043C4F8103B084B3D -:102B1000C4F8003BC4F81069C4F80039EB6D03F148 -:102B2000100243F48013EA65A362F8BD083E000872 -:102B300040800010426D90F84E10D2F8003823F417 -:102B4000FE6343EA0113C2F8003870472DE9F041F3 -:102B50000EB200EB86080D46D8F80C100F6807F08F -:102B60000303022B50D0032B50D03D4A3D4F012B85 -:102B700018BF1746446D4FEA451E04EB0E030022B2 -:102B8000C3F8102B8A6905F1100C002A40D04A8A3C -:102B900005F158035B013A43E2500123D4F81C28A5 -:102BA00003FA0CF31343A6444A69C4F81C38002303 -:102BB000CEF8103905F13F03002A39D00A8A898BF3 -:102BC0009208012988BF4A43C16D04EB830356185C -:102BD00041EA0242C66529465A602046FFF78EFE4A -:102BE000D8F80C301B8A43EA85531F4305F148038C -:102BF0005B01E7500123D4F81C2803FA05F51543BF -:102C0000C4F81C58BDE8F081174FB3E7174FB1E780 -:102C100004EB4613D3F8002B22F40042C3F8002B38 -:102C2000D4F81C28012303FA0CF322EA0303BAE7C1 -:102C300004EB83030E4A5A6004EB461629462046ED -:102C4000FFF75CFED6F8003923F40043C6F80039DC -:102C5000D4F81C38012202FA05F523EA0505CFE76E -:102C600000800010008004100080081000800C100C -:102C700000040002826D1268C265FFF721BE0000E9 -:102C80005831436D49015B5813F4004004D013F4EC -:102C9000001F14BF01200220704700004831436D1F -:102CA00049015B5813F4004004D013F4001F14BF13 -:102CB000012002207047000000EB8101CB68196AF7 -:102CC0000B6813604B6853607047000000EB810392 -:102CD00030B5DD68AA691368D36019B9402B84BF89 -:102CE000402313606B8A1468426D1C44013CB4FBA2 -:102CF000F3F46343033323F0030302EB411043EA8D -:102D0000C44343F0C043C0F8103B2B6803F00303F7 -:102D1000012B09B20ED1D2F8083802EB411013F49E -:102D2000807FD0F8003B14BF43F0805343F0005342 -:102D3000C0F8003B02EB4112D2F8003B43F00443E1 -:102D4000C2F8003B30BD00002DE9F041244D6E6D0E -:102D500006EB40130446D3F8087BC3F8087B38071A -:102D60000AD5D6F81438190706D505EB8403214691 -:102D7000DB6828465B689847FA072FD5D6F81438E1 -:102D8000DB072BD505EB8403D968CCB98B69488A5E -:102D90005E68B6FBF0F200FB12628AB91868DA6866 -:102DA00090420DD2121A83E81400202383F3118875 -:102DB0000B482146FFF78AFF84F31188BDE8F081B4 -:102DC000012303FA04F26B8923EA02036B81CB68C7 -:102DD00023B121460248BDE8F0411847BDE8F08123 -:102DE000203B002000EB810370B5DD68436D6C690A -:102DF0002668E6604A0156BB1A444FF40020C2F828 -:102E000010092A6802F00302012A0AB20ED1D3F88F -:102E1000080803EB421410F4807FD4F8000914BFB3 -:102E200040F0805040F00050C4F8000903EB42121B -:102E3000D2F8000940F00440C2F80009D3F8340881 -:102E4000012202FA01F10143C3F8341870BD19B927 -:102E5000402E84BF4020206020682E8A841940F0D4 -:102E60000050013C1A44B4FBF6F440EAC440C6E703 -:102E7000F8B504461E48456D05EB4413D3F80869C0 -:102E8000C3F80869F10717D5D5F81038DA0713D554 -:102E900000EB8403D9684B691F68DA68974218D23F -:102EA000D21B00271A605F60202383F3118821461C -:102EB000FFF798FF87F31188330617D5D5F8342824 -:102EC0000123A340134211D02046BDE8F840FFF78C -:102ED0001FBD012303FA04F2038923EA02030381DD -:102EE0008B68002BE8D021469847E5E7F8BD00BF86 -:102EF000203B002096482DE9F84F456D6E69AB697F -:102F00001E4016F4805F6E61044605D0FEF7E0FDBA -:102F1000BDE8F84FFFF788BC002E12DAD5F8003E66 -:102F20008B489B071EBFD5F8003E23F00303C5F86E -:102F3000003ED5F8043823F00103C5F80438FEF745 -:102F4000F1FD370502D58248FEF7E0FDB0040CD54F -:102F5000D5F8083813F0060FEB6823F470530CBF54 -:102F600043F4105343F4A053EB60310704D5636876 -:102F7000DB680BB176489847F2025AD4B3020CD5FD -:102F8000D4F85480DFF8C8A100274FF00109A36DE1 -:102F90009B68F9B28B4280F08780F70619D5616D86 -:102FA0000A6AC2F30A1702F00F0302F4F012B2F534 -:102FB000802F00F0A180B2F5402F0AD104EB8303EB -:102FC00001F58051DB68186A00231A469F4240F0E1 -:102FD00087803003D5F8184813D5E10302D50020C7 -:102FE000FFF7B2FEA20302D50120FFF7ADFE630397 -:102FF00002D50220FFF7A8FE270302D50320FFF722 -:10300000A3FE750384D5E00702D50020FFF730FF4B -:10301000A10702D50120FFF72BFF620702D502208E -:10302000FFF726FF23077FF573AF0320FFF720FF8D -:103030006EE7D4F85480DFF818A100274FF001099B -:10304000A36D9B685FFA87FB5B4597D308EB4B1337 -:10305000D3F8002902F44022B2F5802F22D1D3F810 -:103060000029002A1EDAD3F8002942F09042C3F862 -:103070000029D3F80029002AFBDB5946606DFFF7D1 -:103080003DFC228909FA0BF322EA0303238104EBB6 -:103090008B03DB689B6813B15946504698475846E6 -:1030A000FFF736FC0137CBE708EB4112D2F8003BC3 -:1030B00003F44023B3F5802F10D1D2F8003B002B4E -:1030C0000CDA628909FA01F322EA0303638104EB53 -:1030D0008103DB68DB680BB150469847013756E740 -:1030E0009C0708BF0A68072B98BF027003F1010311 -:1030F0009CBF120A013069E7023304EB830201F539 -:103100008051526890690268D0F808C04068A2EB0C -:10311000000E0022104697420AD104EB8304636834 -:103120009B699A683A449A605A6817445F6050E70E -:1031300012F0030F08BF0868964588BF8CF800009E -:1031400002F1010284BF000A0CF1010CE3E700BFA9 -:10315000203B0020436D03EB4111D1F8003B43F4C9 -:103160000013C1F8003B7047436D03EB4111D1F8E8 -:10317000003943F40013C1F800397047436D03EB85 -:103180004111D1F8003B23F40013C1F8003B704714 -:10319000436D03EB4111D1F8003923F40013C1F85A -:1031A0000039704730B5039C0172043304FB0325DA -:1031B000C361049B03630021059B00604060C16004 -:1031C000426102618561046242628162C16243635D -:1031D00030BD00000022416A41610161C26082622B -:1031E000C2626FF00101FEF7BDBF000003694269D2 -:1031F000934203D1C2680AB100207047181D70477E -:1032000003691960C2680132C260C26913448269ED -:103210000361934224BF436A03610021FEF796BF16 -:1032200038B504460D46E3683BB16269131D126868 -:10323000A3621344E362002038BD237A33B92946E0 -:103240002046FEF773FF0028EDDA38BD6FF001006D -:10325000FBE70000C368C269013BC36043691344D4 -:1032600082694361934224BF436A436100238362BE -:10327000036B03B11847704770B52023044683F3EE -:103280001188866A3EB9FFF7CBFF054618B186F371 -:103290001188284670BDA36AE26A13F8015BA36235 -:1032A000934202D32046FFF7D5FF002383F3118812 -:1032B000EFE700002DE9F84F04460E469046994688 -:1032C000202787F311880025AA46D4F828B0BBF13F -:1032D000000F09D149462046FFF7A2FF20B18BF32A -:1032E00011882846BDE8F88FA16AE36AA8EB050BB0 -:1032F0005B1A9B4528BF9B46BBF1400F1BD9334649 -:1033000001F1400251F8040B43F8040B9142F9D14A -:10331000A36A40334036A3624035A26AE36A9A4208 -:1033200002D32046FFF796FF8AF311884545D8D28D -:1033300087F31188C9E730465A46FDF759FDA36A5D -:103340005B445E44A3625D44E7E7000010B5029C65 -:103350000172043303FB0421C36100238362C3624F -:10336000039B0363049B00604060C4604261026190 -:10337000816104624262436310BD0000026AC26060 -:10338000426A4261026100228262C2626FF0010100 -:10339000FEF7E8BE436902699A4203D1C2680AB1E6 -:1033A00000207047184650F8043B0B60704700003F -:1033B000C368C2690133C3604369134482694361CE -:1033C000934224BF436A43610021FEF7BFBE000061 -:1033D00038B504460D46E3683BB123691A1DA26265 -:1033E000E2691344E362002038BD237A33B92946E9 -:1033F0002046FEF79BFE0028EDDA38BD6FF0010095 -:10340000FBE7000003691960C268013AC260C26943 -:10341000134482690361934224BF436A036100231A -:103420008362036B03B118477047000070B5202317 -:1034300004460E4683F31188856A35B91146FFF7B5 -:10344000C7FF10B185F3118870BDA36A1E70A36A0F -:10345000E26A01339342A36204D3E169204604394E -:10346000FFF7D0FF002080F3118870BD2DE9F84FE1 -:1034700004460D4691469A464FF0200888F311887D -:103480000026B346A76A4FB951462046FFF7A0FF72 -:1034900020B187F311883046BDE8F88FA06AE76A4B -:1034A000A9EB06033F1A9F4228BF1F46402F1BD996 -:1034B00005F1400355F8042B40F8042B9D42F9D147 -:1034C000A36A4033A3624036A26AE36A9A4204D3F5 -:1034D000E16920460439FFF795FF8BF311884E45CB -:1034E000D9D288F31188CDE729463A46FDF780FC0A -:1034F000A36A3B443D44A3623E44E5E70269436955 -:103500009A4203D1C3681BB9184670470023FBE7F2 -:10351000836A002BF8D0043B9B1AF5D01360C36874 -:10352000013BC360C3691A44836902619A4224BFA4 -:10353000436A0361002383620123E5E700F034B9A5 -:10354000034B002258631A610222DA60704700BF01 -:10355000000C0040014B0022DA607047000C004074 -:10356000014B5863704700BF000C0040FEE70000AD -:1035700010B5174CFEF7E0FCFEF702FE802215495D -:103580002046FEF787FD012344F8180C0374124B04 -:10359000124AD96821F4E0610904090C0A43104970 -:1035A000DA60CA6842F08072CA600E490A6842F066 -:1035B00001020A601022DA77202283F822200023F9 -:1035C00083F3118862B60848BDE81040FEF784BD59 -:1035D0007C330020383E000800ED00E00003FA05CF -:1035E000F0ED00E0001000E0403E00082DE9F84F4B -:1035F0001F4CDFF88090656904F114074FF0000854 -:10360000D9F82430266AAA689E1B96421DD34FF033 -:10361000200AAA68236AD5F80CB0134423622B68E9 -:10362000BB425F60A6EB02066361C5F80C8001D166 -:10363000FFF790FF88F311882869D8478AF311882B -:103640006569AB689E42E4D2DAE76269BA420CD09F -:10365000916823628E1B9660A86802282CBF1818F8 -:10366000981CBDE8F84FFFF77BBFBDE8F88F00BF9F -:1036700054330020000C0040034B59685A68521A1A -:103680009042FBD8704700BF001000E04B684360D9 -:103690008B688360CB68C3600B6943614B690362CD -:1036A0008B6943620B6803607047000008B5224BCA -:1036B00022481A6940F2FF110A431A611A6922F47A -:1036C000FF7222F001021A611A691A6B0A431A6327 -:1036D0001A6D0A431A651A4A1B6D1146FFF7D6FF89 -:1036E000184802F11C01FFF7D1FF174802F1380119 -:1036F000FFF7CCFF154802F15401FFF7C7FF14484C -:1037000002F17001FFF7C2FF124802F18C01FFF7CE -:10371000BDFF114802F1A801FFF7B8FF0F4802F101 -:10372000C401FFF7B3FF0E4802F1E001FFF7AEFF5F -:10373000BDE8084000F0A4B8003802400000024094 -:10374000603E00080004024000080240000C0240F5 -:10375000001002400014024000180240001C024009 -:103760000020024008B500F0FFF9FFF701FFFFF766 -:1037700039F8BDE80840FEF70DBE000070470000B4 -:10378000084B1A69920710B508D500241C61202344 -:1037900083F31188FFF72AFF84F31188BDE81040F6 -:1037A000FFF742B8000C0040104B1A6C42F00802C0 -:1037B0001A641A6E42F008021A660D4A1B6E93686C -:1037C00043F0080393600B4B53229A624FF0FF3291 -:1037D000DA6200229A615A63DA605A6001225A6101 -:1037E00008211A603220FDF771BD00BF0038024089 -:1037F000002004E0000C00401F4B1A696FEAC2521F -:103800006FEAD2521A611A69C2F308021A614FF0C4 -:10381000FF301A695A69586100215A6959615A6919 -:103820001A6A62F080521A621A6A02F080521A62B0 -:103830001A6A5A6A58625A6A59625A6A1A6C42F08B -:1038400080521A641A6E42F080521A661A6E0B4A3F -:10385000106840F480701060186F00F44070B0F58C -:10386000007F1EBF4FF4803018671967536823F438 -:103870000073536000F058B90038024000700040F7 -:10388000324B4FF080521A64314A4FF4404111607C -:103890001A6842F001021A601A689207FCD59A6809 -:1038A00022F003029A60294B19469A6812F00C0222 -:1038B000FBD1186800F0F90018609A601A6842F4A9 -:1038C00080321A600B689B03FCD54B6F43F00103F9 -:1038D0004B671E4B5A6F9007FCD51E4A5A601A68F8 -:1038E00042F080721A601A4A53685904FCD5174B8B -:1038F0001A689201FCD5184A9A600322C3F88C20FA -:10390000164B1A68164B9A42164B1BD1164A116871 -:10391000164A914216D140F205121A600B4B9A6872 -:1039200042F002029A609A6802F00C02082AFAD168 -:103930005A6C42F480425A645A6E42F480425A668B -:103940005B6E704740F20572E7E700BF0038024047 -:10395000007000401854400700948838002004E0AC -:1039600011640020003C024000ED00E041C20F4124 -:10397000084A08B5536911680B4003F0010353610D -:1039800023B1054A13680BB150689847BDE8084059 -:10399000FEF74ABF003C01409C250020084A08B5BC -:1039A000536911680B4003F00203536123B1054AC8 -:1039B00093680BB1D0689847BDE80840FEF734BF64 -:1039C000003C01409C250020084A08B55369116855 -:1039D0000B4003F00403536123B1054A13690BB193 -:1039E00050699847BDE80840FEF71EBF003C014003 -:1039F0009C250020084A08B5536911680B4003F064 -:103A00000803536123B1054A93690BB1D069984704 -:103A1000BDE80840FEF708BF003C01409C2500209F -:103A2000084A08B5536911680B4003F0100353614D -:103A300023B1054A136A0BB1506A9847BDE80840A4 -:103A4000FEF7F2BE003C01409C250020174B10B54C -:103A50005C691A68144004F478725A61A30604D5AC -:103A6000134A936A0BB1D06A9847600604D5104A8E -:103A7000136B0BB1506B9847210604D50C4A936B1E -:103A80000BB1D06B9847E20504D5094A136C0BB112 -:103A9000506C9847A30504D5054A936C0BB1D06CC4 -:103AA0009847BDE81040FEF7BFBE00BF003C014094 -:103AB0009C2500201A4B10B55C691A68144004F468 -:103AC0007C425A61620504D5164A136D0BB1506DE4 -:103AD0009847230504D5134A936D0BB1D06D9847D1 -:103AE000E00404D50F4A136E0BB1506E9847A10441 -:103AF00004D50C4A936E0BB1D06E9847620404D57E -:103B0000084A136F0BB1506F9847230404D5054A38 -:103B1000936F0BB1D06F9847BDE81040FEF784BE9D -:103B2000003C01409C250020062108B50846FDF711 -:103B3000CDFB06210720FDF7C9FB06210820FDF774 -:103B4000C5FB06210920FDF7C1FB06210A20FDF770 -:103B5000BDFB06211720FDF7B9FB06212820BDE893 -:103B60000840FDF7B3BB000008B5FFF745FEFDF7C1 -:103B700029FAFDF751FDFDF73DFFFDF711FEFFF7B7 -:103B8000FDFDBDE80840FFF7D9BC0000034611F871 -:103B9000012B03F8012B002AF9D1704712101213E0 -:103BA0001211000053544D3332463F3F3F00000096 -:103BB000012033000010410101105A010310590186 -:103BC0000710310100000000A43B00083F00000086 -:103BD00013040000043C00083F000000190400002A -:103BE0000E3C00083F00000021040000183C0008C3 -:103BF0003F000000943300201C260020842A00206F -:103C0000EC2E002053544D33324634307800535458 -:103C10004D3332463432780053544D3332463434C7 -:103C20003658580000960000000000000000000018 -:103C3000000000000000000000000000E115000886 -:103C4000CD15000809160008F51500080116000832 -:103C5000ED150008D9150008C5150008151600084F -:103C60000000000019170008051700084117000898 -:103C70002D1700083917000825170008111700082C -:103C8000FD1600089D17000800000000010000005C -:103C900000000000020000000000000045190008BC -:103CA000AD190008400040002C3800203C380020AE -:103CB00002000000000000000300000000000000FF -:103CC000F119000800000000100000004C3800202E -:103CD000000000000100000000000000203B002068 -:103CE000010102004865782F50726F6669434E43A8 -:103CF0000043756265426C61636B2D424C00255335 -:103D0000455249414C250000352300089D220008FA -:103D1000B11800081923000843000000203D0008E6 -:103D200009024300020100C032090400000102023E -:103D300001000524001001052401000104240202F1 -:103D40000524060001070582030800FF090401009D -:103D5000020A000000070501024000000705810279 -:103D600040000000120000006C3D0008120110012C -:103D700002000040AE2D011000020102030100000C -:103D80000403090425424F415244250043756265EE -:103D9000536F6C6F00303132333435363738394138 -:103DA000424344454600000000400000004000003F -:103DB0000040000000400000000001000000020080 -:103DC00000000200000002000000020000000200EB -:103DD000000002000000020000400000004000005F -:103DE0000040000000400000000001000000020050 -:103DF00000000200000002000000020000000200BB -:103E0000000002000000020000000000391B000852 -:103E1000191E0008C51E000840004000803B00201D -:103E2000803B002001000000903B0020800000004B -:103E300040010000030000006D61696E0000000099 -:103E4000583E0008983B0020903D002001000000F3 -:103E50006D3500080000000069646C65000000001A -:103E60000000812A00020000AAAAAAAA00000000FD -:103E7000FFFF00000000000000A00A00000000009A -:103E800000000000AAAAAAAA00000000FFFF00008C -:103E900000000000000000001400005400000000BA -:103EA000AAAAAAAA14000054FFFF00000000000004 -:103EB0000000000080699A0100000000AAAA8AAAF6 -:103EC00040555501FFFF000000707007777000003B -:103ED0004081020100000000AAAAAAAA0041010034 -:103EE000F7FF000000000080080000000000000054 -:103EF00000000000AAAAAAAA00000000FFFF00001C -:103F000000000000000000000000000000000000B1 -:103F1000AAAAAAAA00000000FFFF000000000000FB -:103F20000000000000000000000000000A00000087 -:103F3000000000000300000000000000000000007E -:103F40000000000000000000000000000000000071 -:103F50000000000000000000000000000000000061 -:103F6000FF0096000000000804000000803D0008EB -:103F70000000000000000000000000000000000041 -:083F8000000000000000000039 +:1001E00002E000F000F8FEE772B6374880F30888B6 +:1001F000364880F3098836483649086040F20000E6 +:10020000CCF200004EF63471CEF200010860BFF36C +:100210004F8FBFF36F8F40F20000C0F2F0004EF638 +:100220008851CEF200010860BFF34F8FBFF36F8F8C +:100230004FF00000E1EE100A4EF63C71CEF20001E4 +:100240000860062080F31488BFF36F8F02F070FA05 +:1002500003F070F94FF055301F491B4A91423CBFE3 +:1002600041F8040BFAE71D49184A91423CBF41F896 +:10027000040BFAE71A491B4A1B4B9A423EBF51F83E +:10028000040B42F8040BF8E700201849184A914281 +:100290003CBF41F8040BFAE702F04EFA03F09EF976 +:1002A000144C154DAC4203DA54F8041B8847F9E7A7 +:1002B00000F042F8114C124DAC4203DA54F8041B22 +:1002C0008847F9E702F036BA000600200022002035 +:1002D0000000000808ED00E00000002000060020FB +:1002E000983E0008002200204C22002050220020CE +:1002F00020310020E0010008E0010008E0010008D2 +:10030000E00100082DE9F04F2DED108AC1F80CD066 +:10031000C3689D46BDEC108ABDE8F08F002383F3CF +:1003200011882846A047002001F098FDFEE701F063 +:1003300027FD00DFFEE7000038B500F0DFFB02F02C +:10034000CBF940B1164B6FF03F01002259720F21DB +:100350001A729972DA7202F0A5F9054602F0DEF916 +:100360000446C8B90F4B9D4218D001339D4218BFB7 +:10037000044641F2883504BF01240025002002F024 +:100380009BF90CB100F076F800F018FD284600F05B +:10039000C1F800F06FF8F9E70025EFE70546EDE753 +:1003A00000220020010007B008B500F073FBA0F1A7 +:1003B00020035842584108BD07B541F212030221FB +:1003C00001A8ADF8043000F083FB03B05DF804FB36 +:1003D00038B5302383F31188174803680BB101F057 +:1003E00009FE164A144800234FF47A7101F0F8FD13 +:1003F000002383F31188124C236813B12368013B57 +:100400002360636813B16368013B63600D4D2B7813 +:1004100033B963687BB9022000F03AFC3223636091 +:100420002B78032B07D163682BB9022000F030FC36 +:100430004FF47A73636038BD50220020D103000866 +:100440007023002068220020084B187003280CD865 +:10045000DFE800F008050208022000F00FBC0220CF +:1004600000F002BC024B00225A6070476822002054 +:1004700070230020234B244A10B51C461968013113 +:100480003FD004339342F9D16268A24239D31F4B63 +:100490009B6803F1006303F580439A4231D2002048 +:1004A00000F046FB0220FFF7CFFF194B1A6C002229 +:1004B0001A64196E1A66196E596C5A64596E5A6626 +:1004C0005A6E5A6942F080025A615A6922F08002DB +:1004D0005A615A691A6942F000521A611A6922F087 +:1004E00000521A611B6972B64FF0E0233021C3F845 +:1004F000084DD4E9003281F311889D4683F30888C2 +:10050000104710BD004000082040000800220020D5 +:10051000003802402DE9F04F93B0AA4B0090202202 +:10052000FF210AA89D6800F0F3FBA74A1378A3B93E +:10053000A648012103601170302383F311880368FA +:100540000BB101F057FDA24AA04800234FF47A7185 +:1005500001F046FD002383F31188009B13B19D4BEE +:10056000009A1A609C4A009C1378032B1EBF00233C +:100570001370984A4FF0000A18BF5360D34656468E +:10058000D146012000F07AFB24B1924B1B68002B6E +:1005900000F01182002000F07DFA0390039B002BF5 +:1005A000F2DB012000F060FB039B213B162BE8D817 +:1005B00001A252F823F000BF150600083D0600080E +:1005C000D10600088305000883050008830500089C +:1005D0005B0700082B09000845080008A708000869 +:1005E000CF080008F508000883050008070900087F +:1005F0008305000879090008B5060008830500088E +:10060000BD09000821060008B5060008830500089A +:10061000A70800080220FFF7C7FE002840F0F58178 +:10062000009B0221BAF1000F08BF1C4605A841F249 +:100630001233ADF8143000F04BFAA2E74FF47A70A1 +:1006400000F028FA071EEBDB0220FFF7ADFE0028C2 +:10065000E6D0013F052F00F2DA81DFE807F0030A58 +:100660000D10133605230593042105A800F030FA78 +:1006700017E054480421F9E758480421F6E75848A0 +:100680000421F3E74FF01C08404600F053FA08F14C +:1006900004080590042105A800F01AFAB8F12C0FFF +:1006A000F2D1012000FA07F747EA0B0B5FFA8BFB48 +:1006B0004FF0000900F078FB26B10BF00B030B2B79 +:1006C00008BF0024FFF778FE5BE746480421CDE72A +:1006D000002EA5D00BF00B030B2BA1D10220FFF7AE +:1006E00063FE074600289BD0012000F021FA02207B +:1006F000FFF7AAFE00261FFA86F8404600F028FA07 +:10070000044690B10021404600F032FA013600283C +:10071000F1D1BA46044641F21213022105A8ADF800 +:1007200014303E4600F0D4F92BE70120FFF78CFE91 +:100730002546244B9B68AB4207D9284600F0FAF9BE +:10074000013040F067810435F3E7234B00251D702D +:10075000204BBA465D603E46ACE7002E3FF460AFEA +:100760000BF00B030B2B7FF45BAF0220FFF76CFE4B +:10077000322000F08FF9B0F10008FFF651AF18F009 +:1007800003077FF44DAF0F4A926808EB05039342CD +:100790003FF646AFB8F5807F3FF742AF124B01936B +:1007A000B84523DD4FF47A7000F074F90390039A92 +:1007B000002AFFF635AF019B039A03F8012B01379E +:1007C000EDE700BF002200206C2300205022002013 +:1007D000D10300087023002068220020042200209A +:1007E000082200200C2200206C220020C820FFF7E5 +:1007F000DBFD074600283FF413AF1F2D11D8C5F1CC +:10080000200242450AAB25F0030028BF4246834937 +:100810000192184400F056FA019A8048FF2100F036 +:1008200077FA4FEAA8037D490193C8F38702284667 +:1008300000F076FA064600283FF46DAF019B05EB09 +:10084000830537E70220FFF7AFFD00283FF4E8AE4D +:1008500000F0BAF900283FF4E3AE0027B846704B29 +:100860009B68BB4218D91F2F11D80A9B01330ED0A9 +:1008700027F0030312AA134453F8203C0593404683 +:10088000042205A900F0F6FA04378046E7E7384667 +:1008900000F050F90590F2E7CDF81480042105A886 +:1008A00000F016F906E70023642104A8049300F081 +:1008B00005F900287FF4B4AE0220FFF775FD00288B +:1008C0003FF4AEAE049800F067F90590E6E7002328 +:1008D000642104A8049300F0F1F800287FF4A0AE8E +:1008E0000220FFF761FD00283FF49AAE049800F063 +:1008F00063F9EAE70220FFF757FD00283FF490AEC6 +:1009000000F072F9E1E70220FFF74EFD00283FF406 +:1009100087AE05A9142000F06DF904210746049064 +:1009200004A800F0D5F83946B9E7322000F0B2F853 +:10093000071EFFF675AEBB077FF472AE384A9268A9 +:1009400007EB090393423FF66BAE0220FFF72CFD45 +:1009500000283FF465AE27F003074F44B9453FF444 +:10096000A9AE484600F0E6F80421059005A800F07D +:10097000AFF809F10409F1E74FF47A70FFF714FDBD +:1009800000283FF44DAE00F01FF9002844D00A9B28 +:1009900001330BD008220AA9002000F0C1F9002879 +:1009A0003AD02022FF210AA800F0B2F9FFF704FD97 +:1009B0001C4801F059FA13B0BDE8F08F002E3FF447 +:1009C0002FAE0BF00B030B2B7FF42AAE0023642118 +:1009D00005A8059300F072F8074600287FF420AEC2 +:1009E0000220FFF7E1FC804600283FF419AEFFF734 +:1009F000E3FC41F2883001F037FA059800F018FA6C +:100A0000464600F0D1F93C46BBE5064652E64FF0BB +:100A1000000905E6BA467EE637467CE66C220020F1 +:100A200000220020A08601002DE9F84F4FF47A73D0 +:100A3000DFF85880DFF8589006460D4602FB03F7B2 +:100A4000002498F900305A1C5FFA84FA01D0A342BE +:100A500012D159F8240003682A46D3F820B0314651 +:100A60003B46D847854207D1074B012083F800A0B9 +:100A7000BDE8F88F0124E4E7002CFBD04FF4FA70B6 +:100A800001F0F2F90020F3E7B82300201022002043 +:100A90001422002007B50023024601210DF10700B2 +:100AA0008DF80730FFF7C0FF20B19DF8070003B0B5 +:100AB0005DF804FB4FF0FF30F9E700000A4608B587 +:100AC0000421FFF7B1FF80F00100C0B2404208BD31 +:100AD00030B4074B0A461978064B53F82140236877 +:100AE000DD69054B0146AC46204630BC604700BF7F +:100AF000B823002014220020A086010070B501F068 +:100B0000CFFC094E094D3080002428683388834289 +:100B100008D901F0BFFC2B6804440133B4F5804FC1 +:100B20002B60F2D370BD00BFBA23002078230020D1 +:100B300001F06CBD00F1006000F580400068704776 +:100B400000F10060920000F5804001F0F7BC000069 +:100B5000054B1A68054B1B889B1A834202D9104427 +:100B600001F098BC0020704778230020BA230020B1 +:100B700038B5084D044629B128682044BDE83840FE +:100B800001F0A8BC2868204401F08CFC0028F3D0B8 +:100B900038BD00BF7823002010F003030AD1B0F560 +:100BA000047F05D200F10050A0F51040D0F80038C5 +:100BB000184670470023FBE700F10050A0F51040F5 +:100BC000D0F8100A70470000064991F8243033B17C +:100BD0000023086A81F824300822FFF7B1BF012002 +:100BE000704700BF7C230020014B1868704700BF8E +:100BF000002004E070B5194B1D68194B0138C5F38E +:100C00000B0408442D0C04221E88A6420BD15C68FC +:100C10000A46013C824213460FD214F9016F4EB1CD +:100C200002F8016BF6E7013A03F10803ECD18142C7 +:100C30000B4602D22C2203F8012B0A4A05241688FF +:100C4000AE4204D1984284BF967803F8016B013C10 +:100C500002F10402F3D1581A70BD00BF002004E075 +:100C6000483B0008343B0008022802BF024B4FF407 +:100C700080529A61704700BF00100240022802BFF4 +:100C8000024B4FF080529A61704700BF0010024043 +:100C9000022801BF024A536983F4805353617047AD +:100CA0000010024070B504464FF47A764CB1412CE6 +:100CB000254628BF412506FB05F001F0D5F8641B49 +:100CC000F4E770BD10B50023934203D0CC5CC4544C +:100CD0000133F9E710BD000010B5013810F9013FEC +:100CE0003BB191F900409C4203D11AB10131013A64 +:100CF000F4E71AB191F90020981A10BD1046FCE7EC +:100D000003460246D01A12F9011B0029FAD1704796 +:100D100002440346934202D003F8011BFAE77047EE +:100D20002DE9F8431F4D144695F8242007468846C0 +:100D300052BBDFF870909CB395F824302BB9202279 +:100D4000FF2148462F62FFF7E3FF95F82400C0F12A +:100D50000802A24228BF2246D6B24146920005EBC5 +:100D60008000FFF7AFFF95F82430A41B1E44F6B2B5 +:100D7000082E17449044E4B285F82460DBD1FFF7D5 +:100D800023FF0028D7D108E02B6A03EB82038342BC +:100D9000CFD0FFF719FF0028CBD10020BDE8F883A2 +:100DA0000120FBE77C230020024B1A78024B1A70CB +:100DB000704700BFB82300201022002038B5174C20 +:100DC000174D204600F0B6FB2946204600F0DEFB1A +:100DD0002D686A6D936B23F4002393634FF47A704C +:100DE000FFF760FF0F49284600F0D6FC6A6D0E4DF4 +:100DF000936B28680D4943F400239363A0424FF49A +:100E0000E1330B6001D000F0F5FA6868A04204D02D +:100E1000BDE83840054900F0EDBA38BD98280020FB +:100E2000543C00085C3C000814220020A42300204D +:100E300070B50C4B0C4D1E780C4B55F826209A4281 +:100E400004460DD00A4B002114221846FFF760FF1C +:100E50000460014655F82600BDE8704000F0CABAAB +:100E600070BD00BFB8230020142200209828002065 +:100E7000A423002030B5094D0A4491420DD011F849 +:100E8000013B5840082340F30004013B2C4013F081 +:100E9000FF0384EA5000F6D1EFE730BD2083B8EDC0 +:100EA000026843681143016003B1184770470000AE +:100EB000024AD36843F0C003D36070470044004047 +:100EC00010B5054C054A0021204600F071FA044A8D +:100ED000044BC4E9972310BDBC230020B10E0008C9 +:100EE0000044004080DE8002234A037C002918BFB2 +:100EF0000A46012B30B5C0F868220CD11F4B98422E +:100F000009D11F4B196C41F400311964196E41F479 +:100F1000003119661B6EB2F904501468D0F86032C3 +:100F2000D0F85C12002D03EB5403B3FBF4F3BEBF07 +:100F300023F0070503F0070343EA450394888B6019 +:100F4000D38843F040030B61138943F001034B61E5 +:100F500044F4045343F02C03CB6004F4A054002366 +:100F60000B60B4F5806F0B684B680CBF7F23FF23C9 +:100F700080F8643230BD00BF683B0008BC2300200D +:100F8000003802402DE9F041D0F85C62F768336820 +:100F9000DA0504469DB20DD5302383F311884FF452 +:100FA00080610430FFF77CFF6FF4807333600023AF +:100FB00083F31188302383F3118804F1040815F0BA +:100FC0002F033AD183F31188380615D5290613D596 +:100FD000302383F3118804F1380000F065F900280C +:100FE0004EDA0821201DFFF75BFF4FF67F733B4071 +:100FF000F360002383F311887A0616D56B0614D5A7 +:10100000302383F31188D4E913239A420AD1236C45 +:1010100043B127F040073F041021201D3F0CFFF78C +:101020003FFFF760002383F31188D4F86822D36868 +:1010300043B3BDE8F041106918472B0714D015F0F1 +:10104000080F0CBF00214FF48071E80748BF41F042 +:101050002001AA0748BF41F040016B0748BF41F09B +:1010600080014046FFF71CFFAD06736805D594F874 +:1010700064122046194000F0CBF93568ADB29EE706 +:101080007060B6E7BDE8F081F8B51546826806697C +:10109000AA420B46816938BF8568761AB542044674 +:1010A0000BD218462A46FFF70DFEA3692B44A36115 +:1010B000A3685B1BA3602846F8BD0CD918463246CE +:1010C000FFF700FEAF1BE1683A463044FFF7FAFD38 +:1010D000E3683B44EBE718462A46FFF7F3FDE36875 +:1010E000E5E7000083689342F7B51546044638BF2C +:1010F0008568D0E90460361AB5420BD22A46FFF75C +:10110000E1FD63692B446361A36828465B1BA36010 +:1011100003B0F0BD0DD932460191FFF7D3FD01991F +:10112000E068AF1B3A463144FFF7CCFDE3683B442F +:10113000E9E72A46FFF7C6FDE368E4E710B50A448D +:101140000024C361029B8460C0E90000C0E905116E +:10115000C1600261036210BD08B5D0E90532934257 +:1011600001D1826882B98268013282605A1C426170 +:101170001970D0E904329A4224BFC3684361002148 +:1011800000F08EFE002008BD4FF0FF30FBE70000AE +:1011900070B5302304460E4683F31188A568A5B1C7 +:1011A000A368A269013BA360531CA361157822695F +:1011B000934224BFE368A361E3690BB120469847DB +:1011C000002383F31188284607E03146204600F0CB +:1011D00057FE0028E2DA85F3118870BD2DE9F74F3C +:1011E00004460E4617469846D0F81C904FF0300A39 +:1011F0008AF311884FF0000B154665B12A46314637 +:101200002046FFF741FF034660B94146204600F003 +:1012100037FE0028F1D0002383F31188781B03B038 +:10122000BDE8F08FB9F1000F03D001902046C84708 +:10123000019B8BF31188ED1A1E448AF31188DCE7B9 +:10124000C0E90511C160C3611144009B8260C0E91F +:101250000000016103627047F8B504460D4616466A +:10126000302383F31188A768A7B1A368013BA3606B +:1012700063695A1C62611D70D4E904329A4224BF2A +:10128000E3686361E3690BB120469847002080F36F +:10129000118807E03146204600F0F2FD0028E2DA2E +:1012A00087F31188F8BD0000D0E905239A4210B5F4 +:1012B00001D182687AB98268013282605A1C8261E7 +:1012C0001C7803699A4224BFC3688361002100F03F +:1012D000E7FD204610BD4FF0FF30FBE72DE9F74F4B +:1012E00004460E4617469846D0F81C904FF0300A38 +:1012F0008AF311884FF0000B154665B12A46314636 +:101300002046FFF7EFFE034660B94146204600F055 +:10131000B7FD0028F1D0002383F31188781B03B0B8 +:10132000BDE8F08FB9F1000F03D001902046C84707 +:10133000019B8BF31188ED1A1E448AF31188DCE7B8 +:10134000026843681143016003B118477047000009 +:101350001430FFF743BF00004FF0FF331430FFF7A6 +:101360003DBF00003830FFF7B9BF00004FF0FF333A +:101370003830FFF7B3BF00001430FFF709BF00009B +:101380004FF0FF311430FFF703BF00003830FFF794 +:1013900063BF00004FF0FF323830FFF75DBF000041 +:1013A000012914BF6FF0130000207047FFF788BDBC +:1013B00037B515460E4A026000224260C0E902229B +:1013C0000122044602740B46009000F15C014FF4C8 +:1013D00080721430FFF7B2FE00942B464FF48072F7 +:1013E00004F5AE7104F13800FFF72AFF03B030BDF9 +:1013F0007C3B000810B53023044683F31188FFF7C7 +:1014000073FD02232374002080F3118810BD0000B7 +:1014100038B5C36904460D461BB904210844FFF7DB +:101420008FFF294604F11400FFF796FE002806DA24 +:10143000201D4FF40061BDE83840FFF781BF38BD83 +:10144000026843681143016003B118477047000008 +:1014500013B5446BD4F894341A681178042915D163 +:10146000217C022912D11979128901238B40134260 +:101470000CD101A904F14C0001F012FFD4F89444FE +:10148000019B21790246206800F0D0F902B010BD1E +:10149000143001F095BE00004FF0FF33143001F01E +:1014A0008FBE00004C3001F067BF00004FF0FF33EB +:1014B0004C3001F061BF0000143001F063BE000049 +:1014C0004FF0FF31143001F05DBE00004C3001F0F0 +:1014D00033BF00004FF0FF324C3001F02DBF000051 +:1014E0000020704710B5D0F894341A681178042998 +:1014F000044617D1017C022914D15979528901235C +:101500008B4013420ED1143001F0F6FD024648B173 +:10151000D4F894444FF4807361792068BDE810409A +:1015200000F072B910BD0000406BFFF7DBBF000098 +:10153000704700007FB5124B036000234360C0E991 +:101540000233012502260F4B0574044602900193D5 +:1015500000F18402294600964FF48073143001F0A4 +:10156000A7FD094B0294CDE9006304F523724FF403 +:101570008073294604F14C0001F06EFE04B070BD8A +:10158000A43B000829150008511400080B683022FC +:1015900082F311880A7903EB820290614A79093259 +:1015A00043F822008A7912B103EB82039861022387 +:1015B000C0F894140374002080F311887047000071 +:1015C00038B5037F044613B190F85430ABB9201DF1 +:1015D00001250221FFF734FF04F1140025776FF095 +:1015E000010100F069FC84F8545004F14C006FF0E4 +:1015F0000101BDE8384000F05FBC38BD10B50121E5 +:1016000004460430FFF71CFF0023237784F854308E +:1016100010BD000038B504460025143001F060FD0F +:1016200004F14C00257701F02FFE201D84F8545062 +:101630000121FFF705FF2046BDE83840FFF752BF04 +:1016400090F8443003F06003202B07D190F8452038 +:10165000212A4FF0000303D81F2A06D80020704724 +:10166000222AFBD1C0E90E3303E0034A826307223A +:10167000C2630364012070471C22002037B5D0F8F4 +:1016800094341A681178042904461AD1017C02297D +:1016900017D11979128901238B40134211D100F11E +:1016A0004C05284601F0B0FE58B101A9284601F0CA +:1016B000F7FDD4F89444019B21790246206800F09C +:1016C000B5F803B030BD0000F0B500EB810385B084 +:1016D0009E6904460D46FEB1302383F3118804EB66 +:1016E0008507301D0821FFF7ABFEFB685B691B68AF +:1016F00006F14C001BB1019001F0E0FD019803A937 +:1017000001F0CEFD024648B1039B2946204600F079 +:101710008DF8002383F3118805B0F0BDFB685A698A +:101720001268002AF5D01B8A013B1340F1D104F165 +:101730004402EAE7093138B550F82140DCB13023E2 +:1017400083F31188D4F894241368527903EB82034D +:10175000DB689B695D6845B104216018FFF770FE86 +:10176000294604F1140001F0D1FC2046FFF7BAFE2F +:10177000002383F3118838BD7047000001F030B8B2 +:10178000012303700023C0E90133C3618362036254 +:10179000C36243620363704738B50446302383F362 +:1017A00011880025C0E90355C0E90555416001F0E5 +:1017B00027F80223237085F31188284638BD0000DE +:1017C00070B500EB810305465069DA600E46144699 +:1017D00018B110220021FFF79BFAA06918B110225E +:1017E0000021FFF795FA31462846BDE8704001F028 +:1017F000D1B80000826802F0011282600022C0E9C4 +:101800000422826101F052B9F0B400EB81044789EF +:10181000E4680125A4698D403D4345812360002390 +:10182000A2606360F0BC01F06DB90000F0B400EBA1 +:1018300081040789E468012564698D403D43058181 +:1018400023600023A2606360F0BC01F0E7B90000F0 +:1018500070B50223002504460370C0E90255C0E9B3 +:101860000455C564856180F8345001F02FF8636831 +:101870001B6823B129462046BDE87040184770BD5B +:101880000378052B10B504460AD080F850300523A4 +:10189000037043681B680BB1042198470023A360C1 +:1018A00010BD00000178052906D190F8502043684A +:1018B00002701B6803B118477047000070B590F8BC +:1018C0003430044613B1002380F8343004F144026C +:1018D000204601F00DF963689B68B3B994F8443071 +:1018E00013F0600535D00021204601F0ADFB00214A +:1018F000204601F09FFB63681B6813B10621204658 +:101900009847062384F8343070BD20469847002855 +:10191000E4D0B4F84A30E26B9A4288BFE36394F9AA +:101920004430E56B002B4FF0300380F20381002D33 +:1019300000F0F280092284F8342083F3118800211A +:10194000D4E90E232046FFF771FF002383F31188AB +:10195000DAE794F8452003F07F0343EA022340F2DC +:101960000232934200F0C58021D8B3F5807F48D081 +:101970000DD8012B3FD0022B00F09380002BB2D169 +:1019800004F14C02A2630222E2632364C1E7B3F5CF +:10199000817F00F09B80B3F5407FA4D194F846305E +:1019A000012BA0D1B4F84C3043F0020332E0B3F580 +:1019B000006F4DD017D8B3F5A06F31D0A3F5C06339 +:1019C000012B90D8636894F846205E6894F847101D +:1019D000B4F848302046B047002884D04368A36359 +:1019E0000368E3631AE0B3F5106F36D040F60242A5 +:1019F00093427FF478AF5C4BA3630223E36300233D +:101A0000C3E794F84630012B7FF46DAFB4F84C3047 +:101A100023F00203C4E90E55A4F84C30256478E79E +:101A2000B4F84430B3F5A06F0ED194F8463084F882 +:101A30004E30204600F0A2FF63681B6813B10121FD +:101A400020469847032323700023C4E90E339CE704 +:101A500004F14F03A3630123C3E72378042B10D1C0 +:101A6000302383F311882046FFF7C4FE85F31188E5 +:101A70000321636884F84F5021701B680BB1204626 +:101A8000984794F84630002BDED084F84F3004237A +:101A9000237063681B68002BD6D00221204698472C +:101AA000D2E794F848301D0603F00F0120460AD50E +:101AB00001F010F8012804D002287FF414AF2B4B5A +:101AC0009AE72B4B98E700F0F7FFF3E794F84630DE +:101AD000002B7FF408AF94F8483013F00F01B3D017 +:101AE0001A06204602D501F0C3FAADE701F0B6FAB6 +:101AF000AAE794F84630002B7FF4F5AE94F848300E +:101B000013F00F01A0D01B06204602D501F09CFA6D +:101B10009AE701F08FFA97E7142284F8342083F3D0 +:101B200011882B462A4629462046FFF76DFE85F38D +:101B30001188E9E65DB1152284F8342083F3118819 +:101B40000021D4E90E232046FFF75EFEFDE60B22BE +:101B500084F8342083F311882B462A4629462046F0 +:101B6000FFF764FEE3E700BFD43B0008CC3B00086E +:101B7000D03B000838B590F834300446002B3ED0F6 +:101B8000063BDAB20F2A34D80F2B32D8DFE803F045 +:101B9000373131082232313131313131313137375A +:101BA000C56BB0F84A309D4214D2C3681B8AB5FB9E +:101BB000F3F203FB12556DB9302383F311882B46E2 +:101BC0002A462946FFF732FE85F311880A2384F856 +:101BD00034300EE0142384F83430302383F311883A +:101BE00000231A4619462046FFF70EFE002383F312 +:101BF000118838BD036C03B198470023E7E7002143 +:101C0000204601F021FA0021204601F013FA636812 +:101C10001B6813B10621204698470623D7E700002A +:101C200010B590F83430142B044629D017D8062B61 +:101C300005D001D81BB110BD093B022BFBD80021F8 +:101C4000204601F001FA0021204601F0F3F9636813 +:101C50001B6813B1062120469847062319E0152B6F +:101C6000E9D10B2380F83430302383F3118800232B +:101C70001A461946FFF7DAFD002383F31188DAE7E5 +:101C8000C3689B695B68002BD5D1036C03B198478F +:101C9000002384F83430CEE700230375826803699B +:101CA0001B6899689142FBD25A68036042601060D9 +:101CB0005860704700230375826803691B68996840 +:101CC0009142FBD85A6803604260106058607047C8 +:101CD00008B50846302383F311880B7D032B05D00C +:101CE000042B0DD02BB983F3118808BD8B6900221A +:101CF0001A604FF0FF338361FFF7CEFF0023F2E756 +:101D0000D1E9003213605A60F3E70000FFF7C4BF67 +:101D1000054BD9680875186802681A60536001227B +:101D20000275D860FEF7EEBA2826002030B50C4BBD +:101D3000DD684B1C87B004460FD02B46094A684625 +:101D400000F04EF92046FFF7E3FF009B13B1684611 +:101D500000F050F9A86907B030BDFFF7D9FFF9E7E7 +:101D600028260020D11C0008044B1A68DB68906804 +:101D70009B68984294BF00200120704728260020CD +:101D8000084B10B51C68D86822681A60536001229D +:101D90002275DC60FFF78EFF01462046BDE810404B +:101DA000FEF7B0BA2826002038B5074C0749084886 +:101DB000012300252370656001F064FB022323707A +:101DC00085F3118838BD00BF90280020DC3B000857 +:101DD0002826002000F044B9034A516853685B1A72 +:101DE0009842FBD8704700BF001000E08B600223D0 +:101DF00008618B82084670478368A3F1840243F828 +:101E0000142C026943F8442C426943F8402C094AD7 +:101E100043F8242CC26843F8182C022203F80C2C37 +:101E2000002203F80B2C044A43F8102CA3F12000E5 +:101E3000704700BF1D0300082826002008B5FFF7E3 +:101E4000DBFFBDE80840FFF761BF0000024BDB6825 +:101E500098610F20FFF75CBF28260020302383F312 +:101E60001188FFF7F3BF000008B50146302383F364 +:101E700011880820FFF75AFF002383F3118808BD5B +:101E8000064BDB6839B1426818605A6013604360E2 +:101E90000420FFF74BBF4FF0FF307047282600208B +:101EA0000368984206D01A6802605060996118462B +:101EB000FFF72CBF7047000038B504460D46206878 +:101EC000844200D138BD036823605C608561FFF700 +:101ED0001DFFF4E710B503689C68A2420CD85C684B +:101EE0008A600B604C602160596099688A1A9A6018 +:101EF0004FF0FF33836010BD1B68121BECE700003E +:101F00000A2938BF0A2170B504460D460A26601911 +:101F100001F0B0FA01F098FA041BA54203D8751C31 +:101F20002E460446F3E70A2E04D9BDE8704001208E +:101F300001F0E8BA70BD0000F8B5144B0D46D96148 +:101F400003F1100141600A2A1969826038BF0A2230 +:101F5000016048601861A818144601F07BFA0A274E +:101F600001F072FA431BA342064606D37C1C2819D3 +:101F700001F080FA27463546F2E70A2F04D9BDE87A +:101F8000F840012001F0BEBAF8BD00BF28260020AD +:101F9000F8B506460D4601F057FA0F4A134653F8B6 +:101FA000107F9F4206D12A4601463046BDE8F840E0 +:101FB000FFF7C2BFD169BB68441A2C1928BF2C4651 +:101FC000A34202D92946FFF79BFF22463146034828 +:101FD000BDE8F840FFF77EBF282600203826002005 +:101FE00010B4C0E9032300235DF8044B4361FFF7FD +:101FF000CFBF000010B5194C236998420DD0D0E92D +:102000000032816813605A609A680A449A6000231B +:1020100003604FF0FF33A36110BD2346026843F80D +:10202000102F53600022026022699A4203D1BDE85A +:10203000104001F019BA936881680B44936001F075 +:1020400003FA2269E1699268441AA242E4D9114470 +:10205000BDE81040091AFFF753BF00BF2826002033 +:102060002DE9F047DFF8BC8008F110072C4ED8F8B6 +:10207000105001F0E9F9D8F81C40AA68031B9A42F5 +:102080003ED81444D5E900324FF00009C8F81C408E +:1020900013605A60C5F80090D8F81030B34201D1EF +:1020A00001F0E2F989F31188D5E903312846984710 +:1020B000302383F311886B69002BD8D001F0C4F969 +:1020C0006A69A0EB04094A4582460DD2022001F05C +:1020D00019FA0022D8F81030B34208D151462846E8 +:1020E000BDE8F047FFF728BF121A2244F2E712EBCF +:1020F000090938BF4A4629463846FFF7EBFEB5E7DF +:10210000D8F81030B34208D01444211AC8F81C0083 +:10211000A960BDE8F047FFF7F3BEBDE8F08700BF58 +:10212000382600202826002000207047FEE7000007 +:10213000704700004FF0FF307047000002290CD0BC +:10214000032904D00129074818BF00207047032A3B +:1021500005D8054800EBC2007047044870470020CE +:10216000704700BFB83C00082C2200206C3C0008DF +:1021700070B59AB00546084601A9144600F0C2F8A9 +:1021800001A8FEF7BDFD431C5B00C5E90034002239 +:10219000237003236370C6B201AB02341046D1B280 +:1021A0008E4204F1020401D81AB070BD13F8011B6D +:1021B00004F8021C04F8010C0132F0E708B53023E2 +:1021C00083F311880348FFF759FA002383F311883A +:1021D00008BD00BF9828002090F8443003F01F028B +:1021E000012A07D190F845200B2A03D10023C0E92A +:1021F0000E3315E003F06003202B08D1B0F848300F +:102200002BB990F84520212A03D81F2A04D8FFF7BC +:1022100017BA222AEBD0FAE7034A82630722C26385 +:1022200003640120704700BF2322002007B5052961 +:1022300017D8DFE801F0191603191920302383F3AA +:102240001188104A01900121FFF7BAFA01980E4A4D +:102250000221FFF7B5FA0D48FFF7DCF9002383F3FD +:10226000118803B05DF804FB302383F3118807481D +:10227000FFF7A6F9F2E7302383F311880348FFF74D +:10228000BDF9EBE70C3C0008303C00089828002022 +:1022900038B50C4D0C4C0D492A4604F10800FFF7E7 +:1022A00067FF05F1CA0204F110000949FFF760FF5A +:1022B00005F5CA7204F118000649BDE83840FFF779 +:1022C00057BF00BF602D00202C220020E83B0008F3 +:1022D000F53B0008003C000870B5044608460D4672 +:1022E000FEF70EFDC6B22046013403780BB918463E +:1022F00070BD32462946FEF7EFFC0028F3D10120DD +:10230000F6E700002DE9F84F05460C46FEF7F8FC0D +:102310002949C6B22846FFF7DFFF08B10136F6B2F9 +:1023200026492846FFF7D8FF08B11036F6B2632ECB +:102330000DD8DFF88490DFF884A0214FDFF888B053 +:10234000DFF888802E7846B92670BDE8F88F2946D8 +:102350002046BDE8F84F01F0CFBB252E28D107223B +:1023600049462846FEF7B8FC40B9D8F8003023604B +:10237000D8F80430636007350834E3E70822514693 +:102380002846FEF7A9FC98B90E4BA21C197809093A +:102390000232C95D02F8041C13F8011B01F00F01A1 +:1023A0005B45C95D02F8031CF0D118340835C9E754 +:1023B00004F8016B0135C5E7D83C0008003C000873 +:1023C000E93C0008107AFF1F1C7AFF1FE03C000860 +:1023D000BFF34F8F024AD368DB03FCD4704700BFC2 +:1023E000003C024008B5094B1B7873B9FFF7F0FFBA +:1023F000074B1A69002ABFBF064A5A6002F18832A9 +:102400005A601A6822F480621A6008BDBE2F00204C +:10241000003C02402301674508B50B4B1B7893B97C +:10242000FFF7D6FF094B1A6942F000421A611A6899 +:1024300042F480521A601A6822F480521A601A68B4 +:1024400042F480621A6008BDBE2F0020003C0240AA +:102450001728F0B516D80C4C0C4923787BB90C4DD5 +:102460000E4618234FF0006255F8047B46F8042B03 +:10247000013B13F0FF033A44F6D10123237051F8D6 +:102480002000F0BD0020FCE720300020C02F0020FD +:10249000FC3C0008014B53F820007047FC3C00084E +:1024A00018207047172810B5044601D9002010BD28 +:1024B000FFF7CEFF064B53F824301844C21A0BB96D +:1024C0000120F4E712680132F0D1043BF6E700BFC7 +:1024D000FC3C0008172838B5044628D81549FFF7F2 +:1024E00077FFFFF77FFFF323CB600C23B0FBF3F202 +:1024F00003FB1205D30143EAC503DBB243F40073C7 +:1025000043F002030B610B6943F480330B61FFF767 +:102510005FFFFFF79DFF084B53F8241000F0DAF837 +:10252000FFF77AFF2046BDE83840FFF7BBBF002029 +:1025300038BD00BF003C0240FC3C0008F8B512F07A +:102540000103144642D18218B2F1026F57D82D4BC5 +:102550001B6813F0010352D02B4DFFF743FFF32309 +:10256000EB60FFF735FF40F20127032C15D824F06C +:1025700001046618244C401A40F20117B142236945 +:1025800000EB010524D123F001032361FFF744FF91 +:102590000120F8BD043C0430E7E78307E7D12B694D +:1025A00023F440732B612B693B432B6151F8046B7F +:1025B0000660BFF34F8FFFF70BFF03689E42E9D021 +:1025C0002B6923F001032B61FFF726FF0020E0E7D2 +:1025D00023F44073236123693B4323610B882B80E1 +:1025E000BFF34F8FFFF7F4FE2D8831F8023BADB2F9 +:1025F000AB42C3D0236923F001032361E4E718460B +:10260000C7E700BF00380240003C0240084908B557 +:102610000B7828B11BB9FFF7E5FE01230B7008BD4D +:10262000002BFCD0BDE808400870FFF7F5BE00BFE6 +:10263000BE2F002010B50244064BD2B2904200D10A +:1026400010BD441C00B253F8200041F8040BE0B266 +:10265000F4E700BF502800400F4B30B51C6F240436 +:1026600007D41C6F44F400741C671C6F44F40044CE +:102670001C670A4C236843F4807323600244084BB0 +:10268000D2B2904200D130BD441C00B251F8045B7C +:1026900043F82050E0B2F4E70038024000700040F8 +:1026A0005028004007B5012201A90020FFF7C2FF12 +:1026B000019803B05DF804FB13B50446FFF7F2FF81 +:1026C000A04205D0012201A900200194FFF7C4FF18 +:1026D00002B010BD70470000094B5A88B2F5805F08 +:1026E00010460BD022F0020341F20102934205D0C2 +:1026F00041F20703C31A58425841704701207047FE +:10270000002004E0034B1A681AB9034AD2F874286F +:102710001A607047243000200030024008B5FFF7EF +:10272000F1FF024B1868C0F3407008BD2430002050 +:1027300070470000FEE700000A4B0B480B4A90422E +:102740000BD30B4BDA1C121AC11E22F003028B4270 +:1027500038BF00220021FEF7DBBA53F8041B40F813 +:10276000041BECE7E43E000820310020203100206B +:102770002031002070B5D0E915439E6800224FF04B +:10278000FF3504EB42135101D3F800090028BEBF06 +:10279000D3F8000940F08040C3F80009D3F8000BDB +:1027A0000028BEBFD3F8000B40F08040C3F8000BF8 +:1027B000013263189642C3F80859C3F8085BE0D2A7 +:1027C0004FF00113C4F81C3870BD0000890141F0BE +:1027D0002001016103699B06FCD41220FFF7FCBABB +:1027E00010B5054C2046FEF7CBFF4FF0A0436365C4 +:1027F000024BA36510BD00BF28300020803D0008BB +:1028000070B50378012B054650D12A4B446D984290 +:102810001BD1294B5A6B42F080025A635A6D42F029 +:1028200080025A655A6D5A6942F080025A615A69AB +:1028300022F080025A610E2143205B6900F022FCE5 +:102840001E4BE3601E4BC4F800380023C4F8003E62 +:10285000C02323606E6D4FF45023A3633369002BB4 +:10286000FCDA012333610C20FFF7B6FA3369DB078A +:10287000FCD41220FFF7B0FA3369002BFCDA0026F3 +:10288000A6602846FFF776FF6B68C4F81068DB681F +:10289000C4F81468C4F81C684BB90A4BA3614FF024 +:1028A000FF336361A36843F00103A36070BD064B6F +:1028B000F4E700BF283000200038024040140040F8 +:1028C00003002002003C30C0083C30C0F8B5446D25 +:1028D000054600212046FFF779FFA96D00234FF040 +:1028E00001128F68C4F834384FF00066C4F81C2811 +:1028F0004FF0FF3004EB431201339F42C2F80069EE +:10290000C2F8006BC2F80809C2F8080BF2D20B68D3 +:102910006A6DEB65636210231361166916F0100689 +:10292000FBD11220FFF758FAD4F8003823F4FE63E5 +:10293000C4F80038A36943F4402343F01003A361B3 +:102940000923C4F81038C4F814380A4BEB604FF070 +:10295000C043C4F8103B084BC4F8003BC4F81069EE +:10296000C4F80039EB6D03F1100243F48013EA65FB +:10297000A362F8BD5C3D000840800010426D90F8F5 +:102980004E10D2F8003823F4FE6343EA0113C2F874 +:10299000003870472DE9F84300EB8103456DDA6894 +:1029A000166806F00306731E022B05EB41130C4656 +:1029B00080460FFA81F94FEA41104FF00001C3F849 +:1029C000101B4FF0010104F1100398BFB60401FA87 +:1029D00003F391698EBF334E06F1805606F500462B +:1029E00000293AD0578A04F15801490137436F5002 +:1029F000D5F81C180B43C5F81C382B180021C3F858 +:102A0000101953690127611EA7409BB3138A928B4B +:102A10009B08012A88BF5343D8F85C20981842EAE3 +:102A2000034301F1400205EB8202C8F85C00214635 +:102A300053602846FFF7CAFE08EB8900C3681B8A6B +:102A400043EA8453483464011E432E51D5F81C38A0 +:102A50001F43C5F81C78BDE8F88305EB4917D7F884 +:102A6000001B21F40041C7F8001BD5F81C1821EA0F +:102A70000303C0E704F13F0305EB83030A4A5A60EE +:102A800028462146FFF7A2FE05EB4910D0F8003991 +:102A900023F40043C0F80039D5F81C3823EA0707AF +:102AA000D7E700BF0080001000040002826D1268AA +:102AB000C265FFF75FBE00005831436D49015B58A6 +:102AC00013F4004004D013F4001F0CBF02200120B7 +:102AD000704700004831436D49015B5813F40040D2 +:102AE00004D013F4001F0CBF022001207047000027 +:102AF00000EB8101CB68196A0B6813604B68536067 +:102B00007047000000EB810330B5DD68AA691368E7 +:102B1000D36019B9402B84BF402313606B8A1468BB +:102B2000426D1C44013CB4FBF3F46343033323F0D4 +:102B3000030302EB411043EAC44343F0C043C0F82F +:102B4000103B2B6803F00303012B09B20ED1D2F81E +:102B5000083802EB411013F4807FD0F8003B14BF1B +:102B600043F0805343F00053C0F8003B02EB4112A6 +:102B7000D2F8003B43F00443C2F8003B30BD0000F4 +:102B80002DE9F041244D6E6D06EB40130446D3F859 +:102B9000087BC3F8087B38070AD5D6F8143819071C +:102BA00006D505EB84032146DB6828465B68984719 +:102BB000FA071FD5D6F81438DB071BD505EB8403BD +:102BC000D968CCB98B69488A5A68B2FBF0F600FB29 +:102BD00016228AB91868DA6890420DD2121AC3E92F +:102BE0000024302383F311880B482146FFF78AFF26 +:102BF00084F31188BDE8F081012303FA04F26B89A4 +:102C000023EA02036B81CB68002BF3D021460248F4 +:102C1000BDE8F041184700BF2830002000EB8103D9 +:102C200070B5DD68436D6C692668E6604A0156BB85 +:102C30001A444FF40020C2F810092A6802F0030277 +:102C4000012A0AB20ED1D3F8080803EB421410F49B +:102C5000807FD4F8000914BF40F0805040F000504D +:102C6000C4F8000903EB4212D2F8000940F0044016 +:102C7000C2F80009D3F83408012202FA01F1014335 +:102C8000C3F8341870BD19B9402E84BF40202060AD +:102C900020682E8A8419013CB4FBF6F440EAC44053 +:102CA00040F000501A44C6E72DE9F8433B4D6E6DE5 +:102CB00006EB40130446D3F80889C3F8088918F0D6 +:102CC000010F4FEA40171AD0D6F81038DB0716D597 +:102CD00005EB8003D9684B691868DA68904230D2F6 +:102CE000121A4FF000091A60C3F80490302383F3DE +:102CF000118821462846FFF791FF89F3118818F0C3 +:102D0000800F1CD0D6F834380126A640334216D0A6 +:102D100005EB84036D6DD3F80CC0DCF8142001348E +:102D2000E4B2D2F800E005EB04342F445168714559 +:102D300015D3D5F8343823EA0606C5F83468BDE85B +:102D4000F883012303FA04F22B8923EA02032B817F +:102D50008B68002BD3D0214628469847CFE7BCF894 +:102D60001000AEEB0103834228BF0346D7F81809D1 +:102D700080B2B3EB800FE2D89068A0F1040959F853 +:102D8000048FC4F80080A0EB09089844B8F1040F40 +:102D9000F5D818440B4490605360C7E728300020F2 +:102DA0002DE9F74FA24C656D6E69AB691E4016F4B4 +:102DB00080586E6107D02046FEF74AFD03B0BDE89B +:102DC000F04F00F04DBC002E12DAD5F8003E9848C6 +:102DD0009B071EBFD5F8003E23F00303C5F8003E55 +:102DE000D5F8043823F00103C5F80438FEF75AFD7E +:102DF000370505D58E48FFF7BDFC8D48FEF740FD31 +:102E0000B0040CD5D5F8083813F0060FEB6823F49E +:102E100070530CBF43F4105343F4A053EB603107DD +:102E20001BD56368DB681BB9AB6923F00803AB6192 +:102E30002378052B0CD1D5F8003E7D489A071EBF9C +:102E4000D5F8003E23F00303C5F8003EFEF72AFD47 +:102E50006368DB680BB176489847F30274D4B70215 +:102E600027D5D4F85490DFF8C8B100274FF0010AF5 +:102E700009EB4712D2F8003B03F44023B3F5802F4F +:102E800011D1D2F8003B002B0DDA62890AFA07F360 +:102E900022EA0303638104EB8703DB68DB6813B179 +:102EA000394658469847A36D01379B68FFB29F4249 +:102EB000DED9F00617D5676D3A6AC2F30A1002F040 +:102EC0000F0302F4F012B2F5802F00F08580B2F506 +:102ED000402F08D104EB83030022DB681B6A07F54F +:102EE000805790426AD13003D5F8184813D5E103D2 +:102EF00002D50020FFF744FEA20302D50120FFF710 +:102F00003FFE630302D50220FFF73AFE270302D5F6 +:102F10000320FFF735FE75037FF550AFE00702D5BC +:102F20000020FFF7C1FEA10702D50120FFF7BCFE7C +:102F3000620702D50220FFF7B7FE23077FF53EAFF9 +:102F40000320FFF7B1FE39E7636DDFF8E4A00193DA +:102F500000274FF00109A36D9B685FFA87FB9B4533 +:102F60003FF67DAF019B03EB4B13D3F8001901F43F +:102F70004021B1F5802F1FD1D3F8001900291BDAA9 +:102F8000D3F8001941F09041C3F80019D3F80019A3 +:102F90000029FBDB5946606DFFF718FC218909FA0F +:102FA0000BF321EA0303238104EB8B03DB689B68AB +:102FB00013B15946504698470137CCE7910708BFEF +:102FC000D7F80080072A98BF03F8018B02F10102AD +:102FD00098BF4FEA182884E7023304EB830207F511 +:102FE00080575268D2F818C0DCF80820DCE9001CD1 +:102FF000A1EB0C0C002188420AD104EB8304636826 +:103000009B699A6802449A605A6802445A606AE767 +:1030100011F0030F08BFD7F800808C4588BF02F875 +:10302000018B01F1010188BF4FEA1828E3E700BFD7 +:1030300028300020436D03EB4111D1F8003B43F4ED +:103040000013C1F8003B7047436D03EB4111D1F809 +:10305000003943F40013C1F800397047436D03EBA6 +:103060004111D1F8003B23F40013C1F8003B704735 +:10307000436D03EB4111D1F8003923F40013C1F87B +:103080000039704700F1604303F561430901C9B29B +:1030900083F80013012200F01F039A4043099B00AC +:1030A00003F1604303F56143C3F880211A60704760 +:1030B00030B5039C0172043304FB0325C0E90653B9 +:1030C000049B03630021059BC160C0E90000C0E9C7 +:1030D0000422C0E90842C0E90A11436330BD000080 +:1030E000416A0022C0E90411C0E90A22C2606FF0FF +:1030F0000101FEF7E1BE0000D0E90432934201D1A4 +:10310000C2680AB9181D704700207047036919602A +:10311000C2680132C260C26913448269036193428A +:1031200024BF436A03610021FEF7BABE38B50446E6 +:103130000D46E3683BB16269131D1268A362134434 +:10314000E362002007E0237A33B929462046FEF7E0 +:1031500097FE0028EDDA38BD6FF00100FBE70000B4 +:10316000C368C269013BC360436913448269436118 +:10317000934224BF436A436100238362036B03B11C +:103180001847704770B53023044683F31188866A68 +:103190003EB9FFF7CBFF054618B186F311882846E4 +:1031A00070BDA36AE26A13F8015BA362934202D383 +:1031B0002046FFF7D5FF002383F31188EFE70000D7 +:1031C0002DE9F84F04460E46174698464FF0300951 +:1031D00089F311880025AA46D4F828B0BBF1000F66 +:1031E00009D141462046FFF7A1FF20B18BF311889A +:1031F0002846BDE8F88FD4E90A12A7EB050B521A4E +:10320000934528BF9346BBF1400F1BD9334601F1CC +:10321000400251F8040B43F8040B9142F9D1A36A20 +:1032200040334036A3624035D4E90A239A4202D3A0 +:103230002046FFF795FF8AF31188BD42D8D289F363 +:103240001188C9E730465A46FDF73CFDA36A5B4446 +:103250005E44A3625D44E7E710B5029C017204334B +:1032600003FB0421C0E906130023C0E90A33039BD2 +:103270000363049BC460C0E90000C0E90422C0E904 +:103280000842436310BD0000026AC260426AC0E99E +:1032900004220022C0E90A226FF00101FEF70CBEF1 +:1032A000D0E904239A4201D1C26822B9184650F8E5 +:1032B000043B0B60704700231846FAE7C368C269F5 +:1032C0000133C3604369134482694361934224BF5D +:1032D000436A43610021FEF7E3BD000038B50446B0 +:1032E0000D46E3683BB123691A1DA262E2691344EB +:1032F000E362002007E0237A33B929462046FEF72F +:10330000BFFD0028EDDA38BD6FF00100FBE70000DB +:1033100003691960C268013AC260C26913448269D4 +:103320000361934224BF436A036100238362036BFA +:1033300003B118477047000070B530230D460446AE +:10334000114683F31188866A2EB9FFF7C7FF10B1C3 +:1033500086F3118870BDA36A1D70A36AE26A013307 +:103360009342A36204D3E16920460439FFF7D0FFFA +:10337000002080F31188EDE72DE9F84F04460D4653 +:10338000904699464FF0300A8AF311880026B346DA +:10339000A76A4FB949462046FFF7A0FF20B187F33F +:1033A00011883046BDE8F88FD4E90A073A1AA8EB2D +:1033B0000607974228BF1746402F1BD905F1400347 +:1033C00055F8042B40F8042B9D42F9D1A36A4033F1 +:1033D000A3624036D4E90A239A4204D3E169204625 +:1033E0000439FFF795FF8BF311884645D9D28AF34C +:1033F0001188CDE729463A46FDF764FCA36A3B44B1 +:103400003D44A3623E44E5E7D0E904239A4217D144 +:10341000C3689BB1836A8BB1043B9B1A0ED01360C7 +:10342000C368013BC360C3691A44836902619A425D +:1034300024BF436A03610023836201231846704757 +:103440000023FBE700F036B9014B586A704700BF14 +:10345000000C0040034B002258631A610222DA601C +:10346000704700BF000C0040014B0022DA6070473B +:10347000000C0040014B5863704700BF000C004037 +:10348000FEE7000070B51B4B01630025044686B0C3 +:10349000586085620E4600F0BFF804F11003C4E9DD +:1034A00004334FF0FF33C4E90635C4E90044A56096 +:1034B000E562FFF7C9FF2B460246C4E9082304F181 +:1034C00034010D4A256580232046FEF78FFC012339 +:1034D000E0600A4A0375009272680192B268CDE911 +:1034E0000223074B6846CDE90435FEF7A7FC06B07A +:1034F00070BD00BF902800208C3D0008913D000861 +:1035000081340008024AD36A1843D062704700BF72 +:10351000282600204B6843608B688360CB68C360BB +:103520000B6943614B6903628B6943620B680360FB +:103530007047000008B5264B26481A6940F2FF1173 +:103540000A431A611A6922F4FF7222F001021A6119 +:103550001A691A6B0A431A631A6D0A431A651E4ADE +:103560001B6D1146FFF7D6FF02F11C0100F58060CC +:10357000FFF7D0FF02F1380100F58060FFF7CAFFC6 +:1035800002F1540100F58060FFF7C4FF02F1700101 +:1035900000F58060FFF7BEFF02F18C0100F580604E +:1035A000FFF7B8FF02F1A80100F58060FFF7B2FF56 +:1035B00002F1C40100F58060FFF7ACFF02F1E00109 +:1035C00000F58060FFF7A6FFBDE8084000F0F0B806 +:1035D0000038024000000240983D000808B500F0A5 +:1035E0006BFAFEF7E1FBFFF78DF8BDE80840FEF748 +:1035F0004FBE000070470000EFF3098305494A6B96 +:1036000022F001024A63683383F30988002383F3BD +:103610001188704700EF00E0302080F3118862B617 +:103620000C4B0D4AD96821F4E0610904090C0A43E6 +:10363000DA60D3F8FC20094942F08072C3F8FC201C +:103640000A6842F001020A602022DA7783F8220039 +:10365000704700BF00ED00E00003FA05001000E035 +:1036600010B5302383F311880E4B5B6813F40063AD +:1036700014D0F1EE103AEFF30984683C4FF08073F8 +:10368000E361094BDB6B236684F30988FEF76CFB6F +:1036900010B1064BA36110BD054BFBE783F3118806 +:1036A000F9E700BF00ED00E000EF00E02F030008A5 +:1036B000320300080E4B1A6C42F008021A641A6EAC +:1036C00042F008021A660B4A1B6E936843F0080327 +:1036D0009360094B53229A624FF0FF32DA62002264 +:1036E0009A615A63DA605A6001225A611A6070471F +:1036F00000380240002004E0000C0040094A08B5F0 +:103700001169D3680B40D9B2C9439B07116107D532 +:10371000302383F31188FEF75DFB002383F31188C8 +:1037200008BD00BF000C00401F4B1A696FEAC2526F +:103730006FEAD2521A611A69C2F308021A614FF095 +:10374000FF301A695A69586100215A6959615A69EA +:103750001A6A62F080521A621A6A02F080521A6281 +:103760001A6A5A6A58625A6A59625A6A1A6C42F05C +:1037700080521A641A6E42F080521A661A6E0B4A10 +:10378000106840F480701060186F00F44070B0F55D +:10379000007F1EBF4FF4803018671967536823F409 +:1037A0000073536000F060B90038024000700040C0 +:1037B000344B4FF080521A64334A4FF44041116049 +:1037C0001A6842F001021A601A689107FCD59A68DB +:1037D00022F003029A602B4B9A6812F00C02FBD184 +:1037E000196801F0F90119609A601A6842F4803290 +:1037F0001A601A689203FCD55A6F42F001025A67A8 +:10380000204B5A6F9007FCD5204A5A601A6842F044 +:1038100080721A601C4A53685904FCD5194B1A6807 +:103820009201FCD51A4A9A600322C3F88C20194BE6 +:103830001A68194B9A42194B21D1194A1168194A31 +:1038400091421CD140F205121A60144A136803F029 +:103850000F03052BFAD10B4B9A6842F002029A60D3 +:103860009A6802F00C02082AFAD15A6C42F480429B +:103870005A645A6E42F480425A665B6E704740F258 +:103880000572E1E70038024000700040185440071C +:1038900000948838002004E011640020003C0240BD +:1038A00000ED00E041C20F41074A08B5536903F03B +:1038B0000103536123B1054A13680BB1506898475F +:1038C000BDE80840FFF7CCBE003C0140A03000201E +:1038D000074A08B5536903F00203536123B1054A4F +:1038E00093680BB1D0689847BDE80840FFF7B8BEB1 +:1038F000003C0140A0300020074A08B5536903F09E +:103900000403536123B1054A13690BB15069984709 +:10391000BDE80840FFF7A4BE003C0140A0300020F5 +:10392000074A08B5536903F00803536123B1054AF8 +:1039300093690BB1D0699847BDE80840FFF790BE86 +:10394000003C0140A0300020074A08B5536903F04D +:103950001003536123B1054A136A0BB1506A9847AB +:10396000BDE80840FFF77CBE003C0140A0300020CD +:10397000164B10B55C6904F478725A61A30604D53D +:10398000134A936A0BB1D06A9847600604D5104A6F +:10399000136B0BB1506B9847210604D50C4A936BFF +:1039A0000BB1D06B9847E20504D5094A136C0BB1F3 +:1039B000506C9847A30504D5054A936C0BB1D06CA5 +:1039C0009847BDE81040FFF74BBE00BF003C0140E8 +:1039D000A0300020194B10B55C6904F47C425A6198 +:1039E000620504D5164A136D0BB1506D9847230537 +:1039F00004D5134A936D0BB1D06D9847E00404D5FC +:103A00000F4A136E0BB1506E9847A10404D50C4AAF +:103A1000936E0BB1D06E9847620404D5084A136FB9 +:103A20000BB1506F9847230404D5054A936F0BB12F +:103A3000D06F9847BDE81040FFF712BE003C014030 +:103A4000A030002008B50348FDF79CFABDE8084007 +:103A5000FFF706BEBC23002008B5FFF74FFEBDE808 +:103A60000840FFF7FDBD0000062108B50846FFF736 +:103A700009FB06210720FFF705FB06210820FFF7B9 +:103A800001FB06210920FFF7FDFA06210A20FFF7B6 +:103A9000F9FA06211720FFF7F5FA06212820FFF78B +:103AA000F1FA07213220FFF7EDFABDE808400C21BA +:103AB0002620FFF7E7BA000008B5FFF735FE00F053 +:103AC0000DF8FDF773FCFDF759FEFDF731FDFFF72B +:103AD00091FDBDE80840FFF7B5BC00000023054A92 +:103AE00019460133102BC2E9001102F10802F8D186 +:103AF000704700BFA0300020034611F8012B03F8E7 +:103B0000012B002AF9D1704753544D3332463F3FC1 +:103B10003F0053544D3332463430780053544D33C4 +:103B200032463432780053544D33324634343658AA +:103B300058000000012033000010410001105A001D +:103B4000031059000710310000000000083B000876 +:103B500013040000123B0008190400001C3B00087D +:103B600021040000263B0008009600000000000031 +:103B70000000000000000000000000000000000045 +:103B80006D130008591300089513000881130008ED +:103B90008D130008791300086513000851130008FD +:103BA000A113000800000000AD14000899140008DB +:103BB000D5140008C1140008CD140008B914000879 +:103BC000A514000891140008E1140008000000008A +:103BD000010000000000000063300000D83B000836 +:103BE00080260020902800204865782F50726F664C +:103BF00069434E430025424F415244252D424C001B +:103C00002553455249414C250000000002000000A8 +:103C100000000000C91600083517000840004000E9 +:103C2000302D0020402D0020020000000000000088 +:103C300003000000000000007917000800000000E9 +:103C400010000000502D00200000000001000000C6 +:103C50000000000028300020010102002D22000891 +:103C60003D210008D9210008BD21000843000000C3 +:103C7000743C000809024300020100C0320904003C +:103C800000010202010005240010010524010001C9 +:103C9000042402020524060001070582030800FF30 +:103CA00009040100020A00000007050102400000AB +:103CB000070581024000000012000000C03C00081F +:103CC0001201100102000040AE2D0110000201029D +:103CD000030100000403090425424F41524425001A +:103CE00043756265536F6C6F003031323334353653 +:103CF0003738394142434445460000000040000047 +:103D000000400000004000000040000000000100F2 +:103D1000000002000000020000000200000002009B +:103D2000000002000000020000000200004000004D +:103D300000400000004000000040000000000100C2 +:103D4000000002000000020000000200000002006B +:103D5000000002000000020000000200000000005D +:103D6000BD180008751B0008211C00084000400019 +:103D700088300020883000200100000098300020AA +:103D80008000000040010000030000006D61696ECA +:103D90000069646C650000000000812A00020000D8 +:103DA000AAAAAAAA00000024FFFF00000000000049 +:103DB00000A00A000000000000000000AAAAAAAAB1 +:103DC00000000000FFFF00000000000000000000F5 +:103DD0001400005400000000AAAAAAAA140000546B +:103DE000FFFF0000000000000000000080691000DC +:103DF00000000000AAAA8AAA40561000FFFF000097 +:103E00000070700700000000400100010000000089 +:103E1000AAAAAAAA00010000F7FF00000000000003 +:103E2000000000000000000000000000AAAAAAAAEA +:103E300000000000FFFF0000000000000000000084 +:103E40000000000000000000AAAAAAAA00000000CA +:103E5000FFFF000000000000000000000000000064 +:103E6000000000000A000000000000000300000045 +:103E70000000000000000000000000000000000042 +:103E80000000000000000000000000000000000032 +:103E90000000000000000000090000000000000019 +:103EA00000C01F0000000000FF0000009828002054 +:103EB000BC230020009600000000080096000000CF +:103EC0000008000004000000D43C000800000000CE +:103ED00000000000000000000000000000000000E2 +:043EE00000000000DE :00000001FF diff --git a/Tools/bootloaders/CubeYellow-bdshot_bl.bin b/Tools/bootloaders/CubeYellow-bdshot_bl.bin index d0e5fb604a..b21c17fb95 100755 Binary files a/Tools/bootloaders/CubeYellow-bdshot_bl.bin and b/Tools/bootloaders/CubeYellow-bdshot_bl.bin differ diff --git a/Tools/bootloaders/CubeYellow-bdshot_bl.hex b/Tools/bootloaders/CubeYellow-bdshot_bl.hex index 2ddca5245c..2a7ebae909 100644 --- a/Tools/bootloaders/CubeYellow-bdshot_bl.hex +++ b/Tools/bootloaders/CubeYellow-bdshot_bl.hex @@ -1,29 +1,29 @@ :020000040800F2 -:100000000006022001020008850F0008050F000805 -:100010005D0F0008050F0008310F000803020008FB -:10002000030200080302000803020008ED2800088C +:1000000000060220010200080302000803020008A3 +:1000100003020008030200080302000803020008AC +:100020000302000803020008030200084938000820 :10003000030200080302000803020008030200088C :10004000030200080302000803020008030200087C -:100050000302000803020008513A0008793A000838 -:10006000A13A0008C93A0008F13A00080302000862 +:100050000302000803020008ED3A0008153B0008FF +:100060003D3B0008653B00088D3B0008030200088B :10007000030200080302000803020008030200084C :10008000030200080302000803020008030200083C -:10009000030200080302000803020008193B0008DD +:10009000030200080302000803020008B53B000841 :1000A000030200080302000803020008030200081C -:1000B000293C0008030200080302000803020008AC +:1000B000C53C000803020008030200080302000810 :1000C00003020008030200080302000803020008FC -:1000D0000302000803020008ED3B0008013C000891 -:1000E0007D3B000803020008030200080302000829 +:1000D0000302000803020008893C00089D3C000858 +:1000E000193C00080302000803020008030200088C :1000F00003020008030200080302000803020008CC :1001000003020008030200080302000803020008BB :1001100003020008030200080302000803020008AB :10012000030200080302000803020008030200089B :10013000030200080302000803020008030200088B -:10014000030200080302000803020008A1300008AF +:10014000030200080302000803020008C12F000890 :10015000030200080302000803020008030200086B :10016000030200080302000803020008030200085B :10017000030200080302000803020008030200084B -:100180000302000803020008153C000803020008EF +:100180000302000803020008B13C00080302000853 :10019000030200080302000803020008030200082B :1001A000030200080302000803020008030200081B :1001B000030200080302000803020008030200080B @@ -31,1010 +31,1018 @@ :1001D00003020008030200080302000803020008EB :1001E00003020008030200080302000803020008DB :1001F00003020008030200080302000803020008CB -:1002000002E000F000F8FEE772B63A4880F3088892 -:10021000394880F3098839484EF60851CEF200017A -:10022000086040F20000CCF200004EF63471CEF2CD -:1002300000010860BFF34F8FBFF36F8F40F20000E3 -:10024000C0F2F0004EF68851CEF200010860BFF314 -:100250004F8FBFF36F8F4FF00000E1EE100A4EF6A4 -:100260003C71CEF200010860062080F31488BFF3D1 -:100270006F8F02F0F9FB02F09BFB03F08BFA4FF05B -:1002800055301F491B4A91423CBF41F8040BFAE725 -:100290001C49194A91423CBF41F8040BFAE71A493C -:1002A0001A4A1B4B9A423EBF51F8040B42F8040B0A -:1002B000F8E700201749184A91423CBF41F8040B67 -:1002C000FAE702F0B3FB03F0C5FA144C144DAC424C -:1002D00003DA54F8041B8847F9E700F041F8114CA1 -:1002E000114DAC4203DA54F8041B8847F9E702F0D9 -:1002F0009BBB000000060220002202200000000834 -:1003000000000220000602207040000800220220A7 -:1003100068220220682202205039022000020008D0 -:100320000002000800020008000200082DE9F04F5A -:100330002DED108AC1F80CD0D0F80CD0BDEC108A8D -:10034000BDE8F08F002383F311882846A0470020E2 -:1003500001F0D6FEFEE701F051FE00DFFEE70000EF -:1003600038B502F0ABFA40B1174B6FF07F010022B5 -:1003700059720E211A729972DA7202F075FA0546F4 -:1003800002F0AAFA0446D0B9104B9D4219D00133AD -:100390009D4241F2883512BF044600250124002009 -:1003A00002F06CFA0CB100F079F800F04DFD00F0AD -:1003B00007FC284600F0FCF800F070F8F9E700258B -:1003C000EDE70546EBE700BF00220220010007B081 -:1003D00008B500F0C1FBA0F120035842584108BD08 -:1003E00007B541F21203022101A8ADF8043000F074 -:1003F000D1FB03B05DF804FB38B5202383F31188EB -:100400001748C3680BB101F001FF0023154A4FF4F0 -:100410007A71134801F0BEFE002383F31188124C59 -:10042000236813B12368013B2360636813B16368D9 -:10043000013B63600D4D2B7833B963687BB90220B3 -:1004400000F084FC322363602B78032B07D16368B0 -:100450002BB9022000F07AFC4FF47A73636038BD48 -:1004600068220220F9030008842302207C22022053 -:10047000084B187003280CD8DFE800F008050208C4 -:10048000022000F061BC022000F05CBC024B0022A4 -:100490005A6070477C22022084230220F8B53F4B2B -:1004A0003F4A1C461968013177D004339342F9D191 -:1004B0006268A24271D33B4B9B6803F1006303F572 -:1004C000C0339A4269D2002000F094FB0220FFF76B -:1004D000CFFF354B00211A6C19641A6E19661A6E1B -:1004E0005A6C59645A6E59665A6E5A6942F08002C3 -:1004F0005A615A6922F080025A615A691A6942F0B7 -:1005000000521A611A6922F000521A611B6972B610 -:100510004FF0E023C3F8084DD4E90004BFF34F8F38 -:10052000BFF36F8F214AC2F88410BFF34F8F536916 -:1005300023F480335361BFF34F8FD2F8803043F6FA -:10054000E076C3F3C905C3F34E335B0103EA060C3F -:1005500029464CEA81770139C2F87472F9D2203BFE -:1005600013F1200FF2D1BFF34F8FBFF36F8FBFF3A3 -:100570004F8FBFF36F8F536923F400335361002310 -:10058000C2F85032BFF34F8FBFF36F8F202383F336 -:100590001188854680F308882047F8BD008001084F -:1005A00020800108002202200038024000ED00E017 -:1005B0002DE9F04F93B0B44B2022FF2100900AA800 -:1005C0009D6800F0EBFBB14A1378A3B90121B04854 -:1005D0001170C360202383F31188C3680BB101F04D -:1005E00015FE0023AB4A4FF47A71A94801F0D2FD01 -:1005F000002383F31188009B13B1A74B009A1A6064 -:10060000A64A1378032B03D000231370A24A536029 -:100610004FF0000A009CD3465646D146012000F018 -:1006200093FB24B19C4B1B68002B00F0268200201A -:1006300000F092FA0390039B002BF2DB012000F004 -:1006400081FB039B213B1F2BE8D801A252F823F02A -:10065000D1060008F90600088D0700081D060008ED -:100660001D0600081D0600081F080008EF09000805 -:10067000090900086B09000893090008B909000876 -:100680001D060008CB0900081D0600083D0A0008E9 -:10069000710700081D060008810A0008DD06000831 -:1006A000710700081D0600086B0900081D060008F8 -:1006B0001D0600081D0600081D0600081D0600088E -:1006C0001D0600081D0600081D0600088D0700080D -:1006D0000220FFF77DFE002840F0F981009B0221F7 -:1006E00005A8BAF1000F08BF1C4641F21233ADF85D -:1006F000143000F04FFA91E74FF47A7000F02CFAC2 -:10070000071EEBDB0220FFF763FE0028E6D0013F67 -:10071000052F00F2DE81DFE807F0030A0D10133623 -:100720000523042105A8059300F034FA17E00421FD -:100730005548F9E704215A48F6E704215948F3E7F8 -:100740004FF01C08404608F1040800F055FA042157 -:10075000059005A800F01EFAB8F12C0FF2D1012087 -:100760004FF0000900FA07F747EA0B0B5FFA8BFB23 -:1007700000F060FB26B10BF00B030B2B08BF00242D -:10078000FFF72EFE4AE704214748CDE7002EA5D00B -:100790000BF00B030B2BA1D10220FFF719FE07462C -:1007A00000289BD00120002600F024FA0220FFF749 -:1007B0005FFE5FFA86F8404600F02CFA0446B0B1BE -:1007C000039940460136A1F140025142514100F0E7 -:1007D00031FA0028EDD1BA46044641F21213022143 -:1007E00005A83E46ADF8143000F0D4F916E72546CA -:1007F0000120FFF73DFE244B9B68AB4207D92846FA -:1008000000F0FAF9013040F067810435F3E7002584 -:10081000224BBA463E461D701F4B5D60A8E7002E76 -:100820003FF45CAF0BF00B030B2B7FF457AF0220B0 -:10083000FFF71EFE322000F08FF9B0F10008FFF63E -:100840004DAF18F003077FF449AF0F4A08EB0503DB -:10085000926893423FF642AFB8F5807F3FF73EAFD4 -:10086000124BB845019323DD4FF47A7000F074F910 -:100870000390039A002AFFF631AF039A0137019BD8 -:1008800003F8012BEDE700BF0022022080230220A5 -:1008900068220220F9030008842302207C2202201F -:1008A00004220220082202200C22022080220220A0 -:1008B000C820FFF78DFD074600283FF40FAF1F2D1E -:1008C00011D8C5F120020AAB25F003008449424546 -:1008D000184428BF4246019200F03AFA019AFF21DB -:1008E0007F4800F05BFA4FEAA803C8F387027C490F -:1008F0002846019300F05AFA064600283FF46DAFEF -:10090000019B05EB830533E70220FFF761FD00281B -:100910003FF4E4AE00F0BAF900283FF4DFAE002760 -:10092000B846704B9B68BB4218D91F2F11D80A9B41 -:1009300001330ED027F0030312AA134453F8203CCE -:1009400005934046042205A9043700F01DFB8046AC -:10095000E7E7384600F050F90590F2E7CDF814804B -:10096000042105A800F016F902E70023642104A879 -:10097000049300F005F900287FF4B0AE0220FFF7E1 -:1009800027FD00283FF4AAAE049800F067F905900F -:10099000E6E70023642104A8049300F0F1F800289E -:1009A0007FF49CAE0220FFF713FD00283FF496AEC3 -:1009B000049800F063F9EAE70220FFF709FD002838 -:1009C0003FF48CAE00F072F9E1E70220FFF700FD82 -:1009D00000283FF483AE05A9142000F06DF9074606 -:1009E0000421049004A800F0D5F83946B9E7322074 -:1009F00000F0B2F8071EFFF671AEBB077FF46EAED3 -:100A0000384A07EB0903926893423FF667AE02202B -:100A1000FFF7DEFC00283FF461AE27F003074F44E8 -:100A2000B9453FF4A5AE484609F1040900F0E4F8E1 -:100A30000421059005A800F0ADF8F1E74FF47A70B5 -:100A4000FFF7C6FC00283FF449AE00F01FF900286C -:100A500044D00A9B01330BD008220AA9002000F0E1 -:100A6000A5F900283AD02022FF210AA800F096F923 -:100A7000FFF7B6FC1C4801F049FB13B0BDE8F08F4E -:100A8000002E3FF42BAE0BF00B030B2B7FF426AEA6 -:100A90000023642105A8059300F072F8074600289A -:100AA0007FF41CAE0220FFF793FC804600283FF441 -:100AB00015AEFFF795FC41F2883001F027FB059851 -:100AC00000F000FA46463C4600F0B4F9A6E50646BA -:100AD0004EE64FF0000901E6BA467EE637467CE670 -:100AE0008022022000220220A08601002DE9F84F7A -:100AF0004FF47A7306460D46002402FB03F7DFF835 -:100B00005080DFF8509098F900305FFA84FA5A1C50 -:100B100001D0A34210D159F824002A463146036877 -:100B2000D3F820B03B46D847854205D1074B01207A -:100B300083F800A0BDE8F88F0134042CE3D14FF412 -:100B4000FA7001F0E3FA0020F4E700BFD02302209E -:100B500010220220143D0008002307B5024601219F -:100B60000DF107008DF80730FFF7C0FF20B19DF8A9 -:100B7000070003B05DF804FB4FF0FF30F9E7000019 -:100B80000A46042108B5FFF7B1FF80F00100C0B2AA -:100B9000404208BD074B0A4630B41978064B53F85B -:100BA0002140014623682046DD69044BAC4630BC39 -:100BB000604700BFD0230220143D0008A08601003A -:100BC00070B50A4E00240A4D01F040FD30802868BF -:100BD0003388834208D901F033FD2B680444013384 -:100BE000B4F5C03F2B60F2D370BD00BFD22302200A -:100BF0008C23022001F0ECBD00F1006000F5C03054 -:100C00000068704700F10060920000F5C03001F00C -:100C10006BBD0000054B1A68054B1B889B1A83426D -:100C200002D9104401F00CBD002070478C23022033 -:100C3000D223022038B50446074D29B12868204444 -:100C4000BDE8384001F01CBD2868204401F000FDDB -:100C50000028F3D038BD00BF8C23022010F003031E -:100C600009D1B0F5846F04D200F10050A0F57120D5 -:100C70000368184670470023FBE7000000F10050AE -:100C8000A0F57120D0F8200470470000064991F8C3 -:100C9000243033B100230822086A81F82430FFF79A -:100CA000B1BF0120704700BF90230220014B18689C -:100CB000704700BF002004E0204B0246F0B51868E2 -:100CC0001F4BC0F30B06000C1F885D68BE4293F9F2 -:100CD000084022D09F89BE4221D01F8BBE4206D140 -:100CE00002240C2505FB04335D6893F90840B0F538 -:100CF000805F16D041F20103984208BF5A24013A9E -:100D0000013D0B460A4493420DD215F9016F581C60 -:100D10005EB1034600F8016CF5E70024E1E7012429 -:100D2000DFE74124EBE7184605E02C2590421D70D3 -:100D300001D2981C5C70401AF0BD00BF002004E096 -:100D40001422022070470000704700007047000026 -:100D5000002310B5934203D0CC5CC4540133F9E7AF -:100D600010BD0000013810B510F9013F3BB191F9F9 -:100D700000409C4203D11AB10131013AF4E71AB1A3 -:100D800091F90020981A10BD1046FCE70346024670 -:100D9000D01A12F9011B0029FAD170470244034608 -:100DA000934202D003F8011BFAE770472DE9F8439C -:100DB0001F4D14460746884695F8242052BBDFF89D -:100DC00070909CB395F824302BB92022FF2148461F -:100DD0002F62FFF7E3FF95F824004146C0F10802B7 -:100DE00005EB8000A24228BF2246D6B29200FFF750 -:100DF000AFFF95F82430A41B17441E449044E4B27E -:100E0000F6B2082E85F82460DBD1FFF73FFF0028FB -:100E1000D7D108E02B6A03EB82038342CFD0FFF7E0 -:100E200035FF0028CBD10020BDE8F8830120FBE787 -:100E300090230220024B1A78024B1A70704700BFB1 -:100E4000D023022010220220F8B5184C184800F0D8 -:100E50006BFC2146164800F093FC24681548E26EAE -:100E6000154ED2F80438154D43F00203104FC2F866 -:100E7000043801F04BF92046114900F089FDE26E7B -:100E80000424D2F8043823F00203C2F804384FF4E3 -:100E9000E133336055F8040BB84202D0314600F01C -:100EA000A3FB013C14F0FF04F4D1F8BD2C3E000874 -:100EB000D02C022040420F00B8230220143D00082D -:100EC000343E000838B50B4B04461A780A4B53F8E9 -:100ED00022500A4B9D420CD0094B00211822184683 -:100EE000FFF75CFF046001462846BDE8384000F08B -:100EF0007BBB38BDD0230220143D0008D02C02203B -:100F0000B823022000B59BB0EFF309816822684640 -:100F1000FFF71EFFEFF30583044B9A6BDA6A9A6AB8 -:100F20009A6A9A6A9A6A9A6A9B6AFEE700ED00E0FA -:100F300000B59BB0EFF3098168226846FFF708FF10 -:100F4000EFF30583044B9A6B9A6A9A6A9A6A9A6AD3 -:100F50009A6A9B6AFEE700BF00ED00E000B59BB017 -:100F6000EFF3098168226846FFF7F2FEEFF305838D -:100F7000034B5A6B9A6A9A6A9A6A9A6A9B6AFEE764 -:100F800000ED00E0FEE7000030B50A44084D914254 -:100F90000DD011F8013B5840082340F30004013BF9 -:100FA0002C4013F0FF0384EA5000F6D1EFE730BD88 -:100FB0002083B8ED026843681143016003B118470C -:100FC00070470000024A136843F0C0031360704783 -:100FD00000440040024A136843F0C00313607047A6 -:100FE00000480040024A136843F0C0031360704792 -:100FF0000078004037B5274C274D204600F0E8FA2E -:1010000004F11400009400234FF48072234900F08F -:10101000A9F94FF48072224904F138000094214B61 -:1010200000F022FA204BC4E91735204C204600F08E -:10103000CFFA04F11400009400234FF480721C498D -:1010400000F090F94FF480721A4904F138000094CE -:10105000194B00F009FA194BC4E91735184C204612 -:1010600000F0B6FA04F1140000234FF48072154921 -:10107000009400F077F9144B4FF48072134904F197 -:101080003800009400F0F0F9114BC4E9173503B0B3 -:1010900030BD00BFD423022080F937031825022079 -:1010A00018280220C50F00080044004040240220F8 -:1010B0001826022018290220D50F000800480040F9 -:1010C000AC24022018270220E50F0008182A02206D -:1010D00000780040037C30B52E4C002918BF0C4628 -:1010E000012B13D12C4B98420AD12C4B1A6C42F491 -:1010F00000321A641A6E42F400321A661B6E05E062 -:10110000274B98422FD0274B984235D02268036E48 -:10111000C16D03EB52038466B3FBF2F362681504FE -:1011200042BF23F0070503F0070343EA4503CB6002 -:10113000A36843F040034B60E36843F001038B6016 -:1011400042F4967343F001030B604FF0FF330B62E0 -:10115000510505D512F0102217D0B2F1805F16D0DC -:1011600080F8643030BD0D4B1A6C42F480221A6452 -:101170001A6E42F48022C0E7084B1A6C42F080429B -:101180001A641A6E42F08042B7E77F23E8E73F23F4 -:10119000E6E700BF243D0008D423022000380240C7 -:1011A00040240220AC2402202DE9F047C66D0546FC -:1011B0003768F4692107346219D014F0080118BFA8 -:1011C0008021E20748BF41F02001A3074FF0200330 -:1011D00048BF41F04001600748BF41F4807183F38C -:1011E0001188281DFFF7E6FE002383F31188E2052E -:1011F0000AD5202383F311884FF40071281DFFF7CF -:10120000D9FE002383F311884FF020094FF0000A24 -:1012100014F0200838D13B0616D54FF0200905F10F -:10122000380A200610D589F31188504600F050F98D -:10123000002836DA0821281DFFF7BCFE27F08003BE -:101240003360002383F31188790614D5620612D522 -:10125000202383F31188D5E913239A4208D12B6CFC -:1012600033B127F040071021281DFFF7A3FE376098 -:10127000002383F31188E30618D5AA6E1369ABB176 -:101280005069BDE8F047184789F31188736A28460A -:1012900095F86410194000F0B5F98AF31188F469E3 -:1012A000B6E7B06288F31188F469BAE7BDE8F08761 -:1012B000F8B51546826804460B46AA4200D28568F6 -:1012C000A1692669761AB5420BD218462A46FFF75D -:1012D0003FFDA3692B44A3612846A3685B1BA36061 -:1012E000F8BD0CD9AF1B18463246FFF731FD3A4620 -:1012F000E1683044FFF72CFDE3683B44EBE7184618 -:101300002A46FFF725FDE368E5E70000836893427E -:10131000F7B50446154600D28568D4E90460361A4C -:10132000B5420BD22A46FFF713FD63692B44636174 -:101330002846A3685B1BA36003B0F0BD0DD93246FD -:10134000AF1B0191FFF704FD01993A46E068314473 -:10135000FFF7FEFCE3683B44E9E72A46FFF7F8FCA9 -:10136000E368E4E710B50A440024C361029B84608B -:10137000C16002610362C0E90000C0E9051110BD4F -:1013800008B5D0E90532934201D1826882B98268FA -:10139000013282605A1C426119700021D0E9043286 -:1013A0009A4224BFC368436100F0CCFE002008BD10 -:1013B0004FF0FF30FBE7000070B5202304460E46D7 -:1013C00083F31188A568A5B1A368A269013BA36056 -:1013D000531CA36115782269934224BFE368A3617B -:1013E000E3690BB120469847002383F31188284610 -:1013F00007E03146204600F095FE0028E2DA85F34A -:10140000118870BD2DE9F74F04460E4617469846E1 -:10141000D0F81C904FF0200A8AF311884FF0000B8F -:10142000154665B12A4631462046FFF741FF03467F -:1014300060B94146204600F075FE0028F1D0002337 -:1014400083F31188781B03B0BDE8F08FB9F1000F6A -:1014500003D001902046C847019B8BF31188ED1AF9 -:101460001E448AF31188DCE7C160C361009B82607F -:101470000362C0E905111144C0E900000161704731 -:10148000F8B504460D461646202383F31188A76855 -:10149000A7B1A368013BA36063695A1C62611D7018 -:1014A000D4E904329A4224BFE3686361E3690BB173 -:1014B00020469847002080F3118807E031462046F7 -:1014C00000F030FE0028E2DA87F31188F8BD000052 -:1014D000D0E9052310B59A4201D182687AB98268B1 -:1014E0000021013282605A1C82611C7803699A4291 -:1014F00024BFC368836100F025FE204610BD4FF075 -:10150000FF30FBE72DE9F74F04460E461746984695 -:10151000D0F81C904FF0200A8AF311884FF0000B8E -:10152000154665B12A4631462046FFF7EFFE0346D1 -:1015300060B94146204600F0F5FD0028F1D00023B7 -:1015400083F31188781B03B0BDE8F08FB9F1000F69 -:1015500003D001902046C847019B8BF31188ED1AF8 -:101560001E448AF31188DCE7026843681143016076 -:1015700003B11847704700001430FFF743BF000065 -:101580004FF0FF331430FFF73DBF00003830FFF756 -:10159000B9BF00004FF0FF333830FFF7B3BF000092 -:1015A0001430FFF709BF00004FF0FF311430FFF790 -:1015B00003BF00003830FFF763BF00004FF0FF3279 -:1015C0003830FFF75DBF000000207047FFF712BD05 -:1015D000044B036000234360C0E90233012303741A -:1015E000704700BF3C3D000810B52023044683F33C -:1015F0001188FFF76FFD02232374002383F3118802 -:1016000010BD000038B5C36904460D461BB904215E -:101610000844FFF7A9FF294604F11400FFF7B0FEC4 -:10162000002806DA201D4FF48061BDE83840FFF73E -:101630009BBF38BD026843681143016003B118477E -:101640007047000013B5446BD4F8A4381A681178B9 -:10165000042915D1217C022912D11979012312897B -:101660008B4013420CD101A904F14C0001F098FF0A -:10167000D4F8A4480246019B2179206800F0D4F9EF -:1016800002B010BD143001F01BBF00004FF0FF335B -:10169000143001F015BF00004C3001F0EDBF000028 -:1016A0004FF0FF334C3001F0E7BF0000143001F081 -:1016B000E9BE00004FF0FF31143001F0E3BE00003E -:1016C0004C3001F0B9BF00004FF0FF324C3001F058 -:1016D000B3BF000000207047D0F8A4381A6810B5D6 -:1016E00011780446042917D1017C022914D15979B3 -:1016F000012352898B4013420ED1143001F07CFE3D -:10170000024648B1D4F8A4484FF480736179206848 -:10171000BDE8104000F076B910BD0000406BFFF747 -:10172000DBBF0000704700007FB5124B0125042687 -:10173000044603600023057400F1840243602946D7 -:10174000C0E902330C4B0290143001934FF48073C4 -:10175000009601F02DFE094B04F29442294604F153 -:101760004C000294CDE900634FF4807301F0F4FE65 -:1017700004B070BD643D00081D1700084516000840 -:101780000B68202282F311880A7903EB820210622F -:101790004A790D3243F822008A7912B103EB8203B1 -:1017A00018620223C0F8A4180374002383F311887D -:1017B0007047000038B5037F044613B190F85430E9 -:1017C000ABB90125201D0221FFF734FF04F11400FD -:1017D0006FF00101257700F0C1FC04F14C0084F8A2 -:1017E00054506FF00101BDE8384000F0B7BC38BD7F -:1017F00010B5012104460430FFF71CFF00232377B6 -:1018000084F8543010BD000038B50446002514306B -:1018100001F0E6FD04F14C00257701F0B5FE201D36 -:1018200084F854500121FFF705FF2046BDE83840F9 -:10183000FFF752BF90F85C3003F06003202B06D115 -:1018400090F85D200023212A03D81F2A06D8002003 -:101850007047222AFBD1C0E9143303E0034A026532 -:101860000722426583650120704700BF38220220AD -:10187000D0F8A43837B51A680446117804291AD16B -:10188000017C022917D11979012312898B40134257 -:1018900011D100F14C05284601F036FF58B101A9DD -:1018A000284601F07DFED4F8A4480246019B217928 -:1018B000206800F0B9F803B030BD000000EB8103F0 -:1018C000F0B51E6A85B004460D46FEB1202383F3B1 -:1018D000118804EB8507301D0821FFF7ABFEFB687C -:1018E00006F14C005B691B681BB1019001F066FEBC -:1018F000019803A901F054FE024648B1039B294612 -:10190000204600F091F8002383F3118805B0F0BD64 -:10191000FB685A691268002AF5D01B8A013B134004 -:10192000F1D104F15C02EAE70D3138B550F82140FD -:10193000DCB1202383F31188D4F8A42813685279EA -:1019400003EB8203DB689B695D6845B10421601885 -:10195000FFF770FE294604F1140001F057FD204600 -:10196000FFF7BAFE002383F3118838BD70470000EB -:1019700001F0F0B801232822002110B5044600F838 -:10198000243BFFF70BFA0023C4E9013310BD00002C -:1019900038B50446202383F3118800254160C0E94F -:1019A0000355C0E90555C0E9075501F0E3F80223E6 -:1019B000237085F3118838BD70B500EB81030546AF -:1019C00050690E461446DA6018B110220021FFF764 -:1019D000E5F9A06918B110220021FFF7DFF93146BF -:1019E0002846BDE8704001F08FB90000826802F01F -:1019F000011282600022C0E90422C0E906220262CC -:101A000001F00EBAF0B4012500EB810447898D4046 -:101A1000E4683D43A469458123600023A2606360BC -:101A2000F0BC01F029BA0000F0B4012500EB8104FC -:101A300007898D40E4683D43646905812360002384 -:101A4000A2606360F0BC01F0A3BA000070B502238D -:101A50000025044603704566056280F84C50C0E9D5 -:101A60000255C0E90455C0E9065501F0E9F863687C -:101A70001B6823B129462046BDE87040184770BD59 -:101A8000037880F868300523037043681B6810B53D -:101A900004460BB1042198470023A36010BD000049 -:101AA00090F86820436802701B680BB10521184745 -:101AB0007047000070B590F84C30044613B1002315 -:101AC00080F84C3004F15C02204601F0CBF96368E9 -:101AD0009B68B3B994F85C3013F0600535D00021F1 -:101AE000204601F031FC0021204601F023FC636810 -:101AF0001B6813B1062120469847062384F84C3012 -:101B000070BD204698470028E4D0B4F86230626D7A -:101B10009A4288BF636594F95C30656D002B4FF085 -:101B2000200380F20381002D00F0F280092284F866 -:101B30004C2083F3118800212046D4E91423FFF7B9 -:101B400073FF002383F31188DAE794F85D2003F034 -:101B50007F0343EA022340F20232934200F0C58041 -:101B600021D8B3F5807F48D00DD8012B3FD0022B70 -:101B700000F09380002BB2D104F1640222650222AE -:101B80006265A365C1E7B3F5817F00F09B80B3F583 -:101B9000407FA4D194F85E30012BA0D1B4F864301A -:101BA00043F0020332E0B3F5006F4DD017D8B3F520 -:101BB000A06F31D0A3F5C063012B90D86368204695 -:101BC00094F85E205E6894F85F10B4F86030B04717 -:101BD000002884D043682365036863651AE0B3F581 -:101BE000106F36D040F6024293427FF478AF5C4BE0 -:101BF0002365022363650023C3E794F85E30012B5D -:101C00007FF46DAFB4F8643023F00203A4F86430BD -:101C1000C4E91455A56578E7B4F85C30B3F5A06F56 -:101C20000ED194F85E30204684F8663001F060F8FA -:101C300063681B6813B10121204698470323237072 -:101C40000023C4E914339CE704F1670323650123EF -:101C5000C3E72378042B10D1202383F31188204677 -:101C6000FFF7C4FE85F311880321636884F8675089 -:101C700021701B680BB12046984794F85E30002B0A -:101C8000DED084F867300423237063681B68002B60 -:101C9000D6D0022120469847D2E794F860302046FB -:101CA0001D0603F00F010AD501F0CEF8012804D07B -:101CB00002287FF414AF2B4B9AE72B4B98E701F0E7 -:101CC000B5F8F3E794F85E30002B7FF408AF94F892 -:101CD000603013F00F01B3D01A06204602D501F090 -:101CE00047FBADE701F03AFBAAE794F85E30002B22 -:101CF0007FF4F5AE94F8603013F00F01A0D01B060E -:101D0000204602D501F020FB9AE701F013FB97E78C -:101D1000142284F84C2083F311882B462A46294646 -:101D20002046FFF76FFE85F31188E9E65DB11522C5 -:101D300084F84C2083F3118800212046D4E9142331 -:101D4000FFF760FEFDE60B2284F84C2083F3118838 -:101D50002B462A4629462046FFF766FEE3E700BFEA -:101D6000943D00088C3D0008903D000838B590F87F -:101D70004C300446002B3ED0063BDAB20F2A34D852 -:101D80000F2B32D8DFE803F03731310822323131FE -:101D90003131313131313737456DB0F862309D42E4 -:101DA00014D2C3681B8AB5FBF3F203FB12556DB95D -:101DB000202383F311882B462A462946FFF734FE59 -:101DC00085F311880A2384F84C300EE0142384F83C -:101DD0004C30202383F31188002320461A461946ED -:101DE000FFF710FE002383F3118838BD836D03B124 -:101DF00098470023E7E70021204601F0A5FA0021DB -:101E0000204601F097FA63681B6813B1062120464B -:101E100098470623D7E7000010B590F84C300446E9 -:101E2000142B29D017D8062B05D001D81BB110BD13 -:101E3000093B022BFBD80021204601F085FA002146 -:101E4000204601F077FA63681B6813B1062120462B -:101E50009847062319E0152BE9D10B2380F84C3065 -:101E6000202383F3118800231A461946FFF7DCFD6F -:101E7000002383F31188DAE7C3689B695B68002B52 -:101E8000D5D1836D03B19847002384F84C30CEE759 -:101E9000024B0022C3E900339A607047182B0220DE -:101EA000002382680374054B1B6899689142FBD23A -:101EB0005A6803604260106058607047182B022017 -:101EC00008B5202383F31188037C032B05D0042B52 -:101ED0000DD02BB983F3118808BD436900221A6025 -:101EE0004FF0FF334361FFF7DBFF0023F2E7D0E958 -:101EF000003213605A60F3E7002382680374054BD5 -:101F00001B6899689142FBD85A6803604260106070 -:101F100058607047182B0220054B1969087418681F -:101F2000026853601A60186101230374FEF7FEB95A -:101F3000182B02204B1C30B5044687B00A4D10D038 -:101F40002B6901A8094A00F025F92046FFF7E4FFB4 -:101F5000049B13B101A800F059F92B69586907B027 -:101F600030BDFFF7D9FFF8E7182B0220C11E00088B -:101F700038B50C4D044641612B6981689A689142DD -:101F800003D8BDE83840FFF78BBF1846FFF7B4FF12 -:101F900001232C61014623742046BDE83840FEF73A -:101FA000C5B900BF182B0220044B1A681B69906842 -:101FB0009B68984294BF002001207047182B022094 -:101FC00010B5084C236820691A6854602260012209 -:101FD00023611A74FFF790FF01462069BDE81040A5 -:101FE000FEF7A4B9182B022008B5FFF7DDFF18B1E2 -:101FF000BDE80840FFF7E4BF08BD0000FFF7E0BF01 -:10200000FEE7000010B50C4CFFF742FF00F0B4F8FB -:1020100080220A49204600F03BF8012344F8180CBE -:10202000037400F073FC002383F3118862B6044844 -:10203000BDE8104000F04CB8402B0220983D00084D -:10204000A83D000800F01CB9EFF3118020B9EFF3B0 -:102050000583202282F311887047000010B530B943 -:10206000EFF30584C4F3080414B180F3118810BDA4 -:10207000FFF7BAFF84F31188F9E70000034A5168BB -:1020800053685B1A9842FBD8704700BF001000E00D -:1020900082600222028270478368A3F17C0243F8C7 -:1020A0000C2C026943F83C2C426943F8382C074A4F -:1020B00043F81C2CC268A3F1180043F8102C02222C -:1020C00003F8082C002203F8072C7047450300088A -:1020D00010B5202383F31188FFF7DEFF00210446AB -:1020E000FFF746FF002383F31188204610BD000050 -:1020F000024B1B6958610F20FFF70EBF182B0220FF -:10210000202383F31188FFF7F3BF000008B50146D1 -:10211000202383F311880820FFF70CFF002383F3AB -:10212000118808BD49B1064B42681B6918605A60A6 -:10213000136043600420FFF7FDBE4FF0FF3070478F -:10214000182B02200368984206D01A68026050607B -:1021500018465961FFF7A4BE7047000038B5044621 -:102160000D462068844200D138BD036823605C605E -:102170004561FFF795FEF4E7054B4FF0FF3103F1A2 -:102180001402C3E905220022C3E90712704700BF09 -:10219000182B022070B51C4E05460C46C0E90323DF -:1021A00001F0E4FA334653F8142F9A420DD130620D -:1021B0000A2C2CBF00190A302A60C5E90124C6E99F -:1021C0000555BDE8704001F0BFBA316A431AE31803 -:1021D00038BF1C469368A34202D9081901F0C2FA1D -:1021E00073699A6894420CD85A68AC602B606A6034 -:1021F00015609A685D60121B9A604FF0FF33F361BF -:1022000070BDA41A1B68ECE7182B022038B51B4CD4 -:10221000636998420DD08168D0E9003213605A603A -:102220000022C2609A680A449A604FF0FF33E3616B -:1022300038BD03682246002142F8143F93425A6099 -:10224000C16003D1BDE8384001F086BA9A68816860 -:10225000256A0A449A6001F089FA6369411B9A6809 -:102260008A42E5D9AB181D1A206A092D98BF01F1E1 -:102270000A02BDE83840104401F074BA182B02205D -:102280002DE9F041184C002704F11406656901F0AE -:102290006DFA236AAA68C11A8A4215D81344D5F880 -:1022A0000C802362D5E9003213605A606369EF60E5 -:1022B000B34201D101F050FA87F311882869C04771 -:1022C000202383F31188E1E76169B14209D0134407 -:1022D0001B1ABDE8F0410A2B2CBFC0180A3001F0D0 -:1022E00041BABDE8F08100BF182B022000207047E2 -:1022F000FEE70000704700004FF0FF30704700001D -:1023000002290CD0032904D00129074818BF002056 -:102310007047032A05D8054800EBC20070470448FF -:1023200070470020704700BF903E000848220220FE -:10233000443E000870B59AB005460846144601A907 -:1023400000F0C2F801A8FEF721FD431C0022C6B22E -:102350005B001046C5E9003423700323023404F8FF -:10236000013C01ABD1B202348E4201D81AB070BD2B -:1023700013F8011B013204F8010C04F8021CF1E708 -:1023800008B5202383F311880348FFF771FA00236F -:1023900083F3118808BD00BFD02C022090F85C3078 -:1023A00003F01F02012A07D190F85D200B2A03D108 -:1023B0000023C0E9143315E003F06003202B08D19B -:1023C000B0F860302BB990F85D20212A03D81F2A7D -:1023D00004D8FFF72FBA222AEBD0FAE7034A0265A6 -:1023E0000722426583650120704700BF3F2202201B -:1023F00007B5052917D8DFE801F0191603191920C8 -:10240000202383F31188104A01210190FFF7D4FAA9 -:10241000019802210D4AFFF7CFFA0D48FFF7F4F9B2 -:10242000002383F3118803B05DF804FB202383F3BA -:1024300011880748FFF7BEF9F2E7202383F31188DC -:102440000348FFF7D5F9EBE7E43D0008083E000834 -:10245000D02C022038B50C4D0C4C2A460C4904F106 -:102460000800FFF767FF05F1CA0204F110000949EF -:10247000FFF760FF05F5CA7204F118000649BDE8D0 -:102480003840FFF757BF00BFA8350220482202207E -:10249000C03D0008CD3D0008D83D000870B5044699 -:1024A00008460D46FEF772FCC6B22046013403789A -:1024B0000BB9184670BD32462946FEF753FC00287A -:1024C000F3D10120F6E700002DE9F04705460C4660 -:1024D000FEF75CFC2B49C6B22846FFF7DFFF08B1C8 -:1024E0000A36F6B228492846FFF7D8FF08B1103659 -:1024F000F6B2632E0BD8DFF88C80DFF88C90234F78 -:10250000DFF894A02E7846B92670BDE8F0872946FA -:102510002046BDE8F04701F0DFBB252E2ED1072273 -:1025200041462846FEF71EFC70B9194B224603F1BE -:10253000100153F8040B8B4242F8040BF9D11B78BD -:10254000073511341370DDE7082249462846FEF7A7 -:1025500009FC98B9A21C0F4B197802320909C95D10 -:1025600002F8041C13F8011B01F00F015345C95D6B -:1025700002F8031CF0D118340835C3E7013504F81C -:10258000016BBFE7B03E0008D83D0008CA3E000816 -:10259000B83E000820F4F01F2CF4F01FBFF34F8F5B -:1025A000024AD368DB03FCD4704700BF003C024002 -:1025B00008B5074B1B7853B9FFF7F0FF054B1A69B5 -:1025C000002A04DA044A5A6002F188325A6008BDCF -:1025D00006380220003C02402301674508B5054B40 -:1025E0001B7833B9FFF7DAFF034A136943F000435E -:1025F000136108BD06380220003C02400B28F0B5EC -:1026000016D80C4C0C4923787BB90E460B4D0C2385 -:102610004FF00062013B55F8047B46F8042B13F0A1 -:10262000FF033A44F6D10123237051F82000F0BD96 -:102630000020FCE73838022008380220DC3E000881 -:10264000014B53F820007047DC3E00080C20704717 -:102650000B2810B5044601D9002010BDFFF7CEFFAE -:10266000064B53F824301844C21A0BB90120F4E782 -:1026700012680132F0D1043BF6E700BFDC3E0008EF -:102680000B2838B5044628D8FFF7DEFC0546FFF7CF -:1026900085FF2046FFF78CFF114AF323D360E30048 -:1026A000DBB243F4007343F002031361136943F494 -:1026B00080331361FFF772FFFFF7A0FF094B53F858 -:1026C000241000F0E9F82846FFF788FFFFF7C6FC62 -:1026D0002046BDE83840FFF7BBBF002038BD00BF33 -:1026E000003C0240DC3E000812F001032DE9F041FD -:1026F00005460E4614464BD18218B2F1026F61D8DE -:10270000314B1B6813F001035CD0FFF79DFC2F4F8A -:10271000FFF74EFFF323314640F20128FB60FFF73D -:102720003DFF032C18D824F001046D1A274E40F207 -:1027300001180C44A14205EB010733692AD123F0AB -:1027400001033361FFF74AFFFFF788FC0120BDE872 -:10275000F081043C0435E4E7AB07E4D13B6923F4A2 -:1027600040733B613B6943EA08033B6151F8046BEA -:102770002E60BFF34F8FFFF711FF2B689E42E8D00A -:102780003B6923F001033B61FFF728FFFFF766FC7D -:102790000020DCE723F440733361336943EA080324 -:1027A00033610B883B80BFF34F8FFFF7F7FE3F8805 -:1027B000BFB231F8023BBB42BCD0336923F0010306 -:1027C0003361E1E71846C2E700380240003C0240AE -:1027D000084908B50B7828B11BB9FFF7E9FE0123BA -:1027E0000B7008BD002BFCD00870BDE80840FFF757 -:1027F000F5BE00BF063802200244074BD2B210B526 -:10280000904200D110BD441C00B253F8200041F8A2 -:10281000040BE0B2F4E700BF502800400F4B30B586 -:102820001C6F240407D41C6F44F400741C671C6FD5 -:1028300044F400441C670A4C02442368D2B243F4B7 -:1028400080732360074B904200D130BD441C51F887 -:10285000045B00B243F82050E0B2F4E700380240D5 -:10286000007000405028004007B5012201A9002057 -:10287000FFF7C2FF019803B05DF804FB13B50446EF -:10288000FFF7F2FFA04205D0012201A90020019428 -:10289000FFF7C4FF02B010BD0144BFF34F8F064BDA -:1028A000884204D3BFF34F8FBFF36F8F7047C3F8D5 -:1028B0005C022030F4E700BF00ED00E0002070472C -:1028C000034B1A681AB9034AD2F874281A60704781 -:1028D0003C3802200030024008B5FFF7F1FF024B00 -:1028E0001868C0F3407008BD3C380220EFF309833C -:1028F000054968334A6B22F001024A6383F3098871 -:10290000002383F31188704700EF00E0202080F35C -:10291000118862B60D4B0E4AD96821F4E0610904B2 -:10292000090C0A430B49DA60D3F8FC2042F08072AC -:10293000C3F8FC20084AC2F8B01F116841F0010139 -:1029400011601022DA7783F82200704700ED00E072 -:102950000003FA0555CEACC5001000E0202310B5E9 -:1029600083F311880E4B5B6813F4006314D0F1EE0F -:10297000103AEFF309844FF08073683CE361094B30 -:10298000DB6B236684F30988FFF70EFB10B1064B5F -:10299000A36110BD054BFBE783F31188F9E700BF86 -:1029A00000ED00E000EF00E0570300085A030008C4 -:1029B00070B5BFF34F8FBFF36F8F1A4A0021C2F873 -:1029C0005012BFF34F8FBFF36F8F536943F400333F -:1029D0005361BFF34F8FBFF36F8FC2F88410BFF303 -:1029E0004F8FD2F8803043F6E074C3F3C900C3F3CD -:1029F0004E335B0103EA0406014646EA817501395C -:102A0000C2F86052F9D2203B13F1200FF2D1BFF38C -:102A10004F8F536943F480335361BFF34F8FBFF33C -:102A20006F8F70BD00ED00E0FEE700000A4B0B4821 -:102A30000B4A90420BD30B4BC11EDA1C121A22F028 -:102A400003028B4238BF00220021FEF7A7B953F8DA -:102A5000041B40F8041BECE7D84000085039022062 -:102A600050390220503902207047000070B5D0E97B -:102A70001B4300224FF0FF359E6804EB42135101C7 -:102A8000D3F80009002805DAD3F8000940F08040A7 -:102A9000C3F80009D3F8000B002805DAD3F8000BBF -:102AA00040F08040C3F8000B013263189642C3F82F -:102AB0000859C3F8085BE0D24FF00113C4F81C3882 -:102AC00070BD00001D4B03EB8002D2F80CC02DE955 -:102AD000F043DCF81420461CDD6ED2F800E005EB74 -:102AE000063605EB4018516871450AD30122D5F826 -:102AF000343802FA00F023EA0000C5F83408BDE8D3 -:102B0000F083AEEB0103BCF81040A34228BF23467C -:102B1000D8F81849A4B2B3EB840FF0D89468A4F1A4 -:102B2000040959F8047F3760A4EB09071F44042FF8 -:102B3000F7D81C440B4494605360D4E7403802201B -:102B4000890141F02001016103699B06FCD4122038 -:102B5000FFF794BA10B5054C2046FEF70BFF4FF077 -:102B6000A043E366024B236710BD00BF403802203C -:102B7000303F000870B503780546012B50D12A4B31 -:102B8000C46E98421BD1294B0E2143205A6B42F050 -:102B900080025A635A6D42F080025A655A6D5A6932 -:102BA00042F080025A615A6922F080025A615B69E0 -:102BB00000F0E8FB1E4BE3601E4BC4F80038002316 -:102BC000EE6EC4F8003EC02323604FF40413A363E9 -:102BD0003369002BFCDA01230C203361FFF74EFA36 -:102BE0003369DB07FCD41220FFF748FA3369002B66 -:102BF000FCDA00262846A660FFF738FF6B68C4F8A9 -:102C00001068DB68C4F81468C4F81C684BB90A4B38 -:102C1000A3614FF0FF336361A36843F00103A36036 -:102C200070BD064BF4E700BF403802200038024078 -:102C30004014004003002002003C30C0083C30C07B -:102C4000F8B5C46E054600214FF000662046FFF738 -:102C500077FF296F00234FF001128F684FF0FF308C -:102C6000C4F83438C4F81C2804EB431201339F42E3 -:102C7000C2F80069C2F8006BC2F80809C2F8080B74 -:102C8000F2D20B68EA6E6B676362102313611669F8 -:102C900016F01006FBD11220FFF7F0F9D4F8003837 -:102CA00023F4FE63C4F80038A36943F4402343F0DF -:102CB0001003A3610923C4F81038C4F814380A4B70 -:102CC000EB604FF0C043C4F8103B084BC4F8003B26 -:102CD000C4F81069C4F800396B6F03F1100243F4B3 -:102CE00080136A67A362F8BD0C3F000840800010A3 -:102CF000C26E90F86610D2F8003823F4FE6343EAFF -:102D00000113C2F8003870472DE9F84300EB810346 -:102D1000C56E0C468046DA680FFA81F948011668DC -:102D200006F00306731E022B05EB41134FF0000162 -:102D300094BFB604384EC3F8101B4FF0010104F1E4 -:102D4000100398BF06F1805601FA03F3916998BF0A -:102D500006F5004600293AD0578A04F15801374356 -:102D600049016F50D5F81C180B430021C5F81C38D9 -:102D70002B180127C3F81019A7405369611E9BB394 -:102D8000138A928B9B08012A88BF5343D8F874207A -:102D9000981842EA034301F140022146C8F8740042 -:102DA000284605EB82025360FFF7CAFE08EB890054 -:102DB000C3681B8A43EA845348341E4364012E517E -:102DC000D5F81C381F43C5F81C78BDE8F88305EB1F -:102DD0004917D7F8001B21F40041C7F8001BD5F8AC -:102DE0001C1821EA0303C0E704F13F030B4A2846FD -:102DF000214605EB83035A60FFF7A2FE05EB49105D -:102E0000D0F8003923F40043C0F80039D5F81C3855 -:102E100023EA0707D7E700BF008000100004000284 -:102E2000026F12684267FFF721BE00005831C36E7F -:102E300049015B5813F4004004D013F4001F0CBF89 -:102E400002200120704700004831C36E49015B58E1 -:102E500013F4004004D013F4001F0CBF0220012023 -:102E60007047000000EB8101CB68196A0B681360A2 -:102E70004B6853607047000000EB810330B5DD689C -:102E8000AA691368D36019B9402B84BF402313602B -:102E90006B8A1468C26E1C4402EB4110013C09B2FB -:102EA000B4FBF3F46343033323F0030343EAC44363 -:102EB00043F0C043C0F8103B2B6803F00303012B21 -:102EC0000ED1D2F8083802EB411013F4807FD0F80D -:102ED000003B14BF43F0805343F00053C0F8003B65 -:102EE00002EB4112D2F8003B43F00443C2F8003B2E -:102EF00030BD00002DE9F041244D0446EE6E06EB96 -:102F00004013D3F8087B3807C3F8087B0AD5D6F8F6 -:102F10001438190706D505EB840321462846DB68DB -:102F20005B689847FA071FD5D6F81438DB071BD51E -:102F300005EB8403D968CCB98B69488A5A68B2FB1F -:102F4000F0F600FB16228AB91868DA6890420DD2B2 -:102F5000121AC3E90024202383F311880B48214669 -:102F6000FFF78AFF84F31188BDE8F081012303FA9B -:102F700004F26B8923EA02036B81CB68002BF3D048 -:102F800021460248BDE8F041184700BF4038022002 -:102F900000EB81034A0170B5DD68C36E6C69266879 -:102FA000E66056BB1A444FF40020C2F810092A68A4 -:102FB00002F00302012A0AB20ED1D3F8080803EB8B -:102FC000421410F4807FD4F8000914BF40F0805000 -:102FD00040F00050C4F8000903EB4212D2F8000997 -:102FE00040F00440C2F800090122D3F8340802FA84 -:102FF00001F10143C3F8341870BD19B9402E84BFE4 -:103000004020206020681A442E8A8419013CB4FBB9 -:10301000F6F440EAC44040F00050C6E7F8B5044674 -:103020001E48C56E05EB4413D3F80869F107C3F8D1 -:10303000086917D5D5F81038DA0713D500EB8403E3 -:10304000D9684B691F68DA68974218D2D21B0027EB -:103050001A605F60202383F311882146FFF798FFF1 -:1030600087F31188330617D50123D5F83428A340F8 -:10307000134211D02046BDE8F840FFF723BD0123DD -:1030800003FA04F2038923EA020303818B68002B0D -:10309000E8D021469847E5E7F8BD00BF4038022058 -:1030A0002DE9F74FA24CE66E7569B3691D4015F422 -:1030B0008058756107D02046FEF7C8FC03B0BDE814 -:1030C000F04FFFF74BBC002D12DAD6F8003E9F07F9 -:1030D00005D0D6F8003E23F00303C6F8003ED6F82C -:1030E0000438934823F00103C6F80438FEF7D8FCEF -:1030F000280505D58E48FFF7B9FC8D48FEF7C0FCC2 -:10310000A9040CD5D6F8083813F0060FF36823F499 -:1031100070530CBF43F4105343F4A053F3602A07D9 -:1031200004D56368DB680BB181489847EB0200F176 -:103130008A80AF0227D5D4F86C9000274FF0010A9F -:10314000DFF8ECB109EB4712D2F8003B03F440235F -:10315000B3F5802F11D1D2F8003B002B0DDA628934 -:103160000AFA07F322EA0303638104EB8703DB68AF -:10317000DB6813B13946584698470137236FFFB2D1 -:103180009B689F42DED9E80618D5E76E3A6AC2F31B -:103190000A1002F00F0302F4F012B2F5802F00F0D3 -:1031A0009C80B2F5402F09D104EB8303002207F580 -:1031B0008057DB681B6A904240F082802B03D6F870 -:1031C00018481DD5E70302D50020FFF793FEA6039C -:1031D00002D50120FFF78EFE600302D50220FFF723 -:1031E00089FE210302D50320FFF784FEE20202D507 -:1031F0000420FFF77FFEA30202D50520FFF77AFE29 -:103200006F037FF55BAFE60702D50020FFF706FFEF -:10321000A50702D50120FFF701FF600702D50220B4 -:10322000FFF7FCFE210702D50320FFF7F7FEE206B9 -:1032300002D50420FFF7F2FEA3067FF53FAF05207D -:10324000FFF7ECFE3AE7E36E00274FF0010ADFF8E4 -:10325000E0B00193236F5FFA87F99B6899453FF6C9 -:1032600068AF019B03EB4913D3F8002902F4402215 -:10327000B2F5802F22D1D3F80029002A1EDAD3F824 -:10328000002942F09042C3F80029D3F80029002A0F -:10329000FBDB4946E06EFFF753FC22890AFA09F38B -:1032A00022EA0303238104EB8903DB689B6813B1E3 -:1032B0004946584698474846FFF704FC0137C9E796 -:1032C000910701D1D7F80080072A02F101029CBFC3 -:1032D00003F8018B4FEA18286DE7023307F5805792 -:1032E00004EB83025268D2F818C0DCF80820DCE94D -:1032F000001CA1EB0C0C002188420AD104EB8304D2 -:1033000063689B699A6802449A605A6802445A60EA -:1033100054E711F0030F01D1D7F800808C4501F17B -:10332000010184BF02F8018B4FEA1828E4E700BFCF -:1033300040380220C36E03EB4111D1F8003B43F447 -:103340000013C1F8003B7047C36E03EB4111D1F885 -:10335000003943F40013C1F800397047C36E03EB22 -:103360004111D1F8003B23F40013C1F8003B704732 -:10337000C36E03EB4111D1F8003923F40013C1F8F7 -:1033800000397047090100F16043012203F56143F0 -:10339000C9B283F8001300F01F039A4043099B0051 -:1033A00003F1604303F56143C3F880211A6070475D -:1033B00030B50433039C0172002104FB0325C16076 -:1033C000C0E90653049B0363059BC0E90000C0E904 -:1033D0000422C0E90842C0E90A11436330BD00007D -:1033E0000022416AC260C0E90411C0E90A226FF0FC -:1033F0000101FEF7B3BE0000D0E90432934201D1CF -:10340000C2680AB9181D7047002070470369196027 -:103410000021C2680132C260C269134482699342CA -:10342000036124BF436A0361FEF78CBE38B50446CE -:103430000D46E3683BB162690020131D1268A36268 -:103440001344E36207E0237A33B929462046FEF7A6 -:1034500069FE0028EDDA38BD6FF00100FBE70000DF -:10346000C368C269013BC3604369134482699342E4 -:10347000436124BF436A436100238362036B03B14A -:103480001847704770B52023044683F31188866A75 -:103490003EB9FFF7CBFF054618B186F311882846E1 -:1034A00070BDA36AE26A13F8015B9342A36202D380 -:1034B0002046FFF7D5FF002383F31188EFE70000D4 -:1034C0002DE9F84F04460E46174698464FF020095E -:1034D00089F311880025AA46D4F828B0BBF1000F63 -:1034E00009D141462046FFF7A1FF20B18BF3118897 -:1034F0002846BDE8F88FD4E90A12A7EB050B521A4B -:10350000934528BF9346BBF1400F1BD9334601F1C9 -:10351000400251F8040B914243F8040BF9D1A36A1D -:10352000403640354033A362D4E90A239A4202D39D -:103530002046FFF795FF8AF31188BD42D8D289F360 -:103540001188C9E730465A46FDF702FCA36A5E447B -:103550005D445B44A362E7E710B5029C043301724B -:1035600004FB0321C460C0E906130023C0E90A3349 -:10357000039B0363049BC0E90000C0E90422C0E987 -:103580000842436310BD0000026A6FF00101C2608F -:10359000426AC0E904220022C0E90A22FEF7DEBD29 -:1035A000D0E904239A4201D1C26822B9184650F8E2 -:1035B000043B0B607047002070470000C368002187 -:1035C000C2690133C3604369134482699342436112 -:1035D00024BF436A4361FEF7B5BD000038B5044619 -:1035E0000D46E3683BB1236900201A1DA262E2691F -:1035F0001344E36207E0237A33B929462046FEF7F5 -:1036000091FD0028EDDA38BD6FF00100FBE7000006 -:1036100003691960C268013AC260C26913448269D1 -:103620009342036124BF436A036100238362036BF7 -:1036300003B118477047000070B520230D460446BB -:10364000114683F31188866A2EB9FFF7C7FF10B1C0 -:1036500086F3118870BDA36A1D70A36AE26A013304 -:103660009342A36204D3E16920460439FFF7D0FFF7 -:10367000002080F31188EDE72DE9F84F04460D4650 -:10368000904699464FF0200A8AF311880026B346E7 -:10369000A76A4FB949462046FFF7A0FF20B187F33C -:1036A00011883046BDE8F88FD4E90A073A1AA8EB2A -:1036B0000607974228BF1746402F1BD905F1400344 -:1036C00055F8042B9D4240F8042BF9D1A36A4036EB -:1036D0004033A362D4E90A239A4204D3E169204625 -:1036E0000439FFF795FF8BF311884645D9D28AF349 -:1036F0001188CDE729463A46FDF72AFBA36A3D44E7 -:103700003E443B44A362E5E7D0E904239A4217D143 -:10371000C3689BB1836A8BB1043B9B1A0ED01360C4 -:10372000C368013BC360C3691A4483699A4202615A -:1037300024BF436A03610023836201231846704754 -:103740000023FBE700F094B84FF080430022586359 -:103750001A610222DA6070474FF080430022DA607B -:10376000704700004FF08043586370474FF080432C -:10377000586A70474B6843608B688360CB68C3604E -:103780000B6943614B6903628B6943620B68036099 -:103790007047000008B52C4B40F2FF712B481A69A6 -:1037A0000A431A611A6922F4FF6222F007021A61C1 -:1037B0001A691A6B0A431A631A6D0A431A65244A76 -:1037C0001B6D1146FFF7D6FF00F5806002F11C016A -:1037D000FFF7D0FF00F5806002F13801FFF7CAFF64 -:1037E00000F5806002F15401FFF7C4FF00F580602E -:1037F00002F17001FFF7BEFF00F5806002F18C015D -:10380000FFF7B8FF00F5806002F1A801FFF7B2FFF3 -:1038100000F5806002F1C401FFF7ACFF00F58060A5 -:1038200002F1E001FFF7A6FF00F5806002F1FC0164 -:10383000FFF7A0FF02F58C7100F58060FFF79AFF9B -:10384000BDE8084000F08AB800380240000002409D -:103850003C3F000808B500F01FFAFEF7D3FBFFF766 -:103860002FF8BDE80840FEF7F5BD000070470000E6 -:103870000F4B1A6C42F001021A641A6E42F00102F8 -:103880001A660C4A1B6E936843F0010393604FF075 -:1038900080436B229A624FF0FF32DA6200229A6113 -:1038A0005A63DA605A6001225A611A60704700BF99 -:1038B00000380240002004E04FF0804208B5116952 -:1038C000D3680B40D9B29B076FEA0101116107D59C -:1038D000202383F31188FEF7B5FB002383F31188BF -:1038E00008BD00001B4B4FF0FF3000211A696FEA42 -:1038F00042526FEA52521A611A69C2F30A021A61FD -:103900001A695A6958615A6959615A691A6A62F0A2 -:1039100080521A621A6A02F080521A621A6A5A6A4D -:1039200058625A6A59625A6A0B4A106840F48070A9 -:103930001060186F00F44070B0F5007F03D04FF4B2 -:10394000803018671967536823F40073536000F0E0 -:1039500073B900BF0038024000700040364B4FF48E -:103960004041364A1A64364A11601A6842F0010230 -:103970001A601A689207FCD59A6822F003029A60CE -:103980002D4B9A6812F00C02FBD1196801F0F90175 -:1039900019609A601A6842F480321A601A689003BB -:1039A000FCD55A6F42F001025A67234B5A6F9107B8 -:1039B000FCD5244A5A601A6842F080721A60204B83 -:1039C0005A685204FCD51A6842F480321A605A6868 -:1039D000D003FCD51A6842F400321A60184A5368C2 -:1039E0009903FCD5144B1A689201FCD5164A9A60CB -:1039F00040F20112C3F88C200022C3F8902040F25C -:103A00000733124A1360136803F00F03072BFAD130 -:103A1000094B9A6842F002029A609A6802F00C021E -:103A2000082AFAD15A6C42F480425A645A6E42F41F -:103A300080425A665B6E70470038024000040010F6 -:103A400000700040186C400900948838003C024027 -:103A5000074A08B5536903F00103536123B1054ACE -:103A600013680BB150689847BDE80840FEF776BF71 -:103A7000003C0140D0380220074A08B5536903F0E2 -:103A80000203536123B1054A93680BB1D06898478C -:103A9000BDE80840FEF762BF003C0140D03802207C -:103AA000074A08B5536903F00403536123B1054A7B -:103AB00013690BB150699847BDE80840FEF74EBF47 -:103AC000003C0140D0380220074A08B5536903F092 -:103AD0000803536123B1054A93690BB1D069984734 -:103AE000BDE80840FEF73ABF003C0140D038022054 -:103AF000074A08B5536903F01003536123B1054A1F -:103B0000136A0BB1506A9847BDE80840FEF726BF1C -:103B1000003C0140D0380220164B10B55C6904F41B -:103B200078725A61A30604D5134A936A0BB1D06A1E -:103B30009847600604D5104A136B0BB1506B984739 -:103B4000210604D50C4A936B0BB1D06B9847E20564 -:103B500004D5094A136C0BB1506C9847A30504D5E2 -:103B6000054A936C0BB1D06C9847BDE81040FEF746 -:103B7000F5BE00BF003C0140D0380220194B10B503 -:103B80005C6904F47C425A61620504D5164A136DDF -:103B90000BB1506D9847230504D5134A936D0BB1B3 -:103BA000D06D9847E00404D50F4A136E0BB1506EE8 -:103BB0009847A10404D50C4A936E0BB1D06E984778 -:103BC000620404D5084A136F0BB1506F9847230461 -:103BD00004D5054A936F0BB1D06F9847BDE81040EC -:103BE000FEF7BCBE003C0140D038022008B50348B7 -:103BF000FDF7DAFABDE80840FEF7B0BED423022094 -:103C000008B50348FDF7D0FABDE80840FEF7A6BEA8 -:103C10004024022008B50348FDF7C6FABDE8084075 -:103C2000FEF79CBEAC24022008B5FFF745FEBDE8B8 -:103C30000840FEF793BE0000062108B50846FFF7CE -:103C4000A1FB06210720FFF79DFB06210820FFF7B7 -:103C500099FB06210920FFF795FB06210A20FFF7B3 -:103C600091FB06211720FFF78DFB06212820FFF787 -:103C700089FB07211C20FFF785FB0C212620FFF77D -:103C800081FB0C212720FFF77DFB0C215220BDE892 -:103C90000840FFF777BB000008B5FFF723FE00F0F0 -:103CA0000DF8FDF793FCFDF763FEFDF73BFDFFF715 -:103CB000DDFDBDE80840FFF745BD00000023054AD3 -:103CC00019460133102BC2E9001102F10802F8D1A4 -:103CD000704700BFD0380220034611F8012B03F8CB -:103CE000012B002AF9D1704753544D3332463F3FE0 -:103CF0003F3F3F3F0053544D333246375B347C35B2 -:103D00005D780053544D333246375B367C375D78EF -:103D100000000000D02C0220D423022040240220E6 -:103D2000AC2402200096000000000000000000000B -:103D30000000000000000000000000000000000083 -:103D40009515000881150008BD150008A915000883 -:103D5000B5150008A11500088D1500087915000893 -:103D6000C915000800000000A11600088D16000803 -:103D7000C9160008B5160008C1160008AD160008DF -:103D80009916000885160008D516000800000000E6 -:103D900001000000000000006D61696E000000007D -:103DA00069646C6500000000A03D0008582B0220EB -:103DB000D02C0220010000000120000800000000BB -:103DC0004865782F50726F6669434E430025424F15 -:103DD000415244252D424C002553455249414C2522 -:103DE000000000000200000000000000BD180008F4 -:103DF000291900084000400078350220883502204B -:103E000002000000000000000300000000000000AD -:103E10006D19000800000000100000009835022015 -:103E200000000000010000000000000040380220F7 -:103E300001010200F1230008012300089D2300086E -:103E400081230008430000004C3E000809024300A3 -:103E5000020100C032090400000102020100052431 -:103E600000100105240100010424020205240600BB -:103E700001070582030800FF09040100020A00008F -:103E80000007050102400000070581024000000014 -:103E900012000000983E00081201100102000040CC -:103EA000AE2D021000020102030100000403090408 -:103EB00025424F41524425004375626559656C6C3B -:103EC0006F772D626473686F74003031323334352C -:103ED00036373839414243444546000000800000EF -:103EE0000080000000800000008000000000020050 -:103EF00000000400000004000000040000000400B2 -:103F000000000400000004000000040000000000A5 -:103F1000B51A00086D1D0008191E00084000400079 -:103F2000B8380220B838022001000000C83802204A -:103F30008000000040010000050000000000802A11 -:103F400000000000AAAAAAAA00000024FFFF0000A7 -:103F50000000000000A00A000001000000000000B6 -:103F6000AAAAAAAA00000000FFFF000000000000AB -:103F7000000000001400005400000000AAAAAAAA31 -:103F800014000054FFFF00000000000000000000CB -:103F900080699A0100000000AAAA8AAA405555012A -:103FA000FFFF0000007070077770000000810200C2 -:103FB00000000000AAAAAAAA00410100FFFF000019 -:103FC0000000008008000000000000000000000069 -:103FD000AAAAAAAA00000000FFFF0000000000003B -:103FE000000000000000000000000000AAAAAAAA29 -:103FF00000000000FFFF00000000000000000000C3 -:104000000000000000000000AAAAAAAA0000000008 -:10401000FFFF0000000000000000000000000000A2 -:1040200000000000AAAAAAAA00000000FFFF0000EA -:104030000000000000000000000000000000000080 -:10404000AAAAAAAA00000000FFFF000000000000CA -:10405000000000000000000000000000AAAA00000C -:1040600000000000FF000000000000000000000051 -:10407000780000000000000000801E00000000002A -:10408000FF00000000000000E83C00083F000000C6 -:1040900049040000F53C00083F0000005104000006 -:1040A000033D00083F0000000096000000000800EB -:1040B000960000000008000004000000AC3E00086C -:1040C00000000000000000000000000000000000F0 -:0840D0000000000000000000E8 +:1002000002E000F000F8FEE772B6374880F3088895 +:10021000364880F3098836483649086040F20000C5 +:10022000CCF200004EF63471CEF200010860BFF34C +:100230004F8FBFF36F8F40F20000C0F2F0004EF618 +:100240008851CEF200010860BFF34F8FBFF36F8F6C +:100250004FF00000E1EE100A4EF63C71CEF20001C4 +:100260000860062080F31488BFF36F8F02F006FB4E +:1002700003F07CFA4FF055301F491B4A91423CBFB6 +:1002800041F8040BFAE71D49184A91423CBF41F876 +:10029000040BFAE71A491B4A1B4B9A423EBF51F81E +:1002A000040B42F8040BF8E700201849184A914261 +:1002B0003CBF41F8040BFAE702F01EFB03F0B6FA6C +:1002C000144C154DAC4203DA54F8041B8847F9E787 +:1002D00000F042F8114C124DAC4203DA54F8041B02 +:1002E0008847F9E702F006BB000602200022022040 +:1002F0000000000808ED00E00000022000060220D7 +:10030000F0400008002202206C220220702202200D +:10031000183A02200002000800020008000200084B +:10032000000200082DE9F04F2DED108AC1F80CD025 +:10033000D0F80CD0BDEC108ABDE8F08F002383F319 +:1003400011882846A047002001F048FEFEE701F092 +:10035000D7FD00DFFEE7000038B500F01FFC02F01B +:100360004DFA054602F080FA0446C0B90E4B9D4294 +:1003700017D001339D4241F2883512BF0446002553 +:100380000124002002F044FA0CB100F075F800F0EE +:1003900055FD284600F0FAF800F06EF8F9E7002560 +:1003A000EFE70546EDE700BF010007B008B500F034 +:1003B000C1FBA0F120035842584108BD07B541F2E6 +:1003C0001203022101A8ADF8043000F0D1FB03B004 +:1003D0005DF804FB38B5302383F3118817480368B0 +:1003E0000BB101F0C7FE0023154A4FF47A71134890 +:1003F00001F0B6FE002383F31188124C236813B179 +:100400002368013B2360636813B16368013B636049 +:100410000D4D2B7833B963687BB9022000F080FC66 +:10042000322363602B78032B07D163682BB902203A +:1004300000F076FC4FF47A73636038BD70220220BE +:10044000D50300089023022088220220084B187050 +:1004500003280CD8DFE800F008050208022000F0AD +:100460005DBC022000F058BC024B00225A6070476D +:100470008822022090230220F8B53F4B3F4A1C46B9 +:100480001968013177D004339342F9D16268A242EE +:1004900071D33B4B9B6803F1006303F5C0339A4271 +:1004A00069D2002000F094FB0220FFF7CFFF354B0C +:1004B00000211A6C19641A6E19661A6E5A6C596406 +:1004C0005A6E59665A6E5A6942F080025A615A69E8 +:1004D00022F080025A615A691A6942F000521A6188 +:1004E0001A6922F000521A611B6972B64FF0E023BC +:1004F000C3F8084DD4E90004BFF34F8FBFF36F8FEB +:10050000214AC2F88410BFF34F8F536923F480331C +:100510005361BFF34F8FD2F8803043F6E076C3F3D8 +:10052000C905C3F34E335B0103EA060C29464CEAC6 +:1005300081770139C2F87472F9D2203B13F1200F90 +:10054000F2D1BFF34F8FBFF36F8FBFF34F8FBFF366 +:100550006F8F536923F4003353610023C2F8503284 +:10056000BFF34F8FBFF36F8F302383F3118885461E +:1005700080F308882047F8BD00800108208001082A +:10058000002202200038024000ED00E02DE9F04F8B +:1005900093B0B44B2022FF2100900AA89D6800F080 +:1005A000F7FBB14A1378A3B90121B0481170036079 +:1005B000302383F3118803680BB101F0DBFD0023C6 +:1005C000AB4A4FF47A71A94801F0CAFD002383F3C6 +:1005D0001188009B13B1A74B009A1A60A64A1378A2 +:1005E000032B03D000231370A24A53604FF0000A7C +:1005F000009CD3465646D146012000F08FFB24B123 +:100600009C4B1B68002B00F02682002000F092FA21 +:100610000390039B002BF2DB012000F07DFB039B8A +:10062000213B1F2BE8D801A252F823F0AD060008A9 +:10063000D506000869070008F9050008F905000853 +:10064000F9050008FB070008CB090008E5080008C9 +:10065000470900086F09000895090008F905000816 +:10066000A7090008F9050008190A00084D07000845 +:10067000F90500085D0A0008B90600084D070008E2 +:10068000F905000847090008F9050008F905000800 +:10069000F9050008F9050008F9050008F905000842 +:1006A000F9050008F9050008690700080220FFF7AE +:1006B0007DFE002840F0F981009B022105A8BAF1D7 +:1006C000000F08BF1C4641F21233ADF8143000F0A1 +:1006D0004FFA91E74FF47A7000F02CFA071EEBDB2B +:1006E0000220FFF763FE0028E6D0013F052F00F24D +:1006F000DE81DFE807F0030A0D101336052304211D +:1007000005A8059300F034FA17E004215548F9E7ED +:1007100004215A48F6E704215948F3E74FF01C0832 +:10072000404608F1040800F055FA0421059005A898 +:1007300000F01EFAB8F12C0FF2D101204FF00009A1 +:1007400000FA07F747EA0B0B5FFA8BFB00F06CFB34 +:1007500026B10BF00B030B2B08BF0024FFF72EFE76 +:100760004AE704214748CDE7002EA5D00BF00B0344 +:100770000B2BA1D10220FFF719FE074600289BD0C2 +:100780000120002600F024FA0220FFF75FFE1FFA86 +:1007900086F8404600F02CFA0446B0B10399404672 +:1007A0000136A1F140025142514100F031FA0028D6 +:1007B000EDD1BA46044641F21213022105A83E4685 +:1007C000ADF8143000F0D4F916E725460120FFF704 +:1007D0003DFE244B9B68AB4207D9284600F0FAF94E +:1007E000013040F067810435F3E70025224BBA461B +:1007F0003E461D701F4B5D60A8E7002E3FF45CAFC6 +:100800000BF00B030B2B7FF457AF0220FFF71EFEFC +:10081000322000F08FF9B0F10008FFF64DAF18F06C +:1008200003077FF449AF0F4A08EB05039268934230 +:100830003FF642AFB8F5807F3FF73EAF124BB84569 +:10084000019323DD4FF47A7000F074F90390039A5A +:10085000002AFFF631AF039A0137019B03F8012B01 +:10086000EDE700BF002202208C230220702202202C +:10087000D5030008902302208822022004220220AF +:10088000082202200C2202208C220220C820FFF71E +:100890008DFD074600283FF40FAF1F2D11D8C5F17D +:1008A00020020AAB25F0030084494245184428BFC2 +:1008B0004246019200F046FA019AFF217F4800F07B +:1008C00067FA4FEAA803C8F387027C4928460193D8 +:1008D00000F066FA064600283FF46DAF019B05EB79 +:1008E000830533E70220FFF761FD00283FF4E4AE03 +:1008F00000F0BAF900283FF4DFAE0027B846704B8D +:100900009B68BB4218D91F2F11D80A9B01330ED008 +:1009100027F0030312AA134453F8203C05934046E2 +:10092000042205A9043700F0E7FA8046E7E73846D5 +:1009300000F050F90590F2E7CDF81480042105A8E5 +:1009400000F016F902E70023642104A8049300F0E4 +:1009500005F900287FF4B0AE0220FFF727FD00283C +:100960003FF4AAAE049800F067F90590E6E700238B +:10097000642104A8049300F0F1F800287FF49CAEF1 +:100980000220FFF713FD00283FF496AE049800F014 +:1009900063F9EAE70220FFF709FD00283FF48CAE77 +:1009A00000F072F9E1E70220FFF700FD00283FF4B4 +:1009B00083AE05A9142000F06DF9074604210490C8 +:1009C00004A800F0D5F83946B9E7322000F0B2F8B3 +:1009D000071EFFF671AEBB077FF46EAE384A07EB19 +:1009E0000903926893423FF667AE0220FFF7DEFCF0 +:1009F00000283FF461AE27F003074F44B9453FF4A8 +:100A0000A5AE484609F1040900F0E4F80421059078 +:100A100005A800F0ADF8F1E74FF47A70FFF7C6FCD7 +:100A200000283FF449AE00F01FF9002844D00A9B8B +:100A300001330BD008220AA9002000F0B1F90028E8 +:100A40003AD02022FF210AA800F0A2F9FFF7B6FC55 +:100A50001C4801F0C9FA13B0BDE8F08F002E3FF436 +:100A60002BAE0BF00B030B2B7FF426AE002364217F +:100A700005A8059300F072F8074600287FF41CAE25 +:100A80000220FFF793FC804600283FF415AEFFF7E5 +:100A900095FC41F2883001F0A7FA059800F00AFAB7 +:100AA00046463C4600F0C0F9A6E506464EE64FF045 +:100AB000000901E6BA467EE637467CE68C22022033 +:100AC00000220220A08601002DE9F84F4FF47A732E +:100AD00006460D46002402FB03F7DFF85080DFF8DE +:100AE000509098F900305FFA84FA5A1C01D0A34262 +:100AF00010D159F824002A4631460368D3F820B0B3 +:100B00003B46D847854205D1074B012083F800A01A +:100B1000BDE8F88F0134042CE3D14FF4FA7001F0F2 +:100B200063FA0020F4E700BFDC2302201022022039 +:100B300014220220002307B5024601210DF107000F +:100B40008DF80730FFF7C0FF20B19DF8070003B014 +:100B50005DF804FB4FF0FF30F9E700000A4604217E +:100B600008B5FFF7B1FF80F00100C0B2404208BDF8 +:100B7000074B0A4630B41978064B53F8214001461A +:100B800023682046DD69044BAC4630BC604700BF9B +:100B9000DC23022014220220A086010070B50A4E38 +:100BA00000240A4D01F030FD3080286833888342EC +:100BB00008D901F023FD2B6804440133B4F5C03F8C +:100BC0002B60F2D370BD00BFDE23022098230220E9 +:100BD00001F0C8BD00F1006000F5C030006870474A +:100BE00000F10060920000F5C03001F053BD00003C +:100BF000054B1A68054B1B889B1A834202D9104487 +:100C000001F0FCBC0020704798230220DE23022064 +:100C100038B50446074D29B128682044BDE838405E +:100C200001F00CBD2868204401F0F0FC0028F3D04E +:100C300038BD00BF9823022010F0030309D1B0F59E +:100C4000846F04D200F10050A0F5712003681846AB +:100C500070470023FBE7000000F10050A0F5712071 +:100C6000D0F8200470470000064991F8243033B1D1 +:100C700000230822086A81F82430FFF7B1BF012061 +:100C8000704700BF9C230220014B1868704700BFCB +:100C9000002004E01E4B0138F0B51D680A1803233C +:100CA0001C482E0CC5F30B0435460788A7420BD110 +:100CB00044680B46013C934218461BD214F9010FBD +:100CC00048B103F8010BF6E7013B00F10800ECD155 +:100CD00091420ED20B4618462C24B6F5805F00F8E0 +:100CE000014B0AD1824202D94122981C5A70401A03 +:100CF000F0BD0846B6F5805FF9D041F201039D4290 +:100D0000F5D18242F3D95A2300F8013BEFE700BF47 +:100D1000002004E0242202207047000070470000F9 +:100D20007047000070B504464FF47A764CB1412C00 +:100D3000254628BF412506FB05F0641B01F054F948 +:100D4000F4E770BD002310B5934203D0CC5CC454CB +:100D50000133F9E710BD0000013810B510F9013F6B +:100D60003BB191F900409C4203D11AB10131013AE3 +:100D7000F4E71AB191F90020981A10BD1046FCE76B +:100D800003460246D01A12F9011B0029FAD1704716 +:100D900002440346934202D003F8011BFAE770476E +:100DA0002DE9F8431F4D14460746884695F8242040 +:100DB00052BBDFF870909CB395F824302BB92022F9 +:100DC000FF2148462F62FFF7E3FF95F824004146D4 +:100DD000C0F1080205EB8000A24228BF2246D6B22D +:100DE0009200FFF7AFFF95F82430A41B17441E4470 +:100DF0009044E4B2F6B2082E85F82460DBD1FFF708 +:100E000033FF0028D7D108E02B6A03EB820383422B +:100E1000CFD0FFF729FF0028CBD10020BDE8F88311 +:100E20000120FBE79C230220024B1A78024B1A7028 +:100E3000704700BFDC23022010220220F8B5184CB6 +:100E4000184800F02FFC2146164800F057FC246893 +:100E50004FF47A70144EE26E144DD2F80438114FEC +:100E600043F00203C2F80438FFF75CFF2046104944 +:100E700000F04CFDE26E0424D2F8043823F00203A3 +:100E8000C2F804384FF4E133336055F8040BB8422C +:100E900002D0314600F066FB013CF6D1F8BD00BF40 +:100EA000A03E0008982D0220C42302201422022014 +:100EB000A83E00080C4B70B50C4D04461E780C4B38 +:100EC00055F826209A420DD00A4B002118221846C8 +:100ED000FFF75EFF0460014655F82600BDE870404C +:100EE00000F040BB70BD00BFDC23022014220220B2 +:100EF000982D0220C423022030B50A44084D9142A7 +:100F00000DD011F8013B5840082340F30004013B89 +:100F10002C4013F0FF0384EA5000F6D1EFE730BD18 +:100F20002083B8ED026843681143016003B118479C +:100F300070470000024A136843F0C0031360704713 +:100F400000440040024A136843F0C0031360704736 +:100F500000480040024A136843F0C0031360704722 +:100F60000078004037B5274C274D204600F0EEFAB8 +:100F700004F11400009400234FF48072234900F020 +:100F8000ABF94FF48072224904F138000094214BF0 +:100F900000F024FA204BC4E91735204C204600F01D +:100FA000D5FA04F11400009400234FF480721C4918 +:100FB00000F092F94FF480721A4904F1380000945D +:100FC000194B00F00BFA194BC4E91735184C2046A1 +:100FD00000F0BCFA04F1140000234FF480721549AC +:100FE000009400F079F9144B4FF48072134904F126 +:100FF0003800009400F0F2F9114BC4E9173503B042 +:1010000030BD00BFE023022080F9370324250220F1 +:1010100024280220350F0008004400404C24022000 +:101020002426022024290220450F00080048004001 +:10103000B824022024270220550F0008242A022069 +:1010400000780040037C30B52E4C002918BF0C46B8 +:10105000012B13D12C4B98420AD12C4B1A6C42F421 +:1010600000321A641A6E42F400321A661B6E05E0F2 +:10107000274B98422FD0274B984235D02268036ED9 +:10108000C16D03EB52038466B3FBF2F3626815048F +:1010900042BF23F0070503F0070343EA4503CB6093 +:1010A000A36843F040034B60E36843F001038B60A7 +:1010B00042F4967343F001030B604FF0FF330B6271 +:1010C000510505D512F0102217D0B2F1805F16D06D +:1010D00080F8643030BD0D4B1A6C42F480221A64E3 +:1010E0001A6E42F48022C0E7084B1A6C42F080422C +:1010F0001A641A6E42F08042B7E77F23E8E73F2385 +:10110000E6E700BFB03D0008E023022000380240BF +:101110004C240220B82402202DE9F047C66D054674 +:101120003768F469210734621AD014F0080118BF37 +:101130004FF48071E20748BF41F02001A3074FF050 +:10114000300348BF41F04001600748BF41F08001D3 +:1011500083F31188281DFFF7E5FE002383F3118830 +:10116000E2050AD5302383F311884FF48061281DEE +:10117000FFF7D8FE002383F311884FF030094FF0BA +:10118000000A14F0200838D13B0616D54FF030097C +:1011900005F1380A200610D589F31188504600F071 +:1011A00051F9002836DA0821281DFFF7BBFE27F089 +:1011B00080033360002383F31188790614D5620617 +:1011C00012D5302383F31188D5E913239A4208D12D +:1011D0002B6C33B127F040071021281DFFF7A2FE2A +:1011E0003760002383F31188E30618D5AA6E1369CC +:1011F000ABB15069BDE8F047184789F31188736AAD +:10120000284695F86410194000F0BAF98AF311885D +:10121000F469B6E7B06288F31188F469BAE7BDE80B +:10122000F0870000F8B51546826804460B46AA42CE +:1012300000D28568A1692669761AB5420BD2184694 +:101240002A46FFF77FFDA3692B44A3612846A368C4 +:101250005B1BA360F8BD0CD9AF1B18463246FFF7E5 +:1012600071FD3A46E1683044FFF76CFDE3683B44AA +:10127000EBE718462A46FFF765FDE368E5E700005F +:1012800083689342F7B50446154600D28568D4E9D1 +:101290000460361AB5420BD22A46FFF753FD636944 +:1012A0002B4463612846A3685B1BA36003B0F0BDB9 +:1012B0000DD93246AF1B0191FFF744FD01993A4623 +:1012C000E0683144FFF73EFDE3683B44E9E72A4626 +:1012D000FFF738FDE368E4E710B50A440024C36172 +:1012E000029B8460C16002610362C0E90000C0E942 +:1012F000051110BD08B5D0E90532934201D18268CD +:1013000082B98268013282605A1C426119700021E0 +:10131000D0E904329A4224BFC368436100F080FEE2 +:10132000002008BD4FF0FF30FBE7000070B5302310 +:1013300004460E4683F31188A568A5B1A368A26987 +:10134000013BA360531CA36115782269934224BF1B +:10135000E368A361E3690BB120469847002383F358 +:101360001188284607E03146204600F049FE002853 +:10137000E2DA85F3118870BD2DE9F74F04460E4679 +:1013800017469846D0F81C904FF0300A8AF311881F +:101390004FF0000B154665B12A4631462046FFF74F +:1013A00041FF034660B94146204600F029FE00286F +:1013B000F1D0002383F31188781B03B0BDE8F08FD0 +:1013C000B9F1000F03D001902046C847019B8BF371 +:1013D0001188ED1A1E448AF31188DCE7C160C361ED +:1013E000009B82600362C0E905111144C0E900005E +:1013F00001617047F8B504460D461646302383F365 +:101400001188A768A7B1A368013BA36063695A1C50 +:1014100062611D70D4E904329A4224BFE3686361BB +:10142000E3690BB120469847002080F3118807E05C +:101430003146204600F0E4FD0028E2DA87F3118807 +:10144000F8BD0000D0E9052310B59A4201D18268A9 +:101450007AB982680021013282605A1C82611C784C +:1014600003699A4224BFC368836100F0D9FD204616 +:1014700010BD4FF0FF30FBE72DE9F74F04460E4655 +:1014800017469846D0F81C904FF0300A8AF311881E +:101490004FF0000B154665B12A4631462046FFF74E +:1014A000EFFE034660B94146204600F0A9FD002842 +:1014B000F1D0002383F31188781B03B0BDE8F08FCF +:1014C000B9F1000F03D001902046C847019B8BF370 +:1014D0001188ED1A1E448AF31188DCE7026843681C +:1014E0001143016003B11847704700001430FFF743 +:1014F00043BF00004FF0FF331430FFF73DBF000043 +:101500003830FFF7B9BF00004FF0FF333830FFF736 +:10151000B3BF00001430FFF709BF00004FF0FF31E8 +:101520001430FFF703BF00003830FFF763BF00003F +:101530004FF0FF323830FFF75DBF0000012914BFC4 +:101540006FF0130000207047FFF70CBD044B0360E1 +:1015500000234360C0E9023301230374704700BFD6 +:10156000C83D000810B53023044683F31188FFF707 +:1015700069FD02230020237480F3118810BD000050 +:1015800038B5C36904460D461BB904210844FFF76A +:10159000A5FF294604F11400FFF7ACFE002806DA87 +:1015A000201D4FF40061BDE83840FFF797BF38BDFC +:1015B000026843681143016003B118477047000097 +:1015C00013B5446BD4F8A4381A681178042915D1DE +:1015D000217C022912D11979012312898B401342EF +:1015E0000CD101A904F14C0001F07CFFD4F8A4480F +:1015F0000246019B2179206800F0D6F902B010BDA7 +:10160000143001F0FFBE00004FF0FF33143001F042 +:10161000F9BE00004C3001F0D1BF00004FF0FF33A5 +:101620004C3001F0CBBF0000143001F0CDBE000003 +:101630004FF0FF31143001F0C7BE00004C3001F014 +:101640009DBF00004FF0FF324C3001F097BF00000B +:1016500000207047D0F8A4381A6810B511780446F5 +:10166000042917D1017C022914D159790123528907 +:101670008B4013420ED1143001F060FE024648B197 +:10168000D4F8A4484FF4807361792068BDE8104015 +:1016900000F078B910BD0000406BFFF7DBBF000021 +:1016A000704700007FB5124B0125042604460360F5 +:1016B0000023057400F1840243602946C0E9023327 +:1016C0000C4B0290143001934FF48073009601F09C +:1016D00011FE094B04F29442294604F14C00029495 +:1016E000CDE900634FF4807301F0D8FE04B070BD03 +:1016F000F03D000899160008C11500080B6830225B +:1017000082F311880A7903EB820210624A790D3262 +:1017100043F822008A7912B103EB82031862022394 +:10172000C0F8A4180374002080F3118870470000EB +:1017300038B5037F044613B190F85430ABB9012596 +:10174000201D0221FFF734FF04F114006FF00101A6 +:10175000257700F071FC04F14C0084F854506FF0D0 +:101760000101BDE8384000F067BC38BD10B501216B +:1017700004460430FFF71CFF0023237784F854301D +:1017800010BD000038B504460025143001F0CAFD34 +:1017900004F14C00257701F099FE201D84F8545087 +:1017A0000121FFF705FF2046BDE83840FFF752BF93 +:1017B00090F85C3003F06003202B06D190F85D2098 +:1017C0000023212A03D81F2A06D800207047222A86 +:1017D000FBD1C0E9143303E0034A026507224265E6 +:1017E00083650120704700BF3C220220D0F8A43856 +:1017F00037B51A680446117804291AD1017C0229E8 +:1018000017D11979012312898B40134211D100F1AC +:101810004C05284601F01AFF58B101A9284601F0ED +:1018200061FED4F8A4480246019B2179206800F0AB +:10183000BBF803B030BD000000EB8103F0B51E6AB9 +:1018400085B004460D46FEB1302383F3118804EBC6 +:101850008507301D0821FFF7ABFEFB6806F14C0041 +:101860005B691B681BB1019001F04AFE019803A956 +:1018700001F038FE024648B1039B2946204600F09D +:1018800093F8002383F3118805B0F0BDFB685A6913 +:101890001268002AF5D01B8A013B1340F1D104F1F4 +:1018A0005C02EAE70D3138B550F82140DCB1302355 +:1018B00083F31188D4F8A4281368527903EB8203C8 +:1018C000DB689B695D6845B104216018FFF770FE15 +:1018D000294604F1140001F03BFD2046FFF7BAFE53 +:1018E000002383F3118838BD7047000001F088B8E9 +:1018F00001232822002110B5044600F8243BFFF7FD +:1019000047FA0023C4E9013310BD000038B504468E +:10191000302383F3118800254160C0E90355C0E9F5 +:101920000555C0E9075501F07BF80223237085F3C4 +:101930001188284638BD000070B500EB81030546CC +:1019400050690E461446DA6018B110220021FFF7E4 +:101950001FFAA06918B110220021FFF719FA3146C9 +:101960002846BDE8704001F025B90000826802F009 +:10197000011282600022C0E90422C0E9062202624C +:1019800001F0A4B9F0B4012500EB810447898D4032 +:10199000E4683D43A469458123600023A26063603D +:1019A000F0BC01F0BFB90000F0B4012500EB8104E8 +:1019B00007898D40E4683D43646905812360002305 +:1019C000A2606360F0BC01F039BA000070B5022378 +:1019D0000025044603704566056280F84C50C0E956 +:1019E0000255C0E90455C0E9065501F07FF8636867 +:1019F0001B6823B129462046BDE87040184770BDDA +:101A00000378052B10B504460AD080F8683005230A +:101A1000037043681B680BB1042198470023A3603F +:101A200010BD00000178052906D190F868204368B0 +:101A300002701B6803B118477047000070B590F83A +:101A40004C30044613B1002380F84C3004F15C02A2 +:101A5000204601F05DF963689B68B3B994F85C3087 +:101A600013F0600535D00021204601F00FFC002165 +:101A7000204601F001FC63681B6813B10621204673 +:101A80009847062384F84C3070BD204698470028BC +:101A9000E4D0B4F86230626D9A4288BF636594F90D +:101AA0005C30656D002B4FF0300380F20381002D18 +:101AB00000F0F280092284F84C2083F31188002181 +:101AC0002046D4E91423FFF76FFF002383F3118826 +:101AD000DAE794F85D2003F07F0343EA022340F243 +:101AE0000232934200F0C58021D8B3F5807F48D000 +:101AF0000DD8012B3FD0022B00F09380002BB2D1E8 +:101B000004F16402226502226265A365C1E7B3F5B0 +:101B1000817F00F09B80B3F5407FA4D194F85E30C4 +:101B2000012BA0D1B4F8643043F0020332E0B3F5E6 +:101B3000006F4DD017D8B3F5A06F31D0A3F5C063B7 +:101B4000012B90D86368204694F85E205E6894F874 +:101B50005F10B4F86030B047002884D04368236534 +:101B6000036863651AE0B3F5106F36D040F60242A1 +:101B700093427FF478AF5C4B2365022363650023B7 +:101B8000C3E794F85E30012B7FF46DAFB4F8643096 +:101B900023F00203A4F86430C4E91455A56578E77E +:101BA000B4F85C30B3F5A06F0ED194F85E302046E7 +:101BB00084F8663000F0F2FF63681B6813B10121FE +:101BC00020469847032323700023C4E914339CE77D +:101BD00004F1670323650123C3E72378042B10D1A5 +:101BE000302383F311882046FFF7C0FE85F3118868 +:101BF0000321636884F8675021701B680BB120468D +:101C0000984794F85E30002BDED084F867300423C8 +:101C1000237063681B68002BD6D0022120469847AA +:101C2000D2E794F8603020461D0603F00F010AD574 +:101C300001F060F8012804D002287FF414AF2B4B88 +:101C40009AE72B4B98E701F047F8F3E794F85E30FA +:101C5000002B7FF408AF94F8603013F00F01B3D07D +:101C60001A06204602D501F025FBADE701F018FB6E +:101C7000AAE794F85E30002B7FF4F5AE94F860305C +:101C800013F00F01A0D01B06204602D501F0FEFA8A +:101C90009AE701F0F1FA97E7142284F84C2083F3D5 +:101CA00011882B462A4629462046FFF76BFE85F30E +:101CB0001188E9E65DB1152284F84C2083F3118880 +:101CC00000212046D4E91423FFF75CFEFDE60B2239 +:101CD00084F84C2083F311882B462A462946204657 +:101CE000FFF762FEE3E700BF203E0008183E000851 +:101CF0001C3E000838B590F84C300446002B3ED00E +:101D0000063BDAB20F2A34D80F2B32D8DFE803F0C3 +:101D100037313108223231313131313131313737D8 +:101D2000456DB0F862309D4214D2C3681B8AB5FB82 +:101D3000F3F203FB12556DB9302383F311882B4660 +:101D40002A462946FFF730FE85F311880A2384F8D6 +:101D50004C300EE0142384F84C30302383F3118888 +:101D6000002320461A461946FFF70CFE002383F392 +:101D7000118838BD836D03B198470023E7E7002140 +:101D8000204601F083FA0021204601F075FA6368CD +:101D90001B6813B10621204698470623D7E70000A9 +:101DA00010B590F84C300446142B29D017D8062BC8 +:101DB00005D001D81BB110BD093B022BFBD8002177 +:101DC000204601F063FA0021204601F055FA6368CD +:101DD0001B6813B1062120469847062319E0152BEE +:101DE000E9D10B2380F84C30302383F31188002392 +:101DF0001A461946FFF7D8FD002383F31188DAE766 +:101E0000C3689B695B68002BD5D1836D03B198478C +:101E1000002384F84C30CEE7002382680375036901 +:101E20001B6899689142FBD25A6803604260106057 +:101E30005860704700238268037503691B689968BE +:101E40009142FBD85A680360426010605860704746 +:101E500008B50846302383F311880B7D032B05D08A +:101E6000042B0DD02BB983F3118808BD8B69002298 +:101E70001A604FF0FF338361FFF7CEFF0023F2E7D4 +:101E8000D1E9003213605A60F3E70000FFF7C4BFE6 +:101E9000054BD96808751868026853601A600122FA +:101EA000D8600275FEF73EBA282B02200C4B30B5E5 +:101EB000DD684B1C87B004460FD02B46094A6846A4 +:101EC00000F04EF92046FFF7E3FF009B13B1684690 +:101ED00000F050F9A86907B030BDFFF7D9FFF9E766 +:101EE000282B0220511E0008044B1A68DB689068FA +:101EF0009B68984294BF002001207047282B022045 +:101F0000084B10B51C68D868226853601A6001221B +:101F1000DC602275FFF78EFF01462046BDE81040C9 +:101F2000FEF700BA282B022038B5074C0123002504 +:101F3000064907482370656001F0C0FB0223237047 +:101F400085F3118838BD00BF902D0220283E00087F +:101F5000282B022000F044B9034A516853685B1AE9 +:101F60009842FBD8704700BF001000E08B6002234E +:101F7000086108468B8270478368A3F1840243F8A6 +:101F8000142C026943F8442C426943F8402C094A56 +:101F900043F8242CC268A3F1200043F8182C022235 +:101FA00003F80C2C002203F80B2C034A43F8102CE6 +:101FB000704700BF3D030008282B022008B5FFF73B +:101FC000DBFFBDE80840FFF761BF0000024BDB68A4 +:101FD00098610F20FFF75CBF282B0220302383F38A +:101FE0001188FFF7F3BF000008B50146302383F3E3 +:101FF00011880820FFF75AFF002383F3118808BDDA +:10200000064BDB6839B1426818605A601360436060 +:102010000420FFF74BBF4FF0FF307047282B022002 +:102020000368984206D01A680260506018469961A9 +:10203000FFF72CBF7047000038B504460D462068F6 +:10204000844200D138BD036823605C608561FFF77E +:102050001DFFF4E7036810B59C68A2420CD85C68C9 +:102060008A600B604C602160596099688A1A9A6096 +:102070004FF0FF33836010BD121B1B68ECE70000BC +:102080000A2938BF0A2170B504460D460A26601990 +:1020900001F00EFB01F0FAFA041BA54203D8751CEF +:1020A00004462E46F3E70A2E04D90120BDE870400D +:1020B00001F044BB70BD0000F8B5144B0D460A2A70 +:1020C0004FF00A07D96103F11001826038BF0A227C +:1020D000416019691446016048601861A81801F050 +:1020E000D9FA01F0D3FA431B0646A34206D37C1C5F +:1020F00028192746354601F0DBFAF2E70A2F04D902 +:102100000120BDE8F84001F019BBF8BD282B0220E2 +:10211000F8B506460D4601F0B9FA0F4A134653F8D2 +:10212000107F9F4206D12A4601463046BDE8F8405E +:10213000FFF7C2BFD169BB68441A2C1928BF2C46CF +:10214000A34202D92946FFF79BFF224631460348A6 +:10215000BDE8F840FFF77EBF282B0220382B022075 +:10216000C0E90323002310B45DF8044B4361FFF77B +:10217000CFBF000010B5194C236998420DD081687B +:10218000D0E9003213605A609A680A449A600023CA +:1021900003604FF0FF33A36110BD0268234643F88C +:1021A000102F53600022026022699A4203D1BDE8D9 +:1021B000104001F077BA936881680B44936001F096 +:1021C00065FA2269E1699268441AA242E4D911448D +:1021D000BDE81040091AFFF753BF00BF282B0220AB +:1021E0002DE9F047DFF8BC8008F110072C4ED8F835 +:1021F000105001F04BFAD8F81C40AA68031B9A4211 +:102200003ED814444FF00009D5E90032C8F81C400C +:1022100013605A60C5F80090D8F81030B34201D16D +:1022200001F040FA89F31188D5E90331284698472F +:10223000302383F311886B69002BD8D001F026FA84 +:102240006A69A0EB040982464A450DD2022001F0DA +:1022500075FA0022D8F81030B34208D1514628460A +:10226000BDE8F047FFF728BF121A2244F2E712EB4D +:1022700009092946384638BF4A46FFF7EBFEB5E75D +:10228000D8F81030B34208D01444C8F81C00211A02 +:10229000A960BDE8F047FFF7F3BEBDE8F08700BFD7 +:1022A000382B0220282B022000207047FEE7000078 +:1022B000704700004FF0FF307047000002290CD03B +:1022C000032904D00129074818BF00207047032ABA +:1022D00005D8054800EBC20070470448704700204D +:1022E000704700BF043F00084C220220B83E00089F +:1022F00070B59AB005460846144601A900F0C2F828 +:1023000001A8FEF73DFD431C0022C6B25B0010464B +:10231000C5E9003423700323023404F8013C01AB07 +:10232000D1B202348E4201D81AB070BD13F8011B2D +:10233000013204F8010C04F8021CF1E708B530235F +:1023400083F311880348FFF751FA002383F31188C0 +:1023500008BD00BF982D022090F85C3003F01F02EA +:10236000012A07D190F85D200B2A03D10023C0E990 +:10237000143315E003F06003202B08D1B0F860306F +:102380002BB990F85D20212A03D81F2A04D8FFF723 +:102390000FBA222AEBD0FAE7034A02650722426508 +:1023A00083650120704700BF4322022007B505293D +:1023B00017D8DFE801F0191603191920302383F329 +:1023C0001188104A01210190FFF7B6FA0198022105 +:1023D0000D4AFFF7B1FA0D48FFF7D4F9002383F354 +:1023E000118803B05DF804FB302383F3118807489C +:1023F000FFF79EF9F2E7302383F311880348FFF7D4 +:10240000B5F9EBE7583E00087C3E0008982D022005 +:1024100038B50C4D0C4C2A460C4904F10800FFF766 +:1024200067FF05F1CA0204F110000949FFF760FFD8 +:1024300005F5CA7204F118000649BDE83840FFF7F7 +:1024400057BF00BF703602204C220220343E0008E5 +:10245000413E00084C3E000870B5044608460D4653 +:10246000FEF78EFCC6B22046013403780BB918463D +:1024700070BD32462946FEF76FFC0028F3D10120DB +:10248000F6E700002DE9F04705460C46FEF778FC1C +:102490002B49C6B22846FFF7DFFF08B10A36F6B26D +:1024A00028492846FFF7D8FF08B11036F6B2632E48 +:1024B0000BD8DFF88C80DFF88C90234FDFF894A0E6 +:1024C0002E7846B92670BDE8F08729462046BDE83B +:1024D000F04701F04FBC252E2ED107224146284659 +:1024E000FEF73AFC70B9194B224603F1100153F87C +:1024F000040B8B4242F8040BF9D11B7807351134D9 +:102500001370DDE7082249462846FEF725FC98B9F6 +:10251000A21C0F4B197802320909C95D02F8041C8C +:1025200013F8011B01F00F015345C95D02F8031CAC +:10253000F0D118340835C3E7013504F8016BBFE763 +:10254000243F00084C3E00083E3F00082C3F000896 +:1025500020F4F01F2CF4F01FBFF34F8F024AD36812 +:10256000DB03FCD4704700BF003C024008B5074BBA +:102570001B7853B9FFF7F0FF054B1A69002A04DAFC +:10258000044A5A6002F188325A6008BDCE380220EF +:10259000003C02402301674508B5054B1B7833B961 +:1025A000FFF7DAFF034A136943F00043136108BDE4 +:1025B000CE380220003C02400B28F0B516D80C4C57 +:1025C0000C4923787BB90E460B4D0C234FF000626B +:1025D000013B55F8047B46F8042B13F0FF033A4403 +:1025E000F6D10123237051F82000F0BD0020FCE754 +:1025F00000390220D0380220503F0008014B53F828 +:1026000020007047503F00080C2070470B2810B581 +:10261000044601D9002010BDFFF7CEFF064B53F84A +:1026200024301844C21A0BB90120F4E712680132B1 +:10263000F0D1043BF6E700BF503F00080B2810B56F +:10264000044621D8FFF788FFFFF790FF0F4AF323D6 +:10265000D360C300DBB243F4007343F002031361A1 +:10266000136943F480331361FFF776FFFFF7A4FF8C +:10267000074B53F8241000F0D9F82046FFF78CFFE1 +:10268000BDE81040FFF7C2BF002010BD003C024073 +:10269000503F0008F8B512F00103144642D18218E9 +:1026A000B2F1026F57D82D4B1B6813F0010352D0C3 +:1026B000FFF75CFF2A4DF32340F20127EB60FFF7A1 +:1026C0004BFF032C15D824F00104401A40F20117E7 +:1026D0006618234CB14200EB0105236924D123F095 +:1026E000010301202361FFF757FFF8BD043C0430CC +:1026F000E7E78307E7D12B6923F440732B612B694C +:102700003B432B6151F8046B0660BFF34F8FFFF71B +:1027100023FF03689E42E9D02B6923F001032B615C +:10272000FFF73AFF0020E0E723F4407323612369B9 +:102730003B4323610B882B80BFF34F8FFFF70CFFC8 +:102740002D88ADB231F8023BAB42C3D0236923F0F0 +:1027500001032361E4E71846C7E700BF00380240E1 +:10276000003C0240084908B50B7828B11BB9FFF7B7 +:10277000FDFE01230B7008BD002BFCD00870BDE8E6 +:102780000840FFF709BF00BFCE3802200244074BC4 +:10279000D2B210B5904200D110BD441C00B253F823 +:1027A000200041F8040BE0B2F4E700BF50280040DD +:1027B0000F4B30B51C6F240407D41C6F44F4007415 +:1027C0001C671C6F44F400441C670A4C02442368D5 +:1027D000D2B243F480732360074B904200D130BDE6 +:1027E000441C51F8045B00B243F82050E0B2F4E717 +:1027F00000380240007000405028004007B5012218 +:1028000001A90020FFF7C2FF019803B05DF804FBA7 +:1028100013B50446FFF7F2FFA04205D0012201A93B +:1028200000200194FFF7C4FF02B010BD0144BFF3C4 +:102830004F8F064B884204D3BFF34F8FBFF36F8F88 +:102840007047C3F85C022030F4E700BF00ED00E001 +:10285000034B1A681AB9034AD2F874281A607047F1 +:10286000043902200030024008B5FFF7F1FF024BA7 +:102870001868C0F3407008BD0439022070B5BFF37A +:102880004F8FBFF36F8F1A4A0021C2F85012BFF367 +:102890004F8FBFF36F8F536943F400335361BFF31E +:1028A0004F8FBFF36F8FC2F88410BFF34F8FD2F8F2 +:1028B000803043F6E074C3F3C900C3F34E335B01C9 +:1028C00003EA0406014646EA81750139C2F86052FE +:1028D000F9D2203B13F1200FF2D1BFF34F8F536990 +:1028E00043F480335361BFF34F8FBFF36F8F70BDDD +:1028F00000ED00E0FEE70000214B2248224A70B5BF +:10290000904237D3214BC11EDA1C121A22F0030267 +:102910008B4238BF00220021FEF73AFA1C4A0023FE +:10292000C2F88430BFF34F8FD2F8803043F6E074A2 +:10293000C3F3C900C3F34E335B0103EA0406014647 +:1029400046EA81750139C2F86C52F9D2203B13F185 +:10295000200FF2D1BFF34F8FBFF36F8FBFF34F8FB5 +:10296000BFF36F8F0023C2F85032BFF34F8FBFF316 +:102970006F8F70BD53F8041B40F8041BC0E700BF05 +:102980005C410008183A0220183A0220183A022046 +:1029900000ED00E070B5D0E91B4300224FF0FF3599 +:1029A0009E6804EB42135101D3F80009002805DAB0 +:1029B000D3F8000940F08040C3F80009D3F8000BB9 +:1029C000002805DAD3F8000B40F08040C3F8000B74 +:1029D000013263189642C3F80859C3F8085BE0D285 +:1029E0004FF00113C4F81C3870BD0000890141F09C +:1029F0002001016103699B06FCD41220FFF7ACBAE9 +:102A000010B5054C2046FEF773FF4FF0A043E36678 +:102A1000024B236710BD00BF08390220A43F000805 +:102A200070B503780546012B50D12A4BC46E9842ED +:102A30001BD1294B0E2143205A6B42F080025A636E +:102A40005A6D42F080025A655A6D5A6942F080020E +:102A50005A615A6922F080025A615B6900F034FCC5 +:102A60001E4BE3601E4BC4F800380023EE6EC4F822 +:102A7000003EC02323604FF40413A3633369002B8B +:102A8000FCDA01230C203361FFF766FA3369DB07B8 +:102A9000FCD41220FFF760FA3369002BFCDA002621 +:102AA0002846A660FFF776FF6B68C4F81068DB68FD +:102AB000C4F81468C4F81C684BB90A4BA3614FF002 +:102AC000FF336361A36843F00103A36070BD064B4D +:102AD000F4E700BF083902200038024040140040EB +:102AE00003002002003C30C0083C30C0F8B5C46E82 +:102AF000054600214FF000662046FFF777FF296F5B +:102B000000234FF001128F684FF0FF30C4F83438C3 +:102B1000C4F81C2804EB431201339F42C2F8006939 +:102B2000C2F8006BC2F80809C2F8080BF2D20B68B1 +:102B3000EA6E6B67636210231361166916F0100664 +:102B4000FBD11220FFF708FAD4F8003823F4FE6313 +:102B5000C4F80038A36943F4402343F01003A36191 +:102B60000923C4F81038C4F814380A4BEB604FF04E +:102B7000C043C4F8103B084BC4F8003BC4F81069CC +:102B8000C4F800396B6F03F1100243F480136A67D5 +:102B9000A362F8BD803F000840800010C26E90F82C +:102BA0006610D2F8003823F4FE6343EA0113C2F83A +:102BB000003870472DE9F84300EB8103C56E0C46E1 +:102BC0008046DA680FFA81F94801166806F00306B4 +:102BD000731E022B05EB41134FF0000194BFB604A6 +:102BE000384EC3F8101B4FF0010104F1100398BFD9 +:102BF00006F1805601FA03F3916998BF06F5004685 +:102C000000293AD0578A04F15801374349016F50DF +:102C1000D5F81C180B430021C5F81C382B180127C8 +:102C2000C3F81019A7405369611E9BB3138A928B96 +:102C30009B08012A88BF5343D8F87420981842EAA9 +:102C4000034301F140022146C8F87400284605EB11 +:102C500082025360FFF7CAFE08EB8900C3681B8A33 +:102C600043EA845348341E4364012E51D5F81C387E +:102C70001F43C5F81C78BDE8F88305EB4917D7F862 +:102C8000001B21F40041C7F8001BD5F81C1821EAED +:102C90000303C0E704F13F030B4A2846214605EB36 +:102CA00083035A60FFF7A2FE05EB4910D0F8003904 +:102CB00023F40043C0F80039D5F81C3823EA07078D +:102CC000D7E700BF0080001000040002026F126806 +:102CD0004267FFF75FBE00005831C36E49015B5881 +:102CE00013F4004004D013F4001F0CBF0220012095 +:102CF000704700004831C36E49015B5813F400402F +:102D000004D013F4001F0CBF022001207047000004 +:102D100000EB8101CB68196A0B6813604B68536044 +:102D20007047000000EB810330B5DD68AA691368C5 +:102D3000D36019B9402B84BF402313606B8A146899 +:102D4000C26E1C4402EB4110013C09B2B4FBF3F427 +:102D50006343033323F0030343EAC44343F0C04314 +:102D6000C0F8103B2B6803F00303012B0ED1D2F8FF +:102D7000083802EB411013F4807FD0F8003B14BFF9 +:102D800043F0805343F00053C0F8003B02EB411284 +:102D9000D2F8003B43F00443C2F8003B30BD0000D2 +:102DA0002DE9F041244D0446EE6E06EB4013D3F8B6 +:102DB000087B3807C3F8087B0AD5D6F814381907FA +:102DC00006D505EB840321462846DB685B689847F7 +:102DD000FA071FD5D6F81438DB071BD505EB84039B +:102DE000D968CCB98B69488A5A68B2FBF0F600FB07 +:102DF00016228AB91868DA6890420DD2121AC3E90D +:102E00000024302383F311880B482146FFF78AFF03 +:102E100084F31188BDE8F081012303FA04F26B8981 +:102E200023EA02036B81CB68002BF3D021460248D2 +:102E3000BDE8F041184700BF0839022000EB8103CC +:102E40004A0170B5DD68C36E6C692668E66056BBE2 +:102E50001A444FF40020C2F810092A6802F0030255 +:102E6000012A0AB20ED1D3F8080803EB421410F479 +:102E7000807FD4F8000914BF40F0805040F000502B +:102E8000C4F8000903EB4212D2F8000940F00440F4 +:102E9000C2F800090122D3F8340802FA01F1014313 +:102EA000C3F8341870BD19B9402E84BF402020608B +:102EB00020681A442E8A8419013CB4FBF6F440EAD7 +:102EC000C44040F00050C6E72DE9F8433B4D0446AE +:102ED0004701EE6E06EB4013D3F8088918F0010F96 +:102EE000C3F808891AD0D6F81038DB0716D505EBD9 +:102EF0008003D9684B691868DA68904230D2121A98 +:102F00004FF000091A60C3F80490302383F311884E +:102F100021462846FFF792FF89F3118818F0800FA9 +:102F20001CD0D6F834380126A640334216D005EB23 +:102F300084030134ED6ED3F80CC0E4B22F44DCF806 +:102F4000142005EB0434D2F800E05168714515D324 +:102F5000D5F8343823EA0606C5F83468BDE8F883A6 +:102F6000012303FA04F22B8923EA02032B818B68E5 +:102F7000002BD3D0214628469847CFE7AEEB01037C +:102F8000BCF81000834228BF0346D7F8180980B266 +:102F9000B3EB800FE2D89068A0F1040959F8048FD0 +:102FA000C4F80080A0EB09089844B8F1040FF5D8E4 +:102FB00018440B4490605360C7E700BF08390220F3 +:102FC0002DE9F74FA44CE56E6E69AB691E4016F40F +:102FD00080586E6107D02046FEF7F8FC03B0BDE8CC +:102FE000F04F00F069BC002E12DAD5F8003E9B07C6 +:102FF00005D0D5F8003E23F00303C5F8003ED5F810 +:103000000438954823F00103C5F80438FEF70AFD9B +:10301000370505D59048FFF7BDFC8F48FEF7F0FC5B +:10302000B0040CD5D5F8083813F0060FEB6823F47C +:1030300070530CBF43F4105343F4A053EB603107BB +:103040001BD56368DB681BB9AB6923F00803AB6170 +:103050002378052B0CD1D5F8003E9A0705D0D5F87A +:10306000003E23F00303C5F8003E7B48FEF7DAFC80 +:103070006368DB680BB178489847F30200F18980F8 +:10308000B70227D5D4F86C9000274FF0010ADFF87B +:10309000C8B109EB4712D2F8003B03F44023B3F563 +:1030A000802F11D1D2F8003B002B0DDA62890AFA89 +:1030B00007F322EA0303638104EB8703DB68DB6821 +:1030C00013B13946584698470137236FFFB29B68C2 +:1030D0009F42DED9F00617D5E76E3A6AC2F30A10AE +:1030E00002F00F0302F4F012B2F5802F00F0988086 +:1030F000B2F5402F08D104EB8303002207F5805777 +:10310000DB681B6A90427ED13303D5F818481DD581 +:10311000E70302D50020FFF743FEA50302D50120F7 +:10312000FFF73EFE600302D50220FFF739FE2103C0 +:1031300002D50320FFF734FEE20202D50420FFF798 +:103140002FFEA30202D50520FFF72AFE77037FF5A5 +:1031500045AFE60702D50020FFF7B6FEA50702D56A +:103160000120FFF7B1FE600702D50220FFF7ACFE99 +:10317000210702D50320FFF7A7FEE20602D50420AF +:10318000FFF7A2FEA3067FF529AF0520FFF79CFEFF +:1031900024E7E36E00274FF00109DFF8BCA001939C +:1031A000236F5FFA87FB9B689B453FF669AF019BE6 +:1031B00003EB4B13D3F8001901F44021B1F5802F34 +:1031C0001FD1D3F8001900291BDAD3F8001941F0F8 +:1031D0009041C3F80019D3F800190029FBDB5946C8 +:1031E000E06EFFF703FC218909FA0BF321EA0303E0 +:1031F000238104EB8B03DB689B6813B1594650466F +:1032000098470137CCE7910701D1D7F80080072A0A +:1032100002F101029CBF03F8018B4FEA182871E705 +:10322000023307F5805704EB83025268D2F818C0C6 +:10323000DCF80820DCE9001CA1EB0C0C0021884222 +:103240000CD104EB830463689B699A6802449A601A +:103250005A6802445A6057E70839022011F0030FF8 +:1032600001D1D7F800808C4501F1010184BF02F83B +:10327000018B4FEA1828E2E7C36E03EB4111D1F846 +:10328000003B43F40013C1F8003B7047C36E03EBEF +:103290004111D1F8003943F40013C1F800397047E7 +:1032A000C36E03EB4111D1F8003B23F40013C1F8C6 +:1032B000003B7047C36E03EB4111D1F8003923F492 +:1032C0000013C1F800397047090100F16043012281 +:1032D00003F56143C9B283F8001300F01F039A405D +:1032E00043099B0003F1604303F56143C3F8802168 +:1032F0001A60704730B50433039C0172002104FB4F +:103300000325C160C0E90653049B0363059BC0E924 +:103310000000C0E90422C0E90842C0E90A11436381 +:1033200030BD00000022416AC260C0E90411C0E95A +:103330000A226FF00101FEF77FBE0000D0E90432DF +:10334000934201D1C2680AB9181D70470020704726 +:10335000036919600021C2680132C260C269134466 +:1033600082699342036124BF436A0361FEF758BE3A +:1033700038B504460D46E3683BB162690020131D71 +:103380001268A3621344E36207E0237A33B9294643 +:103390002046FEF735FE0028EDDA38BD6FF001005B +:1033A000FBE70000C368C269013BC3604369134483 +:1033B00082699342436124BF436A4361002383626D +:1033C000036B03B11847704770B53023044683F38D +:1033D0001188866A3EB9FFF7CBFF054618B186F320 +:1033E0001188284670BDA36AE26A13F8015B934214 +:1033F000A36202D32046FFF7D5FF002383F3118891 +:10340000EFE700002DE9F84F04460E4617469846B0 +:103410004FF0300989F311880025AA46D4F828B066 +:10342000BBF1000F09D141462046FFF7A1FF20B1B3 +:103430008BF311882846BDE8F88FD4E90A12A7EB70 +:10344000050B521A934528BF9346BBF1400F1BD979 +:10345000334601F1400251F8040B914243F8040B4A +:10346000F9D1A36A403640354033A362D4E90A2338 +:103470009A4202D32046FFF795FF8AF31188BD4296 +:10348000D8D289F31188C9E730465A46FDF75AFC6D +:10349000A36A5E445D445B44A362E7E710B5029C07 +:1034A0000433017203FB0421C460C0E90613002346 +:1034B000C0E90A33039B0363049BC0E90000C0E931 +:1034C0000422C0E90842436310BD0000026A6FF0A5 +:1034D0000101C260426AC0E904220022C0E90A2256 +:1034E000FEF7AABDD0E904239A4201D1C26822B9ED +:1034F000184650F8043B0B60704700231846FAE763 +:10350000C3680021C2690133C360436913448269FF +:103510009342436124BF436A4361FEF781BD0000CB +:1035200038B504460D46E3683BB1236900201A1DF7 +:10353000A262E2691344E36207E0237A33B92946C1 +:103540002046FEF75DFD0028EDDA38BD6FF0010082 +:10355000FBE7000003691960C268013AC260C269F2 +:10356000134482699342036124BF436A03610023C9 +:103570008362036B03B118477047000070B53023B6 +:103580000D460446114683F31188866A2EB9FFF76B +:10359000C7FF10B186F3118870BDA36A1D70A36ABE +:1035A000E26A01339342A36204D3E16920460439FD +:1035B000FFF7D0FF002080F31188EDE72DE9F84FE9 +:1035C00004460D46904699464FF0300A8AF311881A +:1035D0000026B346A76A4FB949462046FFF7A0FF29 +:1035E00020B187F311883046BDE8F88FD4E90A0787 +:1035F0003A1AA8EB0607974228BF1746402F1BD957 +:1036000005F1400355F8042B9D4240F8042BF9D1F5 +:10361000A36A40364033A362D4E90A239A4204D312 +:10362000E16920460439FFF795FF8BF31188464581 +:10363000D9D28AF31188CDE729463A46FDF782FBB5 +:10364000A36A3D443E443B44A362E5E7D0E904233A +:103650009A4217D1C3689BB1836A8BB1043B9B1A12 +:103660000ED01360C368013BC360C3691A44836909 +:103670009A42026124BF436A0361002383620123EB +:10368000184670470023FBE700F040B94FF0804335 +:10369000586A70474FF08043002258631A61022233 +:1036A000DA6070474FF080430022DA607047000014 +:1036B0004FF0804358637047FEE7000070B51B4B26 +:1036C0000025044686B058600E468562016300F00E +:1036D000CBF804F11003A560E562C4E904334FF0B0 +:1036E000FF33C4E90044C4E90635FFF7CFFF2B469A +:1036F000024604F134012046C4E9082380230C4A21 +:103700002565FEF733FC01230A4AE0600092037549 +:10371000684672680192B268CDE90223064BCDE992 +:103720000435FEF74BFC06B070BD00BF902D0220A3 +:10373000B03F0008B53F0008B9360008024AD36A16 +:103740001843D062704700BF282B02204B684360AB +:103750008B688360CB68C3600B6943614B6903620C +:103760008B6943620B6803607047000008B52C4BFF +:1037700040F2FF712B481A690A431A611A6922F450 +:10378000FF6222F007021A611A691A6B0A431A6370 +:103790001A6D0A431A65244A1B6D1146FFF7D6FFBE +:1037A00000F5806002F11C01FFF7D0FF00F580609A +:1037B00002F13801FFF7CAFF00F5806002F1540101 +:1037C000FFF7C4FF00F5806002F17001FFF7BEFF54 +:1037D00000F5806002F18C01FFF7B8FF00F5806012 +:1037E00002F1A801FFF7B2FF00F5806002F1C40109 +:1037F000FFF7ACFF00F5806002F1E001FFF7A6FFE4 +:1038000000F5806002F1FC01FFF7A0FF02F58C716A +:1038100000F58060FFF79AFFBDE8084000F0ECB8C3 +:103820000038024000000240BC3F000808B500F02C +:1038300081FAFEF779FBFFF70BF8BDE80840FEF7C9 +:10384000E7BD000070470000EFF3098305496833C6 +:103850004A6B22F001024A6383F30988002383F351 +:103860001188704700EF00E0302080F3118862B6C5 +:103870000D4B0E4AD96821F4E0610904090C0A4392 +:103880000B49DA60D3F8FC2042F08072C3F8FC20C8 +:10389000084AC2F8B01F116841F0010111602022EE +:1038A000DA7783F82200704700ED00E00003FA05A4 +:1038B00055CEACC5001000E0302310B583F311885D +:1038C0000E4B5B6813F4006314D0F1EE103AEFF383 +:1038D00009844FF08073683CE361094BDB6B23661E +:1038E00084F30988FEF700FB10B1064BA36110BDFD +:1038F000054BFBE783F31188F9E700BF00ED00E01B +:1039000000EF00E04F030008520300080F4B1A6C51 +:1039100042F001021A641A6E42F001021A660C4A61 +:103920001B6E936843F0010393604FF080436B225A +:103930009A624FF0FF32DA6200229A615A63DA60CB +:103940005A6001225A611A60704700BF0038024075 +:10395000002004E04FF0804208B51169D3680B40A5 +:10396000D9B29B076FEA0101116107D5302383F3B8 +:103970001188FEF7EFFA002383F3118808BD0000D9 +:103980001B4B4FF0FF3000211A696FEA42526FEA79 +:1039900052521A611A69C2F30A021A611A695A6903 +:1039A00058615A6959615A691A6A62F080521A62FA +:1039B0001A6A02F080521A621A6A5A6A58625A6A7D +:1039C00059625A6A0B4A106840F480701060186F90 +:1039D00000F44070B0F5007F03D04FF480301867DA +:1039E0001967536823F40073536000F073B900BF84 +:1039F0000038024000700040364B4FF44041364AD8 +:103A00001A64364A11601A6842F001021A601A6894 +:103A10009207FCD59A6822F003029A602D4B9A68AF +:103A200012F00C02FBD1196801F0F90119609A60DB +:103A30001A6842F480321A601A689003FCD55A6FF3 +:103A400042F001025A67234B5A6F9107FCD5244A72 +:103A50005A601A6842F080721A60204B5A68520409 +:103A6000FCD51A6842F480321A605A68D003FCD53B +:103A70001A6842F400321A60184A53689903FCD558 +:103A8000144B1A689201FCD5164A9A6040F2011252 +:103A9000C3F88C200022C3F8902040F20733124A6A +:103AA0001360136803F00F03072BFAD1094B9A68D0 +:103AB00042F002029A609A6802F00C02082AFAD1D7 +:103AC0005A6C42F480425A645A6E42F480425A66FA +:103AD0005B6E704700380240000400100070004028 +:103AE000186C400900948838003C0240074A08B529 +:103AF000536903F00103536123B1054A13680BB105 +:103B000050689847BDE80840FFF7D6BE003C01402A +:103B100098390220074A08B5536903F0020353613C +:103B200023B1054A93680BB1D0689847BDE80840B7 +:103B3000FFF7C2BE003C014098390220074A08B591 +:103B4000536903F00403536123B1054A13690BB1B0 +:103B500050699847BDE80840FFF7AEBE003C014001 +:103B600098390220074A08B5536903F008035361E6 +:103B700023B1054A93690BB1D0699847BDE8084065 +:103B8000FFF79ABE003C014098390220074A08B569 +:103B9000536903F01003536123B1054A136A0BB153 +:103BA000506A9847BDE80840FFF786BE003C0140D8 +:103BB00098390220164B10B55C6904F478725A618A +:103BC000A30604D5134A936A0BB1D06A98476006DE +:103BD00004D5104A136B0BB1506B9847210604D5DE +:103BE0000C4A936B0BB1D06B9847E20504D5094A98 +:103BF000136C0BB1506C9847A30504D5054A936C20 +:103C00000BB1D06C9847BDE81040FFF755BE00BF20 +:103C1000003C014098390220194B10B55C6904F44E +:103C20007C425A61620504D5164A136D0BB1506D82 +:103C30009847230504D5134A936D0BB1D06D98476F +:103C4000E00404D50F4A136E0BB1506E9847A104DF +:103C500004D50C4A936E0BB1D06E9847620404D51C +:103C6000084A136F0BB1506F9847230404D5054AD7 +:103C7000936F0BB1D06F9847BDE81040FFF71CBEA3 +:103C8000003C01409839022008B50348FDF744FA8A +:103C9000BDE80840FFF710BEE023022008B5034846 +:103CA000FDF73AFABDE80840FFF706BE4C240220B3 +:103CB00008B50348FDF730FABDE80840FFF7FCBD42 +:103CC000B824022008B5FFF745FEBDE80840FFF71D +:103CD000F3BD0000062108B50846FFF7F5FA0621F6 +:103CE0000720FFF7F1FA06210820FFF7EDFA062179 +:103CF0000920FFF7E9FA06210A20FFF7E5FA062175 +:103D00001720FFF7E1FA06212820FFF7DDFA072147 +:103D10001C20FFF7D9FA0C212620FFF7D5FA0C2139 +:103D20002720FFF7D1FA0C215220BDE80840FFF709 +:103D3000CBBA000008B5FFF723FE00F00DF8FDF741 +:103D400003FCFDF7D3FDFDF7ABFCFFF77BFDBDE802 +:103D50000840FFF799BC00000023054A19460133CB +:103D6000102BC2E9001102F10802F8D1704700BF20 +:103D700098390220034611F8012B03F8012B002A81 +:103D8000F9D1704753544D3332463F3F3F3F3F3F99 +:103D90000053544D333246375B347C355D780053E5 +:103DA000544D333246375B367C375D780000000077 +:103DB000009600000000000000000000000000006D +:103DC00000000000000000000000000009150008CD +:103DD000F5140008311500081D1500082915000804 +:103DE0001515000801150008ED1400083D15000820 +:103DF000000000001D1600080916000845160008FE +:103E0000311600083D16000829160008151600088E +:103E10000116000851160008000000000100000013 +:103E20000000000063300000243E0008802B0220C8 +:103E3000902D02204865782F50726F6669434E437B +:103E40000025424F415244252D424C0025534552F6 +:103E500049414C2500000000020000000000000065 +:103E600039180008A518000840004000403602201C +:103E70005036022002000000000000000300000095 +:103E800000000000E9180008000000001000000019 +:103E90006036022000000000010000000000000069 +:103EA0000839022001010200AD230008BD220008EC +:103EB000592300083D23000843000000C03E0008CD +:103EC00009024300020100C032090400000102029D +:103ED0000100052400100105240100010424020250 +:103EE0000524060001070582030800FF09040100FC +:103EF000020A0000000705010240000007058102D8 +:103F000040000000120000000C3F000812011001E8 +:103F100002000040AE2D0210000201020301000069 +:103F20000403090425424F4152442500437562654C +:103F300059656C6C6F772D626473686F74003031F3 +:103F40003233343536373839414243444546000030 +:103F50000080000000800000008000000080000061 +:103F60000000020000000400000004000000040043 +:103F70000000040000000400000004000000040031 +:103F8000000000003D1A0008F51C0008A11D0008F3 +:103F900040004000803902208039022001000000EA +:103FA0009039022080000000400100000500000060 +:103FB0006D61696E0069646C650000000000802A14 +:103FC00000000000AAAAAAAA00000024FFFF000027 +:103FD0000000000000A00A00000100000000000036 +:103FE000AAAAAAAA00000000FFFF0000000000002B +:103FF000000000001400005400000000AAAAAAAAB1 +:1040000014000054FFFF000000000000000000004A +:1040100080699A0100000000AAAA8AAA40565502A7 +:10402000FFFF000000707007777000000081020041 +:1040300000000000AAAAAAAA00410100FFFF000098 +:1040400000000080080000000000000000000000E8 +:10405000AAAAAAAA00000000FFFF000000000000BA +:10406000000000000000000000000000AAAAAAAAA8 +:1040700000000000FFFF0000000000000000000042 +:104080000000000000000000AAAAAAAA0000000088 +:10409000FFFF000000000000000000000000000022 +:1040A00000000000AAAAAAAA00000000FFFF00006A +:1040B0000000000000000000000000000000000000 +:1040C000AAAAAAAA00000000FFFF0000000000004A +:1040D000000000000000000000000000AAAA00008C +:1040E00000000000FF0000000000000000000000D1 +:1040F000780000000000000000801E0000000000AA +:10410000FF000000982D0220E02302204C24022012 +:10411000B824022000000000843D0008490400008B +:10412000913D0008510400009F3D000800960000EA +:1041300000000800960000000008000004000000D5 +:10414000203F000800000000000000000000000008 +:0C41500000000000000000000000000063 :00000001FF diff --git a/Tools/bootloaders/CubeYellow_bl.bin b/Tools/bootloaders/CubeYellow_bl.bin index e6ce61e6a0..f1f4492864 100755 Binary files a/Tools/bootloaders/CubeYellow_bl.bin and b/Tools/bootloaders/CubeYellow_bl.bin differ diff --git a/Tools/bootloaders/CubeYellow_bl.elf b/Tools/bootloaders/CubeYellow_bl.elf index 8b7844ee48..a735c9852b 100755 Binary files a/Tools/bootloaders/CubeYellow_bl.elf and b/Tools/bootloaders/CubeYellow_bl.elf differ diff --git a/Tools/bootloaders/CubeYellow_bl.hex b/Tools/bootloaders/CubeYellow_bl.hex index 01d3405d86..8f48aec0b8 100644 --- a/Tools/bootloaders/CubeYellow_bl.hex +++ b/Tools/bootloaders/CubeYellow_bl.hex @@ -1,29 +1,29 @@ :020000040800F2 -:100000000004022001020008450F0008490F000803 -:100010009D0F0008490F0008710F00080302000837 -:100020000302000803020008030200087128000808 +:1000000000060220010200080302000803020008A3 +:1000100003020008030200080302000803020008AC +:100020000302000803020008030200084D3800081C :10003000030200080302000803020008030200088C :10004000030200080302000803020008030200087C -:100050000302000803020008813A0008AD3A0008D4 -:10006000D93A0008053B0008313B000803020008AC +:100050000302000803020008F13A0008193B0008F7 +:10006000413B0008693B0008913B0008030200087F :10007000030200080302000803020008030200084C :10008000030200080302000803020008030200083C -:100090000302000803020008030200085D3B000899 +:10009000030200080302000803020008B93B00083D :1000A000030200080302000803020008030200081C -:1000B000A538000803020008030200080302000834 +:1000B000C93C00080302000803020008030200080C :1000C00003020008030200080302000803020008FC -:1000D000030200080302000851110008651100081E -:1000E000C53B0008030200080302000803020008E1 +:1000D00003020008030200088D3C0008A13C000850 +:1000E0001D3C000803020008030200080302000888 :1000F00003020008030200080302000803020008CC :1001000003020008030200080302000803020008BB :1001100003020008030200080302000803020008AB :10012000030200080302000803020008030200089B :10013000030200080302000803020008030200088B -:10014000030200080302000803020008DD2F000874 +:10014000030200080302000803020008C52F00088C :10015000030200080302000803020008030200086B :10016000030200080302000803020008030200085B :10017000030200080302000803020008030200084B -:1001800003020008030200087911000803020008B6 +:100180000302000803020008B53C0008030200084F :10019000030200080302000803020008030200082B :1001A000030200080302000803020008030200081B :1001B000030200080302000803020008030200080B @@ -31,1005 +31,1018 @@ :1001D00003020008030200080302000803020008EB :1001E00003020008030200080302000803020008DB :1001F00003020008030200080302000803020008CB -:1002000002E000F000F8FEE772B6394880F3088893 -:10021000384880F3098838484EF60851CEF200017C -:10022000086040F20000CCF200004EF63471CEF2CD -:1002300000010860BFF34F8FBFF36F8F40F20000E3 -:10024000C0F2F0004EF68851CEF200010860BFF314 -:100250004F8FBFF36F8F4FF00000E1EE100A4EF6A4 -:100260003C71CEF200010860062080F31488BFF3D1 -:100270006F8F02F03BFB03F09DFA4FF055301F49A2 -:100280001B4A91423CBF41F8040BFAE71C49194A4A -:1002900091423CBF41F8040BFAE71A491A4A1B4B3A -:1002A0009A423EBF51F8040B42F8040BF8E70020D5 -:1002B0001749184A91423CBF41F8040BFAE702F093 -:1002C00059FB03F0E1FA144C144DAC4203DA54F834 -:1002D000041B8847F9E700F03FF8114C114DAC4280 -:1002E00003DA54F8041B8847F9E702F041BB000029 -:1002F0000004022000240220000000080000022068 -:100300000004022040400008002402205024022063 -:1003100050240220B03D0220000200080002000824 -:1003200000020008000200082DE9F04F2DED108AB0 -:10033000C1F80CD0D0F80CD0BDEC108ABDE8F08F1D -:10034000002383F311882846A047002001F016FF00 -:1003500001F0C6FE00DFFEE770B578231F4C0025D4 -:100360006FF07F0623701E236570A570E570257100 -:100370006571A571E57125726672A372E57200F070 -:100380002BFD20B10E2325726672A372E57202F076 -:1003900031FA044602F066FA0546D0B9104B9C4289 -:1003A00019D001339C4241F2883412BF0546002423 -:1003B0000125002002F028FA0DB100F0B7F800F096 -:1003C00063FD00F05DFC204600F050F900F0AEF84F -:1003D000F9E70024EDE70446EBE700BF50240220D4 -:1003E000010007B008B500F0C9FBA0F12003584296 -:1003F000584108BD054B07B51B88022101A8ADF87F -:10040000043000F027FC03B05DF804FBAC3C0008AE -:10041000064991F8243033B100230822086A81F894 -:10042000243000F051BC0120704700BF702402202E -:100430002DE9F84F234C05468846174694F824309A -:100440008BBB2E46DFF87C90002F38D094F824A088 -:10045000BAF1000F05D12022FF214846266200F0A4 -:1004600001FDCAF10805414604EB8A00BD4228BFE0 -:100470003D465FFA85FBAD00A7EB0B072A462E44ED -:1004800000F0C8FC94F82430A844FFB29B445FFA03 -:100490008BFBBBF1080F84F824B0D5D1FFF7B8FF70 -:1004A0000028D1D108E0266A06EB8306B042C9D005 -:1004B000FFF7AEFF0028C4D10020BDE8F88F01206F -:1004C000BDE8F88F7024022010B5202383F3118833 -:1004D0001248C3680BB101F0D7FE0023104A4FF455 -:1004E0007A710E4801F094FE002383F311880D4CBD -:1004F000236813B12368013B2360636813B1636809 -:10050000013B6360084B1B7833B9636823B9022051 -:1005100000F07EFC3223636010BD00BF5C2402202B -:10052000C9040008A025022098240220454B464912 -:100530002DE9F04153F8042F013201D1BDE8F081DB -:100540008B42F7D1414C424B22689A4278D9414BB9 -:100550009B6803F1006303F5C0339A4270D2002018 -:1005600000F0AAFB02203C4B187000F04FFC3B4B04 -:100570001A6C00221A64196E1A66196E596C5A6444 -:10058000596E5A66596E596941F08001596159692D -:1005900021F0800159615969196941F000511961CF -:1005A000196921F0005119611B6972B62C4B2D4954 -:1005B0000B601D682468BFF34F8FBFF36F8F2A4B0A -:1005C000C3F88420BFF34F8F5A6922F480325A61F6 -:1005D000BFF34F8FD3F8802043F6E07EC2F3C90605 -:1005E000C2F34E32B707520102EA0E0838463146CE -:1005F000013948EA000C00F14040B1F1FF3FC3F877 -:1006000074C2F5D1203A12F1200FEDD1BFF34F8F14 -:10061000BFF36F8FBFF34F8FBFF36F8F5A6922F411 -:1006200000325A610022C3F85022BFF34F8FBFF34C -:100630006F8F202383F31188AD4685F30888204708 -:10064000BDE8F081FC7F01081C80010804800108DE -:10065000FF7F010850240220982402200038024025 -:100660000080010808ED00E000ED00E02DE9F04F0A -:1006700099B0B34C2022FF21019010A8A66800F089 -:10068000F1FBB04AA3461378A3B90121AE4811701B -:10069000C360202383F31188C3680BB101F0F4FD1C -:1006A0000023AA4A4FF47A71A74801F0B1FD002354 -:1006B00083F31188019B13B1A54B019A1A600023A3 -:1006C000A44AA349019F99461C461D4698461370AB -:1006D0004B600292012000F099FB002F00F0128283 -:1006E0009B4B1B68002B40F00D8219B0BDE8F08FCA -:1006F0000220FFF777FE002840F0FB81019BB9F153 -:10070000000F08BF1F46944B1B8802210BA8ADF8B1 -:100710002C3000F09FFADDE74FF47A7000F02EFAEB -:10072000031E0393EADB0220FFF75CFE82460028EB -:10073000E4D0039B581E042800F2DD81DFE800F0BE -:10074000030E1114170018A80523042140F8343DA6 -:1007500000F080FA54464FF0000856E00421784833 -:10076000F6E704217D48F3E704217D48F0E71C24E7 -:100770002046043400F0A2FA04210B900BA800F0EC -:1007800069FA2C2CF4D1E5E7002DB7D0002CB5D0B8 -:100790000220FFF727FE0546002800F0AF81012068 -:1007A0006C4C00F089FA4FF000090220207000F034 -:1007B0002DFB5FFA89FA504600F08EFA074658B1D1 -:1007C000504609F1010900F097FA0028F1D12C46B2 -:1007D000A9460027634B97E701233E46022023707A -:1007E00000F012FBDBF808309E4206D2304600F0E3 -:1007F00065FA0130EBD10436F4E70026029BA946E6 -:100800002C461E703746524B5E6000F033FB15B12C -:10081000002C18BF0027FFF7EDFD5BE7002D3FF42C -:100820006DAF002C3FF46AAF0220029B187000F0FD -:10083000EDFA322000F0A2F9B0F1000AC0F25E81B8 -:100840001AF0030540F05A8106EB0A03DBF8082092 -:10085000934200F25381BAF5807F00F24F815545F3 -:100860000DDA4FF47A7000F089F90490049B002BA4 -:10087000C0F24481049B3C4AAB540135EFE7C820E9 -:10088000FFF7B0FD0546002800F038811F2E11D873 -:10089000C6F1200410AB26F0030033495445184438 -:1008A00028BF5446224600F0B5FA2246FF212E48C2 -:1008B00000F0D8FA4FEAAA0A2B4930465FFA8AF2CA -:1008C000FFF7B6FD0446002800F01A8106EB8A0601 -:1008D00005469AE70220FFF785FD00283FF40EAF9A -:1008E000FFF796FD00283FF409AF4FF0000A53468A -:1008F000DBF8082092451CD2BAF11F0F12D8109ACB -:1009000001320FD02AF0030218A90A4452F8202C11 -:100910000B92184604220BA90AF1040A00F052FBBC -:100920000346E5E75046039300F0C8F9039B0B909C -:10093000EFE718A8042140F84C3D00F08BF964E77C -:10094000502402209C2502205C240220C9040008B7 -:10095000A025022098240220AE3C00085424022046 -:1009600058240220B03C00089C24022018A8002330 -:10097000642140F8343D00F039F900287FF4BEAE20 -:100980000220FFF72FFD00283FF4B8AE0B9800F0CF -:10099000C5F918AB43F8480D04211846CDE718A84F -:1009A0000023642140F8343D00F020F900287FF452 -:1009B000A5AE0220FFF716FD00283FF49FAE0B986E -:1009C00000F0BAF918AB43F8440DE5E70220FFF751 -:1009D00009FD00283FF492AE00F0B4F918AB43F8DB -:1009E000400DD9E70220FFF7FDFC00283FF486AE5A -:1009F0000BA9142000F0ACF9824618A8042140F895 -:100A00003CAD00F027F951460BA896E7322000F0E4 -:100A1000B5F8B0F1000AFFF671AE1AF0030F7FF4DB -:100A20006DAE0AEB0803DBF8082093423FF666AE92 -:100A30000220FFF7D7FC00283FF460AE2AF0030A3B -:100A4000C244D0453FF4E1AE404608F1040800F04E -:100A500035F904210A900AA800F0FCF8F1E74FF4F8 -:100A60007A70FFF7BFFC00283FF448AEFFF7D0FCD8 -:100A700000283FF4AFAE109B01330CD0082210A920 -:100A80000020FFF7D5FC00283FF4A4AE2022FF2170 -:100A900010A800F0E7F9FFF7ADFC374801F074FB50 -:100AA00023E6002D3FF42AAE002C3FF427AE18A811 -:100AB0000023642140F8343D00F098F88246002875 -:100AC0007FF41CAE0220FFF78DFC00283FF416AE29 -:100AD0000390FFF78FFC41F28830574601F054FB3A -:100AE0000B9800F00FFA00F0C5F9039B1C461D4659 -:100AF000F0E5054689E64FF00008FFE52546FDE5EF -:100B00002C4667E6002000F039F80490049B002B87 -:100B1000FFF6E3AD012000F077F9049B213B122B97 -:100B20003FF6D8AD01A252F823F000BFF10600084D -:100B30001907000889070008D5060008D50600082F -:100B4000D50600081D0800080D0A0008D508000891 -:100B50006D0900089F090008CD090008D5060008A6 -:100B6000E5090008D50600085F0A00080B08000820 -:100B7000D5060008A30A0008A08601002DE9F34766 -:100B80004FF47A75002402AE154F4543DFF85880C4 -:100B900006F8014D97F900305FFA84F95A1C01D02C -:100BA000A34212D158F82400012231460368D3F839 -:100BB00020A02B46D047012807D10A4B9DF80700FB -:100BC00083F8009002B0BDE8F0870134042CE1D135 -:100BD0004FF4FA7001F0D8FA4FF0FF30F2E700BF9F -:100BE00000240220C4250220BC3C00082DE9F04767 -:100BF0004FF47A7506460024134F4D43DFF85080BA -:100C000097F900305FFA84F95A1C01D0A34210D141 -:100C100058F82400042231460368D3F820A02B465C -:100C2000D047042805D1094B002083F80090BDE887 -:100C3000F0870134042CE3D14FF4FA7001F0A4FAE8 -:100C40004FF0FF30BDE8F08700240220C4250220C9 -:100C5000BC3C0008074B30B41A78074B53F82240CD -:100C60000A46014623682046DD69044BAC4630BC89 -:100C7000604700BFC4250220BC3C0008A0860100DC -:100C8000F8B50A4C00250A4E01F0BAFC094F207055 -:100C900030682378834207D901F0ACFC33680544FF -:100CA0000133BD423360F3D9F8BD00BFC525022032 -:100CB000A8250220FF7F010001F04EBD00F1006079 -:100CC00000F5C0300068704700F10060920000F548 -:100CD000C03001F0DBBC0000054B1A68054B1B78E7 -:100CE0009B1A834202D9104401F084BC0020704753 -:100CF000A8250220C525022038B5074D04462868DE -:100D0000204401F07FFC28B928682044BDE8384021 -:100D100001F090BC38BD00BFA825022010F00303ED -:100D200008D1B0F5806F05D800F10050A0F5712012 -:100D30000068704700207047014BC058704700BFE3 -:100D400020F4F01F014B1868704700BF002004E03A -:100D50001F4BF0B51E681F4BC6F30B02360C1F88E5 -:100D60005D68BA4293F9084022D09F89BA4221D0E7 -:100D70001F8BBA4206D102220C2404FB02335D68A9 -:100D800093F90840B6F5805F16D041F201039E4208 -:100D900008BF5A24421E013D0B460A44934215D215 -:100DA00015F9016F581C4EB1034600F8016CF5E7C8 -:100DB0000022E1E70122DFE74124EBE72C25824214 -:100DC0001D7001D9981C5C70401AF0BD1846FBE7F5 -:100DD000002004E004240220094B5B88B3F5805F07 -:100DE00009D041F20102934207D10122054B03EBE6 -:100DF0008203D87870470022F8E70020704700BFD0 -:100E0000002004E0B43C0008704700007047000078 -:100E100070470000002310B5934203D0CC5CC4544B -:100E20000133F9E710BD000030B5441E14F9010F7D -:100E30000B4658B193F900500131854206D11AB9D9 -:100E400093F90020801A30BD013AEFE7002AF7D16C -:100E5000104630BD02460346981A13F9011B0029BB -:100E6000FAD1704702440346934202D003F8011BB3 -:100E7000FAE77047024B1A78024B1A70704700BFAE -:100E8000C425022000240220F8B5184C184800F0B0 -:100E9000BBFC2146164800F0E3FC24681548E26ECE -:100EA000154DD2F80438154E43F00203104FC2F826 -:100EB000043801F069F92046114900F0DFFDE26EC7 -:100EC0000024D2F8043823F00203C2F804384FF4A7 -:100ED000E1332B6056F82400B84202D0294600F0D6 -:100EE000F1FB0134042CF5D1F8BD00BFB43D00087E -:100EF000CC33022040420F00AC250220BC3C00084D -:100F0000E03D000838B50B4B05461A780A4B53F8FC -:100F100022400A4B9C420CD0094B00211822184653 -:100F2000FFF7A0FF056001462046BDE8384000F00D -:100F3000C9BB38BDC4250220BC3C0008CC3302200C -:100F4000AC250220FEE7000000B59BB0EFF309815D -:100F500068226846FFF75EFFEFF30583034B9A6B49 -:100F60009A6A9A6A9A6A9A6A9B6AFEE700ED00E0BA -:100F700000B59BB0EFF3098168226846FFF74AFF8E -:100F8000EFF30583044B9A6B9A6A9A6A9A6A9A6A93 -:100F90009A6A9B6AFEE700BF00ED00E000B59BB0D7 -:100FA000EFF3098168226846FFF734FFEFF305830A -:100FB000034B5A6B9A6A9A6A9A6A9A6A9B6AFEE724 -:100FC00000ED00E030B50A44074D91420BD011F816 -:100FD000013B09245840013CF7D040F300032B406B -:100FE00083EA5000F7E730BD2083B8ED00230449C1 -:100FF0001A465A50C81808334260802BF9D17047FE -:10100000C8250220026843681143016003B11847F4 -:1010100070470000024A136843F0C0031360704732 -:1010200000440040024A136843F0C0031360704755 -:1010300000480040024A136843F0C0031360704741 -:10104000007800402DE9F047C66D05463768F46921 -:10105000200734621AD014F0080F0CBF0021802141 -:10106000E20748BF41F02001A3074FF0200348BF2B -:1010700041F04001600748BF41F4807183F311885B -:10108000281DFFF7BFFF002383F31188E2050AD56F -:10109000202383F311884FF40071281DFFF7B2FF5E -:1010A000002383F311884FF020094FF0000A14F059 -:1010B000200831D13B0616D54FF0200905F1380A3A -:1010C000200610D589F31188504600F06FFA0028E9 -:1010D0002FDA0821281DFFF795FF27F080033360E2 -:1010E000002383F3118879060DD562060BD52023E2 -:1010F00083F31188EA6C2B6D9A4201D12B6CEBB90A -:10110000002383F31188E30620D5AA6E1369EBB19F -:101110005069BDE8F047184789F31188736A28467B -:1011200095F86410194000F0DBFA8AF31188F4692D -:10113000BDE7B06288F31188F469C1E727F0400782 -:101140001021281DFFF75EFF3760D9E7BDE8F08763 -:1011500008B50348FFF776FFBDE8084001F098BBEB -:101160004826022008B50348FFF76CFFBDE8084099 -:1011700001F08EBBB426022008B50348FFF762FFDA -:10118000BDE8084001F084BB2027022037B52D4C74 -:101190002D4D204600F08AFA009404F1140000233B -:1011A0004FF40072294900F04BF94FF4007200949B -:1011B00004F13800264B274900F0C4F9264B256678 -:1011C0000B21E3652620254C00F0C4F8204600F0F2 -:1011D0006DFA009404F1140000234FF400722049CA -:1011E00000F02EF94FF40072009404F138001D4B0A -:1011F0001D4900F0A7F91D4B25660B21E36527204B -:101200001B4C00F0A7F8204600F050FA04F114003F -:10121000009400234FF40072164900F011F904F114 -:10122000380000944FF40072134B144900F08AF90F -:10123000134B0B215220E365256603B0BDE8304017 -:1012400000F088B84826022080F937038C27022056 -:10125000151000088C2D022000440040B426022006 -:101260008C290220251000088C2F02200048004005 -:10127000202702208C2B0220351000088C31022000 -:10128000007800402E4B002908BF1946037C012B33 -:10129000816630B50CD12B4B984235D12A4B1A6C54 -:1012A00042F400321A641A6E42F400321A661B6E5F -:1012B0000A68036EC46D03EB5203B3FBF2F34A6892 -:1012C000150442BF23F0070503F0070343EA450373 -:1012D000E3608B6843F040036360CB68510543F0E3 -:1012E0000103A36042F4967343F0010323604FF0BF -:1012F000FF33236205D512F010221DD0B2F1805FBA -:101300001CD080F8643030BD104B984208D10E4B91 -:101310001A6C42F480221A641A6E42F48022C5E7E5 -:101320000B4B9842C4D1084B1A6C42F080421A64AD -:101330001A6E42F08042B9E77F23E2E73F23E0E7FD -:10134000F83C00084826022000380240B42602205B -:101350002027022000F1604300F01F02090140092C -:1013600003F56143C9B2800083F80013012300F143 -:101370006040934000F56140C0F8803103607047E1 -:10138000F8B51546826804460B46AA4200D2856825 -:10139000A1692669761AB54207D218462A46FFF790 -:1013A00039FDA3692B44A3610DE011D9AF1B32466F -:1013B0001846FFF72FFD3A46E1683044FFF72AFD53 -:1013C000E2683A44A261A36828465B1BA360F8BDAB -:1013D00018462A46FFF71EFDE368E4E78368934258 -:1013E0002DE9F04104460F46154600D28568606934 -:1013F0002669361AB54207D22A463946FFF70AFD52 -:1014000063692B4463610EE013D9A5EB06083246ED -:101410003946FFF7FFFC4246B919E068FFF7FAFCCE -:10142000E26842446261A36828465B1BA360BDE892 -:10143000F0812A463946FFF7EDFCE368E2E7000059 -:1014400010B50A440024C361029B006040608460C0 -:10145000C160816141610261036210BD08B58269AA -:101460004369934201D1826882B982680132826005 -:101470005A1C42611970426903699A4201D3C368D8 -:101480004361002100F09CFE002008BD4FF0FF30BA -:1014900008BD000070B5202304460E4683F3118872 -:1014A000A568A5B1A368A269013BA360531CA36111 -:1014B00015782269934224BFE368A361E3690BB105 -:1014C00020469847002383F31188284670BD314693 -:1014D000204600F065FE0028E2DA85F3118870BD31 -:1014E0002DE9F74F05460F4690469A46D0F81C90D6 -:1014F000202686F311884FF0000B144664B1224673 -:1015000039462846FFF73CFF034668B9514628464E -:1015100000F046FE0028F1D0002383F31188A8EBE9 -:10152000040003B0BDE8F08FB9F1000F03D00190C3 -:101530002846C847019B8BF31188E41A1F4486F3A1 -:101540001188DBE7C160816141611144C361009B87 -:10155000006040608260016103627047F8B5044634 -:101560000E461746202383F31188A568A5B1A3680A -:10157000013BA36063695A1C62611E702369626942 -:101580009A4224BFE3686361E3690BB12046984740 -:10159000002080F31188F8BD3946204600F000FE97 -:1015A0000028E2DA85F31188F8BD000083694269FA -:1015B0009A4210B501D182687AB98268013282609C -:1015C0005A1C82611C7803699A4201D3C368836103 -:1015D000002100F0F5FD204610BD4FF0FF3010BD9A -:1015E0002DE9F74F05460F4690469A46D0F81C90D5 -:1015F000202686F311884FF0000B144664B1224672 -:1016000039462846FFF7EAFE034668B951462846A0 -:1016100000F0C6FD0028F1D0002383F31188A8EB69 -:10162000040003B0BDE8F08FB9F1000F03D00190C2 -:101630002846C847019B8BF31188E41A1F4486F3A0 -:101640001188DBE7026843681143016003B1184762 -:10165000704700001430FFF743BF00004FF0FF3326 -:101660001430FFF73DBF00003830FFF7B9BF00006E -:101670004FF0FF333830FFF7B3BF00001430FFF7EF -:1016800009BF00004FF0FF311430FFF703BF000027 -:101690003830FFF763BF00004FF0FF323830FFF7FC -:1016A0005DBF000000207047FFF770BD044B036072 -:1016B000002343608360C36001230374704700BF4D -:1016C000103D000810B52023044683F31188FFF76E -:1016D000D9FD02232374002383F3118810BD000079 -:1016E00038B5C36904460D461BB904210844FFF709 -:1016F000A9FF294604F11400FFF7B0FE002806DA1E -:10170000201D4FF48061BDE83840FFF79BBF38BD16 -:10171000026843681143016003B118477047000035 -:1017200013B5446BD4F894341A681178042915D190 -:10173000217C022912D11979012312898B4013428D -:101740000CD101A904F14C0001F0AAFED4F8944494 -:101750000246019B2179206800F0E0F902B010BD3B -:10176000143001F02DBE00004FF0FF33143001F0B3 -:1017700027BE00004C3001F0FFBE00004FF0FF33E9 -:101780004C3001F0F9BE0000143001F0FBBD000048 -:101790004FF0FF31143001F0F5BD00004C3001F086 -:1017A000CBBE00004FF0FF324C3001F0C5BE000050 -:1017B000D0F8942438B5136805461978042901D067 -:1017C000012038BD017C0229FAD1127901205C89FF -:1017D00090400440F4D105F1140001F08DFD024663 -:1017E0000028EDD0D5F894544FF4807328686979B7 -:1017F00000F082F9204638BD406BFFF7D9BF0000EA -:1018000000207047704700007FB5124B012502266B -:10181000044603600023057400F1840243602946F6 -:101820008360C3600C4B0290143001934FF48073BB -:10183000009601F03DFD094B04F523722946019302 -:1018400004F14C004FF480730294009601F004FE02 -:1018500004B070BD383D0008F917000821170008D2 -:101860000B68202282F311880A7903EB820210624E -:101870004A790D3243F822008A7912B103EB8203D0 -:1018800018620223C0F894140374002383F31188B0 -:101890007047000038B5037F044613B190F8543008 -:1018A000ABB90125201D0221FFF732FF04F114001E -:1018B00025776FF0010100F08FFC84F8545004F19B -:1018C0004C006FF00101BDE8384000F085BC38BD28 -:1018D00010B5012104460430FFF71AFF00232377D7 -:1018E00084F8543010BD000038B50446002514308B -:1018F00001F0F6FC04F14C00257701F0C5FD201D38 -:1019000084F854500121FFF703FF2046BDE838401A -:10191000FFF74EBF90F85C3003F06003202B19D125 -:1019200090F85D20212A0AD0222A4FF000030ED021 -:10193000202A0FD1084A02650722426504E0064BBF -:101940000365072343650023836501207047036512 -:101950004365F9E70020704728240220D0F894342A -:1019600037B51A680446117804291AD1017C022976 -:1019700017D11979012312898B40134211D100F13B -:101980004C05284601F040FE58B101A9284601F057 -:1019900087FDD4F894440246019B2179206800F029 -:1019A000BDF803B030BD000000EB8103F7B51C6A41 -:1019B00005460E46F4B1202383F3118805EB860714 -:1019C000201D08214C34FFF7A3FEFB685B691B68F0 -:1019D00013B1204601F072FD01A9204601F060FD1F -:1019E000024648B1019B3146284600F097F8002393 -:1019F00083F3118803B0F0BDFB685A691268002AAE -:101A0000F5D01B8A013B1340F1D105F15C02EAE7F6 -:101A10000D3138B550F82140DCB1202383F3118813 -:101A2000D4F894241368527903EB8203DB689B6932 -:101A30005D6845B104216018FFF76AFE294604F18C -:101A4000140001F063FC2046FFF7B2FE002383F38D -:101A5000118838BD7047000001F012B8012300F171 -:101A6000240200F1380103700023436042F8043B74 -:101A70008A421361FAD103814381704738B5044625 -:101A8000202383F3118800254160C560056145610D -:101A90008561C561056201F003F80223237085F3B7 -:101AA000118838BD70B500EB8103054650690E46BC -:101AB0001446DA6018B110220021FFF7D3F9A069AB -:101AC00018B110220021FFF7CDF931462846BDE8B4 -:101AD000704001F0AFB80000028902F001020281FB -:101AE000428902F001024281002202614261826168 -:101AF000C261026201F032B9F0B4012500EB810449 -:101B000047898D40E4683D43A469458123600023F3 -:101B1000A2606360F0BC01F04DB90000F0B4012593 -:101B200000EB810407898D40E4683D4364690581C9 -:101B300023600023A2606360F0BC01F0C7B900001D -:101B400070B50223002504460370A0F8645080F8A5 -:101B5000665080F8675005814581C5600561456123 -:101B60008561C561056280F84C5000F0FFFF636835 -:101B70001B6823B129462046BDE87040184770BD58 -:101B80000278436880F8682005221B6802700BB158 -:101B90000421184770470000436890F868201B68CC -:101BA00002700BB1052118477047000090F84C30C7 -:101BB00070B5044613B1002380F84C3004F15C0288 -:101BC000204601F0EDF863689B6863BB94F85C50B5 -:101BD00015F0600615D194F85D3005F07F0545EAF3 -:101BE000032540F202339D4200F00E815BD8022DA6 -:101BF00000F0DC803FD8002D00F08780012D00F040 -:101C0000CF800021204601F035FB0021204601F065 -:101C100027FB63681B6813B10621204698470623FB -:101C200084F84C3070BD204698470028CED094F8F8 -:101C3000632094F8623043EA0223626D934238BF16 -:101C4000636594F95C30656D002B4FF0200380F2E2 -:101C5000FD80002D00F0EC80092284F84C2083F3F5 -:101C600011880021636D226D2046FFF757FF002386 -:101C700083F3118870BDB5F5817F00F0B180B5F5B3 -:101C8000407F49D0B5F5807FBBD194F85E30012B01 -:101C9000B7D1B4F8643023F00203A4F864302665A9 -:101CA0006665A665C3E740F201639D421ED8B5F59F -:101CB000C06F3BD2B5F5A06FA3D1B4F85C30B3F5DB -:101CC000A06F0ED194F85E30204684F8663000F0A4 -:101CD000A5FF63681B6813B10121204698470323C1 -:101CE0002370002323656365A365A0E7B5F5106F36 -:101CF00032D040F602439D4252D0B5F5006F80D1FC -:101D000004F167032365012324E004F16403A5655E -:101D10002365022363658AE794F85E30012B7FF424 -:101D200070AFB4F8643043F00203B6E794F8612072 -:101D30002046616894F860304D6843EA022394F8C5 -:101D40005F1094F85E20A84700283FF45AAF43681C -:101D5000236503686365A4E72378042B10D120234F -:101D600083F311882046FFF7B7FE86F31188636876 -:101D7000032184F867601B6821700BB120469847E7 -:101D800094F85E30002BACD084F8673004232370C5 -:101D900063681B68002BA4D0022120469847A0E767 -:101DA000374B23650223636500239DE794F8601099 -:101DB000204611F0800F01F00F010ED000F0E2FF7D -:101DC000012806D002287FF41CAF2E4B60652365E6 -:101DD00067E72D4B6565236563E700F0C5FFEFE717 -:101DE00094F85E30002B7FF40CAF94F8603013F061 -:101DF0000F013FF476AF1A06204602D501F04EFAE5 -:101E00006FE701F041FA6CE794F85E30002B7FF445 -:101E1000F8AE94F8603013F00F013FF462AF1B0688 -:101E2000204602D501F026FA5BE701F019FA58E7DF -:101E3000142284F84C2083F311882B462A46294625 -:101E40002046FFF759FE85F3118870BD5DB115225C -:101E500084F84C2083F311880021636D226D2046A5 -:101E6000FFF74AFE03E70B2284F84C2083F3118826 -:101E70002B462A4629462046FFF750FEE3E700BFDF -:101E8000683D0008603D0008643D000838B590F8E2 -:101E90004C300446152B29D8DFE803F03E282828CB -:101EA00028283E28280B29392828282828282828A7 -:101EB0003E3E90F8631090F86220436D42EA0122A2 -:101EC0009A4214D9C268128AB3FBF2F502FB1535A7 -:101ED0006DB9202383F311882B462A462946FFF744 -:101EE0001DFE85F311880A2384F84C3038BD142375 -:101EF00084F84C30202383F31188002320461A46AF -:101F00001946FFF7F9FD002383F3118838BD836D6F -:101F100003B198470023E7E7002101F0ABF9002166 -:101F2000204601F09DF963681B6813B10621204625 -:101F300098470623D8E7000090F84C20152A38B5BA -:101F4000044622D80123934040F6416213421DD13A -:101F500013F480150FD19B0217D50B2380F84C305A -:101F6000202383F311882B462A462946FFF7D6FD06 -:101F700085F3118838BDC3689B695B682BB9836D95 -:101F800003B19847002384F84C3038BD002101F09C -:101F900071F90021204601F063F963681B6813B1F1 -:101FA0000621204698470623EDE70000024B002259 -:101FB0001B605B609A6070478C330220002382684C -:101FC0000374054B1B6899689142FBD25A68036001 -:101FD00042601060586070478C33022008B520239F -:101FE00083F31188037C032B05D0042B0DD02BB970 -:101FF00083F3118808BD436900221A604FF0FF3354 -:102000004361FFF7DBFF0023F2E790E80C001A6062 -:1020100002685360F2E70000002382680374054BF6 -:102020001B6899689142FBD85A680360426010604F -:10203000586070478C330220054B19690874186882 -:10204000026853601A60186101230374FEF76CB9CB -:102050008C3302204B1C30B5054687B00A4C10D09B -:10206000236901A8094A00F0D3F82846FFF7E4FFE6 -:10207000049B13B101A800F007F92369586907B060 -:1020800030BDFFF7D9FFF8E78C330220DD1F0008D1 -:1020900038B50C4D044641612B6981689A689142BC -:1020A00003D8BDE83840FFF789BF1846FFF786FF21 -:1020B00001232C61014623742046BDE83840FEF719 -:1020C00033B900BF8C330220044B1A681B69906837 -:1020D0009B68984294BF0020012070478C330220F7 -:1020E00010B5084C236820691A68546022600122E8 -:1020F00023611A74FFF790FF01462069BDE8104084 -:10210000FEF712B98C330220826002220274002290 -:10211000427470478368A3F17C0243F80C2C026977 -:1021200043F83C2C426943F8382C074A43F81C2CEE -:10213000C268A3F1180043F8102C022203F8082CFF -:10214000002203F8072C70474103000810B5202334 -:1021500083F31188FFF7DEFF00210446FFF798FFA5 -:10216000002383F31188204610BD0000024B1B6939 -:1021700058610F20FFF760BF8C330220202383F3C8 -:102180001188FFF7F3BF000008B50146202383F351 -:1021900011880820FFF75EFF002383F3118808BD34 -:1021A00049B1064B42681B6918605A60136043606E -:1021B0000420FFF74FBF4FF0FF3070478C330220F1 -:1021C0000368984206D01A68026050601846596148 -:1021D000FFF7F4BE7047000038B504460D4620688E -:1021E000844200D138BD036823605C604561FFF71D -:1021F000E5FEF4E7054B03F114025A619A614FF0D2 -:10220000FF32DA6100221A62704700BF8C3302206D -:10221000F8B503614FF08043C26002295C6A06464C -:10222000184B38BF02211A461F4652F8145F9542D8 -:102230000AD1586198611C62056045608160081987 -:10224000BDE8F84001F002BA186AAB68241A0C190C -:1022500002D3E41A2D6804E09C4202D2204401F02B -:1022600003FAAB689C42F4D86B68356073601E60FB -:102270004FF0FF336E60B460A968091BA960FB6171 -:10228000F8BD00BF8C33022010B41B4C234653F81A -:10229000141F814210D0416802680A6002685160D0 -:1022A0009A424FF00001C16003D0936881680B44EB -:1022B00093605DF8044B70470A6800209A4262619F -:1022C0005360C86003D15DF8044B01F0C7B993684F -:1022D00088680344206A93604FF08042526A121A61 -:1022E0009342E6D9991A5DF8044B012998BF931CD3 -:1022F000184401F0B9B900BF8C33022000207047A8 -:10230000FEE70000704700004FF0FF30704700000C -:10231000022906D0032906D00129064818BF00204B -:10232000704705487047032A9ABF044800EBC20073 -:10233000002070473C3E0008F03D00083024022099 -:1023400070B59AB006460846144601AD294600F01D -:1023500095F82846FEF77EFDC0B2431C5B0086E878 -:10236000180023700323023404F8013C00231946AB -:10237000DAB20234904201D81AB070BDEA5C01337F -:1023800004F8011C04F8022CF2E7000008B5202331 -:1023900083F311880348FFF7E1FA002383F31188E0 -:1023A00008BD00BFCC33022010B50446052916D85D -:1023B000DFE801F016150316161D202383F311889C -:1023C0000E4A0121FFF76EFB20460D4A0221FFF75E -:1023D00069FB0C48FFF788FA002383F3118810BDCE -:1023E000202383F311880748FFF754FAF4E72023EA -:1023F00083F311880348FFF76BFAEDE76C3D0008A3 -:10240000903D0008CC33022038B50C4D0C4C2A46C8 -:102410000C4904F10800FFF793FF05F1CA0204F12B -:1024200010000949FFF78CFF05F5CA7204F1180086 -:102430000649BDE83840FFF783BF00BF943802204B -:1024400030240220BC3D0008C93D0008D73D0008EB -:1024500070B5044608460D46FEF7FCFCC6B22046A1 -:10246000013403780BB9184670BD32462946FEF791 -:10247000DBFC0028F3D1012070BD00002DE9F84FEE -:1024800005460C46FEF7E6FC2C49C6B22846FFF787 -:10249000DFFF08B10336F6B229492846FFF7D8FF17 -:1024A00008B11036F6B2632E0DD8DFF89080DFF851 -:1024B0009090244FDFF894A0DFF894B02E7846B9BE -:1024C0002670BDE8F88F29462046BDE8F84F01F098 -:1024D000E5BB252E2ED1072241462846FEF7A4FC57 -:1024E00070B9DBF8003007350A3444F80A3CDBF8F1 -:1024F000043044F8063CBBF8083024F8023CDDE721 -:10250000082249462846FEF78FFC98B9A21C0E4BBC -:1025100013F8011F023209095345C95D02F8041C72 -:10252000197801F00F01C95D02F8031CF0D11834CD -:102530000835C3E7267001350134BFE75C3E00086B -:10254000D73D00086F3E00081FF4F01F2BF4F01F6A -:10255000643E0008BFF34F8F024AD368DB03FCD40C -:10256000704700BF003C024008B5074B1B7853B9C9 -:10257000FFF7F0FF054B1A69002A04DA044A5A6093 -:1025800002F188325A6008BDF23A0220003C024053 -:102590002301674508B5054B1B7833B9FFF7DAFF10 -:1025A000034A136943F00043136108BDF23A022065 -:1025B000003C02400B2870B513D80B4A0B4C137823 -:1025C00063B94FF000610A4E44F8231056F82350C7 -:1025D00001330C2B2944F7D10123137054F8200048 -:1025E00070BD002070BD00BF243B0220F43A0220E1 -:1025F000803E0008014B53F820007047803E0008E1 -:102600000C2070470B2810B5044601D9002010BDDE -:10261000FFF7D0FF064B53F824301844C21A0BB909 -:10262000012010BD12680132F0D1043BF6E700BF73 -:10263000803E00080B2810B5044621D8FFF78AFF1A -:10264000FFF792FF0F4AF323D360C300DBB243F4DA -:10265000007343F002031361136943F48033136181 -:10266000FFF778FFFFF7A6FF074B53F8241000F0A1 -:10267000DBF8FFF78FFF2046BDE81040FFF7C2BF31 -:10268000002010BD003C0240803E00082DE9F843C8 -:1026900012F0010315463FD18218B2F1026F3BD20E -:1026A0002B4B1B6813F0010336D0FFF75DFF294C5D -:1026B000F32340F20127E360FFF74CFF032D01D91C -:1026C000830712D00F46401A224C40F20118EB1B30 -:1026D000C6190B44012B236924D823F0010323617D -:1026E000FFF758FF0120BDE8F883236923F4407306 -:1026F000236123693B43236151F8046B0660BFF3F8 -:102700004F8FFFF727FF03689E4208D0236923F00D -:1027100001032361FFF73EFF0020BDE8F883043D7D -:102720000430CBE723F44073B9462361236943EABD -:102730000803236137F8023B3380BFF34F8FFFF765 -:1027400009FF3688B6B2B9F80030B342BFD0DDE732 -:1027500000380240003C0240084908B50B7828B117 -:1027600053B9FFF701FF01230B7008BD23B10870B7 -:10277000BDE80840FFF70EBF08BD00BFF23A0220D7 -:1027800002440439064BD2B210B5904200D110BDBC -:10279000441C00B253F8200041F8040FE0B2F4E703 -:1027A00050280040104B30B51C6F240407D41C6F18 -:1027B00044F400741C671C6F44F400441C670B4C09 -:1027C000024404392368D2B243F480732360084B77 -:1027D000904200D130BD441C51F8045F00B243F870 -:1027E0002050E0B2F4E700BF003802400070004023 -:1027F0005028004007B5012201A90020FFF7C0FFC3 -:10280000019803B05DF804FB13B50446FFF7F2FF2F -:10281000A04206D002A90122002041F8044DFFF792 -:10282000C1FF02B010BD00000144BFF34F8F064B43 -:10283000884204D3BFF34F8FBFF36F8F7047C3F845 -:102840005C022030F4E700BF00ED00E0034B1B68A2 -:102850009B0042BF0122024B1A707047743802403D -:10286000253B0220014B1878704700BF253B022012 -:10287000064A536823F001035360EFF3098368337A -:1028800083F30988002383F31188704730EF00E059 -:1028900010B5202383F31188104B5B6813F4006399 -:1028A00018D0F1EE103AEFF309844FF0807344F83A -:1028B0004C3C0B4BDB6844F8083CA4F1680383F301 -:1028C0000988FFF701FC18B1064B44F8503C10BDD5 -:1028D000054BFAE783F3118810BD00BF00ED00E05F -:1028E00030EF00E05103000854030008F0B5BFF3D7 -:1028F0004F8FBFF36F8F1D4B0021C3F85012BFF3F2 -:102900004F8FBFF36F8F5A6942F400325A61BFF3A1 -:102910004F8FBFF36F8FC3F88410BFF34F8FD3F87F -:10292000802043F6E076C2F3C904C2F34E32A50715 -:10293000520102EA060E284621464EEA00070139F6 -:1029400000F14040C3F860724F1CF6D1203A12F1FA -:10295000200FEED1BFF34F8F5A6942F480325A6193 -:10296000BFF34F8FBFF36F8FF0BD00BF00ED00E0EE -:10297000FEE70000084A094B09498B4204D3094A83 -:102980000021934205D3704752F8040F43F8040B1B -:10299000F3E743F8041BF4E78C400008B03D022045 -:1029A000B03D0220B03D0220036F002230B5114639 -:1029B000C46E9D684FF0FF3004EB42130132954224 -:1029C000C3F80019C3F81019C3F80809C3F8001BAD -:1029D000C3F8101BC3F8080BEED24FF00113C4F874 -:1029E0001C3830BD890141F02001016103699B065B -:1029F000FCD4122000F0C4BE204B03EB80022DE972 -:102A0000F047D2F80CE0461CDD6EDEF8142005EB32 -:102A10000636D2F800C005EB4018516861450BD36B -:102A20000123D5F8342803FA00F022EA0000C5F8A3 -:102A300034081846BDE8F087ACEB0103BEF810403F -:102A4000A34228BF2346D8F81849A4B2B3EB840F99 -:102A500010D894681F46A4F1040959F804AF042F54 -:102A6000C6F800A001D9043FF7E71C440B4494606A -:102A70005360D2E70020BDE8F08700BF283B02206A -:102A800010B5054C2046FEF7E9FF4FF0A043E36682 -:102A9000024B236710BD00BF283B0220D43E000834 -:102AA0000378012B70B5054650D12A4BC46E98426D -:102AB0001BD1294B0E2143205A6B42F080025A63EE -:102AC0005A6D42F080025A655A6D5A6942F080028E -:102AD0005A615A6922F080025A615B69FEF73AFC3A -:102AE0001E4BE3601E4BC4F800380023EE6EC4F8A2 -:102AF000003EC02323604FF40413A3633369002B0B -:102B0000FCDA01230C20336100F03AFE3369DB0765 -:102B1000FCD4122000F034FE3369002BFCDA0026CE -:102B20002846A660FFF740FF6B68C4F81068DB68B2 -:102B3000C4F81468C4F81C684BB90A4BA3614FF081 -:102B4000FF336361A36843F00103A36070BD064BCC -:102B5000F4E700BF283B0220003802404014004048 -:102B600003002002003C30C0083C30C0F8B5C46E01 -:102B7000054600214FF000662046FFF733FF296F1E -:102B800000234FF001128F684FF0FF30C4F8343843 -:102B9000C4F81C2804EB431201339F42C2F80069B9 -:102BA000C2F8006BC2F80809C2F8080BF2D20B6831 -:102BB000EA6E6B67636210231361166916F01006E4 -:102BC000FBD1122000F0DCFDD4F8003823F4FE63C2 -:102BD000C4F80038A36943F4402343F01003A36111 -:102BE0000923C4F81038C4F814380A4BEB604FF0CE -:102BF000C043C4F8103B084BC4F8003BC4F810694C -:102C0000C4F800396B6F03F1100243F480136A6754 -:102C1000A362F8BDB03E000840800010C26E90F87C -:102C20006610D2F8003823F4FE6343EA0113C2F8B9 -:102C3000003870472DE9F0410EB20D4600EB8608D2 -:102C4000D8F80C100F6807F00303022B50D0032BA9 -:102C500050D03D4A3D4F012B18BF1746C46E4FEA76 -:102C6000451E002205F1100C04EB0E03C3F8102BD7 -:102C70008A69002A40D04A8A05F158033A435B0129 -:102C8000E2500123D4F81C2803FA0CF31343C4F8D0 -:102C90001C38A64400234A69CEF8103905F13F03D9 -:102CA000002A39D00A8A04EB8303898B9208012910 -:102CB00088BF4A43416F561841EA02422946466797 -:102CC00020465A60FFF78EFED8F80C301B8A43EA84 -:102CD00085531F4305F148035B01E7500123D4F8F6 -:102CE0001C2803FA05F51543C4F81C58BDE8F0810B -:102CF000174FB3E7174FB1E704EB4613D3F8002B98 -:102D000022F40042C3F8002B0123D4F81C2803FA54 -:102D10000CF322EA0303BAE704EB83030E4A04EB45 -:102D2000461629465A602046FFF75CFED6F8003961 -:102D3000012223F4004302FA05F5C6F80039D4F85D -:102D40001C3823EA0505CFE700800010008004103E -:102D50000080081000800C1000040002026F12684E -:102D60004267FFF721BE00005831C36E49015B582E -:102D700013F4004004D013F4001F14BF01200220FC -:102D8000704700004831C36E49015B5813F400409E -:102D900004D013F4001F14BF01200220704700006C -:102DA00000EB8101CB68196A0B6813604B685360B4 -:102DB0007047000000EB810330B5DD68AA69136835 -:102DC000D36019B9402B84BF402313606B8A146809 -:102DD000C26E1C4402EB4110013C09B2B4FBF3F497 -:102DE0006343033323F0030343EAC44343F0C04384 -:102DF000C0F8103B2B6803F00303012B0ED1D2F86F -:102E0000083802EB411013F4807FD0F8003B14BF68 -:102E100043F0805343F00053C0F8003B02EB4112F3 -:102E2000D2F8003B43F00443C2F8003B30BD000041 -:102E30002DE9F041244D0446EE6E06EB4013D3F825 -:102E4000087B3807C3F8087B0AD5D6F81438190769 -:102E500006D505EB840321462846DB685B68984766 -:102E6000FA072FD5D6F81438DB072BD505EB8403EA -:102E7000D968CCB98B69488A5E68B6FBF0F200FB72 -:102E800012628AB91868DA6890420DD2121A83E881 -:102E90001400202383F311880B482146FFF78AFF93 -:102EA00084F31188BDE8F081012303FA04F26B89F1 -:102EB00023EA02036B81CB6823B121460248BDE8B7 -:102EC000F0411847BDE8F081283B022000EB810368 -:102ED0004A0170B5DD68C36E6C692668E66056BB52 -:102EE0001A444FF40020C2F810092A6802F00302C5 -:102EF000012A0AB20ED1D3F8080803EB421410F4E9 -:102F0000807FD4F8000914BF40F0805040F000509A -:102F1000C4F8000903EB4212D2F8000940F0044063 -:102F2000C2F800090122D3F8340802FA01F1014382 -:102F3000C3F8341870BD19B9402E84BF40202060FA -:102F400020681A442E8A841940F00050013CB4FBDA -:102F5000F6F440EAC440C6E7F8B504461E48C56E1C -:102F600005EB4413D3F80869F107C3F8086917D5CE -:102F7000D5F81038DA0713D500EB8403D9684B690C -:102F80001F68DA68974218D2D21B00271A605F6068 -:102F9000202383F311882146FFF798FF87F31188D8 -:102FA000330617D50123D5F83428A340134211D096 -:102FB0002046BDE8F840FFF71FBD012303FA04F2E5 -:102FC000038923EA020303818B68002BE8D02146A2 -:102FD0009847E5E7F8BD00BF283B02209F482DE950 -:102FE000F84FC56E04466E69AB691E4016F4805FEB -:102FF0006E6105D0FEF7A4FDBDE8F84FFFF748BCB1 -:10300000002E12DAD5F8003E9B0705D0D5F8003E19 -:1030100023F00303C5F8003ED5F804388F4823F0A9 -:103020000103C5F80438FEF7B7FD370502D58B4814 -:10303000FEF7A6FDB0040CD5D5F8083813F0060F3E -:10304000EB6823F470530CBF43F4105343F4A053C4 -:10305000EB60310704D56368DB680BB17F489847A4 -:10306000F2026FD4B3020CD5D4F86C8000274FF075 -:103070000109DFF8E8A1236FF9B29B688B4280F069 -:103080009C80F70619D5E16E0A6AC2F30A1702F0AE -:103090000F0302F4F012B2F5802F00F0B580B2F504 -:1030A000402F0AD104EB830301F58051DB68186AD5 -:1030B00000231A469F4240F09C803303D5F81848FD -:1030C0001DD5E70302D50020FFF7B2FEA50302D508 -:1030D0000120FFF7ADFE600302D50220FFF7A8FE36 -:1030E000210302D50320FFF7A3FEE20202D504204C -:1030F000FFF79EFEA30202D50520FFF799FE770396 -:103100007FF57AAFE60702D50020FFF725FFA50778 -:1031100002D50120FFF720FF600702D50220FFF74C -:103120001BFF210702D50320FFF716FFE20602D599 -:103130000420FFF711FFA3067FF55EAF0520FFF720 -:103140000BFF59E7D4F86C8000274FF00109DFF836 -:103150000CA1236F5FFA87FB9B685B4582D308EB6A -:103160004B13D3F8002902F44022B2F5802F22D16C -:10317000D3F80029002A1EDAD3F8002942F0904241 -:10318000C3F80029D3F80029002AFBDB5946E06E7A -:10319000FFF728FC228909FA0BF322EA03032381B3 -:1031A00004EB8B03DB689B6813B159465046984784 -:1031B0005846FFF721FC0137CBE708EB4112D2F864 -:1031C000003B03F44023B3F5802F10D1D2F8003B2D -:1031D000002B0CDA628909FA01F322EA0303638106 -:1031E00004EB8103DB68DB680BB15046984701377D -:1031F00041E79C0700D10A68072B03F101039EBF3A -:103200000270120A013055E7023301F5805104EBD8 -:103210008302526890690268D0F808C04068A2EB47 -:10322000000E0022104697420AD104EB8304636823 -:103230009B699A683A449A605A6817445F603CE711 -:1032400012F0030F00D10868964502F1010282BF17 -:103250008CF80000000A0CF1010CE4E7283B022086 -:10326000C36E03EB4111D1F8003B43F40013C1F8E6 -:10327000003B7047C36E03EB4111D1F8003943F4B2 -:103280000013C1F800397047C36E03EB4111D1F848 -:10329000003B23F40013C1F8003B7047C36E03EBFF -:1032A0004111D1F8003923F40013C1F800397047F7 -:1032B00030B50433039C0172002104FB0325C36174 -:1032C000049B00600363059B4060C1604261026132 -:1032D0008561046242628162C162436330BD000065 -:1032E0000022416AC260416101616FF001018262A6 -:1032F000C262FEF771BF000003694269934203D1C5 -:10330000C2680AB100207047181D70470369196030 -:103310000021C2680132C260C269134482699342CB -:10332000036124BF436A0361FEF74ABF38B5044610 -:103330000D46E3683BB162690020131D1268A36269 -:103340001344E36238BD237A33B929462046FEF799 -:1033500027FF0028EDDA38BD6FF00100FBE7000021 -:10336000C368C269013BC3604369134482699342E5 -:10337000436124BF436A436100238362036B03B14B -:103380001847704770B52023044683F31188866A76 -:103390003EB9FFF7CBFF054618B186F311882846E2 -:1033A00070BDA36AE26A13F8015B9342A36202D381 -:1033B0002046FFF7D5FF002383F31188EFE70000D5 -:1033C0002DE9F84F04460E4690469946202787F38C -:1033D00011880025AA46D4F828B0BBF1000F09D106 -:1033E00049462046FFF7A2FF20B18BF311882846FB -:1033F000BDE8F88FA16AA8EB050BE36A5B1A9B4551 -:1034000028BF9B46BBF1400F1BD9334601F1400258 -:1034100051F8040B914243F8040BF9D1A36A4036EA -:1034200040354033A362A26AE36A9A4202D320463F -:10343000FFF796FF8AF311884545D8D287F31188A4 -:10344000C9E730465A46FDF7E5FCA36A5E445D4491 -:103450005B44A362E7E7000010B5029C04330172ED -:10346000C36103FB0421002300608362C362039BEA -:1034700040600363049BC460426102618161046235 -:103480004262436310BD0000026A6FF00101C26036 -:10349000426A4261026100228262C262FEF79CBE01 -:1034A000436902699A4203D1C2680AB10020704799 -:1034B000184650F8043B0B6070470000C3680021B9 -:1034C000C2690133C3604369134482699342436113 -:1034D00024BF436A4361FEF773BE000038B504465B -:1034E0000D46E3683BB1236900201A1DA262E26920 -:1034F0001344E36238BD237A33B929462046FEF7E8 -:103500004FFE0028EDDA38BD6FF00100FBE7000048 -:1035100003691960C268013AC260C26913448269D2 -:103520009342036124BF436A036100238362036BF8 -:1035300003B118477047000070B5202304460E46BB -:1035400083F31188856A35B91146FFF7C7FF10B1BB -:1035500085F3118870BDA36A1E70A36AE26A013305 -:103560009342A36204D3E16920460439FFF7D0FFF8 -:10357000002080F3118870BD2DE9F84F04460D46F8 -:1035800091469A464FF0200888F311880026B346EA -:10359000A76A4FB951462046FFF7A0FF20B187F335 -:1035A00011883046BDE8F88FA06AA9EB0603E76AE8 -:1035B0003F1A9F4228BF1F46402F1BD905F14003E9 -:1035C00055F8042B9D4240F8042BF9D1A36A4036EC -:1035D0004033A362A26AE36A9A4204D3E1692046B7 -:1035E0000439FFF795FF8BF311884E45D9D288F344 -:1035F0001188CDE729463A46FDF70CFCA36A3D4405 -:103600003E443B44A362E5E7026943699A4203D121 -:10361000C3681BB9184670470023FBE7836A002B79 -:10362000F8D0043B9B1AF5D01360C368013BC3601C -:10363000C3691A4483699A42026124BF436A0361E1 -:10364000002383620123E5E700F040B94FF0804397 -:10365000002258631A610222DA60704700224FF09C -:103660008043DA60704700004FF080435863704732 -:10367000FEE7000010B5194CFEF798FCFEF7BAFD06 -:10368000802217492046FEF73FFD012344F8180C1D -:103690000374144B144AD96821F4E0610904090C3D -:1036A0000A431249DA60CA6842F08072CA60104A5E -:1036B0001049C2F8B01F116841F0010111601022D9 -:1036C000DA77202283F82220002383F3118862B660 -:1036D0000948BDE81040FEF739BD00BFB4330220F1 -:1036E000E03E000800ED00E00003FA05F0ED00E028 -:1036F000001000E055CEACC5E83E00082DE9F84FBB -:103700001E4C4FF00008656904F11407C1464FF0E4 -:103710008043266AAA685B6A9E1B96421CD34FF0C0 -:10372000200AAA68236AD5F80CB0B61A134423629B -:103730002B68BB425F606361C5F80C8001D1FFF765 -:103740008DFF89F311882869D8478AF31188656944 -:10375000AB689E42E5D2DAE76269BA420CD0916862 -:1037600023628E1B9660A86802282CBF1818981C2C -:10377000BDE8F84FFFF778BFBDE8F88F8C33022023 -:10378000034B59685A68521A9042FBD8704700BFE1 -:10379000001000E04B6843608B688360CB68C360B7 -:1037A0000B6943614B6903628B6943620B68036079 -:1037B0007047000008B5274B40F2FF7126481A6990 -:1037C0000A431A611A6922F4FF6222F007021A61A1 -:1037D0001A691A6B0A431A631A6D0A431A651F4A5B -:1037E0001B6D1146FFF7D6FF1D4802F11C01FFF7C4 -:1037F000D1FF1C4802F13801FFF7CCFF1A4802F153 -:103800005401FFF7C7FF194802F17001FFF7C2FF2B -:10381000174802F18C01FFF7BDFF164802F1A8011D -:10382000FFF7B8FF144802F1C401FFF7B3FF1348D4 -:1038300002F1E001FFF7AEFF114802F1FC01FFF7D2 -:10384000A9FF104802F58C71FFF7A4FFBDE80840FE -:1038500000F09EB80038024000000240083F000817 -:103860000004024000080240000C02400010024028 -:103870000014024000180240001C024000200240D8 -:10388000002402400028024008B500F0F5F9FFF7D7 -:10389000F1FEFEF7DBFFBDE80840FEF7B5BD000016 -:1038A000704700004FF080431A69920710B508D5A1 -:1038B00000241C61202383F31188FFF71FFF84F38A -:1038C0001188BDE81040FEF7E3BF0000104B08214F -:1038D0001C201A6C42F001021A641A6E42F00102B6 -:1038E0001A660C4A1B6E936843F0010393604FF015 -:1038F00080436B229A624FF0FF32DA6200229A61B3 -:103900005A63DA605A6001225A611A60FDF722BDDB -:1039100000380240002004E01B4B4FF0FF30002134 -:103920001A696FEA42526FEA52521A611A69C2F377 -:103930000A021A611A695A6958615A6959615A69C1 -:103940001A6A62F080521A621A6A02F080521A628F -:103950001A6A5A6A58625A6A59625A6A0B4A106855 -:1039600040F480701060186F00F44070B0F5007F74 -:1039700003D04FF4803018671967536823F400733D -:10398000536000F059B900BF003802400070004099 -:10399000354B4FF44041354A1A64354A11601A6874 -:1039A00042F001021A601A689207FCD59A6822F068 -:1039B00003029A602C4B19469A6812F00C02FBD154 -:1039C000186800F0F90018609A601A6842F48032B2 -:1039D0001A600B689B03FCD54B6F43F001034B67E8 -:1039E000214B5A6F9007FCD5224A5A601A6842F060 -:1039F00080721A601E4B1A4659684904FCD5196832 -:103A000041F4803119605368D803FCD5136843F43E -:103A100000331360164A53689903FCD5124B1A6899 -:103A20009201FCD5144A40F207319A6040F201122B -:103A3000C3F88C200022C3F89020104A11609A68C5 -:103A400042F002029A60084B9A6802F00C02082ABF -:103A5000FAD15A6C42F480425A645A6E42F480425F -:103A60005A665B6E704700BF0038024000040010C9 -:103A700000700040186C400900948838003C0240F7 -:103A8000084A08B5536911680B4003F001035361FC -:103A900023B1054A13680BB150689847BDE8084048 -:103AA000FEF7F6BE003C0140C8250220084A08B5D2 -:103AB000536911680B4003F00203536123B1054AB7 -:103AC00093680BB1D0689847BDE80840FEF7E0BEA8 -:103AD000003C0140C8250220084A08B55369116816 -:103AE0000B4003F00403536123B1054A13690BB182 -:103AF00050699847BDE80840FEF7CABE003C014047 -:103B0000C8250220084A08B5536911680B4003F024 -:103B10000803536123B1054A93690BB1D0699847F3 -:103B2000BDE80840FEF7B4BE003C0140C8250220B5 -:103B3000084A08B5536911680B4003F0100353613C -:103B400023B1054A136A0BB1506A9847BDE8084093 -:103B5000FEF79EBE003C0140C8250220174B10B561 -:103B60005C691A68144004F478725A61A30604D59B -:103B7000134A936A0BB1D06A9847600604D5104A7D -:103B8000136B0BB1506B9847210604D50C4A936B0D -:103B90000BB1D06B9847E20504D5094A136C0BB101 -:103BA000506C9847A30504D5054A936C0BB1D06CB3 -:103BB0009847BDE81040FEF76BBE00BF003C0140D7 -:103BC000C82502201A4B10B55C691A68144004F429 -:103BD0007C425A61620504D5164A136D0BB1506DD3 -:103BE0009847230504D5134A936D0BB1D06D9847C0 -:103BF000E00404D50F4A136E0BB1506E9847A10430 -:103C000004D50C4A936E0BB1D06E9847620404D56C -:103C1000084A136F0BB1506F9847230404D5054A27 -:103C2000936F0BB1D06F9847BDE81040FEF730BEE0 -:103C3000003C0140C8250220062108B50846FDF7D2 -:103C400089FB06210720FDF785FB06210820FDF7EB -:103C500081FB06210920FDF77DFB06210A20FDF7E7 -:103C600079FB06211720FDF775FB06212820BDE80A -:103C70000840FDF76FBB000008B5FFF74DFEFDF7EC -:103C8000B5F9FDF711FDFDF7E7FEFDF7BBFDFFF709 -:103C900007FEBDE80840FFF7D7BC0000034611F857 -:103CA000012B03F8012B002AF9D1704712101213CF -:103CB000121100000010410001105A00CC33022004 -:103CC00048260220B42602202027022053544D33D8 -:103CD00032463F3F3F3F3F3F0053544D333246371C -:103CE0005B347C355D780053544D333246375B3658 -:103CF0007C375D78000000000096000000000000A6 -:103D000000000000000000000000000000000000B3 -:103D100000000000711600085D16000899160008E2 -:103D200085160008911600087D160008691600081F -:103D300055160008A5160008000000007D170008B1 -:103D400069170008A5170008911700089D170008BB -:103D50008917000875170008611700080118000886 -:103D60000000000001000000000000000200000050 -:103D700000000000A9190008111A000840004000C6 -:103D800064380220743802200200000000000000A5 -:103D90000300000000000000551A000800000000A9 -:103DA0001000000084380220000000000100000024 -:103DB00000000000283B0220010102004865782F26 -:103DC00050726F6669434E43004375626559656C76 -:103DD0006C6F772D424C002553455249414C2500CC -:103DE000A923000811230008151900088D230008D5 -:103DF00043000000F83D000809024300020100C032 -:103E0000320904000001020201000524001001052E -:103E10002401000104240202052406000107058292 -:103E2000030800FF09040100020A00000007050161 -:103E3000024000000705810240000000120000005F -:103E4000443E00081201100102000040AE2D021095 -:103E500000020102030100000403090425424F414E -:103E6000524425004375626559656C6C6F7700306C -:103E700031323334353637383941424344454600D0 -:103E80000080000000800000008000000080000032 -:103E90000000020000000400000004000000040014 -:103EA0000000040000000400000004000000040002 -:103EB00000000000AD1B00088D1E0008391F00081F -:103EC00040004000A03B0220A03B02200100000077 -:103ED000B03B02208000000040010000050000000F -:103EE0006D61696E00000000003F0008B83B0220D1 -:103EF000B03D022001000000713600080000000003 -:103F000069646C65000000000000802A0000000069 -:103F1000AAAAAAAA00000000FFFF000000000000FB -:103F200000A00A000001000000000000AAAAAAAA3E -:103F300000000000FFFF0000000000000000000083 -:103F40001400005400000000AAAAAAAA14000054F9 -:103F5000FFFF0000000000000000000080699A01DF -:103F600000000000AAAA8AAA40555501FFFF0000E0 -:103F700000707007777000000081020000000000F0 -:103F8000AAAAAAAA00410100FFFF000000000080C9 -:103F9000080000000000000000000000AAAAAAAA71 -:103FA00000000000FFFF0000000000000000000013 -:103FB0000000000000000000AAAAAAAA0000000059 -:103FC000FFFF0000000000000000000000000000F3 -:103FD00000000000AAAAAAAA00000000FFFF00003B -:103FE00000000000000000000000000000000000D1 -:103FF000AAAAAAAA00000000FFFF0000000000001B -:1040000000000000000000000000000000000000B0 -:1040100000000000000000000000000000000000A0 -:104020000000000000000000000000000000000090 -:104030000000000000000000000000000000000080 -:10404000FF00000000000000CC3C00083F00000022 -:1040500049040000D93C00083F0000005104000062 -:10406000E73C00083F000000009600000000080048 -:1040700004000000583E000800000000000000009E -:104080000000000000000000000000000000000030 +:1002000002E000F000F8FEE772B6374880F3088895 +:10021000364880F3098836483649086040F20000C5 +:10022000CCF200004EF63471CEF200010860BFF34C +:100230004F8FBFF36F8F40F20000C0F2F0004EF618 +:100240008851CEF200010860BFF34F8FBFF36F8F6C +:100250004FF00000E1EE100A4EF63C71CEF20001C4 +:100260000860062080F31488BFF36F8F02F008FB4C +:1002700003F07EFA4FF055301F491B4A91423CBFB4 +:1002800041F8040BFAE71D49184A91423CBF41F876 +:10029000040BFAE71A491B4A1B4B9A423EBF51F81E +:1002A000040B42F8040BF8E700201849184A914261 +:1002B0003CBF41F8040BFAE702F020FB03F0B8FA68 +:1002C000144C154DAC4203DA54F8041B8847F9E787 +:1002D00000F042F8114C124DAC4203DA54F8041B02 +:1002E0008847F9E702F008BB00060220002202203E +:1002F0000000000808ED00E00000022000060220D7 +:10030000F0400008002202206C220220702202200D +:10031000183A02200002000800020008000200084B +:10032000000200082DE9F04F2DED108AC1F80CD025 +:10033000D0F80CD0BDEC108ABDE8F08F002383F319 +:1003400011882846A047002001F048FEFEE701F092 +:10035000D7FD00DFFEE7000038B500F01FFC02F01B +:100360004FFA054602F082FA0446C0B90E4B9D4290 +:1003700017D001339D4241F2883512BF0446002553 +:100380000124002002F046FA0CB100F075F800F0EC +:1003900055FD284600F0FAF800F06EF8F9E7002560 +:1003A000EFE70546EDE700BF010007B008B500F034 +:1003B000C1FBA0F120035842584108BD07B541F2E6 +:1003C0001203022101A8ADF8043000F0D1FB03B004 +:1003D0005DF804FB38B5302383F3118817480368B0 +:1003E0000BB101F0C7FE0023154A4FF47A71134890 +:1003F00001F0B6FE002383F31188124C236813B179 +:100400002368013B2360636813B16368013B636049 +:100410000D4D2B7833B963687BB9022000F080FC66 +:10042000322363602B78032B07D163682BB902203A +:1004300000F076FC4FF47A73636038BD70220220BE +:10044000D50300089023022088220220084B187050 +:1004500003280CD8DFE800F008050208022000F0AD +:100460005DBC022000F058BC024B00225A6070476D +:100470008822022090230220F8B53F4B3F4A1C46B9 +:100480001968013177D004339342F9D16268A242EE +:1004900071D33B4B9B6803F1006303F5C0339A4271 +:1004A00069D2002000F094FB0220FFF7CFFF354B0C +:1004B00000211A6C19641A6E19661A6E5A6C596406 +:1004C0005A6E59665A6E5A6942F080025A615A69E8 +:1004D00022F080025A615A691A6942F000521A6188 +:1004E0001A6922F000521A611B6972B64FF0E023BC +:1004F000C3F8084DD4E90004BFF34F8FBFF36F8FEB +:10050000214AC2F88410BFF34F8F536923F480331C +:100510005361BFF34F8FD2F8803043F6E076C3F3D8 +:10052000C905C3F34E335B0103EA060C29464CEAC6 +:1005300081770139C2F87472F9D2203B13F1200F90 +:10054000F2D1BFF34F8FBFF36F8FBFF34F8FBFF366 +:100550006F8F536923F4003353610023C2F8503284 +:10056000BFF34F8FBFF36F8F302383F3118885461E +:1005700080F308882047F8BD00800108208001082A +:10058000002202200038024000ED00E02DE9F04F8B +:1005900093B0B44B2022FF2100900AA89D6800F080 +:1005A000F7FBB14A1378A3B90121B0481170036079 +:1005B000302383F3118803680BB101F0DBFD0023C6 +:1005C000AB4A4FF47A71A94801F0CAFD002383F3C6 +:1005D0001188009B13B1A74B009A1A60A64A1378A2 +:1005E000032B03D000231370A24A53604FF0000A7C +:1005F000009CD3465646D146012000F08FFB24B123 +:100600009C4B1B68002B00F02682002000F092FA21 +:100610000390039B002BF2DB012000F07DFB039B8A +:10062000213B1F2BE8D801A252F823F0AD060008A9 +:10063000D506000869070008F9050008F905000853 +:10064000F9050008FB070008CB090008E5080008C9 +:10065000470900086F09000895090008F905000816 +:10066000A7090008F9050008190A00084D07000845 +:10067000F90500085D0A0008B90600084D070008E2 +:10068000F905000847090008F9050008F905000800 +:10069000F9050008F9050008F9050008F905000842 +:1006A000F9050008F9050008690700080220FFF7AE +:1006B0007DFE002840F0F981009B022105A8BAF1D7 +:1006C000000F08BF1C4641F21233ADF8143000F0A1 +:1006D0004FFA91E74FF47A7000F02CFA071EEBDB2B +:1006E0000220FFF763FE0028E6D0013F052F00F24D +:1006F000DE81DFE807F0030A0D101336052304211D +:1007000005A8059300F034FA17E004215548F9E7ED +:1007100004215A48F6E704215948F3E74FF01C0832 +:10072000404608F1040800F055FA0421059005A898 +:1007300000F01EFAB8F12C0FF2D101204FF00009A1 +:1007400000FA07F747EA0B0B5FFA8BFB00F06CFB34 +:1007500026B10BF00B030B2B08BF0024FFF72EFE76 +:100760004AE704214748CDE7002EA5D00BF00B0344 +:100770000B2BA1D10220FFF719FE074600289BD0C2 +:100780000120002600F024FA0220FFF75FFE1FFA86 +:1007900086F8404600F02CFA0446B0B10399404672 +:1007A0000136A1F140025142514100F031FA0028D6 +:1007B000EDD1BA46044641F21213022105A83E4685 +:1007C000ADF8143000F0D4F916E725460120FFF704 +:1007D0003DFE244B9B68AB4207D9284600F0FAF94E +:1007E000013040F067810435F3E70025224BBA461B +:1007F0003E461D701F4B5D60A8E7002E3FF45CAFC6 +:100800000BF00B030B2B7FF457AF0220FFF71EFEFC +:10081000322000F08FF9B0F10008FFF64DAF18F06C +:1008200003077FF449AF0F4A08EB05039268934230 +:100830003FF642AFB8F5807F3FF73EAF124BB84569 +:10084000019323DD4FF47A7000F074F90390039A5A +:10085000002AFFF631AF039A0137019B03F8012B01 +:10086000EDE700BF002202208C230220702202202C +:10087000D5030008902302208822022004220220AF +:10088000082202200C2202208C220220C820FFF71E +:100890008DFD074600283FF40FAF1F2D11D8C5F17D +:1008A00020020AAB25F0030084494245184428BFC2 +:1008B0004246019200F046FA019AFF217F4800F07B +:1008C00067FA4FEAA803C8F387027C4928460193D8 +:1008D00000F066FA064600283FF46DAF019B05EB79 +:1008E000830533E70220FFF761FD00283FF4E4AE03 +:1008F00000F0BAF900283FF4DFAE0027B846704B8D +:100900009B68BB4218D91F2F11D80A9B01330ED008 +:1009100027F0030312AA134453F8203C05934046E2 +:10092000042205A9043700F0E7FA8046E7E73846D5 +:1009300000F050F90590F2E7CDF81480042105A8E5 +:1009400000F016F902E70023642104A8049300F0E4 +:1009500005F900287FF4B0AE0220FFF727FD00283C +:100960003FF4AAAE049800F067F90590E6E700238B +:10097000642104A8049300F0F1F800287FF49CAEF1 +:100980000220FFF713FD00283FF496AE049800F014 +:1009900063F9EAE70220FFF709FD00283FF48CAE77 +:1009A00000F072F9E1E70220FFF700FD00283FF4B4 +:1009B00083AE05A9142000F06DF9074604210490C8 +:1009C00004A800F0D5F83946B9E7322000F0B2F8B3 +:1009D000071EFFF671AEBB077FF46EAE384A07EB19 +:1009E0000903926893423FF667AE0220FFF7DEFCF0 +:1009F00000283FF461AE27F003074F44B9453FF4A8 +:100A0000A5AE484609F1040900F0E4F80421059078 +:100A100005A800F0ADF8F1E74FF47A70FFF7C6FCD7 +:100A200000283FF449AE00F01FF9002844D00A9B8B +:100A300001330BD008220AA9002000F0B1F90028E8 +:100A40003AD02022FF210AA800F0A2F9FFF7B6FC55 +:100A50001C4801F0C9FA13B0BDE8F08F002E3FF436 +:100A60002BAE0BF00B030B2B7FF426AE002364217F +:100A700005A8059300F072F8074600287FF41CAE25 +:100A80000220FFF793FC804600283FF415AEFFF7E5 +:100A900095FC41F2883001F0A7FA059800F00AFAB7 +:100AA00046463C4600F0C0F9A6E506464EE64FF045 +:100AB000000901E6BA467EE637467CE68C22022033 +:100AC00000220220A08601002DE9F84F4FF47A732E +:100AD00006460D46002402FB03F7DFF85080DFF8DE +:100AE000509098F900305FFA84FA5A1C01D0A34262 +:100AF00010D159F824002A4631460368D3F820B0B3 +:100B00003B46D847854205D1074B012083F800A01A +:100B1000BDE8F88F0134042CE3D14FF4FA7001F0F2 +:100B200063FA0020F4E700BFDC2302201022022039 +:100B300014220220002307B5024601210DF107000F +:100B40008DF80730FFF7C0FF20B19DF8070003B014 +:100B50005DF804FB4FF0FF30F9E700000A4604217E +:100B600008B5FFF7B1FF80F00100C0B2404208BDF8 +:100B7000074B0A4630B41978064B53F8214001461A +:100B800023682046DD69044BAC4630BC604700BF9B +:100B9000DC23022014220220A086010070B50A4E38 +:100BA00000240A4D01F032FD3080286833888342EA +:100BB00008D901F025FD2B6804440133B4F5C03F8A +:100BC0002B60F2D370BD00BFDE23022098230220E9 +:100BD00001F0CABD00F1006000F5C0300068704748 +:100BE00000F10060920000F5C03001F055BD00003A +:100BF000054B1A68054B1B889B1A834202D9104487 +:100C000001F0FEBC0020704798230220DE23022062 +:100C100038B50446074D29B128682044BDE838405E +:100C200001F00EBD2868204401F0F2FC0028F3D04A +:100C300038BD00BF9823022010F0030309D1B0F59E +:100C4000846F04D200F10050A0F5712003681846AB +:100C500070470023FBE7000000F10050A0F5712071 +:100C6000D0F8200470470000064991F8243033B1D1 +:100C700000230822086A81F82430FFF7B1BF012061 +:100C8000704700BF9C230220014B1868704700BFCB +:100C9000002004E01E4B0138F0B51D680A1803233C +:100CA0001C482E0CC5F30B0435460788A7420BD110 +:100CB00044680B46013C934218461BD214F9010FBD +:100CC00048B103F8010BF6E7013B00F10800ECD155 +:100CD00091420ED20B4618462C24B6F5805F00F8E0 +:100CE000014B0AD1824202D94122981C5A70401A03 +:100CF000F0BD0846B6F5805FF9D041F201039D4290 +:100D0000F5D18242F3D95A2300F8013BEFE700BF47 +:100D1000002004E0242202207047000070470000F9 +:100D20007047000070B504464FF47A764CB1412C00 +:100D3000254628BF412506FB05F0641B01F054F948 +:100D4000F4E770BD002310B5934203D0CC5CC454CB +:100D50000133F9E710BD0000013810B510F9013F6B +:100D60003BB191F900409C4203D11AB10131013AE3 +:100D7000F4E71AB191F90020981A10BD1046FCE76B +:100D800003460246D01A12F9011B0029FAD1704716 +:100D900002440346934202D003F8011BFAE770476E +:100DA0002DE9F8431F4D14460746884695F8242040 +:100DB00052BBDFF870909CB395F824302BB92022F9 +:100DC000FF2148462F62FFF7E3FF95F824004146D4 +:100DD000C0F1080205EB8000A24228BF2246D6B22D +:100DE0009200FFF7AFFF95F82430A41B17441E4470 +:100DF0009044E4B2F6B2082E85F82460DBD1FFF708 +:100E000033FF0028D7D108E02B6A03EB820383422B +:100E1000CFD0FFF729FF0028CBD10020BDE8F88311 +:100E20000120FBE79C230220024B1A78024B1A7028 +:100E3000704700BFDC23022010220220F8B5184CB6 +:100E4000184800F02FFC2146164800F057FC246893 +:100E50004FF47A70144EE26E144DD2F80438114FEC +:100E600043F00203C2F80438FFF75CFF2046104944 +:100E700000F04CFDE26E0424D2F8043823F00203A3 +:100E8000C2F804384FF4E133336055F8040BB8422C +:100E900002D0314600F066FB013CF6D1F8BD00BF40 +:100EA000A43E0008982D0220C42302201422022010 +:100EB000AC3E00080C4B70B50C4D04461E780C4B34 +:100EC00055F826209A420DD00A4B002118221846C8 +:100ED000FFF75EFF0460014655F82600BDE870404C +:100EE00000F040BB70BD00BFDC23022014220220B2 +:100EF000982D0220C423022030B50A44084D9142A7 +:100F00000DD011F8013B5840082340F30004013B89 +:100F10002C4013F0FF0384EA5000F6D1EFE730BD18 +:100F20002083B8ED026843681143016003B118479C +:100F300070470000024A136843F0C0031360704713 +:100F400000440040024A136843F0C0031360704736 +:100F500000480040024A136843F0C0031360704722 +:100F60000078004037B5274C274D204600F0EEFAB8 +:100F700004F11400009400234FF48072234900F020 +:100F8000ABF94FF48072224904F138000094214BF0 +:100F900000F024FA204BC4E91735204C204600F01D +:100FA000D5FA04F11400009400234FF480721C4918 +:100FB00000F092F94FF480721A4904F1380000945D +:100FC000194B00F00BFA194BC4E91735184C2046A1 +:100FD00000F0BCFA04F1140000234FF480721549AC +:100FE000009400F079F9144B4FF48072134904F126 +:100FF0003800009400F0F2F9114BC4E9173503B042 +:1010000030BD00BFE023022080F9370324250220F1 +:1010100024280220350F0008004400404C24022000 +:101020002426022024290220450F00080048004001 +:10103000B824022024270220550F0008242A022069 +:1010400000780040037C30B52E4C002918BF0C46B8 +:10105000012B13D12C4B98420AD12C4B1A6C42F421 +:1010600000321A641A6E42F400321A661B6E05E0F2 +:10107000274B98422FD0274B984235D02268036ED9 +:10108000C16D03EB52038466B3FBF2F3626815048F +:1010900042BF23F0070503F0070343EA4503CB6093 +:1010A000A36843F040034B60E36843F001038B60A7 +:1010B00042F4967343F001030B604FF0FF330B6271 +:1010C000510505D512F0102217D0B2F1805F16D06D +:1010D00080F8643030BD0D4B1A6C42F480221A64E3 +:1010E0001A6E42F48022C0E7084B1A6C42F080422C +:1010F0001A641A6E42F08042B7E77F23E8E73F2385 +:10110000E6E700BFB43D0008E023022000380240BB +:101110004C240220B82402202DE9F047C66D054674 +:101120003768F469210734621AD014F0080118BF37 +:101130004FF48071E20748BF41F02001A3074FF050 +:10114000300348BF41F04001600748BF41F08001D3 +:1011500083F31188281DFFF7E5FE002383F3118830 +:10116000E2050AD5302383F311884FF48061281DEE +:10117000FFF7D8FE002383F311884FF030094FF0BA +:10118000000A14F0200838D13B0616D54FF030097C +:1011900005F1380A200610D589F31188504600F071 +:1011A00051F9002836DA0821281DFFF7BBFE27F089 +:1011B00080033360002383F31188790614D5620617 +:1011C00012D5302383F31188D5E913239A4208D12D +:1011D0002B6C33B127F040071021281DFFF7A2FE2A +:1011E0003760002383F31188E30618D5AA6E1369CC +:1011F000ABB15069BDE8F047184789F31188736AAD +:10120000284695F86410194000F0BAF98AF311885D +:10121000F469B6E7B06288F31188F469BAE7BDE80B +:10122000F0870000F8B51546826804460B46AA42CE +:1012300000D28568A1692669761AB5420BD2184694 +:101240002A46FFF77FFDA3692B44A3612846A368C4 +:101250005B1BA360F8BD0CD9AF1B18463246FFF7E5 +:1012600071FD3A46E1683044FFF76CFDE3683B44AA +:10127000EBE718462A46FFF765FDE368E5E700005F +:1012800083689342F7B50446154600D28568D4E9D1 +:101290000460361AB5420BD22A46FFF753FD636944 +:1012A0002B4463612846A3685B1BA36003B0F0BDB9 +:1012B0000DD93246AF1B0191FFF744FD01993A4623 +:1012C000E0683144FFF73EFDE3683B44E9E72A4626 +:1012D000FFF738FDE368E4E710B50A440024C36172 +:1012E000029B8460C16002610362C0E90000C0E942 +:1012F000051110BD08B5D0E90532934201D18268CD +:1013000082B98268013282605A1C426119700021E0 +:10131000D0E904329A4224BFC368436100F080FEE2 +:10132000002008BD4FF0FF30FBE7000070B5302310 +:1013300004460E4683F31188A568A5B1A368A26987 +:10134000013BA360531CA36115782269934224BF1B +:10135000E368A361E3690BB120469847002383F358 +:101360001188284607E03146204600F049FE002853 +:10137000E2DA85F3118870BD2DE9F74F04460E4679 +:1013800017469846D0F81C904FF0300A8AF311881F +:101390004FF0000B154665B12A4631462046FFF74F +:1013A00041FF034660B94146204600F029FE00286F +:1013B000F1D0002383F31188781B03B0BDE8F08FD0 +:1013C000B9F1000F03D001902046C847019B8BF371 +:1013D0001188ED1A1E448AF31188DCE7C160C361ED +:1013E000009B82600362C0E905111144C0E900005E +:1013F00001617047F8B504460D461646302383F365 +:101400001188A768A7B1A368013BA36063695A1C50 +:1014100062611D70D4E904329A4224BFE3686361BB +:10142000E3690BB120469847002080F3118807E05C +:101430003146204600F0E4FD0028E2DA87F3118807 +:10144000F8BD0000D0E9052310B59A4201D18268A9 +:101450007AB982680021013282605A1C82611C784C +:1014600003699A4224BFC368836100F0D9FD204616 +:1014700010BD4FF0FF30FBE72DE9F74F04460E4655 +:1014800017469846D0F81C904FF0300A8AF311881E +:101490004FF0000B154665B12A4631462046FFF74E +:1014A000EFFE034660B94146204600F0A9FD002842 +:1014B000F1D0002383F31188781B03B0BDE8F08FCF +:1014C000B9F1000F03D001902046C847019B8BF370 +:1014D0001188ED1A1E448AF31188DCE7026843681C +:1014E0001143016003B11847704700001430FFF743 +:1014F00043BF00004FF0FF331430FFF73DBF000043 +:101500003830FFF7B9BF00004FF0FF333830FFF736 +:10151000B3BF00001430FFF709BF00004FF0FF31E8 +:101520001430FFF703BF00003830FFF763BF00003F +:101530004FF0FF323830FFF75DBF0000012914BFC4 +:101540006FF0130000207047FFF70CBD044B0360E1 +:1015500000234360C0E9023301230374704700BFD6 +:10156000CC3D000810B53023044683F31188FFF703 +:1015700069FD02230020237480F3118810BD000050 +:1015800038B5C36904460D461BB904210844FFF76A +:10159000A5FF294604F11400FFF7ACFE002806DA87 +:1015A000201D4FF40061BDE83840FFF797BF38BDFC +:1015B000026843681143016003B118477047000097 +:1015C00013B5446BD4F8A4381A681178042915D1DE +:1015D000217C022912D11979012312898B401342EF +:1015E0000CD101A904F14C0001F07EFFD4F8A4480D +:1015F0000246019B2179206800F0D6F902B010BDA7 +:10160000143001F001BF00004FF0FF33143001F03F +:10161000FBBE00004C3001F0D3BF00004FF0FF33A1 +:101620004C3001F0CDBF0000143001F0CFBE0000FF +:101630004FF0FF31143001F0C9BE00004C3001F012 +:101640009FBF00004FF0FF324C3001F099BF000007 +:1016500000207047D0F8A4381A6810B511780446F5 +:10166000042917D1017C022914D159790123528907 +:101670008B4013420ED1143001F062FE024648B195 +:10168000D4F8A4484FF4807361792068BDE8104015 +:1016900000F078B910BD0000406BFFF7DBBF000021 +:1016A000704700007FB5124B0125042604460360F5 +:1016B0000023057400F1840243602946C0E9023327 +:1016C0000C4B0290143001934FF48073009601F09C +:1016D00013FE094B04F29442294604F14C00029493 +:1016E000CDE900634FF4807301F0DAFE04B070BD01 +:1016F000F43D000899160008C11500080B68302257 +:1017000082F311880A7903EB820210624A790D3262 +:1017100043F822008A7912B103EB82031862022394 +:10172000C0F8A4180374002080F3118870470000EB +:1017300038B5037F044613B190F85430ABB9012596 +:10174000201D0221FFF734FF04F114006FF00101A6 +:10175000257700F071FC04F14C0084F854506FF0D0 +:101760000101BDE8384000F067BC38BD10B501216B +:1017700004460430FFF71CFF0023237784F854301D +:1017800010BD000038B504460025143001F0CCFD32 +:1017900004F14C00257701F09BFE201D84F8545085 +:1017A0000121FFF705FF2046BDE83840FFF752BF93 +:1017B00090F85C3003F06003202B06D190F85D2098 +:1017C0000023212A03D81F2A06D800207047222A86 +:1017D000FBD1C0E9143303E0034A026507224265E6 +:1017E00083650120704700BF3C220220D0F8A43856 +:1017F00037B51A680446117804291AD1017C0229E8 +:1018000017D11979012312898B40134211D100F1AC +:101810004C05284601F01CFF58B101A9284601F0EB +:1018200063FED4F8A4480246019B2179206800F0A9 +:10183000BBF803B030BD000000EB8103F0B51E6AB9 +:1018400085B004460D46FEB1302383F3118804EBC6 +:101850008507301D0821FFF7ABFEFB6806F14C0041 +:101860005B691B681BB1019001F04CFE019803A954 +:1018700001F03AFE024648B1039B2946204600F09B +:1018800093F8002383F3118805B0F0BDFB685A6913 +:101890001268002AF5D01B8A013B1340F1D104F1F4 +:1018A0005C02EAE70D3138B550F82140DCB1302355 +:1018B00083F31188D4F8A4281368527903EB8203C8 +:1018C000DB689B695D6845B104216018FFF770FE15 +:1018D000294604F1140001F03DFD2046FFF7BAFE51 +:1018E000002383F3118838BD7047000001F08AB8E7 +:1018F00001232822002110B5044600F8243BFFF7FD +:1019000047FA0023C4E9013310BD000038B504468E +:10191000302383F3118800254160C0E90355C0E9F5 +:101920000555C0E9075501F07DF80223237085F3C2 +:101930001188284638BD000070B500EB81030546CC +:1019400050690E461446DA6018B110220021FFF7E4 +:101950001FFAA06918B110220021FFF719FA3146C9 +:101960002846BDE8704001F027B90000826802F007 +:10197000011282600022C0E90422C0E9062202624C +:1019800001F0A6B9F0B4012500EB810447898D4030 +:10199000E4683D43A469458123600023A26063603D +:1019A000F0BC01F0C1B90000F0B4012500EB8104E6 +:1019B00007898D40E4683D43646905812360002305 +:1019C000A2606360F0BC01F03BBA000070B5022376 +:1019D0000025044603704566056280F84C50C0E956 +:1019E0000255C0E90455C0E9065501F081F8636865 +:1019F0001B6823B129462046BDE87040184770BDDA +:101A00000378052B10B504460AD080F8683005230A +:101A1000037043681B680BB1042198470023A3603F +:101A200010BD00000178052906D190F868204368B0 +:101A300002701B6803B118477047000070B590F83A +:101A40004C30044613B1002380F84C3004F15C02A2 +:101A5000204601F05FF963689B68B3B994F85C3085 +:101A600013F0600535D00021204601F011FC002163 +:101A7000204601F003FC63681B6813B10621204671 +:101A80009847062384F84C3070BD204698470028BC +:101A9000E4D0B4F86230626D9A4288BF636594F90D +:101AA0005C30656D002B4FF0300380F20381002D18 +:101AB00000F0F280092284F84C2083F31188002181 +:101AC0002046D4E91423FFF76FFF002383F3118826 +:101AD000DAE794F85D2003F07F0343EA022340F243 +:101AE0000232934200F0C58021D8B3F5807F48D000 +:101AF0000DD8012B3FD0022B00F09380002BB2D1E8 +:101B000004F16402226502226265A365C1E7B3F5B0 +:101B1000817F00F09B80B3F5407FA4D194F85E30C4 +:101B2000012BA0D1B4F8643043F0020332E0B3F5E6 +:101B3000006F4DD017D8B3F5A06F31D0A3F5C063B7 +:101B4000012B90D86368204694F85E205E6894F874 +:101B50005F10B4F86030B047002884D04368236534 +:101B6000036863651AE0B3F5106F36D040F60242A1 +:101B700093427FF478AF5C4B2365022363650023B7 +:101B8000C3E794F85E30012B7FF46DAFB4F8643096 +:101B900023F00203A4F86430C4E91455A56578E77E +:101BA000B4F85C30B3F5A06F0ED194F85E302046E7 +:101BB00084F8663000F0F4FF63681B6813B10121FC +:101BC00020469847032323700023C4E914339CE77D +:101BD00004F1670323650123C3E72378042B10D1A5 +:101BE000302383F311882046FFF7C0FE85F3118868 +:101BF0000321636884F8675021701B680BB120468D +:101C0000984794F85E30002BDED084F867300423C8 +:101C1000237063681B68002BD6D0022120469847AA +:101C2000D2E794F8603020461D0603F00F010AD574 +:101C300001F062F8012804D002287FF414AF2B4B86 +:101C40009AE72B4B98E701F049F8F3E794F85E30F8 +:101C5000002B7FF408AF94F8603013F00F01B3D07D +:101C60001A06204602D501F027FBADE701F01AFB6A +:101C7000AAE794F85E30002B7FF4F5AE94F860305C +:101C800013F00F01A0D01B06204602D501F000FB87 +:101C90009AE701F0F3FA97E7142284F84C2083F3D3 +:101CA00011882B462A4629462046FFF76BFE85F30E +:101CB0001188E9E65DB1152284F84C2083F3118880 +:101CC00000212046D4E91423FFF75CFEFDE60B2239 +:101CD00084F84C2083F311882B462A462946204657 +:101CE000FFF762FEE3E700BF243E00081C3E000849 +:101CF000203E000838B590F84C300446002B3ED00A +:101D0000063BDAB20F2A34D80F2B32D8DFE803F0C3 +:101D100037313108223231313131313131313737D8 +:101D2000456DB0F862309D4214D2C3681B8AB5FB82 +:101D3000F3F203FB12556DB9302383F311882B4660 +:101D40002A462946FFF730FE85F311880A2384F8D6 +:101D50004C300EE0142384F84C30302383F3118888 +:101D6000002320461A461946FFF70CFE002383F392 +:101D7000118838BD836D03B198470023E7E7002140 +:101D8000204601F085FA0021204601F077FA6368C9 +:101D90001B6813B10621204698470623D7E70000A9 +:101DA00010B590F84C300446142B29D017D8062BC8 +:101DB00005D001D81BB110BD093B022BFBD8002177 +:101DC000204601F065FA0021204601F057FA6368C9 +:101DD0001B6813B1062120469847062319E0152BEE +:101DE000E9D10B2380F84C30302383F31188002392 +:101DF0001A461946FFF7D8FD002383F31188DAE766 +:101E0000C3689B695B68002BD5D1836D03B198478C +:101E1000002384F84C30CEE7002382680375036901 +:101E20001B6899689142FBD25A6803604260106057 +:101E30005860704700238268037503691B689968BE +:101E40009142FBD85A680360426010605860704746 +:101E500008B50846302383F311880B7D032B05D08A +:101E6000042B0DD02BB983F3118808BD8B69002298 +:101E70001A604FF0FF338361FFF7CEFF0023F2E7D4 +:101E8000D1E9003213605A60F3E70000FFF7C4BFE6 +:101E9000054BD96808751868026853601A600122FA +:101EA000D8600275FEF73EBA282B02200C4B30B5E5 +:101EB000DD684B1C87B004460FD02B46094A6846A4 +:101EC00000F04EF92046FFF7E3FF009B13B1684690 +:101ED00000F050F9A86907B030BDFFF7D9FFF9E766 +:101EE000282B0220511E0008044B1A68DB689068FA +:101EF0009B68984294BF002001207047282B022045 +:101F0000084B10B51C68D868226853601A6001221B +:101F1000DC602275FFF78EFF01462046BDE81040C9 +:101F2000FEF700BA282B022038B5074C0123002504 +:101F3000064907482370656001F0C2FB0223237045 +:101F400085F3118838BD00BF902D02202C3E00087B +:101F5000282B022000F044B9034A516853685B1AE9 +:101F60009842FBD8704700BF001000E08B6002234E +:101F7000086108468B8270478368A3F1840243F8A6 +:101F8000142C026943F8442C426943F8402C094A56 +:101F900043F8242CC268A3F1200043F8182C022235 +:101FA00003F80C2C002203F80B2C034A43F8102CE6 +:101FB000704700BF3D030008282B022008B5FFF73B +:101FC000DBFFBDE80840FFF761BF0000024BDB68A4 +:101FD00098610F20FFF75CBF282B0220302383F38A +:101FE0001188FFF7F3BF000008B50146302383F3E3 +:101FF00011880820FFF75AFF002383F3118808BDDA +:10200000064BDB6839B1426818605A601360436060 +:102010000420FFF74BBF4FF0FF307047282B022002 +:102020000368984206D01A680260506018469961A9 +:10203000FFF72CBF7047000038B504460D462068F6 +:10204000844200D138BD036823605C608561FFF77E +:102050001DFFF4E7036810B59C68A2420CD85C68C9 +:102060008A600B604C602160596099688A1A9A6096 +:102070004FF0FF33836010BD121B1B68ECE70000BC +:102080000A2938BF0A2170B504460D460A26601990 +:1020900001F010FB01F0FCFA041BA54203D8751CEB +:1020A00004462E46F3E70A2E04D90120BDE870400D +:1020B00001F046BB70BD0000F8B5144B0D460A2A6E +:1020C0004FF00A07D96103F11001826038BF0A227C +:1020D000416019691446016048601861A81801F050 +:1020E000DBFA01F0D5FA431B0646A34206D37C1C5B +:1020F00028192746354601F0DDFAF2E70A2F04D900 +:102100000120BDE8F84001F01BBBF8BD282B0220E0 +:10211000F8B506460D4601F0BBFA0F4A134653F8D0 +:10212000107F9F4206D12A4601463046BDE8F8405E +:10213000FFF7C2BFD169BB68441A2C1928BF2C46CF +:10214000A34202D92946FFF79BFF224631460348A6 +:10215000BDE8F840FFF77EBF282B0220382B022075 +:10216000C0E90323002310B45DF8044B4361FFF77B +:10217000CFBF000010B5194C236998420DD081687B +:10218000D0E9003213605A609A680A449A600023CA +:1021900003604FF0FF33A36110BD0268234643F88C +:1021A000102F53600022026022699A4203D1BDE8D9 +:1021B000104001F079BA936881680B44936001F094 +:1021C00067FA2269E1699268441AA242E4D911448B +:1021D000BDE81040091AFFF753BF00BF282B0220AB +:1021E0002DE9F047DFF8BC8008F110072C4ED8F835 +:1021F000105001F04DFAD8F81C40AA68031B9A420F +:102200003ED814444FF00009D5E90032C8F81C400C +:1022100013605A60C5F80090D8F81030B34201D16D +:1022200001F042FA89F31188D5E90331284698472D +:10223000302383F311886B69002BD8D001F028FA82 +:102240006A69A0EB040982464A450DD2022001F0DA +:1022500077FA0022D8F81030B34208D15146284608 +:10226000BDE8F047FFF728BF121A2244F2E712EB4D +:1022700009092946384638BF4A46FFF7EBFEB5E75D +:10228000D8F81030B34208D01444C8F81C00211A02 +:10229000A960BDE8F047FFF7F3BEBDE8F08700BFD7 +:1022A000382B0220282B022000207047FEE7000078 +:1022B000704700004FF0FF307047000002290CD03B +:1022C000032904D00129074818BF00207047032ABA +:1022D00005D8054800EBC20070470448704700204D +:1022E000704700BF083F00084C220220BC3E000897 +:1022F00070B59AB005460846144601A900F0C2F828 +:1023000001A8FEF73DFD431C0022C6B25B0010464B +:10231000C5E9003423700323023404F8013C01AB07 +:10232000D1B202348E4201D81AB070BD13F8011B2D +:10233000013204F8010C04F8021CF1E708B530235F +:1023400083F311880348FFF751FA002383F31188C0 +:1023500008BD00BF982D022090F85C3003F01F02EA +:10236000012A07D190F85D200B2A03D10023C0E990 +:10237000143315E003F06003202B08D1B0F860306F +:102380002BB990F85D20212A03D81F2A04D8FFF723 +:102390000FBA222AEBD0FAE7034A02650722426508 +:1023A00083650120704700BF4322022007B505293D +:1023B00017D8DFE801F0191603191920302383F329 +:1023C0001188104A01210190FFF7B6FA0198022105 +:1023D0000D4AFFF7B1FA0D48FFF7D4F9002383F354 +:1023E000118803B05DF804FB302383F3118807489C +:1023F000FFF79EF9F2E7302383F311880348FFF7D4 +:10240000B5F9EBE75C3E0008803E0008982D0220FD +:1024100038B50C4D0C4C2A460C4904F10800FFF766 +:1024200067FF05F1CA0204F110000949FFF760FFD8 +:1024300005F5CA7204F118000649BDE83840FFF7F7 +:1024400057BF00BF703602204C220220383E0008E1 +:10245000453E0008503E000870B5044608460D464B +:10246000FEF78EFCC6B22046013403780BB918463D +:1024700070BD32462946FEF76FFC0028F3D10120DB +:10248000F6E700002DE9F84F05460C46FEF778FC0C +:102490002C49C6B22846FFF7DFFF08B10336F6B273 +:1024A00029492846FFF7D8FF08B11036F6B2632E47 +:1024B0000DD8DFF89080DFF89090244FDFF894A0DB +:1024C000DFF894B02E7846B92670BDE8F88F29461B +:1024D0002046BDE8F84F01F04FBC252E2ED1072233 +:1024E00041462846FEF738FC70B9DBF80030073566 +:1024F0000A3444F80A3CDBF8043044F8063CBBF8E4 +:10250000083024F8023CDDE7082249462846FEF759 +:1025100023FC98B9A21C0E4B197802320909C95D37 +:1025200002F8041C13F8011B01F00F015345C95DAB +:1025300002F8031CF0D118340835C3E7013504F85C +:10254000016BBFE7283F0008503E00083B3F0008F2 +:1025500020F4F01F2CF4F01F303F0008BFF34F8F22 +:10256000024AD368DB03FCD4704700BF003C024042 +:1025700008B5074B1B7853B9FFF7F0FF054B1A69F5 +:10258000002A04DA044A5A6002F188325A6008BD0F +:10259000CE380220003C02402301674508B5054BB8 +:1025A0001B7833B9FFF7DAFF034A136943F000439E +:1025B000136108BDCE380220003C02400B28F0B564 +:1025C00016D80C4C0C4923787BB90E460B4D0C23C6 +:1025D0004FF00062013B55F8047B46F8042B13F0E2 +:1025E000FF033A44F6D10123237051F82000F0BDD7 +:1025F0000020FCE700390220D03802204C3F0008C0 +:10260000014B53F8200070474C3F00080C207047E6 +:102610000B2810B5044601D9002010BDFFF7CEFFEE +:10262000064B53F824301844C21A0BB90120F4E7C2 +:1026300012680132F0D1043BF6E700BF4C3F0008BE +:102640000B2810B5044621D8FFF788FFFFF790FF4D +:102650000F4AF323D360C300DBB243F4007343F0AB +:1026600002031361136943F480331361FFF776FFAC +:10267000FFF7A4FF074B53F8241000F0D9F82046C9 +:10268000FFF78CFFBDE81040FFF7C2BF002010BD70 +:10269000003C02404C3F0008F8B512F0010314461C +:1026A00042D18218B2F1026F57D82D4B1B6813F03C +:1026B000010352D0FFF75CFF2A4DF32340F20127BC +:1026C000EB60FFF74BFF032C15D824F00104401AF0 +:1026D00040F201176618234CB14200EB0105236953 +:1026E00024D123F0010301202361FFF757FFF8BD38 +:1026F000043C0430E7E78307E7D12B6923F44073F8 +:102700002B612B693B432B6151F8046B0660BFF3CF +:102710004F8FFFF723FF03689E42E9D02B6923F018 +:1027200001032B61FFF73AFF0020E0E723F4407339 +:10273000236123693B4323610B882B80BFF34F8FB9 +:10274000FFF70CFF2D88ADB231F8023BAB42C3D08E +:10275000236923F001032361E4E71846C7E700BFBC +:1027600000380240003C0240084908B50B7828B107 +:102770001BB9FFF7FDFE01230B7008BD002BFCD039 +:102780000870BDE80840FFF709BF00BFCE3802203F +:102790000244074BD2B210B5904200D110BD441C88 +:1027A00000B253F8200041F8040BE0B2F4E700BF98 +:1027B000502800400F4B30B51C6F240407D41C6F09 +:1027C00044F400741C671C6F44F400441C670A4CFA +:1027D00002442368D2B243F480732360074B9042D3 +:1027E00000D130BD441C51F8045B00B243F82050C6 +:1027F000E0B2F4E70038024000700040502800408A +:1028000007B5012201A90020FFF7C2FF019803B01C +:102810005DF804FB13B50446FFF7F2FFA04205D0B4 +:10282000012201A900200194FFF7C4FF02B010BDEE +:102830000144BFF34F8F064B884204D3BFF34F8F41 +:10284000BFF36F8F7047C3F85C022030F4E700BF1E +:1028500000ED00E0034B1A681AB9034AD2F8742855 +:102860001A607047043902200030024008B5FFF7B3 +:10287000F1FF024B1868C0F3407008BD0439022014 +:1028800070B5BFF34F8FBFF36F8F1A4A0021C2F8A4 +:102890005012BFF34F8FBFF36F8F536943F4003370 +:1028A0005361BFF34F8FBFF36F8FC2F88410BFF334 +:1028B0004F8FD2F8803043F6E074C3F3C900C3F3FE +:1028C0004E335B0103EA0406014646EA817501398D +:1028D000C2F86052F9D2203B13F1200FF2D1BFF3BE +:1028E0004F8F536943F480335361BFF34F8FBFF36E +:1028F0006F8F70BD00ED00E0FEE70000214B224825 +:10290000224A70B5904237D3214BC11EDA1C121AED +:1029100022F003028B4238BF00220021FEF738FA72 +:102920001C4A0023C2F88430BFF34F8FD2F88030A6 +:1029300043F6E074C3F3C900C3F34E335B0103EA0B +:102940000406014646EA81750139C2F86C52F9D293 +:10295000203B13F1200FF2D1BFF34F8FBFF36F8FE6 +:10296000BFF34F8FBFF36F8F0023C2F85032BFF316 +:102970004F8FBFF36F8F70BD53F8041B40F8041BDB +:10298000C0E700BF5C410008183A0220183A022054 +:10299000183A022000ED00E070B5D0E91B43002298 +:1029A0004FF0FF359E6804EB42135101D3F8000944 +:1029B000002805DAD3F8000940F08040C3F8000988 +:1029C000D3F8000B002805DAD3F8000B40F0804064 +:1029D000C3F8000B013263189642C3F80859C3F8D4 +:1029E000085BE0D24FF00113C4F81C3870BD000042 +:1029F000890141F02001016103699B06FCD412208A +:102A0000FFF7AABA10B5054C2046FEF771FF4FF04C +:102A1000A043E366024B236710BD00BF08390220C4 +:102A2000A03F000870B503780546012B50D12A4B12 +:102A3000C46E98421BD1294B0E2143205A6B42F0A1 +:102A400080025A635A6D42F080025A655A6D5A6983 +:102A500042F080025A615A6922F080025A615B6931 +:102A600000F034FC1E4BE3601E4BC4F8003800231A +:102A7000EE6EC4F8003EC02323604FF40413A3633A +:102A80003369002BFCDA01230C203361FFF764FA71 +:102A90003369DB07FCD41220FFF75EFA3369002BA1 +:102AA000FCDA00262846A660FFF776FF6B68C4F8BC +:102AB0001068DB68C4F81468C4F81C684BB90A4B8A +:102AC000A3614FF0FF336361A36843F00103A36088 +:102AD00070BD064BF4E700BF083902200038024001 +:102AE0004014004003002002003C30C0083C30C0CD +:102AF000F8B5C46E054600214FF000662046FFF78A +:102B000077FF296F00234FF001128F684FF0FF30DD +:102B1000C4F83438C4F81C2804EB431201339F4234 +:102B2000C2F80069C2F8006BC2F80809C2F8080BC5 +:102B3000F2D20B68EA6E6B67636210231361166949 +:102B400016F01006FBD11220FFF706FAD4F8003871 +:102B500023F4FE63C4F80038A36943F4402343F030 +:102B60001003A3610923C4F81038C4F814380A4BC1 +:102B7000EB604FF0C043C4F8103B084BC4F8003B77 +:102B8000C4F81069C4F800396B6F03F1100243F404 +:102B900080136A67A362F8BD7C3F00084080001084 +:102BA000C26E90F86610D2F8003823F4FE6343EA50 +:102BB0000113C2F8003870472DE9F84300EB810398 +:102BC000C56E0C468046DA680FFA81F9480116682E +:102BD00006F00306731E022B05EB41134FF00001B4 +:102BE00094BFB604384EC3F8101B4FF0010104F136 +:102BF000100398BF06F1805601FA03F3916998BF5C +:102C000006F5004600293AD0578A04F158013743A7 +:102C100049016F50D5F81C180B430021C5F81C382A +:102C20002B180127C3F81019A7405369611E9BB3E5 +:102C3000138A928B9B08012A88BF5343D8F87420CB +:102C4000981842EA034301F140022146C8F8740093 +:102C5000284605EB82025360FFF7CAFE08EB8900A5 +:102C6000C3681B8A43EA845348341E4364012E51CF +:102C7000D5F81C381F43C5F81C78BDE8F88305EB70 +:102C80004917D7F8001B21F40041C7F8001BD5F8FD +:102C90001C1821EA0303C0E704F13F030B4A28464E +:102CA000214605EB83035A60FFF7A2FE05EB4910AE +:102CB000D0F8003923F40043C0F80039D5F81C38A7 +:102CC00023EA0707D7E700BF0080001000040002D6 +:102CD000026F12684267FFF75FBE00005831C36E93 +:102CE00049015B5813F4004004D013F4001F0CBFDB +:102CF00002200120704700004831C36E49015B5833 +:102D000013F4004004D013F4001F0CBF0220012074 +:102D10007047000000EB8101CB68196A0B681360F3 +:102D20004B6853607047000000EB810330B5DD68ED +:102D3000AA691368D36019B9402B84BF402313607C +:102D40006B8A1468C26E1C4402EB4110013C09B24C +:102D5000B4FBF3F46343033323F0030343EAC443B4 +:102D600043F0C043C0F8103B2B6803F00303012B72 +:102D70000ED1D2F8083802EB411013F4807FD0F85E +:102D8000003B14BF43F0805343F00053C0F8003BB6 +:102D900002EB4112D2F8003B43F00443C2F8003B7F +:102DA00030BD00002DE9F041244D0446EE6E06EBE7 +:102DB0004013D3F8087B3807C3F8087B0AD5D6F848 +:102DC0001438190706D505EB840321462846DB682D +:102DD0005B689847FA071FD5D6F81438DB071BD570 +:102DE00005EB8403D968CCB98B69488A5A68B2FB71 +:102DF000F0F600FB16228AB91868DA6890420DD204 +:102E0000121AC3E90024302383F311880B482146AA +:102E1000FFF78AFF84F31188BDE8F081012303FAEC +:102E200004F26B8923EA02036B81CB68002BF3D099 +:102E300021460248BDE8F041184700BF083902208A +:102E400000EB81034A0170B5DD68C36E6C692668CA +:102E5000E66056BB1A444FF40020C2F810092A68F5 +:102E600002F00302012A0AB20ED1D3F8080803EBDC +:102E7000421410F4807FD4F8000914BF40F0805051 +:102E800040F00050C4F8000903EB4212D2F80009E8 +:102E900040F00440C2F800090122D3F8340802FAD5 +:102EA00001F10143C3F8341870BD19B9402E84BF35 +:102EB0004020206020681A442E8A8419013CB4FB0B +:102EC000F6F440EAC44040F00050C6E72DE9F8436C +:102ED0003B4D04464701EE6E06EB4013D3F80889DC +:102EE00018F0010FC3F808891AD0D6F81038DB079C +:102EF00016D505EB8003D9684B691868DA689042EB +:102F000030D2121A4FF000091A60C3F8049030232F +:102F100083F3118821462846FFF792FF89F3118831 +:102F200018F0800F1CD0D6F834380126A640334262 +:102F300016D005EB84030134ED6ED3F80CC0E4B277 +:102F40002F44DCF8142005EB0434D2F800E051687B +:102F5000714515D3D5F8343823EA0606C5F8346828 +:102F6000BDE8F883012303FA04F22B8923EA020364 +:102F70002B818B68002BD3D0214628469847CFE77A +:102F8000AEEB0103BCF81000834228BF0346D7F81C +:102F9000180980B2B3EB800FE2D89068A0F1040961 +:102FA00059F8048FC4F80080A0EB09089844B8F1E0 +:102FB000040FF5D818440B4490605360C7E700BF76 +:102FC000083902202DE9F74FA44CE56E6E69AB6914 +:102FD0001E4016F480586E6107D02046FEF7F6FCBE +:102FE00003B0BDE8F04F00F069BC002E12DAD5F84E +:102FF000003E9B0705D0D5F8003E23F00303C5F83B +:10300000003ED5F80438954823F00103C5F804388C +:10301000FEF708FD370505D59048FFF7BDFC8F4842 +:10302000FEF7EEFCB0040CD5D5F8083813F0060F07 +:10303000EB6823F470530CBF43F4105343F4A053D4 +:10304000EB6031071BD56368DB681BB9AB6923F004 +:103050000803AB612378052B0CD1D5F8003E9A0705 +:1030600005D0D5F8003E23F00303C5F8003E7B48A9 +:10307000FEF7D8FC6368DB680BB178489847F30229 +:1030800000F18980B70227D5D4F86C9000274FF063 +:10309000010ADFF8C8B109EB4712D2F8003B03F48C +:1030A0004023B3F5802F11D1D2F8003B002B0DDA6D +:1030B00062890AFA07F322EA0303638104EB8703B8 +:1030C000DB68DB6813B13946584698470137236FF0 +:1030D000FFB29B689F42DED9F00617D5E76E3A6AC9 +:1030E000C2F30A1002F00F0302F4F012B2F5802FBF +:1030F00000F09880B2F5402F08D104EB8303002242 +:1031000007F58057DB681B6A90427ED13303D5F800 +:1031100018481DD5E70302D50020FFF743FEA5039D +:1031200002D50120FFF73EFE600302D50220FFF723 +:1031300039FE210302D50320FFF734FEE20202D557 +:103140000420FFF72FFEA30202D50520FFF72AFE79 +:1031500077037FF545AFE60702D50020FFF7B6FEFF +:10316000A50702D50120FFF7B1FE600702D50220B6 +:10317000FFF7ACFE210702D50320FFF7A7FEE2060A +:1031800002D50420FFF7A2FEA3067FF529AF052094 +:10319000FFF79CFE24E7E36E00274FF00109DFF8FC +:1031A000BCA00193236F5FFA87FB9B689B453FF6AA +:1031B00069AF019B03EB4B13D3F8001901F44021D5 +:1031C000B1F5802F1FD1D3F8001900291BDAD3F8ED +:1031D000001941F09041C3F80019D3F800190029F3 +:1031E000FBDB5946E06EFFF703FC218909FA0BF37C +:1031F00021EA0303238104EB8B03DB689B6813B193 +:103200005946504698470137CCE7910701D1D7F886 +:103210000080072A02F101029CBF03F8018B4FEAEC +:10322000182871E7023307F5805704EB83025268D0 +:10323000D2F818C0DCF80820DCE9001CA1EB0C0C6B +:10324000002188420CD104EB830463689B699A686F +:1032500002449A605A6802445A6057E708390220CB +:1032600011F0030F01D1D7F800808C4501F1010165 +:1032700084BF02F8018B4FEA1828E2E7C36E03EB24 +:103280004111D1F8003B43F40013C1F8003B7047F3 +:10329000C36E03EB4111D1F8003943F40013C1F8B8 +:1032A00000397047C36E03EB4111D1F8003B23F4A2 +:1032B0000013C1F8003B7047C36E03EB4111D1F816 +:1032C000003923F40013C1F800397047090100F1F7 +:1032D0006043012203F56143C9B283F8001300F093 +:1032E0001F039A4043099B0003F1604303F56143C8 +:1032F000C3F880211A60704730B50433039C017213 +:10330000002104FB0325C160C0E90653049B03634D +:10331000059BC0E90000C0E90422C0E90842C0E9F9 +:103320000A11436330BD00000022416AC260C0E957 +:103330000411C0E90A226FF00101FEF77DBE000012 +:10334000D0E90432934201D1C2680AB9181D70470E +:1033500000207047036919600021C2680132C26011 +:10336000C269134482699342036124BF436A0361C3 +:10337000FEF756BE38B504460D46E3683BB16269B8 +:103380000020131D1268A3621344E36207E0237A4E +:1033900033B929462046FEF733FE0028EDDA38BD62 +:1033A0006FF00100FBE70000C368C269013BC36026 +:1033B0004369134482699342436124BF436A436172 +:1033C00000238362036B03B11847704770B5302345 +:1033D000044683F31188866A3EB9FFF7CBFF0546A2 +:1033E00018B186F31188284670BDA36AE26A13F803 +:1033F000015B9342A36202D32046FFF7D5FF00236F +:1034000083F31188EFE700002DE9F84F04460E46DC +:10341000174698464FF0300989F311880025AA46CF +:10342000D4F828B0BBF1000F09D141462046FFF780 +:10343000A1FF20B18BF311882846BDE8F88FD4E9AD +:103440000A12A7EB050B521A934528BF9346BBF10E +:10345000400F1BD9334601F1400251F8040B914251 +:1034600043F8040BF9D1A36A403640354033A362D8 +:10347000D4E90A239A4202D32046FFF795FF8AF344 +:103480001188BD42D8D289F31188C9E730465A461F +:10349000FDF758FCA36A5E445D445B44A362E7E722 +:1034A00010B5029C0433017203FB0421C460C0E91F +:1034B00006130023C0E90A33039B0363049BC0E99E +:1034C0000000C0E90422C0E90842436310BD0000C7 +:1034D000026A6FF00101C260426AC0E90422002260 +:1034E000C0E90A22FEF7A8BDD0E904239A4201D11F +:1034F000C26822B9184650F8043B0B60704700239D +:103500001846FAE7C3680021C2690133C360436902 +:10351000134482699342436124BF436A4361FEF7C7 +:103520007FBD000038B504460D46E3683BB1236912 +:1035300000201A1DA262E2691344E36207E0237AC5 +:1035400033B929462046FEF75BFD0028EDDA38BD89 +:103550006FF00100FBE7000003691960C268013ADF +:10356000C260C269134482699342036124BF436A03 +:10357000036100238362036B03B1184770470000A7 +:1035800070B530230D460446114683F31188866AD0 +:103590002EB9FFF7C7FF10B186F3118870BDA36A7B +:1035A0001D70A36AE26A01339342A36204D3E16906 +:1035B00020460439FFF7D0FF002080F31188EDE7A3 +:1035C0002DE9F84F04460D46904699464FF0300AD3 +:1035D0008AF311880026B346A76A4FB949462046A8 +:1035E000FFF7A0FF20B187F311883046BDE8F88FC0 +:1035F000D4E90A073A1AA8EB0607974228BF1746EC +:10360000402F1BD905F1400355F8042B9D4240F88B +:10361000042BF9D1A36A40364033A362D4E90A23CC +:103620009A4204D3E16920460439FFF795FF8BF3F2 +:1036300011884645D9D28AF31188CDE729463A4602 +:10364000FDF780FBA36A3D443E443B44A362E5E7AB +:10365000D0E904239A4217D1C3689BB1836A8BB126 +:10366000043B9B1A0ED01360C368013BC360C3695F +:103670001A4483699A42026124BF436A03610023AA +:1036800083620123184670470023FBE700F040B92E +:103690004FF08043586A70474FF0804300225863D0 +:1036A0001A610222DA6070474FF080430022DA602C +:1036B000704700004FF0804358637047FEE70000FA +:1036C00070B51B4B0025044686B058600E468562D7 +:1036D000016300F0CBF804F11003A560E562C4E9D2 +:1036E00004334FF0FF33C4E90044C4E90635FFF763 +:1036F000CFFF2B46024604F134012046C4E90823DB +:1037000080230C4A2565FEF731FC01230A4AE0605C +:1037100000920375684672680192B268CDE902238F +:10372000064BCDE90435FEF749FC06B070BD00BF7D +:10373000902D0220AC3F0008B13F0008BD360008C4 +:10374000024AD36A1843D062704700BF282B022078 +:103750004B6843608B688360CB68C3600B694361CF +:103760004B6903628B6943620B680360704700001A +:1037700008B52C4B40F2FF712B481A690A431A61B5 +:103780001A6922F4FF6222F007021A611A691A6BA1 +:103790000A431A631A6D0A431A65244A1B6D1146BF +:1037A000FFF7D6FF00F5806002F11C01FFF7D0FFA4 +:1037B00000F5806002F13801FFF7CAFF00F5806074 +:1037C00002F15401FFF7C4FF00F5806002F17001BF +:1037D000FFF7BEFF00F5806002F18C01FFF7B8FF34 +:1037E00000F5806002F1A801FFF7B2FF00F58060EC +:1037F00002F1C401FFF7ACFF00F5806002F1E001C7 +:10380000FFF7A6FF00F5806002F1FC01FFF7A0FFC3 +:1038100002F58C7100F58060FFF79AFFBDE8084063 +:1038200000F0ECB80038024000000240B83F000849 +:1038300008B500F081FAFEF777FBFFF70BF8BDE85B +:103840000840FEF7E5BD000070470000EFF3098374 +:10385000054968334A6B22F001024A6383F3098801 +:10386000002383F31188704700EF00E0302080F3DD +:10387000118862B60D4B0E4AD96821F4E061090443 +:10388000090C0A430B49DA60D3F8FC2042F080723D +:10389000C3F8FC20084AC2F8B01F116841F00101CA +:1038A00011602022DA7783F82200704700ED00E0F3 +:1038B0000003FA0555CEACC5001000E0302310B56A +:1038C00083F311880E4B5B6813F4006314D0F1EEA0 +:1038D000103AEFF309844FF08073683CE361094BC1 +:1038E000DB6B236684F30988FEF7FEFA10B1064B02 +:1038F000A36110BD054BFBE783F31188F9E700BF17 +:1039000000ED00E000EF00E04F0300085203000864 +:103910000F4B1A6C42F001021A641A6E42F0010257 +:103920001A660C4A1B6E936843F0010393604FF0D4 +:1039300080436B229A624FF0FF32DA6200229A6172 +:103940005A63DA605A6001225A611A60704700BFF8 +:1039500000380240002004E04FF0804208B51169B1 +:10396000D3680B40D9B29B076FEA0101116107D5FB +:10397000302383F31188FEF7EDFA002383F31188D7 +:1039800008BD00001B4B4FF0FF3000211A696FEAA1 +:1039900042526FEA52521A611A69C2F30A021A615C +:1039A0001A695A6958615A6959615A691A6A62F002 +:1039B00080521A621A6A02F080521A621A6A5A6AAD +:1039C00058625A6A59625A6A0B4A106840F4807009 +:1039D0001060186F00F44070B0F5007F03D04FF412 +:1039E000803018671967536823F40073536000F040 +:1039F00073B900BF0038024000700040364B4FF4EE +:103A00004041364A1A64364A11601A6842F001028F +:103A10001A601A689207FCD59A6822F003029A602D +:103A20002D4B9A6812F00C02FBD1196801F0F901D4 +:103A300019609A601A6842F480321A601A6890031A +:103A4000FCD55A6F42F001025A67234B5A6F910717 +:103A5000FCD5244A5A601A6842F080721A60204BE2 +:103A60005A685204FCD51A6842F480321A605A68C7 +:103A7000D003FCD51A6842F400321A60184A536821 +:103A80009903FCD5144B1A689201FCD5164A9A602A +:103A900040F20112C3F88C200022C3F8902040F2BB +:103AA0000733124A1360136803F00F03072BFAD190 +:103AB000094B9A6842F002029A609A6802F00C027E +:103AC000082AFAD15A6C42F480425A645A6E42F47F +:103AD00080425A665B6E7047003802400004001056 +:103AE00000700040186C400900948838003C024087 +:103AF000074A08B5536903F00103536123B1054A2E +:103B000013680BB150689847BDE80840FFF7D6BE70 +:103B1000003C014098390220074A08B5536903F078 +:103B20000203536123B1054A93680BB1D0689847EB +:103B3000BDE80840FFF7C2BE003C014098390220B2 +:103B4000074A08B5536903F00403536123B1054ADA +:103B500013690BB150699847BDE80840FFF7AEBE46 +:103B6000003C014098390220074A08B5536903F028 +:103B70000803536123B1054A93690BB1D069984793 +:103B8000BDE80840FFF79ABE003C0140983902208A +:103B9000074A08B5536903F01003536123B1054A7E +:103BA000136A0BB1506A9847BDE80840FFF786BE1C +:103BB000003C014098390220164B10B55C6904F4B2 +:103BC00078725A61A30604D5134A936A0BB1D06A7E +:103BD0009847600604D5104A136B0BB1506B984799 +:103BE000210604D50C4A936B0BB1D06B9847E205C4 +:103BF00004D5094A136C0BB1506C9847A30504D542 +:103C0000054A936C0BB1D06C9847BDE81040FFF7A4 +:103C100055BE00BF003C014098390220194B10B539 +:103C20005C6904F47C425A61620504D5164A136D3E +:103C30000BB1506D9847230504D5134A936D0BB112 +:103C4000D06D9847E00404D50F4A136E0BB1506E47 +:103C50009847A10404D50C4A936E0BB1D06E9847D7 +:103C6000620404D5084A136F0BB1506F98472304C0 +:103C700004D5054A936F0BB1D06F9847BDE810404B +:103C8000FFF71CBE003C01409839022008B50348EC +:103C9000FDF742FABDE80840FFF710BEE02302201E +:103CA00008B50348FDF738FABDE80840FFF706BE3F +:103CB0004C24022008B50348FDF72EFABDE8084061 +:103CC000FFF7FCBDB824022008B5FFF745FEBDE8AC +:103CD0000840FFF7F3BD0000062108B50846FFF7CE +:103CE000F5FA06210720FFF7F1FA06210820FFF771 +:103CF000EDFA06210920FFF7E9FA06210A20FFF76D +:103D0000E5FA06211720FFF7E1FA06212820FFF740 +:103D1000DDFA07211C20FFF7D9FA0C212620FFF736 +:103D2000D5FA0C212720FFF7D1FA0C215220BDE84B +:103D30000840FFF7CBBA000008B5FFF723FE00F0FC +:103D40000DF8FDF701FCFDF7D1FDFDF7A9FCFFF72C +:103D50007BFDBDE80840FFF799BC00000023054A41 +:103D600019460133102BC2E9001102F10802F8D103 +:103D7000704700BF98390220034611F8012B03F861 +:103D8000012B002AF9D1704753544D3332463F3F3F +:103D90003F3F3F3F0053544D333246375B347C3511 +:103DA0005D780053544D333246375B367C375D784F +:103DB000000000000096000000000000000000006D +:103DC00000000000000000000000000000000000F3 +:103DD00009150008F5140008311500081D15000824 +:103DE000291500081515000801150008ED14000834 +:103DF0003D150008000000001D1600080916000807 +:103E000045160008311600083D160008291600085E +:103E100015160008011600085116000800000000E1 +:103E2000010000000000000063300000283E000890 +:103E3000802B0220902D02204865782F50726F66EB +:103E400069434E430025424F415244252D424C00C8 +:103E50002553455249414C25000000000200000056 +:103E60000000000039180008A518000840004000B4 +:103E70004036022050360220020000000000000000 +:103E80000300000000000000E91800080000000026 +:103E90001000000060360220000000000100000059 +:103EA000000000000839022001010200AD230008D3 +:103EB000BD220008592300083D23000843000000EC +:103EC000C43E000809024300020100C03209040098 +:103ED0000001020201000524001001052401000177 +:103EE000042402020524060001070582030800FFDE +:103EF00009040100020A0000000705010240000059 +:103F0000070581024000000012000000103F000879 +:103F10001201100102000040AE2D02100002010249 +:103F2000030100000403090425424F4152442500C7 +:103F30004375626559656C6C6F770030313233348C +:103F40003536373839414243444546000080000049 +:103F500000800000008000000080000000000200DF +:103F60000000040000000400000004000000040041 +:103F70000000040000000400000004000000000035 +:103F80003D1A0008F51C0008A11D00084000400073 +:103F9000803902208039022001000000903902207F +:103FA0008000000040010000050000006D61696EA6 +:103FB0000069646C650000000000802A00000000B9 +:103FC000AAAAAAAA00000024FFFF00000000000027 +:103FD00000A00A000001000000000000AAAAAAAA8E +:103FE00000000000FFFF00000000000000000000D3 +:103FF0001400005400000000AAAAAAAA1400005449 +:10400000FFFF0000000000000000000080699A012E +:1040100000000000AAAA8AAA40565502FFFF00002D +:10402000007070077770000000810200000000003F +:10403000AAAAAAAA00410100FFFF00000000008018 +:10404000080000000000000000000000AAAAAAAAC0 +:1040500000000000FFFF0000000000000000000062 +:104060000000000000000000AAAAAAAA00000000A8 +:10407000FFFF000000000000000000000000000042 +:1040800000000000AAAAAAAA00000000FFFF00008A +:104090000000000000000000000000000000000020 +:1040A000AAAAAAAA00000000FFFF0000000000006A +:1040B000000000000000000000000000AAAAAAAA58 +:1040C00000000000FFFF00000000000000000000F2 +:1040D0000000000000000000AAAA0000000000008C +:1040E000FF000000000000000000000000000000D1 +:1040F000780000000000000000801E0000000000AA +:10410000FF000000982D0220E02302204C24022012 +:10411000B824022000000000883D00084904000087 +:10412000953D000851040000A33D000800960000E2 +:1041300000000800960000000008000004000000D5 +:10414000243F000800000000000000000000000004 +:0C41500000000000000000000000000063 :00000001FF diff --git a/Tools/bootloaders/FlywooH743Pro_bl.bin b/Tools/bootloaders/FlywooH743Pro_bl.bin new file mode 100644 index 0000000000..576d2e3d21 Binary files /dev/null and b/Tools/bootloaders/FlywooH743Pro_bl.bin differ diff --git a/Tools/bootloaders/FlywooH743Pro_bl.hex b/Tools/bootloaders/FlywooH743Pro_bl.hex new file mode 100644 index 0000000000..905a8eed7f --- /dev/null +++ b/Tools/bootloaders/FlywooH743Pro_bl.hex @@ -0,0 +1,1167 @@ +:020000040800F2 +:1000000000060020E1020008E3020008E302000805 +:10001000E3020008E3020008E3020008E30200082C +:10002000E3020008E3020008E3020008352A0008A2 +:10003000E3020008E3020008E3020008E30200080C +:10004000E3020008E3020008E3020008E3020008FC +:10005000E3020008E302000895410008C1410008DE +:10006000ED410008194200084542000879100008D7 +:10007000A1100008CD100008F91000082511000893 +:100080004D11000879110008E3020008E30200089E +:10009000E3020008E3020008E302000871420008DE +:1000A000E3020008E3020008E3020008E30200089C +:1000B000E3020008E3020008E3020008E30200088C +:1000C000E3020008E3020008E3020008E30200087C +:1000D000E3020008E3020008E3020008E30200086C +:1000E000D5420008E3020008E3020008E30200082A +:1000F000E3020008E3020008E3020008A51100087B +:10010000E3020008E302000849430008E302000894 +:10011000E3020008E3020008E3020008E30200082B +:10012000D1110008F9110008251200085112000829 +:100130007D120008E3020008E3020008E302000861 +:10014000E3020008E3020008E3020008E3020008FB +:10015000A5120008D1120008FD120008E3020008F1 +:10016000E3020008E3020008E3020008E3020008DB +:10017000E302000821360008E3020008E302000859 +:10018000E3020008E3020008E3020008E3020008BB +:10019000E3020008E3020008E3020008E3020008AB +:1001A000E3020008E3020008E3020008E30200089B +:1001B000E3020008E3020008E3020008E30200088B +:1001C000E3020008E3020008E3020008E30200087B +:1001D000E30200080D360008E3020008E30200080D +:1001E000E3020008E3020008E3020008E30200085B +:1001F000E3020008E3020008E3020008E30200084B +:10020000E3020008E3020008E3020008E30200083A +:10021000E3020008E3020008E3020008E30200082A +:10022000E3020008E3020008E3020008E30200081A +:10023000E3020008E3020008E3020008E30200080A +:10024000E3020008E3020008E3020008E3020008FA +:10025000E3020008E3020008E3020008E3020008EA +:10026000E3020008E3020008E3020008E3020008DA +:10027000E3020008E3020008E3020008E3020008CA +:10028000E3020008E3020008E3020008E3020008BA +:10029000E3020008E3020008E3020008E3020008AA +:1002A000E3020008E3020008E3020008E30200089A +:1002B000E3020008E3020008E3020008E30200088A +:1002C000E3020008E3020008E3020008E30200087A +:1002D000E3020008E3020008E3020008E30200086A +:1002E00002E000F000F8FEE772B6374880F30888B5 +:1002F000364880F3098836483649086040F20000E5 +:10030000CCF200004EF63471CEF200010860BFF36B +:100310004F8FBFF36F8F40F20000C0F2F0004EF637 +:100320008851CEF200010860BFF34F8FBFF36F8F8B +:100330004FF00000E1EE100A4EF63C71CEF20001E3 +:100340000860062080F31488BFF36F8F02F0D4FB9F +:1003500003F0DAFC4FF055301F491B4A91423CBF75 +:1003600041F8040BFAE71D49184A91423CBF41F895 +:10037000040BFAE71A491B4A1B4B9A423EBF51F83D +:10038000040B42F8040BF8E700201849184A914280 +:100390003CBF41F8040BFAE702F0ECFB03F038FD38 +:1003A000144C154DAC4203DA54F8041B8847F9E7A6 +:1003B00000F042F8114C124DAC4203DA54F8041B21 +:1003C0008847F9E702F0D4BB000600200022002095 +:1003D0000000000808ED00E00000002000060020FA +:1003E00070480008002200205C22002060220020CB +:1003F00084440020E0020008E0020008E002000857 +:10040000E00200082DE9F04F2DED108AC1F80CD064 +:10041000D0F80CD0BDEC108ABDE8F08F002383F338 +:1004200011882846A047002001F0CCFDFEE701F02E +:1004300057FD00DFFEE7000038B500F02FFC00F0AC +:10044000A9FD02F0B7FA054602F0EAFA0446C0B97F +:100450000E4B9D4217D001339D4241F2883512BFA9 +:10046000044600250124002002F0AEFA0CB100F091 +:1004700075F800F063FD284600F01EF900F06EF8F4 +:10048000F9E70025EFE70546EDE700BF010007B0FB +:1004900008B500F0D5FBA0F120035842584108BD33 +:1004A00007B541F21203022101A8ADF8043000F0B3 +:1004B000E5FB03B05DF804FB38B5302383F3118806 +:1004C000174803680BB101F049FE0023154A4FF4A9 +:1004D0007A71134801F038FE002383F31188124C1F +:1004E000236813B12368013B2360636813B1636819 +:1004F000013B63600D4D2B7833B963687BB90220F3 +:1005000000F086FC322363602B78032B07D16368ED +:100510002BB9022000F07CFC4FF47A73636038BD85 +:1005200060220020B90400088023002078220020E7 +:10053000084B187003280CD8DFE800F00805020803 +:10054000022000F05BBC022000F050BC024B0022F5 +:100550005A6070477822002080230020F8B5504B65 +:10056000504A1C461968013100F0998004339342C7 +:10057000F8D162684C4B9A4240F291804B4B9B6899 +:1005800003F1006303F5C0239A4280F088800020C5 +:1005900000F09EFB0220FFF7CBFF454B0021D3F874 +:1005A000E820C3F8E810D3F81021C3F81011D3F8ED +:1005B0001021D3F8EC20C3F8EC10D3F81421C3F8C1 +:1005C0001411D3F81421D3F8F020C3F8F010D3F8A5 +:1005D0001821C3F81811D3F81821D3F8802042F05D +:1005E0000062C3F88020D3F8802022F00062C3F8B4 +:1005F0008020D3F88020D3F8802042F00072C3F826 +:100600008020D3F8802022F00072C3F88020D3F835 +:10061000803072B64FF0E023C3F8084DD4E90004EF +:10062000BFF34F8FBFF36F8F224AC2F88410BFF31E +:100630004F8F536923F480335361BFF34F8FD2F848 +:10064000803043F6E076C3F3C905C3F34E335B0154 +:1006500003EA060C29464CEA81770139C2F8747224 +:10066000F9D2203B13F1200FF2D1BFF34F8FBFF32C +:100670006F8FBFF34F8FBFF36F8F536923F4003336 +:1006800053610023C2F85032BFF34F8FBFF36F8F17 +:10069000302383F31188854680F308882047F8BD0E +:1006A0000000060820000608FFFF050800220020C1 +:1006B0000044025800ED00E02DE9F04F93B0B44B38 +:1006C0002022FF2100900AA89D6800F0E1FBB14ABA +:1006D0001378A3B90121B04811700360302383F36C +:1006E000118803680BB101F039FD0023AB4A4FF4C8 +:1006F0007A71A94801F028FD002383F31188009B3B +:1007000013B1A74B009A1A60A64A1378032B03D0A3 +:1007100000231370A24A53604FF0000A009CD34696 +:100720005646D146012000F069FB24B19C4B1B6862 +:10073000002B00F02682002000F082FA0390039B39 +:10074000002BF2DB012000F051FB039B213B1F2B10 +:10075000E8D801A252F823F0D907000801080008E0 +:100760009508000825070008250700082507000848 +:1007700027090008F70A0008110A0008730A000890 +:100780009B0A0008C10A000825070008D30A0008D0 +:1007900025070008450B0008790800082507000810 +:1007A000890B0008E50700087908000825070008FC +:1007B000730A000825070008250700082507000818 +:1007C0002507000825070008250700082507000859 +:1007D00025070008950800080220FFF759FE0028A9 +:1007E00040F0F981009B022105A8BAF1000F08BF73 +:1007F0001C4641F21233ADF8143000F03FFA91E795 +:100800004FF47A7000F01CFA071EEBDB0220FFF7B2 +:100810003FFE0028E6D0013F052F00F2DE81DFE831 +:1008200007F0030A0D1013360523042105A80593CC +:1008300000F024FA17E004215548F9E704215A484A +:10084000F6E704215948F3E74FF01C08404608F149 +:10085000040800F03FFA0421059005A800F00EFA04 +:10086000B8F12C0FF2D101204FF0000900FA07F780 +:1008700047EA0B0B5FFA8BFB00F056FB26B10BF03F +:100880000B030B2B08BF0024FFF70AFE4AE70421E5 +:100890004748CDE7002EA5D00BF00B030B2BA1D1C1 +:1008A0000220FFF7F5FD074600289BD00120002617 +:1008B00000F00EFA0220FFF73BFE1FFA86F84046D2 +:1008C00000F016FA0446B0B1039940460136A1F192 +:1008D00040025142514100F01BFA0028EDD1BA46C6 +:1008E000044641F21213022105A83E46ADF8143029 +:1008F00000F0C4F916E725460120FFF719FE244B46 +:100900009B68AB4207D9284600F0E4F9013040F07B +:1009100067810435F3E70025224BBA463E461D7039 +:100920001F4B5D60A8E7002E3FF45CAF0BF00B039C +:100930000B2B7FF457AF0220FFF7FAFD322000F0B7 +:100940007FF9B0F10008FFF64DAF18F003077FF410 +:1009500049AF0F4A08EB0503926893423FF642AF56 +:10096000B8F5807F3FF73EAF124BB845019323DDCA +:100970004FF47A7000F064F90390039A002AFFF6AE +:1009800031AF039A0137019B03F8012BEDE700BF5C +:10099000002200207C23002060220020B9040008EF +:1009A000802300207822002004220020082200203A +:1009B0000C2200207C220020C820FFF769FD07469A +:1009C00000283FF40FAF1F2D11D8C5F120020AAB4C +:1009D00025F0030084494245184428BF424601924D +:1009E00000F030FA019AFF217F4800F051FA4FEAF7 +:1009F000A803C8F387027C492846019300F050FA07 +:100A0000064600283FF46DAF019B05EB830533E7F5 +:100A10000220FFF73DFD00283FF4E4AE00F096F918 +:100A200000283FF4DFAE0027B846704B9B68BB42FE +:100A300018D91F2F11D80A9B01330ED027F00303BA +:100A400012AA134453F8203C05934046042205A9FA +:100A5000043700F0FBFA8046E7E7384600F03AF941 +:100A60000590F2E7CDF81480042105A800F006F9FE +:100A700002E70023642104A8049300F0F5F800289D +:100A80007FF4B0AE0220FFF703FD00283FF4AAAECA +:100A9000049800F051F90590E6E70023642104A8CA +:100AA000049300F0E1F800287FF49CAE0220FFF7E9 +:100AB000EFFC00283FF496AE049800F03FF9EAE717 +:100AC0000220FFF7E5FC00283FF48CAE00F04EF961 +:100AD000E1E70220FFF7DCFC00283FF483AE05A924 +:100AE000142000F049F907460421049004A800F0FE +:100AF000C5F83946B9E7322000F0A2F8071EFFF624 +:100B000071AEBB077FF46EAE384A07EB09039268FB +:100B100093423FF667AE0220FFF7BAFC00283FF48D +:100B200061AE27F003074F44B9453FF4A5AE4846F0 +:100B300009F1040900F0CEF80421059005A800F0A1 +:100B40009DF8F1E74FF47A70FFF7A2FC00283FF41C +:100B500049AE00F0FBF8002844D00A9B01330BD0CB +:100B600008220AA9002000F09BF900283AD0202290 +:100B7000FF210AA800F08CF9FFF792FC1C4801F055 +:100B800027FA13B0BDE8F08F002E3FF42BAE0BF028 +:100B90000B030B2B7FF426AE0023642105A80593DD +:100BA00000F062F8074600287FF41CAE0220FFF731 +:100BB0006FFC804600283FF415AEFFF771FC41F250 +:100BC000883001F005FA059800F0E2F946463C4607 +:100BD00000F0AAF9A6E506464EE64FF0000901E648 +:100BE000BA467EE637467CE67C22002000220020C2 +:100BF000A08601000F4B70B51B780C460133DBB2A9 +:100C0000012B11D80C4D4FF47A732968A2FB0332E3 +:100C100022460E6A01462846B047844204D1074B5B +:100C2000002201201A7070BD4FF4FA7001F0D0F963 +:100C30000020F8E710220020B0260020B423002076 +:100C4000002307B5024601210DF107008DF807309A +:100C5000FFF7D0FF20B19DF8070003B05DF804FB5B +:100C60004FF0FF30F9E700000A46042108B5FFF70E +:100C7000C1FF80F00100C0B2404208BD30B4054C55 +:100C80000A46014623682046DD69034BAC4630BC6A +:100C9000604700BFB0260020A086010070B50A4E54 +:100CA00000240A4D01F0B0FC30802868338883426C +:100CB00008D901F0A5FC2B6804440133B4F5C02F1A +:100CC0002B60F2D370BD00BFB62300208823002024 +:100CD00001F068BD00F1006000F5C02000687047B9 +:100CE00000F10060920000F5C02001F0E9BC0000B6 +:100CF000054B1A68054B1B889B1A834202D9104486 +:100D000001F07EBC0020704788230020B62300201D +:100D100038B50446074D29B128682044BDE838405D +:100D200001F086BC2868204401F070FC0028F3D054 +:100D300038BD00BF882300200020704700F1FF501D +:100D400000F58F10D0F8000870470000064991F8B0 +:100D5000243033B100230822086A81F82430FFF7D9 +:100D6000BFBF0120704700BF8C230020014B1868D3 +:100D7000704700BF0010005C194B01380322084483 +:100D800070B51D68174BC5F30B042D0C1E88A642C9 +:100D90000BD15C680A46013C824213460FD214F91B +:100DA000016F4EB102F8016BF6E7013A03F1080357 +:100DB000ECD181420B4602D22C2203F8012B0424F1 +:100DC000094A1688AE4204D1984284BF967803F847 +:100DD000016B013C02F10402F3D1581A70BD00BF4F +:100DE0000010005C1422002040440008022802D1B8 +:100DF000014B08229A61704700100258022803D163 +:100E0000024B4FF400229A61704700BF0010025855 +:100E1000022804D1024A536983F0080353617047E2 +:100E20000010025870B504464FF47A764CB1412C4C +:100E3000254628BF412506FB05F0641B01F0C8F8D4 +:100E4000F4E770BD002310B5934203D0CC5CC454CA +:100E50000133F9E710BD0000013810B510F9013F6A +:100E60003BB191F900409C4203D11AB10131013AE2 +:100E7000F4E71AB191F90020981A10BD1046FCE76A +:100E800003460246D01A12F9011B0029FAD1704715 +:100E900002440346934202D003F8011BFAE770476D +:100EA0002DE9F8431F4D14460746884695F824203F +:100EB00052BBDFF870909CB395F824302BB92022F8 +:100EC000FF2148462F62FFF7E3FF95F824004146D3 +:100ED000C0F1080205EB8000A24228BF2246D6B22C +:100EE0009200FFF7AFFF95F82430A41B17441E446F +:100EF0009044E4B2F6B2082E85F82460DBD1FFF707 +:100F000025FF0028D7D108E02B6A03EB8203834238 +:100F1000CFD0FFF71BFF0028CBD10020BDE8F8831E +:100F20000120FBE78C230020024B1A78024B1A7039 +:100F3000704700BFB42300201022002010B5114CD0 +:100F4000114800F075FB21460F4800F09DFB246816 +:100F50004FF47A70D4F89020D2F8043843F00203AA +:100F6000C2F80438FFF75EFF0849204600F09AFCFB +:100F7000D4F89020D2F8043823F00203C2F80438E1 +:100F800010BD00BFFC450008B02600200446000844 +:100F900070470000F8B571B6002301201A461946C3 +:100FA00000F054FA0446802001F09AFC002845D055 +:100FB0000025234A80274FF4D06C3D26136923BBBC +:100FC000D2F810310BBB236805F1006199602368EA +:100FD000D86023685F602368C3F800C021680B688D +:100FE00043F001030B6021680B6823F01E030B60C4 +:100FF00021680B68DB07FCD4237B8035616806FA27 +:1010000003F3B5F5001F0B60D8D1204600F05EFA5F +:10101000B5F5001F11D000240A4E0B4D012001F040 +:10102000C1FB3388A34205D928682044013401F06C +:10103000FFFAF6E7002001F0B5FB61B6F8BD00BF8E +:1010400000200052B62300208823002030B50A4437 +:10105000084D91420DD011F8013B5840082340F350 +:101060000004013B2C4013F0FF0384EA5000F6D14A +:10107000EFE730BD2083B8ED08B5074B074A196884 +:1010800001F03D01996053680BB190689847BDE845 +:10109000084001F007BD00BF00000240B823002057 +:1010A00008B5084B1968890901F03D018A019A6069 +:1010B000054AD3680BB110699847BDE8084001F0B4 +:1010C000F1BC00BF00000240B823002008B5084B67 +:1010D0001968090C01F03D010A049A60054A536938 +:1010E0000BB190699847BDE8084001F0DBBC00BF38 +:1010F00000000240B823002008B5084B1968890D8C +:1011000001F03D018A059A60054AD3690BB1106A66 +:101110009847BDE8084001F0C5BC00BF0000024090 +:10112000B823002008B5074B074A596801F03D0174 +:10113000D960536A0BB1906A9847BDE8084001F046 +:10114000B1BC00BF00000240B823002008B5084B26 +:101150005968890901F03D018A01DA60054AD36ABC +:101160000BB1106B9847BDE8084001F09BBC00BF75 +:1011700000000240B823002008B5084B5968090C4C +:1011800001F03D010A04DA60054A536B0BB1906B24 +:101190009847BDE8084001F085BC00BF0000024050 +:1011A000B823002008B5084B5968890D01F03D01AE +:1011B0008A05DA60054AD36B0BB1106C9847BDE81D +:1011C000084001F06FBC00BF00000240B8230020BF +:1011D00008B5074B074A196801F03D019960536C47 +:1011E0000BB1906C9847BDE8084001F05BBC00BFB4 +:1011F00000040240B823002008B5084B196889098B +:1012000001F03D018A019A60054AD36C0BB1106D63 +:101210009847BDE8084001F045BC00BF000402400B +:10122000B823002008B5084B1968090C01F03D01EE +:101230000A049A60054A536D0BB1906D9847BDE85A +:10124000084001F02FBC00BF00040240B82300207A +:1012500008B5084B1968890D01F03D018A059A60AF +:10126000054AD36D0BB1106E9847BDE8084001F0F8 +:1012700019BC00BF00040240B823002008B5074B8A +:10128000074A596801F03D01D960536E0BB1906E69 +:101290009847BDE8084001F005BC00BF00040240CB +:1012A000B823002008B5084B5968890901F03D01B1 +:1012B0008A01DA60054AD36E0BB1106F9847BDE81A +:1012C000084001F0EFBB00BF00040240B82300203B +:1012D00008B5084B5968090C01F03D010A04DA60B1 +:1012E000054A536F0BB1906F9847BDE8084001F075 +:1012F000D9BB00BF00040240B823002008B5084B4A +:101300005968890D01F03D018A05DA60054AD36FFD +:1013100013B1D2F880009847BDE8084001F0C2BB85 +:1013200000040240B823002000230C4910B51A46DF +:101330000B4C0B6054F82300026001EB43000433B4 +:101340004260402BF6D1074A4FF0FF339360D360E1 +:10135000C2F80834C2F80C3410BD00BFB823002016 +:1013600050440008000002400F28F8B510D910289A +:1013700010D0112811D0122808D10F240720DFF82F +:10138000C8E00126DEF80050A04208D9002653E04C +:101390000446F4E70F240020F1E70724FBE706FAF0 +:1013A00000F73D424AD1264C4FEA001C3D4304EB76 +:1013B00000160EEBC000CEF80050C0E90123FBB2CE +:1013C00073B12048D0F8D83043F00103C0F8D830CA +:1013D000D0F8003143F00103C0F80031D0F80031FB +:1013E00017F47F4F0ED01748D0F8D83043F00203DF +:1013F000C0F8D830D0F8003143F00203C0F8003113 +:10140000D0F8003154F80C00036823F01F03036088 +:10141000056815F00105FBD104EB0C033D2493F89E +:101420000CC05F6804FA0CF43C6021240560446140 +:1014300012B1987B00F054F83046F8BD0130A3E7B4 +:101440005044000800440258B823002010B530244E +:1014500084F31188FFF788FF002383F3118810BD00 +:1014600010B50446807B00F051F801231549627BDA +:1014700003FA02F20B6823EA0203DAB20B6072B9D4 +:10148000114AD2F8D81021F00101C2F8D810D2F8D0 +:10149000001121F00101C2F80011D2F8002113F46B +:1014A0007F4F0ED1084BD3F8D82022F00202C3F8A8 +:1014B000D820D3F8002122F00202C3F80021D3F88B +:1014C000003110BDB82300200044025808B5302375 +:1014D00083F31188FFF7C4FF002383F3118808BD4D +:1014E000090100F16043012203F56143C9B283F8A9 +:1014F000001300F01F039A4043099B0003F160436F +:1015000003F56143C3F880211A60704700F01F03A0 +:1015100001229A40430900F160409B0000F56140C0 +:1015200003F1604303F56143C3F88020C3F88021D1 +:10153000002380F80033704702684368114301605C +:1015400003B118477047000013B5406B00F5805495 +:10155000D4F8A4381A681178042914D1017C02291E +:1015600011D11979012312898B4013420BD101A9A2 +:101570004C3002F087F9D4F8A4480246019B217947 +:10158000206800F0DFF902B010BD0000143002F056 +:1015900009B900004FF0FF33143002F003B9000026 +:1015A0004C3002F0DBB900004FF0FF334C3002F05A +:1015B000D5B90000143002F0D7B800004FF0FF3169 +:1015C000143002F0D1B800004C3002F0A7B900008E +:1015D0004FF0FF324C3002F0A1B9000000207047FC +:1015E00010B500F58054D4F8A4381A68117804298D +:1015F00017D1017C022914D15979012352898B40DA +:1016000013420ED1143002F069F8024648B1D4F802 +:10161000A4484FF4407361792068BDE8104000F0A1 +:101620007FB910BD406BFFF7DBBF000070470000C3 +:101630007FB5124B01250426044603600023057480 +:1016400000F1840243602946C0E902330C4B02904A +:10165000143001934FF44073009602F01BF8094BCD +:1016600004F69442294604F14C000294CDE900634B +:101670004FF4407302F0E2F804B070BD504500082A +:1016800025160008491500080A68302383F31188DD +:101690000B790B3342F823004B79133342F82300C4 +:1016A0008B7913B10B3342F8230000F58053C3F854 +:1016B000A41802230374002080F3118870470000EF +:1016C00038B5037F044613B190F85430ABB9012507 +:1016D000201D0221FFF730FF04F114006FF001011B +:1016E000257700F09DFC04F14C0084F854506FF015 +:1016F0000101BDE8384000F093BC38BD10B50121B0 +:1017000004460430FFF718FF0023237784F8543091 +:1017100010BD000038B504460025143001F0D2FF9A +:1017200004F14C00257702F0A1F8201D84F85450F4 +:101730000121FFF701FF2046BDE83840FFF750BF09 +:1017400090F8803003F06003202B06D190F88120C0 +:101750000023212A03D81F2A06D800207047222AF6 +:10176000FBD1C0E91D3303E0034A426707228267C9 +:10177000C3670120704700BF2C22002037B500F559 +:101780008055D5F8A4381A68117804291AD1017C3B +:10179000022917D11979012312898B40134211D1E3 +:1017A00000F14C04204602F021F958B101A920466D +:1017B00002F068F8D5F8A4480246019B2179206818 +:1017C00000F0C0F803B030BD01F10B03F0B550F8E4 +:1017D000236085B004460D46FEB1302383F31188A3 +:1017E00004EB8507301D0821FFF7A6FEFB6806F114 +:1017F0004C005B691B681BB1019002F051F8019825 +:1018000003A902F03FF8024648B1039B294620464F +:1018100000F098F8002383F3118805B0F0BDFB6851 +:101820005A691268002AF5D01B8A013B1340F1D196 +:1018300004F18002EAE70000133138B550F8214086 +:10184000ECB1302383F3118804F58053D3F8A42836 +:101850001368527903EB8203DB689B695D6845B1CD +:1018600004216018FFF768FE294604F1140001F016 +:101870003FFF2046FFF7B4FE002383F3118838BDF5 +:101880007047000001F00CBA01234022002110B57E +:10189000044600F8303BFFF7FBFA0023C4E90133AC +:1018A00010BD000010B53023044683F311882422B4 +:1018B000416000210C30FFF7EBFA204601F012FAEC +:1018C00002230020237080F3118810BD70B500EB57 +:1018D0008103054650690E461446DA6018B110229D +:1018E0000021FFF7D5FAA06918B110220021FFF7F7 +:1018F000CFFA31462846BDE8704001F0F9BA000041 +:1019000083682022002103F0011310B50446836090 +:101910001030FFF7BDFA2046BDE8104001F074BB5F +:10192000F0B4012500EB810447898D40E4683D4314 +:10193000A469458123600023A2606360F0BC01F0CC +:1019400091BB0000F0B4012500EB810407898D40B4 +:10195000E4683D436469058123600023A2606360FD +:10196000F0BC01F007BC000070B50223002504465E +:10197000242203702946C0F888500C3040F8045CDB +:10198000FFF786FA204684F8705001F045FA636844 +:101990001B6823B129462046BDE87040184770BD3A +:1019A0000378052B10B504460AD080F88C30052347 +:1019B000037043681B680BB1042198470023A360A0 +:1019C00010BD00000178052906D190F88C204368ED +:1019D00002701B6803B118477047000070B590F89B +:1019E0007030044613B1002380F8703004F1800297 +:1019F000204601F02DFB63689B68B3B994F88030F2 +:101A000013F0600535D00021204601F01FFE0021B3 +:101A1000204601F00FFE63681B6813B106212046C3 +:101A20009847062384F8703070BD204698470028F8 +:101A3000E4D0B4F88630A26F9A4288BFA36794F9C5 +:101A40008030A56F002B4FF0300380F20381002D12 +:101A500000F0F280092284F8702083F311880021BD +:101A60002046D4E91D23FFF76DFF002383F311887F +:101A7000DAE794F8812003F07F0343EA022340F27F +:101A80000232934200F0C58021D8B3F5807F48D060 +:101A90000DD8012B3FD0022B00F09380002BB2D148 +:101AA00004F1880262670222A267E367C1E7B3F527 +:101AB000817F00F09B80B3F5407FA4D194F8823001 +:101AC000012BA0D1B4F8883043F0020332E0B3F523 +:101AD000006F4DD017D8B3F5A06F31D0A3F5C06318 +:101AE000012B90D86368204694F882205E6894F8B1 +:101AF0008310B4F88430B047002884D0436863670B +:101B00000368A3671AE0B3F5106F36D040F60242BF +:101B100093427FF478AF5C4B63670223A367002393 +:101B2000C3E794F88230012B7FF46DAFB4F88830AE +:101B300023F00203A4F88830C4E91D55E56778E76F +:101B4000B4F88030B3F5A06F0ED194F882302046FF +:101B500084F88A3001F0BEF963681B6813B1012173 +:101B600020469847032323700023C4E91D339CE7D4 +:101B700004F18B0363670123C3E72378042B10D19F +:101B8000302383F311882046FFF7BAFE85F31188CE +:101B90000321636884F88B5021701B680BB12046C9 +:101BA000984794F88230002BDED084F88B300423E1 +:101BB000237063681B68002BD6D00221204698470B +:101BC000D2E794F8843020461D0603F00F010AD5B1 +:101BD00001F030FA012804D002287FF414AF2B4B17 +:101BE0009AE72B4B98E701F017FAF3E794F8823065 +:101BF000002B7FF408AF94F8843013F00F01B3D0BA +:101C00001A06204602D501F039FDADE701F02AFDA4 +:101C1000AAE794F88230002B7FF4F5AE94F8843074 +:101C200013F00F01A0D01B06204602D501F00EFDD7 +:101C30009AE701F0FFFC97E7142284F8702083F301 +:101C400011882B462A4629462046FFF769FE85F370 +:101C50001188E9E65DB1152284F8702083F31188BC +:101C600000212046D4E91D23FFF75AFEFDE60B2292 +:101C700084F8702083F311882B462A462946204693 +:101C8000FFF760FEE3E700BF8045000878450008E5 +:101C90007C45000838B590F870300446002B3ED0E3 +:101CA000063BDAB20F2A34D80F2B32D8DFE803F024 +:101CB0003731310822323131313131313131373739 +:101CC000856FB0F886309D4214D2C3681B8AB5FB7D +:101CD000F3F203FB12556DB9302383F311882B46C1 +:101CE0002A462946FFF72EFE85F311880A2384F839 +:101CF00070300EE0142384F87030302383F31188A1 +:101D0000002320461A461946FFF70AFE002383F3F4 +:101D1000118838BDC36F03B198470023E7E700215E +:101D2000204601F093FC0021204601F083FC63680B +:101D30001B6813B10621204698470623D7E7000009 +:101D400010B590F870300446142B29D017D8062B04 +:101D500005D001D81BB110BD093B022BFBD80021D7 +:101D6000204601F073FC0021204601F063FC63680B +:101D70001B6813B1062120469847062319E0152B4E +:101D8000E9D10B2380F87030302383F311880023CE +:101D90001A461946FFF7D6FD002383F31188DAE7C8 +:101DA000C3689B695B68002BD5D1C36F03B19847AB +:101DB000002384F87030CEE700238268037503693E +:101DC0001B6899689142FBD25A68036042601060B8 +:101DD0005860704700238268037503691B6899681F +:101DE0009142FBD85A6803604260106058607047A7 +:101DF00008B50846302383F311880A7D0023052A9D +:101E000006D8DFE802F00B050503120E82691360A5 +:101E10004FF0FF338361FFF7CFFF002383F3118877 +:101E200008BD8269936801339360D0E90032136082 +:101E30005A60EDE7FFF7C0BF054BD9680875186811 +:101E4000026853601A600122D8600275FEF7DABAA0 +:101E5000402400200C4B30B5DD684B1C87B0044695 +:101E60000FD02B46094A684600F06EF92046FFF76E +:101E7000E3FF009B13B1684600F070F9A86907B052 +:101E800030BDFFF7D9FFF9E740240020F11D00081D +:101E900038B50C4D04468161EB6881689A689142BF +:101EA00003D8BDE83840FFF787BF1846FFF792FF19 +:101EB00001230146EC6020462375BDE83840FEF75B +:101EC000A1BA00BF40240020044B1A68DB68906868 +:101ED0009B68984294BF0020012070474024002056 +:101EE000084B10B51C68D868226853601A6001223C +:101EF000DC602275FFF76EFF01462046BDE810400A +:101F0000FEF780BA4024002038B50123084C002594 +:101F10002370656001F0A6FD01F0CCFD054906487F +:101F200001F05EFE0223237085F3118838BD00BFE7 +:101F3000A8260020884500084024002000F044B96D +:101F4000034A516853685B1A9842FBD8704700BF38 +:101F5000001000E08B600223086108468B82704706 +:101F60008368A3F1840243F8142C026943F8442CDB +:101F7000426943F8402C094A43F8242CC268A3F173 +:101F8000200043F8182C022203F80C2C002203F83E +:101F90000B2C034A43F8102C704700BF1D040008A7 +:101FA0004024002008B5FFF7DBFFBDE80840FFF73D +:101FB00041BF0000024BDB6898610F20FFF73CBF78 +:101FC00040240020302383F31188FFF7F3BF000083 +:101FD00008B50146302383F311880820FFF73AFF44 +:101FE000002383F3118808BD064BDB6839B14268D2 +:101FF00018605A60136043600420FFF72BBF4FF056 +:10200000FF307047402400200368984206D01A68C9 +:102010000260506018469961FFF70CBF70470000DE +:1020200038B504460D462068844200D138BD0368A7 +:1020300023605C608561FFF7FDFEF4E7036810B57F +:102040009C68A2420CD85C688A600B604C6021607E +:10205000596099688A1A9A604FF0FF33836010BD07 +:10206000121B1B68ECE700000A2938BF0A2170B573 +:1020700004460D460A26601901F0EEFC01F0D6FC7C +:10208000041BA54203D8751C04462E46F3E70A2E0E +:1020900004D90120BDE8704001F0E2BD70BD000030 +:1020A000F8B5144B0D460A2A4FF00A07D96103F11F +:1020B0001001826038BF0A2241601969144601602C +:1020C00048601861A81801F0B7FC01F0AFFC431B91 +:1020D0000646A34206D37C1C28192746354601F044 +:1020E000BBFCF2E70A2F04D90120BDE8F84001F05B +:1020F000B7BDF8BD40240020F8B506460D4601F0F6 +:1021000095FC0F4A134653F8107F9F4206D12A468A +:1021100001463046BDE8F840FFF7C2BFD169BB6851 +:10212000441A2C1928BF2C46A34202D92946FFF78E +:102130009BFF224631460348BDE8F840FFF77EBFCB +:102140004024002050240020C0E90323002310B4C1 +:102150005DF8044B4361FFF7CFBF000010B5194C89 +:10216000236998420DD08168D0E9003213605A602B +:102170009A680A449A60002303604FF0FF33A3611A +:1021800010BD0268234643F8102F536000220260FE +:1021900022699A4203D1BDE8104001F057BC936810 +:1021A00081680B44936001F041FC2269E169926807 +:1021B000441AA242E4D91144BDE81040091AFFF7BD +:1021C00053BF00BF402400202DE9F047DFF8BC805A +:1021D00008F110072C4ED8F8105001F027FCD8F861 +:1021E0001C40AA68031B9A423ED814444FF00009D1 +:1021F000D5E90032C8F81C4013605A60C5F8009059 +:10220000D8F81030B34201D101F020FC89F31188D5 +:10221000D5E9033128469847302383F311886B6949 +:10222000002BD8D001F002FC6A69A0EB04098246B9 +:102230004A450DD2022001F013FD0022D8F81030DB +:10224000B34208D151462846BDE8F047FFF728BF02 +:10225000121A2244F2E712EB09092946384638BF20 +:102260004A46FFF7EBFEB5E7D8F81030B34208D086 +:102270001444C8F81C00211AA960BDE8F047FFF714 +:10228000F3BEBDE8F08700BF5024002040240020AA +:1022900000207047FEE70000704700004FF0FF305D +:1022A0007047000002290CD0032904D001290748F7 +:1022B00018BF00207047032A05D8054800EBC2006C +:1022C0007047044870470020704700BF6046000810 +:1022D0003C2200201446000870B59AB00546084616 +:1022E000144601A900F0C2F801A8FEF7C9FD431C7D +:1022F0000022C6B25B001046C5E9003423700323F8 +:10230000023404F8013C01ABD1B202348E4201D850 +:102310001AB070BD13F8011B013204F8010C04F867 +:10232000021CF1E708B5302383F311880348FFF757 +:1023300025FA002383F3118808BD00BFB0260020D2 +:1023400090F8803003F01F02012A07D190F8812015 +:102350000B2A03D10023C0E91D3315E003F060030D +:10236000202B08D1B0F884302BB990F88120212A95 +:1023700003D81F2A04D8FFF7E3B9222AEBD0FAE7E3 +:10238000034A426707228267C3670120704700BF84 +:102390003322002007B5052917D8DFE801F0191608 +:1023A00003191920302383F31188104A0121019069 +:1023B000FFF78CFA019802210D4AFFF787FA0D48C2 +:1023C000FFF7A8F9002383F3118803B05DF804FB3D +:1023D000302383F311880748FFF772F9F2E73023BF +:1023E00083F311880348FFF789F9EBE7B445000848 +:1023F000D8450008B026002038B50C4D0C4C2A46B4 +:102400000C4904F10800FFF767FF05F1CA0204F167 +:1024100010000949FFF760FF05F5CA7204F11800C2 +:102420000649BDE83840FFF757BF00BF883F00208E +:102430003C220020944500089E450008A94500085C +:1024400070B5044608460D46FEF71AFDC6B2204692 +:10245000013403780BB9184670BD32462946FEF7A1 +:10246000FBFC0028F3D10120F6E700002DE9F0473E +:1024700005460C46FEF704FD2B49C6B22846FFF779 +:10248000DFFF08B10636F6B228492846FFF7D8FF25 +:1024900008B11036F6B2632E0BD8DFF88C80DFF867 +:1024A0008C90234FDFF894A02E7846B92670BDE8B3 +:1024B000F08729462046BDE8F04701F0A3BF252E4E +:1024C0002ED1072241462846FEF7C6FC70B9194BAB +:1024D000224603F10C0153F8040B8B4242F8040B23 +:1024E000F9D11B7807350D341370DDE70822494612 +:1024F0002846FEF7B1FC98B9A21C0F4B197802329E +:102500000909C95D02F8041C13F8011B01F00F0151 +:102510005345C95D02F8031CF0D118340835C3E7F0 +:10252000013504F8016BBFE780460008A9450008A3 +:10253000964600088846000800E8F11F0CE8F11FE5 +:10254000BFF34F8F044B1A695107FCD1D3F8102108 +:102550005207F8D1704700BF0020005208B50D4B5C +:102560001B78ABB9FFF7ECFF0B4BDA68D10704D54A +:102570000A4A5A6002F188325A60D3F80C21D20715 +:1025800006D5064AC3F8042102F18832C3F80421B3 +:1025900008BD00BFE641002000200052230167452E +:1025A00008B5114B1B78F3B9104B1A69510703D5C5 +:1025B000DA6842F04002DA60D3F81021520705D5FC +:1025C000D3F80C2142F04002C3F80C21FFF7B8FF0A +:1025D000064BDA6842F00102DA60D3F80C2142F0CF +:1025E0000102C3F80C2108BDE64100200020005282 +:1025F0000F289ABF00F5806040040020704700005B +:102600004FF4003070470000102070470F2808B5C5 +:102610000BD8FFF7EDFF00F500330268013204D15B +:1026200004308342F9D1012008BD0020FCE70000FE +:102630000F2838B505463FD8FFF782FF1F4CFFF73C +:102640008DFF4FF0FF3307286361C4F814311DD8A4 +:102650002361FFF775FF030243F02403E360E3689F +:1026600043F08003E36023695A07FCD42846FFF750 +:1026700067FFFFF7BDFF4FF4003100F0B3F92846C4 +:10268000FFF78EFFBDE83840FFF7C0BFC4F8103138 +:10269000FFF756FFA0F108031B0243F02403C4F820 +:1026A0000C31D4F80C3143F08003C4F80C31D4F869 +:1026B00010315B07FBD4D9E7002038BD0020005261 +:1026C0002DE9F84F05460C46104645EA0203DE06A2 +:1026D00002D00020BDE8F88F20F01F00DFF8BCB06A +:1026E000DFF8BCA0FFF73AFF04EB0008444503D134 +:1026F0000120FFF755FFEDE720222946204601F093 +:1027000071FE10B920352034F0E72B4605F1200288 +:102710001F68791CDDD104339A42F9D105F1784361 +:102720001B481C4EB3F5801F1B4B38BF184603F1E6 +:10273000F80332BFD946D1461E46FFF701FF0760B6 +:10274000A5EB040C336804F11C0143F00203336071 +:10275000231FD9F8007017F00507FAD153F8042F9A +:102760008B424CF80320F4D1BFF34F8FFFF7E8FE04 +:102770004FF0FF332022214603602846336823F0C0 +:102780000203336001F02EFE0028BBD03846B0E7CC +:10279000142100520C20005214200052102000522C +:1027A0001021005210B5084C237828B11BB9FFF74F +:1027B000D5FE0123237010BD002BFCD02070BDE896 +:1027C0001040FFF7EDBE00BFE64100202DE9F04FBD +:1027D0000D4685B0814658B111F00D0614BF202278 +:1027E000082211F00803019304D0431E03426AD06B +:1027F000002435E0002E37D009F11F0121F01F0918 +:102800004FF00108324F05F00403DFF8D0A005EACD +:10281000080BBBF1000F32D07869C0072FD408F144 +:1028200001080C37B8F1060FF3D19EB9294D49467E +:10283000A819019201F060F9044600283AD118362F +:10284000019A782EF3D1494601F056F90446002842 +:1028500030D1019A4946204801F04EF9044668BB40 +:10286000204605B0BDE8F08F0029C9D101462846B1 +:10287000029201F041F90446E0B9029AC0E713B1AF +:1028800078694107CBD5AC0702D578698007C6D5F2 +:10289000019911B178690107C1D51820494600FB9B +:1028A00008A0CDE9022301F027F90446DDE902235F +:1028B0000028B4D04A460021204601E04A460021C3 +:1028C000FEF7E6FACCE70246002E95D198E700BF66 +:1028D000A846000818420020E841002000420020DD +:1028E0000121FFF773BF0000F8B5144D012418272C +:1028F000134E40F2FF3200210120FEF7C9FA07FB18 +:10290000046001342A6955F80C1F01F0E1F8062C27 +:10291000F5D137254FF4C0542046FFF7E1FF0146BB +:1029200028B122460748BDE8F84001F0D1B8C4EB11 +:10293000C404013D4FEAD404EED1F8BDA846000816 +:1029400000420020E84100200244074BD2B210B5FB +:10295000904200D110BD441C00B253F8200041F851 +:10296000040BE0B2F4E700BF504000580E4B30B506 +:102970001C6F240405D41C6F1C671C6F44F40044B6 +:102980001C670A4C02442368D2B243F4807323606C +:10299000074B904200D130BD441C51F8045B00B29B +:1029A00043F82050E0B2F4E70044025800480258CF +:1029B0005040005807B5012201A90020FFF7C4FFCD +:1029C000019803B05DF804FB13B50446FFF7F2FF6E +:1029D000A04205D0012201A900200194FFF7C6FF03 +:1029E00002B010BD0144BFF34F8F064B884204D3A1 +:1029F000BFF34F8FBFF36F8F7047C3F85C02203077 +:102A0000F4E700BF00ED00E0034B1A681AB9034A6F +:102A1000D2F8D0241A60704790420020004002583B +:102A200008B5FFF7F1FF024B1868C0F3806008BDDE +:102A300090420020EFF30983054968334A6B22F086 +:102A400001024A6383F30988002383F311887047E6 +:102A500000EF00E0302080F3118862B60D4B0E4A83 +:102A6000D96821F4E0610904090C0A430B49DA60D2 +:102A7000D3F8FC2042F08072C3F8FC20084AC2F868 +:102A8000B01F116841F0010111602022DA7783F84C +:102A90002200704700ED00E00003FA0555CEACC5FA +:102AA000001000E0302310B583F311880E4B5B68F3 +:102AB00013F4006314D0F1EE103AEFF309844FF0F1 +:102AC0008073683CE361094BDB6B236684F3098800 +:102AD000FFF7FAF910B1064BA36110BD054BFBE7F8 +:102AE00083F31188F9E700BF00ED00E000EF00E09C +:102AF0002F0400083204000870B5BFF34F8FBFF3F6 +:102B00006F8F1A4A0021C2F85012BFF34F8FBFF3E4 +:102B10006F8F536943F400335361BFF34F8FBFF39B +:102B20006F8FC2F88410BFF34F8FD2F8803043F616 +:102B3000E074C3F3C900C3F34E335B0103EA040638 +:102B4000014646EA81750139C2F86052F9D2203B4C +:102B500013F1200FF2D1BFF34F8F536943F4803349 +:102B60005361BFF34F8FBFF36F8F70BD00ED00E077 +:102B7000FEE70000214B2248224A70B5904237D32D +:102B8000214BC11EDA1C121A22F003028B4238BFFD +:102B900000220021FEF77CF91C4A0023C2F8843091 +:102BA000BFF34F8FD2F8803043F6E074C3F3C9000F +:102BB000C3F34E335B0103EA0406014646EA81751E +:102BC0000139C2F86C52F9D2203B13F1200FF2D137 +:102BD000BFF34F8FBFF36F8FBFF34F8FBFF36F8F75 +:102BE0000023C2F85032BFF34F8FBFF36F8F70BD19 +:102BF00053F8041B40F8041BC0E700BFCC48000892 +:102C000084440020844400208444002000ED00E03F +:102C1000074BD3F8D81021EA0001C3F8D810D3F835 +:102C2000002122EA0002C3F80021D3F800317047E6 +:102C30000044025870B5D0E9244300224FF0FF351C +:102C40009E6804EB42135101D3F80009002805DA0D +:102C5000D3F8000940F08040C3F80009D3F8000B16 +:102C6000002805DAD3F8000B40F08040C3F8000BD1 +:102C7000013263189642C3F80859C3F8085BE0D2E2 +:102C80004FF00113C4F81C3870BD0000890141F0F9 +:102C90002001016103699B06FCD41220FFF750B9A3 +:102CA00010B50A4C2046FEF7EFFD094BC4F89030F2 +:102CB000084BC4F89430084C2046FEF7E5FD074B5E +:102CC000C4F89030064BC4F8943010BD94420020F4 +:102CD0000000084014470008304300200000044072 +:102CE0002047000870B503780546012B5CD1434BA3 +:102CF000D0F89040984258D1414B0E216520D3F82E +:102D0000D82042F00062C3F8D820D3F8002142F066 +:102D10000062C3F80021D3F80021D3F8802042F0EC +:102D20000062C3F88020D3F8802022F00062C3F84C +:102D30008020D3F88030FEF7D3FB324BE360324B78 +:102D4000C4F800380023D5F89060C4F8003EC023D2 +:102D500023604FF40413A3633369002BFCDA0123CF +:102D60000C203361FFF7ECF83369DB07FCD4122049 +:102D7000FFF7E6F83369002BFCDA00262846A66048 +:102D8000FFF758FF6B68C4F81068DB68C4F8146874 +:102D9000C4F81C6883BB1D4BA3614FF0FF33636114 +:102DA000A36843F00103A36070BD194B9842C9D1D9 +:102DB000134B4FF08060D3F8D82042F00072C3F874 +:102DC000D820D3F8002142F00072C3F80021D3F8D4 +:102DD0000021D3F8802042F00072C3F88020D3F89D +:102DE000802022F00072C3F88020D3F88030FFF7F3 +:102DF0000FFF0E214D209EE7064BCDE794420020A9 +:102E0000004402584014004003002002003C30C03F +:102E100030430020083C30C0F8B5D0F8904005465B +:102E200000214FF000662046FFF730FFD5F89410E0 +:102E300000234FF001128F684FF0FF30C4F8343890 +:102E4000C4F81C2804EB431201339F42C2F8006906 +:102E5000C2F8006BC2F80809C2F8080BF2D20B687E +:102E6000D5F89020C5F89830636210231361166975 +:102E700016F01006FBD11220FFF762F8D4F80038E4 +:102E800023F4FE63C4F80038A36943F4402343F0FD +:102E90001003A3610923C4F81038C4F814380B4B8D +:102EA000EB604FF0C043C4F8103B094BC4F8003B43 +:102EB000C4F81069C4F80039D5F8983003F110024D +:102EC00043F48013C5F89820A362F8BDF0460008CB +:102ED00040800010D0F8902090F88A10D2F8003886 +:102EE00023F4FE6343EA0113C2F800387047000080 +:102EF0002DE9F84300EB8103D0F890500C46804652 +:102F0000DA680FFA81F94801166806F00306731EA5 +:102F1000022B05EB41134FF0000194BFB604384E6D +:102F2000C3F8101B4FF0010104F1100398BF06F124 +:102F3000805601FA03F3916998BF06F5004600290F +:102F40003AD0578A04F15801374349016F50D5F8F8 +:102F50001C180B430021C5F81C382B180127C3F897 +:102F60001019A7405369611E9BB3138A928B9B086B +:102F7000012A88BF5343D8F89820981842EA03439F +:102F800001F140022146C8F89800284605EB82026C +:102F90005360FFF77BFE08EB8900C3681B8A43EA96 +:102FA000845348341E4364012E51D5F81C381F4306 +:102FB000C5F81C78BDE8F88305EB4917D7F8001B66 +:102FC00021F40041C7F8001BD5F81C1821EA0303BF +:102FD000C0E704F13F030B4A2846214605EB830373 +:102FE0005A60FFF753FE05EB4910D0F8003923F47F +:102FF0000043C0F80039D5F81C3823EA0707D7E7A3 +:103000000080001000040002D0F894201268C0F87C +:103010009820FFF70FBE00005831D0F890304901DA +:103020005B5813F4004004D013F4001F0CBF0220BF +:10303000012070474831D0F8903049015B5813F4B3 +:10304000004004D013F4001F0CBF02200120704781 +:1030500000EB8101CB68196A0B6813604B68536001 +:103060007047000000EB810330B5DD68AA69136882 +:10307000D36019B9402B84BF402313606B8A146856 +:10308000D0F890201C4402EB4110013C09B2B4FB83 +:10309000F3F46343033323F0030343EAC44343F0ED +:1030A000C043C0F8103B2B6803F00303012B0ED183 +:1030B000D2F8083802EB411013F4807FD0F8003BBF +:1030C00014BF43F0805343F00053C0F8003B02EBC1 +:1030D0004112D2F8003B43F00443C2F8003B30BD3C +:1030E0002DE9F041D0F8906005460C4606EB4113FF +:1030F000D3F8087B3A07C3F8087B08D5D6F814380C +:103100001B0704D500EB8103DB685B689847FA076F +:103110001FD5D6F81438DB071BD505EB8403D96817 +:10312000CCB98B69488A5A68B2FBF0F600FB1622CC +:103130008AB91868DA6890420DD2121AC3E90024DD +:10314000302383F3118821462846FFF78BFF84F351 +:103150001188BDE8F081012303FA04F26B8923EAA8 +:1031600002036B81CB68002BF3D021462846BDE8D3 +:10317000F041184700EB81034A0170B5DD68D0F8D3 +:1031800090306C692668E66056BB1A444FF4002004 +:10319000C2F810092A6802F00302012A0AB20ED10D +:1031A000D3F8080803EB421410F4807FD4F8000928 +:1031B00014BF40F0805040F00050C4F8000903EB09 +:1031C0004212D2F8000940F00440C2F8000901227E +:1031D000D3F8340802FA01F10143C3F8341870BD82 +:1031E00019B9402E84BF4020206020681A442E8ADE +:1031F0008419013CB4FBF6F440EAC44040F00050AE +:10320000C6E700002DE9F843D0F8906005460C466B +:103210004F0106EB4113D3F8088918F0010FC3F8EA +:1032200008891CD0D6F81038DB0718D500EB8103CD +:10323000D3F80CC0DCF81430D3F800E0DA68964517 +:1032400030D2A2EB0E024FF000091A60C3F80490CE +:10325000302383F31188FFF78DFF89F3118818F06D +:10326000800F1DD0D6F834380126A640334217D03F +:1032700005EB84030134D5F89050D3F80CC0E4B2C8 +:103280002F44DCF8142005EB0434D2F800E0516838 +:10329000714514D3D5F8343823EA0606C5F83468E6 +:1032A000BDE8F883012303FA01F2038923EA02034C +:1032B0000381DCF80830002BD1D09847CFE7AEEB84 +:1032C0000103BCF81000834228BF0346D7F8180951 +:1032D00080B2B3EB800FE3D89068A0F1040959F8ED +:1032E000048FC4F80080A0EB09089844B8F1040FDB +:1032F000F5D818440B4490605360C8E72DE9F84FA7 +:10330000D0F8905004466E69AB691E4016F48058A0 +:103310006E6103D0BDE8F84FFEF726BB002E12DA2F +:10332000D5F8003E9B0705D0D5F8003E23F00303F7 +:10333000C5F8003ED5F80438204623F00103C5F84F +:103340000438FEF73FFB370505D52046FFF772FC32 +:103350002046FEF725FBB0040CD5D5F8083813F04D +:10336000060FEB6823F470530CBF43F4105343F47F +:10337000A053EB6031071BD56368DB681BB9AB69F1 +:1033800023F00803AB612378052B0CD1D5F8003E60 +:103390009A0705D0D5F8003E23F00303C5F8003E98 +:1033A0002046FEF70FFB6368DB680BB120469847A9 +:1033B000F30200F1BA80B70226D5D4F89090002726 +:1033C0004FF0010A09EB4712D2F8003B03F4402307 +:1033D000B3F5802F11D1D2F8003B002B0DDA6289B2 +:1033E0000AFA07F322EA0303638104EB8703DB682D +:1033F000DB6813B13946204698470137D4F894303A +:10340000FFB29B689F42DDD9F00619D5D4F8900031 +:10341000026AC2F30A1702F00F0302F4F012B2F5C7 +:10342000802F00F0CA80B2F5402F09D104EB83034E +:10343000002200F58050DB681B6A974240F0B080A4 +:103440003003D5F8185835D5E90303D500212046B7 +:10345000FFF746FEAA0303D501212046FFF740FEF1 +:103460006B0303D502212046FFF73AFE2F0303D555 +:1034700003212046FFF734FEE80203D5042120464D +:10348000FFF72EFEA90203D505212046FFF728FEEF +:103490006A0203D506212046FFF722FE2B0203D540 +:1034A00007212046FFF71CFEEF0103D50821204627 +:1034B000FFF716FE700340F1A780E90703D500214E +:1034C0002046FFF79FFEAA0703D501212046FFF7FC +:1034D00099FE6B0703D502212046FFF793FE2F07C5 +:1034E00003D503212046FFF78DFEEE0603D5042108 +:1034F0002046FFF787FEA80603D505212046FFF7E3 +:1035000081FE690603D506212046FFF77BFE2A06C9 +:1035100003D507212046FFF775FEEB0574D520463D +:103520000821BDE8F84FFFF76DBED4F890904FF03A +:10353000000B4FF0010AD4F894305FFA8BF79B68C8 +:103540009F423FF638AF09EB4713D3F8002902F446 +:103550004022B2F5802F20D1D3F80029002A1CDAAE +:10356000D3F8002942F09042C3F80029D3F800298B +:10357000002AFBDB3946D4F89000FFF787FB22894D +:103580000AFA07F322EA0303238104EB8703DB68CB +:103590009B6813B13946204698470BF1010BCAE7E7 +:1035A000910701D1D0F80080072A02F101029CBFE7 +:1035B00003F8018B4FEA18283FE704EB830300F57B +:1035C0008050DA68D2F818C0DCF80820DCE9001C6A +:1035D000A1EB0C0C00218F4208D1DB689B699A6833 +:1035E0003A449A605A683A445A6029E711F0030F46 +:1035F00001D1D0F800808C4501F1010184BF02F8AF +:10360000018B4FEA1828E6E7BDE8F88F08B50348B4 +:10361000FFF774FEBDE80840FFF744BA944200206B +:1036200008B50348FFF76AFEBDE80840FFF73ABA5D +:1036300030430020D0F8903003EB4111D1F8003B2B +:1036400043F40013C1F8003B70470000D0F89030FD +:1036500003EB4111D1F8003943F40013C1F80039EC +:1036600070470000D0F8903003EB4111D1F8003BD7 +:1036700023F40013C1F8003B70470000D0F89030ED +:1036800003EB4111D1F8003923F40013C1F80039DC +:103690007047000030B50433039C0172002104FB25 +:1036A0000325C160C0E90653049B0363059BC0E981 +:1036B0000000C0E90422C0E90842C0E90A114363DE +:1036C00030BD00000022416AC260C0E90411C0E9B7 +:1036D0000A226FF00101FEF7A3BC0000D0E904321A +:1036E000934201D1C2680AB9181D70470020704783 +:1036F000036919600021C2680132C260C2691344C3 +:1037000082699342036124BF436A0361FEF77CBC74 +:1037100038B504460D46E3683BB162690020131DCD +:103720001268A3621344E36207E0237A33B929469F +:103730002046FEF759FC0028EDDA38BD6FF0010095 +:10374000FBE70000C368C269013BC36043691344DF +:1037500082699342436124BF436A436100238362C9 +:10376000036B03B11847704770B53023044683F3E9 +:103770001188866A3EB9FFF7CBFF054618B186F37C +:103780001188284670BDA36AE26A13F8015B934270 +:10379000A36202D32046FFF7D5FF002383F31188ED +:1037A000EFE700002DE9F84F04460E46174698460D +:1037B0004FF0300989F311880025AA46D4F828B0C3 +:1037C000BBF1000F09D141462046FFF7A1FF20B110 +:1037D0008BF311882846BDE8F88FD4E90A12A7EBCD +:1037E000050B521A934528BF9346BBF1400F1BD9D6 +:1037F000334601F1400251F8040B914243F8040BA7 +:10380000F9D1A36A403640354033A362D4E90A2394 +:103810009A4202D32046FFF795FF8AF31188BD42F2 +:10382000D8D289F31188C9E730465A46FDF70AFB1A +:10383000A36A5E445D445B44A362E7E710B5029C63 +:103840000433017203FB0421C460C0E906130023A2 +:10385000C0E90A33039B0363049BC0E90000C0E98D +:103860000422C0E90842436310BD0000026A6FF001 +:103870000101C260426AC0E904220022C0E90A22B2 +:10388000FEF7CEBBD0E904239A4201D1C26822B927 +:10389000184650F8043B0B60704700231846FAE7BF +:1038A000C3680021C2690133C3604369134482695C +:1038B0009342436124BF436A4361FEF7A5BB000006 +:1038C00038B504460D46E3683BB1236900201A1D54 +:1038D000A262E2691344E36207E0237A33B929461E +:1038E0002046FEF781FB0028EDDA38BD6FF00100BD +:1038F000FBE7000003691960C268013AC260C2694F +:10390000134482699342036124BF436A0361002325 +:103910008362036B03B118477047000070B5302312 +:103920000D460446114683F31188866A2EB9FFF7C7 +:10393000C7FF10B186F3118870BDA36A1D70A36A1A +:10394000E26A01339342A36204D3E1692046043959 +:10395000FFF7D0FF002080F31188EDE72DE9F84F45 +:1039600004460D46904699464FF0300A8AF3118876 +:103970000026B346A76A4FB949462046FFF7A0FF85 +:1039800020B187F311883046BDE8F88FD4E90A07E3 +:103990003A1AA8EB0607974228BF1746402F1BD9B3 +:1039A00005F1400355F8042B9D4240F8042BF9D152 +:1039B000A36A40364033A362D4E90A239A4204D36F +:1039C000E16920460439FFF795FF8BF311884645DE +:1039D000D9D28AF31188CDE729463A46FDF732FA63 +:1039E000A36A3D443E443B44A362E5E7D0E9042397 +:1039F0009A4217D1C3689BB1836A8BB1043B9B1A6F +:103A00000ED01360C368013BC360C3691A44836965 +:103A10009A42026124BF436A036100238362012347 +:103A2000184670470023FBE700F01EBA014B586AA6 +:103A3000704700BF000C0040034B002258631A611E +:103A40000222DA60704700BF000C0040014B0022E8 +:103A5000DA607047000C0040014B5863704700BFAC +:103A6000000C0040024B034A1A60034A5A60704738 +:103A7000E44300208844002000000220074B494214 +:103A800010B55C68201A08401968821A8A4203D36C +:103A9000A24201D85A6010BD0020FCE7E443002098 +:103AA00008B5302383F31188FFF7E8FF002383F381 +:103AB000118808BD04480121044B03600023C0E9BC +:103AC00001330C3000F0D4B8EC430020A13A0008D8 +:103AD000CB1D083A23F00703591A521A012110B4DA +:103AE000D2080024C0E9004384600C301C605A6096 +:103AF0005DF8044B00F0BCB82DE9F84F364ECD1DF3 +:103B00000F46002818BF0646082A4FEAD50538BFD9 +:103B1000082206F10C08341D9146404600F0C4F816 +:103B200009F10701C9F1000E224624686CB940462C +:103B300000F0C4F83368CBB308224946E800984740 +:103B4000044698B340E9026730E004EB010CD4F876 +:103B500004A00CEA0E0C0AF10100ACF1080304EB1E +:103B6000C0009842E0D9A0EB0C0CB5EBEC0F4FEA8B +:103B7000EC0BD9D89C421CD204F10802AB45A3EB54 +:103B800002024FEAE202626009D9691CED43206833 +:103B900003EBC1025D44556043F8310022601C46CE +:103BA0005F60404644F8086B00F088F82046BDE8A6 +:103BB000F88FAA45216802D111602346EFE701354D +:103BC00004EBC50344F8351003F10801401AC01096 +:103BD00058601360F1E700BFEC430020FEE70000EF +:103BE00070B51B4B0025044686B058600E468562B2 +:103BF0000163FEF72FFF04F11003A560E562C4E93D +:103C000004334FF0FF33C4E90044C4E90635FFF73D +:103C10000DFF2B46024604F134012046C4E9082377 +:103C200080230C4A2565FEF795F901230A4AE060D6 +:103C300000920375684672680192B268CDE902236A +:103C4000064BCDE90435FEF7ADF906B070BD00BFF7 +:103C5000A82600202C47000831470008DD3B00085B +:103C6000024AD36A1843D062704700BF4024002044 +:103C7000C0E90000816070478368013B002B10B5EC +:103C800083600CDA074BDC684368A06120606360E6 +:103C90001C6044600520FEF7CFF8A06910BD00202D +:103CA000FCE700BF4024002008B5302383F31188CF +:103CB000FFF7E2FF002383F3118808BD08B5302326 +:103CC00083F3118883680133002B836007DC03686A +:103CD00000211A68026050601846FEF7D9F80023E8 +:103CE00083F3118808BD00004B6843608B688360D4 +:103CF000CB68C3600B6943614B6903628B694362A4 +:103D00000B6803607047000008B53C4B40F2FF7140 +:103D10003B48D3F888200A43C3F88820D3F888208A +:103D200022F4FF6222F00702C3F88820D3F888202B +:103D3000D3F8E0200A43C3F8E020D3F808210A436F +:103D4000C3F808212F4AD3F808311146FFF7CCFFFA +:103D500000F5806002F11C01FFF7C6FF00F58060EE +:103D600002F13801FFF7C0FF00F5806002F1540155 +:103D7000FFF7BAFF00F5806002F17001FFF7B4FFB2 +:103D800000F5806002F18C01FFF7AEFF00F5806066 +:103D900002F1A801FFF7A8FF00F5806002F1C4015D +:103DA000FFF7A2FF00F5806002F1E001FFF79CFF42 +:103DB00000F5806002F1FC01FFF796FF02F58C71BF +:103DC00000F58060FFF790FF00F01AF90E4BD3F872 +:103DD000902242F00102C3F89022D3F8942242F0DC +:103DE0000102C3F894220522C3F898204FF06052D4 +:103DF000C3F89C20054AC3F8A02008BD004402581F +:103E0000000002583847000800ED00E01F000803DA +:103E100008B500F0C9FAFEF777F8104BD3F8DC20AC +:103E200042F04002C3F8DC20D3F8042122F0400223 +:103E3000C3F80421D3F80431094B1A6842F0080290 +:103E40001A601A6842F004021A60FEF7DDFDFEF700 +:103E50004BFDBDE80840FEF7CFBA00BF0044025852 +:103E60000018024870470000114BD3F8E82042F0D8 +:103E70000802C3F8E820D3F8102142F00802C3F882 +:103E800010210C4AD3F81031D36B43F00803D363ED +:103E9000C722094B9A624FF0FF32DA6200229A6120 +:103EA0005A63DA605A6001225A611A60704700BF93 +:103EB000004402580010005C000C0040094A08B59C +:103EC0001169D3680B40D9B29B076FEA01011161F8 +:103ED00007D5302383F31188FEF730F8002383F3EE +:103EE000118808BD000C0040064BD3F8DC200243CB +:103EF000C3F8DC20D3F804211043C3F80401D3F83D +:103F0000043170470044025808B53C4B4FF0FF3174 +:103F1000D3F8802062F00042C3F88020D3F88020DC +:103F200002F00042C3F88020D3F88020D3F8842028 +:103F3000C3F88410D3F884200022C3F88420D3F877 +:103F40008400D86F40F0FF4040F4FF0040F4DF40B1 +:103F500040F07F00D867D86F20F0FF4020F4FF00CA +:103F600020F4DF4020F07F00D867D86FD3F88800B6 +:103F70006FEA40506FEA5050C3F88800D3F88800C9 +:103F8000C0F30A00C3F88800D3F88800D3F8900083 +:103F9000C3F89010D3F89000C3F89020D3F89000A5 +:103FA000D3F89400C3F89410D3F89400C3F8942085 +:103FB000D3F89400D3F89800C3F89810D3F8980079 +:103FC000C3F89820D3F89800D3F88C00C3F88C106D +:103FD000D3F88C00C3F88C20D3F88C00D3F89C0065 +:103FE000C3F89C10D3F89C10C3F89C20D3F89C30E5 +:103FF000FDF79AF9BDE8084000F0AEB90044025858 +:1040000008B50122534BC3F80821534BD3F8F420D1 +:1040100042F00202C3F8F420D3F81C2142F002025D +:10402000C3F81C210222D3F81C314C4BDA605A68C9 +:104030009104FCD54A4A1A6001229A60494ADA6022 +:1040400000221A614FF440429A61444B9A699204EB +:10405000FCD51A6842F480721A603F4B1A6F12F452 +:10406000407F04D04FF480321A6700221A671A6822 +:1040700042F001021A60384B1A685007FCD5002242 +:104080001A611A6912F03802FBD1012119604FF050 +:10409000804159605A67344ADA62344A1A611A68B0 +:1040A00042F480321A602C4B1A689103FCD51A68CE +:1040B00042F480521A601A689204FCD52C4A2D49A9 +:1040C0009A6200225A63196301F57C01DA6301F2F6 +:1040D000E71199635A64284A1A64284ADA621A680E +:1040E00042F0A8521A601C4B1A6802F02852B2F132 +:1040F000285FF9D148229A614FF48862DA61402240 +:104100001A621F4ADA641F4A1A651F4A5A651F4A13 +:104110009A6532231E4A1360136803F00F03022BC3 +:10412000FAD10D4A136943F003031361136903F0D5 +:104130003803182BFAD14FF00050FFF7D5FE4FF09F +:104140008040FFF7D1FE4FF00040BDE80840FFF788 +:10415000CBBE00BF00800051004402580048025806 +:1041600000C000F0020000010000FF01008890087C +:104170001210200063020901470E0508DD0BBF0184 +:1041800020000020000001100910E00000010110D3 +:10419000002000524FF0B04208B5D2F8883003F04A +:1041A0000103C2F8883023B1044A13680BB1506888 +:1041B0009847BDE80840FEF775BC00BF04440020E6 +:1041C0004FF0B04208B5D2F8883003F00203C2F8CD +:1041D000883023B1044A93680BB1D0689847BDE892 +:1041E0000840FEF75FBC00BF044400204FF0B0421F +:1041F00008B5D2F8883003F00403C2F8883023B140 +:10420000044A13690BB150699847BDE80840FEF7AE +:1042100049BC00BF044400204FF0B04208B5D2F8BA +:10422000883003F00803C2F8883023B1044A936948 +:104230000BB1D0699847BDE80840FEF733BC00BF1A +:10424000044400204FF0B04208B5D2F8883003F0A3 +:104250001003C2F8883023B1044A136A0BB1506AC4 +:104260009847BDE80840FEF71DBC00BF044400208D +:104270004FF0B04310B5D3F8884004F47872C3F817 +:104280008820A30604D5124A936A0BB1D06A9847D6 +:10429000600604D50E4A136B0BB1506B984721068C +:1042A00004D50B4A936B0BB1D06B9847E20504D54C +:1042B000074A136C0BB1506C9847A30504D5044A08 +:1042C000936C0BB1D06C9847BDE81040FEF7EABB89 +:1042D000044400204FF0B04310B5D3F8884004F4F4 +:1042E0007C42C3F88820620504D5164A136D0BB1D1 +:1042F000506D9847230504D5124A936D0BB1D06DCC +:104300009847E00404D50F4A136E0BB1506E9847DE +:10431000A10404D50B4A936E0BB1D06E984762048A +:1043200004D5084A136F0BB1506F9847230404D586 +:10433000044A936F0BB1D06F9847BDE81040FEF769 +:10434000B1BB00BF0444002008B5FFF7B7FDBDE8CE +:104350000840FEF7A7BB0000062108B50846FDF798 +:10436000BFF806210720FDF7BBF806210820FDF75E +:10437000B7F806210920FDF7B3F806210A20FDF75A +:10438000AFF806211720FDF7ABF806212820FDF72E +:10439000A7F809217A20FDF7A3F807213220BDE80C +:1043A0000840FDF79DB8000008B5FFF7ADFD00F02F +:1043B0000BF8FDF767FAFDF739F9FFF753FDBDE894 +:1043C0000840FFF731BB00000023054A19460133BE +:1043D000102BC2E9001102F10802F8D1704700BFAA +:1043E0000444002010B501390244904201D100205C +:1043F00005E0037811F8014FA34201D0181B10BD4E +:104400000130F2E7034611F8012B03F8012B002AD3 +:10441000F9D1704753544D333248373F3F3F005333 +:10442000544D3332483733782F3732780053544D58 +:104430003332483734332F3735332F373530000098 +:1044400001105A00031059000120580003205600A3 +:1044500010000240080002400008024000000B006B +:1044600028000240080002400408024006010C0037 +:1044700040000240080002400808024010020D00FF +:1044800058000240080002400C08024016030E00CB +:10449000700002400C0002401008024000040F00AF +:1044A000880002400C00024014080240060510007B +:1044B000A00002400C000240180802401006110043 +:1044C000B80002400C0002401C08024016072F00F2 +:1044D000100402400804024020080240000838008E +:1044E000280402400804024024080240060939005A +:1044F000400402400804024028080240100A3A0022 +:1045000058040240080402402C080240160B3B00ED +:10451000700402400C04024030080240000C3C00D1 +:10452000880402400C04024034080240060D440096 +:10453000A00402400C04024038080240100E45005E +:10454000B80402400C0402403C080240160F46002A +:1045500000000000A915000895150008D1150008F5 +:10456000BD150008C9150008B5150008A1150008FB +:104570008D150008DD150008000000000100000096 +:1045800000000000633000008445000898240020EB +:10459000A82600204172647550696C6F7400254232 +:1045A0004F415244252D424C002553455249414C20 +:1045B000250000000200000000000000C9170008EC +:1045C0003918000840004000583F0020683F002094 +:1045D00002000000000000000300000000000000D6 +:1045E000811800080000000010000000783F002043 +:1045F00000000000010000000000000094420020C4 +:104600000101020095230008A522000841230008AB +:1046100025230008430000001C460008090243004F +:10462000020100C032090400000102020100052459 +:1046300000100105240100010424020205240600E3 +:1046400001070582030800FF09040100020A0000B7 +:10465000000705010240000007058102400000003C +:10466000120000006846000812011001020000401C +:10467000091241570002010203010000040309046A +:1046800025424F4152442500466C79776F6F483779 +:10469000343350726F003031323334353637383975 +:1046A0004142434445460000000000200000020053 +:1046B00002000000000000300000040008000000BC +:1046C00000000024000008000400000000040000B6 +:1046D00000FC000002000000000004300080000028 +:1046E0000800000000000038000001000100000088 +:1046F00000000000DD190008951C0008411D00089D +:1047000040004000CC430020CC43002001000000CA +:10471000DC43002080000000400100000800000091 +:104720000001000000100000080000006D61696ECB +:104730000069646C650000000000802A0000000031 +:10474000AAAAAAAA00000024FFFF0000000000009F +:1047500000A00A000000000100000000AAAAAAAA06 +:1047600000000001FFFF000000000000000000004A +:104770000000004000000000AAAAAAAA0000004011 +:10478000FFFF0000000000000000000000005000DB +:1047900000000000AAAAAAAA00000000FFFF000073 +:1047A0000000000000000000400040000000000089 +:1047B000AAAAAAAA00004000F7FF0000000000001B +:1047C000000000000000000000000000AAAAAAAA41 +:1047D00000000000FFFF00000000000000000000DB +:1047E0000000000000000000AAAAAAAA0000000021 +:1047F000FFFF0000000000000000000000000000BB +:1048000000000000AAAAAAAA00000000FFFF000002 +:104810000000000000000000000000000000000098 +:10482000AAAAAAAA00000000FFFF000000000000E2 +:10483000000000000000000000000000AAAAAAAAD0 +:1048400000000000FFFF000000000000000000006A +:104850000000000000000000AAAAAAAA00000000B0 +:10486000FFFF00000000000000000000000000004A +:104870009D0400000000000000001A00000000007D +:10488000FF00000000000000144400088304000042 +:104890001F440008500400002D440008009600004A +:1048A000000008009600000000080000040000005E +:1048B0007C4600080000000000000000000000002E +:0C48C000000000000000000000000000EC +:00000001FF diff --git a/Tools/bootloaders/GEPRCF745BTHD_bl.bin b/Tools/bootloaders/GEPRCF745BTHD_bl.bin new file mode 100755 index 0000000000..f22488d407 Binary files /dev/null and b/Tools/bootloaders/GEPRCF745BTHD_bl.bin differ diff --git a/Tools/bootloaders/GEPRCF745BTHD_bl.hex b/Tools/bootloaders/GEPRCF745BTHD_bl.hex new file mode 100644 index 0000000000..0e3e28b66e --- /dev/null +++ b/Tools/bootloaders/GEPRCF745BTHD_bl.hex @@ -0,0 +1,930 @@ +:020000040800F2 +:1000000000060120010200080302000803020008A4 +:1000100003020008030200080302000803020008AC +:1000200003020008030200080302000899310008D7 +:10003000030200080302000803020008030200088C +:10004000030200080302000803020008030200087C +:100050000302000803020008413400086934000864 +:1000600091340008B9340008E134000803020008A4 +:10007000030200080302000803020008030200084C +:10008000030200080302000803020008030200083C +:1000900003020008030200080302000809350008F3 +:1000A000030200080302000803020008030200081C +:1000B000DD350008030200080302000803020008FF +:1000C00003020008030200080302000803020008FC +:1000D00003020008030200080302000803020008EC +:1000E0006D3500080302000803020008030200083F +:1000F00003020008030200080302000803020008CC +:1001000003020008030200080302000803020008BB +:1001100003020008030200080302000803020008AB +:10012000030200080302000803020008030200089B +:10013000030200080302000803020008030200088B +:100140000302000803020008030200080D2900084A +:10015000030200080302000803020008030200086B +:10016000030200080302000803020008030200085B +:10017000030200080302000803020008030200084B +:10018000030200080302000803020008030200083B +:10019000030200080302000803020008030200082B +:1001A000030200080302000803020008030200081B +:1001B000030200080302000803020008030200080B +:1001C00003020008030200080302000803020008FB +:1001D00003020008030200080302000803020008EB +:1001E00003020008030200080302000803020008DB +:1001F00003020008030200080302000803020008CB +:1002000002E000F000F8FEE772B6374880F3088895 +:10021000364880F3098836483649086040F20000C5 +:10022000CCF200004EF63471CEF200010860BFF34C +:100230004F8FBFF36F8F40F20000C0F2F0004EF618 +:100240008851CEF200010860BFF34F8FBFF36F8F6C +:100250004FF00000E1EE100A4EF63C71CEF20001C4 +:100260000860062080F31488BFF36F8F01F0A8FFA9 +:1002700002F024FF4FF055301F491B4A91423CBF0A +:1002800041F8040BFAE71D49184A91423CBF41F876 +:10029000040BFAE71A491B4A1B4B9A423EBF51F81E +:1002A000040B42F8040BF8E700201849184A914261 +:1002B0003CBF41F8040BFAE701F0C0FF02F05EFF1B +:1002C000144C154DAC4203DA54F8041B8847F9E787 +:1002D00000F042F8114C124DAC4203DA54F8041B02 +:1002E0008847F9E701F0A8BF00060120002201209D +:1002F0000000000808ED00E00000012000060120D9 +:1003000098390008002201205C220120602201208F +:10031000882E0120000200080002000800020008E8 +:10032000000200082DE9F04F2DED108AC1F80CD025 +:10033000D0F80CD0BDEC108ABDE8F08F002383F319 +:1003400011882846A047002001F0E4FAFEE701F0FA +:100350006DFA00DFFEE7000038B500F011FC01F097 +:10036000EFFE054601F022FF0446C8B90E4B9D4240 +:1003700018D001339D4218BF044641F2883504BFAE +:1003800001240025002001F0E5FE0CB100F076F814 +:1003900000F05EFD284600F0FDF800F06FF8F9E788 +:1003A0000025EFE70546EDE7010007B008B500F0CE +:1003B000B9FBA0F120035842584108BD07B541F2EE +:1003C0001203022101A8ADF8043000F0C9FB03B00C +:1003D0005DF804FB38B572B6302383F3118862B63A +:1003E000174803680BB101F063FB164A1448002359 +:1003F0004FF47A7101F052FB002383F31188124C01 +:10040000236813B12368013B2360636813B16368F9 +:10041000013B63600D4D2B7833B963687BB90220D3 +:1004200000F080FC322363602B78032B07D16368D4 +:100430002BB9022000F076FC4FF47A73636038BD6C +:1004400060220120D50300088023012078220120AA +:10045000084B187003280CD8DFE800F008050208E4 +:10046000022000F055BC022000F048BC024B0022E4 +:100470005A6070477822012080230120F8B5404B54 +:10048000404A1C461968013179D004339342F9D1AE +:100490006268A24273D33C4B9B6803F1006303F58F +:1004A000C0339A426BD2002000F084FB0220FFF799 +:1004B000CFFF364B00211A6C19641A6E19661A6E3A +:1004C0005A6C59645A6E59665A6E5A6942F08002E3 +:1004D0005A615A6922F080025A615A691A6942F0D7 +:1004E00000521A611A6922F000521A611B6972B631 +:1004F0004FF0E023C3F8084DD4E90004BFF34F8F59 +:10050000BFF36F8F224AC2F88410BFF34F8F536935 +:1005100023F480335361BFF34F8FD2F88030C3F39D +:10052000C905C3F34E335B0143F6E07603EA060CDC +:1005300029464CEA81770139C2F87472F9D2203B1E +:1005400013F1200FF2D1BFF34F8FBFF36F8FBFF3C3 +:100550004F8FBFF36F8F536923F400335361002330 +:10056000C2F85032BFF34F8FBFF36F8F72B6302394 +:1005700083F3118862B6854680F308882047F8BD6A +:10058000008001082080010800220120003802407C +:1005900000ED00E02DE9F04F93B0B64B0090202223 +:1005A000FF210AA89D6800F0FDFBB34A1378B3B998 +:1005B000B24801211170036072B6302383F31188B1 +:1005C00062B603680BB101F073FAAD4AAB48002381 +:1005D0004FF47A7101F062FA002383F31188009BD3 +:1005E00013B1A84B009A1A60A74A009C1378032BFA +:1005F0001EBF00231370A34A4FF0000A18BF5360B8 +:10060000D3465646D146012000F082FB24B19D4BD3 +:100610001B68002B00F02782002000F083FA039073 +:10062000039B002BF2DB012000F068FB039B213BC6 +:100630001F2BE8D801A252F823F000BFBD06000826 +:10064000E506000879070008070600080706000805 +:10065000070600080B080008DB090008F508000879 +:10066000570900087F090008A509000807060008C7 +:10067000B709000807060008290A00085D070008F6 +:10068000070600086D0A0008C90600085D07000893 +:1006900007060008570900080706000807060008B3 +:1006A00007060008070600080706000807060008F6 +:1006B0000706000807060008790700080220FFF770 +:1006C00075FE002840F0F981009B0221BAF1000F6D +:1006D00008BF1C4605A841F21233ADF8143000F0F3 +:1006E0003FFA90E74FF47A7000F01CFA071EEBDB3C +:1006F0000220FFF75BFE0028E6D0013F052F00F245 +:10070000DE81DFE807F0030A0D1013360523059399 +:10071000042105A800F024FA17E056480421F9E75F +:100720005A480421F6E75A480421F3E74FF01C0821 +:10073000404600F041FA08F104080590042105A89C +:1007400000F00EFAB8F12C0FF2D1012000FA07F7F1 +:1007500047EA0B0B5FFA8BFB4FF0000900F06EFBD2 +:1007600026B10BF00B030B2B08BF0024FFF726FE6E +:1007700049E748480421CDE7002EA5D00BF00B0334 +:100780000B2BA1D10220FFF711FE074600289BD0BA +:10079000012000F00FFA0220FFF75AFE00261FFA90 +:1007A00086F8404600F016FA0446B0B10399A1F16C +:1007B000400251425141404600F01CFA01360028E7 +:1007C000EDD1BA46044641F21213022105A8ADF854 +:1007D00014303E4600F0C4F915E70120FFF738FE5B +:1007E0002546244B9B68AB4207D9284600F0E4F924 +:1007F000013040F067810435F3E7234B00251D707D +:10080000204BBA465D603E46A8E7002E3FF45CAF41 +:100810000BF00B030B2B7FF457AF0220FFF718FEF2 +:10082000322000F07FF9B0F10008FFF64DAF18F06C +:1008300003077FF449AF0F4A926808EB0503934220 +:100840003FF642AFB8F5807F3FF73EAF124B0193C2 +:10085000B84523DD4FF47A7000F064F90390039AF1 +:10086000002AFFF631AF019B039A03F8012B0137F1 +:10087000EDE700BF002201207C230120602201203F +:10088000D5030008802301207822012004220120C2 +:10089000082201200C2201207C220120C820FFF721 +:1008A00085FD074600283FF40FAF1F2D11D8C5F175 +:1008B000200242450AAB25F0030028BF4246834987 +:1008C0000192184400F048FA019A8048FF2100F094 +:1008D00069FA4FEAA8037D490193C8F387022846C5 +:1008E00000F068FA064600283FF46DAF019B05EB67 +:1008F000830533E70220FFF759FD00283FF4E4AEFB +:1009000000F0A4F900283FF4DFAE0027B846704B92 +:100910009B68BB4218D91F2F11D80A9B01330ED0F8 +:1009200027F0030312AA134453F8203C05934046D2 +:10093000042205A900F0B6FA04378046E7E73846F6 +:1009400000F03AF90590F2E7CDF81480042105A8EB +:1009500000F006F902E70023642104A8049300F0E4 +:10096000F5F800287FF4B0AE0220FFF71FFD002845 +:100970003FF4AAAE049800F051F90590E6E7002391 +:10098000642104A8049300F0E1F800287FF49CAEF1 +:100990000220FFF70BFD00283FF496AE049800F00C +:1009A0004DF9EAE70220FFF701FD00283FF48CAE85 +:1009B00000F05CF9E1E70220FFF7F8FC00283FF4C3 +:1009C00083AE05A9142000F057F9042107460490CE +:1009D00004A800F0C5F83946B9E7322000F0A2F8C3 +:1009E000071EFFF671AEBB077FF46EAE384A926801 +:1009F00007EB090393423FF667AE0220FFF7D6FCF0 +:100A000000283FF461AE27F003074F44B9453FF497 +:100A1000A5AE484600F0D0F80421059005A800F0E6 +:100A20009FF809F10409F1E74FF47A70FFF7BEFC73 +:100A300000283FF449AE00F009F9002844D00A9B91 +:100A400001330BD008220AA9002000F0B3F90028D6 +:100A50003AD02022FF210AA800F0A4F9FFF7AEFC4B +:100A60001C4800F05FFF13B0BDE8F08F002E3FF48C +:100A70002BAE0BF00B030B2B7FF426AE002364216F +:100A800005A8059300F062F8074600287FF41CAE25 +:100A90000220FFF78BFC804600283FF415AEFFF7DD +:100AA0008DFC41F2883000F03DFF059800F0F8F928 +:100AB000464600F0C3F93C46A5E506464EE64FF033 +:100AC000000901E6BA467EE637467CE67C22012034 +:100AD00000220120A086010070B50F4B1B78013366 +:100AE000DBB2012B0C4611D80C4D29684FF47A73F8 +:100AF0000E6AA2FB0332014622462846B0478442D2 +:100B000004D1074B00221A70012070BD4FF4FA7017 +:100B100000F008FF0020F8E710220120282601201D +:100B2000B423012007B50023024601210DF107007F +:100B30008DF80730FFF7D0FF20B19DF8070003B014 +:100B40005DF804FB4FF0FF30F9E700000A4608B5F6 +:100B50000421FFF7C1FF80F00100C0B2404208BD90 +:100B600030B4054C2368DD69044B0A46AC460146A7 +:100B7000204630BC604700BF28260120A086010027 +:100B800070B501F0E3F9094E094D30800024286862 +:100B90003388834208D901F0D3F92B680444013328 +:100BA000B4F5C03F2B60F2D370BD00BFB623012067 +:100BB0008823012001F078BA00F1006000F5C03010 +:100BC0000068704700F10060920000F5C03001F04D +:100BD00003BA0000054B1A68054B1B889B1A834219 +:100BE00002D9104401F0ACB90020704788230120DD +:100BF000B623012038B5084D044629B128682044A1 +:100C0000BDE8384001F0BCB92868204401F0A0F9E3 +:100C10000028F3D038BD00BF8823012010F0030363 +:100C200009D1B0F5846F04D200F10050A0F5712015 +:100C30000368184670470023FBE7000000F10050EE +:100C4000A0F57120D0F8200470470000064991F803 +:100C5000243033B10023086A81F824300822FFF7DA +:100C6000B1BF0120704700BF8C230120014B1868E1 +:100C7000704700BF002004E0F0B51E4B1D6801382E +:100C80002E0C0A181C48C5F30B04032335460788AD +:100C9000A7420BD144680B46013C934218461BD235 +:100CA00014F9010F48B103F8010BF6E7013B00F11D +:100CB0000800ECD191420ED20B4618462C24B6F512 +:100CC000805F00F8014B0AD1824202D94122981C70 +:100CD0005A70401AF0BD0846B6F5805FF9D041F26F +:100CE00001039D42F5D18242F3D95A2300F8013B1A +:100CF000EFE700BF002004E014220120022802BF19 +:100D0000024B4FF000529A61704700BF000802404A +:100D1000022802BF024B4FF400529A61704700BF95 +:100D200000080240022801BF024A536983F40053BD +:100D3000536170470008024070B504464FF47A765C +:100D40004CB1412C254628BF412506FB05F000F09B +:100D5000E9FD641BF4E770BD10B50023934203D096 +:100D6000CC5CC4540133F9E710BD000010B5013864 +:100D700010F9013F3BB191F900409C4203D11AB1F7 +:100D80000131013AF4E71AB191F90020981A10BD27 +:100D90001046FCE703460246D01A12F9011B00294F +:100DA000FAD1704702440346934202D003F8011B74 +:100DB000FAE770472DE9F8431F4D144695F82420B3 +:100DC0000746884652BBDFF870909CB395F82430F4 +:100DD0002BB92022FF2148462F62FFF7E3FF95F849 +:100DE0002400C0F10802A24228BF2246D6B24146E2 +:100DF000920005EB8000FFF7AFFF95F82430A41BAD +:100E00001E44F6B2082E17449044E4B285F82460DC +:100E1000DBD1FFF71BFF0028D7D108E02B6A03EBDB +:100E200082038342CFD0FFF711FF0028CBD10020EF +:100E3000BDE8F8830120FBE78C230120024B1A78E0 +:100E4000024B1A70704700BFB4230120102201200A +:100E500010B5104C104800F0BBF821460E4800F0C9 +:100E6000E3F82468E26ED2F8043843F00203C2F8D3 +:100E700004384FF47A70FFF75FFF0849204600F00E +:100E8000E1F9E26ED2F8043823F00203C2F8043824 +:100E900010BD00BF58370008282601206037000821 +:100EA0007047000030B5094D0A4491420DD011F849 +:100EB000013B5840082340F30004013B2C4013F051 +:100EC000FF0384EA5000F6D1EFE730BD2083B8ED90 +:100ED00072B6302383F3118862B6704702684368A4 +:100EE0001143016003B118477047000013B5446B0C +:100EF000D4F894341A681178042915D1217C022978 +:100F000012D11979128901238B4013420CD101A906 +:100F100004F14C0001F090FFD4F89444019B217936 +:100F20000246206800F0DAF902B010BD143001F07A +:100F300015BF00004FF0FF33143001F00FBF000069 +:100F40004C3001F0E5BF00004FF0FF334C3001F0B2 +:100F5000DFBF0000143001F0E5BE00004FF0FF31AC +:100F6000143001F0DFBE00004C3001F0B1BF0000D2 +:100F70004FF0FF324C3001F0ABBF00000020704753 +:100F800010B5D0F894341A6811780429044617D1A2 +:100F9000017C022914D15979528901238B401342D3 +:100FA0000ED1143001F078FE024648B1D4F89444D2 +:100FB0004FF4807361792068BDE8104000F07CB97F +:100FC00010BD0000406BFFF7DBBF00007047000062 +:100FD0007FB5124B036000234360C0E90233012553 +:100FE00002260F4B057404460290019300F184021F +:100FF000294600964FF48073143001F029FE094B06 +:101000000294CDE9006304F523724FF480732946FE +:1010100004F14C0001F0ECFE04B070BDAC360008E9 +:10102000C50F0008ED0E000808B50A68FFF750FF6D +:101030000B7902EB830318624B790D3342F82300DE +:101040008B7913B102EB830210620223C0F894146F +:101050000374002080F3118808BD000038B5037FB9 +:10106000044613B190F85430ABB9201D012502217C +:10107000FFF734FF04F1140025776FF0010100F051 +:1010800079FC84F8545004F14C006FF00101BDE884 +:10109000384000F06FBC38BD10B501210446043063 +:1010A000FFF71CFF0023237784F8543010BD0000A5 +:1010B00038B504460025143001F0E2FD04F14C007F +:1010C000257701F0ADFE201D84F854500121FFF773 +:1010D00005FF2046BDE83840FFF752BF90F85C306E +:1010E00003F06003202B07D190F85D20212A4FF0F8 +:1010F000000303D81F2A06D800207047222AFBD1FC +:10110000C0E9143303E0034A0265072242658365A0 +:10111000012070472C22012037B5D0F894341A688A +:101120001178042904461AD1017C022917D11979B2 +:10113000128901238B40134211D100F14C0528463E +:1011400001F02CFF58B101A9284601F075FED4F832 +:101150009444019B21790246206800F0BFF803B057 +:1011600030BD0000F0B500EB810385B01E6A044677 +:101170000D46F6B104EB8507301D0821FFF7A8FEE8 +:10118000FFF7ACFEFB685B691B6806F14C001BB106 +:10119000019001F05FFE019803A901F04DFE0246A7 +:1011A00048B1039B2946204600F098F8002383F3BA +:1011B000118805B0F0BDFB685A691268002AF5D0A5 +:1011C0001B8A013B1340F1D104F15C02EAE7000005 +:1011D0000D3138B550F82140D4B1FFF779FED4F87D +:1011E00094241368527903EB8203DB689B695D6882 +:1011F00045B104216018FFF771FE294604F114007F +:1012000001F054FD2046FFF7BBFE002383F3118855 +:1012100038BD00007047000072B6302383F3118898 +:1012200062B6704701F08EB810B50123044628223B +:1012300000F8243B0021FFF7B5FD0023C4E901338A +:1012400010BD000038B50025FFF7E6FF0446C0E9F1 +:101250000355C0E90555C0E90755416001F082F822 +:101260000223237085F31188284638BD70B500EB42 +:10127000810305465069DA600E46144618B1102203 +:101280000021FFF78FFDA06918B110220021FFF7A0 +:1012900089FD31462846BDE8704001F02DB90000B7 +:1012A000826802F0011282600022C0E90422C0E9D3 +:1012B0000622026201F0ACB9F0B400EB8104478968 +:1012C000E4680125A4698D403D43458123600023E6 +:1012D000A2606360F0BC01F0C7B90000F0B400EB9D +:1012E00081040789E468012564698D403D430581D7 +:1012F00023600023A2606360F0BC01F043BA0000E9 +:1013000070B50223002504460370C0E90255C0E908 +:101310000455C0E906554566056280F84C5001F059 +:1013200087F863681B6823B129462046BDE87040F2 +:10133000184770BD0378052B10B504460AD080F815 +:1013400068300523037043681B680BB1042198477C +:101350000023A36010BD00000178052906D190F894 +:101360006820436802701B6803B11847704700008B +:1013700070B590F84C30044613B1002380F84C301F +:1013800004F15C02204601F065F963689B68B3B91B +:1013900094F85C3013F0600533D00021204601F052 +:1013A0001DFC0021204601F00FFC63681B6813B18F +:1013B000062120469847062384F84C3070BD20460D +:1013C00098470028E4D0B4F86230626D9A4288BF32 +:1013D000636594F95C30656D002B80F20281002D0D +:1013E00000F0F180092384F84C30FFF715FF00214D +:1013F000D4E914232046FFF771FF002383F31188FB +:10140000DCE794F85D2003F07F0343EA022340F217 +:101410000232934200F0C48021D8B3F5807F48D0D7 +:101420000DD8012B3FD0022B00F09280002BB4D1BD +:1014300004F16402226502226265A365C3E7B3F585 +:10144000817F00F09A80B3F5407FA6D194F85E309A +:10145000012BA2D1B4F8643043F0020332E0B3F5BB +:10146000006F4DD017D8B3F5A06F31D0A3F5C0638E +:10147000012B92D8636894F85E205E6894F85F1040 +:10148000B4F860302046B047002886D04368236512 +:10149000036863651AE0B3F5106F36D040F6024278 +:1014A00093427FF47AAF5B4B23650223636500238D +:1014B000C3E794F85E30012B7FF46FAFB4F864306B +:1014C00023F00203C4E91455A4F86430A5657AE753 +:1014D000B4F85C30B3F5A06F0ED194F85E3084F8A8 +:1014E0006630204600F0FCFF63681B6813B10121E1 +:1014F00020469847032323700023C4E914339CE754 +:1015000004F1670323650123C3E72378042B0FD17C +:101510002046FFF781FEFFF7C3FE85F31188032104 +:10152000636884F8675021701B680BB120469847A8 +:1015300094F85E30002BDFD084F8673004232370EA +:1015400063681B68002BD7D0022120469847D3E759 +:1015500094F860301D0603F00F0120460AD501F013 +:101560006BF8012804D002287FF417AF2A4B9BE7C1 +:101570002A4B99E701F052F8F3E794F85E30002B1C +:101580007FF40BAF94F8603013F00F01B4D01A065B +:10159000204602D501F036FBAEE701F029FBABE7B0 +:1015A00094F85E30002B7FF4F8AE94F8603013F0BE +:1015B0000F01A1D01B06204602D501F00FFB9BE7CF +:1015C00001F002FB98E7142384F84C30FFF724FE67 +:1015D0002A462B4629462046FFF76EFE85F31188E2 +:1015E000ECE65DB1152384F84C30FFF715FE0021C1 +:1015F000D4E914232046FFF75FFEFEE60B2384F8B0 +:101600004C30FFF709FE2A462B4629462046FFF7B5 +:1016100065FEE3E7DC360008D4360008D83600085B +:1016200038B590F84C300446002B3CD0063BDAB27B +:101630000F2A32D80F2B30D8DFE803F0352F2F08D0 +:1016400021302F2F2F2F2F2F2F2F3535456DB0F80D +:1016500062309D4213D2C3681B8AB5FBF3F203FBD1 +:10166000125565B9FFF7D8FD2A462B462946FFF7E4 +:1016700035FE85F311880A2384F84C300DE01423DD +:1016800084F84C30FFF7C8FD00231A46194620465F +:10169000FFF712FE002383F3118838BD836D03B179 +:1016A00098470023E8E70021204601F097FA00213F +:1016B000204601F089FA63681B6813B106212046B1 +:1016C00098470623D8E7000010B590F84C30142B4B +:1016D000044628D017D8062B05D001D81BB110BD61 +:1016E000093B022BFBD80021204601F077FA0021AC +:1016F000204601F069FA63681B6813B10621204691 +:101700009847062318E0152BE9D10B2380F84C30BD +:10171000FFF782FD00231A461946FFF7DFFD00237D +:1017200083F31188DBE7C3689B695B68002BD6D124 +:10173000836D03B19847002384F84C30CFE7000055 +:1017400000230375826803691B6899689142FBD284 +:101750005A68036042601060586070470023037548 +:10176000826803691B6899689142FBD85A680360D4 +:10177000426010605860704708B5084672B6302362 +:1017800083F3118862B60B7D032B05D0042B0DD09B +:101790002BB983F3118808BD8B6900221A604FF0C2 +:1017A000FF338361FFF7CCFF0023F2E7D1E900327A +:1017B00013605A60F3E70000FFF7C2BF054BD9681A +:1017C0000875186802681A60536001220275D860B3 +:1017D000FEF7A8BDB823012030B50C4BDD684B1CCB +:1017E00087B004460FD02B46094A684600F056F9E8 +:1017F0002046FFF7E3FF009B13B1684600F058F95D +:10180000A86907B030BDFFF7D9FFF9E7B823012079 +:1018100079170008044B1A68DB6890689B68984247 +:1018200094BF002001207047B8230120084B10B559 +:101830001C68D86822681A60536001222275DC6037 +:10184000FFF78CFF01462046BDE81040FEF76ABD59 +:10185000B823012038B5074C074908480123002563 +:101860002370656001F0D2FB0223237085F3118899 +:1018700038BD00BF20260120E4360008B82301202F +:1018800000F04CB9034A516853685B1A9842FBD880 +:10189000704700BF001000E072B6302383F3118858 +:1018A00062B670478B60022308618B8208467047DE +:1018B0008368A3F1840243F8142C026943F8442C92 +:1018C000426943F8402C094A43F8242CC26843F883 +:1018D000182C022203F80C2C002203F80B2C044ACB +:1018E00043F8102CA3F12000704700BF3D0300080F +:1018F000B823012008B5FFF7DBFFBDE80840FFF77C +:101900005BBF0000024BDB6898610F20FFF756BFFA +:10191000B823012008B5FFF7BFFFBDE80840FFF777 +:10192000F1BF000008B501460820FFF7B5FFFFF73B +:1019300053FF002383F3118808BD0000064BDB68CA +:1019400039B1426818605A60136043600420FFF7A1 +:1019500043BF4FF0FF307047B8230120036898421F +:1019600006D01A680260506099611846FFF724BFDC +:101970007047000038B504460D462068844200D107 +:1019800038BD036823605C608561FFF715FFF4E7ED +:1019900010B503689C68A2420CD85C688A600B6032 +:1019A0004C602160596099688A1A9A604FF0FF3341 +:1019B000836010BD1B68121BECE700000A2938BFCA +:1019C0000A2170B504460D460A26601901F018FB7D +:1019D00001F004FB041BA54203D8751C2E460446E7 +:1019E000F3E70A2E04D9BDE87040012001F04EBB98 +:1019F00070BD0000F8B5144B0D46D96103F110011C +:101A000041600A2A1969826038BF0A220160486071 +:101A10001861A818144601F0E5FA0A2701F0DEFA69 +:101A2000431BA342064606D37C1C281901F0E8FAA2 +:101A300027463546F2E70A2F04D9BDE8F8400120D1 +:101A400001F024BBF8BD00BFB8230120F8B506465D +:101A50000D4601F0C3FA0F4A134653F8107F9F4218 +:101A600006D12A4601463046BDE8F840FFF7C2BF1E +:101A7000D169BB68441A2C1928BF2C46A34202D94D +:101A80002946FFF79BFF224631460348BDE8F84050 +:101A9000FFF77EBFB8230120C823012010B4C0E99E +:101AA000032300235DF8044B4361FFF7CFBF000021 +:101AB00010B5194C236998420DD0D0E900328168E5 +:101AC00013605A609A680A449A60002303604FF0DA +:101AD000FF33A36110BD2346026843F8102F536003 +:101AE0000022026022699A4203D1BDE8104001F051 +:101AF00081BA936881680B44936001F06FFA2269A0 +:101B0000E1699268441AA242E4D91144BDE8104048 +:101B1000091AFFF753BF00BFB82301202DE9F04792 +:101B2000DFF8C08008F110072D4ED8F8105001F0F2 +:101B300055FAD8F81C40AA68031B9A4240D81444AE +:101B4000D5E900324FF00009C8F81C4013605A6014 +:101B5000C5F80090D8F81030B34201D101F04AFA2C +:101B600089F31188D5E903312846984772B63023A6 +:101B700083F3118862B66B69002BD6D001F02EFA80 +:101B80006A69A0EB04094A4582460DD2022001F0A1 +:101B90007DFA0022D8F81030B34208D151462846C9 +:101BA000BDE8F047FFF726BF121A2244F2E712EB16 +:101BB000090938BF4A4629463846FFF7E9FEB3E728 +:101BC000D8F81030B34208D01444211AC8F81C00C9 +:101BD000A960BDE8F047FFF7F1BEBDE8F08700BFA0 +:101BE000C8230120B823012000207047FEE7000031 +:101BF000704700004FF0FF307047000072B630238E +:101C000083F3118862B6704702290CD0032904D0EF +:101C10000129074818BF00207047032A05D8054846 +:101C200000EBC2007047044870470020704700BFB7 +:101C3000BC3700083C2201207037000870B59AB00C +:101C40000546084601A9144600F0BEF801A8FFF7B2 +:101C5000A1F8431C5B00C5E9003400222370032374 +:101C60006370C6B201AB02341046D1B28E4204F1A9 +:101C7000020401D81AB070BD13F8011B04F8021C4D +:101C800004F8010C0132F0E708B50448FFF7B6FF8D +:101C9000FFF742FA002383F3118808BD28260120AC +:101CA00090F85C3003F01F02012A07D190F85D2004 +:101CB0000B2A03D10023C0E9143315E003F06003BD +:101CC000202B08D1B0F860302BB990F85D20212A84 +:101CD00003D81F2A04D8FFF701BA222AEBD0FAE76B +:101CE000034A02650722426583650120704700BFF1 +:101CF0003322012007B5052916D8DFE801F01815B1 +:101D00000318181E104A0121FFF778FF0190FFF712 +:101D1000ADFA01980D4A0221FFF7A8FA0C48FFF727 +:101D2000C7F9002383F3118803B05DF804FB08486A +:101D3000FFF764FFFFF792F9F3E70548FFF75EFF4F +:101D4000FFF7AAF9EDE700BF1037000834370008A5 +:101D50002826012038B50C4D0C4C0D492A4604F1BB +:101D60000800FFF76BFF05F1CA0204F110000949F2 +:101D7000FFF764FF05F5CA7204F118000649BDE8D3 +:101D80003840FFF75BBF00BFF02A01203C22012052 +:101D9000F0360008FA3600080537000870B504462A +:101DA00008460D46FEF7F6FFC6B22046013403781A +:101DB0000BB9184670BD32462946FEF7D7FF0028FA +:101DC000F3D10120F6E700002DE9F04705460C4667 +:101DD000FEF7E0FF2B49C6B22846FFF7DFFF08B148 +:101DE0000636F6B228492846FFF7D8FF08B1103664 +:101DF000F6B2632E0BD8DFF88C80DFF88C90234F7F +:101E0000DFF894A02E7846B92670BDE8F087294601 +:101E10002046BDE8F04701F02BBC252E2ED107222D +:101E200041462846FEF7A2FF70B9194B224603F13E +:101E30000C0153F8040B42F8040B8B42F9D11B78C8 +:101E4000137007350D34DDE7082249462846FEF7B2 +:101E50008DFF98B90F4BA21C197809090232C95D90 +:101E600002F8041C13F8011B01F00F015345C95D72 +:101E700002F8031CF0D118340835C3E704F8016BED +:101E80000135BFE7DC37000805370008F2370008E6 +:101E9000E437000820F4F01F2CF4F01FBFF34F8F3D +:101EA000024AD368DB03FCD4704700BF003C024009 +:101EB00008B5074B1B7853B9FFF7F0FF054B1A69BC +:101EC000002ABFBF044A5A6002F188325A6008BD36 +:101ED0004E2D0120003C02402301674508B5054B0B +:101EE0001B7833B9FFF7DAFF034A136943F0004365 +:101EF000136108BD4E2D0120003C02400728F0B5BB +:101F000016D80C4C0C4923787BB90C4D0E4608238F +:101F10004FF0006255F8047B46F8042B013B13F0A8 +:101F2000FF033A44F6D10123237051F82000F0BD9D +:101F30000020FCE7702D0120502D012004380008FE +:101F4000014B53F820007047043800080820704700 +:101F5000072810B5044601D9002010BDFFF7CEFFB9 +:101F6000064B53F824301844C21A0BB90120F4E789 +:101F700012680132F0D1043BF6E700BF04380008D4 +:101F8000072810B5044621D8FFF788FFFFF790FF18 +:101F90000F4AF323D360C300DBB243F4007343F072 +:101FA00002031361136943F480331361FFF776FF73 +:101FB000FFF7A4FF074B53F8241000F0D9F8FFF700 +:101FC0008DFF2046BDE81040FFF7C2BF002010BDC6 +:101FD000003C024004380008F8B512F00103144632 +:101FE00042D18218B2F1016F57D82D4B1B6813F004 +:101FF000010352D02B4DFFF75BFFF323EB60FFF79C +:102000004DFF40F20127032C15D824F00104661877 +:10201000244C401A40F20117B142236900EB01053C +:1020200024D123F001032361FFF758FF0120F8BDFD +:10203000043C0430E7E78307E7D12B6923F44073BE +:102040002B612B693B432B6151F8046B0660BFF396 +:102050004F8FFFF723FF03689E42E9D02B6923F0DF +:1020600001032B61FFF73AFF0020E0E723F4407300 +:10207000236123693B4323610B882B80BFF34F8F80 +:10208000FFF70CFF2D8831F8023BADB2AB42C3D055 +:10209000236923F001032361E4E71846C7E700BF83 +:1020A00000380240003C0240084908B50B7828B1CE +:1020B0001BB9FFF7FDFE01230B7008BD002BFCD000 +:1020C000BDE808400870FFF709BF00BF4E2D012092 +:1020D00010B50244064BD2B2904200D110BD441C50 +:1020E00000B253F8200041F8040BE0B2F4E700BF5F +:1020F000502800400F4B30B51C6F240407D41C6FD0 +:1021000044F400741C671C6F44F400441C670A4CC0 +:10211000236843F4807323600244084BD2B2904298 +:1021200000D130BD441C00B251F8045B43F820508C +:10213000E0B2F4E700380240007000405028004050 +:1021400007B5012201A90020FFF7C2FF019803B0E3 +:102150005DF804FB13B50446FFF7F2FFA04205D07B +:10216000012201A900200194FFF7C4FF02B010BDB5 +:102170000144BFF34F8F064B884204D3BFF34F8F08 +:10218000BFF36F8F7047C3F85C022030F4E700BFE5 +:1021900000ED00E0034B1A681AB9034AD2F874281C +:1021A0001A607047742D01200030024008B5FFF717 +:1021B000F1FF024B1868C0F3407008BD742D012078 +:1021C00070B5BFF34F8FBFF36F8F1A4A0021C2F86B +:1021D0005012BFF34F8FBFF36F8F536943F4003337 +:1021E0005361BFF34F8FBFF36F8FC2F88410BFF3FB +:1021F0004F8FD2F88030C3F3C900C3F34E335B0175 +:1022000043F6E07403EA0406014646EA81750139A3 +:10221000C2F86052F9D2203B13F1200FF2D1BFF384 +:102220004F8F536943F480335361BFF34F8FBFF334 +:102230006F8F70BD00ED00E0FEE7000070B5214B30 +:102240002148224A904237D3214BDA1C121AC11E70 +:1022500022F003028B4238BF00220021FEF7A2FDCC +:102260001C4A0023C2F88430BFF34F8FD2F880306D +:10227000C3F3C900C3F34E335B0143F6E07403EAD2 +:102280000406014646EA81750139C2F86C52F9D25A +:10229000203B13F1200FF2D1BFF34F8FBFF36F8FAD +:1022A000BFF34F8FBFF36F8F0023C2F85032BFF3DD +:1022B0004F8FBFF36F8F70BD53F8041B40F8041BA2 +:1022C000C0E700BFF4390008882E0120882E0120C5 +:1022D000882E012000ED00E070B5D0E91B439E6818 +:1022E00000224FF0FF3504EB42135101D3F80009EF +:1022F0000028BEBFD3F8000940F08040C3F80009B1 +:10230000D3F8000B0028BEBFD3F8000B40F080408C +:10231000C3F8000B013263189642C3F80859C3F89A +:10232000085BE0D24FF00113C4F81C3870BD000008 +:10233000890141F02001016103699B06FCD4122050 +:10234000FFF7A0BA10B5054C2046FEF76DFF4FF021 +:10235000A043E366024B236710BD00BF782D012028 +:102360004838000870B50378012B054650D12A4B38 +:10237000C46E98421BD1294B5A6B42F080025A63BB +:102380005A6D42F080025A655A6D5A6942F08002D5 +:102390005A615A6922F080025A610E2143205B691A +:1023A00000F03AFC1E4BE3601E4BC4F800380023DB +:1023B000C4F8003EC0232360EE6E4FF40413A36301 +:1023C0003369002BFCDA012333610C20FFF75AFA42 +:1023D0003369DB07FCD41220FFF754FA3369002B72 +:1023E000FCDA0026A6602846FFF776FF6B68C4F883 +:1023F0001068DB68C4F81468C4F81C684BB90A4B51 +:10240000A3614FF0FF336361A36843F00103A3604E +:1024100070BD064BF4E700BF782D01200038024064 +:102420004014004003002002003C30C0083C30C093 +:10243000F8B5C46E054600212046FFF779FF296FE5 +:1024400000234FF001128F68C4F834384FF0006653 +:10245000C4F81C284FF0FF3004EB431201339F42B5 +:10246000C2F80069C2F8006BC2F80809C2F8080B8C +:10247000F2D20B68EA6E6B67636210231361166910 +:1024800016F01006FBD11220FFF7FCF9D4F8003843 +:1024900023F4FE63C4F80038A36943F4402343F0F7 +:1024A0001003A3610923C4F81038C4F814380A4B88 +:1024B000EB604FF0C043C4F8103B084BC4F8003B3E +:1024C000C4F81069C4F800396B6F03F1100243F4CB +:1024D00080136A67A362F8BD2438000840800010AA +:1024E000C26E90F86610D2F8003823F4FE6343EA17 +:1024F0000113C2F8003870472DE9F84300EB81035F +:10250000C56EDA68166806F00306731E022B05EB2B +:1025100041130C4680460FFA81F94FEA41104FF003 +:102520000001C3F8101B4FF0010104F1100398BF24 +:10253000B60401FA03F391698EBF334E06F180565B +:1025400006F5004600293AD0578A04F1580149019E +:1025500037436F50D5F81C180B43C5F81C382B189F +:102560000021C3F8101953690127611EA7409BB3CE +:10257000138A928B9B08012A88BF5343D8F8742092 +:10258000981842EA034301F1400205EB8202C8F8C1 +:102590007400214653602846FFF7CAFE08EB890005 +:1025A000C3681B8A43EA8453483464011E432E5196 +:1025B000D5F81C381F43C5F81C78BDE8F88305EB37 +:1025C0004917D7F8001B21F40041C7F8001BD5F8C4 +:1025D0001C1821EA0303C0E704F13F0305EB830362 +:1025E0000A4A5A6028462146FFF7A2FE05EB491029 +:1025F000D0F8003923F40043C0F80039D5F81C386E +:1026000023EA0707D7E700BF00800010000400029C +:10261000026F12684267FFF75FBE00005831C36E59 +:1026200049015B5813F4004004D013F4001F0CBFA1 +:1026300002200120704700004831C36E49015B58F9 +:1026400013F4004004D013F4001F0CBF022001203B +:102650007047000000EB8101CB68196A0B681360BA +:102660004B6853607047000000EB810330B5DD68B4 +:10267000AA691368D36019B9402B84BF4023136043 +:102680006B8A1468C26E1C44013CB4FBF3F46343D0 +:10269000033323F0030302EB411043EAC44343F046 +:1026A000C043C0F8103B2B6803F00303012B09B2B1 +:1026B0000ED1D2F8083802EB411013F4807FD0F825 +:1026C000003B14BF43F0805343F00053C0F8003B7D +:1026D00002EB4112D2F8003B43F00443C2F8003B46 +:1026E00030BD00002DE9F041254DEE6E06EB4013A4 +:1026F0000446D3F8087BC3F8087B38070AD5D6F818 +:102700001438190706D505EB84032146DB682846F3 +:102710005B689847FA0721D5D6F81438DB071DD532 +:1027200005EB8403D968DCB98B69488A5A68B2FB27 +:10273000F0F600FB16229AB91868DA6890420FD2B8 +:10274000121AC3E9002472B6302383F3118862B6EB +:102750000B482146FFF788FF84F31188BDE8F0811C +:10276000012303FA04F26B8923EA02036B81CB682D +:10277000002BF3D021460248BDE8F041184700BFC6 +:10278000782D012000EB810370B5DD68C36E6C69A4 +:102790002668E6604A0156BB1A444FF40020C2F88E +:1027A00010092A6802F00302012A0AB20ED1D3F8F6 +:1027B000080803EB421410F4807FD4F8000914BF1A +:1027C00040F0805040F00050C4F8000903EB421282 +:1027D000D2F8000940F00440C2F80009D3F83408E8 +:1027E000012202FA01F10143C3F8341870BD19B98E +:1027F000402E84BF4020206020682E8A8419013C2E +:10280000B4FBF6F440EAC44040F000501A44C6E776 +:102810002DE9F8433C4DEE6E06EB40130446D3F829 +:102820000889C3F8088918F0010F4FEA40171CD037 +:10283000D6F81038DB0718D505EB8003D9684B694B +:102840001868DA68904232D2121A4FF000091A6002 +:10285000C3F8049072B6302383F3118862B6214620 +:102860002846FFF78FFF89F3118818F0800F1CD0DE +:10287000D6F834380126A640334216D005EB84033F +:10288000ED6ED3F80CC0DCF814200134E4B2D2F8B9 +:1028900000E005EB04342F445168714515D3D5F899 +:1028A000343823EA0606C5F83468BDE8F883012306 +:1028B00003FA04F22B8923EA02032B818B68002B95 +:1028C000D3D0214628469847CFE7BCF81000AEEB9E +:1028D0000103834228BF0346D7F8180980B2B3EB3F +:1028E000800FE2D89068A0F1040959F8048FC4F869 +:1028F0000080A0EB09089844B8F1040FF5D81844FB +:102900000B4490605360C7E7782D01202DE9F74F05 +:10291000AC4CE56E6E69AB691E4016F480586E6172 +:1029200007D02046FEF7ECFC03B0BDE8F04F00F006 +:102930006BBC002E12DAD5F8003EA2489B071EBFE2 +:10294000D5F8003E23F00303C5F8003ED5F804385F +:1029500023F00103C5F80438FEF7FEFC370505D562 +:102960009848FFF7B9FC9748FEF7E4FCB0040CD593 +:10297000D5F8083813F0060FEB6823F470530CBF3A +:1029800043F4105343F4A053EB6031071BD5636845 +:10299000DB681BB9AB6923F00803AB612378052B17 +:1029A0000CD1D5F8003E87489A071EBFD5F8003EE7 +:1029B00023F00303C5F8003EFEF7CEFC6368DB6836 +:1029C0000BB180489847F30200F18980B70227D500 +:1029D000D4F86C90DFF8ECB100274FF0010A09EB56 +:1029E0004712D2F8003B03F44023B3F5802F11D1F6 +:1029F000D2F8003B002B0DDA62890AFA07F322EACB +:102A00000303638104EB8703DB68DB6813B139469A +:102A100058469847236F01379B68FFB29F42DED923 +:102A2000F00617D5E76E3A6AC2F30A1002F00F03F8 +:102A300002F4F012B2F5802F00F09980B2F5402F29 +:102A400008D104EB83030022DB681B6A07F580577B +:102A500090427ED13303D5F818481DD5E70302D53F +:102A60000020FFF73FFEA50302D50120FFF73AFE45 +:102A7000600302D50220FFF735FE210302D50320B3 +:102A8000FFF730FEE20202D50420FFF72BFEA3027F +:102A900002D50520FFF726FE77037FF545AFE60751 +:102AA00002D50020FFF7B4FEA50702D50120FFF7ED +:102AB000AFFE600702D50220FFF7AAFE210702D56C +:102AC0000320FFF7A5FEE20602D50420FFF7A0FED3 +:102AD000A3067FF529AF0520FFF79AFE24E7E36EF2 +:102AE000DFF8E0A0019300274FF00109236F9B68F6 +:102AF0005FFA87FB9B453FF669AF019B03EB4B13E6 +:102B0000D3F8001901F44021B1F5802F1FD1D3F87B +:102B1000001900291BDAD3F8001941F09041C3F8DD +:102B20000019D3F800190029FBDB5946E06EFFF7C6 +:102B3000FFFB218909FA0BF321EA0303238104EB4C +:102B40008B03DB689B6813B15946504698470137A1 +:102B5000CCE7910708BFD7F80080072A98BF03F891 +:102B6000018B02F1010298BF4FEA182870E7023387 +:102B700004EB830207F580575268D2F818C0DCF8DE +:102B80000820DCE9001CA1EB0C0C002188420AD1D2 +:102B900004EB830463689B699A6802449A605A68EC +:102BA00002445A6056E711F0030F08BFD7F80080BF +:102BB0008C4588BF02F8018B01F1010188BF4FEA03 +:102BC0001828E3E7782D0120C36E03EB4111D1F8FB +:102BD000003B43F40013C1F8003B7047C36E03EBA6 +:102BE0004111D1F8003943F40013C1F8003970479E +:102BF000C36E03EB4111D1F8003B23F40013C1F87D +:102C0000003B7047C36E03EB4111D1F8003923F448 +:102C10000013C1F80039704700F1604303F56143C8 +:102C20000901C9B283F80013012200F01F039A4082 +:102C300043099B0003F1604303F56143C3F880211E +:102C40001A60704772B6302383F3118862B67047FA +:102C500030B5039C0172043304FB0325C0E906531D +:102C6000049B03630021059BC160C0E90000C0E92B +:102C70000422C0E90842C0E90A11436330BD0000E4 +:102C8000416A0022C0E90411C0E90A22C2606FF063 +:102C90000101FEF76FBE0000D0E90432934201D17A +:102CA000C2680AB9181D704700207047036919608F +:102CB000C2680132C260C2691344826903619342EF +:102CC00024BF436A03610021FEF748BE38B50446BD +:102CD0000D46E3683BB16269131D1268A362134499 +:102CE000E362002007E0237A33B929462046FEF745 +:102CF00025FE0028EDDA38BD6FF00100FBE700008B +:102D0000C368C269013BC36043691344826943617C +:102D1000934224BF436A436100238362036B03B180 +:102D20001847704770B5FFF78DFF866A04463EB9B5 +:102D3000FFF7CCFF054618B186F31188284670BD11 +:102D4000A36AE26A13F8015BA362934202D32046AE +:102D5000FFF7D6FF002383F31188EFE72DE9F04753 +:102D60009846FFF76FFF002504460E461746A94612 +:102D7000D4F828A0BAF1000F09D141462046FFF748 +:102D8000A5FF20B18AF311882846BDE8F087D4E971 +:102D90000A12A7EB050A521A924528BF9246BAF1C9 +:102DA000400F1BD9334601F1400251F8040B43F8A0 +:102DB000040B9142F9D1A36A40334036A3624035F7 +:102DC000D4E90A239A4202D32046FFF799FF89F3F8 +:102DD0001188BD42D8D2FFF735FFC9E730465246C9 +:102DE000FDF7BAFFA36A53445644A3625544E7E78C +:102DF00010B5029C0172043303FB0421C0E90613E1 +:102E00000023C0E90A33039B0363049BC460C0E949 +:102E10000000C0E90422C0E90842436310BD00007D +:102E2000026AC260426AC0E904220022C0E90A22A2 +:102E30006FF00101FEF79EBDD0E904239A4201D153 +:102E4000C26822B9184650F8043B0B607047002353 +:102E50001846FAE7C368C2690133C3604369134483 +:102E600082694361934224BF436A43610021FEF7B4 +:102E700075BD000038B504460D46E3683BB12369D3 +:102E80001A1DA262E2691344E362002007E0237A7C +:102E900033B929462046FEF751FD0028EDDA38BD4A +:102EA0006FF00100FBE7000003691960C268013A96 +:102EB000C260C269134482690361934224BF436ABA +:102EC000036100238362036B03B11847704700005E +:102ED00070B5FFF7B7FE866A0D46044611462EB957 +:102EE000FFF7C8FF10B186F3118870BDA36A1D708B +:102EF000A36AE26A01339342A36204D3E1692046E4 +:102F00000439FFF7D1FF002080F31188EDE70000BE +:102F10002DE9F0479946FFF795FE002604460D4639 +:102F20009046B246A76A4FB949462046FFF7A2FF2E +:102F300020B187F311883046BDE8F087D4E90A074D +:102F40003A1AA8EB0607974228BF1746402F1BD90D +:102F500005F1400355F8042B40F8042B9D42F9D1AC +:102F6000A36A4033A3624036D4E90A239A4204D3C9 +:102F7000E16920460439FFF797FF8AF31188464537 +:102F8000D9D2FFF75FFECDE729463A46FDF7E4FECA +:102F9000A36A3B443D44A3623E44E5E7D0E90423F1 +:102FA0009A4217D1C3689BB1836A8BB1043B9B1AC9 +:102FB0000ED01360C368013BC360C3691A448369C0 +:102FC00002619A4224BF436A0361002383620123A2 +:102FD000184670470023FBE700F042B94FF08043EA +:102FE000586A70474FF08043002258631A610222EA +:102FF000DA6070474FF080430022DA6070470000CB +:103000004FF0804358637047FEE7000070B51B4BDC +:1030100001630025044686B0586085620E4600F0C4 +:10302000CBF804F11003C4E904334FF0FF33C4E9D3 +:103030000635C4E90044A560E562FFF7CFFF2B46E3 +:103040000246C4E9082304F134010D4A25658023B2 +:103050002046FEF727FC0123E0600A4A0375009230 +:1030600072680192B268CDE90223074B6846CDE948 +:103070000435FEF73FFC06B070BD00BF20260120DE +:10308000543800085938000809300008024AD36A49 +:103090001843D062704700BFB82301204B684360DB +:1030A0008B688360CB68C3600B6943614B690362C3 +:1030B0008B6943620B6803607047000008B52C4BB6 +:1030C0002C481A6940F2FF710A431A611A6922F406 +:1030D000FF6222F007021A611A691A6B0A431A6327 +:1030E0001A6D0A431A65244A1B6D1146FFF7D6FF75 +:1030F00002F11C0100F58060FFF7D0FF02F13801FA +:1031000000F58060FFF7CAFF02F1540100F580600E +:10311000FFF7C4FF02F1700100F58060FFF7BEFF0A +:1031200002F18C0100F58060FFF7B8FF02F1A80101 +:1031300000F58060FFF7B2FF02F1C40100F5806086 +:10314000FFF7ACFF02F1E00100F58060FFF7A6FF9A +:1031500002F1FC0100F58060FFF7A0FF02F58C7121 +:1031600000F58060FFF79AFFBDE8084000F0EEB878 +:1031700000380240000002406038000808B500F046 +:1031800059FAFEF767FBFFF705F8BDE80840FEF7C0 +:10319000E1BD000070470000EFF3098305494A6B69 +:1031A00022F001024A63683383F30988002383F322 +:1031B0001188704700EF00E0302080F3118862B67C +:1031C0000D4B0E4AD96821F4E0610904090C0A4349 +:1031D000DA60D3F8FC200A4942F08072C3F8FC2080 +:1031E000084AC2F8B01F116841F0010111602022A5 +:1031F000DA7783F82200704700ED00E00003FA055B +:1032000055CEACC5001000E010B572B6302383F384 +:10321000118862B60E4B5B6813F4006314D0F1EEB4 +:10322000103AEFF30984683C4FF08073E361094B77 +:10323000DB6B236684F30988FEF7ECFA10B1064BCA +:10324000A36110BD054BFBE783F31188F9E700BFCD +:1032500000ED00E000EF00E04F030008520300081B +:103260000F4B1A6C42F001021A641A6E42F001020E +:103270001A660C4A1B6E936843F0010393604FF08B +:1032800080436B229A624FF0FF32DA6200229A6129 +:103290005A63DA605A6001225A611A60704700BFAF +:1032A00000380240002004E04FF0804208B5116968 +:1032B000D3680B40D9B2C9439B07116109D572B6D7 +:1032C000302383F3118862B6FEF7DAFA002383F322 +:1032D000118808BD1B4B1A696FEA42526FEA5252BD +:1032E0001A611A69C2F30A021A614FF0FF301A69B3 +:1032F0005A69586100215A6959615A691A6A62F01B +:1033000080521A621A6A02F080521A621A6A5A6A63 +:1033100058625A6A59625A6A0B4A106840F48070BF +:103320001060186F00F44070B0F5007F1EBF4FF4BE +:10333000803018671967536823F40073536000F0F6 +:1033400055B900BF0038024000700040374B4FF0C5 +:1033500080521A64364A4FF4404111601A6842F0B4 +:1033600001021A601A689207FCD59A6822F00302DB +:103370009A602E4B9A6812F00C02FBD1196801F08A +:10338000F90119609A601A6842F480321A601A686A +:103390009003FCD55A6F42F001025A67234B5A6FD3 +:1033A0009107FCD5234A5A601A6842F080721A606D +:1033B0001F4B5A685204FCD51A6842F480321A60D6 +:1033C0005A68D003FCD51A6842F400321A60184AD1 +:1033D00053689903FCD5154B1A689201FCD5164A1F +:1033E0009A6040F20112C3F88C200022C3F89020AA +:1033F000124A40F207331360136803F00F03072BE0 +:10340000FAD10A4B9A6842F002029A609A6802F076 +:103410000C02082AFAD15A6C42F480425A645A6E5D +:1034200042F480425A665B6E704700BF003802402B +:1034300000700040086C400900948838003C02404D +:10344000074A08B5536903F00103536123B1054AE4 +:1034500013680BB150689847BDE80840FFF7D4BE29 +:10346000003C0140082E0120074A08B5536903F0CB +:103470000203536123B1054A93680BB1D0689847A2 +:10348000BDE80840FFF7C0BE003C0140082E012007 +:10349000074A08B5536903F00403536123B1054A91 +:1034A00013690BB150699847BDE80840FFF7ACBEFF +:1034B000003C0140082E0120074A08B5536903F07B +:1034C0000803536123B1054A93690BB1D06998474A +:1034D000BDE80840FFF798BE003C0140082E0120DF +:1034E000074A08B5536903F01003536123B1054A35 +:1034F000136A0BB1506A9847BDE80840FFF784BED5 +:10350000003C0140082E0120164B10B55C6904F404 +:1035100078725A61A30604D5134A936A0BB1D06A34 +:103520009847600604D5104A136B0BB1506B98474F +:10353000210604D50C4A936B0BB1D06B9847E2057A +:1035400004D5094A136C0BB1506C9847A30504D5F8 +:10355000054A936C0BB1D06C9847BDE81040FFF75B +:1035600053BE00BF003C0140082E0120194B10B58E +:103570005C6904F47C425A61620504D5164A136DF5 +:103580000BB1506D9847230504D5134A936D0BB1C9 +:10359000D06D9847E00404D50F4A136E0BB1506EFE +:1035A0009847A10404D50C4A936E0BB1D06E98478E +:1035B000620404D5084A136F0BB1506F9847230477 +:1035C00004D5054A936F0BB1D06F9847BDE8104002 +:1035D000FFF71ABE003C0140082E012008B5FFF796 +:1035E00063FEBDE80840FFF70FBE0000062108B5E6 +:1035F0000846FFF711FB06210720FFF70DFB062108 +:103600000820FFF709FB06210920FFF705FB06212B +:103610000A20FFF701FB06211720FFF7FDFA06211C +:103620002820FFF7F9FABDE8084007211C20FFF722 +:10363000F3BA000008B5FFF74DFE00F00BF8FDF7F8 +:10364000F1FDFDF7C3FCFFF7A5FDBDE80840FFF75E +:10365000C3BC00000023054A19460133102BC2E900 +:10366000001102F10802F8D1704700BF082E0120B6 +:10367000034611F8012B03F8012B002AF9D17047FA +:1036800053544D3332463F3F3F3F3F3F0053544D2D +:10369000333246375B347C355D780053544D3332DA +:1036A00046375B367C375D78000000000000000084 +:1036B000490F0008350F0008710F00085D0F000862 +:1036C000690F0008550F0008410F00082D0F000872 +:1036D0007D0F000800000000010000000000000055 +:1036E00063300000E036000810240120202601206D +:1036F0004172647550696C6F740025424F415244A9 +:10370000252D424C002553455249414C25000000CF +:10371000020000000000000065110008D11100083F +:1037200040004000C02A0120D02A012002000000F1 +:103730000000000003000000000000001512000857 +:103740000000000010000000E02A0120000000003E +:103750000100000000000000782D0120010102009E +:10376000F51C0008091C0008A11C0008891C0008A1 +:10377000430000007837000809024300020100C03E +:1037800032090400000102020100052400100105B5 +:103790002401000104240202052406000107058219 +:1037A000030800FF09040100020A000000070501E8 +:1037B00002400000070581024000000012000000E6 +:1037C000C4370008120110010200004009124157DD +:1037D00000020102030100000403090425424F41D5 +:1037E00052442500474550524346373435425448E9 +:1037F000440030313233343536373839414243446E +:1038000045460000008000000080000000800000AD +:10381000008000000000020000000400000004001E +:1038200000000400000000007113000821160008C9 +:10383000C916000840004000F02D0120F02D0120A5 +:1038400001000000002E0120800000004001000067 +:10385000050000006D61696E0069646C6500000020 +:103860000001806A00000000AAAAAAAA0001006460 +:10387000FFFF00000000000000A00A000505000195 +:1038800000000000AAAAAAAA00000001CCFF0000C4 +:10389000000000000000000000000504000000001F +:1038A000AAAAAAAA00000000FFDC00000000000095 +:1038B000000000001000000500000000AAAAAAAA4B +:1038C00020000000FBCF000000000000000000000E +:1038D0000001000000000000AAAAAAAA000100003E +:1038E000FFFF0000000000000000000000000000DA +:1038F00000000000AAAAAAAA00000000FFFF000022 +:1039000000000000000000000000000000000000B7 +:10391000AAAAAAAA00000000FFFF00000000000001 +:103920000000000000000000000000000A0000008D +:103930000000000003000000000000000000000084 +:103940000000000000000000000000000000000077 +:103950000000000000000000000000000000000067 +:103960000000000000000000000000000000000057 +:103970000000000000000000000000000000000047 +:103980000000000000000000000000000000000037 +:103990000000000000000000DD0500000000000045 +:1039A00000800E0000000000FF000000000000008A +:1039B00080360008490400008D36000851040000DC +:1039C0009B360008009600000000080096000000EA +:1039D0000008000004000000D837000800000000C4 +:1039E00000000000000000000000000000000000D7 +:0439F00000000000D3 +:00000001FF diff --git a/Tools/bootloaders/Here4AP_bl.bin b/Tools/bootloaders/Here4AP_bl.bin index be76f1f481..e232031b40 100755 Binary files a/Tools/bootloaders/Here4AP_bl.bin and b/Tools/bootloaders/Here4AP_bl.bin differ diff --git a/Tools/bootloaders/Here4FC_bl.bin b/Tools/bootloaders/Here4FC_bl.bin index b84daeaa0e..7b39428c8d 100755 Binary files a/Tools/bootloaders/Here4FC_bl.bin and b/Tools/bootloaders/Here4FC_bl.bin differ diff --git a/Tools/bootloaders/Here4FC_bl.hex b/Tools/bootloaders/Here4FC_bl.hex index 3d421f5cea..6d4de6555f 100644 --- a/Tools/bootloaders/Here4FC_bl.hex +++ b/Tools/bootloaders/Here4FC_bl.hex @@ -1,29 +1,29 @@ :020000040800F2 -:1000000000070020F102000849330008013300080E -:10001000293300080133000821330008F3020008E7 -:10002000F3020008F3020008F30200082D43000861 +:1000000000070020F1020008E133000899330008DE +:10001000C133000899330008B9330008F30200081F +:10002000F3020008F3020008F3020008CD430008C1 :10003000F3020008F3020008F3020008F3020008CC :10004000F3020008F3020008F3020008F3020008BC -:10005000F3020008F30200084D5F0008795F000812 -:10006000A55F0008D15F0008FD5F0008F1430008AC -:100070001944000845440008714400089D440008E4 -:10008000C5440008F1440008F3020008B13200083A -:10009000D9320008C5320008ED3200082960000896 +:10005000F3020008F302000881640008AD640008A0 +:10006000D96400080565000831650008914400085E +:10007000B9440008E5440008114500083D45000862 +:100080006545000891450008F3020008493300085F +:10009000713300085D330008853300085D65000892 :1000A000F3020008F3020008F3020008F30200085C :1000B000F3020008F3020008F3020008F30200084C :1000C000F3020008F3020008F3020008F30200083C -:1000D000F302000801610008F3020008F3020008BF -:1000E0008D600008F3020008F3020008F302000824 -:1000F000F3020008F3020008F30200081D4500089F -:10010000F3020008F302000829610008F302000866 +:1000D000F302000835660008F3020008F302000886 +:1000E000C1650008F3020008F3020008F3020008EB +:1000F000F3020008F3020008F3020008BD450008FF +:10010000F3020008F30200085D660008F30200082D :10011000F3020008F3020008F3020008F3020008EB -:1001200049450008714500089D450008C94500087B -:10013000F5450008F3020008F3020008F302000886 +:10012000E9450008114600083D46000869460008F8 +:1001300095460008F3020008F3020008F3020008E5 :10014000F3020008F3020008F3020008F3020008BB -:100150001D4600084946000875460008F3020008DD +:10015000BD460008E946000815470008F3020008FC :10016000F3020008F3020008F3020008F30200089B :10017000F3020008F3020008F3020008F30200088B -:10018000F3020008F3020008F302000815610008FA +:10018000F3020008F3020008F302000849660008C1 :10019000F3020008F3020008F3020008F30200086B :1001A000F3020008F3020008F3020008F30200085B :1001B000F3020008F3020008F3020008F30200084B @@ -52,50 +52,50 @@ :100320004F8FBFF36F8F40F20000C0F2F0004EF627 :100330008851CEF200010860BFF34F8FBFF36F8F7B :100340004FF00000E1EE100A4EF63C71CEF20001D3 -:100350000860062080F31488BFF36F8F05F0C6FA9B -:1003600005F0C8FB4FF055301F491B4A91423CBF76 +:100350000860062080F31488BFF36F8F05F020FC3F +:1003600005F05CFE4FF055301F491B4A91423CBFDF :1003700041F8040BFAE71D49184A91423CBF41F885 :10038000040BFAE71A491B4A1B4B9A423EBF51F82D :10039000040B42F8040BF8E700201849184A914270 -:1003A0003CBF41F8040BFAE705F0DEFA05F024FC47 +:1003A0003CBF41F8040BFAE705F038FC05F0BCFE51 :1003B000144C154DAC4203DA54F8041B8847F9E796 :1003C00000F042F8114C124DAC4203DA54F8041B11 -:1003D0008847F9E705F0C6BA00070020002300208F +:1003D0008847F9E705F020BC000700200023002033 :1003E0000000000808ED00E00001002000070020E8 -:1003F0005866000800230020A0230020A02300202E -:100400007C700020E0020008E4020008E40200081A +:1003F000786B0008002300203C23002040230020CD +:10040000E4700020E0020008E4020008E4020008B2 :10041000E40200082DE9F04F2DED108AC1F80CD050 :10042000D0F80CD0BDEC108ABDE8F08F002383F328 -:1004300011882846A047002004F098FEFEE704F04B -:1004400021FE00DFFEE70000F8B501F055F901F0EC -:1004500003FA01F04DFB05F0CDF9074605F03CFA33 +:1004300011882846A047002004F00CFFFEE704F0D6 +:1004400091FE00DFFEE70000F8B501F055F901F07C +:1004500003FA01F04DFB05F0FFFA074605F096FBA5 :100460000546A8BB1F4B9F4232D001339F4232D07A :1004700027F0FF021C4B9A4230D12E4642F21074F4 :10048000F8B200F06FFF00F073FF08B100242646B9 -:1004900001F076FD20B10024032000F079F8264613 -:1004A00035B1124B9F4203D0002405F00DFA2646C9 -:1004B000002005F0A9F90EB100F080F801F0EAFA89 +:1004900001F0BEFD20B10024032000F079F82646CB +:1004A00035B1124B9F4203D0002405F067FB26466E +:1004B000002005F0DBFA0EB100F080F801F0EAFA56 :1004C00000F08AFF204600F00BF900F077F8F9E71A :1004D0002E460024D7E704460126D4E7064641F21B :1004E0008834D0E7010007B0000008B0263A09B010 :1004F00008B501F07DF9A0F120035842584108BD2C :1005000007B541F21203022101A8ADF8043001F051 :100510008DF903B05DF804FB38B5302383F31188FF -:10052000174803680BB104F0DFFE0023154A4FF4AF -:100530007A71134804F0CEFE002383F31188124C25 +:10052000174803680BB104F053FF0023154A4FF43A +:100530007A71134804F042FF002383F31188124CB0 :10054000236813B12368013B2360636813B16368B8 :10055000013B63600D4D2B7833B963687BB9022092 :1005600001F02EFA322363602B78032B07D16368E6 :100570002BB9022001F024FA4FF47A73636038BD7E -:10058000A023002019050008C0240020B823002063 +:100580004023002019050008602400205823002083 :10059000084B187003280CD8DFE800F008050208A3 :1005A000022001F00BBA022001F006BA024B002231 -:1005B0005A607047B8230020C0240020F8B501F02D -:1005C000DFFC30B13E4B03221A7000223D4B5A60D3 +:1005B0005A6070475823002060240020F8B501F0ED +:1005C00027FD30B13E4B03221A7000223D4B5A608A :1005D000F8BD3D4B3D4A1C4619680131F8D0043343 :1005E0009342F9D162683A4B9A42F1D9394B9B68F0 -:1005F00003F1006303F580239A42E9D205F038F94C -:1006000005F04AF9002001F04DF90220FFF7C0FF84 +:1005F00003F1006303F580239A42E9D205F092FAF1 +:1006000005F0A4FA002001F04DF90220FFF7C0FF29 :10061000314B00219A6C99641A6F19671A6FDA6C62 :10062000D9645A6F59675A6F1A6D19659A6F99672D :100630009B6F72B64FF0E023C3F8084DD4E9000475 @@ -107,12 +107,12 @@ :100690006F8FBFF34F8FBFF36F8F536923F4003316 :1006A00053610023C2F85032BFF34F8FBFF36F8FF7 :1006B000302383F31188854680F30888204787E735 -:1006C000B8230020C02400200000040820000408F3 +:1006C00058230020602400200000040820000408B3 :1006D000FFFF0308002300200045025800ED00E062 :1006E0002DE9F04F93B0B74B2022FF2100900AA8CC :1006F0009D6801F079F9B44A1378A3B90121B34890 :1007000011700360302383F3118803680BB104F088 -:10071000EBFD0023AE4A4FF47A71AC4804F0DAFDE9 +:100710005FFE0023AE4A4FF47A71AC4804F04EFEFF :10072000002383F31188009B13B1AA4B009A1A602F :10073000A94A1378032B03D000231370A54A5360F2 :100740004FF0000A009CD3465646D146012001F0E6 @@ -155,9 +155,9 @@ :100990003FF642AFB8F5807F3FF73EAF124BB84508 :1009A000019323DD4FF47A7000F022FF0390039A45 :1009B000002AFFF631AF039A0137019B03F8012BA0 -:1009C000EDE700BF00230020BC240020A02300206E -:1009D00019050008C0240020B823002004230020AB -:1009E000082300200C230020BC230020C820FFF790 +:1009C000EDE700BF002300205C240020402300202E +:1009D000190500086024002058230020042300206B +:1009E000082300200C2300205C230020C820FFF7F0 :1009F0007FFD074600283FF40FAF1F2D11D8C5F12A :100A000020020AAB25F0030084494245184428BF60 :100A10004246019200F0D6FF019AFF217F4800F084 @@ -167,7 +167,7 @@ :100A500000F062FF00283FF4DFAE0027B846704B7D :100A60009B68BB4218D91F2F11D80A9B01330ED0A7 :100A700027F0030312AA134453F8203C0593404681 -:100A8000042205A9043701F065FA8046E7E73846F5 +:100A8000042205A9043701F0ADFA8046E7E73846AD :100A900000F00AFF0590F2E7CDF81480042105A8C4 :100AA00000F0C4FE02E70023642104A8049300F0D0 :100AB000B3FE00287FF4B0AE0220FFF719FD002836 @@ -186,13 +186,13 @@ :100B800000283FF449AE00F0C7FE002844D00A9B7D :100B900001330BD008220AA9002000F02DFF002805 :100BA0003AD02022FF210AA800F01EFFFFF7A8FC80 -:100BB0001C4804F0E1FA13B0BDE8F08F002E3FF4BA +:100BB0001C4804F055FB13B0BDE8F08F002E3FF445 :100BC0002BAE0BF00B030B2B7FF426AE002364211E :100BD00005A8059300F020FE074600287FF41CAE10 :100BE0000220FFF785FC804600283FF415AEFFF792 -:100BF00087FC41F2883004F0BFFA059800F05EFFF0 +:100BF00087FC41F2883004F033FB059800F05EFF7B :100C000046463C4600F03CFFA0E506464EE64FF067 -:100C1000000901E6BA467EE637467CE6BC230020A2 +:100C1000000901E6BA467EE637467CE65C23002002 :100C200000230020A0860100094A49F269001368E8 :100C300099B21B0C00FB013344F250611360054B69 :100C4000186882B2000C01FB0200186080B2704785 @@ -201,51 +201,51 @@ :100C700010BD00BF00E8F11F2DE9F041ADF54E7D3C :100C80000D46002140F275126CAC07460EA80D917E :100C900000F0AAFE4FF4C4720021204600F0A4FE2A -:100CA0000DF1340802F058FB4FF47A72264BB0FB7A +:100CA0000DF1340802F0A4FB4FF47A72264BB0FB2E :100CB000F2F0186093E80700022384E807000DF5BE :100CC000E9702382FFF7C8FF41F204331F4907A8E8 -:100CD000238405F0BFFA15230DF2E3220DF12C0C4D +:100CD000238405F04FFD15230DF2E3220DF12C0CBA :100CE00084F8323107AB1E46083203CE664542F81F :100CF000080C42F8041C3346F5D1306841461060B8 -:100D0000204633791371012200F048FF002380B29E +:100D0000204633791371012200F052FF002380B294 :100D1000E97E0393AB7E029305F11903019301234E :100D2000009307A3D3E90023CDE90480384602F0FD -:100D3000D1FE0DF54E7DBDE8F08100BFAFF3008020 -:100D40009E6AC421818A46EEC8240020646200089D +:100D30001DFF0DF54E7DBDE8F08100BFAFF30080D3 +:100D40009E6AC421818A46EE6824002084670008D8 :100D50002DE9F0412C4CDAB080460D46237A5BBB7E -:100D600027A9284601F028F80746002842D19DF817 +:100D600027A9284601F048F80746002842D19DF8F7 :100D70009D60C82E3ED801464FF4A662204600F082 :100D800033FE4FF4807332460DF19E01C4F8F83102 :100D90004FF4007304F109002644C4F80C334FF4F7 :100DA0004073C4F8203400F00DFE9DF89C3077723B :100DB00023720BB9EB7E237206AC8122002127A897 -:100DC00000F012FE0122214627A801F031F800238D +:100DC00000F012FE0122214627A801F05BF8002363 :100DD00080B2E97E0393AB7E029305F11903019380 :100DE0002823CDE904400093404605A3D3E900231E -:100DF00002F070FE5AB0BDE8F08100BFAFF3008092 -:100E000026417272DF25D7B7905E0020F0B5254EDF +:100DF00002F0BCFE5AB0BDE8F08100BFAFF3008046 +:100E000026417272DF25D7B7305E0020F0B5254E3F :100E10004FF48A75F1B0002405FB006596F8D830D0 :100E2000D822214685F8DC303AA885F8E84006AF9C :100E300000F0DAFD06F1090000F0CEFDD5F8E4304F :100E4000C2B206F109018DF8F0000DF1F100CDE913 -:100E50003A3400F0B7FD394601223AA801F014F8FF +:100E50003A3400F0B7FD394601223AA801F048F8CB :100E6000082380B2317ACDE9047001270E48CDE91C :100E7000023706F1D80301933023009307A3D3E987 -:100E8000002302F027FEA04206DD02F065FAC5F855 +:100E8000002302F073FEA04206DD02F0B1FAC5F8BD :100E9000E000384671B0F0BD2046FBE778F6339F9E -:100EA00093CACD8D905E0020E03400202DE9F04FF4 -:100EB000264F87B0DFF8A080254E384602F036FE78 +:100EA00093CACD8D305E0020803400202DE9F04FB4 +:100EB000264F87B0DFF8A080254E384602F082FE2C :100EC000034600283AD00024224DADF81440A14634 :100ED0000294A246CDE90344027B8DF8142003AAB4 :100EE0009968406803C21B6843F0004302932B6873 -:100EF00004F5A664D3F810B002F030FA10EB080243 +:100EF00004F5A664D3F810B002F07CFA10EB0802F7 :100F0000CDF800A0284605F5A65541F1000302A939 :100F1000D8470028C8BF49F00109B4F5266FE6D1CB -:100F2000B9F1000F05D0384602F004FE86F800A0A3 +:100F2000B9F1000F05D0384602F050FE86F800A057 :100F3000C3E73378072B04D80133337007B0BDE81B -:100F4000F08F024802F0F6FDF8E700BFE034002021 -:100F5000C56300201035002040420F0070B50D46DB -:100F600014461E4602F012FD50B9022E10D1012C7B +:100F4000F08F024802F042FEF8E700BF8034002034 +:100F500065630020B034002040420F0070B50D469C +:100F600014461E4602F05EFD50B9022E10D1012C2F :100F70000ED112A3D3E900230120C5E9002307E025 :100F8000282C10D005D8012C09D0052C0FD000201A :100F900070BD302CFBD10BA3D3E90023ECE70BA3EE @@ -257,21 +257,21 @@ :100FF00081FCA4F82C55B4F82C0500F063FC78B102 :10100000B4F82C0500F06EFC014648B9B4F82C0584 :1010100000F070FCB4F82C350133A4F82C35EAE765 -:1010200038BD00BF905E0020F8B50D4C02260D4F74 +:1010200038BD00BF305E0020F8B50D4C02260D4FD4 :10103000A4F5805343F8307C237E3BB965692DB11C -:10104000284601F01BF8284605F0BAF82046A4F51A -:10105000A65401F013F8012E00D1F8BD0126E7E7F0 -:10106000005A00201C6300082DE9F04F8FB00546A0 -:101070000C4600AF02F08AFC002849D1237E022BE7 -:101080001BD1E38A012B18D102F066F90646FFF75F +:10104000284601F063F8284601F09CF92046A4F5F3 +:10105000A65401F05BF8012E00D1F8BD0126E7E7A8 +:10106000A05900203C6800082DE9F04F8FB00546DC +:101070000C4600AF02F0D6FC002849D1237E022B9B +:101080001BD1E38A012B18D102F0B2F90646FFF713 :10109000CBFD03464FF4C87006F51676DFF8C08224 :1010A000B3FBF0F202FB103316FA83F3C8F80030FA :1010B000E37E33B9A34B00221A703C37BD46BDE82E -:1010C000F08F07F12401204600F034FE0028F4D10F +:1010C000F08F07F12401204600F04AFE0028F4D1F9 :1010D00007F11400FFF7C0FD97F8264007F114014F -:1010E00007F12700224605F083F80028E2D10F2CF3 +:1010E00007F12700224605F013FB0028E2D10F2C60 :1010F00008D8944B1C70D8F80030A3F51673C8F8C4 -:101100000030DAE797F82410284602F037FCD4E7DD +:101100000030DAE797F82410284602F083FCD4E791 :10111000E38A282B2BD010D8012B23D0052BCCD140 :10112000BFF34F8F8849894BCA6802F4E0621343CA :10113000CB60BFF34F8F00BFFDE7302BBDD1844E96 @@ -292,14 +292,14 @@ :10122000D42005EB0209C6F8D49000F04BFB8145B1 :1012300009D396F8D220D6F8D4000132001B86F8E4 :10124000D220C6F8D400FF2D0FD80024347200F04D -:1012500063FB204600F026FB00F092FE3D4B188118 +:1012500063FB204600F026FB00F0DAFE3D4B1881D0 :1012600008B9FFF7ABF9C54627E7BB6896F8D90080 :101270000AFB0362FB68D2F8E41082F8E83001F55B :101280008061C2F8E030C2F8E410FFF7BFFDFFF75D :101290000DFE96F8D920013202F0030286F8D9201B :1012A000B6E74FF48A7A20460AFB02F505F1EA0117 -:1012B000314400F015FEF86000287FF4FEAE0122F4 -:1012C000354485F8E82002F047F8D5F8E020D6ED5F +:1012B000314400F051FEF86000287FF4FEAE0122B8 +:1012C000354485F8E82002F093F8D5F8E020D6ED13 :1012D000007A801A40F6B832B8EE677ADFED1E6AFF :1012E000192838BF1920904228BF104607EE900AEF :1012F000F8EEE77A67EEA67ADFED186AE7EE267A6F @@ -307,26 +307,26 @@ :1013100073680AFB02F4321992F8E81059B1D2F856 :10132000E410E8468B423FF427AF002182F8E81032 :10133000C2F8E010C5467368064A9B0A0133138160 -:10134000BBE600BFD934002000ED00E00400FA0540 -:10135000905E0020C8240020CDCCCC3D6666663F60 -:10136000DC340020014B1870704700BFD4240020EB -:1013700038B54FF00054144B22689A4221D1627D57 -:101380000025124B12481A70C922237D09301149D9 -:1013900000F8013C4FF48073C0F8DB50C0F8EF3127 -:1013A0004FF40073C0F803334FF44073C0F81734A0 -:1013B00000F008FBE0222946204600F015FB012042 -:1013C00038BD0020FCE700BF9AAD44C5D4240020FE -:1013D000905E00201600002037B500F0D1FD1F4CB4 +:10134000BBE600BF7934002000ED00E00400FA05A0 +:10135000305E002068240020CDCCCC3D6666663F20 +:101360007C340020014B1870704700BF74240020AB +:1013700038B54FF00054144B22689A4222D1607D58 +:10138000F8B1124B0025C922114918701148237D6C +:101390000930C0F8DB5000F8013C4FF48073C0F80E +:1013A000EF314FF40073C0F803334FF44073C0F8CB +:1013B000173400F007FBE0222946204600F014FB1A +:1013C000012038BD0020FCE79AAD44C574240020FC +:1013D00016000020305E002037B500F019FE1F4CCB :1013E0001F4D022301221F496B712368288120466B :1013F0005B68984704F5805301221A49D3F8C0343A :1014000004F5A6505B689847002317494FF48052B3 -:101410000193164B16480093164B02F087FA164BB1 -:10142000197811B1124802F0A9FA01F095FF0446AB +:101410000193164B16480093164B02F0D3FA164B65 +:10142000197811B1124802F0F5FA01F0E1FF044613 :10143000FFF7FAFB4FF4C873B0FBF3F202FB1303A0 -:1014400004F5167010FA83F00C4B186004F044FA9F -:1014500008B10F232B8103B030BD00BF1035002031 -:10146000C824002040420F00D82400205D0F00084F -:10147000E034002069100008D4240020DC3400206F +:1014400004F5167010FA83F00C4B186004F09EFB44 +:1014500008B10F232B8103B030BD00BFB034002092 +:101460006824002040420F00782400205D0F00080F +:101470008034002069100008742400207C3400208F :101480002DE9F04F00242DED028B93B00DF12C08C7 :101490004FF0010ADFF814B2FFF708FD0A94ADF827 :1014A00034400B94C8F804409FED798B00267E4DA4 @@ -336,73 +336,73 @@ :1014E00000F082FA2B6808AA0AA95F6928460DF164 :1014F0001E03B8470FAB4F4698E8030083E803008C :101500009DF834300EA958468DF844300A9B0E934E -:10151000DDE9082302F0ECFC06F5A66605F5A65504 -:10152000B6F5266FC5D1002FC0D1604802F02EFA63 -:1015300000283FD15E4E01F00FFF3368984239D347 -:1015400001F00AFF0546FFF76FFB4FF4C8738DF8F3 +:10151000DDE9082302F038FD06F5A66605F5A655B7 +:10152000B6F5266FC5D1002FC0D1604802F07AFA17 +:1015300000283FD15E4E01F05BFF3368984239D3FB +:1015400001F056FF0546FFF76FFB4FF4C8738DF8A7 :101550002870B0FBF3F202FB130305F5167010FAC6 :1015600083F03060534E377817B901238DF8283057 :10157000C7F110050EA8FFF76FFB0EABEDB20DF132 :101580002900D919062D28BF06252A46013500F065 :1015900019FA0AABEDB24548039318230495029358 :1015A000454B0193012300933BA3D3E9002302F0B1 -:1015B00033FA347001F0D0FE404A414D1368C31A2B -:1015C000B3F57A7F2FD3106001F0C8FE02460B46B8 -:1015D000364802F0B9FA354802F0D8F918B32B7A38 +:1015B0007FFA347001F01CFF404A414D1368C31A92 +:1015C000B3F57A7F2FD3106001F014FF02460B466B +:1015D000364802F005FB354802F024FA18B32B7A9E :1015E0000EAF384E002B14BF03230223737101F09A -:1015F000B3FE4FF47A7301223946B0FBF3F030604A -:10160000304600F06FFB182380B202932E4B0193FB +:1015F000FFFE4FF47A7301223946B0FBF3F03060FE +:10160000304600F085FB182380B202932E4B0193E5 :1016100040F25513CDE903700093244820A3D3E989 -:10162000002302F0F9F92B7A93B101F095FE002620 +:10162000002302F045FA2B7A93B101F0E1FE002687 :1016300007464FF48A7895F8D900304400F003004B :1016400008FB005393F8E82072B10136042EF2D162 -:10165000C82003F091FD2B7A002B7FF417AF13B055 +:10165000C82003F005FE2B7A002B7FF417AF13B0E0 :10166000BDEC028BBDE8F08FD3F8E02042B12B68CF :10167000BA1AFA2B38BFFA230533B2EB430FE4D37F :10168000FFF7C4FB0028E0D1E2E700BFAFF3008022 :101690000000000000000000401DA12026812A0B50 -:1016A000F1C6A7C1D068080F10350020E034002033 -:1016B000DC340020D9340020D8340020C06300205E -:1016C000905E0020C8240020C463002010B5074CA1 -:1016D000204601F005F904F5A65001F001F9044A8D -:1016E00004490020BDE8104004F064BD103500201E -:1016F0002064002029100008F8B50A25204C01229A -:101700004FF400712046192703F0A0F8204601226B -:101710004FF4807103F09AF84FF480766520013819 +:1016A000F1C6A7C1D068080FB034002080340020F4 +:1016B0007C340020793400207834002060630020DE +:1016C000305E0020682400206463002010B5074CC1 +:1016D000204601F051F904F5A65001F04DF9044AF5 +:1016E00004490020BDE8104004F0FEBFB0340020E3 +:1016F000C063002029100008F8B50A25204C0122FB +:101700004FF400712046192703F0F0F8204601221B +:101710004FF4807103F0EAF84FF4807665200138C9 :1017200025D00822A2F10801B646332905D84FF08A :10173000000C66834FF000730DE0A1F13403668363 :10174000B3FBF7FC07FB1C33002B0CBF4FF0010C65 :101750004FF0000CEED1013143EA4C238A42A361E1 :10176000A4F818E0E1D10832A02AD8D0DAE7013D88 -:1017700042F2107003F000FD15F0FF05BFD1F8BD77 +:1017700042F2107003F074FD15F0FF05BFD1F8BD03 :10178000000402582DE9F84F4FF47A7306460D46CF :10179000002402FB03F7DFF85080DFF8509098F93F :1017A00000305FFA84FA5A1C01D0A34212D159F8D2 :1017B00024002A4631460368D3F820B03B46D84778 :1017C000854207D1074B012083F800A0BDE8F88FC0 -:1017D0000124E4E7002CFBD04FF4FA7003F0CCFCBA -:1017E0000020F3E70C640020182300201C230020B5 +:1017D0000124E4E7002CFBD04FF4FA7003F040FD45 +:1017E0000020F3E7AC630020182300201C23002016 :1017F000002307B5024601210DF107008DF80730DF :10180000FFF7C0FF20B19DF8070003B05DF804FBAF :101810004FF0FF30F9E700000A46042108B5FFF752 :10182000B1FF80F00100C0B2404208BD074B0A463C :1018300030B41978064B53F82140014623682046FE -:10184000DD69044BAC4630BC604700BF0C6400202F +:10184000DD69044BAC4630BC604700BFAC63002090 :101850001C230020A086010070B5104C0025104EFE -:1018600003F05AFE20803068238883420CD800257C -:101870002088013803F04CFE23880544013BB5F570 -:10188000802F2380F4D370BD03F042FE33680544FB -:101890000133B5F5802F3360E5D3E8E70E6400200F -:1018A000C863002003F006BF00F1006000F580204F +:1018600003F0CEFE20803068238883420CD8002508 +:101870002088013803F0C0FE23880544013BB5F5FC +:10188000802F2380F4D370BD03F0B6FE3368054487 +:101890000133B5F5802F3360E5D3E8E7AE63002070 +:1018A0006863002003F07ABF00F1006000F580203B :1018B0000068704700F10060920000F5802003F09E -:1018C00087BE0000054B1A68054B1B889B1A834294 -:1018D00002D9104403F01CBE00207047C8630020EA -:1018E0000E640020024B1B68184403F017BE00BFB3 -:1018F000C8630020024B1B68184403F021BE00BFE0 -:10190000C86300200020704700F1FF5000F58F10E1 +:1018C000FBBE0000054B1A68054B1B889B1A834220 +:1018D00002D9104403F090BE0020704768630020D6 +:1018E000AE630020024B1B68184403F08BBE00BFA0 +:1018F00068630020024B1B68184403F095BE00BFCC +:10190000686300200020704700F1FF5000F58F1041 :10191000D0F8000870470000064991F8243033B130 :1019200000230822086A81F82430FFF7C3BF012092 -:10193000704700BFCC630020014B1868704700BFA0 +:10193000704700BF6C630020014B1868704700BF00 :101940000010005C194B01380322084470B51D6873 :10195000174BC5F30B042D0C1E88A6420BD15C68F7 :101960000A46013C824213460FD214F9016F4EB170 @@ -410,7 +410,7 @@ :101980000B4602D22C2203F8012B0424094A1688A4 :10199000AE4204D1984284BF967803F8016B013CB3 :1019A00002F10402F3D1581A70BD00BF0010005CB0 -:1019B00024230020A8620008704700007047000040 +:1019B00024230020C867000870470000704700001B :1019C00070470000002310B5934203D0CC5CC45490 :1019D0000133F9E710BD000003460246D01A12F9A0 :1019E000011B0029FAD1704702440346934202D0FA @@ -422,1229 +422,1305 @@ :101A40002430A41B17441E449044E4B2F6B2082E7E :101A500085F82460DBD1FFF75FFF0028D7D108E0CD :101A60002B6A03EB82038342CFD0FFF755FF002898 -:101A7000CBD10020BDE8F8830120FBE7CC63002038 -:101A8000024B1A78024B1A70704700BF0C6400209A +:101A7000CBD10020BDE8F8830120FBE76C63002098 +:101A8000024B1A78024B1A70704700BFAC630020FB :101A90001823002010B5074C4FF4E13306492068A5 -:101AA0000B6003F055FA60680349BDE8104003F08D -:101AB0004FBA00BF1C230020F4630020094B1822FA +:101AA0000B6003F0A5FA60680349BDE8104003F03D +:101AB0009FBA00BF1C23002094630020094B18220A :101AC000002110B504461846FFF78EFF064A074B63 :101AD00001461278046053F82200BDE8104003F07C -:101AE00037BA00BFF46300200C6400201C230020E0 -:101AF000F0B5A1B071B600230120002480261A465B -:101B0000194602F055FE4FF4D067214A3D2513696E -:101B100023BBD2F810310BBB036804F1006199605C -:101B20000368C3F80CD003685E6003681F60016837 -:101B30000B6843F001030B6001680B6823F01E0380 -:101B40000B6001680B68DB07FCD4037B80344168C1 -:101B500005FA03F3B4F5001F0B60D8D102F05EFE66 -:101B6000B4F5001F11D000240A4E0B4D012003F0E4 -:101B7000A1FD3388A34205D928682044013403F02D -:101B8000DFFCF6E7002003F095FD61B621B0F0BD63 -:101B9000002000520E640020C86300202DE9F047A9 -:101BA0000D46044600219046284640F27912FFF780 -:101BB0001BFF234620220021284604F1220702F0C1 -:101BC00039F9231D022220212846C02602F032F9CD -:101BD000631D03222221284602F02CF9A31D0322B3 -:101BE0002521284602F026F904F1080310222821B5 -:101BF000284602F01FF904F1100308223821284674 -:101C000002F018F904F1110308224021284602F0DD -:101C100011F904F1120308224821284602F00AF9BA -:101C200004F1140320225021284602F003F904F1A4 -:101C3000180340227021284602F0FCF804F120032A -:101C40000822B021284602F0F5F804F12103082209 -:101C5000B821284602F0EEF8314608363B46082205 -:101C60002846013702F0E6F8B6F5A07FF4D1002748 -:101C700004F1330A04F1320308223146284602F007 -:101C8000D9F894F832304FEAC7099F4209F5A47693 -:101C900015D3B8F1000F08D1314609F24F1604F5FB -:101CA00099730722284602F0C5F827463B1B94F893 -:101CB000322193420CD3F01DC008BDE8F0870AEB37 -:101CC0000703082231462846013702F0B3F8D8E767 -:101CD00007F233133146082228460836013702F04E -:101CE000A9F8E3E713B5044608460021202223465D -:101CF00001900160C0F8031002F09CF8231D0198C8 -:101D00000222202102F096F8631D0198032222216D -:101D100002F090F8A31D01980322252102F08AF811 -:101D2000019804F108031022282102F083F807200B -:101D300002B010BD0023F7B50E46047F07220091C4 -:101D40001946054601F03AFF731C01220721009352 -:101D50002846002301F032FFC4B9B31C0522082134 -:101D60002846009323460D2401F028FF3746BB1B6D -:101D7000B278934211D307342B7FA88AE408BBB909 -:101D8000844294BF0020012003B0F0BDAB8A082438 -:101D9000DB00083BDB08B370E8E7FB1C21460822A8 -:101DA0002846009300230834013701F007FFDEE7DF -:101DB000201A18BF0120E7E70023F7B50E46047F7D -:101DC000082200911946054601F0F8FE731CC4B9BB -:101DD00008220093234610241146284601F0EEFE07 -:101DE00001235F1C7278013B934211D307342B7F90 -:101DF000A88AE408BBB9844294BF0020012003B044 -:101E0000F0BDAB8A0824DB00083BDB087370E7E712 -:101E1000F3192146082228460093002301F0CEFE44 -:101E200008343B46DDE7201A18BF0120E7E7000031 -:101E3000F8B50E4605461446002181223046FFF7CC -:101E4000D3FD2B4608220021304601F0F3FF7CB978 -:101E50000F246B1C07220821304601F0EBFF012301 -:101E60005F1C6A78013B934204D3E01DC008F8BDB3 -:101E70000824F4E7EB1921460822304601F0DAFF86 -:101E800008343B46ECE70000F8B50E46054614461C -:101E90000021CE223046FFF7A7FD2B462822002145 -:101EA000304601F0C7FF7CB9302405F10803082251 -:101EB0002821304601F0BEFF2F467B1B2A7A934231 -:101EC00004D3E01DC008F8BD2824F5E707F1090395 -:101ED0002146082230460834013701F0ABFFECE719 -:101EE000F7B5047F0E46009101231022002105461C -:101EF00001F064FEC4B9B31C0922102128460093E6 -:101F00002346192401F05AFE37467288BB1B9A42B9 -:101F100011D807342B7FA88AE408BBB9844294BF48 -:101F20000020012003B0F0BDAB8A1024DB00103B81 -:101F3000DB087380E8E73B1D214608222846009312 -:101F400000230834013701F039FEDEE7201A18BFFC -:101F50000120E7E730B50A44084D91420DD011F851 -:101F6000013B5840082340F30004013B2C4013F090 -:101F7000FF0384EA5000F6D1EFE730BD2083B8EDCF -:101F8000F7B5384A6B46106851686A4603C30823A0 -:101F90003549364804F03CF90446002833D10A2577 -:101FA000334A6B46106851686A4603C308233149B7 -:101FB0002E4804F02DF90446002849D00369B3F5F2 -:101FC000E01F45D8B0F8661040F2134291423FD16D -:101FD000294A024402F15C018B4239D35C3B23491C -:101FE00000209E1AFFF7B6FF04F16401074632464F -:101FF0000020FFF7AFFFA3689F4229D1E368984212 -:1020000008BF002524E00369B3F5E01F27D8418B02 -:1020100040F21342914220D1174A024402F11001CA -:102020008B4218D3103B114900209D1AFFF792FFF5 -:1020300004F1180106462A460020FFF78BFFA3682B -:102040009E4202D1E368984201D00D25A8E7002501 -:10205000284603B0F0BD1025A2E70C25A0E70B250C -:102060009EE700BFB8620008DCFF1B000000040808 -:10207000C162000890FF1B000800FCF710B5037C4C -:10208000044613B9006804F0ABF8204610BD000008 -:102090000023BFF35B8FC360BFF35B8FBFF35B8F26 -:1020A0008360BFF35B8F7047BFF35B8F0068BFF344 -:1020B0005B8F704770B505460C30FFF7F5FF04469F -:1020C00005F108063046FFF7EFFFA04206D96D681C -:1020D0003046FFF7E9FF2544281A70BD3046FFF768 -:1020E000E3FF201AF9E7000070B505464068A0B18B -:1020F00005F10C0605F10800FFF7D6FF044630464F -:10210000FFF7D2FF844204F1FF34304694BF6D687C -:102110000025FFF7C9FF2C44201A70BD38B50C46C6 -:102120000546FFF7C7FFA04210D305F10800FFF7EF -:10213000BBFF04446868BFF35B8FB4FBF0F100FBA6 -:1021400011440120AC60BFF35B8F38BD0020FCE779 -:102150002DE9F041144607460D46FFF7C5FF8442BE -:1021600028BF0446D4B1B84658F80C6B4046FFF778 -:102170009BFF3044286040467E68FFF795FF331A86 -:102180009C4203D801206C60BDE8F081A41B6B6009 -:102190003B682044AB60E8600220F5E72046F3E7A7 -:1021A00038B50C460546FFF79FFFA04210D305F156 -:1021B0000C00FFF779FF04446868BFF35B8FB4FB42 -:1021C000F0F100FB11440120EC60BFF35B8F38BDE0 -:1021D0000020FCE72DE9FF418846694607466C462A -:1021E000FFF7B6FF002506B204EBC606B4420AD0DC -:1021F000626808EB050120680834FFF7E3FB54F838 -:10220000043C1D44F2E729463846FFF7C9FF28463B -:1022100004B0BDE8F0810000F8B505460C300F466B -:10222000FFF742FF05F1080604463046FFF73CFF82 -:10223000A042304688BF6C68FFF736FF201A38602E -:1022400020B12C683046FFF72FFF2044F8BD000076 -:1022500073B5144606460D46FFF72CFF84420190E5 -:1022600028BF0446DCB101A93046FFF7D5FF019B2A -:1022700033B93268C5E90233C5E9002401200CE016 -:102280009C42286038BF0194019884426860F5D967 -:102290003368241A0220AB60EC6002B070BD2046A7 -:1022A000FBE700002DE9FF410F4669466C46FFF74A -:1022B000CFFF00B2002604EBC005AC4209D0D4F831 -:1022C0000480B81954F8081B42464644FFF77AFBCD -:1022D000F3E7304604B0BDE8F081000038B50546AC -:1022E000FFF7E0FF044601462846FFF717FF2046A8 -:1022F00038BD00007047000010B41346026814682F -:102300000022A4465DF8044B6047000000F58050B1 -:1023100090F859047047000000F5805090F852047E -:102320007047000000F5805090F958047047000095 -:102330004E207047302383F3118800F58052D2F885 -:102340009C34D2F898041844D2F894341844D2F843 -:102350007C341844D2F88C341844D2F888341844A9 -:10236000002383F31188704700F58050C0F854149F -:10237000012070472DE9F04F0C4600F5805185B0E3 -:102380001F4691F8523405469046BDF838909BB1EF -:10239000D1F878340133C1F878342368980006D432 -:1023A000237B082B0BD9627B0AB10F2B07D9D1F8FD -:1023B0007C340133C1F87C344FF0FF3010E030231F -:1023C00083F31188EB6AD3F8C42012F4001B0AD0FF -:1023D000D1F8803400200133C1F8803480F31188B3 -:1023E00005B0BDE8F08F20684822D3F8C43000283B -:1023F000C3F3044A6B6AB4BF40F08040800412FB10 -:102400000A334FEA4A161860226852004FEA0A62FD -:1024100044BF40F000501860207B42EA00425A60FE -:10242000607B10B342F440125A60D1F8B0240132FC -:10243000C1F8B024AA1902F58352117B41F02001A2 -:102440001173207B039300F0E3FF0330039B8010A4 -:102450005FFA8BF20BF1010B82420DDA04EB820181 -:1024600003EB820249689160F2E7AA1902F58352F0 -:10247000117B60F34511E3E70122EB6A05EB4A119A -:1024800002FA0AF201F58251C3F8D020AB191831D3 -:1024900004F10C0203F58253C3E90487234653F881 -:1024A000040B934241F8040BF9D11B882E440B8096 -:1024B00041F2680346F803A006F5805609F00303CD -:1024C00096F86C2043F0100322F01F02134386F8A5 -:1024D0006C30002383F3118842463B462146284650 -:1024E000CDF8009000F05AFF012079E72DE9F04780 -:1024F00000F58056044696F85254002D40F00381B2 -:10250000037C032B40F0948028462B462F465FFA2D -:1025100080FC944510DA01EBCC0E51F83CC0BCF1C4 -:10252000000F04DBDEF804C0BCF1000F02DB013752 -:102530000130ECE70133FBE7302080F31188E06ADB -:10254000F3B9D0F8803043F00203C0F880304E2356 -:10255000E06A002F6FD1D0F8803043F00103C0F85B -:1025600080306A4B6A4A1B6803F1805303F52C5391 -:102570009B009342A36240F2B080664800F0E6FE02 -:102580004D2B42D8DFF884814FEA034EDFF8889163 -:10259000D8F800C04EEA8C0EC0F884E00CF18050F0 -:1025A00000F52C508000606103EB0C00D4F82CC0C7 -:1025B000C3F14E03C8F80000DCF8800040F03000A2 -:1025C000CCF880004FF0000CD4F81480E6465FFA97 -:1025D0008CF08242BCDD01EBC00A51F830000028CB -:1025E00010DBDAF804A0BAF1000F0BDA09EA0040B8 -:1025F0000AF07F0A40EA0A0040F0084048F82E003E -:102600000EF1010E0CF1010CE1E7836923F00103E7 -:10261000836100F0A1FE0646E36A9B69D90704D5F1 -:1026200000F09AFE831BFA2BF6D9002383F311885E -:102630002846BDE8F087B7EB530F3DD2DFF8CCE07A -:102640004FEA074CDEF800304CEA830CC0F888C033 -:1026500003F1805003EB4703002700F52C50CEF820 -:102660000030BC468000A061E06AD0F8803043F0C2 -:102670000C03C0F88030D4F818E0FBB29A427FF720 -:1026800070AF51F8330001EBC3080028D8F80430CC -:1026900001DB002B0EDB20F0604023F0604340F0B4 -:1026A000005043F000434EF83C000EEBCC000CF120 -:1026B000010C43600137E0E7836923F00103836184 -:1026C00000F04AFE0646E36A9B69DA07ADD500F0E2 -:1026D00043FE831BFA2BF6D9A7E7E26A936923F03E -:1026E0000103936100F038FE0746E36A9B69DB074C -:1026F00005D500F031FEC31BFA2BF6D995E701256D -:1027000086F8525491E7002592E700BF1C64002030 -:10271000FCB50040CC6200080000FF0713B500F5CF -:1027200080540191606CFFF7DFFC1F280AD920223A -:102730000199606CFFF74EFDA0F12003584258410B -:1027400002B010BD0020FBE708B5302383F31188E9 -:1027500000F58050406CFFF79BFC002383F3118849 -:1027600008BD0000002202608281426082607047E2 -:102770000022002310B5C0E90023002304460C30DA -:1027800020F8043CFFF7EEFF204610BD2DE9F0478E -:102790009A4688B0074688469146302383F31188CD -:1027A00007F580546846FFF7E3FF606CFFF782FC93 -:1027B0001F282ED920226946606CFFF78FFD202844 -:1027C00027D194F8523423B303AD444605AB2E46CB -:1027D000083403CE9E4244F8080C44F8041C3546E5 -:1027E000F5D130682060B388A380DDE90023C9E912 -:1027F0000023BDF80830AAF80030002383F31188C5 -:1028000053464A464146384608B0BDE8F04700F016 -:10281000B3BD002080F3118808B0BDE8F087000048 -:102820002DE9F84F0023064600F5815405468846F9 -:102830001034C0E90133274B46F8303B3746384661 -:102840002037FFF795FFA742F9D105F580544FF4E3 -:10285000805305F5A3594FF0000A266300266764EC -:1028600005F5835709F110094FF0000B1037E663A7 -:10287000C4E90D36012384F8403084F84830A7F1CC -:102880001800203747E910ABFFF76CFF47F8286CBA -:102890004F45F4D1B8F1010F84F85884A4F85A6474 -:1028A000A4F85C64A4F85E6484F86064A4F86264CC -:1028B000A4F86464A4F8666484F8686402D90648DD -:1028C00000F044FD054B284653F82830EB62BDE884 -:1028D000F88F00BF1C630008F06200080C6300085A -:1028E000044B10B5197804464A1C1A70FFF798FF7C -:1028F000204610BD196400202DE9F04300295AD06C -:102900002E4E2F48B6FBF1F481428CBF0A201120D5 -:10291000431EB4FBF0F700FB1740DDB220B1022BE1 -:102920001846F5D8002032E07B1EB3F5806F2ED21A -:10293000C5EBC5084FF47A7308F103044FEAE40EBF -:10294000C4F3C7040EF10109281B0EFB033E5FFA16 -:1029500080FC59FA80F0BEFBF0F0B0F5617F18DC26 -:1029600083B2601C5CFA80F07843B6FBF0F08142E1 -:10297000D8D1611E0F29D5D80CF1FF310729D1D844 -:102980000120138057801071547182F806C0BDE891 -:10299000F08308F1FF34E010C4F3C70400F1010E26 -:1029A0002D1B00FB03335FFA85FC5EFA85F5B3FB54 -:1029B000F5F39BB2D5E70846E9E700BF00B4C404CD -:1029C0003F420F0030B50D4B05200D4D1C786C4378 -:1029D0008C420ED159780120518099785171D97863 -:1029E0009171197911715B7903EB83035B0013809B -:1029F00030BD013803F10603E8D1F9E75C63000854 -:102A000040420F0038B540F27772C36A154CC3F8E4 -:102A1000BC200722C36AC3F8C8202268C16A930099 -:102A200043F4C023C1F8A03002F1805302F16C01DD -:102A3000C56A03F52C53EA3289009B00226041F0FD -:102A4000E061094AC361C5F8C01003F5D87103F508 -:102A50006A7341629342836202D9044800F076FCB3 -:102A600038BD00BF1C640020FCB50040CC620008EB -:102A70002DE9F04F00F580551F4689B0044695F8C2 -:102A8000583489469046022B04D90026304609B0B6 -:102A9000BDE8F08FA84A52F8231009B942F8230084 -:102AA000A648C4F80C9001782774C9B9302383F381 -:102AB0001188A34BD3F8EC2042F48072C3F8EC20C9 -:102AC000D3F8942042F48072C3F89420D3F8942071 -:102AD00022F48072C3F894200123037081F31188DB -:102AE00095F851347BB9302383F31188954A95F8D2 -:102AF0005834D35C0BB3012B28D0012385F8513413 -:102B0000002383F31188302383F31188E26A9369E9 -:102B100023F01003936100F01FFC8246E36A9E6974 -:102B200016F0080619D000F017FCA0EB0A03FA2BE8 -:102B3000F4D9002686F31188A8E70321132002F0B8 -:102B40003BF80321152002F037F8D6E703211420C3 -:102B500002F032F803211620F5E79A6942F00102EB -:102B60009A6100F0F9FB8246E36A9A69D00706D4BD -:102B700000F0F2FBA0EB0A03FA2BF5D9D9E79A692A -:102B80004FF0000A42F002029A61E36AC3F854A0CF -:102B90008AF3118804F5825B686CFFF779FA0BF110 -:102BA000100B202200216846FEF71EFF02A8FFF747 -:102BB000D9FD6A460BEB06030DF1180ECDF818A0EF -:102BC00094460833BCE80300F44543F8080C43F886 -:102BD000041C6246F4D1DCF8000020361860B6F51B -:102BE000806F9CF804201A71DBD1002304F5A252F7 -:102BF000494620461A3285F8503485F85334FFF799 -:102C00007BFE064690B9E26A936923F00103936163 -:102C100000F0A2FB0546E36A9B69D9077FF535AF53 -:102C200000F09AFB431BFA2BF5D92EE795F85E349A -:102C3000C5F86C94591E95F85F34E26A013B1B029B -:102C400043EA416395F8601401390B43B5F85C140D -:102C5000013943EA0143D361B8F1000F36D004F5DE -:102C6000A352414620460232FFF7ACFE90B9E26A19 -:102C7000936923F00103936100F06EFB0546E36A5C -:102C80009B69DA077FF501AF00F066FB431BFA2B67 -:102C9000F5D9FAE695F86724C5F87084511E95F8C1 -:102CA0006824E36A013A120142EA012295F86614A7 -:102CB00001390A43B5F86414013942EA014242F489 -:102CC0000002DA604FF42062E36A9A64E36A4FF02C -:102CD00000082046C3F8BC80FFF794FE85F85984AD -:102CE0006FF04042E36A1A65174AE36A5A654FF08B -:102CF0000222E36A9A654FF0FF32E36AC3F8E020EC -:102D00000322E36A9742DA653FF4C0AEE26A936950 -:102D100023F00103936100F01FFB0746E36A9B6900 -:102D2000DB0705D500F018FBC31BFA2BF6D9ACE680 -:102D3000012385F85234A9E61064002018640020AD -:102D40000044025804630008550200022DE9F04FC8 -:102D5000054689B090469946002741F2680A00F579 -:102D60008056EB6AD3F8D830FB40D80751D505EB35 -:102D700047124FEA471B52441379190749D4D6F832 -:102D800084340133C6F8843405F5A553C3E90089BA -:102D900013799A0605EB0B0248BFD6F8B4345244B7 -:102DA00044BF0133C6F8B434137943F008031371F8 -:102DB000DB0723D596F8533403B305F582546846F0 -:102DC000FFF7D6FC03AB18345C4404F1080C206810 -:102DD000083454F8041C1A46644503C21346F6D15D -:102DE0002068694610602846A2889A800123ADF8C1 -:102DF00008302B68CDE90089DB6B9847D6F8A834FA -:102E0000D6F854040133C6F8A83410B103681B691E -:102E100098470137202FA4D109B0BDE8F08F0000FA -:102E20002DE9F04F0F468DB0044600F097FA824628 -:102E30008946002F5BD1E36AD3F8A02012F4FE0F7D -:102E400003D100200DB0BDE8F08FD3F8A42092018B -:102E500041BF04F58051D1F898240132C1F898247B -:102E6000D3F8A4205606ECD0D3F8A450E669C5F3F5 -:102E700005254823E8464FF0000B03FB0566404656 -:102E8000FFF770FC326851004ABF22F06043C2F382 -:102E90008A4343F00043920048BF43F080430093CD -:102EA000736813F400131BBF012304F580528DF8DF -:102EB0000D308DF80D301EBFD2F8B8340133C2F892 -:102EC000B834F38803F00F038DF80C309DF80C0034 -:102ED00000F09EFA5FFA8BF3984225D9F2180CA9FC -:102EE0000BF1010B127A0B4403F82C2CEEE7012FA7 -:102EF000A7D1E36AD3F8B02012F4FE0FA1D0D3F823 -:102F0000B420950141BF04F58051D1F898240132D5 -:102F1000C1F89824D3F8B420500692D0D3F8B45016 -:102F2000266AC5F30525A4E7EFB9E36AC3F8A850FC -:102F300004A807ADFFF71CFC98E80F0007C52B801D -:102F40000023204604A9ADF81830236804F5805406 -:102F5000DB6BCDE904A9984758B1D4F8903401331C -:102F6000C4F890346EE7012FE2D1E36AC3F8B85099 -:102F7000DEE7D4F8943401200133C4F8943461E7D7 -:102F80002DE9F04105460F4600F5805401263946EB -:102F90002846FFF745FF10B184F85364F7E7D4F8EB -:102FA000A834D4F854040133C4F8A83420B1036819 -:102FB000BDE8F0411B691847BDE8F081C36AF0B570 -:102FC0001A6C12F47F0F2BD01B6C00F5805441F269 -:102FD00068054FF0010CC4F8AC340023471900EB2E -:102FE00043125E012A44117911F0020F15D04907EE -:102FF00013D4B959C66A0CFA01F1D6F8CCE011EA3B -:103000000E0F0AD0C6F8D410117941F004011171E5 -:10301000D4F88C240132C4F88C240133202BDED167 -:10302000F0BD00002B4B70B51E561B5C012B30D839 -:10303000294D2A4A55F8233052F8264013B349B394 -:10304000236D9A0510D54FF40073236500F086F9BF -:1030500050EA01020B4602D0013861F1000302463A -:1030600055F82600FFF772FE236D9B012CD54FF01B -:10307000007255F82630226503F58053012283F84B -:10308000592421E001232365102323654FF4805345 -:10309000236570BD236DDA0702D4236D5B0706D567 -:1030A0000523002155F826002365FFF769FF236DEE -:1030B000D80602D4236D590606D55023012155F8B0 -:1030C00026002365FFF75CFF55F82600BDE8704039 -:1030D000FFF774BF08630008106400200C63000849 -:1030E00008B5302383F31188FFF768FF002383F3CB -:1030F000118808BDC36AD3F8C00010F07C5005D019 -:10310000D3F8C40080F40010C0F3405070470000B2 -:1031100008B5302383F3118800F58050406CFEF72A -:10312000C9FF002383F3118843090CBF012000204D -:1031300008BD000000F5805393F8592462B1C16ABC -:103140008A6922F001028A61D3F89C240132C3F813 -:103150009C24002283F85924704700002DE9F7438E -:10316000302181F3118800F58251002541F2680E6B -:103170004FF00108103100F5805C00EB45147444F9 -:10318000267977071CD4F6061AD58E69D0F82C90CC -:1031900008FA06F6D9F8CC703E4211D04F68019774 -:1031A0000F689742019F9F410AD2C9F8D4602679DF -:1031B00046F004062671DCF888440134CCF88844D3 -:1031C00001352031202DD8D1002383F3118803B09D -:1031D000BDE8F083F8B51E4600230F460546137080 -:1031E0001446FFF795FF80F0010038701EB12846A5 -:1031F000FFF780FF2070F8BD2DE9F04F85B09946AC -:103200000D468046164691F800B0DDE90EA3029304 -:103210001378019300F0A2F82B7804460F4613B9F7 -:103220003378002B41D022463B464046FFF796FFBD -:10323000FFF756FFFFF77EFF4B4632462946FFF762 -:10324000C9FF2B7833B1BBF1000F03D0012005B0CB -:10325000BDE8F08F337813B1019B002BF6D108F550 -:10326000805303935445029B77EB03031DD2039BCA -:10327000D3F85404C8B10368AAEB04011B6898474B -:103280004B46324629464046FFF7A4FF2B7813B140 -:10329000BBF1000FDAD1337813B1019B002BD5D1EC -:1032A00000F05CF804460F46DCE70020CFE70000A2 -:1032B000002108B50846FFF7B5FEBDE8084001F05B -:1032C0006DB8000008B501210020FFF7ABFEBDE896 -:1032D000084001F063B8000008B500210120FFF7A5 -:1032E000A1FEBDE8084001F059B80000012108B571 -:1032F0000846FFF797FEBDE8084001F04FB8000010 -:1033000000B59BB0EFF3098168226846FEF75AFBCF -:10331000EFF30583014B9B6BFEE700BF00ED00E080 -:1033200008B5FFF7EDFF000000B59BB0EFF3098192 -:1033300068226846FEF746FBEFF30583014B5B6BA3 -:10334000FEE700BF00ED00E0FEE700000FB408B5A7 -:10335000029801F0C1FEFEE702F0EEB902F0D0B92A -:1033600013B56C46031D84E8060094E8030083E867 -:103370000500012002B010BD73B58568019155B1FB -:103380001B885B0707D4D0E900369B6B9847019AEE -:10339000C1B23046A847012002B070BDF0B58668C2 -:1033A00089B005460C465EB1BDF838305B070AD4DB -:1033B000D0E900379B6B98472246C1B23846B047E8 -:1033C000012009B0F0BD0022002301F10806CDE97B -:1033D000002300230A46ADF8083003AB106808321A -:1033E00052F8041C1C46B24203C42346F6D11068AE -:1033F00020609288A280FFF7B1FF0423ADF8083067 -:103400002B68CDE90001DB6B694628469847D7E772 -:10341000082817D909280CD00A280CD00B280CD062 -:103420000C280CD00D280CD00E2814BF40203020C2 -:1034300070470C20704710207047142070471820E8 -:1034400070472020704700002DE9F041456A15B90A -:103450004162BDE8F0814B68AC4623F06047C3F39E -:103460008A464FEAD37EC3F3807816EA230638BF34 -:103470003E462B465A68BEEBD27F22F060440AD00B -:10348000002A18DAA40CB44217D19D420FD10D6066 -:10349000DEE71346EEE7A74207D102F08044C2F30D -:1034A000807242450BD054B1EFE708D2EDE7CCF87B -:1034B00000100B60CDE7B44201D0B442E5D81A68E1 -:1034C0009C46002AE5D11960C3E700002DE9F047CA -:1034D000089D01F0070400EBD1004FF47F494FEA4B -:1034E000D508224405F00705944201D1BDE8F087D4 -:1034F00004F0070705F0070A111B08EBD50E574526 -:103500003E4613F80EC038BF5646C6F108068E4236 -:1035100028BF0E46E108415C34443544B94029FADD -:1035200006F721FA0AF1FFB28CEA010147FA0AF71D -:1035300039408CEA010C03F80EC0D5E780EA01207F -:10354000082341F2210201B2013B4000002980B270 -:10355000B8BF504013F0FF03F5D1704738B50C46A3 -:103560008D18A54200D138BD14F8011BFFF7E6FF06 -:10357000F7E7000042684AB11368818943604389D4 -:1035800001339BB29942438138BF83811046704713 -:1035900070B588B0044620220D4668460021FEF72B -:1035A00023FA20460495FFF7E5FF024660B16B461B -:1035B000054608AE1C46083503CCB44245F8080C55 -:1035C00045F8041C2346F5D1104608B070BD000034 -:1035D000082817D909280CD00A280CD00B280CD0A1 -:1035E0000C280CD00D280CD00E2814BF4020302001 -:1035F00070470C2070471020704714207047182027 -:103600007047202070470000082817D90C280CD9D3 -:1036100010280CD914280CD918280CD920280CD91A -:1036200030288CBF0F200E207047092070470A20D9 -:1036300070470B2070470C2070470D20704700002A -:103640002DE9F843078C0446072F1ED900254FF6B5 -:10365000FF73D0E90298C5F12006A5F1200029FAF0 -:1036600005F1083508FA06F628FA00F0314301435F -:103670001846C9B2FFF762FF402D0346EBD13A4628 -:10368000E169BDE8F843FFF769BF4FF6FF70BDE899 -:10369000F883000010B54B6823B9CA8A63F30902A6 -:1036A000CA8210BD04691A681C600361C38A013BA9 -:1036B000C3824A60EFE700002DE9F84F1D46CB8A30 -:1036C0000F468146C3F30901924605290B4630D0C7 -:1036D0000020AAB207F11A049EB21FFA80F8042E45 -:1036E0000FD8904503F1010306D30A44FB8A62F325 -:1036F00009030120FB821AE01AF800600130E65449 -:10370000EAE79045F1D2A1F1050B1C237C68BBFBD5 -:10371000F3F203FB12BB1FFA8BF6002C45D148468F -:10372000FFF728FF044638B978606FF00200BDE863 -:10373000F88F4FF00008E6E7002606607860ADB22B -:103740004FF0000B454510D90AEB0803221D13F872 -:10375000011B08F101089155B1B21FFA88F81B2925 -:103760002BD0454506F10106F1D8FB8AC3F30902C7 -:10377000154465F30903BCE701321C4692B2236885 -:10378000002BF9D16B1F0B441C21B3FBF1F3013368 -:103790009BB29A42D3D2BBF1000FD0D14846FFF77B -:1037A000E9FE20B9C4F800B0BFE70122E7E7C0F89E -:1037B00000B05E4620600446C1E74545D5D948467D -:1037C000FFF7D8FE08B92060AFE7C0F800B00026C8 -:1037D00020600446B6E700002DE9F04F1C4607467E -:1037E00088462DED028B83B05B690192002B00F0BF -:1037F0009A80238C2BB1E269002A00F09480072B79 -:1038000035D807F10C00FFF7B5FE054638B96FF063 -:103810000205284603B0BDEC028BBDE8F08F1422F0 -:103820000021FEF7E1F8228CE16905F10800FEF7BE -:10383000C9F8208C48F00041013080B2FFF7E4FE67 -:10384000FFF7C6FE013880B2208401302874384664 -:103850006369228C1B782A4403F01F0363F03F0343 -:10386000137269602946FFF7EFFD0125D1E74FF09C -:10387000000900F10C034FF0800A4E464D4608EE59 -:10388000103A18EE100AFFF775FE83460028BED0E6 -:1038900014220021FEF7A8F8002E3AD1019B022243 -:1038A000ABF808300BF1080E1FFA82FC218C0CF1EA -:1038B0000100BCF1060F80B201D88E422BD3FFF776 -:1038C000A3FE8E4208BF4FF0400AFFF781FE6269F7 -:1038D0000138013512781BFA80F1013002F01F0225 -:1038E0002DB242EA491289F001094AEA020A48F077 -:1038F000004281F808A059468BF810003846CBF8F2 -:1039000004204FF0000AFFF79FFD238CB342B8D18B -:103910007FE70022C6E7E169895D01360EF80210F3 -:10392000B6B20132C0E76FF0010572E7F8B515468F -:103930000E463022002104461F46FEF755F8069B2E -:10394000B5F5001FA760636004F11000079B34BF4A -:103950006A094FF6FF72E661A362002397B29A42AA -:1039600006D800230360A782E3822383E360F8BDC7 -:103970000660013330462036F1E7000003781BB9BA -:103980004BB2002BC8BF0170704700000078704731 -:10399000F8B50C46C969074611B9238C002B37D1FD -:1039A000257E1F2D34D8387828BB228C072A2CD8A6 -:1039B000268A36F003032BD14FF6FF70FFF7CEFDBA -:1039C00020F0010031024FF6FF72400441EA056128 -:1039D000400C41EA4025234629463846FFF7FCFEC5 -:1039E000002807DD626913780133DBB21F2B88BF23 -:1039F00000231370F8BD218A2D0645EA01250543F1 -:103A00002046FFF71DFE0246E5E76FF00300F1E7F1 -:103A10006FF00100EEE7000070B58AB0044616466C -:103A20000021282268461D46FDF7DEFFBDF838302C -:103A300069462046ADF810300F9B05939DF8403045 -:103A40008DF81830119B0793BDF84830CDE9026519 -:103A5000ADF82030FFF79CFF0AB070BD2DE9F041B2 -:103A6000D36905460C4616460BB9138C5BBB377EF3 -:103A70001F2F28D895F80080B8F1000F26D03046C7 -:103A8000FFF7DEFD337821020246284641EAC331C2 -:103A9000338A41EA080141EA076141EA03413346BA -:103AA00041F08001FFF798FE00280ADD3378012BF2 -:103AB00007D1726913780133DBB21F2B88BF002353 -:103AC0001370BDE8F0816FF00100FAE76FF00300BA -:103AD000F7E70000F0B58BB004460D46174600210D -:103AE000282268461E46FDF77FFF9DF84C30294688 -:103AF00020465A1E534253416A468DF800309DF8C5 -:103B00004030ADF81030119B05939DF848308DF88A -:103B10001830149B0793BDF85430CDE90276ADF808 -:103B20002030FFF79BFF0BB0F0BD0000406A00B1F2 -:103B300004307047436A1A68426202691A6003617E -:103B4000C38A013BC38270472DE9F041D0F8208041 -:103B500014461D46184E4146002709B9BDE8F081BC -:103B6000D1E90223A21A65EB0303964277EB030324 -:103B70001ED2036A8B420DD1FFF78CFD036A1B68CE -:103B8000036203690B60C38A0161013B016AC3825E -:103B90008846E2E7FFF77EFD0B68C8F8003003694E -:103BA0000B60C38A0161013BC382D8F80010D4E7DF -:103BB00088460968D1E700BF80841E002DE9F04FD8 -:103BC0008BB00D4614469B46DDF850908046002889 -:103BD00000F01881B9F1000F00F01481531E3F2B43 -:103BE00000F21081012A03D1BBF1000F40F00A81DD -:103BF0000023CDE90833B8F81430B5EBC30F4FEA12 -:103C0000C30703D300200BB0BDE8F08F2B199F42F0 -:103C1000D8F80C3036BF7F1B2746FFB21BB9D8F847 -:103C20001030002B7AD0272D4DD8C5F1280600235F -:103C30002946B742009308ABD8F808002CBFF6B26B -:103C40003E46A7EB060A354432465FFA8AFAFFF78A -:103C50003DFCB8F81430282103F10053053BDB008C -:103C60000493D8F80C300393039B13B1BAF1000FFF -:103C70002CD1D8F8100040B1BAF1000F05D008AB34 -:103C80005246691A0096FFF721FC38B2002FB9D0CE -:103C900066070AD00AAB624203EBD40102F00702C6 -:103CA00011F8083C134101F8083C082C3DD9102CB0 -:103CB00040F2B580202C40F2B780BBF1000F00F03D -:103CC0009C80082335E0BA460026C2E7049BE02B1F -:103CD00028BFE02306930B44AB42059315D95A1B2A -:103CE0000398691A0096924508AB00F1040034BFAE -:103CF0005246D2B20792FFF7E9FB079A1644AAEBA5 -:103D0000020A1544F6B25FFA8AFA049B069A0599EC -:103D10009B1A0493039B1B680393A5E700933A4601 -:103D200008AB2946D8F80800ADE7BBF1000F13D067 -:103D30000123B4EBC30F6BD0082C12D89DF82030B0 -:103D4000621E23FA02F2D50706D54FF0FF3202FABF -:103D500004F423438DF820309DF8203089F800309A -:103D600051E7102C12D8BDF82030621E23FA02F25F -:103D7000D10706D54FF0FF3202FA04F42343ADF821 -:103D80002030BDF82030A9F800303CE7202C0FD8B7 -:103D90000899631E21FA03F3DA0705D54FF0FF32C5 -:103DA00002FA04F40C430894089BC9F800302AE78F -:103DB000402C2AD0611EC4F12102A4F12103DDE9C7 -:103DC000086526FA01F105FA02F225FA03F3114318 -:103DD0001943CB0711D50122A4F12003C4F120011E -:103DE00002FA03F322FA01F1A2400B43524263EBC1 -:103DF000430332432B43CDE90823DDE90823C9E916 -:103E0000002300E76FF00100FDE66FF00800FAE61E -:103E1000082CA1D9102CB4D9202CEED8C4E7BBF1C2 -:103E2000000FAED0022384E7BBF1000FBCD0042307 -:103E30007FE70000012A30B5144638BF012485B061 -:103E40000025402C28BF4024012ACDE9025518D86E -:103E50001B788DF8083063070AD004AB624203EB8D -:103E6000D40502F0070215F8083C934005F8083C19 -:103E7000034600912246002102A8FFF727FB05B068 -:103E800030BD082AE4D9102A03D81B88ADF80830C1 -:103E9000E1E7202A95BF1B68D3E900230293CDE90F -:103EA0000223D8E710B5CB681BB98B600B618B82FE -:103EB00010BD04691A681C600361C38A013BC38298 -:103EC000CA60F0E703064CBFC0F3C0300220704761 -:103ED00008B50246FFF7F6FF022806D15306C2F3E3 -:103EE0000F2001D100F0030008BDC2F30740FBE73B -:103EF0002DE9F04F93B004460D46CDE903230A683F -:103F00001046FFF7DFFF0228824614BFC2F30626E1 -:103F10000026002A80F2F38112F0C04940F0EF81C0 -:103F2000097B002900F0EB81022803D02378B342FB -:103F300040F0E881C2F3046310462944069302F07E -:103F40007F030593FFF7C4FF059B002283464FEADA -:103F50008348002348EA0A4848EA4668CE78CDE913 -:103F60000823F30948EA0008029368D0059B02463B -:103F700008A92046009353466768B847002800F018 -:103F8000C481276A4FB9414604F10C00FFF700FBDA -:103F9000074690B96FF0020055E03B6998450DD097 -:103FA0003F68002FF9D1414604F10C00FFF7F0FA09 -:103FB00007460028EED0236A3B60276297F817C0B7 -:103FC00006F01F08CCF3840CACEB0800A8EB0C0344 -:103FD0001FFA80FE0028B8BF0EF120001FFA83FEF2 -:103FE000B8BF00B2002B0793B8BF0EF12003D7E98A -:103FF0000221BCBF1BB2079352EA010338D0039BD6 -:104000004FF0000CDFF820E39A1A049B63EB0101E8 -:1040100096457CEB01032BD36B7B97F81AE0734535 -:1040200019D1029B002B78D0012821DC7868F8B9DF -:10403000DFF8F0C2944570EB010316D337E0276A2E -:1040400027B96FF00C0013B0BDE8F08F3B699845BD -:10405000B4D03F68F4E7B34890427CEB010301D34E -:104060000020F0E7029B002BFAD0079B0F2B17DCF8 -:10407000FA7DB3003946204602F0030203F07C03C8 -:104080001343FB75FFF706FB6B7BBB76029B3BB9CB -:10409000FB7DC3F38402013262F38603FB75D0E734 -:1040A0006A7BBB7E9A42DBD1029B002B35D0B309E1 -:1040B000022B32D0039B142200210DA8BB60049B6D -:1040C000FB60FDF791FC039B0AA920460A93049B21 -:1040D000ADF83EB00B932B1D8DF840A00C932B7BBD -:1040E0008DF84180013BDBB2ADF83C30069B8DF88A -:1040F0004230059B8DF8433094F82C3083F0010357 -:104100008DF84430A3689847FB7DC3F384030133E3 -:1041100003F01F039B02FB82A2E7FB7DC6F3401264 -:10412000B2EBD31F40F0F480C3F38403434540F067 -:10413000F280029AB6092B7B002A4DD0F2075DD49B -:10414000032B40F2EB80039BAE1D394604F10C00BB -:10415000BB603246049BFB602B7B033BDBB2FFF76B -:10416000ABFA00280CDA39462046FFF793FAFB7DBC -:10417000C3F38403013303F01F039B02FB8209E7AF -:10418000AB88DDE908843B834FF6FF73C9F120005B -:10419000A9F1200228FA09F109F1080904FA00F04E -:1041A00024FA02F2014318461143C9B2FFF7C6F9D7 -:1041B000B9F1400F0346E9D1B88231462A7B033A70 -:1041C000D2B2FFF7CBF9FB7DB882DA43C2F3C0125B -:1041D00062F3C713FB7543E786B92E1D013B3946D1 -:1041E00004F10C00DBB23246FFF766FA0028BADBB6 -:1041F0002A7B3146B88A013AD2B2E2E7F98A013B1A -:10420000C1F30901DAB204295BD8281D002307F1A4 -:104210001B069A4208D910F801CB013306F801C0F9 -:104220000131DBB20529F4D1039993420A9138BFD9 -:10423000043304992CBF002355FA83F30B9107F143 -:104240001B010C9179680E930D91291DFB8AADF825 -:104250003EB0C3F309038DF840A08DF841801A44A5 -:10426000069B8DF84230059BADF83C208DF843301D -:1042700094F82C3083F001038DF844300023B88A81 -:104280007B602A7B013AFFF769F93B8BB882834256 -:1042900003D1A3680AA92046984720460AA9FFF738 -:1042A00001FEFB7DBA8AC3F38403013303F01F03CD -:1042B0009B02FB823B8B9A420CBF00206FF01000E8 -:1042C000C1E67B68002BAFD0052001E01C303346EF -:1042D0001E68002EFAD1091A2E1D081D184401EB84 -:1042E000090C5FFA89F3BCF11B0F9DD89A429BD948 -:1042F00016F8013B09F1010900F8013BEFE76FF007 -:104300000900A0E66FF00A009DE66FF00B009AE648 -:104310006FF00D0097E66FF00E0094E66FF00F005F -:1043200091E600BF40420F0080841E00EFF3098336 -:10433000054968334A6B22F001024A6383F3098816 -:10434000002383F31188704700EF00E0302080F3F2 -:10435000118862B60D4B0E4AD96821F4E061090458 -:10436000090C0A430B49DA60D3F8FC2042F0807252 -:10437000C3F8FC20084AC2F8B01F116841F00101DF -:1043800011602022DA7783F82200704700ED00E008 -:104390000003FA0555CEACC5001000E0302310B57F -:1043A00083F311880E4B5B6813F4006314D0F1EEB5 -:1043B000103AEFF309844FF08073683CE361094BD6 -:1043C000DB6B236684F3098800F050FE10B1064BC6 -:1043D000A36110BD054BFBE783F31188F9E700BF2C -:1043E00000ED00E000EF00E03F0400084204000898 -:1043F00008B5074B074A196801F03D0199605368F9 -:104400000BB190689847BDE80840FFF7C7BF00BFF1 -:10441000000002402464002008B5084B196889098F -:1044200001F03D018A019A60054AD3680BB1106919 -:104430009847BDE80840FFF7B1BF00BF0000024049 -:104440002464002008B5084B1968090C01F03D01EF -:104450000A049A60054A53690BB190699847BDE810 -:104460000840FFF79BBF00BF00000240246400200B -:1044700008B5084B1968890D01F03D018A059A605D -:10448000054AD3690BB1106A9847BDE80840FFF7A9 -:1044900085BF00BF000002402464002008B5074B20 -:1044A000074A596801F03D01D960536A0BB1906A1F -:1044B0009847BDE80840FFF771BF00BF0000024009 -:1044C0002464002008B5084B5968890901F03D01B2 -:1044D0008A01DA60054AD36A0BB1106B9847BDE8D0 -:1044E0000840FFF75BBF00BF0000024024640020CB -:1044F00008B5084B5968090C01F03D010A04DA605F -:10450000054A536B0BB1906B9847BDE80840FFF725 -:1045100045BF00BF000002402464002008B5084BDE -:104520005968890D01F03D018A05DA60054AD36BAF -:104530000BB1106C9847BDE80840FFF72FBF00BFD4 -:10454000000002402464002008B5074B074A1968A0 -:1045500001F03D019960536C0BB1906C9847BDE838 -:104560000840FFF71BBF00BF000402402464002086 -:1045700008B5084B1968890901F03D018A019A6064 -:10458000054AD36C0BB1106D9847BDE80840FFF7A2 -:1045900005BF00BF000402402464002008B5084B9A -:1045A0001968090C01F03D010A049A60054A536D2F -:1045B0000BB1906D9847BDE80840FFF7EFBE00BF14 -:1045C000000402402464002008B5084B1968890DD6 -:1045D00001F03D018A059A60054AD36D0BB1106E5A -:1045E0009847BDE80840FFF7D9BE00BF000402406D -:1045F0002464002008B5074B074A596801F03D01C3 -:10460000D960536E0BB1906E9847BDE80840FFF734 -:10461000C5BE00BF000402402464002008B5084B5A -:104620005968890901F03D018A01DA60054AD36EB3 -:104630000BB1106F9847BDE80840FFF7AFBE00BF51 -:10464000000402402464002008B5084B5968090C96 -:1046500001F03D010A04DA60054A536F0BB1906F17 -:104660009847BDE80840FFF799BE00BF000402402C -:104670002464002008B5084B5968890D01F03D01FC -:104680008A05DA60054AD36F13B1D2F880009847E3 -:10469000BDE80840FFF782BE000402402464002009 -:1046A00000230C4910B51A460B4C0B6054F823003C -:1046B000026001EB430004334260402BF6D1074A0D -:1046C0004FF0FF339360D360C2F80834C2F80C3463 -:1046D00010BD00BF246400207C630008000002407D -:1046E0000F28F8B510D9102810D0112811D0122891 -:1046F00008D10F240720DFF8B4E00126DEF80050CF -:10470000A04208D9002649E00446F4E70F2400201F -:10471000F1E70724FBE706FA00F73D4240D1214CC0 -:104720004FEA001C3D4304EB00160EEBC000CEF830 -:104730000050C0E90123FBB24BB11B48836B43F02F -:1047400001038363036E43F001030366036E17F4F2 -:104750007F4F09D01448836B43F002038363036ED9 -:1047600043F002030366036E54F80C00036823F061 -:104770001F030360056815F00105FBD104EB0C0372 -:104780003D2493F80CC05F6804FA0CF43C602124CB -:104790000560446112B1987B00F00EFA3046F8BD16 -:1047A0000130ADE77C630008004502582464002016 -:1047B00010B5302484F31188FFF792FF002383F3B0 -:1047C000118810BD10B50446807B00F00BFA012360 -:1047D0001049627B03FA02F20B6823EA0203DAB2A1 -:1047E0000B604AB90C4A916B21F001019163116E83 -:1047F00021F001011166126E13F47F4F09D1064BAF -:104800009A6B22F002029A631A6E22F002021A6672 -:104810001B6E10BD246400200045025808B53023EB -:1048200083F31188FFF7CEFF002383F3118808BDBF -:104830000023054A19460133102BC2E9001102F189 -:104840000802F8D1704700BFA86400202DE9F74F97 -:1048500002F0030AC2F3C313C2F38009C2F3C10812 -:10486000C2F3411E574600224FF00F0B0193CB07B6 -:1048700033D502F00703019C012556009B00BAF1D5 -:10488000020F05FA02F504FA03FC44680BFA03F37D -:1048900024EA05046FEA030344EA090444604FF084 -:1048A0000304856804FA06F625EA06056FEA06049D -:1048B00045EA08058560C56825EA060545EA0E054E -:1048C000C5601BD1072A13D8056A2B4043EA0C03A5 -:1048D000036203681C403C430460490822D04FEA4D -:1048E000490901324FEA88084FEA8E0EBF00BEE741 -:1048F000456A2B4043EA0C034362EAE70568072A4E -:1049000004EA050444EA0704046005D8046A234065 -:1049100043EA0C030362E0E7446A234043EA0C03E2 -:104920004362DAE703B0BDE8F08F00000268436835 -:104930001143016003B1184770470000024A136831 -:1049400043F0C0031360704700100140024A13682F -:1049500043F0C00313607047007C004037B51A4C29 -:104960001A4D204600F0E8FA04F1140000940023E8 -:104970004FF40072164900F0A5F94FF40072154982 -:1049800004F138000094144B00F01EFA134BC4E9F4 -:104990001735134C204600F0CFFA04F11400002321 -:1049A0004FF400720F49009400F08CF90E4B4FF455 -:1049B00000720E4904F13800009400F005FA0C4B27 -:1049C000C4E9173503B030BD2865002000E1F505C6 -:1049D00000660020006A00203D49000800100140E8 -:1049E00094650020006800204D490008006C0020FC -:1049F000007C0040037C30B5284C002918BF0C46D1 -:104A0000012B0CD1264B984236D1264B1A6D42F021 -:104A100010021A659A6F42F010029A679B6F226823 -:104A2000036EC16D03EB52038466B3FBF2F362685D -:104A3000150442BF23F0070503F0070343EA4503CB -:104A4000CB60A36843F040034B60E36843F001038D -:104A50008B6042F4967343F001030B604FF0FF3319 -:104A60000B62510505D512F0102213D0B2F1805F10 -:104A700012D080F8643030BD0B4B9842CFD1094B37 -:104A80009A6C42F000429A641A6F42F000421A6730 -:104A90001B6FC4E77F23ECE73F23EAE77C64000851 -:104AA0002865002000450258946500202DE9F04754 -:104AB000C66D05463768F469210734621AD014F0D0 -:104AC000080118BF4FF48071E20748BF41F0200190 -:104AD000A3074FF0300348BF41F04001600748BFD3 -:104AE00041F0800183F31188281DFFF71FFF002389 -:104AF00083F31188E2050AD5302383F311884FF43C -:104B00008061281DFFF712FF002383F311884FF007 -:104B100030094FF0000A14F0200838D13B0616D5B2 -:104B20004FF0300905F1380A200610D589F31188B5 -:104B3000504600F07DF9002836DA0821281DFFF7DD -:104B4000F5FE27F080033360002383F31188790694 -:104B500014D5620612D5302383F31188D5E91323C7 -:104B60009A4208D12B6C33B127F040071021281D41 -:104B7000FFF7DCFE3760002383F31188E30618D5C6 -:104B8000AA6E1369ABB15069BDE8F047184789F3C5 -:104B90001188736A284695F86410194000F0E6F908 -:104BA0008AF31188F469B6E7B06288F31188F46972 -:104BB000BAE7BDE8F0870000090100F16043012277 -:104BC00003F56143C9B283F8001300F01F039A4054 -:104BD00043099B0003F1604303F56143C3F880215F -:104BE0001A60704700F01F0301229A40430900F148 -:104BF00060409B0000F5614003F1604303F56143B1 -:104C0000C3F88020C3F88021002380F80033704768 -:104C1000F8B51546826804460B46AA4200D285685C -:104C2000A1692669761AB5420BD218462A46FCF7C6 -:104C3000C9FEA3692B44A3612846A3685B1BA3603C -:104C4000F8BD0CD9AF1B18463246FCF7BBFE3A46FE -:104C5000E1683044FCF7B6FEE3683B44EBE71846F6 -:104C60002A46FCF7AFFEE368E5E70000836893425D -:104C7000F7B50446154600D28568D4E90460361AB3 -:104C8000B5420BD22A46FCF79DFE63692B44636153 -:104C90002846A3685B1BA36003B0F0BD0DD9324664 -:104CA000AF1B0191FCF78EFE01993A46E068314452 -:104CB000FCF788FEE3683B44E9E72A46FCF782FEFE -:104CC000E368E4E710B50A440024C361029B8460F2 -:104CD000C16002610362C0E90000C0E9051110BDB6 -:104CE00008B5D0E90532934201D1826882B9826861 -:104CF000013282605A1C426119700021D0E90432ED -:104D00009A4224BFC368436100F052FA002008BDF4 -:104D10004FF0FF30FBE7000070B5302304460E462D -:104D200083F31188A568A5B1A368A269013BA360BC -:104D3000531CA36115782269934224BFE368A361E1 -:104D4000E3690BB120469847002383F31188284676 -:104D500007E03146204600F01BFA0028E2DA85F32E -:104D6000118870BD2DE9F74F04460E461746984648 -:104D7000D0F81C904FF0300A8AF311884FF0000BE6 -:104D8000154665B12A4631462046FFF741FF0346E6 -:104D900060B94146204600F0FBF90028F1D000231D -:104DA00083F31188781B03B0BDE8F08FB9F1000FD1 -:104DB00003D001902046C847019B8BF31188ED1A60 -:104DC0001E448AF31188DCE7C160C361009B8260E6 -:104DD0000362C0E905111144C0E900000161704798 -:104DE000F8B504460D461646302383F31188A768AC -:104DF000A7B1A368013BA36063695A1C62611D707F -:104E0000D4E904329A4224BFE3686361E3690BB1D9 -:104E100020469847002080F3118807E0314620465D -:104E200000F0B6F90028E2DA87F31188F8BD000037 -:104E3000D0E9052310B59A4201D182687AB9826817 -:104E40000021013282605A1C82611C7803699A42F7 -:104E500024BFC368836100F0ABF9204610BD4FF05A -:104E6000FF30FBE72DE9F74F04460E4617469846FC -:104E7000D0F81C904FF0300A8AF311884FF0000BE5 -:104E8000154665B12A4631462046FFF7EFFE034638 -:104E900060B94146204600F07BF90028F1D000239C -:104EA00083F31188781B03B0BDE8F08FB9F1000FD0 -:104EB00003D001902046C847019B8BF31188ED1A5F -:104EC0001E448AF31188DCE70268436811430160DD -:104ED00003B11847704700001430FFF743BF0000CC -:104EE0004FF0FF331430FFF73DBF00003830FFF7BD -:104EF000B9BF00004FF0FF333830FFF7B3BF0000F9 -:104F00001430FFF709BF00004FF0FF311430FFF7F6 -:104F100003BF00003830FFF763BF00004FF0FF32DF -:104F20003830FFF75DBF0000012914BF6FF0130098 -:104F300000207047FFF712BD044B0360002343605D -:104F4000C0E9023301230374704700BF9464000872 -:104F500010B53023044683F31188FFF74BFD02237D -:104F60000020237480F3118810BD000038B5C36998 -:104F700004460D461BB904210844FFF7A5FF294646 -:104F800004F11400FFF7ACFE002806DA201D4FF4F0 -:104F90000061BDE83840FFF797BF38BD0023826845 -:104FA000037503691B6899689142FBD25A680360D4 -:104FB000426010605860704700238268037503697F -:104FC0001B6899689142FBD85A6803604260106080 -:104FD0005860704708B50846302383F311880B7D6D -:104FE000032B05D0042B0DD02BB983F3118808BDFA -:104FF0008B6900221A604FF0FF338361FFF7CEFF09 -:105000000023F2E7D1E9003213605A60F3E70000B1 -:10501000FFF7C4BF054BD96808751868026853606C -:105020001A600122D8600275FBF7F4B9006E002007 -:105030000C4B30B5DD684B1C87B004460FD02B46B7 -:10504000094A684600F046F92046FFF7E3FF009B57 -:1050500013B1684600F048F9A86907B030BDFFF702 -:10506000D9FFF9E7006E0020D54F0008044B1A68FD -:10507000DB6890689B68984294BF002001207047CD -:10508000006E0020084B10B51C68D8682268536079 -:105090001A600122DC602275FFF78EFF0146204670 -:1050A000BDE81040FBF7B6B9006E002038B5074CDC -:1050B00001230025064907482370656000F0C2FC03 -:1050C0000223237085F3118838BD00BF687000206B -:1050D000C0640008006E002008B572B6044B186565 -:1050E00000F0FCFA00F0C2FB024B03221A70FEE74C -:1050F000006E00206870002000F02CB98B60022345 -:10510000086108468B8270478368A3F1840243F8E4 -:10511000142C026943F8442C426943F8402C094A94 -:1051200043F8242CC268A3F1200043F8182C022273 -:1051300003F80C2C002203F80B2C034A43F8102C24 -:10514000704700BF2D040008006E002008B5FFF76F -:10515000DBFFBDE80840FFF75BBF0000024BDB68E8 -:1051600098610F20FFF756BF006E0020302383F3B5 -:105170001188FFF7F3BF000008B50146302383F321 -:1051800011880820FFF754FF002383F3118808BD1E -:10519000064BDB6839B1426818605A60136043609F -:1051A0000420FFF745BF4FF0FF307047006E00202E -:1051B0000368984206D01A680260506018469961E8 -:1051C000FFF726BF70470000036810B59C68A24235 -:1051D0000CD85C688A600B604C60216059609968EB -:1051E0008A1A9A604FF0FF33836010BD121B1B6850 -:1051F000ECE700000A2938BF0A2170B504460D46C5 -:105200000A26601900F016FC00F0FEFB041BA54204 -:1052100003D8751C04462E46F3E70A2E04D9012054 -:10522000BDE8704000F04EBC70BD0000F8B5144BF6 -:105230000D460A2A4FF00A07D96103F11001826076 -:1052400038BF0A224160196914460160486018613C -:10525000A81800F0DFFB00F0D7FB431B0646A34273 -:1052600006D37C1C28192746354600F0E3FBF2E7FD -:105270000A2F04D90120BDE8F84000F023BCF8BD96 -:10528000006E0020F8B506460D4600F0BDFB0F4A43 -:10529000134653F8107F9F4206D12A4601463046F6 -:1052A000BDE8F840FFF7C2BFD169BB68441A2C19AA -:1052B00028BF2C46A34202D92946FFF79BFF22466E -:1052C00031460348BDE8F840FFF77EBF006E00207E -:1052D000106E0020C0E90323002310B45DF8044BD6 -:1052E0004361FFF7CFBF000010B5194C2369984206 -:1052F0000DD08168D0E9003213605A609A680A4480 -:105300009A60002303604FF0FF33A36110BD026871 -:10531000234643F8102F53600022026022699A420C -:1053200003D1BDE8104000F07FBB936881680B4457 -:10533000936000F069FB2269E1699268441AA24215 -:10534000E4D91144BDE81040091AFFF753BF00BF6C -:10535000006E00202DE9F047DFF8BC8008F110074F -:105360002C4ED8F8105000F04FFBD8F81C40AA681B -:10537000031B9A423ED814444FF00009D5E900328D -:10538000C8F81C4013605A60C5F80090D8F8103077 -:10539000B34201D100F048FB89F31188D5E903310C -:1053A00028469847302383F311886B69002BD8D0A7 -:1053B00000F02AFB6A69A0EB040982464A450DD237 -:1053C000022000F07FFB0022D8F81030B34208D151 -:1053D00051462846BDE8F047FFF728BF121A22447D -:1053E000F2E712EB09092946384638BF4A46FFF76B -:1053F000EBFEB5E7D8F81030B34208D01444C8F833 -:105400001C00211AA960BDE8F047FFF7F3BEBDE814 -:10541000F08700BF106E0020006E002038B500F04D -:10542000F3FA054AD2E90845031B181945F10001B2 -:10543000C2E9080138BD00BF006E0020002070479F -:10544000FEE70000704700004FF0FF30704700009B -:10545000BFF34F8F044B1A695107FCD1D3F81021C9 -:105460005207F8D1704700BF0020005208B50D4B1D -:105470001B78ABB9FFF7ECFF0B4BDA68D10704D50B -:105480000A4A5A6002F188325A60D3F80C21D207D6 -:1054900006D5064AC3F8042102F18832C3F8042174 -:1054A00008BD00BF70700020002000522301674536 -:1054B00008B5114B1B78F3B9104B1A69510703D586 -:1054C000DA6842F04002DA60D3F81021520705D5BD -:1054D000D3F80C2142F04002C3F80C21FFF7B8FFCB -:1054E000064BDA6842F00102DA60D3F80C2142F090 -:1054F0000102C3F80C2108BD70700020002000528A -:105500000F289ABF00F5806040040020704700001B -:105510004FF4003070470000102070470F2808B586 -:105520000BD8FFF7EDFF00F500330268013204D11C -:1055300004308342F9D1012008BD0020FCE70000BF -:105540000F2838B505463FD8FFF782FF1F4CFFF7FD -:105550008DFF4FF0FF3307286361C4F814311DD865 -:105560002361FFF775FF030243F02403E360E36860 -:1055700043F08003E36023695A07FCD42846FFF711 -:1055800067FFFFF7BDFF4FF4003100F04BF92846ED -:10559000FFF78EFFBDE83840FFF7C0BFC4F81031F9 -:1055A000FFF756FFA0F108031B0243F02403C4F8E1 -:1055B0000C31D4F80C3143F08003C4F80C31D4F82A -:1055C00010315B07FBD4D9E7002038BD0020005222 -:1055D0002DE9F84F05460C46104645EA0203DE0663 -:1055E00002D00020BDE8F88F20F01F00DFF8BCB02B -:1055F000DFF8BCA0FFF73AFF04EB0008444503D1F5 -:105600000120FFF755FFEDE720222946204600F054 -:10561000EFFD10B920352034F0E72B4605F12002CC -:105620001F68791CDDD104339A42F9D105F1784322 -:105630001B481C4EB3F5801F1B4B38BF184603F1A7 -:10564000F80332BFD946D1461E46FFF701FF076077 -:10565000A5EB040C336804F11C0143F00203336032 -:10566000231FD9F8007017F00507FAD153F8042F5B -:105670008B424CF80320F4D1BFF34F8FFFF7E8FEC5 -:105680004FF0FF332022214603602846336823F081 -:105690000203336000F0ACFD0028BBD03846B0E711 -:1056A000142100520C2000521420005210200052ED -:1056B0001021005210B5084C237828B11BB9FFF710 -:1056C000D5FE0123237010BD002BFCD02070BDE857 -:1056D0001040FFF7EDBE00BF7070002038B5054DDB -:1056E00000240334696855F80C0B00F0ADF8122C57 -:1056F000F7D138BDCC640008084600F071BD000049 -:1057000038B5EFF311859DB9EFF30584C4F30804B0 -:10571000302334B183F31188FFF780FE85F31188BD -:1057200038BD83F31188FFF779FE84F3118838BD03 -:10573000BDE83840FFF772BE10B5FFF7E1FF104C2F -:10574000C008104A002340EA4170C908A0FB04ECDD -:10575000A0FB020E1CEB0000A1FB044CA1FB0212FB -:105760005B41001943EB0C0011EB0E0142F100020A -:10577000411842F10000090941EA007010BD00BF64 -:10578000CFF753E3A59BC4200244074BD2B210B518 -:10579000904200D110BD441C00B253F8200041F8E3 -:1057A000040BE0B2F4E700BF504000580E4B30B598 -:1057B0001C6F240405D41C6F1C671C6F44F4004448 -:1057C0001C670A4C02442368D2B243F480732360FE -:1057D000074B904200D130BD441C51F8045B00B22D -:1057E00043F82050E0B2F4E7004402580048025861 -:1057F0005040005807B5012201A90020FFF7C4FF5F -:10580000019803B05DF804FB13B50446FFF7F2FFFF -:10581000A04205D0012201A900200194FFF7C6FF94 -:1058200002B010BD0144BFF34F8F064B884204D332 -:10583000BFF34F8FBFF36F8F7047C3F85C02203008 -:10584000F4E700BF00ED00E00144BFF34F8F064BCB -:10585000884204D3BFF34F8FBFF36F8F7047C3F8F5 -:1058600070022030F4E700BF00ED00E07047000058 -:10587000074B45F255521A6002225A6040F6FF72F9 -:105880009A604CF6CC421A600122024B1A707047A3 -:105890000048005878700020034B1B781BB1034B65 -:1058A0004AF6AA221A607047787000200048005813 -:1058B000034B1A681AB9034AD2F8D0241A60704709 -:1058C0007470002000400258024B4FF48032C3F83D -:1058D000D02470470040025808B5FFF7E9FF024B9B -:1058E0001868C0F3806008BD7470002070B5BFF305 -:1058F0004F8FBFF36F8F1A4A0021C2F85012BFF3C7 -:105900004F8FBFF36F8F536943F400335361BFF37D -:105910004F8FBFF36F8FC2F88410BFF34F8FD2F851 -:10592000803043F6E074C3F3C900C3F34E335B0128 -:1059300003EA0406014646EA81750139C2F860525D -:10594000F9D2203B13F1200FF2D1BFF34F8F5369EF -:1059500043F480335361BFF34F8FBFF36F8F70BD3C -:1059600000ED00E0FEE70000214B2248224A70B51E -:10597000904237D3214BC11EDA1C121A22F00302C7 -:105980008B4238BF00220021FCF72EF81C4A00236E -:10599000C2F88430BFF34F8FD2F8803043F6E07402 -:1059A000C3F3C900C3F34E335B0103EA04060146A7 -:1059B00046EA81750139C2F86C52F9D2203B13F1E5 -:1059C000200FF2D1BFF34F8FBFF36F8FBFF34F8F15 -:1059D000BFF36F8F0023C2F85032BFF34F8FBFF376 -:1059E0006F8F70BD53F8041B40F8041BC0E700BF65 -:1059F000F86600087C7000207C7000207C7000201D -:105A000000ED00E000F01AB9014B586A704700BF82 -:105A1000000C0040034B002258631A610222DA6036 -:105A2000704700BF000C0040014B0022DA60704755 -:105A3000000C0040014B5863704700BF000C004051 -:105A4000FEE7000070B51B4B0025044686B0586089 -:105A50000E4685620163FEF779FC04F11003A56030 -:105A6000E562C4E904334FF0FF33C4E90044C4E9FC -:105A70000635FFF7C9FF2B46024604F134012046E4 -:105A8000C4E9082380230C4A2565FFF737FB01236F -:105A90000A4AE06000920375684672680192B26833 -:105AA000CDE90223064BCDE90435FFF74FFB06B0E5 -:105AB00070BD00BF687000201465000819650008FB -:105AC000415A0008024AD36A1843D062704700BFA7 -:105AD000006E00204B6843608B688360CB68C360B6 -:105AE0000B6943614B6903628B6943620B68036016 -:105AF0007047000008B53A4B40F2FF713948D3F8BF -:105B000088200A43C3F88820D3F8882022F4FF6253 -:105B100022F00702C3F88820D3F88830324B1A6C81 -:105B20000A431A649A6E0A439A66304A9B6E11467B -:105B3000FFF7D0FF00F5806002F11C01FFF7CAFFFC -:105B400000F5806002F13801FFF7C4FF00F58060C6 -:105B500002F15401FFF7BEFF00F5806002F1700111 -:105B6000FFF7B8FF00F5806002F18C01FFF7B2FF8C -:105B700000F5806002F1A801FFF7ACFF00F580603E -:105B800002F1C401FFF7A6FF00F5806002F1E00119 -:105B9000FFF7A0FF00F5806002F1FC01FFF79AFF1C -:105BA00002F58C7100F58060FFF794FF00F008F9B2 -:105BB0000F4BD3F8902242F00102C3F89022D3F8A1 -:105BC000942242F00102C3F894220522C3F89820DF -:105BD0004FF06052C3F89C20064AC3F8A02008BDCD -:105BE0000044025800000258004502582065000891 -:105BF00000ED00E01F00080308B500F0CDFAFFF744 -:105C000055FA0B4BDA6B42F04002DA635A6E22F01F -:105C100040025A665B6E074B1A6842F008021A602F -:105C20001A6842F004021A60BDE80840FFF740BE5F -:105C30000045025800180248704700000E4B9A6C4D -:105C400042F008029A641A6F42F008021A670B4A7F -:105C50001B6FD36B43F00803D363C722084B9A62D0 -:105C60004FF0FF32DA6200229A615A63DA605A60BA -:105C700001225A611A607047004502580010005C0A -:105C8000000C0040094A08B51169D3680B40D9B22D -:105C90009B076FEA0101116107D5302383F3118857 -:105CA000FFF72AFA002383F3118808BD000C004097 -:105CB000044BDA6B0243DA635A6E104358665B6E2C -:105CC000704700BF0045025808B53C4B4FF0FF310C -:105CD000D3F8802062F00042C3F88020D3F88020FF -:105CE00002F00042C3F88020D3F88020D3F884204B -:105CF000C3F88410D3F884200022C3F88420D3F89A -:105D00008400D86F40F0FF4040F4FF0040F4DF40D3 -:105D100040F07F00D867D86F20F0FF4020F4FF00EC -:105D200020F4DF4020F07F00D867D86FD3F88800D8 -:105D30006FEA40506FEA5050C3F88800D3F88800EB -:105D4000C0F30A00C3F88800D3F88800D3F89000A5 -:105D5000C3F89010D3F89000C3F89020D3F89000C7 -:105D6000D3F89400C3F89410D3F89400C3F89420A7 -:105D7000D3F89400D3F89800C3F89810D3F898009B -:105D8000C3F89820D3F89800D3F88C00C3F88C108F -:105D9000D3F88C00C3F88C20D3F88C00D3F89C0087 -:105DA000C3F89C10D3F89C10C3F89C20D3F89C3007 -:105DB000FEF776FCBDE8084000F0BEB9004402588A -:105DC00008B50122504BC3F80821504B5A6D42F0E0 -:105DD00002025A65DA6F42F00202DA670422DB6FD0 -:105DE0004B4BDA605A689104FCD54A4A1A6001228A -:105DF0009A60494ADA6000221A614FF440429A617F -:105E0000434B9A699204FCD51A6842F480721A6076 -:105E1000424B1A6F12F4407F04D04FF480321A675D -:105E200000221A671A6842F001021A603B4B1A6896 -:105E30005007FCD500221A611A6912F03802FBD112 -:105E4000012119604FF0804159605A67344ADA6283 -:105E5000344A1A611A6842F480321A602F4B1A6869 -:105E60009103FCD51A6842F480521A601A689204B1 -:105E7000FCD52D4A2D499A6200225A63196301F517 -:105E80007C01DA6301F5E77199635A64284A1A6460 -:105E9000284ADA621A6842F0A8521A601F4B1A6840 -:105EA00002F02852B2F1285FF9D148229A614FF4EA -:105EB0008862DA6140221A621F4ADA641F4A1A6550 -:105EC0001F4A5A651F4A9A6532231F4A1360136896 -:105ED00003F00F03022BFAD1104A136943F00303B6 -:105EE0001361136903F03803182BFAD14FF00050F7 -:105EF000FFF7DEFE4FF08040FFF7DAFE4FF0004084 -:105F0000BDE80840FFF7D4BE0080005100450258AC -:105F10000048025800C000F004000001004402588C -:105F20000000FF0100889008322060006302090130 -:105F3000470E0508DD0BBF01200000200000011006 -:105F40000910E00000010110002000524FF0B042A3 -:105F500008B5D2F8883003F00103C2F8883023B1C5 -:105F6000044A13680BB150689847BDE80840FEF733 -:105F700015BA00BFA86400204FF0B04208B5D2F8AF -:105F8000883003F00203C2F8883023B1044A9368D2 -:105F90000BB1D0689847BDE80840FEF7FFB900BFD5 -:105FA000A86400204FF0B04208B5D2F8883003F062 -:105FB0000403C2F8883023B1044A13690BB1506955 -:105FC0009847BDE80840FEF7E9B900BFA864002083 -:105FD0004FF0B04208B5D2F8883003F00803C2F899 -:105FE000883023B1044A93690BB1D0699847BDE862 -:105FF0000840FEF7D3B900BFA86400204FF0B042BC -:1060000008B5D2F8883003F01003C2F8883023B105 -:10601000044A136A0BB1506A9847BDE80840FEF77E -:10602000BDB900BFA86400204FF0B04310B5D3F84D -:10603000884004F47872C3F88820A30604D5124A75 -:10604000936A0BB1D06A9847600604D50E4A136B69 -:106050000BB1506B9847210604D50B4A936B0BB1DB -:10606000D06B9847E20504D5074A136C0BB1506C0E -:106070009847A30504D5044A936C0BB1D06C98479C -:10608000BDE81040FEF78AB9A86400204FF0B04385 -:1060900010B5D3F8884004F47C42C3F88820620528 -:1060A00004D5164A136D0BB1506D9847230504D5DE -:1060B000124A936D0BB1D06D9847E00404D50F4A96 -:1060C000136E0BB1506E9847A10404D50B4A936E22 -:1060D0000BB1D06E9847620404D5084A136F0BB118 -:1060E000506F9847230404D5044A936F0BB1D06FC7 -:1060F0009847BDE81040FEF751B900BFA8640020E2 -:1061000008B50348FEF7D2FCBDE80840FEF746B9E3 -:106110002865002008B50348FEF7C8FCBDE8084024 -:10612000FEF73CB99465002008B5FFF7ABFDBDE86C -:106130000840FEF733B90000062108B50846FEF70F -:106140003BFD06210720FEF737FD06210820FEF75C -:1061500033FD06210920FEF72FFD06210A20FEF758 -:106160002BFD06211720FEF727FD06212820FEF72C -:1061700023FD09217A20FEF71FFD07213220FEF7BB -:106180001BFD0C212520FEF717FD0C215320BDE837 -:106190000840FEF711BD000008B5FFF795FDFEF7BA -:1061A00047FBFEF7C7FEFFF747FDBDE80840FFF7D6 -:1061B00029BC00000B460146184600F003B8000059 -:1061C00000F00EB810B5054C13462CB10A46014636 -:1061D0000220AFF3008010BD2046FCE70000000065 -:1061E000024B01461868FFF787BA00BF3C23002026 -:1061F00010B501390244904201D1002005E0037836 -:1062000011F8014FA34201D0181B10BD0130F2E775 -:106210002DE9F041A3B1C91A17780144044603F1EE -:10622000FF3C8C42204601D9002009E00578BD42A0 -:1062300004F10104F5D10CEB0405D618A54201D1F7 -:10624000BDE8F08115F8018D16F801EDF045F5D0A7 -:10625000E7E70000034611F8012B03F8012B002AA1 -:10626000F9D17047636F6D2E6375626570696C6FED -:10627000742E6865726534666300000053544D33B4 -:106280003248373F3F3F0053544D3332483733781D -:106290002F3732780053544D3332483734332F3749 -:1062A00035332F373530000001105A0003105900E4 -:1062B000012058000320560040A2E4F164689106D2 -:1062C0000041A3E5F26569920700000043414E4694 -:1062D0004449666163653A204D6573736167652063 -:1062E00052414D204F766572666C6F772100000039 -:1062F0004261642043414E496661636520696E6472 -:1063000065782E00000100000001FF0000A00040A1 -:1063100000A400400000000000000000712A0008F6 -:10632000F9220008F93100086923000875230008E4 -:106330008D270008ED2400083123000835230008CC -:106340000D230008F522000849270008192300083A -:1063500061330008252300081D27000801040E05ED -:10636000054B02020E05054B04010E05054B050108 -:106370000B04044B08010603034600001000024012 -:10638000080002400008024000000B002800024004 -:10639000080002400408024006010C0040000240D0 -:1063A000080002400808024010020D005800024098 -:1063B000080002400C08024016030E007000024064 -:1063C0000C0002401008024000040F008800024048 -:1063D0000C0002401408024006051000A000024014 -:1063E0000C0002401808024010061100B8000240DC -:1063F0000C0002401C08024016072F001004024047 -:106400000804024020080240000838002804024026 -:1064100008040240240802400609390040040240F2 -:106420000804024028080240100A3A0058040240BA -:10643000080402402C080240160B3B007004024086 -:106440000C04024030080240000C3C00880402406A -:106450000C04024034080240060D4400A00402402F -:106460000C04024038080240100E4500B8040240F7 -:106470000C0402403C080240160F46000096000043 -:10648000000000000000000000000000000000000C -:106490000000000000000000F54E0008E14E00087A -:1064A0001D4F0008094F0008154F0008014F000854 -:1064B000ED4E0008D94E0008294F00086330000057 -:1064C000BC640008586E00206870002000010020A5 -:1064D00000FF010002000000000000300000040086 -:1064E0000800000000000024000008000400000074 -:1064F0000004000000FC0000020000000000043066 -:1065000000800000080000000000003800000100CA -:10651000010000006D61696E0069646C6500000037 -:106520000000002800000000AAAAAAAA0000002477 -:10653000FFFF0000000000000000000000A0550A5E -:1065400000000000AAAA9AAA00500000FFF2000072 -:10655000000000770000990000000000000000002B -:10656000AAAAAAAA00000000FFFF00000000000085 -:10657000000000005A000000000000009AAAAAAA29 -:1065800000000000F3FF0000990000000000000080 -:106590000A00000000000000AAAAAAAA0500000044 -:1065A000FFFF000088000000000000000000000065 -:1065B00000000000AAAAAAAA00000000FFFF000035 -:1065C00000000000000000000000000000000000CB -:1065D000AAAAAAAA00000000FFFF00000000000015 -:1065E000000000000000000000000000AAAAAAAA03 -:1065F00000000000FFFF000000000000000000009D -:106600000000000000000000AAAAAAAA00000000E2 -:10661000FFFF00000000000000000000000000007C -:1066200000000000AAAAAAAA00000000FFFF0000C4 -:10663000000000000000000000000000000000005A -:10664000AAAAAAAA00000000FFFF000000000000A4 -:106650000000000000000000130400000000000023 -:106660000000180000000000FE2A0100D204000013 -:10667000FF00000028650020946500200000000055 -:106680007C62000883040000876200085004000058 -:106690009562000840230020000000000000000078 -:1066A00000000000000000000000000000000000EA -:1066B00000000000000000000000000000000000DA -:1066C00000000000000000000000000000000000CA -:1066D00000000000000000000000000000000000BA -:1066E00000000000000000000000000000000000AA -:0866F0000000000000000000A2 +:101AE00087BA00BF94630020AC6300201C23002051 +:101AF000F8B571B6002301201A46194602F0A8FE77 +:101B00000446802003F0E8FE002849D00025254A3D +:101B100080274FF4D06C3D26136913F0C06F26D197 +:101B2000D2F8103113F0C06F21D1236805F10061A4 +:101B300099602368D86023685F602368C3F800C099 +:101B400021680B6843F001030B6021680B6823F0E8 +:101B50001E030B6021680B68DB07FCD4237B8035F8 +:101B6000616806FA03F3B5F5001F0B60D4D1204677 +:101B700002F0A4FEB5F5001F11D000240A4E0B4D53 +:101B8000012003F00BFE3388A34205D928682044C6 +:101B9000013403F049FDF6E7002003F0FFFD61B6D4 +:101BA000F8BD00BF00200052AE6300206863002033 +:101BB0002DE9F3470D46044600219046284640F2A1 +:101BC0007912FFF711FF234620220021284604F155 +:101BD000220702F07BF9231D022220212846C0267D +:101BE00002F074F9631D03222221284602F06EF9E7 +:101BF000A31D03222521284602F068F904F10803F9 +:101C000010222821284602F061F904F1100308226D +:101C10003821284602F05AF904F111030822402124 +:101C2000284602F053F904F11203082248212846FD +:101C300002F04CF904F1140320225021284602F04E +:101C400045F904F1180340227021284602F03EF9BC +:101C500004F120030822B021284602F037F904F1EC +:101C600021030822B821284602F030F9314608360F +:101C70003B4608222846013702F028F9B6F5A07F36 +:101C8000F4D194F83230314604F1330A00268DF84D +:101C9000073008220DF10703284602F017F99DF8D6 +:101CA00007304FEAC6099E4209F5A47720D394F87D +:101CB0003231502B28BF50238DF80730B8F1000F78 +:101CC00008D1394609F24F170DF1070307222846BC +:101CD00002F0FCF8002604F233149DF8073007EBFD +:101CE000C6019E420DD30731C80802B0BDE8F08797 +:101CF0000AEB0603082239462846013602F0E6F8C8 +:101D0000CDE7A31908222846013602F0DFF8E4E700 +:101D100013B50446084600212022234601900160A5 +:101D2000C0F8031002F0D2F8231D019802222021EE +:101D300002F0CCF8631D01980322222102F0C6F8BC +:101D4000A31D01980322252102F0C0F8019804F197 +:101D500008031022282102F0B9F8072002B010BDB4 +:101D6000F7B5047F05460E462CB1838A122B02D9A3 +:101D7000012003B0F0BD0023072228460096194633 +:101D800001F068FF731C01220721009328460023FD +:101D900001F060FFD4B9B31C052208212846009346 +:101DA00023460D2401F056FFB378102BE0D83746B8 +:101DB000BB1BB278934210D307342B7FA88AE40868 +:101DC000B3B9844294BF00200120D2E7AB8A082433 +:101DD000DB00083BDB08B370E6E7FB1C214608226A +:101DE0002846009300230834013701F033FFDFE772 +:101DF000201A18BF0120BCE7F7B5047F05460E4640 +:101E00002CB1838ACA2B02D9012003B0F0BD002374 +:101E1000082228460096194601F01CFF731CD4B90D +:101E200008220093234610241146284601F012FF91 +:101E30007378C82BE8D801235F1C7278013B93426A +:101E400010D307342B7FA88AE408B3B9844294BF27 +:101E500000200120D9E7AB8A0824DB00083BDB081F +:101E60007370E5E7F3192146082228460093002302 +:101E700001F0F0FE08343B46DEE7201A18BF0120CF +:101E8000C3E70000F7B50D46044600211646284674 +:101E90008122FFF7A9FD234608220021284602F0EF +:101EA00015F894F901206378002AB8BF7F238DF8D4 +:101EB00007309EB90F270DF1070307220821284696 +:101EC00002F004F8002602349DF8073007EBC60143 +:101ED0009E4205D30731C80803B0F0BD0827F1E7DB +:101EE000A31908222846013601F0F0FFECE70000B4 +:101EF000F7B50E460546002114463046CE22FFF7C0 +:101F000073FD2B4628220021304601F0DFFF2B7A9B +:101F1000C82B28BFC8238DF807308CB930240DF1A9 +:101F2000070308222821304601F0D0FF2F467B1BF3 +:101F30009DF80720934205D3E01DC00803B0F0BD13 +:101F40002824F3E707F10903214608223046083424 +:101F5000013701F0BBFFEAE7F7B5047F05460E46FF +:101F600034B1838AB3F5827F02D9012003B0F0BD7A +:101F70000123102200212846009601F06BFEDCB9F7 +:101F8000B31C09221021284600932346192401F08E +:101F900061FE7388B3F5807FE7D83746BB1B728834 +:101FA000934210D307342B7FA88AE408B3B9844244 +:101FB00094BF00200120D9E7AB8A1024DB00103B3E +:101FC000DB087380E5E73B1D214608222846009385 +:101FD00000230834013701F03DFEDFE7201A18BF67 +:101FE0000120C3E730B50A44084D91420DD011F8E5 +:101FF000013B5840082340F30004013B2C4013F000 +:10200000FF0384EA5000F6D1EFE730BD2083B8ED3E +:10201000F7B5384A6B46106851686A4603C308230F +:102020003549364804F084FB0446002833D10A259C +:10203000334A6B46106851686A4603C30823314926 +:102040002E4804F075FB0446002849D00369B3F517 +:10205000E01F45D8B0F8661040F2134291423FD1DC +:10206000294A024402F15C018B4239D35C3B23498B +:1020700000209E1AFFF7B6FF04F1640107463246BE +:102080000020FFF7AFFFA3689F4229D1E368984281 +:1020900008BF002524E00369B3F5E01F27D8418B72 +:1020A00040F21342914220D1174A024402F110013A +:1020B0008B4218D3103B114900209D1AFFF792FF65 +:1020C00004F1180106462A460020FFF78BFFA3689B +:1020D0009E4202D1E368984201D00D25A8E7002571 +:1020E000284603B0F0BD1025A2E70C25A0E70B257C +:1020F0009EE700BFD8670008DCFF1B000000040853 +:10210000E167000890FF1B000800FCF710B5037C96 +:10211000044613B9006803F013FC204610BD00000C +:102120000023BFF35B8FC360BFF35B8FBFF35B8F95 +:102130008360BFF35B8F7047BFF35B8F0068BFF3B3 +:102140005B8F704770B505460C30FFF7F5FF04460E +:1021500005F108063046FFF7EFFFA04206D96D688B +:102160003046FFF7E9FF2544281A70BD3046FFF7D7 +:10217000E3FF201AF9E7000070B505464068A0B1FA +:1021800005F10C0605F10800FFF7D6FF04463046BE +:10219000FFF7D2FF844204F1FF34304694BF6D68EC +:1021A0000025FFF7C9FF2C44201A70BD38B50C4636 +:1021B0000546FFF7C7FFA04210D305F10800FFF75F +:1021C000BBFF04446868BFF35B8FB4FBF0F100FB16 +:1021D00011440120AC60BFF35B8F38BD0020FCE7E9 +:1021E0002DE9F041144607460D46FFF7C5FF84422E +:1021F00028BF0446D4B1B84658F80C6B4046FFF7E8 +:102200009BFF3044286040467E68FFF795FF331AF5 +:102210009C4203D801206C60BDE8F081A41B6B6078 +:102220003B682044AB60E8600220F5E72046F3E716 +:1022300038B50C460546FFF79FFFA04210D305F1C5 +:102240000C00FFF779FF04446868BFF35B8FB4FBB1 +:10225000F0F100FB11440120EC60BFF35B8F38BD4F +:102260000020FCE72DE9FF418846694607466C4699 +:10227000FFF7B6FF002506B204EBC606B4420AD04B +:10228000626808EB050120680834FFF79BFB54F8EF +:10229000043C1D44F2E729463846FFF7C9FF2846AB +:1022A00004B0BDE8F0810000F8B505460C300F46DB +:1022B000FFF742FF05F1080604463046FFF73CFFF2 +:1022C000A042304688BF6C68FFF736FF201A38609E +:1022D00020B12C683046FFF72FFF2044F8BD0000E6 +:1022E00073B5144606460D46FFF72CFF8442019055 +:1022F00028BF0446DCB101A93046FFF7D5FF019B9A +:1023000033B93268C5E90233C5E9002401200CE085 +:102310009C42286038BF0194019884426860F5D9D6 +:102320003368241A0220AB60EC6002B070BD204616 +:10233000FBE700002DE9FF410F4669466C46FFF7B9 +:10234000CFFF00B2002604EBC005AC4209D0D4F8A0 +:102350000480B81954F8081B42464644FFF732FB84 +:10236000F3E7304604B0BDE8F081000038B505461B +:10237000FFF7E0FF044601462846FFF717FF204617 +:1023800038BD000008B103F0DBBA704770470000A9 +:1023900010B41346026814680022A4465DF8044B8A +:1023A0006047000000F5805090F859047047000025 +:1023B00000F5805090F852047047000000F58050FE +:1023C00090F95804704700004E207047302383F383 +:1023D000118800F58052D2F89C34D2F89804184441 +:1023E000D2F894341844D2F87C341844D2F88C349F +:1023F0001844D2F888341844002383F311887047B6 +:1024000000F58050C0F85414012070472DE9F04FBA +:102410000C4600F5805185B01F4691F852340546B0 +:102420009046BDF838909BB1D1F878340133C1F8AB +:1024300078342368980006D4237B082B0BD9627B61 +:102440000AB10F2B07D9D1F87C340133C1F87C34A1 +:102450004FF0FF3010E0302383F31188EB6AD3F89C +:10246000C42012F4001B0AD0D1F8803400200133BC +:10247000C1F8803480F3118805B0BDE8F08F206882 +:102480004822D3F8C4300028C3F3044A6B6AB4BFAF +:1024900040F08040800412FB0A334FEA4A1618606D +:1024A000226852004FEA0A6244BF40F000501860B0 +:1024B000207B42EA00425A60607B10B342F4401233 +:1024C0005A60D1F8B0240132C1F8B024AA1902F53B +:1024D0008352117B41F020011173207B039300F0A4 +:1024E000E3FF0330039B80105FFA8BF20BF1010BCB +:1024F00082420DDA04EB820103EB820249689160AB +:10250000F2E7AA1902F58352117B60F34511E3E764 +:102510000122EB6A05EB4A1102FA0AF201F5825137 +:10252000C3F8D020AB19183104F10C0203F5825323 +:10253000C3E90487234653F8040B934241F8040B84 +:10254000F9D11B882E440B8041F2680346F803A0A2 +:1025500006F5805609F0030396F86C2043F010034B +:1025600022F01F02134386F86C30002383F3118896 +:1025700042463B4621462846CDF8009000F05AFFDF +:10258000012079E72DE9F04700F58056044696F8DA +:102590005254002D40F00381037C032B40F09480C3 +:1025A00028462B462F465FFA80FC944510DA01EB53 +:1025B000CC0E51F83CC0BCF1000F04DBDEF804C0C7 +:1025C000BCF1000F02DB01370130ECE70133FBE720 +:1025D000302080F31188E06AF3B9D0F8803043F0FE +:1025E0000203C0F880304E23E06A002F6FD1D0F88C +:1025F000803043F00103C0F880306A4B6A4A1B68A0 +:1026000003F1805303F52C539B009342A36240F2E5 +:10261000B080664800F0E6FE4D2B42D8DFF884819A +:102620004FEA034EDFF88891D8F800C04EEA8C0ECE +:10263000C0F884E00CF1805000F52C5080006061FF +:1026400003EB0C00D4F82CC0C3F14E03C8F8000013 +:10265000DCF8800040F03000CCF880004FF0000C37 +:10266000D4F81480E6465FFA8CF08242BCDD01EBC0 +:10267000C00A51F83000002810DBDAF804A0BAF1E3 +:10268000000F0BDA09EA00400AF07F0A40EA0A006C +:1026900040F0084048F82E000EF1010E0CF1010C3C +:1026A000E1E7836923F00103836100F0A1FE0646A0 +:1026B000E36A9B69D90704D500F09AFE831BFA2BC5 +:1026C000F6D9002383F311882846BDE8F087B7EBDD +:1026D000530F3DD2DFF8CCE04FEA074CDEF8003074 +:1026E0004CEA830CC0F888C003F1805003EB470329 +:1026F000002700F52C50CEF80030BC468000A061C9 +:10270000E06AD0F8803043F00C03C0F88030D4F891 +:1027100018E0FBB29A427FF770AF51F8330001EB3B +:10272000C3080028D8F8043001DB002B0EDB20F0B2 +:10273000604023F0604340F0005043F000434EF807 +:102740003C000EEBCC000CF1010C43600137E0E7DC +:10275000836923F00103836100F04AFE0646E36AC1 +:102760009B69DA07ADD500F043FE831BFA2BF6D93F +:10277000A7E7E26A936923F00103936100F038FE52 +:102780000746E36A9B69DB0705D500F031FEC31BF2 +:10279000FA2BF6D995E7012586F8525491E70025E2 +:1027A00092E700BFBC630020FCB50040EC67000866 +:1027B0000000FF0713B500F580540191606CFFF72E +:1027C000DBFC1F280AD920220199606CFFF74AFD23 +:1027D000A0F120035842584102B010BD0020FBE791 +:1027E00008B5302383F3118800F58050406CFFF763 +:1027F00097FC002383F3118808BD000000220260CB +:1028000082814260826070470022002310B5C0E9D7 +:102810000023002304460C3020F8043CFFF7EEFFB1 +:10282000204610BD2DE9F0479A4688B007468846F5 +:102830009146302383F3118807F580546846FFF7EB +:10284000E3FF606CFFF77EFC1F282ED9202269462B +:10285000606CFFF78BFD202827D194F8523423B306 +:1028600003AD444605AB2E46083403CE9E4244F8E1 +:10287000080C44F8041C3546F5D130682060B38854 +:10288000A380DDE90023C9E90023BDF80830AAF8D8 +:102890000030002383F3118853464A4641463846A8 +:1028A00008B0BDE8F04700F0B3BD002080F3118808 +:1028B00008B0BDE8F08700002DE9F84F0023064678 +:1028C00000F58154054688461034C0E90133274B92 +:1028D00046F8303B374638462037FFF795FFA7428A +:1028E000F9D105F580544FF4805305F5A3594FF005 +:1028F000000A26630026676405F5835709F110096D +:102900004FF0000B1037E663C4E90D36012384F85D +:10291000403084F84830A7F11800203747E910AB61 +:10292000FFF76CFF47F8286C4F45F4D1B8F1010F61 +:1029300084F85884A4F85A64A4F85C64A4F85E642B +:1029400084F86064A4F86264A4F86464A4F866641B +:1029500084F8686402D9064800F044FD054B284617 +:1029600053F82830EB62BDE8F88F00BF3C680008E0 +:10297000106800082C680008044B10B5197804464C +:102980004A1C1A70FFF798FF204610BDB96300205B +:102990002DE9F04300295AD02E4E2F48B6FBF1F412 +:1029A00081428CBF0A201120431EB4FBF0F700FBCC +:1029B0001740DDB220B1022B1846F5D8002032E0D6 +:1029C0007B1EB3F5806F2ED2C5EBC5084FF47A732A +:1029D00008F103044FEAE40EC4F3C7040EF1010941 +:1029E000281B0EFB033E5FFA80FC59FA80F0BEFB09 +:1029F000F0F0B0F5617F18DC83B2601C5CFA80F007 +:102A00007843B6FBF0F08142D8D1611E0F29D5D8AA +:102A10000CF1FF310729D1D80120138057801071A4 +:102A2000547182F806C0BDE8F08308F1FF34E0106D +:102A3000C4F3C70400F1010E2D1B00FB03335FFA42 +:102A400085FC5EFA85F5B3FBF5F39BB2D5E7084646 +:102A5000E9E700BF00B4C4043F420F0030B50D4B9E +:102A600005200D4D1C786C438C420ED15978012005 +:102A7000518099785171D9789171197911715B7977 +:102A800003EB83035B00138030BD013803F10603C1 +:102A9000E8D1F9E77C68000840420F0038B540F201 +:102AA0007772C36A154CC3F8BC200722C36AC3F807 +:102AB000C8202268C16A930043F4C023C1F8A03043 +:102AC00002F1805302F16C01C56A03F52C53EA321E +:102AD00089009B00226041F0E061094AC361C5F8AA +:102AE000C01003F5D87103F56A73416293428362A3 +:102AF00002D9044800F076FC38BD00BFBC6300205A +:102B0000FCB50040EC6700082DE9F04F00F580555A +:102B10001F4689B0044695F8583489469046022BE2 +:102B200004D90026304609B0BDE8F08FA84A52F813 +:102B3000231009B942F82300A648C4F80C90017884 +:102B40002774C9B9302383F31188A34BD3F8EC2041 +:102B500042F48072C3F8EC20D3F8942042F48072DF +:102B6000C3F89420D3F8942022F48072C3F8942000 +:102B70000123037081F3118895F851347BB9302318 +:102B800083F31188954A95F85834D35C0BB3012B25 +:102B900028D0012385F85134002383F31188302392 +:102BA00083F31188E26A936923F01003936100F0C4 +:102BB0001FFC8246E36A9E6916F0080619D000F0F1 +:102BC00017FCA0EB0A03FA2BF4D9002686F3118830 +:102BD000A8E70321132002F03FF80321152002F09B +:102BE0003BF8D6E70321142002F036F80321162023 +:102BF000F5E79A6942F001029A6100F0F9FB82461A +:102C0000E36A9A69D00706D400F0F2FBA0EB0A034E +:102C1000FA2BF5D9D9E79A694FF0000A42F002027F +:102C20009A61E36AC3F854A08AF3118804F5825BC1 +:102C3000686CFFF775FA0BF1100B20220021684633 +:102C4000FEF7D2FE02A8FFF7D9FD6A460BEB06039A +:102C50000DF1180ECDF818A094460833BCE8030017 +:102C6000F44543F8080C43F8041C6246F4D1DCF840 +:102C7000000020361860B6F5806F9CF804201A71A9 +:102C8000DBD1002304F5A252494620461A3285F8CA +:102C9000503485F85334FFF77BFE064690B9E26A5C +:102CA000936923F00103936100F0A2FB0546E36AF8 +:102CB0009B69D9077FF535AF00F09AFB431BFA2BD0 +:102CC000F5D92EE795F85E34C5F86C94591E95F841 +:102CD0005F34E26A013B1B0243EA416395F86014EA +:102CE00001390B43B5F85C14013943EA0143D36160 +:102CF000B8F1000F36D004F5A35241462046023207 +:102D0000FFF7ACFE90B9E26A936923F00103936187 +:102D100000F06EFB0546E36A9B69DA077FF501AFB9 +:102D200000F066FB431BFA2BF5D9FAE695F8672409 +:102D3000C5F87084511E95F86824E36A013A1201BF +:102D400042EA012295F8661401390A43B5F8641481 +:102D5000013942EA014242F40002DA604FF4206293 +:102D6000E36A9A64E36A4FF000082046C3F8BC8027 +:102D7000FFF794FE85F859846FF04042E36A1A65C4 +:102D8000174AE36A5A654FF00222E36A9A654FF0E8 +:102D9000FF32E36AC3F8E0200322E36A9742DA6570 +:102DA0003FF4C0AEE26A936923F00103936100F03F +:102DB0001FFB0746E36A9B69DB0705D500F018FB9C +:102DC000C31BFA2BF6D9ACE6012385F85234A9E6E9 +:102DD000B0630020B8630020004402582468000853 +:102DE000550200022DE9F04F054689B090469946FC +:102DF000002741F2680A00F58056EB6AD3F8D83014 +:102E0000FB40D80751D505EB47124FEA471B524408 +:102E10001379190749D4D6F884340133C6F88434B9 +:102E200005F5A553C3E9008913799A0605EB0B0252 +:102E300048BFD6F8B434524444BF0133C6F8B43462 +:102E4000137943F008031371DB0723D596F8533445 +:102E500003B305F582546846FFF7D6FC03AB18347C +:102E60005C4404F1080C2068083454F8041C1A4629 +:102E7000644503C21346F6D12068694610602846AF +:102E8000A2889A800123ADF808302B68CDE900892B +:102E9000DB6B9847D6F8A834D6F854040133C6F84B +:102EA000A83410B103681B6998470137202FA4D1BB +:102EB00009B0BDE8F08F00002DE9F04F0F468DB04E +:102EC000044600F097FA82468946002F5BD1E36AF8 +:102ED000D3F8A02012F4FE0F03D100200DB0BDE8FE +:102EE000F08FD3F8A420920141BF04F58051D1F8AE +:102EF00098240132C1F89824D3F8A4205606ECD0C7 +:102F0000D3F8A450E669C5F305254823E8464FF0F9 +:102F1000000B03FB05664046FFF770FC326851006A +:102F20004ABF22F06043C2F38A4343F00043920059 +:102F300048BF43F080430093736813F400131BBF32 +:102F4000012304F580528DF80D308DF80D301EBF31 +:102F5000D2F8B8340133C2F8B834F38803F00F0361 +:102F60008DF80C309DF80C0000F09EFA5FFA8BF3A0 +:102F7000984225D9F2180CA90BF1010B127A0B44D7 +:102F800003F82C2CEEE7012FA7D1E36AD3F8B02089 +:102F900012F4FE0FA1D0D3F8B420950141BF04F57F +:102FA0008051D1F898240132C1F89824D3F8B42084 +:102FB000500692D0D3F8B450266AC5F30525A4E78D +:102FC000EFB9E36AC3F8A85004A807ADFFF71CFCEB +:102FD00098E80F0007C52B800023204604A9ADF810 +:102FE0001830236804F58054DB6BCDE904A99847B9 +:102FF00058B1D4F890340133C4F890346EE7012FFF +:10300000E2D1E36AC3F8B850DEE7D4F89434012083 +:103010000133C4F8943461E72DE9F04105460F46C9 +:1030200000F58054012639462846FFF745FF10B1C8 +:1030300084F85364F7E7D4F8A834D4F8540401337F +:10304000C4F8A83420B10368BDE8F0411B691847F3 +:10305000BDE8F081C36AF0B51A6C12F47F0F2BD073 +:103060001B6C00F5805441F268054FF0010CC4F868 +:10307000AC340023471900EB43125E012A44117956 +:1030800011F0020F15D0490713D4B959C66A0CFACA +:1030900001F1D6F8CCE011EA0E0F0AD0C6F8D41030 +:1030A000117941F004011171D4F88C240132C4F873 +:1030B0008C240133202BDED1F0BD00002B4B70B5EA +:1030C0001E561B5C012B30D8294D2A4A55F8233057 +:1030D00052F8264013B349B3236D9A0510D54FF427 +:1030E0000073236500F086F950EA01020B4602D016 +:1030F000013861F10003024655F82600FFF772FE21 +:10310000236D9B012CD54FF0007255F826302265B7 +:1031100003F58053012283F8592421E0012323651C +:10312000102323654FF48053236570BD236DDA07A8 +:1031300002D4236D5B0706D50523002155F8260030 +:103140002365FFF769FF236DD80602D4236D590666 +:1031500006D55023012155F826002365FFF75CFFB3 +:1031600055F82600BDE87040FFF774BF28680008D6 +:10317000B06300202C68000808B5302383F3118861 +:10318000FFF768FF002383F3118808BDC36AD3F8F3 +:10319000C00010F07C5005D0D3F8C40080F40010BB +:1031A000C0F340507047000008B5302383F3118806 +:1031B00000F58050406CFEF7C5FF002383F31188B3 +:1031C00043090CBF0120002008BD000000F580531A +:1031D00093F8592462B1C16A8A6922F001028A61B6 +:1031E000D3F89C240132C3F89C24002283F859248C +:1031F000704700002DE9F743302181F3118800F575 +:103200008251002541F2680E4FF00108103100F59F +:10321000805C00EB45147444267977071CD4F606CD +:103220001AD58E69D0F82C9008FA06F6D9F8CC7029 +:103230003E4211D04F6801970F689742019F9F410E +:103240000AD2C9F8D460267946F004062671DCF863 +:1032500088440134CCF8884401352031202DD8D160 +:10326000002383F3118803B0BDE8F083F8B51E4650 +:1032700000230F46054613701446FFF795FF80F0B4 +:10328000010038701EB12846FFF780FF2070F8BD9E +:103290002DE9F04F85B099460D468046164691F8C7 +:1032A00000B0DDE90EA302931378019300F0A2F8B9 +:1032B0002B7804460F4613B93378002B41D02246B1 +:1032C0003B464046FFF796FFFFF756FFFFF77EFFAE +:1032D0004B4632462946FFF7C9FF2B7833B1BBF185 +:1032E000000F03D0012005B0BDE8F08F337813B193 +:1032F000019B002BF6D108F5805303935445029BA4 +:1033000077EB03031DD2039BD3F85404C8B10368C1 +:10331000AAEB04011B6898474B46324629464046B3 +:10332000FFF7A4FF2B7813B1BBF1000FDAD133788C +:1033300013B1019B002BD5D100F05CF804460F4679 +:10334000DCE70020CFE70000002108B50846FFF7C2 +:10335000B5FEBDE8084001F071B8000008B50121D4 +:103360000020FFF7ABFEBDE8084001F067B80000A1 +:1033700008B500210120FFF7A1FEBDE8084001F0DB +:103380005DB80000012108B50846FFF797FEBDE8CB +:10339000084001F053B8000000B59BB0EFF309817D +:1033A00068226846FEF70EFBEFF30583014B9B6B2B +:1033B000FEE700BF00ED00E008B5FFF7EDFF0000FD +:1033C00000B59BB0EFF3098168226846FEF7FAFA70 +:1033D000EFF30583014B5B6BFEE700BF00ED00E000 +:1033E000FEE700000FB408B5029801F0E9FEFEE721 +:1033F00002F0D4BA02F0B6BA13B56C46031D84E8E5 +:10340000060094E8030083E80500012002B010BD27 +:1034100073B58568019155B11B885B0707D4D0E966 +:1034200000369B6B9847019AC1B23046A8470120ED +:1034300002B070BDF0B5866889B005460C465EB135 +:10344000BDF838305B070AD4D0E900379B6B98474A +:103450002246C1B23846B047012009B0F0BD002273 +:10346000002301F10806CDE9002300230A46ADF848 +:10347000083003AB1068083252F8041C1C46B242F4 +:1034800003C42346F6D1106820609288A280FFF71B +:10349000B1FF0423ADF808302B68CDE90001DB6BE8 +:1034A000694628469847D7E7082817D909280CD035 +:1034B0000A280CD00B280CD00C280CD00D280CD0CE +:1034C0000E2814BF4020302070470C207047102079 +:1034D0007047142070471820704720207047000064 +:1034E0002DE9F041456A15B94162BDE8F0814B68AC +:1034F000AC4623F06047C3F38A464FEAD37EC3F35A +:10350000807816EA230638BF3E462B465A68BEEB43 +:10351000D27F22F060440AD0002A18DAA40CB44208 +:1035200017D19D420FD10D60DEE71346EEE7A742AB +:1035300007D102F08044C2F3807242450BD054B1EF +:10354000EFE708D2EDE7CCF800100B60CDE7B4420E +:1035500001D0B442E5D81A689C46002AE5D119602A +:10356000C3E700002DE9F047089D01F0070400EBD8 +:10357000D1004FF47F494FEAD508224405F00705F2 +:10358000944201D1BDE8F08704F0070705F0070A6F +:10359000111B08EBD50E57453E4613F80EC038BF39 +:1035A0005646C6F108068E4228BF0E46E108415C29 +:1035B00034443544B94029FA06F721FA0AF1FFB23A +:1035C0008CEA010147FA0AF739408CEA010C03F84A +:1035D0000EC0D5E780EA0120082341F2210201B2A2 +:1035E000013B4000002980B2B8BF504013F0FF03F8 +:1035F000F5D1704738B50C468D18A54200D138BDBD +:1036000014F8011BFFF7E6FFF7E7000042684AB134 +:10361000136881894360438901339BB29942438196 +:1036200038BF83811046704770B588B004462022A9 +:103630000D4668460021FEF7D7F920460495FFF7AE +:10364000E5FF024660B16B46054608AE1C460835EC +:1036500003CCB44245F8080C45F8041C2346F5D1C8 +:10366000104608B070BD0000082817D909280CD0F2 +:103670000A280CD00B280CD00C280CD00D280CD00C +:103680000E2814BF4020302070470C2070471020B7 +:1036900070471420704718207047202070470000A2 +:1036A000082817D90C280CD910280CD914280CD9A3 +:1036B00018280CD920280CD930288CBF0F200E20B8 +:1036C0007047092070470A2070470B2070470C2074 +:1036D00070470D20704700002DE9F843078C044621 +:1036E000072F1ED900254FF6FF73D0E90298C5F1C8 +:1036F0002006A5F1200029FA05F1083508FA06F69A +:1037000028FA00F0314301431846C9B2FFF762FFBF +:10371000402D0346EBD13A46E169BDE8F843FFF797 +:1037200069BF4FF6FF70BDE8F883000010B54B6825 +:1037300023B9CA8A63F30902CA8210BD04691A68F0 +:103740001C600361C38A013BC3824A60EFE700004B +:103750002DE9F84F1D46CB8A0F468146C3F3090178 +:10376000924605290B4630D00020AAB207F11A0470 +:103770009EB21FFA80F8042E0FD8904503F1010382 +:1037800006D30A44FB8A62F309030120FB821AE094 +:103790001AF800600130E654EAE79045F1D2A1F151 +:1037A000050B1C237C68BBFBF3F203FB12BB1FFA67 +:1037B0008BF6002C45D14846FFF728FF044638B960 +:1037C00078606FF00200BDE8F88F4FF00008E6E780 +:1037D000002606607860ADB24FF0000B454510D969 +:1037E0000AEB0803221D13F8011B08F1010891558B +:1037F000B1B21FFA88F81B292BD0454506F1010606 +:10380000F1D8FB8AC3F30902154465F30903BCE749 +:1038100001321C4692B22368002BF9D16B1F0B4476 +:103820001C21B3FBF1F301339BB29A42D3D2BBF11B +:10383000000FD0D14846FFF7E9FE20B9C4F800B028 +:10384000BFE70122E7E7C0F800B05E46206004460B +:10385000C1E74545D5D94846FFF7D8FE08B92060ED +:10386000AFE7C0F800B0002620600446B6E70000CD +:103870002DE9F04F1C46074688462DED028B83B09C +:103880005B690192002B00F09A80238C2BB1E269D6 +:10389000002A00F09480072B35D807F10C00FFF7C1 +:1038A000B5FE054638B96FF00205284603B0BDECF9 +:1038B000028BBDE8F08F14220021FEF795F8228CD0 +:1038C000E16905F10800FEF77DF8208C48F0004121 +:1038D000013080B2FFF7E4FEFFF7C6FE013880B288 +:1038E00020840130287438466369228C1B782A446E +:1038F00003F01F0363F03F03137269602946FFF76B +:10390000EFFD0125D1E74FF0000900F10C034FF066 +:10391000800A4E464D4608EE103A18EE100AFFF7A0 +:1039200075FE83460028BED014220021FEF75CF805 +:10393000002E3AD1019B0222ABF808300BF1080EA1 +:103940001FFA82FC218C0CF10100BCF1060F80B241 +:1039500001D88E422BD3FFF7A3FE8E4208BF4FF053 +:10396000400AFFF781FE62690138013512781BFABF +:1039700080F1013002F01F022DB242EA491289F0B3 +:1039800001094AEA020A48F0004281F808A05946B3 +:103990008BF810003846CBF804204FF0000AFFF7F0 +:1039A0009FFD238CB342B8D17FE70022C6E7E169CF +:1039B000895D01360EF80210B6B20132C0E76FF031 +:1039C000010572E7F8B515460E463022002104467F +:1039D0001F46FEF709F8069BB5F5001FA760636058 +:1039E00004F11000079B34BF6A094FF6FF72E661CD +:1039F000A362002397B29A4206D800230360A782ED +:103A0000E3822383E360F8BD06600133304620364D +:103A1000F1E7000003781BB94BB2002BC8BF01705F +:103A20007047000000787047F8B50C46C969074632 +:103A300011B9238C002B37D1257E1F2D34D838782F +:103A400028BB228C072A2CD8268A36F003032BD1D8 +:103A50004FF6FF70FFF7CEFD20F0010031024FF668 +:103A6000FF72400441EA0561400C41EA40252346CB +:103A700029463846FFF7FCFE002807DD6269137807 +:103A80000133DBB21F2B88BF00231370F8BD218ADE +:103A90002D0645EA012505432046FFF71DFE024697 +:103AA000E5E76FF00300F1E76FF00100EEE70000DB +:103AB00070B58AB0044616460021282268461D4685 +:103AC000FDF792FFBDF8383069462046ADF810305A +:103AD0000F9B05939DF840308DF81830119B07938C +:103AE000BDF84830CDE90265ADF82030FFF79CFF06 +:103AF0000AB070BD2DE9F041D36905460C46164663 +:103B00000BB9138C5BBB377E1F2F28D895F800802C +:103B1000B8F1000F26D03046FFF7DEFD33782102E2 +:103B20000246284641EAC331338A41EA080141EAA4 +:103B3000076141EA0341334641F08001FFF798FEF7 +:103B400000280ADD3378012B07D17269137801331D +:103B5000DBB21F2B88BF00231370BDE8F0816FF02C +:103B60000100FAE76FF00300F7E70000F0B58BB053 +:103B700004460D4617460021282268461E46FDF7DA +:103B800033FF9DF84C30294620465A1E534253417C +:103B90006A468DF800309DF84030ADF81030119B2A +:103BA00005939DF848308DF81830149B0793BDF8A5 +:103BB0005430CDE90276ADF82030FFF79BFF0BB013 +:103BC000F0BD0000406A00B104307047436A1A68D3 +:103BD000426202691A600361C38A013BC382704773 +:103BE0002DE9F041D0F8208014461D46184E41467C +:103BF000002709B9BDE8F081D1E90223A21A65EBDB +:103C00000303964277EB03031ED2036A8B420DD166 +:103C1000FFF78CFD036A1B68036203690B60C38AAC +:103C20000161013B016AC3828846E2E7FFF77EFD3E +:103C30000B68C8F8003003690B60C38A0161013B5F +:103C4000C382D8F80010D4E788460968D1E700BFDE +:103C500080841E002DE9F04F8BB00D4614469B4624 +:103C6000DDF850908046002800F01881B9F1000F6F +:103C700000F01481531E3F2B00F21081012A03D162 +:103C8000BBF1000F40F00A810023CDE90833B8F8FA +:103C90001430B5EBC30F4FEAC30703D300200BB0BA +:103CA000BDE8F08F2B199F42D8F80C3036BF7F1B30 +:103CB0002746FFB21BB9D8F81030002B7AD0272D39 +:103CC0004DD8C5F1280600232946B742009308AB1A +:103CD000D8F808002CBFF6B23E46A7EB060A3544DA +:103CE00032465FFA8AFAFFF73DFCB8F81430282113 +:103CF00003F10053053BDB000493D8F80C30039329 +:103D0000039B13B1BAF1000F2CD1D8F8100040B1C9 +:103D1000BAF1000F05D008AB5246691A0096FFF7BA +:103D200021FC38B2002FB9D066070AD00AAB624234 +:103D300003EBD40102F0070211F8083C134101F82B +:103D4000083C082C3DD9102C40F2B580202C40F2C4 +:103D5000B780BBF1000F00F09C80082335E0BA4625 +:103D60000026C2E7049BE02B28BFE02306930B4408 +:103D7000AB42059315D95A1B0398691A00969245D0 +:103D800008AB00F1040034BF5246D2B20792FFF7ED +:103D9000E9FB079A1644AAEB020A1544F6B25FFA49 +:103DA0008AFA049B069A05999B1A0493039B1B6845 +:103DB0000393A5E700933A4608AB2946D8F80800D4 +:103DC000ADE7BBF1000F13D00123B4EBC30F6BD0F1 +:103DD000082C12D89DF82030621E23FA02F2D50773 +:103DE00006D54FF0FF3202FA04F423438DF8203059 +:103DF0009DF8203089F8003051E7102C12D8BDF81A +:103E00002030621E23FA02F2D10706D54FF0FF32AE +:103E100002FA04F42343ADF82030BDF82030A9F8AD +:103E200000303CE7202C0FD80899631E21FA03F3D9 +:103E3000DA0705D54FF0FF3202FA04F40C43089478 +:103E4000089BC9F800302AE7402C2AD0611EC4F133 +:103E50002102A4F12103DDE9086526FA01F105FA42 +:103E600002F225FA03F311431943CB0711D50122BE +:103E7000A4F12003C4F1200102FA03F322FA01F1B4 +:103E8000A2400B43524263EB430332432B43CDE941 +:103E90000823DDE90823C9E9002300E76FF00100EA +:103EA000FDE66FF00800FAE6082CA1D9102CB4D971 +:103EB000202CEED8C4E7BBF1000FAED0022384E77C +:103EC000BBF1000FBCD004237FE70000012A30B50E +:103ED000144638BF012485B00025402C28BF40245B +:103EE000012ACDE9025518D81B788DF808306307F0 +:103EF0000AD004AB624203EBD40502F0070215F8C6 +:103F0000083C934005F8083C0346009122460021F6 +:103F100002A8FFF727FB05B030BD082AE4D9102A14 +:103F200003D81B88ADF80830E1E7202A95BF1B684D +:103F3000D3E900230293CDE90223D8E710B5CB687B +:103F40001BB98B600B618B8210BD04691A681C6001 +:103F50000361C38A013BC382CA60F0E703064CBF1A +:103F6000C0F3C0300220704708B50246FFF7F6FFE5 +:103F7000022806D15306C2F30F2001D100F003003E +:103F800008BDC2F30740FBE72DE9F04F93B00446AC +:103F90000D46CDE903230A681046FFF7DFFF02282C +:103FA000824614BFC2F306260026002A80F2F8815A +:103FB00012F0C04940F0F481097B002900F0F08143 +:103FC000022803D02378B34240F0ED81C2F30463AA +:103FD00010462944069302F07F030593FFF7C4FFC0 +:103FE000059B002283464FEA8348002348EA0A489B +:103FF00048EA4668CE78CDE90823F30948EA000884 +:10400000029368D0059B024608A9204600935346B8 +:104010006768B847002800F0C981276A4FB9414650 +:1040200004F10C00FFF700FB074690B96FF00200A7 +:1040300055E03B6998450DD03F68002FF9D14146C6 +:1040400004F10C00FFF7F0FA07460028EED0236ACF +:104050003B60276297F817C006F01F08CCF3840C6A +:10406000ACEB0800A8EB0C031FFA80FE0028B8BFD9 +:104070000EF120001FFA83FEB8BF00B2002B079399 +:10408000B8BF0EF12003D7E90221BCBF1BB20793D2 +:1040900052EA010338D0039B4FF0000CDFF81CE319 +:1040A0009A1A049B63EB010196457CEB01032BD329 +:1040B0006B7B97F81AE0734519D1029B002B78D0DF +:1040C000012821DC7868F8B9DFF8ECC2944570EB80 +:1040D000010316D337E0276A27B96FF00C0013B03D +:1040E000BDE8F08F3B699845B4D03F68F4E7B2482B +:1040F00090427CEB010301D30020F0E7029B002BF0 +:10410000FAD0079B0F2B17DCFA7DB3003946204607 +:1041100002F0030203F07C031343FB75FFF706FB79 +:104120006B7BBB76029B3BB9FB7DC3F38402013200 +:1041300062F38603FB75D0E76A7BBB7E9A42DBD1D4 +:10414000029B002B35D0B309022B32D0039B1422E3 +:1041500000210DA8BB60049BFB60FDF745FC039BA1 +:104160000AA920460A93049BADF83EB00B932B1D81 +:104170008DF840A00C932B7B8DF84180013BDBB286 +:10418000ADF83C30069B8DF84230059B8DF84330EE +:1041900094F82C3083F001038DF84430A3689847DD +:1041A000FB7DC3F38403013303F01F039B02FB82F7 +:1041B000A2E7FB7DC6F34012B2EBD31F40F0F980BB +:1041C000C3F38403434540F0FB80029AB6092B7B7E +:1041D000002A52D016F0010661D1032B40F2F38081 +:1041E000039B394604F10C00BB60049BFB60FB8A17 +:1041F00066F30903AE1DFB8232462B7B033BDBB229 +:10420000FFF7A6FA00280CDA39462046FFF78EFAA7 +:10421000FB7DC3F38403013303F01F039B02FB8286 +:1042200004E7AB88DDE908843B834FF6FF73C9F1EF +:104230002000A9F1200228FA09F109F1080904FA7D +:1042400000F024FA02F2014318461143C9B2FFF705 +:10425000C1F9B9F1400F0346E9D1B88231462A7B52 +:10426000033AD2B2FFF7C6F9FB7DB882DA43C2F354 +:10427000C01262F3C713FB753EE786B92E1D013BE2 +:10428000394604F10C00DBB23246FFF761FA002830 +:10429000BADB2A7B3146B88A013AD2B2E2E7F98A20 +:1042A000013BC1F30901DAB204295BD8281D0023C0 +:1042B00007F11B069A4208D910F801CB013306F822 +:1042C00001C00131DBB20529F4D1039993420A916F +:1042D00038BF043304992CBF002355FA83F30B91A4 +:1042E00007F11B010C9179680E930D91291DFB8A32 +:1042F000ADF83EB0C3F309038DF840A08DF84180BE +:104300001A44069B8DF84230059BADF83C208DF891 +:10431000433094F82C3083F001038DF844300023AF +:10432000B88A7B602A7B013AFFF764F93B8BB8823D +:10433000834203D1A3680AA92046984720460AA9C8 +:10434000FFF7FCFDFB7DBA8AC3F38403013303F05E +:104350001F039B02FB823B8B9A420CBF00206FF035 +:104360001000BCE67B68002BAFD0052001E01C30BC +:1043700033461E68002EFAD1091A2E1D081D184456 +:1043800001EB090C5FFA89F3BCF11B0F9DD89A422F +:104390009BD916F8013B09F1010900F8013BEFE751 +:1043A0006FF009009BE66FF00A0098E66FF00B00D3 +:1043B00095E66FF00D0092E640420F0080841E00EB +:1043C0006FF00E008BE66FF00F0088E6EFF30983C5 +:1043D000054968334A6B22F001024A6383F3098876 +:1043E000002383F31188704700EF00E0302080F352 +:1043F000118862B60D4B0E4AD96821F4E0610904B8 +:10440000090C0A430B49DA60D3F8FC2042F08072B1 +:10441000C3F8FC20084AC2F8B01F116841F001013E +:1044200011602022DA7783F82200704700ED00E067 +:104430000003FA0555CEACC5001000E0302310B5DE +:1044400083F311880E4B5B6813F4006314D0F1EE14 +:10445000103AEFF309844FF08073683CE361094B35 +:10446000DB6B236684F3098800F070FE10B1064B05 +:10447000A36110BD054BFBE783F31188F9E700BF8B +:1044800000ED00E000EF00E03F04000842040008F7 +:1044900008B5074B074A196801F03D019960536858 +:1044A0000BB190689847BDE80840FFF7C7BF00BF51 +:1044B00000000240C463002008B5084B1968890950 +:1044C00001F03D018A019A60054AD3680BB1106979 +:1044D0009847BDE80840FFF7B1BF00BF00000240A9 +:1044E000C463002008B5084B1968090C01F03D01B0 +:1044F0000A049A60054A53690BB190699847BDE870 +:104500000840FFF79BBF00BF00000240C4630020CB +:1045100008B5084B1968890D01F03D018A059A60BC +:10452000054AD3690BB1106A9847BDE80840FFF708 +:1045300085BF00BF00000240C463002008B5074BE0 +:10454000074A596801F03D01D960536A0BB1906A7E +:104550009847BDE80840FFF771BF00BF0000024068 +:10456000C463002008B5084B5968890901F03D0172 +:104570008A01DA60054AD36A0BB1106B9847BDE82F +:104580000840FFF75BBF00BF00000240C46300208B +:1045900008B5084B5968090C01F03D010A04DA60BE +:1045A000054A536B0BB1906B9847BDE80840FFF785 +:1045B00045BF00BF00000240C463002008B5084B9F +:1045C0005968890D01F03D018A05DA60054AD36B0F +:1045D0000BB1106C9847BDE80840FFF72FBF00BF34 +:1045E00000000240C463002008B5074B074A196861 +:1045F00001F03D019960536C0BB1906C9847BDE898 +:104600000840FFF71BBF00BF00040240C463002046 +:1046100008B5084B1968890901F03D018A019A60C3 +:10462000054AD36C0BB1106D9847BDE80840FFF701 +:1046300005BF00BF00040240C463002008B5084B5A +:104640001968090C01F03D010A049A60054A536D8E +:104650000BB1906D9847BDE80840FFF7EFBE00BF73 +:1046600000040240C463002008B5084B1968890D96 +:1046700001F03D018A059A60054AD36D0BB1106EB9 +:104680009847BDE80840FFF7D9BE00BF00040240CC +:10469000C463002008B5074B074A596801F03D0183 +:1046A000D960536E0BB1906E9847BDE80840FFF794 +:1046B000C5BE00BF00040240C463002008B5084B1B +:1046C0005968890901F03D018A01DA60054AD36E13 +:1046D0000BB1106F9847BDE80840FFF7AFBE00BFB1 +:1046E00000040240C463002008B5084B5968090C57 +:1046F00001F03D010A04DA60054A536F0BB1906F77 +:104700009847BDE80840FFF799BE00BF000402408B +:10471000C463002008B5084B5968890D01F03D01BC +:104720008A05DA60054AD36F13B1D2F88000984742 +:10473000BDE80840FFF782BE00040240C4630020C9 +:1047400000230C4910B51A460B4C0B6054F823009B +:10475000026001EB430004334260402BF6D1074A6C +:104760004FF0FF339360D360C2F80834C2F80C34C2 +:1047700010BD00BFC46300209C6800080000024018 +:104780000F28F8B510D9102810D0112811D01228F0 +:1047900008D10F240720DFF8B4E00126DEF800502E +:1047A000A04208D9002649E00446F4E70F2400207F +:1047B000F1E70724FBE706FA00F73D4240D1214C20 +:1047C0004FEA001C3D4304EB00160EEBC000CEF890 +:1047D0000050C0E90123FBB24BB11B48836B43F08F +:1047E00001038363036E43F001030366036E17F452 +:1047F0007F4F09D01448836B43F002038363036E39 +:1048000043F002030366036E54F80C00036823F0C0 +:104810001F030360056815F00105FBD104EB0C03D1 +:104820003D2493F80CC05F6804FA0CF43C6021242A +:104830000560446112B1987B00F00EFA3046F8BD75 +:104840000130ADE79C68000800450258C4630020B1 +:1048500010B5302484F31188FFF792FF002383F30F +:10486000118810BD10B50446807B00F00BFA0123BF +:104870001049627B03FA02F20B6823EA0203DAB200 +:104880000B604AB90C4A916B21F001019163116EE2 +:1048900021F001011166126E13F47F4F09D1064B0E +:1048A0009A6B22F002029A631A6E22F002021A66D2 +:1048B0001B6E10BDC46300200045025808B53023AC +:1048C00083F31188FFF7CEFF002383F3118808BD1F +:1048D0000023054A19460133102BC2E9001102F1E9 +:1048E0000802F8D1704700BF486400202DE9F74F57 +:1048F00002F0030AC2F3C313C2F38009C2F3C10872 +:10490000C2F3411E574600224FF00F0B0193CB0715 +:1049100033D502F00703019C012556009B00BAF134 +:10492000020F05FA02F504FA03FC44680BFA03F3DC +:1049300024EA05046FEA030344EA090444604FF0E3 +:104940000304856804FA06F625EA06056FEA0604FC +:1049500045EA08058560C56825EA060545EA0E05AD +:10496000C5601BD1072A13D8056A2B4043EA0C0304 +:10497000036203681C403C430460490822D04FEAAC +:10498000490901324FEA88084FEA8E0EBF00BEE7A0 +:10499000456A2B4043EA0C034362EAE70568072AAD +:1049A00004EA050444EA0704046005D8046A2340C5 +:1049B00043EA0C030362E0E7446A234043EA0C0342 +:1049C0004362DAE703B0BDE8F08F00000268436895 +:1049D0001143016003B1184770470000024A136891 +:1049E00043F0C0031360704700100140024A13688F +:1049F00043F0C00313607047007C004037B51A4C89 +:104A00001A4D204600F0E8FA04F114000094002347 +:104A10004FF40072164900F0A5F94FF400721549E1 +:104A200004F138000094144B00F01EFA134BC4E953 +:104A30001735134C204600F0CFFA04F11400002380 +:104A40004FF400720F49009400F08CF90E4B4FF4B4 +:104A500000720E4904F13800009400F005FA0C4B86 +:104A6000C4E9173503B030BDC864002000E1F50586 +:104A7000A0650020A0690020DD4900080010014069 +:104A800034650020A0670020ED490008A06B0020DD +:104A9000007C0040037C30B5284C002918BF0C4630 +:104AA000012B0CD1264B984236D1264B1A6D42F081 +:104AB00010021A659A6F42F010029A679B6F226883 +:104AC000036EC16D03EB52038466B3FBF2F36268BD +:104AD000150442BF23F0070503F0070343EA45032B +:104AE000CB60A36843F040034B60E36843F00103ED +:104AF0008B6042F4967343F001030B604FF0FF3379 +:104B00000B62510505D512F0102213D0B2F1805F6F +:104B100012D080F8643030BD0B4B9842CFD1094B96 +:104B20009A6C42F000429A641A6F42F000421A678F +:104B30001B6FC4E77F23ECE73F23EAE79C6900088B +:104B4000C864002000450258346500202DE9F04774 +:104B5000C66D05463768F469210734621AD014F02F +:104B6000080118BF4FF48071E20748BF41F02001EF +:104B7000A3074FF0300348BF41F04001600748BF32 +:104B800041F0800183F31188281DFFF71FFF0023E8 +:104B900083F31188E2050AD5302383F311884FF49B +:104BA0008061281DFFF712FF002383F311884FF067 +:104BB00030094FF0000A14F0200838D13B0616D512 +:104BC0004FF0300905F1380A200610D589F3118815 +:104BD000504600F07DF9002836DA0821281DFFF73D +:104BE000F5FE27F080033360002383F311887906F4 +:104BF00014D5620612D5302383F31188D5E9132327 +:104C00009A4208D12B6C33B127F040071021281DA0 +:104C1000FFF7DCFE3760002383F31188E30618D525 +:104C2000AA6E1369ABB15069BDE8F047184789F324 +:104C30001188736A284695F86410194000F0E6F967 +:104C40008AF31188F469B6E7B06288F31188F469D1 +:104C5000BAE7BDE8F0870000090100F160430122D6 +:104C600003F56143C9B283F8001300F01F039A40B3 +:104C700043099B0003F1604303F56143C3F88021BE +:104C80001A60704700F01F0301229A40430900F1A7 +:104C900060409B0000F5614003F1604303F5614310 +:104CA000C3F88020C3F88021002380F800337047C8 +:104CB000F8B51546826804460B46AA4200D28568BC +:104CC000A1692669761AB5420BD218462A46FCF726 +:104CD00079FEA3692B44A3612846A3685B1BA360EC +:104CE000F8BD0CD9AF1B18463246FCF76BFE3A46AE +:104CF000E1683044FCF766FEE3683B44EBE71846A6 +:104D00002A46FCF75FFEE368E5E70000836893420C +:104D1000F7B50446154600D28568D4E90460361A12 +:104D2000B5420BD22A46FCF74DFE63692B44636102 +:104D30002846A3685B1BA36003B0F0BD0DD93246C3 +:104D4000AF1B0191FCF73EFE01993A46E068314401 +:104D5000FCF738FEE3683B44E9E72A46FCF732FEFD +:104D6000E368E4E710B50A440024C361029B846051 +:104D7000C16002610362C0E90000C0E9051110BD15 +:104D800008B5D0E90532934201D1826882B98268C0 +:104D9000013282605A1C426119700021D0E904324C +:104DA0009A4224BFC368436100F076FA002008BD30 +:104DB0004FF0FF30FBE7000070B5302304460E468D +:104DC00083F31188A568A5B1A368A269013BA3601C +:104DD000531CA36115782269934224BFE368A36141 +:104DE000E3690BB120469847002383F311882846D6 +:104DF00007E03146204600F03FFA0028E2DA85F36A +:104E0000118870BD2DE9F74F04460E4617469846A7 +:104E1000D0F81C904FF0300A8AF311884FF0000B45 +:104E2000154665B12A4631462046FFF741FF034645 +:104E300060B94146204600F01FFA0028F1D0002357 +:104E400083F31188781B03B0BDE8F08FB9F1000F30 +:104E500003D001902046C847019B8BF31188ED1ABF +:104E60001E448AF31188DCE7C160C361009B826045 +:104E70000362C0E905111144C0E9000001617047F7 +:104E8000F8B504460D461646302383F31188A7680B +:104E9000A7B1A368013BA36063695A1C62611D70DE +:104EA000D4E904329A4224BFE3686361E3690BB139 +:104EB00020469847002080F3118807E031462046BD +:104EC00000F0DAF90028E2DA87F31188F8BD000073 +:104ED000D0E9052310B59A4201D182687AB9826877 +:104EE0000021013282605A1C82611C7803699A4257 +:104EF00024BFC368836100F0CFF9204610BD4FF096 +:104F0000FF30FBE72DE9F74F04460E46174698465B +:104F1000D0F81C904FF0300A8AF311884FF0000B44 +:104F2000154665B12A4631462046FFF7EFFE034697 +:104F300060B94146204600F09FF90028F1D00023D7 +:104F400083F31188781B03B0BDE8F08FB9F1000F2F +:104F500003D001902046C847019B8BF31188ED1ABE +:104F60001E448AF31188DCE702684368114301603C +:104F700003B11847704700001430FFF743BF00002B +:104F80004FF0FF331430FFF73DBF00003830FFF71C +:104F9000B9BF00004FF0FF333830FFF7B3BF000058 +:104FA0001430FFF709BF00004FF0FF311430FFF756 +:104FB00003BF00003830FFF763BF00004FF0FF323F +:104FC0003830FFF75DBF0000012914BF6FF01300F8 +:104FD00000207047FFF712BD044B036000234360BD +:104FE000C0E9023301230374704700BFB4690008AD +:104FF00010B53023044683F31188FFF74BFD0223DD +:105000000020237480F3118810BD000038B5C369F7 +:1050100004460D461BB904210844FFF7A5FF2946A5 +:1050200004F11400FFF7ACFE002806DA201D4FF44F +:105030000061BDE83840FFF797BF38BD00238268A4 +:10504000037503691B6899689142FBD25A68036033 +:1050500042601060586070470023826803750369DE +:105060001B6899689142FBD85A68036042601060DF +:105070005860704708B50846302383F311880A7DCD +:105080000023052A06D8DFE802F00B050503120EFF +:10509000826913604FF0FF338361FFF7CFFF002376 +:1050A00083F3118808BD8269936801339360D0E966 +:1050B000003213605A60EDE7FFF7C0BF054BD968B7 +:1050C00008751868026853601A600122D86002757A +:1050D000FBF7A0B9A06D00200C4B30B5DD684B1C70 +:1050E00087B004460FD02B46094A684600F066F99F +:1050F0002046FFF7E3FF009B13B1684600F068F914 +:10510000A86907B030BDFFF7D9FFF9E7A06D00200F +:105110007550000838B50C4D04468161EB68816814 +:105120009A68914203D8BDE83840FFF787BF184618 +:10513000FFF792FF01230146EC6020462375BDE88E +:105140003840FBF767B900BFA06D0020044B1A6818 +:10515000DB6890689B68984294BF002001207047EC +:10516000A06D0020084B10B51C68D86822685360F9 +:105170001A600122DC602275FFF76EFF01462046AF +:10518000BDE81040FBF746B9A06D002038B50123FB +:10519000084C00252370656000F0ACFD00F0D2FDE6 +:1051A0000549064800F0A6FE0223237085F3118806 +:1051B00038BD00BF08700020E0690008A06D002025 +:1051C00008B572B6044B186500F0BEFB00F080FC19 +:1051D000024B03221A70FEE7A06D00200870002029 +:1051E00000F02CB98B600223086108468B8270475F +:1051F0008368A3F1840243F8142C026943F8442C19 +:10520000426943F8402C094A43F8242CC268A3F1B0 +:10521000200043F8182C022203F80C2C002203F87B +:105220000B2C034A43F8102C704700BF2D040008D4 +:10523000A06D002008B5FFF7DBFFBDE80840FFF7D1 +:105240003BBF0000024BDB6898610F20FFF736BFC1 +:10525000A06D0020302383F31188FFF7F3BF000017 +:1052600008B50146302383F311880820FFF734FF87 +:10527000002383F3118808BD064BDB6839B142680F +:1052800018605A60136043600420FFF725BF4FF099 +:10529000FF307047A06D00200368984206D01A685E +:1052A0000260506018469961FFF706BF7047000022 +:1052B000036810B59C68A2420CD85C688A600B60D9 +:1052C0004C602160596099688A1A9A604FF0FF33E8 +:1052D000836010BD121B1B68ECE700000A2938BF71 +:1052E0000A2170B504460D460A26601900F0FCFC40 +:1052F00000F0E4FC041BA54203D8751C04462E46AE +:10530000F3E70A2E04D90120BDE8704000F032BE58 +:1053100070BD0000F8B5144B0D460A2A4FF00A077D +:10532000D96103F11001826038BF0A224160196916 +:105330001446016048601861A81800F0C5FC00F030 +:10534000BDFC431B0646A34206D37C1C28192746F6 +:10535000354600F0C9FCF2E70A2F04D90120BDE868 +:10536000F84000F007BEF8BDA06D0020F8B5064675 +:105370000D4600F0A3FC0F4A134653F8107F9F42DE +:1053800006D12A4601463046BDE8F840FFF7C2BFC5 +:10539000D169BB68441A2C1928BF2C46A34202D9F4 +:1053A0002946FFF79BFF224631460348BDE8F840F7 +:1053B000FFF77EBFA06D0020B06D0020C0E9032381 +:1053C000002310B45DF8044B4361FFF7CFBF00002A +:1053D00010B5194C236998420DD08168D0E900328C +:1053E00013605A609A680A449A60002303604FF081 +:1053F000FF33A36110BD0268234643F8102F5360AA +:105400000022026022699A4203D1BDE8104000F0F8 +:1054100065BC936881680B44936000F04FFC22697F +:10542000E1699268441AA242E4D91144BDE81040EF +:10543000091AFFF753BF00BFA06D00202DE9F04708 +:10544000DFF8BC8008F110072C4ED8F8105000F09F +:1054500035FCD8F81C40AA68031B9A423ED8144475 +:105460004FF00009D5E90032C8F81C4013605A60BB +:10547000C5F80090D8F81030B34201D100F02EFCEE +:1054800089F31188D5E9033128469847302383F3FF +:1054900011886B69002BD8D000F010FC6A69A0EB72 +:1054A000040982464A450DD2022000F063FD002225 +:1054B000D8F81030B34208D151462846BDE8F0472D +:1054C000FFF728BF121A2244F2E712EB0909294616 +:1054D000384638BF4A46FFF7EBFEB5E7D8F810303C +:1054E000B34208D01444C8F81C00211AA960BDE8D2 +:1054F000F047FFF7F3BEBDE8F08700BFB06D0020B6 +:10550000A06D002038B500F0D9FB054AD2E9084566 +:10551000031B181945F10001C2E9080138BD00BF9D +:10552000A06D002000207047FEE7000070470000DB +:105530004FF0FF3070470000BFF34F8F044B1A69E4 +:105540005107FCD1D3F810215207F8D1704700BFA2 +:105550000020005208B50D4B1B78ABB9FFF7ECFFEC +:105560000B4BDA68D10704D50A4A5A6002F1883237 +:105570005A60D3F80C21D20706D5064AC3F8042195 +:1055800002F18832C3F8042108BD00BF107000206A +:10559000002000522301674508B5114B1B78F3B971 +:1055A000104B1A69510703D5DA6842F04002DA60FD +:1055B000D3F81021520705D5D3F80C2142F0400250 +:1055C000C3F80C21FFF7B8FF064BDA6842F001027E +:1055D000DA60D3F80C2142F00102C3F80C2108BDB7 +:1055E00010700020002000520F289ABF00F5806044 +:1055F00040040020704700004FF400307047000066 +:10560000102070470F2808B50BD8FFF7EDFF00F505 +:1056100000330268013204D104308342F9D1012001 +:1056200008BD0020FCE700000F2838B505463FD82C +:10563000FFF782FF1F4CFFF78DFF4FF0FF33072866 +:105640006361C4F814311DD82361FFF775FF0302AD +:1056500043F02403E360E36843F08003E3602369DD +:105660005A07FCD42846FFF767FFFFF7BDFF4FF44A +:10567000003100F009FA2846FFF78EFFBDE83840F8 +:10568000FFF7C0BFC4F81031FFF756FFA0F10803C1 +:105690001B0243F02403C4F80C31D4F80C3143F05E +:1056A0008003C4F80C31D4F810315B07FBD4D9E780 +:1056B000002038BD002000522DE9F84F05460C4669 +:1056C000104645EA0203DE0602D00020BDE8F88F4E +:1056D00020F01F00DFF8BCB0DFF8BCA0FFF73AFFF6 +:1056E00004EB0008444503D10120FFF755FFEDE727 +:1056F00020222946204601F00BF810B9203520342D +:10570000F0E72B4605F120021F68791CDDD1043338 +:105710009A42F9D105F178431B481C4EB3F5801F1E +:105720001B4B38BF184603F1F80332BFD946D146A8 +:105730001E46FFF701FF0760A5EB040C336804F178 +:105740001C0143F002033360231FD9F8007017F0E7 +:105750000507FAD153F8042F8B424CF80320F4D1FB +:10576000BFF34F8FFFF7E8FE4FF0FF3320222146B3 +:1057700003602846336823F00203336000F0C8FF5B +:105780000028BBD03846B0E7142100520C2000524C +:1057900014200052102000521021005210B5084C65 +:1057A000237828B11BB9FFF7D5FE0123237010BD64 +:1057B000002BFCD02070BDE81040FFF7EDBE00BF0D +:1057C000107000202DE9F04F0D4685B0814658B18C +:1057D00011F00D0614BF2022082211F008030193D6 +:1057E00004D0431E03426AD0002435E0002E37D097 +:1057F00009F11F0121F01F094FF00108324F05F098 +:105800000403DFF8D0A005EA080BBBF1000F32D08B +:105810007869C0072FD408F101080C37B8F1060FDA +:10582000F3D19EB9294D4946A819019200F0ACFA6E +:10583000044600283AD11836019A782EF3D1494609 +:1058400000F0A2FA0446002830D1019A49462048C7 +:1058500000F09AFA044668BB204605B0BDE8F08F18 +:105860000029C9D101462846029200F08DFA04466B +:10587000E0B9029AC0E713B178694107CBD5AC070C +:1058800002D578698007C6D5019911B178690107F9 +:10589000C1D51820494600FB08A0CDE9022300F03D +:1058A00073FA0446DDE902230028B4D04A460021F9 +:1058B000204601E04A460021FCF796F8CCE7024674 +:1058C000002E95D198E700BFEC69000844700020D5 +:1058D000147000202C7000200121FFF773BF00001E +:1058E000F8B5144D01241827134E40F2FF32002161 +:1058F0000120FCF779F807FB046001342A6955F8A8 +:105900000C1F00F02DFA062CF5D137254FF4C054AA +:105910002046FFF7E1FF014628B122460748BDE8CF +:10592000F84000F01DBAC4EBC404013D4FEAD404B2 +:10593000EED1F8BDEC6900082C7000201470002036 +:1059400008B100F093BA704738B5054D0024033410 +:10595000696855F80C0B00F0A9F8122CF7D138BD86 +:10596000EC69000838B5EFF311859DB9EFF30584B4 +:10597000C4F30804302334B183F31188FFF7C2FD68 +:1059800085F3118838BD83F31188FFF7BBFD84F3DD +:10599000118838BDBDE83840FFF7B4BD10B5FFF73A +:1059A000E1FF104CC008104A002340EA4170C908CA +:1059B000A0FB04ECA0FB020E1CEB0000A1FB044CBE +:1059C000A1FB02125B41001943EB0C0011EB0E012D +:1059D00042F10002411842F10000090941EA007059 +:1059E00010BD00BFCFF753E3A59BC4200244074B73 +:1059F000D2B210B5904200D110BD441C00B253F891 +:105A0000200041F8040BE0B2F4E700BF504000581A +:105A10000E4B30B51C6F240405D41C6F1C671C6F23 +:105A200044F400441C670A4C02442368D2B243F495 +:105A300080732360074B904200D130BD441C51F865 +:105A4000045B00B243F82050E0B2F4E7004402588F +:105A5000004802585040005807B5012201A9002013 +:105A6000FFF7C4FF019803B05DF804FB13B50446CB +:105A7000FFF7F2FFA04205D0012201A90020019406 +:105A8000FFF7C6FF02B010BD0144BFF34F8F064BB6 +:105A9000884204D3BFF34F8FBFF36F8F7047C3F8B3 +:105AA0005C022030F4E700BF00ED00E00144BFF3EA +:105AB0004F8F064B884204D3BFF34F8FBFF36F8FD6 +:105AC0007047C3F870022030F4E700BF00ED00E03B +:105AD00070470000114BDA6952021ED59A69D0074F +:105AE00004D50F4A9A6002F144329A600B4BDA698E +:105AF000D107FCD41A6A22F480021A629A6942F031 +:105B000002029A61DA69D207FCD49A6942F0010272 +:105B10009A61024AD369DB07FCD470470020005227 +:105B20003B2A1908074B45F255521A6003225A6066 +:105B300040F2FF729A604CF6CC421A600122024B8E +:105B40001A70704700480058C0700020034B1B7843 +:105B50001BB1034B4AF6AA221A607047C07000209E +:105B600000480058034B1A681AB9034AD2F8D024E7 +:105B70001A607047BC70002000400258024B4FF47E +:105B80008032C3F8D02470470040025808B5FFF7B0 +:105B9000E9FF024B1868C0F3806008BDBC700020AC +:105BA00070B5BFF34F8FBFF36F8F1A4A0021C2F851 +:105BB0005012BFF34F8FBFF36F8F536943F400331D +:105BC0005361BFF34F8FBFF36F8FC2F88410BFF3E1 +:105BD0004F8FD2F8803043F6E074C3F3C900C3F3AB +:105BE0004E335B0103EA0406014646EA817501393A +:105BF000C2F86052F9D2203B13F1200FF2D1BFF36B +:105C00004F8F536943F480335361BFF34F8FBFF31A +:105C10006F8F70BD00ED00E0FEE70000214B2248D1 +:105C2000224A70B5904237D3214BC11EDA1C121A9A +:105C300022F003028B4238BF00220021FBF7D4FE82 +:105C40001C4A0023C2F88430BFF34F8FD2F8803053 +:105C500043F6E074C3F3C900C3F34E335B0103EAB8 +:105C60000406014646EA81750139C2F86C52F9D240 +:105C7000203B13F1200FF2D1BFF34F8FBFF36F8F93 +:105C8000BFF34F8FBFF36F8F0023C2F85032BFF3C3 +:105C90004F8FBFF36F8F70BD53F8041B40F8041B88 +:105CA000C0E700BFB46B0008E4700020E47000207F +:105CB000E470002000ED00E000F05ABA014B586A91 +:105CC000704700BF000C0040034B002258631A616C +:105CD0000222DA60704700BF000C0040014B002236 +:105CE000DA607047000C0040014B5863704700BFFA +:105CF000000C0040024B034A1A60034A5A60704786 +:105D0000C4700020E870002000000220074B4942C8 +:105D100010B55C68201A08401968821A8A4203D3B9 +:105D2000A24201D85A6010BD0020FCE7C4700020D8 +:105D300008B5302383F31188FFF7E8FF002383F3CE +:105D4000118808BD04480121044B03600023C0E909 +:105D500001330C3000F016B9CC700020315D000822 +:105D6000CB1D083A23F00703591A521A012110B427 +:105D7000D2080024C0E9004384600C301C605A60E3 +:105D80005DF8044B00F0FEB82DE9F84F364ECD1DFE +:105D90000F46002818BF0646082A4FEAD50538BF27 +:105DA000082206F10C08341D9146404600F006F921 +:105DB00009F10701C9F1000E224624686CB940467A +:105DC00000F006F93368CBB308224946E80098474B +:105DD000044698B340E9026730E004EB010CD4F8C4 +:105DE00004A00CEA0E0C0AF10100ACF1080304EB6C +:105DF000C0009842E0D9A0EB0C0CB5EBEC0F4FEAD9 +:105E0000EC0BD9D89C421CD204F10802AB45A3EBA1 +:105E100002024FEAE202626009D9691CED43206880 +:105E200003EBC1025D44556043F8310022601C461B +:105E30005F60404644F8086B00F0CAF82046BDE8B1 +:105E4000F88FAA45216802D111602346EFE701359A +:105E500004EBC50344F8351003F10801401AC010E3 +:105E600058601360F1E700BFCC700020F8B550F81F +:105E7000043C044650F8085CA0F1080607332F1DC7 +:105E80000C35DB0840F8043C284600F097F83B4608 +:105E90009F421A6801D0B34228D20AB1964225D255 +:105EA00044F8082C54F8042C1E60013254F8081CE5 +:105EB00006EBC200814206D14868024444F8042C33 +:105EC0000A6844F8082C5868411C03EBC1018E4253 +:105ED00007D154F8042C013202445A6054F8082CBB +:105EE0001A602846BDE8F84000F072B81346CFE7C4 +:105EF000FEE7000070B51B4B0025044686B05860D5 +:105F00000E4685620163FEF771FA04F11003A56085 +:105F1000E562C4E904334FF0FF33C4E90044C4E947 +:105F20000635FFF7CBFE2B46024604F1340120462E +:105F3000C4E9082380230C4A2565FFF753F90123A0 +:105F40000A4AE06000920375684672680192B2687E +:105F5000CDE90223064BCDE90435FFF76BF906B016 +:105F600070BD00BF08700020346A0008396A00085C +:105F7000F15E0008024AD36A1843D062704700BF3E +:105F8000A06D0020C0E90000816070478368013B7C +:105F9000002B10B583600CDA074BDC684368A06106 +:105FA000206063601C6044600520FFF787F8A069EB +:105FB00010BD0020FCE700BFA06D002008B5302315 +:105FC00083F31188FFF7E2FF002383F3118808BDF4 +:105FD00008B5302383F3118883680133002B836075 +:105FE00007DC036800211A68026050601846FFF75A +:105FF00091F8002383F3118808BD00004B684360CB +:106000008B688360CB68C3600B6943614B69036233 +:106010008B6943620B6803607047000008B53C4B16 +:1060200040F2FF713B48D3F888200A43C3F8882028 +:10603000D3F8882022F4FF6222F00702C3F88820F8 +:10604000D3F88830344B1A6C0A431A649A6E0A43A8 +:106050009A66324A9B6E1146FFF7D0FF00F58060CA +:1060600002F11C01FFF7CAFF00F5806002F1380160 +:10607000FFF7C4FF00F5806002F15401FFF7BEFF97 +:1060800000F5806002F17001FFF7B8FF00F5806055 +:1060900002F18C01FFF7B2FF00F5806002F1A80168 +:1060A000FFF7ACFF00F5806002F1C401FFF7A6FF27 +:1060B00000F5806002F1E001FFF7A0FF00F58060CD +:1060C00002F1FC01FFF79AFF02F58C7100F5806088 +:1060D000FFF794FF00F00EF9114BD3F8902242F035 +:1060E0000102C3F89022D3F8942242F00102C3F8CF +:1060F00094220522C3F898204FF06052C3F89C20E8 +:10610000084AC3F8A020BDE80840FFF7E3BC00BF81 +:10611000004402580000025800450258406A000836 +:1061200000ED00E01F00080308B500F0CFFAFFF70C +:106130002DF80C4BDA6B42F04002DA635A6E22F013 +:1061400040025A665B6E084B1A6842F008021A60F9 +:106150001A6842F004021A60FFF704FDBDE8084027 +:10616000FFF7BEBB00450258001802487047000008 +:106170000E4B9A6C42F008029A641A6F42F00802C1 +:106180001A670B4A1B6FD36B43F00803D363C72214 +:10619000084B9A624FF0FF32DA6200229A615A632A +:1061A000DA605A6001225A611A607047004502584D +:1061B0000010005C000C0040094A08B51169D36862 +:1061C0000B40D9B29B076FEA0101116107D530235B +:1061D00083F31188FFF704F8002383F3118808BDC7 +:1061E000000C0040044BDA6B0243DA635A6E104332 +:1061F00058665B6E704700BF0045025808B53C4BBF +:106200004FF0FF31D3F8802062F00042C3F88020C5 +:10621000D3F8802002F00042C3F88020D3F8802019 +:10622000D3F88420C3F88410D3F884200022C3F864 +:106230008420D3F88400D86F40F0FF4040F4FF0082 +:1062400040F4DF4040F07F00D867D86F20F0FF4077 +:1062500020F4FF0020F4DF4020F07F00D867D86FE3 +:10626000D3F888006FEA40506FEA5050C3F88800B6 +:10627000D3F88800C0F30A00C3F88800D3F8880078 +:10628000D3F89000C3F89010D3F89000C3F8902092 +:10629000D3F89000D3F89400C3F89410D3F8940086 +:1062A000C3F89420D3F89400D3F89800C3F898105A +:1062B000D3F89800C3F89820D3F89800D3F88C004E +:1062C000C3F88C10D3F88C00C3F88C20D3F88C0062 +:1062D000D3F89C00C3F89C10D3F89C10C3F89C2002 +:1062E000D3F89C30FEF72CFABDE8084000F0BEB9A8 +:1062F0000044025808B50122504BC3F80821504B06 +:106300005A6D42F002025A65DA6F42F00202DA6711 +:106310000422DB6F4B4BDA605A689104FCD54A4A81 +:106320001A6001229A60494ADA6000221A614FF429 +:1063300040429A61434B9A699204FCD51A6842F430 +:1063400080721A60424B1A6F12F4407F04D04FF4EF +:1063500080321A6700221A671A6842F001021A6036 +:106360003B4B1A685007FCD500221A611A6912F0DB +:106370003802FBD1012119604FF0804159605A6702 +:10638000344ADA62344A1A611A6842F480321A6076 +:106390002F4B1A689103FCD51A6842F480521A6098 +:1063A0001A689204FCD52D4A2D499A6200225A633C +:1063B000196301F57C01DA6301F5E77199635A64A9 +:1063C000284A1A64284ADA621A6842F0A8521A6007 +:1063D0001F4B1A6802F02852B2F1285FF9D1482207 +:1063E0009A614FF48862DA6140221A621F4ADA64C5 +:1063F0001F4A1A651F4A5A651F4A9A6532231F4A67 +:106400001360136803F00F03022BFAD1104A1369CB +:1064100043F003031361136903F03803182BFAD117 +:106420004FF00050FFF7DEFE4FF08040FFF7DAFE3E +:106430004FF00040BDE80840FFF7D4BE0080005197 +:10644000004502580048025800C000F00400000156 +:10645000004402580000FF010088900832206000CC +:1064600063020901470E0508DD0BBF012000002073 +:10647000000001100910E00000010110002000528E +:106480004FF0B04208B5D2F8883003F00103C2F8EB +:10649000883023B1044A13680BB150689847BDE8AF +:1064A0000840FDF7CBBF00BF486400204FF0B0426A +:1064B00008B5D2F8883003F00203C2F8883023B15F +:1064C000044A93680BB1D0689847BDE80840FDF7CF +:1064D000B5BF00BF486400204FF0B04208B5D2F805 +:1064E000883003F00403C2F8883023B1044A1369EA +:1064F0000BB150699847BDE80840FDF79FBF00BF4A +:10650000486400204FF0B04208B5D2F8883003F05C +:106510000803C2F8883023B1044A93690BB1D069EB +:106520009847BDE80840FDF789BF00BF48640020D8 +:106530004FF0B04208B5D2F8883003F01003C2F82B +:10654000883023B1044A136A0BB1506A9847BDE8FA +:106550000840FDF773BF00BF486400204FF0B04310 +:1065600010B5D3F8884004F47872C3F88820A306E5 +:1065700004D5124A936A0BB1D06A9847600604D5D5 +:106580000E4A136B0BB1506B9847210604D50B4A8A +:10659000936B0BB1D06B9847E20504D5074A136C97 +:1065A0000BB1506C9847A30504D5044A936C0BB10A +:1065B000D06C9847BDE81040FDF740BF486400200C +:1065C0004FF0B04310B5D3F8884004F47C42C3F8D0 +:1065D0008820620504D5164A136D0BB1506D98479B +:1065E000230504D5124A936D0BB1D06D9847E00492 +:1065F00004D50F4A136E0BB1506E9847A10404D511 +:106600000B4A936E0BB1D06E9847620404D5084ACA +:10661000136F0BB1506F9847230404D5044A936F4E +:106620000BB1D06F9847BDE81040FDF707BF00BF22 +:106630004864002008B50348FEF788FABDE8084022 +:10664000FDF7FCBEC864002008B50348FEF77EFADB +:10665000BDE80840FDF7F2BE3465002008B5FFF73D +:10666000ABFDBDE80840FDF7E9BE0000062108B516 +:106670000846FEF7F1FA06210720FEF7EDFA06219B +:106680000820FEF7E9FA06210920FEF7E5FA0621BF +:106690000A20FEF7E1FA06211720FEF7DDFA0621AF +:1066A0002820FEF7D9FA09217A20FEF7D5FA07212A +:1066B0003220FEF7D1FA0C212520FEF7CDFA0C216D +:1066C0005320BDE80840FEF7C7BA000008B5FFF741 +:1066D00095FDFEF7FDF8FEF77DFCFFF747FDBDE8F1 +:1066E0000840FFF7E9BA00000B460146184600F0E3 +:1066F00001B8000010B5054C13462CB10A460146FE +:106700000220AFF3008010BD2046FCE7000000002F +:1067100010B501390244904201D1002005E0037810 +:1067200011F8014FA34201D0181B10BD0130F2E750 +:106730002DE9F041A3B1C91A17780144044603F1C9 +:10674000FF3C8C42204601D9002009E00578BD427B +:1067500004F10104F5D10CEB0405D618A54201D1D2 +:10676000BDE8F08115F8018D16F801EDF045F5D082 +:10677000E7E70000034611F8012B03F8012B002A7C +:10678000F9D17047636F6D2E6375626570696C6FC8 +:10679000742E6865726534666300000053544D338F +:1067A0003248373F3F3F0053544D333248373378F8 +:1067B0002F3732780053544D3332483734332F3724 +:1067C00035332F373530000001105A0003105900BF +:1067D000012058000320560040A2E4F164689106AD +:1067E0000041A3E5F26569920700000043414E466F +:1067F0004449666163653A204D657373616765203E +:1068000052414D204F766572666C6F772100000013 +:106810004261642043414E496661636520696E644C +:1068200065782E00000100000001FF0000A000407C +:1068300000A400400000000000000000092B000838 +:106840009123000891320008012400080D2400085B +:106850002528000885250008C9230008CD23000845 +:10686000A52300088D230008E1270008B1230008B4 +:10687000F9330008BD230008B527000801040E0500 +:10688000054B02020E05054B04010E05054B0501E3 +:106890000B04044B080106030346000010000240ED +:1068A000080002400008024000000B0028000240DF +:1068B000080002400408024006010C0040000240AB +:1068C000080002400808024010020D005800024073 +:1068D000080002400C08024016030E00700002403F +:1068E0000C0002401008024000040F008800024023 +:1068F0000C0002401408024006051000A0000240EF +:106900000C0002401808024010061100B8000240B6 +:106910000C0002401C08024016072F001004024021 +:106920000804024020080240000838002804024001 +:1069300008040240240802400609390040040240CD +:106940000804024028080240100A3A005804024095 +:10695000080402402C080240160B3B007004024061 +:106960000C04024030080240000C3C008804024045 +:106970000C04024034080240060D4400A00402400A +:106980000C04024038080240100E4500B8040240D2 +:106990000C0402403C080240160F4600009600001E +:1069A00000000000000000000000000000000000E7 +:1069B0000000000000000000954F0008814F000813 +:1069C000BD4F0008A94F0008B54F0008A14F0008AF +:1069D0008D4F0008794F0008C94F00086330000050 +:1069E000DC690008F86D002008700020000100201C +:1069F00000FF010002000000000000300000040061 +:106A0000080000000000002400000800040000004E +:106A10000004000000FC0000020000000000043040 +:106A200000800000080000000000003800000100A5 +:106A3000010000006D61696E0069646C6500000012 +:106A40000000002800000000AAAAAAAA0000002452 +:106A5000FFFF0000000000000000000000A0550A39 +:106A600000000000AAAA9AAA00500000FFF200004D +:106A70000000007700009900000000000000000006 +:106A8000AAAAAAAA00000000FFFF00000000000060 +:106A9000000000005A000000000000009AAAAAAA04 +:106AA00000000000F3FF000099000000000000005B +:106AB0000A00000000000000AAAAAAAA050000001F +:106AC000FFFF000088000000000000000000000040 +:106AD00000000000AAAAAAAA00000000FFFF000010 +:106AE00000000000000000000000000000000000A6 +:106AF000AAAAAAAA00000000FFFF000000000000F0 +:106B0000000000000000000000000000AAAAAAAADD +:106B100000000000FFFF0000000000000000000077 +:106B20000000000000000000AAAAAAAA00000000BD +:106B3000FFFF000000000000000000000000000057 +:106B400000000000AAAAAAAA00000000FFFF00009F +:106B50000000000000000000000000000000000035 +:106B6000AAAAAAAA00000000FFFF0000000000007F +:106B700000000000000000001304000000000000FE +:106B80000000180000000000FE2A0100D2040000EE +:106B9000FF000000C86400203465002000000000F1 +:106BA0009C67000883040000A767000850040000E9 +:046BB000B5670008BD :00000001FF diff --git a/Tools/bootloaders/IFLIGHT_2RAW_H7_bl.bin b/Tools/bootloaders/IFLIGHT_2RAW_H7_bl.bin new file mode 100644 index 0000000000..6437346946 Binary files /dev/null and b/Tools/bootloaders/IFLIGHT_2RAW_H7_bl.bin differ diff --git a/Tools/bootloaders/IFLIGHT_2RAW_H7_bl.hex b/Tools/bootloaders/IFLIGHT_2RAW_H7_bl.hex new file mode 100644 index 0000000000..91d6d80139 --- /dev/null +++ b/Tools/bootloaders/IFLIGHT_2RAW_H7_bl.hex @@ -0,0 +1,1102 @@ +:020000040800F2 +:1000000000060020E1020008E3020008E302000805 +:10001000E3020008E3020008E3020008E30200082C +:10002000E3020008E3020008E30200086528000874 +:10003000E3020008E3020008E3020008E30200080C +:10004000E3020008E3020008E3020008E3020008FC +:10005000E3020008E3020008D13D0008FD3D00086E +:10006000293E0008553E0008813E00087110000836 +:1000700099100008C5100008F11000081D110008B3 +:100080004511000871110008E3020008E3020008AE +:10009000E3020008E3020008E3020008AD3E0008A6 +:1000A000E3020008E3020008E3020008E30200089C +:1000B000E3020008E3020008E3020008E30200088C +:1000C000E3020008E3020008E3020008E30200087C +:1000D000E3020008E3020008E3020008E30200086C +:1000E000113F0008E3020008E3020008E3020008F1 +:1000F000E3020008E3020008E30200089D11000883 +:10010000E3020008E3020008853F0008E30200085C +:10011000E3020008E3020008E3020008E30200082B +:10012000C9110008F11100081D1200084912000849 +:1001300075120008E3020008E3020008E302000869 +:10014000E3020008E3020008E3020008E3020008FB +:100150009D120008C9120008F5120008E302000809 +:10016000E3020008E3020008E3020008E3020008DB +:10017000E302000851340008E3020008E30200082B +:10018000E3020008E3020008E3020008E3020008BB +:10019000E3020008E3020008E3020008E3020008AB +:1001A000E3020008E3020008E3020008E30200089B +:1001B000E3020008E3020008E3020008E30200088B +:1001C000E3020008E3020008E3020008E30200087B +:1001D000E30200083D340008E3020008E3020008DF +:1001E000E3020008E3020008E3020008E30200085B +:1001F000E3020008E3020008E3020008E30200084B +:10020000E3020008E3020008E3020008E30200083A +:10021000E3020008E3020008E3020008E30200082A +:10022000E3020008E3020008E3020008E30200081A +:10023000E3020008E3020008E3020008E30200080A +:10024000E3020008E3020008E3020008E3020008FA +:10025000E3020008E3020008E3020008E3020008EA +:10026000E3020008E3020008E3020008E3020008DA +:10027000E3020008E3020008E3020008E3020008CA +:10028000E3020008E3020008E3020008E3020008BA +:10029000E3020008E3020008E3020008E3020008AA +:1002A000E3020008E3020008E3020008E30200089A +:1002B000E3020008E3020008E3020008E30200088A +:1002C000E3020008E3020008E3020008E30200087A +:1002D000E3020008E3020008E3020008E30200086A +:1002E00002E000F000F8FEE772B6374880F30888B5 +:1002F000364880F3098836483649086040F20000E5 +:10030000CCF200004EF63471CEF200010860BFF36B +:100310004F8FBFF36F8F40F20000C0F2F0004EF637 +:100320008851CEF200010860BFF34F8FBFF36F8F8B +:100330004FF00000E1EE100A4EF63C71CEF20001E3 +:100340000860062080F31488BFF36F8F02F0ECFA88 +:1003500003F0FAFA4FF055301F491B4A91423CBF57 +:1003600041F8040BFAE71D49184A91423CBF41F895 +:10037000040BFAE71A491B4A1B4B9A423EBF51F83D +:10038000040B42F8040BF8E700201849184A914280 +:100390003CBF41F8040BFAE702F004FB03F058FB02 +:1003A000144C154DAC4203DA54F8041B8847F9E7A6 +:1003B00000F042F8114C124DAC4203DA54F8041B21 +:1003C0008847F9E702F0ECBA00060020002200207E +:1003D0000000000808ED00E00000002000060020FA +:1003E00060440008002200205C22002060220020DF +:1003F000BC430020E0020008E0020008E002000820 +:10040000E00200082DE9F04F2DED108AC1F80CD064 +:10041000D0F80CD0BDEC108ABDE8F08F002383F338 +:1004200011882846A047002001F0A4FDFEE701F056 +:1004300033FD00DFFEE7000038B500F02FFC00F0D0 +:10044000ABFD02F0CFF9054602F002FA0446C0B94E +:100450000E4B9D4217D001339D4241F2883512BFA9 +:10046000044600250124002002F0C6F90CB100F07A +:1004700075F800F065FD284600F01EF900F06EF8F2 +:10048000F9E70025EFE70546EDE700BF010007B0FB +:1004900008B500F0D5FBA0F120035842584108BD33 +:1004A00007B541F21203022101A8ADF8043000F0B3 +:1004B000E5FB03B05DF804FB38B5302383F3118806 +:1004C000174803680BB101F021FE0023154A4FF4D1 +:1004D0007A71134801F010FE002383F31188124C47 +:1004E000236813B12368013B2360636813B1636819 +:1004F000013B63600D4D2B7833B963687BB90220F3 +:1005000000F088FC322363602B78032B07D16368EB +:100510002BB9022000F07EFC4FF47A73636038BD83 +:1005200060220020B90400088023002078220020E7 +:10053000084B187003280CD8DFE800F00805020803 +:10054000022000F05DBC022000F050BC024B0022F3 +:100550005A6070477822002080230020F8B5504B65 +:10056000504A1C461968013100F0998004339342C7 +:10057000F8D162684C4B9A4240F291804B4B9B6899 +:1005800003F1006303F5C0239A4280F088800020C5 +:1005900000F09EFB0220FFF7CBFF454B0021D3F874 +:1005A000E820C3F8E810D3F81021C3F81011D3F8ED +:1005B0001021D3F8EC20C3F8EC10D3F81421C3F8C1 +:1005C0001411D3F81421D3F8F020C3F8F010D3F8A5 +:1005D0001821C3F81811D3F81821D3F8802042F05D +:1005E0000062C3F88020D3F8802022F00062C3F8B4 +:1005F0008020D3F88020D3F8802042F00072C3F826 +:100600008020D3F8802022F00072C3F88020D3F835 +:10061000803072B64FF0E023C3F8084DD4E90004EF +:10062000BFF34F8FBFF36F8F224AC2F88410BFF31E +:100630004F8F536923F480335361BFF34F8FD2F848 +:10064000803043F6E076C3F3C905C3F34E335B0154 +:1006500003EA060C29464CEA81770139C2F8747224 +:10066000F9D2203B13F1200FF2D1BFF34F8FBFF32C +:100670006F8FBFF34F8FBFF36F8F536923F4003336 +:1006800053610023C2F85032BFF34F8FBFF36F8F17 +:10069000302383F31188854680F308882047F8BD0E +:1006A0000000060820000608FFFF050800220020C1 +:1006B0000044025800ED00E02DE9F04F93B0B44B38 +:1006C0002022FF2100900AA89D6800F0E3FBB14AB8 +:1006D0001378A3B90121B04811700360302383F36C +:1006E000118803680BB101F011FD0023AB4A4FF4F0 +:1006F0007A71A94801F000FD002383F31188009B63 +:1007000013B1A74B009A1A60A64A1378032B03D0A3 +:1007100000231370A24A53604FF0000A009CD34696 +:100720005646D146012000F06BFB24B19C4B1B6860 +:10073000002B00F02682002000F082FA0390039B39 +:10074000002BF2DB012000F051FB039B213B1F2B10 +:10075000E8D801A252F823F0D907000801080008E0 +:100760009508000825070008250700082507000848 +:1007700027090008F70A0008110A0008730A000890 +:100780009B0A0008C10A000825070008D30A0008D0 +:1007900025070008450B0008790800082507000810 +:1007A000890B0008E50700087908000825070008FC +:1007B000730A000825070008250700082507000818 +:1007C0002507000825070008250700082507000859 +:1007D00025070008950800080220FFF759FE0028A9 +:1007E00040F0F981009B022105A8BAF1000F08BF73 +:1007F0001C4641F21233ADF8143000F03FFA91E795 +:100800004FF47A7000F01CFA071EEBDB0220FFF7B2 +:100810003FFE0028E6D0013F052F00F2DE81DFE831 +:1008200007F0030A0D1013360523042105A80593CC +:1008300000F024FA17E004215548F9E704215A484A +:10084000F6E704215948F3E74FF01C08404608F149 +:10085000040800F03FFA0421059005A800F00EFA04 +:10086000B8F12C0FF2D101204FF0000900FA07F780 +:1008700047EA0B0B5FFA8BFB00F058FB26B10BF03D +:100880000B030B2B08BF0024FFF70AFE4AE70421E5 +:100890004748CDE7002EA5D00BF00B030B2BA1D1C1 +:1008A0000220FFF7F5FD074600289BD00120002617 +:1008B00000F00EFA0220FFF73BFE1FFA86F84046D2 +:1008C00000F016FA0446B0B1039940460136A1F192 +:1008D00040025142514100F01BFA0028EDD1BA46C6 +:1008E000044641F21213022105A83E46ADF8143029 +:1008F00000F0C4F916E725460120FFF719FE244B46 +:100900009B68AB4207D9284600F0E4F9013040F07B +:1009100067810435F3E70025224BBA463E461D7039 +:100920001F4B5D60A8E7002E3FF45CAF0BF00B039C +:100930000B2B7FF457AF0220FFF7FAFD322000F0B7 +:100940007FF9B0F10008FFF64DAF18F003077FF410 +:1009500049AF0F4A08EB0503926893423FF642AF56 +:10096000B8F5807F3FF73EAF124BB845019323DDCA +:100970004FF47A7000F064F90390039A002AFFF6AE +:1009800031AF039A0137019B03F8012BEDE700BF5C +:10099000002200207C23002060220020B9040008EF +:1009A000802300207822002004220020082200203A +:1009B0000C2200207C220020C820FFF769FD07469A +:1009C00000283FF40FAF1F2D11D8C5F120020AAB4C +:1009D00025F0030084494245184428BF424601924D +:1009E00000F032FA019AFF217F4800F053FA4FEAF3 +:1009F000A803C8F387027C492846019300F052FA05 +:100A0000064600283FF46DAF019B05EB830533E7F5 +:100A10000220FFF73DFD00283FF4E4AE00F096F918 +:100A200000283FF4DFAE0027B846704B9B68BB42FE +:100A300018D91F2F11D80A9B01330ED027F00303BA +:100A400012AA134453F8203C05934046042205A9FA +:100A5000043700F0F7FA8046E7E7384600F03AF945 +:100A60000590F2E7CDF81480042105A800F006F9FE +:100A700002E70023642104A8049300F0F5F800289D +:100A80007FF4B0AE0220FFF703FD00283FF4AAAECA +:100A9000049800F051F90590E6E70023642104A8CA +:100AA000049300F0E1F800287FF49CAE0220FFF7E9 +:100AB000EFFC00283FF496AE049800F03FF9EAE717 +:100AC0000220FFF7E5FC00283FF48CAE00F04EF961 +:100AD000E1E70220FFF7DCFC00283FF483AE05A924 +:100AE000142000F049F907460421049004A800F0FE +:100AF000C5F83946B9E7322000F0A2F8071EFFF624 +:100B000071AEBB077FF46EAE384A07EB09039268FB +:100B100093423FF667AE0220FFF7BAFC00283FF48D +:100B200061AE27F003074F44B9453FF4A5AE4846F0 +:100B300009F1040900F0CEF80421059005A800F0A1 +:100B40009DF8F1E74FF47A70FFF7A2FC00283FF41C +:100B500049AE00F0FBF8002844D00A9B01330BD0CB +:100B600008220AA9002000F09DF900283AD020228E +:100B7000FF210AA800F08EF9FFF792FC1C4801F053 +:100B8000FFF913B0BDE8F08F002E3FF42BAE0BF051 +:100B90000B030B2B7FF426AE0023642105A80593DD +:100BA00000F062F8074600287FF41CAE0220FFF731 +:100BB0006FFC804600283FF415AEFFF771FC41F250 +:100BC000883001F0DDF9059800F0E4F946463C462E +:100BD00000F0ACF9A6E506464EE64FF0000901E646 +:100BE000BA467EE637467CE67C22002000220020C2 +:100BF000A08601000F4B70B51B780C460133DBB2A9 +:100C0000012B11D80C4D4FF47A732968A2FB0332E3 +:100C100022460E6A01462846B047844204D1074B5B +:100C2000002201201A7070BD4FF4FA7001F0A8F98B +:100C30000020F8E710220020B0260020B423002076 +:100C4000002307B5024601210DF107008DF807309A +:100C5000FFF7D0FF20B19DF8070003B05DF804FB5B +:100C60004FF0FF30F9E700000A46042108B5FFF70E +:100C7000C1FF80F00100C0B2404208BD30B4054C55 +:100C80000A46014623682046DD69034BAC4630BC6A +:100C9000604700BFB0260020A086010070B50A4E54 +:100CA00000240A4D01F086FC308028683388834296 +:100CB00008D901F07BFC2B6804440133B4F5C02F44 +:100CC0002B60F2D370BD00BFB62300208823002024 +:100CD00001F03EBD00F1006000F5C02000687047E3 +:100CE00000F10060920000F5C02001F0BFBC0000E0 +:100CF000054B1A68054B1B889B1A834202D9104486 +:100D000001F054BC0020704788230020B623002047 +:100D100038B50446074D29B128682044BDE838405D +:100D200001F05CBC2868204401F046FC0028F3D0A8 +:100D300038BD00BF882300200020704700F1FF501D +:100D400000F58F10D0F8000870470000064991F8B0 +:100D5000243033B100230822086A81F82430FFF7D9 +:100D6000BFBF0120704700BF8C230020014B1868D3 +:100D7000704700BF0010005C194B01380322084483 +:100D800070B51D68174BC5F30B042D0C1E88A642C9 +:100D90000BD15C680A46013C824213460FD214F91B +:100DA000016F4EB102F8016BF6E7013A03F1080357 +:100DB000ECD181420B4602D22C2203F8012B0424F1 +:100DC000094A1688AE4204D1984284BF967803F847 +:100DD000016B013C02F10402F3D1581A70BD00BF4F +:100DE0000010005C142200207C400008022803D17F +:100DF000024B4FF080729A61704700BF00000258AA +:100E0000022803D1024B4FF480729A61704700BFF1 +:100E100000000258022804D1024A536983F4807307 +:100E2000536170470000025870B504464FF47A765B +:100E30004CB1412C254628BF412506FB05F0641B1B +:100E400001F09EF8F4E770BD002310B5934203D083 +:100E5000CC5CC4540133F9E710BD0000013810B573 +:100E600010F9013F3BB191F900409C4203D11AB106 +:100E70000131013AF4E71AB191F90020981A10BD36 +:100E80001046FCE703460246D01A12F9011B00295E +:100E9000FAD1704702440346934202D003F8011B83 +:100EA000FAE770472DE9F8431F4D14460746884678 +:100EB00095F8242052BBDFF870909CB395F824304D +:100EC0002BB92022FF2148462F62FFF7E3FF95F858 +:100ED00024004146C0F1080205EB8000A24228BF71 +:100EE0002246D6B29200FFF7AFFF95F82430A41B3C +:100EF00017441E449044E4B2F6B2082E85F82460EC +:100F0000DBD1FFF723FF0028D7D108E02B6A03EBE2 +:100F100082038342CFD0FFF719FF0028CBD10020F6 +:100F2000BDE8F8830120FBE78C230020024B1A78F0 +:100F3000024B1A70704700BFB4230020102200201B +:100F400010B5114C114800F06FFB21460F4800F01E +:100F500097FB24684FF47A70D4F89020D2F80438C4 +:100F600043F00203C2F80438FFF75EFF0849204649 +:100F700000F094FCD4F89020D2F8043823F0020357 +:100F8000C2F8043810BD00BF38420008B026002067 +:100F90004042000870470000F0B5A1B071B60023D0 +:100FA0000120002480261A46194600F04BFA4FF41F +:100FB000D067214A3D25136923BBD2F810310BBB02 +:100FC000036804F1006199600368C3F80CD00368FA +:100FD0005E6003681F6001680B6843F001030B60EB +:100FE00001680B6823F01E030B6001680B68DB07C8 +:100FF000FCD4037B8034416805FA03F3B4F5001F89 +:101000000B60D8D100F05EFAB4F5001F11D00024B7 +:101010000A4E0B4D012001F09BFB3388A34205D9FA +:1010200028682044013401F0D9FAF6E7002001F0E5 +:101030008FFB61B621B0F0BD00200052B623002026 +:101040008823002030B50A44084D91420DD011F894 +:10105000013B5840082340F30004013B2C4013F0AF +:10106000FF0384EA5000F6D1EFE730BD2083B8EDEE +:1010700008B5074B074A196801F03D0199605368AC +:101080000BB190689847BDE8084001F023BC00BF51 +:1010900000000240B823002008B5084B19688909F0 +:1010A00001F03D018A019A60054AD3680BB11069CD +:1010B0009847BDE8084001F00DBC00BF00000240A9 +:1010C000B823002008B5084B1968090C01F03D0150 +:1010D0000A049A60054A53690BB190699847BDE8C4 +:1010E000084001F0F7BB00BF00000240B823002019 +:1010F00008B5084B1968890D01F03D018A059A6011 +:10110000054AD3690BB1106A9847BDE8084001F061 +:10111000E1BB00BF00000240B823002008B5074B28 +:10112000074A596801F03D01D960536A0BB1906AD2 +:101130009847BDE8084001F0CDBB00BF0000024069 +:10114000B823002008B5084B5968890901F03D0112 +:101150008A01DA60054AD36A0BB1106B9847BDE883 +:10116000084001F0B7BB00BF00000240B8230020D8 +:1011700008B5084B5968090C01F03D010A04DA6012 +:10118000054A536B0BB1906B9847BDE8084001F0DE +:10119000A1BB00BF00000240B823002008B5084BE7 +:1011A0005968890D01F03D018A05DA60054AD36B63 +:1011B0000BB1106C9847BDE8084001F08BBB00BF35 +:1011C00000000240B823002008B5074B074A196801 +:1011D00001F03D019960536C0BB1906C9847BDE8EC +:1011E000084001F077BB00BF00040240B823002094 +:1011F00008B5084B1968890901F03D018A019A6018 +:10120000054AD36C0BB1106D9847BDE8084001F05A +:1012100061BB00BF00040240B823002008B5084BA2 +:101220001968090C01F03D010A049A60054A536DE2 +:101230000BB1906D9847BDE8084001F04BBB00BF73 +:1012400000040240B823002008B5084B1968890D36 +:1012500001F03D018A059A60054AD36D0BB1106E0D +:101260009847BDE8084001F035BB00BF00040240CC +:10127000B823002008B5074B074A596801F03D0123 +:10128000D960536E0BB1906E9847BDE8084001F0ED +:1012900021BB00BF00040240B823002008B5084B62 +:1012A0005968890901F03D018A01DA60054AD36E67 +:1012B0000BB1106F9847BDE8084001F00BBB00BFB1 +:1012C00000040240B823002008B5084B5968090CF7 +:1012D00001F03D010A04DA60054A536F0BB1906FCB +:1012E0009847BDE8084001F0F5BA00BF000402408D +:1012F000B823002008B5084B5968890D01F03D015D +:101300008A05DA60054AD36F13B1D2F88000984796 +:10131000BDE8084001F0DEBA00040240B823002016 +:1013200000230C4910B51A460B4C0B6054F82300EF +:10133000026001EB430004334260402BF6D1074AC0 +:101340004FF0FF339360D360C2F80834C2F80C3416 +:1013500010BD00BFB82300208C40000800000240F0 +:101360000F28F8B510D9102810D0112811D0122844 +:1013700008D10F240720DFF8C8E00126DEF800506E +:10138000A04208D9002653E00446F4E70F240020C9 +:10139000F1E70724FBE706FA00F73D424AD1264C65 +:1013A0004FEA001C3D4304EB00160EEBC000CEF8E4 +:1013B0000050C0E90123FBB273B12048D0F8D83007 +:1013C00043F00103C0F8D830D0F8003143F00103F6 +:1013D000C0F80031D0F8003117F47F4F0ED0174815 +:1013E000D0F8D83043F00203C0F8D830D0F800313C +:1013F00043F00203C0F80031D0F8003154F80C007B +:10140000036823F01F030360056815F00105FBD195 +:1014100004EB0C033D2493F80CC05F6804FA0CF451 +:101420003C6021240560446112B1987B00F054F8BF +:101430003046F8BD0130A3E78C4000080044025854 +:10144000B823002010B5302484F31188FFF788FFFB +:10145000002383F3118810BD10B50446807B00F093 +:1014600051F801231549627B03FA02F20B6823EA63 +:101470000203DAB20B6072B9114AD2F8D81021F027 +:101480000101C2F8D810D2F8001121F00101C2F810 +:101490000011D2F8002113F47F4F0ED1084BD3F87E +:1014A000D82022F00202C3F8D820D3F8002122F07D +:1014B0000202C3F80021D3F8003110BDB823002088 +:1014C0000044025808B5302383F31188FFF7C4FFA6 +:1014D000002383F3118808BD090100F16043012254 +:1014E00003F56143C9B283F8001300F01F039A406B +:1014F00043099B0003F1604303F56143C3F8802176 +:101500001A60704700F01F0301229A40430900F15E +:1015100060409B0000F5614003F1604303F56143C7 +:10152000C3F88020C3F88021002380F8003370477F +:10153000026843681143016003B118477047000017 +:1015400013B5406B00F58054D4F8A4381A681178AC +:10155000042914D1017C022911D11979012312899E +:101560008B4013420BD101A94C3002F0A3F8D4F800 +:10157000A4480246019B2179206800F0DFF902B0FF +:1015800010BD0000143002F025B800004FF0FF330A +:10159000143002F01FB800004C3002F0F7B8000021 +:1015A0004FF0FF334C3002F0F1B80000143001F07E +:1015B000F3BF00004FF0FF31143001F0EDBF000029 +:1015C0004C3002F0C3B800004FF0FF324C3002F054 +:1015D000BDB800000020704710B500F58054D4F865 +:1015E000A4381A681178042917D1017C022914D172 +:1015F0005979012352898B4013420ED1143001F0E6 +:1016000085FF024648B1D4F8A4484FF4407361798D +:101610002068BDE8104000F07FB910BD406BFFF7B7 +:10162000DBBF0000704700007FB5124B0125042688 +:10163000044603600023057400F1840243602946D8 +:10164000C0E902330C4B0290143001934FF4407305 +:10165000009601F037FF094B04F69442294604F145 +:101660004C000294CDE900634FF4407301F0FEFF9B +:1016700004B070BD8C4100081D160008411500081B +:101680000A68302383F311880B790B3342F8230067 +:101690004B79133342F823008B7913B10B3342F8A3 +:1016A000230000F58053C3F8A4180223037400201C +:1016B00080F311887047000038B5037F044613B1EA +:1016C00090F85430ABB90125201D0221FFF730FFFF +:1016D00004F114006FF00101257700F079FC04F1AA +:1016E0004C0084F854506FF00101BDE8384000F020 +:1016F0006FBC38BD10B5012104460430FFF718FF58 +:101700000023237784F8543010BD000038B5044618 +:101710000025143001F0EEFE04F14C00257701F0B5 +:10172000BDFF201D84F854500121FFF701FF204622 +:10173000BDE83840FFF750BF90F8803003F06003F9 +:10174000202B06D190F881200023212A03D81F2ABC +:1017500006D800207047222AFBD1C0E91D3303E0E0 +:10176000034A426707228267C3670120704700BFB0 +:101770002C22002037B500F58055D5F8A4381A681A +:10178000117804291AD1017C022917D11979012372 +:1017900012898B40134211D100F14C04204602F013 +:1017A0003DF858B101A9204601F084FFD5F8A448BE +:1017B0000246019B2179206800F0C0F803B030BDDB +:1017C00001F10B03F0B550F8236085B004460D46D7 +:1017D000FEB1302383F3118804EB8507301D082107 +:1017E000FFF7A6FEFB6806F14C005B691B681BB1A6 +:1017F000019001F06DFF019803A901F05BFF024623 +:1018000048B1039B2946204600F098F8002383F353 +:10181000118805B0F0BDFB685A691268002AF5D03E +:101820001B8A013B1340F1D104F18002EAE700007A +:10183000133138B550F82140ECB1302383F31188CF +:1018400004F58053D3F8A4281368527903EB82037C +:10185000DB689B695D6845B104216018FFF768FE8D +:10186000294604F1140001F05BFE2046FFF7B4FEA8 +:10187000002383F3118838BD7047000001F028B9B8 +:1018800001234022002110B5044600F8303BFFF749 +:1018900001FB0023C4E9013310BD000010B5302363 +:1018A000044683F311882422416000210C30FFF7A5 +:1018B000F1FA204601F02EF902230020237080F374 +:1018C000118810BD70B500EB8103054650690E46C6 +:1018D0001446DA6018B110220021FFF7DBFAA06984 +:1018E00018B110220021FFF7D5FA31462846BDE88D +:1018F000704001F015BA000083682022002103F037 +:10190000011310B5044683601030FFF7C3FA204678 +:10191000BDE8104001F090BAF0B4012500EB81045D +:1019200047898D40E4683D43A469458123600023D5 +:10193000A2606360F0BC01F0ADBA0000F0B4012514 +:1019400000EB810407898D40E4683D4364690581AB +:1019500023600023A2606360F0BC01F023BB0000A1 +:1019600070B5022300250446242203702946C0F8DE +:1019700088500C3040F8045CFFF78CFA204684F85D +:10198000705001F061F963681B6823B12946204655 +:10199000BDE87040184770BD0378052B10B50446AC +:1019A0000AD080F88C300523037043681B680BB1A4 +:1019B000042198470023A36010BD00000178052989 +:1019C00006D190F88C20436802701B6803B1184759 +:1019D0007047000070B590F87030044613B10023D2 +:1019E00080F8703004F18002204601F049FA636803 +:1019F0009B68B3B994F8803013F0600535D00021AE +:101A0000204601F03BFD0021204601F02BFD6368DC +:101A10001B6813B1062120469847062384F87030CE +:101A200070BD204698470028E4D0B4F88630A26FF5 +:101A30009A4288BFA36794F98030A56F002B4FF0BE +:101A4000300380F20381002D00F0F280092284F837 +:101A5000702083F3118800212046D4E91D23FFF76D +:101A60006DFF002383F31188DAE794F8812003F0F7 +:101A70007F0343EA022340F20232934200F0C58022 +:101A800021D8B3F5807F48D00DD8012B3FD0022B51 +:101A900000F09380002BB2D104F188026267022229 +:101AA000A267E367C1E7B3F5817F00F09B80B3F5E0 +:101AB000407FA4D194F88230012BA0D1B4F88830B3 +:101AC00043F0020332E0B3F5006F4DD017D8B3F501 +:101AD000A06F31D0A3F5C063012B90D86368204676 +:101AE00094F882205E6894F88310B4F88430B0478C +:101AF000002884D0436863670368A3671AE0B3F5DE +:101B0000106F36D040F6024293427FF478AF5C4BC0 +:101B100063670223A3670023C3E794F88230012B95 +:101B20007FF46DAFB4F8883023F00203A4F8883056 +:101B3000C4E91D55E56778E7B4F88030B3F5A06FC8 +:101B40000ED194F88230204684F88A3001F0DAF819 +:101B500063681B6813B10121204698470323237053 +:101B60000023C4E91D339CE704F18B036367012361 +:101B7000C3E72378042B10D1302383F31188204648 +:101B8000FFF7BAFE85F311880321636884F88B5050 +:101B900021701B680BB12046984794F88230002BC7 +:101BA000DED084F88B300423237063681B68002B1D +:101BB000D6D0022120469847D2E794F884302046B8 +:101BC0001D0603F00F010AD501F04CF9012804D0DD +:101BD00002287FF414AF2B4B9AE72B4B98E701F0C8 +:101BE00033F9F3E794F88230002B7FF408AF94F8D0 +:101BF000843013F00F01B3D01A06204602D501F04D +:101C000055FCADE701F046FCAAE794F88230002BC2 +:101C10007FF4F5AE94F8843013F00F01A0D01B06CA +:101C2000204602D501F02AFC9AE701F01BFC97E759 +:101C3000142284F8702083F311882B462A46294603 +:101C40002046FFF769FE85F31188E9E65DB11522AC +:101C500084F8702083F3118800212046D4E91D23E5 +:101C6000FFF75AFEFDE60B2284F8702083F31188FB +:101C70002B462A4629462046FFF760FEE3E700BFD1 +:101C8000BC410008B4410008B841000838B590F8DC +:101C900070300446002B3ED0063BDAB20F2A34D80F +:101CA0000F2B32D8DFE803F03731310822323131DF +:101CB0003131313131313737856FB0F886309D425F +:101CC00014D2C3681B8AB5FBF3F203FB12556DB93E +:101CD000302383F311882B462A462946FFF72EFE30 +:101CE00085F311880A2384F870300EE0142384F8F9 +:101CF0007030302383F31188002320461A4619469A +:101D0000FFF70AFE002383F3118838BDC36F03B1C8 +:101D100098470023E7E70021204601F0AFFB0021B0 +:101D2000204601F09FFB63681B6813B10621204623 +:101D300098470623D7E7000010B590F870300446A6 +:101D4000142B29D017D8062B05D001D81BB110BDF4 +:101D5000093B022BFBD80021204601F08FFB00211C +:101D6000204601F07FFB63681B6813B10621204603 +:101D70009847062319E0152BE9D10B2380F8703022 +:101D8000302383F3118800231A461946FFF7D6FD46 +:101D9000002383F31188DAE7C3689B695B68002B33 +:101DA000D5D1C36F03B19847002384F87030CEE7D4 +:101DB00000238268037503691B6899689142FBD20E +:101DC0005A68036042601060586070470023826860 +:101DD000037503691B6899689142FBD85A680360D0 +:101DE000426010605860704708B50846302383F39E +:101DF00011880B7D032B05D0042B0DD02BB983F359 +:101E0000118808BD8B6900221A604FF0FF3383618F +:101E1000FFF7CEFF0023F2E7D1E9003213605A60EA +:101E2000F3E70000FFF7C4BF054BD96808751868D1 +:101E3000026853601A600122D8600275FEF7E2BAA8 +:101E4000402400200C4B30B5DD684B1C87B00446A5 +:101E50000FD02B46094A684600F04EF92046FFF79E +:101E6000E3FF009B13B1684600F050F9A86907B082 +:101E700030BDFFF7D9FFF9E740240020E91D000835 +:101E8000044B1A68DB6890689B68984294BF0020F6 +:101E90000120704740240020084B10B51C68D8680A +:101EA000226853601A600122DC602275FFF78EFF02 +:101EB00001462046BDE81040FEF7A4BA40240020A9 +:101EC00038B5074C01230025064907482370656093 +:101ED00001F0E2FC0223237085F3118838BD00BFB6 +:101EE000A8260020C44100084024002000F044B986 +:101EF000034A516853685B1A9842FBD8704700BF89 +:101F0000001000E08B600223086108468B82704756 +:101F10008368A3F1840243F8142C026943F8442C2B +:101F2000426943F8402C094A43F8242CC268A3F1C3 +:101F3000200043F8182C022203F80C2C002203F88E +:101F40000B2C034A43F8102C704700BF1D040008F7 +:101F50004024002008B5FFF7DBFFBDE80840FFF78D +:101F600061BF0000024BDB6898610F20FFF75CBF88 +:101F700040240020302383F31188FFF7F3BF0000D3 +:101F800008B50146302383F311880820FFF75AFF74 +:101F9000002383F3118808BD064BDB6839B1426822 +:101FA00018605A60136043600420FFF74BBF4FF086 +:101FB000FF307047402400200368984206D01A681A +:101FC0000260506018469961FFF72CBF704700000F +:101FD00038B504460D462068844200D138BD0368F8 +:101FE00023605C608561FFF71DFFF4E7036810B5AF +:101FF0009C68A2420CD85C688A600B604C602160CF +:10200000596099688A1A9A604FF0FF33836010BD57 +:10201000121B1B68ECE700000A2938BF0A2170B5C3 +:1020200004460D460A26601901F02EFC01F016FC4C +:10203000041BA54203D8751C04462E46F3E70A2E5E +:1020400004D90120BDE8704001F066BC70BD0000FD +:10205000F8B5144B0D460A2A4FF00A07D96103F16F +:102060001001826038BF0A2241601969144601607C +:1020700048601861A81801F0F7FB01F0EFFB431B63 +:102080000646A34206D37C1C28192746354601F094 +:10209000FBFBF2E70A2F04D90120BDE8F84001F06C +:1020A0003BBCF8BD40240020F8B506460D4601F0C3 +:1020B000D5FB0F4A134653F8107F9F4206D12A469C +:1020C00001463046BDE8F840FFF7C2BFD169BB68A2 +:1020D000441A2C1928BF2C46A34202D92946FFF7DF +:1020E0009BFF224631460348BDE8F840FFF77EBF1C +:1020F0004024002050240020C0E90323002310B412 +:102100005DF8044B4361FFF7CFBF000010B5194CD9 +:10211000236998420DD08168D0E9003213605A607B +:102120009A680A449A60002303604FF0FF33A3616A +:1021300010BD0268234643F8102F5360002202604E +:1021400022699A4203D1BDE8104001F097BB936821 +:1021500081680B44936001F081FB2269E169926818 +:10216000441AA242E4D91144BDE81040091AFFF70D +:1021700053BF00BF402400202DE9F047DFF8BC80AA +:1021800008F110072C4ED8F8105001F067FBD8F872 +:102190001C40AA68031B9A423ED814444FF0000921 +:1021A000D5E90032C8F81C4013605A60C5F80090A9 +:1021B000D8F81030B34201D101F060FB89F31188E7 +:1021C000D5E9033128469847302383F311886B699A +:1021D000002BD8D001F042FB6A69A0EB04098246CB +:1021E0004A450DD2022001F097FB0022D8F81030AA +:1021F000B34208D151462846BDE8F047FFF728BF53 +:10220000121A2244F2E712EB09092946384638BF70 +:102210004A46FFF7EBFEB5E7D8F81030B34208D0D6 +:102220001444C8F81C00211AA960BDE8F047FFF764 +:10223000F3BEBDE8F08700BF5024002040240020FA +:1022400000207047FEE70000704700004FF0FF30AD +:102250007047000002290CD0032904D00129074847 +:1022600018BF00207047032A05D8054800EBC200BC +:102270007047044870470020704700BF9C42000828 +:102280003C2200205042000870B59AB0054608462E +:10229000144601A900F0C2F801A8FEF7F3FD431CA3 +:1022A0000022C6B25B001046C5E900342370032348 +:1022B000023404F8013C01ABD1B202348E4201D8A1 +:1022C0001AB070BD13F8011B013204F8010C04F8B8 +:1022D000021CF1E708B5302383F311880348FFF7A8 +:1022E00049FA002383F3118808BD00BFB0260020FF +:1022F00090F8803003F01F02012A07D190F8812066 +:102300000B2A03D10023C0E91D3315E003F060035D +:10231000202B08D1B0F884302BB990F88120212AE5 +:1023200003D81F2A04D8FFF707BA222AEBD0FAE70E +:10233000034A426707228267C3670120704700BFD4 +:102340003322002007B5052917D8DFE801F0191658 +:1023500003191920302383F31188104A01210190B9 +:10236000FFF7B0FA019802210D4AFFF7ABFA0D48CA +:10237000FFF7CCF9002383F3118803B05DF804FB69 +:10238000302383F311880748FFF796F9F2E73023EB +:1023900083F311880348FFF7ADF9EBE7F04100083C +:1023A00014420008B026002038B50C4D0C4C2A46CB +:1023B0000C4904F10800FFF767FF05F1CA0204F1B8 +:1023C00010000949FFF760FF05F5CA7204F1180013 +:1023D0000649BDE83840FFF757BF00BF883F0020DF +:1023E0003C220020D0410008DA410008E541000805 +:1023F00070B5044608460D46FEF744FDC6B22046B9 +:10240000013403780BB9184670BD32462946FEF7F1 +:1024100025FD0028F3D10120F6E700002DE9F84F53 +:1024200005460C46FEF72EFD2A49C6B22846FFF7A0 +:10243000DFFF08B10136F6B227492846FFF7D8FF7B +:1024400008B11036F6B2632E0DD8DFF88890DFF8A9 +:1024500088A0224FDFF88CB0DFF88C802E7846B948 +:102460002670BDE8F88F29462046BDE8F84F01F0F8 +:10247000E7BD252E2AD1072249462846FEF7EEFC65 +:1024800050B9D8F800300735083444F8083CD8F87B +:10249000043044F8043CE1E7082251462846FEF7A0 +:1024A000DDFC98B9A21C0E4B197802320909C95DEE +:1024B00002F8041C13F8011B01F00F015B45C95D14 +:1024C00002F8031CF0D118340835C7E7013504F8C9 +:1024D000016BC3E7BC420008E5410008CD4200089B +:1024E00000E8F11F0CE8F11FC4420008BFF34F8F52 +:1024F000044B1A695107FCD1D3F810215207F8D1C7 +:10250000704700BF0020005208B50D4B1B78ABB9D7 +:10251000FFF7ECFF0B4BDA68D10704D50A4A5A6083 +:1025200002F188325A60D3F80C21D20706D5064A48 +:10253000C3F8042102F18832C3F8042108BD00BFAA +:10254000E6410020002000522301674508B5114BE9 +:102550001B78F3B9104B1A69510703D5DA6842F0BA +:102560004002DA60D3F81021520705D5D3F80C21C8 +:1025700042F04002C3F80C21FFF7B8FF064BDA68BF +:1025800042F00102DA60D3F80C2142F00102C3F8F4 +:102590000C2108BDE6410020002000520F289ABF00 +:1025A00000F5806040040020704700004FF40030C8 +:1025B00070470000102070470F2808B50BD8FFF7B0 +:1025C000EDFF00F500330268013204D1043083428C +:1025D000F9D1012008BD0020FCE700000F2838B524 +:1025E00005463FD8FFF782FF1F4CFFF78DFF4FF0E6 +:1025F000FF3307286361C4F814311DD82361FFF746 +:1026000075FF030243F02403E360E36843F08003B3 +:10261000E36023695A07FCD42846FFF767FFFFF7FA +:10262000BDFF4FF4003100F0F5F82846FFF78EFFAC +:10263000BDE83840FFF7C0BFC4F81031FFF756FFC0 +:10264000A0F108031B0243F02403C4F80C31D4F8B2 +:102650000C3143F08003C4F80C31D4F810315B071F +:10266000FBD4D9E7002038BD002000522DE9F84FF7 +:1026700005460C46104645EA0203DE0602D000205D +:10268000BDE8F88F20F01F00DFF8BCB0DFF8BCA079 +:10269000FFF73AFF04EB0008444503D10120FFF7A0 +:1026A00055FFEDE720222946204601F0B9FC10B97C +:1026B00020352034F0E72B4605F120021F68791CF5 +:1026C000DDD104339A42F9D105F178431B481C4E01 +:1026D000B3F5801F1B4B38BF184603F1F80332BF18 +:1026E000D946D1461E46FFF701FF0760A5EB040C53 +:1026F000336804F11C0143F002033360231FD9F84F +:10270000007017F00507FAD153F8042F8B424CF8EC +:102710000320F4D1BFF34F8FFFF7E8FE4FF0FF33F4 +:102720002022214603602846336823F002033360E9 +:1027300001F076FC0028BBD03846B0E714210052E7 +:102740000C20005214200052102000521021005280 +:1027500010B5084C237828B11BB9FFF7D5FE01232B +:10276000237010BD002BFCD02070BDE81040FFF797 +:10277000EDBE00BFE64100200244074BD2B210B5C7 +:10278000904200D110BD441C00B253F8200041F823 +:10279000040BE0B2F4E700BF504000580E4B30B5D8 +:1027A0001C6F240405D41C6F1C671C6F44F4004488 +:1027B0001C670A4C02442368D2B243F4807323603E +:1027C000074B904200D130BD441C51F8045B00B26D +:1027D00043F82050E0B2F4E70044025800480258A1 +:1027E0005040005807B5012201A90020FFF7C4FF9F +:1027F000019803B05DF804FB13B50446FFF7F2FF40 +:10280000A04205D0012201A900200194FFF7C6FFD4 +:1028100002B010BD0144BFF34F8F064B884204D372 +:10282000BFF34F8FBFF36F8F7047C3F85C02203048 +:10283000F4E700BF00ED00E0034B1A681AB9034A41 +:10284000D2F8D0241A607047E841002000400258B6 +:1028500008B5FFF7F1FF024B1868C0F3806008BDB0 +:10286000E8410020EFF30983054968334A6B22F001 +:1028700001024A6383F30988002383F311887047B8 +:1028800000EF00E0302080F3118862B60D4B0E4A55 +:10289000D96821F4E0610904090C0A430B49DA60A4 +:1028A000D3F8FC2042F08072C3F8FC20084AC2F83A +:1028B000B01F116841F0010111602022DA7783F81E +:1028C0002200704700ED00E00003FA0555CEACC5CC +:1028D000001000E0302310B583F311880E4B5B68C5 +:1028E00013F4006314D0F1EE103AEFF309844FF0C3 +:1028F0008073683CE361094BDB6B236684F30988D2 +:10290000FFF7BEFA10B1064BA36110BD054BFBE704 +:1029100083F31188F9E700BF00ED00E000EF00E06D +:102920002F0400083204000870B5BFF34F8FBFF3C7 +:102930006F8F1A4A0021C2F85012BFF34F8FBFF3B6 +:102940006F8F536943F400335361BFF34F8FBFF36D +:102950006F8FC2F88410BFF34F8FD2F8803043F6E8 +:10296000E074C3F3C900C3F34E335B0103EA04060A +:10297000014646EA81750139C2F86052F9D2203B1E +:1029800013F1200FF2D1BFF34F8F536943F480331B +:102990005361BFF34F8FBFF36F8F70BD00ED00E049 +:1029A000FEE70000214B2248224A70B5904237D3FF +:1029B000214BC11EDA1C121A22F003028B4238BFCF +:1029C00000220021FEF766FA1C4A0023C2F8843078 +:1029D000BFF34F8FD2F8803043F6E074C3F3C900E1 +:1029E000C3F34E335B0103EA0406014646EA8175F0 +:1029F0000139C2F86C52F9D2203B13F1200FF2D109 +:102A0000BFF34F8FBFF36F8FBFF34F8FBFF36F8F46 +:102A10000023C2F85032BFF34F8FBFF36F8F70BDEA +:102A200053F8041B40F8041BC0E700BFBC44000877 +:102A3000BC430020BC430020BC43002000ED00E06C +:102A4000074BD3F8D81021EA0001C3F8D810D3F807 +:102A5000002122EA0002C3F80021D3F800317047B8 +:102A60000044025870B5D0E9244300224FF0FF35EE +:102A70009E6804EB42135101D3F80009002805DADF +:102A8000D3F8000940F08040C3F80009D3F8000BE8 +:102A9000002805DAD3F8000B40F08040C3F8000BA3 +:102AA000013263189642C3F80859C3F8085BE0D2B4 +:102AB0004FF00113C4F81C3870BD0000890141F0CB +:102AC0002001016103699B06FCD41220FFF710BAB4 +:102AD00010B50A4C2046FEF7D3FE094BC4F89030DF +:102AE000084BC4F89430084C2046FEF7C9FE074B4B +:102AF000C4F89030064BC4F8943010BDEC4100206F +:102B00000000084004430008884200200000044000 +:102B10001043000870B503780546012B5CD1434B88 +:102B2000D0F89040984258D1414B0E216520D3F8FF +:102B3000D82042F00062C3F8D820D3F8002142F038 +:102B40000062C3F80021D3F80021D3F8802042F0BE +:102B50000062C3F88020D3F8802022F00062C3F81E +:102B60008020D3F88030FEF7B7FC324BE360324B65 +:102B7000C4F800380023D5F89060C4F8003EC023A4 +:102B800023604FF40413A3633369002BFCDA0123A1 +:102B90000C203361FFF7ACF93369DB07FCD412205A +:102BA000FFF7A6F93369002BFCDA00262846A66059 +:102BB000FFF758FF6B68C4F81068DB68C4F8146846 +:102BC000C4F81C6883BB1D4BA3614FF0FF336361E6 +:102BD000A36843F00103A36070BD194B9842C9D1AB +:102BE000134B4FF08060D3F8D82042F00072C3F846 +:102BF000D820D3F8002142F00072C3F80021D3F8A6 +:102C00000021D3F8802042F00072C3F88020D3F86E +:102C1000802022F00072C3F88020D3F88030FFF7C4 +:102C20000FFF0E214D209EE7064BCDE7EC41002023 +:102C3000004402584014004003002002003C30C011 +:102C400088420020083C30C0F8B5D0F890400546D6 +:102C500000214FF000662046FFF730FFD5F89410B2 +:102C600000234FF001128F684FF0FF30C4F8343862 +:102C7000C4F81C2804EB431201339F42C2F80069D8 +:102C8000C2F8006BC2F80809C2F8080BF2D20B6850 +:102C9000D5F89020C5F89830636210231361166947 +:102CA00016F01006FBD11220FFF722F9D4F80038F5 +:102CB00023F4FE63C4F80038A36943F4402343F0CF +:102CC0001003A3610923C4F81038C4F814380B4B5F +:102CD000EB604FF0C043C4F8103B094BC4F8003B15 +:102CE000C4F81069C4F80039D5F8983003F110021F +:102CF00043F48013C5F89820A362F8BDE0420008B1 +:102D000040800010D0F8902090F88A10D2F8003857 +:102D100023F4FE6343EA0113C2F800387047000051 +:102D20002DE9F84300EB8103D0F890500C46804623 +:102D3000DA680FFA81F94801166806F00306731E77 +:102D4000022B05EB41134FF0000194BFB604384E3F +:102D5000C3F8101B4FF0010104F1100398BF06F1F6 +:102D6000805601FA03F3916998BF06F500460029E1 +:102D70003AD0578A04F15801374349016F50D5F8CA +:102D80001C180B430021C5F81C382B180127C3F869 +:102D90001019A7405369611E9BB3138A928B9B083D +:102DA000012A88BF5343D8F89820981842EA034371 +:102DB00001F140022146C8F89800284605EB82023E +:102DC0005360FFF77BFE08EB8900C3681B8A43EA68 +:102DD000845348341E4364012E51D5F81C381F43D8 +:102DE000C5F81C78BDE8F88305EB4917D7F8001B38 +:102DF00021F40041C7F8001BD5F81C1821EA030391 +:102E0000C0E704F13F030B4A2846214605EB830344 +:102E10005A60FFF753FE05EB4910D0F8003923F450 +:102E20000043C0F80039D5F81C3823EA0707D7E774 +:102E30000080001000040002D0F894201268C0F84E +:102E40009820FFF70FBE00005831D0F890304901AC +:102E50005B5813F4004004D013F4001F0CBF022091 +:102E6000012070474831D0F8903049015B5813F485 +:102E7000004004D013F4001F0CBF02200120704753 +:102E800000EB8101CB68196A0B6813604B685360D3 +:102E90007047000000EB810330B5DD68AA69136854 +:102EA000D36019B9402B84BF402313606B8A146828 +:102EB000D0F890201C4402EB4110013C09B2B4FB55 +:102EC000F3F46343033323F0030343EAC44343F0BF +:102ED000C043C0F8103B2B6803F00303012B0ED155 +:102EE000D2F8083802EB411013F4807FD0F8003B91 +:102EF00014BF43F0805343F00053C0F8003B02EB93 +:102F00004112D2F8003B43F00443C2F8003B30BD0D +:102F10002DE9F041D0F8906005460C4606EB4113D0 +:102F2000D3F8087B3A07C3F8087B08D5D6F81438DD +:102F30001B0704D500EB8103DB685B689847FA0741 +:102F40001FD5D6F81438DB071BD505EB8403D968E9 +:102F5000CCB98B69488A5A68B2FBF0F600FB16229E +:102F60008AB91868DA6890420DD2121AC3E90024AF +:102F7000302383F3118821462846FFF78BFF84F323 +:102F80001188BDE8F081012303FA04F26B8923EA7A +:102F900002036B81CB68002BF3D021462846BDE8A5 +:102FA000F041184700EB81034A0170B5DD68D0F8A5 +:102FB00090306C692668E66056BB1A444FF40020D6 +:102FC000C2F810092A6802F00302012A0AB20ED1DF +:102FD000D3F8080803EB421410F4807FD4F80009FA +:102FE00014BF40F0805040F00050C4F8000903EBDB +:102FF0004212D2F8000940F00440C2F80009012250 +:10300000D3F8340802FA01F10143C3F8341870BD53 +:1030100019B9402E84BF4020206020681A442E8AAF +:103020008419013CB4FBF6F440EAC44040F000507F +:10303000C6E700002DE9F843D0F8906005460C463D +:103040004F0106EB4113D3F8088918F0010FC3F8BC +:1030500008891CD0D6F81038DB0718D500EB81039F +:10306000D3F80CC0DCF81430D3F800E0DA689645E9 +:1030700030D2A2EB0E024FF000091A60C3F80490A0 +:10308000302383F31188FFF78DFF89F3118818F03F +:10309000800F1DD0D6F834380126A640334217D011 +:1030A00005EB84030134D5F89050D3F80CC0E4B29A +:1030B0002F44DCF8142005EB0434D2F800E051680A +:1030C000714514D3D5F8343823EA0606C5F83468B8 +:1030D000BDE8F883012303FA01F2038923EA02031E +:1030E0000381DCF80830002BD1D09847CFE7AEEB56 +:1030F0000103BCF81000834228BF0346D7F8180923 +:1031000080B2B3EB800FE3D89068A0F1040959F8BE +:10311000048FC4F80080A0EB09089844B8F1040FAC +:10312000F5D818440B4490605360C8E72DE9F84F78 +:10313000D0F8905004466E69AB691E4016F4805872 +:103140006E6103D0BDE8F84FFEF70ABC002E12DA1C +:10315000D5F8003E9B0705D0D5F8003E23F00303C9 +:10316000C5F8003ED5F80438204623F00103C5F821 +:103170000438FEF723FC370505D52046FFF772FC1F +:103180002046FEF709FCB0040CD5D5F8083813F03A +:10319000060FEB6823F470530CBF43F4105343F451 +:1031A000A053EB6031071BD56368DB681BB9AB69C3 +:1031B00023F00803AB612378052B0CD1D5F8003E32 +:1031C0009A0705D0D5F8003E23F00303C5F8003E6A +:1031D0002046FEF7F3FB6368DB680BB12046984797 +:1031E000F30200F1BA80B70226D5D4F890900027F8 +:1031F0004FF0010A09EB4712D2F8003B03F44023D9 +:10320000B3F5802F11D1D2F8003B002B0DDA628983 +:103210000AFA07F322EA0303638104EB8703DB68FE +:10322000DB6813B13946204698470137D4F894300B +:10323000FFB29B689F42DDD9F00619D5D4F8900003 +:10324000026AC2F30A1702F00F0302F4F012B2F599 +:10325000802F00F0CA80B2F5402F09D104EB830320 +:10326000002200F58050DB681B6A974240F0B08076 +:103270003003D5F8185835D5E90303D50021204689 +:10328000FFF746FEAA0303D501212046FFF740FEC3 +:103290006B0303D502212046FFF73AFE2F0303D527 +:1032A00003212046FFF734FEE80203D5042120461F +:1032B000FFF72EFEA90203D505212046FFF728FEC1 +:1032C0006A0203D506212046FFF722FE2B0203D512 +:1032D00007212046FFF71CFEEF0103D508212046F9 +:1032E000FFF716FE700340F1A780E90703D5002120 +:1032F0002046FFF79FFEAA0703D501212046FFF7CE +:1033000099FE6B0703D502212046FFF793FE2F0796 +:1033100003D503212046FFF78DFEEE0603D50421D9 +:103320002046FFF787FEA80603D505212046FFF7B4 +:1033300081FE690603D506212046FFF77BFE2A069B +:1033400003D507212046FFF775FEEB0574D520460F +:103350000821BDE8F84FFFF76DBED4F890904FF00C +:10336000000B4FF0010AD4F894305FFA8BF79B689A +:103370009F423FF638AF09EB4713D3F8002902F418 +:103380004022B2F5802F20D1D3F80029002A1CDA80 +:10339000D3F8002942F09042C3F80029D3F800295D +:1033A000002AFBDB3946D4F89000FFF787FB22891F +:1033B0000AFA07F322EA0303238104EB8703DB689D +:1033C0009B6813B13946204698470BF1010BCAE7B9 +:1033D000910701D1D0F80080072A02F101029CBFB9 +:1033E00003F8018B4FEA18283FE704EB830300F54D +:1033F0008050DA68D2F818C0DCF80820DCE9001C3C +:10340000A1EB0C0C00218F4208D1DB689B699A6804 +:103410003A449A605A683A445A6029E711F0030F17 +:1034200001D1D0F800808C4501F1010184BF02F880 +:10343000018B4FEA1828E6E7BDE8F88F08B5034886 +:10344000FFF774FEBDE80840FFF744BAEC410020E6 +:1034500008B50348FFF76AFEBDE80840FFF73ABA2F +:1034600088420020D0F8903003EB4111D1F8003BA6 +:1034700043F40013C1F8003B70470000D0F89030CF +:1034800003EB4111D1F8003943F40013C1F80039BE +:1034900070470000D0F8903003EB4111D1F8003BA9 +:1034A00023F40013C1F8003B70470000D0F89030BF +:1034B00003EB4111D1F8003923F40013C1F80039AE +:1034C0007047000030B50433039C0172002104FBF7 +:1034D0000325C160C0E90653049B0363059BC0E953 +:1034E0000000C0E90422C0E90842C0E90A114363B0 +:1034F00030BD00000022416AC260C0E90411C0E989 +:103500000A226FF00101FEF763BD0000D0E904322A +:10351000934201D1C2680AB9181D70470020704754 +:10352000036919600021C2680132C260C269134494 +:1035300082699342036124BF436A0361FEF73CBD85 +:1035400038B504460D46E3683BB162690020131D9F +:103550001268A3621344E36207E0237A33B9294671 +:103560002046FEF719FD0028EDDA38BD6FF00100A6 +:10357000FBE70000C368C269013BC36043691344B1 +:1035800082699342436124BF436A4361002383629B +:10359000036B03B11847704770B53023044683F3BB +:1035A0001188866A3EB9FFF7CBFF054618B186F34E +:1035B0001188284670BDA36AE26A13F8015B934242 +:1035C000A36202D32046FFF7D5FF002383F31188BF +:1035D000EFE700002DE9F84F04460E4617469846DF +:1035E0004FF0300989F311880025AA46D4F828B095 +:1035F000BBF1000F09D141462046FFF7A1FF20B1E2 +:103600008BF311882846BDE8F88FD4E90A12A7EB9E +:10361000050B521A934528BF9346BBF1400F1BD9A7 +:10362000334601F1400251F8040B914243F8040B78 +:10363000F9D1A36A403640354033A362D4E90A2366 +:103640009A4202D32046FFF795FF8AF31188BD42C4 +:10365000D8D289F31188C9E730465A46FDF7F4FB02 +:10366000A36A5E445D445B44A362E7E710B5029C35 +:103670000433017203FB0421C460C0E90613002374 +:10368000C0E90A33039B0363049BC0E90000C0E95F +:103690000422C0E90842436310BD0000026A6FF0D3 +:1036A0000101C260426AC0E904220022C0E90A2284 +:1036B000FEF78EBCD0E904239A4201D1C26822B938 +:1036C000184650F8043B0B60704700231846FAE791 +:1036D000C3680021C2690133C3604369134482692E +:1036E0009342436124BF436A4361FEF765BC000017 +:1036F00038B504460D46E3683BB1236900201A1D26 +:10370000A262E2691344E36207E0237A33B92946EF +:103710002046FEF741FC0028EDDA38BD6FF00100CD +:10372000FBE7000003691960C268013AC260C26920 +:10373000134482699342036124BF436A03610023F7 +:103740008362036B03B118477047000070B53023E4 +:103750000D460446114683F31188866A2EB9FFF799 +:10376000C7FF10B186F3118870BDA36A1D70A36AEC +:10377000E26A01339342A36204D3E169204604392B +:10378000FFF7D0FF002080F31188EDE72DE9F84F17 +:1037900004460D46904699464FF0300A8AF3118848 +:1037A0000026B346A76A4FB949462046FFF7A0FF57 +:1037B00020B187F311883046BDE8F88FD4E90A07B5 +:1037C0003A1AA8EB0607974228BF1746402F1BD985 +:1037D00005F1400355F8042B9D4240F8042BF9D124 +:1037E000A36A40364033A362D4E90A239A4204D341 +:1037F000E16920460439FFF795FF8BF311884645B0 +:10380000D9D28AF31188CDE729463A46FDF71CFB49 +:10381000A36A3D443E443B44A362E5E7D0E9042368 +:103820009A4217D1C3689BB1836A8BB1043B9B1A40 +:103830000ED01360C368013BC360C3691A44836937 +:103840009A42026124BF436A036100238362012319 +:10385000184670470023FBE700F024B9014B586A73 +:10386000704700BF000C0040034B002258631A61F0 +:103870000222DA60704700BF000C0040014B0022BA +:10388000DA607047000C0040014B5863704700BF7E +:10389000000C0040FEE7000070B51B4B00250446FD +:1038A00086B058600E4685620163FEF7EBFF04F1B7 +:1038B0001003A560E562C4E904334FF0FF33C4E9A7 +:1038C0000044C4E90635FFF7C9FF2B46024604F160 +:1038D00034012046C4E9082380230C4A2565FEF7FD +:1038E00011FB01230A4AE060009203756846726882 +:1038F0000192B268CDE90223064BCDE90435FEF70B +:1039000029FB06B070BD00BFA82600201C4300089C +:103910002143000895380008024AD36A1843D06250 +:10392000704700BF402400204B6843608B68836071 +:10393000CB68C3600B6943614B6903628B69436267 +:103940000B6803607047000008B53C4B40F2FF7104 +:103950003B48D3F888200A43C3F88820D3F888204E +:1039600022F4FF6222F00702C3F88820D3F88820EF +:10397000D3F8E0200A43C3F8E020D3F808210A4333 +:10398000C3F808212F4AD3F808311146FFF7CCFFBE +:1039900000F5806002F11C01FFF7C6FF00F58060B2 +:1039A00002F13801FFF7C0FF00F5806002F1540119 +:1039B000FFF7BAFF00F5806002F17001FFF7B4FF76 +:1039C00000F5806002F18C01FFF7AEFF00F580602A +:1039D00002F1A801FFF7A8FF00F5806002F1C40121 +:1039E000FFF7A2FF00F5806002F1E001FFF79CFF06 +:1039F00000F5806002F1FC01FFF796FF02F58C7183 +:103A000000F58060FFF790FF00F018F90E4BD3F837 +:103A1000902242F00102C3F89022D3F8942242F09F +:103A20000102C3F894220522C3F898204FF0605297 +:103A3000C3F89C20054AC3F8A02008BD00440258E2 +:103A4000000002582843000800ED00E01F000803B2 +:103A500008B500F0C7FAFEF733FA0F4BD3F8DC20B5 +:103A600042F04002C3F8DC20D3F8042122F04002E7 +:103A7000C3F80421D3F80431084B1A6842F0080255 +:103A80001A601A6842F004021A60FEF7D5FEBDE81B +:103A90000840FEF789BC00BF0044025800180248E5 +:103AA00070470000114BD3F8E82042F00802C3F839 +:103AB000E820D3F8102142F00802C3F810210C4A84 +:103AC000D3F81031D36B43F00803D363C722094BFB +:103AD0009A624FF0FF32DA6200229A615A63DA602A +:103AE0005A6001225A611A60704700BF00440258B0 +:103AF0000010005C000C0040094A08B51169D36849 +:103B00000B40D9B29B076FEA0101116107D5302341 +:103B100083F31188FEF7EAF9002383F3118808BDC7 +:103B2000000C0040064BD3F8DC200243C3F8DC2035 +:103B3000D3F804211043C3F80401D3F804317047CB +:103B40000044025808B53C4B4FF0FF31D3F88020B9 +:103B500062F00042C3F88020D3F8802002F00042D7 +:103B6000C3F88020D3F88020D3F88420C3F88410D1 +:103B7000D3F884200022C3F88420D3F88400D86FBF +:103B800040F0FF4040F4FF0040F4DF4040F07F0091 +:103B9000D867D86F20F0FF4020F4FF0020F4DF400A +:103BA00020F07F00D867D86FD3F888006FEA4050C4 +:103BB0006FEA5050C3F88800D3F88800C0F30A00B9 +:103BC000C3F88800D3F88800D3F89000C3F89010A9 +:103BD000D3F89000C3F89020D3F89000D3F8940065 +:103BE000C3F89410D3F89400C3F89420D3F8940049 +:103BF000D3F89800C3F89810D3F89800C3F8982029 +:103C0000D3F89800D3F88C00C3F88C10D3F88C004C +:103C1000C3F88C20D3F88C00D3F89C00C3F89C1018 +:103C2000D3F89C10C3F89C20D3F89C30FDF778FBA8 +:103C3000BDE8084000F0AEB90044025808B50122C2 +:103C4000534BC3F80821534BD3F8F42042F002023F +:103C5000C3F8F420D3F81C2142F00202C3F81C215F +:103C60000222D3F81C314C4BDA605A689104FCD51F +:103C70004A4A1A6001229A60494ADA6000221A61AF +:103C80004FF440429A61444B9A699204FCD51A68F9 +:103C900042F480721A603F4B1A6F12F4407F04D0D6 +:103CA0004FF480321A6700221A671A6842F0010244 +:103CB0001A60384B1A685007FCD500221A611A693D +:103CC00012F03802FBD1012119604FF08041596098 +:103CD0005A67344ADA62344A1A611A6842F4803206 +:103CE0001A602C4B1A689103FCD51A6842F4805272 +:103CF0001A601A689204FCD52C4A2D499A62002257 +:103D00005A63196301F57C01DA6301F2E7119963E3 +:103D10005A64284A1A64284ADA621A6842F0A85299 +:103D20001A601C4B1A6802F02852B2F1285FF9D1D0 +:103D300048229A614FF48862DA6140221A621F4A6F +:103D4000DA641F4A1A651F4A5A651F4A9A65322368 +:103D50001E4A1360136803F00F03022BFAD10D4AB9 +:103D6000136943F003031361136903F03803182B3D +:103D7000FAD14FF00050FFF7D5FE4FF08040FFF72B +:103D8000D1FE4FF00040BDE80840FFF7CBBE00BFBA +:103D900000800051004402580048025800C000F062 +:103DA000020000010000FF010088900812102000AE +:103DB00063020901470E0508DD0BBF01200000204A +:103DC000000001100910E000000101100020005265 +:103DD0004FF0B04208B5D2F8883003F00103C2F8C2 +:103DE000883023B1044A13680BB150689847BDE886 +:103DF0000840FEF76FBD00BF3C4300204FF0B042CB +:103E000008B5D2F8883003F00203C2F8883023B135 +:103E1000044A93680BB1D0689847BDE80840FEF7A4 +:103E200059BD00BF3C4300204FF0B04208B5D2F866 +:103E3000883003F00403C2F8883023B1044A1369C0 +:103E40000BB150699847BDE80840FEF743BD00BF7D +:103E50003C4300204FF0B04208B5D2F8883003F060 +:103E60000803C2F8883023B1044A93690BB1D069C2 +:103E70009847BDE80840FEF72DBD00BF3C43002039 +:103E80004FF0B04208B5D2F8883003F01003C2F802 +:103E9000883023B1044A136A0BB1506A9847BDE8D1 +:103EA0000840FEF717BD00BF3C4300204FF0B04371 +:103EB00010B5D3F8884004F47872C3F88820A306BC +:103EC00004D5124A936A0BB1D06A9847600604D5AC +:103ED0000E4A136B0BB1506B9847210604D50B4A61 +:103EE000936B0BB1D06B9847E20504D5074A136C6E +:103EF0000BB1506C9847A30504D5044A936C0BB1E1 +:103F0000D06C9847BDE81040FEF7E4BC3C4300206D +:103F10004FF0B04310B5D3F8884004F47C42C3F8A6 +:103F20008820620504D5164A136D0BB1506D984771 +:103F3000230504D5124A936D0BB1D06D9847E00468 +:103F400004D50F4A136E0BB1506E9847A10404D5E7 +:103F50000B4A936E0BB1D06E9847620404D5084AA1 +:103F6000136F0BB1506F9847230404D5044A936F25 +:103F70000BB1D06F9847BDE81040FEF7ABBC00BF57 +:103F80003C43002008B5FFF7B7FDBDE80840FEF749 +:103F9000A1BC0000062108B50846FDF79DFA0621E0 +:103FA0000720FDF799FA06210820FDF795FA06216A +:103FB0000920FDF791FA06210A20FDF78DFA062166 +:103FC0001720FDF789FA06212820FDF785FA092137 +:103FD0007A20FDF781FA07213220BDE80840FDF77D +:103FE0007BBA000008B5FFF7ADFD00F00BF8FDF758 +:103FF00045FCFDF717FBFFF753FDBDE80840FFF751 +:104000002BBC00000023054A19460133102BC2E9DE +:10401000001102F10802F8D1704700BF3C430020B4 +:1040200010B501390244904201D1002005E0037827 +:1040300011F8014FA34201D0181B10BD0130F2E767 +:10404000034611F8012B03F8012B002AF9D1704720 +:1040500053544D333248373F3F3F0053544D333272 +:10406000483733782F3732780053544D333248373E +:1040700034332F3735332F373530000001105A00D5 +:104080000310590001205800032056001000024080 +:10409000080002400008024000000B002800024017 +:1040A000080002400408024006010C0040000240E3 +:1040B000080002400808024010020D0058000240AB +:1040C000080002400C08024016030E007000024077 +:1040D0000C0002401008024000040F00880002405B +:1040E0000C0002401408024006051000A000024027 +:1040F0000C0002401808024010061100B8000240EF +:104100000C0002401C08024016072F001004024059 +:104110000804024020080240000838002804024039 +:104120000804024024080240060939004004024005 +:104130000804024028080240100A3A0058040240CD +:10414000080402402C080240160B3B007004024099 +:104150000C04024030080240000C3C00880402407D +:104160000C04024034080240060D4400A004024042 +:104170000C04024038080240100E4500B80402400A +:104180000C0402403C080240160F460000000000EC +:10419000A11500088D150008C9150008B5150008FF +:1041A000C1150008AD15000899150008851500080F +:1041B000D51500080000000001000000000000000C +:1041C00063300000C041000898240020A826002089 +:1041D0004172647550696C6F740025424F415244BE +:1041E000252D424C002553455249414C25000000E5 +:1041F0000200000000000000C1170008311800088C +:1042000040004000583F0020683F002002000000AE +:104210000000000003000000000000007918000802 +:104220000000000010000000783F002000000000A7 +:104230000100000000000000EC410020010102002C +:104240004523000855220008F1220008D522000865 +:10425000430000005842000809024300020100C068 +:1042600032090400000102020100052400100105CA +:10427000240100010424020205240600010705822E +:10428000030800FF09040100020A000000070501FD +:1042900002400000070581024000000012000000FB +:1042A000A442000812011001020000400912415707 +:1042B00000020102030100000403090425424F41EA +:1042C000524425003252415748373433003031329E +:1042D00033343536373839414243444546000000CF +:1042E00000000000D51900088D1C0008391D0008C9 +:1042F000400040002443002024430020010000002F +:10430000344300208000000040010000080000004D +:104310000001000000100000080000006D61696EDF +:104320000069646C650000000000816A0000000004 +:10433000AAAAAAAA00000064FFFE00000000000074 +:1043400000A00A000000000100000000AAAAAAAA1A +:1043500000000001FFFF000000000000000000005E +:104360000000004000000000AAAAAAAA0000004025 +:10437000FFFF0000000000000000000000005000EF +:1043800000000000AAAAAAAA00000000FFF700008F +:10439000000000000000000000000000000000001D +:1043A000AAAAAAAA00000000FFFF00000000000067 +:1043B000000000000000000000000000AAAAAAAA55 +:1043C00000000000FFFF00000000000000000000EF +:1043D0000000000000000000AAAAAAAA0000000035 +:1043E000FFFF0000000000000000000000000000CF +:1043F00000000000AAAAAAAA00000000FFFF000017 +:1044000000000000000000000000000000000000AC +:10441000AAAAAAAA00000000FFFF000000000000F6 +:10442000000000000000000000000000AAAAAAAAE4 +:1044300000000000FFFF000000000000000000007E +:104440000000000000000000AAAAAAAA00000000C4 +:10445000FFFF00000000000000000000000000005E +:10446000950400000000000000001A000000000099 +:10447000FF0000000000000050400008830400001E +:104480005B400008500400006940000800960000EE +:104490000000080096000000000800000400000072 +:1044A000B84200080000000000000000000000000A +:0C44B00000000000000000000000000000 +:00000001FF diff --git a/Tools/bootloaders/KakuteF4-Wing_bl.bin b/Tools/bootloaders/KakuteF4-Wing_bl.bin new file mode 100644 index 0000000000..16db728599 Binary files /dev/null and b/Tools/bootloaders/KakuteF4-Wing_bl.bin differ diff --git a/Tools/bootloaders/KakuteF4-Wing_bl.hex b/Tools/bootloaders/KakuteF4-Wing_bl.hex new file mode 100644 index 0000000000..b66337c2a5 --- /dev/null +++ b/Tools/bootloaders/KakuteF4-Wing_bl.hex @@ -0,0 +1,893 @@ +:020000040800F2 +:1000000000060020E1010008E3010008E301000808 +:10001000E3010008E3010008E3010008E301000830 +:10002000E3010008E3010008E3010008692F00086C +:10003000E3010008E3010008E3010008E301000810 +:10004000E3010008E3010008E3010008E301000800 +:10005000E3010008E301000811320008393200080A +:100060006132000889320008B1320008E30100085B +:10007000E3010008E3010008E3010008E3010008D0 +:10008000E3010008E3010008E3010008E3010008C0 +:10009000E3010008E3010008E3010008D932000889 +:1000A000E3010008E3010008E3010008E3010008A0 +:1000B000AD330008E3010008E3010008E301000894 +:1000C000E3010008E3010008E3010008E301000880 +:1000D000E3010008E3010008E3010008E301000870 +:1000E0003D330008E3010008E3010008E3010008D4 +:1000F000E3010008E3010008E3010008E301000850 +:10010000E3010008E3010008E3010008E30100083F +:10011000E3010008E3010008E3010008E30100082F +:10012000E3010008E3010008E3010008E30100081F +:10013000E3010008E3010008E3010008E30100080F +:10014000E3010008E3010008E30100081D2700089F +:10015000E3010008E3010008E3010008E3010008EF +:10016000E3010008E3010008E3010008E3010008DF +:10017000E3010008E3010008E3010008E3010008CF +:10018000E3010008E3010008E3010008E3010008BF +:10019000E3010008E3010008E3010008E3010008AF +:1001A000E3010008E3010008E3010008E30100089F +:1001B000E3010008E3010008E3010008E30100088F +:1001C000E3010008E3010008E3010008E30100087F +:1001D000E3010008E3010008E3010008E30100086F +:1001E00002E000F000F8FEE772B6374880F30888B6 +:1001F000364880F3098836483649086040F20000E6 +:10020000CCF200004EF63471CEF200010860BFF36C +:100210004F8FBFF36F8F40F20000C0F2F0004EF638 +:100220008851CEF200010860BFF34F8FBFF36F8F8C +:100230004FF00000E1EE100A4EF63C71CEF20001E4 +:100240000860062080F31488BFF36F8F01F02EFF43 +:1002500002F028FE4FF055301F491B4A91423CBF27 +:1002600041F8040BFAE71D49184A91423CBF41F896 +:10027000040BFAE71A491B4A1B4B9A423EBF51F83E +:10028000040B42F8040BF8E700201849184A914281 +:100290003CBF41F8040BFAE701F00CFF02F056FEF8 +:1002A000144C154DAC4203DA54F8041B8847F9E7A7 +:1002B00000F042F8114C124DAC4203DA54F8041B22 +:1002C0008847F9E701F0F4BE000600200022002074 +:1002D0000000000808ED00E00000002000060020FB +:1002E0007037000800220020402200204022002019 +:1002F000602E0020E0010008E0010008E001000895 +:10030000E00100082DE9F04F2DED108AC1F80CD066 +:10031000C3689D46BDEC108ABDE8F08F002383F3CF +:1003200011882846A047002001F070FAFEE701F08E +:10033000FFF900DFFEE7000038B500F0BBFB01F07D +:1003400085FE054601F0A8FE0446C8B90E4B9D4245 +:1003500018D001339D4218BF044641F2883504BFCE +:1003600001240025002001F07BFE0CB100F074F8A0 +:1003700000F0FEFC284600F0BFF800F06DF8F9E749 +:100380000025EFE70546EDE7010007B008B500F0EE +:1003900063FBA0F120035842584108BD07B541F264 +:1003A0001203022101A8ADF8043000F073FB03B082 +:1003B0005DF804FB38B5302383F3118817480368D0 +:1003C0000BB101F0EFFA164A144800234FF47A718A +:1003D00001F0DEFA002383F31188124C236813B175 +:1003E0002368013B2360636813B16368013B63606A +:1003F0000D4D2B7833B963687BB9022000F022FCE5 +:10040000322363602B78032B07D163682BB902205A +:1004100000F018FC4FF47A73636038BD402200206E +:10042000B50300086023002058220020084B1870F4 +:1004300003280CD8DFE800F008050208022000F0CD +:10044000F9BB022000F0ECBB024B00225A6070475F +:100450005822002060230020234B244A10B51C465C +:10046000196801313FD004339342F9D16268A24246 +:1004700039D31F4B9B6803F1006303F540439A4255 +:1004800031D2002000F030FB0220FFF7CFFF194BE4 +:100490001A6C00221A64196E1A66196E596C5A6425 +:1004A000596E5A665A6E5A6942F080025A615A6908 +:1004B00022F080025A615A691A6942F000521A61A8 +:1004C0001A6922F000521A611B6972B64FF0E023DC +:1004D0003021C3F8084DD4E9003281F311889D46DC +:1004E00083F30888104710BD00C0000820C0000832 +:1004F00000220020003802402DE9F04F93B0AA4BB3 +:1005000000902022FF210AA89D6800F0DBFBA74A8B +:100510001378A3B9A648012103601170302383F337 +:10052000118803680BB101F03DFAA24AA0480023EC +:100530004FF47A7101F02CFA002383F31188009BA9 +:1005400013B19D4B009A1A609C4A009C1378032BB0 +:100550001EBF00231370984A4FF0000A18BF536063 +:10056000D3465646D146012000F064FB24B1924B9D +:100570001B68002B00F01182002000F06DFA039040 +:10058000039B002BF2DB012000F04AFB039B213B85 +:10059000162BE8D801A252F823F000BFF905000895 +:1005A00021060008B5060008670500086705000871 +:1005B000670500083F0700080F0900082908000820 +:1005C0008B080008B3080008D90800086705000870 +:1005D000EB080008670500085D0900089906000897 +:1005E00067050008A109000805060008990600082B +:1005F000670500088B0800080220FFF7C7FE0028E7 +:1006000040F0F581009B0221BAF1000F08BF1C46A3 +:1006100005A841F21233ADF8143000F03BFAA2E71E +:100620004FF47A7000F018FA071EEBDB0220FFF798 +:10063000ADFE0028E6D0013F052F00F2DA81DFE8A9 +:1006400007F0030A0D10133605230593042105A8AE +:1006500000F020FA17E054480421F9E75848042133 +:10066000F6E758480421F3E74FF01C08404600F035 +:100670003DFA08F104080590042105A800F00AFAE3 +:10068000B8F12C0FF2D1012000FA07F747EA0B0B63 +:100690005FFA8BFB4FF0000900F060FB26B10BF016 +:1006A0000B030B2B08BF0024FFF778FE5BE74648DF +:1006B0000421CDE7002EA5D00BF00B030B2BA1D10D +:1006C0000220FFF763FE074600289BD0012000F0C0 +:1006D0000BFA0220FFF7AAFE00261FFA86F8404612 +:1006E00000F012FA044690B10021404600F01CFAD6 +:1006F00001360028F1D1BA46044641F21213022114 +:1007000005A8ADF814303E4600F0C4F92BE70120EF +:10071000FFF78CFE2546244B9B68AB4207D9284641 +:1007200000F0E4F9013040F067810435F3E7234B32 +:1007300000251D70204BBA465D603E46ACE7002E9A +:100740003FF460AF0BF00B030B2B7FF45BAF022089 +:10075000FFF76CFE322000F07FF9B0F10008FFF6E1 +:1007600051AF18F003077FF44DAF0F4A926808EBC2 +:10077000050393423FF646AFB8F5807F3FF742AF9F +:10078000124B0193B84523DD4FF47A7000F064F901 +:100790000390039A002AFFF635AF019B039A03F8F2 +:1007A000012B0137EDE700BF002200205C23002071 +:1007B00040220020B50300086023002058220020BA +:1007C00004220020082200200C2200205C220020AD +:1007D000C820FFF7DBFD074600283FF413AF1F2DAD +:1007E00011D8C5F1200242450AAB25F0030028BF0D +:1007F000424683490192184400F03EFA019A80482B +:10080000FF2100F05FFA4FEAA8037D490193C8F386 +:100810008702284600F05EFA064600283FF46DAFD6 +:10082000019B05EB830537E70220FFF7AFFD0028AA +:100830003FF4E8AE00F0A4F900283FF4E3AE00274F +:10084000B846704B9B68BB4218D91F2F11D80A9B22 +:1008500001330ED027F0030312AA134453F8203CAF +:1008600005934046042205A900F0ACFA04378046FF +:10087000E7E7384600F03AF90590F2E7CDF8148042 +:10088000042105A800F006F906E70023642104A866 +:10089000049300F0F5F800287FF4B4AE0220FFF7CF +:1008A00075FD00283FF4AEAE049800F051F90590B4 +:1008B000E6E70023642104A8049300F0E1F800288F +:1008C0007FF4A0AE0220FFF761FD00283FF49AAE4E +:1008D000049800F04DF9EAE70220FFF757FD0028E1 +:1008E0003FF490AE00F05CF9E1E70220FFF74EFD27 +:1008F00000283FF487AE05A9142000F057F9042121 +:100900000746049004A800F0C5F83946B9E732203C +:1009100000F0A2F8071EFFF675AEBB077FF472AEBB +:10092000384A926807EB090393423FF66BAE022008 +:10093000FFF72CFD00283FF465AE27F003074F4476 +:10094000B9453FF4A9AE484600F0D0F8042105901F +:1009500005A800F09FF809F10409F1E74FF47A7057 +:10096000FFF714FD00283FF44DAE00F009F9002810 +:1009700044D00A9B01330BD008220AA9002000F0C2 +:10098000A9F900283AD02022FF210AA800F09AF9FC +:10099000FFF704FD1C4800F03FFF13B0BDE8F08FE7 +:1009A000002E3FF42FAE0BF00B030B2B7FF42AAE7F +:1009B0000023642105A8059300F062F8074600288B +:1009C0007FF420AE0220FFF7E1FC804600283FF4D0 +:1009D00019AEFFF7E3FC41F2883000F01DFF0598E7 +:1009E00000F0EEF9464600F0B9F93C46BBE5064694 +:1009F00052E64FF0000905E6BA467EE637467CE649 +:100A00005C22002000220020A086010070B50F4B60 +:100A10001B780133DBB2012B0C4611D80C4D296831 +:100A20004FF47A730E6AA2FB03320146224628462F +:100A3000B047844204D1074B00221A70012070BDD8 +:100A40004FF4FA7000F0E8FE0020F8E710220020D2 +:100A5000082600209423002007B500230246012128 +:100A60000DF107008DF80730FFF7D0FF20B19DF89A +:100A7000070003B05DF804FB4FF0FF30F9E700001A +:100A80000A4608B50421FFF7C1FF80F00100C0B29B +:100A9000404208BD30B4054C2368DD69044B0A466A +:100AA000AC460146204630BC604700BF0826002007 +:100AB000A086010070B501F0CFF9094E094D3080D4 +:100AC000002428683388834208D901F0BFF92B68D5 +:100AD00004440133B4F5404F2B60F2D370BD00BF26 +:100AE000962300206823002001F064BA00F1006022 +:100AF00000F540400068704700F10060920000F58A +:100B0000404001F0EFB90000054B1A68054B1B8807 +:100B10009B1A834202D9104401F098B90020704713 +:100B2000682300209623002038B5084D044629B1DB +:100B300028682044BDE8384001F0A8B9286820445E +:100B400001F08CF90028F3D038BD00BF68230020E5 +:100B500010F003030AD1B0F5047F05D200F1005074 +:100B6000A0F51040D0F80038184670470023FBE786 +:100B700000F10050A0F51040D0F8100A70470000B6 +:100B8000064991F8243033B10023086A81F82430F3 +:100B90000822FFF7B1BF0120704700BF6C2300207F +:100BA000014B1868704700BF002004E070B5194B76 +:100BB0001D68194B0138C5F30B0408442D0C0422A1 +:100BC0001E88A6420BD15C680A46013C824213464D +:100BD0000FD214F9016F4EB102F8016BF6E7013A3A +:100BE00003F10803ECD181420B4602D22C2203F818 +:100BF000012B0A4A05241688AE4204D1984284BFCC +:100C0000967803F8016B013C02F10402F3D1581A03 +:100C100070BD00BF002004E0903400087C34000860 +:100C2000022802BF024B4FF400329A61704700BFA6 +:100C300000000240022804BF014B9861704700BFCA +:100C400000000240022801BF024A536983F00203F8 +:100C5000536170470000024070B504464FF47A7645 +:100C60004CB1412C254628BF412506FB05F000F07C +:100C7000D3FD641BF4E770BD10B50023934203D08D +:100C8000CC5CC4540133F9E710BD000010B5013845 +:100C900010F9013F3BB191F900409C4203D11AB1D8 +:100CA0000131013AF4E71AB191F90020981A10BD08 +:100CB0001046FCE703460246D01A12F9011B002930 +:100CC000FAD1704702440346934202D003F8011B55 +:100CD000FAE770472DE9F8431F4D144695F8242094 +:100CE0000746884652BBDFF870909CB395F82430D5 +:100CF0002BB92022FF2148462F62FFF7E3FF95F82A +:100D00002400C0F10802A24228BF2246D6B24146C2 +:100D1000920005EB8000FFF7AFFF95F82430A41B8D +:100D20001E44F6B2082E17449044E4B285F82460BD +:100D3000DBD1FFF725FF0028D7D108E02B6A03EBB2 +:100D400082038342CFD0FFF71BFF0028CBD10020C6 +:100D5000BDE8F8830120FBE76C230020024B1A78E2 +:100D6000024B1A70704700BF94230020102200200D +:100D700010B5104C104800F0B5F821460E4800F0B0 +:100D8000DDF82468626DD2F8043843F00203C2F83B +:100D900004384FF47A70FFF75FFF0849204600F0EF +:100DA000D3F9626DD2F8043823F00203C2F8043894 +:100DB00010BD00BF5C35000808260020643500081F +:100DC0007047000030B5094D0A4491420DD011F82A +:100DD000013B5840082340F30004013B2C4013F032 +:100DE000FF0384EA5000F6D1EFE730BD2083B8ED71 +:100DF000026843681143016003B11847704700005F +:100E000013B5446BD4F894341A681178042915D1B9 +:100E1000217C022912D11979128901238B401342B6 +:100E20000CD101A904F14C0001F0F8FED4F894446F +:100E3000019B21790246206800F0D0F902B010BD74 +:100E4000143001F07BBE00004FF0FF33143001F08E +:100E500075BE00004C3001F04DBF00004FF0FF3375 +:100E60004C3001F047BF0000143001F049BE0000D3 +:100E70004FF0FF31143001F043BE00004C3001F060 +:100E800019BF00004FF0FF324C3001F013BF0000DB +:100E90000020704710B5D0F894341A6811780429EE +:100EA000044617D1017C022914D1597952890123B2 +:100EB0008B4013420ED1143001F0DCFD024648B1E4 +:100EC000D4F894444FF4807361792068BDE81040F1 +:100ED00000F072B910BD0000406BFFF7DBBF0000EF +:100EE000704700007FB5124B036000234360C0E9E8 +:100EF0000233012502260F4B05740446029001932C +:100F000000F18402294600964FF48073143001F0FA +:100F10008DFD094B0294CDE9006304F523724FF473 +:100F20008073294604F14C0001F054FE04B070BDFA +:100F3000B0340008D90E0008010E00080B683022FA +:100F400082F311880A7903EB820290614A790932AF +:100F500043F822008A7912B103EB820398610223DD +:100F6000C0F894140374002080F3118870470000C7 +:100F700038B5037F044613B190F85430ABB9201D47 +:100F800001250221FFF734FF04F1140025776FF0EB +:100F9000010100F069FC84F8545004F14C006FF03A +:100FA0000101BDE8384000F05FBC38BD10B501213B +:100FB00004460430FFF71CFF0023237784F85430E5 +:100FC00010BD000038B504460025143001F046FD80 +:100FD00004F14C00257701F015FE201D84F85450D3 +:100FE0000121FFF705FF2046BDE83840FFF752BF5B +:100FF00090F8443003F06003202B07D190F845208F +:10100000212A4FF0000303D81F2A06D8002070477A +:10101000222AFBD1C0E90E3303E0034A8263072290 +:10102000C2630364012070471122002037B5D0F855 +:1010300094341A681178042904461AD1017C0229D3 +:1010400017D11979128901238B40134211D100F174 +:101050004C05284601F096FE58B101A9284601F03A +:10106000DDFDD4F89444019B21790246206800F00C +:10107000B5F803B030BD0000F0B500EB810385B0DA +:101080009E6904460D46FEB1302383F3118804EBBC +:101090008507301D0821FFF7ABFEFB685B691B6805 +:1010A00006F14C001BB1019001F0C6FD019803A9A7 +:1010B00001F0B4FD024648B1039B2946204600F0EA +:1010C0008DF8002383F3118805B0F0BDFB685A69E1 +:1010D0001268002AF5D01B8A013B1340F1D104F1BC +:1010E0004402EAE7093138B550F82140DCB1302339 +:1010F00083F31188D4F894241368527903EB8203A4 +:10110000DB689B695D6845B104216018FFF770FEDC +:10111000294604F1140001F0B7FC2046FFF7BAFE9F +:10112000002383F3118838BD7047000001F016B822 +:10113000012303700023C0E90133C36183620362AA +:10114000C36243620363704738B50446302383F3B8 +:1011500011880025C0E90355C0E90555416001F03B +:101160000DF80223237085F31188284638BD00004E +:1011700070B500EB810305465069DA600E461446EF +:1011800018B110220021FFF79DFDA06918B11022AF +:101190000021FFF797FD31462846BDE8704001F079 +:1011A000B7B80000826802F0011282600022C0E934 +:1011B0000422826101F038B9F0B400EB8104478960 +:1011C000E4680125A4698D403D43458123600023E7 +:1011D000A2606360F0BC01F053B90000F0B400EB12 +:1011E00081040789E468012564698D403D430581D8 +:1011F00023600023A2606360F0BC01F0CDB9000061 +:1012000070B50223002504460370C0E90255C0E909 +:101210000455C564856180F8345001F015F86368A1 +:101220001B6823B129462046BDE87040184770BDB1 +:101230000378052B10B504460AD080F850300523FA +:10124000037043681B680BB1042198470023A36017 +:1012500010BD00000178052906D190F850204368A0 +:1012600002701B6803B118477047000070B590F812 +:101270003430044613B1002380F8343004F14402C2 +:10128000204601F0F3F863689B68B3B994F84430E2 +:1012900013F0600535D00021204601F093FB0021BA +:1012A000204601F085FB63681B6813B106212046C8 +:1012B0009847062384F8343070BD204698470028AC +:1012C000E4D0B4F84A30E26B9A4288BFE36394F901 +:1012D0004430E56B002B4FF0300380F20381002D8A +:1012E00000F0F280092284F8342083F31188002171 +:1012F000D4E90E232046FFF771FF002383F3118802 +:10130000DAE794F8452003F07F0343EA022340F232 +:101310000232934200F0C58021D8B3F5807F48D0D7 +:101320000DD8012B3FD0022B00F09380002BB2D1BF +:1013300004F14C02A2630222E2632364C1E7B3F525 +:10134000817F00F09B80B3F5407FA4D194F84630B4 +:10135000012BA0D1B4F84C3043F0020332E0B3F5D6 +:10136000006F4DD017D8B3F5A06F31D0A3F5C0638F +:10137000012B90D8636894F846205E6894F8471073 +:10138000B4F848302046B047002884D04368A363AF +:101390000368E3631AE0B3F5106F36D040F60242FB +:1013A00093427FF478AF5C4BA3630223E363002393 +:1013B000C3E794F84630012B7FF46DAFB4F84C309E +:1013C00023F00203C4E90E55A4F84C30256478E7F5 +:1013D000B4F84430B3F5A06F0ED194F8463084F8D9 +:1013E0004E30204600F088FF63681B6813B101216E +:1013F00020469847032323700023C4E90E339CE75B +:1014000004F14F03A3630123C3E72378042B10D116 +:10141000302383F311882046FFF7C4FE85F311883B +:101420000321636884F84F5021701B680BB120467C +:10143000984794F84630002BDED084F84F300423D0 +:10144000237063681B68002BD6D002212046984782 +:10145000D2E794F848301D0603F00F0120460AD564 +:1014600000F0F6FF012804D002287FF414AF2B4BC4 +:101470009AE72B4B98E700F0DDFFF3E794F846304E +:10148000002B7FF408AF94F8483013F00F01B3D06D +:101490001A06204602D501F0A9FAADE701F09CFA40 +:1014A000AAE794F84630002B7FF4F5AE94F8483064 +:1014B00013F00F01A0D01B06204602D501F082FADE +:1014C0009AE701F075FA97E7142284F8342083F341 +:1014D00011882B462A4629462046FFF76DFE85F3E4 +:1014E0001188E9E65DB1152284F8342083F3118870 +:1014F0000021D4E90E232046FFF75EFEFDE60B2215 +:1015000084F8342083F311882B462A462946204646 +:10151000FFF764FEE3E700BFE0340008D8340008BA +:10152000DC34000838B590F834300446002B3ED047 +:10153000063BDAB20F2A34D80F2B32D8DFE803F09B +:1015400037313108223231313131313131313737B0 +:10155000C56BB0F84A309D4214D2C3681B8AB5FBF4 +:10156000F3F203FB12556DB9302383F311882B4638 +:101570002A462946FFF732FE85F311880A2384F8AC +:1015800034300EE0142384F83430302383F3118890 +:1015900000231A4619462046FFF70EFE002383F368 +:1015A000118838BD036C03B198470023E7E7002199 +:1015B000204601F007FA0021204601F0F9F963689E +:1015C0001B6813B10621204698470623D7E7000081 +:1015D00010B590F83430142B044629D017D8062BB8 +:1015E00005D001D81BB110BD093B022BFBD800214F +:1015F000204601F0E7F90021204601F0D9F963689F +:101600001B6813B1062120469847062319E0152BC5 +:10161000E9D10B2380F83430302383F31188002381 +:101620001A461946FFF7DAFD002383F31188DAE73B +:10163000C3689B695B68002BD5D1036C03B19847E5 +:10164000002384F83430CEE70023037582680369F1 +:101650001B6899689142FBD25A680360426010602F +:101660005860704700230375826803691B68996896 +:101670009142FBD85A68036042601060586070471E +:1016800008B50846302383F311880B7D032B05D062 +:10169000042B0DD02BB983F3118808BD8B69002270 +:1016A0001A604FF0FF338361FFF7CEFF0023F2E7AC +:1016B000D1E9003213605A60F3E70000FFF7C4BFBE +:1016C000054BD9680875186802681A6053600122D2 +:1016D0000275D860FEF716BE9823002030B50C4B7B +:1016E000DD684B1C87B004460FD02B46094A68467C +:1016F00000F04EF92046FFF7E3FF009B13B1684668 +:1017000000F050F9A86907B030BDFFF7D9FFF9E73D +:101710009823002081160008044B1A68DB68906843 +:101720009B68984294BF00200120704798230020B6 +:10173000084B10B51C68D86822681A6053600122F3 +:101740002275DC60FFF78EFF01462046BDE81040A1 +:10175000FEF7D8BD9823002038B5074C0749084844 +:10176000012300252370656001F044FB02232370F0 +:1017700085F3118838BD00BF00260020E83400083A +:101780009823002000F044B9034A516853685B1A5B +:101790009842FBD8704700BF001000E08B60022326 +:1017A00008618B82084670478368A3F1840243F87E +:1017B000142C026943F8442C426943F8402C094A2E +:1017C00043F8242CC26843F8182C022203F80C2C8E +:1017D000002203F80B2C044A43F8102CA3F120003C +:1017E000704700BF1D0300089823002008B5FFF7CD +:1017F000DBFFBDE80840FFF761BF0000024BDB687C +:1018000098610F20FFF75CBF98230020302383F3FB +:101810001188FFF7F3BF000008B50146302383F3BA +:1018200011880820FFF75AFF002383F3118808BDB1 +:10183000064BDB6839B1426818605A601360436038 +:101840000420FFF74BBF4FF0FF3070479823002074 +:101850000368984206D01A68026050609961184681 +:10186000FFF72CBF7047000038B504460D462068CE +:10187000844200D138BD036823605C608561FFF756 +:101880001DFFF4E710B503689C68A2420CD85C68A1 +:101890008A600B604C602160596099688A1A9A606E +:1018A0004FF0FF33836010BD1B68121BECE7000094 +:1018B0000A2938BF0A2170B504460D460A26601968 +:1018C00001F092FA01F07EFA041BA54203D8751CC0 +:1018D0002E460446F3E70A2E04D9BDE870400120E5 +:1018E00001F0C8BA70BD0000F8B5144B0D46D961BF +:1018F00003F1100141600A2A1969826038BF0A2287 +:10190000016048601861A818144601F05FFA0A27C0 +:1019100001F058FA431BA342064606D37C1C281943 +:1019200001F062FA27463546F2E70A2F04D9BDE8EE +:10193000F840012001F09EBAF8BD00BF98230020B6 +:10194000F8B506460D4601F03DFA0F4A134653F826 +:10195000107F9F4206D12A4601463046BDE8F84036 +:10196000FFF7C2BFD169BB68441A2C1928BF2C46A7 +:10197000A34202D92946FFF79BFF2246314603487E +:10198000BDE8F840FFF77EBF98230020A823002081 +:1019900010B4C0E9032300235DF8044B4361FFF753 +:1019A000CFBF000010B5194C236998420DD0D0E983 +:1019B0000032816813605A609A680A449A60002372 +:1019C00003604FF0FF33A36110BD2346026843F864 +:1019D000102F53600022026022699A4203D1BDE8B1 +:1019E000104001F0FBB9936881680B44936001F0EB +:1019F000E9F92269E1699268441AA242E4D91144E2 +:101A0000BDE81040091AFFF753BF00BF982300201C +:101A10002DE9F047DFF8BC8008F110072C4ED8F80C +:101A2000105001F0CFF9D8F81C40AA68031B9A4265 +:101A30003ED81444D5E900324FF00009C8F81C40E4 +:101A400013605A60C5F80090D8F81030B34201D145 +:101A500001F0C4F989F31188D5E903312846984784 +:101A6000302383F311886B69002BD8D001F0AAF9D9 +:101A70006A69A0EB04094A4582460DD2022001F0B2 +:101A8000F9F90022D8F81030B34208D1514628465F +:101A9000BDE8F047FFF728BF121A2244F2E712EB25 +:101AA000090938BF4A4629463846FFF7EBFEB5E735 +:101AB000D8F81030B34208D01444211AC8F81C00DA +:101AC000A960BDE8F047FFF7F3BEBDE8F08700BFAF +:101AD000A82300209823002000207047FEE7000084 +:101AE000704700004FF0FF307047000002290CD013 +:101AF000032904D00129074818BF00207047032A92 +:101B000005D8054800EBC200704704487047002024 +:101B1000704700BFC035000820220020743500083F +:101B200070B59AB00546084601A9144600F0C2F8FF +:101B300001A8FFF7BFF8431C5B00C5E90034002291 +:101B4000237003236370C6B201AB02341046D1B2D6 +:101B50008E4204F1020401D81AB070BD13F8011BC3 +:101B600004F8021C04F8010C0132F0E708B5302338 +:101B700083F311880348FFF759FA002383F3118890 +:101B800008BD00BF0826002090F8443003F01F0273 +:101B9000012A07D190F845200B2A03D10023C0E980 +:101BA0000E3315E003F06003202B08D1B0F8483065 +:101BB0002BB990F84520212A03D81F2A04D8FFF713 +:101BC00017BA222AEBD0FAE7034A82630722C263DC +:101BD00003640120704700BF1822002007B50529C3 +:101BE00017D8DFE801F0191603191920302383F301 +:101BF0001188104A01900121FFF7BAFA01980E4AA4 +:101C00000221FFF7B5FA0D48FFF7DCF9002383F353 +:101C1000118803B05DF804FB302383F31188074873 +:101C2000FFF7A6F9F2E7302383F311880348FFF7A3 +:101C3000BDF9EBE714350008383500080826002008 +:101C400038B50C4D0C4C0D492A4604F10800FFF73D +:101C500067FF05F1CA0204F110000949FFF760FFB0 +:101C600005F5CA7204F118000649BDE83840FFF7CF +:101C700057BF00BFD02A002020220020F4340008E3 +:101C8000FE3400080935000870B5044608460D46C4 +:101C9000FFF710F8C6B22046013403780BB9184696 +:101CA00070BD32462946FEF7F1FF0028F3D101202E +:101CB000F6E700002DE9F04705460C46FEF7FAFF6F +:101CC0002B49C6B22846FFF7DFFF08B10636F6B249 +:101CD00028492846FFF7D8FF08B11036F6B2632E20 +:101CE0000BD8DFF88C80DFF88C90234FDFF894A0BE +:101CF0002E7846B92670BDE8F08729462046BDE813 +:101D0000F04701F09DBB252E2ED1072241462846E3 +:101D1000FEF7BCFF70B9194B224603F10C0153F8D2 +:101D2000040B42F8040B8B42F9D11B781370073572 +:101D30000D34DDE7082249462846FEF7A7FF98B98B +:101D40000F4BA21C197809090232C95D02F8041C64 +:101D500013F8011B01F00F015345C95D02F8031C84 +:101D6000F0D118340835C3E704F8016B0135BFE73B +:101D7000E035000809350008F6350008E8350008A8 +:101D8000107AFF1F1C7AFF1FBFF34F8F024AD368E0 +:101D9000DB03FCD4704700BF003C024008B5094B90 +:101DA0001B7873B9FFF7F0FF074B1A69002ABFBF12 +:101DB000064A5A6002F188325A601A6822F4806238 +:101DC0001A6008BD2E2D0020003C0240230167450B +:101DD00008B50B4B1B7893B9FFF7D6FF094B1A696F +:101DE00042F000421A611A6842F480521A601A687E +:101DF00022F480521A601A6842F480621A6008BDA8 +:101E00002E2D0020003C02400B28F0B516D80C4CBB +:101E10000C4923787BB90C4D0E460C234FF0006221 +:101E200055F8047B46F8042B013B13F0FF033A44BA +:101E3000F6D10123237051F82000F0BD0020FCE70B +:101E4000602D0020302D002008360008014B53F88B +:101E500020007047083600080C2070470B2810B58A +:101E6000044601D9002010BDFFF7CEFF064B53F802 +:101E700024301844C21A0BB90120F4E71268013269 +:101E8000F0D1043BF6E700BF083600080B2810B578 +:101E9000044621D8FFF778FFFFF780FF0F4AF323AE +:101EA000D360C300DBB243F4007343F00203136159 +:101EB000136943F480331361FFF766FFFFF7A4FF54 +:101EC000074B53F8241000F0D9F8FFF781FF2046A4 +:101ED000BDE81040FFF7C2BF002010BD003C02402B +:101EE00008360008F8B512F00103144642D18218F2 +:101EF000B2F1016F57D82D4B1B6813F0010352D07C +:101F00002B4DFFF74BFFF323EB60FFF73DFF40F254 +:101F10000127032C15D824F001046618244C401A1C +:101F200040F20117B142236900EB010524D123F0EF +:101F300001032361FFF74CFF0120F8BD043C04308E +:101F4000E7E78307E7D12B6923F440732B612B6903 +:101F50003B432B6151F8046B0660BFF34F8FFFF7D3 +:101F600013FF03689E42E9D02B6923F001032B6124 +:101F7000FFF72EFF0020E0E723F44073236123697D +:101F80003B4323610B882B80BFF34F8FFFF7FCFE91 +:101F90002D8831F8023BADB2AB42C3D0236923F0A8 +:101FA00001032361E4E71846C7E700BF0038024099 +:101FB000003C0240084908B50B7828B11BB9FFF76F +:101FC000EDFE01230B7008BD002BFCD0BDE80840DE +:101FD0000870FFF7FDBE00BF2E2D002010B5024493 +:101FE000064BD2B2904200D110BD441C00B253F84F +:101FF000200041F8040BE0B2F4E700BF5028004095 +:102000000F4B30B51C6F240407D41C6F44F40074CC +:102010001C671C6F44F400441C670A4C236843F49B +:10202000807323600244084BD2B2904200D130BD8D +:10203000441C00B251F8045B43F82050E0B2F4E7CE +:1020400000380240007000405028004007B50122CF +:1020500001A90020FFF7C2FF019803B05DF804FB5F +:1020600013B50446FFF7F2FFA04205D0012201A9F3 +:1020700000200194FFF7C4FF02B010BD70470000BC +:10208000034B1A681AB9034AD2F874281A607047C9 +:10209000642D00200030024008B5FFF7F1FF024B2D +:1020A0001868C0F3407008BD642D00207047000020 +:1020B000FEE700000A4B0B480B4A90420BD30B4B38 +:1020C000DA1C121AC11E22F003028B4238BF002212 +:1020D0000021FEF7F7BD53F8041B40F8041BECE7A2 +:1020E000B0370008602E0020602E0020602E0020F7 +:1020F00070B5D0E915439E6800224FF0FF3504EB20 +:1021000042135101D3F800090028BEBFD3F80009DB +:1021100040F08040C3F80009D3F8000B0028BEBF90 +:10212000D3F8000B40F08040C3F8000B0132631875 +:102130009642C3F80859C3F8085BE0D24FF0011388 +:10214000C4F81C3870BD0000890141F02001016114 +:1021500003699B06FCD41220FFF716BB10B5054C93 +:102160002046FEF7E5FF4FF0A0436365024BA365F1 +:1021700010BD00BF682D00205C36000870B50378E4 +:10218000012B054650D12A4B446D98421BD1294B57 +:102190005A6B42F080025A635A6D42F080025A65CF +:1021A0005A6D5A6942F080025A615A6922F08002DF +:1021B0005A610E2143205B6900F022FC1E4BE36054 +:1021C0001E4BC4F800380023C4F8003EC02323602F +:1021D0006E6D4FF40413A3633369002BFCDA012303 +:1021E00033610C20FFF7D0FA3369DB07FCD41220EF +:1021F000FFF7CAFA3369002BFCDA0026A6602846EE +:10220000FFF776FF6B68C4F81068DB68C4F81468E1 +:10221000C4F81C684BB90A4BA3614FF0FF336361EC +:10222000A36843F00103A36070BD064BF4E700BF51 +:10223000682D0020003802404014004003002002B6 +:10224000003C30C0083C30C0F8B5446D0546002164 +:102250002046FFF779FFA96D00234FF001128F6828 +:10226000C4F834384FF00066C4F81C284FF0FF3033 +:1022700004EB431201339F42C2F80069C2F8006BBD +:10228000C2F80809C2F8080BF2D20B686A6DEB6558 +:10229000636210231361166916F01006FBD1122039 +:1022A000FFF772FAD4F8003823F4FE63C4F800385C +:1022B000A36943F4402343F01003A3610923C4F846 +:1022C0001038C4F814380A4BEB604FF0C043C4F820 +:1022D000103B084BC4F8003BC4F81069C4F800393F +:1022E000EB6D03F1100243F48013EA65A362F8BDBD +:1022F0003836000840800010426D90F84E10D2F839 +:10230000003823F4FE6343EA0113C2F80038704733 +:102310002DE9F84300EB8103456DDA68166806F095 +:102320000306731E022B05EB41130C4680460FFA81 +:1023300081F94FEA41104FF00001C3F8101B4FF034 +:10234000010104F1100398BFB60401FA03F3916987 +:102350008EBF334E06F1805606F5004600293AD06E +:10236000578A04F15801490137436F50D5F81C18BA +:102370000B43C5F81C382B180021C3F810195369FA +:102380000127611EA7409BB3138A928B9B08012AE9 +:1023900088BF5343D8F85C20981842EA034301F100 +:1023A000400205EB8202C8F85C00214653602846D3 +:1023B000FFF7CAFE08EB8900C3681B8A43EA84530F +:1023C000483464011E432E51D5F81C381F43C5F80C +:1023D0001C78BDE8F88305EB4917D7F8001B21F4FA +:1023E0000041C7F8001BD5F81C1821EA0303C0E719 +:1023F00004F13F0305EB83030A4A5A60284621464D +:10240000FFF7A2FE05EB4910D0F8003923F4004392 +:10241000C0F80039D5F81C3823EA0707D7E700BF12 +:102420000080001000040002826D1268C265FFF790 +:102430005FBE00005831436D49015B5813F4004002 +:1024400004D013F4001F0CBF0220012070470000CD +:102450004831436D49015B5813F4004004D013F434 +:10246000001F0CBF022001207047000000EB81011B +:10247000CB68196A0B6813604B68536070470000A3 +:1024800000EB810330B5DD68AA691368D36019B920 +:10249000402B84BF402313606B8A1468426D1C4438 +:1024A000013CB4FBF3F46343033323F0030302EB77 +:1024B000411043EAC44343F0C043C0F8103B2B68CB +:1024C00003F00303012B09B20ED1D2F8083802EB56 +:1024D000411013F4807FD0F8003B14BF43F08053C9 +:1024E00043F00053C0F8003B02EB4112D2F8003B2E +:1024F00043F00443C2F8003B30BD00002DE9F04139 +:10250000244D6E6D06EB40130446D3F8087BC3F8E8 +:10251000087B38070AD5D6F81438190706D505EB15 +:1025200084032146DB6828465B689847FA071FD575 +:10253000D6F81438DB071BD505EB8403D968CCB972 +:102540008B69488A5A68B2FBF0F600FB16228AB9FA +:102550001868DA6890420DD2121AC3E900243023B9 +:1025600083F311880B482146FFF78AFF84F3118813 +:10257000BDE8F081012303FA04F26B8923EA020328 +:102580006B81CB68002BF3D021460248BDE8F041B7 +:10259000184700BF682D002000EB810370B5DD688F +:1025A000436D6C692668E6604A0156BB1A444FF4D5 +:1025B0000020C2F810092A6802F00302012A0AB2B8 +:1025C0000ED1D3F8080803EB421410F4807FD4F83E +:1025D000000914BF40F0805040F00050C4F80009DA +:1025E00003EB4212D2F8000940F00440C2F800099F +:1025F000D3F83408012202FA01F10143C3F8341878 +:1026000070BD19B9402E84BF4020206020682E8AFA +:102610008419013CB4FBF6F440EAC44040F0005099 +:102620001A44C6E72DE9F8433B4D6E6D06EB4013A7 +:102630000446D3F80889C3F8088918F0010F4FEA57 +:1026400040171AD0D6F81038DB0716D505EB8003F3 +:10265000D9684B691868DA68904230D2121A4FF084 +:1026600000091A60C3F80490302383F311882146CF +:102670002846FFF791FF89F3118818F0800F1CD0CE +:10268000D6F834380126A640334216D005EB840331 +:102690006D6DD3F80CC0DCF814200134E4B2D2F82C +:1026A00000E005EB04342F445168714515D3D5F88B +:1026B000343823EA0606C5F83468BDE8F8830123F8 +:1026C00003FA04F22B8923EA02032B818B68002B87 +:1026D000D3D0214628469847CFE7BCF81000AEEB90 +:1026E0000103834228BF0346D7F8180980B2B3EB31 +:1026F000800FE2D89068A0F1040959F8048FC4F85B +:102700000080A0EB09089844B8F1040FF5D81844EC +:102710000B4490605360C7E7682D00202DE9F74F08 +:10272000A24C656D6E69AB691E4016F480586E61EF +:1027300007D02046FEF764FD03B0BDE8F04F00F07F +:1027400047BC002E12DAD5F8003E98489B071EBF02 +:10275000D5F8003E23F00303C5F8003ED5F8043851 +:1027600023F00103C5F80438FEF774FD370505D5DD +:102770008E48FFF7BDFC8D48FEF75AFDB0040CD51E +:10278000D5F8083813F0060FEB6823F470530CBF2C +:1027900043F4105343F4A053EB6031071BD5636837 +:1027A000DB681BB9AB6923F00803AB612378052B09 +:1027B0000CD1D5F8003E7D489A071EBFD5F8003EE3 +:1027C00023F00303C5F8003EFEF744FD6368DB68B1 +:1027D0000BB176489847F30274D4B70227D5D4F8E2 +:1027E0005490DFF8C8B100274FF0010A09EB4712F7 +:1027F000D2F8003B03F44023B3F5802F11D1D2F877 +:10280000003B002B0DDA62890AFA07F322EA030380 +:10281000638104EB8703DB68DB6813B139465846F4 +:102820009847A36D01379B68FFB29F42DED9F0063F +:1028300017D5676D3A6AC2F30A1002F00F0302F46B +:10284000F012B2F5802F00F08580B2F5402F08D14C +:1028500004EB83030022DB681B6A07F58057904274 +:102860006AD13003D5F8184813D5E10302D500200A +:10287000FFF744FEA20302D50120FFF73FFE6303EA +:1028800002D50220FFF73AFE270302D50320FFF707 +:1028900035FE75037FF550AFE00702D50020FFF746 +:1028A000C1FEA10702D50120FFF7BCFE620702D5D9 +:1028B0000220FFF7B7FE23077FF53EAF0320FFF7A7 +:1028C000B1FE39E7636DDFF8E4A0019300274FF014 +:1028D0000109A36D9B685FFA87FB9B453FF67DAFBF +:1028E000019B03EB4B13D3F8001901F44021B1F520 +:1028F000802F1FD1D3F8001900291BDAD3F8001953 +:1029000041F09041C3F80019D3F800190029FBDB0E +:102910005946606DFFF718FC218909FA0BF321EA8B +:102920000303238104EB8B03DB689B6813B15946D7 +:10293000504698470137CCE7910708BFD7F8008089 +:10294000072A98BF03F8018B02F1010298BF4FEAF2 +:10295000182884E7023304EB830207F58057526896 +:10296000D2F818C0DCF80820DCE9001CA1EB0C0C44 +:10297000002188420AD104EB830463689B699A684A +:1029800002449A605A6802445A606AE711F0030FE1 +:1029900008BFD7F800808C4588BF02F8018B01F191 +:1029A000010188BF4FEA1828E3E700BF682D002027 +:1029B000436D03EB4111D1F8003B43F40013C1F820 +:1029C000003B7047436D03EB4111D1F8003943F4EC +:1029D0000013C1F800397047436D03EB4111D1F882 +:1029E000003B23F40013C1F8003B7047436D03EB39 +:1029F0004111D1F8003923F40013C1F800397047B0 +:102A000000F1604303F561430901C9B283F8001383 +:102A1000012200F01F039A4043099B0003F1604329 +:102A200003F56143C3F880211A60704730B5039CF9 +:102A30000172043304FB0325C0E90653049B0363BE +:102A40000021059BC160C0E90000C0E90422C0E983 +:102A50000842C0E90A11436330BD0000416A002208 +:102A6000C0E90411C0E90A22C2606FF00101FEF75B +:102A7000FBBE0000D0E90432934201D1C2680AB91A +:102A8000181D70470020704703691960C268013241 +:102A9000C260C269134482690361934224BF436ADE +:102AA00003610021FEF7D4BE38B504460D46E36845 +:102AB0003BB16269131D1268A3621344E3620020F4 +:102AC00007E0237A33B929462046FEF7B1FE0028F5 +:102AD000EDDA38BD6FF00100FBE70000C368C269A2 +:102AE000013BC3604369134482694361934224BF3D +:102AF000436A436100238362036B03B11847704745 +:102B000070B53023044683F31188866A3EB9FFF717 +:102B1000CBFF054618B186F31188284670BDA36A1D +:102B2000E26A13F8015BA362934202D32046FFF7E7 +:102B3000D5FF002383F31188EFE700002DE9F84F5C +:102B400004460E46174698464FF0300989F311881F +:102B50000025AA46D4F828B0BBF1000F09D14146A0 +:102B60002046FFF7A1FF20B18BF311882846BDE86E +:102B7000F88FD4E90A12A7EB050B521A934528BF28 +:102B80009346BBF1400F1BD9334601F1400251F887 +:102B9000040B43F8040B9142F9D1A36A4033403649 +:102BA000A3624035D4E90A239A4202D32046FFF7B4 +:102BB00095FF8AF31188BD42D8D289F31188C9E7FD +:102BC00030465A46FEF758F8A36A5B445E44A36257 +:102BD0005D44E7E710B5029C0172043303FB042156 +:102BE000C0E906130023C0E90A33039B0363049B77 +:102BF000C460C0E90000C0E90422C0E908424363A0 +:102C000010BD0000026AC260426AC0E904220022CC +:102C1000C0E90A226FF00101FEF726BED0E90423C5 +:102C20009A4201D1C26822B9184650F8043B0B60A1 +:102C3000704700231846FAE7C368C2690133C360CE +:102C40004369134482694361934224BF436A4361E9 +:102C50000021FEF7FDBD000038B504460D46E368CF +:102C60003BB123691A1DA262E2691344E3620020AA +:102C700007E0237A33B929462046FEF7D9FD00281C +:102C8000EDDA38BD6FF00100FBE700000369196061 +:102C9000C268013AC260C269134482690361934207 +:102CA00024BF436A036100238362036B03B11847A7 +:102CB0007047000070B530230D460446114683F37B +:102CC0001188866A2EB9FFF7C7FF10B186F3118805 +:102CD00070BDA36A1D70A36AE26A01339342A362C6 +:102CE00004D3E16920460439FFF7D0FF002080F3C8 +:102CF0001188EDE72DE9F84F04460D4690469946B8 +:102D00004FF0300A8AF311880026B346A76A4FB9FC +:102D100049462046FFF7A0FF20B187F311883046CF +:102D2000BDE8F88FD4E90A073A1AA8EB06079742DC +:102D300028BF1746402F1BD905F1400355F8042B37 +:102D400040F8042B9D42F9D1A36A4033A362403678 +:102D5000D4E90A239A4204D3E16920460439FFF7F3 +:102D600095FF8BF311884645D9D28AF31188CDE7B8 +:102D700029463A46FDF780FFA36A3B443D44A362DF +:102D80003E44E5E7D0E904239A4217D1C3689BB1DA +:102D9000836A8BB1043B9B1A0ED01360C368013B5E +:102DA000C360C3691A44836902619A4224BF436ABB +:102DB0000361002383620123184670470023FBE769 +:102DC00000F030B94FF08043586A70474FF08043AD +:102DD000002258631A610222DA6070474FF0804384 +:102DE0000022DA60704700004FF08043586370475C +:102DF000FEE7000070B51B4B01630025044686B05A +:102E0000586085620E4600F0BFF804F11003C4E973 +:102E100004334FF0FF33C4E90635C4E90044A5602C +:102E2000E562FFF7CFFF2B460246C4E9082304F111 +:102E300034010D4A256580232046FEF7AFFC0123AF +:102E4000E0600A4A0375009272680192B268CDE9A7 +:102E50000223074B6846CDE90435FEF7C7FC06B0F0 +:102E600070BD00BF00260020683600086D360008DF +:102E7000F12D0008024AD36A1843D062704700BFA0 +:102E8000982300204B6843608B688360CB68C360E5 +:102E90000B6943614B6903628B6943620B68036092 +:102EA0007047000008B5264B26481A6940F2FF110A +:102EB0000A431A611A6922F4FF7222F001021A61B0 +:102EC0001A691A6B0A431A631A6D0A431A651E4A75 +:102ED0001B6D1146FFF7D6FF02F11C0100F5806063 +:102EE000FFF7D0FF02F1380100F58060FFF7CAFF5D +:102EF00002F1540100F58060FFF7C4FF02F1700198 +:102F000000F58060FFF7BEFF02F18C0100F58060E4 +:102F1000FFF7B8FF02F1A80100F58060FFF7B2FFEC +:102F200002F1C40100F58060FFF7ACFF02F1E0019F +:102F300000F58060FFF7A6FFBDE8084000F0EEB89E +:102F400000380240000002407436000808B500F066 +:102F500059FAFEF701FCFFF793F8BDE80840FEF7C9 +:102F60006FBE000070470000EFF3098305494A6B0C +:102F700022F001024A63683383F30988002383F354 +:102F80001188704700EF00E0302080F3118862B6AE +:102F90000C4B0D4AD96821F4E0610904090C0A437D +:102FA000DA60D3F8FC20094942F08072C3F8FC20B3 +:102FB0000A6842F001020A602022DA7783F82200D0 +:102FC000704700BF00ED00E00003FA05001000E0CC +:102FD00010B5302383F311880E4B5B6813F4006344 +:102FE00014D0F1EE103AEFF30984683C4FF080738F +:102FF000E361094BDB6B236684F30988FEF78CFBE6 +:1030000010B1064BA36110BD054BFBE783F311889C +:10301000F9E700BF00ED00E000EF00E02F0300083B +:10302000320300080F4B1A6C42F001021A641A6E48 +:1030300042F001021A660C4A1B6E936843F00103CA +:1030400093604FF0804353229A624FF0FF32DA626E +:1030500000229A615A63DA605A6001225A611A604A +:10306000704700BF00380240002004E04FF080426B +:1030700008B51169D3680B40D9B2C9439B071161E8 +:1030800007D5302383F31188FEF77CFB002383F3FD +:10309000118808BD1F4B1A696FEAC2526FEAD252FB +:1030A0001A611A69C2F308021A614FF0FF301A69F7 +:1030B0005A69586100215A6959615A691A6A62F05D +:1030C00080521A621A6A02F080521A621A6A5A6AA6 +:1030D00058625A6A59625A6A1A6C42F080521A64EB +:1030E0001A6E42F080521A661A6E0B4A106840F44B +:1030F00080701060186F00F44070B0F5007F1EBF44 +:103100004FF4803018671967536823F400735360D5 +:1031100000F054B90038024000700040334B4FF0CB +:1031200080521A64324A4FF4404111601A6842F0EA +:1031300001021A601A689107FCD59A6822F003020E +:103140009A602A4B9A6812F00C02FBD1196801F0C0 +:10315000F90119609A601A6842F480321A601A689C +:103160009203FCD55A6F42F001025A671F4B5A6F07 +:103170009007FCD51F4A5A601A6842F080721A60A4 +:103180001B4A53685904FCD5184B1A689201FCD5A8 +:10319000194A9A60194B1A68194B9A42194B21D156 +:1031A000194A1168194A91421CD140F205121A605D +:1031B000144A136803F00F03052BFAD10B4B9A68DE +:1031C00042F002029A609A6802F00C02082AFAD1D0 +:1031D0005A6C42F480425A645A6E42F480425A66F3 +:1031E0005B6E704740F20572E1E700BF00380240B5 +:1031F000007000400854400700948838002004E024 +:1032000011640020003C024000ED00E041C20F418B +:10321000074A08B5536903F00103536123B1054A16 +:1032200013680BB150689847BDE80840FFF7D0BE5F +:10323000003C0140E02D0020074A08B5536903F027 +:103240000203536123B1054A93680BB1D0689847D4 +:10325000BDE80840FFF7BCBE003C0140E02D002067 +:10326000074A08B5536903F00403536123B1054AC3 +:1032700013690BB150699847BDE80840FFF7A8BE35 +:10328000003C0140E02D0020074A08B5536903F0D7 +:103290000803536123B1054A93690BB1D06998477C +:1032A000BDE80840FFF794BE003C0140E02D00203F +:1032B000074A08B5536903F01003536123B1054A67 +:1032C000136A0BB1506A9847BDE80840FFF780BE0B +:1032D000003C0140E02D0020164B10B55C6904F461 +:1032E00078725A61A30604D5134A936A0BB1D06A67 +:1032F0009847600604D5104A136B0BB1506B984782 +:10330000210604D50C4A936B0BB1D06B9847E205AC +:1033100004D5094A136C0BB1506C9847A30504D52A +:10332000054A936C0BB1D06C9847BDE81040FFF78D +:103330004FBE00BF003C0140E02D0020194B10B5EE +:103340005C6904F47C425A61620504D5164A136D27 +:103350000BB1506D9847230504D5134A936D0BB1FB +:10336000D06D9847E00404D50F4A136E0BB1506E30 +:103370009847A10404D50C4A936E0BB1D06E9847C0 +:10338000620404D5084A136F0BB1506F98472304A9 +:1033900004D5054A936F0BB1D06F9847BDE8104034 +:1033A000FFF716BE003C0140E02D002008B5FFF7F6 +:1033B0005DFEBDE80840FFF70BBE0000062108B522 +:1033C0000846FFF71DFB06210720FFF719FB062122 +:1033D0000820FFF715FB06210920FFF711FB062146 +:1033E0000A20FFF70DFB06211720FFF709FB062136 +:1033F0002820FFF705FBBDE8084007211C20FFF748 +:10340000FFBA000008B5FFF745FE00F00BF8FDF726 +:103410008DFEFDF765FDFFF7A5FDBDE80840FFF750 +:10342000CFBC00000023054A19460133102BC2E926 +:10343000001102F10802F8D1704700BFE02D002012 +:10344000034611F8012B03F8012B002AF9D170472C +:1034500053544D3332463F3F3F0053544D33324671 +:103460003430780053544D3332463432780053545C +:103470004D333246343436585800000001203300B2 +:103480000010410001105A000310590007103100CC +:103490000000000050340008130400005A340008F3 +:1034A0001904000064340008210400006E34000890 +:1034B000000000005D0E0008490E0008850E00089F +:1034C000710E00087D0E0008690E0008550E0008F8 +:1034D000410E0008910E00080000000001000000ED +:1034E0000000000063300000E4340008F0230020F6 +:1034F000002600204172647550696C6F740025428B +:103500004F415244252D424C002553455249414CD0 +:1035100025000000020000000000000079100008F3 +:10352000E510000840004000A02A0020B02A00203A +:103530000200000000000000030000000000000086 +:10354000291100080000000010000000C02A00201F +:10355000000000000100000000000000682D0020B5 +:1035600001010200DD1B0008ED1A0008891B00089C +:103570006D1B0008430000007C3500080902430071 +:10358000020100C03209040000010202010005240A +:103590000010010524010001042402020524060094 +:1035A00001070582030800FF09040100020A000068 +:1035B00000070501024000000705810240000000ED +:1035C00012000000C835000812011001020000407E +:1035D000091241570002010203010000040309041B +:1035E00025424F41524425004B616B75746546344A +:1035F0002D57696E670030313233343536373839FC +:1036000041424344454600000040000000400000A5 +:103610000040000000400000000001000000020027 +:103620000000020000000200000002000000020092 +:103630000000020000000200000000006D120008FF +:1036400025150008D115000840004000C82D0020B5 +:10365000C82D002001000000D82D002080000000AF +:1036600040010000030000006D61696E0069646C38 +:10367000650000000401802A00000000AAAAAAAA8E +:1036800000010024FDFF00000000000000A00A006F +:103690000000000000000000AAAAAAAA0000000082 +:1036A000FFFF0000000000000000000000000050CC +:1036B00000000000AAAAAAAA00000050FFFF000014 +:1036C00000000000000000000000000000000000FA +:1036D000AAAAAAAA00000000FFFF00000000000044 +:1036E000000000000000000000000000AAAAAAAA32 +:1036F00000000000FFFF00000000000000000000CC +:103700000000000000000000AAAAAAAA0000000011 +:10371000FFFF0000000000000000000000000000AB +:1037200000000000AAAAAAAA00000000FFFF0000F3 +:103730000000000000000000000000000000000089 +:103740000A0000000000000003000000000000006C +:103750000000000000000000000000000000000069 +:103760000000000000000000000000000000000059 +:103770001D1500000000000000400F0000000000C8 +:10378000FF009600000000080096000000000800FE +:1037900004000000DC35000800000000000000000C +:1037A0000000000000000000000000000000000019 +:00000001FF diff --git a/Tools/bootloaders/LongBowF405WING_bl.bin b/Tools/bootloaders/LongBowF405WING_bl.bin new file mode 100755 index 0000000000..fbecaa9908 Binary files /dev/null and b/Tools/bootloaders/LongBowF405WING_bl.bin differ diff --git a/Tools/bootloaders/MFT-SEMA100_bl.bin b/Tools/bootloaders/MFT-SEMA100_bl.bin new file mode 100755 index 0000000000..5ecc178361 Binary files /dev/null and b/Tools/bootloaders/MFT-SEMA100_bl.bin differ diff --git a/Tools/bootloaders/PixPilot-V6PRO_bl.bin b/Tools/bootloaders/PixPilot-V6PRO_bl.bin new file mode 100644 index 0000000000..97647e212e Binary files /dev/null and b/Tools/bootloaders/PixPilot-V6PRO_bl.bin differ diff --git a/Tools/bootloaders/Pixhawk6X-PPPGW_bl.bin b/Tools/bootloaders/Pixhawk6X-PPPGW_bl.bin index 1275617bf4..9776ee4968 100755 Binary files a/Tools/bootloaders/Pixhawk6X-PPPGW_bl.bin and b/Tools/bootloaders/Pixhawk6X-PPPGW_bl.bin differ diff --git a/Tools/bootloaders/ZeroOneX6_bl.bin b/Tools/bootloaders/ZeroOneX6_bl.bin new file mode 100644 index 0000000000..d011831d18 Binary files /dev/null and b/Tools/bootloaders/ZeroOneX6_bl.bin differ diff --git a/Tools/bootloaders/ZeroOneX6_bl.hex b/Tools/bootloaders/ZeroOneX6_bl.hex new file mode 100644 index 0000000000..cc28597753 --- /dev/null +++ b/Tools/bootloaders/ZeroOneX6_bl.hex @@ -0,0 +1,2611 @@ +:020000040800F2 +:1000000000060020E1020008E3020008E302000805 +:10001000E3020008E3020008E3020008E30200082C +:10002000E3020008E3020008E3020008FD7C000888 +:10003000E3020008E3020008E3020008E30200080C +:10004000E3020008E3020008E3020008E3020008FC +:10005000E3020008E3020008098C0008358C000860 +:10006000618C00088D8C0008B98C0008FD4B0008DD +:10007000254C0008514C00087D4C0008A94C000894 +:10008000D14C0008FD4C0008E3020008E302000820 +:10009000E3020008E3020008E3020008E58C000820 +:1000A000E3020008E3020008E3020008E30200089C +:1000B000E3020008E3020008E3020008E30200088C +:1000C000E3020008E3020008E3020008E30200087C +:1000D000E3020008E3020008E3020008D18D0008F3 +:1000E000498D0008E3020008E3020008E30200086B +:1000F000E3020008E3020008E3020008294D0008BB +:10010000E3020008E30200080D8E0008E302000885 +:10011000E3020008E58D0008E3020008E30200089E +:10012000554D00087D4D0008A94D0008D54D00082B +:10013000014E0008E3020008E3020008E3020008A1 +:10014000E3020008E3020008E3020008E3020008FB +:10015000294E0008554E0008814E0008E3020008B1 +:10016000E3020008E3020008E3020008E3020008DB +:10017000E3020008E9880008E3020008E30200083F +:10018000E3020008E3020008F98D0008E30200081A +:10019000E3020008E3020008E3020008E3020008AB +:1001A000E3020008E3020008E3020008E30200089B +:1001B000E3020008E3020008E3020008E30200088B +:1001C000E3020008E3020008E3020008E30200087B +:1001D000E3020008D5880008E3020008E3020008F3 +:1001E000E3020008E3020008E3020008E30200085B +:1001F000E3020008E3020008E3020008E30200084B +:10020000E3020008E3020008E3020008E30200083A +:10021000E3020008E3020008E3020008E30200082A +:10022000E3020008E3020008E3020008E30200081A +:10023000BD8D0008E3020008E3020008E3020008A5 +:10024000E3020008E3020008E3020008E3020008FA +:10025000E3020008E3020008E3020008E3020008EA +:10026000E3020008E3020008E3020008E3020008DA +:10027000E3020008E3020008E3020008E3020008CA +:10028000E3020008E3020008E3020008E3020008BA +:10029000E3020008E3020008E3020008E3020008AA +:1002A000E3020008E3020008E3020008E30200089A +:1002B000E3020008E3020008E3020008E30200088A +:1002C000E3020008E3020008E3020008E30200087A +:1002D000E3020008E3020008E3020008E30200086A +:1002E00002E000F000F8FEE772B6374880F30888B5 +:1002F000364880F3098836483649086040F20000E5 +:10030000CCF200004EF63471CEF200010860BFF36B +:100310004F8FBFF36F8F40F20000C0F2F0004EF637 +:100320008851CEF200010860BFF34F8FBFF36F8F8B +:100330004FF00000E1EE100A4EF63C71CEF20001E3 +:100340000860062080F31488BFF36F8F07F038FD34 +:1003500006F09EFE4FF055301F491B4A91423CBFAC +:1003600041F8040BFAE71D49184A91423CBF41F895 +:10037000040BFAE71A491B4A1B4B9A423EBF51F83D +:10038000040B42F8040BF8E700201849184A914280 +:100390003CBF41F8040BFAE707F050FD06F0FCFE05 +:1003A000144C154DAC4203DA54F8041B8847F9E7A6 +:1003B00000F0BCFC114C124DAC4203DA54F8041BA3 +:1003C0008847F9E707F038BD00060020002200202A +:1003D0000000000808ED00E00000002000060020FA +:1003E00030A2000800220020D8220020D8220020BD +:1003F00098670020E0020008E0020008E002000820 +:10040000E00200082DE9F04F2DED108AC1F80CD064 +:10041000D0F80CD0BDEC108ABDE8F08F002383F338 +:1004200011882846A047002006F014FCFEE706F0DD +:100430006DFB00DFFEE7000053B94AB9002908BF91 +:1004400000281CBF4FF0FF314FF0FF3000F074B9AF +:10045000ADF1080C6DE904CE00F006F8DDF804E01B +:10046000DDE9022304B070472DE9F047089D0446FA +:100470008E46002B4DD18A42944669D9B2FA82F257 +:1004800052B101FA02F3C2F1200120FA01F10CFA93 +:1004900002FC41EA030E94404FEA1C48210CBEFBCB +:1004A000F8F61FFA8CF708FB16E341EA034306FB54 +:1004B00007F199420AD91CEB030306F1FF3080F0E3 +:1004C0001F81994240F21C81023E63445B1AA4B230 +:1004D000B3FBF8F008FB103344EA034400FB07F7D2 +:1004E000A7420AD91CEB040400F1FF3380F00A8113 +:1004F000A74240F207816444023840EA0640E41B08 +:1005000000261DB1D4400023C5E900433146BDE8B3 +:10051000F0878B4209D9002D00F0EF800026C5E955 +:10052000000130463146BDE8F087B3FA83F6002E6D +:100530004AD18B4202D3824200F2F980841A61EBE5 +:10054000030301209E46002DE0D0C5E9004EDDE703 +:1005500002B9FFDEB2FA82F2002A40F09280A1EBEB +:100560000C014FEA1C471FFA8CFE0126200CB1FB40 +:10057000F7F307FB131140EA01410EFB03F0884239 +:1005800008D91CEB010103F1FF3802D2884200F2C6 +:10059000CB804346091AA4B2B1FBF7F007FB101158 +:1005A00044EA01440EFB00FEA64508D91CEB0404F6 +:1005B00000F1FF3102D2A64500F2BB800846A4EB51 +:1005C0000E0440EA03409CE7C6F12007B34022FA3C +:1005D00007FC4CEA030C20FA07F401FA06F31C436B +:1005E000F9404FEA1C4900FA06F3B1FBF9F8200C78 +:1005F0001FFA8CFE09FB181140EA014108FB0EF0BE +:10060000884202FA06F20BD91CEB010108F1FF3A0D +:1006100080F08880884240F28580A8F10208614419 +:10062000091AA4B2B1FBF9F009FB101144EA014127 +:1006300000FB0EFE8E4508D91CEB010100F1FF34D2 +:100640006CD28E456AD90238614440EA0840A0FB6A +:100650000294A1EB0E01A142C846A64656D353D040 +:100660005DB1B3EB080261EB0E0101FA07F722FA64 +:1006700006F3F1401F43C5E9007100263146BDE88D +:10068000F087C2F12003D8400CFA02FC21FA03F3F0 +:10069000914001434FEA1C471FFA8CFEB3FBF7F071 +:1006A00007FB10360B0C43EA064300FB0EF69E4296 +:1006B00004FA02F408D91CEB030300F1FF382FD22F +:1006C0009E422DD9023863449B1B89B2B3FBF7F6D7 +:1006D00007FB163341EA034106FB0EF38B4208D9B0 +:1006E0001CEB010106F1FF3816D28B4214D9023EF1 +:1006F0006144C91A46EA004638E72E46284605E70F +:100700000646E3E61846F8E64B45A9D2B9EB0208DF +:1007100064EB0C0E0138A3E74646EAE7204694E76F +:100720004046D1E7D0467BE7023B614432E73046A2 +:1007300009E76444023842E7704700BF08B5062065 +:1007400000F046F9012006F08BFC00BF032A70B5CB +:1007500015D940EA010C1CF0030F04460B4621D1C9 +:10076000194620460E680568B54204F1040403F1F9 +:10077000040317D1043A032A20461946F0D8541E20 +:10078000A2B100F1FF3C013901E0C3180CD01CF804 +:1007900001EF11F8012F9645A4EB0C03F5D0AEEB59 +:1007A000020070BD541EECE7184670BD104670BDC7 +:1007B00088420DD98B1883420AD900EB020CBAB1DA +:1007C000624613F801CD02F801CD9942F9D1704784 +:1007D0000F2A0ED8034602F1FF3C4AB10CF1010C7E +:1007E000013B8C4411F8012B03F8012F6145F9D12D +:1007F000704740EA01039B0750D1A2F1100370B586 +:1008000001F1200C23F00F0501F1100E00F110048E +:10081000AC441B095EF8105C44F8105C5EF80C5C9C +:1008200044F80C5C5EF8085C44F8085C5EF8045C14 +:1008300044F8045C0EF1100EE64504F11004E9D111 +:10084000013312F00C0F01EB031102F00F0400EB67 +:10085000031327D0043C24F003064FEA940C1E44F3 +:100860001C1F8E465EF8045B44F8045FB442F9D165 +:100870000CF1010402F0030203EB840301EB840199 +:1008800002F1FF3C4AB10CF1010C013B8C4411F820 +:10089000012B03F8012F6145F9D170BD02F1FF3C36 +:1008A00003469BE72246EBE738B5446C0CB10020C9 +:1008B00038BD8021054607F001F80246686430B172 +:1008C000031F7C3243F8044F9342FBD1EFE74FF014 +:1008D000FF3038BD1F29F8B5054608D8466C0C46D0 +:1008E00017464EB156F8240046F82470F8BD16237A +:1008F00003604FF0FF30F8BD802106F0DFFF0646B1 +:10090000686440B1031F00F17C05002143F8041F17 +:100910009D42FBD1E6E74FF0FF30F8BD1F2938B507 +:10092000054620D8426C0C466AB152F8213053B1CA +:10093000012B16D0591C10D00025204642F8245017 +:100940009847284638BD284600F0F8F82246014668 +:100950002846BDE8384000F0DBB8162303600120CC +:1009600038BD002038BD162303604FF0FF3038BD7E +:100970001F292AD8426C38B50C46054682B152F878 +:10098000243002EB84024BB1591C19D0012B15D035 +:100990000025204615609847284638BD012038BDFF +:1009A000802106F08BFF0246686458B1031F0021C6 +:1009B0007C3043F8041F9842FBD1E0E7032038BDA8 +:1009C000022038BD4FF0FF3038BD4FF0FF30704788 +:1009D00038B5144B1F281D681FD86A6C044662B1D5 +:1009E00052F820304BB1012B15D0591C0FD00025E7 +:1009F00042F820509847284638BD284600F09EF817 +:100A0000224601462846BDE8384000F081B816234A +:100A10002B60012038BD002038BD16232B604FF01D +:100A2000FF3038BD00220020124B1F2870B51E6811 +:100A300008D80D46716C044649B151F8240041F8BC +:100A4000245070BD162333604FF0FF3070BD8021FD +:100A5000304606F033FF0146706440B1031F00F1D9 +:100A60007C0C002243F8042F6345FBD1E5E74FF0EF +:100A7000FF3070BD0022002038B50B4B1D686C6C38 +:100A80000CB1002038BD8021284606F017FF6864AD +:100A900038B1031F00F17C0243F8044F9342FBD1AD +:100AA000EFE74FF0FF3038BD0022002038B5174B7C +:100AB0001F281D6826D86A6C044682B152F824307B +:100AC00002EB84024BB1591C1AD0012B16D0002521 +:100AD000204615609847284638BD012038BD802142 +:100AE000284606F0EBFE0246686458B1031F002159 +:100AF0007C3043F8041F8342FBD1DFE7032038BD7D +:100B0000022038BD4FF0FF3038BD00BF002200206A +:100B100070B50C46084D03460026204611461C467B +:100B20002E6006F0A1FA431C00D070BD2B68002B8C +:100B3000FBD0236070BD00BFD822002006F08EBA23 +:100B400011F0FF01034644D0820732D110B504688A +:100B500041EA012E4EEA0E4E8EEA0402A2F1013362 +:100B600023EA0203A4F1013222EA0402134313F040 +:100B7000803F0FD150F8044F84EA0E0CA4F10133EA +:100B8000ACF1013223EA040322EA0C02134313F00E +:100B9000803FEFD0037823B936E010F8013F002BF7 +:100BA00032D09942F9D110BD8A4211D09A07184625 +:100BB000CCD0184613F8012B002AF5D11046704707 +:100BC0009907184607D0184601330278002AF7D152 +:100BD00070478207F7D10268A2F1013323EA0203CA +:100BE00013F0803F08D150F8042FA2F1013323EA1B +:100BF000020313F0803FF6D00378002BE8D010F802 +:100C0000013F002BFBD17047184610BD80EA01025E +:100C1000844612F0030F4FD111F0030F32D14DF87B +:100C2000044D11F0040F51F8043B0BD0A3F1013235 +:100C30009A4312F0803F04BF4CF8043B51F8043B48 +:100C400016D100BF51F8044BA3F101329A4312F0C0 +:100C5000803FA4F101320BD14CF8043BA24312F0C7 +:100C6000803F04BF51F8043B4CF8044BEAD02346C4 +:100C70000CF8013B13F0FF0F4FEA3323F8D15DF876 +:100C8000044B704711F0010F06D011F8012B0CF83E +:100C9000012B002A08BF704711F0020FBFD031F8B6 +:100CA000022B12F0FF0F16BF2CF8022B8CF800203D +:100CB00012F47F4FB3D1704711F8012B0CF8012BC0 +:100CC000002AF9D1704700BF30B540EA0104A307FC +:100CD00001D1032A0FD8844601F1FF3E07E01EF838 +:100CE000011F03F8011B541EC1B19C4622466346F6 +:100CF000002AF4D130BD0B468446194653F8045BF4 +:100D0000A5F1013424EA050414F0803FE4D1043A4B +:100D1000032A4CF8045B1946EFD8DDE76244002C47 +:100D2000E8D003F8011B9342FBD130BD38B501F088 +:100D3000FFF901F0C1FB06F0C7FE054606F0D4FF3F +:100D40000446D0B90F4B9D4219D001339D4241F268 +:100D5000883504BF01240025002006F0BFFE0CB139 +:100D600000F078F801F048FB00F026FD08B100F033 +:100D700071F8284600F01CF9F9E70025ECE7054674 +:100D8000EAE700BF010007B008B501F09DF9A0F146 +:100D900020035842584108BD07B541F21203022111 +:100DA00001A8ADF8043001F0ADF903B05DF804FB23 +:100DB00038B5302383F31188174803680BB106F068 +:100DC0002DF80023154A4FF47A71134806F01CF8E9 +:100DD000002383F31188124C236813B12368013B6D +:100DE0002360636813B16368013B63600D4D2B782A +:100DF00033B963687BB9022001F060FA3223636083 +:100E00002B78032B07D163682BB9022001F056FA27 +:100E10004FF47A73636038BDDC220020B10D000806 +:100E2000FC230020F4220020084B187003280CD863 +:100E3000DFE800F008050208022001F031BA0220C4 +:100E400001F01EBA024B00225A607047F4220020C3 +:100E5000FC230020F8B5504B504A1C46196801315C +:100E600000F0998004339342F8D162684C4B9A4267 +:100E700040F291804B4B9B6803F1006303F5003314 +:100E80009A4280F08880002001F06CF90220FFF780 +:100E9000CBFF454B0021D3F8E820C3F8E810D3F886 +:100EA0001021C3F81011D3F81021D3F8EC20C3F8A7 +:100EB000EC10D3F81421C3F81411D3F81421D3F88B +:100EC000F020C3F8F010D3F81821C3F81811D3F8A4 +:100ED0001821D3F8802042F00062C3F88020D3F8B4 +:100EE000802022F00062C3F88020D3F88020D3F85D +:100EF000802042F00072C3F88020D3F8802022F0D6 +:100F00000072C3F88020D3F8803072B64FF0E0232F +:100F1000C3F8084DD4E90004BFF34F8FBFF36F8FC0 +:100F2000224AC2F88410BFF34F8F536923F48033F1 +:100F30005361BFF34F8FD2F8803043F6E076C3F3AE +:100F4000C905C3F34E335B0103EA060C29464CEA9C +:100F500081770139C2F87472F9D2203B13F1200F66 +:100F6000F2D1BFF34F8FBFF36F8FBFF34F8FBFF33C +:100F70006F8F536923F4003353610023C2F850325A +:100F8000BFF34F8FBFF36F8F302383F311888546F4 +:100F900080F308882047F8BD0000020820000208FE +:100FA000FFFF0108642200200044025800ED00E029 +:100FB0002DE9F04F93B0B44B2022FF2100900AA8F6 +:100FC0009D6801F0C3F9B14A1378A3B90121B04873 +:100FD00011700360302383F3118803680BB105F0AF +:100FE0001DFF0023AB4A4FF47A71A94805F00CFFAE +:100FF000002383F31188009B13B1A74B009A1A605A +:10100000A64A1378032B03D000231370A24A53601F +:101010004FF0000A009CD3465646D146012001F00D +:101020003FF924B19C4B1B68002B00F02682002066 +:1010300001F04AF80390039B002BF2DB012001F042 +:101040001FF9039B213B1F2BE8D801A252F823F084 +:10105000D1100008F91000088D1100081D100008BB +:101060001D1000081D1000081F120008EF130008D3 +:10107000091300086B13000893130008B913000844 +:101080001D100008CB1300081D1000083D140008B7 +:10109000711100081D10000881140008DD100008FF +:1010A000711100081D1000086B1300081D100008C6 +:1010B0001D1000081D1000081D1000081D1000085C +:1010C0001D1000081D1000081D1000088D110008DB +:1010D0000220FFF759FE002840F0F981009B022111 +:1010E00005A8BAF1000F08BF1C4641F21233ADF853 +:1010F000143001F007F891E74FF47A7000F0E4FF44 +:10110000071EEBDB0220FFF73FFE0028E6D0013F81 +:10111000052F00F2DE81DFE807F0030A0D10133619 +:101120000523042105A8059300F0ECFF17E0042136 +:101130005548F9E704215A48F6E704215948F3E7EE +:101140004FF01C08404608F1040801F00DF8042196 +:10115000059005A800F0D6FFB8F12C0FF2D10120C0 +:101160004FF0000900FA07F747EA0B0B5FFA8BFB19 +:1011700001F038F926B10BF00B030B2B08BF00244C +:10118000FFF70AFE4AE704214748CDE7002EA5D025 +:101190000BF00B030B2BA1D10220FFF7F5FD074647 +:1011A00000289BD00120002600F0DCFF0220FFF782 +:1011B0003BFE1FFA86F8404600F0E4FF0446B0B15B +:1011C000039940460136A1F140025142514100F0DD +:1011D000E9FF0028EDD1BA46044641F2121302217C +:1011E00005A83E46ADF8143000F08CFF16E7254602 +:1011F0000120FFF719FE244B9B68AB4207D9284614 +:1012000000F0B2FF013040F067810435F3E70025BC +:10121000224BBA463E461D701F4B5D60A8E7002E6C +:101220003FF45CAF0BF00B030B2B7FF457AF0220A6 +:10123000FFF7FAFD322000F047FFB0F10008FFF69B +:101240004DAF18F003077FF449AF0F4A08EB0503D1 +:10125000926893423FF642AFB8F5807F3FF73EAFCA +:10126000124BB845019323DD4FF47A7000F02CFF48 +:101270000390039A002AFFF631AF039A0137019BCE +:1012800003F8012BEDE700BF64220020F8230020C3 +:10129000DC220020B10D0008FC230020F4220020F5 +:1012A000682200206C22002070220020F8220020FA +:1012B000C820FFF769FD074600283FF40FAF1F2D38 +:1012C00011D8C5F120020AAB25F00300844942453C +:1012D000184428BF4246019201F012F8019AFF21FA +:1012E0007F4801F033F84FEAA803C8F387027C492E +:1012F0002846019301F032F8064600283FF46DAF0E +:10130000019B05EB830533E70220FFF73DFD002835 +:101310003FF4E4AE00F064FF00283FF4DFAE0027A6 +:10132000B846704B9B68BB4218D91F2F11D80A9B37 +:1013300001330ED027F0030348336B4453F8203CAD +:1013400005934046042205A9043701F00BF98046B5 +:10135000E7E7384600F008FF0590F2E7CDF8148083 +:10136000042105A800F0CEFE02E70023642104A8B2 +:10137000049300F0BDFE00287FF4B0AE0220FFF71A +:1013800003FD00283FF4AAAE049800F01FFF05906B +:10139000E6E70023642104A8049300F0A9FE0028D6 +:1013A0007FF49CAE0220FFF7EFFC00283FF496AEDE +:1013B000049800F00DFFEAE70220FFF7E5FC0028A3 +:1013C0003FF48CAE00F01CFFE1E70220FFF7DCFCED +:1013D00000283FF483AE05A9142000F017FF07464C +:1013E0000421049004A800F08DFE3946B9E73220AC +:1013F00000F06AFE071EFFF671AEBB077FF46EAE0B +:10140000384A07EB0903926893423FF667AE022021 +:10141000FFF7BAFC00283FF461AE27F003074F4402 +:10142000B9453FF4A5AE484609F1040900F09CFE19 +:101430000421059005A800F065FEF1E74FF47A70ED +:10144000FFF7A2FC00283FF449AE00F0C9FE0028D7 +:1014500044D00A9B01330BD008220AA9002000F0D7 +:101460007DFF00283AD02022FF210AA800F06EFF5D +:10147000FFF792FC1C4805F0F3FB13B0BDE8F08FBA +:10148000002E3FF42BAE0BF00B030B2B7FF426AE9C +:101490000023642105A8059300F02AFE07460028D2 +:1014A0007FF41CAE0220FFF76FFC804600283FF45B +:1014B00015AEFFF771FC41F2883005F0D1FB0598BD +:1014C00000F0D8FF46463C4600F08CFFA6E50646F5 +:1014D0004EE64FF0000901E6BA467EE637467CE666 +:1014E000F822002064220020A0860100704700003E +:1014F00070470000704700002DE9F04100F580378B +:10150000044616463B7C5BB9C0681030204400F0AE +:10151000F7FEE5683544B5F5004FE56002D816B131 +:10152000BDE8F081DEB905F07F0605F1100000216D +:10153000C6F180062044F6B232462E4400F006FF83 +:10154000A06804F11008324600F10060414600F541 +:10155000003006F061F830B901233B74E0E74FF446 +:1015600000463546ECE7A26805F1100140463244DA +:101570002144A260E268521BE26000F0C1FE02203A +:10158000BDE8F04100F09ABE183000F0E9BC000060 +:1015900010B5044608F010F9204610BD10B50446F9 +:1015A00008F00AF9204610BDC3B280B2A3F141028F +:1015B000052A02D8373800B27047613B052B94BF2B +:1015C00057383038F7E70000F8B5044615460846A6 +:1015D00003220C4900F09EFE014688B908346F1CB6 +:1015E00015F91100FFF7E0FF064617F91100013168 +:1015F000FFF7DAFF102940EA061004F8010BEFD1DB +:10160000F8BD00BFF09700082DE9F04FADF53F7D24 +:101610000746416801222AA802F09CFE002840F0FB +:1016200087800646824681461125DFF80C81DFF867 +:101630000CB101AB4FF4805241462AA802F0EAFFF8 +:10164000002875D1019AB2F5805F71D8002A65D063 +:101650000446019A9442ECD2282D0FD008DC132DB9 +:101660002DD01E2D39D0112D13D00134A4B2F0E7A6 +:10167000322D2DD0372D2FD02D2DF6D13B68121BBA +:1016800008EB040138461B692D259847BDF8044036 +:10169000EBE7121B022A09D9594608EB040000F0B7 +:1016A00039FE18B902342825A4B2DEE718F8043050 +:1016B0003A2B3DD00A2B1CBFA1461325D5E718F8BD +:1016C00004300A2B34D03A2B04BFA2463225CCE793 +:1016D00018F80430202BC8D0264618F804300A2BFE +:1016E0001AD1AAEB090208EB090102A811254F2A19 +:1016F00028BF4F22FFF7E8FAA21B08EB060116A845 +:101700004F2A28BF4F22FFF7DFFA3B6816AA02A92B +:10171000DB6838469847A8E71E25A6E73B683846A9 +:1017200004491B69984701200DF53F7DBDE8F08F06 +:101730000020F9E7F298000804240020F49700083C +:1017400000F1180110B5044686B00846019100F07A +:10175000F1FB2046FFF758FF60B1019902A800F0A5 +:1017600049FC102204F1080102A8FEF7EFFFB0FACD +:1017700080F0400906B010BD70B504460025EEB2F9 +:10178000304600F0FFFC58B100213046013500F032 +:1017900009FD08B9002070BD022000F08FFDEEE7C2 +:1017A0002046FFF731FF0028F4D004F58034207C78 +:1017B00080F00100EFE70000F0B5C9B006F09CF939 +:1017C00000F0FEFE18B90025284649B0F0BD694674 +:1017D0002A4802F0E1FF00284BD1294C204603F0B3 +:1017E0000BF8284803F008F8274803F005F82146CD +:1017F000224803F07DF80028E5D1702007F0DEFFD5 +:10180000064610B1214B44600360336830469B6844 +:101810009847054600282ED01A4F1948394603F03C +:1018200067F805460028CED1194807F0C7FF0446DF +:1018300038B1184B4760036000F58033C0E90255AA +:101840001D74236820469B689847054628B10E49B9 +:101850000C4803F04DF80028B5D1336830465B687A +:1018600098471CB1236820465B68984700F090FEBB +:10187000AAE70025FAE70446EFE700BFF89700085B +:10188000089800081F980008359800085898000824 +:1018900014000100749800082DE9F04FD44A8DB06F +:1018A0000B68D0F804A001931A440368D14E1A447F +:1018B000D1F81C90DFF8B4C3DFF8B4B3D0E9023438 +:1018C000634003EA0A03634013444A6802920AEB46 +:1018D0007363029CC84A2244C468224484688AEA2A +:1018E00004051D40654015448A68039203EB355595 +:1018F000039CC24A2244846822448AEA03042C409E +:1019000084EA0A041444CA6805EBF43404921644C9 +:1019100083EA0502224056445A4032440E69059635 +:1019200004EBB222059FB64E3E441E4485EA0403F2 +:1019300013406B4033444E69069602EB7363069F77 +:10194000B04E3E442E4484EA02051D4065403544B5 +:101950008E69079603EB3555079FAB4E3E442644F0 +:1019600082EA03042C4054403444A84E4E4405EB14 +:10197000F434164483EA050222405A4032440E6A87 +:10198000089604EBB222089FA14E3E441E4485EA0D +:10199000040313406B4033444E6A099602EB7363B1 +:1019A000099F9C4ED1F830E03E44D1F83880F34492 +:1019B0002E4484EA02051D40654035448E6AA6F532 +:1019C000244703EB35550A964F3F274482EA030428 +:1019D0002C4054403C44CF6A0B9705EBF4340B9EEB +:1019E0008D4F3744029E174483EA050222405A4035 +:1019F0003A448A4F774404EBB2221F4485EA040339 +:101A000013406B403B444F6BBC4402EB7363654433 +:101A100084EA020C0CEA030C8CEA040C6544DFF83F +:101A200054C2C44403EB3555A44482EA03042C4059 +:101A300054406444D1F83CC0794905EBF434614426 +:101A4000114483EA050222405A400A44754904EBD6 +:101A5000B2223144079E194484EA02032B406340BA +:101A60000B44714902EBF36331440B9E0D4482EA4F +:101A700003012140514029446C4D03EBF1513544A1 +:101A8000019E254483EA010414405C402C44684DC7 +:101A900001EBB4443544069E154481EA04021A4021 +:101AA0004A402A44634D04EB323235440A9E1D44B9 +:101AB00084EA02030B4063402B445F4D02EBF36367 +:101AC0003544059E0D4482EA0301214051402944DA +:101AD0005A4D03EBF1516544254483EA0104144057 +:101AE0005C402C44564D01EBB4443544099E1544EA +:101AF00081EA04021A404A402A44524D04EB323231 +:101B00003544049E1D4484EA02030B4063402B4489 +:101B10004D4D02EBF36345440D4482EA030121403D +:101B200051402944494D03EBF1513544089E2C4462 +:101B300083EA010515405D402C44454D01EBB4445A +:101B40003544039E2A4481EA04051D404D402A4441 +:101B5000404D04EB32323D442B4484EA0205934469 +:101B60000D4065402B443C4D02EBF3633544069E2B +:101B7000294482EA0305254055402944374D03EBAB +:101B8000F1514D442C4483EA010515405D40254444 +:101B900001EBB54581EA050404EA03024A405A44D0 +:101BA000A6F5B82B089E05EB3232ABF2BE6B544063 +:101BB0005B4423442A4C344402EB33730B9E0C44A5 +:101BC00085EA020159402144264C344403EB71510B +:101BD000029E254482EA03044C402544224C44449E +:101BE00001EB3545144483EA01026A40224443E094 +:101BF00078A46AD7EECEBDC156B7C7E8DB70202403 +:101C0000AF0F7CF52AC68747134630A8019546FDDD +:101C1000D8988069AFF7448BBED75C892211906B4E +:101C20002108B44962251EF640B340C0515A5E26D1 +:101C3000AAC7B6E95D102FD65314440281E6A1D895 +:101C4000C8FBD3E7E6CDE121D60737C3870DD5F42E +:101C5000ED145A4505E9E3A9F8A3EFFCD9026F6733 +:101C600081F6718722619D6D0C38E5FD937198FDB9 +:101C70008A4C2A8D8E4379A6934C344405EB72220C +:101C8000059E1C4481EA0503534023448F4C344491 +:101C900002EB33730A9E0C4485EA02015940214449 +:101CA0008B4C4C4403EB7151254482EA03044C40B5 +:101CB0002C44884D354401EB3444019E154483EA9D +:101CC000010262402A44844D3D4404EB72221D44CB +:101CD00081EA040353402B44804D354402EB3373B7 +:101CE000049E294484EA02055D4029447C4D354424 +:101CF00003EB7151079E254482EA03044C402C44B7 +:101D0000784D354401EB3444099E2A4483EA0105A9 +:101D100065401544744A324404EB7525039E134410 +:101D200081EA04026A401A44704B734405EB327234 +:101D30000B4484EA0501514019446D4B634402EBA6 +:101D400071511C4485EA02034B401C44694B3344E7 +:101D500001EB3444019E1D4482EA010363402B449D +:101D6000654D04EB73233544069E154463EA010276 +:101D700062402A44614D03EBB2624D4462EA0409B9 +:101D800029445F4D89EA0309454449442C445D4D8B +:101D900002EBB1513544049E61EA03081D4488EA10 +:101DA0000208444401EB744464EA02034B402B44B0 +:101DB000554D04EBF323754463EA010E15448EEA96 +:101DC000040E0EEB0502514D03EBB262354462EA9C +:101DD000040E29440A9D8EEA030EA5F580164C4D8B +:101DE0007144A6F6833602EBB151264461EA03043E +:101DF00054403444029E01EB7444354464EA0206C4 +:101E00001D444E407319089E424D04EBF3233544A4 +:101E100063EA01061544664072193F4D03EBB26256 +:101E2000654462EA040629443C4D5E403144079E05 +:101E300002EBB151354461EA03062C44384D56405B +:101E40003D443444059E1D4401EB744464EA02039E +:101E50004B402B44334D04EBF32335440B9E154488 +:101E600063EA010262402A442F4D03EBB26235441B +:101E7000039E0D4462EA0401594029442B4D02EBB4 +:101E8000B15135442A4E254461EA030454402C44A0 +:101E9000099D01EB74442E4464EA02051E4485EA60 +:101EA00001039D1903681A440AEB040303EBF523AD +:101EB0000260436083681C44C36819448460C16045 +:101EC0000DB0BDE8F08F00BF44EABEA4A9CFDE4B41 +:101ED000604BBBF670BCBFBEC67E9B28FA27A1EA4A +:101EE0008530EFD4051D880439D0D4D9E599DBE6D7 +:101EF000F87CA21F6556ACC4442229F497FF2A43FC +:101F0000A72394AB39A093FCC3595B6592CC0C8F8B +:101F1000D15D84854F7EA86FE0E62CFE144301A3BB +:101F2000A111084E827E53F735F23ABDBBD2D72AB3 +:101F300091D386EB094B036003F18833436003F1CF +:101F40002943A3F59613A3F68B638360A3F188332B +:101F5000C3600023C0E90433704700BF0123456715 +:101F60002DE9F8431446026905460E46E300C2F324 +:101F7000C50800F118079B18036122BF43690133AC +:101F8000436112F4FC7F436903EB5473436114D043 +:101F9000C8F1400907EB08004C4504D22246BDE8D1 +:101FA000F843FEF705BC403C4A464E44FEF700FCB1 +:101FB000444439462846FFF76FFCA04606EB040967 +:101FC000B8F13F0FA9EB08010AD940223846FEF7C5 +:101FD000EFFB39462846A8F14008FFF75DFCEFE724 +:101FE000A1096FF03F02384602FB014206EB811166 +:101FF000D5E7000070B50B6901F1180506460C46DF +:10200000C3F3C503EA18501C8022EA54C3F13F020F +:10201000072A1FD8002100F099F929462046FFF72A +:102020003BFC38220021284600F090F9236929461C +:102030002046236563696365FFF72EFC2146102265 +:102040003046FEF7B5FB204658220021BDE870401F +:1020500000F07CB9C3F137020021E5E72DE9F84F24 +:102060004FF47A7306460D46002402FB03F7DFF8AF +:102070005080DFF8509098F900305FFA84FA5A1CCB +:1020800001D0A34210D159F824002A4631460368F2 +:10209000D3F820B03B46D847854205D1074B0120F5 +:1020A00083F800A0BDE8F88F0134042CE3D14FF48D +:1020B000FA7004F0D5FD0020F4E700BF483400209A +:1020C0007422002078220020002307B50246012157 +:1020D0000DF107008DF80730FFF7C0FF20B19DF824 +:1020E000070003B05DF804FB4FF0FF30F9E7000094 +:1020F0000A46042108B5FFF7B1FF80F00100C0B225 +:10210000404208BD074B0A4630B41978064B53F8D5 +:102110002140014623682046DD69044BAC4630BCB3 +:10212000604700BF4834002078220020A0860100CC +:1021300070B50A4E00240A4D05F012FA3080286866 +:102140003388834208D905F007FA2B680444013329 +:10215000B4F5003F2B60F2D370BD00BF4A340020BD +:102160000434002005F0CABA00F1006000F5003028 +:102170000068704700F10060920000F5003005F043 +:102180004BBA0000054B1A68054B1B889B1A83420B +:1021900002D9104405F0E0B9002070470434002053 +:1021A0004A34002038B50446074D29B12868204438 +:1021B000BDE8384005F0E8B92868204405F0D2F9B8 +:1021C0000028F3D038BD00BF043400200020704741 +:1021D00000F1FF5000F58F10D0F8000870470000A4 +:1021E000064991F8243033B100230822086A81F8A7 +:1021F0002430FFF7BFBF0120704700BF0834002024 +:10220000014B1868704700BF0010005C194B013883 +:102210000322084470B51D68174BC5F30B042D0C41 +:102220001E88A6420BD15C680A46013C82421346D6 +:102230000FD214F9016F4EB102F8016BF6E7013AC3 +:1022400003F10803ECD181420B4602D22C2203F8A1 +:10225000012B0424094A1688AE4204D1984284BF57 +:10226000967803F8016B013C02F10402F3D1581A8D +:1022700070BD00BF0010005C88220020B4980008E8 +:10228000022804D1054B4FF400129A6170470128CF +:10229000FCD1024B4FF40022F7E700BF00100258B8 +:1022A000022803D1044B20229A6170470128FCD1F7 +:1022B000014B0822F8E700BF00100258022805D1A0 +:1022C000064A536983F02003536170470128FCD10B +:1022D000024A536983F00803F6E700BF0010025872 +:1022E00070B504464FF47A764CB1412C254628BF90 +:1022F000412506FB05F0641B04F0B2FCF4E770BD59 +:10230000002310B5934203D0CC5CC4540133F9E7E9 +:1023100010BD0000013810B510F9013F3BB191F933 +:1023200000409C4203D11AB10131013AF4E71AB1DD +:1023300091F90020981A10BD1046FCE703460246AA +:10234000D01A12F9011B0029FAD170470244034642 +:10235000934202D003F8011BFAE770472DE9F843D6 +:102360001F4D14460746884695F8242052BBDFF8D7 +:1023700070909CB395F824302BB92022FF21484659 +:102380002F62FFF7E3FF95F824004146C0F10802F1 +:1023900005EB8000A24228BF2246D6B29200FFF78A +:1023A000AFFF95F82430A41B17441E449044E4B2B8 +:1023B000F6B2082E85F82460DBD1FFF711FF002864 +:1023C000D7D108E02B6A03EB82038342CFD0FFF71B +:1023D00007FF0028CBD10020BDE8F8830120FBE7F0 +:1023E00008340020024B1A78024B1A70704700BF65 +:1023F0004834002074220020F8B5194C194803F025 +:1024000037FF2146174803F05FFF24684FF47A70C6 +:10241000154ED4F89020154DD2F80438114F43F0E2 +:102420000203C2F80438FFF75BFF2046104904F0AE +:1024300059F8D4F890200424D2F8043823F0020389 +:10244000C2F804384FF4E133336055F8040BB84256 +:1024500002D0314603F06AFE013CF6D1F8BD00BF60 +:10246000B0A00008784900203034002078220020F5 +:10247000B8A000080C4B70B50C4D04461E780C4BF0 +:1024800055F826209A420DD00A4B002118221846F2 +:10249000FFF75CFF0460014655F82600BDE8704078 +:1024A00003F044BE70BD00BF4834002078220020F5 +:1024B0007849002030340020F0B5A1B071B6002377 +:1024C0000120002480261A46194602F081FD4FF4AF +:1024D000D067214A3D25136923BBD2F810310BBBCD +:1024E000036804F1006199600368C3F80CD00368C5 +:1024F0005E6003681F6001680B6843F001030B60B6 +:1025000001680B6823F01E030B6001680B68DB0792 +:10251000FCD4037B8034416805FA03F3B4F5001F53 +:102520000B60D8D102F094FDB4F5001F11D0002447 +:102530000A4E0B4D012005F0E1F83388A34205D97E +:1025400028682044013405F01FF8F6E7002005F064 +:10255000D5F861B621B0F0BD002000524A34002009 +:102560000434002030B50A44084D91420DD011F8D2 +:10257000013B5840082340F30004013B2C4013F07A +:10258000FF0384EA5000F6D1EFE730BD2083B8EDB9 +:1025900010B5084C01220849002001F0B7FE23784D +:1025A0003BB1064803F03AFD044803F06DFD0023FB +:1025B000237010BD4C340020C49800082C37002034 +:1025C0001D482DE9F041036D2BB901224FF48051D4 +:1025D000503005F0DBFA194E33780BB1FFF7D8FF16 +:1025E0000324174F4FF00008134D15492846C7F82C +:1025F000048003F03BFD284603F074FB48B1013C26 +:10260000284603F041FD14F0FF04EED1204634705B +:102610000FE00C4901220C4801F078FE014618B188 +:10262000284603F0FBFCEAE7084800F011F8012017 +:102630003070BDE8F08100BF2C3700204C34002002 +:10264000A0220020C498000850340020C898000838 +:102650000FB4002004B0704700687047034600685C +:10266000596870470B0A017043700B0C090E837098 +:10267000C1707047110A027003714170110C120E83 +:102680008170C2701A0A42711A0C1B0E8271C371DA +:1026900070470000C36A0239023B8B4283BF438903 +:1026A000006C01FB0300002070470000C2F3072309 +:1026B0008A76CB760378032B01BF120C0A75120AB7 +:1026C0004A75704700F10B010022D30143EA52031F +:1026D00010F8012B52FA83F38842DAB2F5D1104692 +:1026E0007047000010B541780446002001310246D1 +:1026F0004901022A16BFA35C032203EBC03302F197 +:1027000001021EBF9BB203EB500398B29142F0D876 +:1027100010BD000002684AB1134613F8011B1F29BF +:102720000DD93A29F9D1911C8B4202D04FF0FF30DC +:1027300070471278302AF9D1036000207047014BAE +:10274000187870479C36002038B50D46044618B9F5 +:10275000092000232B6038BD0368002BF8D01A78BD +:10276000002AF5D08188DA889142F1D1587804F0B6 +:1027700013FC10F00100EBD12368EBE738B50D46F0 +:1027800040F25231144602F0BDF9FF2807D9012C5E +:102790000BD9030A022468702B70204638BD30B173 +:1027A000002CFAD001242870F7E70024F5E704464E +:1027B000F3E700002DE9F8430026D0F80080054635 +:1027C0000C468E76836B002B4AD098F80030042B91 +:1027D0004BD133463546402720E0B7F5187F80F0CF +:1027E000C480F90606F1010608BF0237D05B023744 +:1027F0002BB900F5205292B2B2F5006F0DD305F15E +:102800001A01C5F1FF0240EA03402144FFF7B6FF79 +:10281000002800F0AA80054400200346D8F81020C4 +:1028200092F82310B142D8D8002B40F09E80002DA2 +:1028300000F09B8000232544AB766373D8F810200A +:10284000137903F03701DB0621730BD402F1380052 +:10285000FFF704FFC4E9000193896381D3892381D1 +:10286000BDE8F88300200146F4E7C36C01335ED174 +:10287000EA6B00232E26551E184615F8011F01305D +:1028800020290CD0052908BFE521092804D10B2BEC +:102890009EBFE71801337E73E718013379730B2865 +:1028A000EBD1E11800204873A17E00294BD1002B09 +:1028B00040D06FF00C0604F10D000825361B3318CC +:1028C00010F8011B002938D02E298BB24AD0A3F171 +:1028D0004101192903D8117B0D4200D02033037325 +:1028E000EDE7B9F1000F05D100F520539BB2B3F528 +:1028F000006F0BD307F11A01C7F1FF0240EA09404C +:102900002144FFF73BFF48B10744002002368146CF +:10291000D8F80C30985B0028E3D13846B9F1000FA5 +:102920004FF0000218BF002023189A76A0E7B146A6 +:102930003746EDE73F23A376012323440021997610 +:10294000137B03B96373D37A02F11C0003F03F03D6 +:1029500023730023FFF780FE20606360D38A6381C6 +:10296000138B7CE710250B46B9E73F230125A3769F +:1029700060E7000038B50546002435F8020B08B9B9 +:10298000204638BD02F0F2F86308C2B203EBC4334C +:1029900012FA83F39AB2C0F3072303EB520303EB5B +:1029A000C2339CB2E9E7000037B5C37804461BB9CF +:1029B0000025284603B030BD00F14C01826C012394 +:1029C0004078019104F00EFB054680B9A36BE070DE +:1029D000A06C226BC31A9342EAD2A3780199022B0E +:1029E000E6D102440123607804F0FCFAE1E7012516 +:1029F000DFE7000038B5836C05460C468B4210D0EB +:102A0000FFF7D2FF60B92246012305F14C01687837 +:102A100004F0C4FA00281CBF4FF0FF340120AC645E +:102A200038BD0020FCE7000038B500230446C37021 +:102A30004FF0FF338364FFF7DDFF00284BD1B4F87C +:102A40004A524AF655239D4207D10B22254904F1EB +:102A50004C00FDF77BFE00283FD094F84C30EB2B68 +:102A600003D01833DBB2012B2ED84AF655239D42F2 +:102A700006D108221C4904F19E00FDF767FE48B309 +:102A8000B4F85730B3F5007F1ED194F85930DBB15C +:102A90005A1E1A4218D1B4F85A30ABB194F85C30CF +:102AA000013B012B10D8B4F85D306BB1B4F85F3046 +:102AB0007F2B06D804F16C00FFF7CEFDB0F5803F08 +:102AC00002D3B4F8623053B94AF6552085420CBFA0 +:102AD0000220032038BD0420FCE70120FAE7002093 +:102AE000F8E700BFF49800080099000802392DE9C2 +:102AF000F04701F007044FF0010A466C05460AFA58 +:102B000004F41746984606EB1136C1F3C809E4B23F +:102B1000314628460136FFF76DFF18B10120BDE8A8 +:102B2000F087994605EB090292F84C30234214BF16 +:102B300001210021414513D06340013F82F84C3010 +:102B400085F803A0EBD0640014F0FF04EAD109F18A +:102B5000010301244FF00009B3F5007FE1D1D7E76D +:102B60000220DCE701290246F8B50C4640F28C80D1 +:102B70000668F36A8B4240F287803378013B032B6F +:102B800000F28280DFE803F00229384B04EB5405A1 +:102B9000B16B304601EB5521FFF72CFF10B14FF020 +:102BA000FF30F8BD6F1CC5F30805B16B30463544E6 +:102BB00001EB572195F84C50FFF71CFF0028EED190 +:102BC000C7F30807E3073E4496F84C0045EA0020A7 +:102BD0004CBF0009C0F30B00E3E7B16B304601EBDB +:102BE0001421FFF707FF0028D9D1640004F4FF7413 +:102BF0002644B6F84C00D4E7B16B304601EBD41153 +:102C0000FFF7F8FE0028CAD1A40006F14C0004F436 +:102C1000FE742044FFF720FD20F07040C1E7D0E9AA +:102C20000430D57953EA000101D0916801B95DBB48 +:102C30009168022DA4EB01010DD1013B728940F195 +:102C4000FF305B0A43EAC053B3FBF2F399421BD84F +:102C50001CD0601CA5E7032D02D193698B42F8D8E4 +:102C6000D3699BB9B16B304601EBD411FFF7C2FEBB +:102C7000002894D1A0004C3600F4FE703044FFF7D9 +:102C8000EBFC20F000408CE701208AE76FF0004069 +:102C900087E70000F8B5066804460D463378042B34 +:102CA0000CBF4FF080524FF400128A4201D802202C +:102CB000F8BDCA06FBD182680163D2B9022B13D8D2 +:102CC0003389B3EB551FF2D9F36BA363A36B626334 +:102CD000002BECD003EB55234C36C5F30805002040 +:102CE000A3633544E563E3E7F36BC271002BE7D0E0 +:102CF0001A4677897F02BD42114604D23046FFF75B +:102D0000C9FCA063E2E72046FFF72CFF431C024604 +:102D100006D00128CBD9F36A8342C8D9ED1BEAE774 +:102D20000120C5E701292DE9F04706460C46174664 +:102D300008D9C36A8B4205D90378022B62D003D825 +:102D4000012B22D0022552E0033B012BFAD8816BE4 +:102D500001EBD411FFF74EFE0546002847D1A40031 +:102D600006F14C0304F4FE741C443378042B07D0A2 +:102D7000204627F07047FFF76FFC00F070400743D4 +:102D800039462046FFF76EFC2FE001EB5108816BBE +:102D900001EB5821FFF72EFE054640BB14F001045D +:102DA00006F14C0908F1010AC8F3080808BFFBB294 +:102DB00030461FBF19F8083003F00F023B0103F043 +:102DC000F00318BF134309F808300123B16BF37007 +:102DD00001EB5A21FFF70EFE054640B9CAF3080A77 +:102DE00044B1C7F3071709F80A700123F3702846A6 +:102DF000BDE8F08719F80A30C7F3032723F00F0363 +:102E00001F43F0E7816B01EB1421FFF7F3FD05464B +:102E10000028ECD1640006F14C0304F4FF741F5544 +:102E20001919C7F307274F70DFE70000F8B504460C +:102E30000E461746E3690BB91846F8BD012BA6EB01 +:102E40000305206814BFAA1C3A46691CFFF76AFFF5 +:102E50000028F2D1E369013BE361EBE701292DE9A9 +:102E6000F84306460C461746056802D80220BDE81E +:102E7000F883EB6A8B42F9D97AB9A14621463046EC +:102E8000A046FFF76FFE0446B0B92B78042B02D1A1 +:102E9000002F43D1F7710020E9E72B78042B02D1F2 +:102EA000C379022BE9D04FF0FF3239462846FFF7AD +:102EB00039FF0028E1D0DAE70128D7D0421C01D140 +:102EC0000120D4E72B78042B19D1EA6AAB69023AC6 +:102ED00093421CD308F10102A2420CD02B78042BA0 +:102EE00008D10023A2EB090249462846FFF7FEFD60 +:102EF0000028BCD1A146EB6AA342BFD8C5E7002297 +:102F000041462846FFF70EFF0028DED0AFE7013329 +:102F1000AB612B7943F001032B71DBE7F3798BB9BC +:102F2000B468BC4202D10223F371B4E721463046B3 +:102F3000FFF718FE012899D9431CC1D001348442FF +:102F4000EFD0A8E7032BA6D1B368BB42A3D8B269E0 +:102F50001344BB429FD3E6E770B5C3790446032B05 +:102F600006D181688369CD18A94203D10023E3719A +:102F7000002070BD4E1C20683246FFF7D3FE0028AB +:102F8000F7D13146F0E700002DE9F74305460191FE +:102F9000FFF70AFD0446002849D105F14C090199C3 +:102FA00028464FF40072FFF775FB2146A8640746D8 +:102FB0004846FFF7CBF96C896402B4F5004F28BF8F +:102FC0004FF40044B4F5007F2FD9204604F07AFC7A +:102FD000804630B122460021640A0026FFF7B6F988 +:102FE00009E06408EEE72346BA194146687803F021 +:102FF000F9FF18B926446B899E42F4D3404604F089 +:1030000071FC6889801B18BF012003B0BDE8F08304 +:1030100001366B899E42F4D20123BA194946687879 +:1030200003F0E0FF0028F3D0EBE70026F1E70120F2 +:10303000EBE70000F8B50446FFF7B6FC05460028AC +:1030400042D12378032B37D12779012F34D104F1D2 +:103050004C0601464FF400723046FFF777F95523CE +:103060004122722184F84A32AA2304F50D7084F8B3 +:103070004F2084F84B32522384F8301284F84C30BD +:1030800084F84D30612384F8311284F84E3084F88E +:103090003332A16984F83222FFF7E4FA616904F55A +:1030A0000E70FFF7DFFA626B3B4631460132607803 +:1030B000A26403F097FF257100226078114603F0A7 +:1030C000B5FF003818BF0120F8BD000000232DE92E +:1030D000F0430B6085B00F461546FFF71BFB061E3D +:1030E000C0F2B281804B53F82640002C00F0AE8134 +:1030F0003C6005F0FE0523786BB1607803F04CFF6F +:10310000C70708D41DB110F0040500D00A252846D1 +:1031100005B0BDE8F0830023F0B22370607003F0C7 +:1031200027FFC10700F194810DB14207EED40021C1 +:103130002046FFF779FC022840F099806E4604F2A1 +:10314000122304F25221324618461033FFF784FA54 +:1031500042F8040B8B42F7D1002556F8041B0029D6 +:103160007DD02046FFF760FC012879D80128A26CA9 +:1031700040F0C08004F1570304F18C0113F8015BA7 +:10318000002D7BD18B42F9D1B4F8B430B3F5807FF8 +:1031900074D194F8B830092B70D104F19400FFF782 +:1031A0005DFA4FF0FF33171841F10001BB4275EB98 +:1031B000010363D304F1A000FFF74EFA94F8BA308C +:1031C0002063012BA37059D194F8B99003FA09F93F +:1031D0001FFA89F36381002B50D0444B04F1A800FF +:1031E000FFF73AFA0646984248D8831C626304F116 +:1031F000A400E362FFF730FA00EB020804F19C0040 +:10320000C4F84080FFF728FA10441FFA89F2A0633F +:1032100006FB02F313EB080345EB05029F4271EB3B +:1032200002032BD32E4604F1AC00FFF715FAE0633E +:1032300065B96389B34221D9E16B2046FFF72AFAC9 +:1032400081192046FFF7D6FB98B90136631993F828 +:103250004C30812B14D02035C5F30805E8E7032056 +:103260000135042D7FF479AF042807D101E004284B +:1032700001D101254BE701287FF678AF0D2546E700 +:1032800005F1140004F14C063044FFF7E5F901287C +:103290000546F3D9E36A8342F0D96189821E236C23 +:1032A00002FB01336364A16B204601EBD511FFF7EC +:1032B000A1FB0028DDD105F07F0006EB8000FFF7C1 +:1032C000CBF9431C03D00135A842ECD0D6E7042546 +:1032D000C4E90500064A257000251388E56101331D +:1032E0009BB21380E38012E7A0360020FDFFFF7F32 +:1032F000A4360020B4F85730B3F5007FBED1B4F83F +:10330000626026B904F17000FFF7A6F9064694F84A +:103310005C302663591EA3700129AFD894F8595028 +:103320006581002DAAD0691E2942A7D1B4F85D801D +:1033300018F00F0FA4F80880A0D1B4F85F0018B9F6 +:1033400004F16C00FFF788F9B4F85A10002995D001 +:1033500006FB03FE01EB181CF44460458ED3A0EB82 +:103360000C00A842B0FBF5F388D33E48834285D8D1 +:103370004FF6F57083426DD903259F1C114402EB73 +:103380000C03032DE7626263A16323644CD1B4F89C +:10339000763053EA08037FF471AFBB0004F1780084 +:1033A000FFF75AF9E06303F2FF13B6EB532FFFF474 +:1033B00065AF4FF0FF33032DC4E905334FF08003B1 +:1033C000237187D1B4F87C30012B83D1511C204666 +:1033D000FFF710FB00287FF47DAFB4F84A224AF6CD +:1033E000552320719A427FF475AF1F4B04F14C00B6 +:1033F000FFF732F998427FF46DAF03F1FF5304F504 +:103400000C70FFF729F903F50053203398427FF43D +:1034100061AF04F50D70FFF71FF9A06104F50E70A0 +:10342000FFF71AF9606155E7B8F1000F3FF426AFD6 +:103430007144022D4FEA4703E1631EBFD91907F01B +:10344000010303EB5103AEE70B2560E60C255EE6B6 +:1034500003255CE640F6F575AB428CBF02250125DD +:103460008BE700BFF5FFFF0F525261412DE9F84F86 +:1034700007460568884649B96E69C6B1EB6AB3422A +:1034800098BF0126AB69A3B9002405E0FFF76AFBEA +:103490000128044603D801242046BDE8F88F421CC9 +:1034A00000F0D280EB6A8342F6D84646EAE701266E +:1034B000E8E72A78EB6A042A40F08380A6F1020A42 +:1034C000023B4FF0010B9A4528BF4FF0000AD1464E +:1034D000696C284601EB1931FFF78CFA00283BD1C3 +:1034E00009F00703EA6AC9F3C8010BFA03F3901E57 +:1034F000DBB26A184C4609F1010992F84C2081456B +:1035000002EA030233BF5B0000234FF40071DBB219 +:1035100028BF9946B2B90234631E0333BCD80123D5 +:10352000214628461A46FFF7E1FA0228B3D00128BF +:1035300000F08A80B8F1000F13D10223FB7100283C +:10354000A9D130E0CA450AD0002BD2D10131B1F562 +:10355000007FBDD20123CCE74FF0FF34DCE700242D +:10356000DAE7FB79022B07D1731CA342E7D0BB68D3 +:10357000F31ABB610323FB7108F10102FB69A2424C +:1035800005D113B10133FB61D9E70223FBE70BB986 +:103590000123FB61224641463846FFF747FC0028DD +:1035A0004FD10123FB61EA6AAB69023A6C61934235 +:1035B0009CBF03F1FF33AB612B7943F001032B7107 +:1035C0006AE7464514D1741C38469C4228BF022441 +:1035D0002146FFF7C7FA01283FF45DAF431C33D003 +:1035E000E0B16B69012B03D9EA6A934238BF1E46EA +:1035F00034460134EB6AA34203D8012E7FF644AF70 +:10360000022421463846FFF7ADFA48B101283FF4BD +:1036100042AF013018D0B442EBD135E7002CE7D0EF +:103620004FF0FF3221462846FFF77CFB48B9B8F13E +:10363000000FB8D0224641462846FFF773FB00280A +:10364000B1D001287FF427AF4FF0FF3424E700000A +:103650002DE9F84306680446076B8946337820371E +:10366000042B0CBF4FF080534FF40013BB429CBFA0 +:1036700000238363836B73B1C7F30808B8F1000FAD +:103680003CD10133416B836339B93389B3EB571FA5 +:1036900034D80023A36304200AE07389013B13EAB2 +:1036A00057232BD1FFF75EFA0128054602D80220E6 +:1036B000BDE8F883421C01D10120F9E7F36A834297 +:1036C00016D8B9F1000FE4D0616B2046FFF7CEFEAB +:1036D0000546C8B10128EAD0431CEDD0014630466A +:1036E000FFF752FC0028E7D1E37943F00403E371CC +:1036F000294630466563FEF7CDFFA0634C360020B7 +:1037000027634644E663D3E70720D1E7F8B50E46C2 +:10371000002104460768FFF7BDFA98B90546A16B7A +:103720003846FFF767F968B93A78E36B042A1B78E3 +:103730000CD11B060ED5054601212046FFF788FF58 +:103740000028ECD0042808BF072006E0E52B01D0B4 +:10375000002BF0D10135B542EED1F8BDC16C4B1C48 +:103760002DE9F04104460568066B1FD1E5274FF0AF +:103770000108A16B2846FFF73DF998B92A78E36B59 +:10378000042A09BF1A781F7002F07F021A7085F8A8 +:103790000380236BB3420DD200212046FFF758FF70 +:1037A0000028E6D0042808BF022003E0FFF772FAE1 +:1037B0000028DBD0BDE8F0812DE9F0410546006826 +:1037C000A96B0669FFF716F9044620B9EB6B1A7866 +:1037D000852A03D002242046BDE8F081324603F159 +:1037E000200153F8040B8B4242F8040BF9D177788F +:1037F00001377F01A7F16003B3F5007FEAD800210C +:103800002846FFF725FF04280446E3D00028E2D12C +:10381000A96B2868FFF7EEF804460028DBD1EB6BB4 +:103820001A78C02AD6D106F1200203F1200153F8FC +:10383000040B8B4242F8040BF9D196F823300F2287 +:103840002C33B3FBF2F3B7EB431FC3D34FF0400865 +:1038500000212846FFF7FCFE04280446BAD00028C1 +:10386000B9D1A96B2868FFF7C5F804460028B2D182 +:10387000EB6B1A78C12AADD1B8F5187F09D206EBE7 +:10388000080203F1200153F8040B8B4242F8040BA9 +:10389000F9D108F120084745DAD8B8F5187F9AD849 +:1038A0003046FEF71FFF7388834294D092E70000F2 +:1038B0000B68002210B5036004460B6A83604B6AF4 +:1038C000C261C37123F0FF03896AC0E90432C16495 +:1038D000FFF7E0F920B92046BDE81040FFF76CBFC4 +:1038E00010BD0000F8B50368054601271C69204695 +:1038F000FEF7F8FEA070000A6678E0702846E96CD2 +:10390000FFF7C8F920B1022828BF0220C0B2F8BDD5 +:10391000A96B2868FFF76EF80028F4D1EB6B04F16F +:10392000200254F8041B944243F8041BF9D12B687D +:10393000DF70002EE7D000212846013EFFF788FE09 +:10394000E0E700002DE9F8434FF0FF08064607685E +:10395000042445464FF6FF79B16B11B9002C73D0A2 +:1039600063E03846FFF746F8044600285DD1F06B67 +:103970000378002B6ED03A78042A11D1852B4DD1D3 +:10398000336B3046F364FFF717FF044600284CD131 +:103990003B691B7903F03F03B3712046BDE8F88310 +:1039A000C27AE52B02F03F02B27143D02E2B41D0F8 +:1039B00022F0200108293DD00F2A40D1590637D5E1 +:1039C00003F0BF05336B90F80D80F364437B4345F0 +:1039D00030D1428B72BB03780D21FC6823F0400389 +:1039E000DFF874E0013B4B4301211EF801CB30F8B6 +:1039F0000CC009B3FF2B1DD824F813C06146013356 +:103A000001320D2AF1D10278520605D521B1FF2BE2 +:103A100010D8002224F81320013DEDB200213046D9 +:103A2000FFF716FE0446002896D00023B363B4E7E0 +:103A3000AB42CBD0FF25F1E7CC45E1D0FAE72DB979 +:103A4000FEF740FE404501D10024A6E74FF0FF33CA +:103A5000F364A2E70424E8E79C9900082DE9F04FFD +:103A6000002187B00446D0F80090FFF713F9804694 +:103A700070B999F80030042B33D1D9F80C00FEF757 +:103A800079FF07462046FFF75DFF054620B18046D7 +:103A9000404607B0BDE8F08FD9F810309A8CBA4292 +:103AA000F0D193F823B040265D4506D1D9F80C300B +:103AB00033F81530002BE5D1EAE7F106D9F81030DC +:103AC00008BF0236985B01F051F8D9F80C308246F5 +:103AD00033F8150001F04AF88245D3D1023601359A +:103AE000E2E74FF0FF0A4FF0FF3B5546C4F84CB0F9 +:103AF000A16B4846FEF77EFF00285CD1E66B377865 +:103B0000002F77D0F27AE52F02F03F03A37103D0A4 +:103B1000120704D50F2B04D0C4F84CB04FE00F2B84 +:103B200054D194F84B3058063FD4790645D5236BD1 +:103B300007F0BF0796F80DA0E364737B53453ED1B1 +:103B4000738B002B3BD135780121D9F80C3005F06F +:103B50003F0501930D23013D5D43284B13F8012BD5 +:103B6000B25A71B3FF2D059329D81046049200F084 +:103B7000FDFF6B1C03900293019B33F8150000F0CE +:103B8000F5FF039981421AD1049A029D1146059BC3 +:103B90001B4A9342E2D133785A0604D519B1019BEE +:103BA00033F815305BB97D1EEDB200212046FFF7DA +:103BB0004FFD00289CD080466AE7BD42BDD0FF255E +:103BC000F3E74FF6FF708242E2D0F8E72DB93046B6 +:103BD000FEF778FD50453FF45BAF94F84B30DB07C0 +:103BE0009AD40B2204F140013046FCF7AFFD0028C7 +:103BF00092D14DE74FF004084AE700BF9C990008B6 +:103C0000A99900082DE9F04F90F84BB099B00446FF +:103C10001BF0A00540F06C810668F26832F81530A0 +:103C2000002B4AD13378042B40F087800F230E35C8 +:103C30002046B5FBF3F5A91CFFF768FD8146002877 +:103C400077D1236B0135A3EB4515E3795A07E5647A +:103C500035D523F004032046E371FFF77DF950BB0F +:103C60004FF0FF32616B2046FFF7E0F818BBA36806 +:103C70002BB3214604A8FFF71BFEE0B970894FF46F +:103C80000071D4E90423E0FB01233069C4E9042373 +:103C90003830FEF7EFFC3069D4E904232830FEF712 +:103CA000E9FCE379326904A843F0010382F821308A +:103CB000FFF718FE18B181463BE00135AEE7D6E9C3 +:103CC0000354402200212046FEF740FB85230121BA +:103CD00040222370C0234FF0C10C04EB010884F88C +:103CE000203000231E469E46571C04F802C0F0B246 +:103CF000023204F807E021B135F8131009B101339D +:103D0000DBB20F0AA15408F802700232D706F2D1D2 +:103D100035F813700136002FE6D184F82330831C68 +:103D200028466370FEF726FE84F82400000A84F813 +:103D30002500484619B0BDE8F08F04F140070DF1A9 +:103D4000100A1BF0010F97E807008AE8070000F04F +:103D5000D78040234FF0010884F84B30BC46F3680D +:103D6000B8F1050F9AE80700ACE803002CF8022B25 +:103D70004FEA12428CF800205DD9981E424630F876 +:103D8000021F002946D10DF10F0C072102F00F0E82 +:103D9000914612090EF13000392888BF0EF1370024 +:103DA00001390CF8010902D0B9F10F0FEED801F179 +:103DB00060037E200DEB030202F8580C3846002207 +:103DC000914206D010F801CB02F1010EBCF1200F98 +:103DD00033D104F13F0C072902F1010297BF01F131 +:103DE0006003202001310DEB030098BF10F8580C40 +:103DF000072A0CF80200EED92046FFF72FFE814675 +:103E0000002878D108F10108B8F1640FA6D14FF06D +:103E100007098EE74FF0100C01F0010E49080EEB78 +:103E20004202D30344BF82F4883282F02102BCF103 +:103E3000010CF1D1A3E74246A5E77246C0E7216B2A +:103E40002046A1EB4511FEF725FF814600287FF4AF +:103E500070AF4FF6FF783846FEF734FC0190A16B47 +:103E60003046FEF7C7FD814600287FF462AFE36B62 +:103E7000E9B2019A4FF00D0CD6F80CE05A734FF0EE +:103E80000F02DFF8E0A0DA724A1E18730CFB02F290 +:103E900084469876D87640451AF8019B0CF1010CBF +:103EA00018BF3EF8120003EB090B18BF013203F8EC +:103EB00009004FEA1029002808BF4046BCF10D0F49 +:103EC0008BF80190E7D1404502D03EF812200AB9A4 +:103ED00041F040011970012300212046F370FFF7E3 +:103EE000B7FB814600287FF424AF013DB7D11BE02A +:103EF0004FF006091DE704287FF41BAF84F84BB090 +:103F00001BF0020F20461BBF0C350D210125B5FB10 +:103F1000F1F518BF01352946FFF7F8FB8146002867 +:103F20007FF407AF013D8AD1A16B3046FEF762FDF9 +:103F3000814600287FF4FDAE01462022E06BFEF7AB +:103F400005FAE36B03CF18605960BA7839889A7222 +:103F5000198194F84B30E26B03F0180313730123BB +:103F6000F370E6E69C99000810B504460A46343022 +:103F7000FEF772FB886004F13800FEF76FFBC2E9C0 +:103F8000040194F8213003F00203D3710023D361BC +:103F900010BD000003284B8B04BF8A8A43EA02430A +:103FA000184670472DE9F04F0B7899B004468946C2 +:103FB0002F2BD0F800B001D05C2B09D14A461378E2 +:103FC000914601322F2BFAD05C2BF8D0002301E070 +:103FD000DBF81C30A3600023E3619BF80030042B66 +:103FE0001ED1A368E3B1DBF82030214604A8236288 +:103FF000DBF824306362DBF82830A362FFF758FC5B +:104000000346002854D1DBF8102002F13800FEF7F7 +:1040100023FBC4E9040392F8213003F00203E371A7 +:1040200099F800301F2B00F23581802300212046B3 +:1040300084F84B3019B0BDE8F04FFEF72BBE49466F +:104040000B78894601312F2BFAD05C2BF8D01F2B2F +:104050008CBF00250425012F2FD113882E2B31D1A1 +:10406000002322F8173004F140029F428CBF2E211A +:10407000202101330B2B02F8011BF6D145F020055E +:10408000204684F84B50FFF7E9FC94F84B300028A9 +:1040900000F0E78004280BD1990603F0040240F1F8 +:1040A000DC80002A00F0F6808023002084F84B306A +:1040B00019B0BDE8F08F0425CDE7022F02D1538857 +:1040C0002E2BCAD0911E87BB002322F81730002F59 +:1040D00000F0118132F81300194601332028F9D07D +:1040E00009B92E2801D145F00305901E30F817308C +:1040F0002E2B01D0013FF9D14FF020334FF0000AB1 +:104100006364D0462364C4F847300823481C32F85F +:1041100011600090F6B1202E03D02E2E0DD1B842A2 +:1041200010D045F003050099F0E731F81730202B47 +:1041300001D02E2BC8D1013FC5E79A4505D2009981 +:10414000B9423BD10B2B30D101E00B2B27D145F0ED +:1041500003050B2394F84020E52A04BF052284F8C8 +:104160004020082B04BF4FEA88085FFA88F808F05F +:104170000C030C2B03D008F00303032B01D145F0F3 +:104180000205A8073FF57CAF18F0010F18BF45F0F6 +:10419000100518F0040F18BF45F0080570E70099E6 +:1041A000B94202D045F00305D4D84FEA88080B2362 +:1041B0004FF0080A00975FFA88F8B4E77F2E15D908 +:1041C000304640F25231CDE9022345F0020301931B +:1041D00000F098FC10F0800F0646DDE9022316D0AF +:1041E00000F07F0646498E5D019D46B33146454845 +:1041F000CDE90123FCF7A4FCDDE90123F8B9A6F120 +:10420000410189B219291ED848F0020810E0FF28A0 +:10421000EAD9591E8A4503D345F003059A4682E739 +:1042200004EB0A01000A0AF1010A019D81F840002D +:1042300004EB0A010AF1010A81F8406073E745F0D6 +:1042400003055F26F4E7A6F1610189B219299EBF33 +:10425000203E48F00108B6B2EAE7002A08BF052070 +:1042600026E75A073FF524AFA379DB0645D59BF82F +:104270000000042835D1A3682146E279236223692E +:10428000DBF8100023F0FF0313436362E36CA362C7 +:10429000FFF76AFE23680027DA6819F8010B002887 +:1042A0003FF409AF40F25231009200F04BFC05465A +:1042B00008B31F28009A7FF6FEAE2F283FF4BFAE4A +:1042C0005C283FF4BCAE7F2805D801460E48FCF7B9 +:1042D00037FC009A78B9FF2F0DD022F8175001371C +:1042E000DBE7216B0BF14C03C1F308011944FFF725 +:1042F00051FEA060CEE70620DAE60520D8E600BF32 +:104300001C990008159900080C9900081FB5CDE903 +:10431000001003A814460391FEF7FCF9002815DBF2 +:104320000B4A52F820300BB100211970019B0BB1E0 +:104330000021197042F820302CB1002201A96846F2 +:10434000FEF7C4FE0446204604B010BD0B24FAE775 +:10435000A03600202DE9F04798B09046054601911F +:10436000002800F0528102F03F0603A901A832465E +:10437000FEF7ACFE002840F04681039B4FF48C60B2 +:10438000049303F09FFA0746002800F04081039B46 +:1043900000F500720199D86004A81A61FFF702FEC7 +:1043A000044620B99DF95B30002BB8BF062418F0F5 +:1043B0001C0F00F0CD80002C4CD0042C40D104A860 +:1043C000FFF720FC044600283AD146F00806039B7C +:1043D0001A78042A40F08380186929462B60FFF779 +:1043E000C3FD039B1E22002118690230FDF7AEFFBA +:1043F000039C00211A2220692630FDF7A7FF2369BC +:1044000020221A71246903F097FA01460122083428 +:104410002046FEF727F9039B04A81B6983F8212097 +:10442000FFF760FA044658B9A96801B30246284666 +:10443000FEF714FDAB68039A0446013B5361B4B127 +:10444000384603F04FFA0CB100232B60204618B019 +:10445000BDE8F0879DF8163013F0110F40F084800E +:1044600018F0040F40F0C98018F0080FAFD1039A7C +:1044700031071399936C48BF46F04006E964AB647A +:104480001078042872D1069B9DF817102B62089BA8 +:10449000106923F0FF030B4329466B62179BAB6245 +:1044A000FFF762FDDDF80CA00024002205F15008A2 +:1044B000BAF8063021464046C5F800A0AB8000237C +:1044C00085F8306085F831406C64C5E90E234FF4FF +:1044D0000072FDF73BFFB20653D40024B0E703F0AF +:1044E0002BFA0146009013980E30FEF7BBF8139894 +:1044F00000991630FEF7B6F8039C13992078FFF761 +:1045000049FD202300228046CB7220461399FEF7F6 +:10451000CDF8139B002201211A775A779A77DA7720 +:10452000039BD970B8F1000FA1D0414604A8D3F87D +:104530004890FEF793FC0446002881D14946039831 +:10454000FEF758FA039B044608F1FF30586176E7FE +:10455000002C7FF475AF9DF81630DC064FD418F0B0 +:10456000020F84D0D80782D5072469E7FFF712FD30 +:104570000023A86001F11C00FEF76EF86B61286152 +:1045800090E7D5E9046956EA0903A6D0BAF80AA06B +:10459000A9684FEA4A2AC5E90E69B24574EB0903D6 +:1045A0001BD300242964002C7FF44AAFC6F3080310 +:1045B000002B92D0039C2046FEF76CF808B3760AD5 +:1045C0000123414646EAC95682196A64607802F0BE +:1045D000E5FC041E18BF012432E72846FEF7C2FAA4 +:1045E000B6EB0A06014669F10009012803D9431C0C +:1045F000D3D10124D6E70224D4E7082420E70424F9 +:104600001EE702241CE704461EE709241EE71124C6 +:104610001CE700002DE9F04F994685B0002388463D +:1046200003A90446C9F800301646FEF78DF8054682 +:1046300080BB94F831506DBB94F8303013F0010317 +:10464000009300F0A68004F1500AD4E90432D4E9C2 +:104650000E011B1A62EB0102B34272F1000238BF75 +:104660001E46BEB1D4E90E10C1F30803002B40F082 +:104670008280039B5A894B0A013A43EAC0531A408D +:104680001BD151EA000309D1A06801280DD80225E9 +:1046900084F83150284605B0BDE8F08F216C2046E3 +:1046A0000192FEF75FFA019AEFE7431C04D1012360 +:1046B000009D84F83130EDE72064DDF80CB0216C0A +:1046C0005846FDF7E7FF0028E1D0B6F5007F02EB82 +:1046D000000731D3BBF80A1002EB5620730A884258 +:1046E0009BF8010088BF8B1A3A464146019302F0BD +:1046F00055FC0028DBD194F93020019B002A0BDA0D +:10470000606CC01B984207D24FF40072514608EB10 +:104710004020FDF7F5FD019B5F02D9F80030F61B44 +:10472000B8443B44C9F80030D4E90E32DB1942F1F9 +:104730000002C4E90E3294E7626CBA421AD094F9CE +:104740003030002B0DDA012351469BF8010002F0B6 +:1047500049FC0028ABD194F8303003F07F0384F893 +:104760003030039801233A465146407802F016FC57 +:1047700000289CD16764A16B4046C1F30801C1F5D4 +:1047800000775144B74228BF37463A46FDF7B8FD97 +:10479000C3E707257EE7000070B596B00E460022FD +:1047A000019002A901A8FEF791FC0446E0B94FF47C +:1047B0008C6003F087F80546D8B1029B00F50072C3 +:1047C0000199D86002A81A61FFF7ECFB044640B9D2 +:1047D0009DF95330002B0ADB1EB1314602A8FDF7CC +:1047E000E9FF284603F07EF8204616B070BD062487 +:1047F000F7E71124F8E7000070B5B8B00222019085 +:1048000003A901A8FEF762FC044608BB039B4FF412 +:104810008C60109303F056F80546002866D0039B81 +:1048200000F500720199D86010A81A61FFF7BAFB71 +:10483000044650B99DF88B30980655D4190653D4C8 +:104840009DF84630DA0706D50724284603F04AF8D3 +:10485000204638B070BD039B04931878042814D107 +:1048600004A91869FFF780FB069E9DF84630DB0619 +:1048700010D410A8FEF772FF04460028E5D156BBFD +:104880000398FEF7D7FB0446DFE71F99FFF782FB8B +:104890000646EAE7039BDA69B242D5D024930021A9 +:1048A000269624A81B78042B01BFDDE90823CDE957 +:1048B00028239DF817308DF89730FEF7EBF9044662 +:1048C0000028C2D124A8FFF73DF804460028BBD039 +:1048D0000428BAD1CDE70246314604A8FEF7BEFA55 +:1048E00004460028B1D1CBE70624AEE71124AFE798 +:1048F000F0B5BDB0CDE900106846FDF70BFF022210 +:1049000003A901A8FEF7E2FB0446002841D1039B5E +:104910004FF48C60149302F0D5FF0546002800F098 +:10492000EE80039B00F5007214AE0199D8601A6105 +:104930003046FFF737FB044640BB9DF89B3013F031 +:10494000A00F40F0D880039B009F1A78042A68D1FA +:104950001B6904AC03F1400C1868083353F8041CBD +:104960002246634503C21446F6D15022314628A898 +:10497000FDF7C6FC394628A8FFF714FB04460028BB +:104980004CD12A9A169B9A4206D00824284602F057 +:10499000A9FF20463DB0F0BD349A209B9A42F4D145 +:1049A00028A8FFF72FF904460028EFD1039B04AF96 +:1049B0001B6993F801E093F823C09C8C3A460833B6 +:1049C00003CAB24243F8080C43F8041C1746F5D159 +:1049D000039B28A81B6983F801E0039B1A6982F8EE +:1049E00023C01A6982F82440240A82F825401A69F3 +:1049F0001379D9065CBF43F020031371FEF772FFF1 +:104A000004460028C2D13046FEF7A8FE044600281E +:104A1000BCD10398FEF70EFB0446B7E70428B5D1D6 +:104A2000BEE7239A04AB02F1200C1068083252F85A +:104A3000041C1C46624503C42346F6D1502231466D +:104A400028A8FDF75DFC394628A8FFF7ABFA044615 +:104A500000284CD12A9A169B9A4296D1349A209BD0 +:104A60009A4292D128A8FFF7CDF8044600288DD1AC +:104A700037990DF11D030DF12D0001F10D0253F8D1 +:104A8000044B834242F8044BF9D118880127108067 +:104A90009B7893709DF81B30039CDA0658BF43F057 +:104AA0002003CB72E770CB7ADB06ACD5169A2A9B33 +:104AB0009A42A8D02078FFF76DFA01462046FDF70C +:104AC000E9FD0146C8B12046FDF794FF04460028E1 +:104AD0007FF45CAF039890F86D302E2B93D12A9A17 +:104AE00000F16C01FDF7E2FD039BDF708BE704280A +:104AF0007FF44CAFB6E7062448E7022446E71124CA +:104B000047E700007F2810B501D880B210BDB0F58E +:104B1000803F13D240F2523399420FD1084900220C +:104B200031F8024B93B2844203D103F18000C0B24A +:104B3000ECE70132802AF3D11346F6E70020E5E7DF +:104B40005C9C00087F280DD940F25233994208D16D +:104B5000FF2806D800F10040034B803833F81000DE +:104B600070470020704700BF5C9C0008B0F5803F94 +:104B7000F0B522D21F4A83B21F49B0F5805F28BF2B +:104B80000A46141D34F8042C2146AAB1934213D3CB +:104B900034F8025C2E0AEFB252FA85F5A84222DA06 +:104BA000082E09D8DFE806F0050A10121416181AA4 +:104BB0001C00801A34F810301846F0BD981A00F026 +:104BC00001001B1A9BB2F7E7103BFBE7203BF9E71C +:104BD000303BF7E71A3BF5E70833F3E7503BF1E7E3 +:104BE000A3F5E353EEE70434002ECBD101EB4702EB +:104BF000C7E700BFAC990008A09B000808B5074BA9 +:104C0000074A196801F03D01996053680BB190683B +:104C10009847BDE8084003F0A9B800BF0000024073 +:104C2000A836002008B5084B1968890901F03D0134 +:104C30008A019A60054AD3680BB110699847BDE8AC +:104C4000084003F093B800BF00000240A8360020DF +:104C500008B5084B1968090C01F03D010A049A6077 +:104C6000054A53690BB190699847BDE8084003F0C5 +:104C70007DB800BF00000240A836002008B5084BF0 +:104C80001968890D01F03D018A059A60054AD369CA +:104C90000BB1106A9847BDE8084003F067B800BF41 +:104CA00000000240A836002008B5074B074A5968A3 +:104CB00001F03D01D960536A0BB1906A9847BDE895 +:104CC000084003F053B800BF00000240A83600209F +:104CD00008B5084B5968890901F03D018A01DA607D +:104CE000054AD36A0BB1106B9847BDE8084003F042 +:104CF0003DB800BF00000240A836002008B5084BB0 +:104D00005968090C01F03D010A04DA60054A536B49 +:104D10000BB1906B9847BDE8084003F027B800BF7F +:104D200000000240A836002008B5084B5968890DDC +:104D300001F03D018A05DA60054AD36B0BB1106CB6 +:104D40009847BDE8084003F011B800BF00000240DA +:104D5000A836002008B5074B074A196801F03D0145 +:104D60009960536C0BB1906C9847BDE8084002F015 +:104D7000FDBF00BF00040240A836002008B5084B64 +:104D80001968890901F03D018A019A60054AD36CCE +:104D90000BB1106D9847BDE8084002F0E7BF00BFB7 +:104DA00000040240A836002008B5084B1968090C19 +:104DB00001F03D010A049A60054A536D0BB1906DF4 +:104DC0009847BDE8084002F0D1BF00BF0004024090 +:104DD000A836002008B5084B1968890D01F03D017F +:104DE0008A059A60054AD36D0BB1106E9847BDE8ED +:104DF000084002F0BBBF00BF00040240A8360020FC +:104E000008B5074B074A596801F03D01D960536E58 +:104E10000BB1906E9847BDE8084002F0A7BF00BFF5 +:104E200000040240A836002008B5084B59688909DB +:104E300001F03D018A01DA60054AD36E0BB1106FB3 +:104E40009847BDE8084002F091BF00BF000402404F +:104E5000A836002008B5084B5968090C01F03D013F +:104E60000A04DA60054A536F0BB1906F9847BDE8AA +:104E7000084002F07BBF00BF00040240A8360020BB +:104E800008B5084B5968890D01F03D018A05DA60C3 +:104E9000054AD36F13B1D2F880009847BDE80840A7 +:104EA00002F064BF00040240A836002000230C4931 +:104EB00010B51A460B4C0B6054F82300026001EB4E +:104EC000430004334260402BF6D1074A4FF0FF33D2 +:104ED0009360D360C2F80834C2F80C3410BD00BF30 +:104EE000A83600205C9D0008000002400F28F8B59D +:104EF00010D9102810D0112811D0122808D10F2451 +:104F00000720DFF8C8E00126DEF80050A04208D9EB +:104F1000002653E00446F4E70F240020F1E70724BD +:104F2000FBE706FA00F73D424AD1264C4FEA001C47 +:104F30003D4304EB00160EEBC000CEF80050C0E974 +:104F40000123FBB273B12048D0F8D83043F00103FD +:104F5000C0F8D830D0F8003143F00103C0F8003178 +:104F6000D0F8003117F47F4F0ED01748D0F8D83062 +:104F700043F00203C0F8D830D0F8003143F0020308 +:104F8000C0F80031D0F8003154F80C00036823F069 +:104F90001F030360056815F00105FBD104EB0C034A +:104FA0003D2493F80CC05F6804FA0CF43C602124A3 +:104FB0000560446112B1987B00F0CAFC3046F8BD30 +:104FC0000130A3E75C9D000800440258A836002089 +:104FD00010B5302484F31188FFF788FF002383F392 +:104FE000118810BD10B50446807B00F0C7FC01237A +:104FF0001549627B03FA02F20B6823EA0203DAB274 +:105000000B6072B9114AD2F8D81021F00101C2F830 +:10501000D810D2F8001121F00101C2F80011D2F825 +:10502000002113F47F4F0ED1084BD3F8D82022F083 +:105030000202C3F8D820D3F8002122F00202C3F8FC +:105040000021D3F8003110BDA836002000440258DA +:1050500008B5302383F31188FFF7C4FF002383F3DF +:10506000118808BD836CC26A8B42506810B506D99E +:105070005A1E4C0002EB4103B3FBF4F3184410BD7D +:1050800001F001038A0748BF43F002034A0748BF03 +:1050900043F008030A0748BF43F00403CA0648BFA9 +:1050A00043F010038A06426B48BF43F020031343CA +:1050B0004363704710B5074C204600F0CBFF064B0A +:1050C0000022C4E91023054BA364054BE363054BA1 +:1050D000E36410BD2C3700200024024800B4C4044F +:1050E0008037002080390020C36A0BB9104BC3629F +:1050F0000379012B11D10F4B98420ED10E4BD3F8EF +:10510000DC2042F40072C3F8DC20D3F8042142F41E +:105110000072C3F80421D3F80431436C00221A65ED +:10512000DA621A605A605A624FF0FF329A6370472F +:105130005C9E00082C370020004402580379012BA4 +:105140001BD0436C00221A65DA621A605A605A62F8 +:105150004FF0FF329A63094B98420ED1084BD3F8B7 +:10516000DC2022F40072C3F8DC20D3F8042122F4FE +:105170000072C3F80421D3F8043170472C370020A3 +:105180000044025810B5446C0649FFF76BFF60609D +:10519000236842F2107043F003032360BDE810401F +:1051A00001F05EBD801A06000129F8B5466C0B4F70 +:1051B00009D175680A493D40FFF754FF054345F49E +:1051C00080557560F8BD746806493C40FFF74AFF9A +:1051D000044344F480547460F4E700BF00ECFFFF24 +:1051E00080F0FA0240787D01436C00225A601A6018 +:1051F00070470000426C0129536823F4404304D0F7 +:10520000022905D001B95360704743F48043FAE79F +:1052100043F40043F7E70000436C41F480519A6087 +:10522000D9605A6B1206FCD580229A637047000041 +:1052300010B541F48851446CA260E160616B11F0DB +:105240004502FBD0A26311F0040203D0FFF718FF60 +:10525000012010BD616910461960FAE710B541F4EC +:105260008851446CA260E160616B11F04502FBD093 +:10527000A26311F0050203D0FFF702FF012010BD69 +:10528000616910461960FAE773B5134604460E4685 +:10529000302282F31188426CD26B32B14FF0FF3171 +:1052A0004030019301F0E8FC019B606C0022026534 +:1052B000C263C262456B15F4807504D185F3118811 +:1052C000012002B070BD4FF0FF31816382F311887D +:1052D000012E06D90C21204602B0BDE87040FFF730 +:1052E000BDBF1046EDE7000073B5446C0E460025C7 +:1052F0000192616BA1632565E562FFF7C1FE012E96 +:1053000007D9019B2A460C2102B0BDE87040FFF787 +:10531000A5BF02B070BD000010B541F49851446CB7 +:10532000A260E160616B11F04502FBD0A26311F055 +:105330003F0203D0FFF7A4FE012010BD216A1046F2 +:105340001960E1695960A16999606169D960F4E700 +:105350002DE9F74304460191006D01A917469846CF +:1053600002F02CFC064600284AD0626C2046DDF88C +:1053700004905568C5F3090501356B00A56CB5FBB4 +:10538000F3F54FF47A73B5FBF3F55D43556200F026 +:1053900027FE50BB636C4FF0FF3201254146C3F836 +:1053A000589020461D659A634FF49572DA6342F275 +:1053B00007029F62DA62E36C0A9AFFF74FFFA0B917 +:1053C000E26C104B11680B407BB929462046FFF771 +:1053D0005BFF054648B92E463A460199206D02F01A +:1053E00025FC304603B0BDE8F0833A460199206DB4 +:1053F00002F01CFCE26C01212046FFF775FFF0E78C +:105400000126EEE708E0FFFD2DE9F7431F46436C58 +:1054100001924FF47A725D6804468846C5F3090527 +:1054200001356E00856CB5FBF6F5B5FBF2F555431D +:105430005D6200F0D5FD20B10125284603B0BDE82E +:10544000F0837E0201A9206D324602F0B7FB0546CB +:105450000028F1D0636C019AD4F84C909A6501222F +:105460001A654FF0FF329A634FF49572DA639E62C9 +:10547000236BDB064B4658BF4FEA4828012F4246B4 +:105480001BD912212046FFF7E9FEC0B9D9F8002048 +:10549000104B13409BB9636C42F29302394620468D +:1054A000DA62E26CFFF7F0FE804640B932460199BD +:1054B000206D454602F0BAFBBFE71121E2E7324614 +:1054C0000199206D02F0B2FBE26C39462046FFF7ED +:1054D0000BFFB2E708E0FFFD2DE9F3411F46436CE7 +:1054E00001924FF47A725D6804468846C5F3090557 +:1054F00001356E00856CB5FBF6F5B5FBF2F555434D +:105500005D6200F06DFD20B10125284602B0BDE8C6 +:10551000F0817E0201A9206D324602F095FB05461E +:105520000028F1D0636C019A9A6501221A654FF048 +:10553000FF329A634FF48D72DA639E62236BE66CDE +:10554000DB06334658BF4FEA4828012F424619D997 +:1055500019212046FFF782FEB0B932680F4B134085 +:1055600093B9636C42F2910239462046DA62E26CEA +:10557000FFF78AFE064638B901993546206D02F0DC +:105580009FFBC2E71821E4E70199206D02F098FB28 +:10559000E26C39462046FFF7A7FEB6E708E0FFFDBC +:1055A00012F0030F2DE9F04107460C4615461E4642 +:1055B00017D00E44B44202D10020BDE8F08101238F +:1055C000FA6B21463846FFF71FFF0028F5D1284621 +:1055D0004FF40072F96B05F500750134FCF790FE8D +:1055E000E8E7BDE8F041FFF70FBF000012F0030F3E +:1055F0002DE9F04107460C4615461E4617D00E44CD +:10560000B44202D10020BDE8F08129464FF4007277 +:10561000F86B05F50075FCF773FE0123FA6B214664 +:105620003846FFF759FF0028EDD10134E8E7BDE81F +:10563000F041FFF751BF000000207047302310B544 +:1056400083F311880024436C40302146DC6301F071 +:1056500021FB84F3118810BD026843681143016087 +:1056600003B1184770470000024A136843F0C003B3 +:105670001360704700480040024A136843F0C003BB +:105680001360704700500040024A136843F0C003A3 +:105690001360704700780040064BD3F8E8200243BF +:1056A000C3F8E820D3F810211043C3F81001D3F851 +:1056B000103170470044025837B5274C274D20461B +:1056C00000F028FD04F11400009400234FF4007250 +:1056D000234900F0C3F94FF40072224904F1380065 +:1056E0000094214B00F03CFA204BC4E91735204CC4 +:1056F000204600F00FFD04F11400009400234FF445 +:1057000000721C4900F0AAF94FF400721A4904F122 +:1057100038000094194B00F023FA194BC4E91735EF +:10572000184C204600F0F6FC04F1140000234FF45E +:1057300000721549009400F091F9144B4FF4007277 +:10574000134904F13800009400F00AFA114BC4E93F +:10575000173503B030BD00BF8439002000E1F505E6 +:10576000C83A0020C84000206956000800480040A0 +:10577000F0390020C83C0020C842002079560008BB +:10578000005000405C3A0020C83E002089560008C6 +:10579000C84400200078004038B5264D0446037CFC +:1057A000002918BF0D46012B06D1234B984230D15A +:1057B0004FF48020FFF770FF2A68236EE16D03EB42 +:1057C0005203A566B3FBF2F36A68100442BF23F0EC +:1057D000070003F0070343EA4003CB60AB6843F0E4 +:1057E00040034B60EB6843F001038B6042F4967317 +:1057F00043F001030B604FF0FF330B62510505D5F9 +:1058000012F0102211D0B2F1805F10D084F8643011 +:1058100038BD0A4B984205D0094B9842CCD14FF085 +:105820008040C7E74FF48010C4E77F23EEE73F23B3 +:10583000ECE700BF649E000884390020F0390020A6 +:105840005C3A00202DE9F047C66D05463768F469DB +:10585000210734621AD014F0080118BF4FF4807188 +:10586000E20748BF41F02001A3074FF0300348BFD3 +:1058700041F04001600748BF41F0800183F3118887 +:10588000281DFFF7E9FE002383F31188E2050AD5FE +:10589000302383F311884FF48061281DFFF7DCFE6D +:1058A000002383F311884FF030094FF0000A14F001 +:1058B000200838D13B0616D54FF0300905F1380ADB +:1058C000200610D589F31188504600F07DF9002894 +:1058D00036DA0821281DFFF7BFFE27F0800333606A +:1058E000002383F31188790614D5620612D530237C +:1058F00083F31188D5E913239A4208D12B6C33B175 +:1059000027F040071021281DFFF7A6FE376000236F +:1059100083F31188E30618D5AA6E1369ABB15069F9 +:10592000BDE8F047184789F31188736A284695F84F +:105930006410194000F008FC8AF31188F469B6E796 +:10594000B06288F31188F469BAE7BDE8F087000017 +:10595000090100F16043012203F56143C9B283F8F4 +:10596000001300F01F039A4043099B0003F16043BA +:1059700003F56143C3F880211A60704700F01F03EC +:1059800001229A40430900F160409B0000F561400C +:1059900003F1604303F56143C3F88020C3F880211D +:1059A000002380F800337047F8B515468268044636 +:1059B0000B46AA4200D28568A1692669761AB542CB +:1059C0000BD218462A46FCF79BFCA3692B44A36123 +:1059D0002846A3685B1BA360F8BD0CD9AF1B184613 +:1059E0003246FCF78DFC3A46E1683044FCF788FC0F +:1059F000E3683B44EBE718462A46FCF781FCE36882 +:105A0000E5E7000083689342F7B50446154600D2E7 +:105A10008568D4E90460361AB5420BD22A46FCF7F1 +:105A20006FFC63692B4463612846A3685B1BA3601A +:105A300003B0F0BD0DD93246AF1B0191FCF760FCFD +:105A400001993A46E0683144FCF75AFCE3683B446C +:105A5000E9E72A46FCF754FCE368E4E710B50A449A +:105A60000024C361029B8460C16002610362C0E9DB +:105A70000000C0E9051110BD08B5D0E90532934218 +:105A800001D1826882B98268013282605A1C426107 +:105A900019700021D0E904329A4224BFC3684361DF +:105AA00001F012F9002008BD4FF0FF30FBE70000C5 +:105AB00070B5302304460E4683F31188A568A5B15E +:105AC000A368A269013BA360531CA36115782269F6 +:105AD000934224BFE368A361E3690BB12046984772 +:105AE000002383F31188284607E03146204601F061 +:105AF000DBF80028E2DA85F3118870BD2DE9F74F55 +:105B000004460E4617469846D0F81C904FF0300ACF +:105B10008AF311884FF0000B154665B12A463146CD +:105B20002046FFF741FF034660B94146204601F099 +:105B3000BBF80028F1D0002383F31188781B03B051 +:105B4000BDE8F08FB9F1000F03D001902046C8479F +:105B5000019B8BF31188ED1A1E448AF31188DCE750 +:105B6000C160C361009B82600362C0E905111144FA +:105B7000C0E9000001617047F8B504460D461646BD +:105B8000302383F31188A768A7B1A368013BA36002 +:105B900063695A1C62611D70D4E904329A4224BFC1 +:105BA000E3686361E3690BB120469847002080F306 +:105BB000118807E03146204601F076F80028E2DA45 +:105BC00087F31188F8BD0000D0E9052310B59A428B +:105BD00001D182687AB982680021013282605A1C40 +:105BE00082611C7803699A4224BFC368836101F013 +:105BF0006BF8204610BD4FF0FF30FBE72DE9F74F63 +:105C000004460E4617469846D0F81C904FF0300ACE +:105C10008AF311884FF0000B154665B12A463146CC +:105C20002046FFF7EFFE034660B94146204601F0EB +:105C30003BF80028F1D0002383F31188781B03B0D0 +:105C4000BDE8F08FB9F1000F03D001902046C8479E +:105C5000019B8BF31188ED1A1E448AF31188DCE74F +:105C60000379052B05BF836A002001204B6004BF28 +:105C70004FF400730B60704770B55D1E866A044672 +:105C80000D44B54205D9436B43F0800343630120C3 +:105C900070BD06250571FFF783FC05232371F7E727 +:105CA00070B55D1E866A04460D44B54205D9436B46 +:105CB00043F080034363012070BD07250571FFF7A2 +:105CC00095FC05232371F7E738B505790446052DC2 +:105CD00005D108230371FFF7AFFC257138BD012002 +:105CE000FCE700000323F0B5037185B00446FFF71D +:105CF00049FA002220461146FFF78EFA4FF4D5727A +:105D000003AB08212046FFF7A9FA0246B8B90123E0 +:105D10002363039BC3F30323012B09D103AB372177 +:105D20002046FFF79BFA18B9A44B039A1340ABB176 +:105D300020460125FFF758FA0223237137E103AB10 +:105D4000002237212046FFF789FA28B99B4A039B96 +:105D50001A40002A00F0A78002232363236B03F07C +:105D60000F03022B40F0A9806425954E42F210707B +:105D700000F076FF03AB324601212046FFF758FAC8 +:105D80000028D5D1039B002B80F293805A0003D5C5 +:105D9000236B43F010032363002204F10803022164 +:105DA0002046FFF7B9FA02460028C1D104F13803B2 +:105DB00003212046FFF752FA0028B9D104F1180553 +:105DC000A26B092120462B46FFF7A6FA0028AFD187 +:105DD00002ABA26B07212046FFF740FA06460028D7 +:105DE000A6D1236B03F00F03022B40F08F807E229D +:105DF0007F21284603F028FA012840F28780E76BCC +:105E000042F2107000F02CFF08234FF40072394664 +:105E100020460096FFF79CFA002889D1384603F007 +:105E200061FA236BA06203F00F03022B72D103AB64 +:105E3000644A06212046FFF711FA002871D15F4914 +:105E4000039B1940B1FA81F149092046FFF7ACF9EB +:105E500002AB4FF4007210212046FFF7FFF9054610 +:105E600000287FF465AF554E029B33427FF460AF4C +:105E7000236B13F00E0F03F00F0273D0022A7FF48E +:105E800057AFE36A1978012900F09480022900F0E5 +:105E90009380002900F089804B4F2046FFF7AAF934 +:105EA00003AB3A4676E0114620462263FFF7B4F989 +:105EB00054E7013D7FF45AAF3AE7444D6426444A23 +:105EC0003E4F012B18BF154603AB00223721204659 +:105ED000FFF7C4F900287FF42BAF039B3B427FF40C +:105EE00027AF03AB2A4629212046FFF7A1F9002856 +:105EF0007FF41EAF039B002BFFF648AF013E3FF43B +:105F000017AF42F2107000F0ABFEDDE7284603F059 +:105F1000BDF986E77E227F212846E66B03F094F9DF +:105F200008B9002191E70023402231462046009322 +:105F30000623FFF70DFA0028F3D1B3895BBA9B075C +:105F4000EFD5244B40223146204600930623FFF72D +:105F5000FFF90028E5D1317C01F00F010F3918BF9E +:105F6000012172E7E36A1978F9B101297FF4E0AE03 +:105F70002046FFF73FF903ABA26B37212046FFF71E +:105F80006DF900287FF4D4AE039B33427FF4D0AE8A +:105F900003AB022206212046FFF760F900287FF4B8 +:105FA000C7AE039B33427FF4C3AE0523237128465B +:105FB00005B0F0BD084F70E7084F6EE708E0FFFD41 +:105FC0000080FFC00001B9030000B7030080FF504C +:105FD00000001080F1FFFF800001B7030002B7034B +:105FE00037B504460C4D01ABA26B0D212046FFF7DF +:105FF00035F978B9019B2B420BD1C3F34323042B12 +:1060000008D0053B022B04D84FF47A7000F028FE2C +:10601000E9E7012003B030BD08E0FFFD70B5302393 +:10602000054683F3118803790024022B03D184F3FE +:106030001188204670BD0423037184F31188022661 +:10604000FFF7CEFF04462846FFF7CEF82E71F0E7A3 +:10605000FFF730B8044B036001230371002343634F +:10606000C0E90A33704700BF7C9E000810B530239A +:10607000044683F31188C162FFF736F8022300203B +:10608000237180F3118810BD10B53023044683F3CB +:106090001188FFF753F800230122E362227183F392 +:1060A000118810BD026843681143016003B11847AD +:1060B000704700001430FFF721BD00004FF0FF33A0 +:1060C0001430FFF71BBD00003830FFF797BD00000C +:1060D0004FF0FF333830FFF791BD00001430FFF769 +:1060E000E7BC00004FF0FF311430FFF7E1BC0000C7 +:1060F0003830FFF741BD00004FF0FF323830FFF776 +:106100003BBD0000012914BF6FF013000020704751 +:10611000FFF7D2BA044B036000234360C0E90233A7 +:1061200001230374704700BFA09E000810B5302300 +:10613000044683F31188FFF72FFB0223002023740A +:1061400080F3118810BD000038B5C36904460D46C0 +:106150001BB904210844FFF7A5FF294604F11400E8 +:10616000FFF78AFC002806DA201D4FF40061BDE825 +:106170003840FFF797BF38BD02684368114301609C +:1061800003B118477047000013B5406B00F5805409 +:10619000D4F8A4381A681178042914D1017C022992 +:1061A00011D11979012312898B4013420BD101A916 +:1061B0004C3002F077FFD4F8A4480246019B2179C5 +:1061C000206800F0DFF902B010BD0000143002F0CA +:1061D000F9BE00004FF0FF33143002F0F3BE0000B0 +:1061E0004C3002F0CBBF00004FF0FF334C3002F0D8 +:1061F000C5BF0000143002F0C7BE00004FF0FF31F1 +:10620000143002F0C1BE00004C3002F097BF000015 +:106210004FF0FF324C3002F091BF00000020704779 +:1062200010B500F58054D4F8A4381A681178042900 +:1062300017D1017C022914D15979012352898B404D +:1062400013420ED1143002F059FE024648B1D4F880 +:10625000A4484FF4407361792068BDE8104000F015 +:106260007FB910BD406BFFF7DBBF00007047000037 +:106270007FB5124B012504260446036000230574F4 +:1062800000F1840243602946C0E902330C4B0290BE +:10629000143001934FF44073009602F00BFE094B4B +:1062A00004F69442294604F14C000294CDE90063BF +:1062B0004FF4407302F0D2FE04B070BDC89E0008D7 +:1062C00065620008896100080A68302383F3118839 +:1062D0000B790B3342F823004B79133342F8230038 +:1062E0008B7913B10B3342F8230000F58053C3F8C8 +:1062F000A41802230374002080F311887047000063 +:1063000038B5037F044613B190F85430ABB901257A +:10631000201D0221FFF730FF04F114006FF001018E +:10632000257700F0DDFC04F14C0084F854506FF048 +:106330000101BDE8384000F0D3BC38BD10B50121E3 +:1063400004460430FFF718FF0023237784F8543005 +:1063500010BD000038B504460025143002F0C2FD1F +:1063600004F14C00257702F091FE201D84F8545072 +:106370000121FFF701FF2046BDE83840FFF750BF7D +:1063800090F8803003F06003202B06D190F8812034 +:106390000023212A03D81F2A06D800207047222A6A +:1063A000FBD1C0E91D3303E0034A4267072282673D +:1063B000C3670120704700BFA822002037B500F551 +:1063C0008055D5F8A4381A68117804291AD1017CAF +:1063D000022917D11979012312898B40134211D157 +:1063E00000F14C04204602F011FF58B101A92046EB +:1063F00002F058FED5F8A4480246019B2179206896 +:1064000000F0C0F803B030BD01F10B03F0B550F857 +:10641000236085B004460D46FEB1302383F3118816 +:1064200004EB8507301D0821FFF7A6FEFB6806F187 +:106430004C005B691B681BB1019002F041FE0198A2 +:1064400003A902F02FFE024648B1039B29462046CD +:1064500000F098F8002383F3118805B0F0BDFB68C5 +:106460005A691268002AF5D01B8A013B1340F1D10A +:1064700004F18002EAE70000133138B550F82140FA +:10648000ECB1302383F3118804F58053D3F8A428AA +:106490001368527903EB8203DB689B695D6845B141 +:1064A00004216018FFF768FE294604F1140002F089 +:1064B0002FFD2046FFF7B4FE002383F3118838BD7B +:1064C0007047000001F050BD01234022002110B5AB +:1064D000044600F8303BFBF739FF0023C4E90133E1 +:1064E00010BD000010B53023044683F31188242228 +:1064F000416000210C30FBF729FF204601F056FDDA +:1065000002230020237080F3118810BD70B500EBCA +:106510008103054650690E461446DA6018B1102210 +:106520000021FBF713FFA06918B110220021FBF72F +:106530000DFF31462846BDE8704001F03DBE000029 +:1065400083682022002103F0011310B50446836004 +:106550001030FBF7FBFE2046BDE8104001F0B8BE4E +:10656000F0B4012500EB810447898D40E4683D4388 +:10657000A469458123600023A2606360F0BC01F040 +:10658000D5BE0000F0B4012500EB810407898D40E1 +:10659000E4683D436469058123600023A260636071 +:1065A000F0BC01F04BBF000070B50223002504468B +:1065B000242203702946C0F888500C3040F8045C4F +:1065C000FBF7C4FE204684F8705001F089FD636833 +:1065D0001B6823B129462046BDE87040184770BDAE +:1065E0000378052B10B504460AD080F88C300523BB +:1065F000037043681B680BB1042198470023A36014 +:1066000010BD00000178052906D190F88C20436860 +:1066100002701B6803B118477047000070B590F80E +:106620007030044613B1002380F8703004F180020A +:10663000204601F071FE63689B68B3B994F880301E +:1066400013F0600535D00021204602F063F90021E7 +:10665000204602F053F963681B6813B106212046F7 +:106660009847062384F8703070BD2046984700286C +:10667000E4D0B4F88630A26F9A4288BFA36794F939 +:106680008030A56F002B4FF0300380F20381002D86 +:1066900000F0F280092284F8702083F31188002131 +:1066A0002046D4E91D23FFF76DFF002383F31188F3 +:1066B000DAE794F8812003F07F0343EA022340F2F3 +:1066C0000232934200F0C58021D8B3F5807F48D0D4 +:1066D0000DD8012B3FD0022B00F09380002BB2D1BC +:1066E00004F1880262670222A267E367C1E7B3F59B +:1066F000817F00F09B80B3F5407FA4D194F8823075 +:10670000012BA0D1B4F8883043F0020332E0B3F596 +:10671000006F4DD017D8B3F5A06F31D0A3F5C0638B +:10672000012B90D86368204694F882205E6894F824 +:106730008310B4F88430B047002884D0436863677E +:106740000368A3671AE0B3F5106F36D040F6024233 +:1067500093427FF478AF5C4B63670223A367002307 +:10676000C3E794F88230012B7FF46DAFB4F8883022 +:1067700023F00203A4F88830C4E91D55E56778E7E3 +:10678000B4F88030B3F5A06F0ED194F88230204673 +:1067900084F88A3001F002FD63681B6813B101219F +:1067A00020469847032323700023C4E91D339CE748 +:1067B00004F18B0363670123C3E72378042B10D113 +:1067C000302383F311882046FFF7BAFE85F3118842 +:1067D0000321636884F88B5021701B680BB120463D +:1067E000984794F88230002BDED084F88B30042355 +:1067F000237063681B68002BD6D00221204698477F +:10680000D2E794F8843020461D0603F00F010AD524 +:1068100001F074FD012804D002287FF414AF2B4B43 +:106820009AE72B4B98E701F05BFDF3E794F8823091 +:10683000002B7FF408AF94F8843013F00F01B3D02D +:106840001A06204602D502F07DF8ADE702F06EF898 +:10685000AAE794F88230002B7FF4F5AE94F88430E8 +:1068600013F00F01A0D01B06204602D502F052F80B +:106870009AE702F043F897E7142284F8702083F334 +:1068800011882B462A4629462046FFF769FE85F3E4 +:106890001188E9E65DB1152284F8702083F3118830 +:1068A00000212046D4E91D23FFF75AFEFDE60B2206 +:1068B00084F8702083F311882B462A462946204607 +:1068C000FFF760FEE3E700BFF89E0008F09E0008B7 +:1068D000F49E000838B590F870300446002B3ED086 +:1068E000063BDAB20F2A34D80F2B32D8DFE803F098 +:1068F00037313108223231313131313131313737AD +:10690000856FB0F886309D4214D2C3681B8AB5FBF0 +:10691000F3F203FB12556DB9302383F311882B4634 +:106920002A462946FFF72EFE85F311880A2384F8AC +:1069300070300EE0142384F87030302383F3118814 +:10694000002320461A461946FFF70AFE002383F368 +:10695000118838BDC36F03B198470023E7E70021D2 +:10696000204601F0D7FF0021204601F0C7FF6368F1 +:106970001B6813B10621204698470623D7E700007D +:1069800010B590F870300446142B29D017D8062B78 +:1069900005D001D81BB110BD093B022BFBD800214B +:1069A000204601F0B7FF0021204601F0A7FF6368F1 +:1069B0001B6813B1062120469847062319E0152BC2 +:1069C000E9D10B2380F87030302383F31188002342 +:1069D0001A461946FFF7D6FD002383F31188DAE73C +:1069E000C3689B695B68002BD5D1C36F03B198471F +:1069F000002384F87030CEE70023826880F82430CA +:106A000083691B6899689142FBD25A6803604260AF +:106A100010605860704700000023826880F82430BE +:106A200083691B6899689142FBD85A680360426089 +:106A3000106058607047000008B50846302383F3A3 +:106A4000118891F82430032B05D0042B0DD02BB9DD +:106A500083F3118808BD8B6A00221A604FF0FF3360 +:106A60008362FFF7C9FF0023F2E7D1E90032136028 +:106A70005A60F3E7034610B51B68984203D09C6840 +:106A80008A689442F8D25A680B604A601160596073 +:106A900010BD0000FFF7B0BF064BD96881F8240095 +:106AA0001868026853601A600122D86080F82420B8 +:106AB000F9F7A8BCC84600200C4B30B5DD684B1C6C +:106AC00087B004460FD02B46094A684600F09CF96F +:106AD0002046FFF7E1FF009B13B1684600F09EF9E6 +:106AE000A86A07B030BDFFF7D7FFF9E7C846002016 +:106AF000396A0008044B1A68DB6890689B68984202 +:106B000094BF002001207047C8460020094B10B5F3 +:106B10001C68D868226853601A600122DC6084F81F +:106B20002420FFF779FF01462046BDE81040F9F721 +:106B300069BC00BFC8460020044B1A68DB68926835 +:106B40009B689A4201D9FFF7E1BF7047C846002011 +:106B500038B50123084C00252370656002F0F0FB76 +:106B600002F016FC0549064802F0ECFC02232370F3 +:106B700085F3118838BD00BF70490020009F0008D0 +:106B8000C846002000F080B9034A516853685B1A78 +:106B90009842FBD8704700BF001000E08B604B6349 +:106BA0000023CA6100F128020B6302230A618B846F +:106BB0000123886181F8263001F11003C26A4A611D +:106BC0001360C36201F12C030846CB6270470000DA +:106BD000D0E90131026841F8183CA1F19C03383931 +:106BE000CB60036941F8243C436941F8203C034BE6 +:106BF00041F8043CC3680248FFF7D0BF1D040008F9 +:106C0000C846002008B5FFF7E3FFBDE80840FFF7DE +:106C100041BF000038B50E4BDC6804F12C05A062C2 +:106C2000E06AA8420FD194F826303BB994F8253099 +:106C30009B0702BFD4E9043213605A600F20BDE8FD +:106C40003840FFF729BF0368E362FFF723FFE7E758 +:106C5000C8460020302383F31188FFF7DBBF000014 +:106C600008B50146302383F311880820FFF724FF7D +:106C7000002383F3118808BD054BDB6821B1036055 +:106C800098620320FFF718BF4FF0FF30704700BF36 +:106C9000C846002003682BB10022026018469962A2 +:106CA000FFF7F8BE70470000064BDB6839B1426859 +:106CB00018605A60136043600420FFF7FDBE4FF078 +:106CC000FF307047C84600200368984206D01A6813 +:106CD0000260506018469962FFF7DCBE7047000002 +:106CE00038B504460D462068844200D138BD03689B +:106CF00023605C608562FFF7CDFEF4E7036810B5A2 +:106D00009C68A2420CD85C688A600B604C60216071 +:106D1000596099688A1A9A604FF0FF33836010BDFA +:106D2000121B1B68ECE700000A2938BF0A2170B566 +:106D300004460D460A26601902F0FCFA02F0E4FA55 +:106D4000041BA54203D8751C04462E46F3E70A2E01 +:106D500004D90120BDE8704002F0BCBC70BD000049 +:106D6000F8B5144B0D460A2A4FF00A07D96103F112 +:106D70001001826038BF0A2241601969144601601F +:106D800048601861A81802F0C5FA02F0BDFA431B6A +:106D90000646A34206D37C1C28192746354602F036 +:106DA000C9FAF2E70A2F04D90120BDE8F84002F041 +:106DB00091BCF8BDC8460020F8B506460D4602F065 +:106DC000A3FA0F4A134653F8107F9F4206D12A4672 +:106DD00001463046BDE8F840FFF7C2BFD169BB6845 +:106DE000441A2C1928BF2C46A34202D92946FFF782 +:106DF0009BFF224631460348BDE8F840FFF77EBFBF +:106E0000C8460020D8460020C0E90323002310B460 +:106E10005DF8044B4361FFF7CFBF000010B5194C7C +:106E2000236998420DD08168D0E9003213605A601E +:106E30009A680A449A60002303604FF0FF33A3610D +:106E400010BD0268234643F8102F536000220260F1 +:106E500022699A4203D1BDE8104002F065BA9368F6 +:106E600081680B44936002F04FFA2269E1699268ED +:106E7000441AA242E4D91144BDE81040091AFFF7B0 +:106E800053BF00BFC84600202DE9F047DFF8BC80A3 +:106E900008F110072C4ED8F8105002F035FAD8F847 +:106EA0001C40AA68031B9A423ED814444FF00009C4 +:106EB000D5E90032C8F81C4013605A60C5F800904C +:106EC000D8F81030B34201D102F02EFA89F31188BC +:106ED000D5E9033128469847302383F311886B693D +:106EE000002BD8D002F010FA6A69A0EB04098246A0 +:106EF0004A450DD2022002F0EDFB0022D8F81030F6 +:106F0000B34208D151462846BDE8F047FFF728BFF5 +:106F1000121A2244F2E712EB09092946384638BF13 +:106F20004A46FFF7EBFEB5E7D8F81030B34208D079 +:106F30001444C8F81C00211AA960BDE8F047FFF707 +:106F4000F3BEBDE8F08700BFD8460020C846002049 +:106F500038B502F0D9F9054AD2E90845031B1819DA +:106F600045F10001C2E9080138BD00BFC846002054 +:106F700010B560B9074804790368053C9B6818BFE1 +:106F80000124984708B144F00404204610BD0124B0 +:106F9000FBE700BF2C370020FFF7EABF2DE9F047E1 +:106FA000884617469A460446B0B90D4E3579052DE8 +:106FB00005D003240DE0013D15F0FF050ED0326829 +:106FC000534639463046D2F814904246C847002806 +:106FD000F1D12046BDE8F0870424FAE70124F8E760 +:106FE0002C3700202DE9F047884617469A4604467C +:106FF000B0B90D4E3579052D05D003240DE0013DC6 +:1070000015F0FF050ED03268534639463046D2F8A7 +:1070100018904246C8470028F1D12046BDE8F087C5 +:107020000424FAE70124F8E72C37002037B50C4692 +:10703000154670B951B101290BD10748694603685B +:107040001B6A984710B9019B04462B60204603B089 +:1070500030BD0424FAE700BF2C3700200020704721 +:10706000FEE70000704700004FF0FF30704700005F +:107070004B6843608B688360CB68C3600B69436176 +:107080004B6903628B6943620B68036070470000C1 +:1070900008B53C4B40F2FF713B48D3F888200A43C7 +:1070A000C3F88820D3F8882022F4FF6222F0070278 +:1070B000C3F88820D3F88820D3F8E0200A43C3F827 +:1070C000E020D3F808210A43C3F808212F4AD3F857 +:1070D00008311146FFF7CCFF00F5806002F11C017A +:1070E000FFF7C6FF00F5806002F13801FFF7C0FF2F +:1070F00000F5806002F15401FFF7BAFF00F58060EF +:1071000002F17001FFF7B4FF00F5806002F18C011D +:10711000FFF7AEFF00F5806002F1A801FFF7A8FFBE +:1071200000F5806002F1C401FFF7A2FF00F5806066 +:1071300002F1E001FFF79CFF00F5806002F1FC0125 +:10714000FFF796FF02F58C7100F58060FFF790FF66 +:1071500001F090FC0E4BD3F8902242F00102C3F8EC +:107160009022D3F8942242F00102C3F8942205221F +:10717000C3F898204FF06052C3F89C20054AC3F82A +:10718000A02008BD0044025800000258149F0008C7 +:1071900000ED00E01F00080308B501F077FEFFF7DF +:1071A000D7FC104BD3F8DC2042F04002C3F8DC20BF +:1071B000D3F8042122F04002C3F80421D3F80431AB +:1071C000094B1A6842F008021A601A6842F0040279 +:1071D0001A6000F07DFD00F035FBBDE8084000F0CE +:1071E000B5B800BF0044025800180248012070479B +:1071F000002070477047000002290CD0032904D0FA +:107200000129074818BF00207047032A05D8054800 +:1072100000EBC2007047044870470020704700BF71 +:1072200014A10008B8220020C8A0000870B59AB0C8 +:1072300005460846144601A900F0C2F801A8FBF76C +:107240007DF8431C0022C6B25B001046C5E900343D +:1072500023700323023404F8013C01ABD1B20234A1 +:107260008E4201D81AB070BD13F8011B013204F828 +:10727000010C04F8021CF1E708B5302383F31188F0 +:107280000348FFF79BF8002383F3118808BD00BF74 +:107290007849002090F8803003F01F02012A07D1BE +:1072A00090F881200B2A03D10023C0E91D3315E09B +:1072B00003F06003202B08D1B0F884302BB990F88C +:1072C0008120212A03D81F2A04D8FFF759B8222A7F +:1072D000EBD0FAE7034A426707228267C3670120BF +:1072E000704700BFAF22002007B5052917D8DFE897 +:1072F00001F0191603191920302383F31188104A5D +:1073000001210190FFF702F9019802210D4AFFF7D0 +:10731000FDF80D48FFF71EF8002383F3118803B032 +:107320005DF804FB302383F311880748FEF7E8FF7C +:10733000F2E7302383F311880348FEF7FFFFEBE702 +:1073400068A000088CA000087849002038B50C4DD2 +:107350000C4C2A460C4904F10800FFF767FF05F1C1 +:10736000CA0204F110000949FFF760FF05F5CA726F +:1073700004F118000649BDE83840FFF757BF00BFC9 +:1073800050620020B822002048A0000852A0000847 +:107390005DA0000870B5044608460D46FAF7CEFF1A +:1073A000C6B22046013403780BB9184670BD324688 +:1073B0002946FAF7AFFF0028F3D10120F6E70000D5 +:1073C0002DE9F84F05460C46FAF7B8FF2C49C6B22E +:1073D0002846FFF7DFFF08B10236F6B229492846F2 +:1073E000FFF7D8FF08B11036F6B2632E0DD8DFF8DC +:1073F0009080DFF89090244FDFF894A0DFF894B0ED +:107400002E7846B92670BDE8F88F29462046BDE89B +:10741000F84FF9F7FBBB252E2ED10722414628460F +:10742000FAF778FF70B9DBF800300735093444F813 +:10743000093CDBF8043044F8053C9BF8083004F8BC +:10744000013CDDE7082249462846FAF763FF98B970 +:10745000A21C0E4B197802320909C95D02F8041CFE +:1074600013F8011B01F00F015345C95D02F8031C1D +:10747000F0D118340835C3E7013504F8016BBFE7D4 +:1074800034A100085DA0000846A1000800E8F11F33 +:107490000CE8F11F3CA10008BFF34F8F044B1A69A1 +:1074A0005107FCD1D3F810215207F8D1704700BF23 +:1074B0000020005208B50D4B1B78ABB9FFF7ECFF6D +:1074C0000B4BDA68D10704D50A4A5A6002F18832B8 +:1074D0005A60D3F80C21D20706D5064AC3F8042116 +:1074E00002F18832C3F8042108BD00BFAE64002059 +:1074F000002000522301674508B5114B1B78F3B9F2 +:10750000104B1A69510703D5DA6842F04002DA607D +:10751000D3F81021520705D5D3F80C2142F04002D0 +:10752000C3F80C21FFF7B8FF064BDA6842F00102FE +:10753000DA60D3F80C2142F00102C3F80C2108BD37 +:10754000AE640020002000520F289ABF00F5806032 +:1075500040040020704700004FF4003070470000E6 +:10756000102070470F2808B50BD8FFF7EDFF00F586 +:1075700000330268013204D104308342F9D1012082 +:1075800008BD0020FCE700000F2838B505463FD8AD +:10759000FFF782FF1F4CFFF78DFF4FF0FF330728E7 +:1075A0006361C4F814311DD82361FFF775FF03022E +:1075B00043F02403E360E36843F08003E36023695E +:1075C0005A07FCD42846FFF767FFFFF7BDFF4FF4CB +:1075D000003100F0B7FA2846FFF78EFFBDE83840CB +:1075E000FFF7C0BFC4F81031FFF756FFA0F1080342 +:1075F0001B0243F02403C4F80C31D4F80C3143F0DF +:107600008003C4F80C31D4F810315B07FBD4D9E700 +:10761000002038BD002000522DE9F84F05460C46E9 +:10762000104645EA0203DE0602D00020BDE8F88FCE +:1076300020F01F00DFF8BCB0DFF8BCA0FFF73AFF76 +:1076400004EB0008444503D10120FFF755FFEDE7A7 +:10765000202229462046F9F779F810B92035203440 +:10766000F0E72B4605F120021F68791CDDD10433B9 +:107670009A42F9D105F178431B481C4EB3F5801F9F +:107680001B4B38BF184603F1F80332BFD946D14629 +:107690001E46FFF701FF0760A5EB040C336804F1F9 +:1076A0001C0143F002033360231FD9F8007017F068 +:1076B0000507FAD153F8042F8B424CF80320F4D17C +:1076C000BFF34F8FFFF7E8FE4FF0FF332022214634 +:1076D00003602846336823F002033360F9F736F875 +:1076E0000028BBD03846B0E7142100520C200052CD +:1076F00014200052102000521021005210B5084CE6 +:10770000237828B11BB9FFF7D5FE0123237010BDE4 +:10771000002BFCD02070BDE81040FFF7EDBE00BF8D +:10772000AE6400202DE9F04F0D4685B0814658B17A +:1077300011F00D0614BF2022082211F00803019356 +:1077400004D0431E034269D0002435E0002E37D018 +:1077500009F11F0121F01F094FF00108314F05F019 +:107760000403DFF8CCA005EA080BBBF1000F32D010 +:107770007869C0072FD408F101080C37B8F1060F5B +:10778000F3D19EB9284D4946A819019201F022FE75 +:107790000446002839D12036019AA02EF3D149465B +:1077A00001F018FE044600282FD1019A49461F48CF +:1077B00001F010FE044660BB204605B0BDE8F08F26 +:1077C0000029C9D101462846029201F003FE044671 +:1077D000D8B9029AC0E713B178694107CBD5AC0795 +:1077E00002D578698007C6D5019911B1786901077A +:1077F000C1D549460AEB4810CDE9022301F0EAFD64 +:107800000446DDE902230028B5D04A46002120467F +:1078100001E04A460021FAF799FDCDE70246002E25 +:1078200096D199E758A10008F0640020B0640020C8 +:10783000D06400200021FFF775BF00000121FFF791 +:1078400071BF000070B5144D0124144E40F2FF3298 +:1078500000210120FAF77AFD06EB441001342A6971 +:1078600055F80C1F01F0A2FD062CF5D137254FF479 +:10787000C0542046FFF7E2FF014628B122460848DF +:10788000BDE8704001F092BDC4EBC404013D4FEA75 +:10789000D404EED170BD00BF58A10008D064002010 +:1078A000B06400200421FFF73DBF00004843FFF70C +:1078B000C1BF000008B101F0FFBD70470846FFF7E7 +:1078C000B9BF0000B0F5805F10B5044607D8FFF7D8 +:1078D000E9FF28B92046BDE81040FFF7ABBF002004 +:1078E00010BD0000FFF7E6BF70B5AAB140EA010382 +:1078F00013F01F030FD1094C0144A5686D0706D58D +:107900002568A84203D366683544A94204D90333E5 +:107910000C34122BF1D10022104670BD58A1000882 +:1079200008B501F0DFFE034AD2E90032C01842EB8D +:10793000010108BD90650020434BD3E900232DE9E8 +:10794000F34113437CD0FFF7EBFF404A00230027AD +:10795000F8F772FD06460D463D4A0023F8F76CFD28 +:107960000023144630462946394AF8F765FD4FF49E +:1079700061613C23ADF80170B4FBF1F5B4FBF3F6A3 +:1079800001FB154103FB16464624B1FBF3F1314BD5 +:10799000F6B28DF8004098423CD84FF0640C4FF49A +:1079A000C87EA30704F26C7225D1B2FBFCF30CFB7A +:1079B000132313BBB2FBFEF30EFB1322B2FA82F3C6 +:1079C0005B0903F26D18621C8045D2B217D90FB162 +:1079D0008DF800400022204C4FF00C0C17460CFB99 +:1079E0000343D4B2013213F804C084450CD8A0EB91 +:1079F0000C000127F5E70023E3E70123E1E7A0EB13 +:107A0000080014460127CCE70FB18DF80140431C54 +:107A10008DF802309DF80100431C9DF8000050389D +:107A2000400640EA43509DF8023040EA034040EAF5 +:107A3000560040EAC52040EA411002B0BDE8F0819E +:107A40004FF40410F9E700BF9065002040420F009A +:107A50008051010090230B00A0A100080244074BB5 +:107A6000D2B210B5904200D110BD441C00B253F800 +:107A7000200041F8040BE0B2F4E700BF504000588A +:107A80000E4B30B51C6F240405D41C6F1C671C6F93 +:107A900044F400441C670A4C02442368D2B243F405 +:107AA00080732360074B904200D130BD441C51F8D5 +:107AB000045B00B243F82050E0B2F4E700440258FF +:107AC000004802585040005807B5012201A9002083 +:107AD000FFF7C4FF019803B05DF804FB13B504463B +:107AE000FFF7F2FFA04205D0012201A90020019476 +:107AF000FFF7C6FF02B010BD10B56424013C4FF47F +:107B00007A70FFF7ADF814F0FF04F7D10C4B4FF487 +:107B1000801214249A61A3F580634FF08052A3F57C +:107B20004063C3F8182C4FF400529A61013C4FF4A3 +:107B30007A70FFF795F814F0FF04F7D110BD00BF7D +:107B4000001802580144BFF34F8F064B884204D3FC +:107B5000BFF34F8FBFF36F8F7047C3F85C022030C5 +:107B6000F4E700BF00ED00E00144BFF34F8F064B88 +:107B7000884204D3BFF34F8FBFF36F8F7047C3F8B2 +:107B800070022030F4E700BF00ED00E070B505465C +:107B900016460C4601201021FFF788FE2860467328 +:107BA0003CB1204636B1FFF77DFE2B68186000B16E +:107BB0009C6070BDFFF742FEF7E70000F8B50F4686 +:107BC0001546044648B905F11F010126386821F021 +:107BD0001F01FFF7B7FF3046F8BD427B29463868E2 +:107BE000FFF782FE06460028EDD13B686360A3687C +:107BF000AB4210D213B12068FFF75CFE637B2846CE +:107C00002BB1FFF74FFE206020B9A060E3E7FFF73C +:107C100015FEF8E7A560206805F11F01012621F097 +:107C20001F013860FFF78EFF2673D4E710B50446B6 +:107C300040B10068884205D1606808B1FAF760FB7E +:107C40000023237310BD0000F8B50F461446054607 +:107C500048B904F11F010126386821F01F01FFF720 +:107C600083FF3046F8BD427B21463868FFF73CFE73 +:107C700006460028EDD1AB68A34210D213B12868A4 +:107C8000FFF718FE6B7B20462BB1FFF70BFE286039 +:107C900020B9A860E5E7FFF7D1FDF8E7AC603968E7 +:107CA00019B122462868FAF72BFB286804F11F0156 +:107CB000012621F01F013860FFF756FF2E73D0E731 +:107CC00020B103688B4204BF002303737047000098 +:107CD000034B1A681AB9034AD2F8D0241A607047C5 +:107CE000986500200040025808B5FFF7F1FF024BED +:107CF0001868C0F3806008BD98650020EFF3098321 +:107D0000054968334A6B22F001024A6383F309880C +:107D1000002383F31188704700EF00E0302080F3E8 +:107D2000118862B60D4B0E4AD96821F4E06109044E +:107D3000090C0A430B49DA60D3F8FC2042F0807248 +:107D4000C3F8FC20084AC2F8B01F116841F00101D5 +:107D500011602022DA7783F82200704700ED00E0FE +:107D60000003FA0555CEACC5001000E0302310B575 +:107D700083F311880E4B5B6813F4006314D0F1EEAB +:107D8000103AEFF309844FF08073683CE361094BCC +:107D9000DB6B236684F30988FEF7ACFE10B1064B5B +:107DA000A36110BD054BFBE783F31188F9E700BF22 +:107DB00000ED00E000EF00E02F04000832040008AE +:107DC00070B5BFF34F8FBFF36F8F1A4A0021C2F80F +:107DD0005012BFF34F8FBFF36F8F536943F40033DB +:107DE0005361BFF34F8FBFF36F8FC2F88410BFF39F +:107DF0004F8FD2F8803043F6E074C3F3C900C3F369 +:107E00004E335B0103EA0406014646EA81750139F7 +:107E1000C2F86052F9D2203B13F1200FF2D1BFF328 +:107E20004F8F536943F480335361BFF34F8FBFF3D8 +:107E30006F8F70BD00ED00E0FEE70000214B22488F +:107E4000224A70B5904237D3214BC11EDA1C121A58 +:107E500022F003028B4238BF00220021FAF776FAA3 +:107E60001C4A0023C2F88430BFF34F8FD2F8803011 +:107E700043F6E074C3F3C900C3F34E335B0103EA76 +:107E80000406014646EA81750139C2F86C52F9D2FE +:107E9000203B13F1200FF2D1BFF34F8FBFF36F8F51 +:107EA000BFF34F8FBFF36F8F0023C2F85032BFF381 +:107EB0004F8FBFF36F8F70BD53F8041B40F8041B46 +:107EC000C0E700BF08A3000898670020986700205B +:107ED0009867002000ED00E0074BD3F8D81021EAA6 +:107EE0000001C3F8D810D3F8002122EA0002C3F839 +:107EF0000021D3F8003170470044025870B5D0E932 +:107F0000244300224FF0FF359E6804EB42135101D9 +:107F1000D3F80009002805DAD3F8000940F08040C2 +:107F2000C3F80009D3F8000B002805DAD3F8000BDA +:107F300040F08040C3F8000B013263189642C3F84A +:107F40000859C3F8085BE0D24FF00113C4F81C389D +:107F500070BD0000890141F02001016103699B06A9 +:107F6000FCD41220FEF710BE10B50A4C2046FEF7D6 +:107F7000ABFA094BC4F89030084BC4F89430084C65 +:107F80002046FEF7A1FA074BC4F89030064BC4F820 +:107F9000943010BD9C65002000000840DCA1000862 +:107FA0003866002000000440E8A1000870B503789E +:107FB0000546012B5CD1434BD0F89040984258D1F4 +:107FC000414B0E216520D3F8D82042F00062C3F85F +:107FD000D820D3F8002142F00062C3F80021D3F882 +:107FE0000021D3F8802042F00062C3F88020D3F84B +:107FF000802022F00062C3F88020D3F88030FDF7A3 +:10800000A7FC324BE360324BC4F800380023D5F8AC +:108010009060C4F8003EC02323604FF40413A363B0 +:108020003369002BFCDA01230C203361FEF7ACFD31 +:108030003369DB07FCD41220FEF7A6FD3369002B61 +:10804000FCDA00262846A660FFF758FF6B68C4F8E4 +:108050001068DB68C4F81468C4F81C6883BB1D4B47 +:10806000A3614FF0FF336361A36843F00103A36092 +:1080700070BD194B9842C9D1134B4FF08060D3F8B3 +:10808000D82042F00072C3F8D820D3F8002142F083 +:108090000072C3F80021D3F80021D3F8802042F009 +:1080A0000072C3F88020D3F8802022F00072C3F859 +:1080B0008020D3F88030FFF70FFF0E214D209EE780 +:1080C000064BCDE79C650020004402584014004058 +:1080D00003002002003C30C038660020083C30C05D +:1080E000F8B5D0F89040054600214FF000662046D4 +:1080F000FFF730FFD5F8941000234FF001128F687E +:108100004FF0FF30C4F83438C4F81C2804EB431295 +:1081100001339F42C2F80069C2F8006BC2F8080937 +:10812000C2F8080BF2D20B68D5F89020C5F8983049 +:10813000636210231361166916F01006FBD112203A +:10814000FEF722FDD4F8003823F4FE63C4F80038AB +:10815000A36943F4402343F01003A3610923C4F847 +:108160001038C4F814380B4BEB604FF0C043C4F820 +:10817000103B094BC4F8003BC4F81069C4F800393F +:10818000D5F8983003F1100243F48013C5F8982015 +:10819000A362F8BDB8A1000840800010D0F890207C +:1081A00090F88A10D2F8003823F4FE6343EA0113F2 +:1081B000C2F80038704700002DE9F84300EB810356 +:1081C000D0F890500C468046DA680FFA81F94801E1 +:1081D000166806F00306731E022B05EB41134FF0E1 +:1081E000000194BFB604384EC3F8101B4FF00101D4 +:1081F00004F1100398BF06F1805601FA03F3916968 +:1082000098BF06F5004600293AD0578A04F1580174 +:10821000374349016F50D5F81C180B430021C5F8AE +:108220001C382B180127C3F81019A7405369611E89 +:108230009BB3138A928B9B08012A88BF5343D8F8BB +:108240009820981842EA034301F140022146C8F8F9 +:108250009800284605EB82025360FFF77BFE08EB8F +:108260008900C3681B8A43EA845348341E4364016F +:108270002E51D5F81C381F43C5F81C78BDE8F8838B +:1082800005EB4917D7F8001B21F40041C7F8001B84 +:10829000D5F81C1821EA0303C0E704F13F030B4A99 +:1082A0002846214605EB83035A60FFF753FE05EB92 +:1082B0004910D0F8003923F40043C0F80039D5F84C +:1082C0001C3823EA0707D7E70080001000040002EB +:1082D000D0F894201268C0F89820FFF70FBE000075 +:1082E0005831D0F8903049015B5813F4004004D065 +:1082F00013F4001F0CBF0220012070474831D0F852 +:10830000903049015B5813F4004004D013F4001F6F +:108310000CBF02200120704700EB8101CB68196A75 +:108320000B6813604B6853607047000000EB8103DB +:1083300030B5DD68AA691368D36019B9402B84BFD2 +:10834000402313606B8A1468D0F890201C4402EB21 +:108350004110013C09B2B4FBF3F46343033323F04F +:10836000030343EAC44343F0C043C0F8103B2B6807 +:1083700003F00303012B0ED1D2F8083802EB4110B1 +:1083800013F4807FD0F8003B14BF43F0805343F0D8 +:108390000053C0F8003B02EB4112D2F8003B43F01F +:1083A0000443C2F8003B30BD2DE9F041D0F89060A5 +:1083B00005460C4606EB4113D3F8087B3A07C3F891 +:1083C000087B08D5D6F814381B0704D500EB8103C9 +:1083D000DB685B689847FA071FD5D6F81438DB07C7 +:1083E0001BD505EB8403D968CCB98B69488A5A68D8 +:1083F000B2FBF0F600FB16228AB91868DA689042E0 +:108400000DD2121AC3E90024302383F311882146C8 +:108410002846FFF78BFF84F31188BDE8F081012324 +:1084200003FA04F26B8923EA02036B81CB68002B09 +:10843000F3D021462846BDE8F041184700EB810300 +:108440004A0170B5DD68D0F890306C692668E66046 +:1084500056BB1A444FF40020C2F810092A6802F0F3 +:108460000302012A0AB20ED1D3F8080803EB421422 +:1084700010F4807FD4F8000914BF40F0805040F021 +:108480000050C4F8000903EB4212D2F8000940F092 +:108490000440C2F800090122D3F8340802FA01F1BD +:1084A0000143C3F8341870BD19B9402E84BF402071 +:1084B000206020681A442E8A8419013CB4FBF6F42B +:1084C00040EAC44040F00050C6E700002DE9F84300 +:1084D000D0F8906005460C464F0106EB4113D3F8E7 +:1084E000088918F0010FC3F808891CD0D6F8103895 +:1084F000DB0718D500EB8103D3F80CC0DCF814308F +:10850000D3F800E0DA68964530D2A2EB0E024FF0C5 +:1085100000091A60C3F80490302383F31188FFF731 +:108520008DFF89F3118818F0800F1DD0D6F83438EC +:108530000126A640334217D005EB84030134D5F859 +:108540009050D3F80CC0E4B22F44DCF8142005EBB3 +:108550000434D2F800E05168714514D3D5F83438AA +:1085600023EA0606C5F83468BDE8F883012303FA58 +:1085700001F2038923EA02030381DCF80830002BAF +:10858000D1D09847CFE7AEEB0103BCF8100083428F +:1085900028BF0346D7F8180980B2B3EB800FE3D8A1 +:1085A0009068A0F1040959F8048FC4F80080A0EB8A +:1085B00009089844B8F1040FF5D818440B449060AA +:1085C0005360C8E72DE9F84FD0F8905004466E6923 +:1085D000AB691E4016F480586E6103D0BDE8F84FB9 +:1085E000FDF7E2BF002E12DAD5F8003E9B0705D05A +:1085F000D5F8003E23F00303C5F8003ED5F8043853 +:10860000204623F00103C5F80438FDF7FBFF3705CA +:1086100005D52046FFF772FC2046FDF7E1FFB004C8 +:108620000CD5D5F8083813F0060FEB6823F4705317 +:108630000CBF43F4105343F4A053EB6031071BD538 +:108640006368DB681BB9AB6923F00803AB6123786F +:10865000052B0CD1D5F8003E9A0705D0D5F8003E81 +:1086600023F00303C5F8003E2046FDF7CBFF636807 +:10867000DB680BB120469847F30200F1BA80B702DD +:1086800026D5D4F8909000274FF0010A09EB471245 +:10869000D2F8003B03F44023B3F5802F11D1D2F878 +:1086A000003B002B0DDA62890AFA07F322EA030382 +:1086B000638104EB8703DB68DB6813B1394620462E +:1086C00098470137D4F89430FFB29B689F42DDD9B8 +:1086D000F00619D5D4F89000026AC2F30A1702F026 +:1086E0000F0302F4F012B2F5802F00F0CA80B2F549 +:1086F000402F09D104EB8303002200F58050DB6892 +:108700001B6A974240F0B0803003D5F8185835D531 +:10871000E90303D500212046FFF746FEAA0303D54F +:1087200001212046FFF740FE6B0303D502212046BE +:10873000FFF73AFE2F0303D503212046FFF734FE4F +:10874000E80203D504212046FFF72EFEA90203D537 +:1087500005212046FFF728FE6A0203D506212046A0 +:10876000FFF722FE2B0203D507212046FFF71CFE50 +:10877000EF0103D508212046FFF716FE700340F1F4 +:10878000A780E90703D500212046FFF79FFEAA072F +:1087900003D501212046FFF799FE6B0703D502217F +:1087A0002046FFF793FE2F0703D503212046FFF74E +:1087B0008DFEEE0603D504212046FFF787FEA806AE +:1087C00003D505212046FFF781FE690603D5062162 +:1087D0002046FFF77BFE2A0603D507212046FFF738 +:1087E00075FEEB0574D520460821BDE8F84FFFF76C +:1087F0006DBED4F890904FF0000B4FF0010AD4F802 +:1088000094305FFA8BF79B689F423FF638AF09EBD5 +:108810004713D3F8002902F44022B2F5802F20D16B +:10882000D3F80029002A1CDAD3F8002942F090423C +:10883000C3F80029D3F80029002AFBDB3946D4F815 +:108840009000FFF787FB22890AFA07F322EA030365 +:10885000238104EB8703DB689B6813B1394620460C +:1088600098470BF1010BCAE7910701D1D0F80080BE +:10887000072A02F101029CBF03F8018B4FEA182876 +:108880003FE704EB830300F58050DA68D2F818C0A4 +:10889000DCF80820DCE9001CA1EB0C0C00218F4265 +:1088A00008D1DB689B699A683A449A605A683A44EE +:1088B0005A6029E711F0030F01D1D0F800808C45F0 +:1088C00001F1010184BF02F8018B4FEA1828E6E7A5 +:1088D000BDE8F88F08B50348FFF774FEBDE808400F +:1088E000FFF744BA9C65002008B50348FFF76AFE0D +:1088F000BDE80840FFF73ABA38660020D0F890305B +:1089000003EB4111D1F8003B43F40013C1F8003BE5 +:1089100070470000D0F8903003EB4111D1F80039D6 +:1089200043F40013C1F8003970470000D0F89030CC +:1089300003EB4111D1F8003B23F40013C1F8003BD5 +:1089400070470000D0F8903003EB4111D1F80039A6 +:1089500023F40013C1F8003970470000064BD3F828 +:10896000DC200243C3F8DC20D3F804211043C3F811 +:108970000401D3F8043170470044025808B53C4B59 +:108980004FF0FF31D3F8802062F00042C3F880201E +:10899000D3F8802002F00042C3F88020D3F8802072 +:1089A000D3F88420C3F88410D3F884200022C3F8BD +:1089B0008420D3F88400D86F40F0FF4040F4FF00DB +:1089C00040F4DF4040F07F00D867D86F20F0FF40D0 +:1089D00020F4FF0020F4DF4020F07F00D867D86F3C +:1089E000D3F888006FEA40506FEA5050C3F888000F +:1089F000D3F88800C0F30A00C3F88800D3F88800D1 +:108A0000D3F89000C3F89010D3F89000C3F89020EA +:108A1000D3F89000D3F89400C3F89410D3F89400DE +:108A2000C3F89420D3F89400D3F89800C3F89810B2 +:108A3000D3F89800C3F89820D3F89800D3F88C00A6 +:108A4000C3F88C10D3F88C00C3F88C20D3F88C00BA +:108A5000D3F89C00C3F89C10D3F89C10C3F89C205A +:108A6000D3F89C30FCF722FABDE8084000F0D6B9F4 +:108A70000044025808B50122534BC3F80821534B58 +:108A8000D3F8F42042F00202C3F8F420D3F81C21FA +:108A900042F00202C3F81C210222D3F81C314C4BD5 +:108AA000DA605A689104FCD54A4A1A6001229A6039 +:108AB000494ADA6000221A614FF440429A61444BFD +:108AC0009A699204FCD51A6842F480721A603F4B8E +:108AD0001A6F12F4407F04D04FF480321A670022DC +:108AE0001A671A6842F001021A60384B1A68500778 +:108AF000FCD500221A611A6912F03802FBD101215B +:108B000019604FF0804159605A67344ADA62344A3A +:108B10001A611A6842F480321A602C4B1A68910369 +:108B2000FCD51A6842F480521A601A689204FCD587 +:108B30002C4A2D499A6200225A63196301F57C017F +:108B4000DA6301F2E71199635A64284A1A64284AE1 +:108B5000DA621A6842F0A8521A601C4B1A6802F0D6 +:108B60002852B2F1285FF9D148229A614FF4886205 +:108B7000DA6140221A621F4ADA641F4A1A651F4AE4 +:108B80005A651F4A9A6532231E4A1360136803F020 +:108B90000F03022BFAD10D4A136943F0030313614B +:108BA000136903F03803182BFAD14FF00050FFF788 +:108BB000D5FE4FF08040FFF7D1FE4FF00040BDE8FA +:108BC0000840FFF7CBBE00BF0080005100440258B0 +:108BD0000048025800C000F0020000010000FF0140 +:108BE000008890082220400063020901470E050812 +:108BF000DD0BBF0120000020000001100910E00083 +:108C000000010110002000524FF0B04208B5D2F828 +:108C1000883003F00103C2F8883023B1044A136896 +:108C20000BB150689847BDE80840FFF79FB800BFF8 +:108C3000146700204FF0B04208B5D2F8883003F036 +:108C40000203C2F8883023B1044A93680BB1D0689C +:108C50009847BDE80840FFF789B800BF14670020B7 +:108C60004FF0B04208B5D2F8883003F00403C2F8E0 +:108C7000883023B1044A13690BB150699847BDE8A5 +:108C80000840FFF773B800BF146700204FF0B042F0 +:108C900008B5D2F8883003F00803C2F8883023B151 +:108CA000044A93690BB1D0699847BDE80840FFF7C3 +:108CB0005DB800BF146700204FF0B04208B5D2F88D +:108CC000883003F01003C2F8883023B1044A136AD5 +:108CD0000BB1506A9847BDE80840FFF747B800BF9E +:108CE000146700204FF0B04310B5D3F8884004F467 +:108CF0007872C3F88820A30604D5124A936A0BB190 +:108D0000D06A9847600604D50E4A136B0BB1506BBE +:108D10009847210604D50B4A936B0BB1D06B98474B +:108D2000E20504D5074A136C0BB1506C9847A305B4 +:108D300004D5044A936C0BB1D06C9847BDE8104041 +:108D4000FFF714B8146700204FF0B04310B5D3F804 +:108D5000884004F47C42C3F88820620504D5164A92 +:108D6000136D0BB1506D9847230504D5124A936DCE +:108D70000BB1D06D9847E00404D50F4A136E0BB1C8 +:108D8000506E9847A10404D50B4A936E0BB1D06E78 +:108D90009847620404D5084A136F0BB1506F984787 +:108DA000230404D5044A936F0BB1D06F9847BDE8F4 +:108DB0001040FEF7DBBF00BF1467002008B5034872 +:108DC000FCF73CFCBDE80840FEF7D0BF2C37002084 +:108DD00008B50348FCF736FDBDE80840FEF7C6BFFE +:108DE0008439002008B50348FCF72CFDBDE8084095 +:108DF000FEF7BCBFF039002008B50348FCF722FDA0 +:108E0000BDE80840FEF7B2BF5C3A002008B500F0AC +:108E1000BDFCBDE80840FEF7A9BF0000062108B56B +:108E20000846FCF795FD06210720FCF791FD062179 +:108E30000820FCF78DFD06210920FCF789FD06219D +:108E40000A20FCF785FD06211720FCF781FD06218D +:108E50002820FCF77DFD09217A20FCF779FD092106 +:108E60007C20FCF775FD07213220FCF771FD0C21F9 +:108E70002720FCF76DFD0C213520FCF769FD0C2146 +:108E80005220BDE80840FCF763BD000008B5FFF7BD +:108E900075FD00F043FCFDF73BF9FDF7D9F8FDF750 +:108EA00011FBFDF7E3F9FEF7A5F9BDE8084000F076 +:108EB00029BA000030B50433039C0172002104FB81 +:108EC0000325C160C0E90653049B0363059BC0E909 +:108ED0000000C0E90422C0E90842C0E90A11436366 +:108EE00030BD00000022416AC260C0E90411C0E93F +:108EF0000A226FF00101FDF7F3BE0000D0E9043251 +:108F0000934201D1C2680AB9181D7047002070470A +:108F1000036919600021C2680132C260C26913444A +:108F200082699342036124BF436A0361FDF7CCBEAB +:108F300038B504460D46E3683BB162690020131D55 +:108F40001268A3621344E36207E0237A33B9294627 +:108F50002046FDF7A9FE0028EDDA38BD6FF00100CC +:108F6000FBE70000C368C269013BC3604369134467 +:108F700082699342436124BF436A43610023836251 +:108F8000036B03B11847704770B53023044683F371 +:108F90001188866A3EB9FFF7CBFF054618B186F304 +:108FA0001188284670BDA36AE26A13F8015B9342F8 +:108FB000A36202D32046FFF7D5FF002383F3118875 +:108FC000EFE700002DE9F84F04460E461746984695 +:108FD0004FF0300989F311880025AA46D4F828B04B +:108FE000BBF1000F09D141462046FFF7A1FF20B198 +:108FF0008BF311882846BDE8F88FD4E90A12A7EB55 +:10900000050B521A934528BF9346BBF1400F1BD95D +:10901000334601F1400251F8040B914243F8040B2E +:10902000F9D1A36A403640354033A362D4E90A231C +:109030009A4202D32046FFF795FF8AF31188BD427A +:10904000D8D289F31188C9E730465A46F9F758F95A +:10905000A36A5E445D445B44A362E7E710B5029CEB +:109060000433017203FB0421C460C0E9061300232A +:10907000C0E90A33039B0363049BC0E90000C0E915 +:109080000422C0E90842436310BD0000026A6FF089 +:109090000101C260426AC0E904220022C0E90A223A +:1090A000FDF71EBED0E904239A4201D1C26822B95D +:1090B000184650F8043B0B60704700231846FAE747 +:1090C000C3680021C2690133C360436913448269E4 +:1090D0009342436124BF436A4361FDF7F5BD00003D +:1090E00038B504460D46E3683BB1236900201A1DDC +:1090F000A262E2691344E36207E0237A33B92946A6 +:109100002046FDF7D1FD0028EDDA38BD6FF00100F3 +:10911000FBE7000003691960C268013AC260C269D6 +:10912000134482699342036124BF436A03610023AD +:109130008362036B03B118477047000070B530239A +:109140000D460446114683F31188866A2EB9FFF74F +:10915000C7FF10B186F3118870BDA36A1D70A36AA2 +:10916000E26A01339342A36204D3E16920460439E1 +:10917000FFF7D0FF002080F31188EDE72DE9F84FCD +:1091800004460D46904699464FF0300A8AF31188FE +:109190000026B346A76A4FB949462046FFF7A0FF0D +:1091A00020B187F311883046BDE8F88FD4E90A076B +:1091B0003A1AA8EB0607974228BF1746402F1BD93B +:1091C00005F1400355F8042B9D4240F8042BF9D1DA +:1091D000A36A40364033A362D4E90A239A4204D3F7 +:1091E000E16920460439FFF795FF8BF31188464566 +:1091F000D9D28AF31188CDE729463A46F9F780F8A3 +:10920000A36A3D443E443B44A362E5E7D0E904231E +:109210009A4217D1C3689BB1836A8BB1043B9B1AF6 +:109220000ED01360C368013BC360C3691A448369ED +:109230009A42026124BF436A0361002383620123CF +:10924000184670470023FBE701F01F03F0B502F05A +:109250001F0456095A1C0123B6EB511F50F8265023 +:1092600003FA02F34FEA511703F1FF333DBF50F801 +:109270002720C4F12000134003EA05003BBF03FA96 +:1092800000F225FA04F0E0401043F0BD70B57E22F4 +:109290007F210546FFF7D8FF18B1012819D000201B +:1092A00070BD3E2249212846FFF7CEFF2F220446FB +:1092B00031212846FFF7C8FF064601345022023606 +:1092C00053212846B440FFF7BFFF093804FA00F0E5 +:1092D000E6E7302245212846FFF7B6FF013080023D +:1092E000DEE7000090F8D63090F8D7201B0403EB9F +:1092F000026390F8D42090F8D500134403EB0020CB +:109300007047000000F018BA014B586A704700BF60 +:10931000000C0040034B002258631A610222DA60FD +:10932000704700BF000C0040014B0022DA6070471C +:10933000000C0040014B5863704700BF000C004018 +:10934000024B034A1A60034A5A607047EC660020D9 +:109350009867002000000220074B494210B55C6866 +:10936000201A08401968821A8A4203D3A24201D8FF +:109370005A6010BD0020FCE7EC66002008B53023E1 +:1093800083F31188FFF7E8FF002383F3118808BDFA +:109390000448054B03600023C0E901330C3000F0A2 +:1093A00017B900BFF46600207D930008CB1D083A72 +:1093B00023F00703591A521A10B4D2080024C0E946 +:1093C000004384600C301C605A605DF8044B00F070 +:1093D000FFB800002DE9F74F364FCD1D8846002815 +:1093E00018BF0746082A4FEAD50538BF082207F1FB +:1093F0000C003C1D9146019000F02CF9019809F1F8 +:109400000701C9F1000E2246246864B900F02CF966 +:109410003B68CBB308224946E8009847044698B316 +:1094200040E9027830E004EB010CD4F804A00CEA27 +:109430000E0C0AF10106ACF1080304EBC6069E42CD +:10944000E1D9A6EB0C0CB5EBEC0F4FEAEC0BDAD83C +:109450009C421DD204F10802AB45A3EB02024FEA85 +:10946000E202626009D9691CED4303EBC1025D446D +:109470005560256843F8315022601C46C3F80480CB +:1094800044F8087B00F0F0F8204603B0BDE8F08F08 +:10949000AA45216802D111602346EEE7013504EBAD +:1094A000C50344F8351003F10801761AF6105E6022 +:1094B0001360F1E7F466002073B50446A0F10805D7 +:1094C00050F8080C54F8043C061D0C30073301908A +:1094D000DB0844F8043C00F0BDF8334601989E4296 +:1094E0001A6801D0AB4228D20AB1954225D244F87D +:1094F000082C54F8042C1D60013254F8081C05EBAC +:10950000C206B14206D14E68324444F8042C0A68BF +:1095100044F8082C5E68711C03EBC1018D4207D131 +:1095200054F8042C013232445A6054F8082C1A6062 +:1095300002B0BDE8704000F097B81346CFE70000D6 +:10954000FEE7000070B51E4B0025044686B058604B +:109550000E4605638163FEF7E1FB04F12803A56075 +:109560006563C4E90A3304F11003C4E904334FF01E +:10957000FF33C4E90044C4E90635FFF7C5FE2B46B6 +:10958000024604F13C012046C4E9082380230D4A29 +:109590006567FDF703FB7368E0600B4A0362012314 +:1095A000009280F824306846F26801923269CDE971 +:1095B0000223064BCDE90435FDF724FB06B070BD50 +:1095C00070490020FCA10008F4A1000841950008A2 +:1095D0000023C0E9000083600361704770B51C4B35 +:1095E00005468468DE685CB3B44213D10369013375 +:1095F000036170BDA36094F8243083B1062B15D1AC +:10960000A06A2146D4E9003213605A60FDF732FAAD +:10961000A36A9C68B368A2689A42EBD306E0D4E9D7 +:109620000032204613605A60FDF734FA284631466E +:10963000FDF720FAB5620620BDE87040FDF72CBAB0 +:109640000369866001330361336BC3603063D0E725 +:10965000C846002008B5302383F31188FFF7BEFF0A +:10966000002383F3118808BD194BD96883688B42A6 +:1096700010B520D1302383F311880269013A0261C9 +:10968000B2B90468C368A0420B631ED04A6B9BB991 +:1096900001238A60036103681A68026050601A6BD4 +:1096A0008360C26018631846FDF7F4F9FDF744FAC9 +:1096B000002383F3118810BD1C68A34203D0A46863 +:1096C000A24238BF2246DB68E1E78260F0E700BFD4 +:1096D000C8460020024A536B18435063704700BFCE +:1096E000C846002038B5EFF311859DB9EFF3058426 +:1096F000C4F30804302334B183F31188FDF728FC48 +:1097000085F3118838BD83F31188FDF721FC84F3BC +:10971000118838BDBDE83840FDF71ABC0023054A62 +:1097200019460133102BC2E9001102F10802F8D1E9 +:10973000704700BF14670020114BD3F8E82042F0B7 +:109740000802C3F8E820D3F8102142F00802C3F859 +:1097500010210C4AD3F81031D36B43F00803D363C4 +:10976000C722094B9A624FF0FF32DA6200229A61F7 +:109770005A63DA605A6001225A611A60704700BF6A +:10978000004402580010005C000C0040094A08B573 +:109790001169D3680B40D9B29B076FEA01011161CF +:1097A00007D5302383F31188FDF7ECF9002383F309 +:1097B000118808BD000C0040FEF77CB8012838BFB6 +:1097C000012010B504462046FEF734F830B900F009 +:1097D00007F808B9F6F7B2FF8047F4E710BD0000BC +:1097E000024B1868BFF35B8F704700BF946700207F +:1097F0004D4435002D2D0A002F6172647570696C1F +:109800006F742E6162696E002F6172647570696C8D +:109810006F742D7665726966792E6162696E002FAC +:109820006172647570696C6F742D666C6173682EFB +:109830006162696E002F6172647570696C6F742D5E +:10984000666C61736865642E6162696E0000000079 +:109850000000000000000000F51400089115000849 +:1098600041170008C915000889150008000000000C +:1098700000000000F11400089D1500087917000889 +:10988000ED140008F914000853544D333248373FA3 +:109890003F3F0053544D3332483733782F373278B7 +:1098A0000053544D3332483734332F3735332F3745 +:1098B0003530000001105A000310590001205800F3 +:1098C000032056002F0000005375636365737366B1 +:1098D000756C6C79206D6F756E74656420534443AC +:1098E0006172642028736C6F77646F776E3D2575A5 +:1098F000290A0000EB76904558464154202020006C +:109900004641543332202020000000002A3A3C3ED9 +:109910007C223F7F002B2C3B3D5B5D004355454146 +:109920004141414345454549494941414592924F4D +:109930004F4F5555594F554F9C4F9E9F41494F553D +:10994000A5A5A6A7A8A9AAABACADAEAFB0B1B2B35E +:10995000B4414141B8B9BABBBCBDBEBFC0C1C2C3AE +:10996000C4C54141C8C9CACBCCCDCECFD1D1454564 +:109970004549494949D9DADBDCDD49DF4FE14F4F41 +:109980004F4FE6E8E85555555959EEEFF0F1F2F32F +:10999000F4F5F6F7F8F9FAFBFCFDFEFF0103050705 +:1099A000090E10121416181C1E00000061001A0384 +:1099B000E0001703F8000703FF0001007801000131 +:1099C000300132010601390110014A012E017901ED +:1099D000060180014D004302810182018201840160 +:1099E000840186018701870189018A018B018B012E +:1099F0008D018E018F0190019101910193019401DC +:109A0000F60196019701980198013D029B019C0186 +:109A10009D0120029F01A001A001A201A201A401B9 +:109A2000A401A601A701A701A901AA01AB01AC01EC +:109A3000AC01AE01AF01AF01B101B201B301B3019D +:109A4000B501B501B701B801B801BA01BB01BC014C +:109A5000BC01BE01F701C001C101C201C301C401C3 +:109A6000C501C401C701C801C701CA01CB01CA01B0 +:109A7000CD011001DD0101008E01DE011201F301B3 +:109A80000300F101F401F401F8012801220212019E +:109A90003A020900652C3B023B023D02662C3F0264 +:109AA00040024102410246020A0153024000810184 +:109AB0008601550289018A0158028F015A029001DC +:109AC0005C025D025E025F02930161026202940128 +:109AD0006402650266026702970196016A02622CBF +:109AE0006C026D026E029C01700271029D01730294 +:109AF00074029F0176027702780279027A027B0271 +:109B00007C02642C7E027F02A60181028202A901EE +:109B10008402850286028702AE014402B101B201CD +:109B200045028D028E028F0290029102B7017B03E3 +:109B30000300FD03FE03FF03AC0304008603880358 +:109B400089038A03B1031103C2030200A303A30321 +:109B5000C4030803CC0303008C038E038F03D803D4 +:109B60001801F2030A00F903F303F403F503F60303 +:109B7000F703F703F903FA03FA0330042003500450 +:109B80001007600422018A043601C1040E01CF04CB +:109B90000100C004D0044401610526040000000057 +:109BA0007D1D0100632C001E9601A01E5A01001F9E +:109BB0000806101F0606201F0806301F0806401F53 +:109BC0000606511F0700591F521F5B1F541F5D1FC0 +:109BD000561F5F1F601F0806701F0E00BA1FBB1FB5 +:109BE000C81FC91FCA1FCB1FDA1FDB1FF81FF91FB1 +:109BF000EA1FEB1FFA1FFB1F801F0806901F0806B5 +:109C0000A01F0806B01F0400B81FB91FB21FBC1F59 +:109C1000CC1F0100C31FD01F0206E01F0206E51F74 +:109C20000100EC1FF31F0100FC1F4E210100322137 +:109C300070211002842101008321D0241A05302CC8 +:109C40002F04602C0201672C0601752C0201802C68 +:109C50006401002D260841FF1A030000C700FC0024 +:109C6000E900E200E400E000E500E700EA00EB00C4 +:109C7000E800EF00EE00EC00C400C500C900E600FB +:109C8000C600F400F600F200FB00F900FF00D60069 +:109C9000DC00F800A300D800D7009201E100ED003D +:109CA000F300FA00F100D100AA00BA00BF00AE0034 +:109CB000AC00BD00BC00A100AB00BB00912592250B +:109CC000932502252425C100C200C000A9006325F8 +:109CD000512557255D25A200A50010251425342502 +:109CE0002C251C2500253C25E300C3005A255425BE +:109CF00069256625602550256C25A400F000D0005C +:109D0000CA00CB00C8003101CD00CE00CF0018251D +:109D10000C2588258425A600CC008025D300DF00F3 +:109D2000D400D200F500D500B500FE00DE00DA0058 +:109D3000DB00D900FD00DD00AF00B400AD00B100D4 +:109D40001720BE00B600A700F700B800B000A800BA +:109D5000B700B900B300B200A025A0001000024077 +:109D6000080002400008024000000B0028000240EA +:109D7000080002400408024006010C0040000240B6 +:109D8000080002400808024010020D00580002407E +:109D9000080002400C08024016030E00700002404A +:109DA0000C0002401008024000040F00880002402E +:109DB0000C0002401408024006051000A0000240FA +:109DC0000C0002401808024010061100B8000240C2 +:109DD0000C0002401C08024016072F00100402402D +:109DE000080402402008024000083800280402400D +:109DF00008040240240802400609390040040240D9 +:109E00000804024028080240100A3A0058040240A0 +:109E1000080402402C080240160B3B00700402406C +:109E20000C04024030080240000C3C008804024050 +:109E30000C04024034080240060D4400A004024015 +:109E40000C04024038080240100E4500B8040240DD +:109E50000C0402403C080240160F460001000000BE +:109E6000000000000096000000000000000000005C +:109E700000000000000000000000000000000000E2 +:109E8000ED710008F1710008E55C00081D60000834 +:109E9000795C0008A15C0008C95C0008615C0008EE +:109EA00000000000D1600008BD600008F9600008F3 +:109EB000E5600008F1600008DD600008C960000886 +:109EC000B56000080561000800000000E9610008B5 +:109ED000D561000811620008FD61000809620008F0 +:109EE000F5610008E1610008CD6100081D6200080D +:109EF00000000000010000000000000063300000CE +:109F0000FC9E000800000000000000004047002008 +:109F1000704900200000802A00020000AAAAAAAA14 +:109F200000000024FFFF00000000000000A00A0065 +:109F3000000200A000000000AAAAAAAA0001005086 +:109F4000FFFF00000000090000000099000000066B +:109F500000000000AAAAAAAA00000001FFFF00005A +:109F6000000000000000080020A00A00000000001F +:109F7000AAAAAAAA10400500FFFF0000000800BB23 +:109F8000770000004014020028000000AAAAAAAA34 +:109F900000000100FFFF00000000000007000000BB +:109FA0000020000100000000AAAAAAAA00100000D8 +:109FB000FFFF0000000000070000000000518000CB +:109FC00000000000AAAAAAAA00404000FFFF00006B +:109FD0000000000000A0000000040040000000009D +:109FE000AAAAAAAA00040040FFFF00000000000087 +:109FF000000000000001150000000000AAAAAAAAA3 +:10A0000000011500FFFF000000000000000000003C +:10A010000000000000000000AAAAAAAA0000000098 +:10A02000FFFF000000000000000000000000000032 +:10A0300000000000AAAAAAAA00000000FFFF00007A +:10A0400000000000000000004172647550696C6FF0 +:10A05000740025424F415244252D424C0025534562 +:10A060005249414C250000000200000000000000A1 +:10A070000964000879640008400040002062002064 +:10A080003062002002000000000000000300000019 +:10A0900000000000C1640008000000001000000083 +:10A0A00040620020000000000100000000000000ED +:10A0B0009C65002001010200E9720008F9710008A6 +:10A0C000957200087972000843000000D0A00008D3 +:10A0D00009024300020100C032090400000102022B +:10A0E00001000524001001052401000104240202DE +:10A0F0000524060001070582030800FF090401008A +:10A10000020A000000070501024000000705810265 +:10A1100040000000120000001CA100081201100104 +:10A120000200004009124157000201020301000031 +:10A130000403090425424F41524425005A65726FB9 +:10A140004F6E655836003031323334353637383952 +:10A150004142434445460000000000200000020048 +:10A1600002000000000000300000040008000000B1 +:10A1700000000024000008000400000000040000AB +:10A1800000FC00000200000000000430008000001D +:10A19000080000000000003800000100010000007D +:10A1A0001F1C1F1E1F1E1F1F1E1F1E1F1F1D1F1EC9 +:10A1B0001F1E1F1F1E1F1E1F000000001D6600081F +:10A1C000D56800088169000840004000D46600207E +:10A1D000D466002001000000E4660020800000003A +:10A1E0004001000008000000000100000010000015 +:10A1F0000800000069646C65000000006D61696E14 +:10A20000002C0438040438080C10141C20242526C3 +:10A2100000000000000064040100040000000000D1 +:10A22000000C0010283034004062FF7F0100000065 +:10A2300004220020000000000000000000000000D8 +:10A24000000000000000000000000000000000000E +:10A2500000000000000000000000000000000000FE +:10A2600000000000000000000000000000000000EE +:10A2700000000000000000000000000000000000DE +:10A2800000000000000000000000000000000000CE +:10A2900000000000E01500000000000000001E00AB +:10A2A00000000000FF000000784900205C3A002018 +:10A2B000F039002084390020000000008898000850 +:10A2C000830400009398000850040000A19800083F +:10A2D00001000000000000000096000000000800DF +:10A2E00096000000000800000400000030A10008F3 +:10A2F000000000000000000000000000000000005E +:08A30000000000000000000055 +:00000001FF diff --git a/Tools/environment_install/install-prereqs-alpine.sh b/Tools/environment_install/install-prereqs-alpine.sh new file mode 100755 index 0000000000..c01da408db --- /dev/null +++ b/Tools/environment_install/install-prereqs-alpine.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env sh +echo "---------- $0 start ----------" +set -e +set -x + +echo "===================================================================" +echo "Warning: This script is not fully tested. Please report any issues." +echo "===================================================================" + + +apk update && apk add --no-cache \ + linux-headers \ + g++ \ + python3 \ + py-future \ + py-pip \ + libxml2-dev \ + libxslt-dev \ + git \ + && ln -sf python3 /usr/bin/python \ + && rm -rf /var/cache/apk/* + +python3 -m pip install --user --no-deps --no-cache-dir empy==3.3.4 pexpect ptyprocess --break-system-packages diff --git a/Tools/environment_install/install-prereqs-arch.sh b/Tools/environment_install/install-prereqs-arch.sh index 394d9ae3b8..8bba1d3608 100755 --- a/Tools/environment_install/install-prereqs-arch.sh +++ b/Tools/environment_install/install-prereqs-arch.sh @@ -26,7 +26,7 @@ BASE_PKGS="base-devel ccache git gsfonts tk wget gcc" SITL_PKGS="python-pip python-setuptools python-wheel python-wxpython opencv python-numpy python-scipy" PX4_PKGS="lib32-glibc zip zlib ncurses" -PYTHON_PKGS="future lxml pymavlink MAVProxy pexpect argparse matplotlib pyparsing geocoder pyserial empy==3.3.4 dronecan setuptools wheel" +PYTHON_PKGS="future lxml pymavlink MAVProxy pexpect argparse matplotlib pyparsing geocoder pyserial empy==3.3.4 dronecan packaging setuptools wheel" # GNU Tools for ARM Embedded Processors # (see https://launchpad.net/gcc-arm-embedded/) diff --git a/Tools/environment_install/install-prereqs-openSUSE-Tumbleweed.sh b/Tools/environment_install/install-prereqs-openSUSE-Tumbleweed.sh index 5895dbdeb5..acc86a9f40 100755 --- a/Tools/environment_install/install-prereqs-openSUSE-Tumbleweed.sh +++ b/Tools/environment_install/install-prereqs-openSUSE-Tumbleweed.sh @@ -105,7 +105,7 @@ if ! grep -Fxq "$SOURCE_LINE" ~/.bashrc; then fi fi -$PIP3 install -U pip setuptools wheel +$PIP3 install -U pip packaging setuptools wheel $PIP3 install -U attrdict3 $PIP3 install -U $PYTHON_PKGS diff --git a/Tools/environment_install/install-prereqs-ubuntu.sh b/Tools/environment_install/install-prereqs-ubuntu.sh index 0aea76a53b..5dece4504f 100755 --- a/Tools/environment_install/install-prereqs-ubuntu.sh +++ b/Tools/environment_install/install-prereqs-ubuntu.sh @@ -399,8 +399,12 @@ if [ -n "$PYTHON_VENV_PACKAGE" ]; then fi fi -# try update setuptools and wheel before installing pip package that may need compilation -$PIP install $PIP_USER_ARGUMENT -U pip setuptools wheel +# try update packaging, setuptools and wheel before installing pip package that may need compilation +SETUPTOOLS="setuptools" +if [ ${RELEASE_CODENAME} == 'focal' ]; then + SETUPTOOLS=setuptools==70.3.0 +fi +$PIP install $PIP_USER_ARGUMENT -U pip packaging $SETUPTOOLS wheel if [ "$GITHUB_ACTIONS" == "true" ]; then PIP_USER_ARGUMENT+=" --progress-bar off" @@ -414,7 +418,11 @@ if [ ${RELEASE_CODENAME} == 'bookworm' ] || $PIP install $PIP_USER_ARGUMENT -U attrdict3 fi -$PIP install $PIP_USER_ARGUMENT -U $PYTHON_PKGS +# install Python packages one-at-a-time so it is clear which package +# is causing problems: +for PACKAGE in $PYTHON_PKGS; do + $PIP install $PIP_USER_ARGUMENT -U $PACKAGE +done if [[ -z "${DO_AP_STM_ENV}" ]] && maybe_prompt_user "Install ArduPilot STM32 toolchain [N/y]?" ; then DO_AP_STM_ENV=1 diff --git a/Tools/ros2/README.md b/Tools/ros2/README.md index 8c13f6275f..a4e660027a 100644 --- a/Tools/ros2/README.md +++ b/Tools/ros2/README.md @@ -1,12 +1,12 @@ # ArduPilot ROS 2 packages - This directory contains ROS 2 packages and configuration files for running - ROS 2 processes and nodes that communicate with the ArduPilot DDS client - library using the microROS agent. It contains the following packages: +This directory contains ROS 2 packages and configuration files for running +ROS 2 processes and nodes that communicate with the ArduPilot DDS client +library using the microROS agent. It contains the following packages: #### `ardupilot_sitl` -A `colcon` package for building and running ArduPilot SITL using the ROS 2 CLI. +This is a `colcon` package for building and running ArduPilot SITL using the ROS 2 CLI. For example `ardurover` SITL may be launched with: ```bash @@ -21,6 +21,14 @@ For example, MAVProxy can be launched, and you can enable the `console` and `map ros2 launch ardupilot_sitl sitl_mavproxy.launch.py map:=True console:=True ``` +ArduPilot SITL does not yet expose all arguments from the underlying binary. +See [#27714](https://github.com/ArduPilot/ardupilot/issues/27714) for context. + +To see all current options, use the `-s` argument: +```bash +ros2 launch ardupilot_sitl sitl.launch.py -s +``` + #### `ardupilot_dds_test` A `colcon` package for testing communication between `micro_ros_agent` and the @@ -38,7 +46,7 @@ The packages depend on: #### 1. Create a workspace folder ```bash -mkdir -p ~/ros_ws/src && cd ~/ros_ws/src +mkdir -p ~/ros2_ws/src && cd ~/ros2_ws/src ``` The ROS 2 tutorials contain more details regarding [ROS 2 workspaces](https://docs.ros.org/en/humble/Tutorials/Workspace/Creating-A-Workspace.html). @@ -54,7 +62,7 @@ vcs import --recursive < ros2.repos #### 3. Update dependencies ```bash -cd ~/ros_ws +cd ~/ros2_ws source /opt/ros/humble/setup.bash sudo apt update rosdep update @@ -72,7 +80,7 @@ ROS_DISTRO=humble ``` ```bash -cd ~/ros_ws +cd ~/ros2_ws colcon build --cmake-args -DBUILD_TESTING=ON ``` @@ -92,7 +100,7 @@ must be built from source and additional compiler flags are needed. #### 1. Create a workspace folder ```bash -mkdir -p ~/ros_ws/src && cd ~/ros_ws/src +mkdir -p ~/ros2_ws/src && cd ~/ros2_ws/src ``` #### 2. Get the `ros2_macos.repos` file @@ -108,7 +116,7 @@ vcs import --recursive < ros2_macos.repos #### 3. Update dependencies ```bash -cd ~/ros_ws +cd ~/ros2_ws source /{path_to_your_ros_distro_workspace}/install/setup.zsh ``` diff --git a/Tools/ros2/ardupilot_dds_tests/package.xml b/Tools/ros2/ardupilot_dds_tests/package.xml index b4cc9fa2a0..528f4794a1 100644 --- a/Tools/ros2/ardupilot_dds_tests/package.xml +++ b/Tools/ros2/ardupilot_dds_tests/package.xml @@ -27,12 +27,15 @@ ament_lint_auto ardupilot_msgs ardupilot_sitl + builtin_interfaces launch launch_pytest launch_ros micro_ros_msgs python3-pytest rclpy + sensor_msgs + ament_python diff --git a/Tools/ros2/ardupilot_sitl/package.xml b/Tools/ros2/ardupilot_sitl/package.xml index 5cc0abfd72..fd1cc359ed 100644 --- a/Tools/ros2/ardupilot_sitl/package.xml +++ b/Tools/ros2/ardupilot_sitl/package.xml @@ -11,7 +11,15 @@ ament_cmake ament_cmake_python + ardupilot_msgs + builtin_interfaces + geographic_msgs + geometry_msgs micro_ros_agent + rosgraph_msgs + sensor_msgs + std_msgs + tf2_msgs ament_lint_auto ament_cmake_black diff --git a/Tools/scripts/build_options.py b/Tools/scripts/build_options.py index a71c545846..f07483c727 100644 --- a/Tools/scripts/build_options.py +++ b/Tools/scripts/build_options.py @@ -34,6 +34,7 @@ BUILD_OPTIONS = [ Feature('AHRS', 'MicroStrain5', 'AP_EXTERNAL_AHRS_MICROSTRAIN5_ENABLED', 'Enable MICROSTRAIN 5-series External AHRS', 0, "AHRS_EXT"), # noqa: E501 Feature('AHRS', 'MicroStrain7', 'AP_EXTERNAL_AHRS_MICROSTRAIN7_ENABLED', 'Enable MICROSTRAIN 7-series External AHRS', 0, "AHRS_EXT"), # noqa: E501 Feature('AHRS', 'AHRS_EXT_VECTORNAV', 'AP_EXTERNAL_AHRS_VECTORNAV_ENABLED', 'Enable VectorNav External AHRS', 0, "AHRS_EXT"), # noqa + Feature('AHRS', 'InertialLabs', 'AP_EXTERNAL_AHRS_INERTIALLABS_ENABLED', 'Enable InertialLabs External AHRS', 0, "AHRS_EXT"), # noqa Feature('AHRS', 'TEMPCAL', 'HAL_INS_TEMPERATURE_CAL_ENABLE', 'Enable IMU Temperature Calibration', 0, None), Feature('AHRS', 'VISUALODOM', 'HAL_VISUALODOM_ENABLED', 'Enable Visual Odometry', 0, 'EKF3_EXTNAV'), Feature('AHRS', 'EKF3_EXTNAV', 'EK3_FEATURE_EXTERNAL_NAV', 'Enable External Navigation for EKF3', 0, 'EKF3'), @@ -73,7 +74,9 @@ BUILD_OPTIONS = [ Feature('Telemetry', 'FrSky D', 'AP_FRSKY_D_TELEM_ENABLED', 'Enable FrSkyD Telemetry', 0, 'FrSky'), Feature('Telemetry', 'FrSky SPort', 'AP_FRSKY_SPORT_TELEM_ENABLED', 'Enable FrSkySPort Telemetry', 0, 'FrSky'), # noqa Feature('Telemetry', 'FrSky SPort PassThrough', 'AP_FRSKY_SPORT_PASSTHROUGH_ENABLED', 'Enable FrSkySPort PassThrough Telemetry', 0, 'FrSky SPort,FrSky'), # noqa + Feature('Telemetry', 'Bidirectional FrSky Telemetry', 'HAL_WITH_FRSKY_TELEM_BIDIRECTIONAL', 'Enable Bidirectional FrSky telemetry', 0, 'FrSky SPort'), # noqa Feature('Telemetry', 'GHST', 'AP_GHST_TELEM_ENABLED', 'Enable Ghost Telemetry', 0, "RC_GHST"), # noqa + Feature('Telemetry', 'i-BUS', 'AP_IBUS_TELEM_ENABLED', 'Enable i-BUS Telemetry', 0, None), Feature('Notify', 'PLAY_TUNE', 'AP_NOTIFY_MAVLINK_PLAY_TUNE_SUPPORT_ENABLED', 'Enable MAVLink Play Tune', 0, None), # noqa Feature('Notify', 'TONEALARM', 'AP_NOTIFY_TONEALARM_ENABLED', 'Enable ToneAlarm on PWM', 0, None), # noqa @@ -121,6 +124,8 @@ BUILD_OPTIONS = [ Feature('ESC', 'PICCOLOCAN', 'HAL_PICCOLO_CAN_ENABLE', 'Enable PiccoloCAN', 0, None), Feature('ESC', 'TORQEEDO', 'HAL_TORQEEDO_ENABLED', 'Enable Torqeedo Motors', 0, None), + Feature('ESC', 'ESC_EXTENDED_TELM', 'AP_EXTENDED_ESC_TELEM_ENABLED', 'Enable Extended ESC Telem', 0, 'DroneCAN'), + Feature('AP_Periph', 'LONG_TEXT', 'HAL_PERIPH_SUPPORT_LONG_CAN_PRINTF', 'Enable extended length text strings', 0, None), Feature('Camera', 'Camera', 'AP_CAMERA_ENABLED', 'Enable Camera Trigger support', 0, None), @@ -144,6 +149,8 @@ BUILD_OPTIONS = [ Feature('Copter', 'MODE_FLIP', 'MODE_FLIP_ENABLED', 'Enable Mode Flip', 0, None), Feature('Copter', 'MODE_BRAKE', 'MODE_BRAKE_ENABLED', 'Enable Mode Brake', 0, None), + Feature('Rover', 'ROVER_ADVANCED_FAILSAFE', 'AP_ROVER_ADVANCED_FAILSAFE_ENABLED', 'Enable Advanced Failsafe', 0, None), + Feature('Mission', 'MISSION_NAV_PAYLOAD_PLACE', 'AP_MISSION_NAV_PAYLOAD_PLACE_ENABLED', 'Enable handling of NAV_PAYLOAD_PLACE mission items', 0, None), # noqa Feature('Copter', 'AC_PAYLOAD_PLACE_ENABLED', 'AC_PAYLOAD_PLACE_ENABLED', 'Enable Payload Place flight behaviour', 0, 'MISSION_NAV_PAYLOAD_PLACE'), # noqa @@ -163,7 +170,7 @@ BUILD_OPTIONS = [ Feature('Compass', 'QMC5883L', 'AP_COMPASS_QMC5883L_ENABLED', 'Enable QMC5883L compasses', 1, None), Feature('Compass', 'RM3100', 'AP_COMPASS_RM3100_ENABLED', 'Enable RM3100 compasses', 1, None), Feature('Compass', 'DRONECAN_COMPASS', 'AP_COMPASS_DRONECAN_ENABLED', 'Enable DroneCAN compasses', 0, "DroneCAN"), - Feature('Compass', 'DRONECAN_COMPASS_HIRES', 'AP_COMPASS_DRONECAN_HIRES_ENABLED', 'Enable DroneCAN HiRes compasses for survey logging', 0, "DroneCAN"), # noqa + Feature('Compass', 'DRONECAN_COMPASS_HIRES', 'AP_COMPASS_DRONECAN_HIRES_ENABLED', 'Enable DroneCAN HiRes compasses for survey logging', 0, "DroneCAN,DRONECAN_COMPASS"), # noqa Feature('Compass', 'FixedYawCal', 'AP_COMPASS_CALIBRATION_FIXED_YAW_ENABLED', 'Enable Fixed-Yaw Compass Calibration', 1, None), # noqa Feature('Compass', 'CompassLearn', 'COMPASS_LEARN_ENABLED', 'Enable In-Flight Compass Learning', 1, "FixedYawCal"), @@ -175,6 +182,7 @@ BUILD_OPTIONS = [ Feature('Gimbal', 'SOLOGIMBAL', 'HAL_SOLO_GIMBAL_ENABLED', 'Enable Solo Gimbal', 0, "MOUNT"), Feature('Gimbal', 'STORM32_MAVLINK', 'HAL_MOUNT_STORM32MAVLINK_ENABLED', 'Enable SToRM32 MAVLink Gimbal', 0, "MOUNT"), Feature('Gimbal', 'STORM32_SERIAL', 'HAL_MOUNT_STORM32SERIAL_ENABLED', 'Enable SToRM32 Serial Gimbal', 0, "MOUNT"), + Feature('Gimbal', 'TOPOTEK', 'HAL_MOUNT_TOPOTEK_ENABLED', 'Enable Topotek Gimbal', 0, "MOUNT"), Feature('Gimbal', 'XACTI', 'HAL_MOUNT_XACTI_ENABLED', 'Enable Xacti Gimbal', 0, "MOUNT,DroneCAN"), Feature('Gimbal', 'VIEWPRO', 'HAL_MOUNT_VIEWPRO_ENABLED', 'Enable Viewpro Gimbal', 0, "MOUNT"), @@ -190,6 +198,9 @@ BUILD_OPTIONS = [ Feature('Payload', 'SPRAYER', 'HAL_SPRAYER_ENABLED', 'Enable Sprayer', 0, None), Feature('Payload', 'LANDING_GEAR', 'AP_LANDINGGEAR_ENABLED', 'Enable Landing Gear', 0, None), Feature('Payload', 'WINCH', 'AP_WINCH_ENABLED', 'Enable Winch', 0, None), + Feature('Payload', 'WINCH_DAIWA', 'AP_WINCH_DAIWA_ENABLED', 'Enable DAIWA Winch support', 0, 'WINCH'), + Feature('Payload', 'WINCH_PWM', 'AP_WINCH_PWM_ENABLED', 'Enable PWM Winch support', 0, 'WINCH'), + Feature('Payload', 'RELAY', 'AP_RELAY_ENABLED', 'Enable Relay support', 0, None), Feature('Payload', 'SERVORELAY_EVENTS', 'AP_SERVORELAYEVENTS_ENABLED', 'Enable Servo/Relay Event support', 0, None), @@ -200,6 +211,7 @@ BUILD_OPTIONS = [ Feature('Plane', 'QAUTOTUNE', 'QAUTOTUNE_ENABLED', 'Enable QuadPlane Autotune mode', 0, "QUADPLANE"), Feature('Plane', 'PLANE_BLACKBOX', 'AP_PLANE_BLACKBOX_LOGGING', 'Enable blackbox logging', 0, None), Feature('Plane', 'AP_TX_TUNING', 'AP_TUNING_ENABLED', 'Enable TX-based tuning parameter adjustments', 0, None), + Feature('Plane', 'PLANE_GUIDED_SLEW', 'AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED', 'Enable offboard-guided slew commands', 0, None), # noqa:401 Feature('RC', 'RC_Protocol', 'AP_RCPROTOCOL_ENABLED', "Enable Serial RC Protocol support", 0, None), # NOQA: E501 Feature('RC', 'RC_CRSF', 'AP_RCPROTOCOL_CRSF_ENABLED', "Enable CRSF RC Protocol", 0, "RC_Protocol"), # NOQA: E501 @@ -212,6 +224,7 @@ BUILD_OPTIONS = [ Feature('RC', 'RC_SUMD', 'AP_RCPROTOCOL_SUMD_ENABLED', "Enable SUMD RC Protocol", 0, "RC_Protocol"), # NOQA: E501 Feature('RC', 'RC_GHST', 'AP_RCPROTOCOL_GHST_ENABLED', "Enable Ghost RC Protocol", 0, "RC_Protocol"), # NOQA: E501 Feature('RC', 'RC_MAVLINK_RADIO', 'AP_RCPROTOCOL_MAVLINK_RADIO_ENABLED', "Enable MAVLink RC Protocol", 0, "RC_Protocol"), # NOQA: E501 + Feature('RC', 'RSSI', 'AP_RSSI_ENABLED', 'Enable RSSI handling library', 0, None), Feature('Rangefinder', 'RANGEFINDER', 'AP_RANGEFINDER_ENABLED', "Enable Rangefinders", 0, None), # NOQA: E501 Feature('Rangefinder', 'RANGEFINDER_ANALOG', 'AP_RANGEFINDER_ANALOG_ENABLED', "Enable Rangefinder - Analog", 0, "RANGEFINDER"), # NOQA: E501 @@ -291,6 +304,7 @@ BUILD_OPTIONS = [ Feature('Baro', 'ICP101XX', 'AP_BARO_ICP101XX_ENABLED', 'Enable ICP101XX Barometric Sensor', 0, None), Feature('Baro', 'ICP201XX', 'AP_BARO_ICP201XX_ENABLED', 'Enable ICP201XX Barometric Sensor', 0, None), Feature('Baro', 'BARO_TEMPCAL', 'AP_TEMPCALIBRATION_ENABLED', 'Enable Baro Temperature Calibration', 0, None), + Feature('Baro', 'BARO_PROBEXT', 'AP_BARO_PROBE_EXTERNAL_I2C_BUSES', 'Enable Probing of External i2c buses', 0, None), Feature('Sensors', 'RPM', 'AP_RPM_ENABLED', 'Enable RPM sensors', 0, None), Feature('Sensors', 'RPM_EFI', 'AP_RPM_EFI_ENABLED', 'Enable RPM EFI sensors', 0, 'RPM,EFI'), @@ -315,7 +329,8 @@ BUILD_OPTIONS = [ Feature('Other', 'NMEA_OUTPUT', 'HAL_NMEA_OUTPUT_ENABLED', 'Enable NMEA Output', 0, None), Feature('Other', 'SDCARD_FORMATTING', 'AP_FILESYSTEM_FORMAT_ENABLED', 'Enable formatting of microSD cards', 0, None), Feature('Other', 'BOOTLOADER_FLASHING', 'AP_BOOTLOADER_FLASHING_ENABLED', 'Enable Bootloader flashing', 0, "FILESYSTEM_ROMFS"), # noqa - Feature('Other', 'SCRIPTING', 'AP_SCRIPTING_ENABLED', 'Enable LUA Scripting', 0, None), + Feature('Other', 'SCRIPTING', 'AP_SCRIPTING_ENABLED', 'Enable Lua scripting', 0, None), + Feature('Other', 'SCRIPTING_SERIALDEVICE', 'AP_SCRIPTING_SERIALDEVICE_ENABLED', 'Enable Lua serial device simulation', 0, "SCRIPTING"), # noqa Feature('Other', 'SLCAN', 'AP_CAN_SLCAN_ENABLED', 'Enable SLCAN serial protocol', 0, None), Feature('Other', 'SDCARD_MISSION', 'AP_SDCARD_STORAGE_ENABLED', 'Enable storing mission on microSD cards', 0, None), Feature('Other', 'COMPASS_CAL', 'COMPASS_CAL_ENABLED', 'Enable "tumble" compass calibration', 0, None), @@ -340,7 +355,9 @@ BUILD_OPTIONS = [ Feature('MAVLink', 'MAV_SERVO_RELAY', 'AP_MAVLINK_SERVO_RELAY_ENABLED', 'Enable handling of ServoRelay mavlink messages', 0, 'SERVORELAY_EVENTS'), # noqa Feature('MAVLink', 'MAV_MSG_SERIAL_CONTROL', 'AP_MAVLINK_MSG_SERIAL_CONTROL_ENABLED', 'Enable handling of Serial Control mavlink messages', 0, None), # noqa Feature('MAVLink', 'MAVLINK_MSG_MISSION_REQUEST', 'AP_MAVLINK_MSG_MISSION_REQUEST_ENABLED', 'Enable handling of MISSION_REQUEST mavlink messages', 0, None), # noqa + Feature('MAVLink', 'MAVLINK_MSG_RC_CHANNELS_RAW', 'AP_MAVLINK_MSG_RC_CHANNELS_RAW_ENABLED', 'Enable sending of RC_CHANNELS_RAW mavlink messages', 0, None), # noqa Feature('MAVLink', 'AP_MAVLINK_FTP_ENABLED', 'AP_MAVLINK_FTP_ENABLED', 'Enable MAVLink FTP Protocol', 0, None), # noqa + Feature('MAVLink', 'MAV_CMD_SET_HAGL', 'AP_MAVLINK_MAV_CMD_SET_HAGL_ENABLED', 'Enable MAVLink HAGL command', 0, None), # noqa Feature('Developer', 'KILL_IMU', 'AP_INERTIALSENSOR_KILL_IMU_ENABLED', 'Allow IMUs to be disabled at runtime', 0, None), Feature('Developer', 'CRASHCATCHER', 'AP_CRASHDUMP_ENABLED', 'Enable CrashCatcher', 0, None), diff --git a/Tools/scripts/create_OEM_board.py b/Tools/scripts/create_OEM_board.py index 6ba5b0fc53..a4304a2b66 100755 --- a/Tools/scripts/create_OEM_board.py +++ b/Tools/scripts/create_OEM_board.py @@ -3,12 +3,16 @@ """ script to automatically create a copy of a board for an OEM setup usage example : ./Tools/scripts/create_OEM_board.py mRoPixracerPro mRoPixracerPro-MyCompany + +AP_FLAKE8_CLEAN """ import sys import os import subprocess +import pathlib + board_name = sys.argv[1] oem_board_name = sys.argv[2] @@ -17,13 +21,12 @@ oem_board_name = sys.argv[2] if not os.path.exists("libraries/AP_HAL_ChibiOS/hwdef/%s" % oem_board_name): subprocess.run(["mkdir", "libraries/AP_HAL_ChibiOS/hwdef/%s" % oem_board_name]) # create files and add reference to originals - f=open("libraries/AP_HAL_ChibiOS/hwdef/%s/hwdef.dat" % oem_board_name, "x") - f.write("include ../%s/hwdef.dat" % board_name) + f = open("libraries/AP_HAL_ChibiOS/hwdef/%s/hwdef.dat" % oem_board_name, "x") + f.write("include ../%s/hwdef.dat\n" % board_name) f.close() - f=open("libraries/AP_HAL_ChibiOS/hwdef/%s/hwdef-bl.dat" % oem_board_name, "x") - f.write("include ../%s/hwdef-bl.dat" % board_name) + f = open("libraries/AP_HAL_ChibiOS/hwdef/%s/hwdef-bl.dat" % oem_board_name, "x") + f.write("include ../%s/hwdef-bl.dat\n" % board_name) f.close() if os.path.exists("libraries/AP_HAL_ChibiOS/hwdef/%s/defaults.parm" % board_name): - subprocess.run(["cp", "libraries/AP_HAL_ChibiOS/hwdef/%s/defaults.parm" % board_name, "libraries/AP_HAL_ChibiOS/hwdef/%s/defaults.parm" % oem_board_name]) - - + path = pathlib.Path(f"libraries/AP_HAL_ChibiOS/hwdef/{oem_board_name}/defaults.parm") + path.write_text(f"@include ../{board_name}/defaults.parm\n") # noqa diff --git a/Tools/scripts/cygwin_build.sh b/Tools/scripts/cygwin_build.sh index 8c8228df90..b648920269 100755 --- a/Tools/scripts/cygwin_build.sh +++ b/Tools/scripts/cygwin_build.sh @@ -18,8 +18,6 @@ $GPP_COMPILER -print-sysroot SYS_ROOT=$($GPP_COMPILER -print-sysroot) echo "SYS_ROOT=$SYS_ROOT" -git config --global --add safe.directory /cygdrive/d/a/ardupilot/ardupilot - rm -rf artifacts mkdir artifacts diff --git a/Tools/scripts/extract_features.py b/Tools/scripts/extract_features.py index 659b2a1a94..454e57391c 100755 --- a/Tools/scripts/extract_features.py +++ b/Tools/scripts/extract_features.py @@ -62,6 +62,8 @@ class ExtractFeatures(object): ('HAL_EFI_ENABLED', 'AP_EFI::AP_EFI',), ('AP_EFI_{type}_ENABLED', 'AP_EFI_(?P.*)::update',), + ('AP_EXTENDED_ESC_TELEM_ENABLED', r'AP_DroneCAN::handle_esc_ext_status\b',), + ('AP_TEMPERATURE_SENSOR_ENABLED', 'AP_TemperatureSensor::AP_TemperatureSensor',), ('AP_TEMPERATURE_SENSOR_{type}_ENABLED', 'AP_TemperatureSensor_(?P.*)::update',), @@ -71,14 +73,15 @@ class ExtractFeatures(object): ('HAL_NAVEKF3_AVAILABLE', 'NavEKF3::NavEKF3',), ('HAL_NAVEKF2_AVAILABLE', 'NavEKF2::NavEKF2',), ('HAL_EXTERNAL_AHRS_ENABLED', r'AP_ExternalAHRS::init\b',), - ('AP_EXTERNAL_AHRS_{type}_ENABLED', r'AP_ExternalAHRS_{type}::healthy\b',), - ('HAL_INS_TEMPERATURE_CAL_ENABLE', 'AP_InertialSensor::TCal::Learn::save_calibration',), + ('AP_EXTERNAL_AHRS_{type}_ENABLED', r'AP_ExternalAHRS_(?P.*)::healthy\b',), + ('HAL_INS_TEMPERATURE_CAL_ENABLE', 'AP_InertialSensor_TCal::Learn::save_calibration',), ('HAL_VISUALODOM_ENABLED', 'AP_VisualOdom::init',), ('AP_RANGEFINDER_ENABLED', 'RangeFinder::RangeFinder',), ('AP_RANGEFINDER_{type}_ENABLED', r'AP_RangeFinder_(?P.*)::update\b',), ('AP_RANGEFINDER_{type}_ENABLED', r'AP_RangeFinder_(?P.*)::get_reading\b',), ('AP_RANGEFINDER_{type}_ENABLED', r'AP_RangeFinder_(?P.*)::model_dist_max_cm\b',), + ('AP_RANGEFINDER_{type}_ENABLED', r'AP_RangeFinder_(?P.*)::handle_frame\b',), ('AP_RANGEFINDER_LIGHTWARE_SERIAL_ENABLED', r'AP_RangeFinder_LightWareSerial::get_reading\b',), ('AP_RANGEFINDER_LWI2C_ENABLED', r'AP_RangeFinder_LightWareI2C::update\b',), ('AP_RANGEFINDER_MAXBOTIX_SERIAL_ENABLED', r'AP_RangeFinder_MaxsonarSerialLV::get_reading\b',), @@ -121,6 +124,9 @@ class ExtractFeatures(object): ('AP_FRSKY_D_TELEM_ENABLED', 'AP_Frsky_D::send',), ('AP_FRSKY_SPORT_TELEM_ENABLED', 'AP_Frsky_SPort::send_sport_frame',), ('AP_FRSKY_SPORT_PASSTHROUGH_ENABLED', 'AP::frsky_passthrough_telem',), + ('HAL_WITH_FRSKY_TELEM_BIDIRECTIONAL', 'AP_Frsky_SPort_Passthrough::set_telem_data'), + + ('AP_IBUS_TELEM_ENABLED', 'AP_IBus_Telem::init',), ('MODE_{type}_ENABLED', r'Mode(?P.+)::init',), ('MODE_GUIDED_NOGPS_ENABLED', r'ModeGuidedNoGPS::init',), @@ -137,7 +143,7 @@ class ExtractFeatures(object): ('HAL_PARACHUTE_ENABLED', 'AP_Parachute::update',), ('AP_FENCE_ENABLED', r'AC_Fence::check\b',), - ('HAL_RALLY_ENABLED', r'AP_Rally::get_rally_max\b',), + ('HAL_RALLY_ENABLED', 'AP_Rally::find_nearest_rally_point',), ('AP_AVOIDANCE_ENABLED', 'AC_Avoid::AC_Avoid',), ('AP_OAPATHPLANNER_ENABLED', 'AP_OAPathPlanner::AP_OAPathPlanner',), ('AC_PAYLOAD_PLACE_ENABLED', 'PayloadPlace::start_descent'), @@ -170,6 +176,7 @@ class ExtractFeatures(object): ('HAL_SPRAYER_ENABLED', 'AC_Sprayer::AC_Sprayer',), ('AP_LANDINGGEAR_ENABLED', r'AP_LandingGear::init\b',), ('AP_WINCH_ENABLED', 'AP_Winch::AP_Winch',), + ('AP_WINCH_{type}_ENABLED', r'AP_Winch_(?P.*)::update\b',), ('AP_RELAY_ENABLED', 'AP_Relay::init',), ('AP_SERVORELAYEVENTS_ENABLED', 'AP_ServoRelayEvents::update_events',), @@ -207,6 +214,7 @@ class ExtractFeatures(object): ('AP_RC_CHANNEL_AUX_FUNCTION_STRINGS_ENABLED', r'RC_Channel::lookuptable',), ('AP_SCRIPTING_ENABLED', r'AP_Scripting::init',), + ('AP_SCRIPTING_SERIALDEVICE_ENABLED', r'AP_Scripting_SerialDevice::init',), ('AP_NOTIFY_TONEALARM_ENABLED', r'AP_ToneAlarm::init'), ('AP_NOTIFY_MAVLINK_PLAY_TUNE_SUPPORT_ENABLED', r'AP_Notify::handle_play_tune'), @@ -236,7 +244,9 @@ class ExtractFeatures(object): ('AP_MAVLINK_SERVO_RELAY_ENABLED', 'GCS_MAVLINK::handle_servorelay_message'), ('AP_MAVLINK_MSG_SERIAL_CONTROL_ENABLED', 'GCS_MAVLINK::handle_serial_control'), ('AP_MAVLINK_MSG_MISSION_REQUEST_ENABLED', 'GCS_MAVLINK::handle_mission_request\b'), + ('AP_MAVLINK_MSG_RC_CHANNELS_RAW_ENABLED', 'GCS_MAVLINK::send_rc_channels_raw\b'), ('AP_MAVLINK_FTP_ENABLED', 'GCS_MAVLINK::ftp_worker'), + ('AP_MAVLINK_MAV_CMD_SET_HAGL_ENABLED', 'Plane::get_external_HAGL'), ('AP_DRONECAN_HIMARK_SERVO_SUPPORT', 'AP_DroneCAN::SRV_send_himark'), ('AP_DRONECAN_HOBBYWING_ESC_SUPPORT', 'AP_DroneCAN::hobbywing_ESC_update'), @@ -248,12 +258,18 @@ class ExtractFeatures(object): ('FORCE_APJ_DEFAULT_PARAMETERS', 'AP_Param::param_defaults_data'), ('HAL_BUTTON_ENABLED', 'AP_Button::update'), ('HAL_LOGGING_ENABLED', 'AP_Logger::init'), - ('AP_COMPASS_CALIBRATION_FIXED_YAW_ENABLED', 'AP_Compass::mag_cal_fixed_yaw'), + ('AP_COMPASS_CALIBRATION_FIXED_YAW_ENABLED', 'Compass::mag_cal_fixed_yaw'), ('COMPASS_LEARN_ENABLED', 'CompassLearn::update'), - ('AP_CUSTOMROTATIONS_ENABLED', 'AP_CustomRotation::init'), + ('AP_CUSTOMROTATIONS_ENABLED', 'AP_CustomRotations::init'), ('AP_OSD_LINK_STATS_EXTENSIONS_ENABLED', r'AP_OSD_Screen::draw_rc_tx_power'), ('HAL_ENABLE_DRONECAN_DRIVERS', r'AP_DroneCAN::init'), ('AP_MAVLINK_MSG_HIL_GPS_ENABLED', r'mavlink_msg_hil_gps_decode'), + ('AP_BARO_PROBE_EXTERNAL_I2C_BUSES', r'AP_Compass::_probe_external_i2c_compasses'), + ('AP_RSSI_ENABLED', r'AP_RSSI::init'), + + ('AP_ROVER_ADVANCED_FAILSAFE_ENABLED', r'Rover::afs_fs_check'), + + ('AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED', r'GCS_MAVLINK_Plane::handle_command_int_guided_slew_commands'), ] def progress(self, msg): diff --git a/Tools/scripts/firmware_version_decoder.py b/Tools/scripts/firmware_version_decoder.py index cf33217014..3ef137f4e3 100755 --- a/Tools/scripts/firmware_version_decoder.py +++ b/Tools/scripts/firmware_version_decoder.py @@ -18,6 +18,18 @@ class FirmwareVersionType(enum.Enum): Official = 255 EnumEnd = 256 + @staticmethod + def get_release(version: int) -> str: + """ + Return the closest release type for a given version type, going down. + This is required because it is common in ardupilot to increase the version type + for successive betas, such as here: + https://github.com/ArduPilot/ardupilot/blame/8890c44370a7cf27d5efc872ef6da288ae3bc41f/ArduCopter/version.h#L12 + """ + for release in reversed(FirmwareVersionType): + if version >= release.value: + return release + return "Unknown" class VehicleType(enum.Enum): Rover = 1 @@ -193,7 +205,7 @@ class Decoder: self.fwversion.major = self.unpack("B") self.fwversion.minor = self.unpack("B") self.fwversion.patch = self.unpack("B") - self.fwversion.firmware_type = FirmwareVersionType(self.unpack("B")) + self.fwversion.firmware_type = FirmwareVersionType.get_release(self.unpack("B")) self.fwversion.os_software_version = self.unpack("I") self.fwversion.firmware_string = self.unpack_string_from_pointer() diff --git a/Tools/scripts/generate_manifest.py b/Tools/scripts/generate_manifest.py index c8d7e50caa..722c24b551 100755 --- a/Tools/scripts/generate_manifest.py +++ b/Tools/scripts/generate_manifest.py @@ -106,6 +106,7 @@ brand_map = { "SkystarsH7HD-bdshot" : ("Skystars", "H743 HD"), "MicoAir405v2" : ("MicoAir F405 v2.1", "MicoAir"), "MicoAir405Mini" : ("MicoAir F405 Mini", "MicoAir"), + "GEPRCF745BTHD": ("TAKER F745 BT","GEPRC"), } class Firmware(): diff --git a/Tools/scripts/sitl-on-hardware/README.md b/Tools/scripts/sitl-on-hardware/README.md index 26135aac74..af643a9db3 100644 --- a/Tools/scripts/sitl-on-hardware/README.md +++ b/Tools/scripts/sitl-on-hardware/README.md @@ -23,6 +23,13 @@ and quadplane: cd $HOME/ardupilot ./Tools/scripts/sitl-on-hardware/sitl-on-hw.py --board MatekH743 --vehicle plane --simclass QuadPlane +### Copter : + +Only the default quad frame is enable by default, to enable another frame type, you need to enable the right compile flag : +e.g. for octa-quad frame, AP_MOTORS_FRAME_OCTAQUAD_ENABLED 1 in the hwdef file. Compile flags list is in AP_Motors_class.h +Passing --frame parameter will enable the right compile flag for you. + + ## Configuring Wipe the parameters on the board; this can be done with a mavlink command, or by setting the FORMAT_VERSION parameter to 0. diff --git a/Tools/scripts/sitl-on-hardware/extra-hwdef-sitl-on-hw.dat b/Tools/scripts/sitl-on-hardware/extra-hwdef-sitl-on-hw.dat index fd766ad7dd..0b81cc3e77 100644 --- a/Tools/scripts/sitl-on-hardware/extra-hwdef-sitl-on-hw.dat +++ b/Tools/scripts/sitl-on-hardware/extra-hwdef-sitl-on-hw.dat @@ -1,8 +1,5 @@ env SIM_ENABLED 1 -define INS_MAX_INSTANCES 2 -define HAL_COMPASS_MAX_SENSORS 2 - define AP_GPS_BACKEND_DEFAULT_ENABLED 0 define AP_RANGEFINDER_BACKEND_DEFAULT_ENABLED 0 diff --git a/Tools/scripts/sitl-on-hardware/plane-extra-hwdef-sitl-on-hw.dat b/Tools/scripts/sitl-on-hardware/plane-extra-hwdef-sitl-on-hw.dat index 27868fd515..145ffbcf8b 100644 --- a/Tools/scripts/sitl-on-hardware/plane-extra-hwdef-sitl-on-hw.dat +++ b/Tools/scripts/sitl-on-hardware/plane-extra-hwdef-sitl-on-hw.dat @@ -1,8 +1,5 @@ env SIM_ENABLED 1 -define INS_MAX_INSTANCES 2 -define HAL_COMPASS_MAX_SENSORS 2 - define AP_GPS_BACKEND_DEFAULT_ENABLED 0 define AP_RANGEFINDER_BACKEND_DEFAULT_ENABLED 0 diff --git a/Tools/scripts/sitl-on-hardware/sitl-on-hw.py b/Tools/scripts/sitl-on-hardware/sitl-on-hw.py index 291005a7a7..ffa4947fae 100755 --- a/Tools/scripts/sitl-on-hardware/sitl-on-hw.py +++ b/Tools/scripts/sitl-on-hardware/sitl-on-hw.py @@ -2,18 +2,44 @@ ''' script to build a firmware for SITL-on-hardware see https://ardupilot.org/dev/docs/sim-on-hardware.html + +AP_FLAKE8_CLEAN ''' import subprocess import sys import os import tempfile - from argparse import ArgumentParser + +sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), '../../../Tools', 'autotest')) +from pysim import vehicleinfo # noqa: E402 + +vinfo = vehicleinfo.VehicleInfo() + +vehicle_map = { + "APMrover2": "Rover", + "Copter": "ArduCopter", + "Heli": "Helicopter", + "Plane": "ArduPlane", + "Sub": "ArduSub", + "Blimp": "Blimp", + "Rover": "Rover", + "AntennaTracker": "AntennaTracker", +} +# add lower-case equivalents too +for k in list(vehicle_map.keys()): + vehicle_map[k.lower()] = vehicle_map[k] + +vehicle_choices = list(vinfo.options.keys()) +# add vehicle aliases to argument parser options: +for c in vehicle_map.keys(): + vehicle_choices.append(c) + parser = ArgumentParser("SITL on hardware builder") parser.add_argument("--board", default=None, help="board type") -parser.add_argument("--vehicle", default=None, help="vehicle type") -parser.add_argument("--frame", default=None, help="frame type") +parser.add_argument("-v", "--vehicle", choices=vehicle_choices, required=True, help="vehicle type") +parser.add_argument("-f", "--frame", default=None, help="frame type") parser.add_argument("--simclass", default=None, help="simulation class") parser.add_argument("--defaults", default=None, help="extra defaults file") parser.add_argument("--upload", action='store_true', default=False, help="upload firmware") @@ -22,33 +48,46 @@ args, unknown_args = parser.parse_known_args() extra_hwdef = None + def run_program(cmd_list): '''run a program from a command list''' print("Running (%s)" % " ".join(cmd_list)) retcode = subprocess.call(cmd_list) if retcode != 0: - print("FAILED: %s" % (' '.join(cmd_list))) - global extra_hwdef - if extra_hwdef is not None: - extra_hwdef.close() - os.unlink(extra_hwdef.name) - sys.exit(1) + print("FAILED: %s" % (' '.join(cmd_list))) + global extra_hwdef + if extra_hwdef is not None: + extra_hwdef.close() + os.unlink(extra_hwdef.name) + sys.exit(1) + + +frame_options = sorted(vinfo.options[vehicle_map[args.vehicle]]["frames"].keys()) +frame_options_string = ' '.join(frame_options) +if args.frame and args.frame not in frame_options: + print(f"ERROR: frame must be one of {frame_options_string}") + sys.exit(1) + extra_hwdef = tempfile.NamedTemporaryFile(mode='w') extra_defaults = tempfile.NamedTemporaryFile(mode='w') + def hwdef_write(s): '''write to the hwdef temp file''' extra_hwdef.write(s) + def defaults_write(s): '''write to the hwdef temp file''' extra_defaults.write(s) + def sohw_path(fname): '''get path to a file in on-hardware directory''' return os.path.join(os.path.dirname(os.path.realpath(__file__)), fname) + if args.vehicle == "plane": extra_hwdef_base = "plane-extra-hwdef-sitl-on-hw.dat" defaults_base = "plane-default.param" @@ -63,12 +102,47 @@ hwdef_write(open(sohw_path(extra_hwdef_base), "r").read() + "\n") defaults_write(open(sohw_path(defaults_base), "r").read() + "\n") if args.defaults: - defaults_write(open(args.defaults,"r").read() + "\n") + defaults_write(open(args.defaults, "r").read() + "\n") if args.simclass: + if args.simclass == 'Glider': + hwdef_write("define AP_SIM_GLIDER_ENABLED 1\n") hwdef_write("define AP_SIM_FRAME_CLASS %s\n" % args.simclass) if args.frame: hwdef_write('define AP_SIM_FRAME_STRING "%s"\n' % args.frame) + if vehicle_map[args.vehicle] == "ArduCopter" or args.simclass == "MultiCopter": + frame_found = False + frame_defines = { + "quad": "AP_MOTORS_FRAME_QUAD_ENABLED", + "+": "AP_MOTORS_FRAME_QUAD_ENABLED", + "X": "AP_MOTORS_FRAME_QUAD_ENABLED", + "cwx": "AP_MOTORS_FRAME_QUAD_ENABLED", + "djix": "AP_MOTORS_FRAME_QUAD_ENABLED", + "quad-can": "AP_MOTORS_FRAME_QUAD_ENABLED", + "hexa": "AP_MOTORS_FRAME_HEXA_ENABLED", + "hexa-cwx": "AP_MOTORS_FRAME_HEXA_ENABLED", + "hexa-dji": "AP_MOTORS_FRAME_HEXA_ENABLED", + "hexax": "AP_MOTORS_FRAME_HEXA_ENABLED", + "deca": "AP_MOTORS_FRAME_DECA_ENABLED", + "deca-cwx": "AP_MOTORS_FRAME_DECA_ENABLED", + "dodeca-hexa": "AP_MOTORS_FRAME_DODECAHEXA_ENABLED", + "octa": "AP_MOTORS_FRAME_OCTA_ENABLED", + "octa-dji": "AP_MOTORS_FRAME_OCTA_ENABLED", + "octa-cwx": "AP_MOTORS_FRAME_OCTA_ENABLED", + "octa-quad": "AP_MOTORS_FRAME_OCTAQUAD_ENABLED", + "octa-quad-cwx": "AP_MOTORS_FRAME_OCTAQUAD_ENABLED", + "y6": "AP_MOTORS_FRAME_Y6_ENABLED" + } + for frame, define in frame_defines.items(): + if args.frame == frame: + print(f"Auto enabling {define} for frame {args.frame}") + hwdef_write(f'define {define} 1') + frame_found = True + break + if not frame_found: + print(f"Error: frame {args.frame} not found in frame_defines") + sys.exit(1) + extra_hwdef.flush() extra_defaults.flush() @@ -80,12 +154,22 @@ configure_args = ["./waf", "configure", configure_args.extend(unknown_args) run_program(configure_args) -build_cmd = ["./waf", args.vehicle] + +def get_key_from_value(d, target_value): + for key, value in d.items(): + if value == target_value: + return key + return None + + +if args.vehicle in ["APMrover2", "apmrover2"]: # Double map, but waf only accepts rover. + args.vehicle = "Rover" +waf_vehicle = args.vehicle if args.vehicle in vehicle_map.keys() else get_key_from_value(vehicle_map, args.vehicle) +build_cmd = ["./waf", waf_vehicle.lower()] if args.upload: - build_cmd.append("--upload") + build_cmd.append("--upload") run_program(build_cmd) # cleanup extra_hwdef.close() - diff --git a/libraries/AC_AttitudeControl/AC_AttitudeControl.cpp b/libraries/AC_AttitudeControl/AC_AttitudeControl.cpp index 5a740b5b0a..14d3a1fc7f 100644 --- a/libraries/AC_AttitudeControl/AC_AttitudeControl.cpp +++ b/libraries/AC_AttitudeControl/AC_AttitudeControl.cpp @@ -150,6 +150,27 @@ const AP_Param::GroupInfo AC_AttitudeControl::var_info[] = { // @User: Standard AP_GROUPINFO("INPUT_TC", 20, AC_AttitudeControl, _input_tc, AC_ATTITUDE_CONTROL_INPUT_TC_DEFAULT), + // @Param: LAND_R_MULT + // @DisplayName: Landed roll gain multiplier + // @Description: Roll gain multiplier active when landed. A factor of 1.0 means no reduction in gain while landed. Reduce this factor to reduce ground oscitation in the roll axis. + // @Range: 0.25 1.0 + // @User: Advanced + AP_GROUPINFO("LAND_R_MULT", 21, AC_AttitudeControl, _land_roll_mult, 1.0), + + // @Param: LAND_P_MULT + // @DisplayName: Landed pitch gain multiplier + // @Description: Pitch gain multiplier active when landed. A factor of 1.0 means no reduction in gain while landed. Reduce this factor to reduce ground oscitation in the pitch axis. + // @Range: 0.25 1.0 + // @User: Advanced + AP_GROUPINFO("LAND_P_MULT", 22, AC_AttitudeControl, _land_pitch_mult, 1.0), + + // @Param: LAND_Y_MULT + // @DisplayName: Landed yaw gain multiplier + // @Description: Yaw gain multiplier active when landed. A factor of 1.0 means no reduction in gain while landed. Reduce this factor to reduce ground oscitation in the yaw axis. + // @Range: 0.25 1.0 + // @User: Advanced + AP_GROUPINFO("LAND_Y_MULT", 23, AC_AttitudeControl, _land_yaw_mult, 1.0), + AP_GROUPEND }; @@ -204,6 +225,25 @@ void AC_AttitudeControl::reset_rate_controller_I_terms_smoothly() get_rate_yaw_pid().relax_integrator(0.0, _dt, AC_ATTITUDE_RATE_RELAX_TC); } +// Reduce attitude control gains while landed to stop ground resonance +void AC_AttitudeControl::landed_gain_reduction(bool landed) +{ + if (is_positive(_input_tc)) { + // use 2.0 x tc to match the response time to 86% commanded + const float spool_step = _dt / (2.0 * _input_tc); + if (landed) { + _landed_gain_ratio = MIN(1.0, _landed_gain_ratio + spool_step); + } else { + _landed_gain_ratio = MAX(0.0, _landed_gain_ratio - spool_step); + } + } else { + _landed_gain_ratio = landed ? 1.0 : 0.0; + } + Vector3f scale_mult = VECTORF_111 * (1.0 - _landed_gain_ratio) + Vector3f(_land_roll_mult, _land_pitch_mult, _land_yaw_mult) * _landed_gain_ratio; + set_PD_scale_mult(scale_mult); + set_angle_P_scale_mult(scale_mult); +} + // The attitude controller works around the concept of the desired attitude, target attitude // and measured attitude. The desired attitude is the attitude input into the attitude controller // that expresses where the higher level code would like the aircraft to move to. The target attitude is moved @@ -227,15 +267,16 @@ void AC_AttitudeControl::reset_rate_controller_I_terms_smoothly() // trust vector drops below 2*AC_ATTITUDE_THRUST_ERROR_ANGLE. At this point the heading is also corrected. // Command a Quaternion attitude with feedforward and smoothing -// attitude_desired_quat: is updated on each time_step by the integral of the angular velocity -void AC_AttitudeControl::input_quaternion(Quaternion& attitude_desired_quat, Vector3f ang_vel_target) +// attitude_desired_quat: is updated on each time_step by the integral of the body frame angular velocity +void AC_AttitudeControl::input_quaternion(Quaternion& attitude_desired_quat, Vector3f ang_vel_body) { Quaternion attitude_error_quat = _attitude_target.inverse() * attitude_desired_quat; Vector3f attitude_error_angle; attitude_error_quat.to_axis_angle(attitude_error_angle); // Limit the angular velocity - ang_vel_limit(ang_vel_target, radians(_ang_vel_roll_max), radians(_ang_vel_pitch_max), radians(_ang_vel_yaw_max)); + ang_vel_limit(ang_vel_body, radians(_ang_vel_roll_max), radians(_ang_vel_pitch_max), radians(_ang_vel_yaw_max)); + Vector3f ang_vel_target = attitude_desired_quat * ang_vel_body; if (_rate_bf_ff_enabled) { // When acceleration limiting and feedforward are enabled, the sqrt controller is used to compute an euler diff --git a/libraries/AC_AttitudeControl/AC_AttitudeControl.h b/libraries/AC_AttitudeControl/AC_AttitudeControl.h index e4993e53ab..b396828258 100644 --- a/libraries/AC_AttitudeControl/AC_AttitudeControl.h +++ b/libraries/AC_AttitudeControl/AC_AttitudeControl.h @@ -120,12 +120,27 @@ public: // get the roll angular velocity limit in radians/s float get_ang_vel_roll_max_rads() const { return radians(_ang_vel_roll_max); } + // get the roll angular velocity limit in degrees/s + float get_ang_vel_roll_max_degs() const { return _ang_vel_roll_max; } + + // set the roll angular velocity limit in degrees/s + void set_ang_vel_roll_max_degs(float vel_roll_max) { _ang_vel_roll_max.set(vel_roll_max); } // get the pitch angular velocity limit in radians/s float get_ang_vel_pitch_max_rads() const { return radians(_ang_vel_pitch_max); } + // get the pitch angular velocity limit in degrees/s + float get_ang_vel_pitch_max_degs() const { return _ang_vel_pitch_max; } + + // set the pitch angular velocity limit in degrees/s + void set_ang_vel_pitch_max_degs(float vel_pitch_max) { _ang_vel_pitch_max.set(vel_pitch_max); } // get the yaw angular velocity limit in radians/s float get_ang_vel_yaw_max_rads() const { return radians(_ang_vel_yaw_max); } + // get the yaw angular velocity limit in degrees/s + float get_ang_vel_yaw_max_degs() const { return _ang_vel_yaw_max; } + + // set the yaw angular velocity limit in degrees/s + void set_ang_vel_yaw_max_degs(float vel_yaw_max) { _ang_vel_yaw_max.set(vel_yaw_max); } // get the slew yaw rate limit in deg/s float get_slew_yaw_max_degs() const; @@ -148,6 +163,9 @@ public: // reset rate controller I terms smoothly to zero in 0.5 seconds void reset_rate_controller_I_terms_smoothly(); + // Reduce attitude control gains while landed to stop ground resonance + void landed_gain_reduction(bool landed); + // Sets attitude target to vehicle attitude and sets all rates to zero // If reset_rate is false rates are not reset to allow the rate controllers to run void reset_target_and_rate(bool reset_rate = true); @@ -160,8 +178,8 @@ public: void inertial_frame_reset(); // Command a Quaternion attitude with feedforward and smoothing - // attitude_desired_quat: is updated on each time_step (_dt) by the integral of the angular velocity - virtual void input_quaternion(Quaternion& attitude_desired_quat, Vector3f ang_vel_target); + // attitude_desired_quat: is updated on each time_step (_dt) by the integral of the body frame angular velocity + virtual void input_quaternion(Quaternion& attitude_desired_quat, Vector3f ang_vel_body); // Command an euler roll and pitch angle and an euler yaw rate with angular velocity feedforward and smoothing virtual void input_euler_angle_roll_pitch_euler_rate_yaw(float euler_roll_angle_cd, float euler_pitch_angle_cd, float euler_yaw_rate_cds); @@ -379,6 +397,9 @@ public: // enable inverted flight on backends that support it virtual void set_inverted_flight(bool inverted) {} + // enable accessor for inverted flight flag on backends that support it + virtual bool get_inverted_flight() { return false;} + // get the slew rate value for roll, pitch and yaw, for oscillation detection in lua scripts void get_rpy_srate(float &roll_srate, float &pitch_srate, float &yaw_srate); @@ -461,6 +482,11 @@ protected: // rate controller input smoothing time constant AP_Float _input_tc; + // Controller gain multiplyer to be used when landed + AP_Float _land_roll_mult; + AP_Float _land_pitch_mult; + AP_Float _land_yaw_mult; + // Intersampling period in seconds float _dt; @@ -543,6 +569,9 @@ protected: // PD scale used for last loop, used for logging Vector3f _pd_scale_used; + // ratio of normal gain to landed gain + float _landed_gain_ratio; + // References to external libraries const AP_AHRS_View& _ahrs; const AP_MultiCopter &_aparm; diff --git a/libraries/AC_AttitudeControl/AC_AttitudeControl_Heli.cpp b/libraries/AC_AttitudeControl/AC_AttitudeControl_Heli.cpp index 199820a070..39c9ad277e 100644 --- a/libraries/AC_AttitudeControl/AC_AttitudeControl_Heli.cpp +++ b/libraries/AC_AttitudeControl/AC_AttitudeControl_Heli.cpp @@ -541,29 +541,46 @@ void AC_AttitudeControl_Heli::set_throttle_out(float throttle_in, bool apply_ang _throttle_in = throttle_in; update_althold_lean_angle_max(throttle_in); - if (_transition_count > 0) { - _transition_count -= 1; - } else { - _transition_count = 0; - } - float throttle_out = 0.0f; - if (_transition_count > 0) { - if ((_ahrs.roll_sensor >= -3000 && _ahrs.roll_sensor <= 3000) || _ahrs.roll_sensor >= 15000 || _ahrs.roll_sensor <= -15000) { - throttle_out = (throttle_in - ((AP_MotorsHeli&)_motors).get_coll_mid()) / cosf(radians(_ahrs.roll_sensor * 0.01f)) + ((AP_MotorsHeli&)_motors).get_coll_mid(); - } else if ((_ahrs.roll_sensor > 3000 && _ahrs.roll_sensor < 15000) || (_ahrs.roll_sensor > -15000 && _ahrs.roll_sensor < -3000)) { - float scale_factor = cosf(radians(_ahrs.roll_sensor * 0.01f)) / cosf(radians(30.0f)); - throttle_out = scale_factor * (throttle_in - ((AP_MotorsHeli&)_motors).get_coll_mid())/ cosf(radians(30.0f)) + ((AP_MotorsHeli&)_motors).get_coll_mid(); - } - } else if (_inverted_flight) { - throttle_out = 1.0f - throttle_in; - } else { - throttle_out = throttle_in; - } - _motors.set_throttle_filter_cutoff(filter_cutoff); - _motors.set_throttle(throttle_out); - // Clear angle_boost for logging purposes - _angle_boost = 0.0f; + if (apply_angle_boost && !((AP_MotorsHeli&)_motors).get_in_autorotation()) { + // Apply angle boost + throttle_in = get_throttle_boosted(throttle_in); + } else { + // Clear angle_boost for logging purposes + _angle_boost = 0.0f; + } + _motors.set_throttle(throttle_in); +} + +// returns a throttle including compensation for roll/pitch angle +// throttle value should be 0 ~ 1 +float AC_AttitudeControl_Heli::get_throttle_boosted(float throttle_in) +{ + if (!_angle_boost_enabled) { + _angle_boost = 0; + return throttle_in; + } + // inverted_factor is 1 for tilt angles below 60 degrees + // inverted_factor changes from 1 to -1 for tilt angles between 60 and 120 degrees + + float cos_tilt = _ahrs.cos_pitch() * _ahrs.cos_roll(); + float inverted_factor = constrain_float(2.0f * cos_tilt, -1.0f, 1.0f); + float cos_tilt_target = fabsf(cosf(_thrust_angle)); + float boost_factor = 1.0f / constrain_float(cos_tilt_target, 0.1f, 1.0f); + + // angle boost and inverted factor applied about the zero thrust collective + const float coll_mid = ((AP_MotorsHeli&)_motors).get_coll_mid(); + float throttle_out = ((throttle_in - coll_mid) * inverted_factor * boost_factor) + coll_mid; + _angle_boost = constrain_float(throttle_out - throttle_in, -1.0f, 1.0f); + return throttle_out; +} + +// get_roll_trim - angle in centi-degrees to be added to roll angle for learn hover collective. Used by helicopter to counter tail rotor thrust in hover +float AC_AttitudeControl_Heli::get_roll_trim_cd() +{ + // hover roll trim is given the opposite sign in inverted flight since the tail rotor thrust is pointed in the opposite direction. + float inverted_factor = constrain_float(2.0f * _ahrs.cos_roll(), -1.0f, 1.0f); + return constrain_float(_hover_roll_trim_scalar * _hover_roll_trim * inverted_factor, -1000.0f,1000.0f); } // Command an euler roll and pitch angle and an euler yaw rate with angular velocity feedforward and smoothing @@ -593,11 +610,35 @@ void AC_AttitudeControl_Heli::set_notch_sample_rate(float sample_rate) #endif } -// enable/disable inverted flight -void AC_AttitudeControl_Heli::set_inverted_flight(bool inverted) +// Command a thrust vector and heading rate +void AC_AttitudeControl_Heli::input_thrust_vector_rate_heading(const Vector3f& thrust_vector, float heading_rate_cds, bool slew_yaw) { - if (_inverted_flight != inverted) { - _transition_count = AC_ATTITUDE_HELI_INVERTED_TRANSITION_TIME * AP::scheduler().get_filtered_loop_rate_hz(); + + if (!_inverted_flight) { + AC_AttitudeControl::input_thrust_vector_rate_heading(thrust_vector, heading_rate_cds, slew_yaw); + return; } - _inverted_flight = inverted; + // convert thrust vector to a roll and pitch angles + // this negates the advantage of using thrust vector control, but works just fine + Vector3f angle_target = attitude_from_thrust_vector(thrust_vector, _ahrs.yaw).to_vector312(); + + float euler_roll_angle_cd = degrees(angle_target.x) * 100.0f; + euler_roll_angle_cd = wrap_180_cd(euler_roll_angle_cd + 18000); + AC_AttitudeControl::input_euler_angle_roll_pitch_euler_rate_yaw(euler_roll_angle_cd, degrees(angle_target.y) * 100.0f, heading_rate_cds); +} + +// Command a thrust vector, heading and heading rate +void AC_AttitudeControl_Heli::input_thrust_vector_heading(const Vector3f& thrust_vector, float heading_angle_cd, float heading_rate_cds) +{ + if (!_inverted_flight) { + AC_AttitudeControl::input_thrust_vector_heading(thrust_vector, heading_angle_cd, heading_rate_cds); + return; + } + // convert thrust vector to a roll and pitch angles + Vector3f angle_target = attitude_from_thrust_vector(thrust_vector, _ahrs.yaw).to_vector312(); + + float euler_roll_angle_cd = degrees(angle_target.x) * 100.0f; + euler_roll_angle_cd = wrap_180_cd(euler_roll_angle_cd + 18000); + // note that we are throwing away heading rate here + AC_AttitudeControl::input_euler_angle_roll_pitch_yaw(euler_roll_angle_cd, degrees(angle_target.y) * 100.0f, heading_angle_cd, true); } diff --git a/libraries/AC_AttitudeControl/AC_AttitudeControl_Heli.h b/libraries/AC_AttitudeControl/AC_AttitudeControl_Heli.h index 974a404dee..b2695b59cf 100644 --- a/libraries/AC_AttitudeControl/AC_AttitudeControl_Heli.h +++ b/libraries/AC_AttitudeControl/AC_AttitudeControl_Heli.h @@ -71,19 +71,29 @@ public: void set_hover_roll_trim_scalar(float scalar) override {_hover_roll_trim_scalar = constrain_float(scalar, 0.0f, 1.0f);} // get_roll_trim - angle in centi-degrees to be added to roll angle for learn hover collective. Used by helicopter to counter tail rotor thrust in hover - float get_roll_trim_cd() override { return constrain_float(_hover_roll_trim_scalar * _hover_roll_trim, -1000.0f,1000.0f);} + float get_roll_trim_cd() override; // Set output throttle void set_throttle_out(float throttle_in, bool apply_angle_boost, float filt_cutoff) override; + // calculate total body frame throttle required to produce the given earth frame throttle + float get_throttle_boosted(float throttle_in); + // Command an euler roll and pitch angle and an euler yaw rate with angular velocity feedforward and smoothing void input_euler_angle_roll_pitch_euler_rate_yaw(float euler_roll_angle_cd, float euler_pitch_angle_cd, float euler_yaw_rate_cds) override; // Command an euler roll, pitch and yaw angle with angular velocity feedforward and smoothing void input_euler_angle_roll_pitch_yaw(float euler_roll_angle_cd, float euler_pitch_angle_cd, float euler_yaw_angle_cd, bool slew_yaw) override; + // Command a thrust vector in the earth frame and a heading angle and/or rate + void input_thrust_vector_rate_heading(const Vector3f& thrust_vector, float heading_rate_cds, bool slew_yaw = true) override; + void input_thrust_vector_heading(const Vector3f& thrust_vector, float heading_angle_cd, float heading_rate_cds) override; + // enable/disable inverted flight - void set_inverted_flight(bool inverted) override; + void set_inverted_flight(bool inverted) override { _inverted_flight = inverted; } + + // accessor for inverted flight flag + bool get_inverted_flight() override { return _inverted_flight; } // set the PID notch sample rates void set_notch_sample_rate(float sample_rate) override; @@ -102,7 +112,6 @@ private: // true in inverted flight mode bool _inverted_flight; - uint16_t _transition_count; // Integrate vehicle rate into _att_error_rot_vec_rad void integrate_bf_rate_error_to_angle_errors(); @@ -127,7 +136,7 @@ private: float _passthrough_yaw; // get_roll_trim - angle in centi-degrees to be added to roll angle. Used by helicopter to counter tail rotor thrust in hover - float get_roll_trim_rad() override { return constrain_float(radians(_hover_roll_trim_scalar * _hover_roll_trim * 0.01f), -radians(10.0f),radians(10.0f));} + float get_roll_trim_rad() override { return radians(get_roll_trim_cd() * 0.01); } // internal variables float _hover_roll_trim_scalar = 0; // scalar used to suppress Hover Roll Trim diff --git a/libraries/AC_AttitudeControl/AC_AttitudeControl_Multi_6DoF.cpp b/libraries/AC_AttitudeControl/AC_AttitudeControl_Multi_6DoF.cpp index c1fe903b69..2fbf7e43e8 100644 --- a/libraries/AC_AttitudeControl/AC_AttitudeControl_Multi_6DoF.cpp +++ b/libraries/AC_AttitudeControl/AC_AttitudeControl_Multi_6DoF.cpp @@ -148,8 +148,7 @@ void AC_AttitudeControl_Multi_6DoF::input_angle_step_bf_roll_pitch_yaw(float rol // Command a Quaternion attitude with feedforward and smoothing // attitude_desired_quat: is updated on each time_step (_dt) by the integral of the angular velocity -// not used anywhere in current code, panic in SITL so this implementation is not overlooked -void AC_AttitudeControl_Multi_6DoF::input_quaternion(Quaternion& attitude_desired_quat, Vector3f ang_vel_target) { +void AC_AttitudeControl_Multi_6DoF::input_quaternion(Quaternion& attitude_desired_quat, Vector3f ang_vel_body) { #if CONFIG_HAL_BOARD == HAL_BOARD_SITL AP_HAL::panic("input_quaternion not implemented AC_AttitudeControl_Multi_6DoF"); #endif @@ -157,7 +156,7 @@ void AC_AttitudeControl_Multi_6DoF::input_quaternion(Quaternion& attitude_desire _motors.set_lateral(0.0f); _motors.set_forward(0.0f); - AC_AttitudeControl_Multi::input_quaternion(attitude_desired_quat, ang_vel_target); + AC_AttitudeControl_Multi::input_quaternion(attitude_desired_quat, ang_vel_body); } diff --git a/libraries/AC_AttitudeControl/AC_AttitudeControl_Multi_6DoF.h b/libraries/AC_AttitudeControl/AC_AttitudeControl_Multi_6DoF.h index 8023985eab..f8d58b5053 100644 --- a/libraries/AC_AttitudeControl/AC_AttitudeControl_Multi_6DoF.h +++ b/libraries/AC_AttitudeControl/AC_AttitudeControl_Multi_6DoF.h @@ -20,8 +20,7 @@ public: // Command a Quaternion attitude with feedforward and smoothing // attitude_desired_quat: is updated on each time_step (_dt) by the integral of the angular velocity - // not used anywhere in current code, panic so this implementation is not overlooked - void input_quaternion(Quaternion& attitude_desired_quat, Vector3f ang_vel_target) override; + void input_quaternion(Quaternion& attitude_desired_quat, Vector3f ang_vel_body) override; /* override input functions to attitude controller and convert desired angles into thrust angles and substitute for offset angles */ diff --git a/libraries/AC_AttitudeControl/AC_PosControl.cpp b/libraries/AC_AttitudeControl/AC_PosControl.cpp index afad2ab3ff..3e3ce4c4f1 100644 --- a/libraries/AC_AttitudeControl/AC_PosControl.cpp +++ b/libraries/AC_AttitudeControl/AC_PosControl.cpp @@ -995,7 +995,7 @@ void AC_PosControl::update_z_controller() // ensure imax is always large enough to overpower hover throttle if (_motors.get_throttle_hover() * 1000.0f > _pid_accel_z.imax()) { - _pid_accel_z.imax(_motors.get_throttle_hover() * 1000.0f); + _pid_accel_z.set_imax(_motors.get_throttle_hover() * 1000.0f); } float thr_out; if (_vibe_comp_enabled) { diff --git a/libraries/AC_AutoTune/AC_AutoTune.cpp b/libraries/AC_AutoTune/AC_AutoTune.cpp index 6dac22cc74..64dafeab8e 100644 --- a/libraries/AC_AutoTune/AC_AutoTune.cpp +++ b/libraries/AC_AutoTune/AC_AutoTune.cpp @@ -109,6 +109,51 @@ void AC_AutoTune::stop() // we expect the caller will change the flight mode back to the flight mode indicated by the flight mode switch } +// Autotune aux function trigger +void AC_AutoTune::do_aux_function(const RC_Channel::AuxSwitchPos ch_flag) +{ + if (mode != TuneMode::SUCCESS) { + if (ch_flag == RC_Channel::AuxSwitchPos::HIGH) { + gcs().send_text(MAV_SEVERITY_NOTICE,"AutoTune: must be complete to test gains"); + } + return; + } + + switch(ch_flag) { + case RC_Channel::AuxSwitchPos::LOW: + // load original gains + load_gains(GainType::GAIN_ORIGINAL); + update_gcs(AUTOTUNE_MESSAGE_TESTING_END); + break; + case RC_Channel::AuxSwitchPos::MIDDLE: + // Middle position is unused for now + break; + case RC_Channel::AuxSwitchPos::HIGH: + // Load tuned gains + load_gains(GainType::GAIN_TUNED); + update_gcs(AUTOTUNE_MESSAGE_TESTING); + break; + } + + have_pilot_testing_command = true; +} + +// Possibly save gains, called on disarm +void AC_AutoTune::disarmed(const bool in_autotune_mode) +{ + // True if pilot is testing tuned gains + const bool testing_tuned = have_pilot_testing_command && (loaded_gains == GainType::GAIN_TUNED); + + // True if in autotune mode and no pilot testing commands have been received + const bool tune_complete_no_testing = !have_pilot_testing_command && in_autotune_mode; + + if (tune_complete_no_testing || testing_tuned) { + save_tuning_gains(); + } else { + reset(); + } +} + // initialise position controller bool AC_AutoTune::init_position_controller(void) { @@ -124,21 +169,24 @@ bool AC_AutoTune::init_position_controller(void) void AC_AutoTune::send_step_string() { if (pilot_override) { - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: Paused: Pilot Override Active"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: Paused: Pilot Override Active"); return; } switch (step) { case WAITING_FOR_LEVEL: - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: Leveling"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: Leveling"); return; case UPDATE_GAINS: - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: Updating Gains"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: Updating Gains"); + return; + case ABORT: + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: Aborting Test"); return; case TESTING: - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: Testing"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: Testing"); return; } - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: unknown step"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: unknown step"); } const char *AC_AutoTune::type_string() const @@ -172,13 +220,13 @@ const char *AC_AutoTune::type_string() const const char *AC_AutoTune::axis_string() const { switch (axis) { - case ROLL: + case AxisType::ROLL: return "Roll"; - case PITCH: + case AxisType::PITCH: return "Pitch"; - case YAW: + case AxisType::YAW: return "Yaw(E)"; - case YAW_D: + case AxisType::YAW_D: return "Yaw(D)"; } return ""; @@ -239,7 +287,7 @@ void AC_AutoTune::run() } if (pilot_override) { if (now - last_pilot_override_warning > 1000) { - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: pilot overrides active"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: pilot overrides active"); last_pilot_override_warning = now; } } @@ -273,7 +321,7 @@ bool AC_AutoTune::currently_level() // abort AutoTune if we pass 2 * AUTOTUNE_LEVEL_TIMEOUT_MS const uint32_t now_ms = AP_HAL::millis(); if (now_ms - level_start_time_ms > 3 * AUTOTUNE_LEVEL_TIMEOUT_MS) { - gcs().send_text(MAV_SEVERITY_CRITICAL, "AutoTune: Failed to level, please tune manually"); + GCS_SEND_TEXT(MAV_SEVERITY_CRITICAL, "AutoTune: Failed to level, please tune manually"); mode = FAILED; LOGGER_WRITE_EVENT(LogEvent::AUTOTUNE_FAILED); } @@ -340,13 +388,6 @@ void AC_AutoTune::control_attitude() step_start_time_ms = now; step_time_limit_ms = get_testing_step_timeout_ms(); // set gains to their to-be-tested values - twitch_first_iter = true; - test_rate_max = 0.0f; - test_rate_min = 0.0f; - test_angle_max = 0.0f; - test_angle_min = 0.0f; - rotation_rate_filt.reset(0.0f); - rate_max = 0.0f; load_gains(GAIN_TEST); } else { // when waiting for level we use the intra-test gains @@ -355,19 +396,16 @@ void AC_AutoTune::control_attitude() // Initialize test-specific variables switch (axis) { - case ROLL: - angle_finish = target_angle_max_rp_cd(); + case AxisType::ROLL: start_rate = ToDeg(ahrs_view->get_gyro().x) * 100.0f; start_angle = ahrs_view->roll_sensor; break; - case PITCH: - angle_finish = target_angle_max_rp_cd(); + case AxisType::PITCH: start_rate = ToDeg(ahrs_view->get_gyro().y) * 100.0f; start_angle = ahrs_view->pitch_sensor; break; - case YAW: - case YAW_D: - angle_finish = target_angle_max_y_cd(); + case AxisType::YAW: + case AxisType::YAW_D: start_rate = ToDeg(ahrs_view->get_gyro().z) * 100.0f; start_angle = ahrs_view->yaw_sensor; break; @@ -409,7 +447,7 @@ void AC_AutoTune::control_attitude() log_pids(); #endif - if (axis == YAW || axis == YAW_D) { + if (axis == AxisType::YAW || axis == AxisType::YAW_D) { desired_yaw_cd = ahrs_view->yaw_sensor; } break; @@ -488,37 +526,37 @@ void AC_AutoTune::control_attitude() // advance to the next axis bool complete = false; switch (axis) { - case ROLL: + case AxisType::ROLL: axes_completed |= AUTOTUNE_AXIS_BITMASK_ROLL; if (pitch_enabled()) { - axis = PITCH; + axis = AxisType::PITCH; } else if (yaw_enabled()) { - axis = YAW; + axis = AxisType::YAW; } else if (yaw_d_enabled()) { - axis = YAW_D; + axis = AxisType::YAW_D; } else { complete = true; } break; - case PITCH: + case AxisType::PITCH: axes_completed |= AUTOTUNE_AXIS_BITMASK_PITCH; if (yaw_enabled()) { - axis = YAW; + axis = AxisType::YAW; } else if (yaw_d_enabled()) { - axis = YAW_D; + axis = AxisType::YAW_D; } else { complete = true; } break; - case YAW: + case AxisType::YAW: axes_completed |= AUTOTUNE_AXIS_BITMASK_YAW; if (yaw_d_enabled()) { - axis = YAW_D; + axis = AxisType::YAW_D; } else { complete = true; } break; - case YAW_D: + case AxisType::YAW_D: axes_completed |= AUTOTUNE_AXIS_BITMASK_YAW_D; complete = true; break; @@ -531,14 +569,20 @@ void AC_AutoTune::control_attitude() update_gcs(AUTOTUNE_MESSAGE_SUCCESS); LOGGER_WRITE_EVENT(LogEvent::AUTOTUNE_SUCCESS); AP_Notify::events.autotune_complete = true; + + // Return to original gains for landing + load_gains(GainType::GAIN_ORIGINAL); } else { AP_Notify::events.autotune_next_axis = true; reset_update_gain_variables(); } } } + FALLTHROUGH; - if (axis == YAW || axis == YAW_D) { + case ABORT: + if (axis == AxisType::YAW || axis == AxisType::YAW_D) { + // todo: check to make sure we need this attitude_control->input_euler_angle_roll_pitch_yaw(0.0f, 0.0f, ahrs_view->yaw_sensor, false); } @@ -563,13 +607,13 @@ void AC_AutoTune::backup_gains_and_initialise() // initialise state because this is our first time if (roll_enabled()) { - axis = ROLL; + axis = AxisType::ROLL; } else if (pitch_enabled()) { - axis = PITCH; + axis = AxisType::PITCH; } else if (yaw_enabled()) { - axis = YAW; + axis = AxisType::YAW; } else if (yaw_d_enabled()) { - axis = YAW_D; + axis = AxisType::YAW_D; } // no axes are complete axes_completed = 0; @@ -594,6 +638,12 @@ void AC_AutoTune::backup_gains_and_initialise() */ void AC_AutoTune::load_gains(enum GainType gain_type) { + if (loaded_gains == gain_type) { + // Loaded gains are already of correct type + return; + } + loaded_gains = gain_type; + switch (gain_type) { case GAIN_ORIGINAL: load_orig_gains(); @@ -615,27 +665,29 @@ void AC_AutoTune::update_gcs(uint8_t message_id) const { switch (message_id) { case AUTOTUNE_MESSAGE_STARTED: - gcs().send_text(MAV_SEVERITY_INFO,"AutoTune: Started"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO,"AutoTune: Started"); break; case AUTOTUNE_MESSAGE_STOPPED: - gcs().send_text(MAV_SEVERITY_INFO,"AutoTune: Stopped"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO,"AutoTune: Stopped"); break; case AUTOTUNE_MESSAGE_SUCCESS: - gcs().send_text(MAV_SEVERITY_NOTICE,"AutoTune: Success"); + GCS_SEND_TEXT(MAV_SEVERITY_NOTICE,"AutoTune: Success"); break; case AUTOTUNE_MESSAGE_FAILED: - gcs().send_text(MAV_SEVERITY_NOTICE,"AutoTune: Failed"); + GCS_SEND_TEXT(MAV_SEVERITY_NOTICE,"AutoTune: Failed"); break; case AUTOTUNE_MESSAGE_TESTING: - gcs().send_text(MAV_SEVERITY_NOTICE,"AutoTune: Pilot Testing"); - break; case AUTOTUNE_MESSAGE_SAVED_GAINS: - gcs().send_text(MAV_SEVERITY_NOTICE,"AutoTune: Saved gains for %s%s%s%s", + GCS_SEND_TEXT(MAV_SEVERITY_NOTICE,"AutoTune: %s gains for %s%s%s%s", + (message_id == AUTOTUNE_MESSAGE_SAVED_GAINS) ? "Saved" : "Pilot Testing", (axes_completed&AUTOTUNE_AXIS_BITMASK_ROLL)?"Roll ":"", (axes_completed&AUTOTUNE_AXIS_BITMASK_PITCH)?"Pitch ":"", (axes_completed&AUTOTUNE_AXIS_BITMASK_YAW)?"Yaw(E)":"", (axes_completed&AUTOTUNE_AXIS_BITMASK_YAW_D)?"Yaw(D)":""); break; + case AUTOTUNE_MESSAGE_TESTING_END: + GCS_SEND_TEXT(MAV_SEVERITY_NOTICE,"AutoTune: original gains restored"); + break; } } @@ -742,7 +794,7 @@ void AC_AutoTune::get_poshold_attitude(float &roll_cd_out, float &pitch_cd_out, more than 2.5 degrees of attitude on the axis it is tuning */ float target_yaw_cd = degrees(atan2f(pdiff.y, pdiff.x)) * 100; - if (axis == PITCH) { + if (axis == AxisType::PITCH) { // for roll and yaw tuning we point along the wind, for pitch // we point across the wind target_yaw_cd += 9000; diff --git a/libraries/AC_AutoTune/AC_AutoTune.h b/libraries/AC_AutoTune/AC_AutoTune.h index c58245d784..167e4b2a52 100644 --- a/libraries/AC_AutoTune/AC_AutoTune.h +++ b/libraries/AC_AutoTune/AC_AutoTune.h @@ -25,6 +25,7 @@ #include #include #include +#include #include "AC_AutoTune_FreqResp.h" #define AUTOTUNE_AXIS_BITMASK_ROLL 1 @@ -41,6 +42,7 @@ #define AUTOTUNE_MESSAGE_FAILED 3 #define AUTOTUNE_MESSAGE_SAVED_GAINS 4 #define AUTOTUNE_MESSAGE_TESTING 5 +#define AUTOTUNE_MESSAGE_TESTING_END 6 #define AUTOTUNE_ANNOUNCE_INTERVAL_MS 2000 @@ -53,21 +55,29 @@ public: // main run loop virtual void run(); - // save gained, called on disarm - virtual void save_tuning_gains() = 0; + // Possibly save gains, called on disarm + void disarmed(const bool in_autotune_mode); // stop tune, reverting gains void stop(); + // Autotune aux function trigger + void do_aux_function(const RC_Channel::AuxSwitchPos ch_flag); + +protected: + + virtual void save_tuning_gains() = 0; + + // reset Autotune so that gains are not saved again and autotune can be run again. void reset() { mode = UNINITIALISED; axes_completed = 0; + have_pilot_testing_command = false; } -protected: // axis that can be tuned - enum AxisType { + enum class AxisType { ROLL = 0, // roll axis is being tuned (either angle or rate) PITCH = 1, // pitch axis is being tuned (either angle or rate) YAW = 2, // yaw axis is being tuned using FLTE (either angle or rate) @@ -197,7 +207,8 @@ protected: enum StepType { WAITING_FOR_LEVEL = 0, // autotune is waiting for vehicle to return to level before beginning the next twitch TESTING = 1, // autotune has begun a test and is watching the resulting vehicle movement - UPDATE_GAINS = 2 // autotune has completed a test and is updating the gains based on the results + UPDATE_GAINS = 2, // autotune has completed a test and is updating the gains based on the results + ABORT = 3 // load normal gains and return to WAITING_FOR_LEVEL }; // mini steps performed while in Tuning mode, Testing step @@ -236,7 +247,7 @@ protected: GAIN_TEST = 1, GAIN_INTRA_TEST = 2, GAIN_TUNED = 3, - }; + } loaded_gains; void load_gains(enum GainType gain_type); // autotune modes (high level states) @@ -259,33 +270,24 @@ protected: bool positive_direction; // false = tuning in negative direction (i.e. left for roll), true = positive direction (i.e. right for roll) StepType step; // see StepType for what steps are performed TuneType tune_type; // see TuneType - bool ignore_next; // true = ignore the next test bool twitch_first_iter; // true on first iteration of a twitch (used to signal we must step the attitude or rate target) uint8_t axes_completed; // bitmask of completed axes - float test_rate_min; // the minimum angular rate achieved during TESTING_RATE step-multi only - float test_rate_max; // the maximum angular rate achieved during TESTING_RATE step-multi only - float test_angle_min; // the minimum angle achieved during TESTING_ANGLE step-multi only - float test_angle_max; // the maximum angle achieved during TESTING_ANGLE step-multi only uint32_t step_start_time_ms; // start time of current tuning step (used for timeout checks) uint32_t step_time_limit_ms; // time limit of current autotune process uint32_t level_start_time_ms; // start time of waiting for level int8_t counter; // counter for tuning gains - float target_rate; // target rate-multi only - float target_angle; // target angle-multi only - float start_rate; // start rate - parent and multi float start_angle; // start angle - float rate_max; // maximum rate variable - parent and multi + float start_rate; // start rate - parent and multi float test_accel_max; // maximum acceleration variable - float step_scaler; // scaler to reduce maximum target step - parent and multi - float angle_finish; // Angle that test is aborted- parent and multi float desired_yaw_cd; // yaw heading during tune - parent and Tradheli + float step_scaler; // scaler to reduce maximum target step - parent and multi LowPassFilterFloat rotation_rate_filt; // filtered rotation rate in radians/second // backup of currently being tuned parameter values - float orig_roll_rp, orig_roll_ri, orig_roll_rd, orig_roll_rff, orig_roll_dff, orig_roll_fltt, orig_roll_smax, orig_roll_sp, orig_roll_accel; - float orig_pitch_rp, orig_pitch_ri, orig_pitch_rd, orig_pitch_rff, orig_pitch_dff, orig_pitch_fltt, orig_pitch_smax, orig_pitch_sp, orig_pitch_accel; - float orig_yaw_rp, orig_yaw_ri, orig_yaw_rd, orig_yaw_rff, orig_yaw_dff, orig_yaw_fltt, orig_yaw_smax, orig_yaw_rLPF, orig_yaw_sp, orig_yaw_accel; + float orig_roll_rp, orig_roll_ri, orig_roll_rd, orig_roll_rff, orig_roll_dff, orig_roll_fltt, orig_roll_smax, orig_roll_sp, orig_roll_accel, orig_roll_rate; + float orig_pitch_rp, orig_pitch_ri, orig_pitch_rd, orig_pitch_rff, orig_pitch_dff, orig_pitch_fltt, orig_pitch_smax, orig_pitch_sp, orig_pitch_accel, orig_pitch_rate; + float orig_yaw_rp, orig_yaw_ri, orig_yaw_rd, orig_yaw_rff, orig_yaw_dff, orig_yaw_fltt, orig_yaw_smax, orig_yaw_rLPF, orig_yaw_sp, orig_yaw_accel, orig_yaw_rate; bool orig_bf_feedforward; // currently being tuned parameter values @@ -300,10 +302,8 @@ protected: float roll_cd, pitch_cd; // heli specific variables - uint8_t freq_cnt; // dwell test iteration counter float start_freq; //start freq for dwell test float stop_freq; //ending freq for dwell test - bool ff_up_first_iter; // true on first iteration of ff up testing private: // return true if we have a good position estimate @@ -348,6 +348,10 @@ private: // time in ms of last pilot override warning uint32_t last_pilot_override_warning; + // True if we ever got a pilot testing command of tuned gains. + // If true then disarming will save if the tuned gains are currently active. + bool have_pilot_testing_command; + }; #endif // AC_AUTOTUNE_ENABLED diff --git a/libraries/AC_AutoTune/AC_AutoTune_FreqResp.cpp b/libraries/AC_AutoTune/AC_AutoTune_FreqResp.cpp index 599b2a36ca..c85aa33f65 100644 --- a/libraries/AC_AutoTune/AC_AutoTune_FreqResp.cpp +++ b/libraries/AC_AutoTune/AC_AutoTune_FreqResp.cpp @@ -6,7 +6,7 @@ This library receives time history data (angular rate or angle) during a dwell t #include "AC_AutoTune_FreqResp.h" // Initialize the Frequency Response Object. Must be called before running dwell or frequency sweep tests -void AC_AutoTune_FreqResp::init(InputType input_type, ResponseType response_type) +void AC_AutoTune_FreqResp::init(InputType input_type, ResponseType response_type, uint8_t cycles) { excitation = input_type; response = response_type; @@ -25,6 +25,7 @@ void AC_AutoTune_FreqResp::init(InputType input_type, ResponseType response_type max_accel = 0.0f; max_meas_rate = 0.0f; max_command = 0.0f; + dwell_cycles = cycles; meas_peak_info_buffer.clear(); tgt_peak_info_buffer.clear(); cycle_complete = false; @@ -71,7 +72,7 @@ void AC_AutoTune_FreqResp::update(float command, float tgt_resp, float meas_resp } // cycles are complete! determine gain and phase and exit - if (max_meas_cnt > AUTOTUNE_DWELL_CYCLES + 1 && max_target_cnt > AUTOTUNE_DWELL_CYCLES + 1 && excitation == DWELL) { + if (max_meas_cnt > dwell_cycles + 1 && max_target_cnt > dwell_cycles + 1 && excitation == DWELL) { float delta_time = 0.0f; float sum_gain = 0.0f; uint8_t cnt = 0; @@ -81,14 +82,13 @@ void AC_AutoTune_FreqResp::update(float command, float tgt_resp, float meas_resp float tgt_ampl = 0.0f; uint32_t meas_time = 0; uint32_t tgt_time = 0; - for (uint8_t i = 0; i < AUTOTUNE_DWELL_CYCLES; i++) { + for (uint8_t i = 0; i < dwell_cycles; i++) { meas_cnt=0; tgt_cnt=0; pull_from_meas_buffer(meas_cnt, meas_ampl, meas_time); pull_from_tgt_buffer(tgt_cnt, tgt_ampl, tgt_time); push_to_meas_buffer(0, 0.0f, 0); push_to_tgt_buffer(0, 0.0f, 0); - // gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: tgt_cnt=%f meas_cnt=%f", (double)(tgt_cnt), (double)(meas_cnt)); if (meas_cnt == tgt_cnt && meas_cnt != 0) { if (tgt_ampl > 0.0f) { @@ -106,8 +106,7 @@ void AC_AutoTune_FreqResp::update(float command, float tgt_resp, float meas_resp } else if (meas_cnt < tgt_cnt) { pull_from_meas_buffer(meas_cnt, meas_ampl, meas_time); push_to_meas_buffer(0, 0.0f, 0); - } - + } } if (gcnt > 0) { curr_test_gain = sum_gain / gcnt; @@ -135,7 +134,6 @@ void AC_AutoTune_FreqResp::update(float command, float tgt_resp, float meas_resp curr_test_freq = tgt_freq; cycle_complete = true; - // gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: cycles completed"); return; } @@ -155,7 +153,9 @@ void AC_AutoTune_FreqResp::update(float command, float tgt_resp, float meas_resp sweep_tgt.count_m1 = min_target_cnt - 1; sweep_tgt.amplitude_m1 = temp_tgt_ampl; temp_tgt_ampl = temp_max_target - temp_min_target; - push_to_tgt_buffer(min_target_cnt,temp_tgt_ampl,temp_max_tgt_time); + if (excitation == DWELL) { + push_to_tgt_buffer(min_target_cnt,temp_tgt_ampl,temp_max_tgt_time); + } } } else if (((response == ANGLE && !is_positive(prev_target) && is_positive(target_rate)) @@ -184,8 +184,9 @@ void AC_AutoTune_FreqResp::update(float command, float tgt_resp, float meas_resp sweep_meas.count_m1 = min_meas_cnt - 1; sweep_meas.amplitude_m1 = temp_meas_ampl; temp_meas_ampl = temp_max_meas - temp_min_meas; - push_to_meas_buffer(min_meas_cnt,temp_meas_ampl,temp_max_meas_time); - + if (excitation == DWELL) { + push_to_meas_buffer(min_meas_cnt,temp_meas_ampl,temp_max_meas_time); + } if (excitation == SWEEP) { float tgt_period = 0.001f * (temp_max_tgt_time - sweep_tgt.max_time_m1); if (!is_zero(tgt_period)) { @@ -282,7 +283,6 @@ void AC_AutoTune_FreqResp::push_to_tgt_buffer(uint16_t count, float amplitude, u sample.amplitude = amplitude; sample.time_ms = time_ms; tgt_peak_info_buffer.push(sample); - } // pull target peak info from buffer @@ -297,3 +297,4 @@ void AC_AutoTune_FreqResp::pull_from_tgt_buffer(uint16_t &count, float &litud amplitude = sample.amplitude; time_ms = sample.time_ms; } + diff --git a/libraries/AC_AutoTune/AC_AutoTune_FreqResp.h b/libraries/AC_AutoTune/AC_AutoTune_FreqResp.h index 95e1856765..ada80e103a 100644 --- a/libraries/AC_AutoTune/AC_AutoTune_FreqResp.h +++ b/libraries/AC_AutoTune/AC_AutoTune_FreqResp.h @@ -6,8 +6,6 @@ #include -#define AUTOTUNE_DWELL_CYCLES 6 - class AC_AutoTune_FreqResp { public: // Constructor @@ -29,7 +27,7 @@ public: // Initialize the Frequency Response Object. // Must be called before running dwell or frequency sweep tests - void init(InputType input_type, ResponseType response_type); + void init(InputType input_type, ResponseType response_type, uint8_t cycles); // Determines the gain and phase based on angle response for a dwell or sweep void update(float command, float tgt_resp, float meas_resp, float tgt_freq); @@ -137,6 +135,9 @@ private: // flag indicating when one oscillation cycle is complete bool cycle_complete = false; + // number of dwell cycles to complete for dwell excitation + uint8_t dwell_cycles; + // current test frequency, gain, and phase float curr_test_freq; float curr_test_gain; @@ -179,10 +180,10 @@ private: }; // Buffer object for measured peak data - ObjectBuffer meas_peak_info_buffer{AUTOTUNE_DWELL_CYCLES}; + ObjectBuffer meas_peak_info_buffer{12}; // Buffer object for target peak data - ObjectBuffer tgt_peak_info_buffer{AUTOTUNE_DWELL_CYCLES}; + ObjectBuffer tgt_peak_info_buffer{12}; // Push data into measured peak data buffer object void push_to_meas_buffer(uint16_t count, float amplitude, uint32_t time_ms); diff --git a/libraries/AC_AutoTune/AC_AutoTune_Heli.cpp b/libraries/AC_AutoTune/AC_AutoTune_Heli.cpp index 31f8985b8a..27e9406039 100644 --- a/libraries/AC_AutoTune/AC_AutoTune_Heli.cpp +++ b/libraries/AC_AutoTune/AC_AutoTune_Heli.cpp @@ -112,6 +112,20 @@ const AP_Param::GroupInfo AC_AutoTune_Heli::var_info[] = { // @User: Standard AP_GROUPINFO("VELXY_P", 6, AC_AutoTune_Heli, vel_hold_gain, 0.1f), + // @Param: ACC_MAX + // @DisplayName: AutoTune maximum allowable angular acceleration + // @Description: maximum angular acceleration in deg/s/s allowed during autotune maneuvers + // @Range: 1 4000 + // @User: Standard + AP_GROUPINFO("ACC_MAX", 7, AC_AutoTune_Heli, accel_max, 0.0f), + + // @Param: RAT_MAX + // @DisplayName: Autotune maximum allowable angular rate + // @Description: maximum angular rate in deg/s allowed during autotune maneuvers + // @Range: 0 500 + // @User: Standard + AP_GROUPINFO("RAT_MAX", 8, AC_AutoTune_Heli, rate_max, 0.0f), + AP_GROUPEND }; @@ -125,116 +139,128 @@ AC_AutoTune_Heli::AC_AutoTune_Heli() // initialize tests for each tune type void AC_AutoTune_Heli::test_init() { + AC_AutoTune_FreqResp::ResponseType resp_type = AC_AutoTune_FreqResp::ResponseType::RATE; + FreqRespCalcType calc_type = RATE; + FreqRespInput freq_resp_input = TARGET; + float freq_resp_amplitude = 5.0f; // amplitude in deg + float filter_freq = 10.0f; switch (tune_type) { case RFF_UP: - rate_ff_test_init(); - step_time_limit_ms = 10000; + if (!is_positive(next_test_freq)) { + start_freq = 0.25f * M_2PI; + } else { + start_freq = next_test_freq; + } + stop_freq = start_freq; + filter_freq = start_freq; + + attitude_control->bf_feedforward(false); + + // variables needed to initialize frequency response object and test method + resp_type = AC_AutoTune_FreqResp::ResponseType::RATE; + calc_type = RATE; + freq_resp_input = TARGET; + pre_calc_cycles = 1.0f; + num_dwell_cycles = 3; break; case MAX_GAINS: + // initialize start frequency for sweep + if (!is_positive(next_test_freq)) { + start_freq = min_sweep_freq; + stop_freq = max_sweep_freq; + sweep_complete = true; + } else { + start_freq = next_test_freq; + stop_freq = start_freq; + test_accel_max = 0.0f; + } + filter_freq = start_freq; + + attitude_control->bf_feedforward(false); + + // variables needed to initialize frequency response object and test method + resp_type = AC_AutoTune_FreqResp::ResponseType::RATE; + calc_type = RATE; + freq_resp_input = MOTOR; + pre_calc_cycles = 6.25f; + num_dwell_cycles = 6; + break; case RP_UP: case RD_UP: // initialize start frequency - if (is_zero(start_freq)) { - if (tune_type == RP_UP) { - // continue using frequency where testing left off or RD_UP completed - if (test_phase[12] > 0.0f && test_phase[12] < 180.0f) { - freq_cnt = 12; - // start with freq found for sweep where phase was 180 deg - } else if (!is_zero(sweep.ph180.freq)) { - freq_cnt = 12; - test_freq[freq_cnt] = sweep.ph180.freq - 0.25f * 3.14159f * 2.0f; - // otherwise start at min freq to step up in dwell frequency until phase > 160 deg - } else { - freq_cnt = 0; - test_freq[freq_cnt] = min_sweep_freq; - } - curr_test.freq = test_freq[freq_cnt]; - start_freq = curr_test.freq; - stop_freq = curr_test.freq; - - // MAX_GAINS and RD_UP both start with a sweep initially but if it has been completed then start dwells at the freq for 180 deg phase - } else { - if (!is_zero(sweep.ph180.freq)) { - freq_cnt = 12; - test_freq[freq_cnt] = sweep.ph180.freq - 0.25f * 3.14159f * 2.0f; - curr_test.freq = test_freq[freq_cnt]; - start_freq = curr_test.freq; - stop_freq = curr_test.freq; - if (tune_type == MAX_GAINS) { - reset_maxgains_update_gain_variables(); - } - } else { - start_freq = min_sweep_freq; - stop_freq = max_sweep_freq; - } - } - } - if (!is_equal(start_freq,stop_freq)) { - // initialize determine_gain function whenever test is initialized - freqresp.init(AC_AutoTune_FreqResp::InputType::SWEEP, AC_AutoTune_FreqResp::ResponseType::RATE); - dwell_test_init(start_freq, stop_freq, stop_freq, RATE); - } else { - // initialize determine_gain function whenever test is initialized - freqresp.init(AC_AutoTune_FreqResp::InputType::DWELL, AC_AutoTune_FreqResp::ResponseType::RATE); - dwell_test_init(start_freq, stop_freq, start_freq, RATE); - } - if (!is_zero(start_freq)) { - // 4 seconds is added to allow aircraft to achieve start attitude. Then the time to conduct the dwells is added to it. - step_time_limit_ms = (uint32_t)(4000 + (float)(AUTOTUNE_DWELL_CYCLES + 2) * 1000.0f * M_2PI / start_freq); - } - break; - case SP_UP: - // initialize start frequency - if (is_zero(start_freq)) { - if (!is_zero(sweep.maxgain.freq)) { - freq_cnt = 12; - test_freq[freq_cnt] = sweep.maxgain.freq - 0.25f * 3.14159f * 2.0f; - curr_test.freq = test_freq[freq_cnt]; - start_freq = curr_test.freq; - stop_freq = curr_test.freq; - test_accel_max = 0.0f; + if (!is_positive(next_test_freq)) { + // continue using frequency where testing left off with RD_UP completed + if (curr_data.phase > 150.0f && curr_data.phase < 180.0f && tune_type == RP_UP) { + start_freq = curr_data.freq; + // start with freq found for sweep where phase was 180 deg + } else if (!is_zero(sweep_tgt.ph180.freq)) { + start_freq = sweep_tgt.ph180.freq; + // otherwise start at min freq to step up in dwell frequency until phase > 160 deg } else { start_freq = min_sweep_freq; - stop_freq = max_sweep_freq; } + } else { + start_freq = next_test_freq; } + stop_freq = start_freq; + filter_freq = start_freq; + attitude_control->bf_feedforward(false); - if (!is_equal(start_freq,stop_freq)) { - // initialize determine gain function - freqresp.init(AC_AutoTune_FreqResp::InputType::SWEEP, AC_AutoTune_FreqResp::ResponseType::ANGLE); - dwell_test_init(start_freq, stop_freq, stop_freq, DRB); + // variables needed to initialize frequency response object and test method + resp_type = AC_AutoTune_FreqResp::ResponseType::RATE; + calc_type = RATE; + freq_resp_input = TARGET; + pre_calc_cycles = 6.25f; + num_dwell_cycles = 6; + break; + case SP_UP: + // initialize start frequency for sweep + if (!is_positive(next_test_freq)) { + start_freq = min_sweep_freq; + stop_freq = max_sweep_freq; + sweep_complete = true; } else { - // initialize determine gain function - freqresp.init(AC_AutoTune_FreqResp::InputType::DWELL, AC_AutoTune_FreqResp::ResponseType::ANGLE); - dwell_test_init(start_freq, stop_freq, start_freq, DRB); + start_freq = next_test_freq; + stop_freq = start_freq; + test_accel_max = 0.0f; } + filter_freq = start_freq; + attitude_control->bf_feedforward(false); - // TODO add time limit for sweep test - if (!is_zero(start_freq)) { - // 1 seconds is added for a little buffer. Then the time to conduct the dwells is added to it. - step_time_limit_ms = (uint32_t)(2000 + (float)(AUTOTUNE_DWELL_CYCLES + 7) * 1000.0f * M_2PI / start_freq); - } + // variables needed to initialize frequency response object and test method + resp_type = AC_AutoTune_FreqResp::ResponseType::ANGLE; + calc_type = DRB; + freq_resp_input = TARGET; + pre_calc_cycles = 6.25f; + num_dwell_cycles = 6; break; case TUNE_CHECK: // initialize start frequency - if (is_zero(start_freq)) { - start_freq = min_sweep_freq; - stop_freq = max_sweep_freq; - } - // initialize determine gain function - freqresp.init(AC_AutoTune_FreqResp::InputType::SWEEP, AC_AutoTune_FreqResp::ResponseType::ANGLE); - dwell_test_init(start_freq, stop_freq, stop_freq, ANGLE); - // TODO add time limit for sweep test - if (!is_zero(start_freq)) { - // 1 seconds is added for a little buffer. Then the time to conduct the dwells is added to it. - step_time_limit_ms = (uint32_t)(2000 + (float)(AUTOTUNE_DWELL_CYCLES + 7) * 1000.0f * M_2PI / start_freq); - } + start_freq = min_sweep_freq; + stop_freq = max_sweep_freq; + test_accel_max = 0.0f; + filter_freq = start_freq; + + // variables needed to initialize frequency response object and test method + resp_type = AC_AutoTune_FreqResp::ResponseType::ANGLE; + calc_type = ANGLE; + freq_resp_input = TARGET; break; default: break; } + if (!is_equal(start_freq,stop_freq)) { + input_type = AC_AutoTune_FreqResp::InputType::SWEEP; + } else { + input_type = AC_AutoTune_FreqResp::InputType::DWELL; + } + + + // initialize dwell test method + dwell_test_init(start_freq, stop_freq, freq_resp_amplitude, filter_freq, freq_resp_input, calc_type, resp_type, input_type); + start_angles = Vector3f(roll_cd, pitch_cd, desired_yaw_cd); // heli specific } @@ -256,12 +282,12 @@ void AC_AutoTune_Heli::test_run(AxisType test_axis, const float dir_sign) attitude_control->input_euler_angle_roll_pitch_yaw(roll_cd, pitch_cd, desired_yaw_cd, true); if ((tune_type == RP_UP || tune_type == RD_UP) && (max_rate_p.max_allowed <= 0.0f || max_rate_d.max_allowed <= 0.0f)) { - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: Max Gain Determination Failed"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: Max Gain Determination Failed"); mode = FAILED; LOGGER_WRITE_EVENT(LogEvent::AUTOTUNE_FAILED); update_gcs(AUTOTUNE_MESSAGE_FAILED); } else if ((tune_type == MAX_GAINS || tune_type == RP_UP || tune_type == RD_UP || tune_type == SP_UP) && exceeded_freq_range(start_freq)){ - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: Exceeded frequency range"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: Exceeded frequency range"); mode = FAILED; LOGGER_WRITE_EVENT(LogEvent::AUTOTUNE_FAILED); update_gcs(AUTOTUNE_MESSAGE_FAILED); @@ -272,27 +298,8 @@ void AC_AutoTune_Heli::test_run(AxisType test_axis, const float dir_sign) return; } - switch (tune_type) { - case RFF_UP: - rate_ff_test_run(AUTOTUNE_HELI_TARGET_ANGLE_RLLPIT_CD, AUTOTUNE_HELI_TARGET_RATE_RLLPIT_CDS, dir_sign); - break; - case RP_UP: - case RD_UP: - dwell_test_run(1, start_freq, stop_freq, test_gain[freq_cnt], test_phase[freq_cnt], RATE); - break; - case MAX_GAINS: - dwell_test_run(0, start_freq, stop_freq, test_gain[freq_cnt], test_phase[freq_cnt], RATE); - break; - case SP_UP: - dwell_test_run(1, start_freq, stop_freq, test_gain[freq_cnt], test_phase[freq_cnt], DRB); - break; - case TUNE_CHECK: - dwell_test_run(1, start_freq, stop_freq, test_gain[freq_cnt], test_phase[freq_cnt], ANGLE); - break; - default: - step = UPDATE_GAINS; - break; - } + dwell_test_run(curr_data); + } // heli specific gcs announcements @@ -303,20 +310,21 @@ void AC_AutoTune_Heli::do_gcs_announcements() return; } - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: %s %s", axis_string(), type_string()); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: %s %s", axis_string(), type_string()); send_step_string(); switch (tune_type) { + case RFF_UP: case RD_UP: case RP_UP: case MAX_GAINS: case SP_UP: case TUNE_CHECK: if (is_equal(start_freq,stop_freq)) { - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: Dwell"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: Dwell"); } else { - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: Sweep"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: Sweep"); if (settle_time == 0) { - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: freq=%f gain=%f phase=%f", (double)(curr_test.freq), (double)(curr_test.gain), (double)(curr_test.phase)); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: freq=%f gain=%f phase=%f", (double)(curr_test.freq), (double)(curr_test.gain), (double)(curr_test.phase)); } } break; @@ -336,22 +344,22 @@ void AC_AutoTune_Heli::do_post_test_gcs_announcements() { float tune_accel = 0.0f; switch (axis) { - case ROLL: + case AxisType::ROLL: tune_rp = tune_roll_rp; tune_rd = tune_roll_rd; tune_rff = tune_roll_rff; tune_sp = tune_roll_sp; tune_accel = tune_roll_accel; break; - case PITCH: + case AxisType::PITCH: tune_rp = tune_pitch_rp; tune_rd = tune_pitch_rd; tune_rff = tune_pitch_rff; tune_sp = tune_pitch_sp; tune_accel = tune_pitch_accel; break; - case YAW: - case YAW_D: + case AxisType::YAW: + case AxisType::YAW_D: tune_rp = tune_yaw_rp; tune_rd = tune_yaw_rd; tune_rff = tune_yaw_rff; @@ -363,27 +371,26 @@ void AC_AutoTune_Heli::do_post_test_gcs_announcements() { if (step == UPDATE_GAINS) { switch (tune_type) { case RFF_UP: - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: target=%f rotation=%f command=%f", (double)(test_tgt_rate_filt*57.3f), (double)(test_rate_filt*57.3f), (double)(test_command_filt)); - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: ff=%f", (double)tune_rff); - break; case RP_UP: case RD_UP: case SP_UP: case MAX_GAINS: if (is_equal(start_freq,stop_freq)) { // announce results of dwell - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: freq=%f gain=%f", (double)(test_freq[freq_cnt]), (double)(test_gain[freq_cnt])); - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: ph=%f", (double)(test_phase[freq_cnt])); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: freq=%f gain=%f", (double)(curr_data.freq), (double)(curr_data.gain)); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: ph=%f", (double)(curr_data.phase)); if (tune_type == RP_UP) { - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: rate_p=%f", (double)(tune_rp)); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: rate_p=%f", (double)(tune_rp)); } else if (tune_type == RD_UP) { - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: rate_d=%f", (double)(tune_rd)); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: rate_d=%f", (double)(tune_rd)); + } else if (tune_type == RFF_UP) { + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: rate_ff=%f", (double)(tune_rff)); } else if (tune_type == SP_UP) { - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: angle_p=%f tune_accel=%f max_accel=%f", (double)(tune_sp), (double)(tune_accel), (double)(test_accel_max)); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: angle_p=%f tune_accel=%f max_accel=%f", (double)(tune_sp), (double)(tune_accel), (double)(test_accel_max)); } } else { - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: max_freq=%f max_gain=%f", (double)(sweep.maxgain.freq), (double)(sweep.maxgain.gain)); - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: ph180_freq=%f ph180_gain=%f", (double)(sweep.ph180.freq), (double)(sweep.ph180.gain)); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: max_freq=%f max_gain=%f", (double)(sweep_tgt.maxgain.freq), (double)(sweep_tgt.maxgain.gain)); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: ph180_freq=%f ph180_gain=%f", (double)(sweep_tgt.ph180.freq), (double)(sweep_tgt.ph180.gain)); } break; default: @@ -399,7 +406,7 @@ void AC_AutoTune_Heli::backup_gains_and_initialise() AC_AutoTune::backup_gains_and_initialise(); // initializes dwell test sequence for rate_p_up and rate_d_up tests for tradheli - freq_cnt = 0; + next_test_freq = 0.0f; start_freq = 0.0f; stop_freq = 0.0f; @@ -414,6 +421,7 @@ void AC_AutoTune_Heli::backup_gains_and_initialise() orig_roll_smax = attitude_control->get_rate_roll_pid().slew_limit(); orig_roll_sp = attitude_control->get_angle_roll_p().kP(); orig_roll_accel = attitude_control->get_accel_roll_max_cdss(); + orig_roll_rate = attitude_control->get_ang_vel_roll_max_degs(); tune_roll_rp = attitude_control->get_rate_roll_pid().kP(); tune_roll_rd = attitude_control->get_rate_roll_pid().kD(); tune_roll_rff = attitude_control->get_rate_roll_pid().ff(); @@ -428,6 +436,7 @@ void AC_AutoTune_Heli::backup_gains_and_initialise() orig_pitch_smax = attitude_control->get_rate_pitch_pid().slew_limit(); orig_pitch_sp = attitude_control->get_angle_pitch_p().kP(); orig_pitch_accel = attitude_control->get_accel_pitch_max_cdss(); + orig_pitch_rate = attitude_control->get_ang_vel_pitch_max_degs(); tune_pitch_rp = attitude_control->get_rate_pitch_pid().kP(); tune_pitch_rd = attitude_control->get_rate_pitch_pid().kD(); tune_pitch_rff = attitude_control->get_rate_pitch_pid().ff(); @@ -443,6 +452,7 @@ void AC_AutoTune_Heli::backup_gains_and_initialise() orig_yaw_rLPF = attitude_control->get_rate_yaw_pid().filt_E_hz(); orig_yaw_accel = attitude_control->get_accel_yaw_max_cdss(); orig_yaw_sp = attitude_control->get_angle_yaw_p().kP(); + orig_yaw_rate = attitude_control->get_ang_vel_yaw_max_degs(); tune_yaw_rp = attitude_control->get_rate_yaw_pid().kP(); tune_yaw_rd = attitude_control->get_rate_yaw_pid().kD(); tune_yaw_rff = attitude_control->get_rate_yaw_pid().ff(); @@ -459,13 +469,13 @@ void AC_AutoTune_Heli::load_orig_gains() { attitude_control->bf_feedforward(orig_bf_feedforward); if (roll_enabled()) { - load_gain_set(ROLL, orig_roll_rp, orig_roll_ri, orig_roll_rd, orig_roll_rff, orig_roll_sp, orig_roll_accel, orig_roll_fltt, 0.0f, orig_roll_smax); + load_gain_set(AxisType::ROLL, orig_roll_rp, orig_roll_ri, orig_roll_rd, orig_roll_rff, orig_roll_sp, orig_roll_accel, orig_roll_fltt, 0.0f, orig_roll_smax, orig_roll_rate); } if (pitch_enabled()) { - load_gain_set(PITCH, orig_pitch_rp, orig_pitch_ri, orig_pitch_rd, orig_pitch_rff, orig_pitch_sp, orig_pitch_accel, orig_pitch_fltt, 0.0f, orig_pitch_smax); + load_gain_set(AxisType::PITCH, orig_pitch_rp, orig_pitch_ri, orig_pitch_rd, orig_pitch_rff, orig_pitch_sp, orig_pitch_accel, orig_pitch_fltt, 0.0f, orig_pitch_smax, orig_pitch_rate); } if (yaw_enabled()) { - load_gain_set(YAW, orig_yaw_rp, orig_yaw_ri, orig_yaw_rd, orig_yaw_rff, orig_yaw_sp, orig_yaw_accel, orig_yaw_fltt, orig_yaw_rLPF, orig_yaw_smax); + load_gain_set(AxisType::YAW, orig_yaw_rp, orig_yaw_ri, orig_yaw_rd, orig_yaw_rff, orig_yaw_sp, orig_yaw_accel, orig_yaw_fltt, orig_yaw_rLPF, orig_yaw_smax, orig_yaw_rate); } } @@ -477,16 +487,14 @@ void AC_AutoTune_Heli::load_tuned_gains() attitude_control->set_accel_roll_max_cdss(0.0f); attitude_control->set_accel_pitch_max_cdss(0.0f); } - if (roll_enabled()) { - load_gain_set(ROLL, tune_roll_rp, tune_roll_rff*AUTOTUNE_FFI_RATIO_FINAL, tune_roll_rd, tune_roll_rff, tune_roll_sp, tune_roll_accel, orig_roll_fltt, 0.0f, orig_roll_smax); + if ((axes_completed & AUTOTUNE_AXIS_BITMASK_ROLL) && roll_enabled()) { + load_gain_set(AxisType::ROLL, tune_roll_rp, tune_roll_rff*AUTOTUNE_FFI_RATIO_FINAL, tune_roll_rd, tune_roll_rff, tune_roll_sp, tune_roll_accel, orig_roll_fltt, 0.0f, orig_roll_smax, orig_roll_rate); } - if (pitch_enabled()) { - load_gain_set(PITCH, tune_pitch_rp, tune_pitch_rff*AUTOTUNE_FFI_RATIO_FINAL, tune_pitch_rd, tune_pitch_rff, tune_pitch_sp, tune_pitch_accel, orig_pitch_fltt, 0.0f, orig_pitch_smax); + if ((axes_completed & AUTOTUNE_AXIS_BITMASK_PITCH) && pitch_enabled()) { + load_gain_set(AxisType::PITCH, tune_pitch_rp, tune_pitch_rff*AUTOTUNE_FFI_RATIO_FINAL, tune_pitch_rd, tune_pitch_rff, tune_pitch_sp, tune_pitch_accel, orig_pitch_fltt, 0.0f, orig_pitch_smax, orig_pitch_rate); } - if (yaw_enabled()) { - if (!is_zero(tune_yaw_rp)) { - load_gain_set(YAW, tune_yaw_rp, tune_yaw_rp*AUTOTUNE_YAW_PI_RATIO_FINAL, tune_yaw_rd, tune_yaw_rff, tune_yaw_sp, tune_yaw_accel, orig_yaw_fltt, tune_yaw_rLPF, orig_yaw_smax); - } + if ((axes_completed & AUTOTUNE_AXIS_BITMASK_YAW) && yaw_enabled() && !is_zero(tune_yaw_rp)) { + load_gain_set(AxisType::YAW, tune_yaw_rp, tune_yaw_rp*AUTOTUNE_YAW_PI_RATIO_FINAL, tune_yaw_rd, tune_yaw_rff, tune_yaw_sp, tune_yaw_accel, orig_yaw_fltt, tune_yaw_rLPF, orig_yaw_smax, orig_yaw_rate); } } @@ -498,13 +506,13 @@ void AC_AutoTune_Heli::load_intra_test_gains() // sanity check the gains attitude_control->bf_feedforward(true); if (roll_enabled()) { - load_gain_set(ROLL, orig_roll_rp, orig_roll_rff * AUTOTUNE_FFI_RATIO_FOR_TESTING, orig_roll_rd, orig_roll_rff, orig_roll_sp, orig_roll_accel, orig_roll_fltt, 0.0f, orig_roll_smax); + load_gain_set(AxisType::ROLL, orig_roll_rp, orig_roll_rff * AUTOTUNE_FFI_RATIO_FOR_TESTING, orig_roll_rd, orig_roll_rff, orig_roll_sp, orig_roll_accel, orig_roll_fltt, 0.0f, orig_roll_smax, orig_roll_rate); } if (pitch_enabled()) { - load_gain_set(PITCH, orig_pitch_rp, orig_pitch_rff * AUTOTUNE_FFI_RATIO_FOR_TESTING, orig_pitch_rd, orig_pitch_rff, orig_pitch_sp, orig_pitch_accel, orig_pitch_fltt, 0.0f, orig_pitch_smax); + load_gain_set(AxisType::PITCH, orig_pitch_rp, orig_pitch_rff * AUTOTUNE_FFI_RATIO_FOR_TESTING, orig_pitch_rd, orig_pitch_rff, orig_pitch_sp, orig_pitch_accel, orig_pitch_fltt, 0.0f, orig_pitch_smax, orig_pitch_rate); } if (yaw_enabled()) { - load_gain_set(YAW, orig_yaw_rp, orig_yaw_rp*AUTOTUNE_PI_RATIO_FOR_TESTING, orig_yaw_rd, orig_yaw_rff, orig_yaw_sp, orig_yaw_accel, orig_yaw_fltt, orig_yaw_rLPF, orig_yaw_smax); + load_gain_set(AxisType::YAW, orig_yaw_rp, orig_yaw_rp*AUTOTUNE_PI_RATIO_FOR_TESTING, orig_yaw_rd, orig_yaw_rff, orig_yaw_sp, orig_yaw_accel, orig_yaw_fltt, orig_yaw_rLPF, orig_yaw_smax, orig_yaw_rate); } } @@ -512,9 +520,18 @@ void AC_AutoTune_Heli::load_intra_test_gains() // called by control_attitude() just before it beings testing a gain (i.e. just before it twitches) void AC_AutoTune_Heli::load_test_gains() { - float rate_p, rate_i, rate_d; + float rate_p, rate_i, rate_d, rate_test_max, accel_test_max; switch (axis) { - case ROLL: + case AxisType::ROLL: + + if (tune_type == TUNE_CHECK) { + rate_test_max = orig_roll_rate; + accel_test_max = tune_roll_accel; + } else { + // have attitude controller use accel and rate limit parameter + rate_test_max = rate_max; + accel_test_max = accel_max; + } if (tune_type == SP_UP || tune_type == TUNE_CHECK) { rate_i = tune_roll_rff*AUTOTUNE_FFI_RATIO_FINAL; } else { @@ -528,9 +545,17 @@ void AC_AutoTune_Heli::load_test_gains() rate_p = tune_roll_rp; rate_d = tune_roll_rd; } - load_gain_set(ROLL, rate_p, rate_i, rate_d, tune_roll_rff, tune_roll_sp, tune_roll_accel, orig_roll_fltt, 0.0f, 0.0f); + load_gain_set(AxisType::ROLL, rate_p, rate_i, rate_d, tune_roll_rff, tune_roll_sp, accel_test_max, orig_roll_fltt, 0.0f, 0.0f, rate_test_max); break; - case PITCH: + case AxisType::PITCH: + if (tune_type == TUNE_CHECK) { + rate_test_max = orig_pitch_rate; + accel_test_max = tune_pitch_accel; + } else { + // have attitude controller use accel and rate limit parameter + rate_test_max = rate_max; + accel_test_max = accel_max; + } if (tune_type == SP_UP || tune_type == TUNE_CHECK) { rate_i = tune_pitch_rff*AUTOTUNE_FFI_RATIO_FINAL; } else { @@ -544,56 +569,67 @@ void AC_AutoTune_Heli::load_test_gains() rate_p = tune_pitch_rp; rate_d = tune_pitch_rd; } - load_gain_set(PITCH, rate_p, rate_i, rate_d, tune_pitch_rff, tune_pitch_sp, tune_pitch_accel, orig_pitch_fltt, 0.0f, 0.0f); + load_gain_set(AxisType::PITCH, rate_p, rate_i, rate_d, tune_pitch_rff, tune_pitch_sp, accel_test_max, orig_pitch_fltt, 0.0f, 0.0f, rate_test_max); break; - case YAW: - case YAW_D: + case AxisType::YAW: + case AxisType::YAW_D: + if (tune_type == TUNE_CHECK) { + rate_test_max = orig_yaw_rate; + accel_test_max = tune_yaw_accel; + } else { + // have attitude controller use accel and rate limit parameter + rate_test_max = rate_max; + accel_test_max = accel_max; + } if (tune_type == SP_UP || tune_type == TUNE_CHECK) { rate_i = tune_yaw_rp*AUTOTUNE_YAW_PI_RATIO_FINAL; } else { // freeze integrator to hold trim by making i term small during rate controller tuning rate_i = 0.01f * orig_yaw_ri; } - load_gain_set(YAW, tune_yaw_rp, rate_i, tune_yaw_rd, tune_yaw_rff, tune_yaw_sp, tune_yaw_accel, orig_yaw_fltt, tune_yaw_rLPF, 0.0f); + load_gain_set(AxisType::YAW, tune_yaw_rp, rate_i, tune_yaw_rd, tune_yaw_rff, tune_yaw_sp, accel_test_max, orig_yaw_fltt, tune_yaw_rLPF, 0.0f, rate_test_max); break; } } // load gains -void AC_AutoTune_Heli::load_gain_set(AxisType s_axis, float rate_p, float rate_i, float rate_d, float rate_ff, float angle_p, float max_accel, float rate_fltt, float rate_flte, float smax) +void AC_AutoTune_Heli::load_gain_set(AxisType s_axis, float rate_p, float rate_i, float rate_d, float rate_ff, float angle_p, float max_accel, float rate_fltt, float rate_flte, float smax, float max_rate) { switch (s_axis) { - case ROLL: - attitude_control->get_rate_roll_pid().kP(rate_p); - attitude_control->get_rate_roll_pid().kI(rate_i); - attitude_control->get_rate_roll_pid().kD(rate_d); - attitude_control->get_rate_roll_pid().ff(rate_ff); - attitude_control->get_rate_roll_pid().filt_T_hz(rate_fltt); - attitude_control->get_rate_roll_pid().slew_limit(smax); - attitude_control->get_angle_roll_p().kP(angle_p); + case AxisType::ROLL: + attitude_control->get_rate_roll_pid().set_kP(rate_p); + attitude_control->get_rate_roll_pid().set_kI(rate_i); + attitude_control->get_rate_roll_pid().set_kD(rate_d); + attitude_control->get_rate_roll_pid().set_ff(rate_ff); + attitude_control->get_rate_roll_pid().set_filt_T_hz(rate_fltt); + attitude_control->get_rate_roll_pid().set_slew_limit(smax); + attitude_control->get_angle_roll_p().set_kP(angle_p); attitude_control->set_accel_roll_max_cdss(max_accel); + attitude_control->set_ang_vel_roll_max_degs(max_rate); break; - case PITCH: - attitude_control->get_rate_pitch_pid().kP(rate_p); - attitude_control->get_rate_pitch_pid().kI(rate_i); - attitude_control->get_rate_pitch_pid().kD(rate_d); - attitude_control->get_rate_pitch_pid().ff(rate_ff); - attitude_control->get_rate_pitch_pid().filt_T_hz(rate_fltt); - attitude_control->get_rate_pitch_pid().slew_limit(smax); - attitude_control->get_angle_pitch_p().kP(angle_p); + case AxisType::PITCH: + attitude_control->get_rate_pitch_pid().set_kP(rate_p); + attitude_control->get_rate_pitch_pid().set_kI(rate_i); + attitude_control->get_rate_pitch_pid().set_kD(rate_d); + attitude_control->get_rate_pitch_pid().set_ff(rate_ff); + attitude_control->get_rate_pitch_pid().set_filt_T_hz(rate_fltt); + attitude_control->get_rate_pitch_pid().set_slew_limit(smax); + attitude_control->get_angle_pitch_p().set_kP(angle_p); attitude_control->set_accel_pitch_max_cdss(max_accel); + attitude_control->set_ang_vel_pitch_max_degs(max_rate); break; - case YAW: - case YAW_D: - attitude_control->get_rate_yaw_pid().kP(rate_p); - attitude_control->get_rate_yaw_pid().kI(rate_i); - attitude_control->get_rate_yaw_pid().kD(rate_d); - attitude_control->get_rate_yaw_pid().ff(rate_ff); - attitude_control->get_rate_yaw_pid().filt_T_hz(rate_fltt); - attitude_control->get_rate_yaw_pid().slew_limit(smax); - attitude_control->get_rate_yaw_pid().filt_E_hz(rate_flte); - attitude_control->get_angle_yaw_p().kP(angle_p); + case AxisType::YAW: + case AxisType::YAW_D: + attitude_control->get_rate_yaw_pid().set_kP(rate_p); + attitude_control->get_rate_yaw_pid().set_kI(rate_i); + attitude_control->get_rate_yaw_pid().set_kD(rate_d); + attitude_control->get_rate_yaw_pid().set_ff(rate_ff); + attitude_control->get_rate_yaw_pid().set_filt_T_hz(rate_fltt); + attitude_control->get_rate_yaw_pid().set_slew_limit(smax); + attitude_control->get_rate_yaw_pid().set_filt_E_hz(rate_flte); + attitude_control->get_angle_yaw_p().set_kP(angle_p); attitude_control->set_accel_yaw_max_cdss(max_accel); + attitude_control->set_ang_vel_yaw_max_degs(max_rate); break; } } @@ -615,7 +651,7 @@ void AC_AutoTune_Heli::save_tuning_gains() // sanity check the rate P values if ((axes_completed & AUTOTUNE_AXIS_BITMASK_ROLL) && roll_enabled()) { - load_gain_set(ROLL, tune_roll_rp, tune_roll_rff*AUTOTUNE_FFI_RATIO_FINAL, tune_roll_rd, tune_roll_rff, tune_roll_sp, tune_roll_accel, orig_roll_fltt, 0.0f, orig_roll_smax); + load_gain_set(AxisType::ROLL, tune_roll_rp, tune_roll_rff*AUTOTUNE_FFI_RATIO_FINAL, tune_roll_rd, tune_roll_rff, tune_roll_sp, tune_roll_accel, orig_roll_fltt, 0.0f, orig_roll_smax, orig_roll_rate); // save rate roll gains attitude_control->get_rate_roll_pid().save_gains(); @@ -632,7 +668,7 @@ void AC_AutoTune_Heli::save_tuning_gains() } if ((axes_completed & AUTOTUNE_AXIS_BITMASK_PITCH) && pitch_enabled()) { - load_gain_set(PITCH, tune_pitch_rp, tune_pitch_rff*AUTOTUNE_FFI_RATIO_FINAL, tune_pitch_rd, tune_pitch_rff, tune_pitch_sp, tune_pitch_accel, orig_pitch_fltt, 0.0f, orig_pitch_smax); + load_gain_set(AxisType::PITCH, tune_pitch_rp, tune_pitch_rff*AUTOTUNE_FFI_RATIO_FINAL, tune_pitch_rd, tune_pitch_rff, tune_pitch_sp, tune_pitch_accel, orig_pitch_fltt, 0.0f, orig_pitch_smax, orig_pitch_rate); // save rate pitch gains attitude_control->get_rate_pitch_pid().save_gains(); @@ -649,7 +685,7 @@ void AC_AutoTune_Heli::save_tuning_gains() } if ((axes_completed & AUTOTUNE_AXIS_BITMASK_YAW) && yaw_enabled() && !is_zero(tune_yaw_rp)) { - load_gain_set(YAW, tune_yaw_rp, tune_yaw_rp*AUTOTUNE_YAW_PI_RATIO_FINAL, tune_yaw_rd, tune_yaw_rff, tune_yaw_sp, tune_yaw_accel, orig_yaw_fltt, orig_yaw_rLPF, orig_yaw_smax); + load_gain_set(AxisType::YAW, tune_yaw_rp, tune_yaw_rp*AUTOTUNE_YAW_PI_RATIO_FINAL, tune_yaw_rd, tune_yaw_rff, tune_yaw_sp, tune_yaw_accel, orig_yaw_fltt, orig_yaw_rLPF, orig_yaw_smax, orig_yaw_rate); // save rate yaw gains attitude_control->get_rate_yaw_pid().save_gains(); @@ -677,14 +713,14 @@ void AC_AutoTune_Heli::save_tuning_gains() void AC_AutoTune_Heli::report_final_gains(AxisType test_axis) const { switch (test_axis) { - case ROLL: + case AxisType::ROLL: report_axis_gains("Roll", tune_roll_rp, tune_roll_rff*AUTOTUNE_FFI_RATIO_FINAL, tune_roll_rd, tune_roll_rff, tune_roll_sp, tune_roll_accel); break; - case PITCH: + case AxisType::PITCH: report_axis_gains("Pitch", tune_pitch_rp, tune_pitch_rff*AUTOTUNE_FFI_RATIO_FINAL, tune_pitch_rd, tune_pitch_rff, tune_pitch_sp, tune_pitch_accel); break; - case YAW: - case YAW_D: + case AxisType::YAW: + case AxisType::YAW_D: report_axis_gains("Yaw", tune_yaw_rp, tune_yaw_rp*AUTOTUNE_YAW_PI_RATIO_FINAL, tune_yaw_rd, tune_yaw_rff, tune_yaw_sp, tune_yaw_accel); break; } @@ -693,210 +729,38 @@ void AC_AutoTune_Heli::report_final_gains(AxisType test_axis) const // report gain formatting helper void AC_AutoTune_Heli::report_axis_gains(const char* axis_string, float rate_P, float rate_I, float rate_D, float rate_ff, float angle_P, float max_accel) const { - gcs().send_text(MAV_SEVERITY_NOTICE,"AutoTune: %s complete", axis_string); - gcs().send_text(MAV_SEVERITY_NOTICE,"AutoTune: %s Rate: P:%0.4f, I:%0.4f, D:%0.5f, FF:%0.4f",axis_string,rate_P,rate_I,rate_D,rate_ff); - gcs().send_text(MAV_SEVERITY_NOTICE,"AutoTune: %s Angle P:%0.2f, Max Accel:%0.0f",axis_string,angle_P,max_accel); + GCS_SEND_TEXT(MAV_SEVERITY_NOTICE,"AutoTune: %s complete", axis_string); + GCS_SEND_TEXT(MAV_SEVERITY_NOTICE,"AutoTune: %s Rate: P:%0.4f, I:%0.4f, D:%0.5f, FF:%0.4f",axis_string,rate_P,rate_I,rate_D,rate_ff); + GCS_SEND_TEXT(MAV_SEVERITY_NOTICE,"AutoTune: %s Angle P:%0.2f, Max Accel:%0.0f",axis_string,angle_P,max_accel); } - -void AC_AutoTune_Heli::rate_ff_test_init() +void AC_AutoTune_Heli::dwell_test_init(float start_frq, float stop_frq, float amplitude, float filt_freq, FreqRespInput freq_resp_input, FreqRespCalcType calc_type, AC_AutoTune_FreqResp::ResponseType resp_type, AC_AutoTune_FreqResp::InputType waveform_input_type) { - ff_test_phase = 0; - rotation_rate_filt.reset(0); - rotation_rate_filt.set_cutoff_frequency(5.0f); - command_filt.reset(0); - command_filt.set_cutoff_frequency(5.0f); - target_rate_filt.reset(0); - target_rate_filt.set_cutoff_frequency(5.0f); - test_command_filt = 0.0f; - test_rate_filt = 0.0f; - test_tgt_rate_filt = 0.0f; - filt_target_rate = 0.0f; - settle_time = 200; - phase_out_time = 500; - rate_request_cds.reset(0); - rate_request_cds.set_cutoff_frequency(1.0f); - angle_request_cd.reset(0); - angle_request_cd.set_cutoff_frequency(1.0f); -} + test_input_type = waveform_input_type; + test_freq_resp_input = freq_resp_input; + test_calc_type = calc_type; + test_start_freq = start_frq; + //target attitude magnitude + tgt_attitude = radians(amplitude); -void AC_AutoTune_Heli::rate_ff_test_run(float max_angle_cd, float target_rate_cds, float dir_sign) -{ - float gyro_reading = 0.0f; - float command_reading =0.0f; - float tgt_rate_reading = 0.0f; - const uint32_t now = AP_HAL::millis(); - - target_rate_cds = dir_sign * target_rate_cds; - - switch (axis) { - case ROLL: - gyro_reading = ahrs_view->get_gyro().x; - command_reading = motors->get_roll(); - tgt_rate_reading = attitude_control->rate_bf_targets().x; - if (settle_time > 0) { - settle_time--; - trim_command_reading = motors->get_roll(); - rate_request_cds.reset(gyro_reading); - } else if (((ahrs_view->roll_sensor <= max_angle_cd + start_angle && is_positive(dir_sign)) - || (ahrs_view->roll_sensor >= -max_angle_cd + start_angle && !is_positive(dir_sign))) - && ff_test_phase == 0) { - rate_request_cds.apply(target_rate_cds, AP::scheduler().get_loop_period_s()); - attitude_control->input_rate_bf_roll_pitch_yaw(rate_request_cds.get(), 0.0f, 0.0f); - } else if (((ahrs_view->roll_sensor > max_angle_cd + start_angle && is_positive(dir_sign)) - || (ahrs_view->roll_sensor < -max_angle_cd + start_angle && !is_positive(dir_sign))) - && ff_test_phase == 0) { - ff_test_phase = 1; - rate_request_cds.apply(-target_rate_cds, AP::scheduler().get_loop_period_s()); - attitude_control->input_rate_bf_roll_pitch_yaw(rate_request_cds.get(), 0.0f, 0.0f); - attitude_control->rate_bf_roll_target(rate_request_cds.get()); - } else if (((ahrs_view->roll_sensor >= -max_angle_cd + start_angle && is_positive(dir_sign)) - || (ahrs_view->roll_sensor <= max_angle_cd + start_angle && !is_positive(dir_sign))) - && ff_test_phase == 1 ) { - rate_request_cds.apply(-target_rate_cds, AP::scheduler().get_loop_period_s()); - attitude_control->input_rate_bf_roll_pitch_yaw(rate_request_cds.get(), 0.0f, 0.0f); - attitude_control->rate_bf_roll_target(rate_request_cds.get()); - } else if (((ahrs_view->roll_sensor < -max_angle_cd + start_angle && is_positive(dir_sign)) - || (ahrs_view->roll_sensor > max_angle_cd + start_angle && !is_positive(dir_sign))) - && ff_test_phase == 1 ) { - ff_test_phase = 2; - attitude_control->reset_target_and_rate(false); - angle_request_cd.reset(ahrs_view->roll_sensor); - attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(angle_request_cd.get(), start_angles.y, 0.0f); - } else if (ff_test_phase == 2 ) { - angle_request_cd.apply(start_angles.x, AP::scheduler().get_loop_period_s()); - attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(angle_request_cd.get(), start_angles.y, 0.0f); - phase_out_time--; + // initialize frequency response object + if (test_input_type == AC_AutoTune_FreqResp::InputType::SWEEP) { + step_time_limit_ms = sweep_time_ms + 500; + reset_sweep_variables(); + curr_test.gain = 0.0f; + curr_test.phase = 0.0f; + chirp_input.init(0.001f * sweep_time_ms, start_frq / M_2PI, stop_frq / M_2PI, 0.0f, 0.0001f * sweep_time_ms, 0.0f); + } else { + if (!is_zero(start_frq)) { + // time limit set by adding the pre calc cycles with the dwell cycles. 500 ms added to account for settling with buffer. + step_time_limit_ms = (uint32_t) (2000 + ((float)num_dwell_cycles + pre_calc_cycles + 2.0f) * 1000.0f * M_2PI / start_frq); } - break; - case PITCH: - gyro_reading = ahrs_view->get_gyro().y; - command_reading = motors->get_pitch(); - tgt_rate_reading = attitude_control->rate_bf_targets().y; - if (settle_time > 0) { - settle_time--; - trim_command_reading = motors->get_pitch(); - rate_request_cds.reset(gyro_reading); - } else if (((ahrs_view->pitch_sensor <= max_angle_cd + start_angle && is_positive(dir_sign)) - || (ahrs_view->pitch_sensor >= -max_angle_cd + start_angle && !is_positive(dir_sign))) - && ff_test_phase == 0) { - rate_request_cds.apply(target_rate_cds, AP::scheduler().get_loop_period_s()); - attitude_control->input_rate_bf_roll_pitch_yaw(0.0f, rate_request_cds.get(), 0.0f); - } else if (((ahrs_view->pitch_sensor > max_angle_cd + start_angle && is_positive(dir_sign)) - || (ahrs_view->pitch_sensor < -max_angle_cd + start_angle && !is_positive(dir_sign))) - && ff_test_phase == 0) { - ff_test_phase = 1; - rate_request_cds.apply(-target_rate_cds, AP::scheduler().get_loop_period_s()); - attitude_control->input_rate_bf_roll_pitch_yaw(0.0f, rate_request_cds.get(), 0.0f); - attitude_control->rate_bf_pitch_target(rate_request_cds.get()); - } else if (((ahrs_view->pitch_sensor >= -max_angle_cd + start_angle && is_positive(dir_sign)) - || (ahrs_view->pitch_sensor <= max_angle_cd + start_angle && !is_positive(dir_sign))) - && ff_test_phase == 1 ) { - rate_request_cds.apply(-target_rate_cds, AP::scheduler().get_loop_period_s()); - attitude_control->input_rate_bf_roll_pitch_yaw(0.0f, rate_request_cds.get(), 0.0f); - attitude_control->rate_bf_pitch_target(rate_request_cds.get()); - } else if (((ahrs_view->pitch_sensor < -max_angle_cd + start_angle && is_positive(dir_sign)) - || (ahrs_view->pitch_sensor > max_angle_cd + start_angle && !is_positive(dir_sign))) - && ff_test_phase == 1 ) { - ff_test_phase = 2; - attitude_control->reset_target_and_rate(false); - angle_request_cd.reset(ahrs_view->pitch_sensor); - attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(start_angles.x, angle_request_cd.get(), 0.0f); - } else if (ff_test_phase == 2 ) { - angle_request_cd.apply(start_angles.y, AP::scheduler().get_loop_period_s()); - attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(start_angles.x, angle_request_cd.get(), 0.0f); - phase_out_time--; - } - break; - case YAW: - case YAW_D: - gyro_reading = ahrs_view->get_gyro().z; - command_reading = motors->get_yaw(); - tgt_rate_reading = attitude_control->rate_bf_targets().z; - if (settle_time > 0) { - settle_time--; - trim_command_reading = motors->get_yaw(); - trim_heading = ahrs_view->yaw_sensor; - rate_request_cds.reset(gyro_reading); - } else if (((wrap_180_cd(ahrs_view->yaw_sensor - trim_heading) <= 2.0f * max_angle_cd && is_positive(dir_sign)) - || (wrap_180_cd(ahrs_view->yaw_sensor - trim_heading) >= -2.0f * max_angle_cd && !is_positive(dir_sign))) - && ff_test_phase == 0) { - rate_request_cds.apply(target_rate_cds, AP::scheduler().get_loop_period_s()); - attitude_control->input_rate_bf_roll_pitch_yaw(0.0f, 0.0f, rate_request_cds.get()); - } else if (((wrap_180_cd(ahrs_view->yaw_sensor - trim_heading) > 2.0f * max_angle_cd && is_positive(dir_sign)) - || (wrap_180_cd(ahrs_view->yaw_sensor - trim_heading) < -2.0f * max_angle_cd && !is_positive(dir_sign))) - && ff_test_phase == 0) { - ff_test_phase = 1; - rate_request_cds.apply(-target_rate_cds, AP::scheduler().get_loop_period_s()); - attitude_control->input_rate_bf_roll_pitch_yaw(0.0f, 0.0f, rate_request_cds.get()); - attitude_control->rate_bf_yaw_target(rate_request_cds.get()); - } else if (((wrap_180_cd(ahrs_view->yaw_sensor - trim_heading) >= -2.0f * max_angle_cd && is_positive(dir_sign)) - || (wrap_180_cd(ahrs_view->yaw_sensor - trim_heading) <= 2.0f * max_angle_cd && !is_positive(dir_sign))) - && ff_test_phase == 1 ) { - rate_request_cds.apply(-target_rate_cds, AP::scheduler().get_loop_period_s()); - attitude_control->input_rate_bf_roll_pitch_yaw(0.0f, 0.0f, rate_request_cds.get()); - attitude_control->rate_bf_yaw_target(rate_request_cds.get()); - } else if (((wrap_180_cd(ahrs_view->yaw_sensor - trim_heading) < -2.0f * max_angle_cd && is_positive(dir_sign)) - || (wrap_180_cd(ahrs_view->yaw_sensor - trim_heading) > 2.0f * max_angle_cd && !is_positive(dir_sign))) - && ff_test_phase == 1 ) { - ff_test_phase = 2; - attitude_control->reset_yaw_target_and_rate(false); - angle_request_cd.reset(wrap_180_cd(ahrs_view->yaw_sensor - trim_heading)); - attitude_control->input_euler_angle_roll_pitch_yaw(start_angles.x, start_angles.y, angle_request_cd.get(), false); - } else if (ff_test_phase == 2 ) { - angle_request_cd.apply(0.0f, AP::scheduler().get_loop_period_s()); - attitude_control->input_euler_angle_roll_pitch_yaw(start_angles.x, start_angles.y, wrap_360_cd(trim_heading + angle_request_cd.get()), false); - } - break; + chirp_input.init(0.001f * step_time_limit_ms, start_frq / M_2PI, stop_frq / M_2PI, 0.0f, 0.0001f * step_time_limit_ms, 0.0f); } - rotation_rate = rotation_rate_filt.apply(gyro_reading, - AP::scheduler().get_loop_period_s()); - command_out = command_filt.apply((command_reading - trim_command_reading), - AP::scheduler().get_loop_period_s()); - filt_target_rate = target_rate_filt.apply(tgt_rate_reading, - AP::scheduler().get_loop_period_s()); - - // record steady state rate and motor command - switch (axis) { - case ROLL: - if (((ahrs_view->roll_sensor >= -max_angle_cd + start_angle && is_positive(dir_sign)) - || (ahrs_view->roll_sensor <= max_angle_cd + start_angle && !is_positive(dir_sign))) - && ff_test_phase == 1 ) { - test_rate_filt = rotation_rate; - test_command_filt = command_out; - test_tgt_rate_filt = filt_target_rate; - } - break; - case PITCH: - if (((ahrs_view->pitch_sensor >= -max_angle_cd + start_angle && is_positive(dir_sign)) - || (ahrs_view->pitch_sensor <= max_angle_cd + start_angle && !is_positive(dir_sign))) - && ff_test_phase == 1 ) { - test_rate_filt = rotation_rate; - test_command_filt = command_out; - test_tgt_rate_filt = filt_target_rate; - } - break; - case YAW: - case YAW_D: - if (((wrap_180_cd(ahrs_view->yaw_sensor - trim_heading) >= -2.0f * max_angle_cd && is_positive(dir_sign)) - || (wrap_180_cd(ahrs_view->yaw_sensor - trim_heading) <= 2.0f * max_angle_cd && !is_positive(dir_sign))) - && ff_test_phase == 1 ) { - test_rate_filt = rotation_rate; - test_command_filt = command_out; - test_tgt_rate_filt = filt_target_rate; - } - break; - } - if (now - step_start_time_ms >= step_time_limit_ms || (ff_test_phase == 2 && phase_out_time == 0)) { - // we have passed the maximum stop time - step = UPDATE_GAINS; - } - -} - -void AC_AutoTune_Heli::dwell_test_init(float start_frq, float stop_frq, float filt_freq, DwellType dwell_type) -{ + freqresp_tgt.init(test_input_type, resp_type, num_dwell_cycles); + freqresp_mtr.init(test_input_type, resp_type, num_dwell_cycles); + dwell_start_time_ms = 0.0f; settle_time = 200; @@ -912,82 +776,33 @@ void AC_AutoTune_Heli::dwell_test_init(float start_frq, float stop_frq, float fi filt_target_rate = 0.0f; // filter at lower frequency to remove steady state - filt_command_reading.set_cutoff_frequency(0.2f * start_frq); - filt_gyro_reading.set_cutoff_frequency(0.2f * start_frq); - filt_tgt_rate_reading.set_cutoff_frequency(0.2f * start_frq); - filt_att_fdbk_from_velxy_cd.set_cutoff_frequency(0.2f * start_frq); + filt_command_reading.set_cutoff_frequency(0.2f * filt_freq); + filt_gyro_reading.set_cutoff_frequency(0.05f * filt_freq); + filt_tgt_rate_reading.set_cutoff_frequency(0.05f * filt_freq); + filt_att_fdbk_from_velxy_cd.set_cutoff_frequency(0.2f * filt_freq); - if (dwell_type == RATE) { - filt_pit_roll_cd.set_cutoff_frequency(0.2f * start_frq); - filt_heading_error_cd.set_cutoff_frequency(0.2f * start_frq); - - // save the trim output from PID controller - float ff_term = 0.0f; - float p_term = 0.0f; - switch (axis) { - case ROLL: - trim_meas_rate = ahrs_view->get_gyro().x; - ff_term = attitude_control->get_rate_roll_pid().get_ff(); - p_term = attitude_control->get_rate_roll_pid().get_p(); - break; - case PITCH: - trim_meas_rate = ahrs_view->get_gyro().y; - ff_term = attitude_control->get_rate_pitch_pid().get_ff(); - p_term = attitude_control->get_rate_pitch_pid().get_p(); - break; - case YAW: - case YAW_D: - trim_meas_rate = ahrs_view->get_gyro().z; - ff_term = attitude_control->get_rate_yaw_pid().get_ff(); - p_term = attitude_control->get_rate_yaw_pid().get_p(); - break; - } - trim_pff_out = ff_term + p_term; - } - - if (!is_equal(start_frq, stop_frq)) { - reset_sweep_variables(); - curr_test.gain = 0.0f; - curr_test.phase = 0.0f; - } - - chirp_input.init(sweep_time_ms * 0.001f, start_frq / M_2PI, stop_frq / M_2PI, 0.0f, 0.0001f * sweep_time_ms, 0.0f); + curr_test_mtr = {}; + curr_test_tgt = {}; + cycle_complete_tgt = false; + cycle_complete_mtr = false; + sweep_complete = false; } -void AC_AutoTune_Heli::dwell_test_run(uint8_t freq_resp_input, float start_frq, float stop_frq, float &dwell_gain, float &dwell_phase, DwellType dwell_type) +void AC_AutoTune_Heli::dwell_test_run(sweep_info &test_data) { float gyro_reading = 0.0f; float command_reading = 0.0f; float tgt_rate_reading = 0.0f; - float tgt_attitude; const uint32_t now = AP_HAL::millis(); float target_angle_cd = 0.0f; - float target_rate_cds = 0.0f; - float dwell_freq = start_frq; - float target_rate_mag_cds; - const float att_hold_gain = 4.5f; + float dwell_freq = test_start_freq; float cycle_time_ms = 0; if (!is_zero(dwell_freq)) { cycle_time_ms = 1000.0f * M_2PI / dwell_freq; } - if (dwell_type == RATE) { - // keep controller from requesting too high of a rate - tgt_attitude = 2.5f * 0.01745f; - target_rate_mag_cds = dwell_freq * tgt_attitude * 5730.0f; - if (target_rate_mag_cds > 5000.0f) { - target_rate_mag_cds = 5000.0f; - } - } else { - tgt_attitude = 5.0f * 0.01745f; - // adjust target attitude based on input_tc so amplitude decrease with increased frequency is minimized - const float freq_co = 1.0f / attitude_control->get_input_tc(); - const float added_ampl = (safe_sqrt(powf(dwell_freq,2.0) + powf(freq_co,2.0)) / freq_co) - 1.0f; - tgt_attitude = constrain_float(0.08725f * (1.0f + 0.2f * added_ampl), 0.08725f, 0.5235f); - } - // body frame calculation of velocity Vector3f velocity_ned, velocity_bf; if (ahrs_view->get_velocity_NED(velocity_ned)) { @@ -995,149 +810,72 @@ void AC_AutoTune_Heli::dwell_test_run(uint8_t freq_resp_input, float start_frq, velocity_bf.y = -velocity_ned.x * ahrs_view->sin_yaw() + velocity_ned.y * ahrs_view->cos_yaw(); } - Vector3f attitude_cd = Vector3f((float)ahrs_view->roll_sensor, (float)ahrs_view->pitch_sensor, (float)ahrs_view->yaw_sensor); if (settle_time == 0) { - if (dwell_type == RATE) { - target_rate_cds = -chirp_input.update((now - dwell_start_time_ms) * 0.001, target_rate_mag_cds); - filt_pit_roll_cd.apply(Vector2f(attitude_cd.x,attitude_cd.y), AP::scheduler().get_loop_period_s()); - filt_heading_error_cd.apply(wrap_180_cd(trim_attitude_cd.z - attitude_cd.z), AP::scheduler().get_loop_period_s()); - } else { - target_angle_cd = -chirp_input.update((now - dwell_start_time_ms) * 0.001, tgt_attitude * 5730.0f); - } + target_angle_cd = -chirp_input.update((now - dwell_start_time_ms) * 0.001, degrees(tgt_attitude) * 100.0f); + dwell_freq = chirp_input.get_frequency_rads(); const Vector2f att_fdbk { -5730.0f * vel_hold_gain * velocity_bf.y, 5730.0f * vel_hold_gain * velocity_bf.x }; filt_att_fdbk_from_velxy_cd.apply(att_fdbk, AP::scheduler().get_loop_period_s()); - dwell_freq = chirp_input.get_frequency_rads(); } else { - if (dwell_type == RATE) { - target_rate_cds = 0.0f; - trim_command = command_out; - trim_attitude_cd = attitude_cd; - filt_pit_roll_cd.reset(Vector2f(attitude_cd.x,attitude_cd.y)); - filt_heading_error_cd.reset(0.0f); - } else { - target_angle_cd = 0.0f; - trim_yaw_tgt_reading = (float)attitude_control->get_att_target_euler_cd().z; - trim_yaw_heading_reading = (float)ahrs_view->yaw_sensor; - } + target_angle_cd = 0.0f; + trim_yaw_tgt_reading_cd = (float)attitude_control->get_att_target_euler_cd().z; + trim_yaw_heading_reading_cd = (float)ahrs_view->yaw_sensor; dwell_start_time_ms = now; filt_att_fdbk_from_velxy_cd.reset(Vector2f(0.0f,0.0f)); settle_time--; } - if (dwell_type == RATE) { - // limit rate correction for position hold - Vector3f trim_rate_cds { - constrain_float(att_hold_gain * ((trim_attitude_cd.x + filt_att_fdbk_from_velxy_cd.get().x) - filt_pit_roll_cd.get().x), -15000.0f, 15000.0f), - constrain_float(att_hold_gain * ((trim_attitude_cd.y + filt_att_fdbk_from_velxy_cd.get().y) - filt_pit_roll_cd.get().y), -15000.0f, 15000.0f), - constrain_float(att_hold_gain * filt_heading_error_cd.get(), -15000.0f, 15000.0f) - }; - switch (axis) { - case ROLL: - gyro_reading = ahrs_view->get_gyro().x; - command_reading = motors->get_roll(); + const Vector2f trim_angle_cd { + constrain_float(filt_att_fdbk_from_velxy_cd.get().x, -2000.0f, 2000.0f), + constrain_float(filt_att_fdbk_from_velxy_cd.get().y, -2000.0f, 2000.0f) + }; + + switch (axis) { + case AxisType::ROLL: + attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(target_angle_cd + trim_angle_cd.x, trim_angle_cd.y, 0.0f); + command_reading = motors->get_roll(); + if (test_calc_type == DRB) { + tgt_rate_reading = radians(target_angle_cd * 0.01f); + gyro_reading = radians(((float)ahrs_view->roll_sensor + trim_angle_cd.x - target_angle_cd) * 0.01f); + } else if (test_calc_type == RATE) { tgt_rate_reading = attitude_control->rate_bf_targets().x; - if (settle_time == 0) { - float ff_rate_contr = 0.0f; - if (tune_roll_rff > 0.0f) { - ff_rate_contr = 5730.0f * trim_command / tune_roll_rff; - } - trim_rate_cds.x += ff_rate_contr; - attitude_control->input_rate_bf_roll_pitch_yaw(0.0f, trim_rate_cds.y, 0.0f); - attitude_control->rate_bf_roll_target(target_rate_cds + trim_rate_cds.x); - } else { - attitude_control->input_rate_bf_roll_pitch_yaw(0.0f, 0.0f, 0.0f); - if (!is_zero(attitude_control->get_rate_roll_pid().ff() + attitude_control->get_rate_roll_pid().kP())) { - float trim_tgt_rate_cds = 5730.0f * (trim_pff_out + trim_meas_rate * attitude_control->get_rate_roll_pid().kP()) / (attitude_control->get_rate_roll_pid().ff() + attitude_control->get_rate_roll_pid().kP()); - attitude_control->rate_bf_roll_target(trim_tgt_rate_cds); - } - } - break; - case PITCH: - gyro_reading = ahrs_view->get_gyro().y; - command_reading = motors->get_pitch(); + gyro_reading = ahrs_view->get_gyro().x; + } else { + tgt_rate_reading = radians((float)attitude_control->get_att_target_euler_cd().x * 0.01f); + gyro_reading = radians((float)ahrs_view->roll_sensor * 0.01f); + } + break; + case AxisType::PITCH: + attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(trim_angle_cd.x, target_angle_cd + trim_angle_cd.y, 0.0f); + command_reading = motors->get_pitch(); + if (test_calc_type == DRB) { + tgt_rate_reading = radians(target_angle_cd * 0.01f); + gyro_reading = radians(((float)ahrs_view->pitch_sensor + trim_angle_cd.y - target_angle_cd) * 0.01f); + } else if (test_calc_type == RATE) { tgt_rate_reading = attitude_control->rate_bf_targets().y; - if (settle_time == 0) { - float ff_rate_contr = 0.0f; - if (tune_pitch_rff > 0.0f) { - ff_rate_contr = 5730.0f * trim_command / tune_pitch_rff; - } - trim_rate_cds.y += ff_rate_contr; - attitude_control->input_rate_bf_roll_pitch_yaw(trim_rate_cds.x, 0.0f, 0.0f); - attitude_control->rate_bf_pitch_target(target_rate_cds + trim_rate_cds.y); - } else { - attitude_control->input_rate_bf_roll_pitch_yaw(0.0f, 0.0f, 0.0f); - if (!is_zero(attitude_control->get_rate_pitch_pid().ff() + attitude_control->get_rate_pitch_pid().kP())) { - float trim_tgt_rate_cds = 5730.0f * (trim_pff_out + trim_meas_rate * attitude_control->get_rate_pitch_pid().kP()) / (attitude_control->get_rate_pitch_pid().ff() + attitude_control->get_rate_pitch_pid().kP()); - attitude_control->rate_bf_pitch_target(trim_tgt_rate_cds); - } - } - break; - case YAW: - case YAW_D: - gyro_reading = ahrs_view->get_gyro().z; - command_reading = motors->get_yaw(); + gyro_reading = ahrs_view->get_gyro().y; + } else { + tgt_rate_reading = radians((float)attitude_control->get_att_target_euler_cd().y * 0.01f); + gyro_reading = radians((float)ahrs_view->pitch_sensor * 0.01f); + } + break; + case AxisType::YAW: + case AxisType::YAW_D: + attitude_control->input_euler_angle_roll_pitch_yaw(trim_angle_cd.x, trim_angle_cd.y, wrap_180_cd(trim_yaw_tgt_reading_cd + target_angle_cd), false); + command_reading = motors->get_yaw(); + if (test_calc_type == DRB) { + tgt_rate_reading = radians(target_angle_cd * 0.01f); + gyro_reading = radians((wrap_180_cd((float)ahrs_view->yaw_sensor - trim_yaw_heading_reading_cd - target_angle_cd)) * 0.01f); + } else if (test_calc_type == RATE) { tgt_rate_reading = attitude_control->rate_bf_targets().z; - if (settle_time == 0) { - float rp_rate_contr = 0.0f; - if (tune_yaw_rp > 0.0f) { - rp_rate_contr = 5730.0f * trim_command / tune_yaw_rp; - } - trim_rate_cds.z += rp_rate_contr; - attitude_control->input_rate_bf_roll_pitch_yaw(trim_rate_cds.x, trim_rate_cds.y, 0.0f); - attitude_control->rate_bf_yaw_target(target_rate_cds + trim_rate_cds.z); - } else { - attitude_control->input_rate_bf_roll_pitch_yaw(0.0f, 0.0f, 0.0f); - if (!is_zero(attitude_control->get_rate_yaw_pid().ff() + attitude_control->get_rate_yaw_pid().kP())) { - float trim_tgt_rate_cds = 5730.0f * (trim_pff_out + trim_meas_rate * attitude_control->get_rate_yaw_pid().kP()) / (attitude_control->get_rate_yaw_pid().ff() + attitude_control->get_rate_yaw_pid().kP()); - attitude_control->rate_bf_yaw_target(trim_tgt_rate_cds); - } - } - break; - } - } else { - const Vector2f trim_angle_cd { - constrain_float(filt_att_fdbk_from_velxy_cd.get().x, -2000.0f, 2000.0f), - constrain_float(filt_att_fdbk_from_velxy_cd.get().y, -2000.0f, 2000.0f) - }; - switch (axis) { - case ROLL: - attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(target_angle_cd + trim_angle_cd.x, trim_angle_cd.y, 0.0f); - command_reading = motors->get_roll(); - if (dwell_type == DRB) { - tgt_rate_reading = (target_angle_cd) / 5730.0f; - gyro_reading = ((float)ahrs_view->roll_sensor + trim_angle_cd.x - target_angle_cd) / 5730.0f; - } else { - tgt_rate_reading = ((float)attitude_control->get_att_target_euler_cd().x) / 5730.0f; - gyro_reading = ((float)ahrs_view->roll_sensor) / 5730.0f; - } - break; - case PITCH: - attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(trim_angle_cd.x, target_angle_cd + trim_angle_cd.y, 0.0f); - command_reading = motors->get_pitch(); - if (dwell_type == DRB) { - tgt_rate_reading = (target_angle_cd) / 5730.0f; - gyro_reading = ((float)ahrs_view->pitch_sensor + trim_angle_cd.y - target_angle_cd) / 5730.0f; - } else { - tgt_rate_reading = ((float)attitude_control->get_att_target_euler_cd().y) / 5730.0f; - gyro_reading = ((float)ahrs_view->pitch_sensor) / 5730.0f; - } - break; - case YAW: - case YAW_D: - command_reading = motors->get_yaw(); - if (dwell_type == DRB) { - tgt_rate_reading = (target_angle_cd) / 5730.0f; - gyro_reading = (wrap_180_cd((float)ahrs_view->yaw_sensor - trim_yaw_heading_reading - target_angle_cd)) / 5730.0f; - } else { - tgt_rate_reading = (wrap_180_cd((float)attitude_control->get_att_target_euler_cd().z - trim_yaw_tgt_reading)) / 5730.0f; - gyro_reading = (wrap_180_cd((float)ahrs_view->yaw_sensor - trim_yaw_heading_reading)) / 5730.0f; - } - attitude_control->input_euler_angle_roll_pitch_yaw(trim_angle_cd.x, trim_angle_cd.y, wrap_180_cd(trim_yaw_tgt_reading + target_angle_cd), false); - break; + gyro_reading = ahrs_view->get_gyro().z; + } else { + tgt_rate_reading = radians((wrap_180_cd((float)attitude_control->get_att_target_euler_cd().z - trim_yaw_tgt_reading_cd)) * 0.01f); + gyro_reading = radians((wrap_180_cd((float)ahrs_view->yaw_sensor - trim_yaw_heading_reading_cd)) * 0.01f); } + break; } if (settle_time == 0) { @@ -1158,57 +896,125 @@ void AC_AutoTune_Heli::dwell_test_run(uint8_t freq_resp_input, float start_frq, command_out = command_filt.apply((command_reading - filt_command_reading.get()), AP::scheduler().get_loop_period_s()); + float dwell_gain_mtr = 0.0f; + float dwell_phase_mtr = 0.0f; + float dwell_gain_tgt = 0.0f; + float dwell_phase_tgt = 0.0f; // wait for dwell to start before determining gain and phase - if ((float)(now - dwell_start_time_ms) > 6.25f * cycle_time_ms || (!is_equal(start_frq,stop_frq) && settle_time == 0)) { - if (freq_resp_input == 1) { - freqresp.update(command_out,filt_target_rate,rotation_rate, dwell_freq); - } else { - freqresp.update(command_out,command_out,rotation_rate, dwell_freq); - } + if ((float)(now - dwell_start_time_ms) > pre_calc_cycles * cycle_time_ms || (test_input_type == AC_AutoTune_FreqResp::InputType::SWEEP && settle_time == 0)) { + freqresp_mtr.update(command_out,command_out,rotation_rate, dwell_freq); + freqresp_tgt.update(command_out,filt_target_rate,rotation_rate, dwell_freq); - if (freqresp.is_cycle_complete()) { - if (!is_equal(start_frq,stop_frq)) { - curr_test.freq = freqresp.get_freq(); - curr_test.gain = freqresp.get_gain(); - curr_test.phase = freqresp.get_phase(); - if (dwell_type == DRB) {test_accel_max = freqresp.get_accel_max();} + if (freqresp_mtr.is_cycle_complete()) { + if (test_input_type == AC_AutoTune_FreqResp::InputType::SWEEP) { + if (is_zero(curr_test_mtr.freq) && freqresp_mtr.get_freq() < test_start_freq) { + // don't set data since captured frequency is below the start frequency + } else { + curr_test_mtr.freq = freqresp_mtr.get_freq(); + curr_test_mtr.gain = freqresp_mtr.get_gain(); + curr_test_mtr.phase = freqresp_mtr.get_phase(); + } // reset cycle_complete to allow indication of next cycle - freqresp.reset_cycle_complete(); + freqresp_mtr.reset_cycle_complete(); #if HAL_LOGGING_ENABLED // log sweep data Log_AutoTuneSweep(); #endif } else { - dwell_gain = freqresp.get_gain(); - dwell_phase = freqresp.get_phase(); - if (dwell_type == DRB) {test_accel_max = freqresp.get_accel_max();} + dwell_gain_mtr = freqresp_mtr.get_gain(); + dwell_phase_mtr = freqresp_mtr.get_phase(); + cycle_complete_mtr = true; + } + } + + if (freqresp_tgt.is_cycle_complete()) { + if (test_input_type == AC_AutoTune_FreqResp::InputType::SWEEP) { + if (is_zero(curr_test_tgt.freq) && freqresp_tgt.get_freq() < test_start_freq) { + // don't set data since captured frequency is below the start frequency + } else { + curr_test_tgt.freq = freqresp_tgt.get_freq(); + curr_test_tgt.gain = freqresp_tgt.get_gain(); + curr_test_tgt.phase = freqresp_tgt.get_phase(); + if (test_calc_type == DRB) {test_accel_max = freqresp_tgt.get_accel_max();} + } + // reset cycle_complete to allow indication of next cycle + freqresp_tgt.reset_cycle_complete(); +#if HAL_LOGGING_ENABLED + // log sweep data + Log_AutoTuneSweep(); +#endif + } else { + dwell_gain_tgt = freqresp_tgt.get_gain(); + dwell_phase_tgt = freqresp_tgt.get_phase(); + if (test_calc_type == DRB) {test_accel_max = freqresp_tgt.get_accel_max();} + cycle_complete_tgt = true; + } + } + + if (test_freq_resp_input == TARGET) { + if (test_input_type == AC_AutoTune_FreqResp::InputType::SWEEP) { + curr_test = curr_test_tgt; + } else { + test_data.freq = test_start_freq; + test_data.gain = dwell_gain_tgt; + test_data.phase = dwell_phase_tgt; + } + } else { + if (test_input_type == AC_AutoTune_FreqResp::InputType::SWEEP) { + curr_test = curr_test_mtr; + } else { + test_data.freq = test_start_freq; + test_data.gain = dwell_gain_mtr; + test_data.phase = dwell_phase_mtr; } } } // set sweep data if a frequency sweep is being conducted - if (!is_equal(start_frq,stop_frq) && (float)(now - dwell_start_time_ms) > 2.5f * cycle_time_ms) { + if (test_input_type == AC_AutoTune_FreqResp::InputType::SWEEP && (float)(now - dwell_start_time_ms) > 2.5f * cycle_time_ms) { // track sweep phase to prevent capturing 180 deg and 270 deg data after phase has wrapped. - if (curr_test.phase > 180.0f && sweep.progress == 0) { - sweep.progress = 1; - } else if (curr_test.phase > 270.0f && sweep.progress == 1) { - sweep.progress = 2; + if (curr_test_tgt.phase > 180.0f && sweep_tgt.progress == 0) { + sweep_tgt.progress = 1; + } else if (curr_test_tgt.phase > 270.0f && sweep_tgt.progress == 1) { + sweep_tgt.progress = 2; } - if (curr_test.phase <= 160.0f && curr_test.phase >= 150.0f && sweep.progress == 0) { - sweep.ph180 = curr_test; + if (curr_test_tgt.phase <= 160.0f && curr_test_tgt.phase >= 150.0f && sweep_tgt.progress == 0) { + sweep_tgt.ph180 = curr_test_tgt; } - if (curr_test.phase <= 250.0f && curr_test.phase >= 240.0f && sweep.progress == 1) { - sweep.ph270 = curr_test; + if (curr_test_tgt.phase <= 250.0f && curr_test_tgt.phase >= 240.0f && sweep_tgt.progress == 1) { + sweep_tgt.ph270 = curr_test_tgt; } - if (curr_test.gain > sweep.maxgain.gain) { - sweep.maxgain = curr_test; + if (curr_test_tgt.gain > sweep_tgt.maxgain.gain) { + sweep_tgt.maxgain = curr_test_tgt; } + // Determine sweep info for motor input to response output + if (curr_test_mtr.phase > 180.0f && sweep_mtr.progress == 0) { + sweep_mtr.progress = 1; + } else if (curr_test_mtr.phase > 270.0f && sweep_mtr.progress == 1) { + sweep_mtr.progress = 2; + } + if (curr_test_mtr.phase <= 160.0f && curr_test_mtr.phase >= 150.0f && sweep_mtr.progress == 0) { + sweep_mtr.ph180 = curr_test_mtr; + } + if (curr_test_mtr.phase <= 250.0f && curr_test_mtr.phase >= 240.0f && sweep_mtr.progress == 1) { + sweep_mtr.ph270 = curr_test_mtr; + } + if (curr_test_mtr.gain > sweep_mtr.maxgain.gain) { + sweep_mtr.maxgain = curr_test_mtr; + } + if (now - step_start_time_ms >= sweep_time_ms + 200) { // we have passed the maximum stop time + sweep_complete = true; step = UPDATE_GAINS; } } else { - if (now - step_start_time_ms >= step_time_limit_ms || freqresp.is_cycle_complete()) { + if (now - step_start_time_ms >= step_time_limit_ms || (freqresp_tgt.is_cycle_complete() && freqresp_mtr.is_cycle_complete())) { + if (now - step_start_time_ms >= step_time_limit_ms) { + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: Step time limit exceeded"); + } + cycle_complete_tgt = false; + cycle_complete_tgt = false; // we have passed the maximum stop time step = UPDATE_GAINS; } @@ -1219,15 +1025,15 @@ void AC_AutoTune_Heli::dwell_test_run(uint8_t freq_resp_input, float start_frq, void AC_AutoTune_Heli::updating_rate_p_up_all(AxisType test_axis) { switch (test_axis) { - case ROLL: - updating_rate_p_up(tune_roll_rp, test_freq, test_gain, test_phase, freq_cnt, max_rate_p); + case AxisType::ROLL: + updating_rate_p_up(tune_roll_rp, curr_data, next_test_freq, max_rate_p); break; - case PITCH: - updating_rate_p_up(tune_pitch_rp, test_freq, test_gain, test_phase, freq_cnt, max_rate_p); + case AxisType::PITCH: + updating_rate_p_up(tune_pitch_rp, curr_data, next_test_freq, max_rate_p); break; - case YAW: - case YAW_D: - updating_rate_p_up(tune_yaw_rp, test_freq, test_gain, test_phase, freq_cnt, max_rate_p); + case AxisType::YAW: + case AxisType::YAW_D: + updating_rate_p_up(tune_yaw_rp, curr_data, next_test_freq, max_rate_p); break; } } @@ -1236,15 +1042,15 @@ void AC_AutoTune_Heli::updating_rate_p_up_all(AxisType test_axis) void AC_AutoTune_Heli::updating_rate_d_up_all(AxisType test_axis) { switch (test_axis) { - case ROLL: - updating_rate_d_up(tune_roll_rd, test_freq, test_gain, test_phase, freq_cnt, max_rate_d); + case AxisType::ROLL: + updating_rate_d_up(tune_roll_rd, curr_data, next_test_freq, max_rate_d); break; - case PITCH: - updating_rate_d_up(tune_pitch_rd, test_freq, test_gain, test_phase, freq_cnt, max_rate_d); + case AxisType::PITCH: + updating_rate_d_up(tune_pitch_rd, curr_data, next_test_freq, max_rate_d); break; - case YAW: - case YAW_D: - updating_rate_d_up(tune_yaw_rd, test_freq, test_gain, test_phase, freq_cnt, max_rate_d); + case AxisType::YAW: + case AxisType::YAW_D: + updating_rate_d_up(tune_yaw_rd, curr_data, next_test_freq, max_rate_d); break; } } @@ -1253,15 +1059,15 @@ void AC_AutoTune_Heli::updating_rate_d_up_all(AxisType test_axis) void AC_AutoTune_Heli::updating_rate_ff_up_all(AxisType test_axis) { switch (test_axis) { - case ROLL: - updating_rate_ff_up(tune_roll_rff, test_tgt_rate_filt*5730.0f, test_rate_filt*5730.0f, test_command_filt); + case AxisType::ROLL: + updating_rate_ff_up(tune_roll_rff, curr_data, next_test_freq); break; - case PITCH: - updating_rate_ff_up(tune_pitch_rff, test_tgt_rate_filt*5730.0f, test_rate_filt*5730.0f, test_command_filt); + case AxisType::PITCH: + updating_rate_ff_up(tune_pitch_rff, curr_data, next_test_freq); break; - case YAW: - case YAW_D: - updating_rate_ff_up(tune_yaw_rff, test_tgt_rate_filt*5730.0f, test_rate_filt*5730.0f, test_command_filt); + case AxisType::YAW: + case AxisType::YAW_D: + updating_rate_ff_up(tune_yaw_rff, curr_data, next_test_freq); // TODO make FF updating routine determine when to set rff gain to zero based on A/C response if (tune_yaw_rff <= AUTOTUNE_RFF_MIN && counter == AUTOTUNE_SUCCESS_COUNT) { tune_yaw_rff = 0.0f; @@ -1275,16 +1081,32 @@ void AC_AutoTune_Heli::updating_angle_p_up_all(AxisType test_axis) { attitude_control->bf_feedforward(orig_bf_feedforward); + // sweep doesn't require gain update so return immediately after setting next test freq + // determine next_test_freq for dwell testing + if (sweep_complete && input_type == AC_AutoTune_FreqResp::InputType::SWEEP){ + // if a max gain frequency was found then set the start of the dwells to that freq otherwise start at min frequency + if (!is_zero(sweep_tgt.maxgain.freq)) { + next_test_freq = constrain_float(sweep_tgt.maxgain.freq, min_sweep_freq, max_sweep_freq); + freq_max = next_test_freq; + sp_prev_gain = sweep_tgt.maxgain.gain; + phase_max = sweep_tgt.maxgain.phase; + found_max_gain_freq = true; + } else { + next_test_freq = min_sweep_freq; + } + return; + } + switch (test_axis) { - case ROLL: - updating_angle_p_up(tune_roll_sp, test_freq, test_gain, test_phase, freq_cnt); + case AxisType::ROLL: + updating_angle_p_up(tune_roll_sp, curr_data, next_test_freq); break; - case PITCH: - updating_angle_p_up(tune_pitch_sp, test_freq, test_gain, test_phase, freq_cnt); + case AxisType::PITCH: + updating_angle_p_up(tune_pitch_sp, curr_data, next_test_freq); break; - case YAW: - case YAW_D: - updating_angle_p_up(tune_yaw_sp, test_freq, test_gain, test_phase, freq_cnt); + case AxisType::YAW: + case AxisType::YAW_D: + updating_angle_p_up(tune_yaw_sp, curr_data, next_test_freq); break; } } @@ -1292,16 +1114,29 @@ void AC_AutoTune_Heli::updating_angle_p_up_all(AxisType test_axis) // update gains for the max gain tune type void AC_AutoTune_Heli::updating_max_gains_all(AxisType test_axis) { + // sweep doesn't require gain update so return immediately after setting next test freq + // determine next_test_freq for dwell testing + if (sweep_complete && input_type == AC_AutoTune_FreqResp::InputType::SWEEP) { + // if a max gain frequency was found then set the start of the dwells to that freq otherwise start at min frequency + if (!is_zero(sweep_mtr.ph180.freq)) { + next_test_freq = constrain_float(sweep_mtr.ph180.freq, min_sweep_freq, max_sweep_freq); + reset_maxgains_update_gain_variables(); + } else { + next_test_freq = min_sweep_freq; + } + return; + } + switch (test_axis) { - case ROLL: - updating_max_gains(&test_freq[0], &test_gain[0], &test_phase[0], freq_cnt, max_rate_p, max_rate_d, tune_roll_rp, tune_roll_rd); + case AxisType::ROLL: + updating_max_gains(curr_data, next_test_freq, max_rate_p, max_rate_d, tune_roll_rp, tune_roll_rd); break; - case PITCH: - updating_max_gains(&test_freq[0], &test_gain[0], &test_phase[0], freq_cnt, max_rate_p, max_rate_d, tune_pitch_rp, tune_pitch_rd); + case AxisType::PITCH: + updating_max_gains(curr_data, next_test_freq, max_rate_p, max_rate_d, tune_pitch_rp, tune_pitch_rd); break; - case YAW: - case YAW_D: - updating_max_gains(&test_freq[0], &test_gain[0], &test_phase[0], freq_cnt, max_rate_p, max_rate_d, tune_yaw_rp, tune_yaw_rd); + case AxisType::YAW: + case AxisType::YAW_D: + updating_max_gains(curr_data, next_test_freq, max_rate_p, max_rate_d, tune_yaw_rp, tune_yaw_rd); // rate P and rate D can be non zero for yaw and need to be included in the max allowed gain if (!is_zero(max_rate_p.max_allowed) && counter == AUTOTUNE_SUCCESS_COUNT) { max_rate_p.max_allowed += tune_yaw_rp; @@ -1319,42 +1154,42 @@ void AC_AutoTune_Heli::set_gains_post_tune(AxisType test_axis) switch (tune_type) { case RD_UP: switch (test_axis) { - case ROLL: + case AxisType::ROLL: tune_roll_rd = MAX(0.0f, tune_roll_rd * AUTOTUNE_RD_BACKOFF); break; - case PITCH: + case AxisType::PITCH: tune_pitch_rd = MAX(0.0f, tune_pitch_rd * AUTOTUNE_RD_BACKOFF); break; - case YAW: - case YAW_D: + case AxisType::YAW: + case AxisType::YAW_D: tune_yaw_rd = MAX(0.0f, tune_yaw_rd * AUTOTUNE_RD_BACKOFF); break; } break; case RP_UP: switch (test_axis) { - case ROLL: + case AxisType::ROLL: tune_roll_rp = MAX(0.0f, tune_roll_rp * AUTOTUNE_RP_BACKOFF); break; - case PITCH: + case AxisType::PITCH: tune_pitch_rp = MAX(0.0f, tune_pitch_rp * AUTOTUNE_RP_BACKOFF); break; - case YAW: - case YAW_D: + case AxisType::YAW: + case AxisType::YAW_D: tune_yaw_rp = MAX(AUTOTUNE_RP_MIN, tune_yaw_rp * AUTOTUNE_RP_BACKOFF); break; } break; case SP_UP: switch (test_axis) { - case ROLL: + case AxisType::ROLL: tune_roll_sp = MAX(AUTOTUNE_SP_MIN, tune_roll_sp * AUTOTUNE_SP_BACKOFF); break; - case PITCH: + case AxisType::PITCH: tune_pitch_sp = MAX(AUTOTUNE_SP_MIN, tune_pitch_sp * AUTOTUNE_SP_BACKOFF); break; - case YAW: - case YAW_D: + case AxisType::YAW: + case AxisType::YAW_D: tune_yaw_sp = MAX(AUTOTUNE_SP_MIN, tune_yaw_sp * AUTOTUNE_SP_BACKOFF); break; } @@ -1368,366 +1203,237 @@ void AC_AutoTune_Heli::set_gains_post_tune(AxisType test_axis) // updating_rate_ff_up - adjust FF to ensure the target is reached // FF is adjusted until rate requested is achieved -void AC_AutoTune_Heli::updating_rate_ff_up(float &tune_ff, float rate_target, float meas_rate, float meas_command) +void AC_AutoTune_Heli::updating_rate_ff_up(float &tune_ff, sweep_info &test_data, float &next_freq) { + float tune_tgt = 0.95; + float tune_tol = 0.025; + next_freq = test_data.freq; - if (ff_up_first_iter) { - if (!is_zero(meas_rate)) { - tune_ff = 5730.0f * meas_command / meas_rate; - } - tune_ff = constrain_float(tune_ff, AUTOTUNE_RFF_MIN, AUTOTUNE_RFF_MAX); - ff_up_first_iter = false; - } else if (is_positive(rate_target * meas_rate) && fabsf(meas_rate) < 1.05f * fabsf(rate_target) && - fabsf(meas_rate) > 0.95f * fabsf(rate_target)) { - if (!first_dir_complete) { - first_dir_rff = tune_ff; - first_dir_complete = true; - positive_direction = !positive_direction; + // handle axes where FF gain is initially zero + if (test_data.gain < tune_tgt - tune_tol && !is_positive(tune_ff)) { + tune_ff = 0.03f; + return; + } + + if (test_data.gain < tune_tgt - 0.2 || test_data.gain > tune_tgt + 0.2) { + tune_ff = tune_ff * constrain_float(tune_tgt / test_data.gain, 0.75, 1.25); //keep changes less than 25% + } else if (test_data.gain < tune_tgt - 0.1 || test_data.gain > tune_tgt + 0.1) { + if (test_data.gain < tune_tgt - 0.1) { + tune_ff *= 1.05; } else { - counter = AUTOTUNE_SUCCESS_COUNT; - tune_ff = 0.95f * 0.5 * (tune_ff + first_dir_rff); - tune_ff = constrain_float(tune_ff, AUTOTUNE_RFF_MIN, AUTOTUNE_RFF_MAX); + tune_ff *= 0.95; } - } else if (is_positive(rate_target * meas_rate) && fabsf(meas_rate) > 1.05f * fabsf(rate_target)) { - tune_ff = 0.98f * tune_ff; - if (tune_ff <= AUTOTUNE_RFF_MIN) { - tune_ff = AUTOTUNE_RFF_MIN; - counter = AUTOTUNE_SUCCESS_COUNT; - LOGGER_WRITE_EVENT(LogEvent::AUTOTUNE_REACHED_LIMIT); + } else if (test_data.gain < tune_tgt - tune_tol || test_data.gain > tune_tgt + tune_tol) { + if (test_data.gain < tune_tgt - tune_tol) { + tune_ff *= 1.02; + } else { + tune_ff *= 0.98; } - } else if (is_positive(rate_target * meas_rate) && fabsf(meas_rate) < 0.95f * fabsf(rate_target)) { - tune_ff = 1.02f * tune_ff; - if (tune_ff >= AUTOTUNE_RFF_MAX) { - tune_ff = AUTOTUNE_RFF_MAX; - counter = AUTOTUNE_SUCCESS_COUNT; - LOGGER_WRITE_EVENT(LogEvent::AUTOTUNE_REACHED_LIMIT); - } - } else { - if (!is_zero(meas_rate)) { - tune_ff = 5730.0f * meas_command / meas_rate; - } - tune_ff = constrain_float(tune_ff, AUTOTUNE_RFF_MIN, AUTOTUNE_RFF_MAX); + } else if (test_data.gain >= tune_tgt - tune_tol && test_data.gain <= tune_tgt + tune_tol) { + counter = AUTOTUNE_SUCCESS_COUNT; + // reset next_freq for next test + next_freq = 0.0f; + tune_ff = constrain_float(tune_ff,0.0f,1.0f); } } -// updating_rate_p_up - uses maximum allowable gain determined from max_gain test to determine rate p gain that does not exceed exceed max response gain -void AC_AutoTune_Heli::updating_rate_p_up(float &tune_p, float *freq, float *gain, float *phase, uint8_t &frq_cnt, max_gain_data &max_gain_p) +// updating_rate_p_up - uses maximum allowable gain determined from max_gain test to determine rate p gain that does not +// exceed max response gain. A phase of 161 deg is used to conduct the tuning as this phase is where analytically +// max gain to 6db gain margin is determined for a unity feedback controller. +void AC_AutoTune_Heli::updating_rate_p_up(float &tune_p, sweep_info &test_data, float &next_freq, max_gain_data &max_gain_p) { - float test_freq_incr = 0.25f * 3.14159f * 2.0f; + float test_freq_incr = 0.25f * M_2PI; + next_freq = test_data.freq; - if (frq_cnt < 12 && is_equal(start_freq,stop_freq)) { - if (phase[frq_cnt] <= 180.0f && !is_zero(phase[frq_cnt])) { - rp_prev_good_frq_cnt = frq_cnt; - } else if (frq_cnt > 1 && phase[frq_cnt] > phase[frq_cnt-1] + 360.0f && !is_zero(phase[frq_cnt])) { - if (phase[frq_cnt] - 360.0f < 180.0f) { - rp_prev_good_frq_cnt = frq_cnt; - } - } else if (frq_cnt > 1 && phase[frq_cnt] > 200.0f && !is_zero(phase[frq_cnt])) { - frq_cnt = 11; - } - frq_cnt++; - if (frq_cnt == 12) { - freq[frq_cnt] = freq[rp_prev_good_frq_cnt]; - curr_test.freq = freq[frq_cnt]; + sweep_info data_at_ph161; + float sugg_freq; + if (freq_search_for_phase(test_data, 161.0f, test_freq_incr, data_at_ph161, sugg_freq)) { + if (data_at_ph161.gain < max_resp_gain && tune_p < 0.6f * max_gain_p.max_allowed) { + tune_p += 0.05f * max_gain_p.max_allowed; + next_freq = data_at_ph161.freq; } else { - freq[frq_cnt] = freq[frq_cnt-1] + test_freq_incr; - curr_test.freq = freq[frq_cnt]; + counter = AUTOTUNE_SUCCESS_COUNT; + // reset next_freq for next test + next_freq = 0.0f; + tune_p -= 0.05f * max_gain_p.max_allowed; + tune_p = constrain_float(tune_p,0.0f,0.6f * max_gain_p.max_allowed); } - } else if (is_equal(start_freq,stop_freq)) { - if (phase[frq_cnt] > 180.0f) { - curr_test.freq = curr_test.freq - 0.5 * test_freq_incr; - freq[frq_cnt] = curr_test.freq; - } else if (phase[frq_cnt] < 160.0f) { - curr_test.freq = curr_test.freq + 0.5 * test_freq_incr; - freq[frq_cnt] = curr_test.freq; - } else if (phase[frq_cnt] <= 180.0f && phase[frq_cnt] >= 160.0f) { - if (gain[frq_cnt] < max_resp_gain && tune_p < 0.6f * max_gain_p.max_allowed) { - tune_p += 0.05f * max_gain_p.max_allowed; - } else { - counter = AUTOTUNE_SUCCESS_COUNT; - // reset curr_test.freq and frq_cnt for next test - curr_test.freq = freq[0]; - frq_cnt = 0; - tune_p -= 0.05f * max_gain_p.max_allowed; - tune_p = constrain_float(tune_p,0.0f,0.6f * max_gain_p.max_allowed); - } - } - } - - if (counter == AUTOTUNE_SUCCESS_COUNT) { - start_freq = 0.0f; //initializes next test that uses dwell test } else { - start_freq = curr_test.freq; - stop_freq = curr_test.freq; + next_freq = sugg_freq; } } -// updating_rate_d_up - uses maximum allowable gain determined from max_gain test to determine rate d gain where the response gain is at a minimum -void AC_AutoTune_Heli::updating_rate_d_up(float &tune_d, float *freq, float *gain, float *phase, uint8_t &frq_cnt, max_gain_data &max_gain_d) +// updating_rate_d_up - uses maximum allowable gain determined from max_gain test to determine rate d gain where the response +// gain is at a minimum. A phase of 161 deg is used to conduct the tuning as this phase is where analytically +// max gain to 6db gain margin is determined for a unity feedback controller. +void AC_AutoTune_Heli::updating_rate_d_up(float &tune_d, sweep_info &test_data, float &next_freq, max_gain_data &max_gain_d) { - float test_freq_incr = 0.25f * 3.14159f * 2.0f; // set for 1/4 hz increments + float test_freq_incr = 0.25f * M_2PI; // set for 1/4 hz increments + next_freq = test_data.freq; - // frequency sweep was conducted. check to see if freq for 180 deg phase was determined and start there if it was - if (!is_equal(start_freq,stop_freq)) { - if (!is_zero(sweep.ph180.freq)) { - freq[frq_cnt] = sweep.ph180.freq - 0.5f * test_freq_incr; - frq_cnt = 12; - freq_cnt_max = frq_cnt; + sweep_info data_at_ph161; + float sugg_freq; + if (freq_search_for_phase(test_data, 161.0f, test_freq_incr, data_at_ph161, sugg_freq)) { + if ((data_at_ph161.gain < rd_prev_gain || is_zero(rd_prev_gain)) && tune_d < 0.6f * max_gain_d.max_allowed) { + tune_d += 0.05f * max_gain_d.max_allowed; + rd_prev_gain = data_at_ph161.gain; + next_freq = data_at_ph161.freq; } else { - frq_cnt = 1; - freq[frq_cnt] = min_sweep_freq; + counter = AUTOTUNE_SUCCESS_COUNT; + // reset next freq and rd_prev_gain for next test + next_freq = 0; + rd_prev_gain = 0.0f; + tune_d -= 0.05f * max_gain_d.max_allowed; + tune_d = constrain_float(tune_d,0.0f,0.6f * max_gain_d.max_allowed); } - curr_test.freq = freq[frq_cnt]; - } - // if sweep failed to find frequency for 180 phase then use dwell to find frequency - if (frq_cnt < 12 && is_equal(start_freq,stop_freq)) { - if (phase[frq_cnt] <= 180.0f && !is_zero(phase[frq_cnt])) { - rd_prev_good_frq_cnt = frq_cnt; - } else if (frq_cnt > 1 && phase[frq_cnt] > phase[frq_cnt-1] + 360.0f && !is_zero(phase[frq_cnt])) { - if (phase[frq_cnt] - 360.0f < 180.0f) { - rd_prev_good_frq_cnt = frq_cnt; - } - } else if (frq_cnt > 1 && phase[frq_cnt] > 200.0f && !is_zero(phase[frq_cnt])) { - frq_cnt = 11; - } - frq_cnt++; - if (frq_cnt == 12) { - freq[frq_cnt] = freq[rd_prev_good_frq_cnt]; - curr_test.freq = freq[frq_cnt]; - } else { - freq[frq_cnt] = freq[frq_cnt-1] + test_freq_incr; - curr_test.freq = freq[frq_cnt]; - } - } else if (is_equal(start_freq,stop_freq)) { - if (phase[frq_cnt] > 180.0f) { - curr_test.freq = curr_test.freq - 0.5 * test_freq_incr; - freq[frq_cnt] = curr_test.freq; - } else if (phase[frq_cnt] < 160.0f) { - curr_test.freq = curr_test.freq + 0.5 * test_freq_incr; - freq[frq_cnt] = curr_test.freq; - } else if (phase[frq_cnt] <= 180.0f && phase[frq_cnt] >= 160.0f) { - if ((gain[frq_cnt] < rd_prev_gain || is_zero(rd_prev_gain)) && tune_d < 0.6f * max_gain_d.max_allowed) { - tune_d += 0.05f * max_gain_d.max_allowed; - rd_prev_gain = gain[frq_cnt]; - } else { - counter = AUTOTUNE_SUCCESS_COUNT; - // reset curr_test.freq and frq_cnt for next test - curr_test.freq = freq[0]; - frq_cnt = 0; - rd_prev_gain = 0.0f; - tune_d -= 0.05f * max_gain_d.max_allowed; - tune_d = constrain_float(tune_d,0.0f,0.6f * max_gain_d.max_allowed); - } - } - } - if (counter == AUTOTUNE_SUCCESS_COUNT) { - start_freq = 0.0f; //initializes next test that uses dwell test - reset_sweep_variables(); } else { - start_freq = curr_test.freq; - stop_freq = curr_test.freq; + next_freq = sugg_freq; } } -// updating_angle_p_up - determines maximum angle p gain for pitch and roll -void AC_AutoTune_Heli::updating_angle_p_up(float &tune_p, float *freq, float *gain, float *phase, uint8_t &frq_cnt) +// updating_angle_p_up - determines maximum angle p gain for pitch and roll. This is accomplished by determining the frequency +// for the maximum response gain that is the disturbance rejection peak. +void AC_AutoTune_Heli::updating_angle_p_up(float &tune_p, sweep_info &test_data, float &next_freq) { - float test_freq_incr = 0.5f * 3.14159f * 2.0f; + float test_freq_incr = 0.5f * M_2PI; float gain_incr = 0.5f; - if (!is_equal(start_freq,stop_freq)) { - if (!is_zero(sweep.maxgain.freq)) { - frq_cnt = 12; - freq[frq_cnt] = sweep.maxgain.freq - 0.5f * test_freq_incr; - freq_cnt_max = frq_cnt; - } else { - frq_cnt = 1; - freq[frq_cnt] = min_sweep_freq; - freq_cnt_max = 0; - } - curr_test.freq = freq[frq_cnt]; + if (is_zero(test_data.phase)) { + // bad test point. increase slightly in hope of getting better result + next_freq += 0.5f * test_freq_incr; + return; } - if (freq_cnt < 12 && is_equal(start_freq,stop_freq)) { - if (gain[freq_cnt] > max_resp_gain && tune_p > AUTOTUNE_SP_MIN) { + + if (!found_max_gain_freq) { + if (test_data.gain > max_resp_gain && tune_p > AUTOTUNE_SP_MIN) { // exceeded max response gain already, reduce tuning gain to remain under max response gain tune_p -= gain_incr; // force counter to stay on frequency - freq_cnt -= 1; - } else if (gain[freq_cnt] > max_resp_gain && tune_p <= AUTOTUNE_SP_MIN) { + next_freq = test_data.freq; + return; + } else if (test_data.gain > max_resp_gain && tune_p <= AUTOTUNE_SP_MIN) { // exceeded max response gain at the minimum allowable tuning gain. terminate testing. tune_p = AUTOTUNE_SP_MIN; counter = AUTOTUNE_SUCCESS_COUNT; LOGGER_WRITE_EVENT(LogEvent::AUTOTUNE_REACHED_LIMIT); - } else if (gain[freq_cnt] > gain[freq_cnt_max]) { - freq_cnt_max = freq_cnt; - phase_max = phase[freq_cnt]; - sp_prev_gain = gain[freq_cnt]; - } else if (freq[freq_cnt] > max_sweep_freq || (gain[freq_cnt] > 0.0f && gain[freq_cnt] < 0.5f)) { - // must be past peak, continue on to determine angle p - freq_cnt = 11; - } - freq_cnt++; - if (freq_cnt == 12) { - freq[freq_cnt] = freq[freq_cnt_max]; - curr_test.freq = freq[freq_cnt]; + } else if (test_data.gain > sp_prev_gain) { + freq_max = test_data.freq; + phase_max = test_data.phase; + sp_prev_gain = test_data.gain; + next_freq = test_data.freq + test_freq_incr; + return; + // Gain is expected to continue decreasing past gain peak. declare max gain freq found and refine search. + } else if (test_data.gain < 0.95f * sp_prev_gain) { + found_max_gain_freq = true; + next_freq = freq_max + 0.5 * test_freq_incr; + return; } else { - freq[freq_cnt] = freq[freq_cnt-1] + test_freq_incr; - curr_test.freq = freq[freq_cnt]; + next_freq = test_data.freq + test_freq_incr; + return; } } - // once finished with sweep of frequencies, cnt = 12 is used to then tune for max response gain - if (freq_cnt >= 12 && is_equal(start_freq,stop_freq)) { - if (gain[freq_cnt] < max_resp_gain && tune_p < AUTOTUNE_SP_MAX && !find_peak) { - // keep increasing tuning gain unless phase changes or max response gain is achieved - if (phase[freq_cnt]-phase_max > 20.0f && phase[freq_cnt] < 210.0f) { - freq[freq_cnt] += 0.5 * test_freq_incr; - find_peak = true; - } else { - tune_p += gain_incr; - freq[freq_cnt] = freq[freq_cnt_max]; - if (tune_p >= AUTOTUNE_SP_MAX) { - tune_p = AUTOTUNE_SP_MAX; - counter = AUTOTUNE_SUCCESS_COUNT; - LOGGER_WRITE_EVENT(LogEvent::AUTOTUNE_REACHED_LIMIT); - } + // refine peak + if (!found_peak) { + // look at frequency above max gain freq found + if (test_data.freq > freq_max && test_data.gain > sp_prev_gain) { + // found max at frequency greater than initial max gain frequency + found_peak = true; + } else if (test_data.freq > freq_max && test_data.gain < sp_prev_gain) { + // look at frequency below initial max gain frequency + next_freq = test_data.freq - 0.5 * test_freq_incr; + return; + } else if (test_data.freq < freq_max && test_data.gain > sp_prev_gain) { + // found max at frequency less than initial max gain frequency + found_peak = true; + } else { + found_peak = true; + test_data.freq = freq_max; + test_data.gain = sp_prev_gain; + } + sp_prev_gain = test_data.gain; + } + + // start increasing gain + if (found_max_gain_freq && found_peak) { + if (test_data.gain < max_resp_gain && tune_p < AUTOTUNE_SP_MAX) { + tune_p += gain_incr; + next_freq = test_data.freq; + if (tune_p >= AUTOTUNE_SP_MAX) { + tune_p = AUTOTUNE_SP_MAX; + counter = AUTOTUNE_SUCCESS_COUNT; + LOGGER_WRITE_EVENT(LogEvent::AUTOTUNE_REACHED_LIMIT); } - curr_test.freq = freq[freq_cnt]; - sp_prev_gain = gain[freq_cnt]; - } else if (gain[freq_cnt] > 1.1f * max_resp_gain && tune_p > AUTOTUNE_SP_MIN && !find_peak) { + sp_prev_gain = test_data.gain; + } else if (test_data.gain > 1.1f * max_resp_gain && tune_p > AUTOTUNE_SP_MIN) { tune_p -= gain_incr; - } else if (find_peak) { - // find the frequency where the response gain is maximum - if (gain[freq_cnt] > sp_prev_gain) { - freq[freq_cnt] += 0.5 * test_freq_incr; - } else { - find_peak = false; - phase_max = phase[freq_cnt]; - } - curr_test.freq = freq[freq_cnt]; - sp_prev_gain = gain[freq_cnt]; } else { // adjust tuning gain so max response gain is not exceeded - if (sp_prev_gain < max_resp_gain && gain[freq_cnt] > max_resp_gain) { - float adj_factor = (max_resp_gain - gain[freq_cnt]) / (gain[freq_cnt] - sp_prev_gain); + if (sp_prev_gain < max_resp_gain && test_data.gain > max_resp_gain) { + float adj_factor = (max_resp_gain - test_data.gain) / (test_data.gain - sp_prev_gain); tune_p = tune_p + gain_incr * adj_factor; } counter = AUTOTUNE_SUCCESS_COUNT; } } if (counter == AUTOTUNE_SUCCESS_COUNT) { - start_freq = 0.0f; //initializes next test that uses dwell test + next_freq = 0.0f; //initializes next test that uses dwell test + sweep_complete = false; reset_sweep_variables(); - curr_test.freq = freq[0]; - freq_cnt = 0; - } else { - start_freq = curr_test.freq; - stop_freq = curr_test.freq; } } -// updating_max_gains: use dwells at increasing frequency to determine gain at which instability will occur -void AC_AutoTune_Heli::updating_max_gains(float *freq, float *gain, float *phase, uint8_t &frq_cnt, max_gain_data &max_gain_p, max_gain_data &max_gain_d, float &tune_p, float &tune_d) +// updating_max_gains: use dwells at increasing frequency to determine gain at which instability will occur. This uses the frequency +// response of motor class input to rate response to determine the max allowable gain for rate P gain. A phase of 161 deg is used to +// determine analytically the max gain to 6db gain margin for a unity feedback controller. Since acceleration can be more noisy, the +// response of the motor class input to rate response to determine the max allowable gain for rate D gain. A phase of 251 deg is used +// to determine analytically the max gain to 6db gain margin for a unity feedback controller. +void AC_AutoTune_Heli::updating_max_gains(sweep_info &test_data, float &next_freq, max_gain_data &max_gain_p, max_gain_data &max_gain_d, float &tune_p, float &tune_d) { - float test_freq_incr = 1.0f * M_PI * 2.0f; + float test_freq_incr = 0.5f * M_2PI; + next_freq = test_data.freq; - if (!is_equal(start_freq,stop_freq)) { - frq_cnt = 2; - if (!is_zero(sweep.ph180.freq)) { - freq[frq_cnt] = sweep.ph180.freq - 0.5f * test_freq_incr; - } else { - freq[frq_cnt] = min_sweep_freq; - } - curr_test.freq = freq[frq_cnt]; - start_freq = curr_test.freq; - stop_freq = curr_test.freq; - - } else if (frq_cnt < 12 && is_equal(start_freq,stop_freq)) { - if (frq_cnt > 2 && phase[frq_cnt] > 161.0f && phase[frq_cnt] < 270.0f && - !find_middle && !found_max_p) { - find_middle = true; - } else if (find_middle && !found_max_p) { - if (phase[frq_cnt] > 161.0f) { - // interpolate between frq_cnt-2 and frq_cnt - max_gain_p.freq = linear_interpolate(freq[frq_cnt-2],freq[frq_cnt],161.0f,phase[frq_cnt-2],phase[frq_cnt]); - max_gain_p.gain = linear_interpolate(gain[frq_cnt-2],gain[frq_cnt],161.0f,phase[frq_cnt-2],phase[frq_cnt]); - } else { - // interpolate between frq_cnt-1 and frq_cnt - max_gain_p.freq = linear_interpolate(freq[frq_cnt],freq[frq_cnt-1],161.0f,phase[frq_cnt],phase[frq_cnt-1]); - max_gain_p.gain = linear_interpolate(gain[frq_cnt],gain[frq_cnt-1],161.0f,phase[frq_cnt],phase[frq_cnt-1]); - } - max_gain_p.phase = 161.0f; + sweep_info data_at_phase; + float sugg_freq; + if (!found_max_p) { + if (freq_search_for_phase(test_data, 161.0f, test_freq_incr, data_at_phase, sugg_freq)) { + max_gain_p.freq = data_at_phase.freq; + max_gain_p.gain = data_at_phase.gain; + max_gain_p.phase = data_at_phase.phase; max_gain_p.max_allowed = powf(10.0f,-1 * (log10f(max_gain_p.gain) * 20.0f + 2.42) / 20.0f); // limit max gain allowed to be no more than 2x the max p gain limit to keep initial gains bounded max_gain_p.max_allowed = constrain_float(max_gain_p.max_allowed, 0.0f, 2.0f * AUTOTUNE_RP_MAX); found_max_p = true; - find_middle = false; - - if (!is_zero(sweep.ph270.freq)) { - // set freq cnt back to reinitialize process - frq_cnt = 1; // set to 1 because it will be incremented - // set frequency back at least one test_freq_incr as it will be added - freq[1] = sweep.ph270.freq - 1.5f * test_freq_incr; - } - } - if (frq_cnt > 2 && phase[frq_cnt] > 251.0f && phase[frq_cnt] < 360.0f && - !find_middle && !found_max_d && found_max_p) { - find_middle = true; - } else if (find_middle && found_max_p && !found_max_d) { - if (phase[frq_cnt] > 251.0f) { - // interpolate between frq_cnt-2 and frq_cnt - max_gain_d.freq = linear_interpolate(freq[frq_cnt-2],freq[frq_cnt],251.0f,phase[frq_cnt-2],phase[frq_cnt]); - max_gain_d.gain = linear_interpolate(gain[frq_cnt-2],gain[frq_cnt],251.0f,phase[frq_cnt-2],phase[frq_cnt]); + if (!is_zero(sweep_mtr.ph270.freq)) { + next_freq = sweep_mtr.ph270.freq; } else { - // interpolate between frq_cnt-1 and frq_cnt - max_gain_d.freq = linear_interpolate(freq[frq_cnt],freq[frq_cnt-1],251.0f,phase[frq_cnt],phase[frq_cnt-1]); - max_gain_d.gain = linear_interpolate(gain[frq_cnt],gain[frq_cnt-1],251.0f,phase[frq_cnt],phase[frq_cnt-1]); + next_freq = data_at_phase.freq; } - max_gain_d.phase = 251.0f; + } else { + next_freq = sugg_freq; + } + } else if (!found_max_d) { + if (freq_search_for_phase(test_data, 251.0f, test_freq_incr, data_at_phase, sugg_freq)) { + max_gain_d.freq = data_at_phase.freq; + max_gain_d.gain = data_at_phase.gain; + max_gain_d.phase = data_at_phase.phase; max_gain_d.max_allowed = powf(10.0f,-1 * (log10f(max_gain_d.freq * max_gain_d.gain) * 20.0f + 2.42) / 20.0f); // limit max gain allowed to be no more than 2x the max d gain limit to keep initial gains bounded max_gain_d.max_allowed = constrain_float(max_gain_d.max_allowed, 0.0f, 2.0f * AUTOTUNE_RD_MAX); found_max_d = true; - find_middle = false; - } - // stop progression in frequency. - if ((frq_cnt > 1 && phase[frq_cnt] > 330.0f && !is_zero(phase[frq_cnt])) || found_max_d) { - frq_cnt = 11; - } - frq_cnt++; - if (frq_cnt == 12) { - counter = AUTOTUNE_SUCCESS_COUNT; - // reset variables for next test - curr_test.freq = freq[0]; - frq_cnt = 0; - start_freq = 0.0f; //initializes next test that uses dwell test - reset_sweep_variables(); } else { - if (frq_cnt == 3 && phase[2] >= 161.0f && !found_max_p) { - // phase greater than 161 deg won't allow max p to be found - // reset freq cnt to 2 and lower dwell freq to push phase below 161 deg - frq_cnt = 2; - freq[frq_cnt] = freq[frq_cnt] - 0.5f * test_freq_incr; - } else if (frq_cnt == 3 && phase[2] >= 251.0f && !found_max_d) { - // phase greater than 161 deg won't allow max p to be found - // reset freq cnt to 2 and lower dwell freq to push phase below 161 deg - frq_cnt = 2; - freq[frq_cnt] = freq[frq_cnt] - 0.5f * test_freq_incr; - } else if (find_middle) { - freq[frq_cnt] = freq[frq_cnt-1] - 0.5f * test_freq_incr; - } else { - freq[frq_cnt] = freq[frq_cnt-1] + test_freq_incr; - } - curr_test.freq = freq[frq_cnt]; - start_freq = curr_test.freq; - stop_freq = curr_test.freq; + next_freq = sugg_freq; } } + if (found_max_p && found_max_d) { - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: Max rate P freq=%f gain=%f", (double)(max_rate_p.freq), (double)(max_rate_p.gain)); - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: ph=%f rate_p=%f", (double)(max_rate_p.phase), (double)(max_rate_p.max_allowed)); - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: Max Rate D freq=%f gain=%f", (double)(max_rate_d.freq), (double)(max_rate_d.gain)); - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: ph=%f rate_d=%f", (double)(max_rate_d.phase), (double)(max_rate_d.max_allowed)); + counter = AUTOTUNE_SUCCESS_COUNT; + // reset variables for next test + next_freq = 0.0f; //initializes next test that uses dwell test + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: Max rate P freq=%f gain=%f", (double)(max_rate_p.freq), (double)(max_rate_p.gain)); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: ph=%f rate_p=%f", (double)(max_rate_p.phase), (double)(max_rate_p.max_allowed)); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: Max Rate D freq=%f gain=%f", (double)(max_rate_d.freq), (double)(max_rate_d.gain)); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: ph=%f rate_d=%f", (double)(max_rate_d.phase), (double)(max_rate_d.max_allowed)); } } @@ -1762,21 +1468,61 @@ float AC_AutoTune_Heli::angle_lim_neg_rpy_cd() const return AUTOTUNE_ANGLE_NEG_RPY_CD; } +// freq_search_for_phase: general search strategy for specified phase. interpolation done once specified phase has been bounded. +bool AC_AutoTune_Heli::freq_search_for_phase(sweep_info test, float desired_phase, float freq_incr, sweep_info &est_data, float &new_freq) +{ + new_freq = test.freq; + float phase_delta = 20.0f; // delta from desired phase below and above which full steps are taken + if (is_zero(test.phase)) { + // bad test point. increase slightly in hope of getting better result + new_freq += 0.1f * freq_incr; + return false; + } + + // test to see if desired phase is bounded with a 0.5 freq_incr delta in freq + float freq_delta = fabsf(prev_test.freq - test.freq); + if (test.phase > desired_phase && prev_test.phase < desired_phase && freq_delta < 0.75f * freq_incr && is_positive(prev_test.freq)) { + est_data.freq = linear_interpolate(prev_test.freq,test.freq,desired_phase,prev_test.phase,test.phase); + est_data.gain = linear_interpolate(prev_test.gain,test.gain,desired_phase,prev_test.phase,test.phase); + est_data.phase = desired_phase; + prev_test = {}; + return true; + } else if (test.phase < desired_phase && prev_test.phase > desired_phase && freq_delta < 0.75f * freq_incr && is_positive(prev_test.freq)) { + est_data.freq = linear_interpolate(test.freq,prev_test.freq,desired_phase,test.phase,prev_test.phase); + est_data.gain = linear_interpolate(test.gain,prev_test.gain,desired_phase,test.phase,prev_test.phase); + est_data.phase = desired_phase; + prev_test = {}; + return true; + } + + if (test.phase < desired_phase - phase_delta) { + new_freq += freq_incr; + } else if (test.phase > desired_phase + phase_delta) { + new_freq -= freq_incr; + } else if (test.phase >= desired_phase - phase_delta && test.phase < desired_phase) { + new_freq += 0.5f * freq_incr; + } else if (test.phase <= desired_phase + phase_delta && test.phase >= desired_phase) { + new_freq -= 0.5f * freq_incr; + } + prev_test = test; + return false; +} + #if HAL_LOGGING_ENABLED // log autotune summary data void AC_AutoTune_Heli::Log_AutoTune() { switch (axis) { - case ROLL: - Log_Write_AutoTune(axis, tune_type, test_freq[freq_cnt], test_gain[freq_cnt], test_phase[freq_cnt], tune_roll_rff, tune_roll_rp, tune_roll_rd, tune_roll_sp, test_accel_max); + case AxisType::ROLL: + Log_Write_AutoTune(axis, tune_type, curr_data.freq, curr_data.gain, curr_data.phase, tune_roll_rff, tune_roll_rp, tune_roll_rd, tune_roll_sp, test_accel_max); break; - case PITCH: - Log_Write_AutoTune(axis, tune_type, test_freq[freq_cnt], test_gain[freq_cnt], test_phase[freq_cnt], tune_pitch_rff, tune_pitch_rp, tune_pitch_rd, tune_pitch_sp, test_accel_max); + case AxisType::PITCH: + Log_Write_AutoTune(axis, tune_type, curr_data.freq, curr_data.gain, curr_data.phase, tune_pitch_rff, tune_pitch_rp, tune_pitch_rd, tune_pitch_sp, test_accel_max); break; - case YAW: - case YAW_D: - Log_Write_AutoTune(axis, tune_type, test_freq[freq_cnt], test_gain[freq_cnt], test_phase[freq_cnt], tune_yaw_rff, tune_yaw_rp, tune_yaw_rd, tune_yaw_sp, test_accel_max); + case AxisType::YAW: + case AxisType::YAW_D: + Log_Write_AutoTune(axis, tune_type, curr_data.freq, curr_data.gain, curr_data.phase, tune_yaw_rff, tune_yaw_rp, tune_yaw_rd, tune_yaw_sp, test_accel_max); break; } } @@ -1784,7 +1530,7 @@ void AC_AutoTune_Heli::Log_AutoTune() // log autotune time history results for command, angular rate, and attitude void AC_AutoTune_Heli::Log_AutoTuneDetails() { - if (tune_type == SP_UP) { + if (tune_type == SP_UP || tune_type == TUNE_CHECK) { Log_Write_AutoTuneDetails(command_out, 0.0f, 0.0f, filt_target_rate, rotation_rate); } else { Log_Write_AutoTuneDetails(command_out, filt_target_rate, rotation_rate, 0.0f, 0.0f); @@ -1794,7 +1540,7 @@ void AC_AutoTune_Heli::Log_AutoTuneDetails() // log autotune frequency response data void AC_AutoTune_Heli::Log_AutoTuneSweep() { - Log_Write_AutoTuneSweep(curr_test.freq, curr_test.gain, curr_test.phase); + Log_Write_AutoTuneSweep(curr_test_mtr.freq, curr_test_mtr.gain, curr_test_mtr.phase,curr_test_tgt.freq, curr_test_tgt.gain, curr_test_tgt.phase); } // @LoggerMessage: ATNH @@ -1813,7 +1559,7 @@ void AC_AutoTune_Heli::Log_AutoTuneSweep() // @Field: ACC: new max accel term // Write an Autotune summary data packet -void AC_AutoTune_Heli::Log_Write_AutoTune(uint8_t _axis, uint8_t tune_step, float dwell_freq, float meas_gain, float meas_phase, float new_gain_rff, float new_gain_rp, float new_gain_rd, float new_gain_sp, float max_accel) +void AC_AutoTune_Heli::Log_Write_AutoTune(AxisType _axis, uint8_t tune_step, float dwell_freq, float meas_gain, float meas_phase, float new_gain_rff, float new_gain_rp, float new_gain_rd, float new_gain_sp, float max_accel) { AP::logger().Write( "ATNH", @@ -1822,7 +1568,7 @@ void AC_AutoTune_Heli::Log_Write_AutoTune(uint8_t _axis, uint8_t tune_step, floa "F--000-----", "QBBffffffff", AP_HAL::micros64(), - axis, + (uint8_t)axis, tune_step, dwell_freq, meas_gain, @@ -1861,25 +1607,31 @@ void AC_AutoTune_Heli::Log_Write_AutoTuneDetails(float motor_cmd, float tgt_rate } // Write an Autotune frequency response data packet -void AC_AutoTune_Heli::Log_Write_AutoTuneSweep(float freq, float gain, float phase) +void AC_AutoTune_Heli::Log_Write_AutoTuneSweep(float freq_mtr, float gain_mtr, float phase_mtr, float freq_tgt, float gain_tgt, float phase_tgt) { // @LoggerMessage: ATSH // @Description: Heli AutoTune Sweep packet // @Vehicles: Copter // @Field: TimeUS: Time since system startup - // @Field: freq: current frequency - // @Field: gain: current response gain - // @Field: phase: current response phase + // @Field: freq_m: current frequency for motor input to rate + // @Field: gain_m: current response gain for motor input to rate + // @Field: phase_m: current response phase for motor input to rate + // @Field: freq_t: current frequency for target rate to rate + // @Field: gain_t: current response gain for target rate to rate + // @Field: phase_t: current response phase for target rate to rate AP::logger().WriteStreaming( "ATSH", - "TimeUS,freq,gain,phase", - "sE-d", - "F000", - "Qfff", + "TimeUS,freq_m,gain_m,phase_m,freq_t,gain_t,phase_t", + "sE-dE-d", + "F000000", + "Qffffff", AP_HAL::micros64(), - freq, - gain, - phase); + freq_mtr, + gain_mtr, + phase_mtr, + freq_tgt, + gain_tgt, + phase_tgt); } #endif // HAL_LOGGING_ENABLED @@ -1888,33 +1640,28 @@ void AC_AutoTune_Heli::reset_vehicle_test_variables() { // reset dwell test variables if sweep was interrupted in order to restart sweep if (!is_equal(start_freq, stop_freq)) { - freq_cnt = 0; start_freq = 0.0f; stop_freq = 0.0f; + next_test_freq = 0.0f; + sweep_complete = false; } } // reset the update gain variables for heli void AC_AutoTune_Heli::reset_update_gain_variables() { - // reset feedforward update gain variables - ff_up_first_iter = true; - first_dir_complete = false; - - // reset max gain variables + // reset max gain variables reset_maxgains_update_gain_variables(); // reset rd_up variables - rd_prev_good_frq_cnt = 0; rd_prev_gain = 0.0f; - // reset rp_up variables - rp_prev_good_frq_cnt = 0; - // reset sp_up variables phase_max = 0.0f; + freq_max = 0.0f; sp_prev_gain = 0.0f; - find_peak = false; + found_max_gain_freq = false; + found_peak = false; } @@ -1923,20 +1670,26 @@ void AC_AutoTune_Heli::reset_maxgains_update_gain_variables() { max_rate_p = {}; max_rate_d = {}; + found_max_p = false; found_max_d = false; - find_middle = false; } // reset the max_gains update gain variables void AC_AutoTune_Heli::reset_sweep_variables() { - sweep.ph180 = {}; - sweep.ph270 = {}; - sweep.maxgain = {}; + sweep_tgt.ph180 = {}; + sweep_tgt.ph270 = {}; + sweep_tgt.maxgain = {}; + sweep_tgt.progress = 0; + + sweep_mtr.ph180 = {}; + sweep_mtr.ph270 = {}; + sweep_mtr.maxgain = {}; + + sweep_mtr.progress = 0; - sweep.progress = 0; } // set the tuning test sequence diff --git a/libraries/AC_AutoTune/AC_AutoTune_Heli.h b/libraries/AC_AutoTune/AC_AutoTune_Heli.h index 31e935f6fb..4bb400a66c 100644 --- a/libraries/AC_AutoTune/AC_AutoTune_Heli.h +++ b/libraries/AC_AutoTune/AC_AutoTune_Heli.h @@ -50,7 +50,7 @@ protected: void backup_gains_and_initialise() override; // load gains - void load_gain_set(AxisType s_axis, float rate_p, float rate_i, float rate_d, float rate_ff, float angle_p, float max_accel, float rate_fltt, float rate_flte, float smax); + void load_gain_set(AxisType s_axis, float rate_p, float rate_i, float rate_d, float rate_ff, float angle_p, float max_accel, float rate_fltt, float rate_flte, float smax, float max_rate); // switch to use original gains void load_orig_gains() override; @@ -106,7 +106,7 @@ protected: #if HAL_LOGGING_ENABLED // methods to log autotune summary data void Log_AutoTune() override; - void Log_Write_AutoTune(uint8_t _axis, uint8_t tune_step, float dwell_freq, float meas_gain, float meas_phase, float new_gain_rff, float new_gain_rp, float new_gain_rd, float new_gain_sp, float max_accel); + void Log_Write_AutoTune(AxisType _axis, uint8_t tune_step, float dwell_freq, float meas_gain, float meas_phase, float new_gain_rff, float new_gain_rp, float new_gain_rd, float new_gain_sp, float max_accel); // methods to log autotune time history results for command, angular rate, and attitude. void Log_AutoTuneDetails() override; @@ -114,7 +114,7 @@ protected: // methods to log autotune frequency response results void Log_AutoTuneSweep() override; - void Log_Write_AutoTuneSweep(float freq, float gain, float phase); + void Log_Write_AutoTuneSweep(float freq_mtr, float gain_mtr, float phase_mtr, float freq_tgt, float gain_tgt, float phase_tgt); #endif // send intermittent updates to user on status of tune @@ -136,6 +136,13 @@ protected: uint32_t get_testing_step_timeout_ms() const override; private: + // sweep_info contains information about a specific test's sweep results + struct sweep_info { + float freq; + float gain; + float phase; + }; + // max_gain_data type stores information from the max gain test struct max_gain_data { float freq; @@ -144,18 +151,18 @@ private: float max_allowed; }; - // max gain data for rate p tuning - max_gain_data max_rate_p; - // max gain data for rate d tuning - max_gain_data max_rate_d; - - // dwell type identifies whether the dwell is ran on rate or angle - enum DwellType { + // FreqRespCalcType is the type of calculation done for the frequency response + enum FreqRespCalcType { RATE = 0, ANGLE = 1, DRB = 2, }; + enum FreqRespInput { + MOTOR = 0, + TARGET = 1, + }; + float target_angle_max_rp_cd() const override; float target_angle_max_y_cd() const override; @@ -168,31 +175,30 @@ private: float angle_lim_neg_rpy_cd() const override; - // Feedforward test used to determine Rate FF gain - void rate_ff_test_init(); - void rate_ff_test_run(float max_angle_cds, float target_rate_cds, float dir_sign); - // initialize dwell test or angle dwell test variables - void dwell_test_init(float start_frq, float stop_frq, float filt_freq, DwellType dwell_type); + void dwell_test_init(float start_frq, float stop_frq, float amplitude, float filt_freq, FreqRespInput freq_resp_input, FreqRespCalcType calc_type, AC_AutoTune_FreqResp::ResponseType resp_type, AC_AutoTune_FreqResp::InputType waveform_input_type); // dwell test used to perform frequency dwells for rate gains - void dwell_test_run(uint8_t freq_resp_input, float start_frq, float stop_frq, float &dwell_gain, float &dwell_phase, DwellType dwell_type); + void dwell_test_run(sweep_info &test_data); // updating_rate_ff_up - adjust FF to ensure the target is reached // FF is adjusted until rate requested is achieved - void updating_rate_ff_up(float &tune_ff, float rate_target, float meas_rate, float meas_command); + void updating_rate_ff_up(float &tune_ff, sweep_info &test_data, float &next_freq); // updating_rate_p_up - uses maximum allowable gain determined from max_gain test to determine rate p gain that does not exceed exceed max response gain - void updating_rate_p_up(float &tune_p, float *freq, float *gain, float *phase, uint8_t &frq_cnt, max_gain_data &max_gain_p); + void updating_rate_p_up(float &tune_p, sweep_info &test_data, float &next_freq, max_gain_data &max_gain_p); // updating_rate_d_up - uses maximum allowable gain determined from max_gain test to determine rate d gain where the response gain is at a minimum - void updating_rate_d_up(float &tune_d, float *freq, float *gain, float *phase, uint8_t &frq_cnt, max_gain_data &max_gain_d); + void updating_rate_d_up(float &tune_d, sweep_info &test_data, float &next_freq, max_gain_data &max_gain_d); // updating_angle_p_up - determines maximum angle p gain for pitch and roll - void updating_angle_p_up(float &tune_p, float *freq, float *gain, float *phase, uint8_t &frq_cnt); + void updating_angle_p_up(float &tune_p, sweep_info &test_data, float &next_freq); // updating_max_gains: use dwells at increasing frequency to determine gain at which instability will occur - void updating_max_gains(float *freq, float *gain, float *phase, uint8_t &frq_cnt, max_gain_data &max_gain_p, max_gain_data &max_gain_d, float &tune_p, float &tune_d); + void updating_max_gains(sweep_info &test_data, float &next_freq, max_gain_data &max_gain_p, max_gain_data &max_gain_d, float &tune_p, float &tune_d); + + // freq_search_for_phase: general search strategy for specified phase. interpolation done once specified phase has been bounded. + bool freq_search_for_phase(sweep_info test, float desired_phase, float freq_incr, sweep_info &est_data, float &new_freq); // reset the max_gains update gain variables void reset_maxgains_update_gain_variables(); @@ -206,83 +212,65 @@ private: // report gain formatting helper void report_axis_gains(const char* axis_string, float rate_P, float rate_I, float rate_D, float rate_ff, float angle_P, float max_accel) const; - // updating rate FF variables - // flag for completion of the initial direction for the feedforward test - bool first_dir_complete; - // feedforward gain resulting from testing in the initial direction - float first_dir_rff; + // define input type as Dwell or Sweep. Used through entire class + AC_AutoTune_FreqResp::InputType input_type; + + sweep_info curr_data; // frequency response test results + float next_test_freq; // next test frequency for next test cycle setup + + // max gain data for rate p tuning + max_gain_data max_rate_p; + // max gain data for rate d tuning + max_gain_data max_rate_d; // updating max gain variables // flag for finding maximum p gain bool found_max_p; // flag for finding maximum d gain bool found_max_d; - // flag for interpolating to find max response gain - bool find_middle; // updating angle P up variables - // track the maximum phase - float phase_max; - // previous gain - float sp_prev_gain; - // flag for finding the peak of the gain response - bool find_peak; - - // updating rate P up - // counter value of previous good frequency - uint8_t rp_prev_good_frq_cnt; + float phase_max; // track the maximum phase and freq + float freq_max; + float sp_prev_gain; // previous gain + bool found_max_gain_freq; // flag for finding max gain frequency + bool found_peak; // flag for finding the peak of the gain response // updating rate D up - // counter value of previous good frequency - uint8_t rd_prev_good_frq_cnt; - // previous gain - float rd_prev_gain; + float rd_prev_gain; // previous gain - uint8_t ff_test_phase; // phase of feedforward test - float test_command_filt; // filtered commanded output for FF test analysis - float test_rate_filt; // filtered rate output for FF test analysis + // freq search for phase + sweep_info prev_test; // data from previous dwell + + // Dwell Test variables + AC_AutoTune_FreqResp::InputType test_input_type; + FreqRespCalcType test_calc_type; + FreqRespInput test_freq_resp_input; + uint8_t num_dwell_cycles; + float test_start_freq; + float tgt_attitude; + + float pre_calc_cycles; // number of cycles to complete before running frequency response calculations float command_out; // test axis command output - float test_tgt_rate_filt; // filtered target rate for FF test analysis float filt_target_rate; // filtered target rate - float test_gain[20]; // frequency response gain for each dwell test iteration - float test_freq[20]; // frequency of each dwell test iteration - float test_phase[20]; // frequency response phase for each dwell test iteration float dwell_start_time_ms; // start time in ms of dwell test - uint8_t freq_cnt_max; // counter number for frequency that produced max gain response - // sweep_info contains information about a specific test's sweep results - struct sweep_info { - float freq; - float gain; - float phase; - }; sweep_info curr_test; + sweep_info curr_test_mtr; + sweep_info curr_test_tgt; Vector3f start_angles; // aircraft attitude at the start of test uint32_t settle_time; // time in ms for allowing aircraft to stabilize before initiating test - uint32_t phase_out_time; // time in ms to phase out response - float trim_pff_out; // trim output of the PID rate controller for P, I and FF terms - float trim_meas_rate; // trim measured gyro rate - - //variables from rate FF test - float trim_command_reading; - float trim_heading; - LowPassFilterFloat rate_request_cds; - LowPassFilterFloat angle_request_cd; // variables from dwell test - LowPassFilterVector2f filt_pit_roll_cd; // filtered pitch and roll attitude for dwell rate method - LowPassFilterFloat filt_heading_error_cd; // filtered heading error for dwell rate method LowPassFilterVector2f filt_att_fdbk_from_velxy_cd; LowPassFilterFloat filt_command_reading; // filtered command reading to keep oscillation centered LowPassFilterFloat filt_gyro_reading; // filtered gyro reading to keep oscillation centered LowPassFilterFloat filt_tgt_rate_reading; // filtered target rate reading to keep oscillation centered // trim variables for determining trim state prior to test starting - Vector3f trim_attitude_cd; // trim attitude before starting test - float trim_command; // trim target yaw reading before starting test - float trim_yaw_tgt_reading; // trim target yaw reading before starting test - float trim_yaw_heading_reading; // trim heading reading before starting test + float trim_yaw_tgt_reading_cd; // trim target yaw reading before starting test + float trim_yaw_heading_reading_cd; // trim heading reading before starting test LowPassFilterFloat command_filt; // filtered command - filtering intended to remove noise LowPassFilterFloat target_rate_filt; // filtered target rate in radians/second - filtering intended to remove noise @@ -292,15 +280,15 @@ private: sweep_info maxgain; sweep_info ph180; sweep_info ph270; - uint8_t progress; // set based on phase of frequency response. 0 - start; 1 - reached 180 deg; 2 - reached 270 deg; }; - sweep_data sweep; + sweep_data sweep_mtr; + sweep_data sweep_tgt; + bool sweep_complete; // fix the frequency sweep time to 23 seconds const float sweep_time_ms = 23000; - // parameters AP_Int8 axis_bitmask; // axes to be tuned AP_Int8 seq_bitmask; // tuning sequence bitmask @@ -308,9 +296,16 @@ private: AP_Float max_sweep_freq; // maximum sweep frequency AP_Float max_resp_gain; // maximum response gain AP_Float vel_hold_gain; // gain for velocity hold + AP_Float accel_max; // maximum autotune angular acceleration + AP_Float rate_max; // maximum autotune angular rate // freqresp object for the frequency response tests - AC_AutoTune_FreqResp freqresp; + AC_AutoTune_FreqResp freqresp_mtr; // frequency response of output to motor mixer input + AC_AutoTune_FreqResp freqresp_tgt; // frequency response of output to target input + + // allow tracking of cycles complete for frequency response object + bool cycle_complete_tgt; + bool cycle_complete_mtr; Chirp chirp_input; }; diff --git a/libraries/AC_AutoTune/AC_AutoTune_Multi.cpp b/libraries/AC_AutoTune/AC_AutoTune_Multi.cpp index 0a2a7b6784..213fc41a2b 100644 --- a/libraries/AC_AutoTune/AC_AutoTune_Multi.cpp +++ b/libraries/AC_AutoTune/AC_AutoTune_Multi.cpp @@ -46,29 +46,29 @@ #define AUTOTUNE_TESTING_STEP_TIMEOUT_MS 2000U // timeout for tuning mode's testing step -#define AUTOTUNE_RD_STEP 0.05f // minimum increment when increasing/decreasing Rate D term -#define AUTOTUNE_RP_STEP 0.05f // minimum increment when increasing/decreasing Rate P term -#define AUTOTUNE_SP_STEP 0.05f // minimum increment when increasing/decreasing Stab P term -#define AUTOTUNE_PI_RATIO_FOR_TESTING 0.1f // I is set 10x smaller than P during testing -#define AUTOTUNE_PI_RATIO_FINAL 1.0f // I is set 1x P after testing -#define AUTOTUNE_YAW_PI_RATIO_FINAL 0.1f // I is set 1x P after testing -#define AUTOTUNE_RD_MAX 0.200f // maximum Rate D value -#define AUTOTUNE_RLPF_MIN 1.0f // minimum Rate Yaw filter value -#define AUTOTUNE_RLPF_MAX 5.0f // maximum Rate Yaw filter value -#define AUTOTUNE_FLTE_MIN 2.5f // minimum Rate Yaw error filter value -#define AUTOTUNE_RP_MIN 0.01f // minimum Rate P value -#define AUTOTUNE_RP_MAX 2.0f // maximum Rate P value -#define AUTOTUNE_SP_MAX 40.0f // maximum Stab P value -#define AUTOTUNE_SP_MIN 0.5f // maximum Stab P value -#define AUTOTUNE_RP_ACCEL_MIN 4000.0f // Minimum acceleration for Roll and Pitch -#define AUTOTUNE_Y_ACCEL_MIN 1000.0f // Minimum acceleration for Yaw -#define AUTOTUNE_Y_FILT_FREQ 10.0f // Autotune filter frequency when testing Yaw -#define AUTOTUNE_D_UP_DOWN_MARGIN 0.2f // The margin below the target that we tune D in -#define AUTOTUNE_RD_BACKOFF 1.0f // Rate D gains are reduced to 50% of their maximum value discovered during tuning -#define AUTOTUNE_RP_BACKOFF 1.0f // Rate P gains are reduced to 97.5% of their maximum value discovered during tuning -#define AUTOTUNE_SP_BACKOFF 0.9f // Stab P gains are reduced to 90% of their maximum value discovered during tuning -#define AUTOTUNE_ACCEL_RP_BACKOFF 1.0f // back off from maximum acceleration -#define AUTOTUNE_ACCEL_Y_BACKOFF 1.0f // back off from maximum acceleration +#define AUTOTUNE_RD_STEP 0.05 // minimum increment when increasing/decreasing Rate D term +#define AUTOTUNE_RP_STEP 0.05 // minimum increment when increasing/decreasing Rate P term +#define AUTOTUNE_SP_STEP 0.05 // minimum increment when increasing/decreasing Stab P term +#define AUTOTUNE_PI_RATIO_FOR_TESTING 0.1 // I is set 10x smaller than P during testing +#define AUTOTUNE_PI_RATIO_FINAL 1.0 // I is set 1x P after testing +#define AUTOTUNE_YAW_PI_RATIO_FINAL 0.1 // I is set 1x P after testing +#define AUTOTUNE_RD_MAX 0.200 // maximum Rate D value +#define AUTOTUNE_RLPF_MIN 1.0 // minimum Rate Yaw filter value +#define AUTOTUNE_RLPF_MAX 5.0 // maximum Rate Yaw filter value +#define AUTOTUNE_FLTE_MIN 2.5 // minimum Rate Yaw error filter value +#define AUTOTUNE_RP_MIN 0.01 // minimum Rate P value +#define AUTOTUNE_RP_MAX 2.0 // maximum Rate P value +#define AUTOTUNE_SP_MAX 40.0 // maximum Stab P value +#define AUTOTUNE_SP_MIN 0.5 // maximum Stab P value +#define AUTOTUNE_RP_ACCEL_MIN 4000.0 // Minimum acceleration for Roll and Pitch +#define AUTOTUNE_Y_ACCEL_MIN 1000.0 // Minimum acceleration for Yaw +#define AUTOTUNE_Y_FILT_FREQ 10.0 // Autotune filter frequency when testing Yaw +#define AUTOTUNE_D_UP_DOWN_MARGIN 0.2 // The margin below the target that we tune D in +#define AUTOTUNE_RD_BACKOFF 1.0 // Rate D gains are reduced to 50% of their maximum value discovered during tuning +#define AUTOTUNE_RP_BACKOFF 1.0 // Rate P gains are reduced to 97.5% of their maximum value discovered during tuning +#define AUTOTUNE_SP_BACKOFF 0.9 // Stab P gains are reduced to 90% of their maximum value discovered during tuning +#define AUTOTUNE_ACCEL_RP_BACKOFF 1.0 // back off from maximum acceleration +#define AUTOTUNE_ACCEL_Y_BACKOFF 1.0 // back off from maximum acceleration // roll and pitch axes #define AUTOTUNE_TARGET_RATE_RLLPIT_CDS 18000 // target roll/pitch rate during AUTOTUNE_STEP_TWITCHING step @@ -127,7 +127,7 @@ void AC_AutoTune_Multi::do_gcs_announcements() if (now - announce_time < AUTOTUNE_ANNOUNCE_INTERVAL_MS) { return; } - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: %s %s %u%%", axis_string(), type_string(), (counter * (100/AUTOTUNE_SUCCESS_COUNT))); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: %s %s %u%%", axis_string(), type_string(), (counter * (100/AUTOTUNE_SUCCESS_COUNT))); announce_time = now; } @@ -147,7 +147,7 @@ void AC_AutoTune_Multi::backup_gains_and_initialise() { AC_AutoTune::backup_gains_and_initialise(); - aggressiveness.set(constrain_float(aggressiveness, 0.05f, 0.2f)); + aggressiveness.set(constrain_float(aggressiveness, 0.05, 0.2)); orig_bf_feedforward = attitude_control->get_bf_feedforward(); @@ -212,41 +212,41 @@ void AC_AutoTune_Multi::load_orig_gains() attitude_control->bf_feedforward(orig_bf_feedforward); if (roll_enabled()) { if (!is_zero(orig_roll_rp)) { - attitude_control->get_rate_roll_pid().kP(orig_roll_rp); - attitude_control->get_rate_roll_pid().kI(orig_roll_ri); - attitude_control->get_rate_roll_pid().kD(orig_roll_rd); - attitude_control->get_rate_roll_pid().ff(orig_roll_rff); - attitude_control->get_rate_roll_pid().kDff(orig_roll_dff); - attitude_control->get_rate_roll_pid().filt_T_hz(orig_roll_fltt); - attitude_control->get_rate_roll_pid().slew_limit(orig_roll_smax); - attitude_control->get_angle_roll_p().kP(orig_roll_sp); + attitude_control->get_rate_roll_pid().set_kP(orig_roll_rp); + attitude_control->get_rate_roll_pid().set_kI(orig_roll_ri); + attitude_control->get_rate_roll_pid().set_kD(orig_roll_rd); + attitude_control->get_rate_roll_pid().set_ff(orig_roll_rff); + attitude_control->get_rate_roll_pid().set_kDff(orig_roll_dff); + attitude_control->get_rate_roll_pid().set_filt_T_hz(orig_roll_fltt); + attitude_control->get_rate_roll_pid().set_slew_limit(orig_roll_smax); + attitude_control->get_angle_roll_p().set_kP(orig_roll_sp); attitude_control->set_accel_roll_max_cdss(orig_roll_accel); } } if (pitch_enabled()) { if (!is_zero(orig_pitch_rp)) { - attitude_control->get_rate_pitch_pid().kP(orig_pitch_rp); - attitude_control->get_rate_pitch_pid().kI(orig_pitch_ri); - attitude_control->get_rate_pitch_pid().kD(orig_pitch_rd); - attitude_control->get_rate_pitch_pid().ff(orig_pitch_rff); - attitude_control->get_rate_pitch_pid().kDff(orig_pitch_dff); - attitude_control->get_rate_pitch_pid().filt_T_hz(orig_pitch_fltt); - attitude_control->get_rate_pitch_pid().slew_limit(orig_pitch_smax); - attitude_control->get_angle_pitch_p().kP(orig_pitch_sp); + attitude_control->get_rate_pitch_pid().set_kP(orig_pitch_rp); + attitude_control->get_rate_pitch_pid().set_kI(orig_pitch_ri); + attitude_control->get_rate_pitch_pid().set_kD(orig_pitch_rd); + attitude_control->get_rate_pitch_pid().set_ff(orig_pitch_rff); + attitude_control->get_rate_pitch_pid().set_kDff(orig_pitch_dff); + attitude_control->get_rate_pitch_pid().set_filt_T_hz(orig_pitch_fltt); + attitude_control->get_rate_pitch_pid().set_slew_limit(orig_pitch_smax); + attitude_control->get_angle_pitch_p().set_kP(orig_pitch_sp); attitude_control->set_accel_pitch_max_cdss(orig_pitch_accel); } } if (yaw_enabled() || yaw_d_enabled()) { if (!is_zero(orig_yaw_rp)) { - attitude_control->get_rate_yaw_pid().kP(orig_yaw_rp); - attitude_control->get_rate_yaw_pid().kI(orig_yaw_ri); - attitude_control->get_rate_yaw_pid().kD(orig_yaw_rd); - attitude_control->get_rate_yaw_pid().ff(orig_yaw_rff); - attitude_control->get_rate_yaw_pid().kDff(orig_yaw_dff); - attitude_control->get_rate_yaw_pid().filt_E_hz(orig_yaw_rLPF); - attitude_control->get_rate_yaw_pid().filt_T_hz(orig_yaw_fltt); - attitude_control->get_rate_yaw_pid().slew_limit(orig_yaw_smax); - attitude_control->get_angle_yaw_p().kP(orig_yaw_sp); + attitude_control->get_rate_yaw_pid().set_kP(orig_yaw_rp); + attitude_control->get_rate_yaw_pid().set_kI(orig_yaw_ri); + attitude_control->get_rate_yaw_pid().set_kD(orig_yaw_rd); + attitude_control->get_rate_yaw_pid().set_ff(orig_yaw_rff); + attitude_control->get_rate_yaw_pid().set_kDff(orig_yaw_dff); + attitude_control->get_rate_yaw_pid().set_filt_E_hz(orig_yaw_rLPF); + attitude_control->get_rate_yaw_pid().set_filt_T_hz(orig_yaw_fltt); + attitude_control->get_rate_yaw_pid().set_slew_limit(orig_yaw_smax); + attitude_control->get_angle_yaw_p().set_kP(orig_yaw_sp); attitude_control->set_accel_yaw_max_cdss(orig_yaw_accel); } } @@ -257,46 +257,41 @@ void AC_AutoTune_Multi::load_tuned_gains() { if (!attitude_control->get_bf_feedforward()) { attitude_control->bf_feedforward(true); - attitude_control->set_accel_roll_max_cdss(0.0f); - attitude_control->set_accel_pitch_max_cdss(0.0f); + attitude_control->set_accel_roll_max_cdss(0.0); + attitude_control->set_accel_pitch_max_cdss(0.0); } - if (roll_enabled()) { - if (!is_zero(tune_roll_rp)) { - attitude_control->get_rate_roll_pid().kP(tune_roll_rp); - attitude_control->get_rate_roll_pid().kI(tune_roll_rp*AUTOTUNE_PI_RATIO_FINAL); - attitude_control->get_rate_roll_pid().kD(tune_roll_rd); - attitude_control->get_rate_roll_pid().ff(orig_roll_rff); - attitude_control->get_rate_roll_pid().kDff(orig_roll_dff); - attitude_control->get_angle_roll_p().kP(tune_roll_sp); - attitude_control->set_accel_roll_max_cdss(tune_roll_accel); - } + if ((axes_completed & AUTOTUNE_AXIS_BITMASK_ROLL) && roll_enabled() && !is_zero(tune_roll_rp)) { + attitude_control->get_rate_roll_pid().set_kP(tune_roll_rp); + attitude_control->get_rate_roll_pid().set_kI(tune_roll_rp*AUTOTUNE_PI_RATIO_FINAL); + attitude_control->get_rate_roll_pid().set_kD(tune_roll_rd); + attitude_control->get_rate_roll_pid().set_ff(orig_roll_rff); + attitude_control->get_rate_roll_pid().set_kDff(orig_roll_dff); + attitude_control->get_angle_roll_p().set_kP(tune_roll_sp); + attitude_control->set_accel_roll_max_cdss(tune_roll_accel); } - if (pitch_enabled()) { - if (!is_zero(tune_pitch_rp)) { - attitude_control->get_rate_pitch_pid().kP(tune_pitch_rp); - attitude_control->get_rate_pitch_pid().kI(tune_pitch_rp*AUTOTUNE_PI_RATIO_FINAL); - attitude_control->get_rate_pitch_pid().kD(tune_pitch_rd); - attitude_control->get_rate_pitch_pid().ff(orig_pitch_rff); - attitude_control->get_rate_pitch_pid().kDff(orig_pitch_dff); - attitude_control->get_angle_pitch_p().kP(tune_pitch_sp); - attitude_control->set_accel_pitch_max_cdss(tune_pitch_accel); - } + if ((axes_completed & AUTOTUNE_AXIS_BITMASK_PITCH) && pitch_enabled() && !is_zero(tune_pitch_rp)) { + attitude_control->get_rate_pitch_pid().set_kP(tune_pitch_rp); + attitude_control->get_rate_pitch_pid().set_kI(tune_pitch_rp*AUTOTUNE_PI_RATIO_FINAL); + attitude_control->get_rate_pitch_pid().set_kD(tune_pitch_rd); + attitude_control->get_rate_pitch_pid().set_ff(orig_pitch_rff); + attitude_control->get_rate_pitch_pid().set_kDff(orig_pitch_dff); + attitude_control->get_angle_pitch_p().set_kP(tune_pitch_sp); + attitude_control->set_accel_pitch_max_cdss(tune_pitch_accel); } - if (yaw_enabled() || yaw_d_enabled()) { - if (!is_zero(tune_yaw_rp)) { - attitude_control->get_rate_yaw_pid().kP(tune_yaw_rp); - attitude_control->get_rate_yaw_pid().kI(tune_yaw_rp*AUTOTUNE_YAW_PI_RATIO_FINAL); - if (yaw_d_enabled()) { - attitude_control->get_rate_yaw_pid().kD(tune_yaw_rd); - } - if (yaw_enabled()) { - attitude_control->get_rate_yaw_pid().filt_E_hz(tune_yaw_rLPF); - } - attitude_control->get_rate_yaw_pid().ff(orig_yaw_rff); - attitude_control->get_rate_yaw_pid().kDff(orig_yaw_dff); - attitude_control->get_angle_yaw_p().kP(tune_yaw_sp); - attitude_control->set_accel_yaw_max_cdss(tune_yaw_accel); + if ((((axes_completed & AUTOTUNE_AXIS_BITMASK_YAW) && yaw_enabled()) + || ((axes_completed & AUTOTUNE_AXIS_BITMASK_YAW_D) && yaw_d_enabled())) && !is_zero(tune_yaw_rp)) { + attitude_control->get_rate_yaw_pid().set_kP(tune_yaw_rp); + attitude_control->get_rate_yaw_pid().set_kI(tune_yaw_rp*AUTOTUNE_YAW_PI_RATIO_FINAL); + if (yaw_d_enabled()) { + attitude_control->get_rate_yaw_pid().set_kD(tune_yaw_rd); } + if (yaw_enabled()) { + attitude_control->get_rate_yaw_pid().set_filt_E_hz(tune_yaw_rLPF); + } + attitude_control->get_rate_yaw_pid().set_ff(orig_yaw_rff); + attitude_control->get_rate_yaw_pid().set_kDff(orig_yaw_dff); + attitude_control->get_angle_yaw_p().set_kP(tune_yaw_sp); + attitude_control->set_accel_yaw_max_cdss(tune_yaw_accel); } } @@ -308,35 +303,35 @@ void AC_AutoTune_Multi::load_intra_test_gains() // sanity check the gains attitude_control->bf_feedforward(true); if (roll_enabled()) { - attitude_control->get_rate_roll_pid().kP(orig_roll_rp); - attitude_control->get_rate_roll_pid().kI(orig_roll_rp*AUTOTUNE_PI_RATIO_FOR_TESTING); - attitude_control->get_rate_roll_pid().kD(orig_roll_rd); - attitude_control->get_rate_roll_pid().ff(orig_roll_rff); - attitude_control->get_rate_roll_pid().kDff(orig_roll_dff); - attitude_control->get_rate_roll_pid().filt_T_hz(orig_roll_fltt); - attitude_control->get_rate_roll_pid().slew_limit(orig_roll_smax); - attitude_control->get_angle_roll_p().kP(orig_roll_sp); + attitude_control->get_rate_roll_pid().set_kP(orig_roll_rp); + attitude_control->get_rate_roll_pid().set_kI(orig_roll_rp*AUTOTUNE_PI_RATIO_FOR_TESTING); + attitude_control->get_rate_roll_pid().set_kD(orig_roll_rd); + attitude_control->get_rate_roll_pid().set_ff(orig_roll_rff); + attitude_control->get_rate_roll_pid().set_kDff(orig_roll_dff); + attitude_control->get_rate_roll_pid().set_filt_T_hz(orig_roll_fltt); + attitude_control->get_rate_roll_pid().set_slew_limit(orig_roll_smax); + attitude_control->get_angle_roll_p().set_kP(orig_roll_sp); } if (pitch_enabled()) { - attitude_control->get_rate_pitch_pid().kP(orig_pitch_rp); - attitude_control->get_rate_pitch_pid().kI(orig_pitch_rp*AUTOTUNE_PI_RATIO_FOR_TESTING); - attitude_control->get_rate_pitch_pid().kD(orig_pitch_rd); - attitude_control->get_rate_pitch_pid().ff(orig_pitch_rff); - attitude_control->get_rate_pitch_pid().kDff(orig_pitch_dff); - attitude_control->get_rate_pitch_pid().filt_T_hz(orig_pitch_fltt); - attitude_control->get_rate_pitch_pid().slew_limit(orig_pitch_smax); - attitude_control->get_angle_pitch_p().kP(orig_pitch_sp); + attitude_control->get_rate_pitch_pid().set_kP(orig_pitch_rp); + attitude_control->get_rate_pitch_pid().set_kI(orig_pitch_rp*AUTOTUNE_PI_RATIO_FOR_TESTING); + attitude_control->get_rate_pitch_pid().set_kD(orig_pitch_rd); + attitude_control->get_rate_pitch_pid().set_ff(orig_pitch_rff); + attitude_control->get_rate_pitch_pid().set_kDff(orig_pitch_dff); + attitude_control->get_rate_pitch_pid().set_filt_T_hz(orig_pitch_fltt); + attitude_control->get_rate_pitch_pid().set_slew_limit(orig_pitch_smax); + attitude_control->get_angle_pitch_p().set_kP(orig_pitch_sp); } if (yaw_enabled() || yaw_d_enabled()) { - attitude_control->get_rate_yaw_pid().kP(orig_yaw_rp); - attitude_control->get_rate_yaw_pid().kI(orig_yaw_rp*AUTOTUNE_PI_RATIO_FOR_TESTING); - attitude_control->get_rate_yaw_pid().kD(orig_yaw_rd); - attitude_control->get_rate_yaw_pid().ff(orig_yaw_rff); - attitude_control->get_rate_yaw_pid().kDff(orig_yaw_dff); - attitude_control->get_rate_yaw_pid().filt_T_hz(orig_yaw_fltt); - attitude_control->get_rate_yaw_pid().slew_limit(orig_yaw_smax); - attitude_control->get_rate_yaw_pid().filt_E_hz(orig_yaw_rLPF); - attitude_control->get_angle_yaw_p().kP(orig_yaw_sp); + attitude_control->get_rate_yaw_pid().set_kP(orig_yaw_rp); + attitude_control->get_rate_yaw_pid().set_kI(orig_yaw_rp*AUTOTUNE_PI_RATIO_FOR_TESTING); + attitude_control->get_rate_yaw_pid().set_kD(orig_yaw_rd); + attitude_control->get_rate_yaw_pid().set_ff(orig_yaw_rff); + attitude_control->get_rate_yaw_pid().set_kDff(orig_yaw_dff); + attitude_control->get_rate_yaw_pid().set_filt_T_hz(orig_yaw_fltt); + attitude_control->get_rate_yaw_pid().set_slew_limit(orig_yaw_smax); + attitude_control->get_rate_yaw_pid().set_filt_E_hz(orig_yaw_rLPF); + attitude_control->get_angle_yaw_p().set_kP(orig_yaw_sp); } } @@ -345,41 +340,41 @@ void AC_AutoTune_Multi::load_intra_test_gains() void AC_AutoTune_Multi::load_test_gains() { switch (axis) { - case ROLL: - attitude_control->get_rate_roll_pid().kP(tune_roll_rp); - attitude_control->get_rate_roll_pid().kI(tune_roll_rp*0.01f); - attitude_control->get_rate_roll_pid().kD(tune_roll_rd); - attitude_control->get_rate_roll_pid().ff(0.0f); - attitude_control->get_rate_roll_pid().kDff(0.0f); - attitude_control->get_rate_roll_pid().filt_T_hz(0.0f); - attitude_control->get_rate_roll_pid().slew_limit(0.0f); - attitude_control->get_angle_roll_p().kP(tune_roll_sp); + case AxisType::ROLL: + attitude_control->get_rate_roll_pid().set_kP(tune_roll_rp); + attitude_control->get_rate_roll_pid().set_kI(tune_roll_rp * 0.01); + attitude_control->get_rate_roll_pid().set_kD(tune_roll_rd); + attitude_control->get_rate_roll_pid().set_ff(0.0); + attitude_control->get_rate_roll_pid().set_kDff(0.0); + attitude_control->get_rate_roll_pid().set_filt_T_hz(0.0); + attitude_control->get_rate_roll_pid().set_slew_limit(0.0); + attitude_control->get_angle_roll_p().set_kP(tune_roll_sp); break; - case PITCH: - attitude_control->get_rate_pitch_pid().kP(tune_pitch_rp); - attitude_control->get_rate_pitch_pid().kI(tune_pitch_rp*0.01f); - attitude_control->get_rate_pitch_pid().kD(tune_pitch_rd); - attitude_control->get_rate_pitch_pid().ff(0.0f); - attitude_control->get_rate_pitch_pid().kDff(0.0f); - attitude_control->get_rate_pitch_pid().filt_T_hz(0.0f); - attitude_control->get_rate_pitch_pid().slew_limit(0.0f); - attitude_control->get_angle_pitch_p().kP(tune_pitch_sp); + case AxisType::PITCH: + attitude_control->get_rate_pitch_pid().set_kP(tune_pitch_rp); + attitude_control->get_rate_pitch_pid().set_kI(tune_pitch_rp * 0.01); + attitude_control->get_rate_pitch_pid().set_kD(tune_pitch_rd); + attitude_control->get_rate_pitch_pid().set_ff(0.0); + attitude_control->get_rate_pitch_pid().set_kDff(0.0); + attitude_control->get_rate_pitch_pid().set_filt_T_hz(0.0); + attitude_control->get_rate_pitch_pid().set_slew_limit(0.0); + attitude_control->get_angle_pitch_p().set_kP(tune_pitch_sp); break; - case YAW: - case YAW_D: - attitude_control->get_rate_yaw_pid().kP(tune_yaw_rp); - attitude_control->get_rate_yaw_pid().kI(tune_yaw_rp*0.01f); - attitude_control->get_rate_yaw_pid().ff(0.0f); - attitude_control->get_rate_yaw_pid().kDff(0.0f); - if (axis == YAW_D) { - attitude_control->get_rate_yaw_pid().kD(tune_yaw_rd); + case AxisType::YAW: + case AxisType::YAW_D: + attitude_control->get_rate_yaw_pid().set_kP(tune_yaw_rp); + attitude_control->get_rate_yaw_pid().set_kI(tune_yaw_rp * 0.01); + attitude_control->get_rate_yaw_pid().set_ff(0.0); + attitude_control->get_rate_yaw_pid().set_kDff(0.0); + if (axis == AxisType::YAW_D) { + attitude_control->get_rate_yaw_pid().set_kD(tune_yaw_rd); } else { - attitude_control->get_rate_yaw_pid().kD(0.0); - attitude_control->get_rate_yaw_pid().filt_E_hz(tune_yaw_rLPF); + attitude_control->get_rate_yaw_pid().set_kD(0.0); + attitude_control->get_rate_yaw_pid().set_filt_E_hz(tune_yaw_rLPF); } - attitude_control->get_rate_yaw_pid().filt_T_hz(0.0f); - attitude_control->get_rate_yaw_pid().slew_limit(0.0f); - attitude_control->get_angle_yaw_p().kP(tune_yaw_sp); + attitude_control->get_rate_yaw_pid().set_filt_T_hz(0.0); + attitude_control->get_rate_yaw_pid().set_slew_limit(0.0); + attitude_control->get_angle_yaw_p().set_kP(tune_yaw_sp); break; } } @@ -395,24 +390,24 @@ void AC_AutoTune_Multi::save_tuning_gains() if (!attitude_control->get_bf_feedforward()) { attitude_control->bf_feedforward_save(true); - attitude_control->save_accel_roll_max_cdss(0.0f); - attitude_control->save_accel_pitch_max_cdss(0.0f); + attitude_control->save_accel_roll_max_cdss(0.0); + attitude_control->save_accel_pitch_max_cdss(0.0); } // sanity check the rate P values if ((axes_completed & AUTOTUNE_AXIS_BITMASK_ROLL) && roll_enabled() && !is_zero(tune_roll_rp)) { // rate roll gains - attitude_control->get_rate_roll_pid().kP(tune_roll_rp); - attitude_control->get_rate_roll_pid().kI(tune_roll_rp*AUTOTUNE_PI_RATIO_FINAL); - attitude_control->get_rate_roll_pid().kD(tune_roll_rd); - attitude_control->get_rate_roll_pid().ff(orig_roll_rff); - attitude_control->get_rate_roll_pid().kDff(orig_roll_dff); - attitude_control->get_rate_roll_pid().filt_T_hz(orig_roll_fltt); - attitude_control->get_rate_roll_pid().slew_limit(orig_roll_smax); + attitude_control->get_rate_roll_pid().set_kP(tune_roll_rp); + attitude_control->get_rate_roll_pid().set_kI(tune_roll_rp*AUTOTUNE_PI_RATIO_FINAL); + attitude_control->get_rate_roll_pid().set_kD(tune_roll_rd); + attitude_control->get_rate_roll_pid().set_ff(orig_roll_rff); + attitude_control->get_rate_roll_pid().set_kDff(orig_roll_dff); + attitude_control->get_rate_roll_pid().set_filt_T_hz(orig_roll_fltt); + attitude_control->get_rate_roll_pid().set_slew_limit(orig_roll_smax); attitude_control->get_rate_roll_pid().save_gains(); // stabilize roll - attitude_control->get_angle_roll_p().kP(tune_roll_sp); + attitude_control->get_angle_roll_p().set_kP(tune_roll_sp); attitude_control->get_angle_roll_p().save_gains(); // acceleration roll @@ -430,17 +425,17 @@ void AC_AutoTune_Multi::save_tuning_gains() if ((axes_completed & AUTOTUNE_AXIS_BITMASK_PITCH) && pitch_enabled() && !is_zero(tune_pitch_rp)) { // rate pitch gains - attitude_control->get_rate_pitch_pid().kP(tune_pitch_rp); - attitude_control->get_rate_pitch_pid().kI(tune_pitch_rp*AUTOTUNE_PI_RATIO_FINAL); - attitude_control->get_rate_pitch_pid().kD(tune_pitch_rd); - attitude_control->get_rate_pitch_pid().ff(orig_pitch_rff); - attitude_control->get_rate_pitch_pid().kDff(orig_pitch_dff); - attitude_control->get_rate_pitch_pid().filt_T_hz(orig_pitch_fltt); - attitude_control->get_rate_pitch_pid().slew_limit(orig_pitch_smax); + attitude_control->get_rate_pitch_pid().set_kP(tune_pitch_rp); + attitude_control->get_rate_pitch_pid().set_kI(tune_pitch_rp*AUTOTUNE_PI_RATIO_FINAL); + attitude_control->get_rate_pitch_pid().set_kD(tune_pitch_rd); + attitude_control->get_rate_pitch_pid().set_ff(orig_pitch_rff); + attitude_control->get_rate_pitch_pid().set_kDff(orig_pitch_dff); + attitude_control->get_rate_pitch_pid().set_filt_T_hz(orig_pitch_fltt); + attitude_control->get_rate_pitch_pid().set_slew_limit(orig_pitch_smax); attitude_control->get_rate_pitch_pid().save_gains(); // stabilize pitch - attitude_control->get_angle_pitch_p().kP(tune_pitch_sp); + attitude_control->get_angle_pitch_p().set_kP(tune_pitch_sp); attitude_control->get_angle_pitch_p().save_gains(); // acceleration pitch @@ -459,22 +454,22 @@ void AC_AutoTune_Multi::save_tuning_gains() if ((((axes_completed & AUTOTUNE_AXIS_BITMASK_YAW) && yaw_enabled()) || ((axes_completed & AUTOTUNE_AXIS_BITMASK_YAW_D) && yaw_d_enabled())) && !is_zero(tune_yaw_rp)) { // rate yaw gains - attitude_control->get_rate_yaw_pid().kP(tune_yaw_rp); - attitude_control->get_rate_yaw_pid().kI(tune_yaw_rp*AUTOTUNE_YAW_PI_RATIO_FINAL); - attitude_control->get_rate_yaw_pid().ff(orig_yaw_rff); - attitude_control->get_rate_yaw_pid().kDff(orig_yaw_dff); - attitude_control->get_rate_yaw_pid().filt_T_hz(orig_yaw_fltt); - attitude_control->get_rate_yaw_pid().slew_limit(orig_yaw_smax); + attitude_control->get_rate_yaw_pid().set_kP(tune_yaw_rp); + attitude_control->get_rate_yaw_pid().set_kI(tune_yaw_rp*AUTOTUNE_YAW_PI_RATIO_FINAL); + attitude_control->get_rate_yaw_pid().set_ff(orig_yaw_rff); + attitude_control->get_rate_yaw_pid().set_kDff(orig_yaw_dff); + attitude_control->get_rate_yaw_pid().set_filt_T_hz(orig_yaw_fltt); + attitude_control->get_rate_yaw_pid().set_slew_limit(orig_yaw_smax); if (yaw_d_enabled()) { - attitude_control->get_rate_yaw_pid().kD(tune_yaw_rd); + attitude_control->get_rate_yaw_pid().set_kD(tune_yaw_rd); } if (yaw_enabled()) { - attitude_control->get_rate_yaw_pid().filt_E_hz(tune_yaw_rLPF); + attitude_control->get_rate_yaw_pid().set_filt_E_hz(tune_yaw_rLPF); } attitude_control->get_rate_yaw_pid().save_gains(); // stabilize yaw - attitude_control->get_angle_yaw_p().kP(tune_yaw_sp); + attitude_control->get_angle_yaw_p().set_kP(tune_yaw_sp); attitude_control->get_angle_yaw_p().save_gains(); // acceleration yaw @@ -502,16 +497,16 @@ void AC_AutoTune_Multi::save_tuning_gains() void AC_AutoTune_Multi::report_final_gains(AxisType test_axis) const { switch (test_axis) { - case ROLL: + case AxisType::ROLL: report_axis_gains("Roll", tune_roll_rp, tune_roll_rp*AUTOTUNE_PI_RATIO_FINAL, tune_roll_rd, tune_roll_sp, tune_roll_accel); break; - case PITCH: + case AxisType::PITCH: report_axis_gains("Pitch", tune_pitch_rp, tune_pitch_rp*AUTOTUNE_PI_RATIO_FINAL, tune_pitch_rd, tune_pitch_sp, tune_pitch_accel); break; - case YAW: + case AxisType::YAW: report_axis_gains("Yaw(E)", tune_yaw_rp, tune_yaw_rp*AUTOTUNE_YAW_PI_RATIO_FINAL, 0, tune_yaw_sp, tune_yaw_accel); break; - case YAW_D: + case AxisType::YAW_D: report_axis_gains("Yaw(D)", tune_yaw_rp, tune_yaw_rp*AUTOTUNE_YAW_PI_RATIO_FINAL, tune_yaw_rd, tune_yaw_sp, tune_yaw_accel); break; } @@ -520,9 +515,9 @@ void AC_AutoTune_Multi::report_final_gains(AxisType test_axis) const // report gain formatting helper void AC_AutoTune_Multi::report_axis_gains(const char* axis_string, float rate_P, float rate_I, float rate_D, float angle_P, float max_accel) const { - gcs().send_text(MAV_SEVERITY_NOTICE,"AutoTune: %s complete", axis_string); - gcs().send_text(MAV_SEVERITY_NOTICE,"AutoTune: %s Rate: P:%0.3f, I:%0.3f, D:%0.4f",axis_string,rate_P,rate_I,rate_D); - gcs().send_text(MAV_SEVERITY_NOTICE,"AutoTune: %s Angle P:%0.3f, Max Accel:%0.0f",axis_string,angle_P,max_accel); + GCS_SEND_TEXT(MAV_SEVERITY_NOTICE,"AutoTune: %s complete", axis_string); + GCS_SEND_TEXT(MAV_SEVERITY_NOTICE,"AutoTune: %s Rate: P:%0.3f, I:%0.3f, D:%0.4f",axis_string,rate_P,rate_I,rate_D); + GCS_SEND_TEXT(MAV_SEVERITY_NOTICE,"AutoTune: %s Angle P:%0.3f, Max Accel:%0.0f",axis_string,angle_P,max_accel); } // twitching_test_rate - twitching tests @@ -558,7 +553,7 @@ void AC_AutoTune_Multi::twitching_test_rate(float angle, float rate, float rate_ step = UPDATE_GAINS; } - if (meas_rate_max-meas_rate_min > meas_rate_max*aggressiveness) { + if (meas_rate_max - meas_rate_min > meas_rate_max * aggressiveness) { // the measurement has passed 50% of the maximum rate and bounce back is larger than the threshold step = UPDATE_GAINS; } @@ -573,7 +568,6 @@ void AC_AutoTune_Multi::twitching_test_rate(float angle, float rate, float rate_ // update min and max and test for end conditions void AC_AutoTune_Multi::twitching_abort_rate(float angle, float rate, float angle_max, float meas_rate_min, float angle_min) { - const uint32_t now = AP_HAL::millis(); if (angle >= angle_max) { if (is_equal(rate, meas_rate_min) || (angle_min > 0.95 * angle_max)) { // we have reached the angle limit before completing the measurement of maximum and minimum @@ -582,15 +576,12 @@ void AC_AutoTune_Multi::twitching_abort_rate(float angle, float rate, float angl step_scaler *= 0.9f; } else { LOGGER_WRITE_EVENT(LogEvent::AUTOTUNE_REACHED_LIMIT); - gcs().send_text(MAV_SEVERITY_CRITICAL, "AutoTune: Twitch Size Determination Failed"); + GCS_SEND_TEXT(MAV_SEVERITY_CRITICAL, "AutoTune: Twitch Size Determination Failed"); mode = FAILED; LOGGER_WRITE_EVENT(LogEvent::AUTOTUNE_FAILED); } // ignore result and start test again - step = WAITING_FOR_LEVEL; - positive_direction = twitch_reverse_direction(); - step_start_time_ms = now; - level_start_time_ms = now; + step = ABORT; } else { step = UPDATE_GAINS; } @@ -641,7 +632,7 @@ void AC_AutoTune_Multi::twitching_test_angle(float angle, float rate, float angl step = UPDATE_GAINS; } - if (meas_angle_max-meas_angle_min > meas_angle_max*aggressiveness) { + if (meas_angle_max - meas_angle_min > meas_angle_max * aggressiveness) { // the measurement has passed 50% of the maximum angle and bounce back is larger than the threshold step = UPDATE_GAINS; } @@ -653,11 +644,11 @@ void AC_AutoTune_Multi::twitching_test_angle(float angle, float rate, float angl } // twitching_measure_acceleration - measure rate of change of measurement -void AC_AutoTune_Multi::twitching_measure_acceleration(float &rate_of_change, float rate_measurement, float &rate_measurement_max) const +void AC_AutoTune_Multi::twitching_measure_acceleration(float &accel_average, float rate, float rate_max) const { - if (rate_measurement_max < rate_measurement) { - rate_measurement_max = rate_measurement; - rate_of_change = (1000.0f*rate_measurement_max)/(AP_HAL::millis() - step_start_time_ms); + if (rate_max < rate) { + rate_max = rate; + accel_average = (1000.0 * rate_max) / (AP_HAL::millis() - step_start_time_ms); } } @@ -665,16 +656,16 @@ void AC_AutoTune_Multi::twitching_measure_acceleration(float &rate_of_change, fl void AC_AutoTune_Multi::updating_rate_p_up_all(AxisType test_axis) { switch (test_axis) { - case ROLL: + case AxisType::ROLL: updating_rate_p_up_d_down(tune_roll_rd, min_d, AUTOTUNE_RD_STEP, tune_roll_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, target_rate, test_rate_min, test_rate_max); break; - case PITCH: + case AxisType::PITCH: updating_rate_p_up_d_down(tune_pitch_rd, min_d, AUTOTUNE_RD_STEP, tune_pitch_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, target_rate, test_rate_min, test_rate_max); break; - case YAW: + case AxisType::YAW: updating_rate_p_up_d_down(tune_yaw_rLPF, AUTOTUNE_RLPF_MIN, AUTOTUNE_RD_STEP, tune_yaw_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, target_rate, test_rate_min, test_rate_max, false); break; - case YAW_D: + case AxisType::YAW_D: updating_rate_p_up_d_down(tune_yaw_rd, min_d, AUTOTUNE_RD_STEP, tune_yaw_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, target_rate, test_rate_min, test_rate_max); break; } @@ -684,16 +675,16 @@ void AC_AutoTune_Multi::updating_rate_p_up_all(AxisType test_axis) void AC_AutoTune_Multi::updating_rate_d_up_all(AxisType test_axis) { switch (test_axis) { - case ROLL: + case AxisType::ROLL: updating_rate_d_up(tune_roll_rd, min_d, AUTOTUNE_RD_MAX, AUTOTUNE_RD_STEP, tune_roll_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, target_rate, test_rate_min, test_rate_max); break; - case PITCH: + case AxisType::PITCH: updating_rate_d_up(tune_pitch_rd, min_d, AUTOTUNE_RD_MAX, AUTOTUNE_RD_STEP, tune_pitch_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, target_rate, test_rate_min, test_rate_max); break; - case YAW: + case AxisType::YAW: updating_rate_d_up(tune_yaw_rLPF, AUTOTUNE_RLPF_MIN, AUTOTUNE_RLPF_MAX, AUTOTUNE_RD_STEP, tune_yaw_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, target_rate, test_rate_min, test_rate_max); break; - case YAW_D: + case AxisType::YAW_D: updating_rate_d_up(tune_yaw_rd, min_d, AUTOTUNE_RD_MAX, AUTOTUNE_RD_STEP, tune_yaw_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, target_rate, test_rate_min, test_rate_max); break; } @@ -703,16 +694,16 @@ void AC_AutoTune_Multi::updating_rate_d_up_all(AxisType test_axis) void AC_AutoTune_Multi::updating_rate_d_down_all(AxisType test_axis) { switch (test_axis) { - case ROLL: + case AxisType::ROLL: updating_rate_d_down(tune_roll_rd, min_d, AUTOTUNE_RD_STEP, tune_roll_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, target_rate, test_rate_min, test_rate_max); break; - case PITCH: + case AxisType::PITCH: updating_rate_d_down(tune_pitch_rd, min_d, AUTOTUNE_RD_STEP, tune_pitch_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, target_rate, test_rate_min, test_rate_max); break; - case YAW: + case AxisType::YAW: updating_rate_d_down(tune_yaw_rLPF, AUTOTUNE_RLPF_MIN, AUTOTUNE_RD_STEP, tune_yaw_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, target_rate, test_rate_min, test_rate_max); break; - case YAW_D: + case AxisType::YAW_D: updating_rate_d_down(tune_yaw_rd, min_d, AUTOTUNE_RD_STEP, tune_yaw_rp, AUTOTUNE_RP_MIN, AUTOTUNE_RP_MAX, AUTOTUNE_RP_STEP, target_rate, test_rate_min, test_rate_max); break; } @@ -722,14 +713,14 @@ void AC_AutoTune_Multi::updating_rate_d_down_all(AxisType test_axis) void AC_AutoTune_Multi::updating_angle_p_up_all(AxisType test_axis) { switch (test_axis) { - case ROLL: + case AxisType::ROLL: updating_angle_p_up(tune_roll_sp, AUTOTUNE_SP_MAX, AUTOTUNE_SP_STEP, target_angle, test_angle_max, test_rate_min, test_rate_max); break; - case PITCH: + case AxisType::PITCH: updating_angle_p_up(tune_pitch_sp, AUTOTUNE_SP_MAX, AUTOTUNE_SP_STEP, target_angle, test_angle_max, test_rate_min, test_rate_max); break; - case YAW: - case YAW_D: + case AxisType::YAW: + case AxisType::YAW_D: updating_angle_p_up(tune_yaw_sp, AUTOTUNE_SP_MAX, AUTOTUNE_SP_STEP, target_angle, test_angle_max, test_rate_min, test_rate_max); break; } @@ -739,14 +730,14 @@ void AC_AutoTune_Multi::updating_angle_p_up_all(AxisType test_axis) void AC_AutoTune_Multi::updating_angle_p_down_all(AxisType test_axis) { switch (test_axis) { - case ROLL: + case AxisType::ROLL: updating_angle_p_down(tune_roll_sp, AUTOTUNE_SP_MIN, AUTOTUNE_SP_STEP, target_angle, test_angle_max, test_rate_min, test_rate_max); break; - case PITCH: + case AxisType::PITCH: updating_angle_p_down(tune_pitch_sp, AUTOTUNE_SP_MIN, AUTOTUNE_SP_STEP, target_angle, test_angle_max, test_rate_min, test_rate_max); break; - case YAW: - case YAW_D: + case AxisType::YAW: + case AxisType::YAW_D: updating_angle_p_down(tune_yaw_sp, AUTOTUNE_SP_MIN, AUTOTUNE_SP_STEP, target_angle, test_angle_max, test_rate_min, test_rate_max); break; } @@ -760,19 +751,19 @@ void AC_AutoTune_Multi::set_gains_post_tune(AxisType test_axis) break; case RD_DOWN: switch (test_axis) { - case ROLL: + case AxisType::ROLL: tune_roll_rd = MAX(min_d, tune_roll_rd * AUTOTUNE_RD_BACKOFF); tune_roll_rp = MAX(AUTOTUNE_RP_MIN, tune_roll_rp * AUTOTUNE_RD_BACKOFF); break; - case PITCH: + case AxisType::PITCH: tune_pitch_rd = MAX(min_d, tune_pitch_rd * AUTOTUNE_RD_BACKOFF); tune_pitch_rp = MAX(AUTOTUNE_RP_MIN, tune_pitch_rp * AUTOTUNE_RD_BACKOFF); break; - case YAW: + case AxisType::YAW: tune_yaw_rLPF = MAX(AUTOTUNE_RLPF_MIN, tune_yaw_rLPF * AUTOTUNE_RD_BACKOFF); tune_yaw_rp = MAX(AUTOTUNE_RP_MIN, tune_yaw_rp * AUTOTUNE_RD_BACKOFF); break; - case YAW_D: + case AxisType::YAW_D: tune_yaw_rd = MAX(min_d, tune_yaw_rd * AUTOTUNE_RD_BACKOFF); tune_yaw_rp = MAX(AUTOTUNE_RP_MIN, tune_yaw_rp * AUTOTUNE_RD_BACKOFF); break; @@ -780,14 +771,14 @@ void AC_AutoTune_Multi::set_gains_post_tune(AxisType test_axis) break; case RP_UP: switch (test_axis) { - case ROLL: + case AxisType::ROLL: tune_roll_rp = MAX(AUTOTUNE_RP_MIN, tune_roll_rp * AUTOTUNE_RP_BACKOFF); break; - case PITCH: + case AxisType::PITCH: tune_pitch_rp = MAX(AUTOTUNE_RP_MIN, tune_pitch_rp * AUTOTUNE_RP_BACKOFF); break; - case YAW: - case YAW_D: + case AxisType::YAW: + case AxisType::YAW_D: tune_yaw_rp = MAX(AUTOTUNE_RP_MIN, tune_yaw_rp * AUTOTUNE_RP_BACKOFF); break; } @@ -796,16 +787,16 @@ void AC_AutoTune_Multi::set_gains_post_tune(AxisType test_axis) break; case SP_UP: switch (test_axis) { - case ROLL: + case AxisType::ROLL: tune_roll_sp = MAX(AUTOTUNE_SP_MIN, tune_roll_sp * AUTOTUNE_SP_BACKOFF); tune_roll_accel = MAX(AUTOTUNE_RP_ACCEL_MIN, test_accel_max * AUTOTUNE_ACCEL_RP_BACKOFF); break; - case PITCH: + case AxisType::PITCH: tune_pitch_sp = MAX(AUTOTUNE_SP_MIN, tune_pitch_sp * AUTOTUNE_SP_BACKOFF); tune_pitch_accel = MAX(AUTOTUNE_RP_ACCEL_MIN, test_accel_max * AUTOTUNE_ACCEL_RP_BACKOFF); break; - case YAW: - case YAW_D: + case AxisType::YAW: + case AxisType::YAW_D: tune_yaw_sp = MAX(AUTOTUNE_SP_MIN, tune_yaw_sp * AUTOTUNE_SP_BACKOFF); tune_yaw_accel = MAX(AUTOTUNE_Y_ACCEL_MIN, test_accel_max * AUTOTUNE_ACCEL_Y_BACKOFF); break; @@ -829,31 +820,31 @@ void AC_AutoTune_Multi::updating_rate_d_up(float &tune_d, float tune_d_min, floa if (meas_rate_max > rate_target) { // if maximum measurement was higher than target // reduce P gain (which should reduce maximum) - tune_p -= tune_p*tune_p_step_ratio; + tune_p -= tune_p * tune_p_step_ratio; if (tune_p < tune_p_min) { // P gain is at minimum so start reducing D tune_p = tune_p_min; - tune_d -= tune_d*tune_d_step_ratio; + tune_d -= tune_d * tune_d_step_ratio; if (tune_d <= tune_d_min) { // We have reached minimum D gain so stop tuning tune_d = tune_d_min; counter = AUTOTUNE_SUCCESS_COUNT; LOGGER_WRITE_EVENT(LogEvent::AUTOTUNE_REACHED_LIMIT); // This may be mean AGGR should be increased or MIN_D decreased - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: Min Rate D limit reached"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: Min Rate D limit reached"); } } - } else if ((meas_rate_max < rate_target*(1.0f-AUTOTUNE_D_UP_DOWN_MARGIN)) && (tune_p <= tune_p_max)) { + } else if ((meas_rate_max < rate_target * (1.0 - AUTOTUNE_D_UP_DOWN_MARGIN)) && (tune_p <= tune_p_max)) { // we have not achieved a high enough maximum to get a good measurement of bounce back. // increase P gain (which should increase maximum) - tune_p += tune_p*tune_p_step_ratio; + tune_p += tune_p * tune_p_step_ratio; if (tune_p >= tune_p_max) { tune_p = tune_p_max; LOGGER_WRITE_EVENT(LogEvent::AUTOTUNE_REACHED_LIMIT); } } else { // we have a good measurement of bounce back - if (meas_rate_max-meas_rate_min > meas_rate_max*aggressiveness) { + if (meas_rate_max-meas_rate_min > meas_rate_max * aggressiveness) { // ignore the next result unless it is the same as this one ignore_next = true; // bounce back is bigger than our threshold so increment the success counter @@ -865,7 +856,7 @@ void AC_AutoTune_Multi::updating_rate_d_up(float &tune_d, float tune_d_min, floa counter--; } // increase D gain (which should increase bounce back) - tune_d += tune_d*tune_d_step_ratio*2.0f; + tune_d += tune_d*tune_d_step_ratio * 2.0; // stop tuning if we hit maximum D if (tune_d >= tune_d_max) { tune_d = tune_d_max; @@ -897,20 +888,20 @@ void AC_AutoTune_Multi::updating_rate_d_down(float &tune_d, float tune_d_min, fl counter = AUTOTUNE_SUCCESS_COUNT; LOGGER_WRITE_EVENT(LogEvent::AUTOTUNE_REACHED_LIMIT); // This may be mean AGGR should be increased or MIN_D decreased - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: Min Rate D limit reached"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: Min Rate D limit reached"); } } - } else if ((meas_rate_max < rate_target*(1.0f-AUTOTUNE_D_UP_DOWN_MARGIN)) && (tune_p <= tune_p_max)) { + } else if ((meas_rate_max < rate_target*(1.0 - AUTOTUNE_D_UP_DOWN_MARGIN)) && (tune_p <= tune_p_max)) { // we have not achieved a high enough maximum to get a good measurement of bounce back. // increase P gain (which should increase maximum) - tune_p += tune_p*tune_p_step_ratio; + tune_p += tune_p * tune_p_step_ratio; if (tune_p >= tune_p_max) { tune_p = tune_p_max; LOGGER_WRITE_EVENT(LogEvent::AUTOTUNE_REACHED_LIMIT); } } else { // we have a good measurement of bounce back - if (meas_rate_max-meas_rate_min < meas_rate_max*aggressiveness) { + if (meas_rate_max - meas_rate_min < meas_rate_max * aggressiveness) { if (ignore_next == false) { // bounce back is less than our threshold so increment the success counter counter++; @@ -925,14 +916,14 @@ void AC_AutoTune_Multi::updating_rate_d_down(float &tune_d, float tune_d_min, fl counter--; } // decrease D gain (which should decrease bounce back) - tune_d -= tune_d*tune_d_step_ratio; + tune_d -= tune_d * tune_d_step_ratio; // stop tuning if we hit minimum D if (tune_d <= tune_d_min) { tune_d = tune_d_min; counter = AUTOTUNE_SUCCESS_COUNT; LOGGER_WRITE_EVENT(LogEvent::AUTOTUNE_REACHED_LIMIT); // This may be mean AGGR should be increased or MIN_D decreased - gcs().send_text(MAV_SEVERITY_INFO, "AutoTune: Min Rate D limit reached"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AutoTune: Min Rate D limit reached"); } } } @@ -942,34 +933,34 @@ void AC_AutoTune_Multi::updating_rate_d_down(float &tune_d, float tune_d_min, fl // P is increased until we achieve our target within a reasonable time while reducing D if bounce back increases above the threshold void AC_AutoTune_Multi::updating_rate_p_up_d_down(float &tune_d, float tune_d_min, float tune_d_step_ratio, float &tune_p, float tune_p_min, float tune_p_max, float tune_p_step_ratio, float rate_target, float meas_rate_min, float meas_rate_max, bool fail_min_d) { - if (meas_rate_max > rate_target*(1+0.5f*aggressiveness)) { + if (meas_rate_max > rate_target * (1.0 + 0.5 * aggressiveness)) { // ignore the next result unless it is the same as this one ignore_next = true; // if maximum measurement was greater than target so increment the success counter counter++; - } else if ((meas_rate_max < rate_target) && (meas_rate_max > rate_target*(1.0f-AUTOTUNE_D_UP_DOWN_MARGIN)) && (meas_rate_max-meas_rate_min > meas_rate_max*aggressiveness) && (tune_d > tune_d_min)) { + } else if ((meas_rate_max < rate_target) && (meas_rate_max > rate_target * (1.0 - AUTOTUNE_D_UP_DOWN_MARGIN)) && (meas_rate_max - meas_rate_min > meas_rate_max * aggressiveness) && (tune_d > tune_d_min)) { // if bounce back was larger than the threshold so decrement the success counter if (counter > 0) { counter--; } // decrease D gain (which should decrease bounce back) - tune_d -= tune_d*tune_d_step_ratio; + tune_d -= tune_d * tune_d_step_ratio; // do not decrease the D term past the minimum if (tune_d <= tune_d_min) { tune_d = tune_d_min; LOGGER_WRITE_EVENT(LogEvent::AUTOTUNE_REACHED_LIMIT); if (fail_min_d) { - gcs().send_text(MAV_SEVERITY_CRITICAL, "AutoTune: Rate D Gain Determination Failed"); + GCS_SEND_TEXT(MAV_SEVERITY_CRITICAL, "AutoTune: Rate D Gain Determination Failed"); mode = FAILED; LOGGER_WRITE_EVENT(LogEvent::AUTOTUNE_FAILED); } } // decrease P gain to match D gain reduction - tune_p -= tune_p*tune_p_step_ratio; + tune_p -= tune_p * tune_p_step_ratio; // do not decrease the P term past the minimum if (tune_p <= tune_p_min) { tune_p = tune_p_min; - gcs().send_text(MAV_SEVERITY_CRITICAL, "AutoTune: Rate P Gain Determination Failed"); + GCS_SEND_TEXT(MAV_SEVERITY_CRITICAL, "AutoTune: Rate P Gain Determination Failed"); mode = FAILED; LOGGER_WRITE_EVENT(LogEvent::AUTOTUNE_FAILED); } @@ -980,7 +971,7 @@ void AC_AutoTune_Multi::updating_rate_p_up_d_down(float &tune_d, float tune_d_mi counter--; } // increase P gain (which should increase the maximum) - tune_p += tune_p*tune_p_step_ratio; + tune_p += tune_p * tune_p_step_ratio; // stop tuning if we hit maximum P if (tune_p >= tune_p_max) { tune_p = tune_p_max; @@ -997,7 +988,7 @@ void AC_AutoTune_Multi::updating_rate_p_up_d_down(float &tune_d, float tune_d_mi // P is decreased to ensure we are not overshooting the target void AC_AutoTune_Multi::updating_angle_p_down(float &tune_p, float tune_p_min, float tune_p_step_ratio, float angle_target, float meas_angle_max, float meas_rate_min, float meas_rate_max) { - if (meas_angle_max < angle_target*(1+0.5f*aggressiveness)) { + if (meas_angle_max < angle_target * (1 + 0.5 * aggressiveness)) { if (ignore_next == false) { // if maximum measurement was lower than target so increment the success counter counter++; @@ -1018,7 +1009,7 @@ void AC_AutoTune_Multi::updating_angle_p_down(float &tune_p, float tune_p_min, f tune_p = tune_p_min; counter = AUTOTUNE_SUCCESS_COUNT; LOGGER_WRITE_EVENT(LogEvent::AUTOTUNE_REACHED_LIMIT); - gcs().send_text(MAV_SEVERITY_CRITICAL, "AutoTune: Angle P Gain Determination Failed"); + GCS_SEND_TEXT(MAV_SEVERITY_CRITICAL, "AutoTune: Angle P Gain Determination Failed"); mode = FAILED; LOGGER_WRITE_EVENT(LogEvent::AUTOTUNE_FAILED); } @@ -1029,8 +1020,8 @@ void AC_AutoTune_Multi::updating_angle_p_down(float &tune_p, float tune_p_min, f // P is increased until we achieve our target within a reasonable time void AC_AutoTune_Multi::updating_angle_p_up(float &tune_p, float tune_p_max, float tune_p_step_ratio, float angle_target, float meas_angle_max, float meas_rate_min, float meas_rate_max) { - if ((meas_angle_max > angle_target*(1+0.5f*aggressiveness)) || - ((meas_angle_max > angle_target) && (meas_rate_min < -meas_rate_max*aggressiveness))) { + if ((meas_angle_max > angle_target * (1 + 0.5 * aggressiveness)) || + ((meas_angle_max > angle_target) && (meas_rate_min < -meas_rate_max * aggressiveness))) { // ignore the next result unless it is the same as this one ignore_next = true; // if maximum measurement was greater than target so increment the success counter @@ -1042,7 +1033,7 @@ void AC_AutoTune_Multi::updating_angle_p_up(float &tune_p, float tune_p_max, flo counter--; } // increase P gain (which should increase the maximum) - tune_p += tune_p*tune_p_step_ratio; + tune_p += tune_p * tune_p_step_ratio; // stop tuning if we hit maximum P if (tune_p >= tune_p_max) { tune_p = tune_p_max; @@ -1060,31 +1051,31 @@ void AC_AutoTune_Multi::Log_AutoTune() { if ((tune_type == SP_DOWN) || (tune_type == SP_UP)) { switch (axis) { - case ROLL: + case AxisType::ROLL: Log_Write_AutoTune(axis, tune_type, target_angle, test_angle_min, test_angle_max, tune_roll_rp, tune_roll_rd, tune_roll_sp, test_accel_max); break; - case PITCH: + case AxisType::PITCH: Log_Write_AutoTune(axis, tune_type, target_angle, test_angle_min, test_angle_max, tune_pitch_rp, tune_pitch_rd, tune_pitch_sp, test_accel_max); break; - case YAW: + case AxisType::YAW: Log_Write_AutoTune(axis, tune_type, target_angle, test_angle_min, test_angle_max, tune_yaw_rp, tune_yaw_rLPF, tune_yaw_sp, test_accel_max); break; - case YAW_D: + case AxisType::YAW_D: Log_Write_AutoTune(axis, tune_type, target_angle, test_angle_min, test_angle_max, tune_yaw_rp, tune_yaw_rd, tune_yaw_sp, test_accel_max); break; } } else { switch (axis) { - case ROLL: + case AxisType::ROLL: Log_Write_AutoTune(axis, tune_type, target_rate, test_rate_min, test_rate_max, tune_roll_rp, tune_roll_rd, tune_roll_sp, test_accel_max); break; - case PITCH: + case AxisType::PITCH: Log_Write_AutoTune(axis, tune_type, target_rate, test_rate_min, test_rate_max, tune_pitch_rp, tune_pitch_rd, tune_pitch_sp, test_accel_max); break; - case YAW: + case AxisType::YAW: Log_Write_AutoTune(axis, tune_type, target_rate, test_rate_min, test_rate_max, tune_yaw_rp, tune_yaw_rLPF, tune_yaw_sp, test_accel_max); break; - case YAW_D: + case AxisType::YAW_D: Log_Write_AutoTune(axis, tune_type, target_rate, test_rate_min, test_rate_max, tune_yaw_rp, tune_yaw_rd, tune_yaw_sp, test_accel_max); break; } @@ -1112,7 +1103,7 @@ void AC_AutoTune_Multi::Log_AutoTuneDetails() // @Field: ddt: maximum measured twitching acceleration // Write an Autotune data packet -void AC_AutoTune_Multi::Log_Write_AutoTune(uint8_t _axis, uint8_t tune_step, float meas_target, float meas_min, float meas_max, float new_gain_rp, float new_gain_rd, float new_gain_sp, float new_ddt) +void AC_AutoTune_Multi::Log_Write_AutoTune(AxisType _axis, uint8_t tune_step, float meas_target, float meas_min, float meas_max, float new_gain_rp, float new_gain_rd, float new_gain_sp, float new_ddt) { AP::logger().Write( "ATUN", @@ -1123,9 +1114,9 @@ void AC_AutoTune_Multi::Log_Write_AutoTune(uint8_t _axis, uint8_t tune_step, flo AP_HAL::micros64(), axis, tune_step, - meas_target*0.01f, - meas_min*0.01f, - meas_max*0.01f, + meas_target*0.01, + meas_min*0.01, + meas_max*0.01, new_gain_rp, new_gain_rd, new_gain_sp, @@ -1147,8 +1138,8 @@ void AC_AutoTune_Multi::Log_Write_AutoTuneDetails(float angle_cd, float rate_cds "F00", "Qff", AP_HAL::micros64(), - angle_cd*0.01f, - rate_cds*0.01f); + angle_cd*0.01, + rate_cds*0.01); } #endif // HAL_LOGGING_ENABLED @@ -1188,40 +1179,48 @@ void AC_AutoTune_Multi::twitch_test_init() { float target_max_rate; switch (axis) { - case ROLL: { - target_max_rate = MAX(AUTOTUNE_TARGET_MIN_RATE_RLLPIT_CDS, step_scaler*AUTOTUNE_TARGET_RATE_RLLPIT_CDS); - target_rate = constrain_float(ToDeg(attitude_control->max_rate_step_bf_roll())*100.0f, AUTOTUNE_TARGET_MIN_RATE_RLLPIT_CDS, target_max_rate); - target_angle = constrain_float(ToDeg(attitude_control->max_angle_step_bf_roll())*100.0f, target_angle_min_rp_cd(), target_angle_max_rp_cd()); - rotation_rate_filt.set_cutoff_frequency(attitude_control->get_rate_roll_pid().filt_D_hz()*2.0f); + case AxisType::ROLL: + angle_abort = target_angle_max_rp_cd(); + target_max_rate = MAX(AUTOTUNE_TARGET_MIN_RATE_RLLPIT_CDS, step_scaler * AUTOTUNE_TARGET_RATE_RLLPIT_CDS); + target_rate = constrain_float(ToDeg(attitude_control->max_rate_step_bf_roll()) * 100.0, AUTOTUNE_TARGET_MIN_RATE_RLLPIT_CDS, target_max_rate); + target_angle = constrain_float(ToDeg(attitude_control->max_angle_step_bf_roll()) * 100.0, target_angle_min_rp_cd(), target_angle_max_rp_cd()); + rotation_rate_filt.set_cutoff_frequency(attitude_control->get_rate_roll_pid().filt_D_hz() * 2.0); break; - } - case PITCH: { - target_max_rate = MAX(AUTOTUNE_TARGET_MIN_RATE_RLLPIT_CDS, step_scaler*AUTOTUNE_TARGET_RATE_RLLPIT_CDS); - target_rate = constrain_float(ToDeg(attitude_control->max_rate_step_bf_pitch())*100.0f, AUTOTUNE_TARGET_MIN_RATE_RLLPIT_CDS, target_max_rate); - target_angle = constrain_float(ToDeg(attitude_control->max_angle_step_bf_pitch())*100.0f, target_angle_min_rp_cd(), target_angle_max_rp_cd()); - rotation_rate_filt.set_cutoff_frequency(attitude_control->get_rate_pitch_pid().filt_D_hz()*2.0f); + + case AxisType::PITCH: + angle_abort = target_angle_max_rp_cd(); + target_max_rate = MAX(AUTOTUNE_TARGET_MIN_RATE_RLLPIT_CDS, step_scaler * AUTOTUNE_TARGET_RATE_RLLPIT_CDS); + target_rate = constrain_float(ToDeg(attitude_control->max_rate_step_bf_pitch()) * 100.0, AUTOTUNE_TARGET_MIN_RATE_RLLPIT_CDS, target_max_rate); + target_angle = constrain_float(ToDeg(attitude_control->max_angle_step_bf_pitch()) * 100.0, target_angle_min_rp_cd(), target_angle_max_rp_cd()); + rotation_rate_filt.set_cutoff_frequency(attitude_control->get_rate_pitch_pid().filt_D_hz() * 2.0); break; - } - case YAW: - case YAW_D: { + + case AxisType::YAW: + case AxisType::YAW_D: + angle_abort = target_angle_max_y_cd(); target_max_rate = MAX(AUTOTUNE_TARGET_MIN_RATE_YAW_CDS, step_scaler*AUTOTUNE_TARGET_RATE_YAW_CDS); - target_rate = constrain_float(ToDeg(attitude_control->max_rate_step_bf_yaw()*0.75f)*100.0f, AUTOTUNE_TARGET_MIN_RATE_YAW_CDS, target_max_rate); - target_angle = constrain_float(ToDeg(attitude_control->max_angle_step_bf_yaw()*0.75f)*100.0f, target_angle_min_y_cd(), target_angle_max_y_cd()); - if (axis == YAW_D) { - rotation_rate_filt.set_cutoff_frequency(attitude_control->get_rate_yaw_pid().filt_D_hz()*2.0f); + target_rate = constrain_float(ToDeg(attitude_control->max_rate_step_bf_yaw() * 0.75) * 100.0, AUTOTUNE_TARGET_MIN_RATE_YAW_CDS, target_max_rate); + target_angle = constrain_float(ToDeg(attitude_control->max_angle_step_bf_yaw() * 0.75) * 100.0, target_angle_min_y_cd(), target_angle_max_y_cd()); + if (axis == AxisType::YAW_D) { + rotation_rate_filt.set_cutoff_frequency(attitude_control->get_rate_yaw_pid().filt_D_hz() * 2.0); } else { rotation_rate_filt.set_cutoff_frequency(AUTOTUNE_Y_FILT_FREQ); } break; } - } if ((tune_type == SP_DOWN) || (tune_type == SP_UP)) { + // todo: consider if this should be done for other axis rotation_rate_filt.reset(start_rate); } else { - rotation_rate_filt.reset(0); + rotation_rate_filt.reset(0.0); } - + twitch_first_iter = true; + test_rate_max = 0.0; + test_rate_min = 0.0; + test_angle_max = 0.0; + test_angle_min = 0.0; + accel_measure_rate_max = 0.0; } //run twitch test @@ -1237,39 +1236,39 @@ void AC_AutoTune_Multi::twitch_test_run(AxisType test_axis, const float dir_sign twitch_first_iter = false; // Testing increasing stabilize P gain so will set lean angle target switch (test_axis) { - case ROLL: + case AxisType::ROLL: // request roll to 20deg - attitude_control->input_angle_step_bf_roll_pitch_yaw(dir_sign * target_angle, 0.0f, 0.0f); + attitude_control->input_angle_step_bf_roll_pitch_yaw(dir_sign * target_angle, 0.0, 0.0); break; - case PITCH: + case AxisType::PITCH: // request pitch to 20deg - attitude_control->input_angle_step_bf_roll_pitch_yaw(0.0f, dir_sign * target_angle, 0.0f); + attitude_control->input_angle_step_bf_roll_pitch_yaw(0.0, dir_sign * target_angle, 0.0); break; - case YAW: - case YAW_D: + case AxisType::YAW: + case AxisType::YAW_D: // request yaw to 20deg - attitude_control->input_angle_step_bf_roll_pitch_yaw(0.0f, 0.0f, dir_sign * target_angle); + attitude_control->input_angle_step_bf_roll_pitch_yaw(0.0, 0.0, dir_sign * target_angle); break; } } else { - attitude_control->input_rate_bf_roll_pitch_yaw(0.0f, 0.0f, 0.0f); + attitude_control->input_rate_bf_roll_pitch_yaw(0.0, 0.0, 0.0); } } else { - attitude_control->input_rate_bf_roll_pitch_yaw_2(0.0f, 0.0f, 0.0f); + attitude_control->input_rate_bf_roll_pitch_yaw_2(0.0, 0.0, 0.0); // Testing rate P and D gains so will set body-frame rate targets. // Rate controller will use existing body-frame rates and convert to motor outputs // for all axes except the one we override here. switch (test_axis) { - case ROLL: + case AxisType::ROLL: // override body-frame roll rate attitude_control->rate_bf_roll_target(dir_sign * target_rate + start_rate); break; - case PITCH: + case AxisType::PITCH: // override body-frame pitch rate attitude_control->rate_bf_pitch_target(dir_sign * target_rate + start_rate); break; - case YAW: - case YAW_D: + case AxisType::YAW: + case AxisType::YAW_D: // override body-frame yaw rate attitude_control->rate_bf_yaw_target(dir_sign * target_rate + start_rate); break; @@ -1279,16 +1278,16 @@ void AC_AutoTune_Multi::twitch_test_run(AxisType test_axis, const float dir_sign // capture this iteration's rotation rate and lean angle float gyro_reading = 0; switch (test_axis) { - case ROLL: + case AxisType::ROLL: gyro_reading = ahrs_view->get_gyro().x; lean_angle = dir_sign * (ahrs_view->roll_sensor - (int32_t)start_angle); break; - case PITCH: + case AxisType::PITCH: gyro_reading = ahrs_view->get_gyro().y; lean_angle = dir_sign * (ahrs_view->pitch_sensor - (int32_t)start_angle); break; - case YAW: - case YAW_D: + case AxisType::YAW: + case AxisType::YAW_D: gyro_reading = ahrs_view->get_gyro().z; lean_angle = dir_sign * wrap_180_cd(ahrs_view->yaw_sensor-(int32_t)start_angle); break; @@ -1299,10 +1298,10 @@ void AC_AutoTune_Multi::twitch_test_run(AxisType test_axis, const float dir_sign switch (tune_type) { case SP_DOWN: case SP_UP: - filter_value = dir_sign * (ToDeg(gyro_reading) * 100.0f); + filter_value = dir_sign * (ToDeg(gyro_reading) * 100.0); break; default: - filter_value = dir_sign * (ToDeg(gyro_reading) * 100.0f - start_rate); + filter_value = dir_sign * (ToDeg(gyro_reading) * 100.0 - start_rate); break; } rotation_rate = rotation_rate_filt.apply(filter_value, @@ -1312,18 +1311,18 @@ void AC_AutoTune_Multi::twitch_test_run(AxisType test_axis, const float dir_sign case RD_UP: case RD_DOWN: twitching_test_rate(lean_angle, rotation_rate, target_rate, test_rate_min, test_rate_max, test_angle_min); - twitching_measure_acceleration(test_accel_max, rotation_rate, rate_max); - twitching_abort_rate(lean_angle, rotation_rate, angle_finish, test_rate_min, test_angle_min); + twitching_measure_acceleration(test_accel_max, rotation_rate, accel_measure_rate_max); + twitching_abort_rate(lean_angle, rotation_rate, angle_abort, test_rate_min, test_angle_min); break; case RP_UP: - twitching_test_rate(lean_angle, rotation_rate, target_rate*(1+0.5f*aggressiveness), test_rate_min, test_rate_max, test_angle_min); - twitching_measure_acceleration(test_accel_max, rotation_rate, rate_max); - twitching_abort_rate(lean_angle, rotation_rate, angle_finish, test_rate_min, test_angle_min); + twitching_test_rate(lean_angle, rotation_rate, target_rate * (1 + 0.5 * aggressiveness), test_rate_min, test_rate_max, test_angle_min); + twitching_measure_acceleration(test_accel_max, rotation_rate, accel_measure_rate_max); + twitching_abort_rate(lean_angle, rotation_rate, angle_abort, test_rate_min, test_angle_min); break; case SP_DOWN: case SP_UP: - twitching_test_angle(lean_angle, rotation_rate, target_angle*(1+0.5f*aggressiveness), test_angle_min, test_angle_max, test_rate_min, test_rate_max); - twitching_measure_acceleration(test_accel_max, rotation_rate - dir_sign * start_rate, rate_max); + twitching_test_angle(lean_angle, rotation_rate, target_angle * (1 + 0.5 * aggressiveness), test_angle_min, test_angle_max, test_rate_min, test_rate_max); + twitching_measure_acceleration(test_accel_max, rotation_rate - dir_sign * start_rate, accel_measure_rate_max); break; case RFF_UP: case MAX_GAINS: diff --git a/libraries/AC_AutoTune/AC_AutoTune_Multi.h b/libraries/AC_AutoTune/AC_AutoTune_Multi.h index 3650c85bff..e89dd4c589 100644 --- a/libraries/AC_AutoTune/AC_AutoTune_Multi.h +++ b/libraries/AC_AutoTune/AC_AutoTune_Multi.h @@ -127,7 +127,7 @@ protected: // this should never happen INTERNAL_ERROR(AP_InternalError::error_t::flow_of_control); } - void Log_Write_AutoTune(uint8_t axis, uint8_t tune_step, float meas_target, float meas_min, float meas_max, float new_gain_rp, float new_gain_rd, float new_gain_sp, float new_ddt); + void Log_Write_AutoTune(AxisType axis, uint8_t tune_step, float meas_target, float meas_min, float meas_max, float new_gain_rp, float new_gain_rd, float new_gain_sp, float new_ddt); void Log_Write_AutoTuneDetails(float angle_cd, float rate_cds); #endif @@ -156,7 +156,7 @@ private: void twitching_test_angle(float angle, float rate, float angle_target, float &meas_angle_min, float &meas_angle_max, float &meas_rate_min, float &meas_rate_max); // measure acceleration during twitch test - void twitching_measure_acceleration(float &rate_of_change, float rate_measurement, float &rate_measurement_max) const; + void twitching_measure_acceleration(float &accel_average, float rate, float rate_max) const; // updating_rate_d_up - increase D and adjust P to optimize the D term for a little bounce back // optimize D term while keeping the maximum just below the target by adjusting P @@ -182,9 +182,18 @@ private: void report_axis_gains(const char* axis_string, float rate_P, float rate_I, float rate_D, float angle_P, float max_accel) const; // parameters - AP_Int8 axis_bitmask; // axes to be tuned - AP_Float aggressiveness; // aircraft response aggressiveness to be tuned - AP_Float min_d; // minimum rate d gain allowed during tuning + AP_Int8 axis_bitmask; // axes to be tuned + AP_Float aggressiveness; // aircraft response aggressiveness to be tuned + AP_Float min_d; // minimum rate d gain allowed during tuning + bool ignore_next; // ignore the results of the next test when true + float target_angle; // target angle for the test + float target_rate; // target rate for the test + float angle_abort; // Angle that test is aborted + float test_rate_min; // the minimum angular rate achieved during TESTING_RATE + float test_rate_max; // the maximum angular rate achieved during TESTING_RATE + float test_angle_min; // the minimum angle achieved during TESTING_ANGLE + float test_angle_max; // the maximum angle achieved during TESTING_ANGLE + float accel_measure_rate_max; // the maximum rate used to measure average acceleration during twitch }; #endif // AC_AUTOTUNE_ENABLED diff --git a/libraries/AC_Avoidance/AC_Avoid.cpp b/libraries/AC_Avoidance/AC_Avoid.cpp index 8adc6d7c6d..6169ad161d 100644 --- a/libraries/AC_Avoidance/AC_Avoid.cpp +++ b/libraries/AC_Avoidance/AC_Avoid.cpp @@ -369,6 +369,19 @@ void AC_Avoid::adjust_speed(float kP, float accel, float heading, float &speed, } } +// adjust vertical climb rate so vehicle does not break the vertical fence +void AC_Avoid::adjust_velocity_z(float kP, float accel_cmss, float& climb_rate_cms, float dt) { + float backup_speed = 0.0f; + adjust_velocity_z(kP, accel_cmss, climb_rate_cms, backup_speed, dt); + if (!is_zero(backup_speed)) { + if (is_negative(backup_speed)) { + climb_rate_cms = MIN(climb_rate_cms, backup_speed); + } else { + climb_rate_cms = MAX(climb_rate_cms, backup_speed); + } + } +} + // adjust vertical climb rate so vehicle does not break the vertical fence void AC_Avoid::adjust_velocity_z(float kP, float accel_cmss, float& climb_rate_cms, float& backup_speed, float dt) { @@ -379,29 +392,36 @@ void AC_Avoid::adjust_velocity_z(float kP, float accel_cmss, float& climb_rate_c return; } - // do not adjust climb_rate if level or descending - if (climb_rate_cms <= 0.0f) { + // do not adjust climb_rate if level + if (is_zero(climb_rate_cms)) { return; } + const AP_AHRS &_ahrs = AP::ahrs(); // limit acceleration const float accel_cmss_limited = MIN(accel_cmss, AC_AVOID_ACCEL_CMSS_MAX); - bool limit_alt = false; - float alt_diff = 0.0f; // distance from altitude limit to vehicle in metres (positive means vehicle is below limit) - - const AP_AHRS &_ahrs = AP::ahrs(); - + bool limit_min_alt = false; + bool limit_max_alt = false; + float max_alt_diff = 0.0f; // distance from altitude limit to vehicle in metres (positive means vehicle is below limit) + float min_alt_diff = 0.0f; #if AP_FENCE_ENABLED // calculate distance below fence AC_Fence *fence = AP::fence(); - if ((_enabled & AC_AVOID_STOP_AT_FENCE) > 0 && fence && (fence->get_enabled_fences() & AC_FENCE_TYPE_ALT_MAX) > 0) { + if ((_enabled & AC_AVOID_STOP_AT_FENCE) > 0 && fence) { // calculate distance from vehicle to safe altitude float veh_alt; _ahrs.get_relative_position_D_home(veh_alt); - // _fence.get_safe_alt_max() is UP, veh_alt is DOWN: - alt_diff = fence->get_safe_alt_max() + veh_alt; - limit_alt = true; + if ((fence->get_enabled_fences() & AC_FENCE_TYPE_ALT_MIN) > 0) { + // fence.get_safe_alt_max() is UP, veh_alt is DOWN: + min_alt_diff = -(fence->get_safe_alt_min() + veh_alt); + limit_min_alt = true; + } + if ((fence->get_enabled_fences() & AC_FENCE_TYPE_ALT_MAX) > 0) { + // fence.get_safe_alt_max() is UP, veh_alt is DOWN: + max_alt_diff = fence->get_safe_alt_max() + veh_alt; + limit_max_alt = true; + } } #endif @@ -413,9 +433,9 @@ void AC_Avoid::adjust_velocity_z(float kP, float accel_cmss, float& climb_rate_c _ahrs.get_relative_position_D_origin(curr_alt)) { // alt_limit is UP, curr_alt is DOWN: const float ctrl_alt_diff = alt_limit + curr_alt; - if (!limit_alt || ctrl_alt_diff < alt_diff) { - alt_diff = ctrl_alt_diff; - limit_alt = true; + if (!limit_max_alt || ctrl_alt_diff < max_alt_diff) { + max_alt_diff = ctrl_alt_diff; + limit_max_alt = true; } } @@ -425,34 +445,52 @@ void AC_Avoid::adjust_velocity_z(float kP, float accel_cmss, float& climb_rate_c AP_Proximity *proximity = AP::proximity(); if (proximity && proximity_avoidance_enabled() && proximity->get_upward_distance(proximity_alt_diff)) { proximity_alt_diff -= _margin; - if (!limit_alt || proximity_alt_diff < alt_diff) { - alt_diff = proximity_alt_diff; - limit_alt = true; + if (!limit_max_alt || proximity_alt_diff < max_alt_diff) { + max_alt_diff = proximity_alt_diff; + limit_max_alt = true; } } #endif // limit climb rate - if (limit_alt) { + if (limit_max_alt || limit_min_alt) { + const float max_back_spd_cms = _backup_speed_z_max * 100.0; // do not allow climbing if we've breached the safe altitude - if (alt_diff <= 0.0f) { + if (max_alt_diff <= 0.0f && limit_max_alt) { climb_rate_cms = MIN(climb_rate_cms, 0.0f); // also calculate backup speed that will get us back to safe altitude - const float max_back_spd_cms = _backup_speed_z_max * 100.0; if (is_positive(max_back_spd_cms)) { - backup_speed = -1*(get_max_speed(kP, accel_cmss_limited, -alt_diff*100.0f, dt)); + backup_speed = -1*(get_max_speed(kP, accel_cmss_limited, -max_alt_diff*100.0f, dt)); // Constrain to max backup speed backup_speed = MAX(backup_speed, -max_back_spd_cms); } return; + // do not allow descending if we've breached the safe altitude + } else if (min_alt_diff <= 0.0f && limit_min_alt) { + climb_rate_cms = MAX(climb_rate_cms, 0.0f); + // also calculate backup speed that will get us back to safe altitude + if (is_positive(max_back_spd_cms)) { + backup_speed = get_max_speed(kP, accel_cmss_limited, -min_alt_diff*100.0f, dt); + + // Constrain to max backup speed + backup_speed = MIN(backup_speed, max_back_spd_cms); + } + return; } // limit climb rate - const float max_speed = get_max_speed(kP, accel_cmss_limited, alt_diff*100.0f, dt); - climb_rate_cms = MIN(max_speed, climb_rate_cms); + if (limit_max_alt) { + const float max_alt_max_speed = get_max_speed(kP, accel_cmss_limited, max_alt_diff*100.0f, dt); + climb_rate_cms = MIN(max_alt_max_speed, climb_rate_cms); + } + + if (limit_min_alt) { + const float max_alt_min_speed = get_max_speed(kP, accel_cmss_limited, min_alt_diff*100.0f, dt); + climb_rate_cms = MAX(-max_alt_min_speed, climb_rate_cms); + } } -# endif +#endif } // adjust roll-pitch to push vehicle away from objects diff --git a/libraries/AC_Avoidance/AC_Avoid.h b/libraries/AC_Avoidance/AC_Avoid.h index 2321d74989..aae55725ec 100644 --- a/libraries/AC_Avoidance/AC_Avoid.h +++ b/libraries/AC_Avoidance/AC_Avoid.h @@ -68,14 +68,7 @@ public: // adjust vertical climb rate so vehicle does not break the vertical fence void adjust_velocity_z(float kP, float accel_cmss, float& climb_rate_cms, float& backup_speed, float dt); - void adjust_velocity_z(float kP, float accel_cmss, float& climb_rate_cms, float dt) { - float backup_speed = 0.0f; - adjust_velocity_z(kP, accel_cmss, climb_rate_cms, backup_speed, dt); - if (!is_zero(backup_speed)) { - climb_rate_cms = MIN(climb_rate_cms, backup_speed); - } - } - + void adjust_velocity_z(float kP, float accel_cmss, float& climb_rate_cms, float dt); // adjust roll-pitch to push vehicle away from objects // roll and pitch value are in centi-degrees diff --git a/libraries/AC_CustomControl/README.md b/libraries/AC_CustomControl/README.md index 2d2d4a892d..771f3b4e83 100644 --- a/libraries/AC_CustomControl/README.md +++ b/libraries/AC_CustomControl/README.md @@ -217,6 +217,13 @@ default: return; } ``` +Add the following lines in the `AC_CustomControl_config.h` file. + +``` +#ifndef AP_CUSTOMCONTROL_XYZ_ENABLED +#define AP_CUSTOMCONTROL_XYZ_ENABLED AP_CUSTOMCONTROL_BACKEND_DEFAULT_ENABLED +#endif +``` 8. This is the bare minimum to compile and run your custom controller. You can add controller related code to `AC_CustomControl_XYZ` file without changing anything else. diff --git a/libraries/AC_Fence/AC_Fence.cpp b/libraries/AC_Fence/AC_Fence.cpp index 04a238196f..db214b2e49 100644 --- a/libraries/AC_Fence/AC_Fence.cpp +++ b/libraries/AC_Fence/AC_Fence.cpp @@ -36,26 +36,30 @@ extern const AP_HAL::HAL& hal; #if APM_BUILD_TYPE(APM_BUILD_ArduPlane) #define AC_FENCE_CIRCLE_RADIUS_BACKUP_DISTANCE 100.0 // after fence is broken we recreate the fence 100m further out +#define AC_FENCE_OPTIONS_DEFAULT OPTIONS::DISABLE_MODE_CHANGE #else #define AC_FENCE_CIRCLE_RADIUS_BACKUP_DISTANCE 20.0 // after fence is broken we recreate the fence 20m further out +#define AC_FENCE_OPTIONS_DEFAULT 0 #endif +//#define AC_FENCE_DEBUG const AP_Param::GroupInfo AC_Fence::var_info[] = { + // @Param: ENABLE // @DisplayName: Fence enable/disable - // @Description: Allows you to enable (1) or disable (0) the fence functionality + // @Description: Allows you to enable (1) or disable (0) the fence functionality. Fences can still be enabled and disabled via mavlink or an RC option, but these changes are not persisted. // @Values: 0:Disabled,1:Enabled // @User: Standard AP_GROUPINFO("ENABLE", 0, AC_Fence, _enabled, 0), // @Param: TYPE // @DisplayName: Fence Type - // @Description: Enabled fence types held as bitmask + // @Description: Configured fence types held as bitmask. Max altitide, Circle and Polygon fences will be immediately enabled if configured. Min altitude fence will only be enabled once the minimum altitude is reached. // @Bitmask{Rover}: 1:Circle Centered on Home,2:Inclusion/Exclusion Circles+Polygons // @Bitmask{Copter, Plane, Sub}: 0:Max altitude,1:Circle Centered on Home,2:Inclusion/Exclusion Circles+Polygons,3:Min altitude // @User: Standard - AP_GROUPINFO("TYPE", 1, AC_Fence, _enabled_fences, AC_FENCE_TYPE_DEFAULT), + AP_GROUPINFO("TYPE", 1, AC_Fence, _configured_fences, AC_FENCE_TYPE_DEFAULT), // @Param: ACTION // @DisplayName: Fence Action @@ -126,21 +130,21 @@ const AP_Param::GroupInfo AC_Fence::var_info[] = { // @User: Standard AP_GROUPINFO_FRAME("RET_ALT", 9, AC_Fence, _ret_altitude, 0.0f, AP_PARAM_FRAME_PLANE), - // @Param{Plane}: AUTOENABLE + // @Param{Plane, Copter}: AUTOENABLE // @DisplayName: Fence Auto-Enable - // @Description: Auto-enable of fences. AutoEnableOnTakeoff enables all configured fences after autotakeoffs reach altitude. During autolandings the fences will be disabled. AutoEnableDisableFloorOnLanding enables all configured fences after autotakeoffs reach altitude. During autolandings only the Minimum Altitude fence will be disabled. AutoEnableOnlyWhenArmed enables all configured fences, but no fences are disabled during autolandings. However, fence breaches are ignored while executing prior breach recovery actions which may include autolandings. - // @Values: 0:AutoEnableOff,1:AutoEnableOnTakeoff,2:AutoEnableDisableFloorOnLanding,3:AutoEnableOnlyWhenArmed + // @Description: Auto-enable of fences. AutoEnableOnTakeoff enables all configured fences, except the minimum altitude fence (which is enabled when the minimum altitude is reached), after autotakeoffs reach altitude. During autolandings the fences will be disabled. AutoEnableDisableFloorOnLanding enables all configured fences, except the minimum altitude fence (which is enabled when the minimum altitude is reached), after autotakeoffs reach altitude. During autolandings only the Minimum Altitude fence will be disabled. AutoEnableOnlyWhenArmed enables all configured fences on arming, except the minimum altitude fence (which is enabled when the minimum altitude is reached), but no fences are disabled during autolandings. However, fence breaches are ignored while executing prior breach recovery actions which may include autolandings. + // @Values{Plane, Copter}: 0:AutoEnableOff,1:AutoEnableOnTakeoff,2:AutoEnableDisableFloorOnLanding,3:AutoEnableOnlyWhenArmed // @Range: 0 3 // @Increment: 1 // @User: Standard - AP_GROUPINFO_FRAME("AUTOENABLE", 10, AC_Fence, _auto_enabled, static_cast(AutoEnable::ALWAYS_DISABLED), AP_PARAM_FRAME_PLANE), + AP_GROUPINFO_FRAME("AUTOENABLE", 10, AC_Fence, _auto_enabled, static_cast(AutoEnable::ALWAYS_DISABLED), AP_PARAM_FRAME_PLANE | AP_PARAM_FRAME_COPTER | AP_PARAM_FRAME_TRICOPTER | AP_PARAM_FRAME_HELI), - // @Param{Plane}: OPTIONS + // @Param{Plane, Copter}: OPTIONS // @DisplayName: Fence options - // @Description: 0:Disable mode change following fence action until fence breach is cleared. When bit 1 is set the allowable flight areas is the union of all polygon and circle fence areas instead of the intersection, which means a fence breach occurs only if you are outside all of the fence areas. + // @Description: When bit 0 is set sisable mode change following fence action until fence breach is cleared. When bit 1 is set the allowable flight areas is the union of all polygon and circle fence areas instead of the intersection, which means a fence breach occurs only if you are outside all of the fence areas. // @Bitmask: 0:Disable mode change following fence action until fence breach is cleared, 1:Allow union of inclusion areas // @User: Standard - AP_GROUPINFO_FRAME("OPTIONS", 11, AC_Fence, _options, static_cast(OPTIONS::DISABLE_MODE_CHANGE), AP_PARAM_FRAME_PLANE), + AP_GROUPINFO_FRAME("OPTIONS", 11, AC_Fence, _options, static_cast(AC_FENCE_OPTIONS_DEFAULT), AP_PARAM_FRAME_PLANE | AP_PARAM_FRAME_COPTER | AP_PARAM_FRAME_TRICOPTER | AP_PARAM_FRAME_HELI), AP_GROUPEND }; @@ -155,49 +159,167 @@ AC_Fence::AC_Fence() #endif _singleton = this; AP_Param::setup_object_defaults(this, var_info); + if (_enabled) { + _enabled_fences = _configured_fences.get() & ~AC_FENCE_TYPE_ALT_MIN; + } } -/// enable the Fence code generally; a master switch for all fences -void AC_Fence::enable(bool value) +// get a user-friendly list of fences +void AC_Fence::get_fence_names(uint8_t fences, ExpandingString& msg) { -#if HAL_LOGGING_ENABLED - if (_enabled && !value) { - AP::logger().Write_Event(LogEvent::FENCE_DISABLE); - } else if (!_enabled && value) { - AP::logger().Write_Event(LogEvent::FENCE_ENABLE); + if (!fences) { + return; + } + static const char* FENCE_NAMES[] = { + "Max Alt", + "Circle", + "Polygon", + "Min Alt", + }; + uint8_t i = 0; + uint8_t nfences = 0; + while (fences !=0) { + if (fences & 0x1) { + if (nfences > 0) { + if (!(fences & ~1U)) { + msg.printf(" and "); + } else { + msg.printf(", "); + } + } + msg.printf("%s", FENCE_NAMES[i]); + nfences++; + } + fences >>= 1; + i++; + } + msg.printf(" fence"); + if (nfences>1) { + msg.printf("s"); + } +} + +// print a message about the passed in fences +void AC_Fence::print_fence_message(const char* message, uint8_t fences) const +{ + if (!fences) { + return; + } + + char msg[MAVLINK_MSG_STATUSTEXT_FIELD_TEXT_LEN+1]; + ExpandingString e(msg, MAVLINK_MSG_STATUSTEXT_FIELD_TEXT_LEN+1); + AC_Fence::get_fence_names(fences, e); + GCS_SEND_TEXT(MAV_SEVERITY_NOTICE, "%s %s", e.get_writeable_string(), message); +} + +// should be called @10Hz to handle loading from eeprom +void AC_Fence::update() +{ + _poly_loader.update(); + // if someone changes the parameter we want to enable or disable everything + if (_enabled != _last_enabled || _auto_enabled != _last_auto_enabled) { + // reset the auto mask since we just reconfigured all of fencing + _auto_enable_mask = AC_FENCE_ALL_FENCES; + _last_enabled = _enabled; + _last_auto_enabled = _auto_enabled; + if (_enabled) { + _enabled_fences = _configured_fences.get() & ~AC_FENCE_TYPE_ALT_MIN; + } else { + _enabled_fences = 0; + } + } +#ifdef AC_FENCE_DEBUG + static uint32_t last_msg_count = 0; + if (get_enabled_fences() && last_msg_count++ % 10 == 0) { + print_fence_message("active", get_enabled_fences()); + print_fence_message("breached", get_breaches()); } #endif - _enabled.set(value); - if (!value) { - clear_breach(AC_FENCE_TYPE_ALT_MIN | AC_FENCE_TYPE_ALT_MAX | AC_FENCE_TYPE_CIRCLE | AC_FENCE_TYPE_POLYGON); - disable_floor(); +} + +// enable or disable configured fences present in fence_types +// also updates the bitmask of auto enabled fences if update_auto_mask is true +// returns a bitmask of fences that were changed +uint8_t AC_Fence::enable(bool value, uint8_t fence_types, bool update_auto_mask) +{ + uint8_t fences = _configured_fences.get() & fence_types; + uint8_t enabled_fences = _enabled_fences; + if (value) { + enabled_fences |= fences; } else { - enable_floor(); + enabled_fences &= ~fences; } + + // fences that were manually changed are no longer eligible for auto-enablement or disablement + if (update_auto_mask) { + _auto_enable_mask &= ~fences; + } + + uint8_t fences_to_change = _enabled_fences ^ enabled_fences; + + if (!fences_to_change) { + return 0; + } +#if HAL_LOGGING_ENABLED + AP::logger().Write_Event(value ? LogEvent::FENCE_ENABLE : LogEvent::FENCE_DISABLE); + if (fences_to_change & AC_FENCE_TYPE_ALT_MAX) { + AP::logger().Write_Event(value ? LogEvent::FENCE_ALT_MAX_ENABLE : LogEvent::FENCE_ALT_MAX_DISABLE); + } + if (fences_to_change & AC_FENCE_TYPE_CIRCLE) { + AP::logger().Write_Event(value ? LogEvent::FENCE_CIRCLE_ENABLE : LogEvent::FENCE_CIRCLE_DISABLE); + } + if (fences_to_change & AC_FENCE_TYPE_ALT_MIN) { + AP::logger().Write_Event(value ? LogEvent::FENCE_ALT_MIN_ENABLE : LogEvent::FENCE_ALT_MIN_DISABLE); + } + if (fences_to_change & AC_FENCE_TYPE_POLYGON) { + AP::logger().Write_Event(value ? LogEvent::FENCE_POLYGON_ENABLE : LogEvent::FENCE_POLYGON_DISABLE); + } +#endif + + _enabled_fences = enabled_fences; + + if (!value) { + clear_breach(fences_to_change); + } + + return fences_to_change; } /// enable/disable fence floor only void AC_Fence::enable_floor() { -#if HAL_LOGGING_ENABLED - if (!_floor_enabled) { - // Floor is currently disabled, enable it - AP::logger().Write_Event(LogEvent::FENCE_FLOOR_ENABLE); - } -#endif - _floor_enabled = true; + enable(true, AC_FENCE_TYPE_ALT_MIN); } void AC_Fence::disable_floor() { -#if HAL_LOGGING_ENABLED - if (_floor_enabled) { - // Floor is currently enabled, disable it - AP::logger().Write_Event(LogEvent::FENCE_FLOOR_DISABLE); + enable(false, AC_FENCE_TYPE_ALT_MIN); +} + +/* + called on arming +*/ +void AC_Fence::auto_enable_fence_on_arming(void) +{ + if (auto_enabled() != AC_Fence::AutoEnable::ONLY_WHEN_ARMED) { + return; } -#endif - _floor_enabled = false; - clear_breach(AC_FENCE_TYPE_ALT_MIN); + + const uint8_t fences = enable(true, _auto_enable_mask & ~AC_FENCE_TYPE_ALT_MIN, false); + print_fence_message("auto-enabled", fences); +} + +/* + called on disarming +*/ +void AC_Fence::auto_disable_fence_on_disarming(void) +{ + if (auto_enabled() != AC_Fence::AutoEnable::ONLY_WHEN_ARMED) { + return; + } + + const uint8_t fences = enable(false, _auto_enable_mask, false); + print_fence_message("auto-disabled", fences); } /* @@ -205,82 +327,63 @@ void AC_Fence::disable_floor() */ void AC_Fence::auto_enable_fence_after_takeoff(void) { - if (_enabled) { + if (auto_enabled() != AutoEnable::ENABLE_ON_AUTO_TAKEOFF && + auto_enabled() != AutoEnable::ENABLE_DISABLE_FLOOR_ONLY) { return; - } - switch(auto_enabled()) { - case AC_Fence::AutoEnable::ALWAYS_ENABLED: - case AC_Fence::AutoEnable::ENABLE_DISABLE_FLOOR_ONLY: - enable(true); - GCS_SEND_TEXT(MAV_SEVERITY_NOTICE, "Fence enabled (auto enabled)"); - break; - default: - // fence does not auto-enable in other takeoff conditions - break; } + + const uint8_t fences = enable(true, _auto_enable_mask, false); + print_fence_message("auto-enabled", fences); } -/* - called when performing an auto landing - */ -void AC_Fence::auto_disable_fence_for_landing(void) +// return fences that should be auto-disabled when requested +uint8_t AC_Fence::get_auto_disable_fences(void) const { + uint8_t auto_disable = 0; switch (auto_enabled()) { - case AC_Fence::AutoEnable::ALWAYS_ENABLED: - enable(false); - GCS_SEND_TEXT(MAV_SEVERITY_NOTICE, "Fence disabled (auto disable)"); + case AC_Fence::AutoEnable::ENABLE_ON_AUTO_TAKEOFF: + auto_disable = _auto_enable_mask; break; case AC_Fence::AutoEnable::ENABLE_DISABLE_FLOOR_ONLY: - disable_floor(); - GCS_SEND_TEXT(MAV_SEVERITY_NOTICE, "Fence floor disabled (auto disable)"); - break; - default: - // fence does not auto-disable in other landing conditions + case AC_Fence::AutoEnable::ONLY_WHEN_ARMED: + default: // when auto disable is not set we still need to disable the altmin fence on landing + auto_disable = _auto_enable_mask & AC_FENCE_TYPE_ALT_MIN; break; } + return auto_disable; } -bool AC_Fence::present() const +uint8_t AC_Fence::present() const { - const auto enabled_fences = _enabled_fences.get(); - // A fence is present if any of the conditions are true. - // * tin can (circle) is enabled - // * min or max alt is enabled - // * polygon fences are enabled and any fence has been uploaded - if (enabled_fences & AC_FENCE_TYPE_CIRCLE || - enabled_fences & AC_FENCE_TYPE_ALT_MIN || - enabled_fences & AC_FENCE_TYPE_ALT_MAX || - ((enabled_fences & AC_FENCE_TYPE_POLYGON) && _poly_loader.total_fence_count() > 0)) { - return true; + uint8_t mask = AC_FENCE_TYPE_CIRCLE | AC_FENCE_TYPE_ALT_MIN | AC_FENCE_TYPE_ALT_MAX; + if (_poly_loader.total_fence_count() > 0) { + mask |= AC_FENCE_TYPE_POLYGON; } - return false; + return _configured_fences.get() & mask; } /// get_enabled_fences - returns bitmask of enabled fences uint8_t AC_Fence::get_enabled_fences() const { - if (!_enabled && !_auto_enabled) { - return 0; - } - return _enabled_fences; + return _enabled_fences & present(); } // additional checks for the polygon fence: -bool AC_Fence::pre_arm_check_polygon(const char* &fail_msg) const +bool AC_Fence::pre_arm_check_polygon(char *failure_msg, const uint8_t failure_msg_len) const { - if (!(_enabled_fences & AC_FENCE_TYPE_POLYGON)) { + if (!(_configured_fences & AC_FENCE_TYPE_POLYGON)) { // not enabled; all good return true; } if (! _poly_loader.loaded()) { - fail_msg = "Fences invalid"; + hal.util->snprintf(failure_msg, failure_msg_len, "Polygon fence(s) invalid"); return false; } if (!_poly_loader.check_inclusion_circle_margin(_margin)) { - fail_msg = "Margin is less than inclusion circle radius"; + hal.util->snprintf(failure_msg, failure_msg_len, "Polygon fence margin is less than inclusion circle radius"); return false; } @@ -288,14 +391,14 @@ bool AC_Fence::pre_arm_check_polygon(const char* &fail_msg) const } // additional checks for the circle fence: -bool AC_Fence::pre_arm_check_circle(const char* &fail_msg) const +bool AC_Fence::pre_arm_check_circle(char *failure_msg, const uint8_t failure_msg_len) const { if (_circle_radius < 0) { - fail_msg = "Invalid FENCE_RADIUS value"; + hal.util->snprintf(failure_msg, failure_msg_len, "Invalid Circle FENCE_RADIUS value"); return false; } if (_circle_radius < _margin) { - fail_msg = "FENCE_MARGIN is less than FENCE_RADIUS"; + hal.util->snprintf(failure_msg, failure_msg_len, "Circle FENCE_MARGIN is less than FENCE_RADIUS"); return false; } @@ -303,15 +406,15 @@ bool AC_Fence::pre_arm_check_circle(const char* &fail_msg) const } // additional checks for the alt fence: -bool AC_Fence::pre_arm_check_alt(const char* &fail_msg) const +bool AC_Fence::pre_arm_check_alt(char *failure_msg, const uint8_t failure_msg_len) const { if (_alt_max < 0.0f) { - fail_msg = "Invalid FENCE_ALT_MAX value"; + hal.util->snprintf(failure_msg, failure_msg_len, "Invalid FENCE_ALT_MAX value"); return false; } if (_alt_min < -100.0f) { - fail_msg = "Invalid FENCE_ALT_MIN value"; + hal.util->snprintf(failure_msg, failure_msg_len, "Invalid FENCE_ALT_MIN value"); return false; } return true; @@ -319,63 +422,75 @@ bool AC_Fence::pre_arm_check_alt(const char* &fail_msg) const /// pre_arm_check - returns true if all pre-takeoff checks have completed successfully -bool AC_Fence::pre_arm_check(const char* &fail_msg) const +bool AC_Fence::pre_arm_check(char *failure_msg, const uint8_t failure_msg_len) const { - fail_msg = nullptr; - // if fences are enabled but none selected fail pre-arm check - if (enabled() && !present()) { - fail_msg = "Fences enabled, but none selected"; + if (_enabled && !present()) { + hal.util->snprintf(failure_msg, failure_msg_len, "Fences enabled, but none selected"); return false; } + + // if AUTOENABLE = 1 or 2 warn now, but fail in a later release + // PARAMETER_CONVERSION - Added: Jul-2024 for ArduPilot-4.6 + if (_auto_enabled == 1 || _auto_enabled == 2) { + static uint32_t last_autoenable_warn_ms; + const uint32_t now_ms = AP_HAL::millis(); + if (now_ms - last_autoenable_warn_ms > 60000) { + GCS_SEND_TEXT(MAV_SEVERITY_WARNING, "FENCE_AUTOENABLE is %u, will be removed in 4.7, use 3", unsigned(_auto_enabled)); + last_autoenable_warn_ms = now_ms; + } + } // if not enabled or not fence set-up always return true - if ((!_enabled && !_auto_enabled) || !_enabled_fences) { + if ((!enabled() && !_auto_enabled) || !_configured_fences) { return true; } // if we have horizontal limits enabled, check we can get a // relative position from the AHRS - if ((_enabled_fences & AC_FENCE_TYPE_CIRCLE) || - (_enabled_fences & AC_FENCE_TYPE_POLYGON)) { + if ((_configured_fences & AC_FENCE_TYPE_CIRCLE) || + (_configured_fences & AC_FENCE_TYPE_POLYGON)) { Vector2f position; if (!AP::ahrs().get_relative_position_NE_home(position)) { - fail_msg = "Fence requires position"; + hal.util->snprintf(failure_msg, failure_msg_len, "Fence requires position"); return false; } } - if (!pre_arm_check_polygon(fail_msg)) { + if (!pre_arm_check_polygon(failure_msg, failure_msg_len)) { return false; } - if (!pre_arm_check_circle(fail_msg)) { + if (!pre_arm_check_circle(failure_msg, failure_msg_len)) { return false; } - if (!pre_arm_check_alt(fail_msg)) { + if (!pre_arm_check_alt(failure_msg, failure_msg_len)) { return false; } // check no limits are currently breached if (_breached_fences) { - fail_msg = "vehicle outside fence"; + char msg[MAVLINK_MSG_STATUSTEXT_FIELD_TEXT_LEN+1]; + ExpandingString e(msg, MAVLINK_MSG_STATUSTEXT_FIELD_TEXT_LEN+1); + AC_Fence::get_fence_names(_breached_fences, e); + hal.util->snprintf(failure_msg, failure_msg_len, "Vehicle breaching %s", e.get_writeable_string()); return false; } // validate FENCE_MARGIN parameter range if (_margin < 0.0f) { - fail_msg = "Invalid FENCE_MARGIN value"; + hal.util->snprintf(failure_msg, failure_msg_len, "Invalid FENCE_MARGIN value"); return false; } if (_alt_max < _alt_min) { - fail_msg = "FENCE_ALT_MAX < FENCE_ALT_MIN"; + hal.util->snprintf(failure_msg, failure_msg_len, "FENCE_ALT_MAX < FENCE_ALT_MIN"); return false; } if (_alt_max - _alt_min <= 2.0f * _margin) { - fail_msg = "FENCE_MARGIN too big"; + hal.util->snprintf(failure_msg, failure_msg_len, "FENCE_MARGIN too big"); return false; } @@ -389,13 +504,14 @@ bool AC_Fence::pre_arm_check(const char* &fail_msg) const bool AC_Fence::check_fence_alt_max() { // altitude fence check - if (!(_enabled_fences & AC_FENCE_TYPE_ALT_MAX)) { + if (!(get_enabled_fences() & AC_FENCE_TYPE_ALT_MAX)) { // not enabled; no breach return false; } - AP::ahrs().get_relative_position_D_home(_curr_alt); - _curr_alt = -_curr_alt; // translate Down to Up + float alt; + AP::ahrs().get_relative_position_D_home(alt); + _curr_alt = -alt; // translate Down to Up // check if we are over the altitude fence if (_curr_alt >= _alt_max) { @@ -437,13 +553,14 @@ bool AC_Fence::check_fence_alt_max() bool AC_Fence::check_fence_alt_min() { // altitude fence check - if (!(_enabled_fences & AC_FENCE_TYPE_ALT_MIN)) { + if (!(get_enabled_fences() & AC_FENCE_TYPE_ALT_MIN)) { // not enabled; no breach return false; } - AP::ahrs().get_relative_position_D_home(_curr_alt); - _curr_alt = -_curr_alt; // translate Down to Up + float alt; + AP::ahrs().get_relative_position_D_home(alt); + _curr_alt = -alt; // translate Down to Up // check if we are under the altitude fence if (_curr_alt <= _alt_min) { @@ -479,15 +596,47 @@ bool AC_Fence::check_fence_alt_min() return false; } + +/// auto enable fence floor +bool AC_Fence::auto_enable_fence_floor() +{ + // altitude fence check + if (!(_configured_fences & AC_FENCE_TYPE_ALT_MIN) // not configured + || (get_enabled_fences() & AC_FENCE_TYPE_ALT_MIN) // already enabled + || !(_auto_enable_mask & AC_FENCE_TYPE_ALT_MIN) // has been manually disabled + || (!_enabled && (auto_enabled() == AC_Fence::AutoEnable::ALWAYS_DISABLED + || auto_enabled() == AutoEnable::ENABLE_ON_AUTO_TAKEOFF))) { + // not enabled + return false; + } + + float alt; + AP::ahrs().get_relative_position_D_home(alt); + _curr_alt = -alt; // translate Down to Up + + // check if we are over the altitude fence + if (!floor_enabled() && _curr_alt >= _alt_min + _margin) { + enable(true, AC_FENCE_TYPE_ALT_MIN, false); + GCS_SEND_TEXT(MAV_SEVERITY_NOTICE, "Min Alt fence enabled (auto enable)"); + return true; + } + + return false; +} + // check_fence_polygon - returns true if the poly fence is freshly // breached. That includes being inside exclusion zones and outside // inclusions zones bool AC_Fence::check_fence_polygon() { + if (!(get_enabled_fences() & AC_FENCE_TYPE_POLYGON)) { + // not enabled; no breach + clear_breach(AC_FENCE_TYPE_POLYGON); + return false; + } + const bool was_breached = _breached_fences & AC_FENCE_TYPE_POLYGON; - const bool breached = ((_enabled_fences & AC_FENCE_TYPE_POLYGON) && - _poly_loader.breached()); - if (breached) { + if (_poly_loader.breached()) { if (!was_breached) { record_breach(AC_FENCE_TYPE_POLYGON); return true; @@ -506,7 +655,7 @@ bool AC_Fence::check_fence_polygon() /// fence is breached. bool AC_Fence::check_fence_circle() { - if (!(_enabled_fences & AC_FENCE_TYPE_CIRCLE)) { + if (!(get_enabled_fences() & AC_FENCE_TYPE_CIRCLE)) { // not enabled; no breach return false; } @@ -549,19 +698,58 @@ bool AC_Fence::check_fence_circle() /// check - returns bitmask of fence types breached (if any) -uint8_t AC_Fence::check() +uint8_t AC_Fence::check(bool disable_auto_fences) { uint8_t ret = 0; + uint8_t disabled_fences = disable_auto_fences ? get_auto_disable_fences() : 0; + uint8_t fences_to_disable = disabled_fences & _enabled_fences; // clear any breach from a non-enabled fence - clear_breach(~_enabled_fences); + clear_breach(~_configured_fences); + // clear any breach from disabled fences + clear_breach(fences_to_disable); + + // report on any fences that were auto-disabled + if (fences_to_disable) { + print_fence_message("auto-disabled", fences_to_disable); + } // return immediately if disabled - if ((!_enabled && !_auto_enabled) || !_enabled_fences) { + if ((!enabled() && !_auto_enabled && !(_configured_fences & AC_FENCE_TYPE_ALT_MIN)) || !_configured_fences) { return 0; } + // disable the (temporarily) disabled fences + enable(false, disabled_fences, false); + + // maximum altitude fence check + if (!(disabled_fences & AC_FENCE_TYPE_ALT_MAX) && check_fence_alt_max()) { + ret |= AC_FENCE_TYPE_ALT_MAX; + } + + // minimum altitude fence check, do this before auto-disabling (e.g. because falling) + // so that any action can be taken + if (!(disabled_fences & AC_FENCE_TYPE_ALT_MIN) && check_fence_alt_min()) { + ret |= AC_FENCE_TYPE_ALT_MIN; + } + + // auto enable floor unless auto enable on auto takeoff has been set (which means other behaviour is required) + if (!(disabled_fences & AC_FENCE_TYPE_ALT_MIN)) { + auto_enable_fence_floor(); + } + + // circle fence check + if (!(disabled_fences & AC_FENCE_TYPE_CIRCLE) && check_fence_circle()) { + ret |= AC_FENCE_TYPE_CIRCLE; + } + + // polygon fence check + if (!(disabled_fences & AC_FENCE_TYPE_POLYGON) && check_fence_polygon()) { + ret |= AC_FENCE_TYPE_POLYGON; + } + // check if pilot is attempting to recover manually + // this is done last so that _breached_fences is correct if (_manual_recovery_start_ms != 0) { // we ignore any fence breaches during the manual recovery period which is about 10 seconds if ((AP_HAL::millis() - _manual_recovery_start_ms) < AC_FENCE_MANUAL_RECOVERY_TIME_MIN) { @@ -572,26 +760,6 @@ uint8_t AC_Fence::check() _manual_recovery_start_ms = 0; } - // maximum altitude fence check - if (check_fence_alt_max()) { - ret |= AC_FENCE_TYPE_ALT_MAX; - } - - // minimum altitude fence check - if (_floor_enabled && check_fence_alt_min()) { - ret |= AC_FENCE_TYPE_ALT_MIN; - } - - // circle fence check - if (check_fence_circle()) { - ret |= AC_FENCE_TYPE_CIRCLE; - } - - // polygon fence check - if (check_fence_polygon()) { - ret |= AC_FENCE_TYPE_POLYGON; - } - // return any new breaches that have occurred return ret; } @@ -695,6 +863,8 @@ void AC_Fence::manual_recovery_start() // record time pilot began manual recovery _manual_recovery_start_ms = AP_HAL::millis(); + + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Manual recovery started"); } // methods for mavlink SYS_STATUS message (send_sys_status) @@ -712,7 +882,7 @@ bool AC_Fence::sys_status_enabled() const return false; } // Fence is only enabled when the flag is enabled - return _enabled; + return enabled(); } bool AC_Fence::sys_status_failed() const @@ -742,22 +912,27 @@ const AP_Param::GroupInfo AC_Fence::var_info[] = { AP_GROUPEND }; AC_Fence::AC_Fence() {}; -void AC_Fence::enable(bool value) {}; +uint8_t AC_Fence::enable(bool value, uint8_t fence_types, bool update_auto_enable) { return 0; } -void AC_Fence::disable_floor() {}; +void AC_Fence::enable_floor() {} +void AC_Fence::disable_floor() {} +void AC_Fence::update() {} -void AC_Fence::auto_enable_fence_after_takeoff() {}; -void AC_Fence::auto_disable_fence_for_landing() {}; +void AC_Fence::auto_enable_fence_after_takeoff() {} +void AC_Fence::auto_enable_fence_on_arming() {} +void AC_Fence::auto_disable_fence_on_disarming() {} -bool AC_Fence::present() const { return false; } +uint8_t AC_Fence::present() const { return 0; } uint8_t AC_Fence::get_enabled_fences() const { return 0; } -bool AC_Fence::pre_arm_check(const char* &fail_msg) const { return true; } +bool AC_Fence::pre_arm_check(char *failure_msg, const uint8_t failure_msg_len) const { return true; } -uint8_t AC_Fence::check() { return 0; } +uint8_t AC_Fence::check(bool disable_auto_fences) { return 0; } bool AC_Fence::check_destination_within_fence(const Location& loc) { return true; } float AC_Fence::get_breach_distance(uint8_t fence_type) const { return 0.0; } +void AC_Fence::get_fence_names(uint8_t fences, ExpandingString& msg) { } +void AC_Fence::print_fence_message(const char* msg, uint8_t fences) const {} void AC_Fence::manual_recovery_start() {} diff --git a/libraries/AC_Fence/AC_Fence.h b/libraries/AC_Fence/AC_Fence.h index e8eb88943e..3165d7b73d 100644 --- a/libraries/AC_Fence/AC_Fence.h +++ b/libraries/AC_Fence/AC_Fence.h @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -15,6 +16,8 @@ #define AC_FENCE_TYPE_CIRCLE 2 // circular horizontal fence (usually initiates an RTL) #define AC_FENCE_TYPE_POLYGON 4 // polygon horizontal fence #define AC_FENCE_TYPE_ALT_MIN 8 // low alt fence which usually initiates an RTL +#define AC_FENCE_ARMING_FENCES (AC_FENCE_TYPE_ALT_MAX | AC_FENCE_TYPE_CIRCLE | AC_FENCE_TYPE_POLYGON) +#define AC_FENCE_ALL_FENCES (AC_FENCE_ARMING_FENCES | AC_FENCE_TYPE_ALT_MIN) // valid actions should a fence be breached #define AC_FENCE_ACTION_REPORT_ONLY 0 // report to GCS that boundary has been breached but take no further action @@ -34,12 +37,19 @@ class AC_Fence public: friend class AC_PolyFence_loader; - enum class AutoEnable + enum class AutoEnable : uint8_t { ALWAYS_DISABLED = 0, - ALWAYS_ENABLED = 1, - ENABLE_DISABLE_FLOOR_ONLY = 2, - ONLY_WHEN_ARMED = 3 + ENABLE_ON_AUTO_TAKEOFF = 1, // enable on auto takeoff + ENABLE_DISABLE_FLOOR_ONLY = 2, // enable on takeoff but disable floor on landing + ONLY_WHEN_ARMED = 3 // enable on arming + }; + + enum class MavlinkFenceActions : uint16_t + { + DISABLE_FENCE = 0, + ENABLE_FENCE = 1, + DISABLE_ALT_MIN_FENCE = 2 }; AC_Fence(); @@ -55,10 +65,15 @@ public: static AC_Fence *get_singleton() { return _singleton; } /// enable - allows fence to be enabled/disabled. - void enable(bool value); + /// returns a bitmask of fences that were changed + uint8_t enable(bool value, uint8_t fence_types, bool update_auto_mask = true); + + /// enable_configured - allows configured fences to be enabled/disabled. + /// returns a bitmask of fences that were changed + uint8_t enable_configured(bool value) { return enable(value, _configured_fences, true); } /// auto_enabled - automaticaly enable/disable fence depending of flight status - AutoEnable auto_enabled() { return static_cast(_auto_enabled.get()); } + AutoEnable auto_enabled() const { return static_cast(_auto_enabled.get()); } /// enable_floor - allows fence floor to be enabled/disabled. Note this does not update the eeprom saved value void enable_floor(); @@ -69,32 +84,39 @@ public: /// auto_enable_fence_on_takeoff - auto enables the fence. Called after takeoff conditions met void auto_enable_fence_after_takeoff(); - /// auto_disable_fence_for_landing - auto disables respective fence. Called prior to landing. - void auto_disable_fence_for_landing(); + /// auto_enable_fences_on_arming - auto enables all applicable fences on arming + void auto_enable_fence_on_arming(); - /// enabled - returns true if fence is enabled - bool enabled() const { return _enabled; } + /// auto_disable_fences_on_disarming - auto disables all applicable fences on disarming + void auto_disable_fence_on_disarming(); - /// present - returns true if fence is present - bool present() const; + uint8_t get_auto_disable_fences(void) const; + + /// auto_enable_fence_floor - auto enables fence floor once desired altitude has been reached. + bool auto_enable_fence_floor(); + + /// enabled - returns whether fencing is enabled or not + bool enabled() const { return _enabled_fences; } + + /// present - returns true if any of the provided types is present + uint8_t present() const; /// get_enabled_fences - returns bitmask of enabled fences uint8_t get_enabled_fences() const; // should be called @10Hz to handle loading from eeprom - void update() { - _poly_loader.update(); - } + void update(); /// pre_arm_check - returns true if all pre-takeoff checks have completed successfully - bool pre_arm_check(const char* &fail_msg) const; + bool pre_arm_check(char *failure_msg, const uint8_t failure_msg_len) const; /// /// methods to check we are within the boundaries and recover /// /// check - returns the fence type that has been breached (if any) - uint8_t check(); + /// disabled_fences can be used to disable fences for certain conditions (e.g. landing) + uint8_t check(bool disable_auto_fence = false); // returns true if the destination is within fence (used to reject waypoints outside the fence) bool check_destination_within_fence(const class Location& loc); @@ -133,6 +155,12 @@ public: /// get_return_rally - returns whether returning to fence return point or rally point float get_return_altitude() const { return _ret_altitude; } + /// get a user-friendly list of fences + static void get_fence_names(uint8_t fences, ExpandingString& msg); + + // print a message about the fences to the GCS + void print_fence_message(const char* msg, uint8_t fences) const; + /// manual_recovery_start - caller indicates that pilot is re-taking manual control so fence should be disabled for 10 seconds /// should be called whenever the pilot changes the flight mode /// has no effect if no breaches have occurred @@ -187,14 +215,19 @@ private: void clear_breach(uint8_t fence_type); // additional checks for the different fence types: - bool pre_arm_check_polygon(const char* &fail_msg) const; - bool pre_arm_check_circle(const char* &fail_msg) const; - bool pre_arm_check_alt(const char* &fail_msg) const; + bool pre_arm_check_polygon(char *failure_msg, const uint8_t failure_msg_len) const; + bool pre_arm_check_circle(char *failure_msg, const uint8_t failure_msg_len) const; + bool pre_arm_check_alt(char *failure_msg, const uint8_t failure_msg_len) const; + // fence floor is enabled + bool floor_enabled() const { return _enabled_fences & AC_FENCE_TYPE_ALT_MIN; } // parameters - AP_Int8 _enabled; // fence enable/disable control + uint8_t _enabled_fences; // fences that are currently enabled/disabled + bool _last_enabled; // value of enabled last time we checked + AP_Int8 _enabled; // overall feature control AP_Int8 _auto_enabled; // top level flag for auto enabling fence - AP_Int8 _enabled_fences; // bit mask holding which fences are enabled + uint8_t _last_auto_enabled; // value of auto_enabled last time we checked + AP_Int8 _configured_fences; // bit mask holding which fences are enabled AP_Int8 _action; // recovery action specified by user AP_Float _alt_max; // altitude upper limit in meters AP_Float _alt_min; // altitude lower limit in meters @@ -216,7 +249,7 @@ private: float _circle_breach_distance; // distance beyond the circular fence // other internal variables - bool _floor_enabled; // fence floor is enabled + uint8_t _auto_enable_mask = AC_FENCE_ALL_FENCES; // fences that can be auto-enabled or auto-disabled float _home_distance; // distance from home in meters (provided by main code) float _curr_alt; diff --git a/libraries/AC_Fence/AC_PolyFence_loader.cpp b/libraries/AC_Fence/AC_PolyFence_loader.cpp index 509e039a84..b97334476e 100644 --- a/libraries/AC_Fence/AC_PolyFence_loader.cpp +++ b/libraries/AC_Fence/AC_PolyFence_loader.cpp @@ -227,7 +227,7 @@ bool AC_PolyFence_loader::breached() const // returns true if location is outside the boundary bool AC_PolyFence_loader::breached(const Location& loc) const { - if (!loaded()) { + if (!loaded() || total_fence_count() == 0) { return false; } @@ -493,13 +493,15 @@ bool AC_PolyFence_loader::index_eeprom() if (!count_eeprom_fences()) { return false; } + + void_index(); + if (_eeprom_fence_count == 0) { + _num_fences = 0; _load_attempted = false; return true; } - void_index(); - Debug("Fence: Allocating %u bytes for index", (unsigned)(_eeprom_fence_count*sizeof(FenceIndex))); _index = NEW_NOTHROW FenceIndex[_eeprom_fence_count]; diff --git a/libraries/AC_PID/AC_P.h b/libraries/AC_PID/AC_P.h index e067e445de..9141750f14 100644 --- a/libraries/AC_PID/AC_P.h +++ b/libraries/AC_PID/AC_P.h @@ -53,13 +53,10 @@ public: /// @name parameter accessors //@{ - /// Overload the function call operator to permit relatively easy initialisation - void operator() (const float p) { _kp.set(p); } - // accessors AP_Float &kP() { return _kp; } const AP_Float &kP() const { return _kp; } - void kP(const float v) { _kp.set(v); } + void set_kP(const float v) { _kp.set(v); } static const struct AP_Param::GroupInfo var_info[]; diff --git a/libraries/AC_PID/AC_PID.cpp b/libraries/AC_PID/AC_PID.cpp index 3f6d22e562..132523d759 100644 --- a/libraries/AC_PID/AC_PID.cpp +++ b/libraries/AC_PID/AC_PID.cpp @@ -130,25 +130,25 @@ AC_PID::AC_PID(float initial_p, float initial_i, float initial_d, float initial_ } // filt_T_hz - set target filter hz -void AC_PID::filt_T_hz(float hz) +void AC_PID::set_filt_T_hz(float hz) { _filt_T_hz.set(fabsf(hz)); } // filt_E_hz - set error filter hz -void AC_PID::filt_E_hz(float hz) +void AC_PID::set_filt_E_hz(float hz) { _filt_E_hz.set(fabsf(hz)); } // filt_D_hz - set derivative filter hz -void AC_PID::filt_D_hz(float hz) +void AC_PID::set_filt_D_hz(float hz) { _filt_D_hz.set(fabsf(hz)); } // slew_limit - set slew limit -void AC_PID::slew_limit(float smax) +void AC_PID::set_slew_limit(float smax) { _slew_rate_max.set(fabsf(smax)); } @@ -201,34 +201,48 @@ float AC_PID::update_all(float target, float measurement, float dt, bool limit, _pid_info.reset = _flags._reset_filter; if (_flags._reset_filter) { _flags._reset_filter = false; + + // Reset target filter _target = target; - _error = _target - measurement; - _derivative = 0.0f; - _target_derivative = 0.0f; #if AP_FILTER_ENABLED if (_target_notch != nullptr) { _target_notch->reset(); _target = _target_notch->apply(_target); } +#endif + + // Calculate error and reset error filter + _error = _target - measurement; +#if AP_FILTER_ENABLED if (_error_notch != nullptr) { _error_notch->reset(); _error = _error_notch->apply(_error); } #endif + // Zero derivatives + _derivative = 0.0f; + _target_derivative = 0.0f; + } else { - float error_last = _error; - float target_last = _target; - float error = _target - measurement; + + // Apply target filters + const float target_last = _target; #if AP_FILTER_ENABLED // apply notch filters before FTLD/FLTE to avoid shot noise if (_target_notch != nullptr) { target = _target_notch->apply(target); } +#endif + _target += get_filt_T_alpha(dt) * (target - _target); + + // Calculate error and apply error filter + const float error_last = _error; + float error = _target - measurement; +#if AP_FILTER_ENABLED if (_error_notch != nullptr) { error = _error_notch->apply(error); } #endif - _target += get_filt_T_alpha(dt) * (target - _target); _error += get_filt_E_alpha(dt) * (error - _error); // calculate and filter derivative @@ -376,20 +390,6 @@ void AC_PID::save_gains() _filt_D_hz.save(); } -/// Overload the function call operator to permit easy initialisation -void AC_PID::operator()(float p_val, float i_val, float d_val, float ff_val, float imax_val, float input_filt_T_hz, float input_filt_E_hz, float input_filt_D_hz, float dff_val) -{ - _kp.set(p_val); - _ki.set(i_val); - _kd.set(d_val); - _kff.set(ff_val); - _kimax.set(fabsf(imax_val)); - _filt_T_hz.set(input_filt_T_hz); - _filt_E_hz.set(input_filt_E_hz); - _filt_D_hz.set(input_filt_D_hz); - _kdff.set(dff_val); -} - // get_filt_T_alpha - get the target filter alpha float AC_PID::get_filt_T_alpha(float dt) const { diff --git a/libraries/AC_PID/AC_PID.h b/libraries/AC_PID/AC_PID.h index fbbebcac7d..d11107cf30 100644 --- a/libraries/AC_PID/AC_PID.h +++ b/libraries/AC_PID/AC_PID.h @@ -92,9 +92,6 @@ public: // save gain to eeprom void save_gains(); - /// operator function call for easy initialisation - void operator()(float p_val, float i_val, float d_val, float ff_val, float imax_val, float input_filt_T_hz, float input_filt_E_hz, float input_filt_D_hz, float dff_val=0); - // get accessors const AP_Float &kP() const { return _kp; } AP_Float &kP() { return _kp; } @@ -117,17 +114,17 @@ public: float get_filt_D_alpha(float dt) const; // set accessors - void kP(const float v) { _kp.set(v); } - void kI(const float v) { _ki.set(v); } - void kD(const float v) { _kd.set(v); } - void ff(const float v) { _kff.set(v); } - void imax(const float v) { _kimax.set(fabsf(v)); } - void pdmax(const float v) { _kpdmax.set(fabsf(v)); } - void filt_T_hz(const float v); - void filt_E_hz(const float v); - void filt_D_hz(const float v); - void slew_limit(const float v); - void kDff(const float v) { _kdff.set(v); } + void set_kP(const float v) { _kp.set(v); } + void set_kI(const float v) { _ki.set(v); } + void set_kD(const float v) { _kd.set(v); } + void set_ff(const float v) { _kff.set(v); } + void set_imax(const float v) { _kimax.set(fabsf(v)); } + void set_pdmax(const float v) { _kpdmax.set(fabsf(v)); } + void set_filt_T_hz(const float v); + void set_filt_E_hz(const float v); + void set_filt_D_hz(const float v); + void set_slew_limit(const float v); + void set_kDff(const float v) { _kdff.set(v); } // set the desired and actual rates (for logging purposes) void set_target_rate(float target) { _pid_info.target = target; } diff --git a/libraries/AC_PID/AC_PID_2D.h b/libraries/AC_PID/AC_PID_2D.h index 8213997df1..129c07f2e9 100644 --- a/libraries/AC_PID/AC_PID_2D.h +++ b/libraries/AC_PID/AC_PID_2D.h @@ -59,13 +59,13 @@ public: float get_filt_D_alpha(float dt) const; // set accessors - void kP(float v) { _kp.set(v); } - void kI(float v) { _ki.set(v); } - void kD(float v) { _kd.set(v); } - void ff(float v) { _kff.set(v); } - void imax(float v) { _kimax.set(fabsf(v)); } - void filt_E_hz(float hz) { _filt_E_hz.set(fabsf(hz)); } - void filt_D_hz(float hz) { _filt_D_hz.set(fabsf(hz)); } + void set_kP(float v) { _kp.set(v); } + void set_kI(float v) { _ki.set(v); } + void set_kD(float v) { _kd.set(v); } + void set_ff(float v) { _kff.set(v); } + void set_imax(float v) { _kimax.set(fabsf(v)); } + void set_filt_E_hz(float hz) { _filt_E_hz.set(fabsf(hz)); } + void set_filt_D_hz(float hz) { _filt_D_hz.set(fabsf(hz)); } // integrator setting functions void set_integrator(const Vector2f& target, const Vector2f& measurement, const Vector2f& i); diff --git a/libraries/AC_PID/AC_PID_Basic.h b/libraries/AC_PID/AC_PID_Basic.h index c9342593fb..9d59a27f7a 100644 --- a/libraries/AC_PID/AC_PID_Basic.h +++ b/libraries/AC_PID/AC_PID_Basic.h @@ -54,13 +54,13 @@ public: float get_filt_D_alpha(float dt) const WARN_IF_UNUSED; // set accessors - void kP(float v) { _kp.set(v); } - void kI(float v) { _ki.set(v); } - void kD(float v) { _kd.set(v); } - void ff(float v) { _kff.set(v); } - void imax(float v) { _kimax.set(fabsf(v)); } - void filt_E_hz(float hz) { _filt_E_hz.set(fabsf(hz)); } - void filt_D_hz(float hz) { _filt_D_hz.set(fabsf(hz)); } + void set_kP(float v) { _kp.set(v); } + void set_kI(float v) { _ki.set(v); } + void set_kD(float v) { _kd.set(v); } + void set_ff(float v) { _kff.set(v); } + void set_imax(float v) { _kimax.set(fabsf(v)); } + void set_filt_E_hz(float hz) { _filt_E_hz.set(fabsf(hz)); } + void set_filt_D_hz(float hz) { _filt_D_hz.set(fabsf(hz)); } // integrator setting functions void set_integrator(float target, float measurement, float i); diff --git a/libraries/AC_PID/AC_PI_2D.cpp b/libraries/AC_PID/AC_PI_2D.cpp index e6c6362464..386982e6a6 100644 --- a/libraries/AC_PID/AC_PI_2D.cpp +++ b/libraries/AC_PID/AC_PI_2D.cpp @@ -151,18 +151,6 @@ void AC_PI_2D::save_gains() _filt_hz.save(); } -/// Overload the function call operator to permit easy initialisation -void AC_PI_2D::operator() (float p, float i, float imaxval, float input_filt_hz, float dt) -{ - _kp.set(p); - _ki.set(i); - _imax.set(fabsf(imaxval)); - _filt_hz.set(input_filt_hz); - _dt = dt; - // calculate the input filter alpha - calc_filt_alpha(); -} - // calc_filt_alpha - recalculate the input filter alpha void AC_PI_2D::calc_filt_alpha() { diff --git a/libraries/AC_PID/AC_PI_2D.h b/libraries/AC_PID/AC_PI_2D.h index c031104531..f70d766fd7 100644 --- a/libraries/AC_PID/AC_PI_2D.h +++ b/libraries/AC_PID/AC_PI_2D.h @@ -47,9 +47,6 @@ public: // save gain to eeprom void save_gains(); - /// operator function call for easy initialisation - void operator() (float p, float i, float imaxval, float input_filt_hz, float dt); - // get accessors AP_Float &kP() { return _kp; } AP_Float &kI() { return _ki; } diff --git a/libraries/AC_PID/AC_P_1D.h b/libraries/AC_PID/AC_P_1D.h index 482e5ca27a..ea040016d7 100644 --- a/libraries/AC_PID/AC_P_1D.h +++ b/libraries/AC_PID/AC_P_1D.h @@ -42,7 +42,7 @@ public: float get_error() const { return _error; } // set accessors - void kP(float v) { _kp.set(v); } + void set_kP(float v) { _kp.set(v); } // parameter var table static const struct AP_Param::GroupInfo var_info[]; diff --git a/libraries/AC_PID/AC_P_2D.h b/libraries/AC_PID/AC_P_2D.h index 8d1afc6798..c89699bbe4 100644 --- a/libraries/AC_PID/AC_P_2D.h +++ b/libraries/AC_PID/AC_P_2D.h @@ -44,7 +44,7 @@ public: const Vector2f& get_error() const { return _error; } // set accessors - void kP(float v) { _kp.set(v); } + void set_kP(float v) { _kp.set(v); } // parameter var table static const struct AP_Param::GroupInfo var_info[]; diff --git a/libraries/AC_Sprayer/AC_Sprayer.cpp b/libraries/AC_Sprayer/AC_Sprayer.cpp index c6b026eb56..5b903fac63 100644 --- a/libraries/AC_Sprayer/AC_Sprayer.cpp +++ b/libraries/AC_Sprayer/AC_Sprayer.cpp @@ -1,7 +1,8 @@ -#include "AC_Sprayer.h" +#include "AC_Sprayer_config.h" #if HAL_SPRAYER_ENABLED +#include "AC_Sprayer.h" #include #include #include diff --git a/libraries/AC_Sprayer/AC_Sprayer.h b/libraries/AC_Sprayer/AC_Sprayer.h index 240e354d22..e4f0ba425a 100644 --- a/libraries/AC_Sprayer/AC_Sprayer.h +++ b/libraries/AC_Sprayer/AC_Sprayer.h @@ -14,6 +14,10 @@ **/ #pragma once +#include "AC_Sprayer_config.h" + +#if HAL_SPRAYER_ENABLED + #include #include #include @@ -25,12 +29,6 @@ #define AC_SPRAYER_DEFAULT_TURN_ON_DELAY 100 ///< delay between when we reach the minimum speed and we begin spraying. This reduces the likelihood of constantly turning on/off the pump #define AC_SPRAYER_DEFAULT_SHUT_OFF_DELAY 1000 ///< shut-off delay in milli seconds. This reduces the likelihood of constantly turning on/off the pump -#ifndef HAL_SPRAYER_ENABLED -#define HAL_SPRAYER_ENABLED 1 -#endif - -#if HAL_SPRAYER_ENABLED - /// @class AC_Sprayer /// @brief Object managing a crop sprayer comprised of a spinner and a pump both controlled by pwm class AC_Sprayer { diff --git a/libraries/AC_Sprayer/AC_Sprayer_config.h b/libraries/AC_Sprayer/AC_Sprayer_config.h new file mode 100644 index 0000000000..4bb39f35fd --- /dev/null +++ b/libraries/AC_Sprayer/AC_Sprayer_config.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +#ifndef HAL_SPRAYER_ENABLED +#define HAL_SPRAYER_ENABLED 1 +#endif diff --git a/libraries/AC_WPNav/AC_Loiter.h b/libraries/AC_WPNav/AC_Loiter.h index 02e8085877..81bc70dc80 100644 --- a/libraries/AC_WPNav/AC_Loiter.h +++ b/libraries/AC_WPNav/AC_Loiter.h @@ -33,7 +33,9 @@ public: Vector2f get_pilot_desired_acceleration() const { return Vector2f{_desired_accel.x, _desired_accel.y}; } /// clear pilot desired acceleration - void clear_pilot_desired_acceleration() { _desired_accel.zero(); } + void clear_pilot_desired_acceleration() { + set_pilot_desired_acceleration(0, 0); + } /// get vector to stopping point based on a horizontal position and velocity void get_stopping_point_xy(Vector2f& stopping_point) const; diff --git a/libraries/AP_AHRS/AP_AHRS.cpp b/libraries/AP_AHRS/AP_AHRS.cpp index 8b7c1faa0c..c87382d5d3 100644 --- a/libraries/AP_AHRS/AP_AHRS.cpp +++ b/libraries/AP_AHRS/AP_AHRS.cpp @@ -591,8 +591,8 @@ void AP_AHRS::update_EKF2(void) // Use the primary EKF to select the primary gyro const AP_InertialSensor &_ins = AP::ins(); const int8_t primary_imu = EKF2.getPrimaryCoreIMUIndex(); - const uint8_t primary_gyro = primary_imu>=0?primary_imu:_ins.get_primary_gyro(); - const uint8_t primary_accel = primary_imu>=0?primary_imu:_ins.get_primary_accel(); + const uint8_t primary_gyro = primary_imu>=0?primary_imu:_ins.get_first_usable_gyro(); + const uint8_t primary_accel = primary_imu>=0?primary_imu:_ins.get_first_usable_accel(); // get gyro bias for primary EKF and change sign to give gyro drift // Note sign convention used by EKF is bias = measurement - truth @@ -660,8 +660,8 @@ void AP_AHRS::update_EKF3(void) // Use the primary EKF to select the primary gyro const int8_t primary_imu = EKF3.getPrimaryCoreIMUIndex(); - const uint8_t primary_gyro = primary_imu>=0?primary_imu:_ins.get_primary_gyro(); - const uint8_t primary_accel = primary_imu>=0?primary_imu:_ins.get_primary_accel(); + const uint8_t primary_gyro = primary_imu>=0?primary_imu:_ins.get_first_usable_gyro(); + const uint8_t primary_accel = primary_imu>=0?primary_imu:_ins.get_first_usable_accel(); // get gyro bias for primary EKF and change sign to give gyro drift // Note sign convention used by EKF is bias = measurement - truth @@ -3215,7 +3215,7 @@ uint8_t AP_AHRS::_get_primary_IMU_index() const #endif } if (imu == -1) { - imu = AP::ins().get_primary_gyro(); + imu = AP::ins().get_first_usable_gyro(); } return imu; } diff --git a/libraries/AP_AHRS/AP_AHRS_Backend.h b/libraries/AP_AHRS/AP_AHRS_Backend.h index ae71df9c0a..c309084b48 100644 --- a/libraries/AP_AHRS/AP_AHRS_Backend.h +++ b/libraries/AP_AHRS/AP_AHRS_Backend.h @@ -77,7 +77,7 @@ public: // get the index of the current primary accelerometer sensor virtual uint8_t get_primary_accel_index(void) const { #if AP_INERTIALSENSOR_ENABLED - return AP::ins().get_primary_accel(); + return AP::ins().get_first_usable_accel(); #else return 0; #endif @@ -86,7 +86,7 @@ public: // get the index of the current primary gyro sensor virtual uint8_t get_primary_gyro_index(void) const { #if AP_INERTIALSENSOR_ENABLED - return AP::ins().get_primary_gyro(); + return AP::ins().get_first_usable_gyro(); #else return 0; #endif diff --git a/libraries/AP_AdvancedFailsafe/AP_AdvancedFailsafe.cpp b/libraries/AP_AdvancedFailsafe/AP_AdvancedFailsafe.cpp index 2c71ba0158..b3dae75667 100644 --- a/libraries/AP_AdvancedFailsafe/AP_AdvancedFailsafe.cpp +++ b/libraries/AP_AdvancedFailsafe/AP_AdvancedFailsafe.cpp @@ -195,7 +195,7 @@ AP_AdvancedFailsafe::check(uint32_t last_valid_rc_ms) const AC_Fence *ap_fence = AP::fence(); if ((ap_fence != nullptr && ap_fence->get_breaches() != 0) || check_altlimit()) { if (!_terminate) { - gcs().send_text(MAV_SEVERITY_CRITICAL, "Terminating due to fence breach"); + GCS_SEND_TEXT(MAV_SEVERITY_CRITICAL, "Terminating due to fence breach"); _terminate.set_and_notify(1); } } @@ -213,7 +213,7 @@ AP_AdvancedFailsafe::check(uint32_t last_valid_rc_ms) (mode == AFS_MANUAL || mode == AFS_STABILIZED || !_rc_term_manual_only) && _rc_fail_time_seconds > 0 && (AP_HAL::millis() - last_valid_rc_ms) > (_rc_fail_time_seconds * 1000.0f)) { - gcs().send_text(MAV_SEVERITY_CRITICAL, "Terminating due to RC failure"); + GCS_SEND_TEXT(MAV_SEVERITY_CRITICAL, "Terminating due to RC failure"); _terminate.set_and_notify(1); } @@ -241,7 +241,7 @@ AP_AdvancedFailsafe::check(uint32_t last_valid_rc_ms) // we startup in preflight mode. This mode ends when // we first enter auto. if (mode == AFS_AUTO) { - gcs().send_text(MAV_SEVERITY_DEBUG, "AFS State: AFS_AUTO"); + GCS_SEND_TEXT(MAV_SEVERITY_DEBUG, "AFS State: AFS_AUTO"); _state = STATE_AUTO; } break; @@ -249,7 +249,7 @@ AP_AdvancedFailsafe::check(uint32_t last_valid_rc_ms) case STATE_AUTO: // this is the normal mode. if (!gcs_link_ok) { - gcs().send_text(MAV_SEVERITY_DEBUG, "AFS State: DATA_LINK_LOSS"); + GCS_SEND_TEXT(MAV_SEVERITY_DEBUG, "AFS State: DATA_LINK_LOSS"); _state = STATE_DATA_LINK_LOSS; if (_wp_comms_hold) { _saved_wp = mission.get_current_nav_cmd().index; @@ -266,7 +266,7 @@ AP_AdvancedFailsafe::check(uint32_t last_valid_rc_ms) break; } if (!gps_lock_ok) { - gcs().send_text(MAV_SEVERITY_DEBUG, "AFS State: GPS_LOSS"); + GCS_SEND_TEXT(MAV_SEVERITY_DEBUG, "AFS State: GPS_LOSS"); _state = STATE_GPS_LOSS; if (_wp_gps_loss) { _saved_wp = mission.get_current_nav_cmd().index; @@ -287,13 +287,13 @@ AP_AdvancedFailsafe::check(uint32_t last_valid_rc_ms) // leads to termination if AFS_DUAL_LOSS is 1 if(_enable_dual_loss) { if (!_terminate) { - gcs().send_text(MAV_SEVERITY_CRITICAL, "Terminating due to dual loss"); + GCS_SEND_TEXT(MAV_SEVERITY_CRITICAL, "Terminating due to dual loss"); _terminate.set_and_notify(1); } } } else if (gcs_link_ok) { _state = STATE_AUTO; - gcs().send_text(MAV_SEVERITY_DEBUG, "AFS State: AFS_AUTO, GCS now OK"); + GCS_SEND_TEXT(MAV_SEVERITY_DEBUG, "AFS State: AFS_AUTO, GCS now OK"); if (option_is_set(Option::CONTINUE_AFTER_RECOVERED)) { break; @@ -314,11 +314,11 @@ AP_AdvancedFailsafe::check(uint32_t last_valid_rc_ms) // losing GCS link when GPS lock lost // leads to termination if AFS_DUAL_LOSS is 1 if (!_terminate && _enable_dual_loss) { - gcs().send_text(MAV_SEVERITY_CRITICAL, "Terminating due to dual loss"); + GCS_SEND_TEXT(MAV_SEVERITY_CRITICAL, "Terminating due to dual loss"); _terminate.set_and_notify(1); } } else if (gps_lock_ok) { - gcs().send_text(MAV_SEVERITY_DEBUG, "AFS State: AFS_AUTO, GPS now OK"); + GCS_SEND_TEXT(MAV_SEVERITY_DEBUG, "AFS State: AFS_AUTO, GPS now OK"); _state = STATE_AUTO; // we only return to the mission if we have not exceeded AFS_MAX_GPS_LOSS if (_saved_wp != 0 && @@ -428,7 +428,7 @@ bool AP_AdvancedFailsafe::should_crash_vehicle(void) // returns true if AFS is in the desired termination state bool AP_AdvancedFailsafe::gcs_terminate(bool should_terminate, const char *reason) { if (!_enable) { - gcs().send_text(MAV_SEVERITY_INFO, "AFS not enabled, can't terminate the vehicle"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AFS not enabled, can't terminate the vehicle"); return false; } @@ -439,13 +439,13 @@ bool AP_AdvancedFailsafe::gcs_terminate(bool should_terminate, const char *reaso if(should_terminate == is_terminating) { if (is_terminating) { - gcs().send_text(MAV_SEVERITY_INFO, "Terminating due to %s", reason); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Terminating due to %s", reason); } else { - gcs().send_text(MAV_SEVERITY_INFO, "Aborting termination due to %s", reason); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Aborting termination due to %s", reason); } return true; } else if (should_terminate && _terminate_action != TERMINATE_ACTION_TERMINATE) { - gcs().send_text(MAV_SEVERITY_INFO, "Unable to terminate, termination is not configured"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Unable to terminate, termination is not configured"); } return false; } @@ -482,7 +482,7 @@ void AP_AdvancedFailsafe::max_range_update(void) if (distance_km > _max_range_km) { uint32_t now = AP_HAL::millis(); if (now - _term_range_notice_ms > 5000) { - gcs().send_text(MAV_SEVERITY_CRITICAL, "Terminating due to range %.1fkm", distance_km); + GCS_SEND_TEXT(MAV_SEVERITY_CRITICAL, "Terminating due to range %.1fkm", distance_km); _term_range_notice_ms = now; } _terminate.set_and_notify(1); diff --git a/libraries/AP_Airspeed/AP_Airspeed_Params.cpp b/libraries/AP_Airspeed/AP_Airspeed_Params.cpp index 77b80098e4..76883a73ca 100644 --- a/libraries/AP_Airspeed/AP_Airspeed_Params.cpp +++ b/libraries/AP_Airspeed/AP_Airspeed_Params.cpp @@ -75,7 +75,8 @@ const AP_Param::GroupInfo AP_Airspeed_Params::var_info[] = { // @Param: PIN // @DisplayName: Airspeed pin - // @Description: The pin number that the airspeed sensor is connected to for analog sensors. Set to 15 on the Pixhawk for the analog airspeed port. + // @Description: The pin number that the airspeed sensor is connected to for analog sensors. Values for some autopilots are given as examples. Search wiki for "Analog pins". + // @Values: -1:Disabled, 2:Pixhawk/Pixracer/Navio2/Pixhawk2_PM1, 5:Navigator, 13:Pixhawk2_PM2/CubeOrange_PM2, 14:CubeOrange, 16:Durandal, 100:PX4-v1 // @User: Advanced AP_GROUPINFO("PIN", 5, AP_Airspeed_Params, pin, 0), #endif // HAL_BUILD_AP_PERIPH diff --git a/libraries/AP_Arming/AP_Arming.cpp b/libraries/AP_Arming/AP_Arming.cpp index dabe449715..41ec47659d 100644 --- a/libraries/AP_Arming/AP_Arming.cpp +++ b/libraries/AP_Arming/AP_Arming.cpp @@ -603,7 +603,7 @@ bool AP_Arming::gps_checks(bool report) // Any failure messages from GPS backends char failure_msg[50] = {}; - if (!AP::gps().backends_healthy(failure_msg, ARRAY_SIZE(failure_msg))) { + if (!AP::gps().pre_arm_checks(failure_msg, ARRAY_SIZE(failure_msg))) { if (failure_msg[0] != '\0') { check_failed(ARMING_CHECK_GPS, report, "%s", failure_msg); } @@ -916,6 +916,7 @@ bool AP_Arming::mission_checks(bool report) bool AP_Arming::rangefinder_checks(bool report) { +#if AP_RANGEFINDER_ENABLED if (check_enabled(ARMING_CHECK_RANGEFINDER)) { RangeFinder *range = RangeFinder::get_singleton(); if (range == nullptr) { @@ -928,6 +929,7 @@ bool AP_Arming::rangefinder_checks(bool report) return false; } } +#endif return true; } @@ -1278,16 +1280,12 @@ bool AP_Arming::fence_checks(bool display_failure) } // check fence is ready - const char *fail_msg = nullptr; - if (fence->pre_arm_check(fail_msg)) { + char fail_msg[MAVLINK_MSG_STATUSTEXT_FIELD_TEXT_LEN+1]; + if (fence->pre_arm_check(fail_msg, ARRAY_SIZE(fail_msg))) { return true; } - if (fail_msg == nullptr) { - check_failed(display_failure, "Check fence"); - } else { - check_failed(display_failure, "%s", fail_msg); - } + check_failed(display_failure, "%s", fail_msg); #if AP_SDCARD_STORAGE_ENABLED if (fence->failed_sdcard_storage() || StorageManager::storage_failed()) { @@ -1795,11 +1793,7 @@ bool AP_Arming::arm(AP_Arming::Method method, const bool do_arming_checks) if (armed) { auto *fence = AP::fence(); if (fence != nullptr) { - // If a fence is set to auto-enable, turn on the fence - if (fence->auto_enabled() == AC_Fence::AutoEnable::ONLY_WHEN_ARMED) { - fence->enable(true); - GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Fence: auto-enabled"); - } + fence->auto_enable_fence_on_arming(); } } #endif @@ -1842,9 +1836,7 @@ bool AP_Arming::disarm(const AP_Arming::Method method, bool do_disarm_checks) #if AP_FENCE_ENABLED AC_Fence *fence = AP::fence(); if (fence != nullptr) { - if(fence->auto_enabled() == AC_Fence::AutoEnable::ONLY_WHEN_ARMED) { - fence->enable(false); - } + fence->auto_disable_fence_on_disarming(); } #endif #if defined(HAL_ARM_GPIO_PIN) diff --git a/libraries/AP_Arming/AP_Arming.h b/libraries/AP_Arming/AP_Arming.h index be59921be1..69e693835b 100644 --- a/libraries/AP_Arming/AP_Arming.h +++ b/libraries/AP_Arming/AP_Arming.h @@ -96,6 +96,7 @@ public: // these functions should not be used by Copter which holds the armed state in the motors library Required arming_required() const; virtual bool arm(AP_Arming::Method method, bool do_arming_checks=true); + virtual bool arm_force(AP_Arming::Method method) { return arm(method, false); } virtual bool disarm(AP_Arming::Method method, bool do_disarm_checks=true); bool is_armed() const; bool is_armed_and_safety_off() const; diff --git a/libraries/AP_BLHeli/AP_BLHeli.cpp b/libraries/AP_BLHeli/AP_BLHeli.cpp index d5463af8c7..f0deec1410 100644 --- a/libraries/AP_BLHeli/AP_BLHeli.cpp +++ b/libraries/AP_BLHeli/AP_BLHeli.cpp @@ -400,13 +400,17 @@ void AP_BLHeli::msp_process_command(void) msp_send_reply(msp.cmdMSP, (const uint8_t *)UDID_START, 12); break; + // a literal "4" is used for the PWMType here to allow Rover + // to use the same number for the same protocol. At time of + // writing the AP_MotorsUGV::PWMType has not been unified with + // AP_Motors::PWMType. case MSP_ADVANCED_CONFIG: { debug("MSP_ADVANCED_CONFIG"); uint8_t buf[10]; buf[0] = 1; // gyro sync denom buf[1] = 4; // pid process denom buf[2] = 0; // use unsynced pwm - buf[3] = (uint8_t)PWM_TYPE_DSHOT150; // motor PWM protocol + buf[3] = 4; // (uint8_t)AP_Motors::PWMType::DSHOT150; putU16(&buf[4], 480); // motor PWM Rate putU16(&buf[6], 450); // idle offset value buf[8] = 0; // use 32kHz diff --git a/libraries/AP_Baro/AP_Baro.cpp b/libraries/AP_Baro/AP_Baro.cpp index 9c6c68f5a3..1f4c397718 100644 --- a/libraries/AP_Baro/AP_Baro.cpp +++ b/libraries/AP_Baro/AP_Baro.cpp @@ -260,12 +260,6 @@ const AP_Param::GroupInfo AP_Baro::var_info[] = { // singleton instance AP_Baro *AP_Baro::_singleton; -#if HAL_GCS_ENABLED -#define BARO_SEND_TEXT(severity, format, args...) gcs().send_text(severity, format, ##args) -#else -#define BARO_SEND_TEXT(severity, format, args...) -#endif - /* AP_Baro constructor */ @@ -288,7 +282,7 @@ void AP_Baro::calibrate(bool save) } if (hal.util->was_watchdog_reset()) { - BARO_SEND_TEXT(MAV_SEVERITY_INFO, "Baro: skipping calibration after WDG reset"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Baro: skipping calibration after WDG reset"); return; } @@ -300,12 +294,12 @@ void AP_Baro::calibrate(bool save) #ifdef HAL_BARO_ALLOW_INIT_NO_BARO if (_num_drivers == 0 || _num_sensors == 0 || drivers[0] == nullptr) { - BARO_SEND_TEXT(MAV_SEVERITY_INFO, "Baro: no sensors found, skipping calibration"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Baro: no sensors found, skipping calibration"); return; } #endif - BARO_SEND_TEXT(MAV_SEVERITY_INFO, "Calibrating barometer"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Calibrating barometer"); // reset the altitude offset when we calibrate. The altitude // offset is supposed to be for within a flight @@ -364,7 +358,7 @@ void AP_Baro::calibrate(bool save) uint8_t num_calibrated = 0; for (uint8_t i=0; i<_num_sensors; i++) { if (sensors[i].calibrated) { - BARO_SEND_TEXT(MAV_SEVERITY_INFO, "Barometer %u calibration complete", i+1); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Barometer %u calibration complete", i+1); num_calibrated++; } } @@ -980,7 +974,7 @@ void AP_Baro::update_field_elevation(void) } else { _field_elevation.set(_field_elevation_active); _field_elevation.notify(); - BARO_SEND_TEXT(MAV_SEVERITY_ALERT, "Failed to Set Field Elevation: Armed"); + GCS_SEND_TEXT(MAV_SEVERITY_ALERT, "Failed to Set Field Elevation: Armed"); } } } @@ -988,7 +982,7 @@ void AP_Baro::update_field_elevation(void) _field_elevation_last_ms = now_ms; AP::ahrs().resetHeightDatum(); update_calibration(); - BARO_SEND_TEXT(MAV_SEVERITY_INFO, "Field Elevation Set: %.0fm", _field_elevation_active); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Field Elevation Set: %.0fm", _field_elevation_active); } #endif } diff --git a/libraries/AP_Baro/AP_Baro.h b/libraries/AP_Baro/AP_Baro.h index 3f990826ef..506e260dd3 100644 --- a/libraries/AP_Baro/AP_Baro.h +++ b/libraries/AP_Baro/AP_Baro.h @@ -118,8 +118,10 @@ public: // EAS2TAS for SITL static float get_EAS2TAS_for_alt_amsl(float alt_amsl); +#if AP_BARO_1976_STANDARD_ATMOSPHERE_ENABLED // lookup expected pressure for a given altitude. Used for SITL backend static void get_pressure_temperature_for_alt_amsl(float alt_amsl, float &pressure, float &temperature_K); +#endif // lookup expected temperature in degrees C for a given altitude. Used for SITL backend static float get_temperatureC_for_alt_amsl(const float alt_amsl); diff --git a/libraries/AP_Baro/AP_Baro_ICP101XX.cpp b/libraries/AP_Baro/AP_Baro_ICP101XX.cpp index 706196f396..487214ccb3 100644 --- a/libraries/AP_Baro/AP_Baro_ICP101XX.cpp +++ b/libraries/AP_Baro/AP_Baro_ICP101XX.cpp @@ -109,7 +109,7 @@ bool AP_Baro_ICP101XX::init() dev->get_semaphore()->give(); - dev->register_periodic_callback(measure_interval/2, FUNCTOR_BIND_MEMBER(&AP_Baro_ICP101XX::timer, void)); + dev->register_periodic_callback(measure_interval, FUNCTOR_BIND_MEMBER(&AP_Baro_ICP101XX::timer, void)); return true; @@ -312,4 +312,4 @@ void AP_Baro_ICP101XX::update() } } -#endif // AP_BARO_ICP101XX_ENABLED \ No newline at end of file +#endif // AP_BARO_ICP101XX_ENABLED diff --git a/libraries/AP_Baro/AP_Baro_SPL06.cpp b/libraries/AP_Baro/AP_Baro_SPL06.cpp index 655e40ee4c..19bfdf336c 100644 --- a/libraries/AP_Baro/AP_Baro_SPL06.cpp +++ b/libraries/AP_Baro/AP_Baro_SPL06.cpp @@ -17,6 +17,7 @@ #if AP_BARO_SPL06_ENABLED #include +#include #include extern const AP_HAL::HAL &hal; diff --git a/libraries/AP_Baro/AP_Baro_atmosphere.cpp b/libraries/AP_Baro/AP_Baro_atmosphere.cpp index 63667432e8..ed26927cb9 100644 --- a/libraries/AP_Baro/AP_Baro_atmosphere.cpp +++ b/libraries/AP_Baro/AP_Baro_atmosphere.cpp @@ -46,12 +46,6 @@ T0_slope = -6.5E-3 (K/m') The tables list altitudes -5 km to 0 km using the same equations as 0 km to 11 km. */ -#ifndef AP_BARO_1976_STANDARD_ATMOSPHERE_ENABLED -// default to using the extended functions when doing double precision EKF (which implies more flash space and faster MCU) -// this allows for using the simple model with the --ekf-single configure option -#define AP_BARO_1976_STANDARD_ATMOSPHERE_ENABLED HAL_WITH_EKF_DOUBLE -#endif - /* return altitude difference in meters between current pressure and a given base_pressure in Pascal. This is a simple atmospheric model @@ -314,6 +308,7 @@ float AP_Baro::_get_EAS2TAS(void) const #endif } +#if AP_BARO_1976_STANDARD_ATMOSPHERE_ENABLED || AP_SIM_ENABLED // lookup expected temperature in degrees C for a given altitude. Used for SITL backend float AP_Baro::get_temperatureC_for_alt_amsl(const float alt_amsl) { @@ -329,6 +324,7 @@ float AP_Baro::get_pressure_for_alt_amsl(const float alt_amsl) get_pressure_temperature_for_alt_amsl(alt_amsl, pressure, temp_K); return pressure; } +#endif // AP_BARO_1976_STANDARD_ATMOSPHERE_ENABLED /* return sea level pressure given a current altitude and pressure reading diff --git a/libraries/AP_Baro/AP_Baro_config.h b/libraries/AP_Baro/AP_Baro_config.h index ed7f84a18e..643ec92023 100644 --- a/libraries/AP_Baro/AP_Baro_config.h +++ b/libraries/AP_Baro/AP_Baro_config.h @@ -97,3 +97,9 @@ #ifndef AP_BARO_PROBE_EXT_PARAMETER_ENABLED #define AP_BARO_PROBE_EXT_PARAMETER_ENABLED AP_BARO_PROBE_EXTERNAL_I2C_BUSES || AP_BARO_MSP_ENABLED #endif + +#ifndef AP_BARO_1976_STANDARD_ATMOSPHERE_ENABLED +// default to using the extended functions when doing double precision EKF (which implies more flash space and faster MCU) +// this allows for using the simple model with the --ekf-single configure option +#define AP_BARO_1976_STANDARD_ATMOSPHERE_ENABLED HAL_WITH_EKF_DOUBLE || AP_SIM_ENABLED +#endif diff --git a/libraries/AP_BattMonitor/AP_BattMonitor.cpp b/libraries/AP_BattMonitor/AP_BattMonitor.cpp index 8c766b4e36..3b44eee21b 100644 --- a/libraries/AP_BattMonitor/AP_BattMonitor.cpp +++ b/libraries/AP_BattMonitor/AP_BattMonitor.cpp @@ -701,6 +701,7 @@ void AP_BattMonitor::read() } #endif + const uint32_t now_ms = AP_HAL::millis(); for (uint8_t i=0; i<_num_instances; i++) { if (drivers[i] == nullptr) { continue; @@ -719,6 +720,11 @@ void AP_BattMonitor::read() drivers[i]->update_esc_telem_outbound(); #endif + // Update last heathy timestamp + if (state[i].healthy) { + state[i].last_healthy_ms = now_ms; + } + #if HAL_LOGGING_ENABLED if (logger != nullptr && logger->should_log(_log_battery_bit)) { const uint64_t time_us = AP_HAL::micros64(); @@ -771,6 +777,14 @@ float AP_BattMonitor::gcs_voltage(uint8_t instance) const return state[instance].voltage; } +bool AP_BattMonitor::option_is_set(uint8_t instance, AP_BattMonitor_Params::Options option) const +{ + if (instance >= _num_instances || drivers[instance] == nullptr) { + return false; + } + return drivers[instance]->option_is_set(option); +} + /// current_amps - returns the instantaneous current draw in amperes bool AP_BattMonitor::current_amps(float ¤t, uint8_t instance) const { if ((instance < _num_instances) && (drivers[instance] != nullptr) && drivers[instance]->has_current()) { @@ -852,6 +866,11 @@ void AP_BattMonitor::check_failsafes(void) switch (type) { case Failsafe::None: continue; // should not have been called in this case + case Failsafe::Unhealthy: + // Report only for unhealthy, could add action param in the future + action = 0; + type_str = "missing, last:"; + break; case Failsafe::Low: action = _params[i]._failsafe_low_action; type_str = "low"; @@ -1026,7 +1045,7 @@ void AP_BattMonitor::checkPoweringOff(void) cmd_msg.command = MAV_CMD_POWER_OFF_INITIATED; cmd_msg.param1 = i+1; GCS_MAVLINK::send_to_components(MAVLINK_MSG_ID_COMMAND_LONG, (char*)&cmd_msg, sizeof(cmd_msg)); - gcs().send_text(MAV_SEVERITY_WARNING, "Vehicle %d battery %d is powering off", mavlink_system.sysid, i+1); + GCS_SEND_TEXT(MAV_SEVERITY_WARNING, "Vehicle %d battery %d is powering off", mavlink_system.sysid, i+1); #endif // only send this once @@ -1079,6 +1098,7 @@ MAV_BATTERY_CHARGE_STATE AP_BattMonitor::get_mavlink_charge_state(const uint8_t switch (state[instance].failsafe) { case Failsafe::None: + case Failsafe::Unhealthy: if (get_mavlink_fault_bitmask(instance) != 0 || !healthy()) { return MAV_BATTERY_CHARGE_STATE_UNHEALTHY; } diff --git a/libraries/AP_BattMonitor/AP_BattMonitor.h b/libraries/AP_BattMonitor/AP_BattMonitor.h index f03e997632..0b55e2846d 100644 --- a/libraries/AP_BattMonitor/AP_BattMonitor.h +++ b/libraries/AP_BattMonitor/AP_BattMonitor.h @@ -81,6 +81,7 @@ public: // battery failsafes must be defined in levels of severity so that vehicles wont fall backwards enum class Failsafe : uint8_t { None = 0, + Unhealthy, Low, Critical }; @@ -153,6 +154,7 @@ public: float resistance; // resistance, in Ohms, calculated by comparing resting voltage vs in flight voltage Failsafe failsafe; // stage failsafe the battery is in bool healthy; // battery monitor is communicating correctly + uint32_t last_healthy_ms; // Time when monitor was last healthy bool is_powering_off; // true when power button commands power off bool powerOffNotified; // only send powering off notification once uint32_t time_remaining; // remaining battery time @@ -260,6 +262,8 @@ public: void MPPT_set_powered_state_to_all(const bool power_on); void MPPT_set_powered_state(const uint8_t instance, const bool power_on); + bool option_is_set(uint8_t instance, AP_BattMonitor_Params::Options option) const; + // cycle count bool get_cycle_count(uint8_t instance, uint16_t &cycles) const; diff --git a/libraries/AP_BattMonitor/AP_BattMonitor_Backend.cpp b/libraries/AP_BattMonitor/AP_BattMonitor_Backend.cpp index 195dbded04..728e3b918a 100644 --- a/libraries/AP_BattMonitor/AP_BattMonitor_Backend.cpp +++ b/libraries/AP_BattMonitor/AP_BattMonitor_Backend.cpp @@ -168,6 +168,11 @@ AP_BattMonitor::Failsafe AP_BattMonitor_Backend::update_failsafes(void) return AP_BattMonitor::Failsafe::Low; } + // 5 second health timeout + if ((now - _state.last_healthy_ms) > 5000) { + return AP_BattMonitor::Failsafe::Unhealthy; + } + // if we've gotten this far then battery is ok return AP_BattMonitor::Failsafe::None; } diff --git a/libraries/AP_BattMonitor/AP_BattMonitor_ESC.cpp b/libraries/AP_BattMonitor/AP_BattMonitor_ESC.cpp index a1c309a6e6..7b76295f3b 100644 --- a/libraries/AP_BattMonitor/AP_BattMonitor_ESC.cpp +++ b/libraries/AP_BattMonitor/AP_BattMonitor_ESC.cpp @@ -59,8 +59,8 @@ void AP_BattMonitor_ESC::read(void) float voltage_sum = 0; float current_sum = 0; float temperature_sum = 0; + float consumed_mah_sum = 0.0; uint32_t highest_ms = 0; - _state.consumed_mah = delta_mah; const bool all_enabled = _mask == 0; for (uint8_t i=0; i 0) { - // if we have ever got a current value then we know we have a - // current sensor - have_current = true; + const uint32_t now_us = AP_HAL::micros(); + const uint32_t dt_us = now_us - last_read_us; + last_read_us = now_us; + + if (have_consumed_mah) { + // Report the cumulative consumed mah as reported by the ESCs + // delta_mah allows reset_remaining to function without being able to reset the values sent by the ESCs + _state.consumed_mah = delta_mah + consumed_mah_sum; + + } else if (have_current) { + // ESCs provide current but not consumed mah, integrate manually + update_consumed(_state, dt_us); + } } diff --git a/libraries/AP_BattMonitor/AP_BattMonitor_ESC.h b/libraries/AP_BattMonitor/AP_BattMonitor_ESC.h index 4d3eb33bac..400520dfbe 100644 --- a/libraries/AP_BattMonitor/AP_BattMonitor_ESC.h +++ b/libraries/AP_BattMonitor/AP_BattMonitor_ESC.h @@ -51,8 +51,11 @@ private: AP_Int32 _mask; bool have_current; + bool have_consumed_mah; bool have_temperature; float delta_mah; + + uint32_t last_read_us; }; #endif // AP_BATTERY_ESC_ENABLED diff --git a/libraries/AP_BattMonitor/AP_BattMonitor_FuelLevel_Analog.cpp b/libraries/AP_BattMonitor/AP_BattMonitor_FuelLevel_Analog.cpp index f1dfead2bb..ecd2c79b89 100644 --- a/libraries/AP_BattMonitor/AP_BattMonitor_FuelLevel_Analog.cpp +++ b/libraries/AP_BattMonitor/AP_BattMonitor_FuelLevel_Analog.cpp @@ -54,8 +54,8 @@ const AP_Param::GroupInfo AP_BattMonitor_FuelLevel_Analog::var_info[] = { // @Param: FL_PIN // @DisplayName: Fuel level analog pin number - // @Description: Analog input pin that fuel level sensor is connected to. Airspeed ports can be used for Analog input. When using analog pin 103, the maximum value of the input in 3.3V. - // @Values: -1:Not Used,11:Pixracer,13:Pixhawk ADC4,14:Pixhawk ADC3,15:Pixhawk ADC6/Pixhawk2 ADC,103:Pixhawk SBUS + // @Description: Analog input pin that fuel level sensor is connected to.Analog Airspeed or RSSI ports can be used for Analog input( some autopilots provide others also). Values for some autopilots are given as examples. Search wiki for "Analog pins". + // @Values: -1:Disabled, 2:Pixhawk/Pixracer/Navio2/Pixhawk2_PM1, 5:Navigator, 13:Pixhawk2_PM2/CubeOrange_PM2, 14:CubeOrange, 16:Durandal, 100:PX4-v1 AP_GROUPINFO("FL_PIN", 43, AP_BattMonitor_FuelLevel_Analog, _pin, -1), // index 44 unused and available diff --git a/libraries/AP_BattMonitor/AP_BattMonitor_INA2xx.cpp b/libraries/AP_BattMonitor/AP_BattMonitor_INA2xx.cpp index 94be30abc7..cf25c81974 100644 --- a/libraries/AP_BattMonitor/AP_BattMonitor_INA2xx.cpp +++ b/libraries/AP_BattMonitor/AP_BattMonitor_INA2xx.cpp @@ -46,6 +46,17 @@ extern const AP_HAL::HAL& hal; #define REG_238_DIETEMP 0x06 #define INA_238_TEMP_C_LSB 7.8125e-3 // need to mask bottom 4 bits +// INA231 specific registers +#define REG_231_CONFIG 0x00 +#define REG_231_SHUNT_VOLTAGE 0x01 +#define REG_231_BUS_VOLTAGE 0x02 +#define REG_231_POWER 0x03 +#define REG_231_CURRENT 0x04 +#define REG_231_CALIBRATION 0x05 +#define REG_231_MASK 0x06 +#define REG_231_ALERT 0x07 + + #ifndef DEFAULT_BATTMON_INA2XX_MAX_AMPS #define DEFAULT_BATTMON_INA2XX_MAX_AMPS 90.0 #endif @@ -144,7 +155,7 @@ bool AP_BattMonitor_INA2XX::configure(DevType dtype) case DevType::INA228: { // configure for MAX_AMPS voltage_LSB = 195.3125e-6; // 195.3125 uV/LSB - current_LSB = max_amps / (1<<19); + current_LSB = max_amps / (1U<<19); const uint16_t shunt_cal = uint16_t(13107.2e6 * current_LSB * rShunt) & 0x7FFF; if (write_word(REG_228_CONFIG, REG_228_CONFIG_RESET) && // reset write_word(REG_228_CONFIG, 0) && @@ -158,7 +169,7 @@ bool AP_BattMonitor_INA2XX::configure(DevType dtype) case DevType::INA238: { // configure for MAX_AMPS voltage_LSB = 3.125e-3; // 3.125mV/LSB - current_LSB = max_amps / (1<<15); + current_LSB = max_amps / (1U<<15); const uint16_t shunt_cal = uint16_t(819.2e6 * current_LSB * rShunt) & 0x7FFF; if (write_word(REG_238_CONFIG, REG_238_CONFIG_RESET) && // reset write_word(REG_238_CONFIG, 0) && @@ -168,6 +179,16 @@ bool AP_BattMonitor_INA2XX::configure(DevType dtype) } break; } + + case DevType::INA231: { + // no configuration needed + voltage_LSB = 1.25e-3; + current_LSB = max_amps / (1U<<15); + const uint16_t cal = 0.00512 / (current_LSB * rShunt); + if (write_word(REG_231_CALIBRATION, cal)) { + return true; + } + } } return false; @@ -281,6 +302,11 @@ bool AP_BattMonitor_INA2XX::detect_device(void) id == REG_226_CONFIG_DEFAULT) { return configure(DevType::INA226); } + if (read_word16(REG_231_CONFIG, id) && id == 0x4127) { + // no manufacturer ID for 231 + return configure(DevType::INA231); + } + return false; } @@ -351,6 +377,22 @@ void AP_BattMonitor_INA2XX::timer(void) temperature = (temp16&0xFFF0) * INA_238_TEMP_C_LSB; break; } + + case DevType::INA231: { + int16_t bus_voltage16, current16; + if (!read_word16(REG_231_SHUNT_VOLTAGE, bus_voltage16) || + !read_word16(REG_231_CURRENT, current16)) { + failed_reads++; + if (failed_reads > 10) { + // device has disconnected, we need to reconfigure it + dev_type = DevType::UNKNOWN; + } + return; + } + voltage = bus_voltage16 * voltage_LSB; + current = current16 * current_LSB; + break; + } } failed_reads = 0; diff --git a/libraries/AP_BattMonitor/AP_BattMonitor_INA2xx.h b/libraries/AP_BattMonitor/AP_BattMonitor_INA2xx.h index b23b4420ea..4c5b5dfbf5 100644 --- a/libraries/AP_BattMonitor/AP_BattMonitor_INA2xx.h +++ b/libraries/AP_BattMonitor/AP_BattMonitor_INA2xx.h @@ -35,6 +35,7 @@ private: INA226, INA228, INA238, + INA231, }; static const uint8_t i2c_probe_addresses[]; diff --git a/libraries/AP_BattMonitor/AP_BattMonitor_Params.h b/libraries/AP_BattMonitor/AP_BattMonitor_Params.h index 2088845c39..8298a0c34a 100644 --- a/libraries/AP_BattMonitor/AP_BattMonitor_Params.h +++ b/libraries/AP_BattMonitor/AP_BattMonitor_Params.h @@ -17,7 +17,7 @@ public: BattMonitor_LowVoltageSource_Raw = 0, BattMonitor_LowVoltageSource_SagCompensated = 1 }; - enum class Options : uint8_t { + enum class Options : uint16_t { Ignore_UAVCAN_SoC = (1U<<0), // Ignore UAVCAN State-of-Charge (charge %) supplied value from the device and use the internally calculated one MPPT_Use_Input_Value = (1U<<1), // MPPT reports voltage and current from Input (usually solar panel) instead of the output MPPT_Power_Off_At_Disarm = (1U<<2), // MPPT Disabled when vehicle is disarmed, if HW supports it @@ -26,6 +26,7 @@ public: MPPT_Power_On_At_Boot = (1U<<5), // MPPT Enabled at startup (aka boot), if HW supports it. If Power_Off_at_Boot is also set, the behavior is Power_Off_at_Boot GCS_Resting_Voltage = (1U<<6), // send resistance resting voltage to GCS AllowSplitAuxInfo = (1U<<7), // allow different node to provide aux info for DroneCAN + InternalUseOnly = (1U<<8), // for use internally to ArduPilot, not to be (eg.) sent via MAVLink BATTERY_STATUS }; BattMonitor_LowVoltage_Source failsafe_voltage_source(void) const { return (enum BattMonitor_LowVoltage_Source)_failsafe_voltage_source.get(); } diff --git a/libraries/AP_BattMonitor/AP_BattMonitor_Sum.cpp b/libraries/AP_BattMonitor/AP_BattMonitor_Sum.cpp index 2a7401d326..354afaca28 100644 --- a/libraries/AP_BattMonitor/AP_BattMonitor_Sum.cpp +++ b/libraries/AP_BattMonitor/AP_BattMonitor_Sum.cpp @@ -54,6 +54,9 @@ AP_BattMonitor_Sum::read() float current_sum = 0; uint8_t current_count = 0; + float temperature_sum = 0.0; + uint8_t temperature_count = 0; + for (uint8_t i=0; i<_mon.num_instances(); i++) { if (i == _instance) { // never include self @@ -77,6 +80,12 @@ AP_BattMonitor_Sum::read() current_sum += current; current_count++; } + + float temperature; + if (_mon.get_temperature(temperature, i)) { + temperature_sum += temperature; + temperature_count++; + } } const uint32_t tnow_us = AP_HAL::micros(); const uint32_t dt_us = tnow_us - _state.last_time_micros; @@ -87,10 +96,15 @@ AP_BattMonitor_Sum::read() if (current_count > 0) { _state.current_amps = current_sum; } + if (temperature_count > 0) { + _state.temperature = temperature_sum / temperature_count; + _state.temperature_time = AP_HAL::millis(); + } update_consumed(_state, dt_us); _has_current = (current_count > 0); + _has_temperature = (temperature_count > 0); _state.healthy = (voltage_count > 0); if (_state.healthy) { diff --git a/libraries/AP_BattMonitor/AP_BattMonitor_Sum.h b/libraries/AP_BattMonitor/AP_BattMonitor_Sum.h index 1e882bb333..000ceb5d25 100644 --- a/libraries/AP_BattMonitor/AP_BattMonitor_Sum.h +++ b/libraries/AP_BattMonitor/AP_BattMonitor_Sum.h @@ -22,6 +22,9 @@ public: /// returns true if battery monitor provides current info bool has_current() const override { return _has_current; } + /// returns true if battery monitor provides temperature info + bool has_temperature() const override { return _has_temperature; } + void init(void) override {} static const struct AP_Param::GroupInfo var_info[]; @@ -31,6 +34,7 @@ private: AP_Int16 _sum_mask; uint8_t _instance; bool _has_current; + bool _has_temperature; }; #endif // AP_BATTERY_SUM_ENABLED diff --git a/libraries/AP_Beacon/AP_Beacon.cpp b/libraries/AP_Beacon/AP_Beacon.cpp index 389fe58a9d..1b9de318d4 100644 --- a/libraries/AP_Beacon/AP_Beacon.cpp +++ b/libraries/AP_Beacon/AP_Beacon.cpp @@ -97,24 +97,30 @@ void AP_Beacon::init(void) } // create backend - if (_type == AP_BeaconType_Pozyx) { + switch ((Type)_type) { + case Type::Pozyx: _driver = NEW_NOTHROW AP_Beacon_Pozyx(*this); - } else if (_type == AP_BeaconType_Marvelmind) { + break; + case Type::Marvelmind: _driver = NEW_NOTHROW AP_Beacon_Marvelmind(*this); - } else if (_type == AP_BeaconType_Nooploop) { + break; + case Type::Nooploop: _driver = NEW_NOTHROW AP_Beacon_Nooploop(*this); - } -#if CONFIG_HAL_BOARD == HAL_BOARD_SITL - if (_type == AP_BeaconType_SITL) { + break; +#if AP_BEACON_SITL_ENABLED + case Type::SITL: _driver = NEW_NOTHROW AP_Beacon_SITL(*this); - } + break; #endif + case Type::None: + break; + } } // return true if beacon feature is enabled bool AP_Beacon::enabled(void) const { - return (_type != AP_BeaconType_None); + return (_type != Type::None); } // return true if sensor is basically healthy (we are receiving data) @@ -236,7 +242,7 @@ Vector3f AP_Beacon::beacon_position(uint8_t beacon_instance) const // return last update time from beacon in milliseconds uint32_t AP_Beacon::beacon_last_update_ms(uint8_t beacon_instance) const { - if (_type == AP_BeaconType_None || beacon_instance >= num_beacons) { + if (_type == Type::None || beacon_instance >= num_beacons) { return 0; } return beacon_state[beacon_instance].distance_update_ms; @@ -388,7 +394,7 @@ const Vector2f* AP_Beacon::get_boundary_points(uint16_t& num_points) const // check if the device is ready bool AP_Beacon::device_ready(void) const { - return ((_driver != nullptr) && (_type != AP_BeaconType_None)); + return ((_driver != nullptr) && (_type != Type::None)); } #if HAL_LOGGING_ENABLED diff --git a/libraries/AP_Beacon/AP_Beacon.h b/libraries/AP_Beacon/AP_Beacon.h index be7766d422..98f7c37775 100644 --- a/libraries/AP_Beacon/AP_Beacon.h +++ b/libraries/AP_Beacon/AP_Beacon.h @@ -40,12 +40,14 @@ public: static AP_Beacon *get_singleton() { return _singleton; } // external position backend types (used by _TYPE parameter) - enum AP_BeaconType { - AP_BeaconType_None = 0, - AP_BeaconType_Pozyx = 1, - AP_BeaconType_Marvelmind = 2, - AP_BeaconType_Nooploop = 3, - AP_BeaconType_SITL = 10 + enum class Type : uint8_t { + None = 0, + Pozyx = 1, + Marvelmind = 2, + Nooploop = 3, +#if AP_BEACON_SITL_ENABLED + SITL = 10 +#endif }; // The AP_BeaconState structure is filled in by the backend driver @@ -125,7 +127,7 @@ private: static bool get_next_boundary_point(const Vector2f* boundary, uint8_t num_points, uint8_t current_index, float start_angle, uint8_t& next_index, float& next_angle); // parameters - AP_Int8 _type; + AP_Enum _type; AP_Float origin_lat; AP_Float origin_lon; AP_Float origin_alt; diff --git a/libraries/AP_Beacon/AP_Beacon_Marvelmind.cpp b/libraries/AP_Beacon/AP_Beacon_Marvelmind.cpp index 4154b5edd9..1029d66800 100644 --- a/libraries/AP_Beacon/AP_Beacon_Marvelmind.cpp +++ b/libraries/AP_Beacon/AP_Beacon_Marvelmind.cpp @@ -37,7 +37,7 @@ extern const AP_HAL::HAL& hal; #if MM_DEBUG_LEVEL #include - #define Debug(level, fmt, args ...) do { if (level <= MM_DEBUG_LEVEL) { gcs().send_text(MAV_SEVERITY_INFO, fmt, ## args); } } while (0) + #define Debug(level, fmt, args ...) do { if (level <= MM_DEBUG_LEVEL) { GCS_SEND_TEXT(MAV_SEVERITY_INFO, fmt, ## args); } } while (0) #else #define Debug(level, fmt, args ...) #endif diff --git a/libraries/AP_BoardConfig/IMU_heater.cpp b/libraries/AP_BoardConfig/IMU_heater.cpp index 151136d172..fa33141590 100644 --- a/libraries/AP_BoardConfig/IMU_heater.cpp +++ b/libraries/AP_BoardConfig/IMU_heater.cpp @@ -108,7 +108,7 @@ void AP_BoardConfig::set_imu_temp(float current) #endif // HAL_LOGGING_ENABLED #if 0 - gcs().send_text(MAV_SEVERITY_INFO, "Heater: Out=%.1f Temp=%.1f", + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Heater: Out=%.1f Temp=%.1f", double(heater.output), double(avg)); #endif diff --git a/libraries/AP_CANManager/AP_CANManager.cpp b/libraries/AP_CANManager/AP_CANManager.cpp index 56f6b59ece..5f6d2cfefd 100644 --- a/libraries/AP_CANManager/AP_CANManager.cpp +++ b/libraries/AP_CANManager/AP_CANManager.cpp @@ -199,8 +199,9 @@ void AP_CANManager::init() } // Allocate the set type of Driver + switch (drv_type[drv_num]) { #if HAL_ENABLE_DRONECAN_DRIVERS - if (drv_type[drv_num] == AP_CAN::Protocol::DroneCAN) { + case AP_CAN::Protocol::DroneCAN: _drivers[drv_num] = _drv_param[drv_num]._uavcan = NEW_NOTHROW AP_DroneCAN(drv_num); if (_drivers[drv_num] == nullptr) { @@ -209,10 +210,10 @@ void AP_CANManager::init() } AP_Param::load_object_from_eeprom((AP_DroneCAN*)_drivers[drv_num], AP_DroneCAN::var_info); - } else + break; #endif #if HAL_PICCOLO_CAN_ENABLE - if (drv_type[drv_num] == AP_CAN::Protocol::PiccoloCAN) { + case AP_CAN::Protocol::PiccoloCAN: _drivers[drv_num] = _drv_param[drv_num]._piccolocan = NEW_NOTHROW AP_PiccoloCAN; if (_drivers[drv_num] == nullptr) { @@ -221,9 +222,9 @@ void AP_CANManager::init() } AP_Param::load_object_from_eeprom((AP_PiccoloCAN*)_drivers[drv_num], AP_PiccoloCAN::var_info); - } else + break; #endif - { + default: continue; } diff --git a/libraries/AP_Camera/AP_Camera.cpp b/libraries/AP_Camera/AP_Camera.cpp index 57302c8bde..b3869c4818 100644 --- a/libraries/AP_Camera/AP_Camera.cpp +++ b/libraries/AP_Camera/AP_Camera.cpp @@ -6,7 +6,6 @@ #include #include #include -#include #include "AP_Camera_Backend.h" #include "AP_Camera_Servo.h" #include "AP_Camera_Relay.h" diff --git a/libraries/AP_Camera/AP_Camera_Backend.cpp b/libraries/AP_Camera/AP_Camera_Backend.cpp index fafe4546aa..516d418684 100644 --- a/libraries/AP_Camera/AP_Camera_Backend.cpp +++ b/libraries/AP_Camera/AP_Camera_Backend.cpp @@ -1,9 +1,13 @@ -#include "AP_Camera_Backend.h" +#include "AP_Camera_config.h" #if AP_CAMERA_ENABLED + +#include "AP_Camera_Backend.h" + #include #include #include +#include extern const AP_HAL::HAL& hal; @@ -57,8 +61,10 @@ void AP_Camera_Backend::update() return; } - // check GPS status - if (AP::gps().status() < AP_GPS::GPS_OK_FIX_3D) { + const AP_AHRS &ahrs = AP::ahrs(); + + Location current_loc; + if (!ahrs.get_location(current_loc)) { return; } @@ -68,15 +74,10 @@ void AP_Camera_Backend::update() } // check vehicle roll angle is less than configured maximum - const AP_AHRS &ahrs = AP::ahrs(); - if ((_frontend.get_roll_max() > 0) && (fabsf(AP::ahrs().roll_sensor * 1e-2f) > _frontend.get_roll_max())) { + if ((_frontend.get_roll_max() > 0) && (fabsf(ahrs.roll_sensor * 1e-2f) > _frontend.get_roll_max())) { return; } - // get current location. ignore failure because AHRS will provide its best guess - Location current_loc; - IGNORE_RETURN(ahrs.get_location(current_loc)); - // initialise last location to current location if (last_location.lat == 0 && last_location.lng == 0) { last_location = current_loc; @@ -279,10 +280,10 @@ void AP_Camera_Backend::send_camera_fov_status(mavlink_channel_t chan) const AP_HAL::millis(), loc.lat, loc.lng, - loc.alt, + loc.alt * 10, poi_loc.lat, poi_loc.lng, - poi_loc.alt, + poi_loc.alt * 10, quat_array, horizontal_fov() > 0 ? horizontal_fov() : NaN, vertical_fov() > 0 ? vertical_fov() : NaN diff --git a/libraries/AP_Camera/AP_Camera_MAVLinkCamV2.cpp b/libraries/AP_Camera/AP_Camera_MAVLinkCamV2.cpp index 7a1caa214f..a47816c70e 100644 --- a/libraries/AP_Camera/AP_Camera_MAVLinkCamV2.cpp +++ b/libraries/AP_Camera/AP_Camera_MAVLinkCamV2.cpp @@ -141,7 +141,7 @@ void AP_Camera_MAVLinkCamV2::handle_message(mavlink_channel_t chan, const mavlin const uint8_t fw_ver_build = (_cam_info.firmware_version & 0xFF000000) >> 24; // display camera info to user - gcs().send_text(MAV_SEVERITY_INFO, "Camera: %s.32 %s.32 fw:%u.%u.%u.%u", + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Camera: %.32s %.32s fw:%u.%u.%u.%u", _cam_info.vendor_name, _cam_info.model_name, (unsigned)fw_ver_major, diff --git a/libraries/AP_Camera/AP_Camera_Params.cpp b/libraries/AP_Camera/AP_Camera_Params.cpp index 7fb915082c..749d2985f0 100644 --- a/libraries/AP_Camera/AP_Camera_Params.cpp +++ b/libraries/AP_Camera/AP_Camera_Params.cpp @@ -8,7 +8,7 @@ const AP_Param::GroupInfo AP_Camera_Params::var_info[] = { // @Param: _TYPE // @DisplayName: Camera shutter (trigger) type // @Description: how to trigger the camera to take a picture - // @Values: 0:None, 1:Servo, 2:Relay, 3:GoPro in Solo Gimbal, 4:Mount (Siyi), 5:MAVLink, 6:MAVLinkCamV2, 7:Scripting + // @Values: 0:None, 1:Servo, 2:Relay, 3:GoPro in Solo Gimbal, 4:Mount (Siyi/Topotek/Viewpro/Xacti), 5:MAVLink, 6:MAVLinkCamV2, 7:Scripting // @User: Standard AP_GROUPINFO_FLAGS("_TYPE", 1, AP_Camera_Params, type, 0, AP_PARAM_FLAG_ENABLE), diff --git a/libraries/AP_Camera/AP_Camera_SoloGimbal.cpp b/libraries/AP_Camera/AP_Camera_SoloGimbal.cpp index 06ecf6ee3a..c2cb2d400a 100644 --- a/libraries/AP_Camera/AP_Camera_SoloGimbal.cpp +++ b/libraries/AP_Camera/AP_Camera_SoloGimbal.cpp @@ -12,7 +12,7 @@ bool AP_Camera_SoloGimbal::trigger_pic() { if (gopro_status != GOPRO_HEARTBEAT_STATUS_CONNECTED) { - gcs().send_text(MAV_SEVERITY_ERROR, "GoPro Not Available"); + GCS_SEND_TEXT(MAV_SEVERITY_ERROR, "GoPro Not Available"); return false; } @@ -21,21 +21,21 @@ bool AP_Camera_SoloGimbal::trigger_pic() if (gopro_capture_mode == GOPRO_CAPTURE_MODE_PHOTO) { // Trigger shutter start to take a photo - gcs().send_text(MAV_SEVERITY_INFO, "GoPro Photo Trigger"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "GoPro Photo Trigger"); mavlink_msg_gopro_set_request_send(heartbeat_channel, mavlink_system.sysid, MAV_COMP_ID_GIMBAL,GOPRO_COMMAND_SHUTTER,gopro_shutter_start); } else if (gopro_capture_mode == GOPRO_CAPTURE_MODE_VIDEO) { if (gopro_is_recording) { // GoPro is recording, so stop recording - gcs().send_text(MAV_SEVERITY_INFO, "GoPro Recording Stop"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "GoPro Recording Stop"); mavlink_msg_gopro_set_request_send(heartbeat_channel, mavlink_system.sysid, MAV_COMP_ID_GIMBAL,GOPRO_COMMAND_SHUTTER,gopro_shutter_stop); } else { // GoPro is not recording, so start recording - gcs().send_text(MAV_SEVERITY_INFO, "GoPro Recording Start"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "GoPro Recording Start"); mavlink_msg_gopro_set_request_send(heartbeat_channel, mavlink_system.sysid, MAV_COMP_ID_GIMBAL,GOPRO_COMMAND_SHUTTER,gopro_shutter_start); } } else { - gcs().send_text(MAV_SEVERITY_ERROR, "GoPro Unsupported Capture Mode"); + GCS_SEND_TEXT(MAV_SEVERITY_ERROR, "GoPro Unsupported Capture Mode"); return false; } @@ -52,7 +52,7 @@ void AP_Camera_SoloGimbal::cam_mode_toggle() uint8_t gopro_capture_mode_values[4] = { }; if (gopro_status != GOPRO_HEARTBEAT_STATUS_CONNECTED) { - gcs().send_text(MAV_SEVERITY_ERROR, "GoPro Not Available"); + GCS_SEND_TEXT(MAV_SEVERITY_ERROR, "GoPro Not Available"); return; } @@ -60,12 +60,12 @@ void AP_Camera_SoloGimbal::cam_mode_toggle() case GOPRO_CAPTURE_MODE_VIDEO: if (gopro_is_recording) { // GoPro is recording, cannot change modes - gcs().send_text(MAV_SEVERITY_INFO, "GoPro recording, can't change modes"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "GoPro recording, can't change modes"); } else { // Change to camera mode gopro_capture_mode_values[0] = GOPRO_CAPTURE_MODE_PHOTO; mavlink_msg_gopro_set_request_send(heartbeat_channel, mavlink_system.sysid, MAV_COMP_ID_GIMBAL,GOPRO_COMMAND_CAPTURE_MODE,gopro_capture_mode_values); - gcs().send_text(MAV_SEVERITY_INFO, "GoPro changing to mode photo"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "GoPro changing to mode photo"); } break; @@ -74,7 +74,7 @@ void AP_Camera_SoloGimbal::cam_mode_toggle() // Change to video mode gopro_capture_mode_values[0] = GOPRO_CAPTURE_MODE_VIDEO; mavlink_msg_gopro_set_request_send(heartbeat_channel, mavlink_system.sysid, MAV_COMP_ID_GIMBAL,GOPRO_COMMAND_CAPTURE_MODE,gopro_capture_mode_values); - gcs().send_text(MAV_SEVERITY_INFO, "GoPro changing to mode video"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "GoPro changing to mode video"); break; } } diff --git a/libraries/AP_Camera/AP_Camera_config.h b/libraries/AP_Camera/AP_Camera_config.h index 83e5417e7c..24b51275be 100644 --- a/libraries/AP_Camera/AP_Camera_config.h +++ b/libraries/AP_Camera/AP_Camera_config.h @@ -49,3 +49,7 @@ #ifndef AP_CAMERA_SET_CAMERA_SOURCE_ENABLED #define AP_CAMERA_SET_CAMERA_SOURCE_ENABLED HAL_MOUNT_SET_CAMERA_SOURCE_ENABLED #endif + +#ifndef HAL_RUNCAM_ENABLED +#define HAL_RUNCAM_ENABLED 1 +#endif diff --git a/libraries/AP_Camera/AP_RunCam.h b/libraries/AP_Camera/AP_RunCam.h index b689a8108e..673dba0ff6 100644 --- a/libraries/AP_Camera/AP_RunCam.h +++ b/libraries/AP_Camera/AP_RunCam.h @@ -21,11 +21,7 @@ */ #pragma once -#include - -#ifndef HAL_RUNCAM_ENABLED -#define HAL_RUNCAM_ENABLED 1 -#endif +#include "AP_Camera_config.h" #if HAL_RUNCAM_ENABLED diff --git a/libraries/AP_Common/AP_Common.cpp b/libraries/AP_Common/AP_Common.cpp index 19f2002ac4..4c7c3af0ce 100644 --- a/libraries/AP_Common/AP_Common.cpp +++ b/libraries/AP_Common/AP_Common.cpp @@ -97,10 +97,12 @@ size_t strncpy_noterm(char *dest, const char *src, size_t n) */ int16_t char_to_hex(char a) { - if (a >= 'A' && a <= 'F') + if (a >= 'A' && a <= 'F') { return a - 'A' + 10; - else if (a >= 'a' && a <= 'f') + } else if (a >= 'a' && a <= 'f') { return a - 'a' + 10; - else + } else if (a >= '0' && a <= '9') { return a - '0'; + } + return 0; } diff --git a/libraries/AP_Common/Bitmask.h b/libraries/AP_Common/Bitmask.h index 233d1b3e26..ed4443d294 100644 --- a/libraries/AP_Common/Bitmask.h +++ b/libraries/AP_Common/Bitmask.h @@ -23,26 +23,28 @@ #include -template +template class Bitmask { + static constexpr uint16_t NUMWORDS = ((NUMBITS+31)/32); + + static_assert(NUMBITS > 0, "must store something"); + // for first_set()'s return value + static_assert(NUMBITS <= INT16_MAX, "must fit in int16_t"); + // so that 1U << bits is in range + static_assert(sizeof(unsigned int) >= sizeof(uint32_t), "int too small"); + public: - Bitmask() : - numbits(num_bits), - numwords((num_bits+31)/32) { + Bitmask() { clearall(); } Bitmask &operator=(const Bitmask&other) { - memcpy(bits, other.bits, sizeof(bits[0])*other.numwords); + memcpy(bits, other.bits, sizeof(bits[0])*NUMWORDS); return *this; } bool operator==(const Bitmask&other) { - if (other.numbits != numbits) { - return false; - } else { - return memcmp(bits, other.bits, sizeof(bits[0])*numwords) == 0; - } + return memcmp(bits, other.bits, sizeof(bits[0])*NUMWORDS) == 0; } bool operator!=(const Bitmask&other) { @@ -53,10 +55,8 @@ public: // set given bitnumber void set(uint16_t bit) { - // ignore an invalid bit number - if (bit >= numbits) { - INTERNAL_ERROR(AP_InternalError::error_t::bitmask_range); - return; + if (!validate(bit)) { + return; // ignore access of invalid bit } uint16_t word = bit/32; uint8_t ofs = bit & 0x1f; @@ -65,17 +65,22 @@ public: // set all bits void setall(void) { - // set all words to 111... except the last one. - for (uint16_t i=0; i= numbits) { - INTERNAL_ERROR(AP_InternalError::error_t::bitmask_range); - return false; - } -#endif return (bits[word] & (1U << ofs)) != 0; } // return true if all bits are clear bool empty(void) const { - for (uint16_t i=0; i= NUMBITS) { + INTERNAL_ERROR(AP_InternalError::error_t::bitmask_range); + return false; + } + return true; + } + + uint32_t bits[NUMWORDS]; }; diff --git a/libraries/AP_Common/ExpandingString.cpp b/libraries/AP_Common/ExpandingString.cpp index 9be2b3a91a..a3e7a8b401 100644 --- a/libraries/AP_Common/ExpandingString.cpp +++ b/libraries/AP_Common/ExpandingString.cpp @@ -25,6 +25,13 @@ extern const AP_HAL::HAL& hal; #define EXPAND_INCREMENT 512 +ExpandingString::ExpandingString(char* s, uint32_t total_len) : buf(0) +{ + set_buffer(s, total_len, 0); + memset(buf, 0, buflen); +} + + /* expand the string buffer */ diff --git a/libraries/AP_Common/ExpandingString.h b/libraries/AP_Common/ExpandingString.h index 2561332f3e..d92882e1b3 100644 --- a/libraries/AP_Common/ExpandingString.h +++ b/libraries/AP_Common/ExpandingString.h @@ -24,6 +24,8 @@ class ExpandingString { public: + ExpandingString() : buf(0), buflen(0), used(0), allocation_failed(false), external_buffer(false) {} + ExpandingString(char* s, uint32_t total_len); const char *get_string(void) const { return buf; diff --git a/libraries/AP_Common/c++.cpp b/libraries/AP_Common/c++.cpp index 8ab798744f..eab43682fb 100644 --- a/libraries/AP_Common/c++.cpp +++ b/libraries/AP_Common/c++.cpp @@ -84,11 +84,38 @@ void operator delete[](void * ptr) if (ptr) free(ptr); } - -#if CONFIG_HAL_BOARD != HAL_BOARD_CHIBIOS +#ifdef CYGWIN_BUILD /* wrapper around malloc to ensure all memory is initialised as zero - ChibiOS has its own wrapper + cygwin needs to wrap _malloc_r + */ +#undef _malloc_r +extern "C" { + void *__wrap__malloc_r(_reent *r, size_t size); + void *__real__malloc_r(_reent *r, size_t size); + void *_malloc_r(_reent *r, size_t size); +} +void *__wrap__malloc_r(_reent *r, size_t size) +{ + void *ret = __real__malloc_r(r, size); + if (ret != nullptr) { + memset(ret, 0, size); + } + return ret; +} +void *_malloc_r(_reent *x, size_t size) +{ + void *ret = __real__malloc_r(x, size); + if (ret != nullptr) { + memset(ret, 0, size); + } + return ret; +} + +#elif CONFIG_HAL_BOARD != HAL_BOARD_CHIBIOS && CONFIG_HAL_BOARD != HAL_BOARD_QURT +/* + wrapper around malloc to ensure all memory is initialised as zero + ChibiOS and QURT have their own wrappers */ extern "C" { void *__wrap_malloc(size_t size); diff --git a/libraries/AP_Common/tests/test_bitmask.cpp b/libraries/AP_Common/tests/test_bitmask.cpp index 525ab9dd66..23ba357cc5 100644 --- a/libraries/AP_Common/tests/test_bitmask.cpp +++ b/libraries/AP_Common/tests/test_bitmask.cpp @@ -5,9 +5,10 @@ const AP_HAL::HAL& hal = AP_HAL::get_HAL(); -TEST(Bitmask, Tests) +template +void bitmask_tests(void) { - Bitmask<49> x; + Bitmask x; EXPECT_EQ(0, x.count()); EXPECT_EQ(-1, x.first_set()); x.set(5); @@ -18,16 +19,16 @@ TEST(Bitmask, Tests) EXPECT_EQ(-1, x.first_set()); EXPECT_EQ(-1, x.first_set()); - x.set(42); - EXPECT_EQ(42, x.first_set()); - x.clear(42); + x.set(N-7); + EXPECT_EQ(N-7, x.first_set()); + x.clear(N-7); EXPECT_EQ(-1, x.first_set()); EXPECT_EQ(-1, x.first_set()); x.set(0); x.set(5); x.set(6); - x.set(48); + x.set(N-1); EXPECT_EQ(4, x.count()); EXPECT_EQ(0, x.first_set()); EXPECT_EQ(0, x.first_set()); @@ -38,66 +39,110 @@ TEST(Bitmask, Tests) EXPECT_EQ(6, x.first_set()); EXPECT_EQ(6, x.first_set()); x.clear(6); - EXPECT_EQ(48, x.first_set()); - EXPECT_EQ(48, x.first_set()); - x.clear(48); + EXPECT_EQ(N-1, x.first_set()); + EXPECT_EQ(N-1, x.first_set()); + x.clear(N-1); EXPECT_EQ(-1, x.first_set()); - Bitmask<49> x2; + Bitmask x2; x2 = x; #if CONFIG_HAL_BOARD == HAL_BOARD_LINUX - x.set(50); + x.clear(N+1); #elif CONFIG_HAL_BOARD == HAL_BOARD_SITL - EXPECT_EXIT(x.set(50), testing::KilledBySignal(SIGABRT), "AP_InternalError::error_t::bitmask_range"); + EXPECT_EXIT(x.clear(N+1), testing::KilledBySignal(SIGABRT), "AP_InternalError::error_t::bitmask_range"); #endif - for (uint8_t i=0; i<49; i++) { +#if CONFIG_HAL_BOARD == HAL_BOARD_LINUX + x.set(N+1); +#elif CONFIG_HAL_BOARD == HAL_BOARD_SITL + EXPECT_EXIT(x.set(N+1), testing::KilledBySignal(SIGABRT), "AP_InternalError::error_t::bitmask_range"); +#endif + + for (uint8_t i=0; i(); } +TEST(Bitmask, Tests32) { bitmask_tests<32>(); } +TEST(Bitmask, Tests33) { bitmask_tests<33>(); } +TEST(Bitmask, Tests47) { bitmask_tests<47>(); } +TEST(Bitmask, Tests48) { bitmask_tests<48>(); } +TEST(Bitmask, Tests49) { bitmask_tests<49>(); } +TEST(Bitmask, Tests63) { bitmask_tests<63>(); } +TEST(Bitmask, Tests64) { bitmask_tests<64>(); } +TEST(Bitmask, Tests65) { bitmask_tests<65>(); } + +template +void bitmask_setall(void) { - Bitmask<49> x; + Bitmask x; EXPECT_EQ(-1, x.first_set()); - EXPECT_EQ(false, x.get(45)); + EXPECT_EQ(false, x.get(N-4)); + EXPECT_EQ(0, x.count()); x.setall(); EXPECT_EQ(0, x.first_set()); + EXPECT_EQ(N, x.count()); x.clear(0); EXPECT_EQ(1, x.first_set()); x.clear(1); EXPECT_EQ(2, x.first_set()); - EXPECT_EQ(true, x.get(45)); + EXPECT_EQ(true, x.get(N-4)); EXPECT_EQ(false, x.empty()); x.clearall(); EXPECT_EQ(-1, x.first_set()); - EXPECT_EQ(false, x.get(45)); + EXPECT_EQ(false, x.get(N-4)); EXPECT_EQ(true, x.empty()); + EXPECT_EQ(0, x.count()); } -TEST(Bitmask, Assignment) +TEST(Bitmask, SetAll31) { bitmask_setall<31>(); } +TEST(Bitmask, SetAll32) { bitmask_setall<32>(); } +TEST(Bitmask, SetAll33) { bitmask_setall<33>(); } +TEST(Bitmask, SetAll47) { bitmask_setall<47>(); } +TEST(Bitmask, SetAll48) { bitmask_setall<48>(); } +TEST(Bitmask, SetAll49) { bitmask_setall<49>(); } +TEST(Bitmask, SetAll63) { bitmask_setall<63>(); } +TEST(Bitmask, SetAll64) { bitmask_setall<64>(); } +TEST(Bitmask, SetAll65) { bitmask_setall<65>(); } + +template +void bitmask_assignment(void) { - Bitmask<49> x; + Bitmask x; x.set(0); x.set(5); x.set(6); - x.set(48); + x.set(N-1); - Bitmask<49> y; + Bitmask y; y = x; + EXPECT_EQ(true, x == y); x.clear(0); EXPECT_EQ(true, y.get(0)); EXPECT_EQ(true, y.get(5)); EXPECT_EQ(true, y.get(6)); - EXPECT_EQ(true, y.get(48)); + EXPECT_EQ(true, y.get(N-1)); } +TEST(Bitmask, Assignment31) { bitmask_assignment<31>(); } +TEST(Bitmask, Assignment32) { bitmask_assignment<32>(); } +TEST(Bitmask, Assignment33) { bitmask_assignment<33>(); } +TEST(Bitmask, Assignment47) { bitmask_assignment<47>(); } +TEST(Bitmask, Assignment48) { bitmask_assignment<48>(); } +TEST(Bitmask, Assignment49) { bitmask_assignment<49>(); } +TEST(Bitmask, Assignment63) { bitmask_assignment<63>(); } +TEST(Bitmask, Assignment64) { bitmask_assignment<64>(); } +TEST(Bitmask, Assignment65) { bitmask_assignment<65>(); } + AP_GTEST_PANIC() AP_GTEST_MAIN() diff --git a/libraries/AP_Compass/AP_Compass.cpp b/libraries/AP_Compass/AP_Compass.cpp index a38b2ae934..2f3584e732 100644 --- a/libraries/AP_Compass/AP_Compass.cpp +++ b/libraries/AP_Compass/AP_Compass.cpp @@ -1561,7 +1561,7 @@ void Compass::probe_dronecan_compasses(void) } // We have found a replacement mag, let's replace the existing one // with this by setting the priority to zero and calling uavcan probe - gcs().send_text(MAV_SEVERITY_ALERT, "Mag: Compass #%d with DEVID %lu replaced", uint8_t(i), (unsigned long)_priority_did_list[i]); + GCS_SEND_TEXT(MAV_SEVERITY_ALERT, "Mag: Compass #%d with DEVID %lu replaced", uint8_t(i), (unsigned long)_priority_did_list[i]); _priority_did_stored_list[i].set_and_save(0); _priority_did_list[i] = 0; diff --git a/libraries/AP_Compass/AP_Compass.h b/libraries/AP_Compass/AP_Compass.h index f08a63e81c..fe1a66ad7e 100644 --- a/libraries/AP_Compass/AP_Compass.h +++ b/libraries/AP_Compass/AP_Compass.h @@ -162,9 +162,6 @@ public: /// Return true if we have set a scale factor for a compass bool have_scale_factor(uint8_t i) const; - // compass calibrator interface - void cal_update(); - #if COMPASS_MOT_ENABLED // per-motor calibration access void per_motor_calibration_start(void) { @@ -178,6 +175,10 @@ public: } #endif +#if COMPASS_CAL_ENABLED + // compass calibrator interface + void cal_update(); + // start_calibration_all will only return false if there are no // compasses to calibrate. bool start_calibration_all(bool retry=false, bool autosave=false, float delay_sec=0.0f, bool autoreboot = false); @@ -187,9 +188,7 @@ public: bool compass_cal_requires_reboot() const { return _cal_requires_reboot; } bool is_calibrating() const; - // indicate which bit in LOG_BITMASK indicates we should log compass readings - void set_log_bit(uint32_t log_bit) { _log_bit = log_bit; } - +#if HAL_MAVLINK_BINDINGS_ENABLED /* handle an incoming MAG_CAL command */ @@ -197,6 +196,11 @@ public: bool send_mag_cal_progress(const class GCS_MAVLINK& link); bool send_mag_cal_report(const class GCS_MAVLINK& link); +#endif // HAL_MAVLINK_BINDINGS_ENABLED +#endif // COMPASS_CAL_ENABLED + + // indicate which bit in LOG_BITMASK indicates we should log compass readings + void set_log_bit(uint32_t log_bit) { _log_bit = log_bit; } // check if the compasses are pointing in the same direction bool consistent() const; @@ -391,6 +395,7 @@ private: void probe_dronecan_compasses(void); #endif +#if COMPASS_CAL_ENABLED // compass cal void _update_calibration_trampoline(); bool _accept_calibration(uint8_t i); @@ -401,8 +406,11 @@ private: bool _start_calibration(uint8_t i, bool retry=false, float delay_sec=0.0f); bool _start_calibration_mask(uint8_t mask, bool retry=false, bool autosave=false, float delay_sec=0.0f, bool autoreboot=false); bool _auto_reboot() const { return _compass_cal_autoreboot; } +#if HAL_MAVLINK_BINDINGS_ENABLED Priority next_cal_progress_idx[MAVLINK_COMM_NUM_BUFFERS]; Priority next_cal_report_idx[MAVLINK_COMM_NUM_BUFFERS]; +#endif +#endif // COMPASS_CAL_ENABLED // see if we already have probed a i2c driver by bus number and address bool _have_i2c_driver(uint8_t bus_num, uint8_t address) const; @@ -419,12 +427,12 @@ private: //keep track of which calibrators have been saved RestrictIDTypeArray _cal_saved; bool _cal_autosave; -#endif //autoreboot after compass calibration bool _compass_cal_autoreboot; bool _cal_requires_reboot; bool _cal_has_run; +#endif // COMPASS_CAL_ENABLED // enum of drivers for COMPASS_DISBLMSK enum DriverType { diff --git a/libraries/AP_Compass/AP_Compass_DroneCAN.cpp b/libraries/AP_Compass/AP_Compass_DroneCAN.cpp index e606fbec29..920a47a429 100644 --- a/libraries/AP_Compass/AP_Compass_DroneCAN.cpp +++ b/libraries/AP_Compass/AP_Compass_DroneCAN.cpp @@ -222,6 +222,7 @@ void AP_Compass_DroneCAN::handle_magnetic_field_hires(AP_DroneCAN *ap_dronecan, // @Field: My: y axis field // @Field: Mz: z axis field +#if HAL_LOGGING_ENABLED // just log it for now AP::logger().WriteStreaming("MAGH", "TimeUS,Node,Sensor,Bus,Mx,My,Mz", "s#-----", "F------", "QBBBfff", transfer.timestamp_usec, @@ -231,8 +232,9 @@ void AP_Compass_DroneCAN::handle_magnetic_field_hires(AP_DroneCAN *ap_dronecan, msg.magnetic_field_ga[0]*1000, msg.magnetic_field_ga[1]*1000, msg.magnetic_field_ga[2]*1000); +#endif // HAL_LOGGING_ENABLED } -#endif +#endif // AP_COMPASS_DRONECAN_HIRES_ENABLED void AP_Compass_DroneCAN::read(void) { diff --git a/libraries/AP_Compass/AP_Compass_IST8308.cpp b/libraries/AP_Compass/AP_Compass_IST8308.cpp index e1031a1960..722457dda3 100644 --- a/libraries/AP_Compass/AP_Compass_IST8308.cpp +++ b/libraries/AP_Compass/AP_Compass_IST8308.cpp @@ -168,7 +168,7 @@ bool AP_Compass_IST8308::init() set_dev_id(_instance, _dev->get_bus_id()); printf("%s found on bus %u id %u address 0x%02x\n", name, - _dev->bus_num(), _dev->get_bus_id(), _dev->get_bus_address()); + _dev->bus_num(), unsigned(_dev->get_bus_id()), _dev->get_bus_address()); set_rotation(_instance, _rotation); diff --git a/libraries/AP_Compass/AP_Compass_IST8310.cpp b/libraries/AP_Compass/AP_Compass_IST8310.cpp index c391ed5083..75c0ab8e17 100644 --- a/libraries/AP_Compass/AP_Compass_IST8310.cpp +++ b/libraries/AP_Compass/AP_Compass_IST8310.cpp @@ -178,7 +178,7 @@ bool AP_Compass_IST8310::init() set_dev_id(_instance, _dev->get_bus_id()); printf("%s found on bus %u id %u address 0x%02x\n", name, - _dev->bus_num(), _dev->get_bus_id(), _dev->get_bus_address()); + _dev->bus_num(), unsigned(_dev->get_bus_id()), _dev->get_bus_address()); set_rotation(_instance, _rotation); diff --git a/libraries/AP_Compass/AP_Compass_LIS3MDL.cpp b/libraries/AP_Compass/AP_Compass_LIS3MDL.cpp index 7c6efbb6b3..b43f0706e1 100644 --- a/libraries/AP_Compass/AP_Compass_LIS3MDL.cpp +++ b/libraries/AP_Compass/AP_Compass_LIS3MDL.cpp @@ -113,7 +113,7 @@ bool AP_Compass_LIS3MDL::init() } set_dev_id(compass_instance, dev->get_bus_id()); - printf("Found a LIS3MDL on 0x%x as compass %u\n", dev->get_bus_id(), compass_instance); + printf("Found a LIS3MDL on 0x%x as compass %u\n", unsigned(dev->get_bus_id()), compass_instance); set_rotation(compass_instance, rotation); diff --git a/libraries/AP_Compass/AP_Compass_MMC3416.cpp b/libraries/AP_Compass/AP_Compass_MMC3416.cpp index aab22e046a..f58b779e31 100644 --- a/libraries/AP_Compass/AP_Compass_MMC3416.cpp +++ b/libraries/AP_Compass/AP_Compass_MMC3416.cpp @@ -99,7 +99,7 @@ bool AP_Compass_MMC3416::init() set_dev_id(compass_instance, dev->get_bus_id()); - printf("Found a MMC3416 on 0x%x as compass %u\n", dev->get_bus_id(), compass_instance); + printf("Found a MMC3416 on 0x%x as compass %u\n", unsigned(dev->get_bus_id()), compass_instance); set_rotation(compass_instance, rotation); diff --git a/libraries/AP_Compass/AP_Compass_MMC5xx3.cpp b/libraries/AP_Compass/AP_Compass_MMC5xx3.cpp index fdde08bfca..2e6c1c0a88 100644 --- a/libraries/AP_Compass/AP_Compass_MMC5xx3.cpp +++ b/libraries/AP_Compass/AP_Compass_MMC5xx3.cpp @@ -115,7 +115,7 @@ bool AP_Compass_MMC5XX3::init() set_dev_id(compass_instance, dev->get_bus_id()); - printf("Found a MMC5983 on 0x%x as compass %u\n", dev->get_bus_id(), compass_instance); + printf("Found a MMC5983 on 0x%x as compass %u\n", unsigned(dev->get_bus_id()), compass_instance); set_rotation(compass_instance, rotation); diff --git a/libraries/AP_Compass/AP_Compass_QMC5883L.cpp b/libraries/AP_Compass/AP_Compass_QMC5883L.cpp index aabed388dc..5414cedb28 100644 --- a/libraries/AP_Compass/AP_Compass_QMC5883L.cpp +++ b/libraries/AP_Compass/AP_Compass_QMC5883L.cpp @@ -123,7 +123,7 @@ bool AP_Compass_QMC5883L::init() set_dev_id(_instance, _dev->get_bus_id()); printf("%s found on bus %u id %u address 0x%02x\n", name, - _dev->bus_num(), _dev->get_bus_id(), _dev->get_bus_address()); + _dev->bus_num(), unsigned(_dev->get_bus_id()), _dev->get_bus_address()); set_rotation(_instance, _rotation); diff --git a/libraries/AP_Compass/AP_Compass_QMC5883P.cpp b/libraries/AP_Compass/AP_Compass_QMC5883P.cpp index af8e6861ae..fb84afdd3e 100644 --- a/libraries/AP_Compass/AP_Compass_QMC5883P.cpp +++ b/libraries/AP_Compass/AP_Compass_QMC5883P.cpp @@ -134,7 +134,7 @@ bool AP_Compass_QMC5883P::init() set_dev_id(_instance, _dev->get_bus_id()); printf("%s found on bus %u id %u address 0x%02x\n", name, - _dev->bus_num(), _dev->get_bus_id(), _dev->get_bus_address()); + _dev->bus_num(), unsigned(_dev->get_bus_id()), _dev->get_bus_address()); set_rotation(_instance, _rotation); diff --git a/libraries/AP_Compass/CompassCalibrator.cpp b/libraries/AP_Compass/CompassCalibrator.cpp index 57a374987c..60dd68c2c0 100644 --- a/libraries/AP_Compass/CompassCalibrator.cpp +++ b/libraries/AP_Compass/CompassCalibrator.cpp @@ -138,9 +138,21 @@ void CompassCalibrator::new_sample(const Vector3f& sample) bool CompassCalibrator::failed() { WITH_SEMAPHORE(state_sem); - return (cal_state.status == Status::FAILED || - cal_state.status == Status::BAD_ORIENTATION || - cal_state.status == Status::BAD_RADIUS); + switch (cal_state.status) { + case Status::FAILED: + case Status::BAD_ORIENTATION: + case Status::BAD_RADIUS: + return true; + case Status::SUCCESS: + case Status::NOT_STARTED: + case Status::WAITING_TO_START: + case Status::RUNNING_STEP_ONE: + case Status::RUNNING_STEP_TWO: + return false; + } + + // compiler guarantees we don't get here + return true; } @@ -461,10 +473,10 @@ bool CompassCalibrator::set_status(CompassCalibrator::Status status) _status = status; return true; - - default: - return false; }; + + // compiler guarantees we don't get here + return false; } bool CompassCalibrator::fit_acceptable() const @@ -1065,14 +1077,15 @@ bool CompassCalibrator::calculate_orientation(void) */ bool CompassCalibrator::fix_radius(void) { - if (AP::gps().status() < AP_GPS::GPS_OK_FIX_2D) { + Location loc; + if (!AP::ahrs().get_location(loc) && !AP::ahrs().get_origin(loc)) { + GCS_SEND_TEXT(MAV_SEVERITY_WARNING, "MagCal: No location, fix_radius skipped"); // we don't have a position, leave scale factor as 0. This // will disable use of WMM in the EKF. Users can manually set // scale factor after calibration if it is known _params.scale_factor = 0; return true; } - const Location &loc = AP::gps().location(); float intensity; float declination; float inclination; diff --git a/libraries/AP_Compass/CompassCalibrator.h b/libraries/AP_Compass/CompassCalibrator.h index 3b58159f34..896d8c9a76 100644 --- a/libraries/AP_Compass/CompassCalibrator.h +++ b/libraries/AP_Compass/CompassCalibrator.h @@ -34,7 +34,8 @@ public: // update the state machine and calculate offsets, diagonals and offdiagonals void update(); - // compass calibration states + // compass calibration states - these correspond to the mavlink + // MAG_CAL_STATUS enumeration enum class Status { NOT_STARTED = 0, WAITING_TO_START = 1, diff --git a/libraries/AP_DAL/AP_DAL.cpp b/libraries/AP_DAL/AP_DAL.cpp index 25967843eb..779bb88b1f 100644 --- a/libraries/AP_DAL/AP_DAL.cpp +++ b/libraries/AP_DAL/AP_DAL.cpp @@ -90,9 +90,11 @@ void AP_DAL::start_frame(AP_DAL::FrameType frametype) if (_airspeed) { _airspeed->start_frame(); } +#if AP_RANGEFINDER_ENABLED if (_rangefinder) { _rangefinder->start_frame(); } +#endif #if AP_BEACON_ENABLED if (_beacon) { _beacon->start_frame(); @@ -134,10 +136,12 @@ void AP_DAL::init_sensors(void) at the time we startup the EKF */ +#if AP_RANGEFINDER_ENABLED auto *rng = AP::rangefinder(); if (rng && rng->num_sensors() > 0) { alloc_failed |= (_rangefinder = NEW_NOTHROW AP_DAL_RangeFinder) == nullptr; } +#endif #if AP_AIRSPEED_ENABLED auto *aspeed = AP::airspeed(); diff --git a/libraries/AP_DAL/AP_DAL.h b/libraries/AP_DAL/AP_DAL.h index 099f644e56..14a348ea61 100644 --- a/libraries/AP_DAL/AP_DAL.h +++ b/libraries/AP_DAL/AP_DAL.h @@ -131,9 +131,12 @@ public: AP_DAL_Baro &baro() { return _baro; } AP_DAL_GPS &gps() { return _gps; } +#if AP_RANGEFINDER_ENABLED AP_DAL_RangeFinder *rangefinder() { return _rangefinder; } +#endif + AP_DAL_Airspeed *airspeed() { return _airspeed; } @@ -261,16 +264,20 @@ public: } void handle_message(const log_RRNH &msg) { +#if AP_RANGEFINDER_ENABLED if (_rangefinder == nullptr) { _rangefinder = NEW_NOTHROW AP_DAL_RangeFinder; } _rangefinder->handle_message(msg); +#endif } void handle_message(const log_RRNI &msg) { +#if AP_RANGEFINDER_ENABLED if (_rangefinder == nullptr) { _rangefinder = NEW_NOTHROW AP_DAL_RangeFinder; } _rangefinder->handle_message(msg); +#endif } void handle_message(const log_RGPH &msg) { @@ -358,7 +365,9 @@ private: AP_DAL_InertialSensor _ins; AP_DAL_Baro _baro; AP_DAL_GPS _gps; +#if AP_RANGEFINDER_ENABLED AP_DAL_RangeFinder *_rangefinder; +#endif AP_DAL_Compass _compass; AP_DAL_Airspeed *_airspeed; #if AP_BEACON_ENABLED diff --git a/libraries/AP_DAL/AP_DAL_InertialSensor.cpp b/libraries/AP_DAL/AP_DAL_InertialSensor.cpp index 136e905f52..6d0425a2aa 100644 --- a/libraries/AP_DAL/AP_DAL_InertialSensor.cpp +++ b/libraries/AP_DAL/AP_DAL_InertialSensor.cpp @@ -18,9 +18,9 @@ void AP_DAL_InertialSensor::start_frame() const log_RISH old_RISH = _RISH; _RISH.loop_rate_hz = ins.get_loop_rate_hz(); - _RISH.primary_gyro = ins.get_primary_gyro(); + _RISH.first_usable_gyro = ins.get_first_usable_gyro(); _RISH.loop_delta_t = ins.get_loop_delta_t(); - _RISH.primary_accel = ins.get_primary_accel(); + _RISH.first_usable_accel = ins.get_first_usable_accel(); _RISH.accel_count = ins.get_accel_count(); _RISH.gyro_count = ins.get_gyro_count(); WRITE_REPLAY_BLOCK_IFCHANGED(RISH, _RISH, old_RISH); diff --git a/libraries/AP_DAL/AP_DAL_InertialSensor.h b/libraries/AP_DAL/AP_DAL_InertialSensor.h index aa0943b2b7..44361e99bd 100644 --- a/libraries/AP_DAL/AP_DAL_InertialSensor.h +++ b/libraries/AP_DAL/AP_DAL_InertialSensor.h @@ -18,7 +18,7 @@ public: // accel stuff uint8_t get_accel_count(void) const { return _RISH.accel_count; } - uint8_t get_primary_accel(void) const { return _RISH.primary_accel; }; + uint8_t get_first_usable_accel(void) const { return _RISH.first_usable_accel; }; bool use_accel(uint8_t instance) const { return _RISI[instance].use_accel; } const Vector3f &get_accel(uint8_t i) const { return accel_filtered[i]; } @@ -30,7 +30,7 @@ public: // gyro stuff uint8_t get_gyro_count(void) const { return _RISH.gyro_count; } - uint8_t get_primary_gyro(void) const { return _RISH.primary_gyro; }; + uint8_t get_first_usable_gyro(void) const { return _RISH.first_usable_gyro; }; bool use_gyro(uint8_t instance) const { return _RISI[instance].use_gyro; } const Vector3f &get_gyro(uint8_t i) const { return gyro_filtered[i]; } diff --git a/libraries/AP_DAL/AP_DAL_RangeFinder.cpp b/libraries/AP_DAL/AP_DAL_RangeFinder.cpp index 803c8b629b..9603a2d394 100644 --- a/libraries/AP_DAL/AP_DAL_RangeFinder.cpp +++ b/libraries/AP_DAL/AP_DAL_RangeFinder.cpp @@ -3,6 +3,9 @@ #include #include + +#if AP_RANGEFINDER_ENABLED + #include "AP_DAL.h" #include #include @@ -146,3 +149,5 @@ void AP_DAL_RangeFinder::handle_message(const log_RRNI &msg) } } } + +#endif // AP_RANGEFINDER_ENABLED diff --git a/libraries/AP_DAL/AP_DAL_RangeFinder.h b/libraries/AP_DAL/AP_DAL_RangeFinder.h index 47a4d14ef9..5bb60392cb 100644 --- a/libraries/AP_DAL/AP_DAL_RangeFinder.h +++ b/libraries/AP_DAL/AP_DAL_RangeFinder.h @@ -2,6 +2,8 @@ #include +#if AP_RANGEFINDER_ENABLED + #include class AP_RangeFinder_Backend; @@ -68,3 +70,5 @@ private: struct log_RRNI &_RRNI; }; + +#endif // AP_RANGEFINDER_ENABLED diff --git a/libraries/AP_DAL/LogStructure.h b/libraries/AP_DAL/LogStructure.h index 14942768f3..873251c7dd 100644 --- a/libraries/AP_DAL/LogStructure.h +++ b/libraries/AP_DAL/LogStructure.h @@ -76,8 +76,8 @@ struct log_RFRN { // Replay Data Structure - Inertial Sensor header struct log_RISH { uint16_t loop_rate_hz; - uint8_t primary_gyro; - uint8_t primary_accel; + uint8_t first_usable_gyro; + uint8_t first_usable_accel; float loop_delta_t; uint8_t accel_count; uint8_t gyro_count; diff --git a/libraries/AP_DDS/AP_DDS_Client.cpp b/libraries/AP_DDS/AP_DDS_Client.cpp index b3d58306ba..eb54a54eff 100644 --- a/libraries/AP_DDS/AP_DDS_Client.cpp +++ b/libraries/AP_DDS/AP_DDS_Client.cpp @@ -74,6 +74,14 @@ const AP_Param::GroupInfo AP_DDS_Client::var_info[] { #endif + // @Param: _DOMAIN_ID + // @DisplayName: DDS DOMAIN ID + // @Description: Set the ROS_DOMAIN_ID + // @Range: 0 232 + // @RebootRequired: True + // @User: Standard + AP_GROUPINFO("_DOMAIN_ID", 4, AP_DDS_Client, domain_id, 0), + AP_GROUPEND }; @@ -299,8 +307,11 @@ void AP_DDS_Client::update_topic(sensor_msgs_msg_BatteryState& msg, const uint8_ msg.power_supply_technology = 0; //POWER_SUPPLY_TECHNOLOGY_UNKNOWN if (battery.has_cell_voltages(instance)) { - const uint16_t* cellVoltages = battery.get_cell_voltages(instance).cells; - std::copy(cellVoltages, cellVoltages + AP_BATT_MONITOR_CELLS_MAX, msg.cell_voltage); + const auto &cells = battery.get_cell_voltages(instance); + const uint8_t ncells_max = MIN(ARRAY_SIZE(msg.cell_voltage), ARRAY_SIZE(cells.cells)); + for (uint8_t i=0; i< ncells_max; i++) { + msg.cell_voltage[i] = cells.cells[i] * 0.001; + } } } @@ -816,9 +827,8 @@ bool AP_DDS_Client::create() .type = UXR_PARTICIPANT_ID }; const char* participant_name = "ardupilot_dds"; - const uint16_t domain_id = 0; const auto participant_req_id = uxr_buffer_create_participant_bin(&session, reliable_out, participant_id, - domain_id, participant_name, UXR_REPLACE); + static_cast(domain_id), participant_name, UXR_REPLACE); //Participant requests constexpr uint8_t nRequestsParticipant = 1; diff --git a/libraries/AP_DDS/AP_DDS_Client.h b/libraries/AP_DDS/AP_DDS_Client.h index e796b78edb..ac11e53e57 100644 --- a/libraries/AP_DDS/AP_DDS_Client.h +++ b/libraries/AP_DDS/AP_DDS_Client.h @@ -213,6 +213,9 @@ public: //! @brief Parameter storage static const struct AP_Param::GroupInfo var_info[]; + //! @brief ROS_DOMAIN_ID + AP_Int32 domain_id; + //! @brief Enum used to mark a topic as a data reader or writer enum class Topic_rw : uint8_t { DataReader = 0, diff --git a/libraries/AP_DroneCAN/AP_DroneCAN.cpp b/libraries/AP_DroneCAN/AP_DroneCAN.cpp index 986f0f7600..ee2dfe2eba 100644 --- a/libraries/AP_DroneCAN/AP_DroneCAN.cpp +++ b/libraries/AP_DroneCAN/AP_DroneCAN.cpp @@ -84,6 +84,10 @@ extern const AP_HAL::HAL& hal; #define AP_DRONECAN_VOLZ_FEEDBACK_ENABLED 0 #endif +#ifndef AP_DRONECAN_DEFAULT_NODE +#define AP_DRONECAN_DEFAULT_NODE 10 +#endif + #define AP_DRONECAN_GETSET_TIMEOUT_MS 100 // timeout waiting for response from node after 0.1 sec #define debug_dronecan(level_debug, fmt, args...) do { AP::can().log_text(level_debug, "DroneCAN", fmt, ##args); } while (0) @@ -96,11 +100,11 @@ extern const AP_HAL::HAL& hal; // table of user settable CAN bus parameters const AP_Param::GroupInfo AP_DroneCAN::var_info[] = { // @Param: NODE - // @DisplayName: DroneCAN node that is used for this network - // @Description: DroneCAN node should be set implicitly - // @Range: 1 250 + // @DisplayName: Own node ID + // @Description: DroneCAN node ID used by the driver itself on this network + // @Range: 1 125 // @User: Advanced - AP_GROUPINFO("NODE", 1, AP_DroneCAN, _dronecan_node, 10), + AP_GROUPINFO("NODE", 1, AP_DroneCAN, _dronecan_node, AP_DRONECAN_DEFAULT_NODE), // @Param: SRV_BM // @DisplayName: Output channels to be transmitted as servo over DroneCAN @@ -326,6 +330,11 @@ void AP_DroneCAN::init(uint8_t driver_index, bool enable_filters) debug_dronecan(AP_CANManager::LOG_ERROR, "DroneCAN: init called more than once\n\r"); return; } + uint8_t node = _dronecan_node; + if (node < 1 || node > 125) { // reset to default if invalid + _dronecan_node.set(AP_DRONECAN_DEFAULT_NODE); + node = AP_DRONECAN_DEFAULT_NODE; + } node_info_rsp.name.len = hal.util->snprintf((char*)node_info_rsp.name.data, sizeof(node_info_rsp.name.data), "org.ardupilot:%u", driver_index); @@ -348,16 +357,16 @@ void AP_DroneCAN::init(uint8_t driver_index, bool enable_filters) debug_dronecan(AP_CANManager::LOG_ERROR, "DroneCAN: Failed to allocate memory pool\n\r"); return; } - canard_iface.init(mem_pool, (_pool_size/sizeof(uint32_t))*sizeof(uint32_t), _dronecan_node); + canard_iface.init(mem_pool, (_pool_size/sizeof(uint32_t))*sizeof(uint32_t), node); if (!hal.util->get_system_id_unformatted(unique_id, uid_len)) { return; } - unique_id[uid_len - 1] += _dronecan_node; + unique_id[uid_len - 1] += node; memcpy(node_info_rsp.hardware_version.unique_id, unique_id, uid_len); //Start Servers - if (!_dna_server.init(unique_id, uid_len, _dronecan_node)) { + if (!_dna_server.init(unique_id, uid_len, node)) { debug_dronecan(AP_CANManager::LOG_ERROR, "DroneCAN: Failed to start DNA Server\n\r"); return; } @@ -1438,16 +1447,51 @@ void AP_DroneCAN::handle_ESC_status(const CanardRxTransfer& transfer, const uavc .temperature_cdeg = int16_t((KELVIN_TO_C(msg.temperature)) * 100), .voltage = msg.voltage, .current = msg.current, +#if AP_EXTENDED_ESC_TELEM_ENABLED + .power_percentage = msg.power_rating_pct, +#endif }; update_rpm(esc_index, msg.rpm, msg.error_count); update_telem_data(esc_index, t, (isnan(msg.current) ? 0 : AP_ESC_Telem_Backend::TelemetryType::CURRENT) | (isnan(msg.voltage) ? 0 : AP_ESC_Telem_Backend::TelemetryType::VOLTAGE) - | (isnan(msg.temperature) ? 0 : AP_ESC_Telem_Backend::TelemetryType::TEMPERATURE)); + | (isnan(msg.temperature) ? 0 : AP_ESC_Telem_Backend::TelemetryType::TEMPERATURE) +#if AP_EXTENDED_ESC_TELEM_ENABLED + | AP_ESC_Telem_Backend::TelemetryType::POWER_PERCENTAGE #endif + ); +#endif // HAL_WITH_ESC_TELEM } +#if AP_EXTENDED_ESC_TELEM_ENABLED +/* + handle Extended ESC status message + */ +void AP_DroneCAN::handle_esc_ext_status(const CanardRxTransfer& transfer, const uavcan_equipment_esc_StatusExtended& msg) +{ + const uint8_t esc_offset = constrain_int16(_esc_offset.get(), 0, DRONECAN_SRV_NUMBER); + const uint8_t esc_index = msg.esc_index + esc_offset; + + if (!is_esc_data_index_valid(esc_index)) { + return; + } + + TelemetryData telemetryData { + .motor_temp_cdeg = (int16_t)(msg.motor_temperature_degC * 100), + .input_duty = msg.input_pct, + .output_duty = msg.output_pct, + .flags = msg.status_flags, + }; + + update_telem_data(esc_index, telemetryData, + AP_ESC_Telem_Backend::TelemetryType::MOTOR_TEMPERATURE + | AP_ESC_Telem_Backend::TelemetryType::INPUT_DUTY + | AP_ESC_Telem_Backend::TelemetryType::OUTPUT_DUTY + | AP_ESC_Telem_Backend::TelemetryType::FLAGS); +} +#endif // AP_EXTENDED_ESC_TELEM_ENABLED + bool AP_DroneCAN::is_esc_data_index_valid(const uint8_t index) { if (index > DRONECAN_SRV_NUMBER) { // printf("DroneCAN: invalid esc index: %d. max index allowed: %d\n\r", index, DRONECAN_SRV_NUMBER); diff --git a/libraries/AP_DroneCAN/AP_DroneCAN.h b/libraries/AP_DroneCAN/AP_DroneCAN.h index 8b37c2528b..b5527fb594 100644 --- a/libraries/AP_DroneCAN/AP_DroneCAN.h +++ b/libraries/AP_DroneCAN/AP_DroneCAN.h @@ -326,6 +326,11 @@ private: Canard::ObjCallback esc_status_cb{this, &AP_DroneCAN::handle_ESC_status}; Canard::Subscriber esc_status_listener{esc_status_cb, _driver_index}; +#if AP_EXTENDED_ESC_TELEM_ENABLED + Canard::ObjCallback esc_status_extended_cb{this, &AP_DroneCAN::handle_esc_ext_status}; + Canard::Subscriber esc_status_extended_listener{esc_status_extended_cb, _driver_index}; +#endif + Canard::ObjCallback debug_cb{this, &AP_DroneCAN::handle_debug}; Canard::Subscriber debug_listener{debug_cb, _driver_index}; @@ -387,6 +392,9 @@ private: void handle_actuator_status(const CanardRxTransfer& transfer, const uavcan_equipment_actuator_Status& msg); void handle_actuator_status_Volz(const CanardRxTransfer& transfer, const com_volz_servo_ActuatorStatus& msg); void handle_ESC_status(const CanardRxTransfer& transfer, const uavcan_equipment_esc_Status& msg); +#if AP_EXTENDED_ESC_TELEM_ENABLED + void handle_esc_ext_status(const CanardRxTransfer& transfer, const uavcan_equipment_esc_StatusExtended& msg); +#endif static bool is_esc_data_index_valid(const uint8_t index); void handle_debug(const CanardRxTransfer& transfer, const uavcan_protocol_debug_LogMessage& msg); void handle_param_get_set_response(const CanardRxTransfer& transfer, const uavcan_protocol_param_GetSetResponse& rsp); diff --git a/libraries/AP_DroneCAN/AP_DroneCAN_DNA_Server.cpp b/libraries/AP_DroneCAN/AP_DroneCAN_DNA_Server.cpp index 12262859c5..c36693ef43 100644 --- a/libraries/AP_DroneCAN/AP_DroneCAN_DNA_Server.cpp +++ b/libraries/AP_DroneCAN/AP_DroneCAN_DNA_Server.cpp @@ -1,4 +1,3 @@ - /* * This file is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -30,24 +29,31 @@ #include extern const AP_HAL::HAL& hal; +// FORMAT REVISION DREAMS (things to address if the nodedata needs to be changed substantially) +// * have DNA server accept only a 16 byte local UID to avoid overhead from variable sized hash +// * have a real empty flag for entries and/or use a CRC which is not zero for an input of all zeros + #define NODEDATA_MAGIC 0xAC01 -#define NODEDATA_MAGIC_LEN 2 +#define NODEDATA_MAGIC_LEN 2 // uint16_t #define MAX_NODE_ID 125 +#define NODEDATA_LOC(node_id) ((node_id * sizeof(struct NodeData)) + NODEDATA_MAGIC_LEN) #define debug_dronecan(level_debug, fmt, args...) do { AP::can().log_text(level_debug, "DroneCAN", fmt, ##args); } while (0) +// database is currently shared by all DNA servers +AP_DroneCAN_DNA_Server::Database AP_DroneCAN_DNA_Server::db; + AP_DroneCAN_DNA_Server::AP_DroneCAN_DNA_Server(AP_DroneCAN &ap_dronecan, CanardInterface &canard_iface, uint8_t driver_index) : _ap_dronecan(ap_dronecan), _canard_iface(canard_iface), storage(StorageManager::StorageCANDNA), allocation_sub(allocation_cb, driver_index), node_status_sub(node_status_cb, driver_index), - node_info_client(_canard_iface, node_info_cb) -{} + node_info_client(_canard_iface, node_info_cb) {} /* Method to generate 6byte hash from the Unique ID. We return it packed inside the referenced NodeData structure */ -void AP_DroneCAN_DNA_Server::getHash(NodeData &node_data, const uint8_t unique_id[], uint8_t size) const +void AP_DroneCAN_DNA_Server::Database::getHash(NodeData &node_data, const uint8_t unique_id[], uint8_t size) const { uint64_t hash = FNV_1_OFFSET_BASIS_64; hash_fnv_1a(size, unique_id, &hash); @@ -62,52 +68,31 @@ void AP_DroneCAN_DNA_Server::getHash(NodeData &node_data, const uint8_t unique_i } //Read Node Data from Storage Region -bool AP_DroneCAN_DNA_Server::readNodeData(NodeData &data, uint8_t node_id) +void AP_DroneCAN_DNA_Server::Database::readNodeData(NodeData &data, uint8_t node_id) { if (node_id > MAX_NODE_ID) { - return false; + return; } - WITH_SEMAPHORE(storage_sem); - if (!storage.read_block(&data, (node_id * sizeof(struct NodeData)) + NODEDATA_MAGIC_LEN, sizeof(struct NodeData))) { - //This will fall through to Prearm Check - server_state = STORAGE_FAILURE; - return false; - } - return true; + + storage->read_block(&data, NODEDATA_LOC(node_id), sizeof(struct NodeData)); } //Write Node Data to Storage Region -bool AP_DroneCAN_DNA_Server::writeNodeData(const NodeData &data, uint8_t node_id) +void AP_DroneCAN_DNA_Server::Database::writeNodeData(const NodeData &data, uint8_t node_id) { if (node_id > MAX_NODE_ID) { - return false; + return; } - WITH_SEMAPHORE(storage_sem); - if (!storage.write_block((node_id * sizeof(struct NodeData)) + NODEDATA_MAGIC_LEN, - &data, sizeof(struct NodeData))) { - server_state = STORAGE_FAILURE; - return false; - } - return true; -} -/* Set Occupation Mask, handy for keeping track of all node ids that -are allocated and all that are available. */ -bool AP_DroneCAN_DNA_Server::setOccupationMask(uint8_t node_id) -{ - if (node_id > MAX_NODE_ID) { - return false; - } - occupation_mask.set(node_id); - return true; + storage->write_block(NODEDATA_LOC(node_id), &data, sizeof(struct NodeData)); } /* Remove Node Data from Server Record in Storage, and also clear Occupation Mask */ -bool AP_DroneCAN_DNA_Server::freeNodeID(uint8_t node_id) +void AP_DroneCAN_DNA_Server::Database::freeNodeID(uint8_t node_id) { if (node_id > MAX_NODE_ID) { - return false; + return; } struct NodeData node_data; @@ -117,69 +102,31 @@ bool AP_DroneCAN_DNA_Server::freeNodeID(uint8_t node_id) writeNodeData(node_data, node_id); //Clear Occupation Mask - occupation_mask.clear(node_id); - - return true; -} - -/* Sets the verification mask. This is to be called, once -The Seen Node has been both registered and verified against the -Server Records. */ -void AP_DroneCAN_DNA_Server::setVerificationMask(uint8_t node_id) -{ - if (node_id > MAX_NODE_ID) { - return; - } - verified_mask.set(node_id); -} - -/* Checks if the NodeID is occupied, i.e. its recorded -in the Server Records against a unique ID */ -bool AP_DroneCAN_DNA_Server::isNodeIDOccupied(uint8_t node_id) const -{ - if (node_id > MAX_NODE_ID) { - return false; - } - return occupation_mask.get(node_id); -} - -/* Checks if NodeID is verified, i.e. the unique id in -Storage Records matches the one provided by Device with this node id. */ -bool AP_DroneCAN_DNA_Server::isNodeIDVerified(uint8_t node_id) const -{ - if (node_id > MAX_NODE_ID) { - return false; - } - return verified_mask.get(node_id); + node_storage_occupied.clear(node_id); } /* Go through Server Records, and fetch node id that matches the provided Unique IDs hash. -Returns 255 if no Node ID was detected */ -uint8_t AP_DroneCAN_DNA_Server::getNodeIDForUniqueID(const uint8_t unique_id[], uint8_t size) +Returns 0 if no Node ID was detected */ +uint8_t AP_DroneCAN_DNA_Server::Database::getNodeIDForUniqueID(const uint8_t unique_id[], uint8_t size) { - uint8_t node_id = 255; NodeData node_data, cmp_node_data; getHash(cmp_node_data, unique_id, size); - for (int i = MAX_NODE_ID; i >= 0; i--) { - if (!isNodeIDOccupied(i)) { // No point in checking NodeID that's not taken - continue; - } - if (!readNodeData(node_data, i)) { - break; //Storage module has failed, report that as no NodeID detected - } - if (memcmp(node_data.hwid_hash, cmp_node_data.hwid_hash, sizeof(NodeData::hwid_hash)) == 0) { - node_id = i; - break; + for (int i = MAX_NODE_ID; i > 0; i--) { + if (node_storage_occupied.get(i)) { + readNodeData(node_data, i); + if (memcmp(node_data.hwid_hash, cmp_node_data.hwid_hash, sizeof(NodeData::hwid_hash)) == 0) { + return i; // node ID found + } } } - return node_id; + return 0; // not found } /* Hash the Unique ID and add it to the Server Record for specified Node ID. */ -bool AP_DroneCAN_DNA_Server::addNodeIDForUniqueID(uint8_t node_id, const uint8_t unique_id[], uint8_t size) +void AP_DroneCAN_DNA_Server::Database::addNodeIDForUniqueID(uint8_t node_id, const uint8_t unique_id[], uint8_t size) { NodeData node_data; getHash(node_data, unique_id, size); @@ -187,28 +134,51 @@ bool AP_DroneCAN_DNA_Server::addNodeIDForUniqueID(uint8_t node_id, const uint8_t node_data.crc = crc_crc8(node_data.hwid_hash, sizeof(node_data.hwid_hash)); //Write Data to the records - if (!writeNodeData(node_data, node_id)) { - server_state = FAILED_TO_ADD_NODE; - fault_node_id = node_id; - return false; - } + writeNodeData(node_data, node_id); - setOccupationMask(node_id); - return true; + node_storage_occupied.set(node_id); } //Checks if a valid Server Record is present for specified Node ID -bool AP_DroneCAN_DNA_Server::isValidNodeDataAvailable(uint8_t node_id) +bool AP_DroneCAN_DNA_Server::Database::isValidNodeDataAvailable(uint8_t node_id) { NodeData node_data; readNodeData(node_data, node_id); + + uint8_t empty_hwid[sizeof(NodeData::hwid_hash)] = {0}; uint8_t crc = crc_crc8(node_data.hwid_hash, sizeof(node_data.hwid_hash)); - if (crc == node_data.crc && node_data.crc != 0) { + if (crc == node_data.crc && memcmp(&node_data.hwid_hash[0], &empty_hwid[0], sizeof(empty_hwid)) != 0) { return true; } return false; } +// initialize database (storage accessor is always replaced with the one supplied) +void AP_DroneCAN_DNA_Server::Database::init(StorageAccess *storage_) +{ + // storage size must be synced with StorageCANDNA entry in StorageManager.cpp + static_assert(NODEDATA_LOC(MAX_NODE_ID+1) <= 1024, "DNA storage too small"); + + // might be called from multiple threads if multiple servers use the same database + WITH_SEMAPHORE(sem); + + storage = storage_; // use supplied accessor + + // validate magic number + uint16_t magic = storage->read_uint16(0); + if (magic != NODEDATA_MAGIC) { + reset(); // re-initializing the database will put the magic back + } + + /* Go through our records and look for valid NodeData, to initialise + occupied status */ + for (uint8_t i = 1; i <= MAX_NODE_ID; i++) { + if (isValidNodeDataAvailable(i)) { + node_storage_occupied.set(i); + } + } +} + /* Initialises Publishers for respective UAVCAN Instance Also resets the Server Record in case there is a mismatch between specified node id and unique id against the existing @@ -217,48 +187,35 @@ bool AP_DroneCAN_DNA_Server::init(uint8_t own_unique_id[], uint8_t own_unique_id { //Read the details from AP_DroneCAN server_state = HEALTHY; - /* Go through our records and look for valid NodeData, to initialise - occupation mask */ - for (uint8_t i = 0; i <= MAX_NODE_ID; i++) { - if (isValidNodeDataAvailable(i)) { - occupation_mask.set(i); - } - } - // Check if the magic is present - uint16_t magic; - { - WITH_SEMAPHORE(storage_sem); - storage.read_block(&magic, 0, NODEDATA_MAGIC_LEN); - } - if (magic != NODEDATA_MAGIC) { - //Its not there a reset should write it in the Storage - reset(); - } + db.init(&storage); // initialize the database with our accessor + if (_ap_dronecan.check_and_reset_option(AP_DroneCAN::Options::DNA_CLEAR_DATABASE)) { GCS_SEND_TEXT(MAV_SEVERITY_INFO, "UC DNA database reset"); - reset(); + db.reset(); } + + db.initServer(node_id, own_unique_id, own_unique_id_len); + + /* Also add to seen node id this is to verify + if any duplicates are on the bus carrying our Node ID */ + node_seen.set(node_id); + node_verified.set(node_id); + node_healthy.set(node_id); + self_node_id = node_id; + return true; +} + +// handle initializing the server with the given expected node ID and unique ID +void AP_DroneCAN_DNA_Server::Database::initServer(uint8_t node_id, const uint8_t own_unique_id[], uint8_t own_unique_id_len) +{ + WITH_SEMAPHORE(sem); + // Making sure that the server is started with the same node ID const uint8_t stored_own_node_id = getNodeIDForUniqueID(own_unique_id, own_unique_id_len); static bool reset_done; - if (stored_own_node_id != 255) { - if (stored_own_node_id != node_id) { - /* We have a different node id recorded against our own unique id - This calls for a reset */ - if (!reset_done) { - /* ensure we only reset once per power cycle - else we will wipe own record on next init(s) */ - reset(); - reset_done = true; - } - //Add ourselves to the Server Record - if (!addNodeIDForUniqueID(node_id, own_unique_id, own_unique_id_len)) { - return false; - } - } - } else { - //We have no record of our own Unique ID do a reset + if (stored_own_node_id != node_id) { // cannot match if not found + // We have no matching record of our own Unique ID do a reset if (!reset_done) { /* ensure we only reset once per power cycle else we will wipe own record on next init(s) */ @@ -266,79 +223,56 @@ bool AP_DroneCAN_DNA_Server::init(uint8_t own_unique_id[], uint8_t own_unique_id reset_done = true; } //Add ourselves to the Server Record - if (!addNodeIDForUniqueID(node_id, own_unique_id, own_unique_id_len)) { - return false; - } + addNodeIDForUniqueID(node_id, own_unique_id, own_unique_id_len); } - /* Also add to seen node id this is to verify - if any duplicates are on the bus carrying our Node ID */ - addToSeenNodeMask(node_id); - setVerificationMask(node_id); - node_healthy_mask.set(node_id); - self_node_id = node_id; - return true; } //Reset the Server Records -void AP_DroneCAN_DNA_Server::reset() +void AP_DroneCAN_DNA_Server::Database::reset() { + WITH_SEMAPHORE(sem); + NodeData node_data; memset(&node_data, 0, sizeof(node_data)); - occupation_mask.clearall(); + node_storage_occupied.clearall(); //Just write empty Node Data to the Records + // ensure node ID 0 is cleared even if we can't use it so we know the state for (uint8_t i = 0; i <= MAX_NODE_ID; i++) { writeNodeData(node_data, i); } - WITH_SEMAPHORE(storage_sem); + //Ensure we mark magic at the end - uint16_t magic = NODEDATA_MAGIC; - storage.write_block(0, &magic, NODEDATA_MAGIC_LEN); + storage->write_uint16(0, NODEDATA_MAGIC); } /* Go through the Occupation mask for available Node ID based on pseudo code provided in uavcan/protocol/dynamic_node_id/1.Allocation.uavcan */ -uint8_t AP_DroneCAN_DNA_Server::findFreeNodeID(uint8_t preferred) +uint8_t AP_DroneCAN_DNA_Server::Database::findFreeNodeID(uint8_t preferred) { + if (preferred == 0) { + preferred = 125; + } // Search up - uint8_t candidate = (preferred > 0) ? preferred : 125; + uint8_t candidate = preferred; while (candidate <= 125) { - if (!isNodeIDOccupied(candidate)) { + if (!node_storage_occupied.get(candidate)) { return candidate; } candidate++; } //Search down - candidate = (preferred > 0) ? preferred : 125; + candidate = preferred; while (candidate > 0) { - if (!isNodeIDOccupied(candidate)) { + if (!node_storage_occupied.get(candidate)) { return candidate; } candidate--; } // Not found - return 255; -} - -//Check if we have received Node Status from this node_id -bool AP_DroneCAN_DNA_Server::isNodeSeen(uint8_t node_id) -{ - if (node_id > MAX_NODE_ID) { - return false; - } - return node_seen_mask.get(node_id); -} - -/* Set the Seen Node Mask, to be called when received -Node Status from the node id */ -void AP_DroneCAN_DNA_Server::addToSeenNodeMask(uint8_t node_id) -{ - if (node_id > MAX_NODE_ID) { - return; - } - node_seen_mask.set(node_id); + return 0; } /* Run through the list of seen node ids for verification no more @@ -356,7 +290,7 @@ void AP_DroneCAN_DNA_Server::verify_nodes() uint8_t log_count = AP::logger().get_log_start_count(); if (log_count != last_logging_count) { last_logging_count = log_count; - logged.clearall(); + node_logged.clearall(); } #endif @@ -371,12 +305,7 @@ void AP_DroneCAN_DNA_Server::verify_nodes() Reason for this could be either the node was disconnected Or a node with conflicting ID appeared and is sending response at the same time. */ - /* Only report if the node was verified, otherwise ignore - as this could be just Bootloader to Application transition. */ - if (isNodeIDVerified(curr_verifying_node)) { - // remove verification flag for this node - verified_mask.clear(curr_verifying_node); - } + node_verified.clear(curr_verifying_node); } last_verification_request = now; @@ -386,11 +315,11 @@ void AP_DroneCAN_DNA_Server::verify_nodes() if ((curr_verifying_node == self_node_id) || (curr_verifying_node == 0)) { continue; } - if (isNodeSeen(curr_verifying_node)) { + if (node_seen.get(curr_verifying_node)) { break; } } - if (isNodeIDOccupied(curr_verifying_node)) { + if (db.isOccupied(curr_verifying_node)) { uavcan_protocol_GetNodeInfoRequest request; node_info_client.request(curr_verifying_node, request); nodeInfo_resp_rcvd = false; @@ -411,20 +340,20 @@ void AP_DroneCAN_DNA_Server::handleNodeStatus(const CanardRxTransfer& transfer, //if node is not healthy or operational, clear resp health mask, and set fault_node_id fault_node_id = transfer.source_node_id; server_state = NODE_STATUS_UNHEALTHY; - node_healthy_mask.clear(transfer.source_node_id); + node_healthy.clear(transfer.source_node_id); } else { - node_healthy_mask.set(transfer.source_node_id); - if (node_healthy_mask == verified_mask) { + node_healthy.set(transfer.source_node_id); + if (node_healthy == node_verified) { server_state = HEALTHY; } } - if (!isNodeIDVerified(transfer.source_node_id)) { + if (!node_verified.get(transfer.source_node_id)) { //immediately begin verification of the node_id uavcan_protocol_GetNodeInfoRequest request; node_info_client.request(transfer.source_node_id, request); } //Add node to seen list if not seen before - addToSeenNodeMask(transfer.source_node_id); + node_seen.set(transfer.source_node_id); } /* Node Info message handler @@ -434,15 +363,15 @@ Or register if the node id is available and not recorded for the received Unique ID */ void AP_DroneCAN_DNA_Server::handleNodeInfo(const CanardRxTransfer& transfer, const uavcan_protocol_GetNodeInfoResponse& rsp) { - if (transfer.source_node_id > MAX_NODE_ID) { + if (transfer.source_node_id > MAX_NODE_ID || transfer.source_node_id == 0) { return; } /* if we haven't logged this node then log it now */ #if HAL_LOGGING_ENABLED - if (!logged.get(transfer.source_node_id) && AP::logger().logging_started()) { - logged.set(transfer.source_node_id); + if (!node_logged.get(transfer.source_node_id) && AP::logger().logging_started()) { + node_logged.set(transfer.source_node_id); uint64_t uid[2]; memcpy(uid, rsp.hardware_version.unique_id, sizeof(rsp.hardware_version.unique_id)); // @LoggerMessage: CAND @@ -469,35 +398,49 @@ void AP_DroneCAN_DNA_Server::handleNodeInfo(const CanardRxTransfer& transfer, co } #endif - if (isNodeIDOccupied(transfer.source_node_id)) { - //if node_id already registered, just verify if Unique ID matches as well - if (transfer.source_node_id == getNodeIDForUniqueID(rsp.hardware_version.unique_id, 16)) { - if (transfer.source_node_id == curr_verifying_node) { - nodeInfo_resp_rcvd = true; - } - setVerificationMask(transfer.source_node_id); - } else if (!_ap_dronecan.option_is_set(AP_DroneCAN::Options::DNA_IGNORE_DUPLICATE_NODE)) { + bool duplicate = db.handleNodeInfo(transfer.source_node_id, rsp.hardware_version.unique_id); + if (duplicate) { + if (!_ap_dronecan.option_is_set(AP_DroneCAN::Options::DNA_IGNORE_DUPLICATE_NODE)) { /* This is a device with node_id already registered for another device */ server_state = DUPLICATE_NODES; fault_node_id = transfer.source_node_id; memcpy(fault_node_name, rsp.name.data, sizeof(fault_node_name)); } + } else { + //Verify as well + node_verified.set(transfer.source_node_id); + if (transfer.source_node_id == curr_verifying_node) { + nodeInfo_resp_rcvd = true; + } + } +} + +// handle processing the node info message. returns true if duplicate. +bool AP_DroneCAN_DNA_Server::Database::handleNodeInfo(uint8_t source_node_id, const uint8_t unique_id[]) +{ + WITH_SEMAPHORE(sem); + + if (isOccupied(source_node_id)) { + //if node_id already registered, just verify if Unique ID matches as well + if (source_node_id == getNodeIDForUniqueID(unique_id, 16)) { + return false; + } else { + /* This is a device with node_id already registered + for another device */ + return true; + } } else { /* Node Id was not allocated by us, or during this boot, let's register this in our records Check if we allocated this Node before */ - uint8_t prev_node_id = getNodeIDForUniqueID(rsp.hardware_version.unique_id, 16); - if (prev_node_id != 255) { + uint8_t prev_node_id = getNodeIDForUniqueID(unique_id, 16); + if (prev_node_id != 0) { //yes we did, remove this registration freeNodeID(prev_node_id); } //add a new server record - addNodeIDForUniqueID(transfer.source_node_id, rsp.hardware_version.unique_id, 16); - //Verify as well - setVerificationMask(transfer.source_node_id); - if (transfer.source_node_id == curr_verifying_node) { - nodeInfo_resp_rcvd = true; - } + addNodeIDForUniqueID(source_node_id, unique_id, 16); + return false; } } @@ -559,19 +502,7 @@ void AP_DroneCAN_DNA_Server::handleAllocation(const CanardRxTransfer& transfer, if (rcvd_unique_id_offset == 16) { //We have received the full Unique ID, time to do allocation - uint8_t resp_node_id = getNodeIDForUniqueID((const uint8_t*)rcvd_unique_id, 16); - if (resp_node_id == 255) { - resp_node_id = findFreeNodeID(msg.node_id); - if (resp_node_id != 255) { - if (addNodeIDForUniqueID(resp_node_id, (const uint8_t*)rcvd_unique_id, 16)) { - rsp.node_id = resp_node_id; - } - } else { - GCS_SEND_TEXT(MAV_SEVERITY_ERROR, "UC Node Alloc Failed!"); - } - } else { - rsp.node_id = resp_node_id; - } + rsp.node_id = db.handleAllocation(msg.node_id, (const uint8_t*)rcvd_unique_id); //reset states as well rcvd_unique_id_offset = 0; memset(rcvd_unique_id, 0, sizeof(rcvd_unique_id)); @@ -580,16 +511,32 @@ void AP_DroneCAN_DNA_Server::handleAllocation(const CanardRxTransfer& transfer, allocation_pub.broadcast(rsp, false); // never publish allocation message with CAN FD } +// handle the allocation message. returns the new node ID. +uint8_t AP_DroneCAN_DNA_Server::Database::handleAllocation(uint8_t node_id, const uint8_t unique_id[]) +{ + WITH_SEMAPHORE(sem); + + uint8_t resp_node_id = getNodeIDForUniqueID(unique_id, 16); + if (resp_node_id == 0) { + resp_node_id = findFreeNodeID(node_id > MAX_NODE_ID ? 0 : node_id); + if (resp_node_id != 0) { + addNodeIDForUniqueID(resp_node_id, unique_id, 16); + return resp_node_id; + } else { + GCS_SEND_TEXT(MAV_SEVERITY_ERROR, "UC Node Alloc Failed!"); + return 0; + } + } else { + return resp_node_id; + } +} + //report the server state, along with failure message if any bool AP_DroneCAN_DNA_Server::prearm_check(char* fail_msg, uint8_t fail_msg_len) const { switch (server_state) { case HEALTHY: return true; - case STORAGE_FAILURE: { - snprintf(fail_msg, fail_msg_len, "Failed to access storage!"); - return false; - } case DUPLICATE_NODES: { if (_ap_dronecan.option_is_set(AP_DroneCAN::Options::DNA_IGNORE_DUPLICATE_NODE)) { // ignore error @@ -598,10 +545,6 @@ bool AP_DroneCAN_DNA_Server::prearm_check(char* fail_msg, uint8_t fail_msg_len) snprintf(fail_msg, fail_msg_len, "Duplicate Node %s../%d!", fault_node_name, fault_node_id); return false; } - case FAILED_TO_ADD_NODE: { - snprintf(fail_msg, fail_msg_len, "Failed to add Node %d!", fault_node_id); - return false; - } case NODE_STATUS_UNHEALTHY: { if (_ap_dronecan.option_is_set(AP_DroneCAN::Options::DNA_IGNORE_UNHEALTHY_NODE)) { // ignore error diff --git a/libraries/AP_DroneCAN/AP_DroneCAN_DNA_Server.h b/libraries/AP_DroneCAN/AP_DroneCAN_DNA_Server.h index ee58191e80..b6223cddf3 100644 --- a/libraries/AP_DroneCAN/AP_DroneCAN_DNA_Server.h +++ b/libraries/AP_DroneCAN/AP_DroneCAN_DNA_Server.h @@ -23,11 +23,67 @@ class AP_DroneCAN_DNA_Server uint8_t crc; }; + class Database { + public: + Database() {}; + + // initialize database (storage accessor is always replaced with the one supplied) + void init(StorageAccess *storage_); + + //Reset the Server Record + void reset(); + + // returns true if the given node ID is occupied (has valid stored data) + bool isOccupied(uint8_t node_id) { + return node_storage_occupied.get(node_id); + } + + // handle initializing the server with the given expected node ID and unique ID + void initServer(uint8_t node_id, const uint8_t own_unique_id[], uint8_t own_unique_id_len); + + // handle processing the node info message. returns true if duplicate. + bool handleNodeInfo(uint8_t source_node_id, const uint8_t unique_id[]); + + // handle the allocation message. returns the new node ID. + uint8_t handleAllocation(uint8_t node_id, const uint8_t unique_id[]); + + private: + //Generates 6Byte long hash from the specified unique_id + void getHash(NodeData &node_data, const uint8_t unique_id[], uint8_t size) const; + + //Methods to set, clear and report NodeIDs allocated/registered so far + void freeNodeID(uint8_t node_id); + + //Go through List to find node id for specified unique id + uint8_t getNodeIDForUniqueID(const uint8_t unique_id[], uint8_t size); + + //Add Node ID info to the record and setup necessary mask fields + void addNodeIDForUniqueID(uint8_t node_id, const uint8_t unique_id[], uint8_t size); + + //Finds next available free Node, starting from preferred NodeID + uint8_t findFreeNodeID(uint8_t preferred); + + //Look in the storage and check if there's a valid Server Record there + bool isValidNodeDataAvailable(uint8_t node_id); + + //Reads the Server Record from storage for specified node id + void readNodeData(NodeData &data, uint8_t node_id); + + //Writes the Server Record from storage for specified node id + void writeNodeData(const NodeData &data, uint8_t node_id); + + // bitmasks containing a status for each possible node ID (except 0 and > MAX_NODE_ID) + Bitmask<128> node_storage_occupied; // storage has a valid entry + + StorageAccess *storage; + HAL_Semaphore sem; + }; + + static Database db; + enum ServerState { NODE_STATUS_UNHEALTHY = -5, - STORAGE_FAILURE = -3, DUPLICATE_NODES = -2, - FAILED_TO_ADD_NODE = -1, HEALTHY = 0 }; @@ -36,11 +92,11 @@ class AP_DroneCAN_DNA_Server uint8_t self_node_id; bool nodeInfo_resp_rcvd; - Bitmask<128> occupation_mask; - Bitmask<128> verified_mask; - Bitmask<128> node_seen_mask; - Bitmask<128> logged; - Bitmask<128> node_healthy_mask; + // bitmasks containing a status for each possible node ID (except 0 and > MAX_NODE_ID) + Bitmask<128> node_verified; // node seen and unique ID matches stored + Bitmask<128> node_seen; // received NodeStatus + Bitmask<128> node_logged; // written to log fle + Bitmask<128> node_healthy; // reports healthy uint8_t last_logging_count; @@ -55,40 +111,6 @@ class AP_DroneCAN_DNA_Server uint8_t rcvd_unique_id_offset; uint32_t last_alloc_msg_ms; - //Methods to handle and report Node IDs seen on the bus - void addToSeenNodeMask(uint8_t node_id); - bool isNodeSeen(uint8_t node_id); - - //Generates 6Byte long hash from the specified unique_id - void getHash(NodeData &node_data, const uint8_t unique_id[], uint8_t size) const; - - //Reads the Server Record from storage for specified node id - bool readNodeData(NodeData &data, uint8_t node_id); - - //Writes the Server Record from storage for specified node id - bool writeNodeData(const NodeData &data, uint8_t node_id); - - //Methods to set, clear and report NodeIDs allocated/registered so far - bool setOccupationMask(uint8_t node_id); - bool isNodeIDOccupied(uint8_t node_id) const; - bool freeNodeID(uint8_t node_id); - - //Set the mask to report that the unique id matches the record - void setVerificationMask(uint8_t node_id); - - //Go through List to find node id for specified unique id - uint8_t getNodeIDForUniqueID(const uint8_t unique_id[], uint8_t size); - - //Add Node ID info to the record and setup necessary mask fields - bool addNodeIDForUniqueID(uint8_t node_id, const uint8_t unique_id[], uint8_t size); - - //Finds next available free Node, starting from preferred NodeID - uint8_t findFreeNodeID(uint8_t preferred); - - //Look in the storage and check if there's a valid Server Record there - bool isValidNodeDataAvailable(uint8_t node_id); - - HAL_Semaphore storage_sem; AP_DroneCAN &_ap_dronecan; CanardInterface &_canard_iface; @@ -113,15 +135,6 @@ public: //Initialises publisher and Server Record for specified uavcan driver bool init(uint8_t own_unique_id[], uint8_t own_unique_id_len, uint8_t node_id); - //Reset the Server Record - void reset(); - - /* Checks if the node id has been verified against the record - Specific CAN drivers are expected to check use this method to - verify if the node is healthy and has static node_id against - hwid in the records */ - bool isNodeIDVerified(uint8_t node_id) const; - /* Subscribe to the messages to be handled for maintaining and allocating Node ID list */ static void subscribe_msgs(AP_DroneCAN* ap_dronecan); diff --git a/libraries/AP_EFI/AP_EFI_DroneCAN.cpp b/libraries/AP_EFI/AP_EFI_DroneCAN.cpp index d917cb6599..90f33cac5d 100644 --- a/libraries/AP_EFI/AP_EFI_DroneCAN.cpp +++ b/libraries/AP_EFI/AP_EFI_DroneCAN.cpp @@ -151,6 +151,9 @@ void AP_EFI_DroneCAN::handle_status(const uavcan_equipment_ice_reciprocating_Sta c.lambda_coefficient = cs.lambda_coefficient; } + // Required for healthy message + istate.last_updated_ms = AP_HAL::millis(); + copy_to_frontend(); } diff --git a/libraries/AP_ESC_Telem/AP_ESC_Telem.cpp b/libraries/AP_ESC_Telem/AP_ESC_Telem.cpp index 9a3e34f842..96f7de74c5 100644 --- a/libraries/AP_ESC_Telem/AP_ESC_Telem.cpp +++ b/libraries/AP_ESC_Telem/AP_ESC_Telem.cpp @@ -120,6 +120,30 @@ uint32_t AP_ESC_Telem::get_active_esc_mask() const { return ret; } +// return an active ESC for the purposes of reporting (e.g. in the OSD) +uint8_t AP_ESC_Telem::get_max_rpm_esc() const +{ + uint32_t ret = 0; + float max_rpm = 0; + const uint32_t now = AP_HAL::millis(); + const uint32_t now_us = AP_HAL::micros(); + for (uint8_t i = 0; i < ESC_TELEM_MAX_ESCS; i++) { + if (_telem_data[i].last_update_ms == 0 && !was_rpm_data_ever_reported(_rpm_data[i])) { + // have never seen telem from this ESC + continue; + } + if (_telem_data[i].stale(now) + && !rpm_data_within_timeout(_rpm_data[i], now_us, ESC_RPM_DATA_TIMEOUT_US)) { + continue; + } + if (_rpm_data[i].rpm > max_rpm) { + max_rpm = _rpm_data[i].rpm; + ret = i; + } + } + return ret; +} + // return number of active ESCs present uint8_t AP_ESC_Telem::get_num_active_escs() const { uint32_t active = get_active_esc_mask(); @@ -238,13 +262,13 @@ bool AP_ESC_Telem::get_motor_temperature(uint8_t esc_index, int16_t& temp) const } // get the highest ESC temperature in centi-degrees if available, returns true if there is valid data for at least one ESC -bool AP_ESC_Telem::get_highest_motor_temperature(int16_t& temp) const +bool AP_ESC_Telem::get_highest_temperature(int16_t& temp) const { uint8_t valid_escs = 0; for (uint8_t i = 0; i < ESC_TELEM_MAX_ESCS; i++) { int16_t temp_temp; - if (get_motor_temperature(i, temp_temp)) { + if (get_temperature(i, temp_temp)) { temp = MAX(temp, temp_temp); valid_escs++; } @@ -468,6 +492,21 @@ void AP_ESC_Telem::update_telem_data(const uint8_t esc_index, const AP_ESC_Telem telemdata.usage_s = new_data.usage_s; } +#if AP_EXTENDED_ESC_TELEM_ENABLED + if (data_mask & AP_ESC_Telem_Backend::TelemetryType::INPUT_DUTY) { + _telem_data[esc_index].input_duty = new_data.input_duty; + } + if (data_mask & AP_ESC_Telem_Backend::TelemetryType::OUTPUT_DUTY) { + _telem_data[esc_index].output_duty = new_data.output_duty; + } + if (data_mask & AP_ESC_Telem_Backend::TelemetryType::FLAGS) { + _telem_data[esc_index].flags = new_data.flags; + } + if (data_mask & AP_ESC_Telem_Backend::TelemetryType::POWER_PERCENTAGE) { + _telem_data[esc_index].power_percentage = new_data.power_percentage; + } +#endif //AP_EXTENDED_ESC_TELEM_ENABLED + #if AP_EXTENDED_DSHOT_TELEM_V2_ENABLED if (data_mask & AP_ESC_Telem_Backend::TelemetryType::EDT2_STATUS) { telemdata.edt2_status = merge_edt2_status(telemdata.edt2_status, new_data.edt2_status); @@ -579,6 +618,10 @@ void AP_ESC_Telem::update() if (telemdata.last_update_ms != _last_telem_log_ms[i] || rpmdata.last_update_us != _last_rpm_log_us[i]) { + // Update last log timestamps + _last_telem_log_ms[i] = telemdata.last_update_ms; + _last_rpm_log_us[i] = rpmdata.last_update_us; + float rpm = AP::logger().quiet_nanf(); get_rpm(i, rpm); float raw_rpm = AP::logger().quiet_nanf(); @@ -607,8 +650,40 @@ void AP_ESC_Telem::update() error_rate : rpmdata.error_rate }; AP::logger().WriteBlock(&pkt, sizeof(pkt)); - _last_telem_log_ms[i] = telemdata.last_update_ms; - _last_rpm_log_us[i] = rpmdata.last_update_us; + +#if AP_EXTENDED_ESC_TELEM_ENABLED + // Write ESC extended status messages + // id: starts from 0 + // input duty: duty cycle input to the ESC in percent + // output duty: duty cycle output to the motor in percent + // status flags: manufacurer-specific status flags + const bool has_ext_data = telemdata.types & + (AP_ESC_Telem_Backend::TelemetryType::INPUT_DUTY | + AP_ESC_Telem_Backend::TelemetryType::OUTPUT_DUTY | + AP_ESC_Telem_Backend::TelemetryType::FLAGS | + AP_ESC_Telem_Backend::TelemetryType::POWER_PERCENTAGE); + if (has_ext_data) { + // @LoggerMessage: ESCX + // @Description: ESC extended telemetry data + // @Field: TimeUS: Time since system startup + // @Field: Instance: starts from 0 + // @Field: inpct: input duty cycle in percent + // @Field: outpct: output duty cycle in percent + // @Field: flags: manufacturer-specific status flags + // @Field: Pwr: Power percentage + AP::logger().WriteStreaming("ESCX", + "TimeUS,Instance,inpct,outpct,flags,Pwr", + "s" "#" "%" "%" "-" "%", + "F" "-" "-" "-" "-" "-", + "Q" "B" "B" "B" "I" "B", + AP_HAL::micros64(), + i, + telemdata.input_duty, + telemdata.output_duty, + telemdata.flags, + telemdata.power_percentage); + } +#endif //AP_EXTENDED_ESC_TELEM_ENABLED } #if AP_EXTENDED_DSHOT_TELEM_V2_ENABLED diff --git a/libraries/AP_ESC_Telem/AP_ESC_Telem.h b/libraries/AP_ESC_Telem/AP_ESC_Telem.h index 4c5d071991..e862f6bcec 100644 --- a/libraries/AP_ESC_Telem/AP_ESC_Telem.h +++ b/libraries/AP_ESC_Telem/AP_ESC_Telem.h @@ -7,7 +7,9 @@ #if HAL_WITH_ESC_TELEM -#define ESC_TELEM_MAX_ESCS NUM_SERVO_CHANNELS +#ifndef ESC_TELEM_MAX_ESCS + #define ESC_TELEM_MAX_ESCS NUM_SERVO_CHANNELS +#endif static_assert(ESC_TELEM_MAX_ESCS > 0, "Cannot have 0 ESC telemetry instances"); #define ESC_TELEM_DATA_TIMEOUT_MS 5000UL @@ -53,7 +55,7 @@ public: bool get_motor_temperature(uint8_t esc_index, int16_t& temp) const; // get the highest ESC temperature in centi-degrees if available, returns true if there is valid data for at least one ESC - bool get_highest_motor_temperature(int16_t& temp) const; + bool get_highest_temperature(int16_t& temp) const; // get an individual ESC's current in Ampere if available, returns true on success bool get_current(uint8_t esc_index, float& amps) const; @@ -83,6 +85,9 @@ public: // ESC_TELEM_DATA_TIMEOUT_MS uint32_t get_active_esc_mask() const; + // return an active ESC with the highest RPM for the purposes of reporting (e.g. in the OSD) + uint8_t get_max_rpm_esc() const; + // return the last time telemetry data was received in ms for the given ESC or 0 if never uint32_t get_last_telem_data_ms(uint8_t esc_index) const { if (esc_index >= ESC_TELEM_MAX_ESCS) {return 0;} diff --git a/libraries/AP_ESC_Telem/AP_ESC_Telem_Backend.h b/libraries/AP_ESC_Telem/AP_ESC_Telem_Backend.h index e46eb48ceb..0764cb79f0 100644 --- a/libraries/AP_ESC_Telem/AP_ESC_Telem_Backend.h +++ b/libraries/AP_ESC_Telem/AP_ESC_Telem_Backend.h @@ -23,6 +23,12 @@ public: uint16_t edt2_status; // status reported by Extended DShot Telemetry v2 uint16_t edt2_stress; // stress reported in dedicated messages by Extended DShot Telemetry v2 #endif +#if AP_EXTENDED_ESC_TELEM_ENABLED + uint8_t input_duty; // input duty cycle + uint8_t output_duty; // output duty cycle + uint32_t flags; // Status flags + uint8_t power_percentage; // Percentage of output power +#endif // AP_EXTENDED_ESC_TELEM_ENABLED // return true if the data is stale bool stale(uint32_t now_ms=0) const volatile; @@ -50,6 +56,12 @@ public: EDT2_STATUS = 1 << 8, EDT2_STRESS = 1 << 9, #endif +#if AP_EXTENDED_ESC_TELEM_ENABLED + INPUT_DUTY = 1 << 10, + OUTPUT_DUTY = 1 << 11, + FLAGS = 1 << 12, + POWER_PERCENTAGE = 1 << 13, +#endif // AP_EXTENDED_ESC_TELEM_ENABLED }; diff --git a/libraries/AP_ESC_Telem/AP_ESC_Telem_config.h b/libraries/AP_ESC_Telem/AP_ESC_Telem_config.h index fdd9cea2fe..f3fb6fac7b 100644 --- a/libraries/AP_ESC_Telem/AP_ESC_Telem_config.h +++ b/libraries/AP_ESC_Telem/AP_ESC_Telem_config.h @@ -6,3 +6,11 @@ #ifndef HAL_WITH_ESC_TELEM #define HAL_WITH_ESC_TELEM ((NUM_SERVO_CHANNELS > 0) && ((HAL_SUPPORT_RCOUT_SERIAL || HAL_MAX_CAN_PROTOCOL_DRIVERS))) #endif + +#ifndef AP_EXTENDED_ESC_TELEM_ENABLED +#define AP_EXTENDED_ESC_TELEM_ENABLED HAL_ENABLE_DRONECAN_DRIVERS +#endif + +#if AP_EXTENDED_ESC_TELEM_ENABLED && !HAL_WITH_ESC_TELEM + #error "AP_EXTENDED_ESC_TELEM_ENABLED requires HAL_WITH_ESC_TELEM" +#endif diff --git a/libraries/AP_ExternalAHRS/AP_ExternalAHRS.cpp b/libraries/AP_ExternalAHRS/AP_ExternalAHRS.cpp index e113eba81d..229ca00dea 100644 --- a/libraries/AP_ExternalAHRS/AP_ExternalAHRS.cpp +++ b/libraries/AP_ExternalAHRS/AP_ExternalAHRS.cpp @@ -124,7 +124,7 @@ void AP_ExternalAHRS::init(void) return; #endif -#if AP_EXTERNAL_AHRS_INERTIAL_LABS_ENABLED +#if AP_EXTERNAL_AHRS_INERTIALLABS_ENABLED case DevType::InertialLabs: backend = NEW_NOTHROW AP_ExternalAHRS_InertialLabs(this, state); return; diff --git a/libraries/AP_ExternalAHRS/AP_ExternalAHRS.h b/libraries/AP_ExternalAHRS/AP_ExternalAHRS.h index 2d01f28c28..a08c282291 100644 --- a/libraries/AP_ExternalAHRS/AP_ExternalAHRS.h +++ b/libraries/AP_ExternalAHRS/AP_ExternalAHRS.h @@ -49,7 +49,7 @@ public: #if AP_EXTERNAL_AHRS_MICROSTRAIN5_ENABLED MicroStrain5 = 2, #endif -#if AP_EXTERNAL_AHRS_INERTIAL_LABS_ENABLED +#if AP_EXTERNAL_AHRS_INERTIALLABS_ENABLED InertialLabs = 5, #endif // 3 reserved for AdNav diff --git a/libraries/AP_ExternalAHRS/AP_ExternalAHRS_InertialLabs.cpp b/libraries/AP_ExternalAHRS/AP_ExternalAHRS_InertialLabs.cpp index 43e858a740..129c11616a 100644 --- a/libraries/AP_ExternalAHRS/AP_ExternalAHRS_InertialLabs.cpp +++ b/libraries/AP_ExternalAHRS/AP_ExternalAHRS_InertialLabs.cpp @@ -18,7 +18,7 @@ #include "AP_ExternalAHRS_config.h" -#if AP_EXTERNAL_AHRS_INERTIAL_LABS_ENABLED +#if AP_EXTERNAL_AHRS_INERTIALLABS_ENABLED #include "AP_ExternalAHRS_InertialLabs.h" #include @@ -692,5 +692,5 @@ void AP_ExternalAHRS_InertialLabs::send_status_report(GCS_MAVLINK &link) const mag_var, 0, 0); } -#endif // AP_EXTERNAL_AHRS_INERTIAL_LABS_ENABLED +#endif // AP_EXTERNAL_AHRS_INERTIALLABS_ENABLED diff --git a/libraries/AP_ExternalAHRS/AP_ExternalAHRS_InertialLabs.h b/libraries/AP_ExternalAHRS/AP_ExternalAHRS_InertialLabs.h index 9de2c9526e..639d39e2d5 100644 --- a/libraries/AP_ExternalAHRS/AP_ExternalAHRS_InertialLabs.h +++ b/libraries/AP_ExternalAHRS/AP_ExternalAHRS_InertialLabs.h @@ -20,7 +20,7 @@ #include "AP_ExternalAHRS_config.h" -#if AP_EXTERNAL_AHRS_INERTIAL_LABS_ENABLED +#if AP_EXTERNAL_AHRS_INERTIALLABS_ENABLED #include "AP_ExternalAHRS_backend.h" @@ -228,5 +228,5 @@ private: uint32_t last_gps_ms; }; -#endif // AP_EXTERNAL_AHRS_INERTIAL_LABS_ENABLED +#endif // AP_EXTERNAL_AHRS_INERTIALLABS_ENABLED diff --git a/libraries/AP_ExternalAHRS/AP_ExternalAHRS_VectorNav.cpp b/libraries/AP_ExternalAHRS/AP_ExternalAHRS_VectorNav.cpp index af207f54c6..446334aa3e 100644 --- a/libraries/AP_ExternalAHRS/AP_ExternalAHRS_VectorNav.cpp +++ b/libraries/AP_ExternalAHRS/AP_ExternalAHRS_VectorNav.cpp @@ -38,135 +38,138 @@ extern const AP_HAL::HAL &hal; + /* - header for pre-configured 50Hz data - assumes the following config for VN-300: - $VNWRG,75,3,8,34,072E,0106,0612*0C - - 0x34: Groups 3,5,6 - Group 3 (IMU): - 0x072E: - UncompMag - UncompAccel - UncompGyro - Pres - Mag - Accel - AngularRate - Group 5 (Attitude): - 0x0106: - YawPitchRoll - Quaternion - YprU - Group 6 (INS): - 0x0612: - PosLLa - VelNed - PosU - VelU - +TYPE::VN_AHRS configures 2 packets: high-rate IMU and mid-rate EKF +Header for IMU packet + $VNWRG,75,3,16,01,0721*D415 + Common group (Group 1) + TimeStartup + AngularRate + Accel + Imu + MagPres +Header for EKF packet + $VNWRG,76,3,16,11,0001,0106*B36B + Common group (Group 1) + TimeStartup + Attitude group (Group 4) + Ypr + Quaternion + YprU */ -static const uint8_t vn_pkt1_header[] { 0x34, 0x2E, 0x07, 0x06, 0x01, 0x12, 0x06 }; -#define VN_PKT1_LENGTH 170 // includes header and CRC -struct PACKED VN_packet1 { - float uncompMag[3]; +struct PACKED VN_IMU_packet { + static constexpr uint8_t header[]{0x01, 0x21, 0x07}; + uint64_t timeStartup; + float gyro[3]; + float accel[3]; float uncompAccel[3]; float uncompAngRate[3]; - float pressure; float mag[3]; - float accel[3]; - float gyro[3]; + float temp; + float pressure; +}; +constexpr uint8_t VN_IMU_packet::header[]; +constexpr uint8_t VN_IMU_LENGTH = sizeof(VN_IMU_packet) + sizeof(VN_IMU_packet::header) + 1 + 2; // Includes sync byte and CRC + +struct PACKED VN_AHRS_ekf_packet { + static constexpr uint8_t header[]{0x11, 0x01, 0x00, 0x06, 0x01}; + uint64_t timeStartup; float ypr[3]; float quaternion[4]; float yprU[3]; - double positionLLA[3]; - float velNED[3]; +}; +constexpr uint8_t VN_AHRS_ekf_packet::header[]; +constexpr uint8_t VN_AHRS_EKF_LENGTH = sizeof(VN_AHRS_ekf_packet) + sizeof(VN_AHRS_ekf_packet::header) + 1 + 2; // Includes sync byte and CRC + +/* +TYPE::VN_INS configures 3 packets: high-rate IMU, mid-rate EKF, and 5Hz GNSS +Header for IMU packet + $VNWRG,75,3,16,01,0721*D415 + Common group (Group 1) + TimeStartup + AngularRate + Accel + Imu + MagPres +Header for EKF packet + $VNWRG,76,3,16,31,0001,0106,0613*097A + Common group (Group 1) + TimeStartup + Attitude group (Group 4) + Ypr + Quaternion + YprU + Ins group (Group 5) + InsStatus + PosLla + VelNed + PosU + VelU +Header for GNSS packet + $VNWRG,77,1,160,49,0003,26B8,0018*4FD9 + Common group (Group 1) + TimeStartup + TimeGps + Gnss1 group (Group 3) + NumSats + GnssFix + GnssPosLla + GnssVelNed + PosU1 + VelU1 + GnssDop + Gnss2 group (Group 6) + NumSats + GnssFix +*/ + +union Ins_Status { + uint16_t _value; + struct { + uint16_t mode : 2; + uint16_t gnssFix : 1; + uint16_t resv1 : 2; + uint16_t imuErr : 1; + uint16_t magPresErr : 1; + uint16_t gnssErr : 1; + uint16_t resv2 : 1; + uint16_t gnssHeadingIns : 2; + }; +}; + +struct PACKED VN_INS_ekf_packet { + static constexpr uint8_t header[]{0x31, 0x01, 0x00, 0x06, 0x01, 0x13, 0x06}; + uint64_t timeStartup; + float ypr[3]; + float quaternion[4]; + float yprU[3]; + uint16_t insStatus; + double posLla[3]; + float velNed[3]; float posU; float velU; }; +constexpr uint8_t VN_INS_ekf_packet::header[]; +constexpr uint8_t VN_INS_EKF_LENGTH = sizeof(VN_INS_ekf_packet) + sizeof(VN_INS_ekf_packet::header) + 1 + 2; // Includes sync byte and CRC -// check packet size for 4 groups -static_assert(sizeof(VN_packet1)+2+3*2+2 == VN_PKT1_LENGTH, "incorrect VN_packet1 length"); - -/* - header for pre-configured 5Hz data - assumes the following VN-300 config: - $VNWRG,76,3,80,4E,0002,0010,20B8,0018*63 - - 0x4E: Groups 2,3,4,7 - Group 2 (Time): - 0x0002: - TimeGps - Group 3 (IMU): - 0x0010: - Temp - Group 4 (GPS1): - 0x20B8: - NumSats - Fix - PosLLa - VelNed - DOP - Group 7 (GPS2): - 0x0018: - NumSats - Fix -*/ -static const uint8_t vn_pkt2_header[] { 0x4e, 0x02, 0x00, 0x10, 0x00, 0xb8, 0x20, 0x18, 0x00 }; -#define VN_PKT2_LENGTH 92 // includes header and CRC - -struct PACKED VN_packet2 { - uint64_t timeGPS; - float temp; - uint8_t numGPS1Sats; - uint8_t GPS1Fix; - double GPS1posLLA[3]; - float GPS1velNED[3]; - float GPS1DOP[7]; - uint8_t numGPS2Sats; - uint8_t GPS2Fix; +struct PACKED VN_INS_gnss_packet { + static constexpr uint8_t header[]{0x49, 0x03, 0x00, 0xB8, 0x26, 0x18, 0x00}; + uint64_t timeStartup; + uint64_t timeGps; + uint8_t numSats1; + uint8_t fix1; + double posLla1[3]; + float velNed1[3]; + float posU1[3]; + float velU1; + float dop1[7]; + uint8_t numSats2; + uint8_t fix2; }; - -// check packet size for 4 groups -static_assert(sizeof(VN_packet2)+2+4*2+2 == VN_PKT2_LENGTH, "incorrect VN_packet2 length"); - -/* - assumes the following VN-300 config: - $VNWRG,75,3,80,14,073E,0004*66 - - Alternate first packet for VN-100 - 0x14: Groups 3, 5 - Group 3 (IMU): - 0x073E: - UncompMag - UncompAccel - UncompGyro - Temp - Pres - Mag - Accel - Gyro - Group 5 (Attitude): - 0x0004: - Quaternion -*/ -static const uint8_t vn_100_pkt1_header[] { 0x14, 0x3E, 0x07, 0x04, 0x00 }; -#define VN_100_PKT1_LENGTH 104 // includes header and CRC - -struct PACKED VN_100_packet1 { - float uncompMag[3]; - float uncompAccel[3]; - float uncompAngRate[3]; - float temp; - float pressure; - float mag[3]; - float accel[3]; - float gyro[3]; - float quaternion[4]; -}; - -static_assert(sizeof(VN_100_packet1)+2+2*2+2 == VN_100_PKT1_LENGTH, "incorrect VN_100_packet1 length"); +constexpr uint8_t VN_INS_gnss_packet::header[]; +constexpr uint8_t VN_INS_GNSS_LENGTH = sizeof(VN_INS_gnss_packet) + sizeof(VN_INS_gnss_packet::header) + 1 + 2; // Includes sync byte and CRC // constructor AP_ExternalAHRS_VectorNav::AP_ExternalAHRS_VectorNav(AP_ExternalAHRS *_frontend, @@ -182,12 +185,13 @@ AP_ExternalAHRS_VectorNav::AP_ExternalAHRS_VectorNav(AP_ExternalAHRS *_frontend, baudrate = sm.find_baudrate(AP_SerialManager::SerialProtocol_AHRS, 0); port_num = sm.find_portnum(AP_SerialManager::SerialProtocol_AHRS, 0); - bufsize = MAX(MAX(VN_PKT1_LENGTH, VN_PKT2_LENGTH), VN_100_PKT1_LENGTH); - pktbuf = NEW_NOTHROW uint8_t[bufsize]; - last_pkt1 = NEW_NOTHROW VN_packet1; - last_pkt2 = NEW_NOTHROW VN_packet2; + bufsize = MAX(MAX(MAX(VN_IMU_LENGTH, VN_INS_EKF_LENGTH), VN_INS_GNSS_LENGTH), VN_AHRS_EKF_LENGTH); - if (!pktbuf || !last_pkt1 || !last_pkt2) { + pktbuf = NEW_NOTHROW uint8_t[bufsize]; + latest_ins_ekf_packet = NEW_NOTHROW VN_INS_ekf_packet; + latest_ins_gnss_packet = NEW_NOTHROW VN_INS_gnss_packet; + + if (!pktbuf || !latest_ins_ekf_packet) { AP_BoardConfig::allocation_error("VectorNav ExternalAHRS"); } @@ -225,48 +229,57 @@ bool AP_ExternalAHRS_VectorNav::check_uart() bool match_header1 = false; bool match_header2 = false; bool match_header3 = false; + bool match_header4 = false; if (pktbuf[0] != SYNC_BYTE) { goto reset; } - if (type == TYPE::VN_300) { - match_header1 = (0 == memcmp(&pktbuf[1], vn_pkt1_header, MIN(sizeof(vn_pkt1_header), unsigned(pktoffset-1)))); - match_header2 = (0 == memcmp(&pktbuf[1], vn_pkt2_header, MIN(sizeof(vn_pkt2_header), unsigned(pktoffset-1)))); + + match_header1 = (0 == memcmp(&pktbuf[1], VN_IMU_packet::header, MIN(sizeof(VN_IMU_packet::header), unsigned(pktoffset - 1)))); + if (type == TYPE::VN_AHRS) { + match_header2 = (0 == memcmp(&pktbuf[1], VN_AHRS_ekf_packet::header, MIN(sizeof(VN_AHRS_ekf_packet::header), unsigned(pktoffset - 1)))); } else { - match_header3 = (0 == memcmp(&pktbuf[1], vn_100_pkt1_header, MIN(sizeof(vn_100_pkt1_header), unsigned(pktoffset-1)))); + match_header3 = (0 == memcmp(&pktbuf[1], VN_INS_ekf_packet::header, MIN(sizeof(VN_INS_ekf_packet::header), unsigned(pktoffset - 1)))); + match_header4 = (0 == memcmp(&pktbuf[1], VN_INS_gnss_packet::header, MIN(sizeof(VN_INS_gnss_packet::header), unsigned(pktoffset - 1)))); } - if (!match_header1 && !match_header2 && !match_header3) { + if (!match_header1 && !match_header2 && !match_header3 && !match_header4) { goto reset; } - if (match_header1 && pktoffset >= VN_PKT1_LENGTH) { - uint16_t crc = crc16_ccitt(&pktbuf[1], VN_PKT1_LENGTH-1, 0); + if (match_header1 && pktoffset >= VN_IMU_LENGTH) { + uint16_t crc = crc16_ccitt(&pktbuf[1], VN_IMU_LENGTH - 1, 0); if (crc == 0) { - // got pkt1 - process_packet1(&pktbuf[sizeof(vn_pkt1_header)+1]); - memmove(&pktbuf[0], &pktbuf[VN_PKT1_LENGTH], pktoffset-VN_PKT1_LENGTH); - pktoffset -= VN_PKT1_LENGTH; + process_imu_packet(&pktbuf[sizeof(VN_IMU_packet::header) + 1]); + memmove(&pktbuf[0], &pktbuf[VN_IMU_LENGTH], pktoffset - VN_IMU_LENGTH); + pktoffset -= VN_IMU_LENGTH; } else { goto reset; } - } else if (match_header2 && pktoffset >= VN_PKT2_LENGTH) { - uint16_t crc = crc16_ccitt(&pktbuf[1], VN_PKT2_LENGTH-1, 0); + } else if (match_header2 && pktoffset >= VN_AHRS_EKF_LENGTH) { + uint16_t crc = crc16_ccitt(&pktbuf[1], VN_AHRS_EKF_LENGTH - 1, 0); if (crc == 0) { - // got pkt2 - process_packet2(&pktbuf[sizeof(vn_pkt2_header)+1]); - memmove(&pktbuf[0], &pktbuf[VN_PKT2_LENGTH], pktoffset-VN_PKT2_LENGTH); - pktoffset -= VN_PKT2_LENGTH; + process_ahrs_ekf_packet(&pktbuf[sizeof(VN_AHRS_ekf_packet::header) + 1]); + memmove(&pktbuf[0], &pktbuf[VN_AHRS_EKF_LENGTH], pktoffset - VN_AHRS_EKF_LENGTH); + pktoffset -= VN_AHRS_EKF_LENGTH; } else { goto reset; } - } else if (match_header3 && pktoffset >= VN_100_PKT1_LENGTH) { - uint16_t crc = crc16_ccitt(&pktbuf[1], VN_100_PKT1_LENGTH-1, 0); + } else if (match_header3 && pktoffset >= VN_INS_EKF_LENGTH) { + uint16_t crc = crc16_ccitt(&pktbuf[1], VN_INS_EKF_LENGTH - 1, 0); if (crc == 0) { - // got VN-100 pkt1 - process_packet_VN_100(&pktbuf[sizeof(vn_100_pkt1_header)+1]); - memmove(&pktbuf[0], &pktbuf[VN_100_PKT1_LENGTH], pktoffset-VN_100_PKT1_LENGTH); - pktoffset -= VN_100_PKT1_LENGTH; + process_ins_ekf_packet(&pktbuf[sizeof(VN_INS_ekf_packet::header) + 1]); + memmove(&pktbuf[0], &pktbuf[VN_INS_EKF_LENGTH], pktoffset - VN_INS_EKF_LENGTH); + pktoffset -= VN_INS_EKF_LENGTH; + } else { + goto reset; + } + } else if (match_header4 && pktoffset >= VN_INS_GNSS_LENGTH) { + uint16_t crc = crc16_ccitt(&pktbuf[1], VN_INS_GNSS_LENGTH - 1, 0); + if (crc == 0) { + process_ins_gnss_packet(&pktbuf[sizeof(VN_INS_gnss_packet::header) + 1]); + memmove(&pktbuf[0], &pktbuf[VN_INS_GNSS_LENGTH], pktoffset - VN_INS_GNSS_LENGTH); + pktoffset -= VN_INS_GNSS_LENGTH; } else { goto reset; } @@ -285,12 +298,16 @@ reset: return true; } -// Send command to read given register number and wait for response -// Only run from thread! This blocks until a response is received +// Send command and wait for response +// Only run from thread! This blocks and retries until a non-error response is received #define READ_REQUEST_RETRY_MS 500 -void AP_ExternalAHRS_VectorNav::wait_register_responce(const uint8_t register_num) +void AP_ExternalAHRS_VectorNav::run_command(const char * fmt, ...) { - nmea.register_number = register_num; + va_list ap; + + va_start(ap, fmt); + hal.util->vsnprintf(message_to_send, sizeof(message_to_send), fmt, ap); + va_end(ap); uint32_t request_sent = 0; while (true) { @@ -298,8 +315,7 @@ void AP_ExternalAHRS_VectorNav::wait_register_responce(const uint8_t register_nu const uint32_t now = AP_HAL::millis(); if (now - request_sent > READ_REQUEST_RETRY_MS) { - // Send request to read - nmea_printf(uart, "$%s%u", "VNRRG,", nmea.register_number); + nmea_printf(uart, "$%s", message_to_send); request_sent = now; } @@ -307,6 +323,10 @@ void AP_ExternalAHRS_VectorNav::wait_register_responce(const uint8_t register_nu while (nbytes-- > 0) { char c = uart->read(); if (decode(c)) { + if (nmea.error_response && nmea.sentence_done) { + // Received a valid VNERR. Try to resend after the timeout length + break; + } return; } } @@ -355,6 +375,7 @@ bool AP_ExternalAHRS_VectorNav::decode(char c) nmea.checksum = 0; nmea.term_is_checksum = false; nmea.sentence_done = false; + nmea.error_response = false; return false; } @@ -370,65 +391,83 @@ bool AP_ExternalAHRS_VectorNav::decode(char c) } // decode the most recently consumed term -// returns true if new sentence has just passed checksum test and is validated +// returns true if new term is valid bool AP_ExternalAHRS_VectorNav::decode_latest_term() { + // Check the first two terms (In most cases header + reg number) that they match the sent + // message. If not, the response is invalid. switch (nmea.term_number) { case 0: - if (strcmp(nmea.term, "VNRRG") != 0) { + if (strncmp(nmea.term, "VNERR", nmea.term_offset) == 0) { + nmea.error_response = true; // Message will be printed on next term + } else if (strncmp(nmea.term, message_to_send, nmea.term_offset) != 0) { return false; } - break; - - case 1: - if (nmea.register_number != strtoul(nmea.term, nullptr, 10)) { + return true; + case 1: + if (nmea.error_response) { + GCS_SEND_TEXT(MAV_SEVERITY_CRITICAL, "VectorNav received VNERR code: %s", nmea.term); + } else if (strlen(message_to_send) > 6 && + strncmp(nmea.term, &message_to_send[6], nmea.term_offset) != 0) { // Start after "VNXXX," return false; } - break; - - case 2: - strncpy(model_name, nmea.term, sizeof(model_name)); - break; - + return true; + case 2: + if (strncmp(nmea.term, "VN-", 3) == 0) { + // This term is the model number + strncpy(model_name, nmea.term, sizeof(model_name)); + } + return true; default: - return false; + return true; } - return true; } -void AP_ExternalAHRS_VectorNav::update_thread() -{ +void AP_ExternalAHRS_VectorNav::initialize() { // Open port in the thread uart->begin(baudrate, 1024, 512); - // Reset and wait for module to reboot - // VN_100 takes 1.25 seconds - //nmea_printf(uart, "$VNRST"); - //hal.scheduler->delay(3000); + // Pause asynchronous communications to simplify packet finding + run_command("VNASY,0"); - // Stop NMEA Async Outputs (this UART only) - nmea_printf(uart, "$VNWRG,6,0"); + // Stop ASCII async outputs for both UARTs. If only active UART is disabled, we get a baudrate + // overflow on the other UART when configuring binary outputs (reg 75 and 76) to both UARTs + run_command("VNWRG,06,0,1"); + run_command("VNWRG,06,0,2"); - // Detect version // Read Model Number Register, ID 1 - wait_register_responce(1); + run_command("VNRRG,01"); // Setup for messages respective model types (on both UARTs) - if (strncmp(model_name, "VN-100", 6) == 0) { - // VN-100 - type = TYPE::VN_100; - - // This assumes unit is still configured at its default rate of 800hz - nmea_printf(uart, "$VNWRG,75,3,%u,14,073E,0004", unsigned(800/get_rate())); + if (strncmp(model_name, "VN-1", 4) == 0) { + // VN-1X0 + type = TYPE::VN_AHRS; + // These assumes unit is still configured at its default rate of 800hz + run_command("VNWRG,75,3,%u,01,0721", unsigned(800 / get_rate())); + run_command("VNWRG,76,3,16,11,0001,0106"); } else { - // Default to Setup for VN-300 series - // This assumes unit is still configured at its default rate of 400hz - nmea_printf(uart, "$VNWRG,75,3,%u,34,072E,0106,0612", unsigned(400/get_rate())); - nmea_printf(uart, "$VNWRG,76,3,80,4E,0002,0010,20B8,0018"); + // Default to setup for sensors other than VN-100 or VN-110 + // This assumes unit is still configured at its default IMU rate of 400hz for VN-300, 800hz for others + uint16_t imu_rate = 800; // Default for everything but VN-300 + if (strncmp(model_name, "VN-300", 6) == 0) { + imu_rate = 400; + } + if (strncmp(model_name, "VN-3", 4) == 0) { + has_dual_gnss = true; + } + run_command("VNWRG,75,3,%u,01,0721", unsigned(imu_rate / get_rate())); + run_command("VNWRG,76,3,%u,31,0001,0106,0613", unsigned(imu_rate / 50)); + run_command("VNWRG,77,3,%u,49,0003,26B8,0018", unsigned(imu_rate / 5)); } + // Resume asynchronous communications + run_command("VNASY,1"); setup_complete = true; +} + +void AP_ExternalAHRS_VectorNav::update_thread() { + initialize(); while (true) { if (!check_uart()) { hal.scheduler->delay(1); @@ -444,129 +483,48 @@ const char* AP_ExternalAHRS_VectorNav::get_name() const return nullptr; } -/* - process packet type 1 - */ -void AP_ExternalAHRS_VectorNav::process_packet1(const uint8_t *b) -{ - const struct VN_packet1 &pkt1 = *(struct VN_packet1 *)b; - const struct VN_packet2 &pkt2 = *last_pkt2; +// Input data struct for EAHA logging message, used by both AHRS mode and INS mode +struct AP_ExternalAHRS_VectorNav::EAHA { + uint64_t timeUs; + float quat[4]; + float ypr[3]; + float yprU[3]; +}; - last_pkt1_ms = AP_HAL::millis(); - *last_pkt1 = pkt1; - const bool use_uncomp = option_is_set(AP_ExternalAHRS::OPTIONS::VN_UNCOMP_IMU); +void AP_ExternalAHRS_VectorNav::write_eaha(const EAHA& data_to_log) const { - { - WITH_SEMAPHORE(state.sem); - if (use_uncomp) { - state.accel = Vector3f{pkt1.uncompAccel[0], pkt1.uncompAccel[1], pkt1.uncompAccel[2]}; - state.gyro = Vector3f{pkt1.uncompAngRate[0], pkt1.uncompAngRate[1], pkt1.uncompAngRate[2]}; - } else { - state.accel = Vector3f{pkt1.accel[0], pkt1.accel[1], pkt1.accel[2]}; - state.gyro = Vector3f{pkt1.gyro[0], pkt1.gyro[1], pkt1.gyro[2]}; - } +#if HAL_LOGGING_ENABLED + // @LoggerMessage: EAHA + // @Description: External AHRS Attitude data + // @Field: TimeUS: Time since system startup + // @Field: Q1: Attitude quaternion 1 + // @Field: Q2: Attitude quaternion 2 + // @Field: Q3: Attitude quaternion 3 + // @Field: Q4: Attitude quaternion 4 + // @Field: Yaw: Yaw + // @Field: Pitch: Pitch + // @Field: Roll: Roll + // @Field: YU: Yaw unceratainty + // @Field: PU: Pitch uncertainty + // @Field: RU: Roll uncertainty - state.quat = Quaternion{pkt1.quaternion[3], pkt1.quaternion[0], pkt1.quaternion[1], pkt1.quaternion[2]}; - state.have_quaternion = true; - - state.velocity = Vector3f{pkt1.velNED[0], pkt1.velNED[1], pkt1.velNED[2]}; - state.have_velocity = true; - - state.location = Location{int32_t(pkt1.positionLLA[0] * 1.0e7), - int32_t(pkt1.positionLLA[1] * 1.0e7), - int32_t(pkt1.positionLLA[2] * 1.0e2), - Location::AltFrame::ABSOLUTE}; - state.last_location_update_us = AP_HAL::micros(); - state.have_location = true; - } - -#if AP_BARO_EXTERNALAHRS_ENABLED - { - AP_ExternalAHRS::baro_data_message_t baro; - baro.instance = 0; - baro.pressure_pa = pkt1.pressure*1e3; - baro.temperature = pkt2.temp; - - AP::baro().handle_external(baro); - } + AP::logger().WriteStreaming("EAHA", "TimeUS,Q1,Q2,Q3,Q4,Yaw,Pitch,Roll,YU,PU,RU", + "s----dddddd", "F0000000000", + "Qffffffffff", + data_to_log.timeUs, + data_to_log.quat[0], data_to_log.quat[1], data_to_log.quat[2], data_to_log.quat[3], + data_to_log.ypr[0], data_to_log.ypr[1], data_to_log.ypr[2], + data_to_log.yprU[0], data_to_log.yprU[1], data_to_log.yprU[2]); #endif - -#if AP_COMPASS_EXTERNALAHRS_ENABLED - { - AP_ExternalAHRS::mag_data_message_t mag; - mag.field = Vector3f{pkt1.mag[0], pkt1.mag[1], pkt1.mag[2]}; - mag.field *= 1000; // to mGauss - - AP::compass().handle_external(mag); - } -#endif - - { - AP_ExternalAHRS::ins_data_message_t ins; - - ins.accel = state.accel; - ins.gyro = state.gyro; - ins.temperature = pkt2.temp; - - AP::ins().handle_external(ins); - } } -/* - process packet type 2 - */ -void AP_ExternalAHRS_VectorNav::process_packet2(const uint8_t *b) + + +// process INS mode INS packet +void AP_ExternalAHRS_VectorNav::process_imu_packet(const uint8_t *b) { - const struct VN_packet2 &pkt2 = *(struct VN_packet2 *)b; - const struct VN_packet1 &pkt1 = *last_pkt1; - - last_pkt2_ms = AP_HAL::millis(); - *last_pkt2 = pkt2; - - AP_ExternalAHRS::gps_data_message_t gps; - - // get ToW in milliseconds - gps.gps_week = pkt2.timeGPS / (AP_MSEC_PER_WEEK * 1000000ULL); - gps.ms_tow = (pkt2.timeGPS / 1000000ULL) % (60*60*24*7*1000ULL); - gps.fix_type = pkt2.GPS1Fix; - gps.satellites_in_view = pkt2.numGPS1Sats; - - gps.horizontal_pos_accuracy = pkt1.posU; - gps.vertical_pos_accuracy = pkt1.posU; - gps.horizontal_vel_accuracy = pkt1.velU; - - gps.hdop = pkt2.GPS1DOP[4]; - gps.vdop = pkt2.GPS1DOP[3]; - - gps.latitude = pkt2.GPS1posLLA[0] * 1.0e7; - gps.longitude = pkt2.GPS1posLLA[1] * 1.0e7; - gps.msl_altitude = pkt2.GPS1posLLA[2] * 1.0e2; - - gps.ned_vel_north = pkt2.GPS1velNED[0]; - gps.ned_vel_east = pkt2.GPS1velNED[1]; - gps.ned_vel_down = pkt2.GPS1velNED[2]; - - if (gps.fix_type >= 3 && !state.have_origin) { - WITH_SEMAPHORE(state.sem); - state.origin = Location{int32_t(pkt2.GPS1posLLA[0] * 1.0e7), - int32_t(pkt2.GPS1posLLA[1] * 1.0e7), - int32_t(pkt2.GPS1posLLA[2] * 1.0e2), - Location::AltFrame::ABSOLUTE}; - state.have_origin = true; - } - uint8_t instance; - if (AP::gps().get_first_external_instance(instance)) { - AP::gps().handle_external(gps, instance); - } -} - -/* - process VN-100 packet type 1 - */ -void AP_ExternalAHRS_VectorNav::process_packet_VN_100(const uint8_t *b) -{ - const struct VN_100_packet1 &pkt = *(struct VN_100_packet1 *)b; + const struct VN_IMU_packet &pkt = *(struct VN_IMU_packet *)b; last_pkt1_ms = AP_HAL::millis(); @@ -581,16 +539,13 @@ void AP_ExternalAHRS_VectorNav::process_packet_VN_100(const uint8_t *b) state.accel = Vector3f{pkt.accel[0], pkt.accel[1], pkt.accel[2]}; state.gyro = Vector3f{pkt.gyro[0], pkt.gyro[1], pkt.gyro[2]}; } - - state.quat = Quaternion{pkt.quaternion[3], pkt.quaternion[0], pkt.quaternion[1], pkt.quaternion[2]}; - state.have_quaternion = true; } #if AP_BARO_EXTERNALAHRS_ENABLED { AP_ExternalAHRS::baro_data_message_t baro; baro.instance = 0; - baro.pressure_pa = pkt.pressure*1e3; + baro.pressure_pa = pkt.pressure * 1e3; baro.temperature = pkt.temp; AP::baro().handle_external(baro); @@ -600,11 +555,7 @@ void AP_ExternalAHRS_VectorNav::process_packet_VN_100(const uint8_t *b) #if AP_COMPASS_EXTERNALAHRS_ENABLED { AP_ExternalAHRS::mag_data_message_t mag; - if (use_uncomp) { - mag.field = Vector3f{pkt.uncompMag[0], pkt.uncompMag[1], pkt.uncompMag[2]}; - } else { - mag.field = Vector3f{pkt.mag[0], pkt.mag[1], pkt.mag[2]}; - } + mag.field = Vector3f{pkt.mag[0], pkt.mag[1], pkt.mag[2]}; mag.field *= 1000; // to mGauss AP::compass().handle_external(mag); @@ -622,8 +573,8 @@ void AP_ExternalAHRS_VectorNav::process_packet_VN_100(const uint8_t *b) } #if HAL_LOGGING_ENABLED - // @LoggerMessage: EAH3 - // @Description: External AHRS data + // @LoggerMessage: EAHI + // @Description: External AHRS IMU data // @Field: TimeUS: Time since system startup // @Field: Temp: Temprature // @Field: Pres: Pressure @@ -636,25 +587,131 @@ void AP_ExternalAHRS_VectorNav::process_packet_VN_100(const uint8_t *b) // @Field: GX: Rotation rate X-axis // @Field: GY: Rotation rate Y-axis // @Field: GZ: Rotation rate Z-axis - // @Field: Q1: Attitude quaternion 1 - // @Field: Q2: Attitude quaternion 2 - // @Field: Q3: Attitude quaternion 3 - // @Field: Q4: Attitude quaternion 4 - AP::logger().WriteStreaming("EAH3", "TimeUS,Temp,Pres,MX,MY,MZ,AX,AY,AZ,GX,GY,GZ,Q1,Q2,Q3,Q4", - "sdPGGGoooEEE----", "F000000000000000", - "Qfffffffffffffff", + AP::logger().WriteStreaming("EAHI", "TimeUS,Temp,Pres,MX,MY,MZ,AX,AY,AZ,GX,GY,GZ", + "sdPGGGoooEEE", "F00000000000", + "Qfffffffffff", AP_HAL::micros64(), pkt.temp, pkt.pressure*1e3, - use_uncomp ? pkt.uncompMag[0] : pkt.mag[0], - use_uncomp ? pkt.uncompMag[1] : pkt.mag[1], - use_uncomp ? pkt.uncompMag[2] : pkt.mag[2], + pkt.mag[0], pkt.mag[1], pkt.mag[2], state.accel[0], state.accel[1], state.accel[2], state.gyro[0], state.gyro[1], state.gyro[2], state.quat[0], state.quat[1], state.quat[2], state.quat[3]); #endif // HAL_LOGGING_ENABLED } +// process AHRS mode AHRS packet +void AP_ExternalAHRS_VectorNav::process_ahrs_ekf_packet(const uint8_t *b) { + const struct VN_AHRS_ekf_packet &pkt = *(struct VN_AHRS_ekf_packet *)b; + + last_pkt2_ms = AP_HAL::millis(); + + state.quat = Quaternion{pkt.quaternion[3], pkt.quaternion[0], pkt.quaternion[1], pkt.quaternion[2]}; + state.have_quaternion = true; + +#if HAL_LOGGING_ENABLED + EAHA data_to_log; + data_to_log.timeUs = AP_HAL::micros64(); + memcpy(data_to_log.quat, pkt.quaternion, sizeof(pkt.quaternion)); + memcpy(data_to_log.ypr, pkt.ypr, sizeof(pkt.ypr)); + memcpy(data_to_log.yprU, pkt.yprU, sizeof(pkt.yprU)); + + write_eaha(data_to_log); +#endif // HAL_LOGGING_ENABLED +} + +// process INS mode EKF packet +void AP_ExternalAHRS_VectorNav::process_ins_ekf_packet(const uint8_t *b) { + const struct VN_INS_ekf_packet &pkt = *(struct VN_INS_ekf_packet *)b; + + last_pkt2_ms = AP_HAL::millis(); + *latest_ins_ekf_packet = pkt; + + state.quat = Quaternion{pkt.quaternion[3], pkt.quaternion[0], pkt.quaternion[1], pkt.quaternion[2]}; + state.have_quaternion = true; + + state.velocity = Vector3f{pkt.velNed[0], pkt.velNed[1], pkt.velNed[2]}; + state.have_velocity = true; + + state.location = Location{int32_t(pkt.posLla[0] * 1.0e7), int32_t(pkt.posLla[1] * 1.0e7), int32_t(pkt.posLla[2] * 1.0e2), Location::AltFrame::ABSOLUTE}; + state.last_location_update_us = AP_HAL::micros(); + state.have_location = true; + +#if HAL_LOGGING_ENABLED + EAHA data_to_log; + auto now = AP_HAL::micros64(); + data_to_log.timeUs = now; + memcpy(data_to_log.quat, pkt.quaternion, sizeof(pkt.quaternion)); + memcpy(data_to_log.ypr, pkt.ypr, sizeof(pkt.ypr)); + memcpy(data_to_log.yprU, pkt.yprU, sizeof(pkt.yprU)); + write_eaha(data_to_log); + + // @LoggerMessage: EAHK + // @Description: External AHRS INS Kalman Filter data + // @Field: TimeUS: Time since system startup + // @Field: InsStatus: VectorNav INS health status + // @Field: Lat: Latitude + // @Field: Lon: Longitude + // @Field: Alt: Altitude + // @Field: VelN: Velocity Northing + // @Field: VelE: Velocity Easting + // @Field: VelD: Velocity Downing + // @Field: PosU: Filter estimated position uncertainty + // @Field: VelU: Filter estimated Velocity uncertainty + + AP::logger().WriteStreaming("EAHK", "TimeUS,InsStatus,Lat,Lon,Alt,VelN,VelE,VelD,PosU,VelU", + "s-ddmnnndn", "F000000000", + "QHdddfffff", + now, + pkt.insStatus, + pkt.posLla[0], pkt.posLla[1], pkt.posLla[2], + pkt.velNed[0], pkt.velNed[1], pkt.velNed[2], + pkt.posU, pkt.velU); +#endif // HAL_LOGGING_ENABLED + +} + +// process INS mode GNSS packet +void AP_ExternalAHRS_VectorNav::process_ins_gnss_packet(const uint8_t *b) { + const struct VN_INS_gnss_packet &pkt = *(struct VN_INS_gnss_packet *)b; + AP_ExternalAHRS::gps_data_message_t gps; + + + last_pkt3_ms = AP_HAL::millis(); + *latest_ins_gnss_packet = pkt; + + // get ToW in milliseconds + gps.gps_week = pkt.timeGps / (AP_MSEC_PER_WEEK * 1000000ULL); + gps.ms_tow = (pkt.timeGps / 1000000ULL) % (60 * 60 * 24 * 7 * 1000ULL); + gps.fix_type = pkt.fix1; + gps.satellites_in_view = pkt.numSats1; + + gps.horizontal_pos_accuracy = pkt.posU1[0]; + gps.vertical_pos_accuracy = pkt.posU1[2]; + gps.horizontal_vel_accuracy = pkt.velU1; + + gps.hdop = pkt.dop1[4]; + gps.vdop = pkt.dop1[3]; + + gps.latitude = pkt.posLla1[0] * 1.0e7; + gps.longitude = pkt.posLla1[1] * 1.0e7; + gps.msl_altitude = pkt.posLla1[2] * 1.0e2; + + gps.ned_vel_north = pkt.velNed1[0]; + gps.ned_vel_east = pkt.velNed1[1]; + gps.ned_vel_down = pkt.velNed1[2]; + + if (!state.have_origin && gps.fix_type >= 3) { + WITH_SEMAPHORE(state.sem); + state.origin = Location{int32_t(pkt.posLla1[0] * 1.0e7), int32_t(pkt.posLla1[1] * 1.0e7), + int32_t(pkt.posLla1[2] * 1.0e2), Location::AltFrame::ABSOLUTE}; + state.have_origin = true; + } + uint8_t instance; + if (AP::gps().get_first_external_instance(instance)) { + AP::gps().handle_external(gps, instance); + } +} // get serial port number for the uart int8_t AP_ExternalAHRS_VectorNav::get_port(void) const @@ -669,10 +726,7 @@ int8_t AP_ExternalAHRS_VectorNav::get_port(void) const bool AP_ExternalAHRS_VectorNav::healthy(void) const { const uint32_t now = AP_HAL::millis(); - if (type == TYPE::VN_100) { - return (now - last_pkt1_ms < 40); - } - return (now - last_pkt1_ms < 40 && now - last_pkt2_ms < 500); + return (now - last_pkt1_ms < 40) && (now - last_pkt2_ms < 500) && (type == TYPE::VN_AHRS ? true: now - last_pkt3_ms < 1000); } bool AP_ExternalAHRS_VectorNav::initialised(void) const @@ -680,10 +734,7 @@ bool AP_ExternalAHRS_VectorNav::initialised(void) const if (!setup_complete) { return false; } - if (type == TYPE::VN_100) { - return last_pkt1_ms != 0; - } - return last_pkt1_ms != 0 && last_pkt2_ms != 0; + return last_pkt1_ms != UINT32_MAX && last_pkt2_ms != UINT32_MAX && (type == TYPE::VN_AHRS ? true : last_pkt3_ms != UINT32_MAX); } bool AP_ExternalAHRS_VectorNav::pre_arm_check(char *failure_msg, uint8_t failure_msg_len) const @@ -696,12 +747,12 @@ bool AP_ExternalAHRS_VectorNav::pre_arm_check(char *failure_msg, uint8_t failure hal.util->snprintf(failure_msg, failure_msg_len, "VectorNav unhealthy"); return false; } - if (type == TYPE::VN_300) { - if (last_pkt2->GPS1Fix < 3) { + if (type == TYPE::VN_INS) { + if (latest_ins_gnss_packet->fix1 < 3) { hal.util->snprintf(failure_msg, failure_msg_len, "VectorNav no GPS1 lock"); return false; } - if (last_pkt2->GPS2Fix < 3) { + if (has_dual_gnss && (latest_ins_gnss_packet->fix2 < 3)) { hal.util->snprintf(failure_msg, failure_msg_len, "VectorNav no GPS2 lock"); return false; } @@ -716,37 +767,31 @@ bool AP_ExternalAHRS_VectorNav::pre_arm_check(char *failure_msg, uint8_t failure void AP_ExternalAHRS_VectorNav::get_filter_status(nav_filter_status &status) const { memset(&status, 0, sizeof(status)); - if (type == TYPE::VN_300) { - if (last_pkt1 && last_pkt2) { - status.flags.initalized = true; - } - if (healthy() && last_pkt2) { + status.flags.initalized = initialised(); + if (healthy()) { + if (type == TYPE::VN_AHRS) { status.flags.attitude = true; - status.flags.vert_vel = true; - status.flags.vert_pos = true; + } else { + status.flags.attitude = true; + if (latest_ins_ekf_packet) { + status.flags.vert_vel = true; + status.flags.vert_pos = true; - const struct VN_packet2 &pkt2 = *last_pkt2; - if (pkt2.GPS1Fix >= 3) { - status.flags.horiz_vel = true; - status.flags.horiz_pos_rel = true; - status.flags.horiz_pos_abs = true; + status.flags.horiz_vel = true; + status.flags.horiz_pos_rel = true; + status.flags.horiz_pos_abs = true; status.flags.pred_horiz_pos_rel = true; status.flags.pred_horiz_pos_abs = true; - status.flags.using_gps = true; + status.flags.using_gps = true; } } - } else { - status.flags.initalized = initialised(); - if (healthy()) { - status.flags.attitude = true; - } } } // send an EKF_STATUS message to GCS void AP_ExternalAHRS_VectorNav::send_status_report(GCS_MAVLINK &link) const { - if (!last_pkt1) { + if (!latest_ins_ekf_packet) { return; } // prepare flags @@ -788,13 +833,13 @@ void AP_ExternalAHRS_VectorNav::send_status_report(GCS_MAVLINK &link) const } // send message - const struct VN_packet1 &pkt1 = *(struct VN_packet1 *)last_pkt1; + const struct VN_INS_ekf_packet &pkt = *(struct VN_INS_ekf_packet *)latest_ins_ekf_packet; const float vel_gate = 5; const float pos_gate = 5; const float hgt_gate = 5; const float mag_var = 0; mavlink_msg_ekf_status_report_send(link.get_chan(), flags, - pkt1.velU/vel_gate, pkt1.posU/pos_gate, pkt1.posU/hgt_gate, + pkt.velU / vel_gate, pkt.posU / pos_gate, pkt.posU / hgt_gate, mag_var, 0, 0); } diff --git a/libraries/AP_ExternalAHRS/AP_ExternalAHRS_VectorNav.h b/libraries/AP_ExternalAHRS/AP_ExternalAHRS_VectorNav.h index c0e54c88bf..8e1a1c5ec1 100644 --- a/libraries/AP_ExternalAHRS/AP_ExternalAHRS_VectorNav.h +++ b/libraries/AP_ExternalAHRS/AP_ExternalAHRS_VectorNav.h @@ -61,42 +61,53 @@ private: void update_thread(); bool check_uart(); - void process_packet1(const uint8_t *b); - void process_packet2(const uint8_t *b); - void process_packet_VN_100(const uint8_t *b); - void wait_register_responce(const uint8_t register_num); + void initialize(); + + void run_command(const char *fmt, ...); + + struct EAHA; + void write_eaha(const EAHA& data_to_log) const; + void process_imu_packet(const uint8_t *b); + void process_ahrs_ekf_packet(const uint8_t *b); + void process_ins_ekf_packet(const uint8_t *b); + void process_ins_gnss_packet(const uint8_t *b); + uint8_t *pktbuf; uint16_t pktoffset; uint16_t bufsize; - struct VN_packet1 *last_pkt1; - struct VN_packet2 *last_pkt2; + struct VN_imu_packet *latest_imu_packet; + struct VN_INS_ekf_packet *latest_ins_ekf_packet; + struct VN_INS_gnss_packet *latest_ins_gnss_packet; uint32_t last_pkt1_ms; uint32_t last_pkt2_ms; + uint32_t last_pkt3_ms; enum class TYPE { - VN_300, - VN_100, + VN_INS, // Full INS mode, requiring GNSS. Used by VN-2X0 and VN-3X0 + VN_AHRS, // IMU-only mode, used by VN-1X0 } type; - char model_name[25]; + bool has_dual_gnss = false; + char model_name[20]; + + char message_to_send[50]; // NMEA parsing for setup bool decode(char c); bool decode_latest_term(); struct NMEA_parser { - char term[25]; // buffer for the current term within the current sentence + char term[20]; // buffer for the current term within the current sentence uint8_t term_offset; // offset within the _term buffer where the next character should be placed uint8_t term_number; // term index within the current sentence uint8_t checksum; // checksum accumulator bool term_is_checksum; // current term is the checksum bool sentence_valid; // is current sentence valid so far bool sentence_done; // true if this sentence has already been decoded - uint8_t register_number; // VectorNAV register number were reading + bool error_response; // true if received a VNERR response } nmea; - }; #endif // AP_EXTERNAL_AHRS_VECTORNAV_ENABLED diff --git a/libraries/AP_ExternalAHRS/AP_ExternalAHRS_config.h b/libraries/AP_ExternalAHRS/AP_ExternalAHRS_config.h index 75e8e52280..650f605b0a 100644 --- a/libraries/AP_ExternalAHRS/AP_ExternalAHRS_config.h +++ b/libraries/AP_ExternalAHRS/AP_ExternalAHRS_config.h @@ -26,6 +26,6 @@ #define AP_EXTERNAL_AHRS_VECTORNAV_ENABLED AP_EXTERNAL_AHRS_BACKEND_DEFAULT_ENABLED #endif -#ifndef AP_EXTERNAL_AHRS_INERTIAL_LABS_ENABLED -#define AP_EXTERNAL_AHRS_INERTIAL_LABS_ENABLED AP_EXTERNAL_AHRS_BACKEND_DEFAULT_ENABLED +#ifndef AP_EXTERNAL_AHRS_INERTIALLABS_ENABLED +#define AP_EXTERNAL_AHRS_INERTIALLABS_ENABLED AP_EXTERNAL_AHRS_BACKEND_DEFAULT_ENABLED #endif diff --git a/libraries/AP_Filesystem/AP_Filesystem.cpp b/libraries/AP_Filesystem/AP_Filesystem.cpp index c780c5a9b1..240e95e41d 100644 --- a/libraries/AP_Filesystem/AP_Filesystem.cpp +++ b/libraries/AP_Filesystem/AP_Filesystem.cpp @@ -16,6 +16,9 @@ #include "AP_Filesystem.h" #include "AP_Filesystem_config.h" + +#if AP_FILESYSTEM_FILE_READING_ENABLED + #include #include #include @@ -202,7 +205,9 @@ AP_Filesystem::DirHandle *AP_Filesystem::opendir(const char *pathname) (strlen(pathname) == 1 && pathname[0] == '/')) { virtual_dirent.backend_ofs = 0; virtual_dirent.d_off = 0; +#if AP_FILESYSTEM_HAVE_DIRENT_DTYPE virtual_dirent.de.d_type = DT_DIR; +#endif } else { virtual_dirent.backend_ofs = 255; } @@ -321,19 +326,31 @@ bool AP_Filesystem::fgets(char *buf, uint8_t buflen, int fd) { const Backend &backend = backend_by_fd(fd); + // we will need to seek back to the right location at the end + auto offset_start = backend.fs.lseek(fd, 0, SEEK_CUR); + if (offset_start < 0) { + return false; + } + + auto n = backend.fs.read(fd, buf, buflen); + if (n <= 0) { + return false; + } + uint8_t i = 0; - for (; i= 0 && fileno <= 2) { return true; diff --git a/libraries/AP_Filesystem/AP_Filesystem_ROMFS.cpp b/libraries/AP_Filesystem/AP_Filesystem_ROMFS.cpp index eb562694a8..f481d87255 100644 --- a/libraries/AP_Filesystem/AP_Filesystem_ROMFS.cpp +++ b/libraries/AP_Filesystem/AP_Filesystem_ROMFS.cpp @@ -192,11 +192,14 @@ struct dirent *AP_Filesystem_ROMFS::readdir(void *dirp) const char* slash = strchr(name, '/'); if (slash == nullptr) { // File +#if AP_FILESYSTEM_HAVE_DIRENT_DTYPE dir[idx].de.d_type = DT_REG; - +#endif } else { // Directory +#if AP_FILESYSTEM_HAVE_DIRENT_DTYPE dir[idx].de.d_type = DT_DIR; +#endif // Add null termination after directory name const size_t index = slash - name; diff --git a/libraries/AP_Filesystem/AP_Filesystem_Sys.cpp b/libraries/AP_Filesystem/AP_Filesystem_Sys.cpp index 7efa34db0b..5063267c04 100644 --- a/libraries/AP_Filesystem/AP_Filesystem_Sys.cpp +++ b/libraries/AP_Filesystem/AP_Filesystem_Sys.cpp @@ -244,7 +244,9 @@ struct dirent *AP_Filesystem_Sys::readdir(void *dirp) // we have reached end of list return nullptr; } +#if AP_FILESYSTEM_HAVE_DIRENT_DTYPE dtracker->curr_file.d_type = DT_REG; +#endif size_t max_length = ARRAY_SIZE(dtracker->curr_file.d_name); strncpy_noterm(dtracker->curr_file.d_name, sysfs_file_list[dtracker->file_offset].name, max_length); dtracker->file_offset++; diff --git a/libraries/AP_Filesystem/AP_Filesystem_config.h b/libraries/AP_Filesystem/AP_Filesystem_config.h index a184051610..93e307ed7e 100644 --- a/libraries/AP_Filesystem/AP_Filesystem_config.h +++ b/libraries/AP_Filesystem/AP_Filesystem_config.h @@ -23,7 +23,7 @@ #endif #ifndef AP_FILESYSTEM_POSIX_ENABLED -#define AP_FILESYSTEM_POSIX_ENABLED (CONFIG_HAL_BOARD == HAL_BOARD_SITL || CONFIG_HAL_BOARD == HAL_BOARD_LINUX) +#define AP_FILESYSTEM_POSIX_ENABLED (CONFIG_HAL_BOARD == HAL_BOARD_SITL || CONFIG_HAL_BOARD == HAL_BOARD_LINUX || CONFIG_HAL_BOARD == HAL_BOARD_QURT) #endif #ifndef AP_FILESYSTEM_ROMFS_ENABLED @@ -34,6 +34,11 @@ #define AP_FILESYSTEM_SYS_ENABLED 1 #endif +#ifndef AP_FILESYSTEM_POSIX_MAP_FILENAME_ALLOC +// this requires AP_FILESYSTEM_POSIX_MAP_FILENAME_BASEDIR +#define AP_FILESYSTEM_POSIX_MAP_FILENAME_ALLOC 0 +#endif + // AP_FILESYSTEM_FILE_WRITING_ENABLED is true if you could expect to // be able to open and write a non-virtual file. Notably this // excludes virtual files like SYSFS, and the magic param/mission @@ -47,9 +52,13 @@ // be able to open and read a non-virtual file. Notably this excludes // virtual files like SYSFS, and the magic param/mission upload targets. #ifndef AP_FILESYSTEM_FILE_READING_ENABLED -#define AP_FILESYSTEM_FILE_READING_ENABLED (AP_FILESYSTEM_FILE_WRITING_ENABLED || AP_FILESYSTEM_ROMFS_ENABLED) +#define AP_FILESYSTEM_FILE_READING_ENABLED (AP_FILESYSTEM_FILE_WRITING_ENABLED || AP_FILESYSTEM_ROMFS_ENABLED || AP_FILESYSTEM_SYS_ENABLED || AP_FILESYSTEM_PARAM_ENABLED) #endif #ifndef AP_FILESYSTEM_SYS_FLASH_ENABLED #define AP_FILESYSTEM_SYS_FLASH_ENABLED CONFIG_HAL_BOARD == HAL_BOARD_CHIBIOS #endif + +#ifndef AP_FILESYSTEM_HAVE_DIRENT_DTYPE +#define AP_FILESYSTEM_HAVE_DIRENT_DTYPE 1 +#endif diff --git a/libraries/AP_Filesystem/AP_Filesystem_posix.cpp b/libraries/AP_Filesystem/AP_Filesystem_posix.cpp index 5a61690534..8e6e49595e 100644 --- a/libraries/AP_Filesystem/AP_Filesystem_posix.cpp +++ b/libraries/AP_Filesystem/AP_Filesystem_posix.cpp @@ -26,18 +26,29 @@ #if defined(__APPLE__) #include -#else +#elif CONFIG_HAL_BOARD != HAL_BOARD_QURT #include #endif + +#if AP_FILESYSTEM_POSIX_HAVE_UTIME #include +#endif extern const AP_HAL::HAL& hal; /* - map a filename for SITL so operations are relative to the current directory + map a filename so operations are relative to the current directory if needed */ static const char *map_filename(const char *fname) { +#if AP_FILESYSTEM_POSIX_MAP_FILENAME_ALLOC + // this system needs to add a prefix to the filename, which means + // memory allocation. This is needed for QURT which lacks chdir() + char *fname2 = nullptr; + asprintf(&fname2, "%s/%s", AP_FILESYSTEM_POSIX_MAP_FILENAME_BASEDIR, fname); + return fname2; +#else + #if CONFIG_HAL_BOARD == HAL_BOARD_SITL && !APM_BUILD_TYPE(APM_BUILD_Replay) // on SITL only allow paths under subdirectory. Users can still // escape with .. if they want to @@ -50,6 +61,14 @@ static const char *map_filename(const char *fname) #endif // on Linux allow original name return fname; +#endif // AP_FILESYSTEM_POSIX_MAP_FILENAME_ALLOC +} + +static void map_filename_free(const char *fname) +{ +#if AP_FILESYSTEM_POSIX_MAP_FILENAME_ALLOC + ::free(const_cast(fname)); +#endif } int AP_Filesystem_Posix::open(const char *fname, int flags, bool allow_absolute_paths) @@ -62,10 +81,18 @@ int AP_Filesystem_Posix::open(const char *fname, int flags, bool allow_absolute_ if (::stat(fname, &st) == 0 && ((st.st_mode & S_IFMT) != S_IFREG && (st.st_mode & S_IFMT) != S_IFLNK)) { // only allow links and files + if (!allow_absolute_paths) { + map_filename_free(fname); + } return -1; } + // we automatically add O_CLOEXEC as we always want it for ArduPilot FS usage - return ::open(fname, flags | O_CLOEXEC, 0644); + auto ret = ::open(fname, flags | O_CLOEXEC, 0644); + if (!allow_absolute_paths) { + map_filename_free(fname); + } + return ret; } int AP_Filesystem_Posix::close(int fd) @@ -88,8 +115,14 @@ int32_t AP_Filesystem_Posix::write(int fd, const void *buf, uint32_t count) int AP_Filesystem_Posix::fsync(int fd) { +#if AP_FILESYSTEM_POSIX_HAVE_FSYNC FS_CHECK_ALLOWED(-1); return ::fsync(fd); +#else + // we have to pass success here as otherwise it is assumed to be + // failed IO and the caller may close the fd and give up + return 0; +#endif } int32_t AP_Filesystem_Posix::lseek(int fd, int32_t offset, int seek_from) @@ -102,7 +135,9 @@ int AP_Filesystem_Posix::stat(const char *pathname, struct stat *stbuf) { FS_CHECK_ALLOWED(-1); pathname = map_filename(pathname); - return ::stat(pathname, stbuf); + auto ret = ::stat(pathname, stbuf); + map_filename_free(pathname); + return ret; } int AP_Filesystem_Posix::unlink(const char *pathname) @@ -111,10 +146,11 @@ int AP_Filesystem_Posix::unlink(const char *pathname) pathname = map_filename(pathname); // we match the FATFS interface and use unlink // for both files and directories - int ret = ::rmdir(pathname); + int ret = ::rmdir(const_cast(pathname)); if (ret == -1) { ret = ::unlink(pathname); } + map_filename_free(pathname); return ret; } @@ -122,14 +158,18 @@ int AP_Filesystem_Posix::mkdir(const char *pathname) { FS_CHECK_ALLOWED(-1); pathname = map_filename(pathname); - return ::mkdir(pathname, 0775); + auto ret = ::mkdir(const_cast(pathname), 0775); + map_filename_free(pathname); + return ret; } void *AP_Filesystem_Posix::opendir(const char *pathname) { FS_CHECK_ALLOWED(nullptr); pathname = map_filename(pathname); - return (void*)::opendir(pathname); + auto *ret = (void*)::opendir(pathname); + map_filename_free(pathname); + return ret; } struct dirent *AP_Filesystem_Posix::readdir(void *dirp) @@ -149,31 +189,46 @@ int AP_Filesystem_Posix::rename(const char *oldpath, const char *newpath) FS_CHECK_ALLOWED(-1); oldpath = map_filename(oldpath); newpath = map_filename(newpath); - return ::rename(oldpath, newpath); + auto ret = ::rename(oldpath, newpath); + map_filename_free(oldpath); + map_filename_free(newpath); + return ret; } // return free disk space in bytes int64_t AP_Filesystem_Posix::disk_free(const char *path) { +#if AP_FILESYSTEM_POSIX_HAVE_STATFS FS_CHECK_ALLOWED(-1); path = map_filename(path); struct statfs stats; if (::statfs(path, &stats) < 0) { + map_filename_free(path); return -1; } + map_filename_free(path); return (((int64_t)stats.f_bavail) * stats.f_bsize); +#else + return -1; +#endif } // return total disk space in bytes int64_t AP_Filesystem_Posix::disk_space(const char *path) { +#if AP_FILESYSTEM_POSIX_HAVE_STATFS FS_CHECK_ALLOWED(-1); path = map_filename(path); struct statfs stats; if (::statfs(path, &stats) < 0) { + map_filename_free(path); return -1; } + map_filename_free(path); return (((int64_t)stats.f_blocks) * stats.f_bsize); +#else + return -1; +#endif } @@ -182,13 +237,19 @@ int64_t AP_Filesystem_Posix::disk_space(const char *path) */ bool AP_Filesystem_Posix::set_mtime(const char *filename, const uint32_t mtime_sec) { +#if AP_FILESYSTEM_POSIX_HAVE_UTIME FS_CHECK_ALLOWED(false); filename = map_filename(filename); struct utimbuf times {}; times.actime = mtime_sec; times.modtime = mtime_sec; - return utime(filename, ×) == 0; + auto ret = utime(filename, ×) == 0; + map_filename_free(filename); + return ret; +#else + return false; +#endif } #endif // AP_FILESYSTEM_POSIX_ENABLED diff --git a/libraries/AP_Filesystem/AP_Filesystem_posix.h b/libraries/AP_Filesystem/AP_Filesystem_posix.h index e44764213a..2e291db70f 100644 --- a/libraries/AP_Filesystem/AP_Filesystem_posix.h +++ b/libraries/AP_Filesystem/AP_Filesystem_posix.h @@ -29,6 +29,22 @@ #include #include "AP_Filesystem_backend.h" +#ifndef AP_FILESYSTEM_POSIX_HAVE_UTIME +#define AP_FILESYSTEM_POSIX_HAVE_UTIME 1 +#endif + +#ifndef AP_FILESYSTEM_POSIX_HAVE_FSYNC +#define AP_FILESYSTEM_POSIX_HAVE_FSYNC 1 +#endif + +#ifndef AP_FILESYSTEM_POSIX_HAVE_STATFS +#define AP_FILESYSTEM_POSIX_HAVE_STATFS 1 +#endif + +#ifndef O_CLOEXEC +#define O_CLOEXEC 0 +#endif + class AP_Filesystem_Posix : public AP_Filesystem_Backend { public: diff --git a/libraries/AP_Filesystem/posix_compat.h b/libraries/AP_Filesystem/posix_compat.h index 4ccf56b5c5..ce95a8c557 100644 --- a/libraries/AP_Filesystem/posix_compat.h +++ b/libraries/AP_Filesystem/posix_compat.h @@ -78,6 +78,12 @@ char *tmpnam(char s[L_tmpnam]); #endif #define FILE APFS_FILE + +#ifndef __cplusplus +/* + only redefine posix functions for C code (eg. lua). + for C++ use the AP_Filsystem APIs +*/ #define fopen(p,m) apfs_fopen(p,m) #define fprintf(stream, format, args...) apfs_fprintf(stream, format, ##args) #define fflush(s) apfs_fflush(s) @@ -101,6 +107,7 @@ char *tmpnam(char s[L_tmpnam]); #define remove(pathname) apfs_remove(pathname) int sprintf(char *str, const char *format, ...); #endif +#endif // __cplusplus #ifdef __cplusplus } diff --git a/libraries/AP_Follow/AP_Follow.cpp b/libraries/AP_Follow/AP_Follow.cpp index 8723f101bd..b4acb2fc04 100644 --- a/libraries/AP_Follow/AP_Follow.cpp +++ b/libraries/AP_Follow/AP_Follow.cpp @@ -488,13 +488,13 @@ void AP_Follow::init_offsets_if_required(const Vector3f &dist_vec_ned) if ((_offset_type == AP_FOLLOW_OFFSET_TYPE_RELATIVE) && get_target_heading_deg(target_heading_deg)) { // rotate offsets from north facing to vehicle's perspective _offset.set(rotate_vector(-dist_vec_ned, -target_heading_deg)); - gcs().send_text(MAV_SEVERITY_INFO, "Relative follow offset loaded"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Relative follow offset loaded"); } else { // initialise offset in NED frame _offset.set(-dist_vec_ned); // ensure offset_type used matches frame of offsets saved _offset_type.set(AP_FOLLOW_OFFSET_TYPE_NED); - gcs().send_text(MAV_SEVERITY_INFO, "N-E-D follow offset loaded"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "N-E-D follow offset loaded"); } } diff --git a/libraries/AP_Frsky_Telem/AP_Frsky_MAVliteMsgHandler.cpp b/libraries/AP_Frsky_Telem/AP_Frsky_MAVliteMsgHandler.cpp index 623ad0184f..afc1f8b7f1 100644 --- a/libraries/AP_Frsky_Telem/AP_Frsky_MAVliteMsgHandler.cpp +++ b/libraries/AP_Frsky_Telem/AP_Frsky_MAVliteMsgHandler.cpp @@ -153,10 +153,10 @@ MAV_RESULT AP_Frsky_MAVliteMsgHandler::handle_command_do_fence_enable(const mavl switch ((uint16_t)mav_command_long.param1) { case 0: - fence->enable(false); + fence->enable_configured(false); return MAV_RESULT_ACCEPTED; case 1: - fence->enable(true); + fence->enable_configured(true); return MAV_RESULT_ACCEPTED; default: return MAV_RESULT_FAILED; diff --git a/libraries/AP_Frsky_Telem/AP_Frsky_Parameters.cpp b/libraries/AP_Frsky_Telem/AP_Frsky_Parameters.cpp index f9bf7872e8..6d474337ef 100644 --- a/libraries/AP_Frsky_Telem/AP_Frsky_Parameters.cpp +++ b/libraries/AP_Frsky_Telem/AP_Frsky_Parameters.cpp @@ -14,9 +14,9 @@ */ #include "AP_Frsky_Parameters.h" -#if HAL_WITH_FRSKY_TELEM_BIDIRECTIONAL const AP_Param::GroupInfo AP_Frsky_Parameters::var_info[] = { +#if HAL_WITH_FRSKY_TELEM_BIDIRECTIONAL // @Param: UPLINK_ID // @DisplayName: Uplink sensor id // @Description: Change the uplink sensor id (SPort only) @@ -37,6 +37,7 @@ const AP_Param::GroupInfo AP_Frsky_Parameters::var_info[] = { // @Values: -1:Disable,7:7,8:8,9:9,10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,19:19,20:20,21:21,22:22,23:23,24:24,25:25,26:26 // @User: Advanced AP_GROUPINFO("DNLINK2_ID", 3, AP_Frsky_Parameters, _dnlink2_id, 7), +#endif //HAL_WITH_FRSKY_TELEM_BIDIRECTIONAL // @Param: DNLINK_ID // @DisplayName: Default downlink sensor id @@ -58,5 +59,3 @@ AP_Frsky_Parameters::AP_Frsky_Parameters() { AP_Param::setup_object_defaults(this, var_info); } - -#endif //HAL_WITH_FRSKY_TELEM_BIDIRECTIONAL diff --git a/libraries/AP_Frsky_Telem/AP_Frsky_Parameters.h b/libraries/AP_Frsky_Telem/AP_Frsky_Parameters.h index 3826f340e6..f6a06ac962 100644 --- a/libraries/AP_Frsky_Telem/AP_Frsky_Parameters.h +++ b/libraries/AP_Frsky_Telem/AP_Frsky_Parameters.h @@ -16,7 +16,6 @@ #include "AP_Frsky_Telem.h" -#if HAL_WITH_FRSKY_TELEM_BIDIRECTIONAL #include #include @@ -33,11 +32,11 @@ public: private: // settable parameters - AP_Int8 _uplink_id; AP_Int8 _dnlink_id; +#if HAL_WITH_FRSKY_TELEM_BIDIRECTIONAL + AP_Int8 _uplink_id; AP_Int8 _dnlink1_id; AP_Int8 _dnlink2_id; +#endif //HAL_WITH_FRSKY_TELEM_BIDIRECTIONAL AP_Int8 _options; }; - -#endif //HAL_WITH_FRSKY_TELEM_BIDIRECTIONAL diff --git a/libraries/AP_Frsky_Telem/AP_Frsky_SPort.cpp b/libraries/AP_Frsky_Telem/AP_Frsky_SPort.cpp index c4dd68e481..ee22bc40de 100644 --- a/libraries/AP_Frsky_Telem/AP_Frsky_SPort.cpp +++ b/libraries/AP_Frsky_Telem/AP_Frsky_SPort.cpp @@ -43,7 +43,10 @@ void AP_Frsky_SPort::send(void) } for (int16_t i = 0; i < numc; i++) { - int16_t readbyte = _port->read(); + uint8_t readbyte; + if (!_port->read(readbyte)) { + break; + } if (_SPort.sport_status == false) { if (readbyte == FRAME_HEAD) { _SPort.sport_status = true; diff --git a/libraries/AP_Frsky_Telem/AP_Frsky_SPort_Passthrough.cpp b/libraries/AP_Frsky_Telem/AP_Frsky_SPort_Passthrough.cpp index db60fa4048..2621276130 100644 --- a/libraries/AP_Frsky_Telem/AP_Frsky_SPort_Passthrough.cpp +++ b/libraries/AP_Frsky_Telem/AP_Frsky_SPort_Passthrough.cpp @@ -20,8 +20,8 @@ #if HAL_WITH_FRSKY_TELEM_BIDIRECTIONAL #include "AP_Frsky_MAVlite.h" -#include "AP_Frsky_Parameters.h" #endif //HAL_WITH_FRSKY_TELEM_BIDIRECTIONAL +#include "AP_Frsky_Parameters.h" /* for FrSky SPort Passthrough @@ -683,7 +683,9 @@ uint32_t AP_Frsky_SPort_Passthrough::calc_velandyaw(void) */ uint32_t AP_Frsky_SPort_Passthrough::calc_attiandrng(void) { +#if AP_RANGEFINDER_ENABLED const RangeFinder *_rng = RangeFinder::get_singleton(); +#endif float roll; float pitch; @@ -693,7 +695,11 @@ uint32_t AP_Frsky_SPort_Passthrough::calc_attiandrng(void) // pitch from [-9000;9000] centidegrees to unsigned .2 degree increments [0;900] (just in case, limit to 1023 (0x3FF) since the value is stored on 10 bits) attiandrng |= ((uint16_t)roundf((pitch * RAD_TO_DEG * 100 + 9000) * 0.05f) & ATTIANDRNG_PITCH_LIMIT)<distance_cm_orient(ROTATION_PITCH_270) : 0, 3, 1)< 15000) { hal.util->snprintf(failure_msg, failure_msg_len, "GPS[%u] yaw not available", unsigned(i+1)); diff --git a/libraries/AP_GPS/AP_GPS.h b/libraries/AP_GPS/AP_GPS.h index e21bf66524..73bf98ab25 100644 --- a/libraries/AP_GPS/AP_GPS.h +++ b/libraries/AP_GPS/AP_GPS.h @@ -201,8 +201,8 @@ public: float gps_yaw; ///< GPS derived yaw information, if available (degrees) uint32_t gps_yaw_time_ms; ///< timestamp of last GPS yaw reading bool gps_yaw_configured; ///< GPS is configured to provide yaw - uint16_t hdop; ///< horizontal dilution of precision in cm - uint16_t vdop; ///< vertical dilution of precision in cm + uint16_t hdop; ///< horizontal dilution of precision, scaled by a factor of 100 (155 means the HDOP value is 1.55) + uint16_t vdop; ///< vertical dilution of precision, scaled by a factor of 100 (155 means the VDOP value is 1.55) uint8_t num_sats; ///< Number of visible satellites Vector3f velocity; ///< 3D velocity in m/s, in NED format float speed_accuracy; ///< 3D velocity RMS accuracy estimate in m/s @@ -551,9 +551,10 @@ public: // returns true if all GPS instances have passed all final arming checks/state changes bool prepare_for_arming(void); - // returns true if all GPS backend drivers haven't seen any failure - // this is for backends to be able to spout pre arm error messages - bool backends_healthy(char failure_msg[], uint16_t failure_msg_len); + // returns true if all GPS backend drivers are OK with the concept + // of the vehicle arming. this is for backends to be able to + // spout pre arm error messages + bool pre_arm_checks(char failure_msg[], uint16_t failure_msg_len); // returns false if any GPS drivers are not performing their logging appropriately bool logging_failed(void) const; diff --git a/libraries/AP_GPS/AP_GPS_DroneCAN.cpp b/libraries/AP_GPS/AP_GPS_DroneCAN.cpp index a2130fdbdc..8bd8cb7e37 100644 --- a/libraries/AP_GPS/AP_GPS_DroneCAN.cpp +++ b/libraries/AP_GPS/AP_GPS_DroneCAN.cpp @@ -225,10 +225,15 @@ AP_GPS_Backend* AP_GPS_DroneCAN::probe(AP_GPS &_gps, AP_GPS::GPS_State &_state) return backend; } -bool AP_GPS_DroneCAN::backends_healthy(char failure_msg[], uint16_t failure_msg_len) +bool AP_GPS_DroneCAN::inter_instance_pre_arm_checks(char failure_msg[], uint16_t failure_msg_len) { + // lint parameters and detected node IDs: for (uint8_t i = 0; i < GPS_MAX_RECEIVERS; i++) { const auto ¶ms_i = AP::gps().params[i]; + // we are only interested in parameters for DroneCAN GPSs: + if (!is_dronecan_gps_type(params_i.type)) { + continue; + } bool overriden_node_found = false; bool bad_override_config = false; if (params_i.override_node_id == 0) { @@ -237,6 +242,10 @@ bool AP_GPS_DroneCAN::backends_healthy(char failure_msg[], uint16_t failure_msg_ } for (uint8_t j = 0; j < GPS_MAX_RECEIVERS; j++) { const auto ¶ms_j = AP::gps().params[j]; + // we are only interested in parameters for DroneCAN GPSs: + if (!is_dronecan_gps_type(params_j.type)) { + continue; + } if (params_i.override_node_id == params_j.override_node_id && (i != j)) { bad_override_config = true; break; diff --git a/libraries/AP_GPS/AP_GPS_DroneCAN.h b/libraries/AP_GPS/AP_GPS_DroneCAN.h index 200d8ae11c..1de0b6b8f4 100644 --- a/libraries/AP_GPS/AP_GPS_DroneCAN.h +++ b/libraries/AP_GPS/AP_GPS_DroneCAN.h @@ -56,7 +56,7 @@ public: static void handle_moving_baseline_msg_trampoline(AP_DroneCAN *ap_dronecan, const CanardRxTransfer& transfer, const ardupilot_gnss_MovingBaselineData& msg); static void handle_relposheading_msg_trampoline(AP_DroneCAN *ap_dronecan, const CanardRxTransfer& transfer, const ardupilot_gnss_RelPosHeading& msg); #endif - static bool backends_healthy(char failure_msg[], uint16_t failure_msg_len); + static bool inter_instance_pre_arm_checks(char failure_msg[], uint16_t failure_msg_len); void inject_data(const uint8_t *data, uint16_t len) override; bool get_error_codes(uint32_t &error_codes) const override { error_codes = error_code; return seen_status; }; @@ -149,6 +149,15 @@ private: uint32_t last_send_ms; ByteBuffer *buf; } _rtcm_stream; + + // returns true if the supplied GPS_Type is a DroneCAN GPS type + static bool is_dronecan_gps_type(AP_GPS::GPS_Type type) { + return ( + type == AP_GPS::GPS_TYPE_UAVCAN || + type == AP_GPS::GPS_TYPE_UAVCAN_RTK_BASE || + type == AP_GPS::GPS_TYPE_UAVCAN_RTK_ROVER + ); + } }; #endif // AP_GPS_DRONECAN_ENABLED diff --git a/libraries/AP_GPS/AP_GPS_SBF.cpp b/libraries/AP_GPS/AP_GPS_SBF.cpp index e5a102998b..4a18a32955 100644 --- a/libraries/AP_GPS/AP_GPS_SBF.cpp +++ b/libraries/AP_GPS/AP_GPS_SBF.cpp @@ -138,6 +138,19 @@ AP_GPS_SBF::read(void) config_string = nullptr; } break; + case Config_State::Constellation: + if ((params.gnss_mode&0x6F)!=0) { + //IMES not taken into account by Septentrio receivers + if (asprintf(&config_string, "sst, %s%s%s%s%s%s\n", (params.gnss_mode&(1U<<0))!=0 ? "GPS" : "", + (params.gnss_mode&(1U<<1))!=0 ? ((params.gnss_mode&0x01)==0 ? "SBAS" : "+SBAS") : "", + (params.gnss_mode&(1U<<2))!=0 ? ((params.gnss_mode&0x03)==0 ? "GALILEO" : "+GALILEO") : "", + (params.gnss_mode&(1U<<3))!=0 ? ((params.gnss_mode&0x07)==0 ? "BEIDOU" : "+BEIDOU") : "", + (params.gnss_mode&(1U<<5))!=0 ? ((params.gnss_mode&0x0F)==0 ? "QZSS" : "+QZSS") : "", + (params.gnss_mode&(1U<<6))!=0 ? ((params.gnss_mode&0x2F)==0 ? "GLONASS" : "+GLONASS") : "") == -1) { + config_string=nullptr; + } + } + break; case Config_State::Blob: if (asprintf(&config_string, "%s\n", _initialisation_blob[_init_blob_index]) == -1) { config_string = nullptr; @@ -364,6 +377,9 @@ AP_GPS_SBF::parse(uint8_t temp) config_step = Config_State::SSO; break; case Config_State::SSO: + config_step = Config_State::Constellation; + break; + case Config_State::Constellation: config_step = Config_State::Blob; break; case Config_State::Blob: @@ -699,4 +715,5 @@ bool AP_GPS_SBF::prepare_for_arming(void) { return is_logging; } + #endif diff --git a/libraries/AP_GPS/AP_GPS_SBF.h b/libraries/AP_GPS/AP_GPS_SBF.h index 8817653f42..b4e1bb28c6 100644 --- a/libraries/AP_GPS/AP_GPS_SBF.h +++ b/libraries/AP_GPS/AP_GPS_SBF.h @@ -76,6 +76,7 @@ private: Blob, SBAS, SGA, + Constellation, Complete }; Config_State config_step; diff --git a/libraries/AP_GPS/AP_GPS_SITL.cpp b/libraries/AP_GPS/AP_GPS_SITL.cpp index e671ce05f5..c423983adf 100644 --- a/libraries/AP_GPS/AP_GPS_SITL.cpp +++ b/libraries/AP_GPS/AP_GPS_SITL.cpp @@ -21,6 +21,7 @@ #include #include #include +#include extern const AP_HAL::HAL& hal; diff --git a/libraries/AP_GPS/AP_GPS_UBLOX.cpp b/libraries/AP_GPS/AP_GPS_UBLOX.cpp index f9308b8fc3..71e9194c35 100644 --- a/libraries/AP_GPS/AP_GPS_UBLOX.cpp +++ b/libraries/AP_GPS/AP_GPS_UBLOX.cpp @@ -1719,8 +1719,10 @@ AP_GPS_UBLOX::_parse_gps(void) state.hdop = _buffer.pvt.p_dop; state.vdop = _buffer.pvt.p_dop; } - - state.last_gps_time_ms = AP_HAL::millis(); + + if (_buffer.pvt.fix_type >= 2) { + state.last_gps_time_ms = AP_HAL::millis(); + } // time state.time_week_ms = _buffer.pvt.itow; @@ -1835,7 +1837,7 @@ AP_GPS_UBLOX::_parse_gps(void) void AP_GPS_UBLOX::pps_interrupt(uint8_t pin, bool high, uint32_t timestamp_us) { - _last_pps_time_us = timestamp_us; + _last_pps_time_us = AP_HAL::micros64(); } void @@ -2301,7 +2303,14 @@ bool AP_GPS_UBLOX::is_healthy(void) const uint8_t AP_GPS_UBLOX::populate_F9_gnss(void) { uint8_t cfg_count = 0; - if (params.gnss_mode != 0 && (_unconfigured_messages & CONFIG_F9)) { + + if (params.gnss_mode == 0) { + _unconfigured_messages &= ~CONFIG_F9; + last_configured_gnss = params.gnss_mode; + return 0; + } + + if ((_unconfigured_messages & CONFIG_F9) != 0) { // ZED-F9P defaults are // GPS L1C/A+L2C(ZED) // SBAS L1C/A diff --git a/libraries/AP_GPS/examples/GPS_AUTO_test/GPS_AUTO_test.cpp b/libraries/AP_GPS/examples/GPS_AUTO_test/GPS_AUTO_test.cpp index 278b0ee3e5..5eb2b45ae6 100644 --- a/libraries/AP_GPS/examples/GPS_AUTO_test/GPS_AUTO_test.cpp +++ b/libraries/AP_GPS/examples/GPS_AUTO_test/GPS_AUTO_test.cpp @@ -33,8 +33,10 @@ const AP_HAL::HAL& hal = AP_HAL::get_HAL(); //Declare "hal" static AP_BoardConfig board_config; +#if AP_NOTIFY_GPIO_LED_3_ENABLED // create board led object AP_BoardLED board_led; +#endif // create fake gcs object GCS_Dummy _gcs; //gcs stands for Ground Control Station @@ -61,8 +63,10 @@ void setup() board_config.init(); +#if AP_NOTIFY_GPIO_LED_3_ENABLED // Initialise the leds board_led.init(); +#endif // Initialize the UART for GPS system serial_manager.init(); diff --git a/libraries/AP_Generator/AP_Generator_IE_FuelCell.cpp b/libraries/AP_Generator/AP_Generator_IE_FuelCell.cpp index 21725b932c..7a13bed22e 100644 --- a/libraries/AP_Generator/AP_Generator_IE_FuelCell.cpp +++ b/libraries/AP_Generator/AP_Generator_IE_FuelCell.cpp @@ -43,11 +43,9 @@ void AP_Generator_IE_FuelCell::update() const uint32_t now = AP_HAL::millis(); // Read any available data - uint32_t nbytes = MIN(_uart->available(),30u); - while (nbytes-- > 0) { - const int16_t c = _uart->read(); - if (c < 0) { - // Nothing to decode + for (uint8_t i=0; i<30; i++) { // process at most n bytes + uint8_t c; + if (!_uart->read(c)) { break; } diff --git a/libraries/AP_Generator/AP_Generator_RichenPower.cpp b/libraries/AP_Generator/AP_Generator_RichenPower.cpp index 6ce1e2fa85..21750784e5 100644 --- a/libraries/AP_Generator/AP_Generator_RichenPower.cpp +++ b/libraries/AP_Generator/AP_Generator_RichenPower.cpp @@ -125,7 +125,7 @@ bool AP_Generator_RichenPower::get_reading() const uint8_t minor = (version % 100) / 10; const uint8_t point = version % 10; if (!protocol_information_anounced) { - gcs().send_text(MAV_SEVERITY_INFO, "RichenPower: protocol %u.%u.%u", major, minor, point); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "RichenPower: protocol %u.%u.%u", major, minor, point); protocol_information_anounced = true; } @@ -212,7 +212,7 @@ void AP_Generator_RichenPower::check_maintenance_required() if (last_reading.errors & (1U< 60000) { - gcs().send_text(MAV_SEVERITY_NOTICE, "Generator: requires maintenance"); + GCS_SEND_TEXT(MAV_SEVERITY_NOTICE, "Generator: requires maintenance"); last_maintenance_warning_ms = now; } } @@ -267,7 +267,7 @@ void AP_Generator_RichenPower::update_runstate() // because the vehicle is crashed. if (AP::vehicle()->is_crashed()) { if (!vehicle_was_crashed) { - gcs().send_text(MAV_SEVERITY_INFO, "Crash; stopping generator"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Crash; stopping generator"); pilot_desired_runstate = RunState::STOP; vehicle_was_crashed = true; } diff --git a/libraries/AP_Generator/AP_Generator_RichenPower.h b/libraries/AP_Generator/AP_Generator_RichenPower.h index 2fce45e60c..b21c030053 100644 --- a/libraries/AP_Generator/AP_Generator_RichenPower.h +++ b/libraries/AP_Generator/AP_Generator_RichenPower.h @@ -68,7 +68,7 @@ private: RunState pilot_desired_runstate = RunState::STOP; RunState commanded_runstate = RunState::STOP; // output is based on this void set_pilot_desired_runstate(RunState newstate) { - // gcs().send_text(MAV_SEVERITY_INFO, "RichenPower: Moving to state (%u) from (%u)\n", (unsigned)newstate, (unsigned)runstate); + // GCS_SEND_TEXT(MAV_SEVERITY_INFO, "RichenPower: Moving to state (%u) from (%u)\n", (unsigned)newstate, (unsigned)runstate); pilot_desired_runstate = newstate; } void update_runstate(); diff --git a/libraries/AP_HAL/AP_HAL_Boards.h b/libraries/AP_HAL/AP_HAL_Boards.h index cd9dab2565..874782fb91 100644 --- a/libraries/AP_HAL/AP_HAL_Boards.h +++ b/libraries/AP_HAL/AP_HAL_Boards.h @@ -14,6 +14,7 @@ #define HAL_BOARD_CHIBIOS 10 #define HAL_BOARD_F4LIGHT 11 // reserved #define HAL_BOARD_ESP32 12 +#define HAL_BOARD_QURT 13 #define HAL_BOARD_EMPTY 99 /* Default board subtype is -1 */ @@ -139,6 +140,8 @@ #include #elif CONFIG_HAL_BOARD == HAL_BOARD_ESP32 #include +#elif CONFIG_HAL_BOARD == HAL_BOARD_QURT + #include #else #error "Unknown CONFIG_HAL_BOARD type" #endif @@ -188,13 +191,6 @@ #define AP_EXTENDED_DSHOT_TELEM_V2_ENABLED HAL_REQUIRES_BDSHOT_SUPPORT #endif -// this is used as a general mechanism to make a 'small' build by -// dropping little used features. We use this to allow us to keep -// FMUv2 going for as long as possible -#ifndef HAL_MINIMIZE_FEATURES -#define HAL_MINIMIZE_FEATURES 0 -#endif - #ifndef BOARD_FLASH_SIZE #define BOARD_FLASH_SIZE 2048 #endif @@ -375,6 +371,8 @@ #ifndef HAL_GPIO_LED_ON #define HAL_GPIO_LED_ON 0 +#elif HAL_GPIO_LED_ON == 0 +#error "Do not specify HAL_GPIO_LED_ON if you are setting it to the default, 0" #endif #ifdef HAL_GPIO_LED_OFF diff --git a/libraries/AP_HAL/Device.h b/libraries/AP_HAL/Device.h index 95f997138d..74d2c910a0 100644 --- a/libraries/AP_HAL/Device.h +++ b/libraries/AP_HAL/Device.h @@ -20,6 +20,12 @@ #include "AP_HAL_Namespace.h" #include "utility/functor.h" +#include "AP_HAL_Boards.h" + +#if CONFIG_HAL_BOARD != HAL_BOARD_QURT +// we need utility for std::move, but not on QURT due to a include error in hexagon SDK +#include +#endif /* * This is an interface abstracting I2C and SPI devices diff --git a/libraries/AP_HAL/I2CDevice.h b/libraries/AP_HAL/I2CDevice.h index 841e5575c1..1f6e6cf5b4 100644 --- a/libraries/AP_HAL/I2CDevice.h +++ b/libraries/AP_HAL/I2CDevice.h @@ -17,7 +17,6 @@ #pragma once #include -#include #include "AP_HAL_Namespace.h" #include "Device.h" @@ -76,20 +75,6 @@ public: uint32_t bus_clock=400000, bool use_smbus = false, uint32_t timeout_ms=4) = 0; - /* - * Get device by looking up the I2C bus on the buses from @devpaths. - * - * Each string in @devpaths are possible locations for the bus. How the - * strings are implemented are HAL-specific. On Linux this is the info - * returned by 'udevadm info -q path /dev/i2c-X'. The first I2C bus - * matching a prefix in @devpaths is used to create a I2CDevice object. - */ - virtual OwnPtr get_device(std::vector devpaths, - uint8_t address) { - // Not implemented - return nullptr; - } - /* get mask of bus numbers for all configured I2C buses */ diff --git a/libraries/AP_HAL/SIMState.cpp b/libraries/AP_HAL/SIMState.cpp index e03cde7a66..f5c4783422 100644 --- a/libraries/AP_HAL/SIMState.cpp +++ b/libraries/AP_HAL/SIMState.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -130,7 +131,7 @@ void SIMState::fdm_input_local(void) // output JSON state to ride along flight controllers // ride_along.send(_sitl->state,sitl_model->get_position_relhome()); -#if HAL_SIM_GIMBAL_ENABLED +#if AP_SIM_SOLOGIMBAL_ENABLED if (gimbal != nullptr) { gimbal->update(); } diff --git a/libraries/AP_HAL/SIMState.h b/libraries/AP_HAL/SIMState.h index 0c84791f91..f434347571 100644 --- a/libraries/AP_HAL/SIMState.h +++ b/libraries/AP_HAL/SIMState.h @@ -7,7 +7,7 @@ #include #include -#include +#include #include #include #include @@ -109,10 +109,10 @@ private: // internal SITL model SITL::Aircraft *sitl_model; -#if HAL_SIM_GIMBAL_ENABLED +#if AP_SIM_SOLOGIMBAL_ENABLED // simulated gimbal bool enable_gimbal; - SITL::Gimbal *gimbal; + SITL::SoloGimbal *gimbal; #endif #if HAL_SIM_ADSB_ENABLED diff --git a/libraries/AP_HAL/Util.h b/libraries/AP_HAL/Util.h index da22f1a8be..4f39702bd5 100644 --- a/libraries/AP_HAL/Util.h +++ b/libraries/AP_HAL/Util.h @@ -5,6 +5,10 @@ #include "AP_HAL_Namespace.h" #include +#ifndef ENABLE_HEAP +#define ENABLE_HEAP 0 +#endif + class ExpandingString; class AP_HAL::Util { @@ -44,11 +48,6 @@ public: // set command line parameters to the eeprom on start virtual void set_cmdline_parameters() {}; - // run a debug shall on the given stream if possible. This is used - // to support dropping into a debug shell to run firmware upgrade - // commands - virtual bool run_debug_shell(AP_HAL::BetterStream *stream) = 0; - enum safety_state : uint8_t { SAFETY_NONE, SAFETY_DISARMED, @@ -134,11 +133,6 @@ public: virtual bool toneAlarm_init(uint8_t types) { return false;} virtual void toneAlarm_set_buzzer_tone(float frequency, float volume, uint32_t duration_ms) {} - /* - return a stream for access to a system shell, if available - */ - virtual AP_HAL::BetterStream *get_shell_stream() { return nullptr; } - /* Support for an imu heating system */ virtual void set_imu_temp(float current) {} @@ -154,7 +148,7 @@ public: virtual void *malloc_type(size_t size, Memory_Type mem_type) { return calloc(1, size); } virtual void free_type(void *ptr, size_t size, Memory_Type mem_type) { return free(ptr); } -#ifdef ENABLE_HEAP +#if ENABLE_HEAP // heap functions, note that a heap once alloc'd cannot be dealloc'd virtual void *allocate_heap_memory(size_t size) = 0; virtual void *heap_realloc(void *heap, void *ptr, size_t old_size, size_t new_size) = 0; diff --git a/libraries/AP_HAL/WSPIDevice.h b/libraries/AP_HAL/WSPIDevice.h index 1b4c3a294c..4ad8e67d84 100644 --- a/libraries/AP_HAL/WSPIDevice.h +++ b/libraries/AP_HAL/WSPIDevice.h @@ -17,7 +17,6 @@ #pragma once #include -#include #include "AP_HAL_Namespace.h" #include "Device.h" diff --git a/libraries/AP_HAL/board/chibios.h b/libraries/AP_HAL/board/chibios.h index cd0d890810..9e5cd5911f 100644 --- a/libraries/AP_HAL/board/chibios.h +++ b/libraries/AP_HAL/board/chibios.h @@ -4,6 +4,10 @@ #define HAL_BOARD_NAME "ChibiOS" +#ifdef HAL_HAVE_PIXRACER_LED +#error "use AP_NOTIFY_GPIO_LED_RGB_ENABLED in place of HAL_HAVE_PIXRACER_LED (and rename your pins!)" +#endif + #if HAL_MEMORY_TOTAL_KB >= 1000 #define HAL_MEM_CLASS HAL_MEM_CLASS_1000 #elif HAL_MEMORY_TOTAL_KB >= 500 diff --git a/libraries/AP_HAL/board/linux.h b/libraries/AP_HAL/board/linux.h index 80238c3a56..a26cb8d1c5 100644 --- a/libraries/AP_HAL/board/linux.h +++ b/libraries/AP_HAL/board/linux.h @@ -36,6 +36,7 @@ #define HAL_BARO_PROBE_LIST PROBE_BARO_SPI(MS56XX, "ms5611") #define HAL_MAG_PROBE_LIST PROBE_MAG_IMU(AK8963, mpu9250, 0, ROTATION_NONE) #define HAL_PROBE_EXTERNAL_I2C_COMPASSES + #define AP_NOTIFY_GPIO_LED_3_ENABLED 1 #define HAL_GPIO_A_LED_PIN 61 #define HAL_GPIO_B_LED_PIN 48 #define HAL_GPIO_C_LED_PIN 117 @@ -121,7 +122,9 @@ #define AP_COMPASS_OFFSETS_MAX_DEFAULT 2200 #define HAL_BATT_MONITOR_DEFAULT AP_BattMonitor::Type::BEBOP #define HAL_GPIO_SCRIPT "/data/ftp/internal_000/ardupilot/gpio.sh" + #define AP_NOTIFY_DISCO_LED_ENABLED 1 #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_NAVIO + #define AP_NOTIFY_GPIO_LED_3_ENABLED 1 #define HAL_GPIO_A_LED_PIN 0 #define HAL_GPIO_B_LED_PIN 1 #define HAL_GPIO_C_LED_PIN 2 @@ -138,11 +141,13 @@ #define HAL_MAG_PROBE2 PROBE_MAG_IMU(AK8963, mpu9250, 0, ROTATION_NONE) #define HAL_MAG_PROBE_LIST HAL_MAG_PROBE1; HAL_MAG_PROBE2 #define HAL_PROBE_EXTERNAL_I2C_COMPASSES + #define AP_NOTIFY_SYSFS_LED_ENABLED 1 #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_ERLEBRAIN2 #define HAL_INS_PROBE_LIST PROBE_IMU_SPI(Invensense, "mpu9250", ROTATION_YAW_270) #define HAL_BARO_PROBE_LIST PROBE_BARO_SPI(MS56XX, "ms5611") #define HAL_MAG_PROBE_LIST PROBE_MAG_IMU(AK8963, mpu9250, 0, ROTATION_NONE) #define HAL_PROBE_EXTERNAL_I2C_COMPASSES + #define AP_NOTIFY_GPIO_LED_3_ENABLED 1 #define HAL_GPIO_A_LED_PIN 24 #define HAL_GPIO_B_LED_PIN 25 #define HAL_GPIO_C_LED_PIN 16 @@ -158,6 +163,7 @@ #define HAL_MAG_PROBE_LIST PROBE_MAG_IMU(AK8963, mpu9250, 0, ROTATION_NONE) #define HAL_PROBE_EXTERNAL_I2C_COMPASSES #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BBBMINI + #define AP_NOTIFY_GPIO_LED_3_ENABLED 1 #define HAL_GPIO_A_LED_PIN 69 #define HAL_GPIO_B_LED_PIN 68 #define HAL_GPIO_C_LED_PIN 45 @@ -185,7 +191,9 @@ #define HAL_LINUX_I2C_EXTERNAL_BUS_MASK 1 << 6 // We don't want any probing on the internal buses #define HAL_LINUX_I2C_INTERNAL_BUS_MASK 0 + #define AP_NOTIFY_NAVIGATOR_LED_ENABLED 1 #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BLUE + #define AP_NOTIFY_GPIO_LED_2_ENABLED 1 #define HAL_GPIO_A_LED_PIN 66 #define HAL_GPIO_B_LED_PIN 67 #define HAL_GPIO_LED_ON 1 @@ -197,6 +205,7 @@ #define HAL_RANGEFINDER_LIGHTWARE_I2C_BUS 1 #define HAL_NUM_CAN_IFACES 1 #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_POCKET + #define AP_NOTIFY_GPIO_LED_3_ENABLED 1 #define HAL_GPIO_A_LED_PIN 59 #define HAL_GPIO_B_LED_PIN 58 #define HAL_GPIO_C_LED_PIN 57 @@ -216,9 +225,11 @@ #define HAL_INS_PROBE_LIST HAL_INS_PROBE1; HAL_INS_PROBE2 #define HAL_MAG_PROBE_LIST PROBE_MAG_IMU(AK8963, mpu9250, 0, ROTATION_NONE) #define HAL_PROBE_EXTERNAL_I2C_COMPASSES + #define AP_NOTIFY_GPIO_LED_3_ENABLED 1 #define HAL_GPIO_A_LED_PIN 17 #define HAL_GPIO_B_LED_PIN 18 #define HAL_GPIO_C_LED_PIN 22 + #define AP_NOTIFY_RCOUTPUTRGBLED_LED_ENABLED 1 #define HAL_RCOUT_RGBLED_RED 13 #define HAL_RCOUT_RGBLED_GREEN 14 #define HAL_RCOUT_RGBLED_BLUE 15 @@ -227,6 +238,7 @@ #define HAL_BARO_PROBE_LIST PROBE_BARO_SPI(MS56XX, "ms5611") #define HAL_MAG_PROBE_LIST PROBE_MAG_IMU(AK8963, mpu9250, 0, ROTATION_NONE) #define HAL_PROBE_EXTERNAL_I2C_COMPASSES + #define AP_NOTIFY_GPIO_LED_3_ENABLED 1 #define HAL_GPIO_A_LED_PIN 24 #define HAL_GPIO_B_LED_PIN 25 #define HAL_GPIO_C_LED_PIN 16 @@ -243,6 +255,7 @@ #define HAL_INS_PROBE_LIST PROBE_IMU_SPI(Invensense, "mpu9250", ROTATION_NONE) #define HAL_MAG_PROBE_LIST PROBE_MAG_IMU(AK8963, mpu9250, 0, ROTATION_NONE) #define HAL_BARO_PROBE_LIST PROBE_BARO_I2C(MS56XX, 1, 0x77) + #define AP_NOTIFY_GPIO_LED_3_ENABLED 1 #define HAL_GPIO_A_LED_PIN 24 #define HAL_GPIO_B_LED_PIN 25 #define HAL_GPIO_C_LED_PIN 16 @@ -266,6 +279,7 @@ #define HAL_LINUX_HEAT_PERIOD_NS 2040816 #define HAL_GPS1_TYPE_DEFAULT 9 #define HAL_CAN_DRIVER_DEFAULT 1 + #define AP_NOTIFY_RCOUTPUTRGBLEDINVERTED_LED_ENABLED 1 #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_RST_ZYNQ #define HAL_INS_PROBE_LIST PROBE_IMU_SPI2(Invensense, "rst_g", "rst_a", ROTATION_ROLL_180_YAW_90, ROTATION_ROLL_180_YAW_90) #define HAL_BARO_PROBE_LIST PROBE_BARO_SPI(MS56XX, "ms5611") @@ -278,6 +292,7 @@ #define HAL_PROBE_EXTERNAL_I2C_COMPASSES #define HAL_NUM_CAN_IFACES 1 #define HAL_CAN_DRIVER_DEFAULT 1 + #define AP_NOTIFY_GPIO_LED_3_ENABLED 1 #define HAL_GPIO_A_LED_PIN 22 #define HAL_GPIO_B_LED_PIN 27 #define HAL_GPIO_C_LED_PIN 6 @@ -313,6 +328,7 @@ #ifdef OBAL_NOTIFY_LED + #define AP_NOTIFY_GPIO_LED_3_ENABLED 1 #define HAL_GPIO_A_LED_PIN 27 // You can choose between 27,22,4,12 #define HAL_GPIO_C_LED_PIN 22 // You can choose between 27,22,4,12 #define HAL_GPIO_B_LED_PIN 4 // You can choose between 27,22,4,12 @@ -325,6 +341,10 @@ #error "no Linux board subtype set" #endif +#ifndef BOARD_FLASH_SIZE +#define BOARD_FLASH_SIZE 4096 +#endif + #ifndef HAL_OPTFLOW_PX4FLOW_I2C_ADDRESS #define HAL_OPTFLOW_PX4FLOW_I2C_ADDRESS 0x42 #endif diff --git a/libraries/AP_HAL/board/qurt.h b/libraries/AP_HAL/board/qurt.h new file mode 100644 index 0000000000..6f48b5fcbd --- /dev/null +++ b/libraries/AP_HAL/board/qurt.h @@ -0,0 +1,110 @@ +#pragma once + +#include + +#define HAL_BOARD_NAME "QURT" +#define HAL_CPU_CLASS HAL_CPU_CLASS_1000 +#define HAL_MEM_CLASS HAL_MEM_CLASS_1000 +#define HAL_STORAGE_SIZE 32768 +#define HAL_STORAGE_SIZE_AVAILABLE HAL_STORAGE_SIZE + +// only include if compiling C++ code +#ifdef __cplusplus +#include +#define HAL_Semaphore QURT::Semaphore +#define HAL_BinarySemaphore QURT::BinarySemaphore +#endif + +#ifndef HAL_HAVE_HARDWARE_DOUBLE +#define HAL_HAVE_HARDWARE_DOUBLE 0 +#endif + +#ifndef HAL_WITH_EKF_DOUBLE +#define HAL_WITH_EKF_DOUBLE HAL_HAVE_HARDWARE_DOUBLE +#endif + +#ifndef HAL_GYROFFT_ENABLED +#define HAL_GYROFFT_ENABLED 0 +#endif + +/* + disable features for initial port + */ +#define HAL_HAVE_BOARD_VOLTAGE 0 +#define HAL_HAVE_SERVO_VOLTAGE 0 +#define HAL_HAVE_SAFETY_SWITCH 0 +#define HAL_WITH_MCU_MONITORING 0 +#define HAL_USE_QUADSPI 0 +#define HAL_WITH_DSP 0 + +#define HAL_CANFD_SUPPORTED 0 +#define HAL_NUM_CAN_IFACES 0 + +#define AP_CRASHDUMP_ENABLED 0 +#define HAL_ENABLE_DFU_BOOT 0 + + +#define HAL_LOGGING_MAVLINK_ENABLED 0 + +#define HAL_LOGGING_FILESYSTEM_ENABLED 1 + +#define AP_FILESYSTEM_POSIX_HAVE_UTIME 0 +#define AP_FILESYSTEM_POSIX_HAVE_FSYNC 0 +#define AP_FILESYSTEM_POSIX_HAVE_STATFS 0 +#define AP_FILESYSTEM_HAVE_DIRENT_DTYPE 0 + +#define AP_FILESYSTEM_POSIX_MAP_FILENAME_ALLOC 1 +#define AP_FILESYSTEM_POSIX_MAP_FILENAME_BASEDIR "/data" +#define HAL_BOARD_STORAGE_DIRECTORY "APM" +#define HAL_BOARD_LOG_DIRECTORY "APM/logs" +#define HAL_BOARD_TERRAIN_DIRECTORY "APM/terrain" + +#define SCRIPTING_DIRECTORY "APM/scripts" + +/* + a defaults file for this vehicle + */ +#ifndef HAL_PARAM_DEFAULTS_PATH +// this is an absolute path, as required by AP_Param +#define HAL_PARAM_DEFAULTS_PATH AP_FILESYSTEM_POSIX_MAP_FILENAME_BASEDIR "/APM/defaults.parm" +#endif + +#define USE_LIBC_REALLOC 1 + +#define HAL_WITH_ESC_TELEM 1 + +/* + battery monitoring setup, comes in via ESCs + */ +#define HAL_BATT_VOLT_PIN 1 +#define HAL_BATT_CURR_PIN 2 +#define HAL_BATT_MONITOR_DEFAULT 4 +#define HAL_BATT_VOLT_SCALE 1 +#define HAL_BATT_CURR_SCALE 1 + +#define HAL_PROBE_EXTERNAL_I2C_COMPASSES + +/* + compass list + */ +#define PROBE_MAG_I2C(driver, bus, addr, args ...) ADD_BACKEND(DRIVER_ ##driver, AP_Compass_ ## driver::probe(GET_I2C_DEVICE(bus, addr),##args)) +#define HAL_MAG_PROBE_LIST PROBE_MAG_I2C(QMC5883L, 0, 0x0d, true, ROTATION_NONE) + +/* + barometer list + */ +#define PROBE_BARO_I2C(driver, bus, addr, args ...) ADD_BACKEND(AP_Baro_ ## driver::probe(*this,std::move(GET_I2C_DEVICE(bus, addr)),##args)) +#define HAL_BARO_PROBE_LIST PROBE_BARO_I2C(ICP101XX, 2, 0x63) + +/* + IMU list + */ +#define PROBE_IMU_SPI(driver, devname, args ...) ADD_BACKEND(AP_InertialSensor_ ## driver::probe(*this,hal.spi->get_device(devname),##args)) +#define HAL_INS_PROBE_LIST PROBE_IMU_SPI(Invensensev3, "INV3", ROTATION_NONE) + +/* + bring in missing standard library functions + */ +#include + +#define DEFAULT_SERIAL4_PROTOCOL 23 // RC input diff --git a/libraries/AP_HAL/board/sitl.h b/libraries/AP_HAL/board/sitl.h index ea0e165ad9..7738814898 100644 --- a/libraries/AP_HAL/board/sitl.h +++ b/libraries/AP_HAL/board/sitl.h @@ -29,6 +29,10 @@ #define HAL_FLASH_ALLOW_UPDATE 0 #endif +#ifndef BOARD_FLASH_SIZE +#define BOARD_FLASH_SIZE 4096 +#endif + #ifndef HAL_STORAGE_SIZE #define HAL_STORAGE_SIZE 32768 #endif @@ -39,9 +43,17 @@ #define HAL_PARAM_DEFAULTS_PATH nullptr #define HAL_INS_DEFAULT HAL_INS_NONE #define HAL_BARO_DEFAULT HAL_BARO_NONE -#define HAL_GPIO_A_LED_PIN 61 -#define HAL_GPIO_B_LED_PIN 48 -#define HAL_GPIO_C_LED_PIN 117 + +// simulated LEDs are disabled by default as they lead to a large +// amount of SIM_GPIO_MASK mavlink traffic + +// #define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 +#define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 8 // these are set in SIM_PIN_MASK +#define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 9 +#define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 10 + +// #define AP_NOTIFY_GPIO_LED_1_ENABLED 1 +#define AP_NOTIFY_GPIO_LED_A_PIN 8 // these are set in SIM_PIN_MASK #define HAL_HAVE_BOARD_VOLTAGE 1 #define HAL_HAVE_SERVO_VOLTAGE 1 @@ -82,3 +94,5 @@ #ifndef AP_FILTER_ENABLED #define AP_FILTER_ENABLED 1 #endif + +#define HAL_SOLO_GIMBAL_ENABLED 1 diff --git a/libraries/AP_HAL/utility/Socket.cpp b/libraries/AP_HAL/utility/Socket.cpp index 35d368a853..21835199ef 100644 --- a/libraries/AP_HAL/utility/Socket.cpp +++ b/libraries/AP_HAL/utility/Socket.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #endif #include diff --git a/libraries/AP_HAL_ChibiOS/GPIO.cpp b/libraries/AP_HAL_ChibiOS/GPIO.cpp index 15812c9b33..d2218a21ab 100644 --- a/libraries/AP_HAL_ChibiOS/GPIO.cpp +++ b/libraries/AP_HAL_ChibiOS/GPIO.cpp @@ -241,17 +241,16 @@ uint8_t GPIO::read(uint8_t pin) if (g) { return palReadLine(g->pal_line); } +#if HAL_WITH_IO_MCU + if (AP_BoardConfig::io_enabled() && iomcu.valid_GPIO_pin(pin)) { + return iomcu.read_virtual_GPIO(pin); + } +#endif return 0; } void GPIO::write(uint8_t pin, uint8_t value) { -#if HAL_WITH_IO_MCU - if (AP_BoardConfig::io_enabled() && iomcu.valid_GPIO_pin(pin)) { - iomcu.write_GPIO(pin, value); - return; - } -#endif struct gpio_entry *g = gpio_by_pin_num(pin); if (g) { if (g->is_input) { @@ -263,36 +262,42 @@ void GPIO::write(uint8_t pin, uint8_t value) } else { palSetLine(g->pal_line); } + return; } +#if HAL_WITH_IO_MCU + if (AP_BoardConfig::io_enabled() && iomcu.valid_GPIO_pin(pin)) { + iomcu.write_GPIO(pin, value); + } +#endif } void GPIO::toggle(uint8_t pin) { -#if HAL_WITH_IO_MCU - if (AP_BoardConfig::io_enabled() && iomcu.valid_GPIO_pin(pin)) { - iomcu.toggle_GPIO(pin); - return; - } -#endif struct gpio_entry *g = gpio_by_pin_num(pin); if (g) { palToggleLine(g->pal_line); + return; } +#if HAL_WITH_IO_MCU + if (AP_BoardConfig::io_enabled() && iomcu.valid_GPIO_pin(pin)) { + iomcu.toggle_GPIO(pin); + } +#endif } /* Alternative interface: */ AP_HAL::DigitalSource* GPIO::channel(uint16_t pin) { + struct gpio_entry *g = gpio_by_pin_num(pin); + if (g != nullptr) { + return NEW_NOTHROW DigitalSource(g->pal_line); + } #if HAL_WITH_IO_MCU if (AP_BoardConfig::io_enabled() && iomcu.valid_GPIO_pin(pin)) { return NEW_NOTHROW IOMCU_DigitalSource(pin); } #endif - struct gpio_entry *g = gpio_by_pin_num(pin); - if (!g) { - return nullptr; - } - return NEW_NOTHROW DigitalSource(g->pal_line); + return nullptr; } extern const AP_HAL::HAL& hal; @@ -526,12 +531,15 @@ bool GPIO::wait_pin(uint8_t pin, INTERRUPT_TRIGGER_TYPE mode, uint32_t timeout_u // check if a pin number is valid bool GPIO::valid_pin(uint8_t pin) const { + if (gpio_by_pin_num(pin) != nullptr) { + return true; + } #if HAL_WITH_IO_MCU if (AP_BoardConfig::io_enabled() && iomcu.valid_GPIO_pin(pin)) { return true; } #endif - return gpio_by_pin_num(pin) != nullptr; + return false; } // return servo channel associated with GPIO pin. Returns true on success and fills in servo_ch argument diff --git a/libraries/AP_HAL_ChibiOS/RCOutput.cpp b/libraries/AP_HAL_ChibiOS/RCOutput.cpp index 0fcc96e04c..da2b34fa36 100644 --- a/libraries/AP_HAL_ChibiOS/RCOutput.cpp +++ b/libraries/AP_HAL_ChibiOS/RCOutput.cpp @@ -1263,9 +1263,13 @@ bool RCOutput::get_output_mode_banner(char banner_msg[], uint8_t banner_msg_len) if (iomcu_enabled) { uint8_t iomcu_mask; const output_mode iomcu_mode = iomcu.get_output_mode(iomcu_mask); + const uint8_t gpio_mask = iomcu.get_GPIO_mask(); for (uint8_t i = 0; i < chan_offset; i++ ) { - if (iomcu_mask & 1U< 32) { + } else if (!_rts_is_active && space > _rts_threshold+16) { _rts_is_active = true; palClearLine(arts_line); } @@ -1661,22 +1698,38 @@ bool UARTDriver::set_options(uint16_t options) cr2 &= ~USART_CR2_SWAP; _cr2_options &= ~USART_CR2_SWAP; } -#else // STM32F4 +#elif defined(STM32F4) // STM32F4 // F4 can do inversion by GPIO if enabled in hwdef.dat, using // TXINV and RXINV options if (options & OPTION_RXINV) { if (sdef.rxinv_gpio >= 0) { hal.gpio->write(sdef.rxinv_gpio, sdef.rxinv_polarity); + if (arx_line != 0) { + palLineSetPushPull(arx_line, PAL_PUSHPULL_PULLDOWN); + } } else { ret = false; } + } else if (sdef.rxinv_gpio >= 0) { + hal.gpio->write(sdef.rxinv_gpio, !sdef.rxinv_polarity); + if (arx_line != 0) { + palLineSetPushPull(arx_line, PAL_PUSHPULL_PULLUP); + } } if (options & OPTION_TXINV) { if (sdef.txinv_gpio >= 0) { hal.gpio->write(sdef.txinv_gpio, sdef.txinv_polarity); + if (atx_line != 0) { + palLineSetPushPull(atx_line, PAL_PUSHPULL_PULLDOWN); + } } else { ret = false; } + } else if (sdef.txinv_gpio >= 0) { + hal.gpio->write(sdef.txinv_gpio, !sdef.txinv_polarity); + if (atx_line != 0) { + palLineSetPushPull(atx_line, PAL_PUSHPULL_PULLUP); + } } if (options & OPTION_SWAP) { ret = false; @@ -1747,13 +1800,22 @@ void UARTDriver::uart_info(ExpandingString &str, StatsTracker &stats, const uint } else { str.printf("UART%u ", unsigned(sdef.instance)); } - str.printf("TX%c=%8u RX%c=%8u TXBD=%6u RXBD=%6u FlowCtrl=%u\n", + str.printf("TX%c=%8u RX%c=%8u TXBD=%6u RXBD=%6u" +#if CH_CFG_USE_EVENTS == TRUE + " FE=%lu OE=%lu NE=%lu" +#endif + " FlowCtrl=%u\n", tx_dma_enabled ? '*' : ' ', unsigned(tx_bytes), rx_dma_enabled ? '*' : ' ', unsigned(rx_bytes), unsigned((tx_bytes * 10000) / dt_ms), unsigned((rx_bytes * 10000) / dt_ms), +#if CH_CFG_USE_EVENTS == TRUE + _rx_stats_framing_errors, + _rx_stats_overrun_errors, + _rx_stats_noise_errors, +#endif _flow_control); } #endif diff --git a/libraries/AP_HAL_ChibiOS/UARTDriver.h b/libraries/AP_HAL_ChibiOS/UARTDriver.h index e50230d427..c549b8eebd 100644 --- a/libraries/AP_HAL_ChibiOS/UARTDriver.h +++ b/libraries/AP_HAL_ChibiOS/UARTDriver.h @@ -28,6 +28,10 @@ // enough for serial0 to serial9, plus IOMCU #define UART_MAX_DRIVERS 11 +#ifndef HAL_HAVE_LOW_NOISE_UART +#define HAL_HAVE_LOW_NOISE_UART 0 +#endif + class ChibiOS::UARTDriver : public AP_HAL::UARTDriver { public: UARTDriver(uint8_t serial_num); @@ -79,6 +83,10 @@ public: uint8_t get_index(void) const { return uint8_t(this - &_serial_tab[0]); } + +#if HAL_HAVE_LOW_NOISE_UART + bool low_noise_line; +#endif }; bool wait_timeout(uint16_t n, uint32_t timeout_ms) override; @@ -182,6 +190,7 @@ private: #endif ByteBuffer _readbuf{0}; ByteBuffer _writebuf{0}; + uint32_t _rts_threshold; HAL_Semaphore _write_mutex; #ifndef HAL_UART_NODMA const stm32_dma_stream_t* rxdma; @@ -281,6 +290,13 @@ protected: // Getters for cumulative tx and rx counts uint32_t get_total_tx_bytes() const override { return _tx_stats_bytes; } uint32_t get_total_rx_bytes() const override { return _rx_stats_bytes; } +#if CH_CFG_USE_EVENTS == TRUE + uint32_t _rx_stats_framing_errors; + uint32_t _rx_stats_overrun_errors; + uint32_t _rx_stats_noise_errors; + event_listener_t err_listener; + bool err_listener_initialised; +#endif #endif }; diff --git a/libraries/AP_HAL_ChibiOS/Util.cpp b/libraries/AP_HAL_ChibiOS/Util.cpp index 88db69e689..5b6e705735 100644 --- a/libraries/AP_HAL_ChibiOS/Util.cpp +++ b/libraries/AP_HAL_ChibiOS/Util.cpp @@ -96,7 +96,7 @@ void Util::free_type(void *ptr, size_t size, AP_HAL::Util::Memory_Type mem_type) } -#ifdef ENABLE_HEAP +#if ENABLE_HEAP void *Util::allocate_heap_memory(size_t size) { @@ -269,7 +269,7 @@ uint64_t Util::get_hw_rtc() const #if HAL_GCS_ENABLED #include -#define Debug(fmt, args ...) do { gcs().send_text(MAV_SEVERITY_INFO, fmt, ## args); } while (0) +#define Debug(fmt, args ...) do { GCS_SEND_TEXT(MAV_SEVERITY_INFO, fmt, ## args); } while (0) #endif // HAL_GCS_ENABLED #ifndef Debug @@ -641,8 +641,11 @@ void Util::apply_persistent_params(void) const been done by whether the IDs are configured in storage */ - if (strncmp(pname, "INS_ACC", 7) == 0 && - strcmp(pname+strlen(pname)-3, "_ID") == 0) { + bool legacy_acc_id = strncmp(pname, "INS_ACC", 7) == 0 && + strcmp(pname+strlen(pname)-3, "_ID") == 0; + bool new_acc_id = strncmp(pname, "INS", 3) == 0 && + strcmp(pname+strlen(pname)-6, "ACC_ID") == 0; + if (legacy_acc_id || new_acc_id) { enum ap_var_type ptype; AP_Int32 *ap = (AP_Int32 *)AP_Param::find(pname, &ptype); if (ap && ptype == AP_PARAM_INT32) { diff --git a/libraries/AP_HAL_ChibiOS/Util.h b/libraries/AP_HAL_ChibiOS/Util.h index 8e431484a0..f11dbf7239 100644 --- a/libraries/AP_HAL_ChibiOS/Util.h +++ b/libraries/AP_HAL_ChibiOS/Util.h @@ -37,7 +37,6 @@ public: return static_cast(util); } - bool run_debug_shell(AP_HAL::BetterStream *stream) override { return false; } uint32_t available_memory() override; // get path to custom defaults file for AP_Param @@ -49,7 +48,7 @@ public: void *malloc_type(size_t size, AP_HAL::Util::Memory_Type mem_type) override; void free_type(void *ptr, size_t size, AP_HAL::Util::Memory_Type mem_type) override; -#ifdef ENABLE_HEAP +#if ENABLE_HEAP // heap functions, note that a heap once alloc'd cannot be dealloc'd virtual void *allocate_heap_memory(size_t size) override; virtual void *heap_realloc(void *heap, void *ptr, size_t old_size, size_t new_size) override; @@ -143,7 +142,7 @@ private: FlashBootloader flash_bootloader() override; #endif -#ifdef ENABLE_HEAP +#if ENABLE_HEAP static memory_heap_t scripting_heap; #endif // ENABLE_HEAP diff --git a/libraries/AP_HAL_ChibiOS/hwdef/3DRControlZeroG/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/3DRControlZeroG/hwdef.dat index dd11ad1d5c..3223ef5ef2 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/3DRControlZeroG/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/3DRControlZeroG/hwdef.dat @@ -237,16 +237,16 @@ define HAL_WITH_RAMTRON 1 define HAL_OS_FATFS_IO 1 # Control Zero has a TriColor LED, Red, Green, Blue -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # LED setup for PixracerLED driver PB11 LED_R OUTPUT HIGH GPIO(0) PB1 LED_G OUTPUT HIGH GPIO(1) PB3 LED_B OUTPUT HIGH GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 # DMA_PRIORITY SDMMC* DMA_NOSHARE SPI1* SPI5* diff --git a/libraries/AP_HAL_ChibiOS/hwdef/ACNS-CM4Pilot/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/ACNS-CM4Pilot/hwdef.dat index b7ccd9ff57..3d92193527 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/ACNS-CM4Pilot/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/ACNS-CM4Pilot/hwdef.dat @@ -111,6 +111,7 @@ PC14 LED_BLUE OUTPUT LOW GPIO(0) PA13 LED_GREEN OUTPUT LOW GPIO(1) #PC15 LED_RED OUTPUT LOW GPIO(2) +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 define HAL_GPIO_A_LED_PIN 0 define HAL_GPIO_B_LED_PIN 1 #define HAL_GPIO_C_LED_PIN 2 @@ -163,9 +164,6 @@ COMPASS LIS3MDL SPI:lis3mdl false ROTATION_ROLL_180_YAW_270 define HAL_OS_FATFS_IO 1 -define HAL_BOARD_LOG_DIRECTORY "/APM/LOGS" -define HAL_BOARD_TERRAIN_DIRECTORY "/APM/TERRAIN" - # define default battery setup define HAL_BATT_MONITOR_DEFAULT 4 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/ACNS-F405AIO/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/ACNS-F405AIO/hwdef.dat index 299624fd64..b46ceda168 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/ACNS-F405AIO/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/ACNS-F405AIO/hwdef.dat @@ -112,6 +112,7 @@ PC14 LED_BLUE OUTPUT LOW GPIO(0) PA13 LED_GREEN OUTPUT LOW GPIO(1) PC15 LED_RED OUTPUT LOW GPIO(2) +define AP_NOTIFY_GPIO_LED_3_ENABLED 1 define HAL_GPIO_A_LED_PIN 0 define HAL_GPIO_B_LED_PIN 1 define HAL_GPIO_C_LED_PIN 2 @@ -168,9 +169,6 @@ COMPASS LIS3MDL SPI:lis3mdl false ROTATION_ROLL_180_YAW_90 define HAL_OS_FATFS_IO 1 -define HAL_BOARD_LOG_DIRECTORY "/APM/LOGS" -define HAL_BOARD_TERRAIN_DIRECTORY "/APM/TERRAIN" - # define default battery setup define HAL_BATT_MONITOR_DEFAULT 4 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/AIRLink/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/AIRLink/hwdef.dat index 500cce0110..88db88f3b7 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/AIRLink/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/AIRLink/hwdef.dat @@ -229,9 +229,9 @@ PE4 LED_GREEN OUTPUT GPIO(91) LOW PE3 LED_BLUE OUTPUT GPIO(92) HIGH # setup for BoardLED2 +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 define HAL_GPIO_A_LED_PIN 90 define HAL_GPIO_B_LED_PIN 92 -define HAL_GPIO_LED_ON 0 # enable RAMTROM parameter storage define HAL_STORAGE_SIZE 32768 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/AR-F407SmartBat/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/AR-F407SmartBat/hwdef.dat index 8d728a4567..6e780be0b3 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/AR-F407SmartBat/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/AR-F407SmartBat/hwdef.dat @@ -30,8 +30,6 @@ PC13 GPIO_CAN1_SILENT OUTPUT PUSHPULL SPEED_LOW HIGH CAN_ORDER 1 -define HAL_NO_MONITOR_THREAD - # debugger support PA13 JTMS-SWDIO SWD PA14 JTCK-SWCLK SWD diff --git a/libraries/AP_HAL_ChibiOS/hwdef/ARKV6X/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/ARKV6X/hwdef-bl.dat index 4dc19548f3..2fb7970bf1 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/ARKV6X/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/ARKV6X/hwdef-bl.dat @@ -24,8 +24,7 @@ env OPTIMIZE -Os # order of UARTs (and USB) SERIAL_ORDER OTG1 UART7 UART5 USART3 -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # USB PA11 OTG_FS_DM OTG1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/ARKV6X/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/ARKV6X/hwdef.dat index 7c7f6d4fdd..0c2038deb0 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/ARKV6X/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/ARKV6X/hwdef.dat @@ -269,12 +269,11 @@ PE4 LED_GREEN OUTPUT OPENDRAIN GPIO(91) HIGH PE5 LED_BLUE OUTPUT OPENDRAIN GPIO(92) HIGH # setup for "pixracer" RGB LEDs -define HAL_GPIO_A_LED_PIN 90 -define HAL_GPIO_B_LED_PIN 91 -define HAL_GPIO_C_LED_PIN 92 -define HAL_GPIO_LED_ON 0 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 90 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 91 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 92 -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # ID pins PG0 HW_VER_REV_DRIVE OUTPUT LOW diff --git a/libraries/AP_HAL_ChibiOS/hwdef/ARK_CANNODE/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/ARK_CANNODE/hwdef-bl.dat index 82e803a3c7..204b261acb 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/ARK_CANNODE/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/ARK_CANNODE/hwdef-bl.dat @@ -39,12 +39,12 @@ PA8 LED_R1 OUTPUT OPENDRAIN HIGH GPIO(0) PA9 LED_G1 OUTPUT OPENDRAIN LOW GPIO(1) PA10 LED_B1 OUTPUT OPENDRAIN LOW GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 # use pixracer style 3-LED indicators -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # CAN bus PA11 CAN1_RX CAN1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/ARK_CANNODE/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/ARK_CANNODE/hwdef.dat index 68e50acd54..e82ea526d0 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/ARK_CANNODE/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/ARK_CANNODE/hwdef.dat @@ -65,12 +65,12 @@ PA8 LED_R1 OUTPUT HIGH GPIO(0) PA9 LED_G1 OUTPUT HIGH GPIO(1) PA10 LED_B1 OUTPUT HIGH GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 # use pixracer style 3-LED indicators -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # CAN bus PA11 CAN1_RX CAN1 @@ -131,3 +131,4 @@ define AP_PERIPH_RANGEFINDER_PORT_DEFAULT -1 define HAL_RCIN_THREAD_ENABLED 1 define HAL_SCHEDULER_LOOP_DELAY_ENABLED 1 +define HAL_MONITOR_THREAD_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/ARK_GPS/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/ARK_GPS/hwdef.dat index 56b7a3f610..a75dcba475 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/ARK_GPS/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/ARK_GPS/hwdef.dat @@ -58,12 +58,12 @@ PA8 LED_R1 OUTPUT OPENDRAIN HIGH GPIO(0) PA9 LED_G1 OUTPUT OPENDRAIN LOW GPIO(1) PA10 LED_B1 OUTPUT OPENDRAIN LOW GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 # use pixracer style 3-LED indicators -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # CAN bus PA11 CAN1_RX CAN1 @@ -124,3 +124,4 @@ define HAL_PERIPH_GPS_PORT_DEFAULT 1 define HAL_SERIAL_ESC_COMM_ENABLED 1 define HAL_RCIN_THREAD_ENABLED 1 define HAL_SCHEDULER_LOOP_DELAY_ENABLED 1 +define HAL_MONITOR_THREAD_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/ARK_RTK_GPS/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/ARK_RTK_GPS/hwdef.dat index df4a0950eb..172deb9b6c 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/ARK_RTK_GPS/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/ARK_RTK_GPS/hwdef.dat @@ -62,12 +62,12 @@ PA8 LED_R1 OUTPUT OPENDRAIN HIGH GPIO(0) PA9 LED_G1 OUTPUT OPENDRAIN LOW GPIO(1) PA10 LED_B1 OUTPUT OPENDRAIN LOW GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 # use pixracer style 3-LED indicators -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # CAN bus PA11 CAN1_RX CAN1 @@ -135,3 +135,4 @@ define HAL_PERIPH_GPS_PORT_DEFAULT 1 define HAL_SERIAL_ESC_COMM_ENABLED 1 define HAL_RCIN_THREAD_ENABLED 1 define HAL_SCHEDULER_LOOP_DELAY_ENABLED 1 +define HAL_MONITOR_THREAD_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/AeroFox-GNSS_F9P/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/AeroFox-GNSS_F9P/hwdef.dat index 5e48e77635..a817aea2f9 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/AeroFox-GNSS_F9P/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/AeroFox-GNSS_F9P/hwdef.dat @@ -32,7 +32,6 @@ MAIN_STACK 0x300 # PROCESS_STACK controls stack for main thread PROCESS_STACK 0xA00 -define HAL_NO_MONITOR_THREAD # we setup a small defaults.parm define AP_PARAM_MAX_EMBEDDED_PARAM 512 @@ -92,7 +91,6 @@ COMPASS QMC5883L I2C:0:0xd false ROTATION_YAW_180 define HAL_USE_ADC FALSE # disable unnecessary threads -define HAL_NO_MONITOR_THREAD define HAL_NO_TIMER_THREAD # enable LED @@ -100,10 +98,10 @@ define HAL_PERIPH_ENABLE_RC_OUT define HAL_PERIPH_ENABLE_NOTIFY #GPIO LED -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 PB2 LED_RED OUTPUT OPENDRAIN HIGH GPIO(0) PB4 LED_GREEN OUTPUT OPENDRAIN LOW GPIO(1) PB5 LED_BLUE OUTPUT OPENDRAIN LOW GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/AeroFox-PMU/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/AeroFox-PMU/hwdef.dat index a7d5e558df..56a3ef2dc0 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/AeroFox-PMU/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/AeroFox-PMU/hwdef.dat @@ -49,13 +49,13 @@ define HAL_SUPPORT_RCOUT_SERIAL 1 define HAL_WITH_ESC_TELEM 1 #GPIO LED -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 PB2 LED_RED OUTPUT OPENDRAIN HIGH GPIO(0) PB4 LED_GREEN OUTPUT OPENDRAIN LOW GPIO(1) PB5 LED_BLUE OUTPUT OPENDRAIN LOW GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 define HAL_SERIAL_ESC_COMM_ENABLED 1 define HAL_RCIN_THREAD_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/AeroFox-PMU/hwdef.inc b/libraries/AP_HAL_ChibiOS/hwdef/AeroFox-PMU/hwdef.inc index 726c65dd54..8de0308412 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/AeroFox-PMU/hwdef.inc +++ b/libraries/AP_HAL_ChibiOS/hwdef/AeroFox-PMU/hwdef.inc @@ -36,8 +36,6 @@ MAIN_STACK 0x300 # PROCESS_STACK controls stack for main thread PROCESS_STACK 0xA00 -define HAL_NO_MONITOR_THREAD - # setup a small defaults.parm define AP_PARAM_MAX_EMBEDDED_PARAM 512 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/AnyleafH7/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/AnyleafH7/hwdef.dat index 14a56e55bc..1e2dbea358 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/AnyleafH7/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/AnyleafH7/hwdef.dat @@ -50,6 +50,7 @@ define HAL_BATT_CURR_SCALE 40.0 # This depends on the ESC's V/mA output ratio. # LED PC13 LED0 OUTPUT LOW GPIO(90) # Amber; System status. PC0 LED1 OUTPUT LOW GPIO(91) # Not connected; GPS Status. (Required, or the system status LED won't work.) +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 define HAL_GPIO_A_LED_PIN 90 define HAL_GPIO_B_LED_PIN 91 @@ -121,4 +122,4 @@ define HAL_COMPASS_AUTO_ROT_DEFAULT 2 # setup for OSD define OSD_ENABLED 1 define HAL_OSD_TYPE_DEFAULT 5 # MSP Displayport -define HAL_LOGGING_DATAFLASH_ENABLED 1 \ No newline at end of file +define HAL_LOGGING_DATAFLASH_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Aocoda-RC-H743Dual/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Aocoda-RC-H743Dual/hwdef.dat index 6fc66e5b4c..f31999bc43 100755 --- a/libraries/AP_HAL_ChibiOS/hwdef/Aocoda-RC-H743Dual/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Aocoda-RC-H743Dual/hwdef.dat @@ -100,6 +100,7 @@ define BOARD_RSSI_ANA_PIN 8 # green LED1 marked as B/E PE3 LED0 OUTPUT LOW GPIO(90) # blue PE4 LED1 OUTPUT LOW GPIO(91) # orange +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 define HAL_GPIO_A_LED_PIN 91 define HAL_GPIO_B_LED_PIN 90 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/AtomRCF405NAVI/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/AtomRCF405NAVI/hwdef.dat index ec4c000c00..aa029c0acd 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/AtomRCF405NAVI/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/AtomRCF405NAVI/hwdef.dat @@ -23,6 +23,7 @@ SERIAL_ORDER OTG1 USART1 USART2 USART3 UART4 UART5 USART6 PA14 LED_BLUE OUTPUT LOW GPIO(0) PA13 LED_GREEN OUTPUT LOW GPIO(1) +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 define HAL_GPIO_A_LED_PIN 0 define HAL_GPIO_B_LED_PIN 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/BETAFPV-F405/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/BETAFPV-F405/hwdef-bl.dat index c3a9504378..ea7aec21b5 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/BETAFPV-F405/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/BETAFPV-F405/hwdef-bl.dat @@ -30,8 +30,7 @@ PA12 OTG_FS_DP OTG1 PA13 JTMS-SWDIO SWD PA14 JTCK-SWCLK SWD -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + PA10 USART1_RX USART1 HIGH PULLUP PB11 USART3_RX USART3 HIGH PULLUP diff --git a/libraries/AP_HAL_ChibiOS/hwdef/BETAFPV-F405/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/BETAFPV-F405/hwdef.dat index 69919b2727..8e451e2bed 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/BETAFPV-F405/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/BETAFPV-F405/hwdef.dat @@ -99,8 +99,9 @@ PA3 TIM2_CH4 TIM2 PWM(3) GPIO(52) BIDIR # M3 PA2 TIM2_CH3 TIM2 PWM(4) GPIO(53) # M4 # LEDs +define AP_NOTIFY_GPIO_LED_1_ENABLED 1 PB5 LED0 OUTPUT LOW GPIO(90) -define HAL_GPIO_A_LED_PIN 90 +define AP_NOTIFY_GPIO_LED_1_PIN 90 # LED strip PB6 TIM4_CH1 TIM4 PWM(5) GPIO(56) # M7 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/BirdCANdy/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/BirdCANdy/hwdef.dat index 9f7f7d829f..e27f72b600 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/BirdCANdy/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/BirdCANdy/hwdef.dat @@ -89,9 +89,6 @@ PB8 CAN1_RX CAN1 PB9 CAN1_TX CAN1 PB2 GPIO_CAN1_SILENT OUTPUT PUSHPULL SPEED_LOW LOW -define HAL_NO_MONITOR_THREAD - - define HAL_DEVICE_THREAD_STACK 768 define AP_PARAM_MAX_EMBEDDED_PARAM 0 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/BlitzF745/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/BlitzF745/hwdef-bl.dat index 4b0c876789..3300a02844 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/BlitzF745/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/BlitzF745/hwdef-bl.dat @@ -30,8 +30,7 @@ PA12 OTG_FS_DP OTG1 PA13 JTMS-SWDIO SWD PA14 JTCK-SWCLK SWD -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # Chip select pins diff --git a/libraries/AP_HAL_ChibiOS/hwdef/BlitzF745/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/BlitzF745/hwdef.dat index 88ddc95821..f4f12ed84f 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/BlitzF745/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/BlitzF745/hwdef.dat @@ -122,8 +122,9 @@ PE14 TIM1_CH4 TIM1 PWM(8) GPIO(57) # M8 # LEDs PC9 TIM8_CH4 TIM8 PWM(9) GPIO(58) # M9 +define AP_NOTIFY_GPIO_LED_1_ENABLED 1 PD15 LED0 OUTPUT LOW GPIO(90) -define HAL_GPIO_A_LED_PIN 90 +define AP_NOTIFY_GPIO_LED_1_PIN 90 # Dataflash setup SPIDEV dataflash SPI3 DEVID1 FLASH1_CS MODE3 104*MHZ 104*MHZ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/BlitzF745AIO/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/BlitzF745AIO/hwdef-bl.dat index eb9a170bc8..7a226ae2b9 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/BlitzF745AIO/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/BlitzF745AIO/hwdef-bl.dat @@ -3,8 +3,7 @@ # for IFLIGHT_BLITZ_F7_AIO hardware. # thanks to betaflight for pin information -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # MCU class and specific type MCU STM32F7xx STM32F745xx diff --git a/libraries/AP_HAL_ChibiOS/hwdef/BlitzH743Pro/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/BlitzH743Pro/hwdef-bl.dat index 22afd74789..0f09931788 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/BlitzH743Pro/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/BlitzH743Pro/hwdef-bl.dat @@ -30,8 +30,7 @@ PA12 OTG_FS_DP OTG1 PA13 JTMS-SWDIO SWD PA14 JTCK-SWCLK SWD -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # Chip select pins diff --git a/libraries/AP_HAL_ChibiOS/hwdef/BlitzH743Pro/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/BlitzH743Pro/hwdef.dat index 966e60c17c..794d4d558e 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/BlitzH743Pro/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/BlitzH743Pro/hwdef.dat @@ -149,6 +149,8 @@ PE6 TIM15_CH2 TIM15 PWM(12) GPIO(61) NODMA # M12 # LEDs PA8 TIM1_CH1 TIM1 PWM(13) GPIO(62) # M9 +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 + PE3 LED0 OUTPUT LOW GPIO(90) define HAL_GPIO_A_LED_PIN 90 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/BotBloxSwitch/defaults.parm b/libraries/AP_HAL_ChibiOS/hwdef/BotBloxSwitch/defaults.parm new file mode 100644 index 0000000000..f508c94865 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/BotBloxSwitch/defaults.parm @@ -0,0 +1,15 @@ +NET_ENABLE 1 +NET_OPTIONS 1 + +# enable hw flow control +UART1_RTSCTS 1 + +# swap TX and RX +UART1_OPTIONS 8 + +SCR_ENABLE 1 +SCR_VM_I_COUNT 1000000 +SCR_HEAP_SIZE 150000 + +WEB_ENABLE 1 +WEB_PORT 80 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/BotBloxSwitch/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/BotBloxSwitch/hwdef-bl.dat index f330a1c455..03960b2247 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/BotBloxSwitch/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/BotBloxSwitch/hwdef-bl.dat @@ -1,14 +1,13 @@ # hw definition file for processing by chibios_hwdef.py # for the BotBloxSwitch hardware -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # MCU class and specific type MCU STM32H7xx STM32H723xx # crystal frequency -OSCILLATOR_HZ 0 +OSCILLATOR_HZ 16000000 # setup build for a peripheral bootloader env AP_PERIPH 1 @@ -40,13 +39,18 @@ PA14 JTCK-SWCLK SWD PD0 CAN1_RX CAN1 PD1 CAN1_TX CAN1 +#PD4 USART2_DE USART2 +PD5 USART2_TX USART2 +PD6 USART2_RX USART2 + PD8 USART3_TX USART3 PD9 USART3_RX USART3 PD12 USART3_RTS USART3 PD11 USART3_CTS USART3 # LEDs -PE5 LED_BOOTLOADER OUTPUT OPENDRAIN HIGH # blue +PC0 LED_STT1 OUTPUT OPENDRAIN HIGH +PA4 LED_STT2 OUTPUT OPENDRAIN HIGH define HAL_LED_ON 0 define HAL_USE_EMPTY_STORAGE 1 @@ -56,15 +60,14 @@ PC1 ETH_MDC ETH1 PA2 ETH_MDIO ETH1 PC4 ETH_RMII_RXD0 ETH1 PC5 ETH_RMII_RXD1 ETH1 -#PB12 ETH_RMII_TXD0 ETH1 -PG13 ETH_RMII_TXD0 ETH1 +PB12 ETH_RMII_TXD0 ETH1 PB13 ETH_RMII_TXD1 ETH1 -#PB11 ETH_RMII_TX_EN ETH1 -PG11 ETH_RMII_TX_EN ETH1 +PB11 ETH_RMII_TX_EN ETH1 PA7 ETH_RMII_CRS_DV ETH1 PA1 ETH_RMII_REF_CLK ETH1 define BOARD_PHY_ID MII_LAN8742A_ID +define BOARD_PHY_ADDRESS 0x0005 define BOARD_PHY_RMII include ../include/network_bootloader.inc diff --git a/libraries/AP_HAL_ChibiOS/hwdef/BotBloxSwitch/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/BotBloxSwitch/hwdef.dat index 24f6c6e702..e00fde56eb 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/BotBloxSwitch/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/BotBloxSwitch/hwdef.dat @@ -8,7 +8,7 @@ DEFAULTGPIO OUTPUT LOW PULLDOWN MCU STM32H7xx STM32H723xx # crystal frequency -OSCILLATOR_HZ 0 +OSCILLATOR_HZ 16000000 # setup build for a peripheral bootloader env AP_PERIPH 1 @@ -42,46 +42,62 @@ PA9 VBUS INPUT OPENDRAIN PD0 CAN1_RX CAN1 PD1 CAN1_TX CAN1 +#PD4 USART2_DE USART2 +PD5 USART2_TX USART2 +PD6 USART2_RX USART2 + PD8 USART3_TX USART3 PD9 USART3_RX USART3 PD12 USART3_RTS USART3 PD11 USART3_CTS USART3 # LEDs -PE3 LED_RED OUTPUT OPENDRAIN HIGH -PE4 LED_GREEN OUTPUT OPENDRAIN HIGH -PE5 LED_BLUE OUTPUT OPENDRAIN HIGH +PC0 LED_STT1 OUTPUT OPENDRAIN HIGH +PA4 LED_STT2 OUTPUT OPENDRAIN HIGH define HAL_LED_ON 0 -# use blue LED -define HAL_GPIO_PIN_LED HAL_GPIO_PIN_LED_BLUE +# use first LED +define HAL_GPIO_PIN_LED HAL_GPIO_PIN_LED_STT1 + +# Ethernet switch chip reset pin +PD13 GPIO_ETH_RST OUTPUT HIGH PULLUP +# CAN1 standby GPIO +PA0 GPIO_CAN_S OUTPUT LOW PULLUP + +# GPIO/PWMs +#PC6 TIM3_CH1 TIM3 PWM(1) GPIO(100) +#PB14 TIM12_CH1 TIM12 PWM(2) GPIO(101) +#PB15 TIM12_CH2 TIM12 PWM(3) GPIO(102) PC1 ETH_MDC ETH1 PA2 ETH_MDIO ETH1 PC4 ETH_RMII_RXD0 ETH1 PC5 ETH_RMII_RXD1 ETH1 -#PB12 ETH_RMII_TXD0 ETH1 -PG13 ETH_RMII_TXD0 ETH1 +PB12 ETH_RMII_TXD0 ETH1 PB13 ETH_RMII_TXD1 ETH1 -#PB11 ETH_RMII_TX_EN ETH1 -PG11 ETH_RMII_TX_EN ETH1 +PB11 ETH_RMII_TX_EN ETH1 PA7 ETH_RMII_CRS_DV ETH1 PA1 ETH_RMII_REF_CLK ETH1 define BOARD_PHY_ID MII_LAN8742A_ID +define BOARD_PHY_ADDRESS 0x0005 define BOARD_PHY_RMII -include ../include/network_PPPGW.inc +define HAL_PERIPH_ENABLE_NETWORKING +define AP_NETWORKING_MAX_INSTANCES 4 # allow load from USB SERIAL_ORDER OTG1 USART3 -# no ADC pins -define HAL_USE_ADC FALSE - -define STM32_ADC_USE_ADC1 FALSE -define STM32_ADC_USE_ADC2 FALSE -define STM32_ADC_USE_ADC3 FALSE - define HAL_RCIN_THREAD_ENABLED 1 define HAL_SCHEDULER_LOOP_DELAY_ENABLED 1 + +define HAL_USE_ADC FALSE + +define AP_SERIALMANAGER_REGISTER_ENABLED 1 +define AP_SCRIPTING_ENABLED 1 +define AP_FILESYSTEM_ROMFS_ENABLED 1 + +include ../include/network_PPPGW.inc + +define HAL_MONITOR_THREAD_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/C-RTK2-HP/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/C-RTK2-HP/hwdef.dat index 756c80e9f0..205562fc6d 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/C-RTK2-HP/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/C-RTK2-HP/hwdef.dat @@ -62,7 +62,7 @@ I2C_ORDER I2C3 COMPASS RM3100 I2C:0:0x20 false ROTATION_YAW_270 # safety LED, active low -PB1 SAFE_LED OUTPUT HIGH +PB5 SAFE_LED OUTPUT HIGH define SAFE_LED_ON 0 define HAL_USE_ADC FALSE @@ -79,6 +79,7 @@ define DMA_RESERVE_SIZE 0 # enable CAN support PB8 CAN1_RX CAN1 PB9 CAN1_TX CAN1 +PB1 GPIO_CAN1_SILENT OUTPUT PUSHPULL SPEED_LOW LOW GPIO(70) # sensor power enable PA12 VDD_SENSOR_EN OUTPUT HIGH @@ -89,8 +90,6 @@ PA4 RTK_RESET_N OUTPUT HIGH # PPS PA7 PPS INPUT PULLUP -define HAL_NO_MONITOR_THREAD - define HAL_DEVICE_THREAD_STACK 768 # we setup a small defaults.parm diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CBU-H7-Stamp/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/CBU-H7-Stamp/hwdef-bl.dat index 77c422ffe0..5fe147cd65 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CBU-H7-Stamp/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/CBU-H7-Stamp/hwdef-bl.dat @@ -1,9 +1,6 @@ # hw definition file for processing by chibios_hwdef.py # for the CBUnmanned H743 Stamp hardware -# default to all pins low to avoid ESD issues -#DEFAULTGPIO OUTPUT LOW PULLDOWN - # MCU class and specific type MCU STM32H7xx STM32H743xx diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CBU-H7-Stamp/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/CBU-H7-Stamp/hwdef.dat index 87f8956c00..474e761991 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CBU-H7-Stamp/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/CBU-H7-Stamp/hwdef.dat @@ -188,7 +188,8 @@ PF5 SAFETY_IN INPUT PULLDOWN # LED PE3 LED_RED OUTPUT HIGH GPIO(90) -define HAL_GPIO_A_LED_PIN 90 +define AP_NOTIFY_GPIO_LED_1_ENABLED 1 +define AP_NOTIFY_GPIO_LED_1_PIN 90 define HAL_GPIO_LED_ON 1 # barometers diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CSKY405/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/CSKY405/hwdef.dat index 636724294d..74bf4d5e3c 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CSKY405/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/CSKY405/hwdef.dat @@ -26,6 +26,7 @@ OSCILLATOR_HZ 8000000 # --------------------- LED ----------------------- PA14 LED0 OUTPUT LOW GPIO(90) # blue marked as ACT PA13 LED1 OUTPUT LOW GPIO(91) # green marked as B/E +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 define HAL_GPIO_A_LED_PIN 91 define HAL_GPIO_B_LED_PIN 90 @@ -139,8 +140,6 @@ SPIDEV sdcard SPI2 DEVID3 SDCARD_CS MODE3 104*MHZ 104*MHZ #define HAL_LOGGING_DATAFLASH_ENABLED 1 define HAL_OS_FATFS_IO 1 -define HAL_BOARD_LOG_DIRECTORY "/APM/LOGS" -define HAL_BOARD_TERRAIN_DIRECTORY "/APM/TERRAIN" # ----------------- I2C compass & Baro ----------------- # no built-in compass, but probe the i2c bus for all possible diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CUAV-7-Nano/CUAV-7-Nano-pinout.png b/libraries/AP_HAL_ChibiOS/hwdef/CUAV-7-Nano/CUAV-7-Nano-pinout.png new file mode 100644 index 0000000000..fe2ea5b482 Binary files /dev/null and b/libraries/AP_HAL_ChibiOS/hwdef/CUAV-7-Nano/CUAV-7-Nano-pinout.png differ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CUAV-7-Nano/README.md b/libraries/AP_HAL_ChibiOS/hwdef/CUAV-7-Nano/README.md new file mode 100644 index 0000000000..ffdce53289 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/CUAV-7-Nano/README.md @@ -0,0 +1,80 @@ +# CUAV-7-Nano Flight Controller + +The CUAV-7-Nano flight controller produced by [CUAV](https://www.cuav.net). + +## Features + +- STM32H753 microcontroller +- 2 IMUs: IIM42652 and BMI088 +- builtin IST8310 magnetometer +- 2 barometers: BMP581 and ICP20100 +- microSD card slot +- USB-TypeC port +- 1 ETH network interface +- 5 UARTs plus USB +- 14 PWM outputs +- 3 I2C ports +- 3 CAN ports (two of which share a CAN bus and one is an independent CAN bus) +- Analog RSSI input +- 3.3V/5V configurable PWM ouput voltage + +## Pinout + +![CUAV-7-Nano_interface_definition.png](CUAV-7-Nano-pinout.png) + +## UART Mapping + +- SERIAL0 -> USB +- SERIAL1 -> UART7 (TELEM1) +- SERIAL2 -> UART5 (TELEM2) +- SERIAL3 -> USART1 (GPS&SAFETY) +- SERIAL4 -> UART8 (GPS2) +- SERIAL5 -> USART3 (FMU DEBUG) + +The TELEM1 and TELEM2 ports have RTS/CTS pins, the other UARTs do not have RTS/CTS. All have full DMA capability. + +## RC Input + +RC input is configured on the RCIN pin, at one end of the servo rail, marked RCIN in the above diagram. All ArduPilot supported unidirectional RC protocols can be input here including PPM. For bi-directional or half-duplex protocols, such as CRSF/ELRS a full UART will have to be used. + +## PWM Output + +The CUAV-7-Nano flight controller supports up to 14 PWM outputs. + +The 14 PWM outputs are in 6 groups: + +- PWM 1-4 in group1 (TIM5) +- PWM 5 and 6 in group2 (TIM4) +- PWM 7 and 8 in group3 (TIM1) +- PWM 9, 10 and 11 in group4 (TIM8) +- PWM 12 in group5 (TIM15) +- PWM 13 and 14 in group6 (TIM12) + +Channels within the same group need to use the same output rate. If any channel in a group uses DShot then all channels in the group need to use DShot. Outputs 1-4 support BDShot. + +First first 8 PWM outputs of CUAV-7-Nano flight controller support switching between 3.3V voltage and 5V voltage output. It can be switched to 5V by setting GPIO 80 high by setting up a Voltage-Level Translator to control it. + +## Battery Monitoring + +The board has a dedicated power monitor ports on 6 pin connectors(POWER A). The correct battery setting parameters are dependent on the type of power brick which is connected. + +## Compass + +The CUAV-7-Nano has an IST8310 builtin compass, but due to interference the board is usually used with an external I2C compass as part of a GPS/Compass combination. + +## Analog inputs + +The CUAV-7-Nano has 6 analog inputs. + +- ADC Pin9 -> Battery Voltage +- ADC Pin8 -> Battery Current Sensor +- ADC Pin5 -> Vdd 5V supply sense +- ADC Pin13 -> ADC 3.3V Sense +- ADC Pin12 -> ADC 6.6V Sense +- ADC Pin10 -> RSSI voltage monitoring + +## Loading Firmware + +Firmware for these boards can be found at https://firmware.ardupilot.org in sub-folders labeled "CUAV-7-Nano". + +The board comes pre-installed with an ArduPilot compatible bootloader, allowing the loading of *.apj firmware files with any ArduPilot compatible ground station. diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CUAV-7-Nano/defaults.parm b/libraries/AP_HAL_ChibiOS/hwdef/CUAV-7-Nano/defaults.parm new file mode 100644 index 0000000000..f46b1f17c1 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/CUAV-7-Nano/defaults.parm @@ -0,0 +1,2 @@ +INS_ACCEL_FILTER 10 +CAN_P1_DRIVER 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CUAV-7-Nano/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/CUAV-7-Nano/hwdef-bl.dat new file mode 100644 index 0000000000..62d0bae710 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/CUAV-7-Nano/hwdef-bl.dat @@ -0,0 +1,101 @@ +# hw definition file for processing by chibios_hwdef.py +# for CUAV-7-Nano board + +# MCU class and specific type +MCU STM32H7xx STM32H743xx + +# crystal frequency +OSCILLATOR_HZ 16000000 + +# board ID for firmware load +APJ_BOARD_ID 7000 + +# bootloader is installed at zero offset +FLASH_RESERVE_START_KB 0 + +# the location where the bootloader will put the firmware +FLASH_BOOTLOADER_LOAD_KB 128 + +# flash size +FLASH_SIZE_KB 2048 + +env OPTIMIZE -Os + +# order of UARTs (and USB) +SERIAL_ORDER OTG1 UART7 UART5 USART3 + +# USB +PA11 OTG_FS_DM OTG1 +PA12 OTG_FS_DP OTG1 +PA9 VBUS INPUT OPENDRAIN + +# pins for SWD debugging +PA13 JTMS-SWDIO SWD +PA14 JTCK-SWCLK SWD + +# CS pins +PI9 ICM42652_CS CS +PH5 BMI088_A_CS CS +PG2 BMI088_G_CS CS +PD15 BMP581_CS CS +PG7 FRAM_CS CS + +# telem1 +PE8 UART7_TX UART7 +PF6 UART7_RX UART7 + +# telem2 +PC12 UART5_TX UART5 +PD2 UART5_RX UART5 + +# debug uart +PD8 USART3_TX USART3 +PD9 USART3_RX USART3 + +# armed indication +PE7 nARMED OUTPUT HIGH + +# start peripheral power off +PG4 VDD_5V_PERIPH_EN OUTPUT HIGH +PG10 VDD_5V_HIPOWER_EN OUTPUT HIGH + +# LEDs +PE3 LED_RED OUTPUT LOW # red +PE4 LED_ACTIVITY OUTPUT LOW # green +PE5 LED_BOOTLOADER OUTPUT LOW # blue +define HAL_LED_ON 0 + +define HAL_USE_EMPTY_STORAGE 1 +define HAL_STORAGE_SIZE 16384 + +# enable DFU by default +ENABLE_DFU_BOOT 1 + +# support flashing from SD card: +# power enable pins +PC13 VDD_3V3_SD_CARD_EN OUTPUT HIGH + +# FATFS support: +define CH_CFG_USE_MEMCORE 1 +define CH_CFG_USE_HEAP 1 +define CH_CFG_USE_SEMAPHORES 0 +define CH_CFG_USE_MUTEXES 1 +define CH_CFG_USE_DYNAMIC 1 +define CH_CFG_USE_WAITEXIT 1 +define CH_CFG_USE_REGISTRY 1 + +# microSD support +PD6 SDMMC2_CK SDMMC2 +PD7 SDMMC2_CMD SDMMC2 +PB14 SDMMC2_D0 SDMMC2 +PB15 SDMMC2_D1 SDMMC2 +PG11 SDMMC2_D2 SDMMC2 +PB4 SDMMC2_D3 SDMMC2 +define FATFS_HAL_DEVICE SDCD2 + +DMA_PRIORITY SDMMC* USART6* ADC* UART* USART* SPI* TIM* + +# enable FAT filesystem support (needs a microSD defined via SDMMC) +define HAL_OS_FATFS_IO 1 + +define AP_BOOTLOADER_FLASH_FROM_SD_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CUAV-7-Nano/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/CUAV-7-Nano/hwdef.dat new file mode 100644 index 0000000000..f6eabe6f2f --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/CUAV-7-Nano/hwdef.dat @@ -0,0 +1,295 @@ +# hw definition file for processing by chibios_hwdef.py +# for CUAV-7-Nano board + +# default to all pins low to avoid ESD issues +DEFAULTGPIO OUTPUT LOW PULLDOWN + +# MCU class and specific type +MCU STM32H7xx STM32H743xx + +# crystal frequency +OSCILLATOR_HZ 16000000 + +# ChibiOS system timer +STM32_ST_USE_TIMER 2 + +# board ID for firmware load +APJ_BOARD_ID 7000 + +# bootloader takes first sector +FLASH_RESERVE_START_KB 128 + +# to be compatible with the px4 bootloader we need +# to use a different RAM_MAP +env USE_ALT_RAM_MAP 1 + +# flash size +FLASH_SIZE_KB 2048 + +# with 2M flash we can afford to optimize for speed +env OPTIMIZE -O2 + +# order of UARTs (and USB) +SERIAL_ORDER OTG1 UART7 UART5 USART1 UART8 USART3 OTG2 + +# USB +PA11 OTG_FS_DM OTG1 +PA12 OTG_FS_DP OTG1 +PA9 VBUS INPUT OPENDRAIN + +# pins for SWD debugging +PA13 JTMS-SWDIO SWD +PA14 JTCK-SWCLK SWD + +# telem1 +PE8 UART7_TX UART7 +PF6 UART7_RX UART7 +PF8 UART7_RTS UART7 +PE10 UART7_CTS UART7 + +# telem2 +PC8 UART5_RTS UART5 +PC9 UART5_CTS UART5 +PC12 UART5_TX UART5 +PD2 UART5_RX UART5 + +# GPS1 +PB6 USART1_TX USART1 +PB7 USART1_RX USART1 + +# GPS2 +PE0 UART8_RX UART8 +PE1 UART8_TX UART8 + +# debug uart +PD8 USART3_TX USART3 +PD9 USART3_RX USART3 + +# uart6, RX only, RC input, if no IOMCU +PC7 USART6_RX USART6 + +# ethernet +PC1 ETH_MDC ETH1 +PA2 ETH_MDIO ETH1 +PC4 ETH_RMII_RXD0 ETH1 +PC5 ETH_RMII_RXD1 ETH1 +PG13 ETH_RMII_TXD0 ETH1 +PG12 ETH_RMII_TXD1 ETH1 +PB11 ETH_RMII_TX_EN ETH1 +PA7 ETH_RMII_CRS_DV ETH1 +PA1 ETH_RMII_REF_CLK ETH1 +#PG15 ETH_POWER_EN ETH1 + +PG15 Ethernet_PWR_EN OUTPUT HIGH # disable power on ethernet + +define BOARD_PHY_ID MII_LAN8742A_ID +define BOARD_PHY_RMII + +# ADC +PA0 SCALED1_V3V3 ADC1 SCALE(2) +PA4 SCALED2_V3V3 ADC1 SCALE(2) +PB1 VDD_5V_SENS ADC1 SCALE(2) +PC0 RSSI_IN ADC1 SCALE(1) +PF12 FMU_SERVORAIL_VCC_SENS ADC1 SCALE(3) + +# analog in +PC2 BATT_VOLTAGE_SENS ADC1 SCALE(1) ANALOG(9) +PB0 BATT_CURRENT_SENS ADC1 SCALE(1) ANALOG(8) + +# pin7 on AD&IO, analog 12 +PF3 ADC3_6V6 ADC3 SCALE(2) ANALOG(12) + +# pin6 on AD&IO, analog 13 +PC3 ADC1_3V3 ADC1 SCALE(1) ANALOG(13) + +define HAL_BATT_MONITOR_DEFAULT 4 +define HAL_BATT_VOLT_PIN 9 +define HAL_BATT_CURR_PIN 8 +define HAL_BATT_VOLT_SCALE 10.1 +define HAL_BATT_CURR_SCALE 17.0 + +# SPI1 - IIM42652 +PA5 SPI1_SCK SPI1 +PB5 SPI1_MOSI SPI1 +PG9 SPI1_MISO SPI1 +PI9 IIM42652_CS CS +PF2 IIM42652_DRDY INPUT + +# SPI2 - BMI088 +PI1 SPI2_SCK SPI2 +PI2 SPI2_MISO SPI2 +PI3 SPI2_MOSI SPI2 +PH5 BMI088_A_CS CS +PG2 BMI088_G_CS CS +PG3 BMI088_DRDY_GYR INPUT +PA10 BMI088_DRDY_ACC INPUT + +# SPI4 - BMP581 +PE12 SPI4_SCK SPI4 +PE13 SPI4_MISO SPI4 +PE14 SPI4_MOSI SPI4 +PD15 BMP581_CS CS +PG1 BMP581_DRDY INPUT + +# SPI5 - FRAM +PF7 SPI5_SCK SPI5 +PH7 SPI5_MISO SPI5 +PF11 SPI5_MOSI SPI5 +PG7 FRAM_CS CS + +# SPI devices +SPIDEV bmi088_g SPI2 DEVID1 BMI088_G_CS MODE3 10*MHZ 10*MHZ +SPIDEV bmi088_a SPI2 DEVID2 BMI088_A_CS MODE3 10*MHZ 10*MHZ +SPIDEV iim42652 SPI1 DEVID1 IIM42652_CS MODE3 2*MHZ 8*MHZ +SPIDEV ramtron SPI5 DEVID1 FRAM_CS MODE3 8*MHZ 8*MHZ +SPIDEV bmp581 SPI4 DEVID1 BMP581_CS MODE3 7.5*MHZ 12*MHZ + +# PWM output pins +PI0 TIM5_CH4 TIM5 PWM(1) GPIO(50) BIDIR +PH12 TIM5_CH3 TIM5 PWM(2) GPIO(51) +PH11 TIM5_CH2 TIM5 PWM(3) GPIO(52) BIDIR +PH10 TIM5_CH1 TIM5 PWM(4) GPIO(53) +PD13 TIM4_CH2 TIM4 PWM(5) GPIO(54) +PD14 TIM4_CH3 TIM4 PWM(6) GPIO(55) +PE11 TIM1_CH2 TIM1 PWM(7) GPIO(56) +PE9 TIM1_CH1 TIM1 PWM(8) GPIO(57) +PI6 TIM8_CH2 TIM8 PWM(9) GPIO(58) +PI7 TIM8_CH3 TIM8 PWM(10) GPIO(59) +PI5 TIM8_CH1 TIM8 PWM(11) GPIO(60) +PE6 TIM15_CH2 TIM15 PWM(12) GPIO(61) + +# we need to disable DMA on the last 2 FMU channels +# as timer 12 doesn't have a TIMn_UP DMA option +PH6 TIM12_CH1 TIM12 PWM(13) GPIO(62) NODMA +PH9 TIM12_CH2 TIM12 PWM(14) GPIO(63) NODMA + +# CAN bus +PD0 CAN1_RX CAN1 +PD1 CAN1_TX CAN1 + +PB12 CAN2_RX CAN2 +PB13 CAN2_TX CAN2 + +# control for silent (no output) for CAN +PE2 GPIO_CAN1_SILENT OUTPUT PUSHPULL SPEED_LOW LOW GPIO(70) +PI8 GPIO_CAN2_SILENT OUTPUT PUSHPULL SPEED_LOW LOW GPIO(71) + +# I2C buses + +# I2C1, GPS+MAG +PB9 I2C1_SDA I2C1 +PB8 I2C1_SCL I2C1 + +# I2C2, GPS2+MAG +PF1 I2C2_SCL I2C2 +PF0 I2C2_SDA I2C2 + +# I2C3, IST8310 +PA8 I2C3_SCL I2C3 +PH8 I2C3_SDA I2C3 + +# I2C4, ICM20100 +PF14 I2C4_SCL I2C4 +PF15 I2C4_SDA I2C4 +PG5 DRDY1_ICP20100 INPUT + +# order of I2C buses +I2C_ORDER I2C3 I2C4 I2C1 I2C2 +define HAL_I2C_INTERNAL_MASK 3 + +# armed indication +PE7 nARMED OUTPUT HIGH + +# power enable pins +PC13 VDD_3V3_SD_CARD_EN OUTPUT HIGH +PI11 VDD_3V3_SENSORS1_EN OUTPUT HIGH +PF4 VDD_3V3_SENSORS2_EN OUTPUT HIGH +PH2 VDD_3V3_SENSORS3_EN OUTPUT HIGH + +# start peripheral power off, then enable after init +# this prevents a problem with radios that use RTS for +# bootloader hold +PG10 VDD_5V_HIPOWER_EN OUTPUT HIGH +PG4 VDD_5V_PERIPH_EN OUTPUT HIGH + +# power sensing +PE15 VDD_5V_PERIPH_nOC INPUT PULLUP +PF13 VDD_5V_HIPOWER_nOC INPUT PULLUP + +# Pin for PWM Voltage Selection, 0 means 3.3v, 1 means 5v, 3.3v default +PG8 PWM_VOLT_SEL OUTPUT LOW GPIO(80) +define HAL_GPIO_PWM_VOLT_PIN 80 +define HAL_GPIO_PWM_VOLT_3v3 0 + +# microSD support +PD6 SDMMC2_CK SDMMC2 +PD7 SDMMC2_CMD SDMMC2 +PB14 SDMMC2_D0 SDMMC2 +PB15 SDMMC2_D1 SDMMC2 +PG11 SDMMC2_D2 SDMMC2 +PB4 SDMMC2_D3 SDMMC2 +define FATFS_HAL_DEVICE SDCD2 + +# safety +PD10 LED_SAFETY OUTPUT +PF5 SAFETY_IN INPUT PULLDOWN + +# LEDs +PE3 LED_RED OUTPUT GPIO(90) LOW +PE4 LED_GREEN OUTPUT GPIO(91) LOW +PE5 LED_BLUE OUTPUT GPIO(92) LOW + +# setup for "pixracer" RGB LEDs +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 90 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 91 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 92 + +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 + +# ID pins +PG0 HW_VER_REV_DRIVE OUTPUT LOW +# PH3 HW_VER_SENS ADC3 SCALE(1) +# PH4 HW_REV_SENS ADC3 SCALE(1) + +# PWM output for buzzer +PF9 TIM14_CH1 TIM14 GPIO(77) ALARM + +# RC input +PC6 TIM3_CH1 TIM3 RCININT PULLDOWN LOW + +# other I2C devices +# 24LC64T eeprom 64Kbit, address 0x50 on I2C4 + +BARO BMP581 SPI:bmp581 +BARO ICP201XX I2C:1:0x63 + +# compass +define HAL_PROBE_EXTERNAL_I2C_COMPASSES +define HAL_SKIP_AUTO_INTERNAL_I2C_PROBE +define HAL_COMPASS_DISABLE_IST8310_INTERNAL_PROBE +define AP_COMPASS_IST8310_DEFAULT_ROTATION ROTATION_ROLL_180_YAW_90 +COMPASS IST8310 I2C:0:0x0E false ROTATION_ROLL_90_YAW_90 +COMPASS IST8310 I2C:ALL_EXTERNAL:0x0E true ROTATION_ROLL_180_YAW_90 + +# IMUs +IMU Invensensev3 SPI:iim42652 ROTATION_ROLL_90_YAW_90 +IMU BMI088 SPI:bmi088_a SPI:bmi088_g ROTATION_PITCH_90 + +define HAL_DEFAULT_INS_FAST_SAMPLE 3 + +# enable RAMTROM parameter storage +define HAL_STORAGE_SIZE 32768 +define HAL_WITH_RAMTRON 1 + +# allow to have have a dedicated safety switch pin +define HAL_HAVE_SAFETY_SWITCH 1 + +DMA_PRIORITY TIM5* SDMMC* USART6* ADC* UART* USART* SPI* TIM* + +# enable FAT filesystem support (needs a microSD defined via SDMMC) +define HAL_OS_FATFS_IO 1 + +# enable DFU reboot for installing bootloader +# note that if firmware is build with --secure-bl then DFU is +# disabled +ENABLE_DFU_BOOT 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CUAV-Nora/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/CUAV-Nora/hwdef.dat index cab64cc169..5e73da62cc 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CUAV-Nora/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/CUAV-Nora/hwdef.dat @@ -273,12 +273,12 @@ PI5 LED_R1 OUTPUT OPENDRAIN HIGH GPIO(0) PI6 LED_G1 OUTPUT OPENDRAIN LOW GPIO(1) PI7 LED_B1 OUTPUT OPENDRAIN HIGH GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 # use pixracer style 3-LED indicators -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # enable RAMTROM parameter storage define HAL_STORAGE_SIZE 32768 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CUAV-Pixhack-v3/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/CUAV-Pixhack-v3/hwdef.dat new file mode 100644 index 0000000000..99497e032d --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/CUAV-Pixhack-v3/hwdef.dat @@ -0,0 +1,3 @@ +include ../fmuv3/hwdef.dat + +USE_BOOTLOADER_FROM_BOARD fmuv3 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CUAV-X7/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/CUAV-X7/hwdef.dat index 92d316f80a..1d28897e35 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CUAV-X7/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/CUAV-X7/hwdef.dat @@ -283,12 +283,12 @@ PI5 LED_R1 OUTPUT OPENDRAIN HIGH GPIO(0) PI6 LED_G1 OUTPUT OPENDRAIN LOW GPIO(1) PI7 LED_B1 OUTPUT OPENDRAIN HIGH GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 # use pixracer style 3-LED indicators -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # enable RAMTROM parameter storage define HAL_STORAGE_SIZE 32768 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CUAV_GPS/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/CUAV_GPS/hwdef.dat index a5514acaff..58c9756d6d 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CUAV_GPS/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/CUAV_GPS/hwdef.dat @@ -119,10 +119,6 @@ PB8 CAN1_RX CAN1 PB9 CAN1_TX CAN1 PB5 GPIO_CAN1_SILENT OUTPUT PUSHPULL SPEED_LOW LOW - -define HAL_NO_MONITOR_THREAD - - define HAL_DEVICE_THREAD_STACK 768 # we setup a small defaults.parm diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CUAVv5/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/CUAVv5/hwdef.dat index 4b4825dc48..a339f854e2 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CUAVv5/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/CUAVv5/hwdef.dat @@ -8,14 +8,14 @@ PH10 LED_R1 OUTPUT OPENDRAIN HIGH GPIO(0) PH11 LED_G1 OUTPUT OPENDRAIN HIGH GPIO(1) PH12 LED_B1 OUTPUT OPENDRAIN HIGH GPIO(2) -undef HAL_GPIO_A_LED_PIN -undef HAL_GPIO_B_LED_PIN +undef AP_NOTIFY_GPIO_LED_RGB_RED_PIN +undef AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 undef IMU undef PF11 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CUAVv5Nano/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/CUAVv5Nano/hwdef.dat index f00e9746df..c8d1a3607c 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CUAVv5Nano/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/CUAVv5Nano/hwdef.dat @@ -57,11 +57,11 @@ PH10 LED_R1 OUTPUT OPENDRAIN HIGH GPIO(0) PH11 LED_G1 OUTPUT OPENDRAIN HIGH GPIO(1) PH12 LED_B1 OUTPUT OPENDRAIN HIGH GPIO(2) -undef HAL_GPIO_A_LED_PIN -undef HAL_GPIO_B_LED_PIN +undef AP_NOTIFY_GPIO_LED_RGB_RED_PIN +undef AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CarbonixF405/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/CarbonixF405/hwdef.dat index 2bb60402c2..9bc6e1920a 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CarbonixF405/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/CarbonixF405/hwdef.dat @@ -109,7 +109,6 @@ PB1 VSENSE4 ADC1 SCALE(1) define AP_STATS_ENABLED 1 define HAL_NO_GCS -define HAL_NO_MONITOR_THREAD define AP_PARAM_MAX_EMBEDDED_PARAM 512 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CarbonixL496/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/CarbonixL496/hwdef.dat index c84f2d0adc..baa3a17da9 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CarbonixL496/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/CarbonixL496/hwdef.dat @@ -112,7 +112,6 @@ PB1 VSENSE4 ADC1 SCALE(1) define AP_STATS_ENABLED 1 define HAL_NO_GCS -define HAL_NO_MONITOR_THREAD define AP_PARAM_MAX_EMBEDDED_PARAM 512 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CubeBlack-periph/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/CubeBlack-periph/hwdef.dat index f1ae6809ea..b7b5592eb2 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CubeBlack-periph/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/CubeBlack-periph/hwdef.dat @@ -35,8 +35,6 @@ define GPS_MAX_RECEIVERS 1 define GPS_MAX_INSTANCES 1 define HAL_COMPASS_MAX_SENSORS 1 -define HAL_NO_MONITOR_THREAD - define HAL_USE_RTC FALSE define HAL_BARO_ALLOW_INIT_NO_BARO diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange-ODID/defaults.parm b/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange-ODID/defaults.parm index 911b2f03ec..5a2ee38df3 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange-ODID/defaults.parm +++ b/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange-ODID/defaults.parm @@ -24,5 +24,4 @@ AHRS_EKF_TYPE 3 @READONLY GPS1_TYPE 1 GPS2_TYPE 0 -EK2_PRIMARY 1 EK3_PRIMARY 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange-SimOnHardWare/defaults.parm b/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange-SimOnHardWare/defaults.parm index b6a7989b19..5a25829337 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange-SimOnHardWare/defaults.parm +++ b/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange-SimOnHardWare/defaults.parm @@ -57,5 +57,4 @@ SCHED_LOOP_RATE 400 BRD_RTC_TYPES 2 BRD_OPTIONS 9 -EK2_PRIMARY 1 EK3_PRIMARY 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange-joey/defaults.parm b/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange-joey/defaults.parm index c7f16a36c2..8f59a0bbb5 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange-joey/defaults.parm +++ b/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange-joey/defaults.parm @@ -47,5 +47,4 @@ SCR_ENABLE 1 @READONLY SCR_DIR_DISABLE 0 @READONLY BRD_HEAT_I 0.07 @READONLY BRD_HEAT_P 50 @READONLY -EK2_PRIMARY 1 @READONLY EK3_PRIMARY 1 @READONLY diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange-periph-heavy/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange-periph-heavy/hwdef.dat index ea87ad64b0..b2dfc2a1cf 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange-periph-heavy/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange-periph-heavy/hwdef.dat @@ -32,8 +32,6 @@ define GPS_MAX_RECEIVERS 1 define GPS_MAX_INSTANCES 1 define HAL_COMPASS_MAX_SENSORS 1 -define HAL_NO_MONITOR_THREAD - define HAL_USE_RTC FALSE define HAL_GCS_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange-periph/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange-periph/hwdef.dat index b8ba9df8ea..1d094e4ebd 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange-periph/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange-periph/hwdef.dat @@ -31,8 +31,6 @@ define GPS_MAX_RECEIVERS 1 define GPS_MAX_INSTANCES 1 define HAL_COMPASS_MAX_SENSORS 1 -define HAL_NO_MONITOR_THREAD - define HAL_USE_RTC FALSE define HAL_BARO_ALLOW_INIT_NO_BARO diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange/defaults.parm b/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange/defaults.parm index fdb083659e..52d3df5ea5 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange/defaults.parm +++ b/libraries/AP_HAL_ChibiOS/hwdef/CubeOrange/defaults.parm @@ -9,5 +9,4 @@ BATT2_VOLT_MULT 12.02 ADSB_TYPE 1 SERIAL5_BAUD 57 SERIAL5_PROTOCOL 1 -EK2_PRIMARY 1 EK3_PRIMARY 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CubeOrangePlus/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/CubeOrangePlus/hwdef.dat index 236b2b6dcb..d2163dbf14 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CubeOrangePlus/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/CubeOrangePlus/hwdef.dat @@ -99,3 +99,5 @@ BOARD_VALIDATE $CHECK_IMU0_PRESENT $CHECK_IMU1_PRESENT $CHECK_IMU2_PRESENT $CHEC # build ABIN for flash-from-bootloader support: env BUILD_ABIN True define HAL_INS_HIGHRES_SAMPLE 6 + +define AP_NETWORKING_BACKEND_PPP 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CubePilot-CANMod/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/CubePilot-CANMod/hwdef.dat index 4637d12cc7..f0d426ad8e 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CubePilot-CANMod/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/CubePilot-CANMod/hwdef.dat @@ -86,3 +86,5 @@ define AP_FILESYSTEM_ROMFS_ENABLED 1 # undefine to disable. Use -1 to allow on all ports, otherwise serial number index defined in SERIAL_ORDER starting at 0 define HAL_PERIPH_LISTEN_FOR_SERIAL_UART_REBOOT_CMD_PORT 0 ################################# + +define HAL_MONITOR_THREAD_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CubePilot-PPPGW/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/CubePilot-PPPGW/hwdef.dat index 70c50244fd..d274c070a1 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CubePilot-PPPGW/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/CubePilot-PPPGW/hwdef.dat @@ -1,17 +1,26 @@ include ../CubePilot-CANMod/hwdef.dat # we need RTS/CTS for the PPP link -undef PD14 -undef PD13 undef PE0 undef PE1 # need to use UART8 to get RTS/CTS PE1 UART8_TX UART8 PE0 UART8_RX UART8 -PD13 UART8_RTS UART8 -PD14 UART8_CTS UART8 +PA10 UART8_RTS UART8 +PC11 UART8_CTS_GPIO UART8 SERIAL_ORDER OTG1 UART8 +PA4 VDD_5V_SENS ADC1 SCALE(2) + +undef HAL_USE_ADC +define HAL_USE_ADC TRUE +define HAL_WITH_MCU_MONITORING 1 + +# can optionally run at half clock +# MCU_CLOCKRATE_MHZ 200 + include ../include/network_PPPGW.inc + +define HAL_MONITOR_THREAD_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CubeRedPrimary-PPPGW/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/CubeRedPrimary-PPPGW/hwdef.dat index 0e0f1898c8..0dcf4bba30 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CubeRedPrimary-PPPGW/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/CubeRedPrimary-PPPGW/hwdef.dat @@ -23,8 +23,6 @@ define HAL_PERIPH_ENABLE_SERIAL_OPTIONS define AP_NETWORKING_BACKEND_PPP 1 -define HAL_NO_MONITOR_THREAD - define HAL_USE_RTC FALSE # use amber LED diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CubeRedPrimary/defaults.parm b/libraries/AP_HAL_ChibiOS/hwdef/CubeRedPrimary/defaults.parm index 1e5d44378d..22f785c1a3 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CubeRedPrimary/defaults.parm +++ b/libraries/AP_HAL_ChibiOS/hwdef/CubeRedPrimary/defaults.parm @@ -5,5 +5,23 @@ SERIAL7_OPTIONS 8 ADSB_TYPE 1 SERIAL5_BAUD 57 SERIAL5_PROTOCOL 1 -EK2_PRIMARY 1 EK3_PRIMARY 1 + +NET_ENABLE 1 +NET_OPTIONS 1 +NET_DHCP 0 +NET_P1_TYPE 1 +NET_P1_PROTOCOL 2 +NET_P1_IP0 192 +NET_P1_IP1 168 +NET_P1_IP2 144 +NET_P1_IP3 10 +NET_P1_PORT 14553 + +NET_P2_TYPE 4 +NET_P2_PROTOCOL 2 +NET_P2_IP0 192 +NET_P2_IP1 168 +NET_P2_IP2 144 +NET_P2_IP3 100 +NET_P2_PORT 14554 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CubeRedPrimary/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/CubeRedPrimary/hwdef.dat index d6e7dfa8e3..5bd8d3c71c 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CubeRedPrimary/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/CubeRedPrimary/hwdef.dat @@ -274,17 +274,20 @@ PG15 USART6_CTS USART6 PG8 USART6_RTS USART6 # primary <-> secondary -PE7 UART7_RX UART7 -PE8 UART7_TX UART7 +PE7 UART7_RX UART7 SPEED_VERYLOW LOW_NOISE +PE8 UART7_TX UART7 SPEED_VERYLOW # order of UARTs (and USB) -SERIAL_ORDER OTG1 USART2 USART6 USART3 UART4 UART8 EMPTY UART7 +SERIAL_ORDER OTG1 USART2 USART6 USART3 UART4 UART8 OTG2 UART7 EXT_FLASH_SIZE_MB 32 INT_FLASH_PRIMARY 1 -# forward Serial traffic from USB OTG2 to Serial7(UART7) -define HAL_FORWARD_OTG2_SERIAL 7 -define HAL_HAVE_DUAL_USB_CDC 1 -define DEFAULT_SERIAL7_PROTOCOL SerialProtocol_MAVLink2 -define DEFAULT_SERIAL7_BAUD 2000000 +# set protocol for UART7 to SerialProtocol_PPP +define DEFAULT_SERIAL7_PROTOCOL SerialProtocol_PPP +define DEFAULT_SERIAL7_BAUD 8000000 + +define AP_NETWORKING_DEFAULT_STATIC_IP_ADDR "192.168.144.100" +define AP_NETWORKING_DEFAULT_STATIC_NETMASK "255.255.255.0" +define AP_NETWORKING_DEFAULT_STATIC_GW_ADDR "192.168.144.11" +define AP_NETWORKING_BACKEND_PPP 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CubeRedSecondary/defaults.parm b/libraries/AP_HAL_ChibiOS/hwdef/CubeRedSecondary/defaults.parm index 3be7684ba4..342b61b6d5 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CubeRedSecondary/defaults.parm +++ b/libraries/AP_HAL_ChibiOS/hwdef/CubeRedSecondary/defaults.parm @@ -1,2 +1,12 @@ SERIAL3_OPTIONS 8 SERIAL4_OPTIONS 8 +NET_ENABLE 1 +NET_P1_TYPE 3 +NET_P1_PROTOCOL 2 +NET_P1_IP0 192 +NET_P1_IP1 168 +NET_P1_IP2 144 +NET_P1_IP3 100 +NET_P1_PORT 14554 + +SYSID_THISMAV 2 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CubeRedSecondary/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/CubeRedSecondary/hwdef.dat index bd77ac79c9..e24d8c5299 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/CubeRedSecondary/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/CubeRedSecondary/hwdef.dat @@ -7,6 +7,8 @@ MCU STM32H7xx STM32H757xx define CORE_CM7 define SMPS_PWR +env OPTIMIZE -Os + # crystal frequency OSCILLATOR_HZ 24000000 @@ -39,7 +41,8 @@ PA6 RSSI_IN ADC1 SCALE(2) # CAN config PB14 GPIOCAN2_TERM OUTPUT HIGH - +PC12 GPIOCAN1_SHUTDOWN OUTPUT LOW +PF1 GPIOCAN2_SHUTDOWN OUTPUT LOW PA12 CAN1_TX CAN1 PB8 CAN1_RX CAN1 @@ -118,8 +121,8 @@ PA7 HP_UNIDIR_ENABLED OUTPUT HIGH GPIO(5) # UART connected to FMU, uses DMA -PE7 UART7_RX UART7 SPEED_HIGH -PE8 UART7_TX UART7 SPEED_HIGH +PE7 UART7_RX UART7 SPEED_VERYLOW LOW_NOISE +PE8 UART7_TX UART7 SPEED_VERYLOW # UART for SBUS out PC7 USART6_RX USART6 SPEED_HIGH LOW @@ -144,13 +147,16 @@ PD4 USART2_RTS USART2 SPEED_HIGH PD3 USART2_CTS USART2 SPEED_HIGH # order of UARTs -SERIAL_ORDER UART7 UART8 USART3 USART6 UART4 USART2 +SERIAL_ORDER UART8 UART7 USART3 USART6 UART4 USART2 # use 2 MBaud when talking to primary controller -define DEFAULT_SERIAL0_BAUD 2000000 +define DEFAULT_SERIAL1_BAUD 8000000 +define DEFAULT_SERIAL1_PROTOCOL SerialProtocol_PPP define DEFAULT_SERIAL3_PROTOCOL SerialProtocol_Sbus1 define DEFAULT_SERIAL4_PROTOCOL SerialProtocol_RCIN +define AP_NETWORKING_BACKEND_PPP 1 + # only use pulse input for PPM, other protocols # are on serial define HAL_RCIN_PULSE_PPM_ONLY diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Durandal/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Durandal/hwdef.dat index 50f6407581..222aa5f835 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Durandal/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Durandal/hwdef.dat @@ -296,9 +296,9 @@ PC6 LED_GREEN OUTPUT GPIO(91) LOW PC7 LED_BLUE OUTPUT GPIO(92) HIGH # setup for BoardLED2 +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 define HAL_GPIO_A_LED_PIN 90 define HAL_GPIO_B_LED_PIN 92 -define HAL_GPIO_LED_ON 0 # enable RAMTROM parameter storage define HAL_STORAGE_SIZE 32768 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/F35Lightning/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/F35Lightning/hwdef.dat index 8826031862..3b2655f812 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/F35Lightning/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/F35Lightning/hwdef.dat @@ -70,8 +70,9 @@ define BOARD_RSSI_ANA_PIN 13 #PA4 VDD_5V_SENS ADC1 SCALE(2) # LED +define AP_NOTIFY_GPIO_LED_1_ENABLED 1 PC10 LED OUTPUT HIGH GPIO(57) -define HAL_GPIO_A_LED_PIN 57 +define AP_NOTIFY_GPIO_LED_1_PIN 57 # SPI PA5 SPI1_SCK SPI1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/F4BY/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/F4BY/hwdef.dat index 7eb716d143..ffc86110c7 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/F4BY/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/F4BY/hwdef.dat @@ -131,15 +131,15 @@ PD14 TIM4_CH3 TIM4 PWM(12) GPIO(61) PC7 TIM8_CH2 TIM8 RCIN PULLDOWN LOW DMA_CH0 # LED setup is similar to PixRacer -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 PE3 LED_RED OUTPUT GPIO(10) PE2 LED_GREEN OUTPUT GPIO(11) PE1 LED_BLUE OUTPUT GPIO(12) PE0 LED_YELOW OUTPUT GPIO(13) -define HAL_GPIO_A_LED_PIN 10 -define HAL_GPIO_B_LED_PIN 11 -define HAL_GPIO_C_LED_PIN 12 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 10 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 11 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 12 PC0 PRESSURE_SENS ADC1 SCALE(1) PC1 RSSI_IN ADC1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/FlyingMoonF407/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/FlyingMoonF407/hwdef.dat index ec839060c9..d91e00dbff 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/FlyingMoonF407/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/FlyingMoonF407/hwdef.dat @@ -142,15 +142,15 @@ define RELAY5_PIN_DEFAULT 5 PC6 TIM8_CH1 TIM8 RCININT PULLDOWN LOW DMA_CH0 # LED setup is similar to PixRacer -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 PE3 LED_RED OUTPUT GPIO(10) PE2 LED_GREEN OUTPUT GPIO(11) PE1 LED_BLUE OUTPUT GPIO(12) PE0 LED_YELOW OUTPUT GPIO(13) -define HAL_GPIO_A_LED_PIN 10 -define HAL_GPIO_B_LED_PIN 11 -define HAL_GPIO_C_LED_PIN 12 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 10 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 11 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 12 # analog in PC0 PRESSURE_SENS ADC1 SCALE(2) diff --git a/libraries/AP_HAL_ChibiOS/hwdef/FlyingMoonF427/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/FlyingMoonF427/hwdef.dat index 8599389217..5df193ee03 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/FlyingMoonF427/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/FlyingMoonF427/hwdef.dat @@ -66,7 +66,7 @@ PD2 UART5_RX UART5 NODMA PD0 CAN1_RX CAN1 PD1 CAN1_TX CAN1 -# SPI1 for IMU OSD +# SPI1 for IMU PA5 SPI1_SCK SPI1 PA6 SPI1_MISO SPI1 PA7 SPI1_MOSI SPI1 @@ -74,7 +74,6 @@ PB0 ICM20689_CS CS PB1 ICM42605_CS CS PB2 ICM20649_CS CS PA4 RM3100_CS CS -PE10 MAX7456_CS CS # SPI bus for dataflash AND SD PB13 SPI2_SCK SPI2 @@ -93,7 +92,6 @@ SPIDEV icm20689 SPI1 DEVID1 ICM20689_CS MODE3 2*MHZ 8*MHZ SPIDEV icm20649 SPI1 DEVID2 ICM20649_CS MODE3 2*MHZ 8*MHZ SPIDEV icm42605 SPI1 DEVID3 ICM42605_CS MODE3 2*MHZ 8*MHZ SPIDEV rm3100 SPI1 DEVID4 RM3100_CS MODE3 1*MHZ 1*MHZ -SPIDEV osd SPI1 DEVID5 MAX7456_CS MODE0 10*MHZ 10*MHZ SPIDEV ramtron SPI2 DEVID1 FRAM_CS MODE3 8*MHZ 8*MHZ SPIDEV sdcard SPI2 DEVID2 FLASH_CS MODE0 1*MHZ 8*MHZ @@ -158,15 +156,15 @@ define RELAY5_PIN_DEFAULT 5 PC6 TIM8_CH1 TIM8 RCININT PULLDOWN LOW DMA_CH0 # LED setup is similar to PixRacer -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 PE3 LED_RED OUTPUT GPIO(10) PE2 LED_GREEN OUTPUT GPIO(11) PE1 LED_BLUE OUTPUT GPIO(12) PE0 LED_YELOW OUTPUT GPIO(13) -define HAL_GPIO_A_LED_PIN 10 -define HAL_GPIO_B_LED_PIN 11 -define HAL_GPIO_C_LED_PIN 12 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 10 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 11 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 12 # analog in PC0 PRESSURE_SENS ADC1 SCALE(2) @@ -187,7 +185,3 @@ PE7 LED_SAFETY OUTPUT PE8 SAFETY_IN INPUT PULLDOWN PE5 TIM9_CH1 TIM9 ALARM -# setup for OSD -define OSD_ENABLED 1 -define HAL_OSD_TYPE_DEFAULT 1 -ROMFS_WILDCARD libraries/AP_OSD/fonts/font*.bin diff --git a/libraries/AP_HAL_ChibiOS/hwdef/FlyingMoonH743/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/FlyingMoonH743/hwdef.dat index 1832c01d0d..9e1c637b83 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/FlyingMoonH743/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/FlyingMoonH743/hwdef.dat @@ -73,7 +73,7 @@ PD1 CAN1_TX CAN1 PB12 CAN2_RX CAN2 PB13 CAN2_TX CAN2 -# SPI1 for IMU OSD +# SPI1 for IMU PA5 SPI1_SCK SPI1 PA6 SPI1_MISO SPI1 PA7 SPI1_MOSI SPI1 @@ -81,7 +81,6 @@ PB0 ICM20689_CS CS PB1 ICM42605_CS CS PB2 ICM20649_CS CS PA4 RM3100_CS CS -PA8 MAX7456_CS CS # SPI bus for dataflash AND SD PD3 SPI2_SCK SPI2 @@ -100,7 +99,6 @@ SPIDEV icm20689 SPI1 DEVID1 ICM20689_CS MODE3 2*MHZ 8*MHZ SPIDEV icm20649 SPI1 DEVID2 ICM20649_CS MODE3 2*MHZ 8*MHZ SPIDEV icm42605 SPI1 DEVID3 ICM42605_CS MODE3 2*MHZ 8*MHZ SPIDEV rm3100 SPI1 DEVID4 RM3100_CS MODE3 1*MHZ 1*MHZ -SPIDEV osd SPI1 DEVID5 MAX7456_CS MODE0 10*MHZ 10*MHZ SPIDEV ramtron SPI2 DEVID1 FRAM_CS MODE3 8*MHZ 8*MHZ SPIDEV sdcard SPI2 DEVID2 FLASH_CS MODE0 1*MHZ 8*MHZ @@ -165,15 +163,15 @@ define RELAY5_PIN_DEFAULT 5 PC6 TIM8_CH1 TIM8 RCININT PULLDOWN LOW DMA_CH0 # LED setup is similar to PixRacer -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 PE3 LED_RED OUTPUT GPIO(10) PE2 LED_GREEN OUTPUT GPIO(11) PE1 LED_BLUE OUTPUT GPIO(12) PE0 LED_YELOW OUTPUT GPIO(13) -define HAL_GPIO_A_LED_PIN 10 -define HAL_GPIO_B_LED_PIN 11 -define HAL_GPIO_C_LED_PIN 12 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 10 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 11 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 12 # analog in PC0 PRESSURE_SENS ADC1 SCALE(2) @@ -195,8 +193,3 @@ PE8 SAFETY_IN INPUT PULLDOWN # PWM output for buzzer PE5 TIM15_CH1 TIM15 GPIO(77) ALARM - -# setup for OSD -define OSD_ENABLED 1 -define HAL_OSD_TYPE_DEFAULT 1 -ROMFS_WILDCARD libraries/AP_OSD/fonts/font*.bin diff --git a/libraries/AP_HAL_ChibiOS/hwdef/FlywooF405Pro/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/FlywooF405Pro/hwdef-bl.dat index b02a0ace60..aec6b5772b 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/FlywooF405Pro/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/FlywooF405Pro/hwdef-bl.dat @@ -30,8 +30,7 @@ PA12 OTG_FS_DP OTG1 PA13 JTMS-SWDIO SWD PA14 JTCK-SWCLK SWD -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # Chip select pins diff --git a/libraries/AP_HAL_ChibiOS/hwdef/FlywooF405Pro/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/FlywooF405Pro/hwdef.dat index 1014e4d783..d3cd91aeb3 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/FlywooF405Pro/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/FlywooF405Pro/hwdef.dat @@ -118,8 +118,9 @@ PC8 TIM8_CH3 TIM8 PWM(8) GPIO(57) # M8 # LEDs PA9 TIM1_CH2 TIM1 PWM(9) GPIO(58) # M9 +define AP_NOTIFY_GPIO_LED_1_ENABLED 1 PC14 LED0 OUTPUT LOW GPIO(90) -define HAL_GPIO_A_LED_PIN 90 +define AP_NOTIFY_GPIO_LED_1_PIN 90 # Dataflash setup SPIDEV dataflash SPI3 DEVID1 FLASH1_CS MODE3 104*MHZ 104*MHZ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/FlywooF405S-AIO/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/FlywooF405S-AIO/hwdef-bl.dat index 56dcdc07d8..5d0ef165e5 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/FlywooF405S-AIO/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/FlywooF405S-AIO/hwdef-bl.dat @@ -30,8 +30,7 @@ PA12 OTG_FS_DP OTG1 PA13 JTMS-SWDIO SWD PA14 JTCK-SWCLK SWD -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # Chip select pins diff --git a/libraries/AP_HAL_ChibiOS/hwdef/FlywooF405S-AIO/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/FlywooF405S-AIO/hwdef.dat index 0264c4a44e..6c06ea552a 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/FlywooF405S-AIO/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/FlywooF405S-AIO/hwdef.dat @@ -106,8 +106,9 @@ PA2 TIM2_CH3 TIM2 PWM(4) GPIO(53) # M4 # LEDs PA9 TIM1_CH2 TIM1 PWM(5) GPIO(54) # M5 +define AP_NOTIFY_GPIO_LED_1_ENABLED 1 PC14 LED0 OUTPUT LOW GPIO(90) -define HAL_GPIO_A_LED_PIN 90 +define AP_NOTIFY_GPIO_LED_1_PIN 90 # Dataflash setup SPIDEV dataflash SPI3 DEVID1 FLASH1_CS MODE3 104*MHZ 104*MHZ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/FlywooF745/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/FlywooF745/hwdef.dat index 1543f2b337..0624b4e068 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/FlywooF745/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/FlywooF745/hwdef.dat @@ -162,10 +162,6 @@ ROMFS_WILDCARD libraries/AP_OSD/fonts/font0.bin # define HAL_GYROFFT_ENABLED 1 # define AP_OAPATHPLANNER_ENABLED 0 -# EK2 options (disabled by default) -# define HAL_NAVEKF2_AVAILABLE 1 -# define HAL_NAVEKF3_AVAILABLE 0 - # save some flash include ../include/minimize_fpv_osd.inc include ../include/no_bootloader_DFU.inc diff --git a/libraries/AP_HAL_ChibiOS/hwdef/FlywooH743Pro/Bottom.png b/libraries/AP_HAL_ChibiOS/hwdef/FlywooH743Pro/Bottom.png new file mode 100644 index 0000000000..3c34aacdce Binary files /dev/null and b/libraries/AP_HAL_ChibiOS/hwdef/FlywooH743Pro/Bottom.png differ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/FlywooH743Pro/README.md b/libraries/AP_HAL_ChibiOS/hwdef/FlywooH743Pro/README.md new file mode 100644 index 0000000000..2d1d8a3c89 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/FlywooH743Pro/README.md @@ -0,0 +1,112 @@ +# Flywoo H743 Pro Flight Controller + +The Flywoo H743 Pro is a flight controller produced by [Flywoo](https://www.flywoo.net/). + +## Features + + - MCU - STM32H743 32-bit processor running at 480 MHz + - IMU - Dual ICM42688 + - Barometer - SPL06 + - OSD - AT7456E + - Onboard Flash: 500MByte + - 7x UARTs + - 13x PWM Outputs (12 Motor Output, 1 LED) + - Battery input voltage: 2S-6S + - BEC 3.3V 0.5A + - BEC 5V 3A + - BEC 10V 3A for video, gpio controlled + - Dual switchable camera inputs + +## Pinout + +![Flywoo H743 Pro Board Top](Top.png "Flywoo H743 Pro Top") +![Flywoo H743 Pro Board Bottom](Bottom.png "Flywoo H743 Pro Bottom") + +## UART Mapping + +The UARTs are marked Rn and Tn in the above pinouts. The Rn pin is the +receive pin for UARTn. The Tn pin is the transmit pin for UARTn. + + - SERIAL0 -> USB + - SERIAL1 -> UART1 (User, DMA-enabled) + - SERIAL2 -> UART2 (RX, DMA-enabled) + - SERIAL3 -> UART3 (User) + - SERIAL4 -> UART4 (GPS, DMA-enabled) + - SERIAL6 -> UART6 (ESC Telemetry) + - SERIAL7 -> UART7 (User) + - SERIAL8 -> UART8 (DisplayPort, DMA-enabled) + +## RC Input + +RC input is configured by default via the USART2 RX input. It supports all serial RC protocols except PPM. + +Note: If the receiver is FPort the receiver must be tied to the USART2 TX pin , RSSI_TYPE set to 3, +and SERIAL2_OPTIONS must be set to 7 (invert TX/RX, half duplex). For full duplex like CRSF/ELRS use both +RX1 and TX1 and set RSSI_TYPE also to 3. + +## FrSky Telemetry + +FrSky Telemetry is supported using an unused UART, such as the T3 pin (UART3 transmit). +You need to set the following parameters to enable support for FrSky S.PORT: + + - SERIAL3_PROTOCOL 10 + - SERIAL3_OPTIONS 7 + +## OSD Support + +The Flywoo H743 Pro supports OSD using OSD_TYPE 1 (MAX7456 driver) and simultaneously DisplayPort using TX8/RX8 on the HD VTX connector. + +## PWM Output + +The Flywoo H743 Pro supports up to 13 PWM or DShot outputs. The pads for motor output +M1 to M8 are provided on both the motor connectors and on separate pads, plus +M9-13 on a separate pads for LED strip and other PWM outputs. + +The PWM is in 4 groups: + + - PWM 1-2 in group1 + - PWM 3-6 in group2 + - PWM 7-10 in group3 + - PWM 11-12 in group4 + - PWM 13 in group5 + +Channels within the same group need to use the same output rate. If +any channel in a group uses DShot then all channels in the group need +to use DShot. Channels 1-10 support bi-directional dshot. + +## Battery Monitoring + +The board has a built-in voltage sensor and external current sensor input. The current +sensor can read up to 130 Amps. The voltage sensor can handle up to 6S +LiPo batteries. + +The correct battery setting parameters are: + + - BATT_MONITOR 4 + - BATT_VOLT_PIN 11 + - BATT_CURR_PIN 13 + - BATT_VOLT_MULT 11.1 + - BATT_AMP_PERVLT 40 + +## Compass + +The Flywoo H743 Pro does not have a builtin compass, but you can attach an external compass using I2C on the SDA and SCL pads. + +## VTX power control + +GPIO 81 controls the VTX BEC output to pins marked "10V". Setting this GPIO low removes voltage supply to pins. +By default RELAY2 is configured to control this pin and sets the GPIO high. + +## Camera control + +GPIO 82 controls the camera output to the connectors marked "CAM1" and "CAM2". Setting this GPIO low switches the video output from CAM1 to CAM2. By default RELAY3 is configured to control this pin and sets the GPIO high. + +## Loading Firmware + +Initial firmware load can be done with DFU by plugging in USB with the +bootloader button pressed. Then you should load the "with_bl.hex" +firmware, using your favourite DFU loading tool. + +Once the initial firmware is loaded you can update the firmware using +any ArduPilot ground station software. Updates should be done with the +\*.apj firmware files. diff --git a/libraries/AP_HAL_ChibiOS/hwdef/FlywooH743Pro/Top.png b/libraries/AP_HAL_ChibiOS/hwdef/FlywooH743Pro/Top.png new file mode 100644 index 0000000000..c6a86b6769 Binary files /dev/null and b/libraries/AP_HAL_ChibiOS/hwdef/FlywooH743Pro/Top.png differ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/FlywooH743Pro/defaults.parm b/libraries/AP_HAL_ChibiOS/hwdef/FlywooH743Pro/defaults.parm new file mode 100644 index 0000000000..8b7587d088 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/FlywooH743Pro/defaults.parm @@ -0,0 +1,2 @@ +SERVO13_FUNCTION 120 +OSD_TYPE2 5 \ No newline at end of file diff --git a/libraries/AP_HAL_ChibiOS/hwdef/FlywooH743Pro/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/FlywooH743Pro/hwdef-bl.dat new file mode 100644 index 0000000000..d43b36e618 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/FlywooH743Pro/hwdef-bl.dat @@ -0,0 +1,42 @@ + +# hw definition file for processing by chibios_hwdef.py +# for FLYWOOH743 hardware. +# thanks to betaflight for pin information + +# MCU class and specific type +MCU STM32H7xx STM32H743xx + +# board ID for firmware load +APJ_BOARD_ID AP_HW_FlywooH743Pro + +# crystal frequency, setup to use external oscillator +OSCILLATOR_HZ 8000000 + +FLASH_SIZE_KB 2048 + +# bootloader starts at zero offset +FLASH_RESERVE_START_KB 0 + +# the location where the bootloader will put the firmware +FLASH_BOOTLOADER_LOAD_KB 384 + +# order of UARTs (and USB) +SERIAL_ORDER OTG1 + +# PA10 IO-debug-console +PA11 OTG_FS_DM OTG1 +PA12 OTG_FS_DP OTG1 + +PA13 JTMS-SWDIO SWD +PA14 JTCK-SWCLK SWD + +# Chip select pins +PB12 OSD1_CS CS +PC15 GYRO1_CS CS +PE11 GYRO2_CS CS + +PD10 VTX_PWR OUTPUT HIGH +PD11 CAM_CTRL OUTPUT HIGH + +PE3 LED_BOOTLOADER OUTPUT LOW +define HAL_LED_ON 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/FlywooH743Pro/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/FlywooH743Pro/hwdef.dat new file mode 100644 index 0000000000..aebd3d3511 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/FlywooH743Pro/hwdef.dat @@ -0,0 +1,195 @@ + +# hw definition file for processing by chibios_hwdef.py +# for FLYWOOH743 hardware. +# thanks to betaflight for pin information + +# MCU class and specific type +MCU STM32H7xx STM32H743xx + +# board ID for firmware load +APJ_BOARD_ID AP_HW_FlywooH743Pro + +# crystal frequency, setup to use external oscillator +OSCILLATOR_HZ 8000000 + +MCU_CLOCKRATE_MHZ 480 + +FLASH_SIZE_KB 2048 + +# bootloader takes first sector +FLASH_RESERVE_START_KB 384 + +define HAL_STORAGE_SIZE 16384 +define STORAGE_FLASH_PAGE 1 + +STM32_ST_USE_TIMER 12 +define CH_CFG_ST_RESOLUTION 16 + +# SPI devices + +# SPI1 (IMU1) +PA5 SPI1_SCK SPI1 +PA6 SPI1_MISO SPI1 +PD7 SPI1_MOSI SPI1 + +# SPI2 (OSD) +PB13 SPI2_SCK SPI2 +PB14 SPI2_MISO SPI2 +PB15 SPI2_MOSI SPI2 + +# SPI3 (External) +PB3 SPI3_SCK SPI3 +PB4 SPI3_MISO SPI3 +PB5 SPI3_MOSI SPI3 + +# SPI4 (IMU2) +PE12 SPI4_SCK SPI4 +PE13 SPI4_MISO SPI4 +PE14 SPI4_MOSI SPI4 + +# Chip select pins +PB12 OSD1_CS CS +PC15 GYRO1_CS CS +PE11 GYRO2_CS CS + +# Beeper +PA15 TIM2_CH1 TIM2 GPIO(32) ALARM + +# SERIAL ports +SERIAL_ORDER OTG1 USART1 USART2 USART3 UART4 EMPTY USART6 UART7 UART8 +# PA10 IO-debug-console +PA11 OTG_FS_DM OTG1 +PA12 OTG_FS_DP OTG1 + +# USART1 +PA10 USART1_RX USART1 +PA9 USART1_TX USART1 + +# USART2 (RX) +PD5 USART2_TX USART2 +PD6 USART2_RX USART2 +define DEFAULT_SERIAL1_PROTOCOL SerialProtocol_RCIN + +# USART3 +PD8 USART3_TX USART3 NODMA +PD9 USART3_RX USART3 NODMA +define DEFAULT_SERIAL3_PROTOCOL SerialProtocol_None + +# UART4 (GPS1) +PB8 UART4_RX UART4 +PB9 UART4_TX UART4 +define DEFAULT_SERIAL4_PROTOCOL SerialProtocol_GPS + +# USART6 +PC6 USART6_TX USART6 NODMA +PC7 USART6_RX USART6 NODMA +define DEFAULT_SERIAL6_PROTOCOL SerialProtocol_ESCTelemetry + +# UART7 +PE7 UART7_RX UART7 NODMA +PE8 UART7_TX UART7 NODMA + +# UART8 (DJI/MSP) +PE0 UART8_RX UART8 +PE1 UART8_TX UART8 +define DEFAULT_SERIAL8_PROTOCOL SerialProtocol_MSP_DisplayPort + +# I2C ports +I2C_ORDER I2C1 I2C2 +# I2C1 +PB6 I2C1_SCL I2C1 +PB7 I2C1_SDA I2C1 + +# I2C2 +PB10 I2C2_SCL I2C2 +PB11 I2C2_SDA I2C2 + +BARO SPL06 I2C:1:0x76 +define AP_BARO_BACKEND_DEFAULT_ENABLED 0 +define AP_BARO_SPL06_ENABLED 1 + +# ADC ports + +# ADC1 +PC0 BATT_VOLTAGE_SENS ADC1 SCALE(1) +define HAL_BATT_VOLT_PIN 10 +define HAL_BATT_VOLT_SCALE 11.0 +PC1 BATT_CURRENT_SENS ADC1 SCALE(1) +define HAL_BATT_CURR_PIN 11 +define HAL_BATT_CURR_SCALE 40.0 +PC5 RSSI_ADC ADC1 +define BOARD_RSSI_ANA_PIN 8 +define HAL_BATT_MONITOR_DEFAULT 4 +PC4 PRESSURE_SENS ADC1 SCALE(2) +define HAL_DEFAULT_AIRSPEED_PIN 4 + +# MOTORS +PB0 TIM3_CH3 TIM3 PWM(1) GPIO(50) BIDIR # M1 +PB1 TIM3_CH4 TIM3 PWM(2) GPIO(51) # M2 +PA0 TIM5_CH1 TIM5 PWM(3) GPIO(52) BIDIR # M3 +PA1 TIM5_CH2 TIM5 PWM(4) GPIO(53) # M4 +PA2 TIM5_CH3 TIM5 PWM(5) GPIO(54) BIDIR # M5 +PA3 TIM5_CH4 TIM5 PWM(6) GPIO(55) # M6 +PD12 TIM4_CH1 TIM4 PWM(7) GPIO(56) BIDIR # M7 +PD13 TIM4_CH2 TIM4 PWM(8) GPIO(57) # M8 +PD14 TIM4_CH3 TIM4 PWM(9) GPIO(58) BIDIR # S9 +PD15 TIM4_CH4 TIM4 PWM(10) GPIO(59) # S10 +PE5 TIM15_CH1 TIM15 PWM(11) GPIO(60) NODMA # S11 +PE6 TIM15_CH2 TIM15 PWM(12) GPIO(61) NODMA # S12 + +# LEDs +PA8 TIM1_CH1 TIM1 PWM(13) GPIO(62) # S13 + +# VTX Power control - should be high at startup to ensure power +PD10 VTX_PWR OUTPUT HIGH GPIO(81) +define RELAY2_PIN_DEFAULT 81 + +# Camera switch control - should be high at startup to ensure Camera 1 selected +PD11 CAM_CTRL OUTPUT HIGH GPIO(82) +define RELAY3_PIN_DEFAULT 82 + +PE3 LED0 OUTPUT LOW GPIO(90) +define HAL_GPIO_A_LED_PIN 90 + +PE4 LED1 OUTPUT LOW GPIO(91) +define HAL_GPIO_B_LED_PIN 91 + +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 + +# OSD setup +SPIDEV osd SPI2 DEVID1 OSD1_CS MODE0 10*MHZ 10*MHZ + +define OSD_ENABLED 1 +define HAL_OSD_TYPE_DEFAULT 1 +ROMFS_WILDCARD libraries/AP_OSD/fonts/font*.bin + +# IMU setup + +# IMU setup +SPIDEV imu1 SPI1 DEVID1 GYRO1_CS MODE3 1*MHZ 16*MHZ +SPIDEV imu2 SPI4 DEVID1 GYRO2_CS MODE3 1*MHZ 16*MHZ + +PC8 SDMMC1_D0 SDMMC1 +PC9 SDMMC1_D1 SDMMC1 +PC10 SDMMC1_D2 SDMMC1 +PC11 SDMMC1_D3 SDMMC1 +PC12 SDMMC1_CK SDMMC1 +PD2 SDMMC1_CMD SDMMC1 + +define HAL_OS_FATFS_IO 1 + +IMU Invensensev3 SPI:imu1 ROTATION_PITCH_180_YAW_90 +IMU Invensensev3 SPI:imu2 ROTATION_PITCH_180_YAW_90 + +DMA_NOSHARE TIM3_UP TIM5_UP TIM4_UP SPI1* SPI4* +DMA_PRIORITY TIM3_UP TIM5_UP TIM4_UP SPI1* SPI4* + +# no built-in compass, but probe the i2c bus for all possible +# external compass types +define ALLOW_ARM_NO_COMPASS +define HAL_PROBE_EXTERNAL_I2C_COMPASSES +define HAL_I2C_INTERNAL_MASK 0 +define HAL_COMPASS_AUTO_ROT_DEFAULT 2 +define HAL_DEFAULT_INS_FAST_SAMPLE 3 +# Motor order implies Betaflight/X for standard ESCs +define HAL_FRAME_TYPE_DEFAULT 12 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/FoxeerF405v2/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/FoxeerF405v2/hwdef-bl.dat index fc17a78863..e9ef89d24e 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/FoxeerF405v2/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/FoxeerF405v2/hwdef-bl.dat @@ -27,8 +27,7 @@ SERIAL_ORDER OTG1 PA11 OTG_FS_DM OTG1 PA12 OTG_FS_DP OTG1 -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # Chip select pins diff --git a/libraries/AP_HAL_ChibiOS/hwdef/FoxeerF405v2/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/FoxeerF405v2/hwdef.dat index 31b8c0a884..cd08660e49 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/FoxeerF405v2/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/FoxeerF405v2/hwdef.dat @@ -92,8 +92,6 @@ PB8 I2C1_SCL I2C1 PB9 I2C1_SDA I2C1 # Servos -PB1 SERVO1 OUTPUT GPIO(70) LOW -define RELAY2_PIN_DEFAULT 70 PB14 CAMERA1 OUTPUT GPIO(71) LOW define RELAY3_PIN_DEFAULT 71 @@ -122,14 +120,18 @@ PB10 TIM2_CH3 TIM2 PWM(8) GPIO(57) # M8 PB7 TIM4_CH2 TIM4 PWM(9) GPIO(58) # LED +# Servos +PB1 TIM3_CH4 TIM3 PWM(10) GPIO(70) NODMA # S1 / M10 +PB0 TIM3_CH3 TIM3 PWM(11) GPIO(72) NODMA # S2 / M11 + # LEDs +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 PA13 LED0 OUTPUT LOW GPIO(90) define HAL_GPIO_A_LED_PIN 90 PA14 LED1 OUTPUT LOW GPIO(91) define HAL_GPIO_B_LED_PIN 91 -define HAL_GPIO_LED_ON 0 # Dataflash setup SPIDEV dataflash SPI2 DEVID1 FLASH1_CS MODE3 104*MHZ 104*MHZ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/FoxeerH743v1/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/FoxeerH743v1/hwdef-bl.dat index e12dd8df1e..3106a80968 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/FoxeerH743v1/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/FoxeerH743v1/hwdef-bl.dat @@ -30,8 +30,7 @@ PA12 OTG_FS_DP OTG1 PA13 JTMS-SWDIO SWD PA14 JTCK-SWCLK SWD -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # Chip select pins diff --git a/libraries/AP_HAL_ChibiOS/hwdef/FoxeerH743v1/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/FoxeerH743v1/hwdef.dat index 11b5ec3caa..97e2b86c68 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/FoxeerH743v1/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/FoxeerH743v1/hwdef.dat @@ -136,8 +136,9 @@ PC9 TIM8_CH4 TIM8 PWM(8) GPIO(57) # M8 # LEDs PA8 TIM1_CH1 TIM1 PWM(9) GPIO(58) # M9 +define AP_NOTIFY_GPIO_LED_1_ENABLED 1 PC13 LED0 OUTPUT LOW GPIO(90) -define HAL_GPIO_A_LED_PIN 90 +define AP_NOTIFY_GPIO_LED_1_PIN 90 # Dataflash setup SPIDEV dataflash SPI3 DEVID1 FLASH1_CS MODE3 104*MHZ 104*MHZ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/FreeflyRTK/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/FreeflyRTK/hwdef.dat index 27f4495679..feb334dbb0 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/FreeflyRTK/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/FreeflyRTK/hwdef.dat @@ -110,9 +110,6 @@ define DMA_RESERVE_SIZE 0 PB8 CAN1_RX CAN1 PB9 CAN1_TX CAN1 - -define HAL_NO_MONITOR_THREAD - define HAL_DEVICE_THREAD_STACK 768 # we setup a small defaults.parm diff --git a/libraries/AP_HAL_ChibiOS/hwdef/G4-ESC/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/G4-ESC/hwdef.dat index f272f5fd13..088062cadf 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/G4-ESC/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/G4-ESC/hwdef.dat @@ -130,10 +130,6 @@ define HAL_UART_MIN_RX_SIZE 128 define HAL_UART_STACK_SIZE 0x200 - -define HAL_NO_MONITOR_THREAD - - define HAL_DEVICE_THREAD_STACK 0x200 define STORAGE_THD_WA_SIZE 512 define IO_THD_WA_SIZE 512 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/GEPRCF745BTHD/README.md b/libraries/AP_HAL_ChibiOS/hwdef/GEPRCF745BTHD/README.md new file mode 100644 index 0000000000..8d88bb0c11 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/GEPRCF745BTHD/README.md @@ -0,0 +1,99 @@ +# GEPRC TAKER F745 BT Flight Controller + +The TAKER F745 BT is a flight controller produced by [GEPRC](https://geprc.com/). + +## Features + + - STM32F745 microcontroller + - MPU6000+ICM42688 dual IMU + - BMP280 barometer + - microSD based 512MB flash logging + - AT7456E OSD + - 7 UARTs + - 8 PWM outputs + +## Pinout + +![TAKER F745 BT Board](TAKER_F745_BT_Board_Top.jpg "GEPRCF745BTHD") +![TAKER F745 BT Board](TAKER_F745_BT_Board_Bottom.jpg "GEPRCF745BTHD") + +## UART Mapping + +The UARTs are marked Rn and Tn in the above pinouts. The Rn pin is the +receive pin for UARTn. The Tn pin is the transmit pin for UARTn. + + - SERIAL0 -> USB + - SERIAL1 -> UART1 (DisplayPort, DMA-enabled) + - SERIAL2 -> UART2 (RCIN, DMA-enabled) + - SERIAL3 -> UART3 (connected to internal BT module, not currently usable by ArduPilot) + - SERIAL4 -> UART4 (GPS) + - SERIAL6 -> UART6 (User) + - SERIAL7 -> UART7 (User) + - SERIAL8 -> UART8 (ESC Telemetry) + +## RC Input + +RC input is configured by default via the USAR2 RX input. It supports all unidirectional RC protocols except PPM. FPort and full duplex protocols, like CRSF/ELRS, will need to use TX2 also. + +Note: +If the receiver is FPort or a full duplex protocol, then the receiver must be tied to the USART2 TX pin and [SERIAL2_OPTIONS](https://ardupilot.org/copter/docs/parameters.html#serial2-options) = 7 (invert TX/RX, half duplex), and [RSSI_TYPE](https://ardupilot.org/copter/docs/parameters.html#rssi-type) =3. + +## FrSky Telemetry + +FrSky Telemetry is supported using the Tx pin of any UART including SERIAL2/UART2. You need to set the following parameters to enable support for FrSky S.PORT (example shows SERIAL3). + + - SERIAL3_PROTOCOL 10 + - SERIAL3_OPTIONS 7 + +## OSD Support + +The TAKER F745 BT supports analog OSD using its internal OSD chip and simultaneously HD goggle DisplayPort OSDs via the HD VTX connector. + +## VTX Support + +The SH1.0-6P connector supports a standard DJI HD VTX connection. Pin 1 of the connector is 12v (or VBAT by solder pad selection) so be careful not to connect to devices expecting 5v. + +## PWM Output + +The TAKER F745 BT supports up to 9 PWM outputs. The pads for motor output +M1 to M4 are on the esc connector, M5-M8 are solder pads, plus M9 is defaulted for serial LED strip or can be used as another PWM output. + +The PWM is in 4 groups: + + - PWM 1-4 in group1 + - PWM 5-6 in group2 + - PWM 7-8 in group3 + - PWM 9 in group4 + +Channels within the same group need to use the same output rate. If +any channel in a group uses DShot then all channels in the group need +to use DShot. Channels 1-4 support bi-directional DShot. + +## Battery Monitoring + +The board has a internal voltage sensor and connections on the ESC connector for an external current sensor input. +The voltage sensor can handle up to 6S. +LiPo batteries. + +The default battery parameters are: + + - BATT_MONITOR 4 + - BATT_VOLT_PIN 13 + - BATT_VOLT_SCALE 11.0 + - BATT_CURR_PIN 12 + - BATT_CURR_SCALE 28.5 + +## Compass + +The TAKER F745 BT does not have a builtin compass, but you can attach an external compass using I2C on the SDA and SCL pads. + +## Loading Firmware + +Initial firmware load can be done with DFU by plugging in USB with the +bootloader button pressed. Then you should load the "with_bl.hex" +firmware, using your favourite DFU loading tool. + +Once the initial firmware is loaded you can update the firmware using +any ArduPilot ground station software. Updates should be done with the +*.apj firmware files. + diff --git a/libraries/AP_HAL_ChibiOS/hwdef/GEPRCF745BTHD/TAKER_F745_BT_Board_Bottom.jpg b/libraries/AP_HAL_ChibiOS/hwdef/GEPRCF745BTHD/TAKER_F745_BT_Board_Bottom.jpg new file mode 100644 index 0000000000..dfc0462b64 Binary files /dev/null and b/libraries/AP_HAL_ChibiOS/hwdef/GEPRCF745BTHD/TAKER_F745_BT_Board_Bottom.jpg differ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/GEPRCF745BTHD/TAKER_F745_BT_Board_Top.jpg b/libraries/AP_HAL_ChibiOS/hwdef/GEPRCF745BTHD/TAKER_F745_BT_Board_Top.jpg new file mode 100644 index 0000000000..e4b6bdac6b Binary files /dev/null and b/libraries/AP_HAL_ChibiOS/hwdef/GEPRCF745BTHD/TAKER_F745_BT_Board_Top.jpg differ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/GEPRCF745BTHD/defaults.parm b/libraries/AP_HAL_ChibiOS/hwdef/GEPRCF745BTHD/defaults.parm new file mode 100644 index 0000000000..6455bd215b --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/GEPRCF745BTHD/defaults.parm @@ -0,0 +1,4 @@ +# setup for LEDs on chan9 +SERVO9_FUNCTION 120 + +OSD_TYPE2 5 \ No newline at end of file diff --git a/libraries/AP_HAL_ChibiOS/hwdef/GEPRCF745BTHD/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/GEPRCF745BTHD/hwdef-bl.dat new file mode 100644 index 0000000000..8906e3f859 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/GEPRCF745BTHD/hwdef-bl.dat @@ -0,0 +1,54 @@ +# hw definition file for processing by chibios_pins.py +# for GEPRFF745-BT-HD bootloader + +# MCU class and specific type +MCU STM32F7xx STM32F745xx + +# board ID for firmware load +APJ_BOARD_ID AP_HW_GEPRCF745BTHD + +# crystal frequency, setup to use external oscillator +OSCILLATOR_HZ 8000000 + +define STM32_LSECLK 32768U +define STM32_LSEDRV (3U << 3U) + +FLASH_SIZE_KB 1024 + +# bootloader starts at zero offset +FLASH_RESERVE_START_KB 0 + +# the location where the bootloader will put the firmware +FLASH_BOOTLOADER_LOAD_KB 96 + + +# order of UARTs (and USB) +SERIAL_ORDER OTG1 + +# PA10 IO-debug-console +PA11 OTG_FS_DM OTG1 +PA12 OTG_FS_DP OTG1 + +PA13 JTMS-SWDIO SWD +PA14 JTCK-SWCLK SWD + +PD2 BUZZER OUTPUT LOW PULLDOWN + +PC13 LED_BOOTLOADER OUTPUT LOW +define HAL_LED_ON 0 + +# Motors for esc init +PB0 PWMOUT1 OUTPUT LOW +PB1 PWMOUT2 OUTPUT LOW +PB5 PWMOUT3 OUTPUT LOW +PB4 PWMOUT4 OUTPUT LOW +PD12 PWMOUT5 OUTPUT LOW +PD13 PWMOUT6 OUTPUT LOW +PC8 PWMOUT7 OUTPUT LOW +PC9 PWMOUT8 OUTPUT LOW + +# Add CS pins to ensure they are high in bootloader +PA15 SDCARD_CS CS +PE4 MAX7456_CS CS +PA4 MPU6000_CS CS +PB12 ICM42605_CS CS diff --git a/libraries/AP_HAL_ChibiOS/hwdef/GEPRCF745BTHD/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/GEPRCF745BTHD/hwdef.dat new file mode 100644 index 0000000000..1d84d2734a --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/GEPRCF745BTHD/hwdef.dat @@ -0,0 +1,174 @@ +# hw definition file for processing by chibios_pins.py +# for TAKER F745 BT hardware. +# thanks to betaflight for pin information + +# MCU class and specific type +MCU STM32F7xx STM32F745xx + +# board ID for firmware load +APJ_BOARD_ID AP_HW_GEPRCF745BTHD + +# crystal frequency, setup to use external oscillator +OSCILLATOR_HZ 8000000 + +FLASH_SIZE_KB 1024 + +# leave 2 sectors free +FLASH_RESERVE_START_KB 96 + + +# only one I2C bus +I2C_ORDER I2C1 + +# I2C1 for baro +PB8 I2C1_SCL I2C1 +PB9 I2C1_SDA I2C1 + +# order of UARTs (and USB), +SERIAL_ORDER OTG1 USART1 USART2 USART3 UART4 EMPTY USART6 UART7 UART8 + +# buzzer +#define HAL_BUZZER_PIN 80 + +# PA10 IO-debug-console +PA11 OTG_FS_DM OTG1 +PA12 OTG_FS_DP OTG1 + +PA13 JTMS-SWDIO SWD +PA14 JTCK-SWCLK SWD + +# SPI1 for MPU6000 +PA4 MPU6000_CS CS +PA5 SPI1_SCK SPI1 +PA6 SPI1_MISO SPI1 +PA7 SPI1_MOSI SPI1 + +# SPI2 for ICM42688 +PB12 ICM42605_CS CS +PB13 SPI2_SCK SPI2 +PB14 SPI2_MISO SPI2 +PB15 SPI2_MOSI SPI2 + +# SPI3 for SDCard +PA15 SDCARD_CS CS +PC10 SPI3_SCK SPI3 +PC11 SPI3_MISO SPI3 +PC12 SPI3_MOSI SPI3 + +# SPI4 for MAX7456 OSD +PE4 MAX7456_CS CS +PE2 SPI4_SCK SPI4 +PE5 SPI4_MISO SPI4 +PE6 SPI4_MOSI SPI4 + +PC3 BATT_VOLTAGE_SENS ADC1 SCALE(1) +PC2 BATT_CURRENT_SENS ADC1 SCALE(1) + +# define default battery setup +define HAL_BATT_MONITOR_DEFAULT 4 +define HAL_BATT_VOLT_PIN 13 +define HAL_BATT_CURR_PIN 12 +define HAL_BATT_VOLT_SCALE 11.13 +define HAL_BATT_CURR_SCALE 28.5 + +PC13 LED0 OUTPUT LOW GPIO(90) # LED +define AP_NOTIFY_GPIO_LED_1_ENABLED 1 +define AP_NOTIFY_GPIO_LED_1_PIN 90 + +# In order to accommodate bi-directional dshot certain devices cannot be DMA enabled +# NODMA indicates these devices, if you remove it they will still not be resolved for DMA + +# USART1 +PA10 USART1_RX USART1 +PA9 USART1_TX USART1 +define DEFAULT_SERIAL1_PROTOCOL SerialProtocol_MSP_DisplayPort + +# USART2 +# RC input defaults to UART to allow for bi-dir dshot +PA2 USART2_TX USART2 +PA3 USART2_RX USART2 +define DEFAULT_SERIAL2_PROTOCOL SerialProtocol_RCIN +define DEFAULT_SERIAL2_BAUD 115 + +# USART3 (BT) +PB11 USART3_RX USART3 NODMA +PB10 USART3_TX USART3 NODMA +define DEFAULT_SERIAL3_PROTOCOL SerialProtocol_None + +# UART4 (GPS) +PA0 UART4_TX UART4 NODMA +PA1 UART4_RX UART4 NODMA +define DEFAULT_SERIAL4_PROTOCOL SerialProtocol_GPS + +# UART6 +PC6 USART6_TX USART6 NODMA +PC7 USART6_RX USART6 NODMA +define DEFAULT_SERIAL6_PROTOCOL SerialProtocol_None + +# UART7 +PE7 UART7_RX UART7 NODMA +PE8 UART7_TX UART7 NODMA +define DEFAULT_SERIAL7_PROTOCOL SerialProtocol_None + +# UART8 +PE0 UART8_RX UART8 NODMA +PE1 UART8_TX UART8 NODMA +define DEFAULT_SERIAL8_PROTOCOL SerialProtocol_ESCTelemetry + +# Motors, bi-directional dshot capable +PB0 TIM3_CH3 TIM3 PWM(1) GPIO(50) # M1 +PB1 TIM3_CH4 TIM3 PWM(2) GPIO(51) BIDIR # M2 +PB5 TIM3_CH2 TIM3 PWM(3) GPIO(52) # M3 +PB4 TIM3_CH1 TIM3 PWM(4) GPIO(53) BIDIR # M4 +PD12 TIM4_CH1 TIM4 PWM(5) GPIO(54) # M5 +PD13 TIM4_CH2 TIM4 PWM(6) GPIO(55) # M6 +PC8 TIM8_CH3 TIM8 PWM(7) GPIO(56) NODMA # M7 +PC9 TIM8_CH4 TIM8 PWM(8) GPIO(57) NODMA # M8 + +# extra PWM outs +PA8 TIM1_CH1 TIM1 PWM(9) GPIO(58) # led pin +PD2 BUZZER OUTPUT GPIO(80) LOW +define HAL_BUZZER_PIN 80 +define HAL_BUZZER_ON 1 +define HAL_BUZZER_OFF 0 + +DMA_PRIORITY USART2* + +define HAL_STORAGE_SIZE 16384 +STORAGE_FLASH_PAGE 1 + +# spi devices +SPIDEV mpu6000 SPI1 DEVID1 MPU6000_CS MODE3 1*MHZ 4*MHZ +SPIDEV icm42688 SPI2 DEVID1 ICM42605_CS MODE3 2*MHZ 16*MHZ +SPIDEV sdcard SPI3 DEVID1 SDCARD_CS MODE0 400*KHZ 25*MHZ +SPIDEV osd SPI4 DEVID4 MAX7456_CS MODE0 10*MHZ 10*MHZ + +# IMU setup +IMU Invensensev3 SPI:icm42688 ROTATION_ROLL_180 +IMU Invensense SPI:mpu6000 ROTATION_YAW_90 +define HAL_DEFAULT_INS_FAST_SAMPLE 3 + +# no built-in compass, but probe the i2c bus for all possible +# external compass types +define ALLOW_ARM_NO_COMPASS +define HAL_PROBE_EXTERNAL_I2C_COMPASSES +define HAL_I2C_INTERNAL_MASK 0 +define HAL_COMPASS_AUTO_ROT_DEFAULT 2 + +# one BARO +BARO BMP280 I2C:0:0x76 + +define HAL_OS_FATFS_IO 1 +define HAL_BOARD_LOG_DIRECTORY "/APM/LOGS" +define HAL_BOARD_TERRAIN_DIRECTORY "/APM/TERRAIN" + +# setup for OSD +define OSD_ENABLED 1 +define HAL_OSD_TYPE_DEFAULT 1 +ROMFS_WILDCARD libraries/AP_OSD/fonts/font0.bin + +# save some flash +include ../include/minimize_fpv_osd.inc + +undef AP_BARO_PROBE_EXTERNAL_I2C_BUSES +define AP_BARO_PROBE_EXTERNAL_I2C_BUSES 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/H757I_EVAL/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/H757I_EVAL/hwdef-bl.dat index 350f832c1f..40d0002e37 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/H757I_EVAL/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/H757I_EVAL/hwdef-bl.dat @@ -21,9 +21,6 @@ APJ_BOARD_ID 146 FLASH_SIZE_KB 2048 -# setup build for a peripheral firmware -env AP_PERIPH 1 - EXT_FLASH_SIZE_MB 32 # bootloader is installed at zero offset diff --git a/libraries/AP_HAL_ChibiOS/hwdef/H757I_EVAL/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/H757I_EVAL/hwdef.dat index 469cf96f1e..d040bb75c2 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/H757I_EVAL/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/H757I_EVAL/hwdef.dat @@ -23,9 +23,6 @@ APJ_BOARD_ID 146 FLASH_SIZE_KB 2048 -# setup build for a peripheral firmware -# env AP_PERIPH 1 - # bootloader is installed at zero offset FLASH_RESERVE_START_KB 128 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/HEEWING-F405/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/HEEWING-F405/hwdef.dat index 68926f04e5..002175646b 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/HEEWING-F405/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/HEEWING-F405/hwdef.dat @@ -22,6 +22,7 @@ OSCILLATOR_HZ 8000000 # --------------------- LED ----------------------- +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 PC13 LED0 OUTPUT LOW GPIO(90) # blue marked as ACT PC15 LED1 OUTPUT LOW GPIO(91) # green marked as B/E define HAL_GPIO_A_LED_PIN 91 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Here4AP/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/Here4AP/hwdef-bl.dat index e3e6dca8be..2468fe4167 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Here4AP/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Here4AP/hwdef-bl.dat @@ -45,8 +45,6 @@ STM32_VDD 330U PB8 LED_SCK OUTPUT LOW PB9 LED_DI OUTPUT HIGH -define HAL_NO_MONITOR_THREAD - PA13 JTMS-SWDIO SWD PA14 JTCK-SWCLK SWD diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Here4AP/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Here4AP/hwdef.dat index 3a2959b133..c0e8b3a72c 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Here4AP/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Here4AP/hwdef.dat @@ -136,3 +136,4 @@ define AP_SERIALLED_ENABLED 1 define HAL_SERIAL_ESC_COMM_ENABLED 1 define HAL_RCIN_THREAD_ENABLED 1 define HAL_SCHEDULER_LOOP_DELAY_ENABLED 1 +define HAL_MONITOR_THREAD_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Here4FC/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/Here4FC/hwdef-bl.dat index b83fa886e2..ce612d3480 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Here4FC/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Here4FC/hwdef-bl.dat @@ -45,8 +45,6 @@ STM32_VDD 330U PB8 LED_SCK OUTPUT LOW PB9 LED_DI OUTPUT HIGH -define HAL_NO_MONITOR_THREAD - PA13 JTMS-SWDIO SWD PA14 JTCK-SWCLK SWD diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Hitec-Airspeed/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Hitec-Airspeed/hwdef.dat index daffe92078..02e4dc43f3 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Hitec-Airspeed/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Hitec-Airspeed/hwdef.dat @@ -92,9 +92,6 @@ define HAL_USE_ADC FALSE define STM32_ADC_USE_ADC1 FALSE define HAL_DISABLE_ADC_DRIVER TRUE -define HAL_NO_MONITOR_THREAD - - define HAL_DEVICE_THREAD_STACK 0x200 define STORAGE_THD_WA_SIZE 512 define IO_THD_WA_SIZE 512 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/HitecMosaic/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/HitecMosaic/hwdef.dat index 5e63804ec1..5ad3e22add 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/HitecMosaic/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/HitecMosaic/hwdef.dat @@ -101,10 +101,6 @@ define HAL_UART_MIN_RX_SIZE 128 define HAL_UART_STACK_SIZE 0x200 - -define HAL_NO_MONITOR_THREAD - - # only one I2C bus I2C_ORDER I2C1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/HolybroG4_Compass/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/HolybroG4_Compass/hwdef.dat index 9638c51aa2..2b849b6f64 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/HolybroG4_Compass/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/HolybroG4_Compass/hwdef.dat @@ -38,11 +38,11 @@ PC10 LED OUTPUT HIGH GPIO(2) # blue PB15 LED_R OUTPUT HIGH GPIO(0) PC6 LED_G OUTPUT HIGH GPIO(1) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # USART2, debug PA2 USART2_TX USART2 @@ -81,8 +81,6 @@ PA11 CAN1_RX CAN1 PA12 CAN1_TX CAN1 PC13 GPIO_CAN1_SILENT OUTPUT PUSHPULL SPEED_LOW LOW -define HAL_NO_MONITOR_THREAD - define HAL_DEVICE_THREAD_STACK 768 # we setup a small defaults.parm diff --git a/libraries/AP_HAL_ChibiOS/hwdef/HolybroG4_GPS/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/HolybroG4_GPS/hwdef.dat index e4748206c6..b19878781d 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/HolybroG4_GPS/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/HolybroG4_GPS/hwdef.dat @@ -42,11 +42,11 @@ PC10 LED OUTPUT HIGH GPIO(2) # blue PB15 LED_R OUTPUT HIGH GPIO(0) PC6 LED_G OUTPUT HIGH GPIO(1) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # USART3, GPS PB10 USART3_TX USART3 @@ -109,8 +109,6 @@ PB12 CAN2_RX CAN2 PB13 CAN2_TX CAN2 PB14 GPIO_CAN2_SILENT OUTPUT PUSHPULL SPEED_LOW LOW -define HAL_NO_MONITOR_THREAD - define HAL_DEVICE_THREAD_STACK 768 # we setup a small defaults.parm diff --git a/libraries/AP_HAL_ChibiOS/hwdef/HolybroGPS/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/HolybroGPS/hwdef.dat index eb7125097e..a5257aff3e 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/HolybroGPS/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/HolybroGPS/hwdef.dat @@ -44,11 +44,11 @@ PB15 LED OUTPUT HIGH GPIO(2) # blue PA7 LED_R OUTPUT HIGH GPIO(0) PB14 LED_G OUTPUT HIGH GPIO(1) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # USART1, GPS PA9 USART1_TX USART1 NODMA @@ -126,10 +126,6 @@ PB12 CAN2_RX CAN2 PB13 CAN2_TX CAN2 PA4 GPIO_CAN2_SILENT OUTPUT PUSHPULL SPEED_LOW LOW - -define HAL_NO_MONITOR_THREAD - - define HAL_DEVICE_THREAD_STACK 768 # we setup a small defaults.parm diff --git a/libraries/AP_HAL_ChibiOS/hwdef/IFLIGHT_2RAW_H7/README.md b/libraries/AP_HAL_ChibiOS/hwdef/IFLIGHT_2RAW_H7/README.md new file mode 100644 index 0000000000..9cb60c8180 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/IFLIGHT_2RAW_H7/README.md @@ -0,0 +1,105 @@ +# iFlight 2RAW H743 Flight Controller + +The iFlight 2RAW H743 is a flight controller produced by [iFlight](https://shop.iflight.com/Thunder-H7-Flight-Controller-Pro2200). + +## Features + + - MCU - STM32H743 32-bit processor running at 480 MHz + - IMU - ICM42688P + - Barometer - SPL06-001 + - Onboard Flash: 1GBit exposed as microSD card + - 6x UARTs + - 9x PWM Outputs (8 Motor Output, 1 LED) + - Battery input voltage: 2S-6S + - BEC 5V 1.5A + - BEC 10V 1.5A + +## Pinout + +![iFlight 2RAW H743 Board Top](Thunder-H7-1.png "iFlight 2RAW H743 Top") +![iFlight 2RAW H743 Board Bottom](Thunder-H7-2.png "iFlight 2RAW H743 Bottom") + +## UART Mapping + +The UARTs are marked Rn and Tn in the above pinouts. The Rn pin is the +receive pin for UARTn. The Tn pin is the transmit pin for UARTn. + + - SERIAL0 -> USB + - SERIAL1 -> UART1 (VTX HD, DMA-enabled) + - SERIAL2 -> UART2 (RX, DMA-enabled) + - SERIAL3 -> UART3 (GPS, DMA-enabled) + - SERIAL4 -> UART4 (GPS, DMA-enabled) + - SERIAL6 -> UART6 (ESC Telemetry) + +## RC Input + +RC input is configured on the R2 (UART2_RX) pin. It supports all serial RC +protocols. For protocols requiring half-duplex serial to transmit +telemetry (such as FPort) you should setup SERIAL3 as an RC input serial port, +with half-duplex, pin-swap and inversion enabled. + +## FrSky Telemetry + +FrSky Telemetry is supported using the T3 pin (UART3 transmit). You need to set the following parameters to enable support for FrSky S.PORT + + - SERIAL3_PROTOCOL 10 + - SERIAL3_OPTIONS 7 + +## OSD Support + +The iFlight 2RAW H743 supports MSP DisplayPort OSD using OSD_TYPE 5 + +## PWM Output + +The iFlight 2RAW H743 supports up to 9 PWM outputs. The pads for motor output +M1 to M8 are provided in the motor connector, plus M9 on a separate pad for LED strip +or another PWM output. + +The PWM is in 5 groups: + + - PWM 1-2 in group1 + - PWM 3-6 in group2 + - PWM 7-8 in group3 + - PWM 9 in group4 + +Channels within the same group need to use the same output rate. If +any channel in a group uses DShot then all channels in the group need +to use DShot. Channels 1-8 support bi-directional dshot. + +## Battery Monitoring + +The board has a builting voltage and current sensor. The current +sensor can read up to 130 Amps. The voltage sensor can handle up to 6S +LiPo batteries. + +The correct battery setting parameters are: + + - BATT_MONITOR 4 + - BATT_VOLT_PIN 11 + - BATT_CURR_PIN 13 + - BATT_VOLT_MULT 11.1 + - BATT_AMP_PERVLT 64 + +## Compass + +The iFlight 2RAW H743 does not have a builtin compass, but you can attach an external compass using I2C on the SDA and SCL pads. + +## VTX power control +GPIO 81 controls the VTX BEC output to pins marked "10V". Setting this GPIO low removes voltage supply to pins. +By default RELAY2 is configured to control this pin and sets the GPIO high. + +## Logging + +Logging is via a 1GBit flash chip exposed via a microSD interface. In order to be used you must format the card using mission planner +after the first time you have loaded the firmware + +## Loading Firmware + +Initial firmware load can be done with DFU by plugging in USB with the +bootloader button pressed. Then you should load the "with_bl.hex" +firmware, using your favourite DFU loading tool. + +Once the initial firmware is loaded you can update the firmware using +any ArduPilot ground station software. Updates should be done with the +*.apj firmware files. + diff --git a/libraries/AP_HAL_ChibiOS/hwdef/IFLIGHT_2RAW_H7/Thunder-H7-1.png b/libraries/AP_HAL_ChibiOS/hwdef/IFLIGHT_2RAW_H7/Thunder-H7-1.png new file mode 100644 index 0000000000..75ff0f8d10 Binary files /dev/null and b/libraries/AP_HAL_ChibiOS/hwdef/IFLIGHT_2RAW_H7/Thunder-H7-1.png differ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/IFLIGHT_2RAW_H7/Thunder-H7-2.png b/libraries/AP_HAL_ChibiOS/hwdef/IFLIGHT_2RAW_H7/Thunder-H7-2.png new file mode 100644 index 0000000000..29d2020f2c Binary files /dev/null and b/libraries/AP_HAL_ChibiOS/hwdef/IFLIGHT_2RAW_H7/Thunder-H7-2.png differ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/IFLIGHT_2RAW_H7/defaults.parm b/libraries/AP_HAL_ChibiOS/hwdef/IFLIGHT_2RAW_H7/defaults.parm new file mode 100644 index 0000000000..a328b10088 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/IFLIGHT_2RAW_H7/defaults.parm @@ -0,0 +1,4 @@ +# setup for LEDs on chan9 +SERVO9_FUNCTION 120 +# Default VTX power to on +RELAY2_DEFAULT 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/IFLIGHT_2RAW_H7/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/IFLIGHT_2RAW_H7/hwdef-bl.dat new file mode 100644 index 0000000000..0c899d3251 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/IFLIGHT_2RAW_H7/hwdef-bl.dat @@ -0,0 +1,42 @@ + +# hw definition file for processing by chibios_hwdef.py +# for IFLIGHT_2RAW_H743 hardware. +# thanks to betaflight for pin information + +# MCU class and specific type +MCU STM32H7xx STM32H743xx + +# board ID for firmware load +APJ_BOARD_ID AP_HW_2RAWH743 + +# crystal frequency, setup to use external oscillator +OSCILLATOR_HZ 8000000 + +FLASH_SIZE_KB 2048 + +# bootloader starts at zero offset +FLASH_RESERVE_START_KB 0 + +# the location where the bootloader will put the firmware +FLASH_BOOTLOADER_LOAD_KB 384 + +# order of UARTs (and USB) +SERIAL_ORDER OTG1 + +# PA10 IO-debug-console +PA11 OTG_FS_DM OTG1 +PA12 OTG_FS_DP OTG1 + +PA13 JTMS-SWDIO SWD +PA14 JTCK-SWCLK SWD + +PD11 CAM_SW OUTPUT LOW +PD10 VTX_PWR OUTPUT HIGH + +# Chip select pins +PA15 SDCARD1_CS CS +PB12 OSD1_CS CS +PC15 GYRO1_CS CS + +PA8 LED_BOOTLOADER OUTPUT LOW +define HAL_LED_ON 0 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/IFLIGHT_2RAW_H7/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/IFLIGHT_2RAW_H7/hwdef.dat new file mode 100644 index 0000000000..d90fe2e679 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/IFLIGHT_2RAW_H7/hwdef.dat @@ -0,0 +1,150 @@ + +# hw definition file for processing by chibios_hwdef.py +# for IFLIGHT_2RAW_H743 hardware. +# thanks to betaflight for pin information + +# MCU class and specific type +MCU STM32H7xx STM32H743xx + +# board ID for firmware load +APJ_BOARD_ID AP_HW_2RAWH743 + +# crystal frequency, setup to use external oscillator +OSCILLATOR_HZ 8000000 + +MCU_CLOCKRATE_MHZ 480 + +FLASH_SIZE_KB 2048 + +# bootloader takes first sector +FLASH_RESERVE_START_KB 384 + +define HAL_STORAGE_SIZE 16384 +define STORAGE_FLASH_PAGE 1 + +STM32_ST_USE_TIMER 2 + +# SPI devices + +# SPI1 +PA5 SPI1_SCK SPI1 +PA6 SPI1_MISO SPI1 +PD7 SPI1_MOSI SPI1 + +# SPI2 +PB13 SPI2_SCK SPI2 +PB14 SPI2_MISO SPI2 +PB15 SPI2_MOSI SPI2 + +# SPI3 +PC12 SPI3_MOSI SPI3 +PC11 SPI3_MISO SPI3 +PC10 SPI3_SCK SPI3 + +# Chip select pins +PA15 SDCARD1_CS CS +PB12 OSD1_CS CS +PC15 GYRO1_CS CS + +# SERIAL ports +SERIAL_ORDER OTG1 USART1 USART2 USART3 UART4 EMPTY USART6 OTG2 +# PA10 IO-debug-console +PA11 OTG_FS_DM OTG1 +PA12 OTG_FS_DP OTG1 + +# USART1 (VTX HD) +PA10 USART1_RX USART1 +PA9 USART1_TX USART1 +define DEFAULT_SERIAL1_PROTOCOL SerialProtocol_MSP_DisplayPort +define OSD_ENABLED 1 +define HAL_OSD_TYPE_DEFAULT 5 + +# USART2 (RX) +PD5 USART2_TX USART2 +PD6 USART2_RX USART2 +define DEFAULT_SERIAL2_PROTOCOL SerialProtocol_RCIN + +# USART3 (GPS) +PD8 USART3_TX USART3 +PD9 USART3_RX USART3 +define DEFAULT_SERIAL3_PROTOCOL SerialProtocol_GPS + +# UART4 (GPS) +PB8 UART4_RX UART4 +PB9 UART4_TX UART4 +define DEFAULT_SERIAL4_PROTOCOL SerialProtocol_GPS + +# USART6 +PC6 USART6_TX USART6 NODMA +PC7 USART6_RX USART6 NODMA +define DEFAULT_SERIAL6_PROTOCOL SerialProtocol_ESCTelemetry + +# I2C ports +I2C_ORDER I2C1 I2C2 +# I2C1 +PB6 I2C1_SCL I2C1 +PB7 I2C1_SDA I2C1 + +# I2C2 +PB10 I2C2_SCL I2C2 +PB11 I2C2_SDA I2C2 + +# ADC ports + +# ADC1 +PC0 BATT_VOLTAGE_SENS ADC1 SCALE(1) +define HAL_BATT_VOLT_PIN 10 +define HAL_BATT_VOLT_SCALE 11.0 +PC1 BATT_CURRENT_SENS ADC1 SCALE(1) +define HAL_BATT_CURR_PIN 11 +define HAL_BATT_CURR_SCALE 40.0 +PC5 RSSI_ADC ADC1 +define BOARD_RSSI_ANA_PIN 8 +define HAL_BATT_MONITOR_DEFAULT 4 + +# MOTORS +PB0 TIM3_CH3 TIM3 PWM(1) GPIO(50) BIDIR # M1 +PB1 TIM3_CH4 TIM3 PWM(2) GPIO(51) # M2 +PA0 TIM5_CH1 TIM5 PWM(3) GPIO(52) BIDIR # M3 +PA1 TIM5_CH2 TIM5 PWM(4) GPIO(53) # M4 +PA2 TIM5_CH3 TIM5 PWM(5) GPIO(54) BIDIR # M5 +PA3 TIM5_CH4 TIM5 PWM(6) GPIO(55) # M6 +PD12 TIM4_CH1 TIM4 PWM(7) GPIO(56) BIDIR # M7 +PD13 TIM4_CH2 TIM4 PWM(8) GPIO(57) # M8 + +# LEDs +PA8 TIM1_CH1 TIM1 PWM(9) GPIO(58) # M9 + +# VTX power switch +PD10 VTX_PWR OUTPUT LOW GPIO(81) +define RELAY2_PIN_DEFAULT 81 + +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 +PE3 LED0 OUTPUT LOW GPIO(90) +define HAL_GPIO_A_LED_PIN 90 + +PE4 LED1 OUTPUT LOW GPIO(91) +define HAL_GPIO_B_LED_PIN 91 + +BARO SPL06 I2C:1:0x76 + +# SPI setup +SPIDEV imu1 SPI1 DEVID1 GYRO1_CS MODE3 1*MHZ 16*MHZ +SPIDEV sdcard SPI3 DEVID1 SDCARD1_CS MODE0 400*KHZ 25*MHZ + +# IMU setup +IMU Invensensev3 SPI:imu1 ROTATION_ROLL_180 + +DMA_NOSHARE TIM3_UP TIM5_UP TIM4_UP SPI1* +DMA_PRIORITY TIM3_UP TIM5_UP TIM4_UP SPI1* + +# no built-in compass, but probe the i2c bus for all possible +# external compass types +define ALLOW_ARM_NO_COMPASS +define HAL_PROBE_EXTERNAL_I2C_COMPASSES +define HAL_I2C_INTERNAL_MASK 0 +define HAL_COMPASS_AUTO_ROT_DEFAULT 2 +define HAL_DEFAULT_INS_FAST_SAMPLE 1 +# Motor order implies Betaflight/X for standard ESCs +define HAL_FRAME_TYPE_DEFAULT 12 +define HAL_OS_FATFS_IO 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/JFB100/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/JFB100/hwdef.dat index 21d2a04a33..efa1c9bd79 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/JFB100/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/JFB100/hwdef.dat @@ -288,9 +288,9 @@ PC7 LED_BLUE OUTPUT GPIO(90) HIGH PB1 LED_RED OUTPUT OPENDRAIN GPIO(92) # setup for BoardLED2 +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 define HAL_GPIO_A_LED_PIN 90 define HAL_GPIO_B_LED_PIN 92 -define HAL_GPIO_LED_ON 0 # enable RAMTROM parameter storage diff --git a/libraries/AP_HAL_ChibiOS/hwdef/JFB110/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/JFB110/hwdef-bl.dat index 6a7b2f739b..6e564b78f1 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/JFB110/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/JFB110/hwdef-bl.dat @@ -42,8 +42,7 @@ SERIAL_ORDER OTG1 UART7 UART5 USART3 STDOUT_SERIAL SD3 STDOUT_BAUDRATE 921600 -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # USB OTG1 SERIAL0 PA11 OTG_FS_DM OTG1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/JFB110/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/JFB110/hwdef.dat index 714b561d30..531d1327d2 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/JFB110/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/JFB110/hwdef.dat @@ -316,10 +316,10 @@ PE4 LED_GREEN OUTPUT OPENDRAIN GPIO(71) LOW SPEED_VERYLOW PE5 LED_BLUE OUTPUT OPENDRAIN GPIO(72) HIGH SPEED_VERYLOW # setup for "AP_BoardLED" RGB LEDs +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 define HAL_GPIO_A_LED_PIN 72 define HAL_GPIO_B_LED_PIN 70 #define HAL_GPIO_C_LED_PIN 71 -define HAL_GPIO_LED_ON 0 # PWM output for buzzer PF9 TIM14_CH1 TIM14 GPIO(73) ALARM SPEED_VERYLOW diff --git a/libraries/AP_HAL_ChibiOS/hwdef/JHEMCU-GSF405A/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/JHEMCU-GSF405A/hwdef.dat index 58fe5d1898..4461768bf0 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/JHEMCU-GSF405A/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/JHEMCU-GSF405A/hwdef.dat @@ -71,6 +71,7 @@ PA3 TIM5_CH4 TIM5 PWM(3) GPIO(52) BIDIR PA2 TIM5_CH3 TIM5 PWM(4) GPIO(53) # Board LEDs +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 PC14 LED1 OUTPUT LOW GPIO(1) PC15 LED2 OUTPUT LOW GPIO(2) define HAL_GPIO_A_LED_PIN 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/JHEMCU-H743HD/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/JHEMCU-H743HD/hwdef-bl.dat index e8a9001abc..66e51185c6 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/JHEMCU-H743HD/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/JHEMCU-H743HD/hwdef-bl.dat @@ -32,8 +32,7 @@ PA12 OTG_FS_DP OTG1 PA13 JTMS-SWDIO SWD PA14 JTCK-SWCLK SWD -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # Chip select pins diff --git a/libraries/AP_HAL_ChibiOS/hwdef/JHEMCU-H743HD/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/JHEMCU-H743HD/hwdef.dat index 37d5139cc7..5d7c65b528 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/JHEMCU-H743HD/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/JHEMCU-H743HD/hwdef.dat @@ -136,6 +136,7 @@ PC9 TIM8_CH4 TIM8 PWM(8) GPIO(57) # M8 # LEDs PA8 TIM1_CH1 TIM1 PWM(9) GPIO(58) # M9 +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 PE5 LED0 OUTPUT LOW GPIO(90) define HAL_GPIO_A_LED_PIN 90 @@ -144,7 +145,7 @@ define HAL_GPIO_B_LED_PIN 91 # Dataflash setup SPIDEV dataflash SPI3 DEVID1 FLASH1_CS MODE3 104*MHZ 104*MHZ -define HAL_LOGGING_DATAFLASH_DRIVER AP_Logger_W25N01GV +define HAL_LOGGING_DATAFLASH_DRIVER AP_Logger_W25NXX define HAL_LOGGING_DATAFLASH_ENABLED 1 # OSD setup diff --git a/libraries/AP_HAL_ChibiOS/hwdef/JHEM_JHEF405/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/JHEM_JHEF405/hwdef-bl.dat index dd81acb853..b579c42686 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/JHEM_JHEF405/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/JHEM_JHEF405/hwdef-bl.dat @@ -34,8 +34,7 @@ PA12 OTG_FS_DP OTG1 PA13 JTMS-SWDIO SWD PA14 JTCK-SWCLK SWD -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # Chip select pins diff --git a/libraries/AP_HAL_ChibiOS/hwdef/JHEM_JHEF405/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/JHEM_JHEF405/hwdef.dat index 24fcd7064f..e55d72117b 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/JHEM_JHEF405/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/JHEM_JHEF405/hwdef.dat @@ -108,8 +108,9 @@ PC8 TIM8_CH3 TIM8 PWM(8) GPIO(57) # M8 # LEDs PA9 TIM1_CH2 TIM1 PWM(9) GPIO(58) # LED +define AP_NOTIFY_GPIO_LED_1_ENABLED 1 PC14 LED0 OUTPUT LOW GPIO(90) -define HAL_GPIO_A_LED_PIN 90 +define AP_NOTIFY_GPIO_LED_1_PIN 90 # Dataflash setup SPIDEV dataflash SPI3 DEVID1 FLASH1_CS MODE3 104*MHZ 104*MHZ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/KakuteF4-Wing/README.md b/libraries/AP_HAL_ChibiOS/hwdef/KakuteF4-Wing/README.md new file mode 100644 index 0000000000..7fce398d54 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/KakuteF4-Wing/README.md @@ -0,0 +1,93 @@ +# KakuteF4-Wing Flight Controller + +The KakuteF4-Wing is a flight controller produced by [Holybro](http://www.holybro.com/). + +## Features + Processor + STM32F405 32-bit processor + AT7456E OSD + Sensors + ICM42688 Acc/Gyro + SLP06 barometer + Power + 2S - 8S Lipo input voltage with voltage monitoring + 9V/12V, 1.5A BEC for powering Video Transmitter + 6V/7.2V, ?A BEC for servos + 3.3V, 1A BEC + Interfaces + 7x PWM outputs DShot capable, 4 outputs BiDirDShot capable + 1x RC input + 5x UARTs/serial for GPS and other peripherals + 1x I2C ports for external compass, airspeed, etc. + USB-C port + +## Pinout + +![KakuteF4-Wing Bottom](kakutef4-esc.png) +![KakuteF4-Wing Top Underside](kakutef4-uart.png) +![KakuteF4-Wing Top](kakutef4-uart2.png) + +## UART Mapping + +The UARTs are marked Rn and Tn in the above pinouts. The Rn pin is the +receive pin for UARTn. The Tn pin is the transmit pin for UARTn. + + - SERIAL0 -> USB + - SERIAL1 -> UART1 (GPS) DMA-Enabled + - SERIAL2 -> UART2 (Telem1) DMA Enabled + - SERIAL3 -> UART3 (RX) DMA Enabled + - SERIAL5 -> UART5 (User) + - SERIAL6 -> USART6 (User) + +## RC Input + +RC input is configured on the R3 (UART3_RX) pin. It supports all serial RC +protocols. + +## OSD Support + +The KakuteF4-Wing supports OSD using OSD_TYPE 1 (MAX7456 driver). + +## PWM Output + +The KakuteF4 supports up to 7 PWM outputs. All outputs support DShot. Outputs 1-4 support BiDirDshot. + +The PWM is in 5 groups: + + - PWM 1-2 in group1 + - PWM 3-4 in group2 + - PWM 5-6 in group3 + - PWM 7 in group4 + +Channels within the same group need to use the same output rate. If +any channel in a group uses DShot then all channels in the group need +to use DShot. + +## Battery Monitoring + +The board has a builting voltage and current sensor. The current +sensor can read up to ?? Amps. The voltage sensor can handle up to 6S +LiPo batteries. + +The correct battery setting parameters are: + + - BATT_MONITOR 4 + - BATT_VOLT_PIN 10 + - BATT_CURR_PIN 11 + - BATT_VOLT_MULT 11 + - BATT_AMP_PERVLT 40 + +## Compass + +The KakuteF4-Wing does not have a built-in compass, but you can attach an external compass using I2C on the SDA and SCL pads. + +## Loading Firmware +Firmware for these boards can be found at https://firmware.ardupilot.org in sub-folders labeled “KakuteF4-Wing”. + +Initial firmware load can be done with DFU by plugging in USB with the +boot button pressed. Then you should load the "KakuteF4-Wing_bl.hex" +firmware, using your favourite DFU loading tool. + +Subsequently, you can update firmware with Mission Planner. + + diff --git a/libraries/AP_HAL_ChibiOS/hwdef/KakuteF4-Wing/defaults.parm b/libraries/AP_HAL_ChibiOS/hwdef/KakuteF4-Wing/defaults.parm new file mode 100644 index 0000000000..18c9c24de3 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/KakuteF4-Wing/defaults.parm @@ -0,0 +1,4 @@ +# setup for LEDs on chan5 +SERVO7_FUNCTION 120 + + diff --git a/libraries/AP_HAL_ChibiOS/hwdef/KakuteF4-Wing/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/KakuteF4-Wing/hwdef-bl.dat new file mode 100644 index 0000000000..0e2f595153 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/KakuteF4-Wing/hwdef-bl.dat @@ -0,0 +1,43 @@ + +# hw definition file for processing by chibios_hwdef.py +# for KAKUTEF4WING hardware. +# thanks to betaflight for pin information + +# MCU class and specific type +MCU STM32F4xx STM32F405xx + +# board ID for firmware load +APJ_BOARD_ID AP_HW_Holybro-KakuteF4-Wing + +# crystal frequency, setup to use external oscillator +OSCILLATOR_HZ 8000000 + +FLASH_SIZE_KB 1024 + +# bootloader starts at zero offset +FLASH_RESERVE_START_KB 0 + +# the location where the bootloader will put the firmware +FLASH_BOOTLOADER_LOAD_KB 48 + +# order of UARTs (and USB) +SERIAL_ORDER OTG1 + +# PA10 IO-debug-console +PA11 OTG_FS_DM OTG1 +PA12 OTG_FS_DP OTG1 + +PA13 JTMS-SWDIO SWD +PA14 JTCK-SWCLK SWD + +# default to all pins low to avoid ESD issues +DEFAULTGPIO OUTPUT LOW PULLDOWN + + +# Chip select pins +PC14 FLASH1_CS CS +PC15 OSD1_CS CS +PA4 GYRO1_CS CS + +PA1 LED_BOOTLOADER OUTPUT LOW +define HAL_LED_ON 0 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/KakuteF4-Wing/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/KakuteF4-Wing/hwdef.dat new file mode 100644 index 0000000000..9981b3dfe7 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/KakuteF4-Wing/hwdef.dat @@ -0,0 +1,156 @@ + +# hw definition file for processing by chibios_hwdef.py +# for KAKUTEF4WING hardware. +# thanks to betaflight for pin information + +# MCU class and specific type +MCU STM32F4xx STM32F405xx + +# board ID for firmware load +APJ_BOARD_ID AP_HW_Holybro-KakuteF4-Wing + +# crystal frequency, setup to use external oscillator +OSCILLATOR_HZ 8000000 + +FLASH_SIZE_KB 1024 + +# bootloader takes first sector +FLASH_RESERVE_START_KB 48 + +define HAL_STORAGE_SIZE 16384 +define STORAGE_FLASH_PAGE 1 + +define STM32_ST_USE_TIMER 9 +define CH_CFG_ST_RESOLUTION 16 + +# SPI devices + +# SPI1 +PA5 SPI1_SCK SPI1 +PA6 SPI1_MISO SPI1 +PA7 SPI1_MOSI SPI1 + +# SPI2 +PB13 SPI2_SCK SPI2 +PC2 SPI2_MISO SPI2 +PC3 SPI2_MOSI SPI2 + +# SPI3 +PB3 SPI3_SCK SPI3 +PB4 SPI3_MISO SPI3 +PB5 SPI3_MOSI SPI3 + +# Chip select pins +PC14 FLASH1_CS CS +PC15 OSD1_CS CS +PA4 GYRO1_CS CS + +# SERIAL ports +SERIAL_ORDER OTG1 USART1 USART2 USART3 EMPTY UART5 USART6 + +PA11 OTG_FS_DM OTG1 +PA12 OTG_FS_DP OTG1 + +# This is the pin that senses USB being connected. It is an input pin +# setup as OPENDRAIN. +PA10 VBUS INPUT OPENDRAIN + +# USART1 +PB7 USART1_RX USART1 +PB6 USART1_TX USART1 +define DEFAULT_SERIAL1_PROTOCOL SerialProtocol_GPS + +# USART2 +PA2 USART2_TX USART2 +PA3 USART2_RX USART2 NODMA +define DEFAULT_SERIAL2_PROTOCOL SerialProtocol_MAVLink2 + +# USART3 - RX +PC10 USART3_TX USART3 +PC11 USART3_RX USART3 +define DEFAULT_SERIAL3_PROTOCOL SerialProtocol_RCIN +# SBUS inversion control pin, active high +PC13 USART3_RXINV OUTPUT HIGH GPIO(78) POL(1) + +# UART5 +PC12 UART5_TX UART5 NODMA +PD2 UART5_RX UART5 NODMA + +# USART6 +PC6 USART6_TX USART6 NODMA +PC7 USART6_RX USART6 NODMA + +# I2C ports +I2C_ORDER I2C2 + +# I2C2 +PB10 I2C2_SCL I2C2 +PB11 I2C2_SDA I2C2 + +# Servos + +# ADC ports + +# ADC1 +PC0 BATT_VOLTAGE_SENS ADC1 SCALE(1) +define HAL_BATT_VOLT_PIN 10 +define HAL_BATT_VOLT_SCALE 11.0 +PC1 BATT_CURRENT_SENS ADC1 SCALE(1) +define HAL_BATT_CURR_PIN 11 +define HAL_BATT_CURR_SCALE 40 +define HAL_BATT_MONITOR_DEFAULT 4 + +# MOTORS +PA8 TIM1_CH1 TIM1 PWM(1) GPIO(50) # M1 +PA9 TIM1_CH2 TIM1 PWM(2) GPIO(51) BIDIR # M2 +PB0 TIM3_CH3 TIM3 PWM(3) GPIO(52) # M3 +PB1 TIM3_CH4 TIM3 PWM(4) GPIO(53) BIDIR # M4 +PC8 TIM8_CH3 TIM8 PWM(5) GPIO(54) # M5 +PC9 TIM8_CH4 TIM8 PWM(6) GPIO(55) # M6 + +# LEDs +PA1 TIM5_CH2 TIM5 PWM(7) GPIO(56) # M7 + +define AP_NOTIFY_GPIO_LED_1_ENABLED 1 +PC5 LED_BLUE OUTPUT LOW GPIO(90) +define AP_NOTIFY_GPIO_LED_1_PIN 90 + +# GPIOs +PB14 PINIO1 OUTPUT GPIO(81) LOW +PB15 PINIO2 OUTPUT GPIO(82) LOW + +# Dataflash setup +SPIDEV dataflash SPI3 DEVID1 FLASH1_CS MODE3 104*MHZ 104*MHZ + +define HAL_LOGGING_DATAFLASH_ENABLED 1 + +# OSD setup +SPIDEV osd SPI2 DEVID1 OSD1_CS MODE0 10*MHZ 10*MHZ + +define OSD_ENABLED 1 +define HAL_OSD_TYPE_DEFAULT 1 +ROMFS_WILDCARD libraries/AP_OSD/fonts/font*.bin + +# IMU setup +SPIDEV imu1 SPI1 DEVID1 GYRO1_CS MODE3 1*MHZ 8*MHZ +# one IMU +IMU Invensensev3 SPI:imu1 ROTATION_PITCH_180_YAW_90 + +DMA_PRIORITY I2C2* SPI3* + +# Baro setup +BARO SPL06 I2C:0:0x76 +define AP_BARO_BACKEND_DEFAULT_ENABLED 0 +define AP_BARO_SPL06_ENABLED 1 + +# no built-in compass, but probe the i2c bus for all possible +# external compass types +define ALLOW_ARM_NO_COMPASS +define HAL_PROBE_EXTERNAL_I2C_COMPASSES +define HAL_I2C_INTERNAL_MASK 0 +define HAL_COMPASS_AUTO_ROT_DEFAULT 2 +define HAL_DEFAULT_INS_FAST_SAMPLE 1 +define HAL_FRAME_TYPE_DEFAULT 12 + +# minimal drivers to reduce flash usage +include ../include/minimize_fpv_osd.inc diff --git a/libraries/AP_HAL_ChibiOS/hwdef/KakuteF4-Wing/kakutef4-esc.png b/libraries/AP_HAL_ChibiOS/hwdef/KakuteF4-Wing/kakutef4-esc.png new file mode 100644 index 0000000000..b165f1ce0d Binary files /dev/null and b/libraries/AP_HAL_ChibiOS/hwdef/KakuteF4-Wing/kakutef4-esc.png differ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/KakuteF4-Wing/kakutef4-uart.png b/libraries/AP_HAL_ChibiOS/hwdef/KakuteF4-Wing/kakutef4-uart.png new file mode 100644 index 0000000000..4f0c4ae217 Binary files /dev/null and b/libraries/AP_HAL_ChibiOS/hwdef/KakuteF4-Wing/kakutef4-uart.png differ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/KakuteF4-Wing/kakutef4-uart2.png b/libraries/AP_HAL_ChibiOS/hwdef/KakuteF4-Wing/kakutef4-uart2.png new file mode 100644 index 0000000000..30a823e642 Binary files /dev/null and b/libraries/AP_HAL_ChibiOS/hwdef/KakuteF4-Wing/kakutef4-uart2.png differ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/KakuteH7-Wing/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/KakuteH7-Wing/hwdef.dat index 9123963e56..cd98727eb9 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/KakuteH7-Wing/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/KakuteH7-Wing/hwdef.dat @@ -85,6 +85,7 @@ define BOARD_RSSI_ANA_PIN 10 # LED # green LED1 marked as B/E # blue LED0 marked as ACT +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 PC15 LED0 OUTPUT LOW GPIO(90) # blue PC14 LED1 OUTPUT LOW GPIO(91) # red define HAL_GPIO_A_LED_PIN 91 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/KakuteH7/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/KakuteH7/hwdef-bl.dat index a39b007629..b70f466f51 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/KakuteH7/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/KakuteH7/hwdef-bl.dat @@ -35,8 +35,7 @@ PC13 BUZZER OUTPUT LOW PULLDOWN PC2 LED_BOOTLOADER OUTPUT LOW define HAL_LED_ON 1 -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # Add CS pins to ensure they are high in bootloader PE4 IMU_CS CS diff --git a/libraries/AP_HAL_ChibiOS/hwdef/KakuteH7Mini/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/KakuteH7Mini/hwdef-bl.dat index c66e93ba9d..d618ce194c 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/KakuteH7Mini/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/KakuteH7Mini/hwdef-bl.dat @@ -35,8 +35,7 @@ PC13 BUZZER OUTPUT LOW PULLDOWN PC2 LED_BOOTLOADER OUTPUT LOW define HAL_LED_ON 1 -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # Add CS pins to ensure they are high in bootloader PE4 IMU_CS CS diff --git a/libraries/AP_HAL_ChibiOS/hwdef/LongBowF405WING/LongBowF405WING.jpg b/libraries/AP_HAL_ChibiOS/hwdef/LongBowF405WING/LongBowF405WING.jpg new file mode 100644 index 0000000000..5b56f187bd Binary files /dev/null and b/libraries/AP_HAL_ChibiOS/hwdef/LongBowF405WING/LongBowF405WING.jpg differ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/LongBowF405WING/LongBowF405WING_pinout.png b/libraries/AP_HAL_ChibiOS/hwdef/LongBowF405WING/LongBowF405WING_pinout.png new file mode 100644 index 0000000000..9fe0ac0ff6 Binary files /dev/null and b/libraries/AP_HAL_ChibiOS/hwdef/LongBowF405WING/LongBowF405WING_pinout.png differ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/LongBowF405WING/PMU.png b/libraries/AP_HAL_ChibiOS/hwdef/LongBowF405WING/PMU.png new file mode 100644 index 0000000000..3846e951a3 Binary files /dev/null and b/libraries/AP_HAL_ChibiOS/hwdef/LongBowF405WING/PMU.png differ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/LongBowF405WING/Readme.md b/libraries/AP_HAL_ChibiOS/hwdef/LongBowF405WING/Readme.md new file mode 100644 index 0000000000..9e2273518f --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/LongBowF405WING/Readme.md @@ -0,0 +1,117 @@ +# LongBowF405WING Flight Controller + +The LongBowF405WING is a flight controller produced by [lefei rc](http://www.lefeirc.com/). + +## Features + Processor + STM32F405 168Mhz, 1MB 32-bit processor + AT7456E OSD + Sensors + ICM42688P Acc/Gyro + SPL006 barometer + Power + 2S - 6S Lipo input voltage with voltage monitoring + 120A Cont., 215A peak current monitor + 9V/12/5V, 1.8A BEC for powering Video Transmitter controlled by GPIO + 4.9V/6V/7.2V, 6A BEC for servos + 5V, 2.4A BEC for internal and peripherals + Interfaces + 12x PWM outputs DShot capable (Serail LED output is PWM12) + 1x RC input + 5x UARTs/serial for GPS and other peripherals, 6th UART internally tied to Wireless board) + I2C port for external compass, airspeed, etc. + microSDCard for logging, etc. + USB-C port + +## Pinout +![LongBowF405WING](LongBowF405WING_pinout.png) + +## Wiring Diagram +![LongBowF405WING](LongBowF405WING.jpg) + +## PDB +![LongBowF405WING](PMU.png) + +## UART Mapping + +The UARTs are marked Rn and Tn in the above pinouts. The Rn pin is the +receive pin for UARTn. The Tn pin is the transmit pin for UARTn. + + - SERIAL0 -> USB + - SERIAL1 -> USART1 (User) (DMA capable) + - SERIAL2 -> USART2 (RX tied to inverted SBUS RC input, but can be used as normal UART if :ref:`BRD_ALT_CONFIG<>` =1) + - SERIAL3 -> UART3 (GPS) (TX DMA capable) + - SERIAL4 -> UART4 (User) (TX DMA capable) + - SERIAL5 -> UART5 (DisplayPort, available on DJI air unit connector) (TX DMA capable) + - SERIAL6 -> UART6 (tied to internal wireless module, MAVLink2 telem) + + +## RC Input + +RC input is configured on the SBUS pin (inverted and sent to UART2_RX). It supports all RC +protocols except serial protocols such as CRSF, ELRS, etc. Those devices can be connected to USART1 TX and RX, instead. +Fport can be connected to USART1 TX also, but will require an external bi-directional inverter and the ref:`SERIAL1_OPTION' = 4 (HalfDuplex) set. + +## OSD Support + +The LongBowF405WING supports using its internal OSD using OSD_TYPE 1 (MAX7456 driver). External OSD support such DisplayPor is setup by default using UART5. Simultaneous use of the internal OSD and Displayport is allowed. See :ref:`common-msp-osd-overview-4.2` for more info. + + +## PWM Output + +The LongBowF405WING supports up to 12 PWM outputs . +All outputs support DShot. + +The PWM is in 5 groups: + + - PWM 1,2 in group1 + - PWM 3,4 in group2 + - PWM 5-6 in group3 + - PWM 7-9 in group4 + - PWM 10-12 in group5 + +Channels within the same group need to use the same output rate. If +any channel in a group uses DShot then all channels in that group would need +to use DShot. + +## Battery Monitoring + +The board has a builting voltage and current sensor. The current +sensor can read up to 120A continuosly, 160 Amps peak. The voltage sensor can handle up to 6S +LiPo batteries. + +The correct battery setting parameters are set by default and are: + + - BATT_MONITOR 4 + - BATT_VOLT_PIN 10 + - BATT_CURR_PIN 11 + - BATT_VOLT_MULT 11.0 + - BATT_AMP_PERVLT 50 + +## Compass + +The LongBowF405WING does not have a built-in compass, but you can attach an external compass using I2C on the SDA and SCL pads. + +## VTX power control + +GPIO 81 controls the VTX BEC output to pins marked "9V" and "Vs1". Setting a RELAY function to this pin and turning it "ON" will remove the supply from these pins. + +## Camera Switch + +GPIO 82 controls which camera input (CC1 or C2 is applied to the internal OSD. A RELAY function can be enabled to control the switching. + +## Buzzer + +An active buzzer output is provided and is controlled as GPIO 80 + +## Loading Firmware + +Firmware for these boards can be found at https://firmware.ardupilot.org in sub-folders labeled LongBowF405WING. + +Initial firmware load can be done with DFU by plugging in USB with the +boot button pressed. Then you should load the "LongBowF405WING_bl.hex" +firmware, using your favourite DFU loading tool. + +Subsequently, you can update firmware with Mission Planner. + + diff --git a/libraries/AP_HAL_ChibiOS/hwdef/LongBowF405WING/defaults.parm b/libraries/AP_HAL_ChibiOS/hwdef/LongBowF405WING/defaults.parm new file mode 100644 index 0000000000..3fb16d3236 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/LongBowF405WING/defaults.parm @@ -0,0 +1,10 @@ +#Serial Port defaults +SERIAL4_PROTOCOL -1 +SERIAL1_PROTOCOL 23 +SERIAL2_PROTOCOL -1 +SERIAL5_PROTOCOL 42 +SERIAL6_PROTOCOL 2 + +#Enable second OSD Type as DisplayPort +OSD_TYPE2 5 + diff --git a/libraries/AP_HAL_ChibiOS/hwdef/LongBowF405WING/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/LongBowF405WING/hwdef-bl.dat new file mode 100644 index 0000000000..efc1004b28 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/LongBowF405WING/hwdef-bl.dat @@ -0,0 +1,38 @@ +# hw definition file for processing by chibios_pins.py +# for LongBowF4 bootloader + +# MCU class and specific type +MCU STM32F4xx STM32F405xx + +# board ID for firmware load +APJ_BOARD_ID AP_HW_LongbowF405 + + +# crystal frequency +OSCILLATOR_HZ 8000000 + +FLASH_SIZE_KB 1024 + +# bootloader is installed at zero offset +FLASH_RESERVE_START_KB 0 + +# the location where the bootloader will put the firmware +FLASH_BOOTLOADER_LOAD_KB 64 + +# LEDs +PA14 LED_BOOTLOADER OUTPUT LOW GPIO(0) +PA13 LED_ACTIVITY OUTPUT LOW GPIO(1) +define HAL_LED_ON 0 + +# order of UARTs +SERIAL_ORDER OTG1 + +PA11 OTG_FS_DM OTG1 +PA12 OTG_FS_DP OTG1 + +DEFAULTGPIO OUTPUT LOW PULLDOWN + +# Add CS pins to ensure they are high in bootloader +PA4 MPU_CS CS +PB12 OSD_CS CS +PC14 SDCARD_CS CS diff --git a/libraries/AP_HAL_ChibiOS/hwdef/LongBowF405WING/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/LongBowF405WING/hwdef.dat new file mode 100644 index 0000000000..e0797d7a34 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/LongBowF405WING/hwdef.dat @@ -0,0 +1,194 @@ +# hw definition file for LongBow F4 WING hardware +# tested on the LongBow F405 WING board +# + +# MCU class and specific type +MCU STM32F4xx STM32F405xx + +# board ID for firmware load +APJ_BOARD_ID AP_HW_LongbowF405 + +# crystal frequency +OSCILLATOR_HZ 8000000 + +define STM32_ST_USE_TIMER 5 +define CH_CFG_ST_RESOLUTION 32 + +# reserve 16k for bootloader, 16k for OSD and 32k for flash storage +FLASH_RESERVE_START_KB 64 +FLASH_SIZE_KB 1024 + +define HAL_STORAGE_SIZE 15360 +STORAGE_FLASH_PAGE 1 + +# only one I2C bus +I2C_ORDER I2C1 + +# order of UARTs (and USB) +SERIAL_ORDER OTG1 USART1 USART2 USART3 UART4 UART5 USART6 + +# LEDs +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 + +PA13 LED_GREEN OUTPUT LOW GPIO(0) +PA14 LED_BLUE OUTPUT LOW GPIO(1) + +define HAL_GPIO_A_LED_PIN 0 +define HAL_GPIO_B_LED_PIN 1 + +# buzzer +PC15 BUZZER OUTPUT GPIO(80) LOW +define HAL_BUZZER_PIN 80 + + + +# spi1 bus for IMU +PA5 SPI1_SCK SPI1 +PA6 SPI1_MISO SPI1 +PA7 SPI1_MOSI SPI1 +PA4 MPU_CS CS + +# spi2 for OSD +PB13 SPI2_SCK SPI2 +PC2 SPI2_MISO SPI2 +PC3 SPI2_MOSI SPI2 +PB12 OSD_CS CS + +# spi3 for sdcard +PB3 SPI3_SCK SPI3 +PB4 SPI3_MISO SPI3 +PB5 SPI3_MOSI SPI3 +PC14 SDCARD_CS CS + +# only one I2C bus in normal config +PB8 I2C1_SCL I2C1 +PB9 I2C1_SDA I2C1 + +# analog pins +PC0 BATT_VOLTAGE_SENS ADC1 SCALE(1) +PC1 BATT_CURRENT_SENS ADC1 SCALE(1) +PC4 RSSI_ADC_PIN ADC1 SCALE(1) + +PC5 PRESSURE_SENS ADC1 SCALE(1) +define HAL_DEFAULT_AIRSPEED_PIN 15 + +# define default battery setup +define HAL_BATT_MONITOR_DEFAULT 4 +define HAL_BATT_VOLT_PIN 10 +define HAL_BATT_CURR_PIN 11 +define HAL_BATT_VOLT_SCALE 11.0 # matched to PDB board +define HAL_BATT_CURR_SCALE 50 # matched to PDB board + +# analog rssi pin +define BOARD_RSSI_ANA_PIN 14 + +# USART1 (ELRS) +PA9 USART1_TX USART1 +PA10 USART1_RX USART1 + + +# USART2 (RCIN with inverter) + +PA3 TIM9_CH2 TIM9 RCININT PULLDOWN LOW + +# alternative with PA3 as USART2_RX +PA2 USART2_TX USART2 NODMA +PA3 USART2_RX USART2 NODMA ALT(1) + +# USART3 (GPS) +PC10 USART3_TX USART3 +PC11 USART3_RX USART3 NODMA +define DEFAULT_SERIAL3_BAUD 115 + +# UART4 serial4 +PA0 UART4_TX UART4 +PA1 UART4_RX UART4 NODMA + +# USART5 (DJI / VTX) +PC12 UART5_TX UART5 +PD2 UART5_RX UART5 NODMA + +# UART6 (onboard Telemetry) +PC6 USART6_TX USART6 +PC7 USART6_RX USART6 +define DEFAULT_SERIAL6_BAUD 115 + +# USB +PA11 OTG_FS_DM OTG1 +PA12 OTG_FS_DP OTG1 + +# PWM out pins. Note that channel order follows the ArduPilot motor +# order conventions +PC9 TIM8_CH4 TIM8 PWM(1) GPIO(50) +PC8 TIM8_CH3 TIM8 PWM(2) GPIO(51) +PB1 TIM3_CH4 TIM3 PWM(3) GPIO(52) +PB0 TIM3_CH3 TIM3 PWM(4) GPIO(53) +PB6 TIM4_CH1 TIM4 PWM(5) GPIO(54) +PB7 TIM4_CH2 TIM4 PWM(6) GPIO(55) +PA8 TIM1_CH1 TIM1 PWM(7) GPIO(56) +PB15 TIM1_CH3N TIM1 PWM(8) GPIO(57) +PB14 TIM1_CH2N TIM1 PWM(9) GPIO(58) +PA15 TIM2_CH1 TIM2 PWM(10) GPIO(59) +PB11 TIM2_CH4 TIM2 PWM(11) GPIO(60) +PB10 TIM2_CH3 TIM2 PWM(12) GPIO(61) + + +# one IMU +IMU Invensensev3 SPI:icm42688 ROTATION_ROLL_180_YAW_270 +define HAL_DEFAULT_INS_FAST_SAMPLE 1 + +# one baro +BARO SPL06 I2C:0:0x77 +define AP_BARO_BACKEND_DEFAULT_ENABLED 0 +define AP_BARO_SPL06_ENABLED 1 + +# no built-in compass, but probe the i2c bus for all possible +# external compass types +define ALLOW_ARM_NO_COMPASS +define HAL_PROBE_EXTERNAL_I2C_COMPASSES +define HAL_I2C_INTERNAL_MASK 0 +define HAL_COMPASS_AUTO_ROT_DEFAULT 2 + +# ICM42688P on SPI1 +SPIDEV icm42688 SPI1 DEVID1 MPU_CS MODE3 2*MHZ 8*MHZ + +# OSD on SPI2 +SPIDEV osd SPI2 DEVID2 OSD_CS MODE0 10*MHZ 10*MHZ + +# SD Card on SPI3 +SPIDEV sdcard SPI3 DEVID3 SDCARD_CS MODE0 400*KHZ 25*MHZ + +# filesystem setup on sdcard +define HAL_OS_FATFS_IO 1 + +# setup for OSD +define OSD_ENABLED 1 +define HAL_OSD_TYPE_DEFAULT 1 +ROMFS_WILDCARD libraries/AP_OSD/fonts/font0.bin + +#VTX power control +PC13 PINIO1 OUTPUT GPIO(81) LOW + +#CAM SW +PB2 PINIO2 OUTPUT GPIO(82) LOW + +define STM32_PWM_USE_ADVANCED TRUE + +define HAL_WITH_DSP FALSE + +include ../include/minimize_fpv_osd.inc + +#undef AP_CAMERA_MOUNT_ENABLED +#undef AP_LANDINGGEAR_ENABLED +#undef HAL_MOUNT_ENABLED +#undef HAL_MOUNT_SERVO_ENABLED +#undef QAUTOTUNE_ENABLED + +#define AP_CAMERA_MOUNT_ENABLED 1 +#define AP_LANDINGGEAR_ENABLED 1 +#define HAL_MOUNT_ENABLED 1 +#define HAL_MOUNT_SERVO_ENABLED 1 +#define QAUTOTUNE_ENABLED 1 + +#define DEFAULT_NTF_LED_TYPES 257 + diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MFT-SEMA100/MFT-SEMA100_BottomView.jpeg b/libraries/AP_HAL_ChibiOS/hwdef/MFT-SEMA100/MFT-SEMA100_BottomView.jpeg new file mode 100644 index 0000000000..d29fe9d108 Binary files /dev/null and b/libraries/AP_HAL_ChibiOS/hwdef/MFT-SEMA100/MFT-SEMA100_BottomView.jpeg differ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MFT-SEMA100/MFT-SEMA100_TopView.jpeg b/libraries/AP_HAL_ChibiOS/hwdef/MFT-SEMA100/MFT-SEMA100_TopView.jpeg new file mode 100644 index 0000000000..7f53e471f7 Binary files /dev/null and b/libraries/AP_HAL_ChibiOS/hwdef/MFT-SEMA100/MFT-SEMA100_TopView.jpeg differ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MFT-SEMA100/README.md b/libraries/AP_HAL_ChibiOS/hwdef/MFT-SEMA100/README.md new file mode 100644 index 0000000000..0c8b397380 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/MFT-SEMA100/README.md @@ -0,0 +1,111 @@ +# MFT-SEMA100 Flight Controller + +The MFT-SEMA100 is a flight controller designed and produced by MFT Savunma ve Havacılık LTD. ŞTİ. + +## Features + + - STM32H743 microcontroller + - BMI088 IMU + - BMP390 barometer + - LIB3MDL magnetometer + - MicroSD Card Slot + - 5 UARTs + - 12 PWM outputs + - 2 CANs + - 2 I2Cs + +## Physical + +![MFT-SEMA100_Top_View](MFT-SEMA100_TopView.jpeg) + +![MFT-SEMA100_Bottom_View](MFT-SEMA100_BottomView.jpeg) + +## UART Mapping + + - SERIAL0 -> USB + - SERIAL1 -> UART1 (MAVLink2, DMA-enabled) + - SERIAL2 -> UART2 (MAVLink2, DMA-enabled) + - SERIAL3 -> UART3 (GPS, DMA-enabled) + - SERIAL4 -> UART5 (GPS2, DMA-enabled) + - SERIAL5 -> UART7 (DMA-enabled) + - SERIAL6 -> UART8 (RX only) + +## Connectors + +All pins are 2.54 mm Pin Headers + +## Power Connector + +XT30-PW 5V Input for powering the board + +## RC Input + +The default RC input is configured on the UART8 RCIN pin. + + +## PWM Output + +The MFT-SEMA100 supports up to 12 PWM outputs. + +PWM outputs are grouped and every group must use the same output protocol: + +1, 2 are Group 1; + +3, 4 are Group 2; + +5, 6, 7, 8 are Group 3; + +9, 10 are Group 4; + +11, 12 are Group 5; + +Channels within the same group need to use the same output rate. + +## GPIOs +The numbering of the GPIOs for PIN variables in ArduPilot is: + +PWM1 50 +PWM2 51 +PWM3 52 +PWM4 53 +PWM5 54 +PWM6 55 +PWM7 56 +PWM8 57 + +PWM9 58 +PWM10 59 +PWM11 60 +PWM12 61 + + +## Battery Monitoring + +The board has a internal voltage sensor and connections on the ESC connector for an external current sensor input. +The voltage sensor can handle up to 6S LiPo batteries. + +The default battery parameters are: + + - BATT_MONITOR 4 + - BATT_VOLT_PIN 19 + - BATT_CURR_PIN 8 + - BATT_VOLT_MULT 10 + - BATT_CURR_SCALE 10 + +## Compass + +The MFT-SEMA100 has a built-in compass sensor (LIB3MDL), and you can also attach an external compass using I2C on the SDA and SCL connector. + +## IMU Heater + +The IMU heater in the MFT-SEMA100 can be controlled with the BRD_HEAT_TARG parameter, which is in degrees C. + +## Mechanical + + - Mounting: 55 x 56 mm, Φ4 mm + - Dimensions: 64 x 65 x 10 mm + - Weight: 15g + +## Loading Firmware + +The board comes pre-installed with an ArduPilot compatible bootloader, allowing the loading of *.apj firmware files with any ArduPilot compatible ground station. diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MFT-SEMA100/defaults.parm b/libraries/AP_HAL_ChibiOS/hwdef/MFT-SEMA100/defaults.parm new file mode 100644 index 0000000000..8fbf2c05bc --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/MFT-SEMA100/defaults.parm @@ -0,0 +1,4 @@ +# setup the temperature compensation +BRD_HEAT_TARG 45 +BRD_HEAT_P 50 +BRD_HEAT_I 0.07 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MFT-SEMA100/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/MFT-SEMA100/hwdef-bl.dat new file mode 100644 index 0000000000..3d0ffb248a --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/MFT-SEMA100/hwdef-bl.dat @@ -0,0 +1,51 @@ +# hw definition file for processing by chibios_hwdef.py +# for MFT-SEMA100 board + +# MCU class and specific type +MCU STM32H7xx STM32H743xx + +# crystal frequency +OSCILLATOR_HZ 16000000 + +# board ID for firmware load +APJ_BOARD_ID 2000 + +FLASH_SIZE_KB 2048 + +# bootloader is installed at zero offset +FLASH_RESERVE_START_KB 0 + +# the location where the bootloader will put the firmware +# the H743 has 128k sectors +FLASH_BOOTLOADER_LOAD_KB 128 + +# ChibiOS system timer +STM32_ST_USE_TIMER 2 + + + +PC13 LED_BOOTLOADER OUTPUT HIGH GPIO(0) +PC6 LED_ACTIVITY OUTPUT HIGH GPIO(1) # optional + + +define HAL_LED_ON 1 + + +# order of UARTs (and USB) +SERIAL_ORDER OTG1 + +PA11 OTG_FS_DM OTG1 +PA12 OTG_FS_DP OTG1 + +PA13 JTMS-SWDIO SWD +PA14 JTCK-SWCLK SWD + +PB3 SPI1_SCK SPI1 +PB4 SPI1_MISO SPI1 +PD7 SPI1_MOSI SPI1 +PC4 SDCARD_DETECT INPUT + +# Add CS pins to ensure they are high in bootloader +PE3 BMI088_A_CS CS +PE4 BMI088_G_CS CS +PA15 SDCARD_CS CS diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MFT-SEMA100/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/MFT-SEMA100/hwdef.dat new file mode 100644 index 0000000000..01406f2bf2 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/MFT-SEMA100/hwdef.dat @@ -0,0 +1,217 @@ +# hw definition file for processing by chibios_hwdef.py for MFT-SEMA100 + +# MCU class and specific type +MCU STM32H7xx STM32H743xx + +# crystal frequency +OSCILLATOR_HZ 16000000 + +# board ID for firmware load +APJ_BOARD_ID 2000 + +FLASH_SIZE_KB 2048 + +# with 2M flash we can afford to optimize for speed +env OPTIMIZE -O2 + +# ChibiOS system timer +STM32_ST_USE_TIMER 2 + +USB__STRING_MANUFACTURER "MFT" +USB_STRING_PRODUCT "MFT-SEMA100" + +# bootloader takes first sector +FLASH_RESERVE_START_KB 128 + +# order of UARTs (and USB) +SERIAL_ORDER OTG1 USART1 USART2 USART3 UART5 UART7 UART8 OTG2 + +# now we define the pins that USB is connected on +PA11 OTG_FS_DM OTG1 +PA12 OTG_FS_DP OTG1 + +# Port switching for USB HS and FS,high = USB_FS , LOW = USB_HS +PH15 USB_HS_ENABLE OUTPUT HIGH +define USB_HW_ENABLE_HS 0 + +# these are the pins for SWD debugging with a STlinkv2 or black-magic probe +PA13 JTMS-SWDIO SWD +PA14 JTCK-SWCLK SWD + +# SPI1 - SD CARD +PB3 SPI1_SCK SPI1 +PB4 SPI1_MISO SPI1 +PD7 SPI1_MOSI SPI1 +PA15 SDCARD_CS CS +PC4 SDCARD_DETECT INPUT + +# SPI2 - External +PD3 SPI2_SCK SPI2 +PC2 SPI2_MISO SPI2 +PC3 SPI2_MOSI SPI2 + + +# SPI4 - GYRO +PE2 SPI4_SCK SPI4 +PE5 SPI4_MISO SPI4 +PE6 SPI4_MOSI SPI4 + +# sensor +PE3 BMI088_A_CS CS +PE4 BMI088_G_CS CS + + +# I2C buses + + +#I2C1 is External +PB8 I2C1_SCL I2C1 +PB7 I2C1_SDA I2C1 + +# I2C2 for onboard mag +PB10 I2C2_SCL I2C2 +PB11 I2C2_SDA I2C2 + +# I2C3 for onboard BAROMETER +PA8 I2C3_SCL I2C3 +PC9 I2C3_SDA I2C3 + +# I2C4 is External +PD12 I2C4_SCL I2C4 +PD13 I2C4_SDA I2C4 + +# order of I2C buses +I2C_ORDER I2C2 I2C3 I2C4 I2C1 + + +define HAL_I2C_INTERNAL_MASK 1 + +# drdy pins +PE11 DRDY1_LIS3MDL INPUT + + +# UARTs +#USART1 TX RX 1 +PA10 USART1_RX USART1 +PA9 USART1_TX USART1 + +# USART2 is TX RX 2 +PD6 USART2_RX USART2 +PD5 USART2_TX USART2 + +# USART3 is TX RX 3 +PD9 USART3_RX USART3 NODMA +PD8 USART3_TX USART3 NODMA + +# UART5 is TX RX 4 +PD2 UART5_RX UART5 NODMA +PC12 UART5_TX UART5 NODMA + +# UART7 is TX RX 5 +PE7 UART7_RX UART7 +PE8 UART7_TX UART7 +PE10 UART7_CTS UART7 +PE9 UART7_RTS UART7 + + +# SBUS, DSM port +PE0 UART8_RX UART8 +define DEFAULT_SERIAL6_PROTOCOL SerialProtocol_RCIN + + + +# PWM AUX channels +PB0 TIM1_CH2N TIM1 PWM(1) GPIO(50) +PB1 TIM1_CH3N TIM1 PWM(2) GPIO(51) +PC7 TIM8_CH2 TIM8 PWM(3) GPIO(52) +PC8 TIM8_CH3 TIM8 PWM(4) GPIO(53) +PA0 TIM5_CH1 TIM5 PWM(5) GPIO(54) +PA1 TIM5_CH2 TIM5 PWM(6) GPIO(55) +PA2 TIM5_CH3 TIM5 PWM(7) GPIO(56) +PA3 TIM5_CH4 TIM5 PWM(8) GPIO(57) + +PD14 TIM4_CH3 TIM4 PWM(9) GPIO(58) +PD15 TIM4_CH4 TIM4 PWM(10) GPIO(59) +PA6 TIM3_CH1 TIM3 PWM(11) GPIO(60) +PA7 TIM3_CH2 TIM3 PWM(12) GPIO(61) + + +# allow for 14 PWMs by default + +# PWM output for buzzer +PB15 TIM12_CH2 TIM12 GPIO(77) ALARM + + +# analog in +PA5 BATT_VOLTAGE_SENS ADC1 SCALE(1) +PC5 BATT_CURRENT_SENS ADC1 SCALE(1) + + +define HAL_BATT_MONITOR_DEFAULT 4 +define HAL_BATT_VOLT_PIN 19 +define HAL_BATT_VOLT_SCALE 10 + +#define HAL_BATT2_VOLT_PIN 15 +#define HAL_BATT2_VOLT_SCALE 9 + +define HAL_BATT_CURR_PIN 8 +define HAL_BATT_CURR_SCALE 10 + + + +# CAN bus +PD0 CAN1_RX CAN1 +PD1 CAN1_TX CAN1 + +# 2nd CAN bus +PB5 CAN2_RX CAN2 +PB6 CAN2_TX CAN2 + +# control for silent (no output) for CAN +PD4 GPIO_CAN1_SILENT OUTPUT PUSHPULL SPEED_LOW LOW GPIO(70) +PD11 GPIO_CAN2_SILENT OUTPUT PUSHPULL SPEED_LOW LOW GPIO(71) + +# GPIOs + +PD10 HEATER_EN OUTPUT LOW GPIO(80) +define HAL_HEATER_GPIO_PIN 80 +define HAL_HAVE_IMU_HEATER 1 + + +#BARO +BARO BMP388 I2C:1:0x77 + +# SPI devices +SPIDEV bmi088_a SPI4 DEVID1 BMI088_A_CS MODE3 10*MHZ 10*MHZ +SPIDEV bmi088_g SPI4 DEVID2 BMI088_G_CS MODE3 10*MHZ 10*MHZ +SPIDEV sdcard SPI1 DEVID1 SDCARD_CS MODE0 400*KHZ 25*MHZ + + +# IMU +IMU BMI088 SPI:bmi088_a SPI:bmi088_g ROTATION_PITCH_180_YAW_270 + +define HAL_DEFAULT_INS_FAST_SAMPLE 7 + +# compasses +define HAL_PROBE_EXTERNAL_I2C_COMPASSES +COMPASS LIS3MDL I2C:ALL_INTERNAL:0x1C false ROTATION_NONE + + +#LEDs +PC13 LED_BOOTLOADER OUTPUT HIGH GPIO(0) +PC6 LED_ACTIVITY OUTPUT LOW GPIO(1) # optional + +define HAL_GPIO_A_LED_PIN 0 +define HAL_GPIO_B_LED_PIN 1 + +#STORAGE +STORAGE_FLASH_PAGE 14 +define HAL_STORAGE_SIZE 32768 + +# enable FAT filesystem support (needs a microSD defined via SDMMC) +define HAL_OS_FATFS_IO 1 + +DMA_PRIORITY ADC* SPI4* TIM*UP* +DMA_NOSHARE SPI4* TIM*UP* + +define DEFAULT_NTF_LED_TYPES 743 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MambaF405US-I2C/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/MambaF405US-I2C/hwdef.dat index 20b64689a4..d4a9e9c208 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MambaF405US-I2C/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/MambaF405US-I2C/hwdef.dat @@ -72,6 +72,7 @@ PC9 TIM3_CH4 TIM3 PWM(3) GPIO(52) PC8 TIM3_CH3 TIM3 PWM(4) GPIO(53) # Board LEDs +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 PC15 LED1 OUTPUT LOW GPIO(1) PC14 LED2 OUTPUT LOW GPIO(2) define HAL_GPIO_A_LED_PIN 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MambaF405v2/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/MambaF405v2/hwdef.dat index 41ef077b8a..23225a9795 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MambaF405v2/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/MambaF405v2/hwdef.dat @@ -77,6 +77,7 @@ PB1 TIM3_CH4 TIM3 PWM(3) GPIO(52) BIDIR PA2 TIM2_CH3 TIM2 PWM(4) GPIO(53) # Board LEDs +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 PB5 LED_BLUE OUTPUT LOW GPIO(1) PB4 LED_GREEN OUTPUT LOW GPIO(2) define HAL_GPIO_A_LED_PIN 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MambaH743v4/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/MambaH743v4/hwdef-bl.dat index 201ffc4df0..8c1217136f 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MambaH743v4/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/MambaH743v4/hwdef-bl.dat @@ -33,8 +33,7 @@ PE3 BUZZER OUTPUT LOW PULLDOWN PE5 LED_BOOTLOADER OUTPUT LOW define HAL_LED_ON 1 -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + PC5 VTX_PWR OUTPUT HIGH diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MambaH743v4/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/MambaH743v4/hwdef.dat index 193e3ca2da..661909c0d7 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MambaH743v4/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/MambaH743v4/hwdef.dat @@ -92,6 +92,7 @@ define HAL_BATT_CURR_SCALE 64 PC2 RSSI_ADC ADC1 define BOARD_RSSI_ANA_PIN 12 +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 PE5 LED0 OUTPUT LOW GPIO(90) # blue PE4 LED1 OUTPUT LOW GPIO(91) # orange define HAL_GPIO_A_LED_PIN 91 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MatekF405-CAN/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/MatekF405-CAN/hwdef.dat index 84f6ebb815..661d3ab0c5 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MatekF405-CAN/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/MatekF405-CAN/hwdef.dat @@ -22,6 +22,7 @@ OSCILLATOR_HZ 8000000 # --------------------- LED ----------------------- +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 PA14 LED0 OUTPUT LOW GPIO(90) # blue marked as ACT PA13 LED1 OUTPUT LOW GPIO(91) # green marked as B/E define HAL_GPIO_A_LED_PIN 91 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MatekF405-TE/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/MatekF405-TE/hwdef.dat index c9033143bd..002fad46fd 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MatekF405-TE/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/MatekF405-TE/hwdef.dat @@ -22,6 +22,7 @@ OSCILLATOR_HZ 8000000 # --------------------- LED ----------------------- +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 PA14 LED0 OUTPUT LOW GPIO(90) # blue marked as ACT PA13 LED1 OUTPUT LOW GPIO(91) # green marked as B/E define HAL_GPIO_A_LED_PIN 91 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MatekF405-Wing/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/MatekF405-Wing/hwdef.dat index 0af6d1efb7..806c7494cd 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MatekF405-Wing/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/MatekF405-Wing/hwdef.dat @@ -72,6 +72,7 @@ PA10 USART1_RX USART1 PA11 OTG_FS_DM OTG1 PA12 OTG_FS_DP OTG1 +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 PA14 LED_BLUE OUTPUT LOW GPIO(0) PA13 LED_GREEN OUTPUT LOW GPIO(1) # optional diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MatekF405/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/MatekF405/hwdef.dat index ead1a2743f..84a91d2324 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MatekF405/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/MatekF405/hwdef.dat @@ -25,6 +25,7 @@ I2C_ORDER I2C1 SERIAL_ORDER OTG1 USART3 UART4 USART1 UART5 USART2 # LEDs +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 PB9 LED_BLUE OUTPUT LOW GPIO(0) PA14 LED_GREEN OUTPUT LOW GPIO(1) diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MatekF765-Wing/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/MatekF765-Wing/hwdef.dat index 348bcfd336..1999f718ad 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MatekF765-Wing/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/MatekF765-Wing/hwdef.dat @@ -90,6 +90,7 @@ define HAL_BATT2_CURR_PIN 15 PC1 RSSI_ADC ADC1 define BOARD_RSSI_ANA_PIN 11 +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 PD10 LED0 OUTPUT LOW GPIO(90) # blue PD11 LED1 OUTPUT LOW GPIO(91) # green define HAL_GPIO_A_LED_PIN 91 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MatekH743-periph/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/MatekH743-periph/hwdef.dat index c37b823031..2fcb842569 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MatekH743-periph/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/MatekH743-periph/hwdef.dat @@ -40,7 +40,6 @@ define HAL_PERIPH_ADSB_PORT_DEFAULT 3 # default ADSB off by setting 0 baudrate define HAL_PERIPH_ADSB_BAUD_DEFAULT 0 -define HAL_NO_MONITOR_THREAD define HAL_USE_RTC FALSE define AP_SCRIPTING_ENABLED 0 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MatekH743/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/MatekH743/hwdef.dat index aa0776d7f5..c26a193d14 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MatekH743/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/MatekH743/hwdef.dat @@ -93,6 +93,7 @@ define BOARD_RSSI_ANA_PIN 8 # LED # green LED1 marked as B/E # blue LED0 marked as ACT +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 PE3 LED0 OUTPUT LOW GPIO(90) # blue PE4 LED1 OUTPUT LOW GPIO(91) # green define HAL_GPIO_A_LED_PIN 91 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MatekH7A3/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/MatekH7A3/hwdef.dat index 8d3608e234..cb578f84b2 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MatekH7A3/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/MatekH7A3/hwdef.dat @@ -76,6 +76,7 @@ define HAL_BATT2_VOLT_SCALE 21.0 # LED # green LED1 marked as B/E # blue LED0 marked as ACT +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 PA14 LED0 OUTPUT LOW GPIO(90) # blue PA13 LED1 OUTPUT LOW GPIO(91) # green define HAL_GPIO_A_LED_PIN 91 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MatekL431-BattMon/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/MatekL431-BattMon/hwdef.dat index 4a2612749a..cf3ace13ad 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MatekL431-BattMon/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/MatekL431-BattMon/hwdef.dat @@ -13,7 +13,6 @@ SPIDEV INA23X SPI1 DEVID1 SPARE_CS MODE1 10*MHZ 10*MHZ define HAL_USE_ADC FALSE # disable unnecessary threads -define HAL_NO_MONITOR_THREAD define HAL_NO_RCOUT_THREAD define HAL_NO_TIMER_THREAD diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MatekL431-DShot/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/MatekL431-DShot/hwdef.dat index 5c27d1c9e6..d74ef0f7cb 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MatekL431-DShot/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/MatekL431-DShot/hwdef.dat @@ -32,3 +32,7 @@ define HAL_PERIPH_ENABLE_NOTIFY define HAL_SERIAL_ESC_COMM_ENABLED 1 define HAL_SUPPORT_RCOUT_SERIAL 1 define HAL_WITH_ESC_TELEM 1 + +# also enable relay output via hardpoint msgs +define HAL_PERIPH_ENABLE_RELAY +define AP_RELAY_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MatekL431-GPS/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/MatekL431-GPS/hwdef.dat index 45a49c8d71..3a46d72a0b 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MatekL431-GPS/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/MatekL431-GPS/hwdef.dat @@ -37,7 +37,6 @@ PB11 USART3_RX USART3 SPEED_HIGH define HAL_USE_ADC FALSE # disable unnecessary threads -define HAL_NO_MONITOR_THREAD define HAL_NO_RCOUT_THREAD define HAL_NO_TIMER_THREAD undef HAL_RCIN_THREAD_ENABLED diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MatekL431/hwdef.inc b/libraries/AP_HAL_ChibiOS/hwdef/MatekL431/hwdef.inc index c172fe5ac5..8c13942329 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MatekL431/hwdef.inc +++ b/libraries/AP_HAL_ChibiOS/hwdef/MatekL431/hwdef.inc @@ -38,8 +38,6 @@ MAIN_STACK 0x300 # PROCESS_STACK controls stack for main thread PROCESS_STACK 0xA00 -define HAL_NO_MONITOR_THREAD - # we setup a small defaults.parm define AP_PARAM_MAX_EMBEDDED_PARAM 512 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MicoAir405Mini/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/MicoAir405Mini/hwdef-bl.dat index dd60bfdedd..efd6b50a50 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MicoAir405Mini/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/MicoAir405Mini/hwdef-bl.dat @@ -27,8 +27,7 @@ SERIAL_ORDER OTG1 PA11 OTG_FS_DM OTG1 PA12 OTG_FS_DP OTG1 -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + #CS pin PB12 AT7456E_CS CS diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MicoAir405Mini/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/MicoAir405Mini/hwdef.dat index 1f973c5196..3a2b63426c 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MicoAir405Mini/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/MicoAir405Mini/hwdef.dat @@ -28,12 +28,11 @@ PC5 LED_RED OUTPUT LOW GPIO(0) PC4 LED_GREEN OUTPUT LOW GPIO(1) PA8 LED_BLUE OUTPUT LOW GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 -define HAL_GPIO_LED_ON 0 -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # only one I2C bus I2C_ORDER I2C1 @@ -137,8 +136,6 @@ SPIDEV osd SPI1 DEVID4 AT7456E_CS MODE0 10*MHZ 10*MHZ # filesystem setup on sdcard define HAL_OS_FATFS_IO 1 -define HAL_BOARD_LOG_DIRECTORY "/APM/LOGS" -define HAL_BOARD_TERRAIN_DIRECTORY "/APM/TERRAIN" # setup for OSD define OSD_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MicoAir405v2/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/MicoAir405v2/hwdef-bl.dat index b205eae079..2422b94699 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MicoAir405v2/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/MicoAir405v2/hwdef-bl.dat @@ -31,8 +31,7 @@ PA12 OTG_FS_DP OTG1 PA13 JTMS-SWDIO SWD PA14 JTCK-SWCLK SWD -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + #CS pin PB12 AT7456E_CS CS diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MicoAir405v2/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/MicoAir405v2/hwdef.dat index 211f0122da..4f24d3a9c1 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MicoAir405v2/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/MicoAir405v2/hwdef.dat @@ -28,11 +28,11 @@ PA8 LED_BLUE OUTPUT LOW GPIO(0) PC4 LED_GREEN OUTPUT LOW GPIO(1) PC5 LED_RED OUTPUT LOW GPIO(2) -define HAL_GPIO_A_LED_PIN 2 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 0 -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # only one I2C bus I2C_ORDER I2C1 @@ -143,8 +143,6 @@ SPIDEV sdcard SPI3 DEVID5 SDCARD_CS MODE0 400*KHZ 25*MHZ # filesystem setup on sdcard define HAL_OS_FATFS_IO 1 -define HAL_BOARD_LOG_DIRECTORY "/APM/LOGS" -define HAL_BOARD_TERRAIN_DIRECTORY "/APM/TERRAIN" # setup for OSD define OSD_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MicoAir743/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/MicoAir743/hwdef-bl.dat index 28a492deb8..c111bbb75a 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MicoAir743/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/MicoAir743/hwdef-bl.dat @@ -19,8 +19,7 @@ FLASH_RESERVE_START_KB 0 # the location where the bootloader will put the firmware FLASH_BOOTLOADER_LOAD_KB 128 -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # order of UARTs (and USB) SERIAL_ORDER OTG1 USART1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/MicoAir743/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/MicoAir743/hwdef.dat index b4f966df89..538baec0ef 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/MicoAir743/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/MicoAir743/hwdef.dat @@ -98,12 +98,11 @@ PE5 LED_RED OUTPUT LOW GPIO(0) PE6 LED_GREEN OUTPUT LOW GPIO(1) PE4 LED_BLUE OUTPUT LOW GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 -define HAL_GPIO_LED_ON 0 -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # ADC for Power PC0 BATT_VOLTAGE_SENS ADC1 SCALE(1) @@ -158,8 +157,6 @@ IMU BMI270 SPI:bmi270 ROTATION_ROLL_180 # enable FAT filesystem support (needs a microSD defined via SDMMC) define HAL_OS_FATFS_IO 1 -define HAL_BOARD_LOG_DIRECTORY "/APM/LOGS" -define HAL_BOARD_TERRAIN_DIRECTORY "/APM/TERRAIN" # setup for OSD define OSD_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Nucleo-G491/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Nucleo-G491/hwdef.dat index 2334c17478..6349392a21 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Nucleo-G491/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Nucleo-G491/hwdef.dat @@ -72,3 +72,4 @@ define STM32_ADC_USE_ADC1 TRUE PB11 BAT_CURR_SENS ADC1 SCALE(1) define HAL_RCIN_THREAD_ENABLED 1 +define HAL_MONITOR_THREAD_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Nucleo-L476/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Nucleo-L476/hwdef.dat index 3cd7b0f0dc..6db0ac1f72 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Nucleo-L476/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Nucleo-L476/hwdef.dat @@ -87,9 +87,6 @@ define HAL_USE_ADC TRUE define STM32_ADC_USE_ADC1 TRUE PA4 VSENSE ADC1 SCALE(2) -define HAL_NO_MONITOR_THREAD - - define AP_PARAM_MAX_EMBEDDED_PARAM 512 define HAL_PERIPH_ENABLE_GPS diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Nucleo-L496/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Nucleo-L496/hwdef.dat index 2532dfa2b9..322ee11049 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Nucleo-L496/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Nucleo-L496/hwdef.dat @@ -95,8 +95,6 @@ define HAL_USE_ADC TRUE define STM32_ADC_USE_ADC1 TRUE PA4 VSENSE ADC1 SCALE(2) -define HAL_NO_MONITOR_THREAD - define AP_PARAM_MAX_EMBEDDED_PARAM 512 define HAL_PERIPH_ENABLE_GPS diff --git a/libraries/AP_HAL_ChibiOS/hwdef/NucleoH755/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/NucleoH755/hwdef.dat index e1a4e30c82..50feaed3c2 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/NucleoH755/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/NucleoH755/hwdef.dat @@ -98,6 +98,7 @@ define HAL_SPI_CHECK_CLOCK_FREQ PC7 MPU_CS CS # status LEDs +define AP_NOTIFY_GPIO_LED_3_ENABLED 1 define HAL_LED_ON 0 PB0 LED OUTPUT HIGH GPIO(0) #Green PE1 LED1 OUTPUT HIGH GPIO(2) #Yellow diff --git a/libraries/AP_HAL_ChibiOS/hwdef/NxtPX4v2/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/NxtPX4v2/hwdef-bl.dat index 887f3b99bc..6a28cbbca1 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/NxtPX4v2/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/NxtPX4v2/hwdef-bl.dat @@ -19,8 +19,7 @@ FLASH_RESERVE_START_KB 0 # the location where the bootloader will put the firmware FLASH_BOOTLOADER_LOAD_KB 128 -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # order of UARTs (and USB) SERIAL_ORDER OTG1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/NxtPX4v2/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/NxtPX4v2/hwdef.dat index 30877ff33f..326d2c65fd 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/NxtPX4v2/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/NxtPX4v2/hwdef.dat @@ -95,12 +95,12 @@ PD15 LED_RED OUTPUT HIGH GPIO(90) PD11 LED_GREEN OUTPUT HIGH GPIO(91) PB15 LED_BLUE OUTPUT HIGH GPIO(92) -define HAL_GPIO_A_LED_PIN 90 -define HAL_GPIO_B_LED_PIN 91 -define HAL_GPIO_C_LED_PIN 92 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 90 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 91 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 92 define HAL_GPIO_LED_ON 1 -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # ADC for Power PC4 BATT_VOLTAGE_SENS ADC1 SCALE(1) @@ -159,5 +159,3 @@ IMU BMI088 SPI:imu1_a SPI:imu1_g ROTATION_ROLL_180_YAW_90 # enable FAT filesystem support (needs a microSD defined via SDMMC) define HAL_OS_FATFS_IO 1 -define HAL_BOARD_LOG_DIRECTORY "/APM/LOGS" -define HAL_BOARD_TERRAIN_DIRECTORY "/APM/TERRAIN" diff --git a/libraries/AP_HAL_ChibiOS/hwdef/OmnibusNanoV6/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/OmnibusNanoV6/hwdef.dat index 84a127f43e..1e068c119b 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/OmnibusNanoV6/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/OmnibusNanoV6/hwdef.dat @@ -138,7 +138,8 @@ define HAL_BATT_CURR_SCALE 18.2 define BOARD_RSSI_ANA_PIN 0 -define HAL_GPIO_A_LED_PIN 41 +define AP_NOTIFY_GPIO_LED_1_ENABLED 1 +define AP_NOTIFY_GPIO_LED_1_PIN 41 define OSD_ENABLED 1 define HAL_OSD_TYPE_DEFAULT 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/OrqaF405Pro/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/OrqaF405Pro/hwdef-bl.dat index f602396f6e..78ad6e6362 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/OrqaF405Pro/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/OrqaF405Pro/hwdef-bl.dat @@ -30,8 +30,7 @@ PA12 OTG_FS_DP OTG1 PA13 JTMS-SWDIO SWD PA14 JTCK-SWCLK SWD -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # Chip select pins diff --git a/libraries/AP_HAL_ChibiOS/hwdef/OrqaF405Pro/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/OrqaF405Pro/hwdef.dat index dd0d0c1949..0d5a0f9d3f 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/OrqaF405Pro/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/OrqaF405Pro/hwdef.dat @@ -108,6 +108,7 @@ PC8 TIM8_CH3 TIM8 PWM(7) GPIO(56) # M7 PC9 TIM8_CH4 TIM8 PWM(8) GPIO(57) # M8 # LEDs +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 # Red PA15 LED0 OUTPUT LOW GPIO(90) define HAL_GPIO_B_LED_PIN 90 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/PixC4-Jetson/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/PixC4-Jetson/hwdef.dat index 311a727360..5d25f1ae4f 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/PixC4-Jetson/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/PixC4-Jetson/hwdef.dat @@ -278,9 +278,9 @@ PC6 LED_GREEN OUTPUT GPIO(91) LOW PC7 LED_BLUE OUTPUT GPIO(92) HIGH # setup for Board LEDs +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 define HAL_GPIO_A_LED_PIN 90 define HAL_GPIO_B_LED_PIN 92 -define HAL_GPIO_LED_ON 0 # enable RAMTROM parameter storage define HAL_STORAGE_SIZE 32768 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/PixFlamingo-F767/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/PixFlamingo-F767/hwdef.dat index e32b238d94..b4e6704450 100755 --- a/libraries/AP_HAL_ChibiOS/hwdef/PixFlamingo-F767/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/PixFlamingo-F767/hwdef.dat @@ -157,20 +157,16 @@ SPIDEV dps310 SPI1 DEVID3 BARO_CS MODE3 5*MHZ 5*MHZ # enable FAT filesystem define HAL_OS_FATFS_IO 1 -define HAL_BOARD_LOG_DIRECTORY "/APM/LOGS" -define HAL_BOARD_TERRAIN_DIRECTORY "/APM/TERRAIN" - - # pixracer has 3 LEDs, Red, Green, Blue -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 PE10 LED_RED OUTPUT GPIO(0) PE8 LED_GREEN OUTPUT GPIO(1) PE7 LED_BLUE OUTPUT GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 # battery setup define HAL_BATT_MONITOR_DEFAULT 4 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/PixFlamingo/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/PixFlamingo/hwdef.dat index 8bf13bc523..afd5f861c7 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/PixFlamingo/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/PixFlamingo/hwdef.dat @@ -141,16 +141,16 @@ SPIDEV lsm9ds0_g SPI2 DEVID4 GYRO_CS MODE3 11*MHZ 11*MHZ define HAL_OS_FATFS_IO 1 # pixracer has 3 LEDs, Red, Green, Blue -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # LED setup for PixracerLED driver PE8 LED_RED OUTPUT GPIO(0) PE7 LED_GREEN OUTPUT GPIO(1) PB2 LED_BLUE OUTPUT GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 # battery setup define HAL_BATT_MONITOR_DEFAULT 4 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-C3/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-C3/hwdef.dat index 9677e35f25..f2a44efb12 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-C3/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-C3/hwdef.dat @@ -155,11 +155,11 @@ PA8 LED_RED OUTPUT OPENDRAIN GPIO(11) HIGH PB1 LED_GREEN OUTPUT OPENDRAIN GPIO(12) HIGH PC15 LED_BLUE OUTPUT OPENDRAIN GPIO(13) HIGH -define HAL_GPIO_A_LED_PIN 11 -define HAL_GPIO_B_LED_PIN 12 -define HAL_GPIO_C_LED_PIN 13 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 11 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 12 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 13 -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # SPI device table SPIDEV BMP388 SPI1 DEVID3 BARO_CS MODE3 20*MHZ 20*MHZ @@ -183,10 +183,6 @@ BARO BMP388 SPI:BMP388_ext define HAL_PROBE_EXTERNAL_I2C_COMPASSES define HAL_I2C_INTERNAL_MASK 0 - -define HAL_BOARD_LOG_DIRECTORY "/APM/LOGS" -define HAL_BOARD_TERRAIN_DIRECTORY "/APM/TERRAIN" - define HAL_STORAGE_SIZE 16384 define HAL_WITH_RAMTRON 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V3/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V3/hwdef.dat index 490fb17d2c..008a677022 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V3/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V3/hwdef.dat @@ -164,11 +164,11 @@ PC11 LED_RED OUTPUT OPENDRAIN GPIO(11) HIGH PC10 LED_GREEN OUTPUT OPENDRAIN GPIO(12) HIGH PC12 LED_BLUE OUTPUT OPENDRAIN GPIO(13) HIGH -define HAL_GPIO_A_LED_PIN 11 -define HAL_GPIO_B_LED_PIN 12 -define HAL_GPIO_C_LED_PIN 13 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 11 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 12 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 13 -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # SPI device table SPIDEV ms5611 SPI1 DEVID3 BARO_CS MODE3 20*MHZ 20*MHZ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6/hwdef.dat index e5581ab3d3..08c2205d8b 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6/hwdef.dat @@ -160,11 +160,11 @@ PB4 LED_RED OUTPUT OPENDRAIN GPIO(11) HIGH PB3 LED_GREEN OUTPUT OPENDRAIN GPIO(12) HIGH PB5 LED_BLUE OUTPUT OPENDRAIN GPIO(13) HIGH -define HAL_GPIO_A_LED_PIN 11 -define HAL_GPIO_B_LED_PIN 13 -define HAL_GPIO_C_LED_PIN 12 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 11 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 13 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 12 -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # Power flag pins: these tell the MCU the status of the various power # supplies that are available. The pin names need to exactly match the diff --git a/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6PRO/PixPilot-V6Pro-1.png b/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6PRO/PixPilot-V6Pro-1.png new file mode 100644 index 0000000000..3781777bbb Binary files /dev/null and b/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6PRO/PixPilot-V6Pro-1.png differ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6PRO/PixPilot-V6Pro-2.png b/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6PRO/PixPilot-V6Pro-2.png new file mode 100644 index 0000000000..504b02da67 Binary files /dev/null and b/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6PRO/PixPilot-V6Pro-2.png differ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6PRO/README.md b/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6PRO/README.md new file mode 100644 index 0000000000..55162fff69 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6PRO/README.md @@ -0,0 +1,427 @@ + +## PixPilot-V6PRO Flight Controller + +The PixPilot-V6PRO flight controller is sold by a range of resellers listed on the makeflyeasy(http://www.makeflyeasy.com) + +## Features + +• STM32H743VIT6 microcontroller + +•STM32F103C8T6 IOMCU microcontroller + +• Three IMUs, two ICM42688-P(SPI), one ICM40605(SPI) + +• internal heater for IMUs temperature control + +• internal Soft Rubber Damping Ball isolation for All interna IMUs + +• Two barometers, BMP388(SPI) + +• builtin RAMTRON(SPI) + +• microSD card slot + +• 5 UARTs, two with RTS/CTS flow control + +• USB(Type-C) + +• PPM & S.Bus input + +• 16 PWM outputs + +• twoI2C ports and two FDCAN ports + +• one S.Bus output + +• internal Buzzer + +• builtin RGB LED + +• Four voltage & current monitoring, Two analog and Two CAN + +• servo rail BEC independent power input for servos + +• external safety Switch + + +## Picture + +![PixPilot-V6PRO](PixPilot-V6Pro-1.png "PixPilot-V6Pro-1") +![PixPilot-V6PRO](PixPilot-V6Pro-2.png "PixPilot-V6Pro-2") + +## Pinout + +UART Mapping +============ + + - SERIAL0 -> console (primary mavlink, usually USB) +- SERIAL1 -> USART2 (Telem1,MAVLINK2) (DMA capable) +- SERIAL2 -> USART3 (Telem2, MAVLink2) (DMA capable) + - SERIAL3 -> UART4 (GPS1) (TX is DMA capable) + - SERIAL4 -> UART8 (GPS2) (RX is DMA capable) + - SERIAL5 -> UART7 (USER) + + Connector pin assignments +========================= +POWER_CAN1 port, POWER_CAN2 ports +-------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PINSIGNALVOLT
1VCC+5V
2VCC+5V
3CAN_H+12V
4CAN_L+12V
5GNDGND
6GNDGND
+ + +TELEM1, TELEM2 ports +-------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PinSignalVolt
1VCC+5V
2TX (OUT)+3.3V
3RX (IN)+3.3V
4GNDGND
+ +I2C1, I2C2 ports +--------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PINSIGNALVOLT
1VCC+5V
2SCL+3.3V
3SDA+3.3V
4GNDGND
+ +CAN1, CAN2 ports +--------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PINSIGNALVOLT
1VCC+5V
2CAN_H+12V
3CAN_L+12V
4GNDGND
+ +Safety and buzzer port +----------- + + + + + + + + + + + + + + + + + + + + + + + + +
PINSIGNALVOLT
1VCC+5V
2LED+5V
3Safety Switch+5V
+ +DSM port +----------- + + + + + + + + + + + + + + + + + + + + + + + + +
PINSIGNALVOLT
1VCC+5V
2DSM_IN+5V
3GNDGND
+ +GPS1/I2C1, GPS2/I2C2 ports +-------------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PINSIGNALVOLT
1VCC+5V
2TX+3.3V
3RX+3.3V
4SCL+3.3V
5SDA+3.3V
6GNDGND
+ +Serial5 port +-------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PinSignalVolt
1VCC+5V
2TX (OUT)+3.3V
3RX (IN)+3.3V
4GNDGND
+ +Power1, Power2 ports +-------------------- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PINSIGNALVOLT
1VCC+5V
2VCC+5V
3CURRENT+3.3V
4VOLTAGE+3.3V
5GNDGND
6GNDGND
+ + +RC Input +-------- + +All compatible RC protocols can be decoded by attaching the Receiver's output to the SBUS input pin next to the Servo/Output VCC input connector. Note that some protocols such as CRSF or FPort including telemetry, require connection to, and setup of, one of the UARTs instead of this pin. + +Battery Monitor Settings +======================== + +These should already be set by default. However, if lost or changed: + +Enable Battery monitor with these parameter settings : + +:ref:`BATT_MONITOR` =4 + +Then reboot. + +:ref:`BATT_VOLT_PIN` 14 + +:ref:`BATT_CURR_PIN` 15 + +:ref:`BATT_VOLT_MULT` 18.0 + +:ref:`BATT_AMP_PERVLT` 24.0 + +:ref:`BATT2_VOLT_PIN` 13 + +:ref:`BATT2_CURR_PIN` 4 + +:ref:`BATT2_VOLT_MULT` 18.0 + +:ref:`BATT2_AMP_PERVLT` 24.0 + +DroneCAN capability +=================== +There are 4 CAN ports which allow connecting two independant CAN bus outputs. Each of these can have multiple CAN peripheral devices connected. There are also two separate CAN POWER ports for easy access to CAN-PMU. + +Where to Buy +============ + +`makeflyeasy `_ + + +[copywiki destination="plane,copter,rover,blimp"] diff --git a/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6PRO/defaults.parm b/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6PRO/defaults.parm new file mode 100644 index 0000000000..b6a70ce19c --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6PRO/defaults.parm @@ -0,0 +1,3 @@ +# turn on the CAN power monitoring(default) +CAN_P1_DRIVER 1 +CAN_P2_DRIVER 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6PRO/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6PRO/hwdef-bl.dat new file mode 100644 index 0000000000..a18fd547eb --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6PRO/hwdef-bl.dat @@ -0,0 +1,62 @@ +# hw definition file for processing by chibios_hwdef.py +# for H743 bootloader + +# MCU class and specific type +MCU STM32H7xx STM32H743xx + +# crystal frequency +OSCILLATOR_HZ 24000000 + +# board ID for firmware load +APJ_BOARD_ID 1160 + +FLASH_SIZE_KB 2048 + +# bootloader is installed at zero offset +FLASH_RESERVE_START_KB 0 + +# the location where the bootloader will put the firmware +# the H743 has 128k sectors +FLASH_BOOTLOADER_LOAD_KB 128 + +env OPTIMIZE -Os +PB3 LED_ACTIVITY OUTPUT OPENDRAIN HIGH # red +PE12 LED_BOOTLOADER OUTPUT OPENDRAIN HIGH # blue +define HAL_LED_ON 0 + +# order of UARTs (and USB) +SERIAL_ORDER OTG1 USART2 USART3 UART7 + +# telem1 +PD5 USART2_TX USART2 +PD6 USART2_RX USART2 + +# telem2 +PD8 USART3_TX USART3 +PD9 USART3_RX USART3 + +# UART7 maps to SERIAL5. +PE7 UART7_RX UART7 +PE8 UART7_TX UART7 + + +PA11 OTG_FS_DM OTG1 +PA12 OTG_FS_DP OTG1 + +PA13 JTMS-SWDIO SWD +PA14 JTCK-SWCLK SWD + +# Add CS pins to ensure they are high in bootloader +PC13 42688_EXT_CS CS +PD7 BARO_EXT_CS CS +PC2 40605_EXT_CS CS +PE4 42688_CS CS +PC14 BARO_CS CS +PD10 FRAM_CS CS +#PD2 SDCARD_CS CS + + +define HAL_USE_EMPTY_STORAGE 1 + + +define HAL_STORAGE_SIZE 32768 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6PRO/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6PRO/hwdef.dat new file mode 100644 index 0000000000..6930846708 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/PixPilot-V6PRO/hwdef.dat @@ -0,0 +1,297 @@ +# hw definition file for processing by chibios_hwdef.py + +# MCU class and specific type +MCU STM32H7xx STM32H743xx + +# crystal frequency +OSCILLATOR_HZ 24000000 + +# board ID for firmware load +APJ_BOARD_ID 1160 + +FLASH_SIZE_KB 2048 + + +# with 2M flash we can afford to optimize for speed +env OPTIMIZE -O2 + +# bootloader takes first sector +FLASH_RESERVE_START_KB 128 + + + +# order of I2C buses +I2C_ORDER I2C2 I2C1 + +# order of UARTs (and USB) +SERIAL_ORDER OTG1 USART2 USART3 UART4 UART8 UART7 OTG2 + +#DEFAULTGPIO OUTPUT LOW PULLDOWN + +# USB. +PA11 OTG_FS_DM OTG1 +PA12 OTG_FS_DP OTG1 +PA9 VBUS INPUT OPENDRAIN +PC0 VBUS_nVALID INPUT PULLUP + + +# telem1 +PD5 USART2_TX USART2 +PD6 USART2_RX USART2 +PD3 USART2_CTS USART2 +PD4 USART2_RTS USART2 + +#PD3 EXTERN_GPIO4 OUTPUT GPIO(4) ALT(1) +#PD4 EXTERN_GPIO5 OUTPUT GPIO(5) ALT(1) + +# telem2 +PD8 USART3_TX USART3 +PD9 USART3_RX USART3 +PD11 USART3_CTS USART3 +PD12 USART3_RTS USART3 + +# GPS +PA0 UART4_TX UART4 +PA1 UART4_RX UART4 NODMA + +# GPS2 +PE0 UART8_RX UART8 +PE1 UART8_TX UART8 NODMA + +# UART7 +PE7 UART7_RX UART7 +PE8 UART7_TX UART7 + +# UART for IOMCU +IOMCU_UART USART6 +PC6 USART6_TX USART6 +PC7 USART6_RX USART6 + + + + + + + +# Now the VDD sense pin. This is used to sense primary board voltage. +PA4 VDD_5V_SENS ADC1 SCALE(2) + +# This defines an output pin which will default to output HIGH. It is +# a pin that enables peripheral power on this board. It starts in the +# off state, then is pulled low to enable peripherals in +# peripheral_power_enable() +#PA8 nVDD_5V_PERIPH_EN OUTPUT HIGH +PE3 VDD_3V3_SENSORS_EN OUTPUT LOW +# SWD debug +PA13 JTMS-SWDIO SWD +PA14 JTCK-SWCLK SWD + +# PWM output for buzzer +PA15 TIM2_CH1 TIM2 GPIO(77) ALARM + + +# CAN1 +PD0 CAN1_RX CAN1 +PD1 CAN1_TX CAN1 + +# CAN2 +PB6 CAN2_TX CAN2 +PB12 CAN2_RX CAN2 + +# I2C1 +PB8 I2C1_SCL I2C1 +PB9 I2C1_SDA I2C1 + +# I2C2 +PB10 I2C2_SCL I2C2 +PB11 I2C2_SDA I2C2 + + +# SPI1. +PA5 SPI1_SCK SPI1 +PA6 SPI1_MISO SPI1 +PA7 SPI1_MOSI SPI1 + + +# SPI4. +PE2 SPI4_SCK SPI4 +PE5 SPI4_MISO SPI4 +PE6 SPI4_MOSI SPI4 + +# SPI2 +PB13 SPI2_SCK SPI2 +PB14 SPI2_MISO SPI2 +PB15 SPI2_MOSI SPI2 + + +# This defines more ADC inputs. +PA2 BATT_VOLTAGE_SENS ADC1 SCALE(1) +PA3 BATT_CURRENT_SENS ADC1 SCALE(1) + +PC3 AUX_POWER ADC1 SCALE(1) +PC4 AUX_ADC2 ADC1 SCALE(1) + +# And the analog input for airspeed (rarely used these days). +#PC5 PRESSURE_SENS ADC1 SCALE(2) + +# More CS pins for more sensors. The labels for all CS pins need to +# match the SPI device table later in this file. +PC13 42688_EXT_CS CS +PD7 BARO_EXT_CS CS +PC2 40605_EXT_CS CS +PE4 42688_CS CS +PC14 BARO_CS CS +PD10 FRAM_CS CS +#PD2 SDCARD_CS CS + +PC1 42688_EXT_DRDY INPUT +PC15 40605_EXT_DRDY INPUT +PD15 42688_DRDY INPUT + +# Now we start defining some PWM pins. We also map these pins to GPIO +# values, so users can set SERVOx_FUNCTION=-1 to determine which +# PWM outputs on the primary MCU are set up as GPIOs. +# To match HAL_PX4 we number the GPIOs for the PWM outputs +# starting at 50. +PE14 TIM1_CH4 TIM1 PWM(1) GPIO(50) +PE13 TIM1_CH3 TIM1 PWM(2) GPIO(51) BIDIR +PE11 TIM1_CH2 TIM1 PWM(3) GPIO(52) +PE9 TIM1_CH1 TIM1 PWM(4) GPIO(53) BIDIR +PD13 TIM4_CH2 TIM4 PWM(5) GPIO(54) BIDIR +PD14 TIM4_CH3 TIM4 PWM(6) GPIO(55) BIDIR + +PB0 TIM3_CH3 TIM3 PWM(7) GPIO(56) NODMA +PB1 TIM3_CH4 TIM3 PWM(8) GPIO(57) NODMA + + + + +PB4 LED_RED OUTPUT OPENDRAIN GPIO(11) HIGH +PB3 LED_GREEN OUTPUT OPENDRAIN GPIO(12) HIGH +PB5 LED_BLUE OUTPUT OPENDRAIN GPIO(13) HIGH + +define HAL_GPIO_A_LED_PIN 11 +define HAL_GPIO_B_LED_PIN 13 +define HAL_GPIO_C_LED_PIN 12 + +# Power flag pins: these tell the MCU the status of the various power +# supplies that are available. The pin names need to exactly match the +# names used in AnalogIn.cpp. +PB2 VDD_BRICK_nVALID INPUT PULLUP +PB7 VDD_BRICK2_nVALID INPUT PULLUP +PE10 VDD_5V_HIPOWER_nOC INPUT PULLUP +PE15 VDD_5V_PERIPH_nOC INPUT PULLUP + +#SPIDEV ms5611 SPI1 DEVID5 BARO_CS MODE3 20*MHZ 20*MHZ +#SPIDEV ms5611_ext SPI4 DEVID2 BARO_EXT_CS MODE3 20*MHZ 20*MHZ + +SPIDEV BMP388 SPI1 DEVID3 BARO_CS MODE3 20*MHZ 20*MHZ +SPIDEV BMP388_ext SPI4 DEVID2 BARO_EXT_CS MODE3 20*MHZ 20*MHZ + +SPIDEV ICM40605_ext SPI4 DEVID4 40605_EXT_CS MODE3 2*MHZ 8*MHZ +SPIDEV ICM42688_ext SPI4 DEVID5 42688_EXT_CS MODE3 2*MHZ 8*MHZ +SPIDEV ICM42688 SPI1 DEVID6 42688_CS MODE3 2*MHZ 8*MHZ + +#SPIDEV iim42652 SPI1 DEVID6 42688_CS MODE3 2*MHZ 8*MHZ + +SPIDEV ramtron SPI2 DEVID10 FRAM_CS MODE3 8*MHZ 8*MHZ +#SPIDEV sdcard SPI2 DEVID1 SDCARD_CS MODE0 400*KHZ 25*MHZ + + +# IMUs +#IMU Invensensev3 SPI:ICM42688 ROTATION_NONE +IMU Invensensev3 SPI:ICM42688 ROTATION_NONE +IMU Invensensev3 SPI:ICM42688_ext ROTATION_NONE +IMU Invensensev3 SPI:ICM40605_ext ROTATION_NONE + +#IMU Invensensev3 SPI:iim42652 ROTATION_NONE + +define HAL_DEFAULT_INS_FAST_SAMPLE 7 + +# two baros + + +BARO BMP388 SPI:BMP388 +BARO BMP388 SPI:BMP388_ext + + + +# probe external I2C compasses plus some internal IST8310 +#COMPASS IST8310 I2C:0:0x0E false ROTATION_ROLL_180 + +define HAL_PROBE_EXTERNAL_I2C_COMPASSES +define HAL_I2C_INTERNAL_MASK 1 + +undef AP_FEATURE_SBUS_OUT + + +# Enable FAT filesystem support. +define HAL_OS_FATFS_IO 1 +AP_BOOTLOADER_FLASH_FROM_SD_ENABLED + +#define HAL_BOARD_LOG_DIRECTORY "/APM/LOGS" +define HAL_BOARD_TERRAIN_DIRECTORY "/APM/TERRAIN" + + + +# Now setup the default battery pins driver analog pins and default +# scaling for the power brick. +define HAL_BATT_MONITOR_DEFAULT 4 +define HAL_BATT_VOLT_PIN 14 +define HAL_BATT_CURR_PIN 15 + +define HAL_BATT2_VOLT_PIN 13 +define HAL_BATT2_CURR_PIN 4 + +define HAL_BATT_VOLT_SCALE 18.0 +define HAL_BATT_CURR_SCALE 24.0 + +define HAL_BATT2_VOLT_SCALE 18.0 +define HAL_BATT2_CURR_SCALE 24.0 + + +PC8 SDMMC1_D0 SDMMC1 +PC9 SDMMC1_D1 SDMMC1 +PC10 SDMMC1_D2 SDMMC1 +PC11 SDMMC1_D3 SDMMC1 +PC12 SDMMC1_CK SDMMC1 +PD2 SDMMC1_CMD SDMMC1 + +# allow to have have a dedicated safety switch pin +define HAL_HAVE_SAFETY_SWITCH 1 + +# Enable RAMTROM parameter storage. +define HAL_WITH_RAMTRON 1 +define HAL_STORAGE_SIZE 32768 + +# Setup the IMU heater +define HAL_HAVE_IMU_HEATER 1 +define HAL_IMU_TEMP_DEFAULT 45 +define HAL_IMUHEAT_P_DEFAULT 50 +define HAL_IMUHEAT_I_DEFAULT 0.07 +define HAL_IMU_TEMP_MARGIN_LOW_DEFAULT 5 + +# compensate for magnetic field generated by the heater on internal IST8310 +define HAL_HEATER_MAG_OFFSET {AP_HAL::Device::make_bus_id(AP_HAL::Device::BUS_TYPE_I2C,0,0xe,0xa),Vector3f(0,2,-19)} + +# this board does not have heater detection pins, so force via features register +define AP_IOMCU_FORCE_ENABLE_HEATER 1 + +# Enable all IMUs to be used and therefore three active EKF Lanes +define HAL_EKF_IMU_MASK_DEFAULT 7 + + +#define HAL_GPIO_PWM_VOLT_PIN 3 +#define HAL_GPIO_PWM_VOLT_3v3 1 + +define HAL_OTG2_PROTOCOL SerialProtocol_SLCAN + +ROMFS io_firmware.bin Tools/IO_Firmware/iofirmware_lowpolh.bin + + +# enable support for dshot on iomcu + ROMFS io_firmware_dshot.bin Tools/IO_Firmware/iofirmware_dshot_highpolh.bin + +define HAL_WITH_IO_MCU_DSHOT 1 + +DMA_NOSHARE SPI1* SPI4* USART6* diff --git a/libraries/AP_HAL_ChibiOS/hwdef/PixSurveyA2/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/PixSurveyA2/hwdef.dat index 1c3f349d88..cd8f932bbd 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/PixSurveyA2/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/PixSurveyA2/hwdef.dat @@ -5,6 +5,7 @@ include ../PixPilot-V6/hwdef.dat undef APJ_BOARD_ID APJ_BOARD_ID 1097 +undef AP_NOTIFY_GPIO_LED_RGB_ENABLED undef HAL_GPIO_A_LED_PIN undef HAL_GPIO_B_LED_PIN undef HAL_GPIO_C_LED_PIN diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk5X/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk5X/hwdef-bl.dat index 82db60d63e..73b2dc8ec5 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk5X/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk5X/hwdef-bl.dat @@ -29,8 +29,7 @@ env OPTIMIZE -Os # order of UARTs (and USB) SERIAL_ORDER OTG1 UART7 UART5 USART2 USART3 -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # USB PA11 OTG_FS_DM OTG1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk5X/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk5X/hwdef.dat index bc0651cf2a..6ce6a1bd9f 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk5X/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk5X/hwdef.dat @@ -251,9 +251,9 @@ PE4 LED_GREEN OUTPUT OPENDRAIN GPIO(91) HIGH PE5 LED_BLUE OUTPUT OPENDRAIN GPIO(92) HIGH # setup for BoardLED2 +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 define HAL_GPIO_A_LED_PIN 90 define HAL_GPIO_B_LED_PIN 92 -define HAL_GPIO_LED_ON 0 # ID pins PG0 HW_VER_REV_DRIVE OUTPUT LOW diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6C/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6C/hwdef-bl.dat index e80be6d002..3894214702 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6C/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6C/hwdef-bl.dat @@ -29,8 +29,7 @@ env OPTIMIZE -Os # order of UARTs (and USB) SERIAL_ORDER OTG1 UART7 UART5 USART3 -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # USB PA11 OTG_FS_DM OTG1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6C/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6C/hwdef.dat index 7872fc8e50..9ca280db8b 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6C/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6C/hwdef.dat @@ -177,7 +177,7 @@ define HAL_SPEKTRUM_PWR_ENABLED 1 # power sensing PE3 VDD_5V_PERIPH_nOC INPUT PULLUP -PF13 VDD_5V_HIPOWER_nOC INPUT PULLUP +PC11 VDD_5V_HIPOWER_nOC INPUT PULLUP PA15 VDD_BRICK_nVALID INPUT PULLUP PB12 VDD_BRICK2_nVALID INPUT PULLUP @@ -196,9 +196,9 @@ PD10 LED_RED OUTPUT OPENDRAIN GPIO(90) HIGH PD11 LED_BLUE OUTPUT OPENDRAIN GPIO(92) HIGH # setup for BoardLED2 +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 define HAL_GPIO_A_LED_PIN 90 define HAL_GPIO_B_LED_PIN 92 -define HAL_GPIO_LED_ON 0 # ID pins PE12 HW_VER_REV_DRIVE OUTPUT LOW diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6X-PPPGW/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6X-PPPGW/hwdef.dat index a199216c91..8a3ca1c079 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6X-PPPGW/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6X-PPPGW/hwdef.dat @@ -24,8 +24,6 @@ define HAL_PERIPH_ENABLE_SERIAL_OPTIONS define AP_NETWORKING_BACKEND_PPP 1 -define HAL_NO_MONITOR_THREAD - define HAL_USE_RTC FALSE # use blue LED diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6X/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6X/hwdef-bl.dat index a8da550956..b9901fa1c7 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6X/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6X/hwdef-bl.dat @@ -24,8 +24,7 @@ env OPTIMIZE -Os # order of UARTs (and USB) SERIAL_ORDER OTG1 UART7 UART5 USART3 -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # USB PA11 OTG_FS_DM OTG1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6X/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6X/hwdef.dat index a53e62d65d..aa427cb175 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6X/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Pixhawk6X/hwdef.dat @@ -265,12 +265,11 @@ PE4 LED_GREEN OUTPUT OPENDRAIN GPIO(91) HIGH PE5 LED_BLUE OUTPUT OPENDRAIN GPIO(92) HIGH # setup for "pixracer" RGB LEDs -define HAL_GPIO_A_LED_PIN 90 -define HAL_GPIO_B_LED_PIN 91 -define HAL_GPIO_C_LED_PIN 92 -define HAL_GPIO_LED_ON 0 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 90 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 91 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 92 -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # ID pins PG0 HW_VER_REV_DRIVE OUTPUT LOW diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Pixracer-periph/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Pixracer-periph/hwdef.dat index 59e704a045..700fbd0cd0 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Pixracer-periph/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Pixracer-periph/hwdef.dat @@ -35,8 +35,6 @@ define GPS_MAX_RECEIVERS 1 define GPS_MAX_INSTANCES 1 define HAL_COMPASS_MAX_SENSORS 1 -define HAL_NO_MONITOR_THREAD - define HAL_USE_RTC FALSE define HAL_BARO_ALLOW_INIT_NO_BARO diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Pixracer/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Pixracer/hwdef.dat index 47a9ccc82e..f1a16f3c87 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Pixracer/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Pixracer/hwdef.dat @@ -181,16 +181,16 @@ define HAL_WITH_RAMTRON 1 define HAL_OS_FATFS_IO 1 # pixracer has 3 LEDs, Red, Green, Blue -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # LED setup for PixracerLED driver PB11 LED_RED OUTPUT GPIO(0) PB1 LED_GREEN OUTPUT GPIO(1) PB3 LED_BLUE OUTPUT GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 # battery setup define HAL_BATT_VOLT_PIN 2 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/QioTekAdeptF407/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/QioTekAdeptF407/hwdef.dat index 1134e6616b..66dde13ae2 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/QioTekAdeptF407/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/QioTekAdeptF407/hwdef.dat @@ -111,10 +111,6 @@ PD2 SDIO_CMD SDIO # enable FAT filesystem support define HAL_OS_FATFS_IO 1 -# now some defines for logging and terrain data files -define HAL_BOARD_LOG_DIRECTORY "/APM/LOGS" -define HAL_BOARD_TERRAIN_DIRECTORY "/APM/TERRAIN" - # define the order that I2C buses I2C_ORDER I2C1 I2C2 PB8 I2C1_SCL I2C1 @@ -154,14 +150,14 @@ PE0 EXTERN_GPIO6 OUTPUT GPIO(6) PA15 TIM2_CH1 TIM2 RCININT PULLDOWN LOW # LED setup is similar to PixRacer -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 PE10 LED_RED OUTPUT GPIO(10) PE12 LED_GREEN OUTPUT GPIO(11) PE15 LED_BLUE OUTPUT GPIO(12) -define HAL_GPIO_A_LED_PIN 10 -define HAL_GPIO_B_LED_PIN 11 -define HAL_GPIO_C_LED_PIN 12 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 10 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 11 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 12 # analog in 6.6V PC1 ADC_1 ADC1 SCALE(2) diff --git a/libraries/AP_HAL_ChibiOS/hwdef/QioTekZealotF427/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/QioTekZealotF427/hwdef.dat index 1c5ca9d2da..0881d1172b 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/QioTekZealotF427/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/QioTekZealotF427/hwdef.dat @@ -170,15 +170,15 @@ define RELAY4_PIN_DEFAULT 4 PC7 TIM8_CH2 TIM8 RCININT PULLDOWN LOW # LED setup is similar to PixRacer -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 PE3 LED_RED OUTPUT GPIO(10) PE2 LED_GREEN OUTPUT GPIO(11) PE1 LED_BLUE OUTPUT GPIO(12) PE0 LED_YELOW OUTPUT GPIO(13) -define HAL_GPIO_A_LED_PIN 10 -define HAL_GPIO_B_LED_PIN 11 -define HAL_GPIO_C_LED_PIN 12 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 10 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 11 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 12 # analog in PC0 PRESSURE_SENS ADC1 SCALE(2) diff --git a/libraries/AP_HAL_ChibiOS/hwdef/QioTekZealotH743/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/QioTekZealotH743/hwdef.dat index 2f97bf0f1e..04dbec92ff 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/QioTekZealotH743/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/QioTekZealotH743/hwdef.dat @@ -197,14 +197,14 @@ define HAL_PROBE_EXTERNAL_I2C_COMPASSES # LED setup is similar to PixRacer -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 PE2 LED_RED OUTPUT GPIO(10) PE1 LED_GREEN OUTPUT GPIO(11) PE0 LED_BLUE OUTPUT GPIO(12) -define HAL_GPIO_A_LED_PIN 10 -define HAL_GPIO_B_LED_PIN 11 -define HAL_GPIO_C_LED_PIN 12 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 10 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 11 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 12 #define GPIOs diff --git a/libraries/AP_HAL_ChibiOS/hwdef/R9Pilot/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/R9Pilot/hwdef.dat index 110df4f7ad..4104297370 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/R9Pilot/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/R9Pilot/hwdef.dat @@ -112,6 +112,7 @@ define BOARD_RSSI_ANA_PIN 15 PC0 PRESSURE_SENS ADC1 SCALE(2) define HAL_DEFAULT_AIRSPEED_PIN 10 +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 PE0 LED0 OUTPUT LOW GPIO(90) # blue PA3 LED1 OUTPUT LOW GPIO(91) # green define HAL_GPIO_A_LED_PIN 91 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/RADIX2HD/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/RADIX2HD/hwdef.dat index 5fdeaff78a..b74ee1163c 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/RADIX2HD/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/RADIX2HD/hwdef.dat @@ -144,11 +144,11 @@ PE5 LED_RED OUTPUT HIGH OPENDRAIN GPIO(10) PE6 LED_GREEN OUTPUT HIGH OPENDRAIN GPIO(11) PA7 LED_BLUE OUTPUT HIGH OPENDRAIN GPIO(12) -define HAL_GPIO_A_LED_PIN 10 -define HAL_GPIO_B_LED_PIN 11 -define HAL_GPIO_C_LED_PIN 12 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 10 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 11 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 12 -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # 9V regulator switch PC14 VTX_PWR OUTPUT HIGH GPIO(81) diff --git a/libraries/AP_HAL_ChibiOS/hwdef/RadiolinkPIX6/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/RadiolinkPIX6/hwdef.dat index 0cd8456398..ca35a3cb6c 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/RadiolinkPIX6/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/RadiolinkPIX6/hwdef.dat @@ -207,11 +207,11 @@ PC1 LED_GREEN OUTPUT GPIO(91) PC7 LED_BLUE OUTPUT GPIO(92) # setup for "pixracer" RGB LEDs -define HAL_GPIO_A_LED_PIN 90 -define HAL_GPIO_B_LED_PIN 91 -define HAL_GPIO_C_LED_PIN 92 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 90 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 91 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 92 -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # enable RAMTROM parameter storage define HAL_STORAGE_SIZE 32768 @@ -227,9 +227,6 @@ DMA_PRIORITY SDMMC* UART8* ADC* USART3_RX TIM1_UP USART2_RX USART1_RX TIM1_CH3 S # enable FAT filesystem support (needs a microSD defined via SDMMC) define HAL_OS_FATFS_IO 1 -define HAL_BOARD_LOG_DIRECTORY "/APM/LOGS" -define HAL_BOARD_TERRAIN_DIRECTORY "/APM/TERRAIN" - ROMFS io_firmware.bin Tools/IO_Firmware/iofirmware_lowpolh.bin # setup for OSD diff --git a/libraries/AP_HAL_ChibiOS/hwdef/SIYI_N7/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/SIYI_N7/hwdef.dat index 75abd77fc6..69c02d5547 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/SIYI_N7/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/SIYI_N7/hwdef.dat @@ -189,9 +189,9 @@ PC6 LED_GREEN OUTPUT GPIO(91) LOW PC7 LED_BLUE OUTPUT GPIO(92) HIGH # setup for 2 LEDs +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 define HAL_GPIO_A_LED_PIN 90 define HAL_GPIO_B_LED_PIN 92 -define HAL_GPIO_LED_ON 0 # enable RAMTROM parameter storage define HAL_STORAGE_SIZE 32768 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/SPRacingH7/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/SPRacingH7/hwdef-bl.dat index 51200e048d..f5ef8f9ad8 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/SPRacingH7/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/SPRacingH7/hwdef-bl.dat @@ -53,7 +53,6 @@ QSPIDEV w25q-dtr QUADSPI1 MODE3 100*MHZ 24 1 define HAL_USE_EMPTY_STORAGE 1 define HAL_STORAGE_SIZE 16384 -DEFAULTGPIO OUTPUT LOW PULLDOWN # Add CS pins to ensure they are high in bootloader PB12 ICM20602_2_CS CS diff --git a/libraries/AP_HAL_ChibiOS/hwdef/SPRacingH7RF/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/SPRacingH7RF/hwdef-bl.dat index 4a2c734dc0..7278d62b5e 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/SPRacingH7RF/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/SPRacingH7RF/hwdef-bl.dat @@ -56,7 +56,6 @@ OSPIDEV w25q OCTOSPI1 MODE3 130*MHZ 21 1 define HAL_USE_EMPTY_STORAGE 1 define HAL_STORAGE_SIZE 16384 -DEFAULTGPIO OUTPUT LOW PULLDOWN # Add CS pins to ensure they are high in bootloader PA15 ICM42688_CS CS diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Sierra-F405/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Sierra-F405/hwdef.dat index be2be38e15..46b4ac476a 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Sierra-F405/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Sierra-F405/hwdef.dat @@ -34,8 +34,6 @@ define HAL_USE_RTC FALSE define DMA_RESERVE_SIZE 0 -define HAL_NO_MONITOR_THREAD - define HAL_DEVICE_THREAD_STACK 768 # we setup a small defaults.parm diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Sierra-F412/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Sierra-F412/hwdef.dat index 4952b98e52..840e642e23 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Sierra-F412/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Sierra-F412/hwdef.dat @@ -95,7 +95,6 @@ PA12 CAN1_TX CAN1 # use DNA define HAL_CAN_DEFAULT_NODE_ID 0 -define HAL_NO_MONITOR_THREAD define HAL_DEVICE_THREAD_STACK 768 # disable dual GPS and GPS blending to save flash space diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Sierra-F9P/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Sierra-F9P/hwdef.dat index 79cb3ce542..726e786945 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Sierra-F9P/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Sierra-F9P/hwdef.dat @@ -104,7 +104,6 @@ PB8 CAN1_RX CAN1 PB9 CAN1_TX CAN1 PC1 GPIO_CAN1_SILENT OUTPUT PUSHPULL SPEED_LOW LOW -define HAL_NO_MONITOR_THREAD define HAL_DEVICE_THREAD_STACK 768 # we setup a small defaults.parm diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Sierra-L431/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Sierra-L431/hwdef.dat index 515d3671b5..4ae1b0a63d 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Sierra-L431/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Sierra-L431/hwdef.dat @@ -92,7 +92,6 @@ define HAL_USE_ADC TRUE define STM32_ADC_USE_ADC1 TRUE PA0 VDD_5V_SENS ADC1 SCALE(2) -define HAL_NO_MONITOR_THREAD define AP_PARAM_MAX_EMBEDDED_PARAM 512 define HAL_PERIPH_ENABLE_MAG diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Sierra-PrecisionPoint/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Sierra-PrecisionPoint/hwdef.dat index e6bd38b83c..c9a7dd156f 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Sierra-PrecisionPoint/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Sierra-PrecisionPoint/hwdef.dat @@ -148,3 +148,4 @@ PC6 USB_SEL OUTPUT PUSHPULL SPEED_LOW HIGH define HAL_SERIAL_ESC_COMM_ENABLED 1 define HAL_RCIN_THREAD_ENABLED 1 define HAL_SCHEDULER_LOOP_DELAY_ENABLED 1 +define HAL_MONITOR_THREAD_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Sierra-TrueNavIC/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Sierra-TrueNavIC/hwdef.dat index 70d3d01636..61598a1eb0 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Sierra-TrueNavIC/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Sierra-TrueNavIC/hwdef.dat @@ -37,7 +37,6 @@ PROCESS_STACK 0xA00 # save memory define HAL_GCS_ENABLED 0 -define HAL_NO_MONITOR_THREAD define HAL_NO_LOGGING define HAL_USE_ADC FALSE diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Sierra-TrueNavPro-G4/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Sierra-TrueNavPro-G4/hwdef.dat index 5162c63078..994cce76fc 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Sierra-TrueNavPro-G4/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Sierra-TrueNavPro-G4/hwdef.dat @@ -68,7 +68,6 @@ define HAL_NO_GPIO_IRQ define HAL_USE_RTC FALSE define DMA_RESERVE_SIZE 0 -define HAL_NO_MONITOR_THREAD define HAL_DEVICE_THREAD_STACK 768 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Sierra-TrueNavPro/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Sierra-TrueNavPro/hwdef.dat index f63913f67a..115ae799cc 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Sierra-TrueNavPro/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Sierra-TrueNavPro/hwdef.dat @@ -36,7 +36,6 @@ MAIN_STACK 0x300 PROCESS_STACK 0xA00 # save memory -define HAL_NO_MONITOR_THREAD define HAL_USE_ADC FALSE # we setup a small defaults.parm diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Sierra-TrueNorth/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Sierra-TrueNorth/hwdef.dat index cb94ecf57f..93d1f863d0 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Sierra-TrueNorth/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Sierra-TrueNorth/hwdef.dat @@ -36,7 +36,6 @@ MAIN_STACK 0x300 PROCESS_STACK 0xA00 # save memory -define HAL_NO_MONITOR_THREAD define HAL_USE_ADC FALSE # we setup a small defaults.parm diff --git a/libraries/AP_HAL_ChibiOS/hwdef/Sierra-TrueSpeed/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/Sierra-TrueSpeed/hwdef.dat index 3509c384aa..c831aece13 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/Sierra-TrueSpeed/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/Sierra-TrueSpeed/hwdef.dat @@ -36,7 +36,6 @@ MAIN_STACK 0x300 PROCESS_STACK 0xA00 # save memory -define HAL_NO_MONITOR_THREAD define HAL_USE_ADC FALSE # we setup a small defaults.parm diff --git a/libraries/AP_HAL_ChibiOS/hwdef/SkystarsH7HD/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/SkystarsH7HD/hwdef-bl.dat index e51f307f0e..7453b722da 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/SkystarsH7HD/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/SkystarsH7HD/hwdef-bl.dat @@ -38,8 +38,7 @@ PE4 LED_ACTIVITY OUTPUT HIGH define HAL_LED_ON 0 define HAL_LED_OFF 1 -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # Add CS pins to ensure they are high in bootloader PC15 BMI270_CS1 CS diff --git a/libraries/AP_HAL_ChibiOS/hwdef/SkystarsH7HD/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/SkystarsH7HD/hwdef.dat index c36b9f7f19..1af2d6a364 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/SkystarsH7HD/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/SkystarsH7HD/hwdef.dat @@ -115,6 +115,7 @@ define HAL_BATT2_CURR_SCALE 59.5 PC3 RSSI_ADC ADC1 define BOARD_RSSI_ANA_PIN 13 +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 PE3 LED0 OUTPUT LOW GPIO(90) # red, labelled as LED1 PE4 LED1 OUTPUT LOW GPIO(91) # blue, labelled as LED2 define HAL_GPIO_A_LED_PIN 90 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/SpeedyBeeF405Mini/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/SpeedyBeeF405Mini/hwdef-bl.dat index e043e37c01..9d8245d987 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/SpeedyBeeF405Mini/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/SpeedyBeeF405Mini/hwdef-bl.dat @@ -30,8 +30,7 @@ PA12 OTG_FS_DP OTG1 PA13 JTMS-SWDIO SWD PA14 JTCK-SWCLK SWD -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # Chip select pins diff --git a/libraries/AP_HAL_ChibiOS/hwdef/SpeedyBeeF405Mini/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/SpeedyBeeF405Mini/hwdef.dat index 26235823dc..292c0777d6 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/SpeedyBeeF405Mini/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/SpeedyBeeF405Mini/hwdef.dat @@ -113,8 +113,9 @@ PB0 TIM3_CH3 TIM3 PWM(4) GPIO(53) # M4 # LEDs PA8 TIM1_CH1 TIM1 PWM(5) GPIO(54) # M5 +define AP_NOTIFY_GPIO_LED_1_ENABLED 1 PC13 LED0 OUTPUT LOW GPIO(90) -define HAL_GPIO_A_LED_PIN 90 +define AP_NOTIFY_GPIO_LED_1_PIN 90 # Dataflash setup SPIDEV dataflash SPI3 DEVID1 FLASH1_CS MODE3 104*MHZ 104*MHZ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/SpeedyBeeF405WING/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/SpeedyBeeF405WING/hwdef-bl.dat index 84d03b16a6..6e9056e32f 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/SpeedyBeeF405WING/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/SpeedyBeeF405WING/hwdef-bl.dat @@ -29,8 +29,6 @@ SERIAL_ORDER OTG1 PA11 OTG_FS_DM OTG1 PA12 OTG_FS_DP OTG1 -DEFAULTGPIO OUTPUT LOW PULLDOWN - # Add CS pins to ensure they are high in bootloader PA4 MPU_CS CS PB12 OSD_CS CS diff --git a/libraries/AP_HAL_ChibiOS/hwdef/SpeedyBeeF405WING/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/SpeedyBeeF405WING/hwdef.dat index 0823673571..f063295ea6 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/SpeedyBeeF405WING/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/SpeedyBeeF405WING/hwdef.dat @@ -28,6 +28,7 @@ I2C_ORDER I2C1 SERIAL_ORDER OTG1 USART1 USART2 USART3 UART4 UART5 USART6 # LEDs +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 PA13 LED_GREEN OUTPUT LOW GPIO(0) PA14 LED_BLUE OUTPUT LOW GPIO(1) @@ -171,14 +172,13 @@ PC13 PINIO1 OUTPUT GPIO(81) LOW include ../include/minimize_fpv_osd.inc undef AP_CAMERA_MOUNT_ENABLED -undef AP_LANDINGGEAR_ENABLED undef HAL_MOUNT_ENABLED undef HAL_MOUNT_SERVO_ENABLED undef QAUTOTUNE_ENABLED define AP_CAMERA_MOUNT_ENABLED 1 -define AP_LANDINGGEAR_ENABLED 1 define HAL_MOUNT_ENABLED 1 +define AP_MOUNT_BACKEND_DEFAULT_ENABLED 0 define HAL_MOUNT_SERVO_ENABLED 1 define QAUTOTUNE_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/SuccexF4/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/SuccexF4/hwdef.dat index 5219afd50f..75965031cb 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/SuccexF4/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/SuccexF4/hwdef.dat @@ -75,8 +75,9 @@ PA14 JTCK-SWCLK SWD # LED and buzzer PB4 TIM3_CH1 TIM3 GPIO(56) ALARM +define AP_NOTIFY_GPIO_LED_1_ENABLED 1 PB5 LED OUTPUT HIGH GPIO(57) -define HAL_GPIO_A_LED_PIN 57 +define AP_NOTIFY_GPIO_LED_1_PIN 57 PA11 OTG_FS_DM OTG1 PA12 OTG_FS_DP OTG1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/TMotorH743/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/TMotorH743/hwdef-bl.dat index 69385f40cf..9a8ae479ef 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/TMotorH743/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/TMotorH743/hwdef-bl.dat @@ -30,8 +30,7 @@ PA12 OTG_FS_DP OTG1 PA13 JTMS-SWDIO SWD PA14 JTCK-SWCLK SWD -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # Chip select pins diff --git a/libraries/AP_HAL_ChibiOS/hwdef/TMotorH743/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/TMotorH743/hwdef.dat index d8d9c1aaf3..8fc32b1397 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/TMotorH743/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/TMotorH743/hwdef.dat @@ -125,6 +125,7 @@ PA3 TIM5_CH4 TIM5 PWM(4) GPIO(53) # M4 # LEDs PA8 TIM1_CH1 TIM1 PWM(9) GPIO(58) # M9 +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 PE5 LED1 OUTPUT LOW GPIO(91) define HAL_GPIO_A_LED_PIN 91 @@ -145,9 +146,9 @@ ROMFS_WILDCARD libraries/AP_OSD/fonts/font*.bin # IMU setup SPIDEV icm42688 SPI1 DEVID1 GYRO1_CS MODE3 1*MHZ 16*MHZ -SPIDEV bmi270 SPI4 DEVID1 GYRO2_CS MODE3 1*MHZ 8*MHZ +SPIDEV bmi270 SPI1 DEVID1 GYRO1_CS MODE3 1*MHZ 8*MHZ -IMU BMI270 SPI:bmi270 ROTATION_PITCH_180_YAW_90 +IMU BMI270 SPI:bmi270 ROTATION_PITCH_180 IMU Invensensev3 SPI:icm42688 ROTATION_PITCH_180_YAW_90 DMA_NOSHARE TIM5_UP TIM3_UP TIM8_UP SPI1* SPI4* diff --git a/libraries/AP_HAL_ChibiOS/hwdef/YJUAV_A6/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/YJUAV_A6/hwdef.dat index f885b7ff37..44d160c86d 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/YJUAV_A6/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/YJUAV_A6/hwdef.dat @@ -154,12 +154,12 @@ PE12 LED_R1 OUTPUT OPENDRAIN HIGH GPIO(0) PE15 LED_G1 OUTPUT OPENDRAIN HIGH GPIO(1) PB9 LED_B1 OUTPUT OPENDRAIN HIGH GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 # use pixracer style 3-LED indicators -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # allow to have have a dedicated safety switch pin define HAL_HAVE_SAFETY_SWITCH 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/YJUAV_A6SE/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/YJUAV_A6SE/hwdef.dat index 7a541d4e8e..b621c4973a 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/YJUAV_A6SE/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/YJUAV_A6SE/hwdef.dat @@ -167,12 +167,12 @@ PE15 LED_R1 OUTPUT OPENDRAIN HIGH GPIO(0) PD10 LED_G1 OUTPUT OPENDRAIN LOW GPIO(1) PG0 LED_B1 OUTPUT OPENDRAIN HIGH GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 # use pixracer style 3-LED indicators -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # allow to have have a dedicated safety switch pin define HAL_HAVE_SAFETY_SWITCH 1 @@ -227,9 +227,6 @@ PD2 SDMMC1_CMD SDMMC1 # enable FAT filesystem support (needs a microSD defined via SDMMC) define HAL_OS_FATFS_IO 1 -define HAL_BOARD_LOG_DIRECTORY "/APM/LOGS" -define HAL_BOARD_TERRAIN_DIRECTORY "/APM/TERRAIN" - # enable RAMTROM parameter storage define HAL_STORAGE_SIZE 32768 define HAL_WITH_RAMTRON 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/YJUAV_A6SE_H743/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/YJUAV_A6SE_H743/hwdef.dat index 1072cba1a8..8b97b5cceb 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/YJUAV_A6SE_H743/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/YJUAV_A6SE_H743/hwdef.dat @@ -174,12 +174,12 @@ PE15 LED_R1 OUTPUT OPENDRAIN HIGH GPIO(0) PD10 LED_G1 OUTPUT OPENDRAIN LOW GPIO(1) PG0 LED_B1 OUTPUT OPENDRAIN HIGH GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 # use pixracer style 3-LED indicators -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # allow to have have a dedicated safety switch pin define HAL_HAVE_SAFETY_SWITCH 1 @@ -226,9 +226,6 @@ PD2 SDMMC1_CMD SDMMC1 # enable FAT filesystem support (needs a microSD defined via SDMMC) define HAL_OS_FATFS_IO 1 -define HAL_BOARD_LOG_DIRECTORY "/APM/LOGS" -define HAL_BOARD_TERRAIN_DIRECTORY "/APM/TERRAIN" - # enable RAMTROM parameter storage define HAL_STORAGE_SIZE 32768 define HAL_WITH_RAMTRON 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/YJUAV_A6Ultra/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/YJUAV_A6Ultra/hwdef.dat index 744f7f2187..0f643b86b9 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/YJUAV_A6Ultra/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/YJUAV_A6Ultra/hwdef.dat @@ -186,12 +186,12 @@ PE15 LED_R1 OUTPUT OPENDRAIN HIGH GPIO(0) PD10 LED_G1 OUTPUT OPENDRAIN LOW GPIO(1) PG0 LED_B1 OUTPUT OPENDRAIN HIGH GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 # use pixracer style 3-LED indicators -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # allow to have have a dedicated safety switch pin define HAL_HAVE_SAFETY_SWITCH 1 @@ -242,9 +242,6 @@ PD2 SDMMC1_CMD SDMMC1 # enable FAT filesystem support (needs a microSD defined via SDMMC) define HAL_OS_FATFS_IO 1 -define HAL_BOARD_LOG_DIRECTORY "/APM/LOGS" -define HAL_BOARD_TERRAIN_DIRECTORY "/APM/TERRAIN" - # enable RAMTROM parameter storage define HAL_STORAGE_SIZE 32768 define HAL_WITH_RAMTRON 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/ZeroOneX6/README.md b/libraries/AP_HAL_ChibiOS/hwdef/ZeroOneX6/README.md new file mode 100644 index 0000000000..ff9a42c1f4 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/ZeroOneX6/README.md @@ -0,0 +1,101 @@ +## ZeroOneX6 Flight Controller +The ZeroOne X6 is a flight controller manufactured by ZeroOne, which is based on the open-source FMU v6X architecture and Pixhawk Autopilot Bus open source specifications. + +## Features: +- Separate flight control core design. +- MCU + STM32H753IIK6 32-bit processor running at 480MHz + 2MB Flash + 1MB RAM +- IO MCU + STM32F103 +- Sensors +- IMU: + Internal Vibration Isolation for IMUs + IMU constant temperature heating(1 W heating power). + With Triple Synced IMUs, BalancedGyro technology, low noise and more shock-resistant: + IMU1-ICM45686(With vibration isolation) + IMU2-BMI088(With vibration isolation) + IMU3- ICM45686(No vibration isolation) +- Baro: + Two barometers:2 x ICP20100 + Magnetometer: Builtin RM3100 magnetometer + +## Pinout +![ZeroOneX6 Pinout](https://github.com/ZeroOne-Aero/ardupilot/blob/zeroOneBootLoader/libraries/AP_HAL_ChibiOS/hwdef/ZeroOneX6/ZeroOneX6Pinout.jpg "ZeroOneX6") + + +## UART Mapping +The UARTs are marked Rn and Tn in the above pinouts. The Rn pin is the receive pin for UARTn. The Tn pin is the transmit pin for UARTn. +| Name | Function | MCU PINS | DMA | +| :-----: | :------: | :------: | :------:| +| SERIAL0 | OTG1 | USB | +| SERIAL1 | Telem1 | UART7 |DMA Enabled | +| SERIAL2 | Telem2 | UART5 |DMA Enabled | +| SERIAL3 | GPS1 | USART1 |DMA Enabled | +| SERIAL4 | GPS2 | UART8 |DMA Enabled | +| SERIAL5 | Telem3 | USART2 |DMA Enabled | +| SERIAL6 | UART4 | UART4 |DMA Enabled | +| SERIAL7 |FMU DEBUG | USART3 |DMA Enabled | +| SERIAL8 | OTG-SLCAN| USB | + +## RC Input +The remote control signal should be connected to the SBUS RC IN port or DSM/PPM RC Port.It will support ALL unidirectional RC protocols. + +## PWM Output +The X6 flight controller supports up to 16 PWM outputs. +First 8 outputs (labelled 1 to 8) are controlled by a dedicated STM32F103 IO controller. +The remaining 8 outputs (labelled 9 to 16) are the "auxiliary" outputs. These are directly attached to the STM32H753 FMU controller . +All 16 outputs support normal PWM output formats. All 16 outputs support DShot, except 15 and 16. + +The 8 IO PWM outputs are in 4 groups: +- Outputs 1 and 2 in group1 +- Outputs 3 and 4 in group2 +- Outputs 5, 6, 7 and 8 in group3 + +The 8 FMU PWM outputs are in 4 groups: +- Outputs 1, 2, 3 and 4 in group1 +- Outputs 5 and 6 in group2 +- Outputs 7 and 8 in group3 + +Channels within the same group need to use the same output rate. If any channel in a group uses DShot then all channels in the group need to use DShot. + +## GPIO +All PWM outputs can be used as GPIOs (relays, camera, RPM etc). To use them you need to set the output’s SERVOx_FUNCTION to -1. The numbering of the GPIOs for PIN variables in ArduPilot is: + + + + + + + + + + + + + + + + + +
IO Pins FMU Pins
Name Value Option Name Value Option
M1 101 MainOut1 M9 50 AuxOut1
M2 102 MainOut2 M10 51 AuxOut2
M3 103 MainOut3 M11 52 AuxOut3
M4 104 MainOut4 M12 53 AuxOut4
M5 105 MainOut5 M13 54 AuxOut5
M6 106 MainOut6 M14 55 AuxOut6
M7 107 MainOut7 M15 56
M8 108 MainOut8 M16 57 BB Blue GPo pin 3
FCU CAP 58
+ +## Battery Monitoring +The X6 flight controller has two six-pin power connectors, supporting CAN interface power supply. +These are set by default in the firmware and shouldn't need to be adjusted. + +## Compass +The X6 flight controller built-in industrial-grade electronic compass chip RM3100. + +## Analog inputs +The X6 flight controller has 2 analog inputs. +- ADC Pin12 -> ADC 6.6V Sense +- ADC Pin13 -> ADC 3.3V Sense +- RSSI input pin = 103 + +## 5V PWM Voltage  +The X6 flight controller supports switching between 5V and 3.3V PWM levels. Switch PWM output pulse level by configuring parameter BRD_PWM_VOL_SEL. 0 for 3.3V and 1 for 5V output. + +## Where to Buy +https://www.01aero.cn diff --git a/libraries/AP_HAL_ChibiOS/hwdef/ZeroOneX6/ZeroOneX6Pinout.jpg b/libraries/AP_HAL_ChibiOS/hwdef/ZeroOneX6/ZeroOneX6Pinout.jpg new file mode 100644 index 0000000000..568a6686c5 Binary files /dev/null and b/libraries/AP_HAL_ChibiOS/hwdef/ZeroOneX6/ZeroOneX6Pinout.jpg differ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/ZeroOneX6/defaults.parm b/libraries/AP_HAL_ChibiOS/hwdef/ZeroOneX6/defaults.parm new file mode 100644 index 0000000000..ffd8b6947c --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/ZeroOneX6/defaults.parm @@ -0,0 +1,5 @@ +CAN_P1_DRIVER 1 +CAN_P2_DRIVER 1 + +BATT_MONITOR 8 +GPS1_TYPE 9 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/ZeroOneX6/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/ZeroOneX6/hwdef-bl.dat new file mode 100644 index 0000000000..0df8267ef4 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/ZeroOneX6/hwdef-bl.dat @@ -0,0 +1,106 @@ +# hw definition file for processing by chibios_hwdef.py +# for the ZeroOneX6 hardware + +# MCU class and specific type +MCU STM32H7xx STM32H743xx + +# crystal frequency +OSCILLATOR_HZ 16000000 + +# board ID for firmware load +APJ_BOARD_ID 5600 + +# bootloader is installed at zero offset +FLASH_RESERVE_START_KB 0 + +# the location where the bootloader will put the firmware +FLASH_BOOTLOADER_LOAD_KB 128 + +# flash size +FLASH_SIZE_KB 2048 + +env OPTIMIZE -Os + +# order of UARTs (and USB) +SERIAL_ORDER OTG1 UART7 UART5 USART3 + +# Pin for PWM Voltage Selection +PG6 PWM_VOLT_SEL OUTPUT HIGH GPIO(3) + +# USB +PA11 OTG_FS_DM OTG1 +PA12 OTG_FS_DP OTG1 +PA9 VBUS INPUT OPENDRAIN + +# pins for SWD debugging +PA13 JTMS-SWDIO SWD +PA14 JTCK-SWCLK SWD + +# CS pins +PI9 IMU1_CS CS +PH5 ICM42688_CS CS +PI4 BMI088_A_CS CS +PI8 BMI088_G_CS CS +PH15 BMM150_CS CS +PG7 FRAM_CS CS +PI10 EXT1_CS CS + +# telem1 +PE8 UART7_TX UART7 +PF6 UART7_RX UART7 + +# telem2 +PC12 UART5_TX UART5 +PD2 UART5_RX UART5 + +# debug uart +PD8 USART3_TX USART3 +PD9 USART3_RX USART3 + +# armed indication +PE6 nARMED OUTPUT HIGH + +# start peripheral power off +PF12 nVDD_5V_HIPOWER_EN OUTPUT HIGH +PG4 nVDD_5V_PERIPH_EN OUTPUT HIGH + +# LEDs +PE3 LED_ACTIVITY OUTPUT OPENDRAIN HIGH # red +PE5 LED_BOOTLOADER OUTPUT OPENDRAIN HIGH # blue +define HAL_LED_ON 0 + +define HAL_USE_EMPTY_STORAGE 1 +define HAL_STORAGE_SIZE 16384 + +# enable DFU by default +ENABLE_DFU_BOOT 1 + +# support flashing from SD card: +# power enable pins +PC13 VDD_3V3_SD_CARD_EN OUTPUT HIGH + +# FATFS support: +define CH_CFG_USE_MEMCORE 1 +define CH_CFG_USE_HEAP 1 +define CH_CFG_USE_SEMAPHORES 0 +define CH_CFG_USE_MUTEXES 1 +define CH_CFG_USE_DYNAMIC 1 +define CH_CFG_USE_WAITEXIT 1 +define CH_CFG_USE_REGISTRY 1 + +# microSD support +PD6 SDMMC2_CK SDMMC2 +PD7 SDMMC2_CMD SDMMC2 +PB14 SDMMC2_D0 SDMMC2 +PB15 SDMMC2_D1 SDMMC2 +PG11 SDMMC2_D2 SDMMC2 +PB4 SDMMC2_D3 SDMMC2 +define FATFS_HAL_DEVICE SDCD2 + +DMA_PRIORITY SDMMC* USART6* ADC* UART* USART* SPI* TIM* + +# enable FAT filesystem support (needs a microSD defined via SDMMC) +define HAL_OS_FATFS_IO 1 + +define AP_BOOTLOADER_FLASH_FROM_SD_ENABLED 1 + diff --git a/libraries/AP_HAL_ChibiOS/hwdef/ZeroOneX6/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/ZeroOneX6/hwdef.dat new file mode 100644 index 0000000000..c85cff4eb7 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/ZeroOneX6/hwdef.dat @@ -0,0 +1,343 @@ +# hw definition file for processing by chibios_hwdef.py +# for the ZeroOne X6 hardware + +# default to all pins low to avoid ESD issues +DEFAULTGPIO OUTPUT LOW PULLDOWN + +# MCU class and specific type +MCU STM32H7xx STM32H743xx + +# crystal frequency +OSCILLATOR_HZ 16000000 + +# ChibiOS system timer +STM32_ST_USE_TIMER 2 + +# board ID for firmware load +APJ_BOARD_ID 5600 + +FLASH_RESERVE_START_KB 128 + +# to be compatible with the px4 bootloader we need +# to use a different RAM_MAP +env USE_ALT_RAM_MAP 1 + +# flash size +FLASH_SIZE_KB 2048 + +# supports upto 8MBits/s +CANFD_SUPPORTED 8 + +env OPTIMIZE -O2 + +# order of UARTs (and USB) +SERIAL_ORDER OTG1 UART7 UART5 USART1 UART8 USART2 UART4 USART3 OTG2 + +# USB +PA11 OTG_FS_DM OTG1 +PA12 OTG_FS_DP OTG1 +PA9 VBUS INPUT OPENDRAIN + +# pins for SWD debugging +PA13 JTMS-SWDIO SWD +PA14 JTCK-SWCLK SWD + +# telem1 +PE8 UART7_TX UART7 +PF6 UART7_RX UART7 +PF8 UART7_RTS UART7 +PE10 UART7_CTS UART7 + +# telem2 +PC8 UART5_RTS UART5 +PC9 UART5_CTS UART5 +PC12 UART5_TX UART5 +PD2 UART5_RX UART5 + +# telem3 +PA3 USART2_RX USART2 +PD5 USART2_TX USART2 +PD3 USART2_CTS USART2 +PD4 USART2_RTS USART2 +#define DEFAULT_SERIAL5_PROTOCOL SerialProtocol_MAVLink2 + +# GPS1 +PB6 USART1_TX USART1 +PB7 USART1_RX USART1 + +# GPS2 +PE0 UART8_RX UART8 +PE1 UART8_TX UART8 + +# uart4 +PH13 UART4_TX UART4 +PH14 UART4_RX UART4 + +# debug uart +PD8 USART3_TX USART3 +PD9 USART3_RX USART3 + +# USART6 is for IOMCU +PC6 USART6_TX USART6 +PC7 USART6_RX USART6 +IOMCU_UART USART6 + +# Ethernet +PC1 ETH_MDC ETH1 +PA2 ETH_MDIO ETH1 +PC4 ETH_RMII_RXD0 ETH1 +PC5 ETH_RMII_RXD1 ETH1 +PG13 ETH_RMII_TXD0 ETH1 +PG12 ETH_RMII_TXD1 ETH1 +PB11 ETH_RMII_TX_EN ETH1 +PA7 ETH_RMII_CRS_DV ETH1 +PA1 ETH_RMII_REF_CLK ETH1 +#PG15 ETH_POWER_EN ETH1 + +PG15 Ethernet_PWR_EN OUTPUT HIGH # disable power on ethernet + +define BOARD_PHY_ID MII_LAN8742A_ID +define BOARD_PHY_RMII + +# ADC +PA0 SCALED1_V3V3 ADC1 SCALE(2) +PA4 SCALED2_V3V3 ADC1 SCALE(2) +PB0 SCALED3_V3V3 ADC1 SCALE(2) +PF12 SCALED4_V3V3 ADC1 SCALE(2) + +PB1 VDD_5V_SENS ADC1 SCALE(2) + +# pin7 on AD&IO, analog 12 +PC2 ADC1_6V6 ADC1 SCALE(2) + +# pin6 on AD&IO, analog 13 +PC3 ADC1_3V3 ADC1 SCALE(1) + +# SPI1 - IMU3 ICM45686 +PA5 SPI1_SCK SPI1 +PB5 SPI1_MOSI SPI1 +PG9 SPI1_MISO SPI1 +PI9 SP1_CS1 CS + +# SPI2 -IMU1 ICM45686 +PI1 SPI2_SCK SPI2 +PI2 SPI2_MISO SPI2 +PI3 SPI2_MOSI SPI2 +PH5 SP2_CS1 CS +PA10 SP2_DRDY2 INPUT + +# SPI3 -IMU2 BMI088 +PB2 SPI3_MOSI SPI3 +PC10 SPI3_SCK SPI3 +PC11 SPI3_MISO SPI3 +PI4 SP3_CS1 CS +PI8 SP3_CS2 CS +PI6 SP3_DRDY1 INPUT +PI7 SP3_DRDY2 INPUT GPIO(93) +define SP3_DRDY2 93 + +# SPI4 - unused +#PE12 SPI4_SCK SPI4 +#PE13 SPI4_MISO SPI4 +#PE14 SPI4_MOSI SPI4 +#PF3 SP4_DRDY1 INPUT +PH15 SP4_CS1 CS + +# SPI5 - FRAM +PF7 SPI5_SCK SPI5 +PH7 SPI5_MISO SPI5 +PF11 SPI5_MOSI SPI5 +PG7 FRAM_CS CS + +# SPI6 - external1 (disabled to save DMA channels) +# PB3 SPI6_SCK SPI6 +# PA6 SPI6_MISO SPI6 +# PG14 SPI6_MOSI SPI6 +# PI10 EXT1_CS CS + +# PWM output pins +PI0 TIM5_CH4 TIM5 PWM(1) GPIO(50) +PH12 TIM5_CH3 TIM5 PWM(2) GPIO(51) +PH11 TIM5_CH2 TIM5 PWM(3) GPIO(52) +PH10 TIM5_CH1 TIM5 PWM(4) GPIO(53) +PD13 TIM4_CH2 TIM4 PWM(5) GPIO(54) +PD14 TIM4_CH3 TIM4 PWM(6) GPIO(55) + +# Pin for PWM Voltage Selection, 0 means 3.3v, 1 means 5v +PG6 PWM_VOLT_SEL OUTPUT HIGH GPIO(3) +define HAL_GPIO_PWM_VOLT_PIN 3 +define HAL_GPIO_PWM_VOLT_3v3 0 + +# we need to disable DMA on the last 2 FMU channels +# as timer 12 doesn't have a TIMn_UP DMA option +PH6 TIM12_CH1 TIM12 PWM(7) GPIO(56) NODMA +PH9 TIM12_CH2 TIM12 PWM(8) GPIO(57) NODMA + +# GPIOs +PE11 FMU_CAP1 INPUT GPIO(58) +PC0 NFC_GPIO INPUT GPIO(60) + +# CAN bus +PD0 CAN1_RX CAN1 +PD1 CAN1_TX CAN1 + +PB12 CAN2_RX CAN2 +PB13 CAN2_TX CAN2 + +# I2C buses + +# I2C1, GPS+MAG +PB9 I2C1_SDA I2C1 +PB8 I2C1_SCL I2C1 + +# I2C2, GPS2+MAG +PF1 I2C2_SCL I2C2 +PF0 I2C2_SDA I2C2 +PG5 DRDY1_BMP388 INPUT + +# I2C3, MS5611, external +PA8 I2C3_SCL I2C3 +PH8 I2C3_SDA I2C3 + +# I2C4 internal +PF14 I2C4_SCL I2C4 +PF15 I2C4_SDA I2C4 + +# order of I2C buses +I2C_ORDER I2C4 I2C1 I2C2 I2C3 +define HAL_I2C_INTERNAL_MASK 1 + +# heater +PB10 HEATER_EN OUTPUT LOW GPIO(80) +define HAL_HEATER_GPIO_PIN 80 + +# Setup the IMU heater +define HAL_HAVE_IMU_HEATER 1 +define HAL_IMU_TEMP_DEFAULT 45 +define HAL_IMUHEAT_P_DEFAULT 50 +define HAL_IMUHEAT_I_DEFAULT 0.07 + +# armed indication +PE6 nARMED OUTPUT HIGH + +# power enable pins +PC13 VDD_3V3_SD_CARD_EN OUTPUT HIGH +PI11 VDD_3V3_SENSORS1_EN OUTPUT HIGH +PF4 VDD_3V3_SENSORS2_EN OUTPUT HIGH +PE7 VDD_3V3_SENSORS3_EN OUTPUT HIGH +PG8 VDD_3V3_SENSORS4_EN OUTPUT HIGH + +# start peripheral power on +PG10 nVDD_5V_HIPOWER_EN OUTPUT LOW +PG4 nVDD_5V_PERIPH_EN OUTPUT LOW + +# Control of Spektrum power pin +PH2 SPEKTRUM_PWR OUTPUT HIGH GPIO(73) +define HAL_GPIO_SPEKTRUM_PWR 73 + +# Spektrum Power is Active High +define HAL_SPEKTRUM_PWR_ENABLED 1 + +# power sensing +PE15 VDD_5V_PERIPH_nOC INPUT PULLUP +PF13 VDD_5V_HIPOWER_nOC INPUT PULLUP + +PG1 VDD_BRICK_nVALID INPUT PULLUP +PG2 VDD_BRICK2_nVALID INPUT PULLUP +PG3 VDD_BRICK3_nVALID INPUT PULLUP + +# microSD support +PD6 SDMMC2_CK SDMMC2 +PD7 SDMMC2_CMD SDMMC2 +PB14 SDMMC2_D0 SDMMC2 +PB15 SDMMC2_D1 SDMMC2 +PG11 SDMMC2_D2 SDMMC2 +PB4 SDMMC2_D3 SDMMC2 +define FATFS_HAL_DEVICE SDCD2 + +# safety +PD10 LED_SAFETY OUTPUT +PF5 SAFETY_IN INPUT PULLDOWN + +# GPIO LEDs +PE3 LED_RED OUTPUT OPENDRAIN GPIO(90) HIGH +PE4 LED_GREEN OUTPUT OPENDRAIN GPIO(91) HIGH +PE5 LED_BLUE OUTPUT OPENDRAIN GPIO(92) HIGH + +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 90 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 91 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 92 + +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 + +# ID pins +PG0 HW_VER_REV_DRIVE OUTPUT LOW +# PH3 HW_VER_SENS ADC3 SCALE(1) +# PH4 HW_REV_SENS ADC3 SCALE(1) + +# PWM output for buzzer +PF9 TIM14_CH1 TIM14 GPIO(77) ALARM + +# RC input +PI5 TIM8_CH1 TIM8 RCININT PULLDOWN LOW + +# barometers (ZeroOne X6) +BARO ICP201XX I2C:0:0x64 +BARO ICP201XX I2C:2:0x63 + +# compass +define HAL_PROBE_EXTERNAL_I2C_COMPASSES + +# builtin compass on ZeroOne X6 +COMPASS RM3100 I2C:0:0x20 false ROTATION_PITCH_180 + +# compensate for magnetic field generated by the heater on ZeroOne X6 RM3100 +define HAL_HEATER_MAG_OFFSET_RM3100 AP_HAL::Device::make_bus_id(AP_HAL::Device::BUS_TYPE_I2C,0,0x20,0x11),Vector3f(0,0,0) + +#define HAL_HEATER_MAG_OFFSET HAL_HEATER_MAG_OFFSET_RM3100 + +# IMU devices for ZeroOne X6 +SPIDEV icm45686_1 SPI2 DEVID1 SP2_CS1 MODE3 2*MHZ 16*MHZ +SPIDEV bmi088_g SPI3 DEVID1 SP3_CS2 MODE3 10*MHZ 10*MHZ +SPIDEV bmi088_a SPI3 DEVID2 SP3_CS1 MODE3 10*MHZ 10*MHZ +SPIDEV icm45686_2 SPI1 DEVID1 SP1_CS1 MODE3 2*MHZ 16*MHZ + +SPIDEV ramtron SPI5 DEVID1 FRAM_CS MODE3 8*MHZ 8*MHZ + +# ZeroOne X6 3 IMUs +IMU Invensensev3 SPI:icm45686_1 ROTATION_ROLL_180_YAW_270 +IMU BMI088 SPI:bmi088_a SPI:bmi088_g ROTATION_PITCH_180 +IMU Invensensev3 SPI:icm45686_2 ROTATION_NONE + +define HAL_INS_HIGHRES_SAMPLE 7 +define HAL_DEFAULT_INS_FAST_SAMPLE 7 + +# enable RAMTROM parameter storage +define HAL_STORAGE_SIZE 32768 +define HAL_WITH_RAMTRON 1 + +# allow to have have a dedicated safety switch pin +define HAL_HAVE_SAFETY_SWITCH 1 + +DMA_PRIORITY TIM5* TIM4* SPI1* SPI2* SPI3* SDMMC* USART6* ADC* UART* USART* + +# enable FAT filesystem support (needs a microSD defined via SDMMC) +define HAL_OS_FATFS_IO 1 + +ROMFS io_firmware.bin Tools/IO_Firmware/iofirmware_f103_lowpolh.bin + +# enable DFU reboot for installing bootloader +# note that if firmware is build with --secure-bl then DFU is +# disabled +ENABLE_DFU_BOOT 1 + +# build ABIN for flash-from-bootloader support: +env BUILD_ABIN True + +# enable support for dshot on iomcu +#github suggestion +ROMFS io_firmware_dshot.bin Tools/IO_Firmware/iofirmware_dshot_highpolh.bin +define HAL_WITH_IO_MCU_DSHOT 1 +#V6X +#ROMFS io_firmware_dshot.bin Tools/IO_Firmware/iofirmware_f103_dshot_lowpolh.bin +#define HAL_WITH_IO_MCU_BIDIR_DSHOT 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/ZubaxGNSS/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/ZubaxGNSS/hwdef-bl.dat index 6b74e3529f..6ac45e7d00 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/ZubaxGNSS/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/ZubaxGNSS/hwdef-bl.dat @@ -87,8 +87,6 @@ define HAL_UART_MIN_RX_SIZE 128 define HAL_UART_STACK_SIZE 256 define STORAGE_THD_WA_SIZE 512 -define HAL_NO_MONITOR_THREAD - define HAL_DEVICE_THREAD_STACK 768 define AP_PARAM_MAX_EMBEDDED_PARAM 0 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/ZubaxGNSS/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/ZubaxGNSS/hwdef.dat index 260885221c..662e6d4cc5 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/ZubaxGNSS/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/ZubaxGNSS/hwdef.dat @@ -130,9 +130,6 @@ BARO MS56XX SPI:ms5611 define HAL_BARO_ALLOW_INIT_NO_BARO - -define HAL_NO_MONITOR_THREAD - define HAL_PERIPH_ENABLE_GPS define HAL_PERIPH_ENABLE_MAG define HAL_PERIPH_ENABLE_BARO diff --git a/libraries/AP_HAL_ChibiOS/hwdef/airbotf4/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/airbotf4/hwdef.dat index f8cadff4e2..e1c7ddacac 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/airbotf4/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/airbotf4/hwdef.dat @@ -98,7 +98,8 @@ define HAL_BATT_CURR_PIN 11 define HAL_BATT_VOLT_SCALE 11 define HAL_BATT_CURR_SCALE 18.2 -define HAL_GPIO_A_LED_PIN 57 +define AP_NOTIFY_GPIO_LED_1_ENABLED 1 +define AP_NOTIFY_GPIO_LED_1_PIN 57 # 64kB FLASH_RESERVE_START_KB means we're lacking a lot of space: include ../include/minimize_features.inc diff --git a/libraries/AP_HAL_ChibiOS/hwdef/common/board.c b/libraries/AP_HAL_ChibiOS/hwdef/common/board.c index 99c48dfd6d..618fe597ac 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/common/board.c +++ b/libraries/AP_HAL_ChibiOS/hwdef/common/board.c @@ -269,6 +269,9 @@ void __early_init(void) { STM32_NOCACHE_MPU_REGION_2_SIZE | MPU_RASR_ENABLE); #endif +#if defined(DUAL_CORE) + stm32_disable_cm4_core(); // disable second core +#endif #endif } diff --git a/libraries/AP_HAL_ChibiOS/hwdef/common/chibios_board.mk b/libraries/AP_HAL_ChibiOS/hwdef/common/chibios_board.mk index 893b358f54..9d30c86701 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/common/chibios_board.mk +++ b/libraries/AP_HAL_ChibiOS/hwdef/common/chibios_board.mk @@ -9,7 +9,7 @@ ifeq ($(USE_OPT),) endif ifeq ($(ENABLE_DEBUG_SYMBOLS), yes) - USE_OPT += -g + USE_OPT += -g3 endif # C specific options here (added to USE_OPT). diff --git a/libraries/AP_HAL_ChibiOS/hwdef/common/flash.c b/libraries/AP_HAL_ChibiOS/hwdef/common/flash.c index 769eea6799..74fcd2f028 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/common/flash.c +++ b/libraries/AP_HAL_ChibiOS/hwdef/common/flash.c @@ -452,6 +452,65 @@ bool stm32_flash_ispageerased(uint32_t page) static uint32_t last_erase_ms; #endif +#if defined(STM32H7) + +/* + corrupt a flash to trigger ECC fault +*/ +void stm32_flash_corrupt(uint32_t addr) +{ + stm32_flash_unlock(); + + volatile uint32_t *CR = &FLASH->CR1; + volatile uint32_t *CCR = &FLASH->CCR1; + volatile uint32_t *SR = &FLASH->SR1; +#if STM32_FLASH_NBANKS > 1 + if (addr - STM32_FLASH_BASE >= STM32_FLASH_FIXED_PAGE_PER_BANK * STM32_FLASH_FIXED_PAGE_SIZE * 1024) { + CR = &FLASH->CR2; + CCR = &FLASH->CCR2; + SR = &FLASH->SR2; + } +#endif + stm32_flash_wait_idle(); + + *CCR = ~0; + *CR |= FLASH_CR_PG; + + for (uint32_t i=0; i<2; i++) { + while (*SR & (FLASH_SR_BSY|FLASH_SR_QW)) ; + putreg32(0xAAAA5555, addr); + if (*SR & FLASH_SR_INCERR) { + // clear the error + *SR &= ~FLASH_SR_INCERR; + } + addr += 4; + } + + *CR |= FLASH_CR_FW; // force write + stm32_flash_wait_idle(); + + for (uint32_t i=0; i<2; i++) { + while (*SR & (FLASH_SR_BSY|FLASH_SR_QW)) ; + putreg32(0x5555AAAA, addr); + if (*SR & FLASH_SR_INCERR) { + // clear the error + *SR &= ~FLASH_SR_INCERR; + } + addr += 4; + } + + *CR |= FLASH_CR_FW; // force write + stm32_flash_wait_idle(); + __DSB(); + + stm32_flash_wait_idle(); + *CCR = ~0; + *CR &= ~FLASH_CR_PG; + + stm32_flash_lock(); +} +#endif + /* erase a page */ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/common/flash.h b/libraries/AP_HAL_ChibiOS/hwdef/common/flash.h index 7ec7c17031..cbc7233aa6 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/common/flash.h +++ b/libraries/AP_HAL_ChibiOS/hwdef/common/flash.h @@ -30,6 +30,9 @@ bool stm32_flash_ispageerased(uint32_t page); void stm32_flash_protect_flash(bool bootloader, bool protect); void stm32_flash_unprotect_flash(void); void stm32_flash_set_NRST_MODE(uint8_t nrst_mode); +#if defined(STM32H7) +void stm32_flash_corrupt(uint32_t addr); +#endif #ifndef HAL_BOOTLOADER_BUILD bool stm32_flash_recent_erase(void); #endif diff --git a/libraries/AP_HAL_ChibiOS/hwdef/common/stm32_util.c b/libraries/AP_HAL_ChibiOS/hwdef/common/stm32_util.c index c91e68930f..755290b765 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/common/stm32_util.c +++ b/libraries/AP_HAL_ChibiOS/hwdef/common/stm32_util.c @@ -581,3 +581,31 @@ bool check_limit_flash_1M(void) return false; } #endif + + +#if defined(DUAL_CORE) +void stm32_disable_cm4_core() { + // Turn off second core for now + if ((FLASH->OPTSR_CUR & FLASH_OPTSR_BCM4)) { + //unlock flash + if (FLASH->OPTCR & FLASH_OPTCR_OPTLOCK) { + /* Unlock sequence */ + FLASH->OPTKEYR = 0x08192A3B; + FLASH->OPTKEYR = 0x4C5D6E7F; + } + while (FLASH->OPTSR_CUR & FLASH_OPTSR_OPT_BUSY) { + } + // disable core boot + FLASH->OPTSR_PRG &= ~FLASH_OPTSR_BCM4; + // start programming + FLASH->OPTCR |= FLASH_OPTCR_OPTSTART; + // wait for completion by checking busy bit + while (FLASH->OPTSR_CUR & FLASH_OPTSR_OPT_BUSY) { + } + // lock flash + FLASH->OPTCR |= FLASH_OPTCR_OPTLOCK; + while (FLASH->OPTSR_CUR & FLASH_OPTSR_OPT_BUSY) { + } + } +} +#endif // DUAL_CORE diff --git a/libraries/AP_HAL_ChibiOS/hwdef/common/stm32_util.h b/libraries/AP_HAL_ChibiOS/hwdef/common/stm32_util.h index 828ceed09c..7d78d41b82 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/common/stm32_util.h +++ b/libraries/AP_HAL_ChibiOS/hwdef/common/stm32_util.h @@ -191,6 +191,8 @@ extern stkalign_t __main_stack_end__; extern stkalign_t __main_thread_stack_base__; extern stkalign_t __main_thread_stack_end__; +void stm32_disable_cm4_core(void); + #ifdef __cplusplus } #endif diff --git a/libraries/AP_HAL_ChibiOS/hwdef/common/stm32h7_mcuconf.h b/libraries/AP_HAL_ChibiOS/hwdef/common/stm32h7_mcuconf.h index 3abf537e70..e615ce33ab 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/common/stm32h7_mcuconf.h +++ b/libraries/AP_HAL_ChibiOS/hwdef/common/stm32h7_mcuconf.h @@ -202,6 +202,9 @@ #if HAL_CUSTOM_MCU_CLOCKRATE == 480000000 #define STM32_PLL1_DIVN_VALUE 120 #define STM32_PLL1_DIVQ_VALUE 12 +#elif HAL_CUSTOM_MCU_CLOCKRATE == 200000000 +#define STM32_PLL1_DIVN_VALUE 50 +#define STM32_PLL1_DIVQ_VALUE 5 #else #error "Unable to configure custom clockrate" #endif diff --git a/libraries/AP_HAL_ChibiOS/hwdef/common/watchdog.c b/libraries/AP_HAL_ChibiOS/hwdef/common/watchdog.c index c1a5eeb049..689f9e4acc 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/common/watchdog.c +++ b/libraries/AP_HAL_ChibiOS/hwdef/common/watchdog.c @@ -22,6 +22,16 @@ #error "Unsupported IWDG RCC MCU config" #endif +/* + define for controlling how long the watchdog is set for. +*/ +#ifndef STM32_WDG_TIMEOUT_MS +#define STM32_WDG_TIMEOUT_MS 2048 +#endif +#if STM32_WDG_TIMEOUT_MS > 4096 || STM32_WDG_TIMEOUT_MS < 20 +#error "Watchdog timeout out of range" +#endif + /* defines for working out if the reset was from the watchdog */ @@ -68,16 +78,17 @@ static bool watchdog_enabled; */ void stm32_watchdog_init(void) { - // setup for 2s reset + // setup the watchdog timeout + // t = 4 * 2^PR * (RLR+1) / 32KHz IWDGD.KR = 0x5555; - IWDGD.PR = 2; // div16 - IWDGD.RLR = 0xFFF; + IWDGD.PR = 3; // changing this would change the definition of STM32_WDG_TIMEOUT_MS + IWDGD.RLR = STM32_WDG_TIMEOUT_MS - 1; IWDGD.KR = 0xCCCC; watchdog_enabled = true; } /* - pat the dog, to prevent a reset. If not called for 1s + pat the dog, to prevent a reset. If not called for STM32_WDG_TIMEOUT_MS after stm32_watchdog_init() then MCU will reset */ void stm32_watchdog_pat(void) diff --git a/libraries/AP_HAL_ChibiOS/hwdef/common/watchdog.h b/libraries/AP_HAL_ChibiOS/hwdef/common/watchdog.h index f015dee9c1..de8e394149 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/common/watchdog.h +++ b/libraries/AP_HAL_ChibiOS/hwdef/common/watchdog.h @@ -10,7 +10,7 @@ extern "C" { void stm32_watchdog_init(void); /* - pat the dog, to prevent a reset. If not called for 1s + pat the dog, to prevent a reset. If not called for STM32_WDG_TIMEOUT_MS after stm32_watchdog_init() then MCU will reset */ void stm32_watchdog_pat(void); diff --git a/libraries/AP_HAL_ChibiOS/hwdef/f103-periph/hwdef.inc b/libraries/AP_HAL_ChibiOS/hwdef/f103-periph/hwdef.inc index 7c076f657e..aa854499da 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/f103-periph/hwdef.inc +++ b/libraries/AP_HAL_ChibiOS/hwdef/f103-periph/hwdef.inc @@ -98,9 +98,6 @@ define HAL_UART_STACK_SIZE 256 define STORAGE_THD_WA_SIZE 300 define IO_THD_WA_SIZE 300 -define HAL_NO_MONITOR_THREAD - - # only one I2C bus I2C_ORDER I2C1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/f303-MatekGPS/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/f303-MatekGPS/hwdef.dat index eee005173a..ffb9ae90aa 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/f303-MatekGPS/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/f303-MatekGPS/hwdef.dat @@ -142,3 +142,5 @@ define GPS_MAX_RATE_MS 200 # 10" DLVR sensor by default define HAL_AIRSPEED_TYPE_DEFAULT 9 define AIRSPEED_MAX_SENSORS 1 + +define HAL_MONITOR_THREAD_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/f303-periph/hwdef.inc b/libraries/AP_HAL_ChibiOS/hwdef/f303-periph/hwdef.inc index bc022599a8..9306a674b1 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/f303-periph/hwdef.inc +++ b/libraries/AP_HAL_ChibiOS/hwdef/f303-periph/hwdef.inc @@ -122,3 +122,5 @@ env ROMFS_UNCOMPRESSED True # reduce the number of CAN RX Buffer define HAL_CAN_RX_QUEUE_SIZE 64 + +define HAL_MONITOR_THREAD_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/f405-MatekGPS/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/f405-MatekGPS/hwdef.dat index 41e003499c..e2fb65b9ee 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/f405-MatekGPS/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/f405-MatekGPS/hwdef.dat @@ -43,8 +43,6 @@ define HAL_USE_RTC FALSE define DMA_RESERVE_SIZE 0 -define HAL_NO_MONITOR_THREAD - define HAL_DEVICE_THREAD_STACK 768 # we setup a small defaults.parm diff --git a/libraries/AP_HAL_ChibiOS/hwdef/fmuv5/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/fmuv5/hwdef.dat index 3d997e9098..a40aaeda38 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/fmuv5/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/fmuv5/hwdef.dat @@ -279,9 +279,9 @@ PC6 LED_GREEN OUTPUT GPIO(91) LOW PC7 LED_BLUE OUTPUT GPIO(92) HIGH # setup for BoardLED2 +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 define HAL_GPIO_A_LED_PIN 90 define HAL_GPIO_B_LED_PIN 92 -define HAL_GPIO_LED_ON 0 # enable RAMTROM parameter storage diff --git a/libraries/AP_HAL_ChibiOS/hwdef/include/minimize_common.inc b/libraries/AP_HAL_ChibiOS/hwdef/include/minimize_common.inc index 8047ea538c..91bd8acd8b 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/include/minimize_common.inc +++ b/libraries/AP_HAL_ChibiOS/hwdef/include/minimize_common.inc @@ -101,7 +101,7 @@ define AP_LANDINGGEAR_ENABLED APM_BUILD_COPTER_OR_HELI # Plane-specific defines; these defines are only used in the Plane # directory, but are seen across the entire codebase: -define OFFBOARD_GUIDED 0 +define AP_PLANE_OFFBOARD_GUIDED_SLEW_ENABLED 0 define QAUTOTUNE_ENABLED 0 # Copter-specific defines; these defines are only used in the Copter diff --git a/libraries/AP_HAL_ChibiOS/hwdef/iomcu/hwdef.inc b/libraries/AP_HAL_ChibiOS/hwdef/iomcu/hwdef.inc index 3f6c6ad2c3..8387878750 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/iomcu/hwdef.inc +++ b/libraries/AP_HAL_ChibiOS/hwdef/iomcu/hwdef.inc @@ -108,7 +108,6 @@ define PORT_INT_REQUIRED_STACK 64 # avoid timer threads to save memory define HAL_NO_TIMER_THREAD -define HAL_NO_MONITOR_THREAD define HAL_NO_RCOUT_THREAD # also disables LED thread define AP_HAL_SHARED_DMA_ENABLED 0 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/kha_eth/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/kha_eth/hwdef.dat index b8d89d3226..408ccc13af 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/kha_eth/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/kha_eth/hwdef.dat @@ -147,4 +147,6 @@ DMA_NOSHARE USART1* USART2* CAN1* # bootloader embedding / bootloader flashing not available define AP_BOOTLOADER_FLASHING_ENABLED 0 +define HAL_MONITOR_THREAD_ENABLED 1 + AUTOBUILD_TARGETS None diff --git a/libraries/AP_HAL_ChibiOS/hwdef/luminousbee4/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/luminousbee4/hwdef.dat index 75f7ded743..5ad3981e8e 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/luminousbee4/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/luminousbee4/hwdef.dat @@ -142,16 +142,16 @@ define HAL_WITH_RAMTRON 1 define HAL_OS_FATFS_IO 1 # pixracer has 3 LEDs, Red, Green, Blue -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # LED setup for PixracerLED driver PB11 LED_RED OUTPUT GPIO(0) PB1 LED_GREEN OUTPUT GPIO(1) PB3 LED_BLUE OUTPUT GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 # enable RTSCTS define AP_FEATURE_RTSCTS 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/luminousbee5/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/luminousbee5/hwdef.dat index fe8fb67c4f..59350a97a2 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/luminousbee5/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/luminousbee5/hwdef.dat @@ -199,16 +199,16 @@ define HAL_STORAGE_SIZE 16384 define HAL_OS_FATFS_IO 1 # pixracer has 3 LEDs, Red, Green, Blue -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # LED setup for PixracerLED driver PB11 LED_RED OUTPUT GPIO(0) PB1 LED_GREEN OUTPUT GPIO(1) PB3 LED_BLUE OUTPUT GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 # battery setup define HAL_BATT_VOLT_PIN 14 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/mRo-M10095/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/mRo-M10095/hwdef.dat index 238198fad0..5345cd6617 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/mRo-M10095/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/mRo-M10095/hwdef.dat @@ -80,8 +80,6 @@ define PORT_INT_REQUIRED_STACK 64 PA11 CAN1_RX CAN1 PA12 CAN1_TX CAN1 -define HAL_NO_MONITOR_THREAD - define AP_PARAM_MAX_EMBEDDED_PARAM 512 # keep ROMFS uncompressed as we don't have enough RAM diff --git a/libraries/AP_HAL_ChibiOS/hwdef/mRoCANPWM-M10126/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/mRoCANPWM-M10126/hwdef.dat index 91b1d34330..5531a5e182 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/mRoCANPWM-M10126/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/mRoCANPWM-M10126/hwdef.dat @@ -89,3 +89,4 @@ define HAL_SERIAL_ESC_COMM_ENABLED 1 define HAL_SUPPORT_RCOUT_SERIAL 1 define HAL_WITH_ESC_TELEM 1 +define HAL_MONITOR_THREAD_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/mRoControlZeroClassic/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/mRoControlZeroClassic/hwdef.dat index 5267a4abe9..d464e38082 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/mRoControlZeroClassic/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/mRoControlZeroClassic/hwdef.dat @@ -265,16 +265,16 @@ define HAL_HAVE_SAFETY_SWITCH 1 define HAL_OS_FATFS_IO 1 # Control Zero has a TriColor LED, Red, Green, Blue -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # LED setup for PixracerLED driver PB4 LED_R OUTPUT HIGH GPIO(0) PB5 LED_G OUTPUT HIGH GPIO(1) PB3 LED_B OUTPUT HIGH GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 # 3 IMUs IMU BMI088 SPI:bmi088_a SPI:bmi088_g ROTATION_NONE diff --git a/libraries/AP_HAL_ChibiOS/hwdef/mRoControlZeroF7/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/mRoControlZeroF7/hwdef.dat index 17dfbe89dc..1a34941645 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/mRoControlZeroF7/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/mRoControlZeroF7/hwdef.dat @@ -234,16 +234,16 @@ define HAL_BATT_VOLT_SCALE 10.1 define HAL_BATT_CURR_SCALE 17.0 # Control Zero has a TriColor LED, Red, Green, Blue -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # LED setup for PixracerLED driver PB11 LED_R OUTPUT HIGH GPIO(0) PB1 LED_G OUTPUT HIGH GPIO(1) PB3 LED_B OUTPUT HIGH GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 DMA_PRIORITY SDMMC* diff --git a/libraries/AP_HAL_ChibiOS/hwdef/mRoControlZeroH7/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/mRoControlZeroH7/hwdef.dat index 68abdc7ecd..9b4e209e52 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/mRoControlZeroH7/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/mRoControlZeroH7/hwdef.dat @@ -227,16 +227,16 @@ define HAL_WITH_RAMTRON 1 define HAL_OS_FATFS_IO 1 # Control Zero has a TriColor LED, Red, Green, Blue -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # LED setup for PixracerLED driver PB11 LED_R OUTPUT HIGH GPIO(0) PB1 LED_G OUTPUT HIGH GPIO(1) PB3 LED_B OUTPUT HIGH GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 # 3 IMUs IMU BMI088 SPI:bmi088_a SPI:bmi088_g ROTATION_NONE diff --git a/libraries/AP_HAL_ChibiOS/hwdef/mRoControlZeroOEMH7/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/mRoControlZeroOEMH7/hwdef.dat index ca7a6acfb8..988d4192c2 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/mRoControlZeroOEMH7/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/mRoControlZeroOEMH7/hwdef.dat @@ -239,16 +239,16 @@ define HAL_WITH_RAMTRON 1 define HAL_OS_FATFS_IO 1 # Control Zero has a TriColor LED, Red, Green, Blue -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # LED setup for PixracerLED driver PB11 LED_R OUTPUT HIGH GPIO(0) PB1 LED_G OUTPUT HIGH GPIO(1) PB3 LED_B OUTPUT HIGH GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 # DMA_PRIORITY SDMMC* diff --git a/libraries/AP_HAL_ChibiOS/hwdef/mRoKitCANrevC/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/mRoKitCANrevC/hwdef.dat index a44f8a39f3..046df2745a 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/mRoKitCANrevC/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/mRoKitCANrevC/hwdef.dat @@ -27,4 +27,6 @@ define HAL_PERIPH_ENABLE_AIRSPEED # Safety button PC13 SAFE_BUTTON INPUT PULLUP # Button is active LOW -define HAL_SAFE_BUTTON_ON 0 \ No newline at end of file +define HAL_SAFE_BUTTON_ON 0 + +define HAL_MONITOR_THREAD_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/mRoNexus/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/mRoNexus/hwdef.dat index d5d47faaf5..b774da1c0f 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/mRoNexus/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/mRoNexus/hwdef.dat @@ -153,16 +153,16 @@ define HAL_HAVE_SAFETY_SWITCH 0 define HAL_OS_FATFS_IO 1 # Nexus has a TriColor LED like the Pixracer, Red, Green, Blue -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # LED setup for PixracerLED driver PA6 LED_R OUTPUT HIGH GPIO(0) PA7 LED_G OUTPUT HIGH GPIO(1) PB0 LED_B OUTPUT HIGH GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 # 2 IMUs (Analog Devices ADIS16470 and Invensense / TDK ICM40609D) IMU ADIS1647x SPI:adis16470 ROTATION_ROLL_180 HAL_DRDY_ADIS16470_PIN diff --git a/libraries/AP_HAL_ChibiOS/hwdef/mRoPixracerPro/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/mRoPixracerPro/hwdef.dat index 7c348d094d..276ba98223 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/mRoPixracerPro/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/mRoPixracerPro/hwdef.dat @@ -247,16 +247,16 @@ define HAL_BATT_CURR_SCALE 17.0 # define HAL_HAVE_SAFETY_SWITCH 0 # Pixracer Pro has a TriColor LED, Red, Green, Blue -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # LED setup for PixracerLED driver PB11 LED_R OUTPUT HIGH GPIO(0) PB1 LED_G OUTPUT HIGH GPIO(1) PB3 LED_B OUTPUT HIGH GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 # 3 IMUs IMU BMI088 SPI:bmi088_a SPI:bmi088_g ROTATION_NONE diff --git a/libraries/AP_HAL_ChibiOS/hwdef/mini-pix/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/mini-pix/hwdef.dat index c581f60dd5..0233c2d77b 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/mini-pix/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/mini-pix/hwdef.dat @@ -136,14 +136,14 @@ define HAL_WITH_RAMTRON 1 define HAL_OS_FATFS_IO 1 # LED setup is similar to PixRacer -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 PB1 LED_RED OUTPUT GPIO(0) PC5 LED_GREEN OUTPUT GPIO(1) PE12 LED_BLUE OUTPUT GPIO(2) -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 include ../include/minimize_features.inc diff --git a/libraries/AP_HAL_ChibiOS/hwdef/modalai_fc-v1/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/modalai_fc-v1/hwdef-bl.dat index ad8fae7466..0fa31b9c2b 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/modalai_fc-v1/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/modalai_fc-v1/hwdef-bl.dat @@ -10,8 +10,7 @@ OSCILLATOR_HZ 16000000 # board ID for firmware load APJ_BOARD_ID 41775 -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + FLASH_SIZE_KB 2048 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/modalai_fc-v1/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/modalai_fc-v1/hwdef.dat index a5d1cdbec3..06e6a353ca 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/modalai_fc-v1/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/modalai_fc-v1/hwdef.dat @@ -258,10 +258,10 @@ PA2 LED_BLUE_2 OUTPUT OPENDRAIN LOW GPIO(94) PH11 LED_GREEN_2 OUTPUT OPENDRAIN LOW GPIO(95) # setup for BoardLED2 +define AP_NOTIFY_GPIO_LED_3_ENABLED 1 define HAL_GPIO_A_LED_PIN 90 define HAL_GPIO_B_LED_PIN 92 define HAL_GPIO_C_LED_PIN 91 -define HAL_GPIO_LED_ON 0 # enable RAMTROM parameter storage define HAL_STORAGE_SIZE 32768 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/omnibusf4pro/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/omnibusf4pro/hwdef.dat index df870671bd..c373e192df 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/omnibusf4pro/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/omnibusf4pro/hwdef.dat @@ -86,6 +86,7 @@ PC12 SPI3_MOSI SPI3 PC11 SPI3_MISO SPI3 PC10 SPI3_SCK SPI3 +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 PB5 LED_BLUE OUTPUT LOW GPIO(1) define HAL_GPIO_A_LED_PIN 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/omnibusf4v6/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/omnibusf4v6/hwdef.dat index 4bdd5e91d8..946c15584d 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/omnibusf4v6/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/omnibusf4v6/hwdef.dat @@ -142,7 +142,8 @@ define HAL_BATT_CURR_SCALE 18.2 #PA0 - ADC123_CH0 define BOARD_RSSI_ANA_PIN 0 -define HAL_GPIO_A_LED_PIN 41 +define AP_NOTIFY_GPIO_LED_1_ENABLED 1 +define AP_NOTIFY_GPIO_LED_1_PIN 41 define OSD_ENABLED 1 #font for the osd diff --git a/libraries/AP_HAL_ChibiOS/hwdef/rFCU/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/rFCU/hwdef.dat index b1a4afa460..48239bea3c 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/rFCU/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/rFCU/hwdef.dat @@ -280,14 +280,14 @@ PI5 LED_R1 OUTPUT HIGH GPIO(0) # red PI6 LED_G1 OUTPUT LOW GPIO(1) # green PI7 LED_B1 OUTPUT HIGH GPIO(2) # blue -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 define HAL_GPIO_LED_ON 1 # use pixracer style 3-LED indicators -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # enable RAMTROM parameter storage define HAL_STORAGE_SIZE 32768 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/rGNSS/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/rGNSS/hwdef.dat index 9d4522f4df..f8a442c258 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/rGNSS/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/rGNSS/hwdef.dat @@ -36,13 +36,13 @@ PA2 LED_GREEN OUTPUT LOW GPIO(1) PA1 LED_BLUE OUTPUT LOW GPIO(2) PA3 LED_SAFETY OUTPUT LOW -define HAL_GPIO_A_LED_PIN 0 -define HAL_GPIO_B_LED_PIN 1 -define HAL_GPIO_C_LED_PIN 2 +define AP_NOTIFY_GPIO_LED_RGB_RED_PIN 0 +define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN 1 +define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN 2 define HAL_GPIO_LED_ON 1 -define HAL_HAVE_PIXRACER_LED +define AP_NOTIFY_GPIO_LED_RGB_ENABLED 1 # USART2, GPS PB3 USART2_TX USART2 @@ -100,8 +100,6 @@ PA11 CAN1_RX CAN1 PA12 CAN1_TX CAN1 PA15 GPIO_CAN1_SILENT OUTPUT PUSHPULL SPEED_LOW LOW -define HAL_NO_MONITOR_THREAD - define HAL_DEVICE_THREAD_STACK 768 # we setup a small defaults.parm diff --git a/libraries/AP_HAL_ChibiOS/hwdef/scripts/chibios_hwdef.py b/libraries/AP_HAL_ChibiOS/hwdef/scripts/chibios_hwdef.py index 9b3884f229..60601755d5 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/scripts/chibios_hwdef.py +++ b/libraries/AP_HAL_ChibiOS/hwdef/scripts/chibios_hwdef.py @@ -18,6 +18,12 @@ import shutil import filecmp +class ChibiOSHWDefIncludeNotFoundException(Exception): + def __init__(self, hwdef, includer): + self.hwdef = hwdef + self.includer = includer + + class ChibiOSHWDef(object): # output variables for each pin @@ -32,6 +38,7 @@ class ChibiOSHWDef(object): self.signed_fw = signed_fw self.default_params_filepath = default_params_filepath self.quiet = quiet + self.have_defaults_file = False # if true then parameters will be appended in special apj-tool # section at end of binary: @@ -189,9 +196,9 @@ class ChibiOSHWDef(object): return 0 return None - if function and function.endswith("_RTS") and ( + if function and (function.endswith("_RTS") or function.endswith("_CTS_GPIO")) and ( function.startswith('USART') or function.startswith('UART')): - # we do software RTS + # we do software RTS and can do either software CTS or hardware CTS return None for label in self.af_labels: @@ -758,7 +765,7 @@ class ChibiOSHWDef(object): def has_sdcard_spi(self): '''check for sdcard connected to spi bus''' for dev in self.spidev: - if(dev[0] == 'sdcard'): + if dev[0] == 'sdcard': return True return False @@ -1260,7 +1267,12 @@ class ChibiOSHWDef(object): #endif #define STM32_FLASH_DISABLE_ISR 0 ''') - if not self.env_vars['EXT_FLASH_SIZE_MB'] and not args.signed_fw: + # get bootloader flash space, if larger than 128k we can enable Heap + flash_size = self.get_config('FLASH_USE_MAX_KB', type=int, default=0) + if flash_size == 0: + flash_size = self.get_config('FLASH_SIZE_KB', type=int) + flash_length = min(flash_size, self.get_config('FLASH_BOOTLOADER_LOAD_KB', type=int)) + if not self.env_vars['EXT_FLASH_SIZE_MB'] and not args.signed_fw and flash_length < 128: f.write(''' #ifndef CH_CFG_USE_MEMCORE #define CH_CFG_USE_MEMCORE FALSE @@ -1860,6 +1872,7 @@ INCLUDE common.ld OTG2_index = None devlist = [] have_rts_cts = False + have_low_noise = False crash_uart = None # write config for CrashCatcher UART @@ -1873,6 +1886,14 @@ INCLUDE common.ld f.write('#define IRQ_DISABLE_HAL_CRASH_SERIAL_PORT() nvicDisableVector(STM32_%s_NUMBER)\n' % crash_uart) f.write('#define RCC_RESET_HAL_CRASH_SERIAL_PORT() rccReset%s(); rccEnable%s(true)\n' % (crash_uart, crash_uart)) f.write('#define HAL_CRASH_SERIAL_PORT_CLOCK STM32_%sCLK\n' % crash_uart) + # check if we have a UART with a low noise RX pin + for num, dev in enumerate(serial_list): + if not dev.startswith('UART') and not dev.startswith('USART'): + continue + rx_port = dev + '_RX' + if rx_port in self.bylabel and self.bylabel[rx_port].has_extra('LOW_NOISE'): + have_low_noise = True + break for num, dev in enumerate(serial_list): if dev.startswith('UART'): n = int(dev[4:]) @@ -1891,18 +1912,28 @@ INCLUDE common.ld rts_line_name = dev + '_RTS' rts_line = self.make_line(rts_line_name) cts_line = self.make_line(dev + '_CTS') + if cts_line == "0": + cts_line = self.make_line(dev + '_CTS_GPIO') if rts_line != "0": have_rts_cts = True f.write('#define HAL_HAVE_RTSCTS_SERIAL%u\n' % num) if dev.startswith('OTG2'): f.write( - '#define HAL_%s_CONFIG {(BaseSequentialStream*) &SDU2, 2, true, false, 0, 0, false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, UINT8_MAX}\n' % dev) # noqa + '#define HAL_%s_CONFIG {(BaseSequentialStream*) &SDU2, 2, true, false, 0, 0, false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, UINT8_MAX,' % dev) # noqa + if have_low_noise: + f.write('false}\n') + else: + f.write('}\n') OTG2_index = serial_list.index(dev) self.dual_USB_enabled = True elif dev.startswith('OTG'): f.write( - '#define HAL_%s_CONFIG {(BaseSequentialStream*) &SDU1, 1, true, false, 0, 0, false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, UINT8_MAX}\n' % dev) # noqa + '#define HAL_%s_CONFIG {(BaseSequentialStream*) &SDU1, 1, true, false, 0, 0, false, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, UINT8_MAX,' % dev) # noqa + if have_low_noise: + f.write('false}\n') + else: + f.write('}\n') else: need_uart_driver = True f.write( @@ -1921,11 +1952,13 @@ INCLUDE common.ld f.write("%s, " % self.get_extra_bylabel(dev + "_TXINV", "POL", "0")) # USB endpoint ID, not used - f.write("0, ") + f.write("0, ") # Find and add RTS alt fuction number if avalable def get_RTS_alt_function(): - # Typicaly we do software RTS control, so there is no requirement for the pin to have valid UART RTS alternative function + # Typicaly we do software RTS control, so there is + # no requirement for the pin to have valid UART + # RTS alternative function # If it does this enables hardware flow control for RS-485 lib = self.get_mcu_lib(self.mcu_type) if (rts_line == "0") or (rts_line_name not in self.bylabel) or not hasattr(lib, "AltFunction_map"): @@ -1939,9 +1972,17 @@ INCLUDE common.ld if s not in lib.AltFunction_map: return "UINT8_MAX" return lib.AltFunction_map[s] + if have_low_noise: + low_noise = 'false' + rx_port = dev + '_RX' + if rx_port in self.bylabel and self.bylabel[rx_port].has_extra('LOW_NOISE'): + low_noise = 'true' + f.write("%s, %s}\n" % (get_RTS_alt_function(), low_noise)) + else: + f.write("%s}\n" % get_RTS_alt_function()) - f.write("%s}\n" % get_RTS_alt_function()) - + if have_low_noise: + f.write('#define HAL_HAVE_LOW_NOISE_UART 1\n') if have_rts_cts: f.write('#define AP_FEATURE_RTSCTS 1\n') if OTG2_index is not None: @@ -2533,7 +2574,7 @@ Please run: Tools/scripts/build_bootloaders.py %s f = open(hwdat, 'w') f.write('\n'.join(self.all_lines)) f.close() - if not self.is_periph_fw(): + if not self.is_periph_fw() and not os.getenv("NO_ROMFS_HWDEF", False): self.romfs["hwdef.dat"] = hwdat def write_defaulting_define(self, f, name, value): @@ -2604,6 +2645,13 @@ Please run: Tools/scripts/build_bootloaders.py %s self.write_board_validate_macro(f) self.write_check_firmware(f) + if self.have_defaults_file: + f.write(''' +#ifndef AP_FILESYSTEM_ROMFS_ENABLED +#define AP_FILESYSTEM_ROMFS_ENABLED 1 +#endif +''') + self.write_peripheral_enable(f) if os.path.exists(self.processed_defaults_filepath()): @@ -2927,12 +2975,12 @@ Please run: Tools/scripts/build_bootloaders.py %s if ptype == 'OUTPUT' and re.match(r'US?ART\d+_(TXINV|RXINV)', label): return True m1 = re.match(r'USART(\d+)', ptype) - m2 = re.match(r'USART(\d+)_(RX|TX|CTS|RTS)', label) + m2 = re.match(r'USART(\d+)_(RX|TX|CTS|RTS|CTS_GPIO)', label) if (m1 and not m2) or (m2 and not m1) or (m1 and m1.group(1) != m2.group(1)): '''usart numbers need to match''' return False m1 = re.match(r'UART(\d+)', ptype) - m2 = re.match(r'UART(\d+)_(RX|TX|CTS|RTS)', label) + m2 = re.match(r'UART(\d+)_(RX|TX|CTS|RTS|CTS_GPIO)', label) if (m1 and not m2) or (m2 and not m1) or (m1 and m1.group(1) != m2.group(1)): '''uart numbers need to match''' return False @@ -3158,8 +3206,13 @@ Please run: Tools/scripts/build_bootloaders.py %s self.add_firmware_defaults_from_file(f, "defaults_iofirmware.h", "IOMCU Firmware") - def is_periph_fw_unprocessed_file(self, hwdef): + def is_periph_fw_unprocessed_file(self, hwdef, includer=None): '''helper/recursion function for is_periph_fw_unprocessed''' + if not os.path.exists(hwdef): + raise ChibiOSHWDefIncludeNotFoundException( + os.path.normpath(hwdef), + os.path.normpath(includer) + ) with open(hwdef, "r") as f: content = f.read() if 'AP_PERIPH' in content: @@ -3167,7 +3220,7 @@ Please run: Tools/scripts/build_bootloaders.py %s # process any include lines: for m in re.finditer(r"^include\s+([^\s]*)", content, re.MULTILINE): include_path = os.path.join(os.path.dirname(hwdef), m.group(1)) - if self.is_periph_fw_unprocessed_file(include_path): + if self.is_periph_fw_unprocessed_file(include_path, includer=hwdef): return True def is_periph_fw_unprocessed(self): @@ -3232,6 +3285,7 @@ Please run: Tools/scripts/build_bootloaders.py %s return self.romfs_add('defaults.parm', filepath) + self.have_defaults_file = True def process_hwdefs(self): for fname in self.hwdef: diff --git a/libraries/AP_HAL_ChibiOS/hwdef/scripts/convert_betaflight_unified.py b/libraries/AP_HAL_ChibiOS/hwdef/scripts/convert_betaflight_unified.py index ba4ad7e091..29ef61b983 100755 --- a/libraries/AP_HAL_ChibiOS/hwdef/scripts/convert_betaflight_unified.py +++ b/libraries/AP_HAL_ChibiOS/hwdef/scripts/convert_betaflight_unified.py @@ -255,14 +255,20 @@ define STORAGE_FLASH_PAGE 1 if (spin != int(spi[0])): spin = int(spi[0]) f.write("\n# SPI%s\n" % spin) - f.write("%s SPI%s_%s SPI%s\n" % (spi[1], spin, spi[3].split('_')[1], spin)) + fn = spi[3].split('_')[1] + if fn == "SDI": + fn = "MISO" + elif fn == "SDO": + fn = "MOSI" + f.write("%s SPI%s_%s SPI%s\n" % (spi[1], spin, fn, spin)) f.write("\n# Chip select pins\n") for cs in chip_select.values(): f.write("%s %s%s_CS CS\n" % (cs[1], cs[2], int(cs[0]))) - beeper = list(functions["BEEPER"].values())[0] - f.write('''\n# Beeper + if len(functions["BEEPER"].values()) > 0: + beeper = list(functions["BEEPER"].values())[0] + f.write('''\n# Beeper %s BUZZER OUTPUT GPIO(80) LOW define HAL_BUZZER_PIN 80 ''' % beeper[1]) diff --git a/libraries/AP_HAL_ChibiOS/hwdef/scripts/defaults_iofirmware.h b/libraries/AP_HAL_ChibiOS/hwdef/scripts/defaults_iofirmware.h index 64e913c6f6..bdb08a7310 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/scripts/defaults_iofirmware.h +++ b/libraries/AP_HAL_ChibiOS/hwdef/scripts/defaults_iofirmware.h @@ -69,3 +69,7 @@ #ifndef HAL_SCHEDULER_LOOP_DELAY_ENABLED #define HAL_SCHEDULER_LOOP_DELAY_ENABLED 0 #endif + +#ifndef HAL_MONITOR_THREAD_ENABLED +#define HAL_MONITOR_THREAD_ENABLED 0 +#endif diff --git a/libraries/AP_HAL_ChibiOS/hwdef/scripts/defaults_periph.h b/libraries/AP_HAL_ChibiOS/hwdef/scripts/defaults_periph.h index b2dc383b55..77dd2b5262 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/scripts/defaults_periph.h +++ b/libraries/AP_HAL_ChibiOS/hwdef/scripts/defaults_periph.h @@ -325,6 +325,10 @@ #define HAL_RCIN_THREAD_ENABLED 0 #endif +#ifndef HAL_MONITOR_THREAD_ENABLED +#define HAL_MONITOR_THREAD_ENABLED 0 +#endif + #ifndef HAL_SCHEDULER_LOOP_DELAY_ENABLED #define HAL_SCHEDULER_LOOP_DELAY_ENABLED 0 #endif @@ -342,6 +346,7 @@ #define AP_COMPASS_ENABLED defined(HAL_PERIPH_ENABLE_MAG) #define AP_BARO_ENABLED defined(HAL_PERIPH_ENABLE_BARO) #define AP_GPS_ENABLED defined(HAL_PERIPH_ENABLE_GPS) +#define AP_RANGEFINDER_ENABLED defined(HAL_PERIPH_ENABLE_RANGEFINDER) #define AP_RPM_ENABLED defined(HAL_PERIPH_ENABLE_RPM) #define AP_RCPROTOCOL_ENABLED defined(HAL_PERIPH_ENABLE_RCIN) #define AP_RTC_ENABLED defined(HAL_PERIPH_ENABLE_RTC) diff --git a/libraries/AP_HAL_ChibiOS/hwdef/skyviper-v2450/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/skyviper-v2450/hwdef.dat index 0bba9c42cd..2228c11534 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/skyviper-v2450/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/skyviper-v2450/hwdef.dat @@ -131,8 +131,9 @@ define BARO_MAX_INSTANCES 1 define INS_MAX_INSTANCES 1 # SkyViper doesn't have any rangefinder, but might get mavlink? +define AP_RANGEFINDER_ENABLED 1 define AP_RANGEFINDER_BACKEND_DEFAULT_ENABLED 0 -define AP_RANGEFINDER_MAVLINK_ENABLED 1 +define AP_RANGEFINDER_MAVLINK_ENABLED AP_RANGEFINDER_ENABLED # SkyViper doesn't have RPM sensors: define AP_RPM_ENABLED 0 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/sparky2/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/sparky2/hwdef.dat index 2f03aa1ac7..8f4a3e4809 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/sparky2/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/sparky2/hwdef.dat @@ -24,6 +24,7 @@ PB5 LED_BLUE OUTPUT LOW GPIO(0) PB6 LED_YELLOW OUTPUT LOW GPIO(1) # optional PB4 LED_RED OUTPUT LOW GPIO(2) +define AP_NOTIFY_GPIO_LED_3_ENABLED 1 define HAL_GPIO_A_LED_PIN 0 define HAL_GPIO_B_LED_PIN 1 define HAL_GPIO_C_LED_PIN 2 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/speedybeef4/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/speedybeef4/hwdef.dat index d22798c436..07010b0ad6 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/speedybeef4/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/speedybeef4/hwdef.dat @@ -27,6 +27,7 @@ SERIAL_ORDER OTG1 USART1 UART4 USART3 UART5 PB9 LED_BLUE OUTPUT LOW GPIO(0) PA14 LED_GREEN OUTPUT LOW GPIO(1) +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 define HAL_GPIO_A_LED_PIN 0 define HAL_GPIO_B_LED_PIN 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/speedybeef4v3/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/speedybeef4v3/hwdef-bl.dat index 658ee1b32f..b1fd316c40 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/speedybeef4v3/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/speedybeef4v3/hwdef-bl.dat @@ -31,8 +31,6 @@ SERIAL_ORDER OTG1 PA11 OTG_FS_DM OTG1 PA12 OTG_FS_DP OTG1 -DEFAULTGPIO OUTPUT LOW PULLDOWN - # Add CS pins to ensure they are high in bootloader PA4 MPU6000_CS CS PB12 MAX7456_CS CS diff --git a/libraries/AP_HAL_ChibiOS/hwdef/speedybeef4v3/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/speedybeef4v3/hwdef.dat index f313a8b83f..752745b392 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/speedybeef4v3/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/speedybeef4v3/hwdef.dat @@ -24,7 +24,8 @@ SERIAL_ORDER OTG1 USART1 USART2 USART3 UART4 UART5 USART6 # LEDs PC8 LED_BLUE OUTPUT LOW GPIO(0) -define HAL_GPIO_A_LED_PIN 0 +define AP_NOTIFY_GPIO_LED_1_ENABLED 1 +define AP_NOTIFY_GPIO_LED_1_PIN 0 # buzzer PC5 BUZZER OUTPUT GPIO(80) LOW diff --git a/libraries/AP_HAL_ChibiOS/hwdef/speedybeef4v4/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/speedybeef4v4/hwdef-bl.dat index 743300b3b8..e392dc6199 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/speedybeef4v4/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/speedybeef4v4/hwdef-bl.dat @@ -30,8 +30,7 @@ PA12 OTG_FS_DP OTG1 PA13 JTMS-SWDIO SWD PA14 JTCK-SWCLK SWD -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + # Chip select pins diff --git a/libraries/AP_HAL_ChibiOS/hwdef/speedybeef4v4/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/speedybeef4v4/hwdef.dat index a70e3b80e8..80e58d65d9 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/speedybeef4v4/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/speedybeef4v4/hwdef.dat @@ -121,8 +121,9 @@ PA15 TIM2_CH1 TIM2 PWM(8) GPIO(57) # M8 # LEDs PA8 TIM1_CH1 TIM1 PWM(9) GPIO(58) # M9 +define AP_NOTIFY_GPIO_LED_1_ENABLED 1 PC13 LED0 OUTPUT LOW GPIO(90) -define HAL_GPIO_A_LED_PIN 90 +define AP_NOTIFY_GPIO_LED_1_PIN 90 # OSD setup SPIDEV osd SPI2 DEVID1 OSD1_CS MODE0 10*MHZ 10*MHZ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/sw-boom-f407/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/sw-boom-f407/hwdef.dat index 544340b49f..9b90331d95 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/sw-boom-f407/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/sw-boom-f407/hwdef.dat @@ -115,5 +115,7 @@ define AP_TEMPERATURE_SENSOR_MAX_INSTANCES 1 define AP_SCRIPTING_ENABLED 1 define AP_FILESYSTEM_ROMFS_ENABLED 1 +define HAL_MONITOR_THREAD_ENABLED 1 + # don't build on firmware.ardupilot.org AUTOBUILD_TARGETS None diff --git a/libraries/AP_HAL_ChibiOS/hwdef/sw-nav-f405/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/sw-nav-f405/hwdef.dat index 22caeff548..18e17fe682 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/sw-nav-f405/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/sw-nav-f405/hwdef.dat @@ -81,6 +81,7 @@ define DISCRETE_RGB_POLARITY true define HAL_RCIN_THREAD_ENABLED 1 define HAL_SCHEDULER_LOOP_DELAY_ENABLED 1 +define HAL_MONITOR_THREAD_ENABLED 1 # don't build on firmware.ardupilot.org AUTOBUILD_TARGETS None diff --git a/libraries/AP_HAL_ChibiOS/hwdef/sw-spar-f407/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/sw-spar-f407/hwdef.dat index da4d3c3340..0e1a5844dd 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/sw-spar-f407/hwdef.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/sw-spar-f407/hwdef.dat @@ -126,3 +126,4 @@ AUTOBUILD_TARGETS None define HAL_SERIAL_ESC_COMM_ENABLED 1 define HAL_RCIN_THREAD_ENABLED 1 define HAL_SCHEDULER_LOOP_DELAY_ENABLED 1 +define HAL_MONITOR_THREAD_ENABLED 1 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/thepeach-k1/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/thepeach-k1/hwdef-bl.dat index b88c8ea999..7891eecab2 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/thepeach-k1/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/thepeach-k1/hwdef-bl.dat @@ -77,5 +77,4 @@ PC15 ICM20602_CS CS PD7 MS5611_CS CS PD10 FRAM_CS CS SPEED_VERYLOW -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + diff --git a/libraries/AP_HAL_ChibiOS/hwdef/thepeach-r1/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/thepeach-r1/hwdef-bl.dat index 6e85b46109..23bf5178fb 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/thepeach-r1/hwdef-bl.dat +++ b/libraries/AP_HAL_ChibiOS/hwdef/thepeach-r1/hwdef-bl.dat @@ -77,5 +77,4 @@ PC15 ICM20602_CS CS PD7 MS5611_CS CS PD10 FRAM_CS CS SPEED_VERYLOW -# default to all pins low to avoid ESD issues -DEFAULTGPIO OUTPUT LOW PULLDOWN + diff --git a/libraries/AP_HAL_ESP32/RCInput.cpp b/libraries/AP_HAL_ESP32/RCInput.cpp index 704877962d..2588f103f7 100644 --- a/libraries/AP_HAL_ESP32/RCInput.cpp +++ b/libraries/AP_HAL_ESP32/RCInput.cpp @@ -121,7 +121,7 @@ void RCInput::_timer_tick(void) #ifndef HAL_NO_UARTDRIVER if (rc_protocol && rc_protocol != last_protocol) { last_protocol = rc_protocol; - gcs().send_text(MAV_SEVERITY_DEBUG, "RCInput: decoding %s", last_protocol); + GCS_SEND_TEXT(MAV_SEVERITY_DEBUG, "RCInput: decoding %s", last_protocol); } #endif diff --git a/libraries/AP_HAL_ESP32/Util.cpp b/libraries/AP_HAL_ESP32/Util.cpp index d232ff8907..c5d6838668 100644 --- a/libraries/AP_HAL_ESP32/Util.cpp +++ b/libraries/AP_HAL_ESP32/Util.cpp @@ -90,7 +90,7 @@ void Util::free_type(void *ptr, size_t size, AP_HAL::Util::Memory_Type mem_type) } -#ifdef ENABLE_HEAP +#if ENABLE_HEAP void *Util::allocate_heap_memory(size_t size) { @@ -200,7 +200,7 @@ uint64_t Util::get_hw_rtc() const #define Debug(fmt, args ...) do { hal.console->printf(fmt, ## args); } while (0) #else #include -#define Debug(fmt, args ...) do { gcs().send_text(MAV_SEVERITY_INFO, fmt, ## args); } while (0) +#define Debug(fmt, args ...) do { GCS_SEND_TEXT(MAV_SEVERITY_INFO, fmt, ## args); } while (0) #endif Util::FlashBootloader Util::flash_bootloader() @@ -243,15 +243,13 @@ bool Util::get_system_id(char buf[50]) bool Util::get_system_id_unformatted(uint8_t buf[], uint8_t &len) { - len = MIN(12, len); - - uint8_t base_mac_addr[6] = {0}; esp_err_t ret = esp_efuse_mac_get_custom(base_mac_addr); if (ret != ESP_OK) { ret = esp_efuse_mac_get_default(base_mac_addr); } + len = MIN(len, ARRAY_SIZE(base_mac_addr)); memcpy(buf, (const void *)base_mac_addr, len); return true; diff --git a/libraries/AP_HAL_ESP32/Util.h b/libraries/AP_HAL_ESP32/Util.h index 3360e1ad5a..8e9ba9dc94 100644 --- a/libraries/AP_HAL_ESP32/Util.h +++ b/libraries/AP_HAL_ESP32/Util.h @@ -28,17 +28,13 @@ public: return static_cast(util); } - bool run_debug_shell(AP_HAL::BetterStream *stream) override - { - return false; - } uint32_t available_memory() override; // Special Allocation Routines void *malloc_type(size_t size, AP_HAL::Util::Memory_Type mem_type) override; void free_type(void *ptr, size_t size, AP_HAL::Util::Memory_Type mem_type) override; -#ifdef ENABLE_HEAP +#if ENABLE_HEAP // heap functions, note that a heap once alloc'd cannot be dealloc'd virtual void *allocate_heap_memory(size_t size) override; virtual void *heap_realloc(void *heap, void *ptr, size_t old_size, size_t new_size) override; @@ -89,7 +85,7 @@ private: FlashBootloader flash_bootloader() override; #endif -#ifdef ENABLE_HEAP +#if ENABLE_HEAP // static memory_heap_t scripting_heap; #endif // ENABLE_HEAP diff --git a/libraries/AP_HAL_Empty/Util.h b/libraries/AP_HAL_Empty/Util.h index 3dae90c2f8..55e590a20e 100644 --- a/libraries/AP_HAL_Empty/Util.h +++ b/libraries/AP_HAL_Empty/Util.h @@ -4,6 +4,4 @@ #include "AP_HAL_Empty_Namespace.h" class Empty::Util : public AP_HAL::Util { -public: - bool run_debug_shell(AP_HAL::BetterStream *stream) override { return false; } }; diff --git a/libraries/AP_HAL_Linux/CANSocketIface.cpp b/libraries/AP_HAL_Linux/CANSocketIface.cpp index 05a02280ce..b295c69077 100644 --- a/libraries/AP_HAL_Linux/CANSocketIface.cpp +++ b/libraries/AP_HAL_Linux/CANSocketIface.cpp @@ -34,6 +34,7 @@ #include #include +#include #include #include #include diff --git a/libraries/AP_HAL_Linux/I2CDevice.cpp b/libraries/AP_HAL_Linux/I2CDevice.cpp index b441dbd032..0418e2fcc9 100644 --- a/libraries/AP_HAL_Linux/I2CDevice.cpp +++ b/libraries/AP_HAL_Linux/I2CDevice.cpp @@ -280,67 +280,6 @@ I2CDeviceManager::I2CDeviceManager() _buses.reserve(4); } -AP_HAL::OwnPtr -I2CDeviceManager::get_device(std::vector devpaths, uint8_t address) -{ - const char *dirname = "/sys/class/i2c-dev/"; - struct dirent *de = nullptr; - DIR *d; - - d = opendir(dirname); - if (!d) { - AP_HAL::panic("Could not get list of I2C buses"); - } - - for (de = readdir(d); de; de = readdir(d)) { - char *str_device, *abs_str_device; - const char *p; - - if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0) { - continue; - } - - if (asprintf(&str_device, "%s/%s", dirname, de->d_name) < 0) { - continue; - } - - abs_str_device = realpath(str_device, nullptr); - if (!abs_str_device || !(p = startswith(abs_str_device, "/sys/devices/"))) { - free(abs_str_device); - free(str_device); - continue; - } - - auto t = std::find_if(std::begin(devpaths), std::end(devpaths), - [p](const char *prefix) { - return startswith(p, prefix) != nullptr; - }); - - free(abs_str_device); - free(str_device); - - if (t != std::end(devpaths)) { - unsigned int n; - - /* Found the bus, try to create the device now */ - if (sscanf(de->d_name, "i2c-%u", &n) != 1) { - AP_HAL::panic("I2CDevice: can't parse %s", de->d_name); - } - if (n > UINT8_MAX) { - AP_HAL::panic("I2CDevice: bus with number n=%u higher than %u", - n, UINT8_MAX); - } - - closedir(d); - return get_device(n, address); - } - } - - /* not found */ - closedir(d); - return nullptr; -} - AP_HAL::OwnPtr I2CDeviceManager::get_device(uint8_t bus, uint8_t address, uint32_t bus_clock, diff --git a/libraries/AP_HAL_Linux/I2CDevice.h b/libraries/AP_HAL_Linux/I2CDevice.h index d26d5860e1..92c57c2534 100644 --- a/libraries/AP_HAL_Linux/I2CDevice.h +++ b/libraries/AP_HAL_Linux/I2CDevice.h @@ -94,9 +94,6 @@ public: I2CDeviceManager(); - AP_HAL::OwnPtr get_device( - std::vector devpaths, uint8_t address) override; - /* AP_HAL::I2CDeviceManager implementation */ AP_HAL::OwnPtr get_device(uint8_t bus, uint8_t address, uint32_t bus_clock=400000, diff --git a/libraries/AP_HAL_Linux/Util.cpp b/libraries/AP_HAL_Linux/Util.cpp index bfceab6dcd..d25bc87a3d 100644 --- a/libraries/AP_HAL_Linux/Util.cpp +++ b/libraries/AP_HAL_Linux/Util.cpp @@ -241,7 +241,7 @@ int Util::get_hw_arm32() return -ENOENT; } -#ifdef ENABLE_HEAP +#if ENABLE_HEAP void *Util::allocate_heap_memory(size_t size) { struct heap *new_heap = (struct heap*)malloc(sizeof(struct heap)); diff --git a/libraries/AP_HAL_Linux/Util.h b/libraries/AP_HAL_Linux/Util.h index 9aa0a82314..11a29dacb3 100644 --- a/libraries/AP_HAL_Linux/Util.h +++ b/libraries/AP_HAL_Linux/Util.h @@ -29,7 +29,6 @@ public: } void init(int argc, char *const *argv); - bool run_debug_shell(AP_HAL::BetterStream *stream) override { return false; } /** return commandline arguments, if available @@ -72,7 +71,7 @@ public: bool get_system_id(char buf[50]) override; bool get_system_id_unformatted(uint8_t buf[], uint8_t &len) override; -#ifdef ENABLE_HEAP +#if ENABLE_HEAP // heap functions, note that a heap once alloc'd cannot be dealloc'd virtual void *allocate_heap_memory(size_t size) override; virtual void *heap_realloc(void *h, void *ptr, size_t old_size, size_t new_size) override; @@ -117,7 +116,7 @@ private: const char *custom_defaults = HAL_PARAM_DEFAULTS_PATH; static const char *_hw_names[UTIL_NUM_HARDWARES]; -#ifdef ENABLE_HEAP +#if ENABLE_HEAP struct heap_allocation_header { size_t allocation_size; // size of allocated block, not including this header }; diff --git a/libraries/AP_HAL_Linux/VideoIn.h b/libraries/AP_HAL_Linux/VideoIn.h index ed4fd90180..2f2652f3f1 100644 --- a/libraries/AP_HAL_Linux/VideoIn.h +++ b/libraries/AP_HAL_Linux/VideoIn.h @@ -15,6 +15,7 @@ #pragma once #include "AP_HAL_Linux.h" +#include #include #include diff --git a/libraries/AP_HAL_QURT/AP_HAL_QURT.h b/libraries/AP_HAL_QURT/AP_HAL_QURT.h new file mode 100644 index 0000000000..2c753c203d --- /dev/null +++ b/libraries/AP_HAL_QURT/AP_HAL_QURT.h @@ -0,0 +1,25 @@ +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ +#pragma once + +/* Your layer exports should depend on AP_HAL.h ONLY. */ +#include + +#if CONFIG_HAL_BOARD == HAL_BOARD_QURT + +#include "HAL_QURT_Class.h" +#include "AP_HAL_QURT_Main.h" + +#endif // CONFIG_HAL_BOARD diff --git a/libraries/AP_HAL_QURT/AP_HAL_QURT_Main.h b/libraries/AP_HAL_QURT/AP_HAL_QURT_Main.h new file mode 100644 index 0000000000..5bb282c3f0 --- /dev/null +++ b/libraries/AP_HAL_QURT/AP_HAL_QURT_Main.h @@ -0,0 +1,18 @@ +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ +#pragma once + +#define AP_MAIN qurt_ardupilot_main + diff --git a/libraries/AP_HAL_QURT/AP_HAL_QURT_Namespace.h b/libraries/AP_HAL_QURT/AP_HAL_QURT_Namespace.h new file mode 100644 index 0000000000..6ddfdb7142 --- /dev/null +++ b/libraries/AP_HAL_QURT/AP_HAL_QURT_Namespace.h @@ -0,0 +1,35 @@ +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#pragma once + +namespace QURT +{ +class UARTDriver; +class UARTDriver_Console; +class UARTDriver_MAVLinkUDP; +class UARTDriver_Local; +class UDPDriver; +class Util; +class Scheduler; +class Storage; +class Util; +class Semaphore; +class RCInput; +class RCOutput; +class AnalogSource; +class AnalogIn; +} + diff --git a/libraries/AP_HAL_QURT/AP_HAL_QURT_Private.h b/libraries/AP_HAL_QURT/AP_HAL_QURT_Private.h new file mode 100644 index 0000000000..95a6b97003 --- /dev/null +++ b/libraries/AP_HAL_QURT/AP_HAL_QURT_Private.h @@ -0,0 +1,22 @@ +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ +#pragma once + +/* Umbrella header for all private headers of the AP_HAL_QURT module. + * Only import this header from inside AP_HAL_QURT + */ + +#include "UARTDriver.h" +#include "Util.h" diff --git a/libraries/AP_HAL_QURT/AnalogIn.cpp b/libraries/AP_HAL_QURT/AnalogIn.cpp new file mode 100644 index 0000000000..88e051a52d --- /dev/null +++ b/libraries/AP_HAL_QURT/AnalogIn.cpp @@ -0,0 +1,80 @@ +#include "AnalogIn.h" +#include "RCOutput.h" + +using namespace QURT; + +#define ANALOG_PIN_VOLTAGE 1 +#define ANALOG_PIN_CURRENT 2 + +#define NUM_CHANNELS 10 + +extern const AP_HAL::HAL &hal; + +// static table of voltage sources +static AnalogSource sources[NUM_CHANNELS]; + +AnalogIn::AnalogIn() +{ +} + +float AnalogSource::read_average() +{ + return read_latest(); +} + +float AnalogSource::voltage_average() +{ + return read_latest(); +} + +float AnalogSource::voltage_latest() +{ + return read_latest(); +} + +float AnalogSource::read_latest() +{ + const auto *rcout = (QURT::RCOutput *)hal.rcout; + switch (pin) { + case ANALOG_PIN_VOLTAGE: + return rcout->get_voltage(); + case ANALOG_PIN_CURRENT: + return rcout->get_current(); + default: + break; + } + return 0; +} + +bool AnalogSource::set_pin(uint8_t p) +{ + switch (p) { + case ANALOG_PIN_VOLTAGE: + case ANALOG_PIN_CURRENT: + pin = p; + return true; + default: + break; + } + return false; +} + +void AnalogIn::init() +{ +} + +AP_HAL::AnalogSource* AnalogIn::channel(int16_t n) +{ + if (next_chan >= ARRAY_SIZE(sources)) { + return nullptr; + } + return &sources[next_chan++]; +} + +/* + not available, report 5v to keep GCS happy + */ +float AnalogIn::board_voltage(void) +{ + return 5.0f; +} diff --git a/libraries/AP_HAL_QURT/AnalogIn.h b/libraries/AP_HAL_QURT/AnalogIn.h new file mode 100644 index 0000000000..cecd6fb735 --- /dev/null +++ b/libraries/AP_HAL_QURT/AnalogIn.h @@ -0,0 +1,29 @@ +#pragma once + +#include "AP_HAL_QURT.h" + +class QURT::AnalogSource : public AP_HAL::AnalogSource +{ +public: + float read_average() override; + float read_latest() override; + bool set_pin(uint8_t p) override; + float voltage_average() override; + float voltage_latest() override; + float voltage_average_ratiometric() override + { + return voltage_average(); + } + uint8_t pin; +}; + +class QURT::AnalogIn : public AP_HAL::AnalogIn +{ +public: + AnalogIn(); + void init() override; + AP_HAL::AnalogSource* channel(int16_t n) override; + float board_voltage(void) override; +private: + uint8_t next_chan; +}; diff --git a/libraries/AP_HAL_QURT/DeviceBus.cpp b/libraries/AP_HAL_QURT/DeviceBus.cpp new file mode 100644 index 0000000000..c361fdaf84 --- /dev/null +++ b/libraries/AP_HAL_QURT/DeviceBus.cpp @@ -0,0 +1,133 @@ +/* + * This file is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "DeviceBus.h" + +#include +#include +#include + +#include "Scheduler.h" +#include "Semaphores.h" + +using namespace QURT; + +extern const AP_HAL::HAL& hal; + +DeviceBus::DeviceBus(AP_HAL::Scheduler::priority_base _thread_priority) : + thread_priority(_thread_priority), semaphore() +{ +} + +/* + per-bus callback thread +*/ +void DeviceBus::bus_thread(void) +{ + while (true) { + uint64_t now = AP_HAL::micros64(); + DeviceBus::callback_info *callback; + + // find a callback to run + for (callback = callbacks; callback; callback = callback->next) { + if (now >= callback->next_usec) { + while (now >= callback->next_usec) { + callback->next_usec += callback->period_usec; + } + // call it with semaphore held + WITH_SEMAPHORE(semaphore); + callback->cb(); + } + } + + // work out when next loop is needed + uint64_t next_needed = 0; + now = AP_HAL::micros64(); + + for (callback = callbacks; callback; callback = callback->next) { + if (next_needed == 0 || + callback->next_usec < next_needed) { + next_needed = callback->next_usec; + if (next_needed < now) { + next_needed = now; + } + } + } + + // delay for at most 50ms, to handle newly added callbacks + uint32_t delay = 50000; + if (next_needed >= now && next_needed - now < delay) { + delay = next_needed - now; + } + // don't delay for less than 100usec, so one thread doesn't + // completely dominate the CPU + if (delay < 100) { + delay = 100; + } + hal.scheduler->delay_microseconds(delay); + } + return; +} + +AP_HAL::Device::PeriodicHandle DeviceBus::register_periodic_callback(uint32_t period_usec, AP_HAL::Device::PeriodicCb cb, AP_HAL::Device *_hal_device) +{ + if (!thread_started) { + thread_started = true; + hal_device = _hal_device; + // setup a name for the thread + char name[30]; + switch (hal_device->bus_type()) { + case AP_HAL::Device::BUS_TYPE_I2C: + snprintf(name, sizeof(name), "APM_I2C:%u", + hal_device->bus_num()); + break; + + case AP_HAL::Device::BUS_TYPE_SPI: + snprintf(name, sizeof(name), "APM_SPI:%u", + hal_device->bus_num()); + break; + default: + break; + } +#ifdef BUSDEBUG + printf("%s:%d Thread Start\n", __PRETTY_FUNCTION__, __LINE__); +#endif + hal.scheduler->thread_create(FUNCTOR_BIND_MEMBER(&DeviceBus::bus_thread, void), + name, HAL_QURT_DEVICE_STACK_SIZE, thread_priority, 0); + } + DeviceBus::callback_info *callback = new DeviceBus::callback_info; + if (callback == nullptr) { + return nullptr; + } + callback->cb = cb; + callback->period_usec = period_usec; + callback->next_usec = AP_HAL::micros64() + period_usec; + + // add to linked list of callbacks on thread + callback->next = callbacks; + callbacks = callback; + + return callback; +} + +/* + * Adjust the timer for the next call: it needs to be called from the bus + * thread, otherwise it will race with it + */ +bool DeviceBus::adjust_timer(AP_HAL::Device::PeriodicHandle h, uint32_t period_usec) +{ + // TODO: add timer adjustment + return true; +} diff --git a/libraries/AP_HAL_QURT/DeviceBus.h b/libraries/AP_HAL_QURT/DeviceBus.h new file mode 100644 index 0000000000..d62db9ccf2 --- /dev/null +++ b/libraries/AP_HAL_QURT/DeviceBus.h @@ -0,0 +1,55 @@ +/* + * This file is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#pragma once + +#include +#include +#include "Semaphores.h" +#include "AP_HAL_QURT.h" +#include "Scheduler.h" + +#define HAL_QURT_DEVICE_STACK_SIZE 8192 + +namespace QURT +{ + +class DeviceBus +{ +public: + DeviceBus(AP_HAL::Scheduler::priority_base _thread_priority); + + struct DeviceBus *next; + HAL_Semaphore semaphore; + + AP_HAL::Device::PeriodicHandle register_periodic_callback(uint32_t period_usec, AP_HAL::Device::PeriodicCb, AP_HAL::Device *hal_device); + bool adjust_timer(AP_HAL::Device::PeriodicHandle h, uint32_t period_usec); + void bus_thread(void); + +private: + struct callback_info { + struct callback_info *next; + AP_HAL::Device::PeriodicCb cb; + uint32_t period_usec; + uint64_t next_usec; + } *callbacks; + AP_HAL::Scheduler::priority_base thread_priority; + bool thread_started; + AP_HAL::Device *hal_device; +}; + +} + + diff --git a/libraries/AP_HAL_QURT/HAL_QURT_Class.cpp b/libraries/AP_HAL_QURT/HAL_QURT_Class.cpp new file mode 100644 index 0000000000..0200b9d27d --- /dev/null +++ b/libraries/AP_HAL_QURT/HAL_QURT_Class.cpp @@ -0,0 +1,153 @@ +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#include + +#include "HAL_QURT_Class.h" +#include "AP_HAL_QURT_Private.h" +#include "Scheduler.h" +#include "Storage.h" +#include "Semaphores.h" +#include "RCInput.h" +#include "RCOutput.h" +#include "AnalogIn.h" +#include "I2CDevice.h" +#include "SPIDevice.h" +#include +#include +#include +#include +#include "interface.h" +#include "ap_host/src/protocol.h" + + +extern "C" { + typedef void (*external_error_handler_t)(void); +}; + +static void crash_error_handler(void) +{ + HAP_PRINTF("CRASH_ERROR_HANDLER: at %p", &crash_error_handler); +} + +using namespace QURT; + +static UARTDriver_Console consoleDriver; +static UARTDriver_MAVLinkUDP serial0Driver(0); +static UARTDriver_MAVLinkUDP serial1Driver(1); +static UARTDriver_Local serial3Driver(QURT_UART_GPS); +static UARTDriver_Local serial4Driver(QURT_UART_RCIN); + +static SPIDeviceManager spiDeviceManager; +static AnalogIn analogIn; +static Storage storageDriver; +static Empty::GPIO gpioDriver; +static RCInput rcinDriver; +static RCOutput rcoutDriver; +static Util utilInstance; +static Scheduler schedulerInstance; +static I2CDeviceManager i2c_mgr_instance; + +bool qurt_ran_overtime; + +HAL_QURT::HAL_QURT() : + AP_HAL::HAL( + &serial0Driver, + &serial1Driver, + nullptr, + &serial3Driver, + &serial4Driver, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + &i2c_mgr_instance, + &spiDeviceManager, + nullptr, + &analogIn, + &storageDriver, + &consoleDriver, + &gpioDriver, + &rcinDriver, + &rcoutDriver, + &schedulerInstance, + &utilInstance, + nullptr, + nullptr, + nullptr) +{ +} + +static HAL_QURT::Callbacks *_callbacks; + +void HAL_QURT::main_thread(void) +{ + sl_client_register_fatal_error_cb(crash_error_handler); + + // Let SLPI image send out it's initialization response before we + // try to send anything out. + qurt_timer_sleep(1000000); + + rcinDriver.init(); + analogIn.init(); + rcoutDriver.init(); + _callbacks->setup(); + scheduler->set_system_initialized(); + + HAP_PRINTF("starting loop"); + + for (;;) { + // ensure other threads get some time + qurt_timer_sleep(200); + + // call main loop + _callbacks->loop(); + } +} + +void HAL_QURT::start_main_thread(Callbacks* callbacks) +{ + _callbacks = callbacks; + scheduler->thread_create(FUNCTOR_BIND_MEMBER(&HAL_QURT::main_thread, void), "main_thread", + (20 * 1024), + AP_HAL::Scheduler::PRIORITY_MAIN, + 0); +} + +void HAL_QURT::run(int argc, char* const argv[], Callbacks* callbacks) const +{ + assert(callbacks); + + /* initialize all drivers and private members here. + * up to the programmer to do this in the correct order. + * Scheduler should likely come first. */ + scheduler->init(); + schedulerInstance.hal_initialized(); + serial0Driver.begin(115200); + + HAP_PRINTF("Creating main thread"); + + const_cast(this)->start_main_thread(callbacks); +} + +const AP_HAL::HAL& AP_HAL::get_HAL() +{ + static const HAL_QURT *hal; + if (hal == nullptr) { + hal = new HAL_QURT; + } + return *hal; +} diff --git a/libraries/AP_HAL_QURT/HAL_QURT_Class.h b/libraries/AP_HAL_QURT/HAL_QURT_Class.h new file mode 100644 index 0000000000..9c23f889af --- /dev/null +++ b/libraries/AP_HAL_QURT/HAL_QURT_Class.h @@ -0,0 +1,29 @@ +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ +#pragma once + +#include + +#include "AP_HAL_QURT_Namespace.h" +#include "interface.h" + +class HAL_QURT : public AP_HAL::HAL +{ +public: + HAL_QURT(); + void run(int argc, char* const* argv, Callbacks* callbacks) const override; + void start_main_thread(Callbacks* callbacks); + void main_thread(void); +}; diff --git a/libraries/AP_HAL_QURT/I2CDevice.cpp b/libraries/AP_HAL_QURT/I2CDevice.cpp new file mode 100644 index 0000000000..1da0b004f6 --- /dev/null +++ b/libraries/AP_HAL_QURT/I2CDevice.cpp @@ -0,0 +1,136 @@ +/* + * This file is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ +#include "I2CDevice.h" + +#include +#include +#include +#include "Scheduler.h" +#include "interface.h" + +using namespace QURT; + +/* + 4 I2C buses + + bus1: mag + bus2: power manager + bus5: barometer (internal)* + bus4: external spare bus (unused) +*/ +static uint8_t i2c_bus_ids[] = { 1, 2, 5 }; + +static uint32_t i2c_internal_mask = (1U<<3); + +I2CBus I2CDeviceManager::businfo[ARRAY_SIZE(i2c_bus_ids)]; + +I2CDeviceManager::I2CDeviceManager(void) +{ +} + +I2CDevice::I2CDevice(uint8_t busnum, uint8_t address, uint32_t bus_clock, bool use_smbus, uint32_t timeout_ms) : + _address(address), + bus(I2CDeviceManager::businfo[busnum]) +{ + if (busnum >= ARRAY_SIZE(i2c_bus_ids)) { + bus.fd = -1; + HAP_PRINTF("Invalid I2C bus %u", unsigned(busnum)); + return; + } + HAP_PRINTF("Constructing I2CDevice %u 0x%02x %u", unsigned(busnum), unsigned(address), unsigned(bus_clock)); + + if (bus.fd == -2) { + bus.fd = sl_client_config_i2c_bus(i2c_bus_ids[busnum], address, bus_clock/1000); + } + set_device_bus(busnum); + set_device_address(address); + asprintf(&pname, "I2C:%u:%02x", + (unsigned)busnum, (unsigned)address); +} + +I2CDevice::~I2CDevice() +{ + free(pname); +} + +bool I2CDevice::transfer(const uint8_t *send, uint32_t send_len, + uint8_t *recv, uint32_t recv_len) +{ + if (bus.fd < 0) { + return false; + } + if (!bus.semaphore.check_owner()) { + return false; + } + if (bus.last_address != _address) { + sl_client_set_address_i2c_bus(bus.fd, _address); + bus.last_address = _address; + } + return sl_client_i2c_transfer(bus.fd, send, send_len, recv, recv_len) == 0; +} + +/* + register a periodic callback +*/ +AP_HAL::Device::PeriodicHandle I2CDevice::register_periodic_callback(uint32_t period_usec, AP_HAL::Device::PeriodicCb cb) +{ + return bus.register_periodic_callback(period_usec, cb, this); +} + + +/* + adjust a periodic callback +*/ +bool I2CDevice::adjust_periodic_callback(AP_HAL::Device::PeriodicHandle h, uint32_t period_usec) +{ + return bus.adjust_timer(h, period_usec); +} + +AP_HAL::OwnPtr +I2CDeviceManager::get_device(uint8_t bus, uint8_t address, + uint32_t bus_clock, + bool use_smbus, + uint32_t timeout_ms) +{ + if (bus >= ARRAY_SIZE(i2c_bus_ids)) { + return AP_HAL::OwnPtr(nullptr); + } + auto dev = AP_HAL::OwnPtr(new I2CDevice(bus, address, bus_clock, use_smbus, timeout_ms)); + return dev; +} + +/* + get mask of bus numbers for all configured I2C buses +*/ +uint32_t I2CDeviceManager::get_bus_mask(void) const +{ + return ((1U << ARRAY_SIZE(i2c_bus_ids)) - 1); +} + +/* + get mask of bus numbers for all configured internal I2C buses +*/ +uint32_t I2CDeviceManager::get_bus_mask_internal(void) const +{ + return i2c_internal_mask; +} + +/* + get mask of bus numbers for all configured external I2C buses +*/ +uint32_t I2CDeviceManager::get_bus_mask_external(void) const +{ + return get_bus_mask() & ~get_bus_mask_internal(); +} diff --git a/libraries/AP_HAL_QURT/I2CDevice.h b/libraries/AP_HAL_QURT/I2CDevice.h new file mode 100644 index 0000000000..4e1c44e8f0 --- /dev/null +++ b/libraries/AP_HAL_QURT/I2CDevice.h @@ -0,0 +1,134 @@ +/* + * This file is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ +#pragma once + +#include + +#include +#include +#include + +#include "Semaphores.h" +#include "Scheduler.h" +#include "DeviceBus.h" + +namespace QURT +{ + +class I2CBus : public DeviceBus +{ +public: + I2CBus():DeviceBus(AP_HAL::Scheduler::PRIORITY_I2C) {}; + uint32_t bus_clock; + int fd = -2; + uint8_t last_address; +}; + +class I2CDevice : public AP_HAL::I2CDevice +{ +public: + static I2CDevice *from(AP_HAL::I2CDevice *dev) + { + return static_cast(dev); + } + + I2CDevice(uint8_t bus, uint8_t address, uint32_t bus_clock, bool use_smbus, uint32_t timeout_ms); + ~I2CDevice(); + + /* See AP_HAL::I2CDevice::set_address() */ + void set_address(uint8_t address) override + { + _address = address; + } + + /* See AP_HAL::I2CDevice::set_retries() */ + void set_retries(uint8_t retries) override + { + _retries = retries; + } + + /* See AP_HAL::Device::set_speed(): Empty implementation, not supported. */ + bool set_speed(enum Device::Speed speed) override + { + return true; + } + + /* See AP_HAL::Device::transfer() */ + bool transfer(const uint8_t *send, uint32_t send_len, + uint8_t *recv, uint32_t recv_len) override; + + bool read_registers_multiple(uint8_t first_reg, uint8_t *recv, + uint32_t recv_len, uint8_t times) override + { + return false; + }; + + /* See AP_HAL::Device::register_periodic_callback() */ + AP_HAL::Device::PeriodicHandle register_periodic_callback( + uint32_t period_usec, AP_HAL::Device::PeriodicCb) override; + + /* See AP_HAL::Device::adjust_periodic_callback() */ + bool adjust_periodic_callback(AP_HAL::Device::PeriodicHandle h, uint32_t period_usec) override; + + AP_HAL::Semaphore* get_semaphore() override //TODO check all + { + // if asking for invalid bus number use bus 0 semaphore + return &bus.semaphore; + } + +protected: + I2CBus &bus; + uint8_t _retries; + uint8_t _address; + char *pname; + +}; + +class I2CDeviceManager : public AP_HAL::I2CDeviceManager +{ +public: + friend class I2CDevice; + + static I2CBus businfo[]; + + // constructor + I2CDeviceManager(); + + static I2CDeviceManager *from(AP_HAL::I2CDeviceManager *i2c_mgr) + { + return static_cast(i2c_mgr); + } + + AP_HAL::OwnPtr get_device(uint8_t bus, uint8_t address, + uint32_t bus_clock=100000, + bool use_smbus = false, + uint32_t timeout_ms=4) override; + + /* + get mask of bus numbers for all configured I2C buses + */ + uint32_t get_bus_mask(void) const override; + + /* + get mask of bus numbers for all configured external I2C buses + */ + uint32_t get_bus_mask_external(void) const override; + + /* + get mask of bus numbers for all configured internal I2C buses + */ + uint32_t get_bus_mask_internal(void) const override; +}; +} diff --git a/libraries/AP_HAL_QURT/RCInput.cpp b/libraries/AP_HAL_QURT/RCInput.cpp new file mode 100644 index 0000000000..a52f95bf51 --- /dev/null +++ b/libraries/AP_HAL_QURT/RCInput.cpp @@ -0,0 +1,58 @@ +#include "RCInput.h" +#include + +using namespace QURT; + +void RCInput::init() +{ + AP::RC().init(); +} + +const char *RCInput::protocol() const +{ + return AP::RC().protocol_name(); +} + +bool RCInput::new_input() +{ + bool ret = updated; + updated = false; + return ret; +} + +uint8_t RCInput::num_channels() +{ + return num_chan; +} + +uint16_t RCInput::read(uint8_t channel) +{ + if (channel >= MIN(RC_INPUT_MAX_CHANNELS, num_chan)) { + return 0; + } + return values[channel]; +} + +uint8_t RCInput::read(uint16_t* periods, uint8_t len) +{ + WITH_SEMAPHORE(mutex); + len = MIN(len, num_chan); + memcpy(periods, values, len*sizeof(periods[0])); + return len; +} + +void RCInput::_timer_tick(void) +{ + auto &rcprot = AP::RC(); + + WITH_SEMAPHORE(mutex); + + rcprot.update(); + + if (rcprot.new_input()) { + num_chan = rcprot.num_channels(); + num_chan = MIN(num_chan, RC_INPUT_MAX_CHANNELS); + rcprot.read(values, num_chan); + updated = true; + } +} diff --git a/libraries/AP_HAL_QURT/RCInput.h b/libraries/AP_HAL_QURT/RCInput.h new file mode 100644 index 0000000000..96befb4076 --- /dev/null +++ b/libraries/AP_HAL_QURT/RCInput.h @@ -0,0 +1,28 @@ +#pragma once + +#include "AP_HAL_QURT.h" +#include + +#ifndef RC_INPUT_MAX_CHANNELS +#define RC_INPUT_MAX_CHANNELS 18 +#endif + +class QURT::RCInput : public AP_HAL::RCInput +{ +public: + void init() override; + bool new_input() override; + uint8_t num_channels() override; + uint16_t read(uint8_t ch) override; + uint8_t read(uint16_t* periods, uint8_t len) override; + + const char *protocol() const override; + + void _timer_tick(void); + +private: + HAL_Semaphore mutex; + uint16_t values[RC_INPUT_MAX_CHANNELS]; + uint8_t num_chan; + bool updated; +}; diff --git a/libraries/AP_HAL_QURT/RCOutput.cpp b/libraries/AP_HAL_QURT/RCOutput.cpp new file mode 100644 index 0000000000..eb509d0709 --- /dev/null +++ b/libraries/AP_HAL_QURT/RCOutput.cpp @@ -0,0 +1,239 @@ +#include + +#include "RCOutput.h" +#include +#include + +extern const AP_HAL::HAL& hal; + +using namespace QURT; + +#define ESC_PACKET_TYPE_PWM_CMD 1 +#define ESC_PACKET_TYPE_FB_RESPONSE 128 +#define ESC_PACKET_TYPE_FB_POWER_STATUS 132 + +#define ESC_PKT_HEADER 0xAF + +void RCOutput::init() +{ + fd = sl_client_config_uart(QURT_UART_ESC, baudrate); + if (fd == -1) { + HAP_PRINTF("Failed to open ESC UART"); + } + HAP_PRINTF("ESC UART: %d", fd); +} + +void RCOutput::set_freq(uint32_t chmask, uint16_t freq_hz) +{ + // no support for changing frequency +} + +uint16_t RCOutput::get_freq(uint8_t ch) +{ + // return fixed fake value + return 490; +} + +void RCOutput::enable_ch(uint8_t ch) +{ + if (ch >= ARRAY_SIZE(period)) { + return; + } + enable_mask |= 1U<= ARRAY_SIZE(period)) { + return; + } + enable_mask &= ~1U<= ARRAY_SIZE(period)) { + return; + } + period[ch] = period_us; + if (!corked) { + need_write = true; + } +} + +uint16_t RCOutput::read(uint8_t ch) +{ + if (ch >= ARRAY_SIZE(period)) { + return 0; + } + return period[ch]; +} + +void RCOutput::read(uint16_t *period_us, uint8_t len) +{ + for (auto i = 0; i < len; i++) { + period_us[i] = read(i); + } +} + +/* + send a packet with CRC to the ESC + */ +void RCOutput::send_esc_packet(uint8_t type, uint8_t *data, uint16_t size) +{ + uint16_t packet_size = size + 5; + uint8_t out[packet_size]; + + out[0] = ESC_PKT_HEADER; + out[1] = packet_size; + out[2] = type; + + memcpy(&out[3], data, size); + + uint16_t crc = calc_crc_modbus(&out[1], packet_size - 3); + + memcpy(&out[packet_size - 2], &crc, sizeof(uint16_t)); + + sl_client_uart_write(fd, (const char *)out, packet_size); +} + +/* + convert 1000 to 2000 PWM to -800 to 800 for QURT ESCs + */ +static int16_t pwm_to_esc(uint16_t pwm) +{ + const float p = constrain_float((pwm-1000)*0.001, 0, 1); + return int16_t(800*p); +} + +/* + send current commands to ESCs + */ +void RCOutput::send_receive(void) +{ + if (fd == -1) { + return; + } + + AP_BoardConfig *boardconfig = AP_BoardConfig::get_singleton(); + uint32_t safety_mask = 0; + + if (boardconfig != nullptr) { + // mask of channels to allow with safety on + safety_mask = boardconfig->get_safety_mask(); + } + + int16_t data[5] {}; + + for (uint8_t i=0; i<4; i++) { + uint16_t v = period[i]; + if (safety_on && (safety_mask & (1U< 5) { + last_fb_req_ms = now_ms; + // request feedback from one ESC + last_fb_idx = (last_fb_idx+1) % 4; + data[last_fb_idx] |= 1; + } + + send_esc_packet(ESC_PACKET_TYPE_PWM_CMD, (uint8_t *)data, sizeof(data)); + + check_response(); +} + +/* + handle a telem feedback packet + */ +void RCOutput::handle_esc_feedback(const struct esc_response_v2 &pkt) +{ + const uint8_t idx = pkt.id_state>>4; + if (idx >= ARRAY_SIZE(period)) { + return; + } + update_rpm(idx, pkt.rpm); + + AP_ESC_Telem_Backend::TelemetryData tdata {}; + tdata.voltage = pkt.voltage*0.001; + tdata.current = pkt.current*0.008; + tdata.temperature_cdeg = pkt.temperature; + + update_telem_data(idx, tdata, + AP_ESC_Telem_Backend::TelemetryType::CURRENT | + AP_ESC_Telem_Backend::TelemetryType::VOLTAGE | + AP_ESC_Telem_Backend::TelemetryType::TEMPERATURE); +} + +/* + handle a power status packet, making it available to AnalogIn + */ +void RCOutput::handle_power_status(const struct esc_power_status &pkt) +{ + esc_voltage = pkt.voltage * 0.001; + esc_current = pkt.current * 0.008; +} + +// check for responses +void RCOutput::check_response(void) +{ + uint8_t buf[256]; + struct PACKED esc_packet { + uint8_t header; + uint8_t length; + uint8_t type; + union { + struct esc_response_v2 resp_v2; + struct esc_power_status power_status; + } u; + }; + auto n = sl_client_uart_read(fd, (char *)buf, sizeof(buf)); + while (n >= 3) { + const auto *pkt = (struct esc_packet *)buf; + if (pkt->header != ESC_PKT_HEADER || pkt->length > n) { + return; + } + const uint16_t crc = calc_crc_modbus(&pkt->length, pkt->length-3); + const uint16_t crc2 = buf[pkt->length-2] | buf[pkt->length-1]<<8; + if (crc != crc2) { + return; + } + switch (pkt->type) { + case ESC_PACKET_TYPE_FB_RESPONSE: + handle_esc_feedback(pkt->u.resp_v2); + break; + case ESC_PACKET_TYPE_FB_POWER_STATUS: + handle_power_status(pkt->u.power_status); + break; + default: + HAP_PRINTF("Unknown pkt %u", pkt->type); + break; + } + if (n == pkt->length) { + break; + } + memmove(&buf[0], &buf[pkt->length], n - pkt->length); + n -= pkt->length; + } +} + +void RCOutput::cork(void) +{ + corked = true; +} + +void RCOutput::push(void) +{ + if (corked) { + corked = false; + need_write = true; + send_receive(); + } +} diff --git a/libraries/AP_HAL_QURT/RCOutput.h b/libraries/AP_HAL_QURT/RCOutput.h new file mode 100644 index 0000000000..ee3f95aac2 --- /dev/null +++ b/libraries/AP_HAL_QURT/RCOutput.h @@ -0,0 +1,85 @@ +#pragma once + +#include +#include "AP_HAL_QURT.h" +#include + +class QURT::RCOutput : public AP_HAL::RCOutput, AP_ESC_Telem_Backend +{ +public: + friend class QURT::Util; + + void init() override; + void set_freq(uint32_t chmask, uint16_t freq_hz) override; + uint16_t get_freq(uint8_t ch) override; + void enable_ch(uint8_t ch) override; + void disable_ch(uint8_t ch) override; + void write(uint8_t ch, uint16_t period_us) override; + uint16_t read(uint8_t ch) override; + void read(uint16_t *period_us, uint8_t len) override; + void cork(void) override; + void push(void) override; + + float get_voltage(void) const + { + return esc_voltage; + } + float get_current(void) const + { + return esc_current; + } + + /* + force the safety switch on, disabling output from the ESCs/servos + */ + bool force_safety_on(void) override { safety_on = true; return true; } + + /* + force the safety switch off, enabling output from the ESCs/servos + */ + void force_safety_off(void) override { safety_on = false; } + +private: + const uint32_t baudrate = 2000000; + + void send_receive(void); + void check_response(void); + void send_esc_packet(uint8_t type, uint8_t *data, uint16_t size); + + struct PACKED esc_response_v2 { + uint8_t id_state; // bits 0:3 = state, bits 4:7 = ID + + uint16_t rpm; // Current RPM of the motor + uint8_t cmd_counter; // Number of commands received by the ESC + uint8_t power; // Applied power [0..100] + + uint16_t voltage; // Voltage measured by the ESC in mV + int16_t current; // Current measured by the ESC in 8mA resolution + int16_t temperature; // Temperature measured by the ESC in 0.01 degC resolution + }; + + struct PACKED esc_power_status { + uint8_t id; //ESC Id (could be used as system ID elsewhere) + uint16_t voltage; //Input voltage (Millivolts) + int16_t current; //Total Current (8mA resolution) + }; + + void handle_esc_feedback(const struct esc_response_v2 &pkt); + void handle_power_status(const struct esc_power_status &pkt); + + int fd = -1; + uint16_t enable_mask; + static const uint8_t channel_count = 4; + uint16_t period[channel_count]; + volatile bool need_write; + bool corked; + HAL_Semaphore mutex; + uint8_t last_fb_idx; + uint32_t last_fb_req_ms; + + float esc_voltage; + float esc_current; + + // start with safety on, gets disabled by AP_BoardConfig + bool safety_on = true; +}; diff --git a/libraries/AP_HAL_QURT/SPIDevice.cpp b/libraries/AP_HAL_QURT/SPIDevice.cpp new file mode 100644 index 0000000000..616cf6a76f --- /dev/null +++ b/libraries/AP_HAL_QURT/SPIDevice.cpp @@ -0,0 +1,128 @@ +/* + * This file is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "SPIDevice.h" + +#include +#include +#include +#include "Scheduler.h" +#include "Semaphores.h" +#include "interface.h" +#include + +using namespace QURT; + +#define MHZ (1000U*1000U) +#define KHZ (1000U) + +const char *device_names[] = {"INV1", "INV2", "INV3"}; + +static SPIBus *spi_bus; + +SPIBus::SPIBus(void): + DeviceBus(Scheduler::PRIORITY_SPI) +{ + fd = sl_client_config_spi_bus(); + HAP_PRINTF("Created SPI bus -> %d", fd); +} + +SPIDevice::SPIDevice(const char *name, SPIBus &_bus) + : bus(_bus) +{ + set_device_bus(0); + set_device_address(1); + set_speed(AP_HAL::Device::SPEED_LOW); + + pname = name; +} + +SPIDevice::~SPIDevice() +{ +} + +bool SPIDevice::set_speed(AP_HAL::Device::Speed _speed) +{ + return true; +} + +bool SPIDevice::transfer(const uint8_t *send, uint32_t send_len, + uint8_t *recv, uint32_t recv_len) +{ + // If there is no receive buffer then this is a write transaction + // and the data to write is in the send buffer + if (!recv) { + return transfer_fullduplex(send, (uint8_t*) send, send_len); + } + + // This is a read transaction + uint8_t buf[send_len+recv_len]; + if (send_len > 0) { + memcpy(buf, send, send_len); + } + if (recv_len > 0) { + memset(&buf[send_len], 0, recv_len); + } + transfer_fullduplex(buf, buf, send_len+recv_len); + if (recv_len > 0) { + memcpy(recv, &buf[send_len], recv_len); + } + return true; +} + +bool SPIDevice::transfer_fullduplex(const uint8_t *send, uint8_t *recv, uint32_t len) +{ + return (sl_client_spi_transfer(bus.fd, send, recv, len) == 0); +} + +void SPIDevice::acquire_bus(bool accuire) +{ +} + +AP_HAL::Semaphore *SPIDevice::get_semaphore() +{ + return &bus.semaphore; +} + +AP_HAL::Device::PeriodicHandle SPIDevice::register_periodic_callback(uint32_t period_usec, AP_HAL::Device::PeriodicCb cb) +{ + return bus.register_periodic_callback(period_usec, cb, this); +} + +bool SPIDevice::adjust_periodic_callback(AP_HAL::Device::PeriodicHandle h, uint32_t period_usec) +{ + return bus.adjust_timer(h, period_usec); +} + +AP_HAL::OwnPtr +SPIDeviceManager::get_device(const char *name) +{ + uint8_t i; + for (i = 0; i(nullptr); + } + + if (spi_bus == nullptr) { + spi_bus = new SPIBus(); + } + + return AP_HAL::OwnPtr(new SPIDevice(name, *spi_bus)); +} + diff --git a/libraries/AP_HAL_QURT/SPIDevice.h b/libraries/AP_HAL_QURT/SPIDevice.h new file mode 100644 index 0000000000..65a5585820 --- /dev/null +++ b/libraries/AP_HAL_QURT/SPIDevice.h @@ -0,0 +1,65 @@ +/* + * This file is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#pragma once + +#include +#include +#include +#include "AP_HAL_QURT.h" + +#include "Semaphores.h" +#include "Scheduler.h" +#include "DeviceBus.h" + +namespace QURT +{ + +class SPIBus : public DeviceBus +{ +public: + SPIBus(); + int fd = -1; +}; + +class SPIDevice : public AP_HAL::SPIDevice +{ +public: + SPIDevice(const char *name, SPIBus &bus); + virtual ~SPIDevice(); + + bool set_speed(AP_HAL::Device::Speed speed) override; + bool transfer(const uint8_t *send, uint32_t send_len, + uint8_t *recv, uint32_t recv_len) override; + bool transfer_fullduplex(const uint8_t *send, uint8_t *recv, uint32_t len) override; + AP_HAL::Semaphore *get_semaphore() override; + AP_HAL::Device::PeriodicHandle register_periodic_callback(uint32_t period_usec, AP_HAL::Device::PeriodicCb) override; + bool adjust_periodic_callback(AP_HAL::Device::PeriodicHandle h, uint32_t period_usec) override; + +private: + SPIBus &bus; + const char *pname; + void acquire_bus(bool accuire); +}; + +class SPIDeviceManager : public AP_HAL::SPIDeviceManager +{ +public: + friend class SPIDevice; + + AP_HAL::OwnPtr get_device(const char *name) override; +}; +} + diff --git a/libraries/AP_HAL_QURT/Scheduler.cpp b/libraries/AP_HAL_QURT/Scheduler.cpp new file mode 100644 index 0000000000..2930861a27 --- /dev/null +++ b/libraries/AP_HAL_QURT/Scheduler.cpp @@ -0,0 +1,352 @@ +#include + +#include "AP_HAL_QURT.h" +#include "Scheduler.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "UARTDriver.h" +#include "Storage.h" +#include "RCOutput.h" +#include "RCInput.h" +#include +#include "Thread.h" + +using namespace QURT; + +extern const AP_HAL::HAL& hal; + +Scheduler::Scheduler() +{ +} + +void Scheduler::init() +{ + _main_thread_ctx = pthread_self(); + + // setup the timer thread - this will call tasks at 1kHz + pthread_attr_t thread_attr; + struct sched_param param; + + pthread_attr_init(&thread_attr); + pthread_attr_setstacksize(&thread_attr, 16000); + + param.sched_priority = APM_TIMER_PRIORITY; + (void)pthread_attr_setschedparam(&thread_attr, ¶m); + + pthread_create(&_timer_thread_ctx, &thread_attr, &Scheduler::_timer_thread, this); + + // the UART thread runs at a medium priority + pthread_attr_init(&thread_attr); + pthread_attr_setstacksize(&thread_attr, 16000); + + param.sched_priority = APM_UART_PRIORITY; + (void)pthread_attr_setschedparam(&thread_attr, ¶m); + + pthread_create(&_uart_thread_ctx, &thread_attr, &Scheduler::_uart_thread, this); + + // the IO thread runs at lower priority + pthread_attr_init(&thread_attr); + pthread_attr_setstacksize(&thread_attr, 16000); + + param.sched_priority = APM_IO_PRIORITY; + (void)pthread_attr_setschedparam(&thread_attr, ¶m); + + pthread_create(&_io_thread_ctx, &thread_attr, &Scheduler::_io_thread, this); +} + +#define APM_QURT_MAX_PRIORITY (200 + 20) +#define APM_QURT_TIMER_PRIORITY (200 + 15) +#define APM_QURT_UART_PRIORITY (200 + 14) +#define APM_QURT_NET_PRIORITY (200 + 14) +#define APM_QURT_RCIN_PRIORITY (200 + 13) +#define APM_QURT_MAIN_PRIORITY (200 + 12) +#define APM_QURT_IO_PRIORITY (200 + 10) +#define APM_QURT_SCRIPTING_PRIORITY (200 + 1) +#define AP_QURT_SENSORS_SCHED_PRIO (200 + 12) + +uint8_t Scheduler::calculate_thread_priority(priority_base base, int8_t priority) const +{ + uint8_t thread_priority = APM_QURT_IO_PRIORITY; + static const struct { + priority_base base; + uint8_t p; + } priority_map[] = { + { PRIORITY_BOOST, APM_QURT_MAIN_PRIORITY}, + { PRIORITY_MAIN, APM_QURT_MAIN_PRIORITY}, + { PRIORITY_SPI, AP_QURT_SENSORS_SCHED_PRIO+1}, + { PRIORITY_I2C, AP_QURT_SENSORS_SCHED_PRIO}, + { PRIORITY_CAN, APM_QURT_TIMER_PRIORITY}, + { PRIORITY_TIMER, APM_QURT_TIMER_PRIORITY}, + { PRIORITY_RCIN, APM_QURT_RCIN_PRIORITY}, + { PRIORITY_IO, APM_QURT_IO_PRIORITY}, + { PRIORITY_UART, APM_QURT_UART_PRIORITY}, + { PRIORITY_STORAGE, APM_QURT_IO_PRIORITY}, + { PRIORITY_SCRIPTING, APM_QURT_SCRIPTING_PRIORITY}, + { PRIORITY_NET, APM_QURT_NET_PRIORITY}, + }; + for (const auto &m : priority_map) { + if (m.base == base) { + thread_priority = constrain_int16(m.p + priority, 1, APM_QURT_MAX_PRIORITY); + break; + } + } + + return thread_priority; +} + +/* + create a new thread +*/ +bool Scheduler::thread_create(AP_HAL::MemberProc proc, const char *name, uint32_t stack_size, priority_base base, int8_t priority) +{ + Thread *thread = new Thread{(Thread::task_t)proc}; + if (thread == nullptr) { + return false; + } + + const uint8_t thread_priority = calculate_thread_priority(base, priority); + + stack_size = MAX(stack_size, 8192U); + + // Setting the stack size too large can cause odd behavior!!! + thread->set_stack_size(stack_size); + + /* + * We should probably store the thread handlers and join() when exiting, + * but let's the thread manage itself for now. + */ + thread->set_auto_free(true); + + DEV_PRINTF("Starting thread %s: Priority %u", name, thread_priority); + + if (!thread->start(name, SCHED_FIFO, thread_priority)) { + delete thread; + return false; + } + + return true; +} + +void Scheduler::delay_microseconds(uint16_t usec) +{ + qurt_timer_sleep(usec); +} + +void Scheduler::delay(uint16_t ms) +{ + uint64_t start = AP_HAL::micros64(); + + while ((AP_HAL::micros64() - start)/1000 < ms) { + delay_microseconds(1000); + if (_min_delay_cb_ms <= ms) { + if (in_main_thread()) { + const auto old_task = hal.util->persistent_data.scheduler_task; + hal.util->persistent_data.scheduler_task = -4; + call_delay_cb(); + hal.util->persistent_data.scheduler_task = old_task; + } + } + } +} + +void Scheduler::register_timer_process(AP_HAL::MemberProc proc) +{ + for (uint8_t i = 0; i < _num_timer_procs; i++) { + if (_timer_proc[i] == proc) { + return; + } + } + + if (_num_timer_procs < QURT_SCHEDULER_MAX_TIMER_PROCS) { + _timer_proc[_num_timer_procs] = proc; + _num_timer_procs++; + } else { + hal.console->printf("Out of timer processes\n"); + } +} + +void Scheduler::register_io_process(AP_HAL::MemberProc proc) +{ + for (uint8_t i = 0; i < _num_io_procs; i++) { + if (_io_proc[i] == proc) { + return; + } + } + + if (_num_io_procs < QURT_SCHEDULER_MAX_TIMER_PROCS) { + _io_proc[_num_io_procs] = proc; + _num_io_procs++; + } else { + hal.console->printf("Out of IO processes\n"); + } +} + +void Scheduler::register_timer_failsafe(AP_HAL::Proc failsafe, uint32_t period_us) +{ + _failsafe = failsafe; +} + +void Scheduler::suspend_timer_procs() +{ + _timer_suspended = true; +} + +void Scheduler::resume_timer_procs() +{ + _timer_suspended = false; + if (_timer_event_missed == true) { + _run_timers(false); + _timer_event_missed = false; + } +} + +void Scheduler::reboot(bool hold_in_bootloader) +{ + HAP_PRINTF("**** REBOOT REQUESTED ****"); + // delay for printf to appear on USB monitor + qurt_timer_sleep(10000); + + // tell host we want to reboot + struct qurt_rpc_msg msg {}; + msg.msg_id = QURT_MSG_ID_REBOOT; + qurt_rpc_send(msg); + + // wait for RPC to get through + qurt_timer_sleep(10000); + exit(1); +} + +void Scheduler::_run_timers(bool called_from_timer_thread) +{ + if (_in_timer_proc) { + return; + } + _in_timer_proc = true; + + if (!_timer_suspended) { + // now call the timer based drivers + for (int i = 0; i < _num_timer_procs; i++) { + if (_timer_proc[i]) { + _timer_proc[i](); + } + } + } else if (called_from_timer_thread) { + _timer_event_missed = true; + } + + // and the failsafe, if one is setup + if (_failsafe != nullptr) { + _failsafe(); + } + + _in_timer_proc = false; +} + +extern bool qurt_ran_overtime; + +void *Scheduler::_timer_thread(void *arg) +{ + Scheduler *sched = (Scheduler *)arg; + + while (!sched->_hal_initialized) { + sched->delay_microseconds(1000); + } + while (true) { + sched->delay_microseconds(1000); + + // run registered timers + sched->_run_timers(true); + } + return nullptr; +} + +void Scheduler::_run_io(void) +{ + if (_in_io_proc) { + return; + } + _in_io_proc = true; + + if (!_timer_suspended) { + // now call the IO based drivers + for (int i = 0; i < _num_io_procs; i++) { + if (_io_proc[i]) { + _io_proc[i](); + } + } + } + + _in_io_proc = false; +} + +void *Scheduler::_uart_thread(void *arg) +{ + Scheduler *sched = (Scheduler *)arg; + + while (!sched->_hal_initialized) { + sched->delay_microseconds(1000); + } + while (true) { + sched->delay_microseconds(200); + + // process any pending serial bytes + for (uint8_t i = 0; i < hal.num_serial; i++) { + auto *p = hal.serial(i); + if (p != nullptr) { + p->_timer_tick(); + } + } + } + return nullptr; +} + +void *Scheduler::_io_thread(void *arg) +{ + Scheduler *sched = (Scheduler *)arg; + + while (!sched->_hal_initialized) { + sched->delay_microseconds(1000); + } + while (true) { + sched->delay_microseconds(1000); + + // run registered IO processes + sched->_run_io(); + + // update storage + hal.storage->_timer_tick(); + + // update RC input + ((QURT::RCInput *)hal.rcin)->_timer_tick(); + } + return nullptr; +} + +bool Scheduler::in_main_thread() const +{ + return pthread_equal(pthread_self(), _main_thread_ctx); +} + +void Scheduler::set_system_initialized() +{ + _main_thread_ctx = pthread_self(); + if (_initialized) { + AP_HAL::panic("PANIC: scheduler::system_initialized called" + "more than once"); + } + _initialized = true; +} + +void Scheduler::hal_initialized(void) +{ + HAP_PRINTF("HAL is initialised"); + _hal_initialized = true; +} diff --git a/libraries/AP_HAL_QURT/Scheduler.h b/libraries/AP_HAL_QURT/Scheduler.h new file mode 100644 index 0000000000..8c4fd863a9 --- /dev/null +++ b/libraries/AP_HAL_QURT/Scheduler.h @@ -0,0 +1,84 @@ +#pragma once + +#include +#if CONFIG_HAL_BOARD == HAL_BOARD_QURT +#include "AP_HAL_QURT_Namespace.h" +#include +#include +#include + +#define QURT_SCHEDULER_MAX_TIMER_PROCS 8 + +#define APM_MAIN_PRIORITY 180 +#define APM_TIMER_PRIORITY 181 +#define APM_UART_PRIORITY 60 +#define APM_IO_PRIORITY 58 + +/* Scheduler implementation: */ +class QURT::Scheduler : public AP_HAL::Scheduler +{ +public: + Scheduler(); + /* AP_HAL::Scheduler methods */ + + void init() override; + void delay(uint16_t ms) override; + void delay_microseconds(uint16_t us) override; + void register_timer_process(AP_HAL::MemberProc) override; + void register_io_process(AP_HAL::MemberProc) override; + void register_timer_failsafe(AP_HAL::Proc, uint32_t period_us) override; + void suspend_timer_procs(); + void resume_timer_procs(); + void reboot(bool hold_in_bootloader) override; + + bool in_main_thread() const override; + void hal_initialized(); + + void set_system_initialized() override; + bool is_system_initialized() override + { + return _initialized; + } + + bool thread_create(AP_HAL::MemberProc proc, const char *name, + uint32_t stack_size, priority_base base, int8_t priority) override; + +private: + bool _initialized; + volatile bool _hal_initialized; + AP_HAL::Proc _delay_cb; + uint16_t _min_delay_cb_ms; + AP_HAL::Proc _failsafe; + + volatile bool _timer_suspended; + + AP_HAL::MemberProc _timer_proc[QURT_SCHEDULER_MAX_TIMER_PROCS]; + uint8_t _num_timer_procs; + volatile bool _in_timer_proc; + + AP_HAL::MemberProc _io_proc[QURT_SCHEDULER_MAX_TIMER_PROCS]; + uint8_t _num_io_procs; + volatile bool _in_io_proc; + + volatile bool _timer_event_missed; + + pthread_t _main_thread_ctx; + pthread_t _timer_thread_ctx; + pthread_t _io_thread_ctx; + pthread_t _storage_thread_ctx; + pthread_t _uart_thread_ctx; + + uint8_t calculate_thread_priority(priority_base base, int8_t priority) const; + + static void *_timer_thread(void *arg); + static void *_io_thread(void *arg); + static void *_storage_thread(void *arg); + static void *_uart_thread(void *arg); + + void _run_timers(bool called_from_timer_thread); + void _run_io(void); +}; +#endif + + + diff --git a/libraries/AP_HAL_QURT/Semaphores.cpp b/libraries/AP_HAL_QURT/Semaphores.cpp new file mode 100644 index 0000000000..1c7c280e0a --- /dev/null +++ b/libraries/AP_HAL_QURT/Semaphores.cpp @@ -0,0 +1,111 @@ +#include + +#include "Semaphores.h" + +extern const AP_HAL::HAL& hal; + +using namespace QURT; + +// construct a semaphore +Semaphore::Semaphore() +{ + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&_lock, &attr); +} + +bool Semaphore::give() +{ + return pthread_mutex_unlock(&_lock) == 0; +} + +bool Semaphore::check_owner() +{ + return owner == pthread_self(); +} + +bool Semaphore::take(uint32_t timeout_ms) +{ + if (timeout_ms == HAL_SEMAPHORE_BLOCK_FOREVER) { + auto ok = pthread_mutex_lock(&_lock) == 0; + if (ok) { + owner = pthread_self(); + } + return ok; + } + if (take_nonblocking()) { + return true; + } + uint64_t start = AP_HAL::micros64(); + do { + hal.scheduler->delay_microseconds(200); + if (take_nonblocking()) { + return true; + } + } while ((AP_HAL::micros64() - start) < timeout_ms*1000); + return false; +} + +bool Semaphore::take_nonblocking() +{ + const auto ok = pthread_mutex_trylock(&_lock) == 0; + if (ok) { + owner = pthread_self(); + } + return ok; +} + +/* + binary semaphore using condition variables + */ + +BinarySemaphore::BinarySemaphore(bool initial_state) : + AP_HAL::BinarySemaphore(initial_state) +{ + pthread_cond_init(&cond, NULL); + pending = initial_state; +} + +bool BinarySemaphore::wait(uint32_t timeout_us) +{ + WITH_SEMAPHORE(mtx); + if (!pending) { + struct timespec ts; + if (clock_gettime(CLOCK_REALTIME, &ts) != 0) { + return false; + } + ts.tv_sec += timeout_us/1000000UL; + ts.tv_nsec += (timeout_us % 1000000U) * 1000UL; + if (ts.tv_nsec >= 1000000000L) { + ts.tv_sec++; + ts.tv_nsec -= 1000000000L; + } + if (pthread_cond_timedwait(&cond, &mtx._lock, &ts) != 0) { + return false; + } + } + pending = false; + return true; +} + +bool BinarySemaphore::wait_blocking(void) +{ + WITH_SEMAPHORE(mtx); + if (!pending) { + if (pthread_cond_wait(&cond, &mtx._lock) != 0) { + return false; + } + } + pending = false; + return true; +} + +void BinarySemaphore::signal(void) +{ + WITH_SEMAPHORE(mtx); + if (!pending) { + pending = true; + pthread_cond_signal(&cond); + } +} diff --git a/libraries/AP_HAL_QURT/Semaphores.h b/libraries/AP_HAL_QURT/Semaphores.h new file mode 100644 index 0000000000..61a36795e0 --- /dev/null +++ b/libraries/AP_HAL_QURT/Semaphores.h @@ -0,0 +1,42 @@ +#pragma once + +#include +#include +#include +#include + +namespace QURT +{ + +class Semaphore : public AP_HAL::Semaphore +{ +public: + friend class BinarySemaphore; + Semaphore(); + bool give() override; + bool take(uint32_t timeout_ms) override; + bool take_nonblocking() override; + bool check_owner(void); +protected: + // qurt_mutex_t _lock; + pthread_mutex_t _lock; + pthread_t owner; +}; + + +class BinarySemaphore : public AP_HAL::BinarySemaphore +{ +public: + BinarySemaphore(bool initial_state=false); + + bool wait(uint32_t timeout_us) override; + bool wait_blocking(void) override; + void signal(void) override; + +protected: + Semaphore mtx; + pthread_cond_t cond; + bool pending; +}; + +} diff --git a/libraries/AP_HAL_QURT/Storage.cpp b/libraries/AP_HAL_QURT/Storage.cpp new file mode 100644 index 0000000000..a4bf15acd1 --- /dev/null +++ b/libraries/AP_HAL_QURT/Storage.cpp @@ -0,0 +1,195 @@ +#include "Storage.h" + +#include +#include +#include +#include +#include + +#include + +using namespace QURT; + +#define QURT_STORAGE_MAX_WRITE 512 +#define QURT_STORAGE_LINE_SHIFT 9 +#define QURT_STORAGE_LINE_SIZE (1<>QURT_STORAGE_LINE_SHIFT; + line <= end>>QURT_STORAGE_LINE_SHIFT; + line++) { + _dirty_mask |= 1U << line; + } +} + +void Storage::read_block(void *dst, uint16_t loc, size_t n) +{ + if (loc >= sizeof(_buffer)-(n-1)) { + return; + } + init(); + memcpy(dst, &_buffer[loc], n); +} + +void Storage::write_block(uint16_t loc, const void *src, size_t n) +{ + if (loc >= sizeof(_buffer)-(n-1)) { + return; + } + if (memcmp(src, &_buffer[loc], n) != 0) { + init(); + memcpy(&_buffer[loc], src, n); + _mark_dirty(loc, n); + } +} + +void Storage::_timer_tick(void) +{ + if (!_initialised || _dirty_mask == 0 || _fd == -1) { + return; + } + + // write out the first dirty set of lines. We don't write more + // than one to keep the latency of this call to a minimum + uint8_t i, n; + for (i=0; i>QURT_STORAGE_LINE_SHIFT); n++) { + if (!(_dirty_mask & (1<<(n+i)))) { + break; + } + // mark that line clean + write_mask |= (1<<(n+i)); + } + + /* + write the lines. This also updates _dirty_mask. Note that + because this is a SCHED_FIFO thread it will not be preempted + by the main task except during blocking calls. This means we + don't need a semaphore around the _dirty_mask updates. + */ + if (lseek(_fd, i< + +#define QURT_STORAGE_SIZE HAL_STORAGE_SIZE + +namespace QURT +{ + +class Storage : public AP_HAL::Storage +{ +public: + static Storage *from(AP_HAL::Storage *storage) + { + return static_cast(storage); + } + + + void init() override; + + uint8_t read_byte(uint16_t loc); + uint16_t read_word(uint16_t loc); + uint32_t read_dword(uint16_t loc); + void read_block(void *dst, uint16_t src, size_t n) override; + + void write_byte(uint16_t loc, uint8_t value); + void write_word(uint16_t loc, uint16_t value); + void write_dword(uint16_t loc, uint32_t value); + void write_block(uint16_t dst, const void* src, size_t n) override; + + bool get_storage_ptr(void *&ptr, size_t &size) override; + + virtual void _timer_tick(void) override; + +protected: + void _mark_dirty(uint16_t loc, uint16_t length); + bool _storage_create(void); + + int _fd = -1; + volatile bool _initialised; + volatile uint32_t _dirty_mask; + uint8_t _buffer[QURT_STORAGE_SIZE]; +}; + +} diff --git a/libraries/AP_HAL_QURT/Thread.cpp b/libraries/AP_HAL_QURT/Thread.cpp new file mode 100644 index 0000000000..246e7bc903 --- /dev/null +++ b/libraries/AP_HAL_QURT/Thread.cpp @@ -0,0 +1,182 @@ +/* + * Copyright (C) 2016 Intel Corporation. All rights reserved. + * + * This file is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ +#include "Thread.h" + +#include +#include +#include +#include +#include + +#include +#include +#include "Scheduler.h" + +extern const AP_HAL::HAL &hal; + +namespace QURT +{ + + +void *Thread::_run_trampoline(void *arg) +{ + Thread *thread = static_cast(arg); + thread->_run(); + + if (thread->_auto_free) { + delete thread; + } + + return nullptr; +} + +bool Thread::_run() +{ + if (!_task) { + return false; + } + + _task(); + + return true; +} + +size_t Thread::get_stack_usage() +{ + return 0; +} + +bool Thread::start(const char *name, int policy, int prio) +{ + if (_started) { + return false; + } + + struct sched_param param = { .sched_priority = prio }; + pthread_attr_t attr; + int r; + + pthread_attr_init(&attr); + + if ((r = pthread_attr_setschedparam(&attr, ¶m)) != 0) { + AP_HAL::panic("Failed to set attributes for thread '%s': %s", + name, strerror(r)); + } + + const uint32_t stack_alignment = 2048U; + _stack_size = (_stack_size+stack_alignment) & ~stack_alignment; + if (_stack_size) { + if (pthread_attr_setstacksize(&attr, _stack_size) != 0) { + return false; + } + } + + r = pthread_create(&_ctx, &attr, &Thread::_run_trampoline, this); + if (r != 0) { + AP_HAL::panic("Failed to create thread '%s': %s", + name, strerror(r)); + } + pthread_attr_destroy(&attr); + + _started = true; + + return true; +} + +bool Thread::is_current_thread() +{ + return pthread_equal(pthread_self(), _ctx); +} + +bool Thread::join() +{ + void *ret; + + if (_ctx == 0) { + return false; + } + + if (pthread_join(_ctx, &ret) != 0 || + (intptr_t)ret != 0) { + return false; + } + + return true; +} + + +bool PeriodicThread::set_rate(uint32_t rate_hz) +{ + if (_started || rate_hz == 0) { + return false; + } + + _period_usec = hz_to_usec(rate_hz); + + return true; +} + +bool Thread::set_stack_size(size_t stack_size) +{ + if (_started) { + return false; + } + + _stack_size = MAX(stack_size, (size_t) PTHREAD_STACK_MIN); + + return true; +} + +bool PeriodicThread::_run() +{ + if (_period_usec == 0) { + return false; + } + + uint64_t next_run_usec = AP_HAL::micros64() + _period_usec; + + while (!_should_exit) { + uint64_t dt = next_run_usec - AP_HAL::micros64(); + if (dt > _period_usec) { + // we've lost sync - restart + next_run_usec = AP_HAL::micros64(); + } else { + qurt_timer_sleep(dt); + } + next_run_usec += _period_usec; + + _task(); + } + + _started = false; + _should_exit = false; + + return true; +} + +bool PeriodicThread::stop() +{ + if (!is_started()) { + return false; + } + + _should_exit = true; + + return true; +} + +} diff --git a/libraries/AP_HAL_QURT/Thread.h b/libraries/AP_HAL_QURT/Thread.h new file mode 100644 index 0000000000..69985a04d1 --- /dev/null +++ b/libraries/AP_HAL_QURT/Thread.h @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2016 Intel Corporation. All rights reserved. + * + * This file is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ +#pragma once + +#include +#include +#include + +#include + +namespace QURT +{ + +/* + * Interface abstracting threads + */ +class Thread +{ +public: + FUNCTOR_TYPEDEF(task_t, void); + + Thread(task_t t) : _task(t) { } + + virtual ~Thread() { } + + bool start(const char *name, int policy, int prio); + + bool is_current_thread(); + + bool is_started() const + { + return _started; + } + + size_t get_stack_usage(); + + bool set_stack_size(size_t stack_size); + + void set_auto_free(bool auto_free) + { + _auto_free = auto_free; + } + + virtual bool stop() + { + return false; + } + + bool join(); + +protected: + static void *_run_trampoline(void *arg); + + /* + * Run the task assigned in the constructor. May be overriden in case it's + * preferred to use Thread as an interface or when user wants to aggregate + * some initialization or teardown for the thread. + */ + virtual bool _run(); + + void _poison_stack(); + + task_t _task; + bool _started = false; + bool _should_exit = false; + bool _auto_free = false; + pthread_t _ctx = 0; + + struct stack_debug { + uint32_t *start; + uint32_t *end; + } _stack_debug; + + size_t _stack_size = 0; +}; + +class PeriodicThread : public Thread +{ +public: + PeriodicThread(Thread::task_t t) + : Thread(t) + { } + + bool set_rate(uint32_t rate_hz); + + bool stop() override; + +protected: + bool _run() override; + + uint64_t _period_usec = 0; +}; + +} diff --git a/libraries/AP_HAL_QURT/UARTDriver.cpp b/libraries/AP_HAL_QURT/UARTDriver.cpp new file mode 100644 index 0000000000..f1a056df10 --- /dev/null +++ b/libraries/AP_HAL_QURT/UARTDriver.cpp @@ -0,0 +1,277 @@ + +#include "interface.h" +#include "UARTDriver.h" +#include + +#if HAL_GCS_ENABLED +#include +#endif + +extern const AP_HAL::HAL& hal; +using namespace QURT; + +/* QURT implementations of virtual methods */ +void UARTDriver::_begin(uint32_t b, uint16_t rxS, uint16_t txS) +{ + if (_initialised) { + return; + } + + /* we have enough memory to have a larger transmit buffer for + * all ports. This means we don't get delays while waiting to + * write GPS config packets + */ + if (rxS < 4096) { + rxS = 4096; + } + if (txS < 4096) { + txS = 4096; + } + + WITH_SEMAPHORE(_write_mutex); + + if (_writebuf.set_size(txS) && _readbuf.set_size(rxS)) { + _initialised = true; + } +} + +void UARTDriver::_end() +{ +} + +void UARTDriver::_flush() +{ +} + +bool UARTDriver::is_initialized() +{ + return _initialised; +} + +bool UARTDriver::tx_pending() +{ + return (_writebuf.available() > 0); +} + +uint32_t UARTDriver::_available() +{ + if (!_initialised) { + return 0; + } + + WITH_SEMAPHORE(_read_mutex); + + return _readbuf.available(); +} + +uint32_t UARTDriver::txspace() +{ + if (!_initialised) { + return 0; + } + return _writebuf.space(); +} + +bool UARTDriver::_discard_input() +{ + if (!_initialised) { + return false; + } + + WITH_SEMAPHORE(_read_mutex); + + _readbuf.clear(); + return true; +} + +size_t UARTDriver::_write(const uint8_t *buffer, size_t size) +{ + if (!_initialised) { + return 0; + } + WITH_SEMAPHORE(_write_mutex); + + return _writebuf.write(buffer, size); +} + +ssize_t UARTDriver::_read(uint8_t *buffer, uint16_t size) +{ + if (!_initialised) { + return 0; + } + + WITH_SEMAPHORE(_read_mutex); + + return _readbuf.read(buffer, size); +} + +/* + push any pending bytes to/from the serial port. This is called at + 1kHz in the timer thread. Doing it this way reduces the system call + overhead in the main task enormously. + */ +void UARTDriver::_timer_tick(void) +{ + if (!_initialised) { + return; + } + + for (auto i=0; i<10; i++) { + if (!_write_pending_bytes()) { + break; + } + } + + _fill_read_buffer(); +} + +/* + methods for UARTDriver_Console + */ +void UARTDriver_Console::printf(const char *fmt, ...) +{ + va_list ap; + char buf[300]; + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + HAP_PRINTF(buf); +} + + +/* + methods for UARTDriver_MAVLinkUDP + */ +typedef void (*mavlink_data_callback_t)(const struct qurt_rpc_msg *msg, void* p); +extern void register_mavlink_data_callback(uint8_t instance, mavlink_data_callback_t func, void *p); + +UARTDriver_MAVLinkUDP::UARTDriver_MAVLinkUDP(uint8_t instance) : inst(instance) +{ + register_mavlink_data_callback(instance, _mavlink_data_cb, (void *) this); +} + +void UARTDriver_MAVLinkUDP::_mavlink_data_cb(const struct qurt_rpc_msg *msg, void *p) +{ + auto *driver = (UARTDriver_MAVLinkUDP *)p; + driver->_readbuf.write(msg->data, msg->data_length); +} + +/* + try to push out one lump of pending bytes + return true if progress is made + */ +bool UARTDriver_MAVLinkUDP::_write_pending_bytes(void) +{ + WITH_SEMAPHORE(_write_mutex); + + // write any pending bytes + const uint32_t available_bytes = _writebuf.available(); + uint16_t n = available_bytes; + + if (n > 0) { + // send on MAVLink packet boundaries if possible + n = mavlink_packetise(_writebuf, n); + } + + if (n <= 0) { + return false; + } + + struct qurt_rpc_msg msg; + if (n > sizeof(msg.data)) { + return false; + } + msg.msg_id = QURT_MSG_ID_MAVLINK_MSG; + msg.inst = inst; + msg.seq = seq++; + msg.data_length = _writebuf.read(msg.data, n); + + return qurt_rpc_send(msg); +} + +/* + setup baudrate for this local UART + */ +void UARTDriver_Local::_begin(uint32_t b, uint16_t rxS, uint16_t txS) +{ + if (b == 0) { + // re-open not needed + return; + } + + // QURT wants 420000 for CRSF, ArduPilot driver wants 416666 + if (b == 416666) { + b = 420000; + } + + UARTDriver::_begin(b, rxS, txS); + + if (baudrate != b || fd == -1) { + int fd2 = sl_client_config_uart(port_id, b); + if (fd2 == -1 && fd != -1) { + // baudrate rejected, revert to last baudrate + sl_client_config_uart(port_id, baudrate); + } + if (fd2 != -1) { + baudrate = b; + fd = fd2; + } + } +} + +/* + push out pending bytes + */ +bool UARTDriver_Local::_write_pending_bytes(void) +{ + WITH_SEMAPHORE(_write_mutex); + if (fd == -1) { + return false; + } + uint32_t available; + const uint8_t *ptr = _writebuf.readptr(available); + if (ptr != nullptr) { + auto n = sl_client_uart_write(fd, (const char *)ptr, available); + if (n > 0) { + _writebuf.advance(n); + return true; + } + } + return false; +} + +/* + read from the UART into _readbuf + */ +void UARTDriver_Local::_fill_read_buffer(void) +{ + WITH_SEMAPHORE(_read_mutex); + if (fd == -1) { + return; + } + uint32_t n = _readbuf.space(); + if (n > 512) { + n = 512; + } + char buf[n]; + auto nread = sl_client_uart_read(fd, buf, sizeof(buf)); + if (nread > 0) { + _readbuf.write((const uint8_t *)buf, nread); + receive_timestamp_us = AP_HAL::micros64(); + } +} + +/* + return timestamp estimate in microseconds for when the start of a + nbytes packet arrived on the uart. +*/ +uint64_t UARTDriver_Local::receive_time_constraint_us(uint16_t nbytes) +{ + uint64_t last_receive_us = receive_timestamp_us; + if (baudrate > 0) { + // assume 10 bits per byte + uint32_t transport_time_us = (1000000UL * 10UL / baudrate) * (nbytes + available()); + last_receive_us -= transport_time_us; + } + return last_receive_us; +} diff --git a/libraries/AP_HAL_QURT/UARTDriver.h b/libraries/AP_HAL_QURT/UARTDriver.h new file mode 100644 index 0000000000..d27ef2d6b7 --- /dev/null +++ b/libraries/AP_HAL_QURT/UARTDriver.h @@ -0,0 +1,134 @@ +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#pragma once + +#include "AP_HAL_QURT.h" +#include "Semaphores.h" +#include +#include "ap_host/src/protocol.h" + +class QURT::UARTDriver : public AP_HAL::UARTDriver +{ +public: + bool is_initialized() override; + bool tx_pending() override; + + /* Empty implementations of Stream virtual methods */ + uint32_t txspace() override; + + virtual bool _write_pending_bytes(void) + { + return false; + } + virtual void _timer_tick(void) override; + virtual void _fill_read_buffer(void) {} + + virtual uint32_t bw_in_bytes_per_second() const override + { + return 5760; + } + virtual enum AP_HAL::UARTDriver::flow_control get_flow_control(void) override + { + return AP_HAL::UARTDriver::FLOW_CONTROL_DISABLE; + } + +protected: + virtual void _begin(uint32_t b, uint16_t rxS, uint16_t txS) override; + size_t _write(const uint8_t *buffer, size_t size) override; + ssize_t _read(uint8_t *buffer, uint16_t size) override WARN_IF_UNUSED; + void _end() override; + void _flush() override; + uint32_t _available() override; + bool _discard_input() override; + volatile bool _initialised; + + ByteBuffer _readbuf{0}; + ByteBuffer _writebuf{0}; + + QURT::Semaphore _read_mutex; + QURT::Semaphore _write_mutex; +}; + +/* + subclass for console output, maps to HAP_PRINTF +*/ +class QURT::UARTDriver_Console : public QURT::UARTDriver +{ +public: + using UARTDriver::UARTDriver; + virtual void printf(const char *fmt, ...) override; +}; + +/* + subclass for MAVLink UDP communications +*/ + +class QURT::UARTDriver_MAVLinkUDP : public QURT::UARTDriver +{ +public: + UARTDriver_MAVLinkUDP(uint8_t instance); + + bool _write_pending_bytes(void) override; + + uint32_t bw_in_bytes_per_second() const override + { + return 250000 * 3; + } + enum AP_HAL::UARTDriver::flow_control get_flow_control(void) override + { + return AP_HAL::UARTDriver::FLOW_CONTROL_ENABLE; + } + +private: + static void _mavlink_data_cb(const struct qurt_rpc_msg *msg, void *p); + uint8_t inst; + uint32_t seq; +}; + +/* + subclass for local UART communications +*/ +class QURT::UARTDriver_Local : public QURT::UARTDriver +{ +public: + UARTDriver_Local(uint8_t _port_id) : port_id(_port_id) {} + + uint32_t bw_in_bytes_per_second() const override + { + return baudrate?baudrate/10:5760; + } + + bool _write_pending_bytes(void) override; + void _begin(uint32_t b, uint16_t rxS, uint16_t txS) override; + void _fill_read_buffer(void) override; + + uint32_t get_baud_rate() const override + { + return baudrate; + } + + /* + return timestamp estimate in microseconds for when the start of + a nbytes packet arrived on the uart. + */ + uint64_t receive_time_constraint_us(uint16_t nbytes) override; + +private: + const uint8_t port_id; + int fd = -1; + uint32_t baudrate; + uint64_t receive_timestamp_us; +}; diff --git a/libraries/AP_HAL_QURT/Util.cpp b/libraries/AP_HAL_QURT/Util.cpp new file mode 100644 index 0000000000..a0891c3cc3 --- /dev/null +++ b/libraries/AP_HAL_QURT/Util.cpp @@ -0,0 +1,93 @@ +#include +#include "Semaphores.h" +#include + +extern const AP_HAL::HAL& hal; + +#include "Util.h" +#include "RCOutput.h" + +using namespace QURT; + +extern "C" { + void *fc_heap_alloc(size_t size); + void fc_heap_free(void* ptr); + size_t fc_heap_size(void); + size_t fc_heap_usage(void); +} + +uint32_t Util::available_memory(void) +{ + return fc_heap_size() - fc_heap_usage(); +} + +/* + return state of safety switch, if applicable +*/ +Util::safety_state Util::safety_switch_state(void) +{ + const auto *rcout = (QURT::RCOutput *)hal.rcout; + if (rcout != nullptr && rcout->safety_on) { + return SAFETY_DISARMED; + } + return SAFETY_ARMED; +} + +#if ENABLE_HEAP +void *Util::allocate_heap_memory(size_t size) +{ + struct heap *new_heap = (struct heap*)malloc(sizeof(struct heap)); + if (new_heap != nullptr) { + new_heap->max_heap_size = size; + new_heap->current_heap_usage = 0; + } + return (void *)new_heap; +} + +void *Util::heap_realloc(void *h, void *ptr, size_t old_size, size_t new_size) +{ + if (h == nullptr) { + return nullptr; + } + + struct heap *heapp = (struct heap*)h; + + // extract appropriate headers. We use the old_size from the + // header not from the caller. We use SITL to catch cases they + // don't match (which would be a lua bug) + old_size = 0; + heap_allocation_header *old_header = nullptr; + if (ptr != nullptr) { + old_header = ((heap_allocation_header *)ptr) - 1; + old_size = old_header->allocation_size; + } + + if ((heapp->current_heap_usage + new_size - old_size) > heapp->max_heap_size) { + // fail the allocation as we don't have the memory. Note that we don't simulate fragmentation + return nullptr; + } + + heapp->current_heap_usage -= old_size; + if (new_size == 0) { + free(old_header); + return nullptr; + } + + heap_allocation_header *new_header = (heap_allocation_header *)malloc(new_size + sizeof(heap_allocation_header)); + if (new_header == nullptr) { + // can't get the new memory, old memory is kept + return nullptr; + } + heapp->current_heap_usage += new_size; + new_header->allocation_size = new_size; + void *new_mem = new_header + 1; + + if (ptr == nullptr) { + return new_mem; + } + memcpy(new_mem, ptr, old_size > new_size ? new_size : old_size); + free(old_header); + return new_mem; +} + +#endif // ENABLE_HEAP diff --git a/libraries/AP_HAL_QURT/Util.h b/libraries/AP_HAL_QURT/Util.h new file mode 100644 index 0000000000..f1eea1493c --- /dev/null +++ b/libraries/AP_HAL_QURT/Util.h @@ -0,0 +1,43 @@ +#pragma once + +#include +#include "AP_HAL_QURT_Namespace.h" + +class QURT::Util : public AP_HAL::Util +{ +public: + /* + set HW RTC in UTC microseconds + */ + void set_hw_rtc(uint64_t time_utc_usec) override {} + + /* + get system clock in UTC microseconds + */ + uint64_t get_hw_rtc() const override + { + return 0; + } + + uint32_t available_memory(void) override; + + /* + return state of safety switch, if applicable + */ + enum safety_state safety_switch_state(void) override; + +#if ENABLE_HEAP + // heap functions, note that a heap once alloc'd cannot be dealloc'd + virtual void *allocate_heap_memory(size_t size) override; + virtual void *heap_realloc(void *h, void *ptr, size_t old_size, size_t new_size) override; + + struct heap_allocation_header { + uint64_t allocation_size; // size of allocated block, not including this header + }; + + struct heap { + size_t max_heap_size; + size_t current_heap_usage; + }; +#endif // ENABLE_HEAP +}; diff --git a/libraries/AP_HAL_QURT/ap_host/libslpi-link-api/inc/slpi_link.h b/libraries/AP_HAL_QURT/ap_host/libslpi-link-api/inc/slpi_link.h new file mode 100644 index 0000000000..863ad969de --- /dev/null +++ b/libraries/AP_HAL_QURT/ap_host/libslpi-link-api/inc/slpi_link.h @@ -0,0 +1,22 @@ +#ifndef SLPI_LINK_H +#define SLPI_LINK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +typedef void (*slpi_link_cb)(const uint8_t *data, uint32_t length_in_bytes); + +int slpi_link_init(bool enable_debug_messages, slpi_link_cb callback, const char *library_name); +int slpi_link_get_time_offset(void); +int slpi_link_send(const uint8_t *data, uint32_t length_in_bytes); +void slpi_link_reset(void); + +#ifdef __cplusplus +} +#endif + +#endif // SLPI_LINK_H diff --git a/libraries/AP_HAL_QURT/ap_host/libslpi-link-api/src/slpi_link_stub.c b/libraries/AP_HAL_QURT/ap_host/libslpi-link-api/src/slpi_link_stub.c new file mode 100644 index 0000000000..e82fe7a190 --- /dev/null +++ b/libraries/AP_HAL_QURT/ap_host/libslpi-link-api/src/slpi_link_stub.c @@ -0,0 +1,23 @@ + +#include "../inc/slpi_link.h" + +int slpi_link_init(bool enable_debug_messages, slpi_link_cb callback, const char *library_name) +{ + return 0; +} + +int slpi_link_get_time_offset(void) +{ + return 0; +} + +int slpi_link_send(const uint8_t *data, uint32_t length_in_bytes) +{ + return 0; +} + +void slpi_link_reset(void) +{ + return; +} + diff --git a/libraries/AP_HAL_QURT/ap_host/service/README.md b/libraries/AP_HAL_QURT/ap_host/service/README.md new file mode 100644 index 0000000000..63c9d4f83d --- /dev/null +++ b/libraries/AP_HAL_QURT/ap_host/service/README.md @@ -0,0 +1,25 @@ +# ArduPilot on Voxl-2 + +This directory provides a systemd service file for ArduPilot on Voxl2 +by ModalAI + +To build use: + + - ./waf configure --board QURT + - ./waf copter + +To install copy files as follows: + + - voxl-ardupilot.service to /etc/systemd/system/ + - voxl-ardupilot to /usr/bin/ + - build/QURT/ardupilot to /usr/bin/ + - build/QURT/bin/arducopter to /usr/lib/rfsa/adsp/ArduPilot.so + - copy the right parameter file from Tools/Frame_params/ModalAI/ to /data/APM/defaults.parm + +You can then use: + + - systemctl enable voxl-ardupilot.service + - systemctl start voxl-ardupilot + + + diff --git a/libraries/AP_HAL_QURT/ap_host/service/voxl-ardupilot b/libraries/AP_HAL_QURT/ap_host/service/voxl-ardupilot new file mode 100755 index 0000000000..441a53a413 --- /dev/null +++ b/libraries/AP_HAL_QURT/ap_host/service/voxl-ardupilot @@ -0,0 +1,8 @@ +#!/bin/bash + +print_usage() { + echo -e "\nUsage: voxl-ardupilot" + exit 1 +} + +/usr/bin/ardupilot diff --git a/libraries/AP_HAL_QURT/ap_host/service/voxl-ardupilot.service b/libraries/AP_HAL_QURT/ap_host/service/voxl-ardupilot.service new file mode 100644 index 0000000000..c1326183ac --- /dev/null +++ b/libraries/AP_HAL_QURT/ap_host/service/voxl-ardupilot.service @@ -0,0 +1,13 @@ +[Unit] +Description=ArduPilot +After=sscrpcd.service +Requires=sscrpcd.service + +[Service] +Restart=always +RestartSec=1s +ExecStartPre=/bin/sleep 1 +ExecStart=/usr/bin/voxl-ardupilot + +[Install] +WantedBy=multi-user.target diff --git a/libraries/AP_HAL_QURT/ap_host/src/getifaddrs.cpp b/libraries/AP_HAL_QURT/ap_host/src/getifaddrs.cpp new file mode 100644 index 0000000000..54ba54e184 --- /dev/null +++ b/libraries/AP_HAL_QURT/ap_host/src/getifaddrs.cpp @@ -0,0 +1,188 @@ +/* + get system network addresses + + based on code from Samba + + Copyright (C) Andrew Tridgell 1998 + Copyright (C) Jeremy Allison 2007 + Copyright (C) Jelmer Vernooij 2007 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void freeifaddrs(struct ifaddrs *ifp) +{ + if (ifp != nullptr) { + free(ifp->ifa_name); + free(ifp->ifa_addr); + free(ifp->ifa_netmask); + free(ifp->ifa_dstaddr); + freeifaddrs(ifp->ifa_next); + free(ifp); + } +} + +static struct sockaddr *sockaddr_dup(struct sockaddr *sa) +{ + struct sockaddr *ret; + socklen_t socklen; + socklen = sizeof(struct sockaddr_storage); + ret = (struct sockaddr *)calloc(1, socklen); + if (ret == nullptr) { + return nullptr; + } + memcpy(ret, sa, socklen); + return ret; +} + +/* this works for Linux 2.2, Solaris 2.5, SunOS4, HPUX 10.20, OSF1 + V4.0, Ultrix 4.4, SCO Unix 3.2, IRIX 6.4 and FreeBSD 3.2. + + It probably also works on any BSD style system. */ + +int getifaddrs(struct ifaddrs **ifap) +{ + struct ifconf ifc; + char buff[8192]; + int fd, i, n; + struct ifreq *ifr=nullptr; + struct ifaddrs *curif; + struct ifaddrs *lastif = nullptr; + + *ifap = nullptr; + + if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { + return -1; + } + + ifc.ifc_len = sizeof(buff); + ifc.ifc_buf = buff; + + if (ioctl(fd, SIOCGIFCONF, &ifc) != 0) { + close(fd); + return -1; + } + + ifr = ifc.ifc_req; + + n = ifc.ifc_len / sizeof(struct ifreq); + + /* Loop through interfaces, looking for ones that are broadcast capable */ + for (i=n-1; i>=0; i--) { + if (ioctl(fd, SIOCGIFFLAGS, &ifr[i]) == -1) { + freeifaddrs(*ifap); + close(fd); + return -1; + } + + curif = (struct ifaddrs *)calloc(1, sizeof(struct ifaddrs)); + if (curif == nullptr) { + freeifaddrs(*ifap); + close(fd); + return -1; + } + curif->ifa_name = strdup(ifr[i].ifr_name); + if (curif->ifa_name == nullptr) { + free(curif); + freeifaddrs(*ifap); + close(fd); + return -1; + } + curif->ifa_flags = ifr[i].ifr_flags; + curif->ifa_dstaddr = nullptr; + curif->ifa_data = nullptr; + curif->ifa_next = nullptr; + + curif->ifa_addr = nullptr; + if (ioctl(fd, SIOCGIFADDR, &ifr[i]) != -1) { + curif->ifa_addr = sockaddr_dup(&ifr[i].ifr_addr); + if (curif->ifa_addr == nullptr) { + free(curif->ifa_name); + free(curif); + freeifaddrs(*ifap); + close(fd); + return -1; + } + } + + curif->ifa_netmask = nullptr; + if (ioctl(fd, SIOCGIFNETMASK, &ifr[i]) != -1) { + curif->ifa_netmask = sockaddr_dup(&ifr[i].ifr_addr); + if (curif->ifa_netmask == nullptr) { + if (curif->ifa_addr != nullptr) { + free(curif->ifa_addr); + } + free(curif->ifa_name); + free(curif); + freeifaddrs(*ifap); + close(fd); + return -1; + } + } + + if (lastif == nullptr) { + *ifap = curif; + } else { + lastif->ifa_next = curif; + } + lastif = curif; + } + + close(fd); + + return 0; +} + +const char *get_ipv4_broadcast(void) +{ + struct ifaddrs *ifap = nullptr; + if (getifaddrs(&ifap) != 0) { + return nullptr; + } + struct ifaddrs *ia; + for (ia=ifap; ia; ia=ia->ifa_next) { + struct sockaddr_in *sin = (struct sockaddr_in *)ia->ifa_addr; + struct sockaddr_in *nmask = (struct sockaddr_in *)ia->ifa_netmask; + struct in_addr bcast; + if (strcmp(ia->ifa_name, "lo") == 0) { + continue; + } + bcast.s_addr = sin->sin_addr.s_addr | ~nmask->sin_addr.s_addr; + const char *ret = inet_ntoa(bcast); + freeifaddrs(ifap); + return ret; + } + freeifaddrs(ifap); + return nullptr; +} + +#ifdef MAIN_PROGRAM +int main(void) +{ + printf("%s\n", get_ipv4_broadcast()); + return 0; +} +#endif diff --git a/libraries/AP_HAL_QURT/ap_host/src/getifaddrs.h b/libraries/AP_HAL_QURT/ap_host/src/getifaddrs.h new file mode 100644 index 0000000000..6fe4105195 --- /dev/null +++ b/libraries/AP_HAL_QURT/ap_host/src/getifaddrs.h @@ -0,0 +1,2 @@ +const char *get_ipv4_broadcast(void); + diff --git a/libraries/AP_HAL_QURT/ap_host/src/main.cpp b/libraries/AP_HAL_QURT/ap_host/src/main.cpp new file mode 100644 index 0000000000..135c281195 --- /dev/null +++ b/libraries/AP_HAL_QURT/ap_host/src/main.cpp @@ -0,0 +1,336 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "slpi_link.h" +#include "protocol.h" +#include "getifaddrs.h" + +volatile bool _running = false; +static bool enable_debug = false; +static bool enable_remote_debug = false; + +static int gcs_socket_fd; +static int obd_socket_fd; +static bool gcs_connected; +static bool obd_connected; +static struct sockaddr_in gcs_addr; +static struct sockaddr_in obd_addr; + +#define SO_NAME "ArduPilot.so" + +// setup for mavlink to localhost +#define MAVLINK_UDP_LOCALHOST 1 + +// Ports for onboard stream +#define MAVLINK_OBD_UDP_PORT_LOCAL 14556 +#define MAVLINK_OBD_UDP_PORT_REMOTE 14557 + +// Ports for external GCS stream +#define MAVLINK_GCS_UDP_PORT_LOCAL 14558 +#define MAVLINK_GCS_UDP_PORT_REMOTE 14559 + + +// directory for logs, parameters, terrain etc +#define DATA_DIRECTORY "/data/APM" + +static void shutdown_signal_handler(int signo) +{ + switch (signo) { + case SIGINT: // normal ctrl-c shutdown interrupt + _running = false; + fprintf(stderr, "\nreceived SIGINT Ctrl-C\n"); + break; + case SIGTERM: // catchable terminate signal + _running = false; + fprintf(stderr, "\nreceived SIGTERM\n"); + break; + case SIGHUP: + // terminal closed or disconnected, carry on anyway + fprintf(stderr, "\nreceived SIGHUP, continuing anyway\n"); + break; + default: + fprintf(stderr, "\nreceived signal %d\n", signo); + break; + } + return; +} + +static void slpi_init(void); + +static uint32_t num_params = 0; +static uint32_t expected_seq[MAX_MAVLINK_INSTANCES] = {0, 0}; + +static void receive_callback(const uint8_t *data, uint32_t length_in_bytes) +{ + if (enable_debug) { + printf("Got %u bytes in receive callback\n", length_in_bytes); + } + const auto *msg = (const struct qurt_rpc_msg *)data; + if (length_in_bytes < QURT_RPC_MSG_HEADER_LEN) { + printf("Invalid length_in_bytes %d", length_in_bytes); + return; + } + if (msg->data_length + QURT_RPC_MSG_HEADER_LEN != length_in_bytes) { + printf("Invalid lengths %d %d\n", msg->data_length, length_in_bytes); + return; + } + if (msg->inst < MAX_MAVLINK_INSTANCES) { + if (msg->seq != expected_seq[msg->inst]) { + printf("Invalid seq %u %u\n", msg->seq, expected_seq[msg->inst]); + } + } else { + printf("Invalid instance %u\n", msg->inst); + } + expected_seq[msg->inst] = msg->seq + 1; + + switch (msg->msg_id) { + case QURT_MSG_ID_MAVLINK_MSG: { + if (_running) { + if (msg->inst == 0) { + const auto bytes_sent = sendto(gcs_socket_fd, msg->data, msg->data_length, 0, (struct sockaddr *)&gcs_addr, sizeof(gcs_addr)); + if (bytes_sent <= 0) { + fprintf(stderr, "Send to GCS failed\n"); + } + } else if (msg->inst == 1) { + const auto bytes_sent = sendto(obd_socket_fd, msg->data, msg->data_length, 0, (struct sockaddr *)&obd_addr, sizeof(obd_addr)); + if (bytes_sent <= 0) { + fprintf(stderr, "Send to onboard failed\n"); + } + } + } + break; + } + case QURT_MSG_ID_REBOOT: { + printf("Rebooting\n"); + exit(0); + break; + } + default: + fprintf(stderr, "Got unknown message id %d\n", msg->msg_id); + break; + } +} + +static void slpi_init(void) +{ + int r; + while ((r=slpi_link_init(enable_remote_debug, &receive_callback, SO_NAME)) != 0) { + fprintf(stderr, "slpi_link_init error %d %s, retrying\n", r, strerror(errno)); + sleep(1); + } +} + +/* + setup directories for the hexagon code to use + */ +static void setup_directores(void) +{ + struct stat st; + + mkdir(DATA_DIRECTORY, 0777); + chmod(DATA_DIRECTORY, 0777); + if (stat(DATA_DIRECTORY, &st) != 0 || !S_ISDIR(st.st_mode)) { + printf("Unable to create %s", DATA_DIRECTORY); + exit(1); + } +} + +void *obd_recv_thread(void *) +{ + + uint32_t next_seq = 0; + + printf("Waiting for OBD receive\n"); + + while (_running) { + struct qurt_rpc_msg msg {}; + struct sockaddr_in from; + socklen_t fromlen = sizeof(from); + uint32_t bytes_received = recvfrom(obd_socket_fd, msg.data, sizeof(msg.data), 0, + (struct sockaddr*)&from, &fromlen); + if (bytes_received > 0 && !obd_connected) { + obd_addr = from; + obd_connected = true; + printf("Connnected to OBD addr %s\n", inet_ntoa(from.sin_addr)); + } + if (bytes_received < 0) { + fprintf(stderr, "OBD receive failed"); + continue; + } + if (bytes_received > sizeof(msg.data)) { + printf("Invalid bytes_received %d\n", bytes_received); + continue; + } + msg.msg_id = QURT_MSG_ID_MAVLINK_MSG; + msg.inst = 1; + msg.data_length = bytes_received; + msg.seq = next_seq++; + // printf("Message received. %d bytes\n", bytes_received); + if (slpi_link_send((const uint8_t*) &msg, bytes_received + QURT_RPC_MSG_HEADER_LEN)) { + fprintf(stderr, "slpi_link_send_data failed for instance 1\n"); + } + } + + return NULL; +} + +int main() +{ + printf("Starting up\n"); + + setup_directores(); + + // make the sigaction struct for shutdown signals + // sa_handler and sa_sigaction is a union, only set one + struct sigaction action; + action.sa_handler = shutdown_signal_handler; + sigemptyset(&action.sa_mask); + action.sa_flags = 0; + + // set actions + if (sigaction(SIGINT, &action, NULL) < 0) { + fprintf(stderr, "ERROR: failed to set sigaction\n"); + return -1; + } + if (sigaction(SIGTERM, &action, NULL) < 0) { + fprintf(stderr, "ERROR: failed to set sigaction\n"); + return -1; + } + if (sigaction(SIGHUP, &action, NULL) < 0) { + fprintf(stderr, "ERROR: failed to set sigaction\n"); + return -1; + } + + slpi_init(); + + //initialize sockets and structures + gcs_socket_fd = socket(AF_INET, SOCK_DGRAM, 0); + if (gcs_socket_fd == -1) { + fprintf(stderr, "Could not create GCS socket"); + return -1; + } + obd_socket_fd = socket(AF_INET, SOCK_DGRAM, 0); + if (obd_socket_fd == -1) { + fprintf(stderr, "Could not create OBD socket"); + return -1; + } + +#if MAVLINK_UDP_LOCALHOST + // send to mavlink router on localhost for GCS + gcs_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + gcs_addr.sin_family = AF_INET; + gcs_addr.sin_port = htons(MAVLINK_GCS_UDP_PORT_REMOTE); + + struct sockaddr_in gcs_local {}; + gcs_local.sin_addr.s_addr = INADDR_ANY; + gcs_local.sin_family = AF_INET; + gcs_local.sin_port = htons(MAVLINK_GCS_UDP_PORT_LOCAL); + + if (bind(gcs_socket_fd, (struct sockaddr *)&gcs_local, sizeof(gcs_local)) == 0) { + printf("Bind localhost GCS socket OK\n"); + } else { + printf("Bind localhost GCS socket failed: %s", strerror(errno)); + } + + // send to mavlink router on localhost for onboard stream + obd_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + obd_addr.sin_family = AF_INET; + obd_addr.sin_port = htons(MAVLINK_OBD_UDP_PORT_REMOTE); + + struct sockaddr_in obd_local {}; + obd_local.sin_addr.s_addr = INADDR_ANY; + obd_local.sin_family = AF_INET; + obd_local.sin_port = htons(MAVLINK_OBD_UDP_PORT_LOCAL); + + if (bind(obd_socket_fd, (struct sockaddr *)&obd_local, sizeof(obd_local)) == 0) { + printf("Bind localhost OBD socket OK\n"); + } else { + printf("Bind localhost OBD socket failed: %s", strerror(errno)); + } +#else + // broadcast directly to the local network broadcast address + const char *bcast_address = get_ipv4_broadcast(); + printf("Broadcast address=%s\n", bcast_address); + inet_aton(bcast_address, &gcs_addr.sin_addr); + gcs_addr.sin_family = AF_INET; + gcs_addr.sin_port = htons(UDP_OUT_PORT); + + int one = 1; + setsockopt(socket_fd,SOL_SOCKET,SO_BROADCAST,(char *)&one,sizeof(one)); + + struct sockaddr_in any {}; + any.sin_addr.s_addr = INADDR_ANY; + any.sin_port = htons(15550); + + if (bind(socket_fd, (struct sockaddr *)&any, sizeof(any)) == 0) { + printf("Bind OK\n"); + } else { + printf("Bind failed: %s", strerror(errno)); + } +#endif + + printf("Enter ctrl-c to exit\n"); + _running = true; + + pthread_t obd_recv_thread_id; + pthread_attr_t obd_recv_thread_attr; + pthread_attr_init(&obd_recv_thread_attr); + pthread_create(&obd_recv_thread_id, &obd_recv_thread_attr, obd_recv_thread, NULL); + + uint32_t next_seq = 0; + + printf("Waiting for GCS receive\n"); + + while (_running) { + struct qurt_rpc_msg msg {}; + struct sockaddr_in from; + socklen_t fromlen = sizeof(from); + uint32_t bytes_received = recvfrom(gcs_socket_fd, msg.data, sizeof(msg.data), 0, + (struct sockaddr*)&from, &fromlen); + if (bytes_received > 0 && !gcs_connected) { + gcs_addr = from; + gcs_connected = true; + printf("Connnected to GCS at %s\n", inet_ntoa(from.sin_addr)); + } + if (bytes_received < 0) { + fprintf(stderr, "GCS receive failed"); + continue; + } + if (bytes_received > sizeof(msg.data)) { + printf("Invalid bytes_received %d\n", bytes_received); + continue; + } + msg.msg_id = QURT_MSG_ID_MAVLINK_MSG; + msg.inst = 0; + msg.data_length = bytes_received; + msg.seq = next_seq++; + // printf("Message received. %d bytes\n", bytes_received); + if (slpi_link_send((const uint8_t*) &msg, bytes_received + QURT_RPC_MSG_HEADER_LEN)) { + fprintf(stderr, "slpi_link_send_data failed for instance 0\n"); + } + } + + printf("Reseting SLPI\n"); + // Send reset to SLPI + slpi_link_reset(); + sleep(1); + + printf("Exiting\n"); + + return 0; +} + diff --git a/libraries/AP_HAL_QURT/ap_host/src/protocol.h b/libraries/AP_HAL_QURT/ap_host/src/protocol.h new file mode 100644 index 0000000000..8e8782e192 --- /dev/null +++ b/libraries/AP_HAL_QURT/ap_host/src/protocol.h @@ -0,0 +1,20 @@ + +#include + +#pragma once + +#define QURT_MSG_ID_MAVLINK_MSG 1 +#define QURT_MSG_ID_REBOOT 2 + +#define MAX_MAVLINK_INSTANCES 2 + +struct __attribute__((__packed__)) qurt_rpc_msg { + uint8_t msg_id; + uint8_t inst; + uint16_t data_length; + uint32_t seq; + uint8_t data[300]; +}; + +#define QURT_RPC_MSG_HEADER_LEN 8 + diff --git a/libraries/AP_HAL_QURT/interface.h b/libraries/AP_HAL_QURT/interface.h new file mode 100644 index 0000000000..fb3019f127 --- /dev/null +++ b/libraries/AP_HAL_QURT/interface.h @@ -0,0 +1,49 @@ +#define __EXPORT __attribute__ ((visibility ("default"))) + +#ifndef __cplusplus +#error "C++ should be defined!!!" +#endif + +#include + +// Functions that are called by the SLPI LINK server into AP client +extern "C" { + // Called by the SLPI LINK server to initialize and start AP + int slpi_link_client_init(void) __EXPORT; + + // Called by the SLPI LINK server when there is a new message for AP + int slpi_link_client_receive(const uint8_t *data, int data_len_in_bytes) __EXPORT; +} + +// Functions in SLPI LINK server that are called by AP client into DSP +extern "C" { + // Send a message to the applications processor + int sl_client_send_data(const uint8_t *data, int data_len_in_bytes); + + void sl_client_register_fatal_error_cb(void (*func)(void)); + + // Interrupt callback registration + int sl_client_register_interrupt_callback(int (*func)(int, void*, void*), void* arg); + + // Get DSP CPU utilization (0 - 100) + int sl_client_get_cpu_utilization(void); + + // I2C interface API + int sl_client_config_i2c_bus(uint8_t bus_number, uint8_t address, uint32_t frequency); + void sl_client_set_address_i2c_bus(int fd, uint8_t address); + int sl_client_i2c_transfer(int fd, const uint8_t *send, const unsigned send_len, uint8_t *recv, const unsigned recv_len); + + // SPI interface API + int sl_client_spi_transfer(int fd, const uint8_t *send, uint8_t *recv, const unsigned len); + int sl_client_config_spi_bus(void); + + // UART interface API + int sl_client_config_uart(uint8_t port_number, uint32_t speed); + int sl_client_uart_write(int fd, const char *data, const unsigned data_len); + int sl_client_uart_read(int fd, char *buffer, const unsigned buffer_len); +} + +// IDs for serial ports +#define QURT_UART_GPS 6 +#define QURT_UART_RCIN 7 +#define QURT_UART_ESC 2 diff --git a/libraries/AP_HAL_QURT/malloc.cpp b/libraries/AP_HAL_QURT/malloc.cpp new file mode 100644 index 0000000000..5a3c40ed2f --- /dev/null +++ b/libraries/AP_HAL_QURT/malloc.cpp @@ -0,0 +1,84 @@ +/* + wrappers around core memory allocation functions from libc +*/ + +#include +#include +#include + +const std::nothrow_t std::nothrow; + +extern "C" { + void *fc_heap_alloc(size_t size); + void fc_heap_free(void* ptr); + + void *__wrap_malloc(size_t size); + void __wrap_free(void *ptr); + void *__wrap_calloc(size_t nmemb, size_t size); + void *__wrap_realloc(void *ptr, size_t size); +} + +#define HEAP_HEADER_MAGIC 0x1763247F + +typedef struct { + size_t size; + uint32_t magic; +} heap_header_t; + +void *__wrap_malloc(size_t size) +{ + // fc_heap_alloc guarantees zero filled memory + auto *ret = (heap_header_t *)fc_heap_alloc(size+sizeof(heap_header_t)); + if (ret == nullptr) { + return nullptr; + } + ret->size = size; + ret->magic = HEAP_HEADER_MAGIC; + return (void*)(ret+1); +} + +void __wrap_free(void *ptr) +{ + if (ptr == nullptr) { + return; + } + auto *h = ((heap_header_t *)ptr)-1; + if (h->magic != HEAP_HEADER_MAGIC) { + AP_HAL::panic("free: bad memory header 0x%x", unsigned(h->magic)); + } + fc_heap_free((void*)h); +} + +void *__wrap_calloc(size_t nmemb, size_t size) +{ + return __wrap_malloc(nmemb*size); +} + +void *__wrap_realloc(void *ptr, size_t size) +{ + if (size == 0) { + // a free + __wrap_free(ptr); + return nullptr; + } + if (ptr == nullptr) { + // new allocation + return __wrap_malloc(size); + } + + auto *h = ((heap_header_t *)ptr)-1; + if (h->magic != HEAP_HEADER_MAGIC) { + AP_HAL::panic("realloc: bad memory header 0x%x", unsigned(h->magic)); + } + + void *ret = __wrap_malloc(size); + if (ret == nullptr) { + return nullptr; + } + const size_t copy_size = size > h->size? h->size : size; + memcpy(ret, ptr, copy_size); + __wrap_free(ptr); + + return ret; +} + diff --git a/libraries/AP_HAL_QURT/replace.cpp b/libraries/AP_HAL_QURT/replace.cpp new file mode 100644 index 0000000000..6f331f6a1f --- /dev/null +++ b/libraries/AP_HAL_QURT/replace.cpp @@ -0,0 +1,225 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "replace.h" +#include "interface.h" +#include "ap_host/src/protocol.h" + +extern "C" { + + // this is not declared in qurt headers + void HAP_debug(const char *msg, int level, const char *filename, int line); + + void HAP_printf(const char *file, int line, const char *format, ...) + { + va_list ap; + char buf[300]; + + va_start(ap, format); + vsnprintf(buf, sizeof(buf), format, ap); + va_end(ap); + HAP_debug(buf, 0, file, line); + //usleep(20000); + } + + /** + QURT doesn't have strnlen() + **/ + size_t strnlen(const char *s, size_t max) + { + size_t len; + + for (len = 0; len < max; len++) { + if (s[len] == '\0') { + break; + } + } + return len; + } + + int vasprintf(char **ptr, const char *format, va_list ap) + { + int ret; + va_list ap2; + + va_copy(ap2, ap); + ret = vsnprintf(nullptr, 0, format, ap2); + va_end(ap2); + if (ret < 0) { + return ret; + } + + (*ptr) = (char *)malloc(ret+1); + if (!*ptr) { + return -1; + } + + va_copy(ap2, ap); + ret = vsnprintf(*ptr, ret+1, format, ap2); + va_end(ap2); + + return ret; + } + + int asprintf(char **ptr, const char *format, ...) + { + va_list ap; + int ret; + + *ptr = nullptr; + va_start(ap, format); + ret = vasprintf(ptr, format, ap); + va_end(ap); + + return ret; + } + + void *memmem(const void *haystack, size_t haystacklen, + const void *needle, size_t needlelen) + { + if (needlelen == 0) { + return const_cast(haystack); + } + while (haystacklen >= needlelen) { + char *p = (char *)memchr(haystack, *(const char *)needle, + haystacklen-(needlelen-1)); + if (!p) { + return NULL; + } + if (memcmp(p, needle, needlelen) == 0) { + return p; + } + haystack = p+1; + haystacklen -= (p - (const char *)haystack) + 1; + } + return NULL; + } + + char *strndup(const char *s, size_t n) + { + char *ret; + + n = strnlen(s, n); + ret = (char*)malloc(n+1); + if (!ret) { + return NULL; + } + memcpy(ret, s, n); + ret[n] = 0; + + return ret; + } + + int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *attr) + { + return 0; + } + + // INVESTIGATE: What is this needed on QURT? + int apfs_rename(const char *oldpath, const char *newpath) + { + return 0; + } + + // INVESTIGATE: Seems important :-) + int ArduPilot_main(int argc, const char *argv[]) + { + return 0; + } + + char *__wrap_strdup(const char *s); +} + +extern "C" int qurt_ardupilot_main(int argc, char* const argv[]); + +int slpi_link_client_init(void) +{ + HAP_PRINTF("About to call qurt_ardupilot_main %p", &qurt_ardupilot_main); + + qurt_ardupilot_main(0, NULL); + + return 0; +} + +typedef void (*mavlink_data_callback_t)(const struct qurt_rpc_msg *msg, void* p); + +static mavlink_data_callback_t mav_cb[MAX_MAVLINK_INSTANCES]; +static void *mav_cb_ptr[MAX_MAVLINK_INSTANCES]; +static uint32_t expected_seq; + +void register_mavlink_data_callback(uint8_t instance, mavlink_data_callback_t func, void *p) +{ + if (instance < MAX_MAVLINK_INSTANCES) { + mav_cb[instance] = func; + mav_cb_ptr[instance] = p; + } else { + HAP_PRINTF("Error: Invalid mavlink instance %u", instance); + } +} + +int slpi_link_client_receive(const uint8_t *data, int data_len_in_bytes) +{ + if (data_len_in_bytes < QURT_RPC_MSG_HEADER_LEN) { + return 0; + } + const auto *msg = (struct qurt_rpc_msg *)data; + if (msg->data_length + QURT_RPC_MSG_HEADER_LEN != data_len_in_bytes) { + return 0; + } + if (msg->seq != expected_seq) { + HAP_PRINTF("Bad sequence %u %u", msg->seq, expected_seq); + } + expected_seq = msg->seq + 1; + + switch (msg->msg_id) { + case QURT_MSG_ID_MAVLINK_MSG: { + if ((msg->inst < MAX_MAVLINK_INSTANCES) && (mav_cb[msg->inst])) { + mav_cb[msg->inst](msg, mav_cb_ptr[msg->inst]); + } + break; + } + default: + HAP_PRINTF("Got unknown message id %d", msg->msg_id); + break; + } + + return 0; +} + +int __wrap_printf(const char *fmt, ...) +{ + va_list ap; + + char buf[300]; + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + HAP_PRINTF(buf); + + return 0; +} + +/* + free() on strdup return on QURT causes a memory fault + */ +char *__wrap_strdup(const char *s) +{ + return strndup(s, strlen(s)); +} + +/* + send a RPC message to the host + */ +bool qurt_rpc_send(struct qurt_rpc_msg &msg) +{ + if (msg.data_length > sizeof(msg.data)) { + return false; + } + return sl_client_send_data((const uint8_t*)&msg, msg.data_length + QURT_RPC_MSG_HEADER_LEN) >= 0; +} diff --git a/libraries/AP_HAL_QURT/replace.h b/libraries/AP_HAL_QURT/replace.h new file mode 100644 index 0000000000..0fb943e6ee --- /dev/null +++ b/libraries/AP_HAL_QURT/replace.h @@ -0,0 +1,56 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include +#include "ap_host/src/protocol.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + work around broken headers + */ +size_t strnlen(const char *s, size_t maxlen); +char *strndup(const char *s, size_t n); +int asprintf(char **, const char *, ...); +off_t lseek(int, off_t, int); +DIR *opendir (const char *); +int unlink(const char *pathname); +void *memmem(const void *haystack, size_t haystacklen, + const void *needle, size_t needlelen); + +//typedef int32_t pid_t; +pid_t getpid (void); + +void HAP_printf(const char *file, int line, const char *fmt, ...); + +int __wrap_printf(const char *fmt, ...); + +#ifdef __cplusplus +} +#endif + +#define HAP_PRINTF(...) HAP_printf(__FILE__, __LINE__, __VA_ARGS__) + +extern volatile int _last_dsp_line; +extern volatile const char *_last_dsp_file; +extern volatile uint32_t _last_counter; + +#define HAP_LINE() do { _last_dsp_line = __LINE__; _last_dsp_file = __FILE__; _last_counter++; } while (0) + +// missing defines from math.h +#define M_SQRT1_2 0.70710678118654752440 + +#ifdef __cplusplus +// send a message to the host +bool qurt_rpc_send(struct qurt_rpc_msg &msg); +#endif + diff --git a/libraries/AP_HAL_QURT/system.cpp b/libraries/AP_HAL_QURT/system.cpp new file mode 100644 index 0000000000..f6d8b8fa5d --- /dev/null +++ b/libraries/AP_HAL_QURT/system.cpp @@ -0,0 +1,65 @@ +#include +#include +#include +#include + +#include +#include + +#include "replace.h" +#include +#include + +extern const AP_HAL::HAL& hal; + +namespace AP_HAL +{ + +static struct { + uint64_t start_time; +} state; + +void init() +{ + state.start_time = micros64(); + // we don't want exceptions in flight code. That is the job of SITL + feclearexcept(FE_OVERFLOW | FE_DIVBYZERO | FE_INVALID); +} + +void panic(const char *errormsg, ...) +{ + char buf[200]; + va_list ap; + va_start(ap, errormsg); + vsnprintf(buf, sizeof(buf), errormsg, ap); + va_end(ap); + HAP_PRINTF("PANIC: %s", buf); + qurt_timer_sleep(100000); + exit(1); +} + +uint32_t micros() +{ + return micros64() & 0xFFFFFFFF; +} + +uint32_t millis() +{ + return millis64() & 0xFFFFFFFF; +} + +uint64_t micros64() +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + uint64_t ret = ts.tv_sec*1000*1000ULL + uint64_div1000(ts.tv_nsec); + ret -= state.start_time; + return ret; +} + +uint64_t millis64() +{ + return uint64_div1000(micros64()); +} + +} // namespace AP_HAL diff --git a/libraries/AP_HAL_SITL/AnalogIn.cpp b/libraries/AP_HAL_SITL/AnalogIn.cpp index 84800fc0f2..6f3d17d9a9 100644 --- a/libraries/AP_HAL_SITL/AnalogIn.cpp +++ b/libraries/AP_HAL_SITL/AnalogIn.cpp @@ -62,7 +62,7 @@ float ADCSource::read_latest() { bool ADCSource::set_pin(uint8_t pin) { _pin = pin; - return true; + return pin != ANALOG_INPUT_NONE; } void AnalogIn::init() { diff --git a/libraries/AP_HAL_SITL/CANSocketIface.cpp b/libraries/AP_HAL_SITL/CANSocketIface.cpp index 48a32af1f0..7011c2206b 100644 --- a/libraries/AP_HAL_SITL/CANSocketIface.cpp +++ b/libraries/AP_HAL_SITL/CANSocketIface.cpp @@ -219,10 +219,14 @@ bool CANIface::init(const uint32_t bitrate, const OperatingMode mode) case SITL::SIM::CANTransport::MulticastUDP: transport = NEW_NOTHROW CAN_Multicast(); break; - case SITL::SIM::CANTransport::SocketCAN: #if HAL_CAN_WITH_SOCKETCAN + case SITL::SIM::CANTransport::SocketCAN: transport = NEW_NOTHROW CAN_SocketCAN(); + break; #endif + case SITL::SIM::CANTransport::None: + default: // if user supplies an invalid value for the parameter + transport = nullptr; break; } if (transport == nullptr) { diff --git a/libraries/AP_HAL_SITL/RCOutput.h b/libraries/AP_HAL_SITL/RCOutput.h index fe6324d4ba..8192404794 100644 --- a/libraries/AP_HAL_SITL/RCOutput.h +++ b/libraries/AP_HAL_SITL/RCOutput.h @@ -54,7 +54,7 @@ private: bool _corked; uint16_t _pending[SITL_NUM_CHANNELS]; - AP_HAL::Util::safety_state safety_state; + AP_HAL::Util::safety_state safety_state = AP_HAL::Util::safety_state::SAFETY_DISARMED; }; #endif diff --git a/libraries/AP_HAL_SITL/SITL_Periph_State.cpp b/libraries/AP_HAL_SITL/SITL_Periph_State.cpp index b455fcafb7..c90b40218b 100644 --- a/libraries/AP_HAL_SITL/SITL_Periph_State.cpp +++ b/libraries/AP_HAL_SITL/SITL_Periph_State.cpp @@ -124,10 +124,9 @@ void SITL_State::wait_clock(uint64_t wait_time_usec) { while (AP_HAL::micros64() < wait_time_usec) { struct sitl_input input {}; - sitl_model->update(input); + sitl_model->update(input); // delays up to 1 millisecond sim_update(); update_voltage_current(input, 0); - usleep(100); } } @@ -195,7 +194,7 @@ void SimMCast::multicast_read(void) printf("Waiting for multicast state\n"); } struct SITL::sitl_fdm state; - while (sock.recv((void*)&state, sizeof(state), 0) != sizeof(state)) { + while (sock.recv((void*)&state, sizeof(state), 1) != sizeof(state)) { // nop } if (_sitl->state.timestamp_us == 0) { diff --git a/libraries/AP_HAL_SITL/SITL_State.cpp b/libraries/AP_HAL_SITL/SITL_State.cpp index 2d49bb606b..af55acaa1f 100644 --- a/libraries/AP_HAL_SITL/SITL_State.cpp +++ b/libraries/AP_HAL_SITL/SITL_State.cpp @@ -79,9 +79,11 @@ void SITL_State::_sitl_setup() if (_sitl != nullptr) { // setup some initial values _update_airspeed(0); +#if AP_SIM_SOLOGIMBAL_ENABLED if (enable_gimbal) { - gimbal = NEW_NOTHROW SITL::Gimbal(_sitl->state); + gimbal = NEW_NOTHROW SITL::SoloGimbal(); } +#endif sitl_model->set_buzzer(&_sitl->buzzer_sim); sitl_model->set_sprayer(&_sitl->sprayer_sim); diff --git a/libraries/AP_HAL_SITL/SITL_State_common.cpp b/libraries/AP_HAL_SITL/SITL_State_common.cpp index 1a45ed97d9..54a530bc44 100644 --- a/libraries/AP_HAL_SITL/SITL_State_common.cpp +++ b/libraries/AP_HAL_SITL/SITL_State_common.cpp @@ -332,9 +332,9 @@ SITL::SerialDevice *SITL_State_Common::create_serial_sim(const char *name, const */ void SITL_State_Common::sim_update(void) { -#if HAL_SIM_GIMBAL_ENABLED +#if AP_SIM_SOLOGIMBAL_ENABLED if (gimbal != nullptr) { - gimbal->update(); + gimbal->update(*sitl_model); } #endif #if HAL_SIM_ADSB_ENABLED diff --git a/libraries/AP_HAL_SITL/SITL_State_common.h b/libraries/AP_HAL_SITL/SITL_State_common.h index 7bb4c04348..95ef129c1c 100644 --- a/libraries/AP_HAL_SITL/SITL_State_common.h +++ b/libraries/AP_HAL_SITL/SITL_State_common.h @@ -9,7 +9,7 @@ #define SITL_SERVO_PORT 20722 #include -#include +#include #include #include #include @@ -104,11 +104,11 @@ public: bool new_rc_input; uint16_t pwm_output[SITL_NUM_CHANNELS]; bool output_ready = false; - -#if HAL_SIM_GIMBAL_ENABLED + +#if AP_SIM_SOLOGIMBAL_ENABLED // simulated gimbal bool enable_gimbal; - SITL::Gimbal *gimbal; + SITL::SoloGimbal *gimbal; #endif #if HAL_SIM_ADSB_ENABLED diff --git a/libraries/AP_HAL_SITL/SITL_cmdline.cpp b/libraries/AP_HAL_SITL/SITL_cmdline.cpp index 30cea03245..042bb2ce7f 100644 --- a/libraries/AP_HAL_SITL/SITL_cmdline.cpp +++ b/libraries/AP_HAL_SITL/SITL_cmdline.cpp @@ -439,9 +439,11 @@ void SITL_State::_parse_command_line(int argc, char * const argv[]) case 'v': vehicle_str = gopt.optarg; break; +#if AP_SIM_SOLOGIMBAL_ENABLED case CMDLINE_GIMBAL: enable_gimbal = true; break; +#endif case CMDLINE_FGVIEW: _use_fg_view = true; break; diff --git a/libraries/AP_HAL_SITL/Util.cpp b/libraries/AP_HAL_SITL/Util.cpp index ce51bd8fd3..1805e21720 100644 --- a/libraries/AP_HAL_SITL/Util.cpp +++ b/libraries/AP_HAL_SITL/Util.cpp @@ -85,7 +85,7 @@ bool HALSITL::Util::get_system_id(char buf[50]) return get_system_id_unformatted((uint8_t *)buf, len); } -#ifdef ENABLE_HEAP +#if ENABLE_HEAP void *HALSITL::Util::allocate_heap_memory(size_t size) { struct heap *new_heap = (struct heap*)malloc(sizeof(struct heap)); diff --git a/libraries/AP_HAL_SITL/Util.h b/libraries/AP_HAL_SITL/Util.h index 588fc2a25a..ac73c6a365 100644 --- a/libraries/AP_HAL_SITL/Util.h +++ b/libraries/AP_HAL_SITL/Util.h @@ -17,10 +17,6 @@ public: Util(SITL_State *_sitlState) : sitlState(_sitlState) {} - bool run_debug_shell(AP_HAL::BetterStream *stream) override { - return false; - } - /** how much free memory do we have in bytes. */ @@ -47,7 +43,7 @@ public: bool get_system_id_unformatted(uint8_t buf[], uint8_t &len) override; void dump_stack_trace(); -#ifdef ENABLE_HEAP +#if ENABLE_HEAP // heap functions, note that a heap once alloc'd cannot be dealloc'd void *allocate_heap_memory(size_t size) override; void *heap_realloc(void *heap, void *ptr, size_t old_size, size_t new_size) override; @@ -94,7 +90,7 @@ private: static ToneAlarm_SF _toneAlarm; #endif -#ifdef ENABLE_HEAP +#if ENABLE_HEAP struct heap_allocation_header { size_t allocation_size; // size of allocated block, not including this header }; diff --git a/libraries/AP_HAL_SITL/system.cpp b/libraries/AP_HAL_SITL/system.cpp index 81c5b4941b..2bbcbb8e73 100644 --- a/libraries/AP_HAL_SITL/system.cpp +++ b/libraries/AP_HAL_SITL/system.cpp @@ -65,13 +65,24 @@ static void run_command_on_ownpid(const char *commandname) // find dumpstack command: const char *command_filepath = commandname; // if we can't find it trust in PATH struct stat statbuf; + const char *custom_scripts_dir_path = getenv("AP_SCRIPTS_DIR_PATH"); + char *custom_scripts_dir_path_pattern = nullptr; + if (custom_scripts_dir_path != nullptr) { + if (asprintf(&custom_scripts_dir_path_pattern, "%s/%%s", custom_scripts_dir_path) == -1) { + custom_scripts_dir_path_pattern = nullptr; + } + } const char *paths[] { + custom_scripts_dir_path_pattern, "Tools/scripts/%s", "APM/Tools/scripts/%s", // for autotest server "../Tools/scripts/%s", // when run from e.g. ArduCopter subdirectory }; char buffer[60]; for (uint8_t i=0; i #ifndef HAL_HOTT_TELEM_ENABLED -#define HAL_HOTT_TELEM_ENABLED 1 +#define HAL_HOTT_TELEM_ENABLED BOARD_FLASH_SIZE > 2048 #endif #if HAL_HOTT_TELEM_ENABLED diff --git a/libraries/AP_IBus_Telem/AP_IBus_Telem.cpp b/libraries/AP_IBus_Telem/AP_IBus_Telem.cpp new file mode 100644 index 0000000000..0b0d31a600 --- /dev/null +++ b/libraries/AP_IBus_Telem/AP_IBus_Telem.cpp @@ -0,0 +1,792 @@ +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + + i-BUS telemetry for FlySky/Turnigy receivers and other peripherals + (eg iA6B, iA10) by Nicole Ashley . + + Originally based on work by Jan Verhulst: + https://github.com/ArduPilot/ardupilot/pull/16545 + + Libraries used for reference and inspiration: + + * iBUStelemetry + https://github.com/Hrastovc/iBUStelemetry + + * IBusBM + https://github.com/bmellink/IBusBM + + * BetaFlight + https://github.com/betaflight/betaflight/blob/master/src/main/telemetry/ibus_shared.c + */ + +#include + +#if AP_IBUS_TELEM_ENABLED + +#include +#include +#include +#include +#include +#include + +// 2-byte values +#define IBUS_SENSOR_TYPE_TEMPERATURE 0x01 // Temperature (in 0.1 degrees, where 0=-40'C) +#define IBUS_SENSOR_TYPE_RPM_FLYSKY 0x02 // FlySky-specific throttle value +#define IBUS_SENSOR_TYPE_EXTERNAL_VOLTAGE 0x03 // External voltage (in centivolts, so 1450 is 14.50V) +#define IBUS_SENSOR_TYPE_AVERAGE_CELL_VOLTAGE 0x04 // Avg cell voltage (in centivolts, so 1450 is 14.50V) +#define IBUS_SENSOR_TYPE_BATTERY_CURRENT 0x05 // Battery current (centi-amps) +#define IBUS_SENSOR_TYPE_FUEL 0x06 // Remaining battery percentage +#define IBUS_SENSOR_TYPE_RPM 0x07 // Throttle value (in 0.01, so 1200 is 12.00%) +#define IBUS_SENSOR_TYPE_COMPASS_HEADING 0x08 // Heading (0-360 degrees) +#define IBUS_SENSOR_TYPE_CLIMB_RATE 0x09 // Climb rate (cm/s) +#define IBUS_SENSOR_TYPE_COG 0x0a // Course over ground (centidegrees, so 27015 is 270.15 degrees) +#define IBUS_SENSOR_TYPE_GPS_STATUS 0x0b // GPS status (2 values: fix type, and number of satellites) +#define IBUS_SENSOR_TYPE_ACC_X 0x0c // Acc X (cm/s) +#define IBUS_SENSOR_TYPE_ACC_Y 0x0d // Acc Y (cm/s) +#define IBUS_SENSOR_TYPE_ACC_Z 0x0e // Acc Z (cm/s) +#define IBUS_SENSOR_TYPE_ROLL 0x0f // Roll (centidegrees) +#define IBUS_SENSOR_TYPE_PITCH 0x10 // Pitch (centidegrees) +#define IBUS_SENSOR_TYPE_YAW 0x11 // Yaw (centidegrees) +#define IBUS_SENSOR_TYPE_VERTICAL_SPEED 0x12 // Vertical speed (cm/s) +#define IBUS_SENSOR_TYPE_GROUND_SPEED 0x13 // Speed (cm/s) +#define IBUS_SENSOR_TYPE_GPS_DIST 0x14 // Distance from home (m) +#define IBUS_SENSOR_TYPE_ARMED 0x15 // Armed / unarmed (1 = armed, 0 = unarmed) +#define IBUS_SENSOR_TYPE_FLIGHT_MODE 0x16 // Flight mode +#define IBUS_SENSOR_TYPE_ODO1 0x7c // Odometer1 +#define IBUS_SENSOR_TYPE_ODO2 0x7d // Odometer2 +#define IBUS_SENSOR_TYPE_SPEED 0x7e // Speed km/h +#define IBUS_SENSOR_TYPE_ALT_FLYSKY 0xf9 // FlySky-specific altitude (metres) + +// 4-byte values +#define IBUS_SENSOR_TYPE_TEMPERATURE_PRESSURE 0x41 // Combined temperature & pressure value +#define IBUS_SENSOR_TYPE_GPS_LAT 0x80 // WGS84 in degrees * 1E7 +#define IBUS_SENSOR_TYPE_GPS_LNG 0x81 // WGS84 in degrees * 1E7 +#define IBUS_SENSOR_TYPE_GPS_ALT 0x82 // GPS (cm) +#define IBUS_SENSOR_TYPE_ALT 0x83 // Alt (cm) +#define IBUS_SENSOR_TYPE_ALT_MAX 0x84 // MaxAlt (cm) + +// i-BUS vehicle modes +#define IBUS_VEHICLE_MODE_STAB 0 +#define IBUS_VEHICLE_MODE_ACRO 1 +#define IBUS_VEHICLE_MODE_AHOLD 2 +#define IBUS_VEHICLE_MODE_AUTO 3 +#define IBUS_VEHICLE_MODE_GUIDED 4 +#define IBUS_VEHICLE_MODE_LOITER 5 +#define IBUS_VEHICLE_MODE_RTL 6 +#define IBUS_VEHICLE_MODE_CIRCLE 7 +#define IBUS_VEHICLE_MODE_PHOLD 8 +#define IBUS_VEHICLE_MODE_LAND 9 +#define IBUS_VEHICLE_MODE_UNKNOWN 255 // Must be positive and 0 is already used; out of range blanks the value + +// All the sensors we can accurately provide are listed here. +// i-BUS will generally only query up to 15 sensors, so subjectively +// higher-value sensors are sorted to the top to make the most of a +// small telemetry window. In the future these could be configurable. +static const AP_IBus_Telem::SensorDefinition sensors[] { +#if AP_ARMING_ENABLED + {.sensor_type = IBUS_SENSOR_TYPE_ARMED, .sensor_length = 2}, +#endif + {.sensor_type = IBUS_SENSOR_TYPE_FLIGHT_MODE, .sensor_length = 2}, +#if AP_GPS_ENABLED + {.sensor_type = IBUS_SENSOR_TYPE_GPS_STATUS, .sensor_length = 2}, +#endif +#if AP_BATTERY_ENABLED + {.sensor_type = IBUS_SENSOR_TYPE_FUEL, .sensor_length = 2}, + {.sensor_type = IBUS_SENSOR_TYPE_EXTERNAL_VOLTAGE, .sensor_length = 2}, +#endif +#if AP_BARO_ENABLED + {.sensor_type = IBUS_SENSOR_TYPE_ALT, .sensor_length = 4}, +#endif +#if AP_AHRS_ENABLED + {.sensor_type = IBUS_SENSOR_TYPE_GPS_DIST, .sensor_length = 2}, +#endif +#if AP_BARO_ENABLED + {.sensor_type = IBUS_SENSOR_TYPE_CLIMB_RATE, .sensor_length = 2}, +#endif +#if AP_GPS_ENABLED + {.sensor_type = IBUS_SENSOR_TYPE_GROUND_SPEED, .sensor_length = 2}, +#endif +#if AP_AHRS_ENABLED + {.sensor_type = IBUS_SENSOR_TYPE_ROLL, .sensor_length = 2}, + {.sensor_type = IBUS_SENSOR_TYPE_PITCH, .sensor_length = 2}, + {.sensor_type = IBUS_SENSOR_TYPE_YAW, .sensor_length = 2}, +#endif +#if AP_AIRSPEED_ENABLED + {.sensor_type = IBUS_SENSOR_TYPE_SPEED, .sensor_length = 2}, +#endif +#if AP_BARO_ENABLED + {.sensor_type = IBUS_SENSOR_TYPE_TEMPERATURE_PRESSURE, .sensor_length = 4}, +#endif +#if AP_RPM_ENABLED + {.sensor_type = IBUS_SENSOR_TYPE_RPM, .sensor_length = 2}, +#endif +#if AP_BATTERY_ENABLED + {.sensor_type = IBUS_SENSOR_TYPE_BATTERY_CURRENT, .sensor_length = 2}, + {.sensor_type = IBUS_SENSOR_TYPE_AVERAGE_CELL_VOLTAGE, .sensor_length = 2}, +#endif +#if AP_AHRS_ENABLED + {.sensor_type = IBUS_SENSOR_TYPE_COMPASS_HEADING, .sensor_length = 2}, +#endif +#if AP_GPS_ENABLED + {.sensor_type = IBUS_SENSOR_TYPE_COG, .sensor_length = 2}, + {.sensor_type = IBUS_SENSOR_TYPE_GPS_LAT, .sensor_length = 4}, + {.sensor_type = IBUS_SENSOR_TYPE_GPS_LNG, .sensor_length = 4}, + {.sensor_type = IBUS_SENSOR_TYPE_GPS_ALT, .sensor_length = 4}, +#endif +#if AP_AHRS_ENABLED + {.sensor_type = IBUS_SENSOR_TYPE_ACC_X, .sensor_length = 2}, + {.sensor_type = IBUS_SENSOR_TYPE_ACC_Y, .sensor_length = 2}, + {.sensor_type = IBUS_SENSOR_TYPE_ACC_Z, .sensor_length = 2}, +#endif +}; + +#if APM_BUILD_TYPE(APM_BUILD_Rover) + +/* Rover modes: + MANUAL = 0 + ACRO = 1 + STEERING = 3 + HOLD = 4 + LOITER = 5 + FOLLOW = 6 + SIMPLE = 7 + DOCK = 8 + CIRCLE = 9 + AUTO = 10 + RTL = 11 + SMART_RTL = 12 + GUIDED = 15 + INITIALISING = 16 +*/ +static const AP_IBus_Telem::ModeMap mode_map[] { + {.ap_mode = 1, .ibus_mode = IBUS_VEHICLE_MODE_ACRO}, + {.ap_mode = 4, .ibus_mode = IBUS_VEHICLE_MODE_PHOLD}, + {.ap_mode = 5, .ibus_mode = IBUS_VEHICLE_MODE_LOITER}, + {.ap_mode = 9, .ibus_mode = IBUS_VEHICLE_MODE_CIRCLE}, + {.ap_mode = 10, .ibus_mode = IBUS_VEHICLE_MODE_AUTO}, + {.ap_mode = 11, .ibus_mode = IBUS_VEHICLE_MODE_RTL}, + {.ap_mode = 12, .ibus_mode = IBUS_VEHICLE_MODE_RTL}, + {.ap_mode = 15, .ibus_mode = IBUS_VEHICLE_MODE_GUIDED}, +}; + +#elif APM_BUILD_COPTER_OR_HELI + +/* Copter modes: + STABILIZE = 0 + ACRO = 1 + ALT_HOLD = 2 + AUTO = 3 + GUIDED = 4 + LOITER = 5 + RTL = 6 + CIRCLE = 7 + LAND = 9 + DRIFT = 11 + SPORT = 13 + FLIP = 14 + AUTOTUNE = 15 + POSHOLD = 16 + BRAKE = 17 + THROW = 18 + AVOID_ADSB = 19 + GUIDED_NOGPS = 20 + SMART_RTL = 21 + FLOWHOLD = 22 + FOLLOW = 23 + ZIGZAG = 24 + SYSTEMID = 25 + AUTOROTATE = 26 + AUTO_RTL = 27 + TURTLE = 28 +*/ +static const AP_IBus_Telem::ModeMap mode_map[] { + {.ap_mode = 0, .ibus_mode = IBUS_VEHICLE_MODE_STAB}, + {.ap_mode = 1, .ibus_mode = IBUS_VEHICLE_MODE_ACRO}, + {.ap_mode = 2, .ibus_mode = IBUS_VEHICLE_MODE_AHOLD}, + {.ap_mode = 3, .ibus_mode = IBUS_VEHICLE_MODE_AUTO}, + {.ap_mode = 4, .ibus_mode = IBUS_VEHICLE_MODE_GUIDED}, + {.ap_mode = 5, .ibus_mode = IBUS_VEHICLE_MODE_LOITER}, + {.ap_mode = 6, .ibus_mode = IBUS_VEHICLE_MODE_RTL}, + {.ap_mode = 7, .ibus_mode = IBUS_VEHICLE_MODE_CIRCLE}, + {.ap_mode = 9, .ibus_mode = IBUS_VEHICLE_MODE_LAND}, + {.ap_mode = 16, .ibus_mode = IBUS_VEHICLE_MODE_PHOLD}, + {.ap_mode = 21, .ibus_mode = IBUS_VEHICLE_MODE_RTL}, + {.ap_mode = 22, .ibus_mode = IBUS_VEHICLE_MODE_PHOLD}, + {.ap_mode = 27, .ibus_mode = IBUS_VEHICLE_MODE_RTL}, +}; + +#elif APM_BUILD_TYPE(APM_BUILD_ArduPlane) + +/* Plane modes: + MANUAL = 0 + CIRCLE = 1 + STABILIZE = 2 + TRAINING = 3 + ACRO = 4 + FLY_BY_WIRE_A = 5 + FLY_BY_WIRE_B = 6 + CRUISE = 7 + AUTOTUNE = 8 + AUTO = 10 + RTL = 11 + LOITER = 12 + TAKEOFF = 13 + AVOID_ADSB = 14 + GUIDED = 15 + INITIALISING = 16 + QSTABILIZE = 17 + QHOVER = 18 + QLOITER = 19 + QLAND = 20 + QRTL = 21 + QAUTOTUNE = 22 + QACRO = 23 + THERMAL = 24 + LOITER_ALT_QLAND = 25 +*/ +static const AP_IBus_Telem::ModeMap mode_map[] { + {.ap_mode = 1, .ibus_mode = IBUS_VEHICLE_MODE_CIRCLE}, + {.ap_mode = 2, .ibus_mode = IBUS_VEHICLE_MODE_STAB}, + {.ap_mode = 4, .ibus_mode = IBUS_VEHICLE_MODE_ACRO}, + {.ap_mode = 5, .ibus_mode = IBUS_VEHICLE_MODE_STAB}, + {.ap_mode = 6, .ibus_mode = IBUS_VEHICLE_MODE_STAB}, + {.ap_mode = 7, .ibus_mode = IBUS_VEHICLE_MODE_STAB}, + {.ap_mode = 10, .ibus_mode = IBUS_VEHICLE_MODE_AUTO}, + {.ap_mode = 11, .ibus_mode = IBUS_VEHICLE_MODE_RTL}, + {.ap_mode = 12, .ibus_mode = IBUS_VEHICLE_MODE_LOITER}, + {.ap_mode = 13, .ibus_mode = IBUS_VEHICLE_MODE_AUTO}, + {.ap_mode = 15, .ibus_mode = IBUS_VEHICLE_MODE_GUIDED}, + {.ap_mode = 17, .ibus_mode = IBUS_VEHICLE_MODE_STAB}, + {.ap_mode = 18, .ibus_mode = IBUS_VEHICLE_MODE_PHOLD}, + {.ap_mode = 19, .ibus_mode = IBUS_VEHICLE_MODE_LOITER}, + {.ap_mode = 20, .ibus_mode = IBUS_VEHICLE_MODE_LAND}, + {.ap_mode = 21, .ibus_mode = IBUS_VEHICLE_MODE_RTL}, + {.ap_mode = 23, .ibus_mode = IBUS_VEHICLE_MODE_ACRO}, + {.ap_mode = 25, .ibus_mode = IBUS_VEHICLE_MODE_LOITER}, +}; + +#elif APM_BUILD_TYPE(APM_BUILD_ArduSub) + +/* Submarine modes: + STABILIZE = 0 + ACRO = 1 + ALT_HOLD = 2 + AUTO = 3 + GUIDED = 4 + CIRCLE = 7 + SURFACE = 9 + POSHOLD = 16 + MANUAL = 19 + MOTOR_DETECT = 20 +*/ +static const AP_IBus_Telem::ModeMap mode_map[] { + {.ap_mode = 0, .ibus_mode = IBUS_VEHICLE_MODE_STAB}, + {.ap_mode = 1, .ibus_mode = IBUS_VEHICLE_MODE_ACRO}, + {.ap_mode = 2, .ibus_mode = IBUS_VEHICLE_MODE_AHOLD}, + {.ap_mode = 3, .ibus_mode = IBUS_VEHICLE_MODE_AUTO}, + {.ap_mode = 4, .ibus_mode = IBUS_VEHICLE_MODE_GUIDED}, + {.ap_mode = 5, .ibus_mode = IBUS_VEHICLE_MODE_LOITER}, + {.ap_mode = 6, .ibus_mode = IBUS_VEHICLE_MODE_RTL}, + {.ap_mode = 7, .ibus_mode = IBUS_VEHICLE_MODE_CIRCLE}, + {.ap_mode = 8, .ibus_mode = IBUS_VEHICLE_MODE_PHOLD}, + {.ap_mode = 9, .ibus_mode = IBUS_VEHICLE_MODE_LAND}, + {.ap_mode = 16, .ibus_mode = IBUS_VEHICLE_MODE_PHOLD}, +}; + +#elif APM_BUILD_TYPE(APM_BUILD_Blimp) + +/* Blimp modes: + LAND = 0 + MANUAL = 1 + VELOCITY = 2 + LOITER = 3 + RTL = 4 +*/ +static const AP_IBus_Telem::ModeMap mode_map[] { + {.ap_mode = 0, .ibus_mode = IBUS_VEHICLE_MODE_LAND}, + {.ap_mode = 3, .ibus_mode = IBUS_VEHICLE_MODE_LOITER}, + {.ap_mode = 4, .ibus_mode = IBUS_VEHICLE_MODE_RTL}, +}; + +#else + +static const AP_IBus_Telem::ModeMap mode_map[] {}; + +#endif + +void AP_IBus_Telem::init() +{ + const AP_SerialManager &serial_manager = AP::serialmanager(); + if ((port = serial_manager.find_serial(AP_SerialManager::SerialProtocol_IBUS_Telem, 0))) { + port->set_options(port->OPTION_HDPLEX); + hal.scheduler->register_timer_process(FUNCTOR_BIND_MEMBER(&AP_IBus_Telem::tick, void)); + } +} + +void AP_IBus_Telem::tick(void) +{ + if (!initialized) { + port->begin(115200); + initialized = true; + } + + const uint16_t available = MIN(port->available(), 1024U); + if (available == 0) { + return; + } + + const uint32_t now = AP_HAL::millis(); + if ((now - last_received_message_time_ms) < PROTOCOL_TIMEGAP) { + // Any bytes that arrive too soon since the last message should be discarded + port->discard_input(); + return; + } + + union { + CommandPacket incoming_message; + uint8_t buffer[sizeof(CommandPacket)]; + } u; + + if (available < sizeof(u.incoming_message)) { + // We've got here mid-message; come back in the next loop when it might be complete + return; + } + + last_received_message_time_ms = now; + + if (available > sizeof(u.incoming_message)) { + // We've received too many bytes, so probably a malformed message + port->discard_input(); + return; + } + + if (port->read(u.buffer, sizeof(u.buffer)) != sizeof(u.buffer)) { + // Despite all our checks this is still the wrong size; safest to wait until the next message + port->discard_input(); + return; + } + + if (u.incoming_message.message_length != PROTOCOL_INCOMING_MESSAGE_LENGTH) { + // Every message starts with this fixed message length; if not then it's not valid + return; + } + + uint16_t calculated_checksum = 0xFFFF; + for (uint8_t i = 0; i < sizeof(u.buffer) - 2; i++) { + calculated_checksum -= u.buffer[i]; + } + + if (u.incoming_message.checksum != calculated_checksum) { + return; + } + + handle_incoming_message(u.incoming_message); +} + +void AP_IBus_Telem::handle_incoming_message(const CommandPacket &incoming) +{ + // Sensor 0 is reserved for the transmitter, so if for some reason it's requested we should ignore it + if (incoming.sensor_id == 0) { + return; + } + + // If we've reached the end of our sensor list, we shouldn't respond; this tells the receiver that there + // are no more sensors to discover. + if (incoming.sensor_id > ARRAY_SIZE(sensors)) { + return; + } + + const auto &sensor_definition = sensors[incoming.sensor_id - 1]; + + switch (incoming.command << 4) { + case PROTOCOL_COMMAND_DISCOVER: + handle_discover_command(incoming); + break; + + case PROTOCOL_COMMAND_TYPE: + handle_type_command(incoming, sensor_definition); + break; + + case PROTOCOL_COMMAND_VALUE: + handle_value_command(incoming, sensor_definition); + break; + } +} + +/* A discovery query has the following format: + * 0x04: Message length + * 0x81: 0x80 for discovery + 0x01 for sensor ID 1 + * 0x7A: Checksum low byte + * 0xFF: Checksum high byte + Checksums are 0xFFFF minus the sum of the previous bytes + + To acknowledge a discovery query, we echo the command back. + */ +void AP_IBus_Telem::handle_discover_command(const CommandPacket &incoming) +{ + struct protocol_command_discover_response_t { + uint8_t command_length; + uint8_t address; + uint16_t checksum; + } packet { + PROTOCOL_FOUR_LENGTH, + (uint8_t)(PROTOCOL_COMMAND_DISCOVER | incoming.sensor_id) + }; + populate_checksum((uint8_t*)&packet, sizeof(packet)); + port->write((uint8_t*)&packet, sizeof(packet)); +} + +/* A type query has the following format: + * 0x04: Message length + * 0x91: 0x90 for type + 0x01 for sensor ID 1 + * 0x6A: Checksum low byte + * 0xFF: Checksum high byte + Checksums are 0xFFFF minus the sum of the previous bytes + + To respond to a type query, we send: + * 0x06: Message length + * 0x91: 0x90 for type + 0x01 for sensor ID 1 + * 0x03: Sensor type, eg 0x03 for external voltage + * 0x02: Sensor length (2 or 4 bytes) + * 0x63: Checksum low byte + * 0xFF: Checksum high byte + Checksums are 0xFFFF minus the sum of the previous bytes + */ +void AP_IBus_Telem::handle_type_command(const CommandPacket &incoming, const SensorDefinition &sensor) +{ + struct protocol_command_type_response_t { + uint8_t command_length; + uint8_t address; + uint8_t type; + uint8_t length; + uint16_t checksum; + } packet { + PROTOCOL_SIX_LENGTH, + (uint8_t)(PROTOCOL_COMMAND_TYPE | incoming.sensor_id), + sensor.sensor_type, + sensor.sensor_length + }; + populate_checksum((uint8_t*)&packet, sizeof(packet)); + port->write((uint8_t*)&packet, sizeof(packet)); +} + +/* A value query has the following format: + * 0x04: Message length + * 0xA1: 0xA0 for value + 0x01 for sensor ID 1 + * 0x5A: Checksum low byte + * 0xFF: Checksum high byte + Checksums are 0xFFFF minus the sum of the previous bytes + + To respond to a value query, we send: + * 0x06: Message length (or 0x08 for a 4-byte sensor) + * 0xA1: 0xA1 for value + 0x01 for sensor ID 1 + * 0xD4: Value byte (value is 12,500 in this example) + * 0x30: Value byte + * 0x54: Checksum low byte + * 0xFE: Checksum high byte + Checksums are 0xFFFF minus the sum of the previous bytes + */ +void AP_IBus_Telem::handle_value_command(const CommandPacket &incoming, const SensorDefinition &sensor) +{ + const SensorValue value = get_sensor_value(sensor.sensor_type); + if (sensor.sensor_length == 2) { + handle_2_byte_value_command(incoming, value); + } else { + handle_4_byte_value_command(incoming, value); + } +} + +void AP_IBus_Telem::handle_2_byte_value_command(const CommandPacket &incoming, const SensorValue &value) +{ + struct protocol_command_2byte_value_response_t { + uint8_t command_length; + uint8_t address; + uint8_t value[2]; + uint16_t checksum; + } packet { + PROTOCOL_SIX_LENGTH, + (uint8_t)(PROTOCOL_COMMAND_VALUE | incoming.sensor_id), + {value.byte[0], value.byte[1]} + }; + populate_checksum((uint8_t*)&packet, sizeof(packet)); + port->write((uint8_t*)&packet, sizeof(packet)); +} + +void AP_IBus_Telem::handle_4_byte_value_command(const CommandPacket &incoming, const SensorValue &value) +{ + struct protocol_command_4byte_value_response_t { + uint8_t command_length; + uint8_t address; + uint8_t value[4]; + uint16_t checksum; + } packet { + PROTOCOL_EIGHT_LENGTH, + (uint8_t)(PROTOCOL_COMMAND_VALUE | incoming.sensor_id), + {value.byte[0], value.byte[1], value.byte[2], value.byte[3]} + }; + populate_checksum((uint8_t*)&packet, sizeof(packet)); + port->write((uint8_t*)&packet, sizeof(packet)); +} + +AP_IBus_Telem::SensorValue AP_IBus_Telem::get_sensor_value(const uint8_t sensor_type) +{ + SensorValue value; + switch (sensor_type) { +#if AP_BATTERY_ENABLED + case IBUS_SENSOR_TYPE_EXTERNAL_VOLTAGE: + value.uint16 = AP::battery().voltage() * 100; + break; + + case IBUS_SENSOR_TYPE_AVERAGE_CELL_VOLTAGE: + value.uint16 = get_average_cell_voltage_cV(); + break; + + case IBUS_SENSOR_TYPE_BATTERY_CURRENT: + value.uint16 = get_current_cAh(); + break; + + case IBUS_SENSOR_TYPE_FUEL: + value.uint16 = get_battery_or_fuel_level_pct(); + break; +#endif // AP_BATTERY_ENABLED + +#if AP_RPM_ENABLED + case IBUS_SENSOR_TYPE_RPM: + case IBUS_SENSOR_TYPE_RPM_FLYSKY: + value.uint16 = get_rpm(); + break; +#endif + +#if AP_AHRS_ENABLED + case IBUS_SENSOR_TYPE_COMPASS_HEADING: + value.uint16 = AP::ahrs().yaw_sensor * 0.01; + break; +#endif + +#if AP_BARO_ENABLED + case IBUS_SENSOR_TYPE_CLIMB_RATE: + case IBUS_SENSOR_TYPE_VERTICAL_SPEED: + value.int16 = AP::baro().get_climb_rate() * 100; + break; +#endif + +#if AP_GPS_ENABLED + case IBUS_SENSOR_TYPE_COG: + value.uint16 = AP::gps().ground_course() * 100; + break; + + case IBUS_SENSOR_TYPE_GPS_STATUS: + value.byte[0] = get_gps_status(); + value.byte[1] = AP::gps().num_sats(); + break; +#endif // AP_GPS_ENABLED + +#if AP_AHRS_ENABLED + case IBUS_SENSOR_TYPE_ACC_X: + value.int16 = (AP::ahrs().get_accel() - AP::ahrs().get_accel_bias()).x * 1000; + break; + + case IBUS_SENSOR_TYPE_ACC_Y: + value.int16 = (AP::ahrs().get_accel() - AP::ahrs().get_accel_bias()).y * 1000; + break; + + case IBUS_SENSOR_TYPE_ACC_Z: + value.int16 = (AP::ahrs().get_accel() - AP::ahrs().get_accel_bias()).z * 1000; + break; + + case IBUS_SENSOR_TYPE_ROLL: + value.int16 = AP::ahrs().roll_sensor; + break; + + case IBUS_SENSOR_TYPE_PITCH: + value.int16 = AP::ahrs().pitch_sensor; + break; + + case IBUS_SENSOR_TYPE_YAW: + value.int16 = AP::ahrs().yaw_sensor; + break; +#endif // AP_AHRS_ENABLED + +#if AP_GPS_ENABLED + case IBUS_SENSOR_TYPE_GROUND_SPEED: + value.uint16 = AP::gps().ground_speed_cm(); + break; +#endif + +#if AP_AHRS_ENABLED + case IBUS_SENSOR_TYPE_GPS_DIST: + value.uint16 = get_distance_from_home_m(); + break; +#endif + +#if AP_ARMING_ENABLED + case IBUS_SENSOR_TYPE_ARMED: + value.uint16 = AP::arming().is_armed(); + break; +#endif + + case IBUS_SENSOR_TYPE_FLIGHT_MODE: + value.uint16 = get_vehicle_mode(); + break; + +#if AP_AIRSPEED_ENABLED + case IBUS_SENSOR_TYPE_SPEED: + value.uint16 = AP::airspeed()->get_airspeed(); + break; +#endif + +#if AP_BARO_ENABLED + case IBUS_SENSOR_TYPE_TEMPERATURE_PRESSURE: { + const uint32_t pressure = AP::baro().get_pressure(); + const uint32_t temperature = (AP::baro().get_temperature() + 40) * 10; + value.uint32 = pressure | (temperature << 19); + break; + } +#endif + +#if AP_GPS_ENABLED + case IBUS_SENSOR_TYPE_GPS_LAT: + value.int32 = AP::gps().location().lat; + break; + + case IBUS_SENSOR_TYPE_GPS_LNG: + value.int32 = AP::gps().location().lng; + break; + + case IBUS_SENSOR_TYPE_GPS_ALT: + value.int32 = AP::gps().location().alt; + break; +#endif // AP_GPS_ENABLED + +#if AP_BARO_ENABLED + case IBUS_SENSOR_TYPE_ALT: + value.int32 = AP::baro().get_altitude() * 100; + break; +#endif + + default: + value.int32 = 0; + } + + return value; +} + +#if AP_BATTERY_ENABLED +uint16_t AP_IBus_Telem::get_average_cell_voltage_cV() +{ + if (!AP::battery().has_cell_voltages()) { + return 0; + } + + const auto &cell_voltages = AP::battery().get_cell_voltages(); + const uint8_t number_of_cells = ARRAY_SIZE(cell_voltages.cells); + if (number_of_cells == 0) { + return 0; + } + + uint32_t voltage_sum = 0; + for (auto i = 0; i < number_of_cells; i++) { + voltage_sum += cell_voltages.cells[i] * 0.001; + } + return voltage_sum / number_of_cells * 100; + +} + +uint16_t AP_IBus_Telem::get_current_cAh() +{ + float current = 0; + IGNORE_RETURN(AP::battery().current_amps(current)); + return current * 100; +} + +uint8_t AP_IBus_Telem::get_battery_or_fuel_level_pct() +{ + uint8_t percentage = 0; + IGNORE_RETURN(AP::battery().capacity_remaining_pct(percentage)); + return percentage; +} +#endif // AP_BATTERY_ENABLED + +#if AP_RPM_ENABLED +uint16_t AP_IBus_Telem::get_rpm() +{ + const AP_RPM *rpm = AP::rpm(); + float rpm_value; + if (rpm && rpm->get_rpm(0, rpm_value)) { + return rpm_value; + } + + return 0; +} +#endif + +#if AP_GPS_ENABLED +uint8_t AP_IBus_Telem::get_gps_status() +{ + if (!AP::gps().is_healthy()) { + return 0; + } + + const AP_GPS::GPS_Status gps_status = AP::gps().status(); + if (gps_status >= AP_GPS::GPS_OK_FIX_3D) { + return 3; + } else if (gps_status >= AP_GPS::GPS_OK_FIX_2D) { + return 2; + } else if (gps_status == AP_GPS::NO_FIX) { + return 1; + } else { + return 0; + } +} +#endif // AP_GPS_ENABLED + +#if AP_AHRS_ENABLED +uint16_t AP_IBus_Telem::get_distance_from_home_m() +{ + Vector2f home; + if (AP::ahrs().get_relative_position_NE_home(home)) { + return home.length(); + } + + return 0; +} +#endif + +uint16_t AP_IBus_Telem::get_vehicle_mode() +{ + const uint8_t vehicle_mode = AP::vehicle()->get_mode(); + for (uint8_t i = 0; i < ARRAY_SIZE(mode_map); i++) { + if (mode_map[i].ap_mode == vehicle_mode) { + return mode_map[i].ibus_mode; + } + } + return IBUS_VEHICLE_MODE_UNKNOWN; +} + +// Populate the last two bytes of packet with the checksum of the preceding bytes +void AP_IBus_Telem::populate_checksum(uint8_t *packet, const uint16_t size) +{ + uint16_t checksum = 0xFFFF; + + for (int i=0; i> 8; +} + +#endif diff --git a/libraries/AP_IBus_Telem/AP_IBus_Telem.h b/libraries/AP_IBus_Telem/AP_IBus_Telem.h new file mode 100644 index 0000000000..da845715b6 --- /dev/null +++ b/libraries/AP_IBus_Telem/AP_IBus_Telem.h @@ -0,0 +1,126 @@ +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + + i-BUS telemetry for FlySky/Turnigy receivers and other peripherals + (eg iA6B, iA10) by Nicole Ashley . + + Originally based on work by Jan Verhulst: + https://github.com/ArduPilot/ardupilot/pull/16545 + + Libraries used for reference and inspiration: + + * iBUStelemetry + https://github.com/Hrastovc/iBUStelemetry + + * IBusBM + https://github.com/bmellink/IBusBM + + * BetaFlight + https://github.com/betaflight/betaflight/blob/master/src/main/telemetry/ibus_shared.c + */ + +#pragma once + +#include + +#ifndef AP_IBUS_TELEM_ENABLED +#define AP_IBUS_TELEM_ENABLED BOARD_FLASH_SIZE > 2048 +#endif + +#if AP_IBUS_TELEM_ENABLED + +#include +#include +#include +#include +#include +#include + +class AP_IBus_Telem +{ +public: + AP_IBus_Telem() {} + + CLASS_NO_COPY(AP_IBus_Telem); + + void init(); + + typedef struct { + uint8_t sensor_type; // Sensor type (IBUS_SENSOR_TYPE_* above) + uint8_t sensor_length; // Data length for defined sensor (can be 2 or 4 bytes) + } SensorDefinition; + + typedef struct { + uint8_t ap_mode; + uint8_t ibus_mode; + } ModeMap; + +private: + + typedef union { + uint16_t uint16; + uint32_t uint32; + int16_t int16; + int32_t int32; + uint8_t byte[4]; + } SensorValue; + + struct PACKED CommandPacket { + uint8_t message_length; + uint8_t sensor_id : 4; + uint8_t command : 4; + uint16_t checksum; + }; + + void tick(); + void handle_incoming_message(const CommandPacket &incoming); + void handle_discover_command(const CommandPacket &incoming); + void handle_type_command(const CommandPacket &incoming, const SensorDefinition &sensor); + void handle_value_command(const CommandPacket &incoming, const SensorDefinition &sensor); + void handle_2_byte_value_command(const CommandPacket &incoming, const SensorValue &value); + void handle_4_byte_value_command(const CommandPacket &incoming, const SensorValue &value); + SensorValue get_sensor_value(uint8_t sensor_id); +#if AP_BATTERY_ENABLED + uint16_t get_average_cell_voltage_cV(); + uint16_t get_current_cAh(); + uint8_t get_battery_or_fuel_level_pct(); +#endif +#if AP_RPM_ENABLED + uint16_t get_rpm(); +#endif +#if AP_GPS_ENABLED + uint8_t get_gps_status(); +#endif +#if AP_AHRS_ENABLED + uint16_t get_distance_from_home_m(); +#endif + uint16_t get_vehicle_mode(); + void populate_checksum(uint8_t *packet, const uint16_t size); + + static const uint8_t PROTOCOL_COMMAND_DISCOVER = 0x80; // Command to discover a sensor (lowest 4 bits are sensor) + static const uint8_t PROTOCOL_COMMAND_TYPE = 0x90; // Command to request a sensor type (lowest 4 bits are sensor) + static const uint8_t PROTOCOL_COMMAND_VALUE = 0xA0; // Command to request a sensor's value (lowest 4 bits are sensor) + static const uint8_t PROTOCOL_TIMEGAP = 3; // Packets are received very ~7ms so use ~half that for the gap + static const uint8_t PROTOCOL_FOUR_LENGTH = 0x04; // indicate that the message has 4 bytes + static const uint8_t PROTOCOL_SIX_LENGTH = 0x06; // indicate that the message has 6 bytes + static const uint8_t PROTOCOL_EIGHT_LENGTH = 0x08; // indicate that the message has 8 bytes + static const uint8_t PROTOCOL_INCOMING_MESSAGE_LENGTH = PROTOCOL_FOUR_LENGTH; // All incoming messages are the same length + + AP_HAL::UARTDriver *port; + bool initialized; + uint32_t last_received_message_time_ms; // When the last message was received +}; + +#endif diff --git a/libraries/AP_ICEngine/AP_ICEngine.cpp b/libraries/AP_ICEngine/AP_ICEngine.cpp index b5202ea722..67051949ab 100644 --- a/libraries/AP_ICEngine/AP_ICEngine.cpp +++ b/libraries/AP_ICEngine/AP_ICEngine.cpp @@ -150,7 +150,7 @@ const AP_Param::GroupInfo AP_ICEngine::var_info[] = { // @Param: STARTCHN_MIN // @DisplayName: Input channel for engine start minimum PWM - // @Description: This is a minimum PWM value for engine start channel for an engine stop to be commanded. Setting this value will avoid RC input glitches with low PWM values from causing an unwanted engine stop. A value of zero means any PWM below 1300 triggers an engine stop. + // @Description: This is a minimum PWM value for engine start channel for an engine stop to be commanded. Setting this value will avoid RC input glitches with low PWM values from causing an unwanted engine stop. A value of zero means any PWM above 800 and below 1300 triggers an engine stop. To stop the engine start channel must above the larger of this value and 800 and below 1300. // @User: Standard // @Range: 0 1300 AP_GROUPINFO("STARTCHN_MIN", 16, AP_ICEngine, start_chan_min_pwm, 0), @@ -276,6 +276,13 @@ void AP_ICEngine::update(void) } #endif + // Stop on emergency stop + if (SRV_Channels::get_emergency_stop()) { + // Throttle is already forced to 0 in this case, ignition should also be stopped. + // Starter should not run. + should_run = false; + } + // switch on current state to work out new state switch (state) { case ICE_DISABLED: diff --git a/libraries/AP_IOMCU/AP_IOMCU.cpp b/libraries/AP_IOMCU/AP_IOMCU.cpp index 3507db08fa..a228c977ae 100644 --- a/libraries/AP_IOMCU/AP_IOMCU.cpp +++ b/libraries/AP_IOMCU/AP_IOMCU.cpp @@ -1369,6 +1369,12 @@ void AP_IOMCU::set_GPIO_mask(uint8_t mask) trigger_event(IOEVENT_GPIO); } +// Get GPIO mask of channels setup for output +uint8_t AP_IOMCU::get_GPIO_mask() const +{ + return GPIO.channel_mask; +} + // write to a output pin void AP_IOMCU::write_GPIO(uint8_t pin, bool value) { @@ -1386,6 +1392,17 @@ void AP_IOMCU::write_GPIO(uint8_t pin, bool value) trigger_event(IOEVENT_GPIO); } +// Read the last output value send to the GPIO pin +// This is not a real read of the actual pin +// This allows callers to check for state change +uint8_t AP_IOMCU::read_virtual_GPIO(uint8_t pin) const +{ + if (!convert_pin_number(pin)) { + return 0; + } + return (GPIO.output_mask & (1U << pin)) != 0; +} + // toggle a output pin void AP_IOMCU::toggle_GPIO(uint8_t pin) { diff --git a/libraries/AP_IOMCU/AP_IOMCU.h b/libraries/AP_IOMCU/AP_IOMCU.h index 5199c5fb3d..5092bf26fa 100644 --- a/libraries/AP_IOMCU/AP_IOMCU.h +++ b/libraries/AP_IOMCU/AP_IOMCU.h @@ -157,9 +157,17 @@ public: // set GPIO mask of channels setup for output void set_GPIO_mask(uint8_t mask); + // Get GPIO mask of channels setup for output + uint8_t get_GPIO_mask() const; + // write to a output pin void write_GPIO(uint8_t pin, bool value); + // Read the last output value send to the GPIO pin + // This is not a real read of the actual pin + // This allows callers to check for state change + uint8_t read_virtual_GPIO(uint8_t pin) const; + // toggle a output pin void toggle_GPIO(uint8_t pin); diff --git a/libraries/AP_InertialSensor/AP_InertialSensor.cpp b/libraries/AP_InertialSensor/AP_InertialSensor.cpp index 3e566025b2..6d254dccec 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor.cpp +++ b/libraries/AP_InertialSensor/AP_InertialSensor.cpp @@ -736,6 +736,14 @@ bool AP_InertialSensor::register_gyro(uint8_t &instance, uint16_t raw_sample_rat return false; } + // Loop over the existing instances and check if the instance already exists + for (uint8_t instance_to_check = 0; instance_to_check < _gyro_count; instance_to_check++) { + if ((uint32_t)_gyro_id(instance_to_check) == id) { + // if it does, then bail + return false; + } + } + _gyro_raw_sample_rates[_gyro_count] = raw_sample_rate_hz; _gyro_over_sampling[_gyro_count] = 1; _gyro_raw_sampling_multiplier[_gyro_count] = INT16_MAX/radians(2000); @@ -796,6 +804,14 @@ bool AP_InertialSensor::register_accel(uint8_t &instance, uint16_t raw_sample_ra return false; } + // Loop over the existing instances and check if the instance already exists + for (uint8_t instance_to_check = 0; instance_to_check < _accel_count; instance_to_check++) { + if ((uint32_t)_accel_id(instance_to_check) == id) { + // if it does, then bail + return false; + } + } + _accel_raw_sample_rates[_accel_count] = raw_sample_rate_hz; _accel_over_sampling[_accel_count] = 1; _accel_raw_sampling_multiplier[_accel_count] = INT16_MAX/(16*GRAVITY_MSS); @@ -1933,13 +1949,13 @@ void AP_InertialSensor::update(void) // set primary to first healthy accel and gyro for (uint8_t i=0; i> 2) & 3) { diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_ADIS1647x.h b/libraries/AP_InertialSensor/AP_InertialSensor_ADIS1647x.h index 6c2a6d2851..5dc97edb2a 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_ADIS1647x.h +++ b/libraries/AP_InertialSensor/AP_InertialSensor_ADIS1647x.h @@ -66,8 +66,6 @@ private: Delta32 =3 } opmode; - uint8_t accel_instance; - uint8_t gyro_instance; enum Rotation rotation; uint8_t drdy_pin; diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_BMI055.h b/libraries/AP_InertialSensor/AP_InertialSensor_BMI055.h index 5b5773a327..6622906e2d 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_BMI055.h +++ b/libraries/AP_InertialSensor/AP_InertialSensor_BMI055.h @@ -62,8 +62,6 @@ private: AP_HAL::OwnPtr dev_accel; AP_HAL::OwnPtr dev_gyro; - uint8_t accel_instance; - uint8_t gyro_instance; enum Rotation rotation; uint8_t temperature_counter; }; diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_BMI088.h b/libraries/AP_InertialSensor/AP_InertialSensor_BMI088.h index d8820529aa..005ddc2615 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_BMI088.h +++ b/libraries/AP_InertialSensor/AP_InertialSensor_BMI088.h @@ -79,8 +79,6 @@ private: AP_HAL::OwnPtr dev_gyro; AP_HAL::Device::PeriodicHandle gyro_periodic_handle; - uint8_t accel_instance; - uint8_t gyro_instance; enum Rotation rotation; uint8_t temperature_counter; enum DevTypes _accel_devtype; diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_BMI160.cpp b/libraries/AP_InertialSensor/AP_InertialSensor_BMI160.cpp index 8659d053ff..777ab3cf0e 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_BMI160.cpp +++ b/libraries/AP_InertialSensor/AP_InertialSensor_BMI160.cpp @@ -201,8 +201,8 @@ void AP_InertialSensor_BMI160::start() _dev->get_semaphore()->give(); - if (!_imu.register_accel(_accel_instance, BMI160_ODR_TO_HZ(BMI160_ODR), _dev->get_bus_id_devtype(DEVTYPE_BMI160)) || - !_imu.register_gyro(_gyro_instance, BMI160_ODR_TO_HZ(BMI160_ODR), _dev->get_bus_id_devtype(DEVTYPE_BMI160))) { + if (!_imu.register_accel(accel_instance, BMI160_ODR_TO_HZ(BMI160_ODR), _dev->get_bus_id_devtype(DEVTYPE_BMI160)) || + !_imu.register_gyro(gyro_instance, BMI160_ODR_TO_HZ(BMI160_ODR), _dev->get_bus_id_devtype(DEVTYPE_BMI160))) { return; } @@ -213,8 +213,8 @@ void AP_InertialSensor_BMI160::start() bool AP_InertialSensor_BMI160::update() { - update_accel(_accel_instance); - update_gyro(_gyro_instance); + update_accel(accel_instance); + update_gyro(gyro_instance); return true; } @@ -420,11 +420,11 @@ read_fifo_read_data: accel *= _accel_scale; gyro *= _gyro_scale; - _rotate_and_correct_accel(_accel_instance, accel); - _rotate_and_correct_gyro(_gyro_instance, gyro); + _rotate_and_correct_accel(accel_instance, accel); + _rotate_and_correct_gyro(gyro_instance, gyro); - _notify_new_accel_raw_sample(_accel_instance, accel); - _notify_new_gyro_raw_sample(_gyro_instance, gyro); + _notify_new_accel_raw_sample(accel_instance, accel); + _notify_new_gyro_raw_sample(gyro_instance, gyro); } if (excess) { diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_BMI160.h b/libraries/AP_InertialSensor/AP_InertialSensor_BMI160.h index 77aac9eb08..fe5940015a 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_BMI160.h +++ b/libraries/AP_InertialSensor/AP_InertialSensor_BMI160.h @@ -120,10 +120,7 @@ private: AP_HAL::OwnPtr _dev; enum Rotation _rotation; - uint8_t _accel_instance; float _accel_scale; - - uint8_t _gyro_instance; float _gyro_scale; AP_HAL::DigitalSource *_int1_pin; diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_BMI270.cpp b/libraries/AP_InertialSensor/AP_InertialSensor_BMI270.cpp index 0d3bb85071..41776d0143 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_BMI270.cpp +++ b/libraries/AP_InertialSensor/AP_InertialSensor_BMI270.cpp @@ -212,14 +212,14 @@ void AP_InertialSensor_BMI270::start() _dev->get_semaphore()->give(); - if (!_imu.register_accel(_accel_instance, BMI270_BACKEND_SAMPLE_RATE, _dev->get_bus_id_devtype(DEVTYPE_BMI270)) || - !_imu.register_gyro(_gyro_instance, BMI270_BACKEND_SAMPLE_RATE, _dev->get_bus_id_devtype(DEVTYPE_BMI270))) { + if (!_imu.register_accel(accel_instance, BMI270_BACKEND_SAMPLE_RATE, _dev->get_bus_id_devtype(DEVTYPE_BMI270)) || + !_imu.register_gyro(gyro_instance, BMI270_BACKEND_SAMPLE_RATE, _dev->get_bus_id_devtype(DEVTYPE_BMI270))) { return; } // setup sensor rotations from probe() - set_gyro_orientation(_gyro_instance, _rotation); - set_accel_orientation(_accel_instance, _rotation); + set_gyro_orientation(gyro_instance, _rotation); + set_accel_orientation(accel_instance, _rotation); /* Call read_fifo() at 1600Hz */ periodic_handle = _dev->register_periodic_callback(BACKEND_PERIOD_US, FUNCTOR_BIND_MEMBER(&AP_InertialSensor_BMI270::read_fifo, void)); @@ -227,8 +227,8 @@ void AP_InertialSensor_BMI270::start() bool AP_InertialSensor_BMI270::update() { - update_accel(_accel_instance); - update_gyro(_gyro_instance); + update_accel(accel_instance); + update_gyro(gyro_instance); return true; } @@ -364,8 +364,8 @@ void AP_InertialSensor_BMI270::fifo_reset() // flush and reset FIFO write_register(BMI270_REG_CMD, BMI270_CMD_FIFOFLUSH); - notify_accel_fifo_reset(_accel_instance); - notify_gyro_fifo_reset(_gyro_instance); + notify_accel_fifo_reset(accel_instance); + notify_gyro_fifo_reset(gyro_instance); } /* @@ -383,8 +383,8 @@ void AP_InertialSensor_BMI270::read_fifo(void) uint8_t len[2]; if (!read_registers(BMI270_REG_FIFO_LENGTH_LSB, len, 2)) { - _inc_accel_error_count(_accel_instance); - _inc_gyro_error_count(_gyro_instance); + _inc_accel_error_count(accel_instance); + _inc_gyro_error_count(gyro_instance); return; } uint16_t fifo_length = len[0] + (len[1]<<8); @@ -403,8 +403,8 @@ void AP_InertialSensor_BMI270::read_fifo(void) uint8_t data[fifo_length]; if (!read_registers(BMI270_REG_FIFO_DATA, data, fifo_length)) { - _inc_accel_error_count(_accel_instance); - _inc_gyro_error_count(_gyro_instance); + _inc_accel_error_count(accel_instance); + _inc_gyro_error_count(gyro_instance); return; } @@ -462,14 +462,14 @@ void AP_InertialSensor_BMI270::read_fifo(void) temperature_counter = 0; uint8_t tbuf[2]; if (!read_registers(BMI270_REG_TEMPERATURE_LSB, tbuf, 2)) { - _inc_accel_error_count(_accel_instance); - _inc_gyro_error_count(_gyro_instance); + _inc_accel_error_count(accel_instance); + _inc_gyro_error_count(gyro_instance); } else { uint16_t tval = tbuf[0] | (tbuf[1] << 8); if (tval != 0x8000) { // 0x8000 is invalid int16_t klsb = static_cast(tval); float temp_degc = klsb * 0.002f + 23.0f; - _publish_temperature(_accel_instance, temp_degc); + _publish_temperature(accel_instance, temp_degc); } } } @@ -487,8 +487,8 @@ void AP_InertialSensor_BMI270::parse_accel_frame(const uint8_t* d) accel *= scale; - _rotate_and_correct_accel(_accel_instance, accel); - _notify_new_accel_raw_sample(_accel_instance, accel); + _rotate_and_correct_accel(accel_instance, accel); + _notify_new_accel_raw_sample(accel_instance, accel); } void AP_InertialSensor_BMI270::parse_gyro_frame(const uint8_t* d) @@ -502,8 +502,8 @@ void AP_InertialSensor_BMI270::parse_gyro_frame(const uint8_t* d) Vector3f gyro(xyz[0], xyz[1], xyz[2]); gyro *= scale; - _rotate_and_correct_gyro(_gyro_instance, gyro); - _notify_new_gyro_raw_sample(_gyro_instance, gyro); + _rotate_and_correct_gyro(gyro_instance, gyro); + _notify_new_gyro_raw_sample(gyro_instance, gyro); } bool AP_InertialSensor_BMI270::hardware_init() diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_BMI270.h b/libraries/AP_InertialSensor/AP_InertialSensor_BMI270.h index fb21ca0f57..0e16d23094 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_BMI270.h +++ b/libraries/AP_InertialSensor/AP_InertialSensor_BMI270.h @@ -115,8 +115,6 @@ private: enum Rotation _rotation; - uint8_t _accel_instance; - uint8_t _gyro_instance; uint8_t temperature_counter; static const uint8_t maximum_fifo_config_file[]; diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_Backend.cpp b/libraries/AP_InertialSensor/AP_InertialSensor_Backend.cpp index 79d36134f9..bef05d69ab 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_Backend.cpp +++ b/libraries/AP_InertialSensor/AP_InertialSensor_Backend.cpp @@ -164,7 +164,7 @@ void AP_InertialSensor_Backend::_rotate_and_correct_gyro(uint8_t instance, Vecto */ void AP_InertialSensor_Backend::_publish_gyro(uint8_t instance, const Vector3f &gyro) /* front end */ { - if ((1U<set_speed(AP_HAL::Device::SPEED_HIGH); _last_stat_user_ctrl = user_ctrl | BIT_USER_CTRL_FIFO_EN; - notify_accel_fifo_reset(_accel_instance); - notify_gyro_fifo_reset(_gyro_instance); + notify_accel_fifo_reset(accel_instance); + notify_gyro_fifo_reset(gyro_instance); } void AP_InertialSensor_Invensense::_fast_fifo_reset() @@ -211,8 +211,8 @@ void AP_InertialSensor_Invensense::_fast_fifo_reset() fast_reset_count++; _register_write(MPUREG_USER_CTRL, _last_stat_user_ctrl | BIT_USER_CTRL_FIFO_RESET); - notify_accel_fifo_reset(_accel_instance); - notify_gyro_fifo_reset(_gyro_instance); + notify_accel_fifo_reset(accel_instance); + notify_gyro_fifo_reset(gyro_instance); } @@ -224,7 +224,7 @@ bool AP_InertialSensor_Invensense::_has_auxiliary_bus() void AP_InertialSensor_Invensense::start() { // pre-fetch instance numbers for checking fast sampling settings - if (!_imu.get_gyro_instance(_gyro_instance) || !_imu.get_accel_instance(_accel_instance)) { + if (!_imu.get_gyro_instance(gyro_instance) || !_imu.get_accel_instance(accel_instance)) { return; } @@ -320,8 +320,8 @@ void AP_InertialSensor_Invensense::start() break; } - if (!_imu.register_gyro(_gyro_instance, 1000, _dev->get_bus_id_devtype(gdev)) || - !_imu.register_accel(_accel_instance, 1000, _dev->get_bus_id_devtype(adev))) { + if (!_imu.register_gyro(gyro_instance, 1000, _dev->get_bus_id_devtype(gdev)) || + !_imu.register_accel(accel_instance, 1000, _dev->get_bus_id_devtype(adev))) { return; } @@ -329,12 +329,12 @@ void AP_InertialSensor_Invensense::start() _set_filter_register(); // update backend sample rate - _set_accel_raw_sample_rate(_accel_instance, _accel_backend_rate_hz); - _set_gyro_raw_sample_rate(_gyro_instance, _gyro_backend_rate_hz); + _set_accel_raw_sample_rate(accel_instance, _accel_backend_rate_hz); + _set_gyro_raw_sample_rate(gyro_instance, _gyro_backend_rate_hz); // indicate what multiplier is appropriate for the sensors' // readings to fit them into an int16_t: - _set_raw_sample_accel_multiplier(_accel_instance, multiplier_accel); + _set_raw_sample_accel_multiplier(accel_instance, multiplier_accel); // set sample rate to 1000Hz and apply a software filter // In this configuration, the gyro sample rate is 8kHz @@ -426,8 +426,8 @@ void AP_InertialSensor_Invensense::start() _dev->set_speed(AP_HAL::Device::SPEED_HIGH); // setup sensor rotations from probe() - set_gyro_orientation(_gyro_instance, _rotation); - set_accel_orientation(_accel_instance, _rotation); + set_gyro_orientation(gyro_instance, _rotation); + set_accel_orientation(accel_instance, _rotation); // setup scale factors for fifo data after downsampling _fifo_accel_scale = _accel_scale / _accel_fifo_downsample_rate; @@ -447,7 +447,7 @@ void AP_InertialSensor_Invensense::start() bool AP_InertialSensor_Invensense::get_output_banner(char* banner, uint8_t banner_len) { if (_fast_sampling) { snprintf(banner, banner_len, "IMU%u: fast sampling enabled %.1fkHz/%.1fkHz", - _gyro_instance, _gyro_backend_rate_hz * _gyro_fifo_downsample_rate * 0.001, _gyro_backend_rate_hz * 0.001); + gyro_instance, _gyro_backend_rate_hz * _gyro_fifo_downsample_rate * 0.001, _gyro_backend_rate_hz * 0.001); return true; } return false; @@ -459,10 +459,10 @@ bool AP_InertialSensor_Invensense::get_output_banner(char* banner, uint8_t banne */ bool AP_InertialSensor_Invensense::update() /* front end */ { - update_accel(_accel_instance); - update_gyro(_gyro_instance); + update_accel(accel_instance); + update_gyro(gyro_instance); - _publish_temperature(_accel_instance, _temp_filtered); + _publish_temperature(accel_instance, _temp_filtered); if (fast_reset_count) { // check if we have reported in the last 1 seconds or @@ -472,13 +472,13 @@ bool AP_InertialSensor_Invensense::update() /* front end */ if (now - last_fast_reset_count_report_ms > 5000U) { last_fast_reset_count_report_ms = now; char param_name[sizeof("IMUxx_RST")]; - snprintf(param_name, sizeof(param_name), "IMU%u_RST", MIN(_gyro_instance,9)); + snprintf(param_name, sizeof(param_name), "IMU%u_RST", MIN(gyro_instance,9)); gcs().send_named_float(param_name, fast_reset_count); } #endif #if HAL_LOGGING_ENABLED if (last_fast_reset_count != fast_reset_count) { - AP::logger().Write_MessageF("IMU%u fast fifo reset %u", _gyro_instance, fast_reset_count); + AP::logger().Write_MessageF("IMU%u fast fifo reset %u", gyro_instance, fast_reset_count); last_fast_reset_count = fast_reset_count; } #endif @@ -602,7 +602,7 @@ bool AP_InertialSensor_Invensense::_accumulate(uint8_t *samples, uint8_t n_sampl return false; } else { if (!hal.scheduler->in_expected_delay()) { - debug("temp reset IMU[%u] %d %d", _accel_instance, _raw_temp, t2); + debug("temp reset IMU[%u] %d %d", accel_instance, _raw_temp, t2); } _fifo_reset(true); return false; @@ -615,11 +615,11 @@ bool AP_InertialSensor_Invensense::_accumulate(uint8_t *samples, uint8_t n_sampl -int16_val(data, 6)); gyro *= _gyro_scale; - _rotate_and_correct_accel(_accel_instance, accel); - _rotate_and_correct_gyro(_gyro_instance, gyro); + _rotate_and_correct_accel(accel_instance, accel); + _rotate_and_correct_gyro(gyro_instance, gyro); - _notify_new_accel_raw_sample(_accel_instance, accel, 0, fsync_set); - _notify_new_gyro_raw_sample(_gyro_instance, gyro); + _notify_new_accel_raw_sample(accel_instance, accel, 0, fsync_set); + _notify_new_gyro_raw_sample(gyro_instance, gyro); _temp_filtered = _temp_filter.apply(temp); } @@ -652,7 +652,7 @@ bool AP_InertialSensor_Invensense::_accumulate_sensor_rate_sampling(uint8_t *sam ret = false; } else { if (!hal.scheduler->in_expected_delay()) { - debug("temp reset IMU[%u] %d %d", _accel_instance, _raw_temp, t2); + debug("temp reset IMU[%u] %d %d", accel_instance, _raw_temp, t2); } _fifo_reset(true); ret = false; @@ -674,14 +674,14 @@ bool AP_InertialSensor_Invensense::_accumulate_sensor_rate_sampling(uint8_t *sam _accum.accel += _accum.accel_filter.apply(a); Vector3f a2 = a * _accel_scale; - _notify_new_accel_sensor_rate_sample(_accel_instance, a2); + _notify_new_accel_sensor_rate_sample(accel_instance, a2); _accum.accel_count++; if (_accum.accel_count % _accel_fifo_downsample_rate == 0) { _accum.accel *= _fifo_accel_scale; - _rotate_and_correct_accel(_accel_instance, _accum.accel); - _notify_new_accel_raw_sample(_accel_instance, _accum.accel, 0, false); + _rotate_and_correct_accel(accel_instance, _accum.accel); + _notify_new_accel_raw_sample(accel_instance, _accum.accel, 0, false); _accum.accel.zero(); _accum.accel_count = 0; // we assume that the gyro rate is always >= and a multiple of the accel rate @@ -696,20 +696,20 @@ bool AP_InertialSensor_Invensense::_accumulate_sensor_rate_sampling(uint8_t *sam -int16_val(data, 6)); Vector3f g2 = g * _gyro_scale; - _notify_new_gyro_sensor_rate_sample(_gyro_instance, g2); + _notify_new_gyro_sensor_rate_sample(gyro_instance, g2); _accum.gyro += g; if (_accum.gyro_count % _gyro_fifo_downsample_rate == 0) { _accum.gyro *= _fifo_gyro_scale; - _rotate_and_correct_gyro(_gyro_instance, _accum.gyro); - _notify_new_gyro_raw_sample(_gyro_instance, _accum.gyro); + _rotate_and_correct_gyro(gyro_instance, _accum.gyro); + _notify_new_gyro_raw_sample(gyro_instance, _accum.gyro); _accum.gyro.zero(); } } if (clipped) { - increment_clip_count(_accel_instance); + increment_clip_count(accel_instance); } if (ret) { @@ -788,7 +788,7 @@ void AP_InertialSensor_Invensense::_read_fifo() if (_fast_sampling) { if (!_accumulate_sensor_rate_sampling(rx, n)) { if (!hal.scheduler->in_expected_delay() && !_enable_fast_fifo_reset) { - debug("IMU[%u] stop at %u of %u", _accel_instance, n_samples, bytes_read/MPU_SAMPLE_SIZE); + debug("IMU[%u] stop at %u of %u", accel_instance, n_samples, bytes_read/MPU_SAMPLE_SIZE); } break; } @@ -831,8 +831,8 @@ check_registers: AP_HAL::Device::checkreg reg; if (!_dev->check_next_register(reg)) { log_register_change(_dev->get_bus_id(), reg); - _inc_gyro_error_count(_gyro_instance); - _inc_accel_error_count(_accel_instance); + _inc_gyro_error_count(gyro_instance); + _inc_accel_error_count(accel_instance); } _dev->set_speed(AP_HAL::Device::SPEED_HIGH); } @@ -890,7 +890,7 @@ void AP_InertialSensor_Invensense::_set_filter_register(void) _gyro_to_accel_sample_ratio = 2; _gyro_backend_rate_hz = _accel_backend_rate_hz = 1000; - if (enable_fast_sampling(_accel_instance)) { + if (enable_fast_sampling(accel_instance)) { _fast_sampling = _dev->bus_type() == AP_HAL::Device::BUS_TYPE_SPI; if (_fast_sampling) { // constrain the gyro rate to be at least the loop rate @@ -919,11 +919,11 @@ void AP_InertialSensor_Invensense::_set_filter_register(void) } // for logging purposes set the oversamping rate - _set_accel_oversampling(_accel_instance, _accel_fifo_downsample_rate); - _set_gyro_oversampling(_gyro_instance, _gyro_fifo_downsample_rate); + _set_accel_oversampling(accel_instance, _accel_fifo_downsample_rate); + _set_gyro_oversampling(gyro_instance, _gyro_fifo_downsample_rate); - _set_accel_sensor_rate_sampling_enabled(_accel_instance, true); - _set_gyro_sensor_rate_sampling_enabled(_gyro_instance, true); + _set_accel_sensor_rate_sampling_enabled(accel_instance, true); + _set_gyro_sensor_rate_sampling_enabled(gyro_instance, true); /* set divider for internal sample rate to 0x1F when fast sampling enabled. This reduces the impact of the slave diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_Invensense.h b/libraries/AP_InertialSensor/AP_InertialSensor_Invensense.h index 7f77e35e48..522dfd527d 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_Invensense.h +++ b/libraries/AP_InertialSensor/AP_InertialSensor_Invensense.h @@ -115,10 +115,6 @@ private: int16_t _raw_temp; - // instance numbers of accel and gyro data - uint8_t _gyro_instance; - uint8_t _accel_instance; - float temp_sensitivity = 1.0f/340; // degC/LSB float temp_zero = 36.53f; // degC diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_Invensensev2.cpp b/libraries/AP_InertialSensor/AP_InertialSensor_Invensensev2.cpp index 1e8be9d2b5..b8279d339f 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_Invensensev2.cpp +++ b/libraries/AP_InertialSensor/AP_InertialSensor_Invensensev2.cpp @@ -155,8 +155,8 @@ void AP_InertialSensor_Invensensev2::_fifo_reset() _dev->set_speed(AP_HAL::Device::SPEED_HIGH); _last_stat_user_ctrl = user_ctrl | BIT_USER_CTRL_FIFO_EN; - notify_accel_fifo_reset(_accel_instance); - notify_gyro_fifo_reset(_gyro_instance); + notify_accel_fifo_reset(accel_instance); + notify_gyro_fifo_reset(gyro_instance); } bool AP_InertialSensor_Invensensev2::_has_auxiliary_bus() @@ -167,7 +167,7 @@ bool AP_InertialSensor_Invensensev2::_has_auxiliary_bus() void AP_InertialSensor_Invensensev2::start() { // pre-fetch instance numbers for checking fast sampling settings - if (!_imu.get_gyro_instance(_gyro_instance) || !_imu.get_accel_instance(_accel_instance)) { + if (!_imu.get_gyro_instance(gyro_instance) || !_imu.get_accel_instance(accel_instance)) { return; } @@ -207,8 +207,8 @@ void AP_InertialSensor_Invensensev2::start() break; } - if (!_imu.register_gyro(_gyro_instance, 1125, _dev->get_bus_id_devtype(gdev)) || - !_imu.register_accel(_accel_instance, 1125, _dev->get_bus_id_devtype(adev))) { + if (!_imu.register_gyro(gyro_instance, 1125, _dev->get_bus_id_devtype(gdev)) || + !_imu.register_accel(accel_instance, 1125, _dev->get_bus_id_devtype(adev))) { return; } @@ -219,12 +219,12 @@ void AP_InertialSensor_Invensensev2::start() _register_write(INV2REG_FSYNC_CONFIG, FSYNC_CONFIG_EXT_SYNC_AZ, true); #endif // update backend sample rate - _set_accel_raw_sample_rate(_accel_instance, _accel_backend_rate_hz); - _set_gyro_raw_sample_rate(_gyro_instance, _gyro_backend_rate_hz); + _set_accel_raw_sample_rate(accel_instance, _accel_backend_rate_hz); + _set_gyro_raw_sample_rate(gyro_instance, _gyro_backend_rate_hz); // indicate what multiplier is appropriate for the sensors' // readings to fit them into an int16_t: - _set_raw_sample_accel_multiplier(_accel_instance, multiplier_accel); + _set_raw_sample_accel_multiplier(accel_instance, multiplier_accel); // set sample rate to 1.125KHz _register_write(INV2REG_GYRO_SMPLRT_DIV, 0, true); @@ -238,8 +238,8 @@ void AP_InertialSensor_Invensensev2::start() _dev->set_speed(AP_HAL::Device::SPEED_HIGH); // setup sensor rotations from probe() - set_gyro_orientation(_gyro_instance, _rotation); - set_accel_orientation(_accel_instance, _rotation); + set_gyro_orientation(gyro_instance, _rotation); + set_accel_orientation(accel_instance, _rotation); // setup scale factors for fifo data after downsampling _fifo_accel_scale = _accel_scale / _accel_fifo_downsample_rate; @@ -259,7 +259,7 @@ void AP_InertialSensor_Invensensev2::start() bool AP_InertialSensor_Invensensev2::get_output_banner(char* banner, uint8_t banner_len) { if (_fast_sampling) { snprintf(banner, banner_len, "IMU%u: fast sampling enabled %.1fkHz/%.1fkHz", - _gyro_instance, _gyro_backend_rate_hz * _gyro_fifo_downsample_rate * 0.001, _gyro_backend_rate_hz * 0.001); + gyro_instance, _gyro_backend_rate_hz * _gyro_fifo_downsample_rate * 0.001, _gyro_backend_rate_hz * 0.001); return true; } return false; @@ -270,10 +270,10 @@ bool AP_InertialSensor_Invensensev2::get_output_banner(char* banner, uint8_t ban */ bool AP_InertialSensor_Invensensev2::update() { - update_accel(_accel_instance); - update_gyro(_gyro_instance); + update_accel(accel_instance); + update_gyro(gyro_instance); - _publish_temperature(_accel_instance, _temp_filtered); + _publish_temperature(accel_instance, _temp_filtered); return true; } @@ -341,7 +341,7 @@ bool AP_InertialSensor_Invensensev2::_accumulate(uint8_t *samples, uint8_t n_sam int16_t t2 = int16_val(data, 6); if (!_check_raw_temp(t2)) { if (!hal.scheduler->in_expected_delay()) { - debug("temp reset IMU[%u] %d %d", _accel_instance, _raw_temp, t2); + debug("temp reset IMU[%u] %d %d", accel_instance, _raw_temp, t2); } _fifo_reset(); return false; @@ -353,11 +353,11 @@ bool AP_InertialSensor_Invensensev2::_accumulate(uint8_t *samples, uint8_t n_sam -int16_val(data, 5)); gyro *= GYRO_SCALE; - _rotate_and_correct_accel(_accel_instance, accel); - _rotate_and_correct_gyro(_gyro_instance, gyro); + _rotate_and_correct_accel(accel_instance, accel); + _rotate_and_correct_gyro(gyro_instance, gyro); - _notify_new_accel_raw_sample(_accel_instance, accel, 0, fsync_set); - _notify_new_gyro_raw_sample(_gyro_instance, gyro); + _notify_new_accel_raw_sample(accel_instance, accel, 0, fsync_set); + _notify_new_gyro_raw_sample(gyro_instance, gyro); _temp_filtered = _temp_filter.apply(temp); } @@ -386,7 +386,7 @@ bool AP_InertialSensor_Invensensev2::_accumulate_sensor_rate_sampling(uint8_t *s int16_t t2 = int16_val(data, 6); if (!_check_raw_temp(t2)) { if (!hal.scheduler->in_expected_delay()) { - debug("temp reset IMU[%u] %d %d", _accel_instance, _raw_temp, t2); + debug("temp reset IMU[%u] %d %d", accel_instance, _raw_temp, t2); } _fifo_reset(); ret = false; @@ -406,14 +406,14 @@ bool AP_InertialSensor_Invensensev2::_accumulate_sensor_rate_sampling(uint8_t *s _accum.accel += _accum.accel_filter.apply(a); Vector3f a2 = a * _accel_scale; - _notify_new_accel_sensor_rate_sample(_accel_instance, a2); + _notify_new_accel_sensor_rate_sample(accel_instance, a2); _accum.accel_count++; if (_accum.accel_count % _accel_fifo_downsample_rate == 0) { _accum.accel *= _fifo_accel_scale; - _rotate_and_correct_accel(_accel_instance, _accum.accel); - _notify_new_accel_raw_sample(_accel_instance, _accum.accel, 0, false); + _rotate_and_correct_accel(accel_instance, _accum.accel); + _notify_new_accel_raw_sample(accel_instance, _accum.accel, 0, false); _accum.accel.zero(); _accum.accel_count = 0; // we assume that the gyro rate is always >= and a multiple of the accel rate @@ -428,20 +428,20 @@ bool AP_InertialSensor_Invensensev2::_accumulate_sensor_rate_sampling(uint8_t *s -int16_val(data, 5)); Vector3f g2 = g * GYRO_SCALE; - _notify_new_gyro_sensor_rate_sample(_gyro_instance, g2); + _notify_new_gyro_sensor_rate_sample(gyro_instance, g2); _accum.gyro += g; if (_accum.gyro_count % _gyro_fifo_downsample_rate == 0) { _accum.gyro *= _fifo_gyro_scale; - _rotate_and_correct_gyro(_gyro_instance, _accum.gyro); - _notify_new_gyro_raw_sample(_gyro_instance, _accum.gyro); + _rotate_and_correct_gyro(gyro_instance, _accum.gyro); + _notify_new_gyro_raw_sample(gyro_instance, _accum.gyro); _accum.gyro.zero(); } } if (clipped) { - increment_clip_count(_accel_instance); + increment_clip_count(accel_instance); } if (ret) { @@ -519,7 +519,7 @@ void AP_InertialSensor_Invensensev2::_read_fifo() if (_fast_sampling) { if (!_accumulate_sensor_rate_sampling(rx, n)) { if (!hal.scheduler->in_expected_delay()) { - debug("IMU[%u] stop at %u of %u", _accel_instance, n_samples, bytes_read/INV2_SAMPLE_SIZE); + debug("IMU[%u] stop at %u of %u", accel_instance, n_samples, bytes_read/INV2_SAMPLE_SIZE); } break; } @@ -542,8 +542,8 @@ check_registers: AP_HAL::Device::checkreg reg; if (!_dev->check_next_register(reg)) { log_register_change(_dev->get_bus_id(), reg); - _inc_gyro_error_count(_gyro_instance); - _inc_accel_error_count(_accel_instance); + _inc_gyro_error_count(gyro_instance); + _inc_accel_error_count(accel_instance); } _dev->set_speed(AP_HAL::Device::SPEED_HIGH); } @@ -608,7 +608,7 @@ void AP_InertialSensor_Invensensev2::_set_filter_and_scaling(void) _gyro_fifo_downsample_rate = _accel_fifo_downsample_rate = 1; _gyro_backend_rate_hz = _accel_backend_rate_hz = 1125; - if (enable_fast_sampling(_accel_instance)) { + if (enable_fast_sampling(accel_instance)) { _fast_sampling = _dev->bus_type() == AP_HAL::Device::BUS_TYPE_SPI; if (_fast_sampling) { // constrain the gyro rate to be at least the loop rate @@ -631,11 +631,11 @@ void AP_InertialSensor_Invensensev2::_set_filter_and_scaling(void) _accel_backend_rate_hz *= MIN(fast_sampling_rate, 4); // for logging purposes set the oversamping rate - _set_accel_oversampling(_accel_instance, _accel_fifo_downsample_rate); - _set_gyro_oversampling(_gyro_instance, _gyro_fifo_downsample_rate); + _set_accel_oversampling(accel_instance, _accel_fifo_downsample_rate); + _set_gyro_oversampling(gyro_instance, _gyro_fifo_downsample_rate); - _set_accel_sensor_rate_sampling_enabled(_accel_instance, true); - _set_gyro_sensor_rate_sampling_enabled(_gyro_instance, true); + _set_accel_sensor_rate_sampling_enabled(accel_instance, true); + _set_gyro_sensor_rate_sampling_enabled(gyro_instance, true); /* set divider for internal sample rate to 0x1F when fast sampling enabled. This reduces the impact of the slave diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_Invensensev2.h b/libraries/AP_InertialSensor/AP_InertialSensor_Invensensev2.h index 9becc1d60e..b6e21d0034 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_Invensensev2.h +++ b/libraries/AP_InertialSensor/AP_InertialSensor_Invensensev2.h @@ -103,10 +103,6 @@ private: int16_t _raw_temp; - // instance numbers of accel and gyro data - uint8_t _gyro_instance; - uint8_t _accel_instance; - float temp_sensitivity = 1.0f/333.87f; // degC/LSB float temp_zero = 21; // degC diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_Invensensev3.cpp b/libraries/AP_InertialSensor/AP_InertialSensor_Invensensev3.cpp index 9a27617197..024d1f56a2 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_Invensensev3.cpp +++ b/libraries/AP_InertialSensor/AP_InertialSensor_Invensensev3.cpp @@ -166,8 +166,8 @@ struct PACKED FIFODataHighRes { #define INV3_SAMPLE_SIZE sizeof(FIFOData) #define INV3_HIGHRES_SAMPLE_SIZE sizeof(FIFODataHighRes) -static_assert(sizeof(FIFOData) == 16); -static_assert(sizeof(FIFODataHighRes) == 20); +static_assert(sizeof(FIFOData) == 16, "FIFOData must be 16 bytes"); +static_assert(sizeof(FIFODataHighRes) == 20, "FIFODataHighRes must be 20 bytes"); #define INV3_FIFO_BUFFER_LEN 8 @@ -1037,7 +1037,7 @@ bool AP_InertialSensor_Invensensev3::hardware_init(void) case Invensensev3_Type::ICM42605: case Invensensev3_Type::ICM40605: case Invensensev3_Type::ICM42670: - _clip_limit = 15.5f * GRAVITY_MSS; + _clip_limit = (16.0f - 0.5f) * GRAVITY_MSS; break; } diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_Invensensev3.h b/libraries/AP_InertialSensor/AP_InertialSensor_Invensensev3.h index aa9971db0d..b3946aa81d 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_Invensensev3.h +++ b/libraries/AP_InertialSensor/AP_InertialSensor_Invensensev3.h @@ -74,10 +74,6 @@ private: bool accumulate_samples(const struct FIFOData *data, uint8_t n_samples); bool accumulate_highres_samples(const struct FIFODataHighRes *data, uint8_t n_samples); - // instance numbers of accel and gyro data - uint8_t gyro_instance; - uint8_t accel_instance; - // reset FIFO configure1 register uint8_t fifo_config1; diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_L3G4200D.cpp b/libraries/AP_InertialSensor/AP_InertialSensor_L3G4200D.cpp index 0d97d71f84..82a19e2261 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_L3G4200D.cpp +++ b/libraries/AP_InertialSensor/AP_InertialSensor_L3G4200D.cpp @@ -250,8 +250,8 @@ bool AP_InertialSensor_L3G4200D::_init_sensor(void) */ void AP_InertialSensor_L3G4200D::start(void) { - if (!_imu.register_gyro(_gyro_instance, 800, _dev_gyro->get_bus_id_devtype(DEVTYPE_L3G4200D)) || - !_imu.register_accel(_accel_instance, 800, _dev_accel->get_bus_id_devtype(DEVTYPE_L3G4200D))) { + if (!_imu.register_gyro(gyro_instance, 800, _dev_gyro->get_bus_id_devtype(DEVTYPE_L3G4200D)) || + !_imu.register_accel(accel_instance, 800, _dev_accel->get_bus_id_devtype(DEVTYPE_L3G4200D))) { return; } @@ -276,8 +276,8 @@ void AP_InertialSensor_L3G4200D::_set_filter_frequency(uint8_t filter_hz) */ bool AP_InertialSensor_L3G4200D::update(void) { - update_gyro(_gyro_instance); - update_accel(_accel_instance); + update_gyro(gyro_instance); + update_accel(accel_instance); return true; } @@ -313,8 +313,8 @@ void AP_InertialSensor_L3G4200D::_accumulate_gyro (void) // Adjust for chip scaling to get radians/sec //hal.console->printf("gyro %f \r\n",gyro.x); gyro *= L3G4200D_GYRO_SCALE_R_S; - _rotate_and_correct_gyro(_gyro_instance, gyro); - _notify_new_gyro_raw_sample(_gyro_instance, gyro); + _rotate_and_correct_gyro(gyro_instance, gyro); + _notify_new_gyro_raw_sample(gyro_instance, gyro); } } } @@ -341,8 +341,8 @@ void AP_InertialSensor_L3G4200D::_accumulate_accel (void) Vector3f accel = Vector3f(buffer[i][0], -buffer[i][1], -buffer[i][2]); // Adjust for chip scaling to get m/s/s accel *= ADXL345_ACCELEROMETER_SCALE_M_S; - _rotate_and_correct_accel(_accel_instance, accel); - _notify_new_accel_raw_sample(_accel_instance, accel); + _rotate_and_correct_accel(accel_instance, accel); + _notify_new_accel_raw_sample(accel_instance, accel); } } } diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_L3G4200D.h b/libraries/AP_InertialSensor/AP_InertialSensor_L3G4200D.h index 535613571d..b97b430f6d 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_L3G4200D.h +++ b/libraries/AP_InertialSensor/AP_InertialSensor_L3G4200D.h @@ -52,9 +52,5 @@ private: LowPassFilter2pVector3f _gyro_filter; enum Rotation _rotation; - - // gyro and accel instances - uint8_t _gyro_instance; - uint8_t _accel_instance; }; #endif // __AP_INERTIAL_SENSOR_L3G4200D2_H__ \ No newline at end of file diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_LSM9DS0.cpp b/libraries/AP_InertialSensor/AP_InertialSensor_LSM9DS0.cpp index e6d91738cd..4c1919c734 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_LSM9DS0.cpp +++ b/libraries/AP_InertialSensor/AP_InertialSensor_LSM9DS0.cpp @@ -512,19 +512,19 @@ fail_whoami: */ void AP_InertialSensor_LSM9DS0::start(void) { - if (!_imu.register_gyro(_gyro_instance, 760, _dev_gyro->get_bus_id_devtype(DEVTYPE_GYR_L3GD20)) || - !_imu.register_accel(_accel_instance, 1000, _dev_accel->get_bus_id_devtype(DEVTYPE_ACC_LSM303D))) { + if (!_imu.register_gyro(gyro_instance, 760, _dev_gyro->get_bus_id_devtype(DEVTYPE_GYR_L3GD20)) || + !_imu.register_accel(accel_instance, 1000, _dev_accel->get_bus_id_devtype(DEVTYPE_ACC_LSM303D))) { return; } if (whoami_g == LSM9DS0_G_WHOAMI_H) { - set_gyro_orientation(_gyro_instance, _rotation_gH); + set_gyro_orientation(gyro_instance, _rotation_gH); } else { - set_gyro_orientation(_gyro_instance, _rotation_g); + set_gyro_orientation(gyro_instance, _rotation_g); } - set_accel_orientation(_accel_instance, _rotation_a); + set_accel_orientation(accel_instance, _rotation_a); - _set_accel_max_abs_offset(_accel_instance, 5.0f); + _set_accel_max_abs_offset(accel_instance, 5.0f); /* start the timer process to read samples */ _dev_gyro->register_periodic_callback(1000, FUNCTOR_BIND_MEMBER(&AP_InertialSensor_LSM9DS0::_poll_data, void)); @@ -700,11 +700,11 @@ void AP_InertialSensor_LSM9DS0::_poll_data() AP_HAL::Device::checkreg reg; if (!_dev_gyro->check_next_register(reg)) { log_register_change(_dev_gyro->get_bus_id(), reg); - _inc_gyro_error_count(_gyro_instance); + _inc_gyro_error_count(gyro_instance); } if (!_dev_accel->check_next_register(reg)) { log_register_change(_dev_accel->get_bus_id(), reg); - _inc_accel_error_count(_accel_instance); + _inc_accel_error_count(accel_instance); } } @@ -740,8 +740,8 @@ void AP_InertialSensor_LSM9DS0::_read_data_transaction_a() Vector3f accel_data(raw_data.x, -raw_data.y, -raw_data.z); accel_data *= _accel_scale; - _rotate_and_correct_accel(_accel_instance, accel_data); - _notify_new_accel_raw_sample(_accel_instance, accel_data, AP_HAL::micros64()); + _rotate_and_correct_accel(accel_instance, accel_data); + _notify_new_accel_raw_sample(accel_instance, accel_data, AP_HAL::micros64()); // read temperature every 10th sample if (_temp_counter++ >= 10) { @@ -770,15 +770,15 @@ void AP_InertialSensor_LSM9DS0::_read_data_transaction_g() gyro_data *= _gyro_scale; - _rotate_and_correct_gyro(_gyro_instance, gyro_data); - _notify_new_gyro_raw_sample(_gyro_instance, gyro_data, AP_HAL::micros64()); + _rotate_and_correct_gyro(gyro_instance, gyro_data); + _notify_new_gyro_raw_sample(gyro_instance, gyro_data, AP_HAL::micros64()); } bool AP_InertialSensor_LSM9DS0::update() { - update_gyro(_gyro_instance); - update_accel(_accel_instance); - _publish_temperature(_accel_instance, _temperature); + update_gyro(gyro_instance); + update_accel(accel_instance); + _publish_temperature(accel_instance, _temperature); return true; } diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_LSM9DS0.h b/libraries/AP_InertialSensor/AP_InertialSensor_LSM9DS0.h index 29fff90270..18244897a2 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_LSM9DS0.h +++ b/libraries/AP_InertialSensor/AP_InertialSensor_LSM9DS0.h @@ -97,8 +97,6 @@ private: float _accel_scale; int _drdy_pin_num_a; int _drdy_pin_num_g; - uint8_t _gyro_instance; - uint8_t _accel_instance; float _temperature; uint8_t _temp_counter; LowPassFilter2pFloat _temp_filter; diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_LSM9DS1.cpp b/libraries/AP_InertialSensor/AP_InertialSensor_LSM9DS1.cpp index df73ecb62f..d95cfce0f0 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_LSM9DS1.cpp +++ b/libraries/AP_InertialSensor/AP_InertialSensor_LSM9DS1.cpp @@ -321,8 +321,8 @@ void AP_InertialSensor_LSM9DS1::_fifo_reset() _dev->set_speed(AP_HAL::Device::SPEED_HIGH); - notify_accel_fifo_reset(_accel_instance); - notify_gyro_fifo_reset(_gyro_instance); + notify_accel_fifo_reset(accel_instance); + notify_gyro_fifo_reset(gyro_instance); } /* @@ -330,15 +330,15 @@ void AP_InertialSensor_LSM9DS1::_fifo_reset() */ void AP_InertialSensor_LSM9DS1::start(void) { - if (!_imu.register_gyro(_gyro_instance, 952, _dev->get_bus_id_devtype(DEVTYPE_GYR_LSM9DS1)) || - !_imu.register_accel(_accel_instance, 952, _dev->get_bus_id_devtype(DEVTYPE_ACC_LSM9DS1))) { + if (!_imu.register_gyro(gyro_instance, 952, _dev->get_bus_id_devtype(DEVTYPE_GYR_LSM9DS1)) || + !_imu.register_accel(accel_instance, 952, _dev->get_bus_id_devtype(DEVTYPE_ACC_LSM9DS1))) { return; } - set_accel_orientation(_accel_instance, _rotation); - set_gyro_orientation(_gyro_instance, _rotation); + set_accel_orientation(accel_instance, _rotation); + set_gyro_orientation(gyro_instance, _rotation); - _set_accel_max_abs_offset(_accel_instance, 5.0f); + _set_accel_max_abs_offset(accel_instance, 5.0f); /* start the timer process to read samples */ _dev->register_periodic_callback(1000, FUNCTOR_BIND_MEMBER(&AP_InertialSensor_LSM9DS1::_poll_data, void)); @@ -431,7 +431,7 @@ void AP_InertialSensor_LSM9DS1::_poll_data() AP_HAL::Device::checkreg reg; if (!_dev->check_next_register(reg)) { log_register_change(_dev->get_bus_id(), reg); - _inc_accel_error_count(_accel_instance); + _inc_accel_error_count(accel_instance); } } @@ -465,8 +465,8 @@ void AP_InertialSensor_LSM9DS1::_read_data_transaction_x(uint16_t samples) Vector3f accel_data(raw_data.x, raw_data.y, -raw_data.z); accel_data *= _accel_scale; - _rotate_and_correct_accel(_accel_instance, accel_data); - _notify_new_accel_raw_sample(_accel_instance, accel_data); + _rotate_and_correct_accel(accel_instance, accel_data); + _notify_new_accel_raw_sample(accel_instance, accel_data); } /* @@ -501,14 +501,14 @@ void AP_InertialSensor_LSM9DS1::_read_data_transaction_g(uint16_t samples) Vector3f gyro_data(raw_data.x, raw_data.y, -raw_data.z); gyro_data *= _gyro_scale; - _rotate_and_correct_gyro(_gyro_instance, gyro_data); - _notify_new_gyro_raw_sample(_gyro_instance, gyro_data); + _rotate_and_correct_gyro(gyro_instance, gyro_data); + _notify_new_gyro_raw_sample(gyro_instance, gyro_data); } bool AP_InertialSensor_LSM9DS1::update() { - update_gyro(_gyro_instance); - update_accel(_accel_instance); + update_gyro(gyro_instance); + update_accel(accel_instance); return true; } diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_LSM9DS1.h b/libraries/AP_InertialSensor/AP_InertialSensor_LSM9DS1.h index f52859c1bb..7997476aba 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_LSM9DS1.h +++ b/libraries/AP_InertialSensor/AP_InertialSensor_LSM9DS1.h @@ -68,7 +68,5 @@ private: float _gyro_scale; float _accel_scale; int _drdy_pin_num_xg; - uint8_t _gyro_instance; - uint8_t _accel_instance; enum Rotation _rotation; }; diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_RST.cpp b/libraries/AP_InertialSensor/AP_InertialSensor_RST.cpp index 860ae4aa26..fa061c4078 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_RST.cpp +++ b/libraries/AP_InertialSensor/AP_InertialSensor_RST.cpp @@ -336,13 +336,13 @@ bool AP_InertialSensor_RST::_init_sensor(void) */ void AP_InertialSensor_RST::start(void) { - if (!_imu.register_gyro(_gyro_instance, 800, _dev_gyro->get_bus_id_devtype(DEVTYPE_GYR_I3G4250D)) || - !_imu.register_accel(_accel_instance, 1000, _dev_accel->get_bus_id_devtype(DEVTYPE_ACC_IIS328DQ))) { + if (!_imu.register_gyro(gyro_instance, 800, _dev_gyro->get_bus_id_devtype(DEVTYPE_GYR_I3G4250D)) || + !_imu.register_accel(accel_instance, 1000, _dev_accel->get_bus_id_devtype(DEVTYPE_ACC_IIS328DQ))) { return; } - set_gyro_orientation(_gyro_instance, _rotation_g); - set_accel_orientation(_accel_instance, _rotation_a); + set_gyro_orientation(gyro_instance, _rotation_g); + set_accel_orientation(accel_instance, _rotation_a); // start the timer process to read samples _dev_gyro->register_periodic_callback(1150, FUNCTOR_BIND_MEMBER(&AP_InertialSensor_RST::gyro_measure, void)); @@ -354,8 +354,8 @@ void AP_InertialSensor_RST::start(void) */ bool AP_InertialSensor_RST::update(void) { - update_gyro(_gyro_instance); - update_accel(_accel_instance); + update_gyro(gyro_instance); + update_accel(accel_instance); return true; } @@ -376,8 +376,8 @@ void AP_InertialSensor_RST::gyro_measure(void) if (_dev_gyro->read_registers(GYRO_OUT_X_L | ADDR_INCREMENT, (uint8_t *)raw_data, sizeof(raw_data))) { gyro = Vector3f(raw_data[0], raw_data[1], raw_data[2]); gyro *= _gyro_scale; - _rotate_and_correct_gyro(_gyro_instance, gyro); - _notify_new_gyro_raw_sample(_gyro_instance, gyro); + _rotate_and_correct_gyro(gyro_instance, gyro); + _notify_new_gyro_raw_sample(gyro_instance, gyro); } } @@ -397,8 +397,8 @@ void AP_InertialSensor_RST::accel_measure(void) if (_dev_accel->read_registers(ACCEL_OUT_X_L | ADDR_INCREMENT, (uint8_t *)raw_data, sizeof(raw_data))) { accel = Vector3f(raw_data[0], raw_data[1], raw_data[2]); accel *= _accel_scale; - _rotate_and_correct_accel(_accel_instance, accel); - _notify_new_accel_raw_sample(_accel_instance, accel); + _rotate_and_correct_accel(accel_instance, accel); + _notify_new_accel_raw_sample(accel_instance, accel); } } diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_RST.h b/libraries/AP_InertialSensor/AP_InertialSensor_RST.h index 90d76d3e39..0efaa6cbbe 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_RST.h +++ b/libraries/AP_InertialSensor/AP_InertialSensor_RST.h @@ -47,9 +47,6 @@ private: float _gyro_scale; float _accel_scale; - // gyro and accel instances - uint8_t _gyro_instance; - uint8_t _accel_instance; enum Rotation _rotation_g; enum Rotation _rotation_a; }; diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_SCHA63T.h b/libraries/AP_InertialSensor/AP_InertialSensor_SCHA63T.h index 3ffc203a26..64110a1260 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_SCHA63T.h +++ b/libraries/AP_InertialSensor/AP_InertialSensor_SCHA63T.h @@ -84,7 +84,5 @@ private: AP_HAL::OwnPtr dev_uno; AP_HAL::OwnPtr dev_due; - uint8_t accel_instance; - uint8_t gyro_instance; enum Rotation rotation; }; diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_SITL.h b/libraries/AP_InertialSensor/AP_InertialSensor_SITL.h index ac95bac811..856f40ab00 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_SITL.h +++ b/libraries/AP_InertialSensor/AP_InertialSensor_SITL.h @@ -45,8 +45,6 @@ private: const uint16_t gyro_sample_hz; const uint16_t accel_sample_hz; - uint8_t gyro_instance; - uint8_t accel_instance; uint64_t next_gyro_sample; uint64_t next_accel_sample; float gyro_time; diff --git a/libraries/AP_InertialSensor/AP_InertialSensor_tempcal.cpp b/libraries/AP_InertialSensor/AP_InertialSensor_tempcal.cpp index 17d89f15ac..bb71172dc9 100644 --- a/libraries/AP_InertialSensor/AP_InertialSensor_tempcal.cpp +++ b/libraries/AP_InertialSensor/AP_InertialSensor_tempcal.cpp @@ -526,6 +526,7 @@ void AP_InertialSensor::get_persistent_params(ExpandingString &str) const str.printf("INS%u_ACCOFFS_Z=%f\n", imu, aoff.z); str.printf("INS%u_ACCSCAL_X=%f\n", imu, ascl.x); str.printf("INS%u_ACCSCAL_Y=%f\n", imu, ascl.y); + str.printf("INS%u_ACCSCAL_Z=%f\n", imu, ascl.z); str.printf("INS%u_ACC_CALTEMP=%.2f\n", imu, params[i].caltemp_accel.get()); } #endif diff --git a/libraries/AP_LTM_Telem/AP_LTM_Telem.cpp b/libraries/AP_LTM_Telem/AP_LTM_Telem.cpp index 5d3bdc2f41..ebc44a3937 100644 --- a/libraries/AP_LTM_Telem/AP_LTM_Telem.cpp +++ b/libraries/AP_LTM_Telem/AP_LTM_Telem.cpp @@ -142,10 +142,12 @@ void AP_LTM_Telem::send_Sframe(void) const uint8_t flightmode = AP_Notify::flags.flight_mode; // flight mode uint8_t rssi = 0; // radio RSSI (%a) +#if AP_RSSI_ENABLED AP_RSSI *ap_rssi = AP_RSSI::get_singleton(); if (ap_rssi) { rssi = ap_rssi->read_receiver_rssi_uint8(); } +#endif const uint8_t armstat = AP_Notify::flags.armed; // 0: disarmed, 1: armed const uint8_t failsafe = AP_Notify::flags.failsafe_radio; // 0: normal, 1: failsafe diff --git a/libraries/AP_LTM_Telem/AP_LTM_Telem.h b/libraries/AP_LTM_Telem/AP_LTM_Telem.h index f0315f7f97..245baf758e 100644 --- a/libraries/AP_LTM_Telem/AP_LTM_Telem.h +++ b/libraries/AP_LTM_Telem/AP_LTM_Telem.h @@ -17,7 +17,7 @@ #include #ifndef AP_LTM_TELEM_ENABLED -#define AP_LTM_TELEM_ENABLED 1 +#define AP_LTM_TELEM_ENABLED BOARD_FLASH_SIZE > 2048 #endif #if AP_LTM_TELEM_ENABLED diff --git a/libraries/AP_LandingGear/AP_LandingGear.cpp b/libraries/AP_LandingGear/AP_LandingGear.cpp index 7ac8971994..ed2591cd3b 100644 --- a/libraries/AP_LandingGear/AP_LandingGear.cpp +++ b/libraries/AP_LandingGear/AP_LandingGear.cpp @@ -168,7 +168,7 @@ void AP_LandingGear::deploy() // send message only if output has been configured if (!_deployed && SRV_Channels::function_assigned(SRV_Channel::k_landing_gear_control)) { - gcs().send_text(MAV_SEVERITY_INFO, "LandingGear: DEPLOY"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "LandingGear: DEPLOY"); } // set deployed flag @@ -194,7 +194,7 @@ void AP_LandingGear::retract() // send message only if output has been configured if (SRV_Channels::function_assigned(SRV_Channel::k_landing_gear_control)) { - gcs().send_text(MAV_SEVERITY_INFO, "LandingGear: RETRACT"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "LandingGear: RETRACT"); } } diff --git a/libraries/AP_Logger/AP_Logger.cpp b/libraries/AP_Logger/AP_Logger.cpp index 4e24bfded2..89e54962a9 100644 --- a/libraries/AP_Logger/AP_Logger.cpp +++ b/libraries/AP_Logger/AP_Logger.cpp @@ -614,16 +614,6 @@ void AP_Logger::Write_MessageF(const char *fmt, ...) void AP_Logger::backend_starting_new_log(const AP_Logger_Backend *backend) { _log_start_count++; - - for (uint8_t i=0; i<_next_backend; i++) { - if (backends[i] == backend) { // pointer comparison! - // reset sent masks - for (struct log_write_fmt *f = log_write_fmts; f; f=f->next) { - f->sent_mask &= ~(1<sent_mask & (1U<Write_Emit_FMT(f->msg_type)) { - continue; - } - f->sent_mask |= (1U<Safe_Write_Emit_FMT(f->msg_type); } } @@ -1041,12 +1026,6 @@ void AP_Logger::WriteV(const char *name, const char *labels, const char *units, } for (uint8_t i=0; i<_next_backend; i++) { - if (!(f->sent_mask & (1U<Write_Emit_FMT(f->msg_type)) { - continue; - } - f->sent_mask |= (1U<Write(f->msg_type, arg_copy, is_critical, is_streaming); @@ -1313,8 +1292,15 @@ int16_t AP_Logger::find_free_msg_type() const * It is assumed that logstruct's char* variables are valid strings of * maximum lengths for those fields (given in LogStructure.h e.g. LS_NAME_SIZE) */ -bool AP_Logger::fill_log_write_logstructure(struct LogStructure &logstruct, const uint8_t msg_type) const +bool AP_Logger::fill_logstructure(struct LogStructure &logstruct, const uint8_t msg_type) const { + // check the static lists first... + const LogStructure *found = structure_for_msg_type(msg_type); + if (found != nullptr) { + logstruct = *found; + return true; + } + // find log structure information corresponding to msg_type: struct log_write_fmt *f; for (f = log_write_fmts; f; f=f->next) { diff --git a/libraries/AP_Logger/AP_Logger.h b/libraries/AP_Logger/AP_Logger.h index d3cb4b0d68..e8a91d62da 100644 --- a/libraries/AP_Logger/AP_Logger.h +++ b/libraries/AP_Logger/AP_Logger.h @@ -79,8 +79,15 @@ enum class LogEvent : uint8_t { STANDBY_ENABLE = 74, STANDBY_DISABLE = 75, - FENCE_FLOOR_ENABLE = 80, - FENCE_FLOOR_DISABLE = 81, + // Fence events + FENCE_ALT_MAX_ENABLE = 76, + FENCE_ALT_MAX_DISABLE = 77, + FENCE_CIRCLE_ENABLE = 78, + FENCE_CIRCLE_DISABLE = 79, + FENCE_ALT_MIN_ENABLE = 80, + FENCE_ALT_MIN_DISABLE = 81, + FENCE_POLYGON_ENABLE = 82, + FENCE_POLYGON_DISABLE = 83, // if the EKF's source input set is changed (e.g. via a switch or // a script), we log an event: @@ -382,7 +389,6 @@ public: struct log_write_fmt *next; uint8_t msg_type; uint8_t msg_len; - uint8_t sent_mask; // bitmask of backends sent to const char *name; const char *fmt; const char *labels; @@ -452,7 +458,7 @@ private: int16_t find_free_msg_type() const; // fill LogStructure with information about msg_type - bool fill_log_write_logstructure(struct LogStructure &logstruct, const uint8_t msg_type) const; + bool fill_logstructure(struct LogStructure &logstruct, const uint8_t msg_type) const; bool _armed; diff --git a/libraries/AP_Logger/AP_Logger_Backend.cpp b/libraries/AP_Logger/AP_Logger_Backend.cpp index e0b0ecfb6c..7406270beb 100644 --- a/libraries/AP_Logger/AP_Logger_Backend.cpp +++ b/libraries/AP_Logger/AP_Logger_Backend.cpp @@ -100,7 +100,7 @@ void AP_Logger_Backend::start_new_log_reset_variables() _dropped = 0; _startup_messagewriter->reset(); _front.backend_starting_new_log(this); - _log_file_size_bytes = 0; + _formats_written.clearall(); } // We may need to make sure data is loggable before starting the @@ -124,42 +124,6 @@ void AP_Logger_Backend::push_log_blocks() { WriteMoreStartupMessages(); } -// returns true if all format messages have been written, and thus it is OK -// for other messages to go out to the log -bool AP_Logger_Backend::WriteBlockCheckStartupMessages() -{ -#if APM_BUILD_TYPE(APM_BUILD_Replay) - return true; -#endif - - if (_startup_messagewriter->fmt_done()) { - return true; - } - - if (_writing_startup_messages) { - // we have been called by a messagewriter, so writing is OK - return true; - } - - if (!_startup_messagewriter->finished() && - !hal.scheduler->in_main_thread()) { - // only the main thread may write startup messages out - return false; - } - - // we're not writing startup messages, so this must be some random - // caller hoping to write blocks out. Push out log blocks - we - // might end up clearing the buffer..... - push_log_blocks(); - - // even if we did finish writing startup messages, we can't - // permit any message to go in as its timestamp will be before - // any we wrote in. Time going backwards annoys log readers. - - // sorry! currently busy writing out startup messages... - return false; -} - // source more messages from the startup message writer: void AP_Logger_Backend::WriteMoreStartupMessages() { @@ -181,6 +145,15 @@ void AP_Logger_Backend::WriteMoreStartupMessages() */ +// output a FMT message if not already done so +void AP_Logger_Backend::Safe_Write_Emit_FMT(uint8_t msg_type) +{ + if (have_emitted_format_for_type(LogMessages(msg_type))) { + return; + } + Write_Emit_FMT(msg_type); +} + bool AP_Logger_Backend::Write_Emit_FMT(uint8_t msg_type) { #if APM_BUILD_TYPE(APM_BUILD_Replay) @@ -202,7 +175,7 @@ bool AP_Logger_Backend::Write_Emit_FMT(uint8_t msg_type) ls.units, ls.multipliers }; - if (!_front.fill_log_write_logstructure(logstruct, msg_type)) { + if (!_front.fill_logstructure(logstruct, msg_type)) { // this is a bug; we've been asked to write out the FMT // message for a msg_type, but the frontend can't supply the // required information @@ -363,6 +336,23 @@ bool AP_Logger_Backend::StartNewLogOK() const return true; } +// validate that pBuffer looks like a message, extract message type. +// Returns false if this doesn't look like a valid message. +bool AP_Logger_Backend::message_type_from_block(const void *pBuffer, uint16_t size, LogMessages &type) const +{ + if (size < 3) { + return false; + } + if (((uint8_t*)pBuffer)[0] != HEAD_BYTE1 || + ((uint8_t*)pBuffer)[1] != HEAD_BYTE2) { + // Not passed a message + INTERNAL_ERROR(AP_InternalError::error_t::flow_of_control); + return false; + } + type = LogMessages(((uint8_t*)pBuffer)[2]); + return true; +} + #if CONFIG_HAL_BOARD == HAL_BOARD_SITL void AP_Logger_Backend::validate_WritePrioritisedBlock(const void *pBuffer, uint16_t size) @@ -381,11 +371,10 @@ void AP_Logger_Backend::validate_WritePrioritisedBlock(const void *pBuffer, if (size < 3) { AP_HAL::panic("Short prioritised block"); } - if (((uint8_t*)pBuffer)[0] != HEAD_BYTE1 || - ((uint8_t*)pBuffer)[1] != HEAD_BYTE2) { + LogMessages type; + if (!message_type_from_block(pBuffer, size, type)) { AP_HAL::panic("Not passed a message"); } - const uint8_t type = ((uint8_t*)pBuffer)[2]; uint8_t type_len; const char *name_src; const struct LogStructure *s = _front.structure_for_msg_type(type); @@ -413,6 +402,35 @@ void AP_Logger_Backend::validate_WritePrioritisedBlock(const void *pBuffer, } #endif +bool AP_Logger_Backend::ensure_format_emitted(const void *pBuffer, uint16_t size) +{ +#if APM_BUILD_TYPE(APM_BUILD_Replay) + // we trust that Replay will correctly emit formats as required + return true; +#endif + + // extract the ID: + LogMessages type; + if (!message_type_from_block(pBuffer, size, type)) { + return false; + } + if (have_emitted_format_for_type(type)) { + return true; + } + + // make sure the FMT message has gone out! + if (type == LOG_FORMAT_MSG) { + // kind of? Our caller is just about to emit this.... + return true; + } + if (!have_emitted_format_for_type(LOG_FORMAT_MSG) && + !Write_Emit_FMT(LOG_FORMAT_MSG)) { + return false; + } + + return Write_Emit_FMT(type); +} + bool AP_Logger_Backend::WritePrioritisedBlock(const void *pBuffer, uint16_t size, bool is_critical, bool writev_streaming) { #if CONFIG_HAL_BOARD == HAL_BOARD_SITL && !APM_BUILD_TYPE(APM_BUILD_Replay) @@ -435,6 +453,10 @@ bool AP_Logger_Backend::WritePrioritisedBlock(const void *pBuffer, uint16_t size } } + if (!ensure_format_emitted(pBuffer, size)) { + return false; + } + return _WritePrioritisedBlock(pBuffer, size, is_critical); } @@ -673,7 +695,6 @@ void AP_Logger_Backend::df_stats_gather(const uint16_t bytes_written, uint32_t s } stats.buf_space_sigma += space_remaining; stats.bytes += bytes_written; - _log_file_size_bytes += bytes_written; stats.blocks++; } diff --git a/libraries/AP_Logger/AP_Logger_Backend.h b/libraries/AP_Logger/AP_Logger_Backend.h index 616ce36b66..25cf99ca4f 100644 --- a/libraries/AP_Logger/AP_Logger_Backend.h +++ b/libraries/AP_Logger/AP_Logger_Backend.h @@ -9,6 +9,7 @@ #include #include #include +#include "LogStructure.h" class LoggerMessageWriter_DFLogStart; @@ -132,6 +133,9 @@ public: bool Write_Fence(); #endif bool Write_Format(const struct LogStructure *structure); + bool have_emitted_format_for_type(LogMessages a_type) const { + return _formats_written.get(uint8_t(a_type)); + } bool Write_Message(const char *message); bool Write_MessageF(const char *fmt, ...); bool Write_Mission_Cmd(const AP_Mission &mission, @@ -155,6 +159,9 @@ public: // Returns true if the FMT message has ever been written. bool Write_Emit_FMT(uint8_t msg_type); + // output a FMT message if not already done so + void Safe_Write_Emit_FMT(uint8_t msg_type); + // write a log message out to the log of msg_type type, with // values contained in arg_list: bool Write(uint8_t msg_type, va_list arg_list, bool is_critical=false, bool is_streaming=false); @@ -195,7 +202,6 @@ protected: /* read a block */ - virtual bool WriteBlockCheckStartupMessages(); virtual void WriteMoreStartupMessages(); virtual void push_log_blocks(); @@ -205,7 +211,6 @@ protected: uint16_t _cached_oldest_log; uint32_t _dropped; - uint32_t _log_file_size_bytes; // should we rotate when we next stop logging bool _rotate_pending; @@ -262,6 +267,12 @@ private: void Write_AP_Logger_Stats_File(const struct df_stats &_stats); void validate_WritePrioritisedBlock(const void *pBuffer, uint16_t size); + + bool message_type_from_block(const void *pBuffer, uint16_t size, LogMessages &type) const; + bool ensure_format_emitted(const void *pBuffer, uint16_t size); + bool emit_format_for_type(LogMessages a_type); + Bitmask<256> _formats_written; + }; #endif // HAL_LOGGING_ENABLED diff --git a/libraries/AP_Logger/AP_Logger_Block.cpp b/libraries/AP_Logger/AP_Logger_Block.cpp index 34665a6acd..7ebf38c8c0 100644 --- a/libraries/AP_Logger/AP_Logger_Block.cpp +++ b/libraries/AP_Logger/AP_Logger_Block.cpp @@ -132,11 +132,6 @@ bool AP_Logger_Block::_WritePrioritisedBlock(const void *pBuffer, uint16_t size, return false; } - if (!WriteBlockCheckStartupMessages()) { - _dropped++; - return false; - } - WITH_SEMAPHORE(write_sem); const uint32_t space = writebuf.space(); @@ -205,7 +200,7 @@ uint16_t AP_Logger_Block::ReadHeaders() // we are at the start of a file, read the file header if (df_FilePage == 1) { struct FileHeader fh; - BlockRead(0, &fh, sizeof(fh)); + BlockRead(sizeof(ph), &fh, sizeof(fh)); df_FileTime = fh.utc_secs; df_Read_BufferIdx += sizeof(fh); } @@ -546,7 +541,7 @@ void AP_Logger_Block::stop_logging_async(void) void AP_Logger_Block::start_new_log(void) { if (erase_started) { - // already erasing + // currently erasing return; } diff --git a/libraries/AP_Logger/AP_Logger_File.cpp b/libraries/AP_Logger/AP_Logger_File.cpp index e4db560c71..3ac9c7d093 100644 --- a/libraries/AP_Logger/AP_Logger_File.cpp +++ b/libraries/AP_Logger/AP_Logger_File.cpp @@ -366,26 +366,12 @@ void AP_Logger_File::Prep_MinSpace() } while (log_to_remove != first_log_to_remove); } -/* - construct a log file name given a log number. - The number in the log filename will *not* be zero-padded. - Note: Caller must free. - */ -char *AP_Logger_File::_log_file_name_short(const uint16_t log_num) const -{ - char *buf = nullptr; - if (asprintf(&buf, "%s/%u.BIN", _log_directory, (unsigned)log_num) == -1) { - return nullptr; - } - return buf; -} - /* construct a log file name given a log number. The number in the log filename will be zero-padded. Note: Caller must free. */ -char *AP_Logger_File::_log_file_name_long(const uint16_t log_num) const +char *AP_Logger_File::_log_file_name(const uint16_t log_num) const { char *buf = nullptr; if (asprintf(&buf, "%s/%08u.BIN", _log_directory, (unsigned)log_num) == -1) { @@ -394,25 +380,6 @@ char *AP_Logger_File::_log_file_name_long(const uint16_t log_num) const return buf; } -/* - return a log filename appropriate for the supplied log_num if a - filename exists with the short (not-zero-padded name) then it is the - appropirate name, otherwise the long (zero-padded) version is. - Note: Caller must free. - */ -char *AP_Logger_File::_log_file_name(const uint16_t log_num) const -{ - char *filename = _log_file_name_short(log_num); - if (filename == nullptr) { - return nullptr; - } - if (file_exists(filename)) { - return filename; - } - free(filename); - return _log_file_name_long(log_num); -} - /* return path name of the lastlog.txt marker file Note: Caller must free. @@ -474,11 +441,6 @@ bool AP_Logger_File::_WritePrioritisedBlock(const void *pBuffer, uint16_t size, { WITH_SEMAPHORE(semaphore); - if (! WriteBlockCheckStartupMessages()) { - _dropped++; - return false; - } - #if APM_BUILD_TYPE(APM_BUILD_Replay) if (AP::FS().write(_write_fd, pBuffer, size) != size) { AP_HAL::panic("Short write"); @@ -802,7 +764,7 @@ void AP_Logger_File::start_new_log(void) // set _open_error here to avoid infinite recursion. Simply // writing a prioritised block may try to open a log - which means - // if anything in the start_new_log path does a gcs().send_text() + // if anything in the start_new_log path does a GCS_SEND_TEXT() // (for example), you will end up recursing if we don't take // precautions. We will reset _open_error if we actually manage // to open the log... diff --git a/libraries/AP_Logger/AP_Logger_File.h b/libraries/AP_Logger/AP_Logger_File.h index 8ca4259a1f..c54ac23fd7 100644 --- a/libraries/AP_Logger/AP_Logger_File.h +++ b/libraries/AP_Logger/AP_Logger_File.h @@ -111,8 +111,6 @@ private: /* construct a file name given a log number. Caller must free. */ char *_log_file_name(const uint16_t log_num) const; - char *_log_file_name_long(const uint16_t log_num) const; - char *_log_file_name_short(const uint16_t log_num) const; char *_lastlog_file_name() const; uint32_t _get_log_size(const uint16_t log_num); uint32_t _get_log_time(const uint16_t log_num); diff --git a/libraries/AP_Logger/AP_Logger_Flash_JEDEC.cpp b/libraries/AP_Logger/AP_Logger_Flash_JEDEC.cpp index e40eab7882..025c53e309 100644 --- a/libraries/AP_Logger/AP_Logger_Flash_JEDEC.cpp +++ b/libraries/AP_Logger/AP_Logger_Flash_JEDEC.cpp @@ -4,7 +4,7 @@ #include "AP_Logger_config.h" -#if HAL_LOGGING_DATAFLASH_ENABLED +#if HAL_LOGGING_FLASH_JEDEC_ENABLED #include @@ -323,4 +323,4 @@ void AP_Logger_Flash_JEDEC::WriteEnable(void) dev->transfer(&b, 1, nullptr, 0); } -#endif // HAL_LOGGING_DATAFLASH_ENABLED +#endif // HAL_LOGGING_FLASH_JEDEC_ENABLED diff --git a/libraries/AP_Logger/AP_Logger_Flash_JEDEC.h b/libraries/AP_Logger/AP_Logger_Flash_JEDEC.h index c51ae1b3d2..1a85e51575 100644 --- a/libraries/AP_Logger/AP_Logger_Flash_JEDEC.h +++ b/libraries/AP_Logger/AP_Logger_Flash_JEDEC.h @@ -7,7 +7,7 @@ #include "AP_Logger_Block.h" -#if HAL_LOGGING_DATAFLASH_ENABLED +#if HAL_LOGGING_FLASH_JEDEC_ENABLED class AP_Logger_Flash_JEDEC : public AP_Logger_Block { public: @@ -46,4 +46,4 @@ private: bool read_cache_valid; }; -#endif // HAL_LOGGING_DATAFLASH_ENABLED +#endif // HAL_LOGGING_FLASH_JEDEC_ENABLED diff --git a/libraries/AP_Logger/AP_Logger_MAVLink.cpp b/libraries/AP_Logger/AP_Logger_MAVLink.cpp index 5c41ae2d3b..6309abee28 100644 --- a/libraries/AP_Logger/AP_Logger_MAVLink.cpp +++ b/libraries/AP_Logger/AP_Logger_MAVLink.cpp @@ -136,11 +136,6 @@ bool AP_Logger_MAVLink::_WritePrioritisedBlock(const void *pBuffer, uint16_t siz return false; } - if (! WriteBlockCheckStartupMessages()) { - semaphore.give(); - return false; - } - if (bufferspace_available() < size) { if (_startup_messagewriter->finished()) { // do not count the startup packets as being dropped... diff --git a/libraries/AP_Logger/AP_Logger_W25NXX.cpp b/libraries/AP_Logger/AP_Logger_W25NXX.cpp index d10facf8b9..df3e8bcea2 100644 --- a/libraries/AP_Logger/AP_Logger_W25NXX.cpp +++ b/libraries/AP_Logger/AP_Logger_W25NXX.cpp @@ -7,7 +7,7 @@ #include "AP_Logger_W25NXX.h" -#if HAL_LOGGING_DATAFLASH_ENABLED +#if HAL_LOGGING_FLASH_W25NXX_ENABLED #include @@ -341,4 +341,4 @@ void AP_Logger_W25NXX::WriteEnable(void) dev->transfer(&b, 1, nullptr, 0); } -#endif // HAL_LOGGING_DATAFLASH_ENABLED +#endif // HAL_LOGGING_FLASH_W25NXX_ENABLED diff --git a/libraries/AP_Logger/AP_Logger_W25NXX.h b/libraries/AP_Logger/AP_Logger_W25NXX.h index 5e7c8d7fb4..c384fa97db 100644 --- a/libraries/AP_Logger/AP_Logger_W25NXX.h +++ b/libraries/AP_Logger/AP_Logger_W25NXX.h @@ -3,12 +3,14 @@ */ #pragma once +#include "AP_Logger_config.h" + +#if HAL_LOGGING_FLASH_W25NXX_ENABLED + #include #include "AP_Logger_Block.h" -#if HAL_LOGGING_DATAFLASH_ENABLED - class AP_Logger_W25NXX : public AP_Logger_Block { public: AP_Logger_W25NXX(AP_Logger &front, LoggerMessageWriter_DFLogStart *writer) : @@ -47,4 +49,4 @@ private: bool read_cache_valid; }; -#endif // HAL_LOGGING_DATAFLASH_ENABLED +#endif // HAL_LOGGING_FLASH_W25NXX_ENABLED diff --git a/libraries/AP_Logger/AP_Logger_config.h b/libraries/AP_Logger/AP_Logger_config.h index 8627867a38..a5a3508043 100644 --- a/libraries/AP_Logger/AP_Logger_config.h +++ b/libraries/AP_Logger/AP_Logger_config.h @@ -26,11 +26,19 @@ #endif #if HAL_LOGGING_DATAFLASH_ENABLED - #define HAL_LOGGING_BLOCK_ENABLED 1 + #define HAL_LOGGING_BLOCK_ENABLED HAL_LOGGING_ENABLED #else #define HAL_LOGGING_BLOCK_ENABLED 0 #endif +#ifndef HAL_LOGGING_FLASH_W25NXX_ENABLED +#define HAL_LOGGING_FLASH_W25NXX_ENABLED HAL_LOGGING_BLOCK_ENABLED +#endif + +#ifndef HAL_LOGGING_FLASH_JEDEC_ENABLED +#define HAL_LOGGING_FLASH_JEDEC_ENABLED HAL_LOGGING_BLOCK_ENABLED +#endif + #if HAL_LOGGING_FILESYSTEM_ENABLED #if !defined (HAL_BOARD_LOG_DIRECTORY) diff --git a/libraries/AP_Logger/LogFile.cpp b/libraries/AP_Logger/LogFile.cpp index 405f41ac2c..edec709089 100644 --- a/libraries/AP_Logger/LogFile.cpp +++ b/libraries/AP_Logger/LogFile.cpp @@ -60,7 +60,11 @@ bool AP_Logger_Backend::Write_Format(const struct LogStructure *s) { struct log_Format pkt; Fill_Format(s, pkt); - return WriteCriticalBlock(&pkt, sizeof(pkt)); + if (!WriteCriticalBlock(&pkt, sizeof(pkt))) { + return false; + } + _formats_written.set(s->msg_type); + return true; } /* diff --git a/libraries/AP_Logger/LogStructure.h b/libraries/AP_Logger/LogStructure.h index eeda9bfec4..96ffea2875 100644 --- a/libraries/AP_Logger/LogStructure.h +++ b/libraries/AP_Logger/LogStructure.h @@ -1082,7 +1082,7 @@ struct PACKED log_VER { // @Field: NumPts: number of points currently in use // @Field: MaxPts: maximum number of points that could be used // @Field: Action: most recent internal action taken by SRTL library -// @FieldValueEnum: Action: AP_SmartRTL::SRTL_Actions +// @FieldValueEnum: Action: AP_SmartRTL::Action // @Field: N: point associated with most recent action (North component) // @Field: E: point associated with most recent action (East component) // @Field: D: point associated with most recent action (Down component) @@ -1283,7 +1283,7 @@ LOG_STRUCTURE_FROM_FENCE \ "MAV", "QBHHHBHH", "TimeUS,chan,txp,rxp,rxdp,flags,ss,tf", "s#----s-", "F-000-C-" }, \ LOG_STRUCTURE_FROM_VISUALODOM \ { LOG_OPTFLOW_MSG, sizeof(log_Optflow), \ - "OF", "QBffff", "TimeUS,Qual,flowX,flowY,bodyX,bodyY", "s-EEnn", "F-0000" , true }, \ + "OF", "QBffff", "TimeUS,Qual,flowX,flowY,bodyX,bodyY", "s-EEEE", "F-0000" , true }, \ { LOG_WHEELENCODER_MSG, sizeof(log_WheelEncoder), \ "WENC", "Qfbfb", "TimeUS,Dist0,Qual0,Dist1,Qual1", "sm-m-", "F0-0-" , true }, \ { LOG_ADSB_MSG, sizeof(log_ADSB), \ diff --git a/libraries/AP_Logger/LoggerMessageWriter.cpp b/libraries/AP_Logger/LoggerMessageWriter.cpp index 209dba6e96..f28bc3e1ef 100644 --- a/libraries/AP_Logger/LoggerMessageWriter.cpp +++ b/libraries/AP_Logger/LoggerMessageWriter.cpp @@ -109,7 +109,12 @@ void LoggerMessageWriter_DFLogStart::process() case Stage::FORMATS: // write log formats so the log is self-describing while (next_format_to_send < _logger_backend->num_types()) { - if (!_logger_backend->Write_Format(_logger_backend->structure(next_format_to_send))) { + const auto &s { _logger_backend->structure(next_format_to_send) }; + if (_logger_backend->have_emitted_format_for_type((LogMessages)s->msg_type)) { + next_format_to_send++; + continue; + } + if (!_logger_backend->Write_Format(s)) { return; // call me again! } next_format_to_send++; diff --git a/libraries/AP_MSP/AP_MSP_Telem_Backend.cpp b/libraries/AP_MSP/AP_MSP_Telem_Backend.cpp index 2ee0a6a43c..4f22e6e42d 100644 --- a/libraries/AP_MSP/AP_MSP_Telem_Backend.cpp +++ b/libraries/AP_MSP/AP_MSP_Telem_Backend.cpp @@ -503,93 +503,105 @@ MSPCommandResult AP_MSP_Telem_Backend::msp_process_sensor_command(uint16_t cmd_m MSP_UNUSED(src); switch (cmd_msp) { +#if HAL_MSP_RANGEFINDER_ENABLED case MSP2_SENSOR_RANGEFINDER: { const MSP::msp_rangefinder_data_message_t *pkt = (const MSP::msp_rangefinder_data_message_t *)src->ptr; msp_handle_rangefinder(*pkt); } break; +#endif +#if HAL_MSP_OPTICALFLOW_ENABLED case MSP2_SENSOR_OPTIC_FLOW: { const MSP::msp_opflow_data_message_t *pkt = (const MSP::msp_opflow_data_message_t *)src->ptr; msp_handle_opflow(*pkt); } break; +#endif +#if HAL_MSP_GPS_ENABLED case MSP2_SENSOR_GPS: { const MSP::msp_gps_data_message_t *pkt = (const MSP::msp_gps_data_message_t *)src->ptr; msp_handle_gps(*pkt); } break; +#endif +#if AP_COMPASS_MSP_ENABLED case MSP2_SENSOR_COMPASS: { const MSP::msp_compass_data_message_t *pkt = (const MSP::msp_compass_data_message_t *)src->ptr; msp_handle_compass(*pkt); } break; +#endif +#if AP_BARO_MSP_ENABLED case MSP2_SENSOR_BAROMETER: { const MSP::msp_baro_data_message_t *pkt = (const MSP::msp_baro_data_message_t *)src->ptr; msp_handle_baro(*pkt); } break; +#endif +#if AP_AIRSPEED_MSP_ENABLED && AP_AIRSPEED_ENABLED case MSP2_SENSOR_AIRSPEED: { const MSP::msp_airspeed_data_message_t *pkt = (const MSP::msp_airspeed_data_message_t *)src->ptr; msp_handle_airspeed(*pkt); } break; +#endif } return MSP_RESULT_NO_REPLY; } +#if HAL_MSP_OPTICALFLOW_ENABLED void AP_MSP_Telem_Backend::msp_handle_opflow(const MSP::msp_opflow_data_message_t &pkt) { -#if HAL_MSP_OPTICALFLOW_ENABLED AP_OpticalFlow *optflow = AP::opticalflow(); if (optflow == nullptr) { return; } optflow->handle_msp(pkt); -#endif } +#endif +#if HAL_MSP_RANGEFINDER_ENABLED void AP_MSP_Telem_Backend::msp_handle_rangefinder(const MSP::msp_rangefinder_data_message_t &pkt) { -#if HAL_MSP_RANGEFINDER_ENABLED RangeFinder *rangefinder = AP::rangefinder(); if (rangefinder == nullptr) { return; } rangefinder->handle_msp(pkt); -#endif } +#endif +#if HAL_MSP_GPS_ENABLED void AP_MSP_Telem_Backend::msp_handle_gps(const MSP::msp_gps_data_message_t &pkt) { -#if HAL_MSP_GPS_ENABLED AP::gps().handle_msp(pkt); -#endif } +#endif +#if AP_COMPASS_MSP_ENABLED void AP_MSP_Telem_Backend::msp_handle_compass(const MSP::msp_compass_data_message_t &pkt) { -#if AP_COMPASS_MSP_ENABLED AP::compass().handle_msp(pkt); -#endif } +#endif +#if AP_BARO_MSP_ENABLED void AP_MSP_Telem_Backend::msp_handle_baro(const MSP::msp_baro_data_message_t &pkt) { -#if AP_BARO_MSP_ENABLED AP::baro().handle_msp(pkt); -#endif } +#endif +#if AP_AIRSPEED_MSP_ENABLED && AP_AIRSPEED_ENABLED void AP_MSP_Telem_Backend::msp_handle_airspeed(const MSP::msp_airspeed_data_message_t &pkt) { -#if AP_AIRSPEED_MSP_ENABLED && AP_AIRSPEED_ENABLED auto *airspeed = AP::airspeed(); if (airspeed) { airspeed->handle_msp(pkt); } -#endif } +#endif uint32_t AP_MSP_Telem_Backend::get_osd_flight_mode_bitmask(void) { diff --git a/libraries/AP_MSP/AP_MSP_Telem_DJI.cpp b/libraries/AP_MSP/AP_MSP_Telem_DJI.cpp index bafa921bd0..f01bf7b0be 100644 --- a/libraries/AP_MSP/AP_MSP_Telem_DJI.cpp +++ b/libraries/AP_MSP/AP_MSP_Telem_DJI.cpp @@ -91,7 +91,7 @@ MSPCommandResult AP_MSP_Telem_DJI::msp_process_out_esc_sensor_data(sbuf_t *dst) int16_t highest_temperature = 0; AP_ESC_Telem& telem = AP::esc_telem(); if (!displaying_stats_screen()) { - telem.get_highest_motor_temperature(highest_temperature); + telem.get_highest_temperature(highest_temperature); } else { #if OSD_ENABLED AP_OSD *osd = AP::osd(); diff --git a/libraries/AP_Math/matrix3.cpp b/libraries/AP_Math/matrix3.cpp index bd64d62a02..0dfd75032b 100644 --- a/libraries/AP_Math/matrix3.cpp +++ b/libraries/AP_Math/matrix3.cpp @@ -21,7 +21,7 @@ #include "AP_Math.h" // create a rotation matrix given some euler angles -// this is based on http://gentlenav.googlecode.com/files/EulerAngles.pdf +// this is based on https://github.com/ArduPilot/Datasheets/blob/main/References/EulerAngles.pdf template void Matrix3::from_euler(T roll, T pitch, T yaw) { @@ -44,7 +44,7 @@ void Matrix3::from_euler(T roll, T pitch, T yaw) } // calculate euler angles from a rotation matrix -// this is based on http://gentlenav.googlecode.com/files/EulerAngles.pdf +// this is based on https://github.com/ArduPilot/Datasheets/blob/main/References/EulerAngles.pdf template void Matrix3::to_euler(T *roll, T *pitch, T *yaw) const { diff --git a/libraries/AP_Math/matrix3.h b/libraries/AP_Math/matrix3.h index 3b2d8ed8c9..02e18699a5 100644 --- a/libraries/AP_Math/matrix3.h +++ b/libraries/AP_Math/matrix3.h @@ -55,18 +55,18 @@ public: // trivial ctor // note that the Vector3 ctor will zero the vector elements - constexpr Matrix3() {} + constexpr Matrix3() {} // setting ctor - constexpr Matrix3(const Vector3 &a0, const Vector3 &b0, const Vector3 &c0) + constexpr Matrix3(const Vector3 &a0, const Vector3 &b0, const Vector3 &c0) : a(a0) , b(b0) , c(c0) {} // setting ctor - constexpr Matrix3(const T ax, const T ay, const T az, - const T bx, const T by, const T bz, - const T cx, const T cy, const T cz) + constexpr Matrix3(const T ax, const T ay, const T az, + const T bx, const T by, const T bz, + const T cx, const T cy, const T cz) : a(ax,ay,az) , b(bx,by,bz) , c(cx,cy,cz) {} @@ -235,13 +235,17 @@ public: return a.is_nan() || b.is_nan() || c.is_nan(); } - // create a rotation matrix from Euler angles + /* + create a rotation matrix from Euler angles in 321 euler ordering + */ void from_euler(T roll, T pitch, T yaw); - // create eulers from a rotation matrix. - // roll is from -Pi to Pi - // pitch is from -Pi/2 to Pi/2 - // yaw is from -Pi to Pi + /* create eulers from a rotation matrix. + roll is from -Pi to Pi + pitch is from -Pi/2 to Pi/2 + yaw is from -Pi to Pi + euler order is 321 + */ void to_euler(T *roll, T *pitch, T *yaw) const; // create matrix from rotation enum diff --git a/libraries/AP_Math/quaternion.h b/libraries/AP_Math/quaternion.h index 1c47540c67..45b0f612df 100644 --- a/libraries/AP_Math/quaternion.h +++ b/libraries/AP_Math/quaternion.h @@ -50,15 +50,6 @@ public: { } - // function call operator - void operator()(const T _q1, const T _q2, const T _q3, const T _q4) - { - q1 = _q1; - q2 = _q2; - q3 = _q3; - q4 = _q4; - } - // check if any elements are NAN bool is_nan(void) const WARN_IF_UNUSED { @@ -81,11 +72,11 @@ public: // convert a vector from earth to body frame void earth_to_body(Vector3 &v) const; - // create a quaternion from Euler angles + // create a quaternion from Euler angles using 321 euler ordering void from_euler(T roll, T pitch, T yaw); void from_euler(const Vector3 &v); - // create a quaternion from Euler angles applied in yaw, roll, pitch order + // create a quaternion from Euler angles applied in yaw, roll, pitch order (312) // instead of the normal yaw, pitch, roll order void from_vector312(T roll, T pitch, T yaw); @@ -129,7 +120,7 @@ public: // get euler yaw angle in radians T get_euler_yaw() const; - // create eulers (in radians) from a quaternion + // create eulers (in radians) from a quaternion, using 321 ordering void to_euler(float &roll, float &pitch, float &yaw) const; void to_euler(Vector3f &rpy) const { to_euler(rpy.x, rpy.y, rpy.z); @@ -139,7 +130,7 @@ public: to_euler(rpy.x, rpy.y, rpy.z); } - // create eulers from a quaternion + // create eulers from a quaternion with 312 ordering Vector3 to_vector312(void) const; T length_squared(void) const; diff --git a/libraries/AP_Math/tests/test_rotations.cpp b/libraries/AP_Math/tests/test_rotations.cpp index 15fdfa6238..d9de8f82e5 100644 --- a/libraries/AP_Math/tests/test_rotations.cpp +++ b/libraries/AP_Math/tests/test_rotations.cpp @@ -189,5 +189,83 @@ TEST(RotationsTest, TestFailedGetLinux) } }*/ +/* + rotate a matrix using a give order, specified as a string + for example "321" + */ +static void rotate_ordered(Matrix3f &m, const char *order, + const float roll_deg, + const float pitch_deg, + const float yaw_deg) +{ + while (*order) { + Matrix3f m2; + switch (*order) { + case '1': + m2.from_euler(radians(roll_deg), 0, 0); + break; + case '2': + m2.from_euler(0, radians(pitch_deg), 0); + break; + case '3': + m2.from_euler(0, 0, radians(yaw_deg)); + break; + } + m *= m2; + order++; + } +} + +/* + test the two euler orders we use in ArduPilot + */ +TEST(RotationsTest, TestEulerOrder) +{ + const float roll_deg = 20; + const float pitch_deg = 31; + const float yaw_deg = 72; + float r, p, y; + Vector3f v; + + Matrix3f m; + + // apply in 321 ordering + m.identity(); + rotate_ordered(m, "321", roll_deg, pitch_deg, yaw_deg); + + // get using to_euler + m.to_euler(&r, &p, &y); + + EXPECT_FLOAT_EQ(degrees(r), roll_deg); + EXPECT_FLOAT_EQ(degrees(p), pitch_deg); + EXPECT_FLOAT_EQ(degrees(y), yaw_deg); + + // get using to_euler312, should not match + v = m.to_euler312(); + + EXPECT_GE(fabsf(degrees(v.x)-roll_deg), 1); + EXPECT_GE(fabsf(degrees(v.y)-pitch_deg), 1); + EXPECT_GE(fabsf(degrees(v.z)-yaw_deg), 1); + + // apply in 312 ordering + m.identity(); + rotate_ordered(m, "312", roll_deg, pitch_deg, yaw_deg); + + // get using to_euler312 + v = m.to_euler312(); + + EXPECT_FLOAT_EQ(degrees(v.x), roll_deg); + EXPECT_FLOAT_EQ(degrees(v.y), pitch_deg); + EXPECT_FLOAT_EQ(degrees(v.z), yaw_deg); + + // get using to_euler, should not match + m.to_euler(&r, &p, &y); + + EXPECT_GE(fabsf(degrees(r)-roll_deg), 1); + EXPECT_GE(fabsf(degrees(p)-pitch_deg), 1); + EXPECT_GE(fabsf(degrees(y)-yaw_deg), 1); +} + + AP_GTEST_PANIC() AP_GTEST_MAIN() diff --git a/libraries/AP_Math/vector2.h b/libraries/AP_Math/vector2.h index ae43ee847a..8c74b61a5f 100644 --- a/libraries/AP_Math/vector2.h +++ b/libraries/AP_Math/vector2.h @@ -47,12 +47,12 @@ struct Vector2 T x, y; // trivial ctor - constexpr Vector2() + constexpr Vector2() : x(0) , y(0) {} // setting ctor - constexpr Vector2(const T x0, const T y0) + constexpr Vector2(const T x0, const T y0) : x(x0) , y(y0) {} diff --git a/libraries/AP_Math/vector3.cpp b/libraries/AP_Math/vector3.cpp index 021b737a01..3c763008ee 100644 --- a/libraries/AP_Math/vector3.cpp +++ b/libraries/AP_Math/vector3.cpp @@ -429,7 +429,7 @@ T Vector3::angle(const Vector3 &v2) const return 0.0f; } const T cosv = ((*this)*v2) / len; - if (fabsF(cosv) >= 1) { + if (cosv >= 1 || cosv <= -1) { return 0.0f; } return acosF(cosv); diff --git a/libraries/AP_Math/vector3.h b/libraries/AP_Math/vector3.h index d4d3a1baa6..6a9b0bc23b 100644 --- a/libraries/AP_Math/vector3.h +++ b/libraries/AP_Math/vector3.h @@ -76,19 +76,19 @@ public: T x, y, z; // trivial ctor - constexpr Vector3() + constexpr Vector3() : x(0) , y(0) , z(0) {} // setting ctor - constexpr Vector3(const T x0, const T y0, const T z0) + constexpr Vector3(const T x0, const T y0, const T z0) : x(x0) , y(y0) , z(z0) {} //Create a Vector3 from a Vector2 with z - constexpr Vector3(const Vector2 &v0, const T z0) + constexpr Vector3(const Vector2 &v0, const T z0) : x(v0.x) , y(v0.y) , z(z0) {} diff --git a/libraries/AP_Math/vectorN.h b/libraries/AP_Math/vectorN.h index 1a78e7f36a..56a0da07f0 100644 --- a/libraries/AP_Math/vectorN.h +++ b/libraries/AP_Math/vectorN.h @@ -35,14 +35,14 @@ class VectorN { public: // trivial ctor - inline VectorN() { + inline VectorN() { for (auto i = 0; i < N; i++) { _v[i] = T{}; } } // vector ctor - inline VectorN(const T *v) { + inline VectorN(const T *v) { memcpy(_v, v, sizeof(T)*N); } diff --git a/libraries/AP_Mission/AP_Mission.cpp b/libraries/AP_Mission/AP_Mission.cpp index 8a60c3b68b..ea441be219 100644 --- a/libraries/AP_Mission/AP_Mission.cpp +++ b/libraries/AP_Mission/AP_Mission.cpp @@ -16,6 +16,7 @@ #include #include #include +#include const AP_Param::GroupInfo AP_Mission::var_info[] = { @@ -94,7 +95,7 @@ void AP_Mission::init() init_jump_tracking(); // If Mission Clear bit is set then it should clear the mission, otherwise retain the mission. - if (AP_MISSION_MASK_MISSION_CLEAR & _options) { + if (option_is_set(Option::CLEAR_ON_BOOT)) { GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Clearing Mission"); clear(); } @@ -447,6 +448,10 @@ bool AP_Mission::start_command(const Mission_Command& cmd) case MAV_CMD_VIDEO_START_CAPTURE: case MAV_CMD_VIDEO_STOP_CAPTURE: return start_command_camera(cmd); +#endif +#if AP_FENCE_ENABLED + case MAV_CMD_DO_FENCE_ENABLE: + return start_command_fence(cmd); #endif case MAV_CMD_DO_PARACHUTE: return start_command_parachute(cmd); @@ -964,6 +969,9 @@ MAV_MISSION_RESULT AP_Mission::sanity_check_params(const mavlink_mission_item_in case MAV_CMD_NAV_WAYPOINT: nan_mask = ~(1 << 3); // param 4 can be nan break; + case MAV_CMD_NAV_LOITER_UNLIM: + nan_mask = ~(1 << 3); // param 4 can be nan + break; case MAV_CMD_NAV_LAND: nan_mask = ~(1 << 3); // param 4 can be nan break; @@ -1230,7 +1238,7 @@ MAV_MISSION_RESULT AP_Mission::mavlink_int_to_mission_cmd(const mavlink_mission_ break; case MAV_CMD_DO_FENCE_ENABLE: // MAV ID: 207 - cmd.p1 = packet.param1; // action 0=disable, 1=enable + cmd.p1 = packet.param1; // action 0=disable, 1=enable, 2=disable floor break; case MAV_CMD_DO_AUX_FUNCTION: @@ -1743,7 +1751,7 @@ bool AP_Mission::mission_cmd_to_mavlink_int(const AP_Mission::Mission_Command& c break; case MAV_CMD_DO_FENCE_ENABLE: // MAV ID: 207 - packet.param1 = cmd.p1; // action 0=disable, 1=enable + packet.param1 = cmd.p1; // action 0=disable, 1=enable, 2=disable floor, 3=enable except floor break; case MAV_CMD_DO_PARACHUTE: // MAV ID: 208 @@ -1813,7 +1821,7 @@ bool AP_Mission::mission_cmd_to_mavlink_int(const AP_Mission::Mission_Command& c #if AP_MISSION_NAV_PAYLOAD_PLACE_ENABLED case MAV_CMD_NAV_PAYLOAD_PLACE: - packet.param1 = cmd.p1/100.0f; // copy max-descend parameter (cm->m) + packet.param1 = cmd.p1*0.01f; // copy max-descend parameter (cm->m) break; #endif @@ -2494,7 +2502,7 @@ bool AP_Mission::is_best_land_sequence(const Location ¤t_loc) } // check if MIS_OPTIONS bit set to allow distance calculation to be done - if (!(_options & AP_MISSION_MASK_DIST_TO_LAND_CALC)) { + if (!option_is_set(Option::FAILSAFE_TO_BEST_LANDING)) { return false; } diff --git a/libraries/AP_Mission/AP_Mission.h b/libraries/AP_Mission/AP_Mission.h index e76c3a638f..32bb2fa77d 100644 --- a/libraries/AP_Mission/AP_Mission.h +++ b/libraries/AP_Mission/AP_Mission.h @@ -45,9 +45,6 @@ #define AP_MISSION_RESTART_DEFAULT 0 // resume the mission from the last command run by default #define AP_MISSION_OPTIONS_DEFAULT 0 // Do not clear the mission when rebooting -#define AP_MISSION_MASK_MISSION_CLEAR (1<<0) // If set then Clear the mission on boot -#define AP_MISSION_MASK_DIST_TO_LAND_CALC (1<<1) // Allow distance to best landing calculation to be run on failsafe -#define AP_MISSION_MASK_CONTINUE_AFTER_LAND (1<<2) // Allow mission to continue after land #define AP_MISSION_MAX_WP_HISTORY 7 // The maximum number of previous wp commands that will be stored from the active missions history #define LAST_WP_PASSED (AP_MISSION_MAX_WP_HISTORY-2) @@ -732,14 +729,23 @@ public: void reset_wp_history(void); /* - return true if MIS_OPTIONS is set to allow continue of mission - logic after a land and the next waypoint is a takeoff. If this + Option::FailsafeToBestLanding - continue mission + logic after a land if the next waypoint is a takeoff. If this is false then after a landing is complete the vehicle should disarm and mission logic should stop */ + enum class Option { + CLEAR_ON_BOOT = 0, // clear mission on vehicle boot + FAILSAFE_TO_BEST_LANDING = 1, // on failsafe, find fastest path along mission home + CONTINUE_AFTER_LAND = 2, // continue running mission (do not disarm) after land if takeoff is next waypoint + }; + bool option_is_set(Option option) const { + return (_options.get() & (uint16_t)option) != 0; + } + bool continue_after_land_check_for_takeoff(void); bool continue_after_land(void) const { - return (_options.get() & AP_MISSION_MASK_CONTINUE_AFTER_LAND) != 0; + return option_is_set(Option::CONTINUE_AFTER_LAND); } // user settable parameters @@ -936,6 +942,7 @@ private: bool start_command_do_sprayer(const AP_Mission::Mission_Command& cmd); bool start_command_do_scripting(const AP_Mission::Mission_Command& cmd); bool start_command_do_gimbal_manager_pitchyaw(const AP_Mission::Mission_Command& cmd); + bool start_command_fence(const AP_Mission::Mission_Command& cmd); /* handle format conversion of storage format to allow us to update diff --git a/libraries/AP_Mission/AP_Mission_Commands.cpp b/libraries/AP_Mission/AP_Mission_Commands.cpp index d44b62e674..bc03742320 100644 --- a/libraries/AP_Mission/AP_Mission_Commands.cpp +++ b/libraries/AP_Mission/AP_Mission_Commands.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #if AP_RC_CHANNEL_ENABLED bool AP_Mission::start_command_do_aux_function(const AP_Mission::Mission_Command& cmd) @@ -347,4 +348,30 @@ bool AP_Mission::start_command_do_gimbal_manager_pitchyaw(const AP_Mission::Miss return false; } +bool AP_Mission::start_command_fence(const AP_Mission::Mission_Command& cmd) +{ +#if AP_FENCE_ENABLED + AC_Fence* fence = AP::fence(); + + if (fence == nullptr) { + return false; + } + + if (cmd.p1 == uint8_t(AC_Fence::MavlinkFenceActions::DISABLE_FENCE)) { // disable fence + uint8_t fences = fence->enable_configured(false); + fence->print_fence_message("disabled", fences); + return true; + } else if (cmd.p1 == uint8_t(AC_Fence::MavlinkFenceActions::ENABLE_FENCE)) { // enable fence + uint8_t fences = fence->enable_configured(true); + fence->print_fence_message("enabled", fences); + return true; + } else if (cmd.p1 == uint8_t(AC_Fence::MavlinkFenceActions::DISABLE_ALT_MIN_FENCE)) { // disable fence floor only + fence->disable_floor(); + fence->print_fence_message("disabled", AC_FENCE_TYPE_ALT_MIN); + return true; + } +#endif // AP_FENCE_ENABLED + return false; +} + #endif // AP_MISSION_ENABLED diff --git a/libraries/AP_Motors/AP_MotorsHeli.h b/libraries/AP_Motors/AP_MotorsHeli.h index 472e86d01a..bc28116a9e 100644 --- a/libraries/AP_Motors/AP_MotorsHeli.h +++ b/libraries/AP_Motors/AP_MotorsHeli.h @@ -42,7 +42,7 @@ public: /// Constructor AP_MotorsHeli( uint16_t speed_hz = AP_MOTORS_HELI_SPEED_DEFAULT) : AP_Motors(speed_hz), - _main_rotor(SRV_Channel::k_heli_rsc, AP_MOTORS_HELI_RSC) + _main_rotor(SRV_Channel::k_heli_rsc, AP_MOTORS_HELI_RSC, 0U) { AP_Param::setup_object_defaults(this, var_info); }; @@ -90,18 +90,9 @@ public: // get_desired_rotor_speed - gets target rotor speed as a number from 0 ~ 1 float get_desired_rotor_speed() const { return _main_rotor.get_desired_speed(); } - // get_main_rotor_speed - estimated rotor speed when no governor or speed sensor used - float get_main_rotor_speed() const { return _main_rotor.get_rotor_speed(); } - // return true if the main rotor is up to speed bool rotor_runup_complete() const { return _heliflags.rotor_runup_complete; } - //get rotor governor output - float get_governor_output() const { return _main_rotor.get_governor_output(); } - - //get engine throttle output - float get_control_output() const { return _main_rotor.get_control_output(); } - // get_motor_mask - returns a bitmask of which outputs are being used for motors or servos (1 means being used) // this can be used to ensure other pwm outputs (i.e. for servos) do not conflict virtual uint32_t get_motor_mask() override; @@ -133,6 +124,9 @@ public: // set_in_autorotation - allows main code to set when aircraft is in autorotation. void set_in_autorotation(bool autorotation) { _heliflags.in_autorotation = autorotation; } + // get_in_autorotation - allows main code to determine when aircraft is in autorotation. + bool get_in_autorotation() { return _heliflags.in_autorotation; } + // set_enable_bailout - allows main code to set when RSC can immediately ramp engine instantly void set_enable_bailout(bool bailout) { _heliflags.enable_bailout = bailout; } diff --git a/libraries/AP_Motors/AP_MotorsHeli_Dual.cpp b/libraries/AP_Motors/AP_MotorsHeli_Dual.cpp index f2cc35f224..81ac8846aa 100644 --- a/libraries/AP_Motors/AP_MotorsHeli_Dual.cpp +++ b/libraries/AP_Motors/AP_MotorsHeli_Dual.cpp @@ -597,10 +597,14 @@ bool AP_MotorsHeli_Dual::arming_checks(size_t buflen, char *buffer) const } #if HAL_LOGGING_ENABLED -// Blade angle logging - called at 10 Hz +// heli motors logging - called at 10 Hz void AP_MotorsHeli_Dual::Log_Write(void) { + // write swashplate log _swashplate1.write_log(get_cyclic_angle_scaler(), _collective_min_deg.get(), _collective_max_deg.get(), _collective_min.get(), _collective_max.get()); _swashplate2.write_log(get_cyclic_angle_scaler(), _collective_min_deg.get(), _collective_max_deg.get(), _collective2_min.get(), _collective2_max.get()); + + // write RSC log + _main_rotor.write_log(); } #endif diff --git a/libraries/AP_Motors/AP_MotorsHeli_Dual.h b/libraries/AP_Motors/AP_MotorsHeli_Dual.h index 2fb696eb91..057a4983e4 100644 --- a/libraries/AP_Motors/AP_MotorsHeli_Dual.h +++ b/libraries/AP_Motors/AP_MotorsHeli_Dual.h @@ -57,7 +57,7 @@ public: bool arming_checks(size_t buflen, char *buffer) const override; #if HAL_LOGGING_ENABLED - // Blade angle logging - called at 10 Hz + // heli motors logging - called at 10 Hz void Log_Write(void) override; #endif diff --git a/libraries/AP_Motors/AP_MotorsHeli_Quad.cpp b/libraries/AP_Motors/AP_MotorsHeli_Quad.cpp index 817e89f1ac..7ced336992 100644 --- a/libraries/AP_Motors/AP_MotorsHeli_Quad.cpp +++ b/libraries/AP_Motors/AP_MotorsHeli_Quad.cpp @@ -279,3 +279,11 @@ void AP_MotorsHeli_Quad::servo_test() { // not implemented } + +#if HAL_LOGGING_ENABLED +// heli motors logging - called at 10 Hz +void AP_MotorsHeli_Quad::Log_Write(void) +{ + _main_rotor.write_log(); +} +#endif diff --git a/libraries/AP_Motors/AP_MotorsHeli_Quad.h b/libraries/AP_Motors/AP_MotorsHeli_Quad.h index a67cb40911..095d1b19f6 100644 --- a/libraries/AP_Motors/AP_MotorsHeli_Quad.h +++ b/libraries/AP_Motors/AP_MotorsHeli_Quad.h @@ -40,6 +40,11 @@ public: // servo_test - move servos through full range of movement void servo_test() override; +#if HAL_LOGGING_ENABLED + // heli motors logging - called at 10 Hz + void Log_Write(void) override; +#endif + // var_info for holding Parameter information static const struct AP_Param::GroupInfo var_info[]; diff --git a/libraries/AP_Motors/AP_MotorsHeli_RSC.cpp b/libraries/AP_Motors/AP_MotorsHeli_RSC.cpp index a54c583d6a..960acbb7fe 100644 --- a/libraries/AP_Motors/AP_MotorsHeli_RSC.cpp +++ b/libraries/AP_Motors/AP_MotorsHeli_RSC.cpp @@ -480,20 +480,13 @@ void AP_MotorsHeli_RSC::update_rotor_runup(float dt) _runup_complete = false; } // if rotor estimated speed is zero, then spooldown has been completed - if (get_rotor_speed() <= 0.0f) { + if (_rotor_runup_output <= 0.0f) { _spooldown_complete = true; } else { _spooldown_complete = false; } } -// get_rotor_speed - gets rotor speed either as an estimate, or (ToDO) a measured value -float AP_MotorsHeli_RSC::get_rotor_speed() const -{ - // if no actual measured rotor speed is available, estimate speed based on rotor runup scalar. - return _rotor_runup_output; -} - // write_rsc - outputs pwm onto output rsc channel // servo_out parameter is of the range 0 ~ 1 void AP_MotorsHeli_RSC::write_rsc(float servo_out) @@ -616,3 +609,31 @@ void AP_MotorsHeli_RSC::governor_reset() _governor_engage = false; _governor_fault_count = 0; // reset fault count when governor reset } + +#if HAL_LOGGING_ENABLED +// Write a helicopter motors packet +void AP_MotorsHeli_RSC::write_log(void) const +{ + // @LoggerMessage: HRSC + // @Description: Helicopter related messages + // @Field: I: Instance, 0=Main, 1=Tail + // @Field: TimeUS: Time since system startup + // @Field: DRRPM: Desired rotor speed + // @Field: ERRPM: Estimated rotor speed + // @Field: Gov: Governor Output + // @Field: Throt: Throttle output + + // Write to data flash log + AP::logger().WriteStreaming("HRSC", + "TimeUS,I,DRRPM,ERRPM,Gov,Throt", + "s#----", + "F-----", + "QBffff", + AP_HAL::micros64(), + _instance, + get_desired_speed(), + _rotor_runup_output, + _governor_output, + get_control_output()); +} +#endif diff --git a/libraries/AP_Motors/AP_MotorsHeli_RSC.h b/libraries/AP_Motors/AP_MotorsHeli_RSC.h index 03b3500c9b..d7f97bdeb8 100644 --- a/libraries/AP_Motors/AP_MotorsHeli_RSC.h +++ b/libraries/AP_Motors/AP_MotorsHeli_RSC.h @@ -4,6 +4,7 @@ #include // ArduPilot Mega Vector/Matrix math Library #include #include +#include // default main rotor speed (ch8 out) as a number from 0 ~ 100 #define AP_MOTORS_HELI_RSC_SETPOINT 70 @@ -46,9 +47,11 @@ public: friend class AP_MotorsHeli_Quad; AP_MotorsHeli_RSC(SRV_Channel::Aux_servo_function_t aux_fn, - uint8_t default_channel) : + uint8_t default_channel, + uint8_t inst) : _aux_fn(aux_fn), - _default_channel(default_channel) + _default_channel(default_channel), + _instance(inst) { AP_Param::setup_object_defaults(this, var_info); }; @@ -81,12 +84,8 @@ public: // set_desired_speed - this requires input to be 0-1 void set_desired_speed(float desired_speed) { _desired_speed = desired_speed; } - // get_rotor_speed - estimated rotor speed when no governor or rpm sensor is used - float get_rotor_speed() const; - // functions for autothrottle, throttle curve, governor, idle speed, output to servo void set_governor_output(float governor_output) {_governor_output = governor_output; } - float get_governor_output() const { return _governor_output; } void governor_reset(); float get_control_output() const { return _control_output; } void set_idle_output(float idle_output) { _idle_output.set(idle_output); } @@ -129,7 +128,12 @@ public: uint32_t get_output_mask() const; // rotor_speed_above_critical - return true if rotor speed is above that critical for flight - bool rotor_speed_above_critical(void) const { return get_rotor_speed() >= get_critical_speed(); } + bool rotor_speed_above_critical(void) const { return _rotor_runup_output >= get_critical_speed(); } + +#if HAL_LOGGING_ENABLED + // RSC logging + void write_log(void) const; +#endif // var_info for holding Parameter information static const struct AP_Param::GroupInfo var_info[]; @@ -147,10 +151,11 @@ public: private: uint64_t _last_update_us; + const uint8_t _instance; // channel setup for aux function - SRV_Channel::Aux_servo_function_t _aux_fn; - uint8_t _default_channel; + const SRV_Channel::Aux_servo_function_t _aux_fn; + const uint8_t _default_channel; // internal variables RotorControlMode _control_mode = ROTOR_CONTROL_MODE_DISABLED; // motor control mode, Passthrough or Setpoint diff --git a/libraries/AP_Motors/AP_MotorsHeli_Single.cpp b/libraries/AP_Motors/AP_MotorsHeli_Single.cpp index 33cc445904..ad0e7fff83 100644 --- a/libraries/AP_Motors/AP_MotorsHeli_Single.cpp +++ b/libraries/AP_Motors/AP_MotorsHeli_Single.cpp @@ -467,7 +467,7 @@ float AP_MotorsHeli_Single::get_yaw_offset(float collective) return 0.0; } - if (_heliflags.in_autorotation || (get_control_output() <= _main_rotor.get_idle_output())) { + if (_heliflags.in_autorotation || (_main_rotor.get_control_output() <= _main_rotor.get_idle_output())) { // Motor is stopped or at idle, and thus not creating torque return 0.0; } @@ -695,10 +695,15 @@ bool AP_MotorsHeli_Single::use_tail_RSC() const #if HAL_LOGGING_ENABLED void AP_MotorsHeli_Single::Log_Write(void) { + // Write swash plate logging // For single heli we have to apply an additional cyclic scaler of sqrt(2.0) because the // definition of when we achieve _cyclic_max is different to dual heli. In single, _cyclic_max // is limited at sqrt(2.0), in dual it is limited at 1.0 float cyclic_angle_scaler = get_cyclic_angle_scaler() * sqrtf(2.0); _swashplate.write_log(cyclic_angle_scaler, _collective_min_deg.get(), _collective_max_deg.get(), _collective_min.get(), _collective_max.get()); + + // Write RSC logging + _main_rotor.write_log(); + _tail_rotor.write_log(); } #endif diff --git a/libraries/AP_Motors/AP_MotorsHeli_Single.h b/libraries/AP_Motors/AP_MotorsHeli_Single.h index 72754a1134..5b55ffad09 100644 --- a/libraries/AP_Motors/AP_MotorsHeli_Single.h +++ b/libraries/AP_Motors/AP_MotorsHeli_Single.h @@ -32,7 +32,7 @@ public: // constructor AP_MotorsHeli_Single(uint16_t speed_hz = AP_MOTORS_HELI_SPEED_DEFAULT) : AP_MotorsHeli(speed_hz), - _tail_rotor(SRV_Channel::k_heli_tail_rsc, AP_MOTORS_HELI_SINGLE_TAILRSC), + _tail_rotor(SRV_Channel::k_heli_tail_rsc, AP_MOTORS_HELI_SINGLE_TAILRSC, 1U), _swashplate(AP_MOTORS_MOT_1, AP_MOTORS_MOT_2, AP_MOTORS_MOT_3, AP_MOTORS_MOT_5, 1U) { AP_Param::setup_object_defaults(this, var_info); diff --git a/libraries/AP_Motors/AP_MotorsMulticopter.cpp b/libraries/AP_Motors/AP_MotorsMulticopter.cpp index 11630bb775..e8a099998a 100644 --- a/libraries/AP_Motors/AP_MotorsMulticopter.cpp +++ b/libraries/AP_Motors/AP_MotorsMulticopter.cpp @@ -90,7 +90,7 @@ const AP_Param::GroupInfo AP_MotorsMulticopter::var_info[] = { // @Values: 0:Normal,1:OneShot,2:OneShot125,3:Brushed,4:DShot150,5:DShot300,6:DShot600,7:DShot1200,8:PWMRange,9:PWMAngle // @User: Advanced // @RebootRequired: True - AP_GROUPINFO("PWM_TYPE", 15, AP_MotorsMulticopter, _pwm_type, PWM_TYPE_NORMAL), + AP_GROUPINFO("PWM_TYPE", 15, AP_MotorsMulticopter, _pwm_type, float(PWMType::NORMAL)), // @Param: PWM_MIN // @DisplayName: PWM output minimum @@ -457,6 +457,21 @@ float AP_MotorsMulticopter::actuator_spin_up_to_ground_idle() const return constrain_float(_spin_up_ratio, 0.0f, 1.0f) * thr_lin.get_spin_min(); } +// return throttle out for motor motor_num, returns true if value is valid false otherwise +bool AP_MotorsMulticopter::get_thrust(uint8_t motor_num, float& thr_out) const +{ + if (motor_num >= AP_MOTORS_MAX_NUM_MOTORS || !motor_enabled[motor_num]) { + return false; + } + + // Constrain to linearization range. + const float actuator = constrain_float(_actuator[motor_num], thr_lin.get_spin_min(), thr_lin.get_spin_max()); + + // Remove linearization and compensation gain + thr_out = thr_lin.actuator_to_thrust(actuator) / thr_lin.get_compensation_gain(); + return true; +} + // parameter checks for MOT_PWM_MIN/MAX, returns true if parameters are valid bool AP_MotorsMulticopter::check_mot_pwm_params() const { @@ -474,7 +489,7 @@ void AP_MotorsMulticopter::update_throttle_range() { // if all outputs are digital adjust the range. We also do this for type PWM_RANGE, as those use the // scaled output, which is then mapped to PWM via the SRV_Channel library - if (SRV_Channels::have_digital_outputs(get_motor_mask()) || (_pwm_type == PWM_TYPE_PWM_RANGE) || (_pwm_type == PWM_TYPE_PWM_ANGLE)) { + if (SRV_Channels::have_digital_outputs(get_motor_mask()) || (_pwm_type == PWMType::PWM_RANGE) || (_pwm_type == PWMType::PWM_ANGLE)) { _pwm_min.set_and_default(1000); _pwm_max.set_and_default(2000); } diff --git a/libraries/AP_Motors/AP_MotorsMulticopter.h b/libraries/AP_Motors/AP_MotorsMulticopter.h index d6fdf6a309..7e8491c849 100644 --- a/libraries/AP_Motors/AP_MotorsMulticopter.h +++ b/libraries/AP_Motors/AP_MotorsMulticopter.h @@ -89,6 +89,9 @@ public: // convert values to PWM min and max if not configured void convert_pwm_min_max_param(int16_t radio_min, int16_t radio_max); + // return thrust for motor motor_num, returns true if value is valid false otherwise + bool get_thrust(uint8_t motor_num, float& thr_out) const override; + #if HAL_LOGGING_ENABLED // 10hz logging of voltage scaling and max trust void Log_Write() override; diff --git a/libraries/AP_Motors/AP_Motors_Class.cpp b/libraries/AP_Motors/AP_Motors_Class.cpp index 9995dca6b7..42d7deebda 100644 --- a/libraries/AP_Motors/AP_Motors_Class.cpp +++ b/libraries/AP_Motors/AP_Motors_Class.cpp @@ -135,35 +135,35 @@ void AP_Motors::rc_set_freq(uint32_t motor_mask, uint16_t freq_hz) hal.rcout->set_freq(mask, freq_hz); hal.rcout->set_dshot_esc_type(SRV_Channels::get_dshot_esc_type()); - const pwm_type type = (pwm_type)_pwm_type.get(); + const PWMType type = _pwm_type; switch (type) { - case PWM_TYPE_ONESHOT: + case PWMType::ONESHOT: if (freq_hz > 50 && mask != 0) { hal.rcout->set_output_mode(mask, AP_HAL::RCOutput::MODE_PWM_ONESHOT); } break; - case PWM_TYPE_ONESHOT125: + case PWMType::ONESHOT125: if (freq_hz > 50 && mask != 0) { hal.rcout->set_output_mode(mask, AP_HAL::RCOutput::MODE_PWM_ONESHOT125); } break; - case PWM_TYPE_BRUSHED: + case PWMType::BRUSHED: hal.rcout->set_output_mode(mask, AP_HAL::RCOutput::MODE_PWM_BRUSHED); break; - case PWM_TYPE_DSHOT150: + case PWMType::DSHOT150: hal.rcout->set_output_mode(mask, AP_HAL::RCOutput::MODE_PWM_DSHOT150); break; - case PWM_TYPE_DSHOT300: + case PWMType::DSHOT300: hal.rcout->set_output_mode(mask, AP_HAL::RCOutput::MODE_PWM_DSHOT300); break; - case PWM_TYPE_DSHOT600: + case PWMType::DSHOT600: hal.rcout->set_output_mode(mask, AP_HAL::RCOutput::MODE_PWM_DSHOT600); break; - case PWM_TYPE_DSHOT1200: + case PWMType::DSHOT1200: hal.rcout->set_output_mode(mask, AP_HAL::RCOutput::MODE_PWM_DSHOT1200); break; - case PWM_TYPE_PWM_RANGE: - case PWM_TYPE_PWM_ANGLE: + case PWMType::PWM_RANGE: + case PWMType::PWM_ANGLE: /* this is a motor output type for multirotors which honours the SERVOn_MIN/MAX (and TRIM for angle) values per channel @@ -173,20 +173,20 @@ void AP_Motors::rc_set_freq(uint32_t motor_mask, uint16_t freq_hz) Angle type offsets by 1500 to get -500 to 500. */ - if (type == PWM_TYPE_PWM_RANGE) { + if (type == PWMType::PWM_RANGE) { _motor_pwm_scaled.offset = 1000.0; } else { - // PWM_TYPE_PWM_ANGLE + // PWMType::PWM_ANGLE _motor_pwm_scaled.offset = 1500.0; } _motor_pwm_scaled.mask |= motor_mask; for (uint8_t i=0; i<16; i++) { if ((1U< _pwm_type; // PWM output type // motor failure handling bool _thrust_boost; // true if thrust boost is enabled to handle motor failure @@ -361,19 +375,6 @@ protected: MAV_TYPE _mav_type; // MAV_TYPE_GENERIC = 0; - enum pwm_type { - PWM_TYPE_NORMAL = 0, - PWM_TYPE_ONESHOT = 1, - PWM_TYPE_ONESHOT125 = 2, - PWM_TYPE_BRUSHED = 3, - PWM_TYPE_DSHOT150 = 4, - PWM_TYPE_DSHOT300 = 5, - PWM_TYPE_DSHOT600 = 6, - PWM_TYPE_DSHOT1200 = 7, - PWM_TYPE_PWM_RANGE = 8, - PWM_TYPE_PWM_ANGLE = 9 - }; - // return string corresponding to frame_class virtual const char* _get_frame_string() const = 0; diff --git a/libraries/AP_Mount/AP_Mount.cpp b/libraries/AP_Mount/AP_Mount.cpp index 94e7a24a1c..f3225bbd63 100644 --- a/libraries/AP_Mount/AP_Mount.cpp +++ b/libraries/AP_Mount/AP_Mount.cpp @@ -15,6 +15,7 @@ #include "AP_Mount_Scripting.h" #include "AP_Mount_Xacti.h" #include "AP_Mount_Viewpro.h" +#include "AP_Mount_Topotek.h" #include #include #include @@ -45,7 +46,7 @@ AP_Mount::AP_Mount() } _singleton = this; - AP_Param::setup_object_defaults(this, var_info); + AP_Param::setup_object_defaults(this, var_info); } // init - detect and initialise all mounts @@ -156,6 +157,15 @@ void AP_Mount::init() serial_instance++; break; #endif // HAL_MOUNT_VIEWPRO_ENABLED + +#if HAL_MOUNT_TOPOTEK_ENABLED + // check for Topotek gimbal + case Type::Topotek: + _backends[instance] = NEW_NOTHROW AP_Mount_Topotek(*this, _params[instance], instance, serial_instance); + _num_instances++; + serial_instance++; + break; +#endif // HAL_MOUNT_TOPOTEK_ENABLED } // init new instance @@ -174,6 +184,8 @@ void AP_Mount::init() set_mode_to_default(instance); } } + + (void)serial_instance; } // update - give mount opportunity to update servos. should be called at 10hz or higher diff --git a/libraries/AP_Mount/AP_Mount.h b/libraries/AP_Mount/AP_Mount.h index 110267bcc4..f4e36949c7 100644 --- a/libraries/AP_Mount/AP_Mount.h +++ b/libraries/AP_Mount/AP_Mount.h @@ -47,6 +47,7 @@ class AP_Mount_Siyi; class AP_Mount_Scripting; class AP_Mount_Xacti; class AP_Mount_Viewpro; +class AP_Mount_Topotek; /* This is a workaround to allow the MAVLink backend access to the @@ -67,6 +68,7 @@ class AP_Mount friend class AP_Mount_Scripting; friend class AP_Mount_Xacti; friend class AP_Mount_Viewpro; + friend class AP_Mount_Topotek; public: AP_Mount(); @@ -114,6 +116,9 @@ public: #endif #if HAL_MOUNT_VIEWPRO_ENABLED Viewpro = 11, /// Viewpro gimbal using a custom serial protocol +#endif +#if HAL_MOUNT_TOPOTEK_ENABLED + Topotek = 12, /// Topotek gimbal using a custom serial protocol #endif }; diff --git a/libraries/AP_Mount/AP_Mount_Gremsy.cpp b/libraries/AP_Mount/AP_Mount_Gremsy.cpp index 6efe6b7ec4..259de8e90c 100644 --- a/libraries/AP_Mount/AP_Mount_Gremsy.cpp +++ b/libraries/AP_Mount/AP_Mount_Gremsy.cpp @@ -202,7 +202,7 @@ void AP_Mount_Gremsy::handle_gimbal_device_information(const mavlink_message_t & const uint8_t fw_ver_build = (info.firmware_version & 0xFF000000) >> 24; // display gimbal info to user - gcs().send_text(MAV_SEVERITY_INFO, "Mount: %s %s fw:%u.%u.%u.%u", + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Mount: %s %s fw:%u.%u.%u.%u", info.vendor_name, info.model_name, (unsigned)fw_ver_major, diff --git a/libraries/AP_Mount/AP_Mount_Params.cpp b/libraries/AP_Mount/AP_Mount_Params.cpp index 57257eb5e4..e2c727f4b4 100644 --- a/libraries/AP_Mount/AP_Mount_Params.cpp +++ b/libraries/AP_Mount/AP_Mount_Params.cpp @@ -9,7 +9,7 @@ const AP_Param::GroupInfo AP_Mount_Params::var_info[] = { // @Param: _TYPE // @DisplayName: Mount Type // @Description: Mount Type - // @Values: 0:None, 1:Servo, 2:3DR Solo, 3:Alexmos Serial, 4:SToRM32 MAVLink, 5:SToRM32 Serial, 6:Gremsy, 7:BrushlessPWM, 8:Siyi, 9:Scripting, 10:Xacti, 11:Viewpro + // @Values: 0:None, 1:Servo, 2:3DR Solo, 3:Alexmos Serial, 4:SToRM32 MAVLink, 5:SToRM32 Serial, 6:Gremsy, 7:BrushlessPWM, 8:Siyi, 9:Scripting, 10:Xacti, 11:Viewpro, 12:Topotek // @RebootRequired: True // @User: Standard AP_GROUPINFO_FLAGS("_TYPE", 1, AP_Mount_Params, type, 0, AP_PARAM_FLAG_ENABLE), diff --git a/libraries/AP_Mount/AP_Mount_SToRM32.cpp b/libraries/AP_Mount/AP_Mount_SToRM32.cpp index 333bac0577..59e4da66bc 100644 --- a/libraries/AP_Mount/AP_Mount_SToRM32.cpp +++ b/libraries/AP_Mount/AP_Mount_SToRM32.cpp @@ -128,7 +128,7 @@ void AP_Mount_SToRM32::find_gimbal() if (GCS_MAVLINK::find_by_mavtype_and_compid(MAV_TYPE_GIMBAL, compid, _sysid, _chan)) { _compid = compid; _initialised = true; - gcs().send_text(MAV_SEVERITY_INFO, "Mount: SToRM32"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Mount: SToRM32"); } } diff --git a/libraries/AP_Mount/AP_Mount_Siyi.cpp b/libraries/AP_Mount/AP_Mount_Siyi.cpp index 77704637dc..2158eb6dad 100644 --- a/libraries/AP_Mount/AP_Mount_Siyi.cpp +++ b/libraries/AP_Mount/AP_Mount_Siyi.cpp @@ -28,6 +28,7 @@ const AP_Mount_Siyi::HWInfo AP_Mount_Siyi::hardware_lookup_table[] { {{'7','3'}, "A8"}, {{'6','B'}, "ZR10"}, {{'7','8'}, "ZR30"}, + {{'8','2'}, "ZT6"}, {{'7','A'}, "ZT30"}, }; @@ -84,7 +85,7 @@ void AP_Mount_Siyi::update() // send attitude to gimbal at 10Hz if (now_ms - _last_attitude_send_ms > 100) { _last_attitude_send_ms = now_ms; - send_attitude(); + send_attitude_position(); } // run zoom control @@ -812,7 +813,8 @@ float AP_Mount_Siyi::get_zoom_mult_max() const return 0; case HardwareModel::A2: case HardwareModel::A8: - // a8 has 6x digital zoom + case HardwareModel::ZT6: + // a8, zt6 have 6x digital zoom return 6; case HardwareModel::ZR10: case HardwareModel::ZR30: @@ -914,39 +916,24 @@ bool AP_Mount_Siyi::set_lens(uint8_t lens) } // maps lens to siyi camera image type so that lens of 0, 1, 2 are more useful - CameraImageType cam_image_type = CameraImageType::MAIN_ZOOM_SUB_THERMAL; - switch (lens) { - case 0: - cam_image_type = CameraImageType::MAIN_ZOOM_SUB_THERMAL; // 3 - break; - case 1: - cam_image_type = CameraImageType::MAIN_WIDEANGLE_SUB_THERMAL; // 5 - break; - case 2: - cam_image_type = CameraImageType::MAIN_THERMAL_SUB_ZOOM; // 7 - break; - case 3: - cam_image_type = CameraImageType::MAIN_PIP_ZOOM_THERMAL_SUB_WIDEANGLE; // 0 - break; - case 4: - cam_image_type = CameraImageType::MAIN_PIP_WIDEANGLE_THERMAL_SUB_ZOOM; // 1 - break; - case 5: - cam_image_type = CameraImageType::MAIN_PIP_ZOOM_WIDEANGLE_SUB_THERMAL; // 2 - break; - case 6: - cam_image_type = CameraImageType::MAIN_ZOOM_SUB_WIDEANGLE; // 4 - break; - case 7: - cam_image_type = CameraImageType::MAIN_WIDEANGLE_SUB_ZOOM; // 6 - break; - case 8: - cam_image_type = CameraImageType::MAIN_THERMAL_SUB_WIDEANGLE; // 8 - break; + static const CameraImageType cam_image_type_table[] { + CameraImageType::MAIN_ZOOM_SUB_THERMAL, // 3 + CameraImageType::MAIN_WIDEANGLE_SUB_THERMAL, // 5 + CameraImageType::MAIN_THERMAL_SUB_ZOOM, // 7 + CameraImageType::MAIN_PIP_ZOOM_THERMAL_SUB_WIDEANGLE, // 0 + CameraImageType::MAIN_PIP_WIDEANGLE_THERMAL_SUB_ZOOM, // 1 + CameraImageType::MAIN_PIP_ZOOM_WIDEANGLE_SUB_THERMAL, // 2 + CameraImageType::MAIN_ZOOM_SUB_WIDEANGLE, // 4 + CameraImageType::MAIN_WIDEANGLE_SUB_ZOOM, // 6 + CameraImageType::MAIN_THERMAL_SUB_WIDEANGLE, // 8 + }; + + if (lens >= ARRAY_SIZE(cam_image_type_table)) { + return false; } // send desired image type to camera - return send_1byte_packet(SiyiCommandId::SET_CAMERA_IMAGE_TYPE, (uint8_t)cam_image_type); + return send_1byte_packet(SiyiCommandId::SET_CAMERA_IMAGE_TYPE, (uint8_t)cam_image_type_table[lens]); } // set_camera_source is functionally the same as set_lens except primary and secondary lenses are specified by type @@ -1030,6 +1017,7 @@ void AP_Mount_Siyi::send_camera_information(mavlink_channel_t chan) const case HardwareModel::UNKNOWN: case HardwareModel::A2: case HardwareModel::A8: + case HardwareModel::ZT6: focal_length_mm = 21; break; case HardwareModel::ZR10: @@ -1137,6 +1125,7 @@ void AP_Mount_Siyi::check_firmware_version() const case HardwareModel::A2: case HardwareModel::ZR10: case HardwareModel::ZR30: + case HardwareModel::ZT6: case HardwareModel::ZT30: // TBD break; @@ -1161,9 +1150,9 @@ void AP_Mount_Siyi::check_firmware_version() const } /* - send ArduPilot attitude to gimbal + send ArduPilot attitude and position to gimbal */ -void AP_Mount_Siyi::send_attitude(void) +void AP_Mount_Siyi::send_attitude_position(void) { const auto &ahrs = AP::ahrs(); struct { @@ -1185,6 +1174,35 @@ void AP_Mount_Siyi::send_attitude(void) attitude.yawspeed = gyro.z; send_packet(SiyiCommandId::EXTERNAL_ATTITUDE, (const uint8_t *)&attitude, sizeof(attitude)); + + // send location and velocity + struct { + uint32_t time_boot_ms; + int32_t lat, lon; + int32_t alt_msl, alt_ellipsoid; + Vector3l velocity_ned_int32; + } position; + Location loc; + Vector3f velocity_ned; + float undulation = 0; + if (!ahrs.get_location(loc) || + !ahrs.get_velocity_NED(velocity_ned)) { + return; + } + AP::gps().get_undulation(undulation); + + position.time_boot_ms = now_ms; + position.lat = loc.lat; + position.lon = loc.lng; + position.alt_msl = loc.alt; + position.alt_ellipsoid = position.alt_msl - undulation*100; + + // convert velocity to int32 and scale to mm/s + position.velocity_ned_int32.x = velocity_ned.x * 1000; + position.velocity_ned_int32.y = velocity_ned.y * 1000; + position.velocity_ned_int32.z = velocity_ned.z * 1000; + + send_packet(SiyiCommandId::POSITION_DATA, (const uint8_t *)&position, sizeof(position)); } #endif // HAL_MOUNT_SIYI_ENABLED diff --git a/libraries/AP_Mount/AP_Mount_Siyi.h b/libraries/AP_Mount/AP_Mount_Siyi.h index c6366e6b29..18a7a32f2f 100644 --- a/libraries/AP_Mount/AP_Mount_Siyi.h +++ b/libraries/AP_Mount/AP_Mount_Siyi.h @@ -27,7 +27,7 @@ #include #include -#define AP_MOUNT_SIYI_PACKETLEN_MAX 38 // maximum number of bytes in a packet sent to or received from the gimbal +#define AP_MOUNT_SIYI_PACKETLEN_MAX 42 // maximum number of bytes in a packet sent to or received from the gimbal class AP_Mount_Siyi : public AP_Mount_Backend_Serial { @@ -120,6 +120,7 @@ private: READ_RANGEFINDER = 0x15, EXTERNAL_ATTITUDE = 0x22, SET_TIME = 0x30, + POSITION_DATA = 0x3e, }; // Function Feedback Info packet info_type values @@ -163,6 +164,7 @@ private: A8, ZR10, ZR30, + ZT6, ZT30 } _hardware_model; @@ -332,9 +334,9 @@ private: uint32_t _last_rangefinder_dist_ms; // system time of last successful read of rangefinder distance float _rangefinder_dist_m; // distance received from rangefinder - // sending of attitude to gimbal + // sending of attitude and position to gimbal uint32_t _last_attitude_send_ms; - void send_attitude(void); + void send_attitude_position(void); // hardware lookup table indexed by HardwareModel enum values (see above) struct HWInfo { diff --git a/libraries/AP_Mount/AP_Mount_SoloGimbal.cpp b/libraries/AP_Mount/AP_Mount_SoloGimbal.cpp index b188f945a2..02c8c3f247 100644 --- a/libraries/AP_Mount/AP_Mount_SoloGimbal.cpp +++ b/libraries/AP_Mount/AP_Mount_SoloGimbal.cpp @@ -1,6 +1,9 @@ -#include "AP_Mount_SoloGimbal.h" +#include "AP_Mount_config.h" + #if HAL_SOLO_GIMBAL_ENABLED +#include "AP_Mount_SoloGimbal.h" + #include "SoloGimbal.h" #include #include diff --git a/libraries/AP_Mount/AP_Mount_SoloGimbal.h b/libraries/AP_Mount/AP_Mount_SoloGimbal.h index 4e64233284..ed32e6697b 100644 --- a/libraries/AP_Mount/AP_Mount_SoloGimbal.h +++ b/libraries/AP_Mount/AP_Mount_SoloGimbal.h @@ -3,18 +3,16 @@ */ #pragma once +#include "AP_Mount_config.h" -#include +#if HAL_SOLO_GIMBAL_ENABLED #include "AP_Mount_Backend.h" -#if HAL_SOLO_GIMBAL_ENABLED #include #include #include -#include #include "SoloGimbal.h" - class AP_Mount_SoloGimbal : public AP_Mount_Backend { diff --git a/libraries/AP_Mount/AP_Mount_Topotek.cpp b/libraries/AP_Mount/AP_Mount_Topotek.cpp new file mode 100755 index 0000000000..56a20297c4 --- /dev/null +++ b/libraries/AP_Mount/AP_Mount_Topotek.cpp @@ -0,0 +1,1237 @@ +#include "AP_Mount_Topotek.h" + +#if HAL_MOUNT_TOPOTEK_ENABLED + +#include +#include +#include +#include + +extern const AP_HAL::HAL& hal; + +#define ANGULAR_VELOCITY_CONVERSION 1.220740379 // gimbal angular velocity conversion ratio +#define TRACK_TOTAL_WIDTH 1920 // track the maximum width of the image range +#define TRACK_TOTAL_HEIGHT 1080 // track the maximum height of the image range +#define TRACK_RANGE 60 // the size of the image at point tracking +#define AP_MOUNT_TOPOTEK_UPDATE_INTERVAL_MS 100 // resend angle or rate targets to gimbal at this interval +#define AP_MOUNT_TOPOTEK_HEALTH_TIMEOUT_MS 1000 // timeout for health and rangefinder readings +#define AP_MOUNT_TOPOTEK_PACKETLEN_MIN 12 // packet length not including the data segment +#define AP_MOUNT_TOPOTEK_DATALEN_MAX (AP_MOUNT_TOPOTEK_PACKETLEN_MAX - AP_MOUNT_TOPOTEK_PACKETLEN_MIN) // data segment lens can be no more tha this + +// 3 character identifiers +# define AP_MOUNT_TOPOTEK_ID3CHAR_CAPTURE "CAP" // take picture, data bytes: 01:RGB + thermal, 02:RGB, 03:thermal, 05:RGB + thermal (with temp measurement) +# define AP_MOUNT_TOPOTEK_ID3CHAR_RECORD_VIDEO "REC" // record video, data bytes: 00:stop, 01:start, 0A:toggle start/stop +# define AP_MOUNT_TOPOTEK_ID3CHAR_CONTROL_ZOOM "ZMC" // control zoom, data bytes: 00:stop, 01:zoom out, 02:zoom in +# define AP_MOUNT_TOPOTEK_ID3CHAR_GET_ZOOM "ZOM" // get zoom, no data bytes +# define AP_MOUNT_TOPOTEK_ID3CHAR_CONTROL_FOCUS "FCC" // control focus, data bytes: 00:stop, 01:focus+, 02:focus-, 0x10:auto focus, 0x11:manual focus, 0x12:manu focus (save), 0x13:auto focus (save) +# define AP_MOUNT_TOPOTEK_ID3CHAR_GET_FOCUS "FOC" // get focus, no data bytes +# define AP_MOUNT_TOPOTEK_ID3CHAR_SET_ZOOM_AND_FOCU "ZFP" // set zoom and focus +# define AP_MOUNT_TOPOTEK_ID3CHAR_DAY_NIGHT_SWITCHING "IRC" // set day/night setting, data bytes: 00:day, 01:night, 0A:toggle state +# define AP_MOUNT_TOPOTEK_ID3CHAR_TRACKING "TRC" // get/set image tracking, data bytes: 00:get status (use with "r"), 01:stop (use with "w") +# define AP_MOUNT_TOPOTEK_ID3CHAR_START_TRACKING "LOC" // start image tracking +# define AP_MOUNT_TOPOTEK_ID3CHAR_LRF "LRF" // laser rangefinder control, data bytes: 00:ranging stop, 01:ranging start, 02:single measurement, 03:continuous measurement +# define AP_MOUNT_TOPOTEK_ID3CHAR_PIP "PIP" // set picture-in-picture setting, data bytes: // 00:main only, 01:main+sub, 02:sub+main, 03:sub only, 0A:next +# define AP_MOUNT_TOPOTEK_ID3CHAR_GIMBAL_ATT "GAA" // get gimbal attitude, data bytes: 00:stop, 01:start +# define AP_MOUNT_TOPOTEK_ID3CHAR_SD_CARD "SDC" // get SD card state, data bytes: 00:get remaining capacity, 01:get total capacity +# define AP_MOUNT_TOPOTEK_ID3CHAR_TIME "UTC" // set time and date, data bytes: HHMMSSDDMMYY +# define AP_MOUNT_TOPOTEK_ID3CHAR_GET_VERSION "VSN" // get firmware version, data bytes always 00 +# define AP_MOUNT_TOPOTEK_ID3CHAR_GET_MODEL_NAME "PA2" // get model name, data bytes always 00 +# define AP_MOUNT_TOPOTEK_ID3CHAR_GIMBAL_MODE "PTZ" // set gimbal mode, data bytes: 00:stop, 01:up, 02:down, 03:left, 04:right, 05:home position, 06:lock, 07:follow, 08:lock/follow toggle, 09:calibration, 0A:one button down +# define AP_MOUNT_TOPOTEK_ID3CHAR_YPR_RATE "YPR" // set the rate yaw, pitch and roll targets of the gimbal yaw in range -99 ~ +99 +# define AP_MOUNT_TOPOTEK_ID3CHAR_YAW_ANGLE "GIY" // set the yaw angle target in the range -150 ~ 150, speed 0 ~ 99 (0.1deg/sec) +# define AP_MOUNT_TOPOTEK_ID3CHAR_YAW_ANGLE_BF "GAY" // set the yaw angle target in body-frame in the range -150 ~ 150, speed 0 ~ 99 (0.1deg/sec) +# define AP_MOUNT_TOPOTEK_ID3CHAR_PITCH_ANGLE "GIP" // set the pitch angle target in the range -90 ~ 90, speed 0 ~ 99 (0.1deg/sec) +# define AP_MOUNT_TOPOTEK_ID3CHAR_ROLL_ANGLE "GIR" // set the roll angle target in the range -90 ~ 90, speed 0 ~ 99 (0.1deg/sec) +# define AP_MOUNT_TOPOTEK_ID3CHAR_SET_LAT "LAT" // set the gimbal's latitude +# define AP_MOUNT_TOPOTEK_ID3CHAR_SET_LON "LON" // set the gimbal's longitude +# define AP_MOUNT_TOPOTEK_ID3CHAR_SET_ALT "ALT" // set the gimbal's altitude +# define AP_MOUNT_TOPOTEK_ID3CHAR_SET_AZIMUTH "AZI" // set the gimbal's yaw (aka azimuth) + +#define AP_MOUNT_TOPOTEK_DEBUG 0 +#define debug(fmt, args ...) do { if (AP_MOUNT_TOPOTEK_DEBUG) { GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Topotek: " fmt, ## args); } } while (0) + +const char* AP_Mount_Topotek::send_message_prefix = "Mount: Topotek"; + +// update mount position - should be called periodically +void AP_Mount_Topotek::update() +{ + // exit immediately if not initialised + if (!_initialised) { + return; + } + + // reading incoming packets from gimbal + read_incoming_packets(); + + // everything below updates at 10hz + uint32_t now_ms = AP_HAL::millis(); + if ((now_ms - _last_req_current_info_ms) < 100) { + return; + } + _last_req_current_info_ms = now_ms; + + // re-send the stop zoom command a second time to prevent data transmission errors. + if (_last_zoom_stop) { + _last_zoom_stop = false; + send_fixedlen_packet(AddressByte::LENS, AP_MOUNT_TOPOTEK_ID3CHAR_CONTROL_ZOOM, true, 0); + } + + // re-send the stop focus command a second time to prevent data transmission errors. + if (_last_focus_stop) { + _last_focus_stop = false; + send_fixedlen_packet(AddressByte::LENS, AP_MOUNT_TOPOTEK_ID3CHAR_CONTROL_FOCUS, true, 0); + } + + // send GPS-related information to the gimbal + send_location_info(); + + // calls below here called at 1hz + _last_req_step++; + if (_last_req_step >= 10) { + _last_req_step = 0; + } + switch (_last_req_step) { + case 0: + // get gimbal version + if (!_got_gimbal_version) { + request_gimbal_version(); + } + break; + case 2: + // request gimbal attitude at 1hz + // gimbal will continue to send attitude information during the next period + request_gimbal_attitude(); + break; + case 4: + // request memory card information + request_gimbal_sdcard_info(); + break; + case 6: + // request tracking info + request_track_status(); + break; + case 8: + // get gimbal model name + if (!_got_gimbal_model_name) { + request_gimbal_model_name(); + } + break; + } + + // change to RC_TARGETING mode if RC input has changed + set_rctargeting_on_rcinput_change(); + + // handle tracking state + if (_is_tracking) { + // cancel tracking if mode has changed + if (_last_mode != _mode) { + _last_mode = _mode; + cancel_tracking(); + } + return; + } + _last_mode = _mode; + + // update based on mount mode + switch (get_mode()) { + // move mount to a "retracted" position. To-Do: remove support and replace with a relaxed mode? + case MAV_MOUNT_MODE_RETRACT: { + const Vector3f &angle_bf_target = _params.retract_angles.get(); + mnt_target.target_type = MountTargetType::ANGLE; + mnt_target.angle_rad.set(angle_bf_target*DEG_TO_RAD, false); + break; + } + + // move mount to a neutral position, typically pointing forward + case MAV_MOUNT_MODE_NEUTRAL: { + const Vector3f &angle_bf_target = _params.neutral_angles.get(); + mnt_target.target_type = MountTargetType::ANGLE; + mnt_target.angle_rad.set(angle_bf_target*DEG_TO_RAD, false); + break; + } + + // point to the angles given by a mavlink message + case MAV_MOUNT_MODE_MAVLINK_TARGETING: + // mavlink targets are stored while handling the incoming message + break; + + // RC radio manual angle control, but with stabilization from the AHRS + case MAV_MOUNT_MODE_RC_TARGETING: { + // update targets using pilot's RC inputs + MountTarget rc_target; + get_rc_target(mnt_target.target_type, rc_target); + switch (mnt_target.target_type) { + case MountTargetType::ANGLE: + mnt_target.angle_rad = rc_target; + break; + case MountTargetType::RATE: + mnt_target.rate_rads = rc_target; + break; + } + break; + } + + // point mount to a GPS point given by the mission planner + case MAV_MOUNT_MODE_GPS_POINT: + if (get_angle_target_to_roi(mnt_target.angle_rad)) { + mnt_target.target_type = MountTargetType::ANGLE; + } + break; + + // point mount to Home location + case MAV_MOUNT_MODE_HOME_LOCATION: + if (get_angle_target_to_home(mnt_target.angle_rad)) { + mnt_target.target_type = MountTargetType::ANGLE; + } + break; + + // point mount to another vehicle + case MAV_MOUNT_MODE_SYSID_TARGET: + if (get_angle_target_to_sysid(mnt_target.angle_rad)) { + mnt_target.target_type = MountTargetType::ANGLE; + } + break; + + default: + // we do not know this mode so raise internal error + INTERNAL_ERROR(AP_InternalError::error_t::flow_of_control); + break; + } + + // send target angles or rates depending on the target type + switch (mnt_target.target_type) { + case MountTargetType::ANGLE: + send_angle_target(mnt_target.angle_rad); + break; + case MountTargetType::RATE: + send_rate_target(mnt_target.rate_rads); + break; + } +} + +// return true if healthy +bool AP_Mount_Topotek::healthy() const +{ + // exit immediately if not initialised + if (!_initialised) { + return false; + } + + // unhealthy if attitude information not received recently + const uint32_t last_current_angle_ms = _last_current_angle_ms; + return (AP_HAL::millis() - last_current_angle_ms < AP_MOUNT_TOPOTEK_HEALTH_TIMEOUT_MS); +} + +// take a picture. returns true on success +bool AP_Mount_Topotek::take_picture() +{ + // exit immediately if not initialised + if (!_initialised) { + return false; + } + + // exit immediately if the memory card is abnormal + if (!_sdcard_status) { + GCS_SEND_TEXT(MAV_SEVERITY_WARNING, "%s SD card error", send_message_prefix); + return false; + } + + // sample command: #TPUD2wCAP01 + return send_fixedlen_packet(AddressByte::SYSTEM_AND_IMAGE, AP_MOUNT_TOPOTEK_ID3CHAR_CAPTURE, true, 1); +} + +// start or stop video recording. returns true on success +// set start_recording = true to start record, false to stop recording +bool AP_Mount_Topotek::record_video(bool start_recording) +{ + // exit immediately if not initialised + if (!_initialised) { + return false; + } + + // exit immediately if the memory card is abnormal + if (!_sdcard_status) { + GCS_SEND_TEXT(MAV_SEVERITY_WARNING, "%s SD card error", send_message_prefix); + return false; + } + + // sample command: #TPUD2wREC01 + return send_fixedlen_packet(AddressByte::SYSTEM_AND_IMAGE, AP_MOUNT_TOPOTEK_ID3CHAR_RECORD_VIDEO, true, start_recording ? 1 : 0); +} + +// set zoom specified as a rate +bool AP_Mount_Topotek::set_zoom(ZoomType zoom_type, float zoom_value) +{ + // exit immediately if not initialised + if (!_initialised) { + return false; + } + + // zoom rate + if (zoom_type == ZoomType::RATE) { + uint8_t zoom_cmd; + if (is_zero(zoom_value)) { + // stop zoom + zoom_cmd = 0; + _last_zoom_stop = true; + } else if (zoom_value < 0) { + // zoom out + zoom_cmd = 1; + } else { + // zoom in + zoom_cmd = 2; + } + // sample command: #TPUM2wZMC00 + return send_fixedlen_packet(AddressByte::LENS, AP_MOUNT_TOPOTEK_ID3CHAR_CONTROL_ZOOM, true, zoom_cmd); + } + + // unsupported zoom type + return false; +} + +// set focus specified as rate, percentage or auto +// focus in = -1, focus hold = 0, focus out = 1 +SetFocusResult AP_Mount_Topotek::set_focus(FocusType focus_type, float focus_value) +{ + // exit immediately if not initialised + if (!_initialised) { + return SetFocusResult::FAILED; + } + + switch (focus_type) { + case FocusType::RATE: { + // focus stop + uint8_t focus_cmd; + if (is_zero(focus_value)) { + focus_cmd = 0; + _last_focus_stop = true; + } else if (focus_value < 0) { + // focus- + focus_cmd = 2; + } else { + // focus+ + focus_cmd = 1; + } + // send focus command and switch to manual focus + // sample command: #TPUM2wFCC00 + if (send_fixedlen_packet(AddressByte::LENS, AP_MOUNT_TOPOTEK_ID3CHAR_CONTROL_FOCUS, true, focus_cmd) && + send_fixedlen_packet(AddressByte::LENS, AP_MOUNT_TOPOTEK_ID3CHAR_CONTROL_FOCUS, true, 0x11)) { + return SetFocusResult::ACCEPTED; + } + return SetFocusResult::FAILED; + } + case FocusType::PCT: + // not supported + return SetFocusResult::INVALID_PARAMETERS; + case FocusType::AUTO: + // auto focus + if (send_fixedlen_packet(AddressByte::LENS, AP_MOUNT_TOPOTEK_ID3CHAR_CONTROL_FOCUS, true, 0x10)) { + return SetFocusResult::ACCEPTED; + } + return SetFocusResult::FAILED; + } + + // unsupported focus type + return SetFocusResult::INVALID_PARAMETERS; +} + +// set tracking to none, point or rectangle (see TrackingType enum) +// if POINT only p1 is used, if RECTANGLE then p1 is top-left, p2 is bottom-right +// p1,p2 are in range 0 to 1. 0 is left or top, 1 is right or bottom +bool AP_Mount_Topotek::set_tracking(TrackingType tracking_type, const Vector2f& p1, const Vector2f& p2) +{ + // exit immediately if not initialised + if (!_initialised) { + return false; + } + + // local variables holding tracker center and width + int16_t track_center_x, track_center_y, track_width, track_height; + bool send_tracking_cmd = false; + + switch (tracking_type) { + + case TrackingType::TRK_NONE: + return cancel_tracking(); + + case TrackingType::TRK_POINT: { + // calculate tracking center, width and height + track_center_x = (int16_t)((p1.x*TRACK_TOTAL_WIDTH - 960) / 0.96); + track_center_y = (int16_t)((p1.y*TRACK_TOTAL_HEIGHT - 540) / 0.54); + track_width = (int16_t)(TRACK_RANGE / 0.96); + track_height = (int16_t)(TRACK_RANGE / 0.54); + send_tracking_cmd = true; + break; + } + + case TrackingType::TRK_RECTANGLE: + // calculate upper left and bottom right points + // handle case where p1 and p2 are in an unexpected order + int16_t upper_leftx = (int16_t)(MIN(p1.x, p2.x)*TRACK_TOTAL_WIDTH); + int16_t upper_lefty = (int16_t)(MIN(p1.y, p2.y)*TRACK_TOTAL_HEIGHT); + int16_t bottom_rightx = (int16_t)(MAX(p1.x, p2.x)*TRACK_TOTAL_WIDTH); + int16_t bottom_righty = (int16_t)(MAX(p1.y, p2.y)*TRACK_TOTAL_HEIGHT); + + // calculated width and height and sanity check + const int16_t frame_selection_width = bottom_rightx - upper_leftx; + const int16_t frame_selection_height = bottom_righty - upper_lefty; + if (frame_selection_width <= 0 || frame_selection_height <= 0) { + return false; + } + + // calculate tracking center + track_center_x = (int16_t)((((upper_leftx + bottom_rightx) * 0.5) - 960) / 0.96); + track_center_y = (int16_t)((((upper_lefty + bottom_righty) * 0.5) - 540) / 0.54); + + // tracking range after conversion + track_width = (int16_t)(frame_selection_width / 0.96); + track_height = (int16_t)(frame_selection_height / 0.54); + + send_tracking_cmd = true; + break; + } + + if (send_tracking_cmd) { + // set the gimbal to the ready-to-track state when the gimbal tracking status is stopped + if (_last_tracking_state == TrackingStatus::STOPPED_TRACKING) { + send_fixedlen_packet(AddressByte::SYSTEM_AND_IMAGE, AP_MOUNT_TOPOTEK_ID3CHAR_TRACKING, true, 2); + } + + // prepare data bytes + uint8_t databuff[10]; + databuff[0] = HIGHBYTE(track_center_x); + databuff[1] = LOWBYTE(track_center_x); + databuff[2] = HIGHBYTE(track_center_y); + databuff[3] = LOWBYTE(track_center_y); + databuff[4] = HIGHBYTE(track_width); + databuff[5] = LOWBYTE(track_width); + databuff[6] = HIGHBYTE(track_height); + databuff[7] = LOWBYTE(track_height); + databuff[8] = 0; + databuff[9] = (tracking_type == TrackingType::TRK_POINT) ? 9 : 1; // when tracking point, enable fuzzy click function + + // send tracking command + bool res = send_variablelen_packet(HeaderType::VARIABLE_LEN, + AddressByte::SYSTEM_AND_IMAGE, + AP_MOUNT_TOPOTEK_ID3CHAR_START_TRACKING, + true, + (uint8_t*)databuff, ARRAY_SIZE(databuff)); + + // display error message on failure + if (!res) { + GCS_SEND_TEXT(MAV_SEVERITY_ERROR, "%s tracking failed", send_message_prefix); + } + + return res; + } + + // should never reach here + return false; +} + +// send command to gimbal to cancel tracking (if necessary) +// returns true on success, false on failure to send message +bool AP_Mount_Topotek::cancel_tracking() +{ + // exit immediately if not initialised + if (!_initialised) { + return false; + } + + // if gimbal is tracking-in-progress change to waiting state, otherwise stop + const uint8_t track_set = _last_tracking_state == TrackingStatus::TRACKING_IN_PROGRESS ? 1 : 0; + + // send tracking command + return send_fixedlen_packet(AddressByte::SYSTEM_AND_IMAGE, AP_MOUNT_TOPOTEK_ID3CHAR_TRACKING, true, track_set); +} + +// set camera picture-in-picture mode +bool AP_Mount_Topotek::set_lens(uint8_t lens) +{ + // exit immediately if not initialised + if (!_initialised) { + return false; + } + + // sanity check lens number + // 00:main only, 01:main+sub, 02:sub+main, 03:sub only, 0A:next + // sample command: #TPUD2wPIP0A + if (lens > 3) { + return false; + } + + // send pip command + return send_fixedlen_packet(AddressByte::SYSTEM_AND_IMAGE, AP_MOUNT_TOPOTEK_ID3CHAR_PIP, true, lens); +} + +#if HAL_MOUNT_SET_CAMERA_SOURCE_ENABLED +// set_camera_source is functionally the same as set_lens except primary and secondary lenses are specified by type +// primary and secondary sources use the AP_Camera::CameraSource enum cast to uint8_t +bool AP_Mount_Topotek::set_camera_source(uint8_t primary_source, uint8_t secondary_source) +{ + // exit immediately if not initialised + if (!_initialised) { + return false; + } + + // maps primary and secondary source to pip setting + // pip settings 00:main only, 01:main+sub, 02:sub+main, 03:sub only, 0A:next + // sample command: #TPUD2wPIP0A + uint8_t pip_setting = 0; + switch (primary_source) { + case 0: // Default (RGB) + FALLTHROUGH; + case 1: // RGB + switch (secondary_source) { + case 0: // RGB + Default (None) + pip_setting = 0; // main only + break; + case 2: // PIP RGB+IR + pip_setting = 1; // main+sub + break; + default: + return false; + } + break; + case 2: // IR + switch (secondary_source) { + case 0: // IR + Default (None) + pip_setting = 3; // sub only + break; + case 1: // IR+RGB + pip_setting = 2; // sub+main + break; + default: + return false; + } + break; + default: + return false; + } + + // send pip command + return send_fixedlen_packet(AddressByte::SYSTEM_AND_IMAGE, AP_MOUNT_TOPOTEK_ID3CHAR_PIP, true, pip_setting); +} +#endif // HAL_MOUNT_SET_CAMERA_SOURCE_ENABLED + +// send camera information message to GCS +void AP_Mount_Topotek::send_camera_information(mavlink_channel_t chan) const +{ + // exit immediately if not initialised + if (!_initialised) { + return; + } + + static const uint8_t vendor_name[32] = "Topotek"; + static uint8_t model_name[32] {}; + const char cam_definition_uri[140] {}; + + // copy model name if available + if (_got_gimbal_model_name) { + strncpy((char*)model_name, (const char*)_model_name, ARRAY_SIZE(model_name)); + } + + // capability flags + const uint32_t flags = CAMERA_CAP_FLAGS_CAPTURE_VIDEO | + CAMERA_CAP_FLAGS_CAPTURE_IMAGE | + CAMERA_CAP_FLAGS_HAS_BASIC_ZOOM | + CAMERA_CAP_FLAGS_HAS_BASIC_FOCUS | + CAMERA_CAP_FLAGS_HAS_TRACKING_POINT | + CAMERA_CAP_FLAGS_HAS_TRACKING_RECTANGLE; + + // send CAMERA_INFORMATION message + mavlink_msg_camera_information_send( + chan, + AP_HAL::millis(), // time_boot_ms + vendor_name, // vendor_name uint8_t[32] + model_name, // model_name uint8_t[32] + _firmware_ver, // firmware version uint32_t + 0, // focal_length float (mm) + 0, // sensor_size_h float (mm) + 0, // sensor_size_v float (mm) + 0, // resolution_h uint16_t (pix) + 0, // resolution_v uint16_t (pix) + 0, // lens_id uint8_t + flags, // flags uint32_t (CAMERA_CAP_FLAGS) + 0, // cam_definition_version uint16_t + cam_definition_uri, // cam_definition_uri char[140] + _instance + 1); // gimbal_device_id uint8_t +} + +// send camera settings message to GCS +void AP_Mount_Topotek::send_camera_settings(mavlink_channel_t chan) const +{ + // exit immediately if not initialised + if (!_initialised) { + return; + } + + const float NaN = nanf("0x4152"); + + // send CAMERA_SETTINGS message + mavlink_msg_camera_settings_send( + chan, + AP_HAL::millis(), // time_boot_ms + _recording ? CAMERA_MODE_VIDEO : CAMERA_MODE_IMAGE, // camera mode (0:image, 1:video, 2:image survey) + NaN, // zoomLevel float, percentage from 0 to 100, NaN if unknown + NaN); // focusLevel float, percentage from 0 to 100, NaN if unknown +} + +// get rangefinder distance. Returns true on success +bool AP_Mount_Topotek::get_rangefinder_distance(float& distance_m) const +{ + // if not healthy or negative distance return false + // healthy() checks attitude timeout which is in same message as rangefinder distance + if (!healthy() || (_measure_dist_m < 0)) { + return false; + } + + distance_m = _measure_dist_m; + return true; +} + +// enable/disable rangefinder. Returns true on success +bool AP_Mount_Topotek::set_rangefinder_enable(bool enable) +{ + // exit immediately if not initialised + if (!_initialised) { + return false; + } + + // 00:ranging stop, 01:ranging start, 02:single measurement, 03:continuous measurement + // sample command: #TPUM2wLRF00 + return send_fixedlen_packet(AddressByte::LENS, AP_MOUNT_TOPOTEK_ID3CHAR_LRF, true, enable ? 3 : 0); +} + +// get attitude as a quaternion. returns true on success +bool AP_Mount_Topotek::get_attitude_quaternion(Quaternion& att_quat) +{ + att_quat.from_euler(_current_angle_rad.x, _current_angle_rad.y, _current_angle_rad.z); + return true; +} + +// reading incoming packets from gimbal and confirm they are of the correct format +void AP_Mount_Topotek::read_incoming_packets() +{ + // check for bytes on the serial port + int16_t nbytes = MIN(_uart->available(), 1024U); + if (nbytes <= 0 ) { + return; + } + + // flag to allow cases below to reset parser state + bool reset_parser = false; + + // process bytes received + for (int16_t i = 0; i < nbytes; i++) { + uint8_t b; + if (!_uart->read(b)) { + continue; + } + + // add latest byte to buffer + _msg_buff[_msg_buff_len++] = b; + + // protect against overly long messages + if (_msg_buff_len >= AP_MOUNT_TOPOTEK_PACKETLEN_MAX) { + reset_parser = true; + } + + // process byte depending upon current state + switch (_parser.state) { + + case ParseState::WAITING_FOR_HEADER1: + if (b == '#') { + _parser.state = ParseState::WAITING_FOR_HEADER2; + break; + } + reset_parser = true; + break; + + case ParseState::WAITING_FOR_HEADER2: + if (b == 't' || b == 'T') { + _parser.state = ParseState::WAITING_FOR_HEADER3; + break; + } + reset_parser = true; + break; + + case ParseState::WAITING_FOR_HEADER3: + if (b == 'p' || b == 'P') { + _parser.state = ParseState::WAITING_FOR_ADDR1; + break; + } + reset_parser = true; + break; + + case ParseState::WAITING_FOR_ADDR1: + case ParseState::WAITING_FOR_ADDR2: + if (b == 'U' || b =='M' || b == 'D' || b =='E' || b =='P' || b =='G') { + // advance to next state + _parser.state = (ParseState)((uint8_t)_parser.state+1); + break; + } + reset_parser = true; + break; + + case ParseState::WAITING_FOR_DATALEN: + // sanity check data length + _parser.data_len = (uint8_t)char_to_hex(b); + if (_parser.data_len <= AP_MOUNT_TOPOTEK_DATALEN_MAX) { + _parser.state = ParseState::WAITING_FOR_CONTROL; + break; + } + reset_parser = true; + break; + + case ParseState::WAITING_FOR_CONTROL: + // r or w + if (b == 'r' || b == 'w') { + _parser.state = ParseState::WAITING_FOR_ID1; + break; + } + reset_parser = true; + break; + + case ParseState::WAITING_FOR_ID1: + case ParseState::WAITING_FOR_ID2: + case ParseState::WAITING_FOR_ID3: + // check all uppercase letters and numbers. eg 'GAC' + if ((b >= 'A' && b <= 'Z') || (b >= '0' && b <= '9')) { + // advance to next state + _parser.state = (ParseState)((uint8_t)_parser.state+1); + break; + } + reset_parser = true; + break; + + case ParseState::WAITING_FOR_DATA: { + // normally hex numbers in char form (e.g. '0A') + const uint8_t data_bytes_received = _msg_buff_len - (AP_MOUNT_TOPOTEK_PACKETLEN_MIN - 2); + + // sanity check to protect against programming errors + if (data_bytes_received > AP_MOUNT_TOPOTEK_DATALEN_MAX) { + INTERNAL_ERROR(AP_InternalError::error_t::flow_of_control); + reset_parser = true; + break; + } + + // advance parser state once expected number of bytes have been received + if (data_bytes_received == _parser.data_len) { + _parser.state = ParseState::WAITING_FOR_CRC_LOW; + } + break; + } + + case ParseState::WAITING_FOR_CRC_LOW: + _parser.state = ParseState::WAITING_FOR_CRC_HIGH; + break; + + case ParseState::WAITING_FOR_CRC_HIGH: + // this is the last byte in the message so reset the parser + reset_parser = true; + + // sanity check to protect against programming errors + if (_msg_buff_len < AP_MOUNT_TOPOTEK_PACKETLEN_MIN) { + INTERNAL_ERROR(AP_InternalError::error_t::flow_of_control); + break; + } + + // calculate and check CRC + const uint8_t crc_value = calculate_crc(_msg_buff, _msg_buff_len - 2); + const char crc_char1 = hex2char((crc_value >> 4) & 0x0f); + const char crc_char2 = hex2char((crc_value) & 0x0f); + if (crc_char1 != _msg_buff[_msg_buff_len - 2] || crc_char2 != _msg_buff[_msg_buff_len-1]) { + debug("CRC expected:%x got:%c%c", (int)crc_value, crc_char1, crc_char2); + break; + } + + // CRC is OK, call function to process the message + for (uint8_t count = 0; count < AP_MOUNT_RECV_GIMBAL_CMD_CATEGORIES_NUM; count++) { + if (strncmp((const char*)_msg_buff + 7, (const char*)(uart_recv_cmd_compare_list[count].uart_cmd_key), 3) == 0) { + (this->*(uart_recv_cmd_compare_list[count].func))(); + break; + } + } + } + + // handle reset of parser + if (reset_parser) { + _parser.state = ParseState::WAITING_FOR_HEADER1; + _msg_buff_len = 0; + reset_parser = false; + } + } +} + +// request gimbal attitude +void AP_Mount_Topotek::request_gimbal_attitude() +{ + // sample command: #TPUG2wGAA01 + send_fixedlen_packet(AddressByte::GIMBAL, AP_MOUNT_TOPOTEK_ID3CHAR_GIMBAL_ATT, true, 1); +} + +// request gimbal memory card information +void AP_Mount_Topotek::request_gimbal_sdcard_info() +{ + // request remaining capacity + // sample command including CRC: #TPUD2rSDC003E + // 00:get remaining capacity, 01:get total capacity + send_fixedlen_packet(AddressByte::SYSTEM_AND_IMAGE, AP_MOUNT_TOPOTEK_ID3CHAR_SD_CARD, false, 0); +} + +// request gimbal tracking status +void AP_Mount_Topotek::request_track_status() +{ + // 00:get status (use with "r"), 01:stop (use with "w") + // sample command: #TPUD2rTRC00 + send_fixedlen_packet(AddressByte::SYSTEM_AND_IMAGE, AP_MOUNT_TOPOTEK_ID3CHAR_TRACKING, false, 0); +} + +// request gimbal version +void AP_Mount_Topotek::request_gimbal_version() +{ + // sample command: #TPUD2rVSN00 + send_fixedlen_packet(AddressByte::SYSTEM_AND_IMAGE, AP_MOUNT_TOPOTEK_ID3CHAR_GET_VERSION, false, 0); +} + +// request gimbal model name +void AP_Mount_Topotek::request_gimbal_model_name() +{ + // sample command: #TPUG2rPA200 + send_fixedlen_packet(AddressByte::GIMBAL, AP_MOUNT_TOPOTEK_ID3CHAR_GET_MODEL_NAME, false, 0); +} + +// send angle target in radians to gimbal +void AP_Mount_Topotek::send_angle_target(const MountTarget& angle_rad) +{ + // gimbal's earth-frame angle control drifts so always use body frame + // set gimbal's lock state if it has changed + if (!set_gimbal_lock(false)) { + return; + } + + // calculate and send yaw target + // sample command #tpUG6wGIY + const char* format_str = "%04x%02x"; + const uint8_t speed = 99; + const uint16_t yaw_angle_cd = (uint16_t)constrain_int16(degrees(angle_rad.get_bf_yaw()) * 100, MAX(-18000, _params.yaw_angle_min * 100), MIN(18000, _params.yaw_angle_max * 100)); + + uint8_t databuff[7]; + hal.util->snprintf((char *)databuff, ARRAY_SIZE(databuff), format_str, yaw_angle_cd, speed); + send_variablelen_packet(HeaderType::VARIABLE_LEN, + AddressByte::GIMBAL, + AP_MOUNT_TOPOTEK_ID3CHAR_YAW_ANGLE_BF, + true, + (uint8_t*)databuff, ARRAY_SIZE(databuff)-1); + + // send pitch target + // sample command: #tpUG6wGIP + const uint16_t pitch_angle_cd = (uint16_t)constrain_int16(-degrees(angle_rad.pitch) * 100, -9000, 9000); + hal.util->snprintf((char *)databuff, ARRAY_SIZE(databuff), format_str, pitch_angle_cd, speed); + send_variablelen_packet(HeaderType::VARIABLE_LEN, + AddressByte::GIMBAL, + AP_MOUNT_TOPOTEK_ID3CHAR_PITCH_ANGLE, + true, + (uint8_t*)databuff, ARRAY_SIZE(databuff)-1); + + // send roll target + // sample command: #tpUG6wGIR + const uint16_t roll_angle_cd = (uint16_t)constrain_int16(degrees(angle_rad.roll) * 100, -18000, 18000); + hal.util->snprintf((char *)databuff, ARRAY_SIZE(databuff), format_str, roll_angle_cd, speed); + send_variablelen_packet(HeaderType::VARIABLE_LEN, + AddressByte::GIMBAL, + AP_MOUNT_TOPOTEK_ID3CHAR_ROLL_ANGLE, + true, + (uint8_t*)databuff, ARRAY_SIZE(databuff)-1); +} + +// send rate target in rad/s to gimbal +void AP_Mount_Topotek::send_rate_target(const MountTarget& rate_rads) +{ + // set gimbal's lock state if it has changed + if (!set_gimbal_lock(rate_rads.yaw_is_ef)) { + return; + } + + // convert and constrain rates + const uint8_t roll_angle_speed = constrain_int16(degrees(rate_rads.roll) * ANGULAR_VELOCITY_CONVERSION, -99, 99); + const uint8_t pitch_angle_speed = constrain_int16(degrees(rate_rads.pitch) * ANGULAR_VELOCITY_CONVERSION, -99, 99); + const uint8_t yaw_angle_speed = constrain_int16(degrees(rate_rads.yaw) * ANGULAR_VELOCITY_CONVERSION, -99, 99); + + // send stop rotation command three times if target roll, pitch and yaw are zero + if (roll_angle_speed == 0 && pitch_angle_speed == 0 && yaw_angle_speed == 0) { + if (_stop_order_count < 3) { + // sample command: #TPUG2wPTZ00 + if (send_fixedlen_packet(AddressByte::GIMBAL, AP_MOUNT_TOPOTEK_ID3CHAR_GIMBAL_MODE, true, 0)) { + _stop_order_count++; + } + } + return; + } + _stop_order_count = 0; + + // prepare and send command + // sample command: #tpUG6wYPR + uint8_t databuff[7]; + hal.util->snprintf((char *)databuff, ARRAY_SIZE(databuff), "%02x%02x%02x", yaw_angle_speed, pitch_angle_speed, roll_angle_speed); + send_variablelen_packet(HeaderType::VARIABLE_LEN, AddressByte::GIMBAL, AP_MOUNT_TOPOTEK_ID3CHAR_YPR_RATE, true, databuff, ARRAY_SIZE(databuff)-1); +} + +// send time and date to gimbal +bool AP_Mount_Topotek::send_time_to_gimbal() +{ +#if AP_RTC_ENABLED + // get date and time + // year is the regular Gregorian year, month is 0~11, day is 1~31, hour is 0~23, minute is 0~59, second is 0~60 (1 leap second), ms is 0~999 + uint16_t year, ms; + uint8_t month, day, hour, min, sec; + if (!AP::rtc().get_date_and_time_utc(year, month, day, hour, min, sec, ms)) { + return false; + } + + // sample command: #tpUDCwUTCHHMMSSDDMMYY + uint8_t databuff[13]; + hal.util->snprintf((char*)databuff, ARRAY_SIZE(databuff), "%02d%02d%02d%02d%02d%02d", hour, min, sec, day, month + 1, year - 2000); + return send_variablelen_packet(HeaderType::VARIABLE_LEN, AddressByte::SYSTEM_AND_IMAGE, AP_MOUNT_TOPOTEK_ID3CHAR_TIME, true, (uint8_t*)databuff, ARRAY_SIZE(databuff)-1); +#else + return false; +#endif +} + +// send GPS-related information to the gimbal +bool AP_Mount_Topotek::send_location_info() +{ + // get current location + Location loc; + int32_t alt_amsl_cm = 0; + if (!AP::ahrs().get_location(loc) || !loc.get_alt_cm(Location::AltFrame::ABSOLUTE, alt_amsl_cm)) { + return false; + } + + // convert latitude and longitude to positive angles in degrees + const double latitude = labs(loc.lat) * 1e-7; + const double longitude = labs(loc.lng) * 1e-7; + + // get the degree part + const int16_t lat_deg = (int16_t)latitude; + const int16_t lng_deg = (int16_t)longitude; + + // get the minute part + const double lat_min = (latitude - lat_deg) * 60.0; + const double lng_min = (longitude - lng_deg) * 60.0; + + // prepare and send latitude + // first byte is N or S, followed by GPS coordinates in degree division format, in the format of ddmm.mmmm + // first byte is zero and will also be transmitted. same as the data format in $GPGGA + // sample command: #tpUDAwLATNddmm.mmmm + uint8_t databuff_lat[11]; + hal.util->snprintf((char*)databuff_lat, ARRAY_SIZE(databuff_lat), "%c%02d%07.4f", loc.lat > 0 ? 'N':'S', lat_deg, lat_min); + if (!send_variablelen_packet(HeaderType::VARIABLE_LEN, AddressByte::SYSTEM_AND_IMAGE, AP_MOUNT_TOPOTEK_ID3CHAR_SET_LAT, true, (uint8_t*)databuff_lat, ARRAY_SIZE(databuff_lat)-1)) { + return false; + } + + // prepare and send longitude + // sample command: #tpUDBwLONEdddmm.mmmm + uint8_t databuff_lon[12]; + hal.util->snprintf((char*)databuff_lon, ARRAY_SIZE(databuff_lon), "%c%03d%07.4f", loc.lng > 0 ? 'E':'W', lng_deg, lng_min); + if (!send_variablelen_packet(HeaderType::VARIABLE_LEN, AddressByte::SYSTEM_AND_IMAGE, AP_MOUNT_TOPOTEK_ID3CHAR_SET_LON, true, (uint8_t*)databuff_lon, ARRAY_SIZE(databuff_lon)-1)) { + return false; + } + + // get the height in meters + float alt_amsl_m = alt_amsl_cm * 0.01; + + // prepare and send vehicle altitude + // sample command: #tpUD8wALT000000.0, similar format to $GPGGA + uint8_t databuff_alt[9]; + hal.util->snprintf((char*)databuff_alt, ARRAY_SIZE(databuff_alt), "%08.1f", alt_amsl_m); + if (!send_variablelen_packet(HeaderType::VARIABLE_LEN, AddressByte::SYSTEM_AND_IMAGE, AP_MOUNT_TOPOTEK_ID3CHAR_SET_ALT, true, (uint8_t*)databuff_alt, ARRAY_SIZE(databuff_alt)-1)) { + return false; + } + + // prepare and send vehicle yaw + // sample command: #tpUD5wAZI359.9, similar format to $GPRMC + const float veh_yaw_deg = wrap_360(degrees(AP::ahrs().get_yaw())); + uint8_t databuff_azimuth[6]; + hal.util->snprintf((char*)databuff_azimuth, ARRAY_SIZE(databuff_azimuth), "%05.1f", veh_yaw_deg); + if (!send_variablelen_packet(HeaderType::VARIABLE_LEN, AddressByte::SYSTEM_AND_IMAGE, AP_MOUNT_TOPOTEK_ID3CHAR_SET_AZIMUTH, true, (uint8_t*)databuff_azimuth, ARRAY_SIZE(databuff_azimuth)-1)) { + return false; + } + + return true; +} + +// attitude information analysis of gimbal +void AP_Mount_Topotek::gimbal_angle_analyse() +{ + // consume current angles + int16_t yaw_angle_cd = wrap_180_cd(hexchar4_to_int16(_msg_buff[10], _msg_buff[11], _msg_buff[12], _msg_buff[13])); + int16_t pitch_angle_cd = -hexchar4_to_int16(_msg_buff[14], _msg_buff[15], _msg_buff[16], _msg_buff[17]); + int16_t roll_angle_cd = hexchar4_to_int16(_msg_buff[18], _msg_buff[19], _msg_buff[20], _msg_buff[21]); + + // convert cd to radians + _current_angle_rad.x = radians(roll_angle_cd * 0.01); + _current_angle_rad.y = radians(pitch_angle_cd * 0.01); + _current_angle_rad.z = radians(yaw_angle_cd * 0.01); + _last_current_angle_ms = AP_HAL::millis(); + + return; +} + +// gimbal video information analysis +void AP_Mount_Topotek::gimbal_record_analyse() +{ + _recording = (_msg_buff[10] == '1' || _msg_buff[11] == '1'); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "%s recording %s", send_message_prefix, _recording ? "ON" : "OFF"); +} + +// information analysis of gimbal storage card +void AP_Mount_Topotek::gimbal_sdcard_analyse() +{ + if (('N' == _msg_buff[10]) && ('N' == _msg_buff[11]) && ('N' == _msg_buff[12]) && ('N' == _msg_buff[13])) { + // memory card exception + _sdcard_status = false; + return; + } + _sdcard_status = true; + + // send UTC time to the camera + if (_sent_time_count < 7) { + if (send_time_to_gimbal()) { + _sent_time_count++; + } + } + + return; +} + +// gimbal tracking information analysis +void AP_Mount_Topotek::gimbal_track_analyse() +{ + // ignore tracking state if unchanged + TrackingStatus tracking_state = (TrackingStatus)_msg_buff[11]; + if (tracking_state == _last_tracking_state) { + return; + } + _last_tracking_state = tracking_state; + + // inform user + const char* tracking_str = "tracking"; + switch (tracking_state) { + case TrackingStatus::STOPPED_TRACKING: + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "%s %s stopped", send_message_prefix, tracking_str); + _is_tracking = false; + break; + case TrackingStatus::WAITING_FOR_TRACKING: + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "%s %s waiting", send_message_prefix, tracking_str); + _is_tracking = false; + break; + case TrackingStatus::TRACKING_IN_PROGRESS: + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "%s %s started", send_message_prefix, tracking_str); + _is_tracking = true; + break; + } +} + +// gimbal distance information analysis +void AP_Mount_Topotek::gimbal_dist_info_analyse() +{ + if ('E' == _msg_buff[10] && 'R' == _msg_buff[11] && 'R' ==_msg_buff[12]) { + _measure_dist_m = -1.0f; + return; + } + + // distance is in meters in the format, "12345.6" where each digit is in decimal + _measure_dist_m = char_to_hex(_msg_buff[10]) * 10000.0 + + char_to_hex(_msg_buff[11]) * 1000.0 + + char_to_hex(_msg_buff[12]) * 100.0 + + char_to_hex(_msg_buff[13]) * 10.0 + + char_to_hex(_msg_buff[14]) + + char_to_hex(_msg_buff[16]) * 0.1; +} + +// gimbal basic information analysis +void AP_Mount_Topotek::gimbal_version_analyse() +{ + // version array with index 0=major, 1=minor, 2=patch + uint8_t version[3] {}; + + // extract firmware version + // the version can be in the format "1.2.3" or "123" + const uint8_t data_buf_len = char_to_hex(_msg_buff[5]); + + // check for "." + bool contains_period = false; + for (uint8_t i = 0; i < data_buf_len; i++) { + contains_period |= _msg_buff[10 + i] == '.'; + } + + // if contains period, extract version number + uint32_t ver_num = 0; + uint8_t ver_count = 0; + if (contains_period) { + for (uint8_t i = 0; i < data_buf_len; i++) { + if (_msg_buff[10 + i] != '.') { + ver_num = ver_num * 10 + char_to_hex(_msg_buff[10 + i]); + } else { + version[ver_count++] = ver_num; + ver_num = 0; + } + if (ver_count >= ARRAY_SIZE(version)) { + break; + } + } + } else { + if (data_buf_len >= 1) { + version[0] = char_to_hex(_msg_buff[10]); + } + if (data_buf_len >= 2) { + version[1] = char_to_hex(_msg_buff[11]); + } + if (data_buf_len >= 3) { + version[2] = char_to_hex(_msg_buff[12]); + } + } + _firmware_ver = (version[2] << 16) | (version[1] << 8) | (version[0]); + + // display gimbal model and firmware version to user + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "%s v%u.%u.%u", + send_message_prefix, + version[0], // major version + version[1], // minor version + version[2]); // patch version + + _got_gimbal_version = true; +} + +// gimbal model name message analysis +void AP_Mount_Topotek::gimbal_model_name_analyse() +{ + strncpy((char *)_model_name, (const char *)_msg_buff + 10, char_to_hex(_msg_buff[5])); + + // display gimbal model name to user + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "%s %s", send_message_prefix, _model_name); + + _got_gimbal_model_name = true; +} + +// calculate checksum +uint8_t AP_Mount_Topotek::calculate_crc(const uint8_t *cmd, uint8_t len) const +{ + uint8_t crc = 0; + for (uint16_t i = 0; i= data)) { + return (data + '0'); + } else { + return (data - 10 + 'A'); + } +} + +// convert a 4 character hex number to an integer +// the characters are in the format "1234" where the most significant digit is first +int16_t AP_Mount_Topotek::hexchar4_to_int16(char high, char mid_high, char mid_low, char low) const +{ + const int16_t value = (char_to_hex(high) << 12) | + (char_to_hex(mid_high) << 8) | + (char_to_hex(mid_low) << 4) | + (char_to_hex(low)); + + return value; +} + +// send a fixed length packet +bool AP_Mount_Topotek::send_fixedlen_packet(AddressByte address, const Identifier id, bool write, uint8_t value) +{ + uint8_t databuff[3]; + hal.util->snprintf((char *)databuff, ARRAY_SIZE(databuff), "%02x", value); + return send_variablelen_packet(HeaderType::FIXED_LEN, address, id, write, databuff, ARRAY_SIZE(databuff)-1); +} + +// send variable length packet +bool AP_Mount_Topotek::send_variablelen_packet(HeaderType header, AddressByte address, const Identifier id, bool write, const uint8_t* databuff, uint8_t databuff_len) +{ + // exit immediately if not initialised + if (!_initialised) { + return false; + } + + // calculate and sanity check packet size + const uint16_t packet_size = AP_MOUNT_TOPOTEK_PACKETLEN_MIN + databuff_len; + if (packet_size > AP_MOUNT_TOPOTEK_PACKETLEN_MAX) { + debug("send_packet data buff too large"); + return false; + } + + // check for sufficient space in outgoing buffer + if (_uart->txspace() < packet_size) { + debug("tx buffer full"); + return false; + } + + // create buffer for holding outgoing packet + uint8_t send_buff[packet_size]; + uint8_t send_buff_ofs = 0; + + // packet header (bytes 0 ~ 2) + send_buff[send_buff_ofs++] = '#'; + send_buff[send_buff_ofs++] = (header == HeaderType::FIXED_LEN) ? 'T' : 't'; + send_buff[send_buff_ofs++] = (header == HeaderType::FIXED_LEN) ? 'P' : 'p'; + + // address (bytes 3, 4) + send_buff[send_buff_ofs++] = (uint8_t)AddressByte::UART; + send_buff[send_buff_ofs++] = (uint8_t)address; + + // data length (byte 5) + send_buff[send_buff_ofs++] = hex2char(databuff_len); + + // control byte (byte 6) + send_buff[send_buff_ofs++] = write ? (uint8_t)ControlByte::WRITE : (uint8_t)ControlByte::READ; + + // identified (bytes 7 ~ 9) + send_buff[send_buff_ofs++] = id[0]; + send_buff[send_buff_ofs++] = id[1]; + send_buff[send_buff_ofs++] = id[2]; + + // data + if (databuff_len != 0) { + memcpy(&send_buff[send_buff_ofs], databuff, databuff_len); + send_buff_ofs += databuff_len; + } + + // crc + uint8_t crc = calculate_crc(send_buff, send_buff_ofs); + send_buff[send_buff_ofs++] = hex2char((crc >> 4) & 0x0f); + send_buff[send_buff_ofs++] = hex2char(crc & 0x0f); + + // send packet + _uart->write(send_buff, send_buff_ofs); + return true; +} + +// set gimbal's lock vs follow mode +// lock should be true if gimbal should maintain an earth-frame target +// lock is false to follow / maintain a body-frame target +bool AP_Mount_Topotek::set_gimbal_lock(bool lock) +{ + if (_last_lock == lock) { + return true; + } + + // send message and update lock state + if (send_fixedlen_packet(AddressByte::GIMBAL, AP_MOUNT_TOPOTEK_ID3CHAR_GIMBAL_MODE, true, lock ? 6 : 7)) { + _last_lock = lock; + return true; + } + return false; +} + +#endif // HAL_MOUNT_TOPOTEK_ENABLED diff --git a/libraries/AP_Mount/AP_Mount_Topotek.h b/libraries/AP_Mount/AP_Mount_Topotek.h new file mode 100755 index 0000000000..3d52f0ff62 --- /dev/null +++ b/libraries/AP_Mount/AP_Mount_Topotek.h @@ -0,0 +1,285 @@ +/* + Topotek gimbal driver using custom serial protocol + + Packet format (courtesy of Topotek's SDK document) + + ------------------------------------------------------------------------------------------- + Field Index Bytes Description + ------------------------------------------------------------------------------------------- + Frame Header 0 3 type of command + Address Bit 3 2 the source address comes first, and the destination address comes last + Data_Len 5 1 data length + Control Bit 6 1 r -> query w -> setup and control + Identification Bit 7 3 identification function + Data 10 Data_Len + Check Bit 2 the frame header is converted to HEX before reaching the check bit, + the sum is done, and the result is converted to ASC-II. Two bytes, the high one first + */ + +#pragma once + +#include "AP_Mount_config.h" + +#if HAL_MOUNT_TOPOTEK_ENABLED + +#include "AP_Mount_Backend_Serial.h" +#include +#include +#include + +#define AP_MOUNT_TOPOTEK_PACKETLEN_MAX 36 // maximum number of bytes in a packet sent to or received from the gimbal +#define AP_MOUNT_RECV_GIMBAL_CMD_CATEGORIES_NUM 7 // parse the number of gimbal command types + +class AP_Mount_Topotek : public AP_Mount_Backend_Serial +{ + +public: + // Constructor + using AP_Mount_Backend_Serial::AP_Mount_Backend_Serial; + + // Do not allow copies + CLASS_NO_COPY(AP_Mount_Topotek); + + // update mount position - should be called periodically + void update() override; + + // return true if healthy + bool healthy() const override; + + // has_pan_control - returns true if this mount can control its pan (required for multicopters) + bool has_pan_control() const override { return yaw_range_valid(); }; + + // + // camera controls for gimbals + // + + // take a picture. returns true on success + bool take_picture() override; + + // start or stop video recording + // set start_recording = true to start record, false to stop recording + bool record_video(bool start_recording) override; + + // set zoom specified as a rate + bool set_zoom(ZoomType zoom_type, float zoom_value) override; + + // set focus specified as rate or auto + // focus in = -1, focus hold = 0, focus out = 1 + SetFocusResult set_focus(FocusType focus_type, float focus_value) override; + + // set tracking to none, point or rectangle (see TrackingType enum) + // if POINT only p1 is used, if RECTANGLE then p1 is top-left, p2 is bottom-right + // p1,p2 are in range 0 to 1. 0 is left or top, 1 is right or bottom + bool set_tracking(TrackingType tracking_type, const Vector2f& p1, const Vector2f& p2) override; + + // send command to gimbal to cancel tracking (if necessary) + // returns true on success, false on failure to send message + bool cancel_tracking(); + + // set camera picture-in-picture mode + bool set_lens(uint8_t lens) override; + +#if HAL_MOUNT_SET_CAMERA_SOURCE_ENABLED + // set_camera_source is functionally the same as set_lens except primary and secondary lenses are specified by type + // primary and secondary sources use the AP_Camera::CameraSource enum cast to uint8_t + bool set_camera_source(uint8_t primary_source, uint8_t secondary_source) override; +#endif + + // send camera information message to GCS + void send_camera_information(mavlink_channel_t chan) const override; + + // send camera settings message to GCS + void send_camera_settings(mavlink_channel_t chan) const override; + + // + // rangefinder + // + + // get rangefinder distance. Returns true on success + bool get_rangefinder_distance(float& distance_m) const override; + + // enable/disable rangefinder. Returns true on success + bool set_rangefinder_enable(bool enable) override; + +protected: + + // get attitude as a quaternion. returns true on success + bool get_attitude_quaternion(Quaternion& att_quat) override; + +private: + + // header type (fixed or variable length) + // first three bytes of packet determined by this value + enum class HeaderType : uint8_t { + FIXED_LEN = 0x00, // #TP will be sent + VARIABLE_LEN = 0x01, // #tp will be sent + }; + + // address (2nd and 3rd bytes of packet) + // first byte is always U followed by one of the other options + enum class AddressByte : uint8_t { + SYSTEM_AND_IMAGE = 68, // 'D' + AUXILIARY_EQUIPMENT = 69, // 'E' + GIMBAL = 71, // 'G' + LENS = 77, // 'M' + NETWORK = 80, // 'P' + UART = 85, // 'U' + }; + + // control byte (read or write) + // sent as 7th byte of packet + enum class ControlByte : uint8_t { + READ = 114, // 'r' + WRITE = 119, // 'w' + }; + + // parsing state + enum class ParseState : uint8_t { + WAITING_FOR_HEADER1 = 0,// # + WAITING_FOR_HEADER2, // T or t + WAITING_FOR_HEADER3, // P or p + WAITING_FOR_ADDR1, // normally U + WAITING_FOR_ADDR2, // M, D, E, P, G + WAITING_FOR_DATALEN, + WAITING_FOR_CONTROL, // r or w + WAITING_FOR_ID1, // e.g. 'G' + WAITING_FOR_ID2, // e.g. 'A' + WAITING_FOR_ID3, // e.g. 'C' + WAITING_FOR_DATA, // normally hex numbers in char form (e.g. '0A') + WAITING_FOR_CRC_LOW, + WAITING_FOR_CRC_HIGH, + }; + + // tracking status + enum class TrackingStatus : uint8_t { + STOPPED_TRACKING = 0x30, // not tracking + WAITING_FOR_TRACKING = 0x31, // wait to track command status + TRACKING_IN_PROGRESS = 0x32 // the status is being tracked. + }; + + // identifier bytes + typedef char Identifier[3]; + + // send text prefix string + static const char* send_message_prefix; + + // reading incoming packets from gimbal and confirm they are of the correct format + void read_incoming_packets(); + + // request gimbal attitude + void request_gimbal_attitude(); + + // request gimbal memory card information + void request_gimbal_sdcard_info(); + + // request gimbal tracking status + void request_track_status(); + + // request gimbal version + void request_gimbal_version(); + + // request gimbal model name + void request_gimbal_model_name(); + + // send angle target in radians to gimbal + void send_angle_target(const MountTarget& angle_rad); + + // send rate target in rad/s to gimbal + void send_rate_target(const MountTarget& rate_rads); + + // send time and date to gimbal + bool send_time_to_gimbal(); + + // send GPS-related information to the gimbal + bool send_location_info(); + + // attitude information analysis of gimbal + void gimbal_angle_analyse(); + + // gimbal video information analysis + void gimbal_record_analyse(); + + // information analysis of gimbal storage card + void gimbal_sdcard_analyse(); + + // gimbal tracking information analysis + void gimbal_track_analyse(); + + // gimbal basic information analysis + void gimbal_version_analyse(); + + // gimbal model name message analysis + void gimbal_model_name_analyse(); + + // gimbal distance information analysis + void gimbal_dist_info_analyse(); + + // calculate checksum + uint8_t calculate_crc(const uint8_t *cmd, uint8_t len) const; + + // hexadecimal to character conversion + uint8_t hex2char(uint8_t data) const; + + // convert a 4 character hex number to an integer + // the characters are in the format "1234" where the most significant digit is first + int16_t hexchar4_to_int16(char high, char mid_high, char mid_low, char low) const; + + // send a fixed length packet to gimbal + // returns true on success, false if serial port initialization failed + bool send_fixedlen_packet(AddressByte address, const Identifier id, bool write, uint8_t value); + + // send a variable length packet to gimbal + // returns true on success, false if serial port initialization failed + bool send_variablelen_packet(HeaderType header, AddressByte address, const Identifier id, bool write, const uint8_t* databuff, uint8_t databuff_len); + + // set gimbal's lock vs follow mode + // lock should be true if gimbal should maintain an earth-frame target + // lock is false to follow / maintain a body-frame target + bool set_gimbal_lock(bool lock); + + // members + bool _recording; // recording status (received from gimbal) + bool _is_tracking; // whether to enable the tracking state + TrackingStatus _last_tracking_state = TrackingStatus::STOPPED_TRACKING; // last tracking state received from gimbal + uint8_t _last_mode; // mode during latest update, used to detect mode changes and cancel tracking + bool _sdcard_status; // memory card status (received from gimbal) + bool _last_lock; // last lock mode sent to gimbal + bool _got_gimbal_version; // true if gimbal's version has been received + bool _got_gimbal_model_name; // true if gimbal's model name has been received + bool _last_zoom_stop; // true if zoom has been stopped (used to re-send in order to handle lost packets) + bool _last_focus_stop; // true if focus has been stopped (used to re-sent in order to handle lost packets) + uint8_t _model_name[16]; // gimbal model name + uint8_t _sent_time_count; // count of current time messages sent to gimbal + uint32_t _firmware_ver; // firmware version + Vector3f _current_angle_rad; // current angles in radians received from gimbal (x=roll, y=pitch, z=yaw) + uint32_t _last_current_angle_ms; // system time (in milliseconds) that angle information received from the gimbal + uint32_t _last_req_current_info_ms; // system time that this driver last requested current gimbal infomation + uint8_t _last_req_step; // 10hz request loop step (different requests are sent at various steps) + uint8_t _stop_order_count; // number of stop commands sent since target rates became zero + float _measure_dist_m = -1.0f; // latest rangefinder distance (in meters) + uint8_t _msg_buff[AP_MOUNT_TOPOTEK_PACKETLEN_MAX]; // buffer holding bytes from latest packet received. only used to calculate crc + uint8_t _msg_buff_len; // number of bytes in the msg buffer + struct { + ParseState state; // parser state + uint8_t data_len; // expected number of data bytes + } _parser; + + // mapping from received message key to member function pointer to consume the message + typedef struct { + uint8_t uart_cmd_key[4]; // gimbal message key; + void (AP_Mount_Topotek::*func)(void); // member function to consume messager + } UartCmdFunctionHandler; + + // stores command ID and corresponding member functions that are compared with the command received by the gimbal + UartCmdFunctionHandler uart_recv_cmd_compare_list[AP_MOUNT_RECV_GIMBAL_CMD_CATEGORIES_NUM] = { + {{"GAC"}, &AP_Mount_Topotek::gimbal_angle_analyse}, + {{"REC"}, &AP_Mount_Topotek::gimbal_record_analyse}, + {{"SDC"}, &AP_Mount_Topotek::gimbal_sdcard_analyse}, + {{"LRF"}, &AP_Mount_Topotek::gimbal_dist_info_analyse}, + {{"TRC"}, &AP_Mount_Topotek::gimbal_track_analyse}, + {{"VSN"}, &AP_Mount_Topotek::gimbal_version_analyse}, + {{"PA2"}, &AP_Mount_Topotek::gimbal_model_name_analyse} + }; +}; + +#endif // HAL_MOUNT_TOPOTEK_ENABLED diff --git a/libraries/AP_Mount/AP_Mount_config.h b/libraries/AP_Mount/AP_Mount_config.h index 0a6d38671c..a2da37fac5 100644 --- a/libraries/AP_Mount/AP_Mount_config.h +++ b/libraries/AP_Mount/AP_Mount_config.h @@ -7,7 +7,9 @@ #define HAL_MOUNT_ENABLED 1 #endif +#ifndef AP_MOUNT_BACKEND_DEFAULT_ENABLED #define AP_MOUNT_BACKEND_DEFAULT_ENABLED HAL_MOUNT_ENABLED +#endif #ifndef HAL_MOUNT_ALEXMOS_ENABLED #define HAL_MOUNT_ALEXMOS_ENABLED AP_MOUNT_BACKEND_DEFAULT_ENABLED @@ -54,6 +56,10 @@ #define AP_MOUNT_POI_TO_LATLONALT_ENABLED HAL_MOUNT_ENABLED && AP_TERRAIN_AVAILABLE && BOARD_FLASH_SIZE > 1024 #endif +#ifndef HAL_MOUNT_TOPOTEK_ENABLED +#define HAL_MOUNT_TOPOTEK_ENABLED AP_MOUNT_BACKEND_DEFAULT_ENABLED +#endif + // set camera source is supported on gimbals that may have more than one lens #ifndef HAL_MOUNT_SET_CAMERA_SOURCE_ENABLED #define HAL_MOUNT_SET_CAMERA_SOURCE_ENABLED HAL_MOUNT_SIYI_ENABLED || HAL_MOUNT_XACTI_ENABLED || HAL_MOUNT_VIEWPRO_ENABLED diff --git a/libraries/AP_Mount/SoloGimbal.cpp b/libraries/AP_Mount/SoloGimbal.cpp index 4503c02cec..eba243eaba 100644 --- a/libraries/AP_Mount/SoloGimbal.cpp +++ b/libraries/AP_Mount/SoloGimbal.cpp @@ -245,7 +245,7 @@ void SoloGimbal::update_fast() { // single gyro mode - one of the first two gyros are unhealthy or don't exist // just read primary gyro Vector3f dAng; - readVehicleDeltaAngle(ins.get_primary_gyro(), dAng); + readVehicleDeltaAngle(ins.get_first_usable_gyro(), dAng); _vehicle_delta_angles += dAng; } } diff --git a/libraries/AP_NavEKF/AP_NavEKF_Source.cpp b/libraries/AP_NavEKF/AP_NavEKF_Source.cpp index 2805bb81fb..72e55a9657 100644 --- a/libraries/AP_NavEKF/AP_NavEKF_Source.cpp +++ b/libraries/AP_NavEKF/AP_NavEKF_Source.cpp @@ -135,7 +135,7 @@ const AP_Param::GroupInfo AP_NavEKF_Source::var_info[] = { // @Param: _OPTIONS // @DisplayName: EKF Source Options // @Description: EKF Source Options - // @Bitmask: 0:FuseAllVelocities + // @Bitmask: 0:FuseAllVelocities, 1:AlignExtNavPosWhenUsingOptFlow // @User: Advanced AP_GROUPINFO("_OPTIONS", 16, AP_NavEKF_Source, _options, (int16_t)SourceOptions::FUSE_ALL_VELOCITIES), @@ -257,11 +257,12 @@ void AP_NavEKF_Source::align_inactive_sources() return; } - // consider aligning XY position: + // consider aligning ExtNav XY position: bool align_posxy = false; if ((getPosXYSource() == SourceXY::GPS) || - (getPosXYSource() == SourceXY::BEACON)) { - // only align position if active source is GPS or Beacon + (getPosXYSource() == SourceXY::BEACON) || + ((getVelXYSource() == SourceXY::OPTFLOW) && option_is_set(SourceOptions::ALIGN_EXTNAV_POS_WHEN_USING_OPTFLOW))) { + // align ExtNav position if active source is GPS, Beacon or (optionally) Optflow for (uint8_t i=0; ihas_orientation(ROTATION_PITCH_270))) { - hal.util->snprintf(failure_msg, failure_msg_len, ekf_requires_msg, "RangeFinder"); - return false; + if (rangefinder_required) { +#if AP_RANGEFINDER_ENABLED + const bool have_rangefinder = (dal.rangefinder() != nullptr && dal.rangefinder()->has_orientation(ROTATION_PITCH_270)); +#else + const bool have_rangefinder = false; +#endif + if (!have_rangefinder) { + hal.util->snprintf(failure_msg, failure_msg_len, ekf_requires_msg, "RangeFinder"); + return false; + } } if (visualodom_required) { diff --git a/libraries/AP_NavEKF/AP_NavEKF_Source.h b/libraries/AP_NavEKF/AP_NavEKF_Source.h index b8bfa67d18..bbb1d9067f 100644 --- a/libraries/AP_NavEKF/AP_NavEKF_Source.h +++ b/libraries/AP_NavEKF/AP_NavEKF_Source.h @@ -47,7 +47,8 @@ public: // enum for OPTIONS parameter enum class SourceOptions { - FUSE_ALL_VELOCITIES = (1 << 0) // fuse all velocities configured in source sets + FUSE_ALL_VELOCITIES = (1 << 0), // fuse all velocities configured in source sets + ALIGN_EXTNAV_POS_WHEN_USING_OPTFLOW = (1 << 1) // align position of inactive sources to ahrs when using optical flow }; // initialisation @@ -118,6 +119,9 @@ private: AP_Enum yaw; // yaw source } _source_set[AP_NAKEKF_SOURCE_SET_MAX]; + // helper to check if an option parameter bit has been set + bool option_is_set(SourceOptions option) const { return (_options.get() & int16_t(option)) != 0; } + AP_Int16 _options; // source options bitmask uint8_t active_source_set; // index of active source set diff --git a/libraries/AP_NavEKF2/AP_NavEKF2.h b/libraries/AP_NavEKF2/AP_NavEKF2.h index ebb4e64981..f15726f735 100644 --- a/libraries/AP_NavEKF2/AP_NavEKF2.h +++ b/libraries/AP_NavEKF2/AP_NavEKF2.h @@ -443,15 +443,6 @@ private: NO_SETUP, NUM_INIT_FAILURES }; - // initialization failure reasons - const char* initFailureReason[int(InitFailures::NUM_INIT_FAILURES)] { - "EKF2: unknown initialization failure", - "EKF2: EK2_enable is false", - "EKF2: no IMUs available", - "EKF2: EK2_IMU_MASK is zero", - "EKF2: insufficient memory available", - "EKF2: core setup failed" - }; InitFailures initFailure; // update the yaw reset data to capture changes due to a lane switch diff --git a/libraries/AP_NavEKF2/AP_NavEKF2_Measurements.cpp b/libraries/AP_NavEKF2/AP_NavEKF2_Measurements.cpp index 33f822b717..009a59f358 100644 --- a/libraries/AP_NavEKF2/AP_NavEKF2_Measurements.cpp +++ b/libraries/AP_NavEKF2/AP_NavEKF2_Measurements.cpp @@ -5,6 +5,8 @@ #include #include +#if AP_RANGEFINDER_ENABLED + extern const AP_HAL::HAL& hal; @@ -110,6 +112,7 @@ void NavEKF2_core::readRangeFinder(void) } } } +#endif // write the raw optical flow measurements // this needs to be called externally. @@ -335,13 +338,13 @@ void NavEKF2_core::readIMUData() if (ins.use_accel(imu_index)) { accel_active = imu_index; } else { - accel_active = ins.get_primary_accel(); + accel_active = ins.get_first_usable_accel(); } if (ins.use_gyro(imu_index)) { gyro_active = imu_index; } else { - gyro_active = ins.get_primary_gyro(); + gyro_active = ins.get_first_usable_gyro(); } if (gyro_active != gyro_index_active) { diff --git a/libraries/AP_NavEKF2/AP_NavEKF2_Outputs.cpp b/libraries/AP_NavEKF2/AP_NavEKF2_Outputs.cpp index 32820bd9dd..6d5937dd22 100644 --- a/libraries/AP_NavEKF2/AP_NavEKF2_Outputs.cpp +++ b/libraries/AP_NavEKF2/AP_NavEKF2_Outputs.cpp @@ -60,12 +60,16 @@ bool NavEKF2_core::getHeightControlLimit(float &height) const // only ask for limiting if we are doing optical flow only navigation if (frontend->_fusionModeGPS == 3 && (PV_AidingMode == AID_RELATIVE) && flowDataValid) { // If are doing optical flow nav, ensure the height above ground is within range finder limits after accounting for vehicle tilt and control errors +#if AP_RANGEFINDER_ENABLED const auto *_rng = dal.rangefinder(); if (_rng == nullptr) { // we really, really shouldn't be here. return false; } height = MAX(float(_rng->max_distance_cm_orient(ROTATION_PITCH_270)) * 0.007f - 1.0f, 1.0f); +#else + return false; +#endif // If we are are not using the range finder as the height reference, then compensate for the difference between terrain and EKF origin if (frontend->_altSource != 1) { height -= terrainState; diff --git a/libraries/AP_NavEKF2/AP_NavEKF2_PosVelFusion.cpp b/libraries/AP_NavEKF2/AP_NavEKF2_PosVelFusion.cpp index 3e7b99ee34..debcaaf2c2 100644 --- a/libraries/AP_NavEKF2/AP_NavEKF2_PosVelFusion.cpp +++ b/libraries/AP_NavEKF2/AP_NavEKF2_PosVelFusion.cpp @@ -942,6 +942,7 @@ void NavEKF2_core::FuseVelPosNED() // select the height measurement to be fused from the available baro, range finder and GPS sources void NavEKF2_core::selectHeightForFusion() { +#if AP_RANGEFINDER_ENABLED // Read range finder data and check for new data in the buffer // This data is used by both height and optical flow fusion processing readRangeFinder(); @@ -961,6 +962,7 @@ void NavEKF2_core::selectHeightForFusion() } } } +#endif // read baro height data from the sensor and check for new data in the buffer readBaroData(); @@ -971,6 +973,7 @@ void NavEKF2_core::selectHeightForFusion() if (extNavUsedForPos) { // always use external navigation as the height source if using for position. activeHgtSource = HGT_SOURCE_EXTNAV; +#if AP_RANGEFINDER_ENABLED } else if ((frontend->_altSource == 1) && _rng && rangeFinderDataIsFresh) { // user has specified the range finder as a primary height source activeHgtSource = HGT_SOURCE_RNG; @@ -1004,6 +1007,7 @@ void NavEKF2_core::selectHeightForFusion() // reliable terrain and range finder so start using range finder height activeHgtSource = HGT_SOURCE_RNG; } +#endif // AP_RANGEFINDER_ENABLED } else if (frontend->_altSource == 0) { activeHgtSource = HGT_SOURCE_BARO; } else if ((frontend->_altSource == 2) && ((imuSampleTime_ms - lastTimeGpsReceived_ms) < 500) && validOrigin && gpsAccuracyGood) { diff --git a/libraries/AP_NavEKF2/AP_NavEKF2_core.cpp b/libraries/AP_NavEKF2/AP_NavEKF2_core.cpp index e8c35d768a..caf78f8745 100644 --- a/libraries/AP_NavEKF2/AP_NavEKF2_core.cpp +++ b/libraries/AP_NavEKF2/AP_NavEKF2_core.cpp @@ -243,9 +243,11 @@ void NavEKF2_core::InitialiseVariables() delAngBiasLearned = false; memset(&filterStatus, 0, sizeof(filterStatus)); activeHgtSource = 0; +#if AP_RANGEFINDER_ENABLED memset(&rngMeasIndex, 0, sizeof(rngMeasIndex)); memset(&storedRngMeasTime_ms, 0, sizeof(storedRngMeasTime_ms)); memset(&storedRngMeas, 0, sizeof(storedRngMeas)); +#endif terrainHgtStable = true; ekfOriginHgtVar = 0.0f; ekfGpsRefHgt = 0.0; diff --git a/libraries/AP_NavEKF2/AP_NavEKF2_core.h b/libraries/AP_NavEKF2/AP_NavEKF2_core.h index d9f0adb2ce..fcb48be5cc 100644 --- a/libraries/AP_NavEKF2/AP_NavEKF2_core.h +++ b/libraries/AP_NavEKF2/AP_NavEKF2_core.h @@ -70,12 +70,14 @@ #endif // maximum number of downward facing rangefinder instances available +#if AP_RANGEFINDER_ENABLED #if RANGEFINDER_MAX_INSTANCES > 1 #define DOWNWARD_RANGEFINDER_MAX_INSTANCES 2 #else #define DOWNWARD_RANGEFINDER_MAX_INSTANCES 1 #endif - +#endif + class AP_AHRS; class NavEKF2_core : public NavEKF_core_common @@ -700,9 +702,11 @@ private: // update inflight calculaton that determines if GPS data is good enough for reliable navigation void calcGpsGoodForFlight(void); +#if AP_RANGEFINDER_ENABLED // Read the range finder and take new measurements if available // Apply a median filter to range finder data void readRangeFinder(); +#endif // check if the vehicle has taken off during optical flow navigation by looking at inertial and range finder data void detectOptFlowTakeoff(void); @@ -1014,9 +1018,11 @@ private: ftype rngOnGnd; // Expected range finder reading in metres when vehicle is on ground uint32_t lastRngMeasTime_ms; // Timestamp of last range measurement bool terrainHgtStable; // true when the terrain height is stable enough to be used as a height reference +#if AP_RANGEFINDER_ENABLED ftype storedRngMeas[DOWNWARD_RANGEFINDER_MAX_INSTANCES][3]; // Ringbuffer of stored range measurements for dual range sensors uint32_t storedRngMeasTime_ms[DOWNWARD_RANGEFINDER_MAX_INSTANCES][3]; // Ringbuffers of stored range measurement times for dual range sensors uint8_t rngMeasIndex[DOWNWARD_RANGEFINDER_MAX_INSTANCES]; // Current range measurement ringbuffer index for dual range sensors +#endif // Range Beacon Sensor Fusion EKF_obs_buffer_t storedRangeBeacon; // Beacon range buffer diff --git a/libraries/AP_NavEKF3/AP_NavEKF3_Control.cpp b/libraries/AP_NavEKF3/AP_NavEKF3_Control.cpp index 2f85854872..0ba289cd9b 100644 --- a/libraries/AP_NavEKF3/AP_NavEKF3_Control.cpp +++ b/libraries/AP_NavEKF3/AP_NavEKF3_Control.cpp @@ -668,6 +668,20 @@ bool NavEKF3_core::setOriginLLH(const Location &loc) return setOrigin(loc); } +// populates the Earth magnetic field table using the given location +void NavEKF3_core::setEarthFieldFromLocation(const Location &loc) +{ + const auto &compass = dal.compass(); + if (compass.have_scale_factor(magSelectIndex) && + compass.auto_declination_enabled()) { + getEarthFieldTable(loc); + if (frontend->_mag_ef_limit > 0) { + // initialise earth field from tables + stateStruct.earth_magfield = table_earth_field_ga; + } + } +} + // sets the local NED origin using a LLH location (latitude, longitude, height) // returns false is the origin has already been set bool NavEKF3_core::setOrigin(const Location &loc) @@ -682,6 +696,13 @@ bool NavEKF3_core::setOrigin(const Location &loc) // define Earth rotation vector in the NED navigation frame at the origin calcEarthRateNED(earthRateNED, EKF_origin.lat); validOrigin = true; + + // but we do want to populate the WMM table even if we don't have a GPS at all + if (!stateStruct.quat.is_zero()) { + alignMagStateDeclination(); + setEarthFieldFromLocation(EKF_origin); + } + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "EKF3 IMU%u origin set",(unsigned)imu_index); if (!frontend->common_origin_valid) { diff --git a/libraries/AP_NavEKF3/AP_NavEKF3_Logging.cpp b/libraries/AP_NavEKF3/AP_NavEKF3_Logging.cpp index 726b091b3e..8a351d75b1 100644 --- a/libraries/AP_NavEKF3/AP_NavEKF3_Logging.cpp +++ b/libraries/AP_NavEKF3/AP_NavEKF3_Logging.cpp @@ -102,7 +102,8 @@ void NavEKF3_core::Log_Write_XKFS(uint64_t time_us) const airspeed_index : getActiveAirspeed(), source_set : frontend->sources.getPosVelYawSourceSet(), gps_good_to_align : gpsGoodToAlign, - wait_for_gps_checks : waitingForGpsChecks + wait_for_gps_checks : waitingForGpsChecks, + mag_fusion: (uint8_t) magFusionSel }; AP::logger().WriteBlock(&pkt, sizeof(pkt)); } @@ -164,11 +165,11 @@ void NavEKF3_core::Log_Write_XKF4(uint64_t time_us) const LOG_PACKET_HEADER_INIT(LOG_XKF4_MSG), time_us : time_us, core : DAL_CORE(core_index), - sqrtvarV : (int16_t)(100*velVar), - sqrtvarP : (int16_t)(100*posVar), - sqrtvarH : (int16_t)(100*hgtVar), - sqrtvarM : (int16_t)(100*tempVar), - sqrtvarVT : (int16_t)(100*tasVar), + sqrtvarV : (uint16_t)(100*velVar), + sqrtvarP : (uint16_t)(100*posVar), + sqrtvarH : (uint16_t)(100*hgtVar), + sqrtvarM : (uint16_t)(100*tempVar), + sqrtvarVT : (uint16_t)(100*tasVar), tiltErr : sqrtF(MAX(tiltErrorVariance,0.0f)), // estimated 1-sigma tilt error in radians offsetNorth : offset.x, offsetEast : offset.y, diff --git a/libraries/AP_NavEKF3/AP_NavEKF3_MagFusion.cpp b/libraries/AP_NavEKF3/AP_NavEKF3_MagFusion.cpp index 402cfd9786..67ac2a5794 100644 --- a/libraries/AP_NavEKF3/AP_NavEKF3_MagFusion.cpp +++ b/libraries/AP_NavEKF3/AP_NavEKF3_MagFusion.cpp @@ -62,9 +62,15 @@ void NavEKF3_core::controlMagYawReset() bool finalResetRequest = false; bool interimResetRequest = false; if (flightResetAllowed && !assume_zero_sideslip()) { +#if APM_BUILD_TYPE(APM_BUILD_ArduSub) + // for sub, we'd like to be far enough away from metal structures like docks and vessels + // diving 0.5m is reasonable for both open water and pools + finalResetRequest = (stateStruct.position.z - posDownAtTakeoff) > EKF3_MAG_FINAL_RESET_ALT_SUB; +#else // check that we have reached a height where ground magnetic interference effects are insignificant // and can perform a final reset of the yaw and field states finalResetRequest = (stateStruct.position.z - posDownAtTakeoff) < -EKF3_MAG_FINAL_RESET_ALT; +#endif // check for increasing height bool hgtIncreasing = (posDownAtLastMagReset-stateStruct.position.z) > 0.5f; @@ -288,6 +294,7 @@ void NavEKF3_core::SelectMagFusion() have_fused_gps_yaw = true; lastSynthYawTime_ms = imuSampleTime_ms; last_gps_yaw_fuse_ms = imuSampleTime_ms; + recordYawResetsCompleted(); } else if (tiltAlignComplete && yawAlignComplete) { have_fused_gps_yaw = fuseEulerYaw(yawFusionMethod::GPS); if (have_fused_gps_yaw) { @@ -419,12 +426,14 @@ void NavEKF3_core::SelectMagFusion() if (dataReady) { // use the simple method of declination to maintain heading if we cannot use the magnetic field states if(inhibitMagStates || magStateResetRequest || !magStateInitComplete) { + magFusionSel = MagFuseSel::FUSE_YAW; fuseEulerYaw(yawFusionMethod::MAGNETOMETER); // zero the test ratio output from the inactive 3-axis magnetometer fusion magTestRatio.zero(); } else { + magFusionSel = MagFuseSel::FUSE_MAG; // if we are not doing aiding with earth relative observations (eg GPS) then the declination is // maintained by fusing declination as a synthesised observation // We also fuse declination if we are using the WMM tables diff --git a/libraries/AP_NavEKF3/AP_NavEKF3_Measurements.cpp b/libraries/AP_NavEKF3/AP_NavEKF3_Measurements.cpp index b5a933645c..f635c185af 100644 --- a/libraries/AP_NavEKF3/AP_NavEKF3_Measurements.cpp +++ b/libraries/AP_NavEKF3/AP_NavEKF3_Measurements.cpp @@ -6,6 +6,7 @@ #include #include +#if AP_RANGEFINDER_ENABLED /******************************************************** * OPT FLOW AND RANGE FINDER * ********************************************************/ @@ -105,6 +106,7 @@ void NavEKF3_core::readRangeFinder(void) } } } +#endif // AP_RANGEFINDER_ENABLED void NavEKF3_core::writeBodyFrameOdom(float quality, const Vector3f &delPos, const Vector3f &delAng, float delTime, uint32_t timeStamp_ms, uint16_t delay_ms, const Vector3f &posOffset) { @@ -372,7 +374,7 @@ void NavEKF3_core::readMagData() * Downsampling is done using a method that does not introduce coning or sculling * errors. */ -void NavEKF3_core::readIMUData() +void NavEKF3_core::readIMUData(bool startPredictEnabled) { const auto &ins = dal.ins(); @@ -387,13 +389,13 @@ void NavEKF3_core::readIMUData() if (ins.use_accel(imu_index)) { accel_active = imu_index; } else { - accel_active = ins.get_primary_accel(); + accel_active = ins.get_first_usable_accel(); } if (ins.use_gyro(imu_index)) { gyro_active = imu_index; } else { - gyro_active = ins.get_primary_gyro(); + gyro_active = ins.get_first_usable_gyro(); } if (gyro_active != gyro_index_active) { @@ -690,15 +692,7 @@ void NavEKF3_core::readGpsData() } if (gpsGoodToAlign && !have_table_earth_field) { - const auto &compass = dal.compass(); - if (compass.have_scale_factor(magSelectIndex) && - compass.auto_declination_enabled()) { - getEarthFieldTable(gpsloc); - if (frontend->_mag_ef_limit > 0) { - // initialise earth field from tables - stateStruct.earth_magfield = table_earth_field_ga; - } - } + setEarthFieldFromLocation(gpsloc); } // convert GPS measurements to local NED and save to buffer to be fused later if we have a valid origin diff --git a/libraries/AP_NavEKF3/AP_NavEKF3_Outputs.cpp b/libraries/AP_NavEKF3/AP_NavEKF3_Outputs.cpp index 48f7016851..9316b36efe 100644 --- a/libraries/AP_NavEKF3/AP_NavEKF3_Outputs.cpp +++ b/libraries/AP_NavEKF3/AP_NavEKF3_Outputs.cpp @@ -68,12 +68,16 @@ bool NavEKF3_core::getHeightControlLimit(float &height) const // only ask for limiting if we are doing optical flow navigation if (frontend->sources.useVelXYSource(AP_NavEKF_Source::SourceXY::OPTFLOW) && (PV_AidingMode == AID_RELATIVE) && flowDataValid) { // If are doing optical flow nav, ensure the height above ground is within range finder limits after accounting for vehicle tilt and control errors +#if AP_RANGEFINDER_ENABLED const auto *_rng = dal.rangefinder(); if (_rng == nullptr) { // we really, really shouldn't be here. return false; } height = MAX(float(_rng->max_distance_cm_orient(ROTATION_PITCH_270)) * 0.007f - 1.0f, 1.0f); +#else + return false; +#endif // If we are are not using the range finder as the height reference, then compensate for the difference between terrain and EKF origin if (frontend->sources.getPosZSource() != AP_NavEKF_Source::SourceZ::RANGEFINDER) { height -= terrainState; diff --git a/libraries/AP_NavEKF3/AP_NavEKF3_PosVelFusion.cpp b/libraries/AP_NavEKF3/AP_NavEKF3_PosVelFusion.cpp index e995a9e30c..d2887c8fdc 100644 --- a/libraries/AP_NavEKF3/AP_NavEKF3_PosVelFusion.cpp +++ b/libraries/AP_NavEKF3/AP_NavEKF3_PosVelFusion.cpp @@ -1128,6 +1128,7 @@ void NavEKF3_core::FuseVelPosNED() // select the height measurement to be fused from the available baro, range finder and GPS sources void NavEKF3_core::selectHeightForFusion() { +#if AP_RANGEFINDER_ENABLED // Read range finder data and check for new data in the buffer // This data is used by both height and optical flow fusion processing readRangeFinder(); @@ -1147,6 +1148,7 @@ void NavEKF3_core::selectHeightForFusion() } } } +#endif // AP_RANGEFINDER_ENABLED // read baro height data from the sensor and check for new data in the buffer readBaroData(); @@ -1160,6 +1162,7 @@ void NavEKF3_core::selectHeightForFusion() if ((frontend->sources.getPosZSource() == AP_NavEKF_Source::SourceZ::NONE)) { // user has specified no height sensor activeHgtSource = AP_NavEKF_Source::SourceZ::NONE; +#if AP_RANGEFINDER_ENABLED } else if ((frontend->sources.getPosZSource() == AP_NavEKF_Source::SourceZ::RANGEFINDER) && _rng && rangeFinderDataIsFresh) { // user has specified the range finder as a primary height source activeHgtSource = AP_NavEKF_Source::SourceZ::RANGEFINDER; @@ -1201,6 +1204,7 @@ void NavEKF3_core::selectHeightForFusion() // reliable terrain and range finder so start using range finder height activeHgtSource = AP_NavEKF_Source::SourceZ::RANGEFINDER; } +#endif } else if (frontend->sources.getPosZSource() == AP_NavEKF_Source::SourceZ::BARO) { activeHgtSource = AP_NavEKF_Source::SourceZ::BARO; } else if ((frontend->sources.getPosZSource() == AP_NavEKF_Source::SourceZ::GPS) && ((imuSampleTime_ms - lastTimeGpsReceived_ms) < 500) && validOrigin && gpsAccuracyGood) { diff --git a/libraries/AP_NavEKF3/AP_NavEKF3_VehicleStatus.cpp b/libraries/AP_NavEKF3/AP_NavEKF3_VehicleStatus.cpp index e6876b07a4..bb43be9883 100644 --- a/libraries/AP_NavEKF3/AP_NavEKF3_VehicleStatus.cpp +++ b/libraries/AP_NavEKF3/AP_NavEKF3_VehicleStatus.cpp @@ -383,6 +383,17 @@ void NavEKF3_core::detectFlight() } if (!onGround) { +#if APM_BUILD_TYPE(APM_BUILD_ArduSub) + // If depth has increased since arming, then we definitely are diving + if ((stateStruct.position.z - posDownAtTakeoff) > 1.5f) { + inFlight = true; + } + + // If rangefinder has decreased since arming, then we definitely are diving + if ((rangeDataNew.rng - rngAtStartOfFlight) < -0.5f) { + inFlight = true; + } +#else // If height has increased since exiting on-ground, then we definitely are flying if ((stateStruct.position.z - posDownAtTakeoff) < -1.5f) { inFlight = true; @@ -392,6 +403,7 @@ void NavEKF3_core::detectFlight() if ((rangeDataNew.rng - rngAtStartOfFlight) > 0.5f) { inFlight = true; } +#endif // If more than 5 seconds since likely_flying was set // true, then set inFlight true diff --git a/libraries/AP_NavEKF3/AP_NavEKF3_core.cpp b/libraries/AP_NavEKF3/AP_NavEKF3_core.cpp index 008c9e2c01..e4934a3d96 100644 --- a/libraries/AP_NavEKF3/AP_NavEKF3_core.cpp +++ b/libraries/AP_NavEKF3/AP_NavEKF3_core.cpp @@ -131,10 +131,12 @@ bool NavEKF3_core::setup_core(uint8_t _imu_index, uint8_t _core_index) if(frontend->sources.gps_yaw_enabled() && !storedYawAng.init(obs_buffer_length)) { return false; } +#if AP_RANGEFINDER_ENABLED // Note: the use of dual range finders potentially doubles the amount of data to be stored if(dal.rangefinder() && !storedRange.init(MIN(2*obs_buffer_length , imu_buffer_length))) { return false; } +#endif // Note: range beacon data is read one beacon at a time and can arrive at a high rate #if EK3_FEATURE_BEACON_FUSION if(dal.beacon() && !rngBcn.storedRange.init(imu_buffer_length+1)) { @@ -338,9 +340,11 @@ void NavEKF3_core::InitialiseVariables() memset(&filterStatus, 0, sizeof(filterStatus)); activeHgtSource = AP_NavEKF_Source::SourceZ::BARO; prevHgtSource = activeHgtSource; +#if EK3_FEATURE_RANGEFINDER_MEASUREMENTS memset(&rngMeasIndex, 0, sizeof(rngMeasIndex)); memset(&storedRngMeasTime_ms, 0, sizeof(storedRngMeasTime_ms)); memset(&storedRngMeas, 0, sizeof(storedRngMeas)); +#endif terrainHgtStable = true; ekfOriginHgtVar = 0.0f; ekfGpsRefHgt = 0.0; @@ -390,7 +394,9 @@ void NavEKF3_core::InitialiseVariables() storedGPS.reset(); storedBaro.reset(); storedTAS.reset(); +#if EK3_FEATURE_RANGEFINDER_MEASUREMENTS storedRange.reset(); +#endif storedOutput.reset(); #if EK3_FEATURE_BEACON_FUSION rngBcn.storedRange.reset(); @@ -446,6 +452,7 @@ void NavEKF3_core::InitialiseVariablesMag() #endif needMagBodyVarReset = false; needEarthBodyVarReset = false; + magFusionSel = MagFuseSel::NOT_FUSING; } /* @@ -471,7 +478,7 @@ bool NavEKF3_core::InitialiseFilterBootstrap(void) } // read all the sensors required to start the EKF the states - readIMUData(); + readIMUData(false); // don't allow prediction readMagData(); readGpsData(); readGpsYawData(); @@ -613,9 +620,6 @@ void NavEKF3_core::CovarianceInit() // Update Filter States - this should be called whenever new IMU data is available void NavEKF3_core::UpdateFilter(bool predict) { - // Set the flag to indicate to the filter that the front-end has given permission for a new state prediction cycle to be started - startPredictEnabled = predict; - // don't run filter updates if states have not been initialised if (!statesInitialised) { return; @@ -632,7 +636,7 @@ void NavEKF3_core::UpdateFilter(bool predict) controlFilterModes(); // read IMU data as delta angles and velocities - readIMUData(); + readIMUData(predict); // Run the EKF equations to estimate at the fusion time horizon if new IMU data is available in the buffer if (runUpdates) { diff --git a/libraries/AP_NavEKF3/AP_NavEKF3_core.h b/libraries/AP_NavEKF3/AP_NavEKF3_core.h index 2049e7278f..29b7310119 100644 --- a/libraries/AP_NavEKF3/AP_NavEKF3_core.h +++ b/libraries/AP_NavEKF3/AP_NavEKF3_core.h @@ -60,6 +60,7 @@ // mag fusion final reset altitude (using NED frame so altitude is negative) #define EKF3_MAG_FINAL_RESET_ALT 2.5f +#define EKF3_MAG_FINAL_RESET_ALT_SUB 0.5f // learning rate for mag biases when using GPS yaw #define EK3_GPS_MAG_LEARN_RATE 0.005f @@ -109,11 +110,13 @@ #define WIND_VEL_VARIANCE_MIN 0.25f // maximum number of downward facing rangefinder instances available +#if EK3_FEATURE_RANGEFINDER_MEASUREMENTS #if RANGEFINDER_MAX_INSTANCES > 1 #define DOWNWARD_RANGEFINDER_MAX_INSTANCES 2 #else #define DOWNWARD_RANGEFINDER_MAX_INSTANCES 1 #endif +#endif // number of continuous valid GPS velocity samples required to reset yaw #define GPS_VEL_YAW_ALIGN_COUNT_THRESHOLD 5 @@ -232,6 +235,9 @@ public: // Returns true if the set was successful bool setLatLng(const Location &loc, float posAccuracy, uint32_t timestamp_ms); + // Popoluates the WMM data structure with the field at the given location + void setEarthFieldFromLocation(const Location &loc); + // return estimated height above ground level // return false if ground height is not being estimated. bool getHAGL(float &HAGL) const; @@ -421,6 +427,13 @@ public: // 6 was EXTERNAL_YAW_FALLBACK (do not use) }; + // magnetometer fusion selections + enum class MagFuseSel { + NOT_FUSING = 0, + FUSE_YAW = 1, + FUSE_MAG = 2 + }; + // are we using (aka fusing) a non-compass yaw? bool using_noncompass_for_yaw(void) const; @@ -760,7 +773,7 @@ private: void correctDeltaVelocity(Vector3F &delVel, ftype delVelDT, uint8_t accel_index); // update IMU delta angle and delta velocity measurements - void readIMUData(); + void readIMUData(bool startPredictEnabled); // update estimate of inactive bias states void learnInactiveBiases(); @@ -1050,7 +1063,9 @@ private: EKF_obs_buffer_t storedMag; // Magnetometer data buffer EKF_obs_buffer_t storedBaro; // Baro data buffer EKF_obs_buffer_t storedTAS; // TAS data buffer +#if EK3_FEATURE_RANGEFINDER_MEASUREMENTS EKF_obs_buffer_t storedRange; // Range finder data buffer +#endif EKF_IMU_buffer_t storedOutput;// output state buffer Matrix3F prevTnb; // previous nav to body transformation used for INS earth rotation compensation ftype accNavMag; // magnitude of navigation accel - used to adjust GPS obs variance (m/s^2) @@ -1185,7 +1200,6 @@ private: uint8_t magSelectIndex; // Index of the magnetometer that is being used by the EKF bool runUpdates; // boolean true when the EKF updates can be run uint32_t framesSincePredict; // number of frames lapsed since EKF instance did a state prediction - bool startPredictEnabled; // boolean true when the frontend has given permission to start a new state prediciton cycle uint8_t localFilterTimeStep_ms; // average number of msec between filter updates ftype posDownObsNoise; // observation noise variance on the vertical position used by the state and covariance update step (m^2) Vector3F delAngCorrected; // corrected IMU delta angle vector at the EKF time horizon (rad) @@ -1292,9 +1306,11 @@ private: ftype rngOnGnd; // Expected range finder reading in metres when vehicle is on ground uint32_t lastRngMeasTime_ms; // Timestamp of last range measurement bool terrainHgtStable; // true when the terrain height is stable enough to be used as a height reference +#if EK3_FEATURE_RANGEFINDER_MEASUREMENTS ftype storedRngMeas[DOWNWARD_RANGEFINDER_MAX_INSTANCES][3]; // Ringbuffer of stored range measurements for dual range sensors uint32_t storedRngMeasTime_ms[DOWNWARD_RANGEFINDER_MAX_INSTANCES][3]; // Ringbuffers of stored range measurement times for dual range sensors uint8_t rngMeasIndex[DOWNWARD_RANGEFINDER_MAX_INSTANCES]; // Current range measurement ringbuffer index for dual range sensors +#endif // body frame odometry fusion #if EK3_FEATURE_BODY_ODOM @@ -1417,6 +1433,7 @@ private: ftype posDownAtLastMagReset; // vertical position last time the mag states were reset (m) ftype yawInnovAtLastMagReset; // magnetic yaw innovation last time the yaw and mag field states were reset (rad) QuaternionF quatAtLastMagReset; // quaternion states last time the mag states were reset + MagFuseSel magFusionSel; // magnetometer fusion selection // Used by on ground movement check required when operating on ground without a yaw reference ftype gyro_diff; // filtered gyro difference (rad/s) diff --git a/libraries/AP_NavEKF3/AP_NavEKF3_feature.h b/libraries/AP_NavEKF3/AP_NavEKF3_feature.h index 3cd2bc3866..60500497d7 100644 --- a/libraries/AP_NavEKF3/AP_NavEKF3_feature.h +++ b/libraries/AP_NavEKF3/AP_NavEKF3_feature.h @@ -35,3 +35,8 @@ #ifndef EK3_FEATURE_POSITION_RESET #define EK3_FEATURE_POSITION_RESET EK3_FEATURE_ALL || AP_AHRS_POSITION_RESET_ENABLED #endif + +// rangefinder measurements if available +#ifndef EK3_FEATURE_RANGEFINDER_MEASUREMENTS +#define EK3_FEATURE_RANGEFINDER_MEASUREMENTS AP_RANGEFINDER_ENABLED +#endif diff --git a/libraries/AP_NavEKF3/LogStructure.h b/libraries/AP_NavEKF3/LogStructure.h index 59ea98f9e4..256cf0468b 100644 --- a/libraries/AP_NavEKF3/LogStructure.h +++ b/libraries/AP_NavEKF3/LogStructure.h @@ -193,11 +193,11 @@ struct PACKED log_XKF4 { LOG_PACKET_HEADER; uint64_t time_us; uint8_t core; - int16_t sqrtvarV; - int16_t sqrtvarP; - int16_t sqrtvarH; - int16_t sqrtvarM; - int16_t sqrtvarVT; + uint16_t sqrtvarV; + uint16_t sqrtvarP; + uint16_t sqrtvarH; + uint16_t sqrtvarM; + uint16_t sqrtvarVT; float tiltErr; float offsetNorth; float offsetEast; @@ -346,6 +346,7 @@ struct PACKED log_XKQ { // @Field: SS: Source Set (primary=0/secondary=1/tertiary=2) // @Field: GPS_GTA: GPS good to align // @Field: GPS_CHK_WAIT: Waiting for GPS checks to pass +// @Field: MAG_FUSION: Magnetometer fusion (0=not fusing/1=fuse yaw/2=fuse mag) struct PACKED log_XKFS { LOG_PACKET_HEADER; uint64_t time_us; @@ -357,6 +358,7 @@ struct PACKED log_XKFS { uint8_t source_set; uint8_t gps_good_to_align; uint8_t wait_for_gps_checks; + uint8_t mag_fusion; }; // @LoggerMessage: XKTV @@ -435,7 +437,7 @@ struct PACKED log_XKV { { LOG_XKF3_MSG, sizeof(log_XKF3), \ "XKF3","QBcccccchhhccff","TimeUS,C,IVN,IVE,IVD,IPN,IPE,IPD,IMX,IMY,IMZ,IYAW,IVT,RErr,ErSc", "s#nnnmmmGGGd?--", "F-BBBBBBCCCBB00" , true }, \ { LOG_XKF4_MSG, sizeof(log_XKF4), \ - "XKF4","QBcccccfffHBIHb","TimeUS,C,SV,SP,SH,SM,SVT,errRP,OFN,OFE,FS,TS,SS,GPS,PI", "s#------mm-----", "F-------??-----" , true }, \ + "XKF4","QBHHHHHfffHBIHb","TimeUS,C,SV,SP,SH,SM,SVT,errRP,OFN,OFE,FS,TS,SS,GPS,PI", "s#------mm-----", "F-BBBBB-??-----" , true }, \ { LOG_XKF5_MSG, sizeof(log_XKF5), \ "XKF5","QBBhhhcccCCfff","TimeUS,C,NI,FIX,FIY,AFI,HAGL,offset,RI,rng,Herr,eAng,eVel,ePos", "s#----m???mrnm", "F-----BBBBB000" , true }, \ { LOG_XKFD_MSG, sizeof(log_XKFD), \ @@ -443,7 +445,7 @@ struct PACKED log_XKV { { LOG_XKFM_MSG, sizeof(log_XKFM), \ "XKFM", "QBBffff", "TimeUS,C,OGNM,GLR,ALR,GDR,ADR", "s#-----", "F------", true }, \ { LOG_XKFS_MSG, sizeof(log_XKFS), \ - "XKFS","QBBBBBBBB","TimeUS,C,MI,BI,GI,AI,SS,GPS_GTA,GPS_CHK_WAIT", "s#-------", "F--------" , true }, \ + "XKFS","QBBBBBBBBB","TimeUS,C,MI,BI,GI,AI,SS,GPS_GTA,GPS_CHK_WAIT,MAG_FUSION", "s#--------", "F---------" , true }, \ { LOG_XKQ_MSG, sizeof(log_XKQ), "XKQ", "QBffff", "TimeUS,C,Q1,Q2,Q3,Q4", "s#????", "F-????" , true }, \ { LOG_XKT_MSG, sizeof(log_XKT), \ "XKT", "QBIffffffff", "TimeUS,C,Cnt,IMUMin,IMUMax,EKFMin,EKFMax,AngMin,AngMax,VMin,VMax", "s#sssssssss", "F-000000000", true }, \ diff --git a/libraries/AP_Networking/AP_Networking.cpp b/libraries/AP_Networking/AP_Networking.cpp index 63bdb7235a..c00ef4a713 100644 --- a/libraries/AP_Networking/AP_Networking.cpp +++ b/libraries/AP_Networking/AP_Networking.cpp @@ -76,7 +76,7 @@ const AP_Param::GroupInfo AP_Networking::var_info[] = { // @Param: TESTS // @DisplayName: Test enable flags // @Description: Enable/Disable networking tests - // @Bitmask: 0:UDP echo test,1:TCP echo test, 2:TCP discard test + // @Bitmask: 0:UDP echo test,1:TCP echo test, 2:TCP discard test, 3:TCP reflect test // @RebootRequired: True // @User: Advanced AP_GROUPINFO("TESTS", 7, AP_Networking, param.tests, 0), @@ -198,8 +198,10 @@ void AP_Networking::init() start_tests(); #endif +#if AP_NETWORKING_REGISTER_PORT_ENABLED // init network mapped serialmanager ports ports_init(); +#endif } /* diff --git a/libraries/AP_Networking/AP_Networking.h b/libraries/AP_Networking/AP_Networking.h index eaa51ffc8e..ea94afe8e6 100644 --- a/libraries/AP_Networking/AP_Networking.h +++ b/libraries/AP_Networking/AP_Networking.h @@ -283,11 +283,13 @@ private: TEST_UDP_CLIENT = (1U<<0), TEST_TCP_CLIENT = (1U<<1), TEST_TCP_DISCARD = (1U<<2), + TEST_TCP_REFLECT = (1U<<3), }; void start_tests(void); void test_UDP_client(void); void test_TCP_client(void); void test_TCP_discard(void); + void test_TCP_reflect(void); #endif // AP_NETWORKING_TESTS_ENABLED #if AP_NETWORKING_REGISTER_PORT_ENABLED diff --git a/libraries/AP_Networking/AP_Networking_PPP.cpp b/libraries/AP_Networking/AP_Networking_PPP.cpp index 6bcf3651bb..5d1128a781 100644 --- a/libraries/AP_Networking/AP_Networking_PPP.cpp +++ b/libraries/AP_Networking/AP_Networking_PPP.cpp @@ -25,6 +25,9 @@ extern const AP_HAL::HAL& hal; #define LWIP_TCPIP_UNLOCK() #endif +#define PPP_DEBUG_TX 0 +#define PPP_DEBUG_RX 0 + /* output some data to the uart */ @@ -34,6 +37,27 @@ uint32_t AP_Networking_PPP::ppp_output_cb(ppp_pcb *pcb, const void *data, uint32 LWIP_UNUSED_ARG(pcb); uint32_t remaining = len; const uint8_t *ptr = (const uint8_t *)data; +#if PPP_DEBUG_TX + bool flag_end = false; + if (ptr[len-1] == 0x7E) { + flag_end = true; + remaining--; + } + if (ptr[0] == 0x7E) { + // send byte size + if (pkt_size > 0) { + printf("PPP: tx[%lu] %u\n", tx_index++, pkt_size); + } + // dump the packet + if (!(tx_index % 10)) { + for (uint32_t i = 0; i < pkt_size; i++) { + printf(" %02X", tx_bytes[i]); + } + printf("\n"); + } + pkt_size = 0; + } +#endif while (remaining > 0) { const auto n = driver.uart->write(ptr, remaining); if (n > 0) { @@ -43,6 +67,22 @@ uint32_t AP_Networking_PPP::ppp_output_cb(ppp_pcb *pcb, const void *data, uint32 hal.scheduler->delay_microseconds(100); } } +#if PPP_DEBUG_TX + memcpy(&tx_bytes[pkt_size], data, len); + pkt_size += len; + if (flag_end) { + driver.uart->write(0x7E); + printf("PPP: tx[%lu] %u\n", tx_index++, pkt_size); + // dump the packet + if (!(tx_index % 10)) { + for (uint32_t i = 0; i < pkt_size; i++) { + printf(" %02X", tx_bytes[i]); + } + printf("\n"); + } + pkt_size = 0; + } +#endif return len; } @@ -224,6 +264,25 @@ void AP_Networking_PPP::ppp_loop(void) } else { hal.scheduler->delay_microseconds(200); } +#if PPP_DEBUG_RX + auto pppos = (pppos_pcb *)ppp->link_ctx_cb; + for (uint32_t i = 0; i < n; i++) { + if (buf[i] == 0x7E && last_ppp_frame_size != 1) { + // dump the packet + if (pppos->bad_pkt) { + printf("PPP: rx[%lu] %u\n", rx_index, last_ppp_frame_size); + for (uint32_t j = 0; j < last_ppp_frame_size; j++) { + printf("0x%02X,", rx_bytes[j]); + } + printf("\n"); + hal.scheduler->delay(1); + } + rx_index++; + last_ppp_frame_size = 0; + } + rx_bytes[last_ppp_frame_size++] = buf[i]; + } +#endif } } } diff --git a/libraries/AP_Networking/AP_Networking_port.cpp b/libraries/AP_Networking/AP_Networking_port.cpp index 832e96de1c..d552da12bf 100644 --- a/libraries/AP_Networking/AP_Networking_port.cpp +++ b/libraries/AP_Networking/AP_Networking_port.cpp @@ -13,6 +13,7 @@ #include #include #include +#include extern const AP_HAL::HAL& hal; @@ -413,6 +414,14 @@ bool AP_Networking::Port::send_receive(void) WITH_SEMAPHORE(sem); writebuffer->advance(ret); active = true; + } else if (errno == ENOTCONN && + (type == NetworkPortType::TCP_CLIENT || type == NetworkPortType::TCP_SERVER)) { + // close socket and mark as disconnected, so we can reconnect with another client or when server comes back + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "TCP[%u]: disconnected", unsigned(state.idx)); + sock->close(); + delete sock; + sock = nullptr; + connected = false; } } diff --git a/libraries/AP_Networking/AP_Networking_tests.cpp b/libraries/AP_Networking/AP_Networking_tests.cpp index 4747b0ce88..8a87ed15ba 100644 --- a/libraries/AP_Networking/AP_Networking_tests.cpp +++ b/libraries/AP_Networking/AP_Networking_tests.cpp @@ -33,6 +33,11 @@ void AP_Networking::start_tests(void) "TCP_discard", 8192, AP_HAL::Scheduler::PRIORITY_UART, -1); } + if (param.tests & TEST_TCP_REFLECT) { + hal.scheduler->thread_create(FUNCTOR_BIND_MEMBER(&AP_Networking::test_TCP_reflect, void), + "TCP_reflect", + 8192, AP_HAL::Scheduler::PRIORITY_UART, -1); + } } /* @@ -140,4 +145,59 @@ void AP_Networking::test_TCP_discard(void) } } +/* + start TCP reflect (TCP echo throughput) test + */ +void AP_Networking::test_TCP_reflect(void) +{ + startup_wait(); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "TCP_reflect: starting"); + const char *dest = param.test_ipaddr.get_str(); + auto *sock = new SocketAPM(false); + if (sock == nullptr) { + GCS_SEND_TEXT(MAV_SEVERITY_ERROR, "TCP_reflect: failed to create socket"); + return; + } + // connect to the echo service, which is port 7 + while (!sock->connect(dest, 7)) { + hal.scheduler->delay(10); + } + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "TCP_reflect: connected"); + const uint32_t bufsize = 4096; + uint8_t *buf = (uint8_t*)malloc(bufsize); + for (uint32_t i=0; idelay(1); + continue; + } + const bool will_send = total_sent < total_recv + max_disparity; + if (will_send) { + total_sent += sock->send(buf, bufsize); + } + if (sock->pollin(0)) { + uint32_t n = sock->recv(buf, bufsize, 0); + if (n == 0 && !will_send) { + hal.scheduler->delay_microseconds(100); + } + total_recv += n; + } + const uint32_t now = AP_HAL::millis(); + + if (now - last_report_ms >= 1000) { + float dt = (now - last_report_ms)*0.001; + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Reflect throughput %.3f kbyte/sec (disparity %u)", ((total_recv-last_recv)/dt)*1.0e-3, unsigned(total_sent-total_recv)); + last_recv = total_recv; + last_report_ms = now; + } + } +} + #endif // AP_NETWORKING_ENABLED && AP_NETWORKING_TESTS_ENABLED diff --git a/libraries/AP_Notify/AP_BoardLED.cpp b/libraries/AP_Notify/AP_BoardLED.cpp index 8e137c43e0..164e39a4a7 100644 --- a/libraries/AP_Notify/AP_BoardLED.cpp +++ b/libraries/AP_Notify/AP_BoardLED.cpp @@ -12,13 +12,14 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ + +#include "AP_Notify_config.h" + +#if AP_NOTIFY_GPIO_LED_3_ENABLED + #include "AP_BoardLED.h" - #include "AP_Notify.h" -#if (defined(HAL_GPIO_A_LED_PIN) && defined(HAL_GPIO_B_LED_PIN) && \ - defined(HAL_GPIO_C_LED_PIN)) - static_assert((HAL_GPIO_A_LED_PIN != HAL_GPIO_B_LED_PIN) && (HAL_GPIO_A_LED_PIN != HAL_GPIO_C_LED_PIN) && (HAL_GPIO_B_LED_PIN != HAL_GPIO_C_LED_PIN), "Duplicate LED assignments detected"); @@ -168,7 +169,5 @@ void AP_BoardLED::update(void) break; } } -#else -bool AP_BoardLED::init(void) {return true;} -void AP_BoardLED::update(void) {return;} -#endif + +#endif // AP_NOTIFY_GPIO_LED_3_ENABLED diff --git a/libraries/AP_Notify/AP_BoardLED.h b/libraries/AP_Notify/AP_BoardLED.h index 810cacbde8..adede6cd7b 100644 --- a/libraries/AP_Notify/AP_BoardLED.h +++ b/libraries/AP_Notify/AP_BoardLED.h @@ -14,6 +14,10 @@ */ #pragma once +#include "AP_Notify_config.h" + +#if AP_NOTIFY_GPIO_LED_3_ENABLED + #include #include @@ -29,9 +33,8 @@ public: void update(void) override; private: -#if (defined(HAL_GPIO_A_LED_PIN) && defined(HAL_GPIO_B_LED_PIN) && \ - defined(HAL_GPIO_C_LED_PIN)) // counter incremented at 50Hz uint8_t _counter; -#endif }; + +#endif // AP_NOTIFY_GPIO_LED_3_ENABLED diff --git a/libraries/AP_Notify/AP_BoardLED2.cpp b/libraries/AP_Notify/AP_BoardLED2.cpp index 24a80e4559..ef2cbd18ed 100644 --- a/libraries/AP_Notify/AP_BoardLED2.cpp +++ b/libraries/AP_Notify/AP_BoardLED2.cpp @@ -11,16 +11,19 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . + + + show all status on only 2 leds */ + +#include "AP_Notify_config.h" + +#if AP_NOTIFY_GPIO_LED_2_ENABLED + #include "AP_BoardLED2.h" #include "AP_Notify.h" - -// show all status on only 2 leds - -#if defined(HAL_GPIO_A_LED_PIN) && defined(HAL_GPIO_B_LED_PIN) - static_assert((HAL_GPIO_A_LED_PIN != HAL_GPIO_B_LED_PIN), "Duplicate LED assignments detected"); extern const AP_HAL::HAL& hal; @@ -263,7 +266,5 @@ void AP_BoardLED2::update(void) break; } } -#else -bool AP_BoardLED2::init(void) {return true;} -void AP_BoardLED2::update(void) {return;} -#endif + +#endif // AP_NOTIFY_GPIO_LED_2_ENABLED diff --git a/libraries/AP_Notify/AP_BoardLED2.h b/libraries/AP_Notify/AP_BoardLED2.h index 2d6b5e19a0..94791d41bf 100644 --- a/libraries/AP_Notify/AP_BoardLED2.h +++ b/libraries/AP_Notify/AP_BoardLED2.h @@ -14,7 +14,9 @@ */ #pragma once +#include "AP_Notify_config.h" +#if AP_NOTIFY_GPIO_LED_2_ENABLED #include #include @@ -33,9 +35,9 @@ public: private: // counter incremented at 50Hz uint8_t _counter; -#if defined(HAL_GPIO_A_LED_PIN) && defined(HAL_GPIO_B_LED_PIN) uint16_t _sat_cnt; uint8_t save_trim_counter; uint8_t arm_counter = 0; -#endif }; + +#endif // AP_NOTIFY_GPIO_LED_2_ENABLED diff --git a/libraries/AP_Notify/AP_Notify.cpp b/libraries/AP_Notify/AP_Notify.cpp index 4bbebe497f..8f0dfda3c5 100644 --- a/libraries/AP_Notify/AP_Notify.cpp +++ b/libraries/AP_Notify/AP_Notify.cpp @@ -20,6 +20,7 @@ #include "Buzzer.h" #include "Display.h" #include "ExternalLED.h" +#include "GPIO_LED_1.h" #include "IS31FL3195.h" #include "PCA9685LED_I2C.h" #include "NavigatorLED.h" @@ -88,18 +89,11 @@ AP_Notify *AP_Notify::_singleton; #endif #ifndef DEFAULT_NTF_LED_TYPES -#if CONFIG_HAL_BOARD == HAL_BOARD_CHIBIOS - #define DEFAULT_NTF_LED_TYPES (Notify_LED_Board | I2C_LEDS) - -// Linux boards -#elif CONFIG_HAL_BOARD == HAL_BOARD_LINUX +#if CONFIG_HAL_BOARD == HAL_BOARD_LINUX #if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_NAVIO #define DEFAULT_NTF_LED_TYPES (Notify_LED_Board | I2C_LEDS |\ Notify_LED_PCA9685LED_I2C_External) - #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_NAVIO2 - #define DEFAULT_NTF_LED_TYPES (Notify_LED_Board | I2C_LEDS) - #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_EDGE #define DEFAULT_NTF_LED_TYPES (Notify_LED_Board | I2C_LEDS |\ DRONECAN_LEDS) @@ -116,17 +110,12 @@ AP_Notify *AP_Notify::_singleton; #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_RST_ZYNQ #define DEFAULT_NTF_LED_TYPES (Notify_LED_ToshibaLED_I2C_External) + #endif // board subtype +#endif // CONFIG_HAL_BOARD == HAL_BOARD_LINUX +#endif // defined (DEFAULT_NTF_LED_TYPES) - #else // other linux +#ifndef DEFAULT_NTF_LED_TYPES #define DEFAULT_NTF_LED_TYPES (Notify_LED_Board | I2C_LEDS) - #endif - -// All other builds -#else - #define DEFAULT_NTF_LED_TYPES (Notify_LED_Board | I2C_LEDS) - -#endif // board selection - #endif // DEFAULT_NTF_LED_TYPES #ifndef BUZZER_ENABLE_DEFAULT @@ -287,36 +276,33 @@ void AP_Notify::add_backends(void) break; case Notify_LED_Board: // select the most appropriate built in LED driver type -#if CONFIG_HAL_BOARD == HAL_BOARD_LINUX - #if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_NAVIO2 +#if AP_NOTIFY_SYSFS_LED_ENABLED ADD_BACKEND(NEW_NOTHROW Led_Sysfs("rgb_led0", "rgb_led2", "rgb_led1")); - #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_EDGE +#elif AP_NOTIFY_RCOUTPUTRGBLEDINVERTED_LED_ENABLED ADD_BACKEND(NEW_NOTHROW RCOutputRGBLedInverted(12, 13, 14)); - #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BH +#elif AP_NOTIFY_RCOUTPUTRGBLED_LED_ENABLED ADD_BACKEND(NEW_NOTHROW RCOutputRGBLed(HAL_RCOUT_RGBLED_RED, HAL_RCOUT_RGBLED_GREEN, HAL_RCOUT_RGBLED_BLUE)); - #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_DISCO +#elif AP_NOTIFY_DISCO_LED_ENABLED ADD_BACKEND(NEW_NOTHROW DiscoLED()); - #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_NAVIGATOR +#elif AP_NOTIFY_NAVIGATOR_LED_ENABLED ADD_BACKEND(NEW_NOTHROW NavigatorLED()); - #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_OBAL_V1 - ADD_BACKEND(NEW_NOTHROW AP_BoardLED2()); - #endif -#endif // CONFIG_HAL_BOARD == HAL_BOARD_LINUX +#endif #if AP_NOTIFY_EXTERNALLED_ENABLED ADD_BACKEND(NEW_NOTHROW ExternalLED()); // despite the name this is a built in set of onboard LED's #endif -#if defined(HAL_HAVE_PIXRACER_LED) +#if AP_NOTIFY_GPIO_LED_RGB_ENABLED ADD_BACKEND(NEW_NOTHROW PixRacerLED()); -#elif (defined(HAL_GPIO_A_LED_PIN) && defined(HAL_GPIO_B_LED_PIN) && defined(HAL_GPIO_C_LED_PIN)) - #if AP_NOTIFY_VRBOARD_LED_ENABLED +#elif AP_NOTIFY_VRBOARD_LED_ENABLED ADD_BACKEND(NEW_NOTHROW VRBoard_LED()); - #else +#elif AP_NOTIFY_GPIO_LED_3_ENABLED ADD_BACKEND(NEW_NOTHROW AP_BoardLED()); - #endif -#elif (defined(HAL_GPIO_A_LED_PIN) && defined(HAL_GPIO_B_LED_PIN)) +#elif AP_NOTIFY_GPIO_LED_2_ENABLED ADD_BACKEND(NEW_NOTHROW AP_BoardLED2()); +#endif +#if AP_NOTIFY_GPIO_LED_1_ENABLED + ADD_BACKEND(NEW_NOTHROW GPIO_LED_1()); #endif break; #if AP_NOTIFY_TOSHIBALED_ENABLED diff --git a/libraries/AP_Notify/AP_Notify.h b/libraries/AP_Notify/AP_Notify.h index f9f5e1fd04..5467dfc0df 100644 --- a/libraries/AP_Notify/AP_Notify.h +++ b/libraries/AP_Notify/AP_Notify.h @@ -25,8 +25,6 @@ #define RGB_LED_LOW 1 #define RGB_LED_MEDIUM 2 #define RGB_LED_HIGH 3 -#define BUZZER_ON 1 -#define BUZZER_OFF 0 #define NOTIFY_TEXT_BUFFER_SIZE 51 diff --git a/libraries/AP_Notify/AP_Notify_config.h b/libraries/AP_Notify/AP_Notify_config.h index fb702a8d1e..0bc83f1905 100644 --- a/libraries/AP_Notify/AP_Notify_config.h +++ b/libraries/AP_Notify/AP_Notify_config.h @@ -37,6 +37,48 @@ #define AP_NOTIFY_LP5562_ENABLED 1 #endif +#ifndef AP_NOTIFY_DISCO_LED_ENABLED +#define AP_NOTIFY_DISCO_LED_ENABLED 0 +#endif + +#ifndef AP_NOTIFY_NAVIGATOR_LED_ENABLED +#define AP_NOTIFY_NAVIGATOR_LED_ENABLED 0 +#endif + +#ifndef AP_NOTIFY_GPIO_LED_3_ENABLED +#define AP_NOTIFY_GPIO_LED_3_ENABLED 0 +#endif + +// this isn't the second-generation of board LEDs, this is a setup +// where there are two LEDs used: +#ifndef AP_NOTIFY_GPIO_LED_2_ENABLED +#define AP_NOTIFY_GPIO_LED_2_ENABLED 0 +#endif + +#ifndef AP_NOTIFY_GPIO_LED_1_ENABLED +#define AP_NOTIFY_GPIO_LED_1_ENABLED 0 +#endif + +#ifndef AP_NOTIFY_GPIO_LED_RGB_ENABLED +#define AP_NOTIFY_GPIO_LED_RGB_ENABLED 0 +#endif + +#ifndef AP_NOTIFY_RCOUTPUTRGBLEDINVERTED_LED_ENABLED +#define AP_NOTIFY_RCOUTPUTRGBLEDINVERTED_LED_ENABLED 0 +#endif + +#ifndef AP_NOTIFY_RCOUTPUTRGBLEDOFF_LED_ENABLED +#define AP_NOTIFY_RCOUTPUTRGBLEDOFF_LED_ENABLED 0 +#endif + +#ifndef AP_NOTIFY_RCOUTPUTRGBLED_LED_ENABLED +#define AP_NOTIFY_RCOUTPUTRGBLED_LED_ENABLED AP_NOTIFY_RCOUTPUTRGBLEDINVERTED_LED_ENABLED || AP_NOTIFY_RCOUTPUTRGBLEDOFF_LED_ENABLED +#endif + +#ifndef AP_NOTIFY_SYSFS_LED_ENABLED +#define AP_NOTIFY_SYSFS_LED_ENABLED 0 +#endif + #ifndef AP_NOTIFY_IS31FL3195_ENABLED #define AP_NOTIFY_IS31FL3195_ENABLED 1 #endif diff --git a/libraries/AP_Notify/DiscoLED.cpp b/libraries/AP_Notify/DiscoLED.cpp index 845972e623..ec2030d894 100644 --- a/libraries/AP_Notify/DiscoLED.cpp +++ b/libraries/AP_Notify/DiscoLED.cpp @@ -14,9 +14,13 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ + +#include "AP_Notify_config.h" + +#if AP_NOTIFY_DISCO_LED_ENABLED + #include -#if CONFIG_HAL_BOARD == HAL_BOARD_LINUX #include "DiscoLED.h" #include @@ -92,4 +96,4 @@ bool DiscoLED::hw_set_rgb(uint8_t red, uint8_t green, uint8_t blue) return true; } -#endif +#endif // AP_NOTIFY_DISCO_LED_ENABLED diff --git a/libraries/AP_Notify/DiscoLED.h b/libraries/AP_Notify/DiscoLED.h index 3c7585327e..d32ccf818f 100644 --- a/libraries/AP_Notify/DiscoLED.h +++ b/libraries/AP_Notify/DiscoLED.h @@ -16,9 +16,12 @@ */ #pragma once +#include "AP_Notify_config.h" + +#if AP_NOTIFY_DISCO_LED_ENABLED + #include -#if CONFIG_HAL_BOARD == HAL_BOARD_LINUX #include #include @@ -53,4 +56,4 @@ private: enum led_backend backend; }; -#endif +#endif // AP_NOTIFY_DISCO_LED_ENABLED diff --git a/libraries/AP_Notify/GPIO_LED_1.cpp b/libraries/AP_Notify/GPIO_LED_1.cpp new file mode 100644 index 0000000000..6ea0bd16c9 --- /dev/null +++ b/libraries/AP_Notify/GPIO_LED_1.cpp @@ -0,0 +1,77 @@ +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#include "AP_Notify_config.h" + +#if AP_NOTIFY_GPIO_LED_1_ENABLED + +#include "GPIO_LED_1.h" + +#include +#include "AP_Notify.h" + +#ifndef AP_NOTIFY_GPIO_LED_1_PIN +#error "define AP_NOTIFY_GPIO_LED_1_PIN" +#endif + +extern const AP_HAL::HAL& hal; + +bool GPIO_LED_1::init(void) +{ + // when HAL_GPIO_LED_ON is 0 then we must not use pinMode() + // as it could remove the OPENDRAIN attribute on the pin +#if HAL_GPIO_LED_ON != 0 + hal.gpio->pinMode(AP_NOTIFY_GPIO_LED_1_PIN, HAL_GPIO_OUTPUT); +#endif + hal.gpio->write(AP_NOTIFY_GPIO_LED_1_PIN, HAL_GPIO_LED_OFF); + return true; +} + +/* + main update function called at 50Hz + */ +void GPIO_LED_1::update(void) +{ + uint32_t new_pattern; + if (AP_Notify::flags.initialising) { + new_pattern = INITIALIZING; + } else if (AP_Notify::flags.armed) { + new_pattern = ARMED; + } else if (AP_Notify::flags.pre_arm_check) { + new_pattern = READY_TO_ARM; + } else { + new_pattern = NOT_READY_TO_ARM; + } + if (new_pattern != current_pattern) { + next_bit = 0; + current_pattern = new_pattern; + last_timestep_ms = 0; + } + + const uint32_t now_ms = AP_HAL::millis(); + if (now_ms - last_timestep_ms < 100) { + return; + } + last_timestep_ms = now_ms; + + const auto new_state = (current_pattern & (1U<write(AP_NOTIFY_GPIO_LED_1_PIN, new_state); + next_bit++; + if (next_bit > 31) { + next_bit = 0; + } +} + +#endif // AP_NOTIFY_GPIO_LED_1_ENABLED diff --git a/libraries/AP_Notify/GPIO_LED_1.h b/libraries/AP_Notify/GPIO_LED_1.h new file mode 100644 index 0000000000..129e6cac52 --- /dev/null +++ b/libraries/AP_Notify/GPIO_LED_1.h @@ -0,0 +1,48 @@ +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ +#pragma once + +#include "AP_Notify_config.h" + +#if AP_NOTIFY_GPIO_LED_1_ENABLED + +#include +#include + +#include "NotifyDevice.h" + +class GPIO_LED_1 : public NotifyDevice +{ +public: + // initialise the LED driver + bool init(void) override; + + // should be called at 50Hz + void update(void) override; + +private: + + // left-to-right, each bit represents 100ms + static const uint32_t INITIALIZING = 0b10101010101010101010101010101010UL; + static const uint32_t NOT_READY_TO_ARM = 0b11111111000000001111111100000000UL; + static const uint32_t READY_TO_ARM = 0b11111111111111100000000000000000UL; + static const uint32_t ARMED = 0b11111111111111111111111111111111UL; + + uint32_t current_pattern = INITIALIZING; + uint32_t last_timestep_ms; + uint8_t next_bit; +}; + +#endif // AP_NOTIFY_GPIO_LED_1_ENABLED diff --git a/libraries/AP_Notify/Led_Sysfs.cpp b/libraries/AP_Notify/Led_Sysfs.cpp index 3bdec24cb7..e611062a0f 100644 --- a/libraries/AP_Notify/Led_Sysfs.cpp +++ b/libraries/AP_Notify/Led_Sysfs.cpp @@ -14,13 +14,12 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include +#include "AP_Notify_config.h" + +#if AP_NOTIFY_SYSFS_LED_ENABLED -#if CONFIG_HAL_BOARD == HAL_BOARD_LINUX #include "Led_Sysfs.h" -#include - Led_Sysfs::Led_Sysfs(const char *red, const char *green, const char *blue, uint8_t off_brightness, uint8_t low_brightness, uint8_t medium_brightness, uint8_t high_brightness): RGBLed(off_brightness, high_brightness, medium_brightness, low_brightness), @@ -47,4 +46,4 @@ bool Led_Sysfs::hw_set_rgb(uint8_t red, uint8_t green, uint8_t blue) return true; } -#endif +#endif // AP_NOTIFY_SYSFS_LED_ENABLED diff --git a/libraries/AP_Notify/Led_Sysfs.h b/libraries/AP_Notify/Led_Sysfs.h index be8fab15e8..caab49c848 100644 --- a/libraries/AP_Notify/Led_Sysfs.h +++ b/libraries/AP_Notify/Led_Sysfs.h @@ -16,9 +16,10 @@ */ #pragma once -#include +#include "AP_Notify_config.h" + +#if AP_NOTIFY_SYSFS_LED_ENABLED -#if CONFIG_HAL_BOARD == HAL_BOARD_LINUX #include #include "RGBLed.h" @@ -39,4 +40,4 @@ private: Linux::Led_Sysfs green_led; Linux::Led_Sysfs blue_led; }; -#endif +#endif // AP_NOTIFY_SYSFS_LED_ENABLED diff --git a/libraries/AP_Notify/NavigatorLED.cpp b/libraries/AP_Notify/NavigatorLED.cpp index 8c7b706aa1..7bdc68e397 100644 --- a/libraries/AP_Notify/NavigatorLED.cpp +++ b/libraries/AP_Notify/NavigatorLED.cpp @@ -19,6 +19,10 @@ // not used. The data is sent to the neopixel in 24 'SPI bytes', where each // spi byte is formatted to appear as a single bit of data to the neopixel. +#include "AP_Notify_config.h" + +#if AP_NOTIFY_NAVIGATOR_LED_ENABLED + #include #include "AP_Notify/AP_Notify.h" #include "NavigatorLED.h" @@ -79,3 +83,5 @@ void NavigatorLED::_setup_data(uint8_t red, uint8_t green, uint8_t blue) _data[16 + i] = (blue & (1<<(7-i))) ? LED_T1 : LED_T0; } } + +#endif // AP_NOTIFY_NAVIGATOR_LED_ENABLED diff --git a/libraries/AP_Notify/NavigatorLED.h b/libraries/AP_Notify/NavigatorLED.h index 9f93857eb1..f6ef3a2387 100644 --- a/libraries/AP_Notify/NavigatorLED.h +++ b/libraries/AP_Notify/NavigatorLED.h @@ -14,6 +14,10 @@ */ #pragma once +#include "AP_Notify_config.h" + +#if AP_NOTIFY_NAVIGATOR_LED_ENABLED + #include "RGBLed.h" #include @@ -30,3 +34,5 @@ private: void _setup_data(uint8_t red, uint8_t green, uint8_t blue); AP_HAL::OwnPtr _dev; }; + +#endif // AP_NOTIFY_NAVIGATOR_LED_ENABLED diff --git a/libraries/AP_Notify/PixRacerLED.cpp b/libraries/AP_Notify/PixRacerLED.cpp index 3e543a0cf3..19da44e3e5 100644 --- a/libraries/AP_Notify/PixRacerLED.cpp +++ b/libraries/AP_Notify/PixRacerLED.cpp @@ -13,20 +13,22 @@ along with this program. If not, see . */ +#include "AP_Notify_config.h" + +#if AP_NOTIFY_GPIO_LED_RGB_ENABLED + #include "PixRacerLED.h" #include -#if CONFIG_HAL_BOARD == HAL_BOARD_CHIBIOS - -#ifndef HAL_GPIO_A_LED_PIN -#define HAL_GPIO_A_LED_PIN -1 +#ifndef AP_NOTIFY_GPIO_LED_RGB_RED_PIN +#error "define AP_NOTIFY_GPIO_LED_RGB_RED_PIN" #endif -#ifndef HAL_GPIO_B_LED_PIN -#define HAL_GPIO_B_LED_PIN -1 +#ifndef AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN +#error "define AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN" #endif -#ifndef HAL_GPIO_C_LED_PIN -#define HAL_GPIO_C_LED_PIN -1 +#ifndef AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN +#error "define AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN" #endif extern const AP_HAL::HAL& hal; @@ -41,25 +43,22 @@ bool PixRacerLED::init(void) // when HAL_GPIO_LED_ON is 0 then we must not use pinMode() // as it could remove the OPENDRAIN attribute on the pin #if HAL_GPIO_LED_ON != 0 - hal.gpio->pinMode(HAL_GPIO_A_LED_PIN, HAL_GPIO_OUTPUT); - hal.gpio->pinMode(HAL_GPIO_B_LED_PIN, HAL_GPIO_OUTPUT); - hal.gpio->pinMode(HAL_GPIO_C_LED_PIN, HAL_GPIO_OUTPUT); + hal.gpio->pinMode(AP_NOTIFY_GPIO_LED_RGB_RED_PIN, HAL_GPIO_OUTPUT); + hal.gpio->pinMode(AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN, HAL_GPIO_OUTPUT); + hal.gpio->pinMode(AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN, HAL_GPIO_OUTPUT); #endif - hal.gpio->write(HAL_GPIO_A_LED_PIN, HAL_GPIO_LED_OFF); - hal.gpio->write(HAL_GPIO_B_LED_PIN, HAL_GPIO_LED_OFF); - hal.gpio->write(HAL_GPIO_C_LED_PIN, HAL_GPIO_LED_OFF); + hal.gpio->write(AP_NOTIFY_GPIO_LED_RGB_RED_PIN, HAL_GPIO_LED_OFF); + hal.gpio->write(AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN, HAL_GPIO_LED_OFF); + hal.gpio->write(AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN, HAL_GPIO_LED_OFF); return true; } bool PixRacerLED::hw_set_rgb(uint8_t r, uint8_t g, uint8_t b) { - hal.gpio->write(HAL_GPIO_A_LED_PIN, (r > 0)?HAL_GPIO_LED_ON:HAL_GPIO_LED_OFF); - hal.gpio->write(HAL_GPIO_B_LED_PIN, (g > 0)?HAL_GPIO_LED_ON:HAL_GPIO_LED_OFF); - hal.gpio->write(HAL_GPIO_C_LED_PIN, (b > 0)?HAL_GPIO_LED_ON:HAL_GPIO_LED_OFF); + hal.gpio->write(AP_NOTIFY_GPIO_LED_RGB_RED_PIN, (r > 0)?HAL_GPIO_LED_ON:HAL_GPIO_LED_OFF); + hal.gpio->write(AP_NOTIFY_GPIO_LED_RGB_GREEN_PIN, (g > 0)?HAL_GPIO_LED_ON:HAL_GPIO_LED_OFF); + hal.gpio->write(AP_NOTIFY_GPIO_LED_RGB_BLUE_PIN, (b > 0)?HAL_GPIO_LED_ON:HAL_GPIO_LED_OFF); return true; } -#else -bool PixRacerLED::init(void) { return true; } -bool PixRacerLED::hw_set_rgb(uint8_t r, uint8_t g, uint8_t b) { return true; } -#endif +#endif // AP_NOTIFY_GPIO_LED_RGB_ENABLED diff --git a/libraries/AP_Notify/PixRacerLED.h b/libraries/AP_Notify/PixRacerLED.h index 43dc34ac03..ca93161abe 100644 --- a/libraries/AP_Notify/PixRacerLED.h +++ b/libraries/AP_Notify/PixRacerLED.h @@ -14,6 +14,10 @@ */ #pragma once +#include "AP_Notify_config.h" + +#if AP_NOTIFY_GPIO_LED_RGB_ENABLED + #include "RGBLed.h" class PixRacerLED: public RGBLed @@ -25,3 +29,5 @@ public: protected: bool hw_set_rgb(uint8_t r, uint8_t g, uint8_t b) override; }; + +#endif // AP_NOTIFY_GPIO_LED_RGB_ENABLED diff --git a/libraries/AP_Notify/RCOutputRGBLed.cpp b/libraries/AP_Notify/RCOutputRGBLed.cpp index b9049f1468..b9147126f9 100644 --- a/libraries/AP_Notify/RCOutputRGBLed.cpp +++ b/libraries/AP_Notify/RCOutputRGBLed.cpp @@ -15,6 +15,10 @@ * with this program. If not, see . */ +#include "AP_Notify_config.h" + +#if AP_NOTIFY_RCOUTPUTRGBLED_LED_ENABLED + #include "RCOutputRGBLed.h" #include @@ -58,10 +62,12 @@ uint16_t RCOutputRGBLed::get_duty_cycle_for_color(const uint8_t color, const uin return usec_period * color / _led_bright; } +#if AP_NOTIFY_RCOUTPUTRGBLEDINVERTED_LED_ENABLED uint16_t RCOutputRGBLedInverted::get_duty_cycle_for_color(const uint8_t color, const uint16_t usec_period) const { return usec_period * (255 - color) / _led_bright; } +#endif // AP_NOTIFY_RCOUTPUTRGBLEDINVERTED_LED_ENABLED bool RCOutputRGBLed::hw_set_rgb(uint8_t red, uint8_t green, uint8_t blue) @@ -91,3 +97,4 @@ bool RCOutputRGBLed::hw_set_rgb(uint8_t red, uint8_t green, uint8_t blue) return true; } +#endif // AP_NOTIFY_RCOUTPUTRGBLED_LED_ENABLED diff --git a/libraries/AP_Notify/RCOutputRGBLed.h b/libraries/AP_Notify/RCOutputRGBLed.h index aeae109e94..865d13fcfc 100644 --- a/libraries/AP_Notify/RCOutputRGBLed.h +++ b/libraries/AP_Notify/RCOutputRGBLed.h @@ -2,6 +2,7 @@ #include "RGBLed.h" +#if AP_NOTIFY_RCOUTPUTRGBLED_LED_ENABLED class RCOutputRGBLed: public RGBLed { public: RCOutputRGBLed(uint8_t red_channel, uint8_t green_channel, @@ -20,7 +21,9 @@ private: uint8_t _green_channel; uint8_t _blue_channel; }; +#endif // AP_NOTIFY_RCOUTPUTRGBLED_LED_ENABLED +#if AP_NOTIFY_RCOUTPUTRGBLEDINVERTED_LED_ENABLED class RCOutputRGBLedInverted : public RCOutputRGBLed { public: RCOutputRGBLedInverted(uint8_t red_channel, uint8_t green_channel, uint8_t blue_channel) @@ -29,7 +32,9 @@ public: protected: virtual uint16_t get_duty_cycle_for_color(const uint8_t color, const uint16_t usec_period) const override; }; +#endif // AP_NOTIFY_RCOUTPUTRGBLEDINVERTED_LED_ENABLED +#if AP_NOTIFY_RCOUTPUTRGBLEDOFF_LED_ENABLED class RCOutputRGBLedOff : public RCOutputRGBLed { public: RCOutputRGBLedOff(uint8_t red_channel, uint8_t green_channel, @@ -45,3 +50,4 @@ public: return RCOutputRGBLed::hw_set_rgb(_led_off, _led_off, _led_off); } }; +#endif // AP_NOTIFY_RCOUTPUTRGBLEDOFF_LED_ENABLED diff --git a/libraries/AP_Notify/RGBLed.cpp b/libraries/AP_Notify/RGBLed.cpp index 29d15ba043..caa549fd94 100644 --- a/libraries/AP_Notify/RGBLed.cpp +++ b/libraries/AP_Notify/RGBLed.cpp @@ -20,6 +20,7 @@ #include #include "RGBLed.h" #include "AP_Notify.h" +#include extern const AP_HAL::HAL& hal; @@ -136,33 +137,45 @@ uint32_t RGBLed::get_colour_sequence(void) const return sequence_failsafe_radio_or_battery; } +#if AP_GPS_ENABLED + Location loc; +#if AP_AHRS_ENABLED + // the AHRS can return "true" for get_location and still not be + // happy enough with the location to set its origin from that + // location: + const bool good_ahrs_location = AP::ahrs().get_location(loc) && AP::ahrs().get_origin(loc); +#else + const bool good_ahrs_location = true; +#endif + // solid green or blue if armed if (AP_Notify::flags.armed) { #if AP_GPS_ENABLED - // solid green if armed with GPS 3d lock - if (AP_Notify::flags.gps_status >= AP_GPS::GPS_OK_FIX_3D) { + // solid green if armed with GPS 3d lock and good location + if (AP_Notify::flags.gps_status >= AP_GPS::GPS_OK_FIX_3D && + good_ahrs_location) { return sequence_armed; } #endif // solid blue if armed with no GPS lock - return sequence_armed_nogps; + return sequence_armed_no_gps_or_no_location; } // double flash yellow if failing pre-arm checks if (!AP_Notify::flags.pre_arm_check) { return sequence_prearm_failing; } -#if AP_GPS_ENABLED - if (AP_Notify::flags.gps_status >= AP_GPS::GPS_OK_FIX_3D_DGPS && AP_Notify::flags.pre_arm_gps_check) { - return sequence_disarmed_good_dgps; - } - - if (AP_Notify::flags.gps_status >= AP_GPS::GPS_OK_FIX_3D && AP_Notify::flags.pre_arm_gps_check) { - return sequence_disarmed_good_gps; + if (AP_Notify::flags.pre_arm_gps_check && good_ahrs_location) { + if (AP_Notify::flags.gps_status >= AP_GPS::GPS_OK_FIX_3D_DGPS) { + return sequence_disarmed_good_dgps_and_location; + } + if (AP_Notify::flags.gps_status >= AP_GPS::GPS_OK_FIX_3D) { + return sequence_disarmed_good_gps_and_location; + } } #endif - return sequence_disarmed_bad_gps; + return sequence_disarmed_bad_gps_or_no_location; } uint32_t RGBLed::get_colour_sequence_traffic_light(void) const diff --git a/libraries/AP_Notify/RGBLed.h b/libraries/AP_Notify/RGBLed.h index 7366a6e2b1..3978f04806 100644 --- a/libraries/AP_Notify/RGBLed.h +++ b/libraries/AP_Notify/RGBLed.h @@ -98,11 +98,11 @@ private: const uint32_t sequence_failsafe_radio_or_battery = DEFINE_COLOUR_SEQUENCE_FAILSAFE(BLACK); const uint32_t sequence_armed = DEFINE_COLOUR_SEQUENCE_SOLID(GREEN); - const uint32_t sequence_armed_nogps = DEFINE_COLOUR_SEQUENCE_SOLID(BLUE); + const uint32_t sequence_armed_no_gps_or_no_location = DEFINE_COLOUR_SEQUENCE_SOLID(BLUE); const uint32_t sequence_prearm_failing = DEFINE_COLOUR_SEQUENCE(YELLOW,YELLOW,BLACK,BLACK,YELLOW,YELLOW,BLACK,BLACK,BLACK,BLACK); - const uint32_t sequence_disarmed_good_dgps = DEFINE_COLOUR_SEQUENCE_ALTERNATE(GREEN,BLACK); - const uint32_t sequence_disarmed_good_gps = DEFINE_COLOUR_SEQUENCE_SLOW(GREEN); - const uint32_t sequence_disarmed_bad_gps = DEFINE_COLOUR_SEQUENCE_SLOW(BLUE); + const uint32_t sequence_disarmed_good_dgps_and_location = DEFINE_COLOUR_SEQUENCE_ALTERNATE(GREEN,BLACK); + const uint32_t sequence_disarmed_good_gps_and_location = DEFINE_COLOUR_SEQUENCE_SLOW(GREEN); + const uint32_t sequence_disarmed_bad_gps_or_no_location = DEFINE_COLOUR_SEQUENCE_SLOW(BLUE); uint8_t last_step; enum class Source { diff --git a/libraries/AP_Notify/examples/AP_Notify_test/AP_Notify_test.cpp b/libraries/AP_Notify/examples/AP_Notify_test/AP_Notify_test.cpp index 6412bd0326..1247dd4287 100644 --- a/libraries/AP_Notify/examples/AP_Notify_test/AP_Notify_test.cpp +++ b/libraries/AP_Notify/examples/AP_Notify_test/AP_Notify_test.cpp @@ -12,15 +12,19 @@ void loop(); const AP_HAL::HAL& hal = AP_HAL::get_HAL(); +#if AP_NOTIFY_GPIO_LED_3_ENABLED // create board led object AP_BoardLED board_led; +#endif void setup() { hal.console->printf("AP_Notify library test\n"); +#if AP_NOTIFY_GPIO_LED_3_ENABLED // initialise the board leds board_led.init(); +#endif // turn on initialising notification AP_Notify::flags.initialising = true; diff --git a/libraries/AP_OSD/AP_OSD.cpp b/libraries/AP_OSD/AP_OSD.cpp index 23d3dd8e56..34ee67df2b 100644 --- a/libraries/AP_OSD/AP_OSD.cpp +++ b/libraries/AP_OSD/AP_OSD.cpp @@ -506,7 +506,7 @@ void AP_OSD::update_stats() // max esc temp AP_ESC_Telem& telem = AP::esc_telem(); int16_t highest_temperature = 0; - telem.get_highest_motor_temperature(highest_temperature); + telem.get_highest_temperature(highest_temperature); _stats.max_esc_temp = MAX(_stats.max_esc_temp, highest_temperature); #endif } diff --git a/libraries/AP_OSD/AP_OSD.h b/libraries/AP_OSD/AP_OSD.h index 4a09e6e1c5..bb0d7b572a 100644 --- a/libraries/AP_OSD/AP_OSD.h +++ b/libraries/AP_OSD/AP_OSD.h @@ -33,6 +33,7 @@ #include #endif #include +#include class AP_OSD_Backend; class AP_MSP; @@ -259,6 +260,9 @@ private: AP_Int8 txt_resolution; AP_Int8 font_index; #endif +#if HAL_WITH_ESC_TELEM + AP_Int8 esc_index; +#endif void draw_altitude(uint8_t x, uint8_t y); void draw_bat_volt(uint8_t instance,VoltageType type,uint8_t x, uint8_t y); @@ -331,7 +335,9 @@ private: #if AP_FENCE_ENABLED void draw_fence(uint8_t x, uint8_t y); #endif +#if AP_RANGEFINDER_ENABLED void draw_rngf(uint8_t x, uint8_t y); +#endif #if AP_OSD_EXTENDED_LNK_STATS // Extended link stats data panels diff --git a/libraries/AP_OSD/AP_OSD_ParamSetting.cpp b/libraries/AP_OSD/AP_OSD_ParamSetting.cpp index d2f1387111..7ec03159e4 100644 --- a/libraries/AP_OSD/AP_OSD_ParamSetting.cpp +++ b/libraries/AP_OSD/AP_OSD_ParamSetting.cpp @@ -139,7 +139,7 @@ static const char* SERIAL_PROTOCOL_VALUES[] = { "FSKY_TX", "LID360", "", "BEACN", "VOLZ", "SBUS", "ESC_TLM", "DEV_TLM", "OPTFLW", "RBTSRV", "NMEA", "WNDVNE", "SLCAN", "RCIN", "MGSQRT", "LTM", "RUNCAM", "HOT_TLM", "SCRIPT", "CRSF", "GEN", "WNCH", "MSP", "DJI", "AIRSPD", "ADSB", "AHRS", "AUDIO", "FETTEC", "TORQ", - "AIS", "CD_ESC", "MSP_DP", "MAV_HL", "TRAMP", "DDS", "IMUOUT", "IQ", "PPP", + "AIS", "CD_ESC", "MSP_DP", "MAV_HL", "TRAMP", "DDS", "IMUOUT", "IQ", "PPP", "IBUS_TLM" }; static_assert(AP_SerialManager::SerialProtocol_NumProtocols == ARRAY_SIZE(SERIAL_PROTOCOL_VALUES), "Wrong size SerialProtocol_NumProtocols"); diff --git a/libraries/AP_OSD/AP_OSD_Screen.cpp b/libraries/AP_OSD/AP_OSD_Screen.cpp index 8074ad2b6d..947203c3ab 100644 --- a/libraries/AP_OSD/AP_OSD_Screen.cpp +++ b/libraries/AP_OSD/AP_OSD_Screen.cpp @@ -358,7 +358,7 @@ const AP_Param::GroupInfo AP_OSD_Screen::var_info[] = { #if HAL_WITH_ESC_TELEM // @Param: ESCTEMP_EN // @DisplayName: ESCTEMP_EN - // @Description: Displays first esc's temp + // @Description: Displays highest temp of all active ESCs, or of a specific ECS if OSDx_ESC_IDX is set // @Values: 0:Disabled,1:Enabled // @Param: ESCTEMP_X @@ -374,7 +374,7 @@ const AP_Param::GroupInfo AP_OSD_Screen::var_info[] = { // @Param: ESCRPM_EN // @DisplayName: ESCRPM_EN - // @Description: Displays first esc's rpm + // @Description: Displays highest rpm of all active ESCs, or of a specific ESC if OSDx_ESC_IDX is set // @Values: 0:Disabled,1:Enabled // @Param: ESCRPM_X @@ -390,7 +390,7 @@ const AP_Param::GroupInfo AP_OSD_Screen::var_info[] = { // @Param: ESCAMPS_EN // @DisplayName: ESCAMPS_EN - // @Description: Displays first esc's current + // @Description: Displays the current of the ESC with the highest rpm of all active ESCs, or of a specific ESC if OSDx_ESC_IDX is set // @Values: 0:Disabled,1:Enabled // @Param: ESCAMPS_X @@ -1166,6 +1166,14 @@ const AP_Param::GroupInfo AP_OSD_Screen::var_info2[] = { AP_SUBGROUPINFO(rc_lq, "RC_LQ", 9, AP_OSD_Screen, AP_OSD_Setting), #endif +#if HAL_WITH_ESC_TELEM + // @Param: ESC_IDX + // @DisplayName: ESC_IDX + // @Description: Index of the ESC to use for displaying ESC information. 0 means use the ESC with the highest value. + // @Range: 0 32 + AP_GROUPINFO("ESC_IDX", 10, AP_OSD_Screen, esc_index, 0), +#endif + AP_GROUPEND }; @@ -2003,8 +2011,13 @@ void AP_OSD_Screen::draw_vspeed(uint8_t x, uint8_t y) void AP_OSD_Screen::draw_esc_temp(uint8_t x, uint8_t y) { int16_t etemp; - // first parameter is index into array of ESC's. Hardwire to zero (first) for now. - if (!AP::esc_telem().get_temperature(0, etemp)) { + + if (esc_index > 0) { + if (!AP::esc_telem().get_temperature(esc_index-1, etemp)) { + return; + } + } + else if (!AP::esc_telem().get_highest_temperature(etemp)) { return; } @@ -2014,8 +2027,12 @@ void AP_OSD_Screen::draw_esc_temp(uint8_t x, uint8_t y) void AP_OSD_Screen::draw_esc_rpm(uint8_t x, uint8_t y) { float rpm; - // first parameter is index into array of ESC's. Hardwire to zero (first) for now. - if (!AP::esc_telem().get_rpm(0, rpm)) { + uint8_t esc = AP::esc_telem().get_max_rpm_esc(); + if (esc_index > 0) { + if (!AP::esc_telem().get_rpm(esc_index-1, rpm)) { + return; + } + } else if (!AP::esc_telem().get_rpm(esc, rpm)) { return; } float krpm = rpm * 0.001f; @@ -2026,8 +2043,12 @@ void AP_OSD_Screen::draw_esc_rpm(uint8_t x, uint8_t y) void AP_OSD_Screen::draw_esc_amps(uint8_t x, uint8_t y) { float amps; - // first parameter is index into array of ESC's. Hardwire to zero (first) for now. - if (!AP::esc_telem().get_current(0, amps)) { + uint8_t esc = AP::esc_telem().get_max_rpm_esc(); + if (esc_index > 0) { + if (!AP::esc_telem().get_current(esc_index-1, amps)) { + return; + } + } else if (!AP::esc_telem().get_current(esc, amps)) { return; } backend->write(x, y, false, "%4.1f%c", amps, SYMBOL(SYM_AMP)); @@ -2513,6 +2534,7 @@ void AP_OSD_Screen::draw_fence(uint8_t x, uint8_t y) } #endif +#if AP_RANGEFINDER_ENABLED void AP_OSD_Screen::draw_rngf(uint8_t x, uint8_t y) { RangeFinder *rangefinder = RangeFinder::get_singleton(); @@ -2526,6 +2548,7 @@ void AP_OSD_Screen::draw_rngf(uint8_t x, uint8_t y) backend->write(x, y, false, "%c%4.1f%c", SYMBOL(SYM_RNGFD), u_scale(DISTANCE, distance), u_icon(DISTANCE)); } } +#endif #define DRAW_SETTING(n) if (n.enabled) draw_ ## n(n.xpos, n.ypos) @@ -2551,7 +2574,9 @@ void AP_OSD_Screen::draw(void) DRAW_SETTING(hgt_abvterr); #endif +#if AP_RANGEFINDER_ENABLED DRAW_SETTING(rngf); +#endif DRAW_SETTING(waypoint); DRAW_SETTING(xtrack_error); DRAW_SETTING(bat_volt); @@ -2559,8 +2584,10 @@ void AP_OSD_Screen::draw(void) DRAW_SETTING(avgcellvolt); DRAW_SETTING(avgcellrestvolt); DRAW_SETTING(restvolt); +#if AP_RSSI_ENABLED DRAW_SETTING(rssi); DRAW_SETTING(link_quality); +#endif DRAW_SETTING(current); DRAW_SETTING(batused); DRAW_SETTING(bat2used); diff --git a/libraries/AP_OpticalFlow/AP_OpticalFlow.cpp b/libraries/AP_OpticalFlow/AP_OpticalFlow.cpp index fc14d0d316..3492718ea4 100644 --- a/libraries/AP_OpticalFlow/AP_OpticalFlow.cpp +++ b/libraries/AP_OpticalFlow/AP_OpticalFlow.cpp @@ -140,7 +140,7 @@ void AP_OpticalFlow::init(uint32_t log_bit) #endif break; case Type::BEBOP: -#if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BEBOP +#if AP_OPTICALFLOW_ONBOARD_ENABLED backend = NEW_NOTHROW AP_OpticalFlow_Onboard(*this); #endif break; diff --git a/libraries/AP_OpticalFlow/AP_OpticalFlow_PX4Flow.cpp b/libraries/AP_OpticalFlow/AP_OpticalFlow_PX4Flow.cpp index 17380ed38a..aaf876e59a 100644 --- a/libraries/AP_OpticalFlow/AP_OpticalFlow_PX4Flow.cpp +++ b/libraries/AP_OpticalFlow/AP_OpticalFlow_PX4Flow.cpp @@ -78,7 +78,7 @@ bool AP_OpticalFlow_PX4Flow::scan_buses(void) struct i2c_integral_frame frame; success = tdev->read_registers(REG_INTEGRAL_FRAME, (uint8_t *)&frame, sizeof(frame)); if (success) { - printf("Found PX4Flow on bus %u\n", bus); + printf("Found PX4Flow on bus %u\n", unsigned(bus)); dev = std::move(tdev); break; } diff --git a/libraries/AP_Param/AP_Param.cpp b/libraries/AP_Param/AP_Param.cpp index 16838b7750..270b7c3313 100644 --- a/libraries/AP_Param/AP_Param.cpp +++ b/libraries/AP_Param/AP_Param.cpp @@ -2533,7 +2533,7 @@ void AP_Param::load_param_defaults(const volatile char *ptr, int32_t length, boo AP_Param *vp = find(pname, &var_type); if (!vp) { if (last_pass) { -#if ENABLE_DEBUG +#if ENABLE_DEBUG && (AP_PARAM_MAX_EMBEDDED_PARAM > 0) ::printf("Ignored unknown param %s from embedded region (offset=%u)\n", pname, unsigned(ptr - param_defaults_data.data)); hal.console->printf( diff --git a/libraries/AP_Proximity/AP_Proximity_LightWareSF45B.cpp b/libraries/AP_Proximity/AP_Proximity_LightWareSF45B.cpp index 47e0e28e8e..1911ea9126 100644 --- a/libraries/AP_Proximity/AP_Proximity_LightWareSF45B.cpp +++ b/libraries/AP_Proximity/AP_Proximity_LightWareSF45B.cpp @@ -99,11 +99,11 @@ void AP_Proximity_LightWareSF45B::process_replies() // process up to 1K of characters per iteration uint32_t nbytes = MIN(_uart->available(), 1024U); while (nbytes-- > 0) { - const int16_t r = _uart->read(); - if ((r < 0) || (r > 0xFF)) { + uint8_t c; + if (!_uart->read(c)) { continue; } - if (parse_byte((uint8_t)r)) { + if (parse_byte(c)) { process_message(); } } diff --git a/libraries/AP_Proximity/AP_Proximity_RPLidarA2.cpp b/libraries/AP_Proximity/AP_Proximity_RPLidarA2.cpp index b87ab8b049..fc31ef40f5 100644 --- a/libraries/AP_Proximity/AP_Proximity_RPLidarA2.cpp +++ b/libraries/AP_Proximity/AP_Proximity_RPLidarA2.cpp @@ -43,7 +43,7 @@ #include #if RP_DEBUG_LEVEL - #define Debug(level, fmt, args ...) do { if (level <= RP_DEBUG_LEVEL) { gcs().send_text(MAV_SEVERITY_INFO, fmt, ## args); } } while (0) + #define Debug(level, fmt, args ...) do { if (level <= RP_DEBUG_LEVEL) { GCS_SEND_TEXT(MAV_SEVERITY_INFO, fmt, ## args); } } while (0) #else #define Debug(level, fmt, args ...) #endif @@ -252,7 +252,7 @@ void AP_Proximity_RPLidarA2::get_readings() Debug(1, "Got RPLidar Information"); char xbuffer[64]{}; memcpy((void*)xbuffer, (void*)&_payload.information, 63); - gcs().send_text(MAV_SEVERITY_INFO, "RPLidar: (%s)", xbuffer); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "RPLidar: (%s)", xbuffer); #endif // 63 is the magic number of bytes in the spewed-out // reset data ... so now we'll just drop that stuff on diff --git a/libraries/AP_Proximity/AP_Proximity_TeraRangerTower.cpp b/libraries/AP_Proximity/AP_Proximity_TeraRangerTower.cpp index f467045035..4fe6fb6db0 100644 --- a/libraries/AP_Proximity/AP_Proximity_TeraRangerTower.cpp +++ b/libraries/AP_Proximity/AP_Proximity_TeraRangerTower.cpp @@ -65,8 +65,8 @@ bool AP_Proximity_TeraRangerTower::read_sensor_data() int16_t nbytes = _uart->available(); while (nbytes-- > 0) { - int16_t c = _uart->read(); - if (c==-1) { + uint8_t c; + if (!_uart->read(c)) { return false; } if (char(c) == 'T' ) { diff --git a/libraries/AP_RCProtocol/AP_RCProtocol_CRSF.cpp b/libraries/AP_RCProtocol/AP_RCProtocol_CRSF.cpp index ce870cd0ac..9372946a6a 100644 --- a/libraries/AP_RCProtocol/AP_RCProtocol_CRSF.cpp +++ b/libraries/AP_RCProtocol/AP_RCProtocol_CRSF.cpp @@ -178,7 +178,7 @@ AP_RCProtocol_CRSF::AP_RCProtocol_CRSF(AP_RCProtocol &_frontend) : AP_RCProtocol _singleton = this; } #endif -#if HAL_CRSF_TELEM_ENABLED && !APM_BUILD_TYPE(APM_BUILD_iofirmware) && !APM_BUILD_TYPE(APM_BUILD_UNKNOWN) +#if HAL_CRSF_TELEM_ENABLED && !APM_BUILD_TYPE(APM_BUILD_UNKNOWN) _uart = AP::serialmanager().find_serial(AP_SerialManager::SerialProtocol_CRSF, 0); if (_uart) { start_uart(); @@ -561,7 +561,7 @@ bool AP_RCProtocol_CRSF::process_telemetry(bool check_constraint) } if (!telem_available) { -#if HAL_CRSF_TELEM_ENABLED && !APM_BUILD_TYPE(APM_BUILD_iofirmware) +#if HAL_CRSF_TELEM_ENABLED if (AP_CRSF_Telem::get_telem_data(&_telemetry_frame, is_tx_active())) { telem_available = true; } else { diff --git a/libraries/AP_RCTelemetry/AP_CRSF_Telem.cpp b/libraries/AP_RCTelemetry/AP_CRSF_Telem.cpp index 24ae36cc97..c5d554c8af 100644 --- a/libraries/AP_RCTelemetry/AP_CRSF_Telem.cpp +++ b/libraries/AP_RCTelemetry/AP_CRSF_Telem.cpp @@ -70,10 +70,12 @@ bool AP_CRSF_Telem::init(void) return false; } +#if AP_VIDEOTX_ENABLED // Someone explicitly configure CRSF control for VTX if (AP::serialmanager().have_serial(AP_SerialManager::SerialProtocol_CRSF, 0)) { AP::vtx().set_provider_enabled(AP_VideoTX::VTXType::CRSF); } +#endif return AP_RCTelemetry::init(); } diff --git a/libraries/AP_RCTelemetry/AP_Spektrum_Telem.cpp b/libraries/AP_RCTelemetry/AP_Spektrum_Telem.cpp index a196574adb..c5daa09ea7 100644 --- a/libraries/AP_RCTelemetry/AP_Spektrum_Telem.cpp +++ b/libraries/AP_RCTelemetry/AP_Spektrum_Telem.cpp @@ -578,11 +578,17 @@ void AP_Spektrum_Telem::calc_gps_status() void AP_Spektrum_Telem::calc_esc() { #if HAL_WITH_ESC_TELEM - const volatile AP_ESC_Telem_Backend::TelemetryData& td = AP::esc_telem().get_telem_data(0); // ideally should rotate between ESCs + uint8_t esc = AP::esc_telem().get_max_rpm_esc(); + const volatile AP_ESC_Telem_Backend::TelemetryData& td = AP::esc_telem().get_telem_data(esc); // ideally should rotate between ESCs + float rpm = 0.0f; + uint16_t rpmdata = 0xFFFFU; + if (AP::esc_telem().get_rpm(esc, rpm)) { + rpmdata = uint16_t(roundf(rpm)); + } _telem.esc.identifier = TELE_DEVICE_ESC; // Source device = 0x20 _telem.esc.sID = 0; // Secondary ID - _telem.esc.RPM = htobe16(uint16_t(roundf(AP::esc_telem().get_average_motor_frequency_hz() * 60))); // Electrical RPM, 10RPM (0-655340 RPM) 0xFFFF --> "No data" + _telem.esc.RPM = htobe16(rpmdata); // Electrical RPM, 10RPM (0-655340 RPM) 0xFFFF --> "No data" _telem.esc.voltsInput = htobe16(td.voltage * 100); // Volts, 0.01v (0-655.34V) 0xFFFF --> "No data" _telem.esc.tempFET = htobe16(td.temperature_cdeg * 10); // Temperature, 0.1C (0-6553.4C) 0xFFFF --> "No data" _telem.esc.currentMotor = htobe16(td.current * 100); // Current, 10mA (0-655.34A) 0xFFFF --> "No data" diff --git a/libraries/AP_RPM/AP_RPM.cpp b/libraries/AP_RPM/AP_RPM.cpp index 79a2646030..30bfcedc60 100644 --- a/libraries/AP_RPM/AP_RPM.cpp +++ b/libraries/AP_RPM/AP_RPM.cpp @@ -44,6 +44,18 @@ const AP_Param::GroupInfo AP_RPM::var_info[] = { AP_SUBGROUPINFO(_params[1], "2_", 15, AP_RPM, AP_RPM_Params), #endif +#if RPM_MAX_INSTANCES > 2 + // @Group: 3_ + // @Path: AP_RPM_Params.cpp + AP_SUBGROUPINFO(_params[2], "3_", 16, AP_RPM, AP_RPM_Params), +#endif + +#if RPM_MAX_INSTANCES > 3 + // @Group: 4_ + // @Path: AP_RPM_Params.cpp + AP_SUBGROUPINFO(_params[3], "4_", 17, AP_RPM, AP_RPM_Params), +#endif + AP_GROUPEND }; @@ -214,9 +226,7 @@ void AP_RPM::update(void) } #if HAL_LOGGING_ENABLED - if (enabled(0) || enabled(1)) { - Log_RPM(); - } + Log_RPM(); #endif } @@ -295,18 +305,23 @@ bool AP_RPM::arming_checks(size_t buflen, char *buffer) const #if HAL_LOGGING_ENABLED void AP_RPM::Log_RPM() const { - float rpm1 = -1, rpm2 = -1; + // update logging for each instance + for (uint8_t i=0; iget_debug_level())) { printf(fmt, ##args); }} while (0) // Output debug information on the mavlink to the UART connected to the WiFi, wrapped in MavLink packets -#define DebugMavlink(level, fmt, args...) do { if ((level) <= get_debug_level()) { gcs().send_text(MAV_SEVERITY_INFO, fmt, ##args); }} while (0) +#define DebugMavlink(level, fmt, args...) do { if ((level) <= get_debug_level()) { GCS_SEND_TEXT(MAV_SEVERITY_INFO, fmt, ##args); }} while (0) #if SUPPORT_BK_DEBUG_PINS diff --git a/libraries/AP_Radio/AP_Radio_cc2500.cpp b/libraries/AP_Radio/AP_Radio_cc2500.cpp index 34ef0eef30..cce9b4ffcf 100644 --- a/libraries/AP_Radio/AP_Radio_cc2500.cpp +++ b/libraries/AP_Radio/AP_Radio_cc2500.cpp @@ -30,7 +30,7 @@ extern const AP_HAL::HAL& hal; -#define Debug(level, fmt, args...) do { if ((level) <= get_debug_level()) { gcs().send_text(MAV_SEVERITY_INFO, fmt, ##args); }} while (0) +#define Debug(level, fmt, args...) do { if ((level) <= get_debug_level()) { GCS_SEND_TEXT(MAV_SEVERITY_INFO, fmt, ##args); }} while (0) // object instance for trampoline AP_Radio_cc2500 *AP_Radio_cc2500::radio_singleton; diff --git a/libraries/AP_Radio/AP_Radio_cypress.cpp b/libraries/AP_Radio/AP_Radio_cypress.cpp index 7d3d2101be..fc27088469 100644 --- a/libraries/AP_Radio/AP_Radio_cypress.cpp +++ b/libraries/AP_Radio/AP_Radio_cypress.cpp @@ -42,7 +42,7 @@ extern const AP_HAL::HAL& hal; -#define Debug(level, fmt, args...) do { if ((level) <= get_debug_level()) { gcs().send_text(MAV_SEVERITY_INFO, fmt, ##args); }} while (0) +#define Debug(level, fmt, args...) do { if ((level) <= get_debug_level()) { GCS_SEND_TEXT(MAV_SEVERITY_INFO, fmt, ##args); }} while (0) #define LP_FIFO_SIZE 16 // Physical data FIFO lengths in Radio diff --git a/libraries/AP_RangeFinder/AP_RangeFinder.cpp b/libraries/AP_RangeFinder/AP_RangeFinder.cpp index 6f1f4a6c26..2134162eab 100644 --- a/libraries/AP_RangeFinder/AP_RangeFinder.cpp +++ b/libraries/AP_RangeFinder/AP_RangeFinder.cpp @@ -14,6 +14,9 @@ */ #include "AP_RangeFinder.h" + +#if AP_RANGEFINDER_ENABLED + #include "AP_RangeFinder_analog.h" #include "AP_RangeFinder_PulsedLightLRF.h" #include "AP_RangeFinder_MaxsonarI2CXL.h" @@ -273,7 +276,6 @@ bool RangeFinder::_add_backend(AP_RangeFinder_Backend *backend, uint8_t instance */ void RangeFinder::detect_instance(uint8_t instance, uint8_t& serial_instance) { -#if AP_RANGEFINDER_ENABLED AP_RangeFinder_Backend_Serial *(*serial_create_fn)(RangeFinder::RangeFinder_State&, AP_RangeFinder_Params&) = nullptr; const Type _type = (Type)params[instance].type.get(); @@ -618,7 +620,6 @@ void RangeFinder::detect_instance(uint8_t instance, uint8_t& serial_instance) // param count could have changed AP_Param::invalidate_count(); } -#endif //AP_RANGEFINDER_ENABLED } AP_RangeFinder_Backend *RangeFinder::get_backend(uint8_t id) const { @@ -925,3 +926,4 @@ RangeFinder *rangefinder() } +#endif // AP_RANGEFINDER_ENABLED diff --git a/libraries/AP_RangeFinder/AP_RangeFinder.h b/libraries/AP_RangeFinder/AP_RangeFinder.h index f94b0205ef..c67ad5cce7 100644 --- a/libraries/AP_RangeFinder/AP_RangeFinder.h +++ b/libraries/AP_RangeFinder/AP_RangeFinder.h @@ -16,6 +16,8 @@ #include "AP_RangeFinder_config.h" +#if AP_RANGEFINDER_ENABLED + #include #include #include @@ -319,3 +321,5 @@ private: namespace AP { RangeFinder *rangefinder(); }; + +#endif // AP_RANGEFINDER_ENABLED diff --git a/libraries/AP_RangeFinder/AP_RangeFinder_Backend.cpp b/libraries/AP_RangeFinder/AP_RangeFinder_Backend.cpp index bd0e9be294..3ae267a928 100644 --- a/libraries/AP_RangeFinder/AP_RangeFinder_Backend.cpp +++ b/libraries/AP_RangeFinder/AP_RangeFinder_Backend.cpp @@ -13,6 +13,10 @@ along with this program. If not, see . */ +#include "AP_RangeFinder_config.h" + +#if AP_RANGEFINDER_ENABLED + #include #include #include "AP_RangeFinder.h" @@ -89,3 +93,4 @@ void AP_RangeFinder_Backend::get_state(RangeFinder::RangeFinder_State &state_arg } #endif +#endif // AP_RANGEFINDER_ENABLED diff --git a/libraries/AP_RangeFinder/AP_RangeFinder_Backend.h b/libraries/AP_RangeFinder/AP_RangeFinder_Backend.h index ca2decd044..e1ae5b5012 100644 --- a/libraries/AP_RangeFinder/AP_RangeFinder_Backend.h +++ b/libraries/AP_RangeFinder/AP_RangeFinder_Backend.h @@ -14,6 +14,10 @@ */ #pragma once +#include "AP_RangeFinder_config.h" + +#if AP_RANGEFINDER_ENABLED + #include #include #include @@ -100,3 +104,5 @@ protected: virtual MAV_DISTANCE_SENSOR _get_mav_distance_sensor_type() const = 0; }; + +#endif // AP_RANGEFINDER_ENABLED diff --git a/libraries/AP_RangeFinder/AP_RangeFinder_Backend_CAN.cpp b/libraries/AP_RangeFinder/AP_RangeFinder_Backend_CAN.cpp index ebc60dc2d1..69e43afc48 100644 --- a/libraries/AP_RangeFinder/AP_RangeFinder_Backend_CAN.cpp +++ b/libraries/AP_RangeFinder/AP_RangeFinder_Backend_CAN.cpp @@ -13,11 +13,13 @@ along with this program. If not, see . */ +#include "AP_RangeFinder_config.h" + +#if AP_RANGEFINDER_BACKEND_CAN_ENABLED + #include #include "AP_RangeFinder_Backend_CAN.h" -#if HAL_MAX_CAN_PROTOCOL_DRIVERS - const AP_Param::GroupInfo AP_RangeFinder_Backend_CAN::var_info[] = { // @Param: RECV_ID @@ -87,4 +89,4 @@ bool AP_RangeFinder_Backend_CAN::is_correct_id(uint32_t id) const return true; } -#endif // HAL_MAX_CAN_PROTOCOL_DRIVERS +#endif // AP_RANGEFINDER_BACKEND_CAN_ENABLED diff --git a/libraries/AP_RangeFinder/AP_RangeFinder_Backend_CAN.h b/libraries/AP_RangeFinder/AP_RangeFinder_Backend_CAN.h index 96d62aa94d..5f91509419 100644 --- a/libraries/AP_RangeFinder/AP_RangeFinder_Backend_CAN.h +++ b/libraries/AP_RangeFinder/AP_RangeFinder_Backend_CAN.h @@ -1,9 +1,10 @@ #pragma once +#include "AP_RangeFinder_config.h" + +#if AP_RANGEFINDER_BACKEND_CAN_ENABLED + #include "AP_RangeFinder_Backend.h" - -#if HAL_MAX_CAN_PROTOCOL_DRIVERS - #include #include @@ -61,4 +62,4 @@ private: uint32_t _distance_count; }; -#endif // HAL_MAX_CAN_PROTOCOL_DRIVERS +#endif // AP_RANGEFINDER_BACKEND_CAN_ENABLED diff --git a/libraries/AP_RangeFinder/AP_RangeFinder_Backend_Serial.cpp b/libraries/AP_RangeFinder/AP_RangeFinder_Backend_Serial.cpp index af27aaf5a7..0dacdca94d 100644 --- a/libraries/AP_RangeFinder/AP_RangeFinder_Backend_Serial.cpp +++ b/libraries/AP_RangeFinder/AP_RangeFinder_Backend_Serial.cpp @@ -13,6 +13,10 @@ along with this program. If not, see . */ +#include "AP_RangeFinder_config.h" + +#if AP_RANGEFINDER_ENABLED + #include #include "AP_RangeFinder_Backend_Serial.h" #include @@ -61,3 +65,5 @@ void AP_RangeFinder_Backend_Serial::update(void) set_status(RangeFinder::Status::NoData); } } + +#endif // AP_RANGEFINDER_ENABLED diff --git a/libraries/AP_RangeFinder/AP_RangeFinder_Backend_Serial.h b/libraries/AP_RangeFinder/AP_RangeFinder_Backend_Serial.h index e4349d75b8..35f3f8dca4 100644 --- a/libraries/AP_RangeFinder/AP_RangeFinder_Backend_Serial.h +++ b/libraries/AP_RangeFinder/AP_RangeFinder_Backend_Serial.h @@ -1,5 +1,9 @@ #pragma once +#include "AP_RangeFinder_config.h" + +#if AP_RANGEFINDER_ENABLED + #include "AP_RangeFinder_Backend.h" class AP_RangeFinder_Backend_Serial : public AP_RangeFinder_Backend @@ -38,3 +42,5 @@ protected: // maximum time between readings before we change state to NoData: virtual uint16_t read_timeout_ms() const { return 200; } }; + +#endif // AP_RANGEFINDER_ENABLED diff --git a/libraries/AP_RangeFinder/AP_RangeFinder_HC_SR04.cpp b/libraries/AP_RangeFinder/AP_RangeFinder_HC_SR04.cpp index 6e7cc156ec..942d0eeb9e 100644 --- a/libraries/AP_RangeFinder/AP_RangeFinder_HC_SR04.cpp +++ b/libraries/AP_RangeFinder/AP_RangeFinder_HC_SR04.cpp @@ -104,7 +104,7 @@ void AP_RangeFinder_HC_SR04::update(void) state.distance_m = 0.0f; } } else { - // gcs().send_text(MAV_SEVERITY_WARNING, "Pong!"); + // GCS_SEND_TEXT(MAV_SEVERITY_WARNING, "Pong!"); // a new reading - convert time to distance state.distance_m = (value_us * (1.0/58.0f)) * 0.01f; // 58 is from datasheet, mult for performance @@ -134,7 +134,7 @@ void AP_RangeFinder_HC_SR04::update(void) // consider sending new ping if (now - last_ping_ms > 67) { // read ~@15Hz - recommended 60ms delay from datasheet last_ping_ms = now; - // gcs().send_text(MAV_SEVERITY_INFO, "Ping!"); + // GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Ping!"); // raise stop pin for n-microseconds hal.gpio->pinMode(trigger_pin, HAL_GPIO_OUTPUT); hal.gpio->write(trigger_pin, 1); diff --git a/libraries/AP_RangeFinder/AP_RangeFinder_Params.cpp b/libraries/AP_RangeFinder/AP_RangeFinder_Params.cpp index 83816dd865..ae6812021d 100644 --- a/libraries/AP_RangeFinder/AP_RangeFinder_Params.cpp +++ b/libraries/AP_RangeFinder/AP_RangeFinder_Params.cpp @@ -1,3 +1,7 @@ +#include "AP_RangeFinder_config.h" + +#if AP_RANGEFINDER_ENABLED + #include "AP_RangeFinder_Params.h" #include "AP_RangeFinder.h" @@ -16,7 +20,7 @@ const AP_Param::GroupInfo AP_RangeFinder_Params::var_info[] = { // @Param: PIN // @DisplayName: Rangefinder pin - // @Description: Analog or PWM input pin that rangefinder is connected to. Airspeed ports can be used for Analog input, AUXOUT can be used for PWM input. When using analog pin 103, the maximum value of the input in 3.3V. For PWM input, the pin must be configured as a digital GPIO, see the Wiki's "GPIOs" section for details. + // @Description: Analog or PWM input pin that rangefinder is connected to. Analog RSSI or Airspeed ports can be used for Analog inputs (some autopilots provide others also), Non-IOMCU Servo/MotorOutputs can be used for PWM input when configured as "GPIOs". Values for some autopilots are given as examples. Search wiki for "Analog pins" for analog pin or "GPIOs", if PWM input type, to determine pin number. // @Values: -1:Not Used,11:Pixracer,13:Pixhawk ADC4,14:Pixhawk ADC3,15:Pixhawk ADC6/Pixhawk2 ADC,50:AUX1,51:AUX2,52:AUX3,53:AUX4,54:AUX5,55:AUX6,103:Pixhawk SBUS // @User: Standard AP_GROUPINFO("PIN", 2, AP_RangeFinder_Params, pin, -1), @@ -139,3 +143,5 @@ const AP_Param::GroupInfo AP_RangeFinder_Params::var_info[] = { AP_RangeFinder_Params::AP_RangeFinder_Params(void) { AP_Param::setup_object_defaults(this, var_info); } + +#endif // AP_RANGEFINDER_ENABLED diff --git a/libraries/AP_RangeFinder/AP_RangeFinder_Params.h b/libraries/AP_RangeFinder/AP_RangeFinder_Params.h index 23e4406d07..17893c3e68 100644 --- a/libraries/AP_RangeFinder/AP_RangeFinder_Params.h +++ b/libraries/AP_RangeFinder/AP_RangeFinder_Params.h @@ -1,5 +1,9 @@ #pragma once +#include "AP_RangeFinder_config.h" + +#if AP_RANGEFINDER_ENABLED + #include #include @@ -27,3 +31,5 @@ public: AP_Int8 address; AP_Int8 orientation; }; + +#endif // AP_RANGEFINDER_ENABLED diff --git a/libraries/AP_RangeFinder/AP_RangeFinder_PulsedLightLRF.cpp b/libraries/AP_RangeFinder/AP_RangeFinder_PulsedLightLRF.cpp index 5ceb1925c0..dbb4ace8aa 100644 --- a/libraries/AP_RangeFinder/AP_RangeFinder_PulsedLightLRF.cpp +++ b/libraries/AP_RangeFinder/AP_RangeFinder_PulsedLightLRF.cpp @@ -207,7 +207,7 @@ bool AP_RangeFinder_PulsedLightLRF::init(void) } } - printf("Found LidarLite device=0x%x v2=%d v3hp=%d\n", _dev->get_bus_id(), (int)v2_hardware, (int)v3hp_hardware); + printf("Found LidarLite device=0x%x v2=%d v3hp=%d\n", unsigned(_dev->get_bus_id()), (int)v2_hardware, (int)v3hp_hardware); _dev->get_semaphore()->give(); diff --git a/libraries/AP_RangeFinder/AP_RangeFinder_VL53L0X.cpp b/libraries/AP_RangeFinder/AP_RangeFinder_VL53L0X.cpp index a5f32ce06b..2286532cc3 100644 --- a/libraries/AP_RangeFinder/AP_RangeFinder_VL53L0X.cpp +++ b/libraries/AP_RangeFinder/AP_RangeFinder_VL53L0X.cpp @@ -259,7 +259,7 @@ bool AP_RangeFinder_VL53L0X::check_id(void) v2 != 0xAA) { return false; } - printf("Detected VL53L0X on bus 0x%x\n", dev->get_bus_id()); + printf("Detected VL53L0X on bus 0x%x\n", unsigned(dev->get_bus_id())); return true; } diff --git a/libraries/AP_RangeFinder/AP_RangeFinder_VL53L1X.cpp b/libraries/AP_RangeFinder/AP_RangeFinder_VL53L1X.cpp index c444546239..97e778eb70 100644 --- a/libraries/AP_RangeFinder/AP_RangeFinder_VL53L1X.cpp +++ b/libraries/AP_RangeFinder/AP_RangeFinder_VL53L1X.cpp @@ -81,7 +81,7 @@ bool AP_RangeFinder_VL53L1X::check_id(void) (v2 != 0xCC)) { return false; } - printf("Detected VL53L1X on bus 0x%x\n", dev->get_bus_id()); + printf("Detected VL53L1X on bus 0x%x\n", unsigned(dev->get_bus_id())); return true; } diff --git a/libraries/AP_RangeFinder/AP_RangeFinder_config.h b/libraries/AP_RangeFinder/AP_RangeFinder_config.h index 71e1d01217..1f5407adaf 100644 --- a/libraries/AP_RangeFinder/AP_RangeFinder_config.h +++ b/libraries/AP_RangeFinder/AP_RangeFinder_config.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include #include @@ -14,15 +15,16 @@ #define AP_RANGEFINDER_BACKEND_DEFAULT_ENABLED AP_RANGEFINDER_ENABLED #endif +#ifndef AP_RANGEFINDER_BACKEND_CAN_ENABLED +#define AP_RANGEFINDER_BACKEND_CAN_ENABLED AP_RANGEFINDER_ENABLED && HAL_MAX_CAN_PROTOCOL_DRIVERS +#endif + #ifndef AP_RANGEFINDER_ANALOG_ENABLED #define AP_RANGEFINDER_ANALOG_ENABLED AP_RANGEFINDER_BACKEND_DEFAULT_ENABLED #endif #ifndef AP_RANGEFINDER_BBB_PRU_ENABLED -#define AP_RANGEFINDER_BBB_PRU_ENABLED ( \ - AP_RANGEFINDER_BACKEND_DEFAULT_ENABLED && \ - CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BBBMINI \ - ) +#define AP_RANGEFINDER_BBB_PRU_ENABLED (AP_RANGEFINDER_BACKEND_DEFAULT_ENABLED && CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BBBMINI) #endif #ifndef AP_RANGEFINDER_BENEWAKE_ENABLED @@ -94,7 +96,7 @@ #endif #ifndef AP_RANGEFINDER_LUA_ENABLED -#define AP_RANGEFINDER_LUA_ENABLED AP_SCRIPTING_ENABLED +#define AP_RANGEFINDER_LUA_ENABLED AP_RANGEFINDER_BACKEND_DEFAULT_ENABLED && AP_SCRIPTING_ENABLED #endif #ifndef AP_RANGEFINDER_MAVLINK_ENABLED @@ -110,7 +112,7 @@ #endif #ifndef HAL_MSP_RANGEFINDER_ENABLED -#define HAL_MSP_RANGEFINDER_ENABLED HAL_MSP_ENABLED +#define HAL_MSP_RANGEFINDER_ENABLED AP_RANGEFINDER_BACKEND_DEFAULT_ENABLED && HAL_MSP_ENABLED #endif #ifndef AP_RANGEFINDER_NMEA_ENABLED @@ -141,12 +143,16 @@ #define AP_RANGEFINDER_SIM_ENABLED (CONFIG_HAL_BOARD == HAL_BOARD_SITL && AP_RANGEFINDER_BACKEND_DEFAULT_ENABLED) #endif +#ifndef HAL_MSP_RANGEFINDER_ENABLED +#define HAL_MSP_RANGEFINDER_ENABLED (AP_RANGEFINDER_BACKEND_DEFAULT_ENABLED && HAL_MSP_ENABLED) +#endif + #ifndef AP_RANGEFINDER_TERARANGER_SERIAL_ENABLED #define AP_RANGEFINDER_TERARANGER_SERIAL_ENABLED AP_RANGEFINDER_BACKEND_DEFAULT_ENABLED #endif #ifndef AP_RANGEFINDER_TOFSENSEP_CAN_ENABLED -#define AP_RANGEFINDER_TOFSENSEP_CAN_ENABLED (HAL_MAX_CAN_PROTOCOL_DRIVERS && AP_RANGEFINDER_BACKEND_DEFAULT_ENABLED) +#define AP_RANGEFINDER_TOFSENSEP_CAN_ENABLED AP_RANGEFINDER_BACKEND_DEFAULT_ENABLED && AP_RANGEFINDER_BACKEND_CAN_ENABLED #endif #ifndef AP_RANGEFINDER_TOFSENSEF_I2C_ENABLED @@ -158,7 +164,7 @@ #endif #ifndef AP_RANGEFINDER_USD1_CAN_ENABLED -#define AP_RANGEFINDER_USD1_CAN_ENABLED (HAL_MAX_CAN_PROTOCOL_DRIVERS && AP_RANGEFINDER_BACKEND_DEFAULT_ENABLED) +#define AP_RANGEFINDER_USD1_CAN_ENABLED AP_RANGEFINDER_BACKEND_DEFAULT_ENABLED && AP_RANGEFINDER_BACKEND_CAN_ENABLED #endif #ifndef AP_RANGEFINDER_USD1_SERIAL_ENABLED diff --git a/libraries/AP_Scripting/AP_Scripting.cpp b/libraries/AP_Scripting/AP_Scripting.cpp index b283f9791a..b4056d7139 100644 --- a/libraries/AP_Scripting/AP_Scripting.cpp +++ b/libraries/AP_Scripting/AP_Scripting.cpp @@ -160,6 +160,43 @@ const AP_Param::GroupInfo AP_Scripting::var_info[] = { // @RebootRequired: True // @User: Advanced AP_GROUPINFO("THD_PRIORITY", 14, AP_Scripting, _thd_priority, uint8_t(ThreadPriority::NORMAL)), + +#if AP_SCRIPTING_SERIALDEVICE_ENABLED + // @Param: SDEV_EN + // @DisplayName: Scripting serial device enable + // @Description: Enable scripting serial devices + // @Values: 0:Disabled, 1:Enabled + // @RebootRequired: True + // @User: Advanced + AP_GROUPINFO_FLAGS("SDEV_EN", 15, AP_Scripting, _serialdevice.enable, 0, AP_PARAM_FLAG_ENABLE), + + // @Param: SDEV1_PROTO + // @DisplayName: Serial protocol of scripting serial device + // @Description: Serial protocol of scripting serial device + // @CopyFieldsFrom: SERIAL1_PROTOCOL + // @RebootRequired: True + // @User: Advanced + AP_GROUPINFO("SDEV1_PROTO", 16, AP_Scripting, _serialdevice.ports[0].state.protocol, -1), + +#if AP_SCRIPTING_SERIALDEVICE_NUM_PORTS > 1 + // @Param: SDEV2_PROTO + // @DisplayName: Serial protocol of scripting serial device + // @Description: Serial protocol of scripting serial device + // @CopyFieldsFrom: SCR_SDEV1_PROTO + AP_GROUPINFO("SDEV2_PROTO", 17, AP_Scripting, _serialdevice.ports[1].state.protocol, -1), +#endif + +#if AP_SCRIPTING_SERIALDEVICE_NUM_PORTS > 2 + // @Param: SDEV3_PROTO + // @DisplayName: Serial protocol of scripting serial device + // @Description: Serial protocol of scripting serial device + // @CopyFieldsFrom: SCR_SDEV1_PROTO + AP_GROUPINFO("SDEV3_PROTO", 18, AP_Scripting, _serialdevice.ports[2].state.protocol, -1), +#endif +#endif // AP_SCRIPTING_SERIALDEVICE_ENABLED + + // WARNING: additional parameters must be listed before SDEV_EN (but have an + // index after SDEV3_PROTO) so they are not disabled by it! AP_GROUPEND }; @@ -220,6 +257,16 @@ void AP_Scripting::init(void) { } } +#if AP_SCRIPTING_SERIALDEVICE_ENABLED +void AP_Scripting::init_serialdevice_ports(void) { + if (!_enable) { + return; + } + + _serialdevice.init(); +} +#endif + #if HAL_GCS_ENABLED MAV_RESULT AP_Scripting::handle_command_int_packet(const mavlink_command_int_t &packet) { switch ((SCRIPTING_CMD)packet.param1) { @@ -264,6 +311,11 @@ void AP_Scripting::thread(void) { GCS_SEND_TEXT(MAV_SEVERITY_CRITICAL, "Scripting: %s", "Unable to allocate memory"); _init_failed = true; } else { +#if AP_SCRIPTING_SERIALDEVICE_ENABLED + // clear data in serial buffers that the script wasn't ready to + // receive + _serialdevice.clear(); +#endif // run won't return while scripting is still active lua->run(); @@ -298,6 +350,11 @@ void AP_Scripting::thread(void) { } } #endif // AP_NETWORKING_ENABLED + +#if AP_SCRIPTING_SERIALDEVICE_ENABLED + // clear data in serial buffers that hasn't been transmitted + _serialdevice.clear(); +#endif // Clear blocked commands { diff --git a/libraries/AP_Scripting/AP_Scripting.h b/libraries/AP_Scripting/AP_Scripting.h index a2b22e45de..367354227d 100644 --- a/libraries/AP_Scripting/AP_Scripting.h +++ b/libraries/AP_Scripting/AP_Scripting.h @@ -14,6 +14,8 @@ */ #pragma once +#include "AP_Scripting/AP_Scripting_config.h" + #if AP_SCRIPTING_ENABLED #include @@ -39,6 +41,10 @@ class SocketAPM; #endif +#if AP_SCRIPTING_SERIALDEVICE_ENABLED +#include "AP_Scripting_SerialDevice.h" +#endif + class AP_Scripting { public: @@ -49,6 +55,10 @@ public: void init(void); +#if AP_SCRIPTING_SERIALDEVICE_ENABLED + void init_serialdevice_ports(void); +#endif + void update(); bool enabled(void) const { return _enable != 0; }; @@ -110,8 +120,8 @@ public: // PWMSource storage uint8_t num_pwm_source; AP_HAL::PWMSource *_pwm_source[SCRIPTING_MAX_NUM_PWM_SOURCE]; - int get_current_ref() { return current_ref; } - void set_current_ref(int ref) { current_ref = ref; } + int get_current_env_ref() { return current_env_ref; } + void set_current_env_ref(int ref) { current_env_ref = ref; } #if AP_NETWORKING_ENABLED // SocketAPM storage @@ -138,6 +148,10 @@ public: command_block_list *mavlink_command_block_list; HAL_Semaphore mavlink_command_block_list_sem; + #if AP_SCRIPTING_SERIALDEVICE_ENABLED + AP_Scripting_SerialDevice _serialdevice; + #endif + private: void thread(void); // main script execution thread @@ -177,7 +191,7 @@ private: bool _stop; // true if scripts should be stopped static AP_Scripting *_singleton; - int current_ref; + int current_env_ref; }; namespace AP { diff --git a/libraries/AP_Scripting/AP_Scripting_SerialAccess.cpp b/libraries/AP_Scripting/AP_Scripting_SerialAccess.cpp new file mode 100644 index 0000000000..f82ef3a127 --- /dev/null +++ b/libraries/AP_Scripting/AP_Scripting_SerialAccess.cpp @@ -0,0 +1,72 @@ +/* + generic object to allow a script to use a serial driver stream from both + driver and device perspectives + */ + +#include "AP_Scripting_config.h" +#include "AP_Scripting.h" +#include "AP_Scripting_SerialAccess.h" + +#if AP_SCRIPTING_ENABLED + +#if AP_SCRIPTING_SERIALDEVICE_ENABLED +#define check_is_device_port() (is_device_port) +#define ON_DEVICE_PORT(func, ...) (((AP_Scripting_SerialDevice::Port*)stream)->device_##func (__VA_ARGS__)) +#else +#define check_is_device_port() (false) +#define ON_DEVICE_PORT(...) (0) // not executed +#endif + +void AP_Scripting_SerialAccess::begin(uint32_t baud) +{ + if (!check_is_device_port()) { + stream->begin(baud); + } +} + +size_t AP_Scripting_SerialAccess::write(uint8_t c) +{ + return write(&c, 1); +} + +size_t AP_Scripting_SerialAccess::write(const uint8_t *buffer, size_t size) +{ + if (!check_is_device_port()) { + return stream->write(buffer, size); + } + return ON_DEVICE_PORT(write, buffer, size); +} + +int16_t AP_Scripting_SerialAccess::read(void) +{ + uint8_t c; + if (read(&c, 1) != 1) { + return -1; + } + return c; +} + +ssize_t AP_Scripting_SerialAccess::read(uint8_t* buffer, uint16_t count) +{ + if (!check_is_device_port()) { + return stream->read(buffer, count); + } + return ON_DEVICE_PORT(read, buffer, count); +} + +uint32_t AP_Scripting_SerialAccess::available(void) +{ + if (!check_is_device_port()) { + return stream->available(); + } + return ON_DEVICE_PORT(available); +} + +void AP_Scripting_SerialAccess::set_flow_control(enum AP_HAL::UARTDriver::flow_control fcs) +{ + if (!check_is_device_port()) { + stream->set_flow_control(fcs); + } +} + +#endif // AP_SCRIPTING_ENABLED diff --git a/libraries/AP_Scripting/AP_Scripting_SerialAccess.h b/libraries/AP_Scripting/AP_Scripting_SerialAccess.h new file mode 100644 index 0000000000..7231359c81 --- /dev/null +++ b/libraries/AP_Scripting/AP_Scripting_SerialAccess.h @@ -0,0 +1,33 @@ +#pragma once + +#include "AP_Scripting_config.h" +#include "AP_Scripting.h" + +#include + +class AP_Scripting_SerialAccess { +public: + /* Do not allow copies */ + CLASS_NO_COPY(AP_Scripting_SerialAccess); + + AP_Scripting_SerialAccess() {} + + void begin(uint32_t baud); + + size_t write(uint8_t c); + size_t write(const uint8_t *buffer, size_t size); + + int16_t read(void); + ssize_t read(uint8_t *buffer, uint16_t count); + + uint32_t available(void); + + void set_flow_control(enum AP_HAL::UARTDriver::flow_control fcs); + + AP_HAL::UARTDriver *stream; +#if AP_SCRIPTING_ENABLED +#if AP_SCRIPTING_SERIALDEVICE_ENABLED + bool is_device_port; +#endif +#endif +}; diff --git a/libraries/AP_Scripting/AP_Scripting_SerialDevice.cpp b/libraries/AP_Scripting/AP_Scripting_SerialDevice.cpp new file mode 100644 index 0000000000..7f7f13fb64 --- /dev/null +++ b/libraries/AP_Scripting/AP_Scripting_SerialDevice.cpp @@ -0,0 +1,161 @@ +/* + port for a script to access from a device perspective + */ + +#include "AP_Scripting_config.h" + +#if AP_SCRIPTING_ENABLED && AP_SCRIPTING_SERIALDEVICE_ENABLED + +#include "AP_Scripting.h" + +#include +#include + +#ifndef AP_SCRIPTING_SERIALDEVICE_MIN_TXSIZE +#define AP_SCRIPTING_SERIALDEVICE_MIN_TXSIZE 2048 +#endif + +#ifndef AP_SCRIPTING_SERIALDEVICE_MIN_RXSIZE +#define AP_SCRIPTING_SERIALDEVICE_MIN_RXSIZE 2048 +#endif + +/* + initialise scripting serial ports +*/ +void AP_Scripting_SerialDevice::init(void) +{ + if (enable == 0) { + return; + } + + for (uint8_t i=0; iclear(); + } + if (writebuffer) { + writebuffer->clear(); + } +} + +size_t AP_Scripting_SerialDevice::Port::device_write(const uint8_t *buffer, size_t size) +{ + WITH_SEMAPHORE(sem); + if (readbuffer) { + return readbuffer->write(buffer, size); + } + return 0; +} + +ssize_t AP_Scripting_SerialDevice::Port::device_read(uint8_t *buffer, uint16_t count) +{ + WITH_SEMAPHORE(sem); + if (writebuffer) { + return writebuffer->read(buffer, count); + } + return 0; +} + +uint32_t AP_Scripting_SerialDevice::Port::device_available(void) +{ + WITH_SEMAPHORE(sem); + if (writebuffer) { + return writebuffer->available(); + } + return 0; +} + +/* + available space in outgoing buffer + */ +uint32_t AP_Scripting_SerialDevice::Port::txspace(void) +{ + WITH_SEMAPHORE(sem); + return writebuffer != nullptr ? writebuffer->space() : 0; +} + +void AP_Scripting_SerialDevice::Port::_begin(uint32_t b, uint16_t rxS, uint16_t txS) +{ + rxS = MAX(rxS, AP_SCRIPTING_SERIALDEVICE_MIN_RXSIZE); + txS = MAX(txS, AP_SCRIPTING_SERIALDEVICE_MIN_TXSIZE); + init_buffers(rxS, txS); +} + +size_t AP_Scripting_SerialDevice::Port::_write(const uint8_t *buffer, size_t size) +{ + WITH_SEMAPHORE(sem); + return writebuffer != nullptr ? writebuffer->write(buffer, size) : 0; +} + +ssize_t AP_Scripting_SerialDevice::Port::_read(uint8_t *buffer, uint16_t count) +{ + WITH_SEMAPHORE(sem); + return readbuffer != nullptr ? readbuffer->read(buffer, count) : -1; +} + +uint32_t AP_Scripting_SerialDevice::Port::_available() +{ + WITH_SEMAPHORE(sem); + return readbuffer != nullptr ? readbuffer->available() : 0; +} + + +bool AP_Scripting_SerialDevice::Port::_discard_input() +{ + WITH_SEMAPHORE(sem); + if (readbuffer != nullptr) { + readbuffer->clear(); + } + return true; +} + +/* + initialise read/write buffers + */ +bool AP_Scripting_SerialDevice::Port::init_buffers(const uint32_t size_rx, const uint32_t size_tx) +{ + if (size_tx == last_size_tx && + size_rx == last_size_rx) { + return true; + } + WITH_SEMAPHORE(sem); + if (readbuffer == nullptr) { + readbuffer = NEW_NOTHROW ByteBuffer(size_rx); + } else { + readbuffer->set_size_best(size_rx); + } + if (writebuffer == nullptr) { + writebuffer = NEW_NOTHROW ByteBuffer(size_tx); + } else { + writebuffer->set_size_best(size_tx); + } + last_size_rx = size_rx; + last_size_tx = size_tx; + return readbuffer != nullptr && writebuffer != nullptr; +} + +#endif // AP_SCRIPTING_ENABLED && AP_SCRIPTING_SERIALDEVICE_ENABLED diff --git a/libraries/AP_Scripting/AP_Scripting_SerialDevice.h b/libraries/AP_Scripting/AP_Scripting_SerialDevice.h new file mode 100644 index 0000000000..86273f1266 --- /dev/null +++ b/libraries/AP_Scripting/AP_Scripting_SerialDevice.h @@ -0,0 +1,69 @@ +#pragma once + +#include "AP_Scripting_config.h" + +#if AP_SCRIPTING_SERIALDEVICE_ENABLED + +#include + +#ifndef AP_SCRIPTING_SERIALDEVICE_NUM_PORTS +#define AP_SCRIPTING_SERIALDEVICE_NUM_PORTS 3 +#endif + +class AP_Scripting; + +class AP_Scripting_SerialDevice +{ +public: + /* Do not allow copies */ + CLASS_NO_COPY(AP_Scripting_SerialDevice); + + AP_Scripting_SerialDevice() {} + + AP_Int8 enable; + + void init(void); + void clear(void); + +public: + class Port : public AP_SerialManager::RegisteredPort { + public: + friend class AP_Scripting_SerialDevice; + void init(void); + void clear(void); + + size_t device_write(const uint8_t *buffer, size_t size); + ssize_t device_read(uint8_t *buffer, uint16_t count); + uint32_t device_available(void); + + private: + bool is_initialized() override { + return true; + } + bool tx_pending() override { + return false; + } + + bool init_buffers(const uint32_t size_rx, const uint32_t size_tx); + + uint32_t txspace() override; + void _begin(uint32_t b, uint16_t rxS, uint16_t txS) override; + size_t _write(const uint8_t *buffer, size_t size) override; + ssize_t _read(uint8_t *buffer, uint16_t count) override; + uint32_t _available() override; + void _end() override {} + void _flush() override {} + bool _discard_input() override; + + ByteBuffer *readbuffer; + ByteBuffer *writebuffer; + uint32_t last_size_tx; + uint32_t last_size_rx; + + HAL_Semaphore sem; + }; + + Port ports[AP_SCRIPTING_SERIALDEVICE_NUM_PORTS]; +}; + +#endif // AP_SCRIPTING_SERIALDEVICE_ENABLED diff --git a/libraries/AP_Scripting/AP_Scripting_config.h b/libraries/AP_Scripting/AP_Scripting_config.h index a58d83062b..77f9dc8d76 100644 --- a/libraries/AP_Scripting/AP_Scripting_config.h +++ b/libraries/AP_Scripting/AP_Scripting_config.h @@ -1,6 +1,7 @@ #pragma once #include +#include #ifndef AP_SCRIPTING_ENABLED #define AP_SCRIPTING_ENABLED (BOARD_FLASH_SIZE > 1024) @@ -12,3 +13,7 @@ #error "Scripting requires a filesystem" #endif #endif + +#ifndef AP_SCRIPTING_SERIALDEVICE_ENABLED +#define AP_SCRIPTING_SERIALDEVICE_ENABLED AP_SERIALMANAGER_REGISTER_ENABLED && (BOARD_FLASH_SIZE>1024) +#endif diff --git a/libraries/AP_Scripting/AP_Scripting_helpers.cpp b/libraries/AP_Scripting/AP_Scripting_helpers.cpp index 01251cfe12..380ac3ef73 100644 --- a/libraries/AP_Scripting/AP_Scripting_helpers.cpp +++ b/libraries/AP_Scripting/AP_Scripting_helpers.cpp @@ -20,9 +20,7 @@ int lua_new_Parameter(lua_State *L) { } // This chunk is the same as the auto generated constructor - luaL_checkstack(L, 2, "Out of stack"); void *ud = lua_newuserdata(L, sizeof(Parameter)); - memset(ud, 0, sizeof(Parameter)); new (ud) Parameter(); luaL_getmetatable(L, "Parameter"); lua_setmetatable(L, -2); diff --git a/libraries/AP_Scripting/applets/VTOL-quicktune.lua b/libraries/AP_Scripting/applets/VTOL-quicktune.lua index a04d5ed08e..29c5c3ae26 100644 --- a/libraries/AP_Scripting/applets/VTOL-quicktune.lua +++ b/libraries/AP_Scripting/applets/VTOL-quicktune.lua @@ -401,7 +401,7 @@ function adjust_gain(pname, value) local FF = params[ffname] if FF:get() > 0 then -- if we have any FF on an axis then we don't couple I to P, - -- usually we want I = FF for a one sectond time constant for trim + -- usually we want I = FF for a one second time constant for trim return end param_changed[iname] = true diff --git a/libraries/AP_Scripting/applets/forward_flight_motor_shutdown.lua b/libraries/AP_Scripting/applets/forward_flight_motor_shutdown.lua index 9c2daa97cb..202b3db30a 100644 --- a/libraries/AP_Scripting/applets/forward_flight_motor_shutdown.lua +++ b/libraries/AP_Scripting/applets/forward_flight_motor_shutdown.lua @@ -93,7 +93,6 @@ local slew local slew_pwm function update() - local switch_pos = switch:get_aux_switch_pos() if switch:get_aux_switch_pos() == 2 then if not script_enabled then gcs:send_text(0, "Lua: Forward flight motor shutdown enabled") diff --git a/libraries/AP_Scripting/applets/repl.lua b/libraries/AP_Scripting/applets/repl.lua new file mode 100644 index 0000000000..eedf551aa6 --- /dev/null +++ b/libraries/AP_Scripting/applets/repl.lua @@ -0,0 +1,358 @@ +-- Interactive REPL (read-evaluate-print-loop) for the Lua scripting engine +-- accessible over serial, with line editing, history, and output formatting. + +-- 0-based index of Scripting protocol port to use, or nil to use MAVLink +local PORT_IDX = 0 +local MAX_HISTORY = 50 -- number of lines of history to keep (must be >= 1) +local VERSION = "v1.0" -- version is convenience for the user + +local port +if PORT_IDX == nil then + port = require("mavport") +else + port = serial:find_serial(PORT_IDX) +end +assert(port, "REPL scripting port not configured") + +-- scan through parameters to find our port and grab its baud rate +do + local serial_info = "" + local baud = 115200 + if PORT_IDX ~= nil then + local port_num = 0 + while PORT_IDX >= 0 and port_num <= 9 do + local protocol = param:get(("SERIAL%d_PROTOCOL"):format(port_num)) + port_num = port_num + 1 + if protocol == 28 then PORT_IDX = PORT_IDX - 1 end + end + if PORT_IDX == -1 then -- correct port index found + port_num = port_num - 1 + baud = param:get(("SERIAL%d_BAUD"):format(port_num)) or 115200 + serial_info = (" on SERIAL%d, BAUD=%d"):format(port_num, baud) + end + end + -- if we can't find the right port, the baud probably does not matter + -- (e.g. CAN or network port) + port:begin(baud) + + gcs:send_text(6, "Lua REPL "..VERSION.." starting"..serial_info) +end + +-- grab things we use from the environment in case the user messes them up +local string = string +local table = table + +-- declaration of main state variable and functions +local state_func, state_read, state_eval, state_print + +-- write the string s to the port, buffering if not all could be written. +-- buffer starts of with the first message and prompt +local tx_buf = {"\r\n\r\nLua REPL "..VERSION.." started.\r\n> "} +local writestring +if port.writestring then -- use more efficient method if we have it + writestring = function(s) + if tx_buf then -- stuff already in the buffer? + tx_buf[#tx_buf+1] = s -- this needs to go after + else + local written = port:writestring(s) + if written < #s then + -- write was short i.e. port buffer is full. buffer the rest of the + -- string ourselves and transmit it later + tx_buf = { s:sub(written+1) } + end + end + end +else + writestring = function(s) + if tx_buf then -- stuff already in the buffer? + tx_buf[#tx_buf+1] = s -- this needs to go after + else + for ci = 1, #s do + if port:write(s:byte(ci)) == 0 then + -- write failed i.e. port buffer is full. we now buffer the rest of + -- the string ourselves and transmit it later + tx_buf = { s:sub(ci) } + break + end + end + end + end +end + +-- don't use print substitute in the REPL's code (e.g. for debugging the REPL) +local print = print -- luacheck: ignore 211 (unused variable warning) + +-- substitute print function for within the REPL that prints to the port +function _ENV.print(...) + local t = table.pack(...) + for i = 1, t.n do + writestring(tostring(t[i])) + writestring((i ~= t.n) and "\t" or "\r\n") + end +end + +-- write the character c to the port, buffering if failed +local function writechar(c) + -- buffer character if stuff already in buffer or write fails + if tx_buf or port:write(c) == 0 then + tx_buf[#tx_buf+1] = string.char(c) -- massive overhead... + end +end + +local function writeobj(o) + if type(o) == "table" then + writestring("{ ") + for k, v in pairs(o) do + if type(k) ~= "number" then k = '"'..k..'"' end + writestring("["..k.."] = ") + writeobj(v) + writestring(", ") + end + writestring("}") + else + writestring(tostring(o)) + end +end + +local curr_line = nil -- table of line bytes, or nil if viewing history +local curr_pos = 1 -- position the next character will be put at +local curr_esc = nil -- table of escape sequence bytes + +local eval_pieces = {} -- pieces of code being evaluated + +local history_lines = {""} -- lines in the history (one is always being edited) +local history_pos = 1 -- position in the history being edited + +local function writeprompt() + writestring((#eval_pieces > 0) and ">> " or "> ") +end + +local function movehistory(dir) + if curr_line then -- current line was edited, store it in history + history_lines[history_pos] = string.char(table.unpack(curr_line)) + curr_line = nil + end + + history_pos = history_pos + dir -- move to new position + + writestring("\x1B[2K\r") -- erase line and return cursor to start + writeprompt() -- draw prompt + local line = history_lines[history_pos] -- and current line from history + writestring(line) + curr_pos = #line + 1 +end + +local function readesc(c) + assert(curr_esc) -- only called if curr_esc isn't nil + + if c == 27 then -- another escape, clear line and buffer and exit escape mode + curr_line = nil + curr_pos = 1 + curr_esc = nil + eval_pieces = {} + history_pos = #history_lines + history_lines[history_pos] = "" + writestring("\r\n") + writeprompt() + return + else + curr_esc[#curr_esc+1] = c + end + + if curr_esc[1] ~= 91 then -- not a [, exit escape mode + curr_esc = nil + return + end + + if #curr_esc < 2 then return end -- command character not yet present + + local line_len = #history_lines[history_pos] + if curr_line then line_len = #curr_line end + + -- c is now the command character + if c == 65 then -- up + if history_pos > 1 then + movehistory(-1) + end + elseif c == 66 then -- down + if history_pos < #history_lines then + movehistory(1) + end + elseif c == 67 then -- right + if curr_pos < line_len + 1 then + writestring("\x1B[C") + curr_pos = curr_pos + 1 + end + elseif c == 68 then -- left + if curr_pos > 1 then + writestring("\x1B[D") + curr_pos = curr_pos - 1 + end + elseif c == 72 then -- home + if curr_pos > 1 then + writestring(("\x1B[%dD"):format(curr_pos-1)) + curr_pos = 1 + end + elseif c == 70 then -- end + if curr_pos < line_len + 1 then + writestring(("\x1B[%dC"):format(line_len-curr_pos+1)) + curr_pos = line_len + 1 + end + end + + curr_esc = nil -- exit escape mode, handling complete +end + +local last_c = 0 +state_read = function () + while true do + local c = port:read() + if c == -1 then return end -- no new character, give time for more to come + + if curr_esc then -- in escape sequence + readesc(c) + elseif c == 27 then -- escape, start of a control sequence + curr_esc = {} -- engage escape sequence handler + elseif c == 13 or c == 10 then -- line complete + if last_c ~= 13 or c ~= 10 then -- ignore \n after \r + writestring("\r\n") + last_c = c + break + end + elseif c == 8 or c == 127 then -- backspace + if curr_pos > 1 then -- a character to delete? + if curr_line == nil then -- retrieve line for editing + curr_line = table.pack(history_lines[history_pos]:byte(1, -1)) + end + table.remove(curr_line, curr_pos-1) -- delete the character + writechar(8) -- back cursor up + curr_pos = curr_pos - 1 + if curr_pos <= #curr_line then -- draw characters after deletion point + writestring(string.char(table.unpack(curr_line, curr_pos))) + end + -- blank out trailing character and back cursor up to deletion point + writestring((" \x1B[%dD"):format(#curr_line-curr_pos+2)) + end + elseif c >= 32 and c <= 126 then -- a character to type + if curr_line == nil then -- retrieve line for editing + curr_line = table.pack(history_lines[history_pos]:byte(1, -1)) + end + table.insert(curr_line, curr_pos, c) -- store character in the line + writechar(c) -- draw the new character + curr_pos = curr_pos + 1 + if curr_pos <= #curr_line then -- and any after + writestring(string.char(table.unpack(curr_line, curr_pos))) + -- back cursor up to insertion point + writestring(("\x1B[%dD"):format(#curr_line-curr_pos+1)) + end + end + + last_c = c + if tx_buf then return end -- give time to flush if buffer full + end + + -- loop break, line is complete! + local line = history_lines[history_pos] + if curr_line then + line = string.char(table.unpack(curr_line)) -- store line for processing + curr_line = nil + end + + if #line == 0 then -- line is empty, ignore it + writeprompt() + return + end + + -- if this line is different to the last one added (one before the last entry) + if history_lines[#history_lines-1] ~= line then + history_lines[#history_lines] = line -- insert it at history end + history_lines[#history_lines+1] = "" -- create empty entry for next line + if #history_lines > MAX_HISTORY then table.remove(history_lines, 1) end + else -- don't create a new entry with a duplicate line + history_lines[#history_lines] = "" -- just clear and reuse the last entry + end + history_pos = #history_lines -- now editing the last entry + curr_pos = 1 + + eval_pieces[#eval_pieces+1] = line -- evaluate the line + state_func = state_eval +end + +local function to_chunk(pieces) + local pos = 1 + + local function next_piece() + -- going past the last piece returns nil which signals the end + local piece = pieces[pos] + pos = pos + 1 + return piece + end + + return next_piece +end + +local eval_results +state_eval = function () + local func, err + -- try to compile a single line as "return %s;" assuming it could be an + -- expression. technique borrowed from the official Lua REPL. + if #eval_pieces == 1 then + local expr_pieces = {"return ", eval_pieces[1], ";"} + func = load(to_chunk(expr_pieces), "=input", "t", _ENV) + end + if func == nil then -- compilation unsuccessful, load normally + func, err = load(to_chunk(eval_pieces), "=input", "t", _ENV) + end + + -- if there is an error at the end of the statement, assume we need more to + -- complete it. technique borrowed from the official Lua REPL. + -- ignore check since load defines that err is not nil if func is nil + ---@diagnostic disable-next-line: need-check-nil + if func == nil and err:sub(-5, -1) == "" then + -- add a newline and get another line from the user + eval_pieces[#eval_pieces+1] = "\n" + writeprompt() + state_func = state_read + return + end + + eval_pieces = {} -- destroy to make room for result + if func == nil then -- result is the load error message + eval_results = { false, err, n = 2 } + else + eval_results = table.pack(pcall(func)) + end + state_func = state_print +end + +state_print = function () + for i = 2, eval_results.n do -- skip pcall result + writeobj(eval_results[i]) -- write each result separated by tabs + writestring((i ~= eval_results.n) and "\t" or "\r\n") + eval_results[i] = nil -- destroy to make room for stringified version + end + eval_results = nil + + writeprompt() + state_func = state_read -- loop back to read +end + +state_func = state_read +local function update() + if tx_buf then -- write out stuff in tx buffer if present + local old_buf = tx_buf + tx_buf = nil + for _, s in ipairs(old_buf) do -- re-write all data + writestring(s) + end + else -- otherwise we have time to process + state_func() + end + + ---@diagnostic disable-next-line: undefined-field + if PORT_IDX == nil then port:flush() end -- flush MAVLink port if using it + + return update, 10 +end + +return update() diff --git a/libraries/AP_Scripting/applets/repl.md b/libraries/AP_Scripting/applets/repl.md new file mode 100644 index 0000000000..e7fc55e0f5 --- /dev/null +++ b/libraries/AP_Scripting/applets/repl.md @@ -0,0 +1,63 @@ +# Lua REPL + +This script implements an interactive REPL (read-evaluate-print-loop) for the +Lua scripting engine accessible over serial, with line editing, history, and +output formatting. + +The script can also act as a client for QGroundControl's MAVLink Console +functionality (within the Analyze view), subject to limitations detailed +below. + +### Basic Usage +* Configure a serial port (e.g. `SERIALn_PROTOCOL`) to protocol 28 (Scripting). + * By default the first such port is used; this can be adjusted in the script + text. + * `SERIAL6` is the alternate USB serial port on Cube Orange, and convenient + for bench testing. CAN and network serial ports will also work. +* Load the `repl.lua` script onto the autopilot. +* Connect a terminal emulator to the port and enter Lua statements/expressions + at the `> ` prompt, then press Enter to execute. Results and errors will be + printed back. + * A `>> ` prompt indicates that more input is needed to complete the + statement. + * You can use the arrow keys to edit the current and previous inputs. + * Press ESC twice to clear the input and any incomplete statement then + return to an empty prompt. + +### Autopilot Connection +* On Linux a convenient command is e.g. `minicom -w -D /dev/ttyACM1 -b 115200`, + assuming you have the minicom terminal emulator installed. +* Any terminal emulator on any platform should work; see notes below about + control codes and other configuration. + +### SITL Connection +* Start SITL with a command like `Tools/autotest/sim_vehicle.py -A --serialN=tcp:9995:wait` to allow connection to the selected serial port. +* Connect a terminal emulator to localhost TCP port 9995 + * On Linux a convenient command is `stty -icanon -echo -icrnl && netcat localhost 9995`. + * Note that you must execute `reset` to turn echo back on once disconnected. + * Scripting must be restarted after a TCP reconnection. + +### MAVLink Connection +* Requires at least Ardupilot 4.6. +* Set the port in the script text to `nil` to enable. +* In addition to `repl.lua`, copy the `mavport.lua` file and `MAVLink` directory + from `AP_Scripting/modules` to `APM/SCRIPTS/MODULES` on your autopilot. +* The ESC key is not supported; cause a syntax error to reset the prompt. +* The experience over a radio link might be sub-par due to lack of any sort of + packet loss tracking or retransmission. + +### Notes and Limitations +* Statements like `local x = 3` create a variable which immediately goes out of + scope once evaluated. Names must be global to survive to the next prompt. +* There is currently no facility for installing periodic update callbacks. +* While theoretically impossible to accidentally crash the autopilot software, + certain scripting APIs can cause damage to you or your vehicle if used + improperly. Use extreme caution with an armed vehicle! +* The script expects Enter to be `\r`, `\r\n`, or `\n`. It prints `\r\n` for a + new line, and uses ANSI cursor control codes for line editing and history. + Check your terminal configuration if Enter doesn't work or you see garbage + characters. Lines longer than the terminal width likely won't edit properly. +* Evaluating complex statements or printing complex results can cause an + `exceeded time limit` error, stopping the script and losing variables and + history. Increasing the vehicle's `SCR_VM_I_COUNT` parameter reduces the + chance of this occurring. diff --git a/libraries/AP_Scripting/applets/x-quad-cg-allocation.lua b/libraries/AP_Scripting/applets/x-quad-cg-allocation.lua new file mode 100644 index 0000000000..89d80e9883 --- /dev/null +++ b/libraries/AP_Scripting/applets/x-quad-cg-allocation.lua @@ -0,0 +1,283 @@ +-- x-quad-cg-allocation.lua: Adjust the control allocation matrix for offset CoG. +-- +-- WARNING: This script is applicable only to X-type quadrotors and quadplanes. +-- +-- How To Use +-- 1. Place this script in the "scripts" directory. +-- 2. Set FRAME_CLASS or Q_FRAME_CLASS to 17 to enable the dynamic scriptable mixer. +-- 3. Enable Lua scripting via the SCR_ENABLE parameter. +-- 4. Reboot. +-- 5. Fly the vehicle. +-- 6. Adjust the value of the CGA_RATIO parameter. +-- +-- How It Works +-- 1. The control allocation matrix is adjusted for thrust and pitch based on the ??? parameter value. + +--[[ +Global definitions. +--]] +local MAV_SEVERITY = {EMERGENCY=0, ALERT=1, CRITICAL=2, ERROR=3, WARNING=4, NOTICE=5, INFO=6, DEBUG=7} +local SCRIPT_NAME = "CoG adjust script" +local LOOP_RATE_HZ = 10 +local last_warning_time_ms = uint32_t() -- Time we last sent a warning message to the user. +local WARNING_DEADTIME_MS = 1000 -- How often the user should be warned. +local is_mixer_matrix_static = false +local is_mixer_matrix_dynamic = false +local last_ratio = 1 + +-- State machine states. +local FSM_STATE = { + INACTIVE = 0, + INITIALIZE = 1, + ACTIVE = 2, + FINISHED = 3 +} +local current_state = FSM_STATE.INACTIVE +local next_state = FSM_STATE.INACTIVE + + +--[[ +New parameter declarations +--]] +local PARAM_TABLE_KEY = 139 +local PARAM_TABLE_PREFIX = "CGA_" + +-- Bind a parameter to a variable. +function bind_param(name) + return Parameter(name) +end + +-- Add a parameter and bind it to a variable. +function bind_add_param(name, idx, default_value) + assert(param:add_param(PARAM_TABLE_KEY, idx, name, default_value), string.format('Could not add param %s', name)) + return bind_param(PARAM_TABLE_PREFIX .. name) +end + +-- Add param table. +assert(param:add_table(PARAM_TABLE_KEY, PARAM_TABLE_PREFIX, 1), SCRIPT_NAME .. ': Could not add param table.') + +--[[ + // @Param: CGA_RATIO + // @DisplayName: CoG adjustment ratio + // @Description: The ratio between the front and back motor outputs during steady-state hover. Positive when the CoG is in front of the motors midpoint (front motors work harder). + // @Range: 0.5 2 + // @User: Advanced +--]] +CGA_RATIO = bind_add_param('RATIO', 1, 1) + +-- Bindings to existing parameters + +--[[ +Potential additions: +--]] +-- Warn the user, throttling the message rate. +function warn_user(msg, severity) + severity = severity or MAV_SEVERITY.WARNING -- Optional severity argument. + if millis() - last_warning_time_ms > WARNING_DEADTIME_MS then + gcs:send_text(severity, SCRIPT_NAME .. ": " .. msg) + last_warning_time_ms = millis() + end +end + +-- Decide if the given ratio value makes sense. +function sanitize_ratio(ratio) + if (ratio < 0.5) or (ratio > 2) then + warn_user("CGA_RATIO value out of bounds.", MAV_SEVERITY.ERROR) + CGA_RATIO:set(1.0) + return 1.0 -- Return default. + else + return ratio + end +end + +-- Normalize the throttle factors to max 1 +function normalize_throttle(factors) + -- Find maximum value. + local max_factor = 0 + for _, factor in ipairs(factors) do + max_factor = math.max(max_factor, factor) + end + -- Adjust all values by it. + normalized_factors = {} + for _, factor in ipairs(factors) do + table.insert(normalized_factors, factor / max_factor) + end + return normalized_factors +end + +-- Calculate the thrust factors given a ratio. +function build_factors(ratio) + local r1 = 2.0/(1+ratio) + local r2 = 2.0*ratio/(1+ratio) + local quad_x_factors = {r2, r1, r2, r1} + return normalize_throttle(quad_x_factors) +end + +-- Adjust the dynamic motor mixer. +function update_dynamic_mixer(ratio) + + Motors_dynamic:add_motor(0, 1) + Motors_dynamic:add_motor(1, 3) + Motors_dynamic:add_motor(2, 4) + Motors_dynamic:add_motor(3, 2) + + factors = motor_factor_table() + + -- Roll stays as-is. + factors:roll(0, -0.5) + factors:roll(1, 0.5) + factors:roll(2, 0.5) + factors:roll(3, -0.5) + + -- Pitch stays as-is. + factors:pitch(0, 0.5) + factors:pitch(1, -0.5) + factors:pitch(2, 0.5) + factors:pitch(3, -0.5) + + -- Yaw stays as-is. + factors:yaw(0, 0.5) + factors:yaw(1, 0.5) + factors:yaw(2, -0.5) + factors:yaw(3, -0.5) + + -- Throttle is modulated. + throttle_factors = build_factors(ratio) + factors:throttle(0, throttle_factors[1]) + factors:throttle(1, throttle_factors[2]) + factors:throttle(2, throttle_factors[3]) + factors:throttle(3, throttle_factors[4]) + + Motors_dynamic:load_factors(factors) + + if not Motors_dynamic:init(4) then + warn_user("Failed to initialize motor matrix!", MAV_SEVERITY.EMERGENCY) + else + if ratio ~= last_ratio then + warn_user("Set ratio to " .. tostring(ratio), MAV_SEVERITY.INFO) + last_ratio = ratio + end + end + motors:set_frame_string("Dynamic CoM adjust") + +end + +-- Adjust the static motor mixer. +function update_static_mixer(ratio) + MotorsMatrix:add_motor_raw(0,-0.5, 0.5, 0.5, 2) + MotorsMatrix:add_motor_raw(1, 0.5,-0.5, 0.5, 4) + MotorsMatrix:add_motor_raw(2, 0.5, 0.5,-0.5, 1) + MotorsMatrix:add_motor_raw(3,-0.5,-0.5,-0.5, 3) + + throttle_factors = build_factors(ratio) + MotorsMatrix:set_throttle_factor(0, throttle_factors[1]) + MotorsMatrix:set_throttle_factor(1, throttle_factors[2]) + MotorsMatrix:set_throttle_factor(2, throttle_factors[3]) + MotorsMatrix:set_throttle_factor(3, throttle_factors[4]) + + if not MotorsMatrix:init(4) then + warn_user("Failed to initialize motor matrix!", MAV_SEVERITY.EMERGENCY) + else + if ratio ~= last_ratio then + warn_user("Set ratio to " .. tostring(ratio), MAV_SEVERITY.INFO) + last_ratio = ratio + end + end + motors:set_frame_string("Static CoM adjust") +end + +-- Decide if the UA is a Quad X quadplane. +function inspect_frame_class_fw() + + Q_ENABLE = bind_param("Q_ENABLE") + Q_FRAME_CLASS = bind_param("Q_FRAME_CLASS") + + if FWVersion:type()==3 then + -- Test for the validity of the parameters. + if Q_ENABLE:get()==1 then + if Q_FRAME_CLASS:get()==15 then + is_mixer_matrix_static = true + elseif Q_FRAME_CLASS:get()==17 then + is_mixer_matrix_dynamic = true + end + end + end +end + +-- Decide if the UA is a Quad X multicopter. +function inspect_frame_class_mc() + + FRAME_CLASS = bind_param("FRAME_CLASS") + + if FWVersion:type()==2 then + if FRAME_CLASS:get()==15 then + is_mixer_matrix_static = true + elseif FRAME_CLASS:get()==17 then + is_mixer_matrix_dynamic = true + end + end +end + +--[[ +Activation conditions +--]] +-- Check for script activating conditions here. +-- Check frame types. +function can_start() + result = is_mixer_matrix_static or is_mixer_matrix_dynamic + return result +end + +--[[ +State machine +--]] +function fsm_step() + if current_state == FSM_STATE.INACTIVE then + if can_start() then + next_state = FSM_STATE.INITIALIZE + else + next_state = FSM_STATE.FINISHED + warn_user("Could not find scriptable mixer", MAV_SEVERITY.ERROR) + end + + elseif current_state == FSM_STATE.INITIALIZE then + if is_mixer_matrix_static then + local ratio = sanitize_ratio(CGA_RATIO:get()) + update_static_mixer(ratio) + next_state = FSM_STATE.FINISHED + else + next_state = FSM_STATE.ACTIVE + end + + elseif current_state == FSM_STATE.ACTIVE then + -- Assert the parameter limits. + local ratio = sanitize_ratio(CGA_RATIO:get()) + -- Create the control allocation matrix parameters. + update_dynamic_mixer(ratio) + + else + gcs:send_text(MAV_SEVERITY.CRITICAL, "Unexpected FSM state!") + end + + current_state = next_state +end + +-- Check once on boot if the frame type is suitable for this script. +pcall(inspect_frame_class_mc) +pcall(inspect_frame_class_fw) +gcs:send_text(MAV_SEVERITY.INFO, SCRIPT_NAME .. string.format(" loaded.")) + +-- Wrapper around update() to catch errors. +function protected_wrapper() + local success, err = pcall(fsm_step) + if not success then + gcs:send_text(MAV_SEVERITY.EMERGENCY, "Internal Error: " .. err) + return protected_wrapper, 1000 + end + if not (current_state == FSM_STATE.FINISHED) then + return protected_wrapper, 1000.0/LOOP_RATE_HZ + end +end + +-- Start running update loop +return protected_wrapper() diff --git a/libraries/AP_Scripting/applets/x-quad-cg-allocation.md b/libraries/AP_Scripting/applets/x-quad-cg-allocation.md new file mode 100644 index 0000000000..ef87688099 --- /dev/null +++ b/libraries/AP_Scripting/applets/x-quad-cg-allocation.md @@ -0,0 +1,65 @@ +# Multicopter CoM compensation + +This script allows for adjusting the control allocation matrix. + +When the Center of Mass (CoM) of an airframe does not coincide with the center +of its thrusters, then there is a lever arm between the thrust vector and the +CoM. This often is the case in VTOL fixed-wing aircraft (quadplanes) where +typically the CoM is more forward than the center of thrust. As a result, the +thrust produces a pitch-down moment. This produces a disturbance in the pitch +control and requires significant wind-up in the pitch integrator. + +To compensate for this issue, this script employs the scriptable control +allocation matrix to request asymmeterical front and back thrust. + +WARNING: This script is applicable only to X-type quadrotors and quadplanes. Do +not use in any other frame configuration! + +# Parameters + +The script adds 1 parameter to control its behaviour. + +## CGA_RATIO + +This is the desired ratio between the front and back thrust. To have the front +motors produce more lift that the rear, increase higher than 1. + +Reasonable extreme values are 2 (front works twice as hard as the rear) and 0.5 +(the inverse case). Given an out-of-bounds parameter value, the script will +revert to the default 1.0. + +# Operation + +## How To Use + +First of all, place this script in the "scripts" directory. + +To tune `CGA_RATIO` on the fly: + + 1. Set `FRAME_CLASS` or `Q_FRAME_CLASS` (for quadplanes) to 17 to enable the + dynamic scriptable mixer. + 2. Enable Lua scripting via the `SCR_ENABLE` parameter. + 3. Reboot. + 4. Fly the vehicle. + 5. Adjust the value of the `CGA_RATIO` parameter. A good indicator of a good + tune is to monitor the telemetry value `PID_TUNE[2].I` (pitch rate controller + integrator) until it reaches zero during a stable hover. + +Once you are happy with the tuning, you can fall back to the static motor +matrix, which consumes no resources from the scripting engine: + + 1. Set `FRAME_CLASS` or `Q_FRAME_CLASS` (for quadplanes) to 15 to enable the + static scriptable mixer. + 2. Ensure Lua scripting is enabled via the `SCR_ENABLE` parameter. + 3. Reboot. + +The aircraft is ready to fly. +Keep in mind that any further changes to `CGA_RATIO` will now require a reboot. + +## How It Works + + 1. The dynamic control allocation matrix is able to change the coefficients + that convert the throttle command to individual PWM commands for every motor. + These coefficients have a default value of 1. + 2. The parameter `CGA_RATIO` is used to alter these coefficients, so that the + front and back thrust commands are not equal. \ No newline at end of file diff --git a/libraries/AP_Scripting/docs/docs.lua b/libraries/AP_Scripting/docs/docs.lua index 7171b241c5..0663624310 100644 --- a/libraries/AP_Scripting/docs/docs.lua +++ b/libraries/AP_Scripting/docs/docs.lua @@ -135,7 +135,7 @@ i2c = {} ---@param address integer -- device address 0 to 128 ---@param clock? uint32_t_ud|integer|number -- optional bus clock, default 400000 ---@param smbus? boolean -- optional sumbus flag, default false ----@return AP_HAL__I2CDevice_ud|nil +---@return AP_HAL__I2CDevice_ud function i2c:get_device(bus, address, clock, smbus) end -- EFI state structure @@ -1211,6 +1211,13 @@ local AP_HAL__I2CDevice_ud = {} ---@param address integer function AP_HAL__I2CDevice_ud:set_address(address) end +-- Performs an I2C transfer, sending data_str bytes (see string.pack) and +-- returning a string of any requested read bytes (see string.unpack) +---@param data_str string +---@param read_length integer +---@return string|nil +function AP_HAL__I2CDevice_ud:transfer(data_str, read_length) end + -- If no read length is provided a single register will be read and returned. -- If read length is provided a table of register values are returned. ---@param register_num integer @@ -1229,41 +1236,46 @@ function AP_HAL__I2CDevice_ud:write_register(register_num, value) end function AP_HAL__I2CDevice_ud:set_retries(retries) end --- Serial driver object ----@class (exact) AP_HAL__UARTDriver_ud -local AP_HAL__UARTDriver_ud = {} +-- Serial port access object +---@class (exact) AP_Scripting_SerialAccess_ud +local AP_Scripting_SerialAccess_ud = {} --- Set flow control option for serial port ----@param flow_control_setting integer ----| '0' # disabled ----| '1' # enabled ----| '2' # auto -function AP_HAL__UARTDriver_ud:set_flow_control(flow_control_setting) end - --- Returns number of available bytes to read. ----@return uint32_t_ud -function AP_HAL__UARTDriver_ud:available() end +-- Start serial port with the given baud rate (no effect for device ports) +---@param baud_rate uint32_t_ud|integer|number +function AP_Scripting_SerialAccess_ud:begin(baud_rate) end -- Writes a single byte ---@param value integer -- byte to write ---@return uint32_t_ud -- 1 if success else 0 -function AP_HAL__UARTDriver_ud:write(value) end +function AP_Scripting_SerialAccess_ud:write(value) end --- Read a single byte from the serial port ----@return integer -- byte, -1 if not available -function AP_HAL__UARTDriver_ud:read() end +-- Writes a string. The number of bytes actually written, i.e. the length of the +-- written prefix of the string, is returned. It may be 0 up to the length of +-- the string. +---@param data string -- string of bytes to write +---@return integer -- number of bytes actually written, which may be 0 +function AP_Scripting_SerialAccess_ud:writestring(data) end --- Start serial port with given baud rate ----@param baud_rate uint32_t_ud|integer|number -function AP_HAL__UARTDriver_ud:begin(baud_rate) end +-- Reads a single byte from the serial port +---@return integer -- byte, -1 if error or none available +function AP_Scripting_SerialAccess_ud:read() end ---[[ - read count bytes from a uart and return as a lua string. Note - that the returned string can be shorter than the requested length ---]] ----@param count integer ----@return string|nil -function AP_HAL__UARTDriver_ud:readstring(count) end +-- Reads up to `count` bytes and returns the bytes read as a string. No bytes +-- may be read, in which case a 0-length string is returned. +---@param count integer -- maximum number of bytes to read +---@return string|nil -- bytes actually read, which may be 0-length, or nil on error +function AP_Scripting_SerialAccess_ud:readstring(count) end + +-- Returns number of available bytes to read. +---@return uint32_t_ud +function AP_Scripting_SerialAccess_ud:available() end + +-- Set flow control option for serial port (no effect for device ports) +---@param flow_control_setting integer +---| '0' # disabled +---| '1' # enabled +---| '2' # auto +function AP_Scripting_SerialAccess_ud:set_flow_control(flow_control_setting) end -- desc @@ -1650,6 +1662,10 @@ function Motors_dynamic:init(expected_num_motors) end -- desc analog = {} +-- return MCU temperature in degrees C +---@return number -- MCU temperature +function analog:mcu_temperature() end + -- desc ---@return AP_HAL__AnalogSource_ud|nil function analog:channel() end @@ -2098,17 +2114,33 @@ function baro:get_altitude() end ---@return boolean function baro:healthy(instance) end +-- get altitude difference from a base pressure and current pressure +---@param base_pressure number -- first reference pressure in Pa +---@param pressure number -- 2nd pressure in Pa +---@return number -- altitude difference in meters +function baro:get_altitude_difference(base_pressure,pressure) end -- Serial ports serial = {} --- Returns the UART instance that allows connections from scripts (those with SERIALx_PROTOCOL = 28). --- For instance = 0, returns first such UART, second for instance = 1, and so on. --- If such an instance is not found, returns nil. ----@param instance integer -- the 0-based index of the UART instance to return. ----@return AP_HAL__UARTDriver_ud|nil -- the requested UART instance available for scripting, or nil if none. +-- Returns a serial access object that allows a script to interface with a +-- device over a port set to protocol 28 (Scripting) (e.g. SERIALx_PROTOCOL). +-- Instance 0 is the first such port, instance 1 the second, and so on. If the +-- requested instance is not found, returns nil. +---@param instance integer -- 0-based index of the Scripting port to access +---@return AP_Scripting_SerialAccess_ud|nil -- access object for that instance, or nil if not found function serial:find_serial(instance) end +-- Returns a serial access object that allows a script to simulate a device +-- attached via a specific protocol. The device protocol is configured by +-- SCR_SDEVx_PROTO. Instance 0 is the first such protocol, instance 1 the +-- second, and so on. If the requested instance is not found, or SCR_SDEV_EN is +-- disabled, returns nil. +---@param protocol integer -- protocol to access +---@param instance integer -- 0-based index of the protocol instance to access +---@return AP_Scripting_SerialAccess_ud|nil -- access object for that instance, or nil if not found +function serial:find_simulated_device(protocol, instance) end + -- desc rc = {} @@ -2585,6 +2617,12 @@ function gcs:send_text(severity, text) end ---@return uint32_t_ud -- system time in milliseconds function gcs:last_seen() end +-- call a MAVLink MAV_CMD_xxx command via command_int interface +---@param command integer -- MAV_CMD_xxx +---@param params table -- parameters of p1, p2, p3, p4, x, y and z and frame. Any not specified taken as zero +---@return integer -- MAV_RESULT +function gcs:run_command_int(command, params) end + -- The relay library provides access to controlling relay outputs. relay = {} @@ -3121,6 +3159,11 @@ function battery:current_amps(instance) end ---@return number -- resting voltage function battery:voltage_resting_estimate(instance) end +-- Returns the estimated internal battery resistance in Ohms +---@param instance integer -- battery instance +---@return number -- estimated internal resistance in Ohms +function battery:get_resistance(instance) end + -- Returns the voltage of the selected battery instance. ---@param instance integer -- battery instance ---@return number -- voltage @@ -3162,6 +3205,10 @@ function arming:get_aux_auth_id() end ---@return boolean -- true if armed successfully function arming:arm() end +-- force arm the vehicle +---@return boolean -- true if armed +function arming:arm_force() end + -- Returns a true if vehicle is currently armed. ---@return boolean -- true if armed function arming:is_armed() end diff --git a/libraries/AP_Scripting/drivers/EFI_NMEA2k.lua b/libraries/AP_Scripting/drivers/EFI_NMEA2k.lua new file mode 100644 index 0000000000..42993852ee --- /dev/null +++ b/libraries/AP_Scripting/drivers/EFI_NMEA2k.lua @@ -0,0 +1,196 @@ +--[[ + EFI driver using NMEA 2000 marine CAN protocol +--]] + +local MAV_SEVERITY = {EMERGENCY=0, ALERT=1, CRITICAL=2, ERROR=3, WARNING=4, NOTICE=5, INFO=6, DEBUG=7} + +PARAM_TABLE_KEY = 48 +PARAM_TABLE_PREFIX = "EFI_2K_" + +local efi_backend = nil +local efi_state = EFI_State() +local cylinder_state = Cylinder_Status() +if not efi_state or not cylinder_state then + return +end + +-- bind a parameter to a variable given +function bind_param(name) + local p = Parameter(name) + assert(p, string.format('could not find %s parameter', name)) + return p +end + +-- add a parameter and bind it to a variable +function bind_add_param(name, idx, default_value) + assert(param:add_param(PARAM_TABLE_KEY, idx, name, default_value), string.format('could not add param %s', name)) + return bind_param(PARAM_TABLE_PREFIX .. name) +end + +-- Setup EFI Parameters +assert(param:add_table(PARAM_TABLE_KEY, PARAM_TABLE_PREFIX, 10), 'could not add EFI_2K param table') + +--[[ + // @Param: EFI_2K_ENABLE + // @DisplayName: Enable NMEA 2000 EFI driver + // @Description: Enable NMEA 2000 EFI driver + // @Values: 0:Disabled,1:Enabled + // @User: Standard +--]] +local EFI_2K_ENABLE = bind_add_param('ENABLE', 1, 1) +if EFI_2K_ENABLE:get() < 1 then + return +end + +--[[ + // @Param: EFI_2K_CANDRV + // @DisplayName: NMEA 2000 CAN driver + // @Description: NMEA 2000 CAN driver. Use 1 for first CAN scripting driver, 2 for 2nd driver + // @Values: 0:Disabled,1:FirstCAN,2:SecondCAN + // @User: Standard +--]] +local EFI_2K_CANDRV = bind_add_param('CANDRV', 2, 0) -- CAN driver number + +--[[ + // @Param: EFI_2K_OPTIONS + // @DisplayName: NMEA 2000 options + // @Description: NMEA 2000 driver options + // @Bitmask: 0:EnableLogging + // @User: Standard +--]] +EFI_2K_OPTIONS = bind_add_param("OPTIONS", 3, 0) + +local OPTION_LOGGING = (1<<0) + +--[[ + return true if an option is enabled +--]] +local function option_enabled(option) + return (EFI_2K_OPTIONS:get() & option) ~= 0 +end + +-- Register for the CAN drivers +local CAN_BUF_LEN = 25 +local can_driver = nil + +if EFI_2K_CANDRV:get() == 1 then + gcs:send_text(MAV_SEVERITY.INFO, string.format("EFI_2K: attaching to CAN1")) + can_driver = CAN:get_device(CAN_BUF_LEN) +elseif EFI_2K_CANDRV:get() == 2 then + gcs:send_text(MAV_SEVERITY.INFO, string.format("EFI_2K: attaching to CAN2")) + can_driver = CAN:get_device2(CAN_BUF_LEN) +end + +if not can_driver then + gcs:send_text(MAV_SEVERITY.ERROR, string.format("EFI_2K: invalid CAN driver")) + return +end + +-- load NMEA_2000 module +local NMEA_2000 = require("NMEA_2000") +if not NMEA_2000 then + gcs:send_text(MAV_SEVERITY.ERROR, "EFI_2K: Unable to load NMEA_2000.lua module") + return +end + +--[[ + create PGN table +--]] +local PGN_ENGINE_PARAM_RAPID = 0x1F200 +local PGN_ENGINE_PARAM_DYNAMIC = 0x1F201 + +local PGN_TABLE = { + [PGN_ENGINE_PARAM_RAPID] = 8, + [PGN_ENGINE_PARAM_DYNAMIC] = 26 +} + +NMEA_2000.set_PGN_table(PGN_TABLE) + +local frame_count = 0 +local state = {} + +local function log_frame(frame) + local id = frame:id() + logger:write("CANF",'Id,DLC,FC,B0,B1,B2,B3,B4,B5,B6,B7','IBIBBBBBBBB', + id, + frame:dlc(), + frame_count, + frame:data(0), frame:data(1), frame:data(2), frame:data(3), + frame:data(4), frame:data(5), frame:data(6), frame:data(7)) + frame_count = frame_count + 1 +end + +--[[ + parse the higher rate engine data, giving RPM and pressure +--]] +local function parse_engine_param_rapid(data) + state.instance, state.speed, state.boost_presssure, state.tilt, _ = string.unpack("= 1 then + command = 1 + end + if sw_pos ~= last_ign_sw_pos then + onoff = "OFF" + if command == 1 then + onoff = "ON" + end + gcs:send_text(MAV_SEVERITY.INFO, string.format("EFI_INF: ignition %s", onoff)) + end + last_ign_sw_pos = sw_pos + send_packet(CMD_CDI1, command) + send_packet(CMD_CDI2, command) + send_packet(CMD_OIL_PUMP, command) +end + --[[ main update function @@ -282,7 +401,10 @@ local function update() if check_input() then update_EFI() end - + if efi_device_id then + update_throttle() + update_ignition() + end return update, 10 end diff --git a/libraries/AP_Scripting/examples/BQ40Z_bms_shutdown.lua b/libraries/AP_Scripting/examples/BQ40Z_bms_shutdown.lua new file mode 100644 index 0000000000..27dee597cc --- /dev/null +++ b/libraries/AP_Scripting/examples/BQ40Z_bms_shutdown.lua @@ -0,0 +1,108 @@ +-- TI BQ40Z BMS shutdown script + +local mavlink_msgs = require("MAVLink/mavlink_msgs") + +local COMMAND_ACK_ID = mavlink_msgs.get_msgid("COMMAND_ACK") +local COMMAND_LONG_ID = mavlink_msgs.get_msgid("COMMAND_LONG") +local msg_map = {} +msg_map[COMMAND_ACK_ID] = "COMMAND_ACK" +msg_map[COMMAND_LONG_ID] = "COMMAND_LONG" + +local PARAM_TABLE_KEY = 51 +local PARAM_TABLE_PREFIX = "BATT_BQ40Z_" +-- add a parameter and bind it to a variable +local function bind_add_param(name, idx, default_value) + assert(param:add_param(PARAM_TABLE_KEY, idx, name, default_value), string.format('could not add param %s', name)) + return Parameter(PARAM_TABLE_PREFIX .. name) +end +assert(param:add_table(PARAM_TABLE_KEY, PARAM_TABLE_PREFIX, 2), 'could not add param table') +--[[ + // @Param: BATT_BQ40Z_BUS + // @DisplayName: Bus number for the BQ40Z + // @Description: Bus number for the BQ40Z + // @Range: 0 3 + // @User: Standard +--]] +local BATT_BQ40Z_BUS = bind_add_param('BUS', 1, 0) + + +local MAV_CMD_PREFLIGHT_REBOOT_SHUTDOWN = 246 +local MAV_RESULT_ACCEPTED = 0 +local MAV_RESULT_FAILED = 4 + +-- Initialize MAVLink rx with number of messages, and buffer depth +mavlink:init(1, 10) +-- Register message id to receive +mavlink:register_rx_msgid(COMMAND_LONG_ID) +-- Block MAV_CMD_PREFLIGHT_REBOOT_SHUTDOWN so we can handle the ACK +mavlink:block_command(MAV_CMD_PREFLIGHT_REBOOT_SHUTDOWN) + +-- Init BMS i2c device +local i2c_addr = BATT_BQ40Z_BUS:get() +assert(i2c_addr ~= nil, "BATT_BQ40Z_BUS not retrievable") +local bms = i2c:get_device(math.floor(i2c_addr), 0x0B) + +-- Exit emergency shutdown (for BQ40Z60, twice for redundancy) +bms:transfer("\x00\xA7\x23", 0) +bms:transfer("\x00\xA7\x23", 0) + +-- Function that is returned to the AP scheduler when we want to shutdown +local function shutdown_loop() + local ret = bms:transfer("\x00\x10\x00", 0) + if ret == nil then + gcs:send_text(0, "BQ40Z shutdown transfer failed") + end + + return shutdown_loop, 500 +end + +-- Main loop +local function update() + local msg, chan = mavlink:receive_chan() + local parsed_msg = nil + + if (msg ~= nil) then + parsed_msg = mavlink_msgs.decode(msg, msg_map) + end + + if parsed_msg ~= nil and (parsed_msg.msgid == COMMAND_LONG_ID) and (parsed_msg.command == MAV_CMD_PREFLIGHT_REBOOT_SHUTDOWN) then + -- Prepare ack + local ack = {} + ack.command = parsed_msg.command + ack.result = MAV_RESULT_ACCEPTED + ack.progress = 0 + ack.result_param2 = 0 + ack.target_system = parsed_msg.sysid + ack.target_component = parsed_msg.compid + + -- Don't shutdown if armed + if arming:is_armed() and parsed_msg.param1 == 2 then + gcs:send_text(1, "Not sutting down BQ40Z as vehicle is armed") + ack.result = MAV_RESULT_FAILED + mavlink:send_chan(chan, mavlink_msgs.encode("COMMAND_ACK", ack)) + + -- Shutdown + elseif parsed_msg.param1 == 2 then + gcs:send_text(1, "Shutting down BQ40Z!!!") + mavlink:send_chan(chan, mavlink_msgs.encode("COMMAND_ACK", ack)) + return shutdown_loop, 0 + + -- Pass through the command if it isn't requesting shutdown + else + local command_int = { + p1 = parsed_msg.param1, + p2 = parsed_msg.param2, + p3 = parsed_msg.param3, + p4 = parsed_msg.param4, + } + local result = gcs:run_command_int(MAV_CMD_PREFLIGHT_REBOOT_SHUTDOWN, command_int) + ack.result = result + mavlink:send_chan(chan, mavlink_msgs.encode("COMMAND_ACK", ack)) + end + end + + return update, 1000 +end + + +return update, 1000 diff --git a/libraries/AP_Scripting/examples/Motor_mixer_dynamic_setup.lua b/libraries/AP_Scripting/examples/Motor_mixer_dynamic_setup.lua index e0eb0fd64d..62cc85f54f 100644 --- a/libraries/AP_Scripting/examples/Motor_mixer_dynamic_setup.lua +++ b/libraries/AP_Scripting/examples/Motor_mixer_dynamic_setup.lua @@ -45,5 +45,5 @@ Motors_dynamic:load_factors(factors) motors:set_frame_string("Dynamic example") --- if doing changes in flight it is a good idea to us pcall to protect the script from crashing +-- if doing changes in flight it is a good idea to use pcall to protect the script from crashing -- see 'protected_call.lua' example diff --git a/libraries/AP_Scripting/examples/RM3100_self_test.lua b/libraries/AP_Scripting/examples/RM3100_self_test.lua new file mode 100644 index 0000000000..7f16a1d0f9 --- /dev/null +++ b/libraries/AP_Scripting/examples/RM3100_self_test.lua @@ -0,0 +1,107 @@ +-- Runs the Built-In Self Test on the RM3100 LR circuits +-- Note COMPASS_DISBLMSK should have the 16th bit set to 1 (RM3100) + +-- Init RM3100 on bus 0 +local rm3100 = i2c:get_device(0, 0x20) +assert(rm3100 ~= nil, "i2c get_device error, cannot run RM3100 self test") + +-- Queues a Built-In Self Test +function queue_test() + gcs:send_text(1, "Running RM3100 self test") + + -- Queue a self test by setting BIST register + local ret = rm3100:transfer("\x33\x8F", 0) + if ret == nil then + gcs:send_text(1, "Rm3100 BIST transfer failed") + return queue_test, 1000 + end + + -- Send a POLL request to run a BIST + ret = rm3100:transfer("\x00\x70", 0) + if ret == nil then + gcs:send_text(1, "Rm3100 POLL transfer failed") + return queue_test, 1000 + end + + -- As a measurement takes time, delay a bit by scheduling a different function + return read_test, 1000 +end + + +-- Reads back values from a Built-In Self Test +function read_test() + -- Read the BIST results + local results_str = rm3100:transfer("\x33", 1) + if results_str ~= nil then + local results = results_str:byte() + + if results & (1 << 4) == 0 then + gcs:send_text(1, "RM3100 X is unhealthy") + else + gcs:send_text(1, "RM3100 X is OK") + end + + if results & (1 << 5) == 0 then + gcs:send_text(1, "RM3100 Y is unhealthy") + else + gcs:send_text(1, "RM3100 Y is OK") + end + + if results & (1 << 6) == 0 then + gcs:send_text(1, "RM3100 Z is unhealthy") + else + gcs:send_text(1, "RM3100 Z is OK") + end + else + gcs:send_text(1, "Rm3100 BIST read transfer failed") + return queue_test, 1000 + end + + -- Reset the BIST register + local ret = rm3100:transfer("\x33\x0F", 0) + if ret == nil then + gcs:send_text(1, "Rm3100 BIST reset transfer failed") + return queue_test, 1000 + end + + -- Send a POLL request to take a data point + ret = rm3100:transfer("\x00\x70", 0) + if ret == nil then + gcs:send_text(1, "Rm3100 POLL data transfer failed") + return queue_test, 1000 + end + + -- As a measurement takes time, delay a bit by scheduling a different function + return read_data, 1000 +end + +-- Reads data from the RM3100 +function read_data() + -- Check that data is ready for a read + local status_str = rm3100:transfer("\x34", 1) + if status_str ~= nil then + local status = status_str:byte() + if status & (1 << 7) == 0 then + gcs:send_text(1, "RM3100 data not ready for reading") + return queue_test, 1000 + end + else + gcs:send_text(1, "Rm3100 BIST status reg transfer failed") + return queue_test, 1000 + end + + -- Read measured values + local measurements_str = rm3100:transfer("\x24", 9) + if measurements_str ~= nil then + local MX, MY, MZ = string.unpack(">i3>i3>i3", measurements_str) + gcs:send_text(6, string.format("RM3100 Mag: X=%8d Y=%8d Z=%8d", MX, MY, MZ)) + else + gcs:send_text(1, "Rm3100 data read transfer failed") + return queue_test, 1000 + end + + -- Loop back to the first function to run another set of tests + return queue_test, 1000 +end + +return queue_test, 1000 diff --git a/libraries/AP_Scripting/examples/ahrs-source-gps-optflow.lua b/libraries/AP_Scripting/examples/ahrs-source-gps-optflow.lua index 3d313ea221..0dfc23770c 100644 --- a/libraries/AP_Scripting/examples/ahrs-source-gps-optflow.lua +++ b/libraries/AP_Scripting/examples/ahrs-source-gps-optflow.lua @@ -4,7 +4,7 @@ -- configure a forward or downward facing lidar with a range of at least 5m -- setup RCx_OPTION = 90 (EKF Pos Source) to select the source (low=GPS, middle=opticalflow, high=Not Used) -- setup RCx_OPTION = 300 (Scripting1). When this switch is pulled high, the source will be automatically selected --- SRC_ENABLE = 1 (enable scripting) +-- SCR_ENABLE = 1 (enable scripting) -- setup EK3_SRCn_ parameters so that GPS is the primary source, opticalflow is secondary. -- EK3_SRC1_POSXY = 3 (GPS) -- EK3_SRC1_VELXY = 3 (GPS) diff --git a/libraries/AP_Scripting/examples/arming-check-wp1-takeoff.lua b/libraries/AP_Scripting/examples/arming-check-wp1-takeoff.lua index e4f7360766..60f3fa4466 100644 --- a/libraries/AP_Scripting/examples/arming-check-wp1-takeoff.lua +++ b/libraries/AP_Scripting/examples/arming-check-wp1-takeoff.lua @@ -1,4 +1,4 @@ --- This script runs a custom arming check for index == 1 and it must be a takeoff missionn item +-- This script runs a custom arming check for index == 1 and it must be a takeoff mission item local auth_id = arming:get_aux_auth_id() diff --git a/libraries/AP_Scripting/examples/battery_internal_resistance_check.lua b/libraries/AP_Scripting/examples/battery_internal_resistance_check.lua new file mode 100644 index 0000000000..63a811e2e2 --- /dev/null +++ b/libraries/AP_Scripting/examples/battery_internal_resistance_check.lua @@ -0,0 +1,35 @@ +--[[ + script implementing pre-arm check that internal resistance is sensible +--]] + +local MAX_RESISTANCE = 0.03 -- Ohms + +local auth_id = assert(arming:get_aux_auth_id()) + +local warning_last_sent_ms = uint32_t() -- time we last sent a warning message to the user +warning_interval_ms = 10000 + +function update() + local num_batts = battery:num_instances() + local ok = true + for i=0,num_batts do + local resistance = battery:get_resistance(i) + failed = resistance > MAX_RESISTANCE + if failed then + msg = string.format("Batt[%u] high internal resistance %.5f Ohms", i+1, resistance) + if millis() - warning_last_sent_ms > warning_interval_ms then + gcs:send_text(0, msg) + warning_last_sent_ms = millis() + end + arming:set_aux_auth_failed(auth_id, msg) + ok = false + end + end + + if ok then + arming:set_aux_auth_passed(auth_id) + end + return update, 500 +end + +return update() diff --git a/libraries/AP_Scripting/examples/command_int.lua b/libraries/AP_Scripting/examples/command_int.lua new file mode 100644 index 0000000000..b86792c456 --- /dev/null +++ b/libraries/AP_Scripting/examples/command_int.lua @@ -0,0 +1,56 @@ +--[[ + demonstrate using the gcs:command_int() interface to send commands from MAVLink MAV_CMD_xxx set +--]] + +local MAV_FRAME_GLOBAL_RELATIVE_ALT = 3 + +local MAV_CMD_DO_SET_MODE = 176 +local MAV_CMD_DO_REPOSITION = 192 + +-- some plane flight modes for testing +local MODE_LOITER = 12 +local MODE_GUIDED = 15 + +local MAV_MODE_FLAG_CUSTOM_MODE_ENABLED = 1 + +--[[ +create a NaN value +--]] +local function NaN() + return 0/0 +end + +--[[ + test API calls. When in LOITER mode change to GUIDED and force flying to a location NE of home +--]] +local function test_command_int() + if vehicle:get_mode() ~= MODE_LOITER then + return + end + local home = ahrs:get_home() + if not home then + return + end + + -- force mode GUIDED + gcs:run_command_int(MAV_CMD_DO_SET_MODE, { p1 = MAV_MODE_FLAG_CUSTOM_MODE_ENABLED, p2 = MODE_GUIDED }) + + -- and fly to 200m NE of home and 100m above home + local dest = home:copy() + dest:offset_bearing(45, 200) + + gcs:run_command_int(MAV_CMD_DO_REPOSITION, { frame = MAV_FRAME_GLOBAL_RELATIVE_ALT, + p1 = -1, + p4 = NaN(), + x = dest:lat(), + y = dest:lng(), + z = 100 }) +end + +local function update() + test_command_int() + return update, 1000 +end + +return update, 1000 + diff --git a/libraries/AP_Scripting/examples/copter_alt_offset.lua b/libraries/AP_Scripting/examples/copter_alt_offset.lua index d0daf23697..0b90581d14 100644 --- a/libraries/AP_Scripting/examples/copter_alt_offset.lua +++ b/libraries/AP_Scripting/examples/copter_alt_offset.lua @@ -1,7 +1,7 @@ --[[ add ALT_OFFSET parameter for copter - This behaves similarly to ALT_OFFSET in plane. It operators only in AUTO mode, and slews the BARO_ALT_OFFSET to allow - for change of altitude without mission change + This behaves similarly to ALT_OFFSET in plane. It operates only in AUTO mode, and slews the BARO_ALT_OFFSET to allow + for change of altitude without mission change. --]] diff --git a/libraries/AP_Scripting/examples/copter_deploy.lua b/libraries/AP_Scripting/examples/copter_deploy.lua new file mode 100644 index 0000000000..19efeec619 --- /dev/null +++ b/libraries/AP_Scripting/examples/copter_deploy.lua @@ -0,0 +1,84 @@ +--[[ + script to auto-deploy a vehicle on descent after reaching a specified altitude + uses raw pressure to not depend on either GPS or on home alt +--]] +local PARAM_TABLE_KEY = 72 +local PARAM_TABLE_PREFIX = "DEPL_" +local MAV_SEVERITY = {EMERGENCY=0, ALERT=1, CRITICAL=2, ERROR=3, WARNING=4, NOTICE=5, INFO=6, DEBUG=7} + +---@diagnostic disable: missing-parameter +---@diagnostic disable: param-type-mismatch + +-- bind a parameter to a variable +function bind_param(name) + local p = Parameter() + assert(p:init(name), string.format('could not find %s parameter', name)) + return p +end + +-- add a parameter and bind it to a variable +function bind_add_param(name, idx, default_value) + assert(param:add_param(PARAM_TABLE_KEY, idx, name, default_value), string.format('could not add param %s', name)) + return bind_param(PARAM_TABLE_PREFIX .. name) +end + +assert(param:add_table(PARAM_TABLE_KEY, PARAM_TABLE_PREFIX, 10), 'could not add param table') + +local end_pos = bind_add_param('OPEN_POS', 1, 1200) +local offset = bind_add_param('OPEN_OFFSET', 2, 400) +local deployment_alt = bind_add_param('ALT', 3, 1) +local DEPL_CLIMB_ALT = bind_add_param('CLIMB_ALT', 4, 2) +local base_pressure = nil +local SERVO_FUNCTION = 94 +local reached_climb_alt = false +local deployed = false + +local MODE_LAND = 9 + +function update_state() + local pressure = baro:get_pressure() + if not pressure then + return + end + if not base_pressure then + base_pressure = pressure + end + local altitude = baro:get_altitude_difference(base_pressure, pressure) + if not altitude then + return + end + gcs:send_named_float('DALT',altitude) + logger.write("DEPL",'BP,P,Alt','fff', + base_pressure, pressure, altitude) + if not reached_climb_alt then + local start_pos = end_pos:get() + offset:get() + SRV_Channels:set_output_pwm(SERVO_FUNCTION, start_pos) + if altitude > DEPL_CLIMB_ALT:get() then + reached_climb_alt = true + gcs:send_text(MAV_SEVERITY.ERROR, "DEPL: Reached climb alt") + end + return + end + if deployed then + return + end + if altitude > deployment_alt:get() then + return + end + deployed = true + gcs:send_text(MAV_SEVERITY.INFO, "DEPL: deploying") + vehicle:set_mode(MODE_LAND) + arming:arm_force() + if not vehicle:get_mode() == MODE_LAND or not arming:is_armed() then + gcs:send_text(MAV_SEVERITY.INFO, "DEPL: Arming failed") + return + end + --SRV_Channels:set_output_pwm(SERVO_FUNCTION, end_pos:get()) + gcs:send_text(MAV_SEVERITY.INFO, "DEPL: Deployed successfully") +end +function update() -- this is the loop which periodically runs + update_state() + return update, 20 -- Reschedules the loop at 50Hz +end +gcs:send_text(MAV_SEVERITY.INFO, "DEPL: loaded") +return update() -- Run immediately before starting to reschedule diff --git a/libraries/AP_Scripting/examples/gps_synth.lua b/libraries/AP_Scripting/examples/gps_synth.lua new file mode 100644 index 0000000000..ef3ce6b00b --- /dev/null +++ b/libraries/AP_Scripting/examples/gps_synth.lua @@ -0,0 +1,170 @@ +-- get GPS data from ardupilot's native bindings then resynthesize into a +-- virtual NMEA GPS and feed back through the serial device sim bindings. +-- demonstrates the bindings and provides the opportunity for script-controlled +-- tampering and other such activities. + +-- parameters: +-- SCR_ENABLE 1 +-- SCR_SDEV_EN 1 +-- SCR_SDEV1_PROTO 5 +-- SERIAL3_PROTOCOL 5 +-- SERIAL4_PROTOCOL -1 +-- GPS2_TYPE 5 +-- GPS_PRIMARY 1 +-- GPS_AUTO_SWITCH 0 + +local ser_device = serial:find_simulated_device(5, 0) +if not ser_device then + error("SCR_SDEV_EN must be 1 and SCR_SDEVn_PROTO must be 5") +end + +function convert_coord(coord, dir) + -- convert ardupilot degrees*1e7 to NMEA degrees + decimal minutes + dir. + -- the first character of dir is used if the coordinate is positive, + -- the second if negative. + + -- handle sign + if coord < 0 then + coord = -coord + dir = dir:sub(2, 2) + else + dir = dir:sub(1, 1) + end + + local degrees = coord // 10000000 -- integer divide + coord = coord - (degrees * 10000000) -- remove that portion + local minutes = coord * (60/10000000) -- float divide + + return ("%03d%08.5f,%s"):format(degrees, minutes, dir) +end + +function convert_time(time_week, time_week_ms) + -- convert ardupilot GPS time to NMEA UTC date/time strings + + -- GPS week 1095 starts on Dec 31 2000 + local seconds_per_week = uint32_t(86400*7) + timestamp_s = uint32_t(time_week - 1095)*seconds_per_week + -- subtract one day to get to Jan 1 2001, then 18 additional seconds to + -- account for the GPS to UTC leap second induced offset + timestamp_s = timestamp_s - uint32_t(86400 + 18) + -- add in time within the week + timestamp_s = timestamp_s + (time_week_ms/uint32_t(1000)) + + timestamp_s = timestamp_s:toint() -- seconds since Jan 1 2001 + + local ts_year = 2001 + local day_seconds = 86400 + while true do + local year_seconds = day_seconds * ((ts_year % 4 == 0) and 366 or 365) + if timestamp_s >= year_seconds then + timestamp_s = timestamp_s - year_seconds + ts_year = ts_year + 1 + else + break + end + end + + local month_days = {31, (ts_year % 4 == 0) and 29 or 28, + 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} + + local ts_month = 1 + for _, md in ipairs(month_days) do + local month_seconds = 86400 * md + if timestamp_s >= month_seconds then + timestamp_s = timestamp_s - month_seconds + ts_month = ts_month + 1 + else + break + end + end + + local ts_day = 1+(timestamp_s // 86400) + timestamp_s = timestamp_s % 86400 + + local ts_hour = timestamp_s // 3600 + timestamp_s = timestamp_s % 3600 + + local ts_minute = timestamp_s // 60 + local ts_second = timestamp_s % 60 + + local date = ("%02d%02d%02d"):format(ts_year-2000, ts_month, ts_day) + local time = ("%02d%02d%02d.%01d"):format(ts_hour, ts_minute, ts_second, + (time_week_ms % 1000):toint()//100) + + return date, time +end + +function get_gps_data(instance) + -- get GPS data from ardupilot scripting bindings in native format + local data = { + hdop = gps:get_hdop(instance), + time_week_ms = gps:time_week_ms(instance), + time_week = gps:time_week(instance), + sats = gps:num_sats(instance), + crs = gps:ground_course(instance), + spd = gps:ground_speed(instance), + loc = gps:location(instance), + status = gps:status(instance), + } + if data.status < gps.GPS_OK_FIX_3D then + return nil -- don't bother with invalid data + end + return data +end + +function arrange_nmea(data) + -- convert ardupilot data entries to NMEA-compatible format + local ts_date, ts_time = convert_time(data.time_week, data.time_week_ms) + + return { + time = ts_time, + lat = convert_coord(data.loc:lat(), "NS"), + lng = convert_coord(data.loc:lng(), "EW"), + spd = data.spd / 0.514, -- m/s to knots + crs = data.crs, -- degrees + date = ts_date, + sats = data.sats, + hdop = data.hdop, + alt = data.loc:alt()/100, + } +end + +function wrap_nmea(msg) + -- compute checksum and add header and footer + local checksum = 0 + for i = 1,#msg do + checksum = checksum ~ msg:byte(i, i) + end + + return ("$%s*%02X\r\n"):format(msg, checksum) +end + +function format_nmea(data) + -- format data into complete NMEA sentences + local rmc_raw = ("GPRMC,%s,A,%s,%s,%03f,%03f,%s,000.0,E"):format( + data.time, data.lat, data.lng, data.spd, data.crs, data.date) + + local gga_raw = ("GPGGA,%s,%s,%s,1,%02d,%05.2f,%06.2f,M,0,M,,"):format( + data.time, data.lat, data.lng, data.sats, data.hdop/100, data.alt) + + return wrap_nmea(rmc_raw), wrap_nmea(gga_raw) +end + +function update() + -- get data from first instance (we are the second) + local ardu_data = get_gps_data(0) + + if ardu_data then + local nmea_data = arrange_nmea(ardu_data) + local rmc, gga = format_nmea(nmea_data) + + if ser_device:writestring(rmc) ~= #rmc + or ser_device:writestring(gga) ~= #gga then + error("overflow, ardupilot is not processing the data, check config!") + end + end + + return update, 200 -- 5Hz like a real GPS +end + +return update() diff --git a/libraries/AP_Scripting/examples/land_hagl.lua b/libraries/AP_Scripting/examples/land_hagl.lua new file mode 100644 index 0000000000..3bdbc36329 --- /dev/null +++ b/libraries/AP_Scripting/examples/land_hagl.lua @@ -0,0 +1,69 @@ +--[[ + demonstrate proving HAGL to plane code for landing +--]] + +local MAV_CMD_SET_HAGL = 43005 + +local ROTATION_PITCH_90 = 24 +local ROTATION_PITCH_270 = 25 + +-- for normal landing use PITCH_270, for inverted use PITCH_90 +local RANGEFINDER_ORIENT = ROTATION_PITCH_270 + +local MAV_SEVERITY = {EMERGENCY=0, ALERT=1, CRITICAL=2, ERROR=3, WARNING=4, NOTICE=5, INFO=6, DEBUG=7} + +local RNG_STATUS = { NotConnected = 0, NoData = 1, OutOfRangeLow = 2, OutOfRangeHigh = 3, Good = 4 } + + +--[[ + create a NaN value +--]] +local function NaN() + return 0/0 +end + +local last_active = false + +--[[ + send HAGL data +--]] +local function send_HAGL() + local status = rangefinder:status_orient(RANGEFINDER_ORIENT) + if status ~= RNG_STATUS.Good then + last_active = false + return + end + local rangefinder_dist = rangefinder:distance_cm_orient(RANGEFINDER_ORIENT)*0.01 + local correction = math.cos(ahrs:get_roll())*math.cos(ahrs:get_pitch()) + local rangefinder_corrected = rangefinder_dist * correction + if RANGEFINDER_ORIENT == ROTATION_PITCH_90 then + rangefinder_corrected = -rangefinder_corrected + end + if rangefinder_corrected < 0 then + last_active = false + return + end + + -- tell plane the height above ground level + local timeout_s = 0.2 + local accuracy = NaN() + gcs:run_command_int(MAV_CMD_SET_HAGL, { p1 = rangefinder_corrected, p2 = accuracy, p3=timeout_s }) + + if not last_active then + last_active = true + gcs:send_text(MAV_SEVERITY.INFO, string.format("HAGL Active %.1f", rangefinder_corrected)) + end + + -- log it + logger:write("HAGL", "RDist,HAGL", "ff", rangefinder_dist, rangefinder_corrected) +end + +local function update() + send_HAGL() + return update, 50 +end + +gcs:send_text(MAV_SEVERITY.INFO, "Loaded land_hagl") + +return update, 1000 + diff --git a/libraries/AP_Scripting/examples/servo_slew.lua b/libraries/AP_Scripting/examples/servo_slew.lua index 36d0f103bd..4bb5229426 100644 --- a/libraries/AP_Scripting/examples/servo_slew.lua +++ b/libraries/AP_Scripting/examples/servo_slew.lua @@ -1,4 +1,4 @@ --- move a servo in a sinisoidal fashion, with settable limits and frequency +-- move a servo in a sinusoidal fashion, with settable limits and frequency local PARAM_TABLE_KEY = 135 local PARAM_TABLE_PREFIX = "STEST_" diff --git a/libraries/AP_Scripting/examples/sitl_standby_sim.lua b/libraries/AP_Scripting/examples/sitl_standby_sim.lua new file mode 100644 index 0000000000..1ce2ecacf7 --- /dev/null +++ b/libraries/AP_Scripting/examples/sitl_standby_sim.lua @@ -0,0 +1,87 @@ +-- This script is a allow to switch the standby function by the switch of the remote controller on 2 simulated fcus. + +-- variable to limit the number of messages sent to GCS +local last_rc_input = 0 + +-- constants +local switch_high = 2 +local switch_low = 0 + +-- Standby function number in ArduPilot +local standby_function = 76 +-- RC pin to use to select the FCU +local rc_input_pin = 8 + + +-- for fast param access it is better to get a param object, +-- this saves the code searching for the param by name every time +local JSON_MASTER = Parameter() +if not JSON_MASTER:init('SIM_JSON_MASTER') then + gcs:send_text(6, 'get SIM_JSON_MASTER failed') +end + +local SYSID_THISMAV = Parameter() +if not SYSID_THISMAV:init('SYSID_THISMAV') then + gcs:send_text(6, 'get SYSID_THISMAV failed') +end + +local sysid = SYSID_THISMAV:get() + +gcs:send_text(6, 'LUA: Standby LUA loaded') + +-- The loop check the value of the switch of the remote controller and switch the standby function of the simulated fcus. +-- FCU should have SYSID_THISMAV set to 1 or 2. +-- The switch is on the channel 8 (default) of the remote controller. +-- fcu1 and fcu2 have mirrored standby function, so only one is active at a time. +-- As this is for simulation, the SIM_JSON_MASTER param is also update to select which fcu control the motors. + +function update() -- this is the loop which periodically runs + rc_input = rc:get_pwm(rc_input_pin) + + if rc_input == nil then + gcs:send_text(6, 'LUA: rc_input is nil') + return update, 1000 -- reschedules the loop + end + + if rc_input ~= last_rc_input then + if sysid == 2 then + if rc_input > 1500 then + if not JSON_MASTER:set(0) then + gcs:send_text(6, string.format('LUA: failed to set SIM_JSON_MASTER')) + else + rc:run_aux_function(standby_function, switch_high) + gcs:send_text(6, string.format('LUA: set SIM_JSON_MASTER to 0')) + end + else + if not JSON_MASTER:set(1) then + gcs:send_text(6, string.format('LUA: failed to set SIM_JSON_MASTER')) + else + rc:run_aux_function(standby_function, switch_low) + gcs:send_text(6, string.format('LUA: set SIM_JSON_MASTER to 1')) + end + end + end + if sysid == 1 then + if rc_input > 1500 then + if not JSON_MASTER:set(0) then + gcs:send_text(6, string.format('LUA: failed to set SIM_JSON_MASTER')) + else + rc:run_aux_function(standby_function, switch_low) + gcs:send_text(6, string.format('LUA: set SIM_JSON_MASTER to 0')) + end + else + if not JSON_MASTER:set(1) then + gcs:send_text(6, string.format('LUA: failed to set SIM_JSON_MASTER')) + else + rc:run_aux_function(standby_function, switch_high) + gcs:send_text(6, string.format('LUA: set SIM_JSON_MASTER to 1')) + end + end + end + last_rc_input = rc_input + end + + return update, 1000 -- reschedules the loop +end + +return update() -- run immediately before starting to reschedule diff --git a/libraries/AP_Scripting/examples/test_get_target_location.lua b/libraries/AP_Scripting/examples/test_get_target_location.lua new file mode 100644 index 0000000000..0b22618aeb --- /dev/null +++ b/libraries/AP_Scripting/examples/test_get_target_location.lua @@ -0,0 +1,16 @@ +-- test get_target_location functions for copter +-- https://discuss.ardupilot.org/t/vehicle-get-target-location-in-lua-copter/108901 + +function update() + local next_WP = vehicle:get_target_location() + if not next_WP then + -- not in a flight mode with a target location + gcs:send_text(0,"not in a flight mode with target loc") + else + gcs:send_text(0,"target loc : " .. next_WP:lat() .. " ; " .. next_WP:lng()) + end + + return update, 10000 +end + +return update() diff --git a/libraries/AP_Scripting/examples/test_update_target_location.lua b/libraries/AP_Scripting/examples/test_update_target_location.lua new file mode 100644 index 0000000000..90adf7a8d6 --- /dev/null +++ b/libraries/AP_Scripting/examples/test_update_target_location.lua @@ -0,0 +1,46 @@ +-- test update_target_location functions for copter + +local current_target = nil +local cur_loc = nil +local new_target= nil + +function update() + + if not (vehicle:get_mode() == 4) then + gcs:send_text(0, "not in Guided") + return update, 1000 + end + + current_target = vehicle:get_target_location() + if not current_target then + return update, 1000 + end + + gcs:send_text(6, string.format("Current target %d %d %d frame %d", current_target:lat(), current_target:lng(), current_target:alt(), current_target:get_alt_frame())) + + cur_loc = ahrs:get_position() + if not cur_loc then + gcs:send_text(0, "current position is not good") + return update, 1000 + end + + gcs:send_text(6, string.format("alt is %f", cur_loc:alt()*0.01)) + if cur_loc:alt()*0.01 < 650 then + gcs:send_text(0, "too low") + return update, 1000 + end + + -- just add some offset to current location + new_target = cur_loc:copy() + new_target:lat(cur_loc:lat() + 1000) + new_target:lng(cur_loc:lng() + 1000) + new_target:alt(cur_loc:alt() + 1000) + + gcs:send_text(6, string.format("New target %d %d %d frame %d", new_target:lat(), new_target:lng(), new_target:alt(), new_target:get_alt_frame())) + + vehicle:update_target_location(current_target, new_target) + + return update, 2000 +end + +return update() diff --git a/libraries/AP_Scripting/generator/description/bindings.desc b/libraries/AP_Scripting/generator/description/bindings.desc index 4091036129..4da6fca9d8 100644 --- a/libraries/AP_Scripting/generator/description/bindings.desc +++ b/libraries/AP_Scripting/generator/description/bindings.desc @@ -70,6 +70,7 @@ singleton AP_Arming method disarm boolean AP_Arming::Method::SCRIPTING'literal singleton AP_Arming method is_armed boolean singleton AP_Arming method pre_arm_checks boolean false'literal singleton AP_Arming method arm boolean AP_Arming::Method::SCRIPTING'literal +singleton AP_Arming method arm_force boolean AP_Arming::Method::SCRIPTING'literal singleton AP_Arming method get_aux_auth_id boolean uint8_t'Null singleton AP_Arming method set_aux_auth_passed void uint8_t'skip_check singleton AP_Arming method set_aux_auth_failed void uint8_t'skip_check string @@ -94,6 +95,7 @@ singleton AP_BattMonitor depends AP_BATTERY_ENABLED singleton AP_BattMonitor method num_instances uint8_t singleton AP_BattMonitor method healthy boolean uint8_t 0 ud->num_instances() singleton AP_BattMonitor method voltage float uint8_t 0 ud->num_instances() +singleton AP_BattMonitor method get_resistance float uint8_t 0 ud->num_instances() singleton AP_BattMonitor method voltage_resting_estimate float uint8_t 0 ud->num_instances() singleton AP_BattMonitor method current_amps boolean float'Null uint8_t 0 ud->num_instances() singleton AP_BattMonitor method consumed_mah boolean float'Null uint8_t 0 ud->num_instances() @@ -221,7 +223,7 @@ singleton AP_Proximity method get_backend AP_Proximity_Backend uint8_t'skip_chec include AP_RangeFinder/AP_RangeFinder.h include AP_RangeFinder/AP_RangeFinder_Backend.h -userdata RangeFinder::RangeFinder_State depends (!defined(HAL_BUILD_AP_PERIPH) || defined(HAL_PERIPH_ENABLE_RANGEFINDER)) +userdata RangeFinder::RangeFinder_State depends AP_RANGEFINDER_ENABLED userdata RangeFinder::RangeFinder_State rename RangeFinder_State userdata RangeFinder::RangeFinder_State field last_reading_ms uint32_t'skip_check read write userdata RangeFinder::RangeFinder_State field last_reading_ms rename last_reading @@ -234,7 +236,7 @@ userdata RangeFinder::RangeFinder_State field signal_quality_pct rename signal_q userdata RangeFinder::RangeFinder_State field voltage_mv uint16_t'skip_check read write userdata RangeFinder::RangeFinder_State field voltage_mv rename voltage -ap_object AP_RangeFinder_Backend depends (!defined(HAL_BUILD_AP_PERIPH) || defined(HAL_PERIPH_ENABLE_RANGEFINDER)) +ap_object AP_RangeFinder_Backend depends AP_RANGEFINDER_ENABLED ap_object AP_RangeFinder_Backend method distance float ap_object AP_RangeFinder_Backend method signal_quality_pct float ap_object AP_RangeFinder_Backend method signal_quality_pct rename signal_quality @@ -244,7 +246,7 @@ ap_object AP_RangeFinder_Backend method status uint8_t ap_object AP_RangeFinder_Backend manual handle_script_msg lua_range_finder_handle_script_msg 1 1 ap_object AP_RangeFinder_Backend method get_state void RangeFinder::RangeFinder_State'Ref -singleton RangeFinder depends (!defined(HAL_BUILD_AP_PERIPH) || defined(HAL_PERIPH_ENABLE_RANGEFINDER)) +singleton RangeFinder depends AP_RANGEFINDER_ENABLED singleton RangeFinder rename rangefinder singleton RangeFinder method num_sensors uint8_t singleton RangeFinder method has_orientation boolean Rotation'enum ROTATION_NONE ROTATION_MAX-1 @@ -296,6 +298,7 @@ singleton GCS method get_high_latency_status depends HAL_HIGH_LATENCY2_ENABLED = singleton GCS method enable_high_latency_connections void boolean singleton GCS method enable_high_latency_connections depends HAL_HIGH_LATENCY2_ENABLED == 1 +singleton GCS manual run_command_int lua_GCS_command_int 2 1 include AP_ONVIF/AP_ONVIF.h depends ENABLE_ONVIF == 1 singleton AP_ONVIF depends ENABLE_ONVIF == 1 @@ -392,18 +395,21 @@ singleton RC_Channels method lua_rc_channel RC_Channel uint8_t 1 NUM_RC_CHANNELS singleton RC_Channels method lua_rc_channel rename get_channel singleton RC_Channels method get_aux_cached boolean RC_Channel::AUX_FUNC'enum 0 UINT16_MAX uint8_t'Null -include AP_SerialManager/AP_SerialManager.h +include AP_Scripting/AP_Scripting_SerialAccess.h +-- don't let user create access objects +userdata AP_Scripting_SerialAccess creation null -1 +userdata AP_Scripting_SerialAccess method begin void uint32_t 1U UINT32_MAX +userdata AP_Scripting_SerialAccess method write uint32_t uint8_t'skip_check +userdata AP_Scripting_SerialAccess manual writestring lua_serial_writestring 1 1 +userdata AP_Scripting_SerialAccess method read int16_t +userdata AP_Scripting_SerialAccess manual readstring lua_serial_readstring 1 1 +userdata AP_Scripting_SerialAccess method available uint32_t +userdata AP_Scripting_SerialAccess method set_flow_control void AP_HAL::UARTDriver::flow_control'enum AP_HAL::UARTDriver::FLOW_CONTROL_DISABLE AP_HAL::UARTDriver::FLOW_CONTROL_RTS_DE -ap_object AP_HAL::UARTDriver method begin void uint32_t 1U UINT32_MAX -ap_object AP_HAL::UARTDriver method read int16_t -ap_object AP_HAL::UARTDriver manual readstring AP_HAL__UARTDriver_readstring 1 1 -ap_object AP_HAL::UARTDriver method write uint32_t uint8_t'skip_check -ap_object AP_HAL::UARTDriver method available uint32_t -ap_object AP_HAL::UARTDriver method set_flow_control void AP_HAL::UARTDriver::flow_control'enum AP_HAL::UARTDriver::FLOW_CONTROL_DISABLE AP_HAL::UARTDriver::FLOW_CONTROL_RTS_DE - -singleton AP_SerialManager rename serial -singleton AP_SerialManager depends HAL_GCS_ENABLED -singleton AP_SerialManager method find_serial AP_HAL::UARTDriver AP_SerialManager::SerialProtocol_Scripting'literal uint8_t'skip_check +-- serial is not a real C++ type here, but its name never gets used in C++ as we only have manual methods +singleton serial depends AP_SERIALMANAGER_ENABLED +singleton serial manual find_serial lua_serial_find_serial 1 1 +singleton serial manual find_simulated_device lua_serial_find_simulated_device 2 1 depends AP_SCRIPTING_SERIALDEVICE_ENABLED include AP_Baro/AP_Baro.h singleton AP_Baro depends (!defined(HAL_BUILD_AP_PERIPH) || defined(HAL_PERIPH_ENABLE_BARO)) @@ -413,6 +419,7 @@ singleton AP_Baro method get_temperature float singleton AP_Baro method get_external_temperature float singleton AP_Baro method get_altitude float singleton AP_Baro method healthy boolean uint8_t'skip_check +singleton AP_Baro method get_altitude_difference float float'skip_check float'skip_check include AP_OpticalFlow/AP_OpticalFlow.h singleton AP_OpticalFlow depends AP_OPTICALFLOW_ENABLED @@ -542,8 +549,11 @@ singleton Sub depends APM_BUILD_TYPE(APM_BUILD_ArduSub) singleton Sub method get_and_clear_button_count uint8_t uint8_t 1 4 singleton Sub method is_button_pressed boolean uint8_t 1 4 singleton Sub method rangefinder_alt_ok boolean +singleton Sub method rangefinder_alt_ok depends AP_RANGEFINDER_ENABLED singleton Sub method get_rangefinder_target_cm float +singleton Sub method get_rangefinder_target_cm depends AP_RANGEFINDER_ENABLED singleton Sub method set_rangefinder_target_cm boolean float'skip_check +singleton Sub method set_rangefinder_target_cm depends AP_RANGEFINDER_ENABLED include AP_Motors/AP_MotorsMatrix.h depends APM_BUILD_TYPE(APM_BUILD_ArduPlane)||APM_BUILD_COPTER_OR_HELI singleton AP_MotorsMatrix depends APM_BUILD_TYPE(APM_BUILD_ArduPlane)||APM_BUILD_COPTER_OR_HELI @@ -579,6 +589,7 @@ ap_object AP_HAL::I2CDevice semaphore-pointer ap_object AP_HAL::I2CDevice method set_retries void uint8_t 0 20 ap_object AP_HAL::I2CDevice method write_register boolean uint8_t'skip_check uint8_t'skip_check ap_object AP_HAL::I2CDevice manual read_registers AP_HAL__I2CDevice_read_registers 2 1 +ap_object AP_HAL::I2CDevice manual transfer AP_HAL__I2CDevice_transfer 2 1 ap_object AP_HAL::I2CDevice method set_address void uint8_t'skip_check include AP_HAL/utility/Socket.h depends (AP_NETWORKING_ENABLED==1) @@ -622,6 +633,8 @@ singleton hal.analogin depends !defined(HAL_DISABLE_ADC_DRIVER) singleton hal.analogin rename analog singleton hal.analogin literal singleton hal.analogin method channel AP_HAL::AnalogSource ANALOG_INPUT_NONE'literal +singleton hal.analogin method mcu_temperature float +singleton hal.analogin method mcu_temperature depends HAL_WITH_MCU_MONITORING include AP_Motors/AP_MotorsMatrix_Scripting_Dynamic.h depends APM_BUILD_TYPE(APM_BUILD_ArduPlane)||APM_BUILD_COPTER_OR_HELI singleton AP_MotorsMatrix_Scripting_Dynamic depends APM_BUILD_TYPE(APM_BUILD_ArduPlane)||APM_BUILD_COPTER_OR_HELI diff --git a/libraries/AP_Scripting/generator/src/main.c b/libraries/AP_Scripting/generator/src/main.c index e7758e7a7c..e22f03d05d 100644 --- a/libraries/AP_Scripting/generator/src/main.c +++ b/libraries/AP_Scripting/generator/src/main.c @@ -1302,13 +1302,12 @@ void emit_userdata_allocators(void) { while (node) { start_dependency(source, node->dependency); // New method used internally - fprintf(source, "int new_%s(lua_State *L) {\n", node->sanatized_name); - fprintf(source, " luaL_checkstack(L, 2, \"Out of stack\");\n"); // ensure we have sufficent stack to push the return + fprintf(source, "%s * new_%s(lua_State *L) {\n", node->name, node->sanatized_name); fprintf(source, " void *ud = lua_newuserdata(L, sizeof(%s));\n", node->name); fprintf(source, " new (ud) %s();\n", node->name); fprintf(source, " luaL_getmetatable(L, \"%s\");\n", node->rename ? node->rename : node->name); fprintf(source, " lua_setmetatable(L, -2);\n"); - fprintf(source, " return 1;\n"); + fprintf(source, " return (%s *)ud;\n", node->name); fprintf(source, "}\n"); // New method used externally, includes argcheck, overridden by custom creation function if provided @@ -1322,7 +1321,8 @@ void emit_userdata_allocators(void) { fprintf(source, " warned = true;\n"); fprintf(source, " }\n"); - fprintf(source, " return new_%s(L);\n", node->sanatized_name); + fprintf(source, " new_%s(L);\n", node->sanatized_name); + fprintf(source, " return 1;\n"); fprintf(source, "}\n"); } @@ -1336,8 +1336,8 @@ void emit_ap_object_allocators(void) { struct userdata * node = parsed_ap_objects; while (node) { start_dependency(source, node->dependency); - fprintf(source, "int new_%s(lua_State *L) {\n", node->sanatized_name); - fprintf(source, " return new_ap_object(L, sizeof(%s *), \"%s\");\n", node->name, node->name); + fprintf(source, "%s ** new_%s(lua_State *L) {\n", node->name, node->sanatized_name); + fprintf(source, " return (%s **)new_ap_object(L, sizeof(%s *), \"%s\");\n", node->name, node->name, node->name); fprintf(source, "}\n"); end_dependency(source, node->dependency); fprintf(source, "\n"); @@ -1350,8 +1350,7 @@ void emit_userdata_checkers(void) { while (node) { start_dependency(source, node->dependency); fprintf(source, "%s * check_%s(lua_State *L, int arg) {\n", node->name, node->sanatized_name); - fprintf(source, " void *data = luaL_checkudata(L, arg, \"%s\");\n", node->rename ? node->rename : node->name); - fprintf(source, " return (%s *)data;\n", node->name); + fprintf(source, " return (%s *)luaL_checkudata(L, arg, \"%s\");\n", node->name, node->rename ? node->rename : node->name); fprintf(source, "}\n"); end_dependency(source, node->dependency); fprintf(source, "\n"); @@ -1364,13 +1363,7 @@ void emit_ap_object_checkers(void) { while (node) { start_dependency(source, node->dependency); fprintf(source, "%s ** check_%s(lua_State *L, int arg) {\n", node->name, node->sanatized_name); - fprintf(source, " %s ** data = (%s**)luaL_checkudata(L, arg, \"%s\");\n", node->name, node->name, node->name); - fprintf(source, " %s * ud = *data;\n", node->name); - fprintf(source, " if (ud == NULL) {\n"); - fprintf(source, " // This error will never return, so there is no danger of returning a NULL\n"); - fprintf(source, " luaL_error(L, \"Internal error, null pointer\");\n"); - fprintf(source, " }\n"); - fprintf(source, " return data;\n"); + fprintf(source, " return (%s **)check_ap_object(L, arg, \"%s\");\n", node->name, node->name); fprintf(source, "}\n"); end_dependency(source, node->dependency); fprintf(source, "\n"); @@ -1402,7 +1395,7 @@ void emit_userdata_declarations(void) { struct userdata * node = parsed_userdata; while (node) { start_dependency(header, node->dependency); - fprintf(header, "int new_%s(lua_State *L);\n", node->sanatized_name); + fprintf(header, "%s * new_%s(lua_State *L);\n", node->name, node->sanatized_name); if (node->creation == NULL) { fprintf(header, "int lua_new_%s(lua_State *L);\n", node->sanatized_name); } @@ -1416,7 +1409,7 @@ void emit_ap_object_declarations(void) { struct userdata * node = parsed_ap_objects; while (node) { start_dependency(header, node->dependency); - fprintf(header, "int new_%s(lua_State *L);\n", node->sanatized_name); + fprintf(header, "%s ** new_%s(lua_State *L);\n", node->name, node->sanatized_name); fprintf(header, "%s ** check_%s(lua_State *L, int arg);\n", node->name, node->sanatized_name); end_dependency(header, node->dependency); node = node->next; @@ -1742,8 +1735,7 @@ void emit_field(const struct userdata_field *field, const char* object_name, con fprintf(source, "%slua_pushinteger(L, static_cast(%s%s%s%s));\n", indent, object_name, object_access, field->name, index_string); break; case TYPE_UINT32_T: - fprintf(source, "%snew_uint32_t(L);\n", indent); - fprintf(source, "%s*check_uint32_t(L, -1) = %s%s%s%s;\n", indent, object_name, object_access, field->name, index_string); + fprintf(source, "%s*new_uint32_t(L) = %s%s%s%s;\n", indent, object_name, object_access, field->name, index_string); break; case TYPE_NONE: error(ERROR_INTERNAL, "Can't access a NONE field"); @@ -1755,9 +1747,7 @@ void emit_field(const struct userdata_field *field, const char* object_name, con fprintf(source, "%slua_pushstring(L, %s%s%s%s);\n", indent, object_name, object_access, field->name, index_string); break; case TYPE_USERDATA: - // userdatas must allocate a new container to return - fprintf(source, "%snew_%s(L);\n", indent, field->type.data.ud.sanatized_name); - fprintf(source, "%s*check_%s(L, -1) = %s%s%s%s;\n", indent, field->type.data.ud.sanatized_name, object_name, object_access, field->name, index_string); + fprintf(source, "%s*new_%s(L) = %s%s%s%s;\n", indent, field->type.data.ud.sanatized_name, object_name, object_access, field->name, index_string); break; case TYPE_AP_OBJECT: // FIXME: collapse the identical cases here, and use the type string function error(ERROR_USERDATA, "AP_Object does not currently support access to userdata field's"); @@ -1780,7 +1770,7 @@ void emit_field(const struct userdata_field *field, const char* object_name, con if (use_switch) { fprintf(source, " default:\n"); - fprintf(source, " return luaL_argerror(L, lua_gettop(L), \"too many arguments\");\n"); + fprintf(source, " return field_argerror(L); // too many arguments\n"); fprintf(source, " }\n"); } @@ -1844,9 +1834,20 @@ void emit_singleton_fields() { int emit_references(const struct argument *arg, const char * tab) { int arg_index = NULLABLE_ARG_COUNT_BASE + 2; int return_count = 0; + // count arguments to return so we know if we need to check the stack + const struct argument *count_arg = arg; + while (count_arg != NULL) { + if (count_arg->type.flags & (TYPE_FLAGS_NULLABLE | TYPE_FLAGS_REFERNCE)) { + return_count++; + } + count_arg = count_arg->next; + } + // add one to have a spare stack slot for userdata creation funcs + fprintf(source, "#if %d > LUA_MINSTACK\n", return_count+1); + fprintf(source, "%sluaL_checkstack(L, %d, nullptr);\n", tab, return_count+1); + fprintf(source, "#endif\n\n"); while (arg != NULL) { if (arg->type.flags & (TYPE_FLAGS_NULLABLE | TYPE_FLAGS_REFERNCE)) { - return_count++; switch (arg->type.type) { case TYPE_BOOLEAN: fprintf(source, "%slua_pushboolean(L, data_%d);\n", tab, arg_index); @@ -1863,16 +1864,13 @@ int emit_references(const struct argument *arg, const char * tab) { fprintf(source, "%slua_pushinteger(L, data_%d);\n", tab, arg_index); break; case TYPE_UINT32_T: - fprintf(source, "%snew_uint32_t(L);\n", tab); - fprintf(source, "%s*check_uint32_t(L, -1) = data_%d;\n", tab, arg_index); + fprintf(source, "%s*new_uint32_t(L) = data_%d;\n", tab, arg_index); break; case TYPE_STRING: fprintf(source, "%slua_pushstring(L, data_%d);\n", tab, arg_index); break; case TYPE_USERDATA: - // userdatas must allocate a new container to return - fprintf(source, "%snew_%s(L);\n", tab, arg->type.data.ud.sanatized_name); - fprintf(source, "%s*check_%s(L, -1) = data_%d;\n", tab, arg->type.data.ud.sanatized_name, arg_index); + fprintf(source, "%s*new_%s(L) = data_%d;\n", tab, arg->type.data.ud.sanatized_name, arg_index); break; case TYPE_NONE: error(ERROR_INTERNAL, "Attempted to emit a nullable or reference argument of type none"); @@ -1902,11 +1900,6 @@ void emit_userdata_method(const struct userdata *data, const struct method *meth // emit comments on expected arg/type struct argument *arg = method->arguments; - if ((data->ud_type == UD_SINGLETON) && !(data->flags & UD_FLAG_LITERAL)) { - // fetch and check the singleton pointer - fprintf(source, " %s * ud = check_%s(L);\n", data->name, data->sanatized_name); - } - // emit warning if configured if (method->deprecate != NULL) { fprintf(source, " static bool warned = false;\n"); @@ -1916,7 +1909,6 @@ void emit_userdata_method(const struct userdata *data, const struct method *meth fprintf(source, " }\n\n"); } - // sanity check number of args called with arg_count = 1; while (arg != NULL) { @@ -1933,8 +1925,12 @@ void emit_userdata_method(const struct userdata *data, const struct method *meth fprintf(source, " %s * ud = check_%s(L, 1);\n", data->name, data->sanatized_name); break; case UD_SINGLETON: + if (!(data->flags & UD_FLAG_LITERAL)) { + // fetch and check the singleton pointer + fprintf(source, " %s * ud = check_%s(L);\n", data->name, data->sanatized_name); + } + break; case UD_GLOBAL: - // this was bound early break; case UD_AP_OBJECT: // extract the userdata, it was a pointer, so we need to grab it @@ -2140,23 +2136,19 @@ void emit_userdata_method(const struct userdata *data, const struct method *meth fprintf(source, " lua_pushinteger(L, data);\n"); break; case TYPE_UINT32_T: - fprintf(source, " new_uint32_t(L);\n"); - fprintf(source, " *static_cast(luaL_checkudata(L, -1, \"uint32_t\")) = data;\n"); + fprintf(source, " *new_uint32_t(L) = data;\n"); break; case TYPE_STRING: fprintf(source, " lua_pushstring(L, data);\n"); break; case TYPE_USERDATA: - // userdatas must allocate a new container to return - fprintf(source, " new_%s(L);\n", method->return_type.data.ud.sanatized_name); - fprintf(source, " *check_%s(L, -1) = data;\n", method->return_type.data.ud.sanatized_name); + fprintf(source, " *new_%s(L) = data;\n", method->return_type.data.ud.sanatized_name); break; case TYPE_AP_OBJECT: fprintf(source, " if (data == NULL) {\n"); fprintf(source, " return 0;\n"); fprintf(source, " }\n"); - fprintf(source, " new_%s(L);\n", method->return_type.data.ud.sanatized_name); - fprintf(source, " *(%s**)luaL_checkudata(L, -1, \"%s\") = data;\n", method->return_type.data.ud.name, method->return_type.data.ud.name); + fprintf(source, " *new_%s(L) = data;\n", method->return_type.data.ud.sanatized_name); break; case TYPE_NONE: case TYPE_LITERAL: @@ -2343,14 +2335,12 @@ void emit_operators(struct userdata *data) { } else { // Return same type // create a container for the result - fprintf(source, " new_%s(L);\n", data->sanatized_name); - fprintf(source, " *check_%s(L, -1) = (%sud) %s (%sud2);\n", data->sanatized_name, access, op_sym, access); + fprintf(source, " *new_%s(L) = (%sud) %s (%sud2);\n", data->sanatized_name, access, op_sym, access); } } else { // Only a single value, lua pushes the same value onto the stack twice, so we still check for 2 arguments - fprintf(source, " new_%s(L);\n", data->sanatized_name); - fprintf(source, " *check_%s(L, -1) = %s (%sud);\n", data->sanatized_name, op_sym, access); + fprintf(source, " *new_%s(L) = %s (%sud);\n", data->sanatized_name, op_sym, access); } @@ -2381,7 +2371,7 @@ void emit_methods(struct userdata *node) { } void emit_enum(struct userdata * data) { - fprintf(source, "struct userdata_enum %s_enums[] = {\n", data->sanatized_name); + fprintf(source, "const struct userdata_enum %s_enums[] = {\n", data->sanatized_name); struct userdata_enum *ud_enum = data->enums; while (ud_enum != NULL) { fprintf(source, " {\"%s\", %s::%s},\n", ud_enum->name, data->name, ud_enum->name); @@ -2414,11 +2404,13 @@ void emit_index(struct userdata *head) { struct method_alias *alias = node->method_aliases; while(alias) { + start_dependency(source, alias->dependency); if (alias->type == ALIAS_TYPE_MANUAL) { fprintf(source, " {\"%s\", %s},\n", alias->alias, alias->name); } else if (alias->type == ALIAS_TYPE_NONE) { fprintf(source, " {\"%s\", %s_%s},\n", alias->alias, node->sanatized_name, alias->name); } + end_dependency(source, alias->dependency); alias = alias->next; } @@ -2449,15 +2441,11 @@ void emit_index(struct userdata *head) { } fprintf(source, "static int %s_index(lua_State *L) {\n", node->sanatized_name); - fprintf(source, " const char * name = luaL_checkstring(L, 2);\n"); - fprintf(source, " if (load_function(L,%s_meta,ARRAY_SIZE(%s_meta),name)",node->sanatized_name,node->sanatized_name); + fprintf(source, " return load_function(L,%s_meta,ARRAY_SIZE(%s_meta))",node->sanatized_name,node->sanatized_name); if (node->enums != NULL) { - fprintf(source, " || load_enum(L,%s_enums,ARRAY_SIZE(%s_enums),name)",node->sanatized_name,node->sanatized_name); + fprintf(source, " || load_enum(L,%s_enums,ARRAY_SIZE(%s_enums))",node->sanatized_name,node->sanatized_name); } - fprintf(source, ") {\n"); - fprintf(source, " return 1;\n"); - fprintf(source, " }\n"); - fprintf(source, " return 0;\n"); + fprintf(source, ";\n"); fprintf(source, "}\n"); end_dependency(source, node->dependency); fprintf(source, "\n"); @@ -2497,68 +2485,75 @@ void emit_loaders(void) { emit_type_index(parsed_singletons, "singleton"); emit_type_index(parsed_ap_objects, "ap_object"); + fprintf(source, "static int binding_index(lua_State *L) {\n"); + fprintf(source, " const char * name = luaL_checkstring(L, 2);\n"); + fprintf(source, "\n"); + fprintf(source, " bool found = false;\n"); + fprintf(source, " for (uint32_t i = 0; i < ARRAY_SIZE(singleton_fun); i++) {\n"); + fprintf(source, " if (strcmp(name, singleton_fun[i].name) == 0) {\n"); + fprintf(source, " lua_newuserdata(L, 0);\n"); + fprintf(source, " if (luaL_newmetatable(L, name)) { // need to create metatable\n"); + fprintf(source, " lua_pushcfunction(L, singleton_fun[i].func);\n"); + fprintf(source, " lua_setfield(L, -2, \"__index\");\n"); + fprintf(source, " }\n"); + fprintf(source, " lua_setmetatable(L, -2);\n"); + fprintf(source, " found = true;\n"); + fprintf(source, " break;\n"); + fprintf(source, " }\n"); + fprintf(source, " }\n"); + fprintf(source, " if (!found) {\n"); + fprintf(source, " for (uint32_t i = 0; i < ARRAY_SIZE(new_userdata); i++) {\n"); + fprintf(source, " if (strcmp(name, new_userdata[i].name) == 0) {\n"); + fprintf(source, " lua_pushcfunction(L, new_userdata[i].fun);\n"); + fprintf(source, " found = true;\n"); + fprintf(source, " break;\n"); + fprintf(source, " }\n"); + fprintf(source, " }\n"); + fprintf(source, " }\n"); + fprintf(source, " if (!found) {\n"); + fprintf(source, " return 0;\n"); + fprintf(source, " }\n"); + fprintf(source, "\n"); + fprintf(source, " // store found value to avoid a re-index\n"); + fprintf(source, " lua_pushvalue(L, -2);\n"); + fprintf(source, " lua_pushvalue(L, -2);\n"); + fprintf(source, " lua_settable(L, -5);\n"); + fprintf(source, "\n"); + fprintf(source, " return 1;\n"); + fprintf(source, "}\n\n"); + fprintf(source, "void load_generated_bindings(lua_State *L) {\n"); - fprintf(source, " luaL_checkstack(L, 5, \"Out of stack\");\n"); // this is more stack space then we need, but should never fail + fprintf(source, " luaL_checkstack(L, 5, nullptr);\n"); // this is more stack space then we need, but should never fail fprintf(source, " // userdata metatables\n"); fprintf(source, " for (uint32_t i = 0; i < ARRAY_SIZE(userdata_fun); i++) {\n"); fprintf(source, " luaL_newmetatable(L, userdata_fun[i].name);\n"); - fprintf(source, " lua_pushcclosure(L, userdata_fun[i].func, 0);\n"); + fprintf(source, " lua_pushcfunction(L, userdata_fun[i].func);\n"); fprintf(source, " lua_setfield(L, -2, \"__index\");\n"); fprintf(source, " if (userdata_fun[i].operators != nullptr) {\n"); fprintf(source, " luaL_setfuncs(L, userdata_fun[i].operators, 0);\n"); fprintf(source, " }\n"); - fprintf(source, " lua_pushstring(L, \"__call\");\n"); - fprintf(source, " lua_pushvalue(L, -2);\n"); - fprintf(source, " lua_settable(L, -3);\n"); - fprintf(source, " lua_pop(L, 1);\n"); - fprintf(source, " lua_newuserdata(L, 0);\n"); - fprintf(source, " luaL_getmetatable(L, userdata_fun[i].name);\n"); - fprintf(source, " lua_setmetatable(L, -2);\n"); - fprintf(source, " lua_setglobal(L, userdata_fun[i].name);\n"); fprintf(source, " }\n"); fprintf(source, "\n"); fprintf(source, " // ap object metatables\n"); fprintf(source, " for (uint32_t i = 0; i < ARRAY_SIZE(ap_object_fun); i++) {\n"); fprintf(source, " luaL_newmetatable(L, ap_object_fun[i].name);\n"); - fprintf(source, " lua_pushcclosure(L, ap_object_fun[i].func, 0);\n"); + fprintf(source, " lua_pushcfunction(L, ap_object_fun[i].func);\n"); fprintf(source, " lua_setfield(L, -2, \"__index\");\n"); - fprintf(source, " lua_pushstring(L, \"__call\");\n"); - fprintf(source, " lua_pushvalue(L, -2);\n"); - fprintf(source, " lua_settable(L, -3);\n"); fprintf(source, " lua_pop(L, 1);\n"); - fprintf(source, " lua_newuserdata(L, 0);\n"); - fprintf(source, " luaL_getmetatable(L, ap_object_fun[i].name);\n"); - fprintf(source, " lua_setmetatable(L, -2);\n"); - fprintf(source, " lua_setglobal(L, ap_object_fun[i].name);\n"); fprintf(source, " }\n"); fprintf(source, "\n"); - fprintf(source, " // singleton metatables\n"); - fprintf(source, " for (uint32_t i = 0; i < ARRAY_SIZE(singleton_fun); i++) {\n"); - fprintf(source, " luaL_newmetatable(L, singleton_fun[i].name);\n"); - fprintf(source, " lua_pushcclosure(L, singleton_fun[i].func, 0);\n"); - fprintf(source, " lua_setfield(L, -2, \"__index\");\n"); - fprintf(source, " lua_pushstring(L, \"__call\");\n"); - fprintf(source, " lua_pushvalue(L, -2);\n"); - fprintf(source, " lua_settable(L, -3);\n"); + fprintf(source, " // singletons and userdata creation funcs are loaded dynamically\n"); - fprintf(source, " lua_pop(L, 1);\n"); - fprintf(source, " lua_newuserdata(L, 0);\n"); - fprintf(source, " luaL_getmetatable(L, singleton_fun[i].name);\n"); - fprintf(source, " lua_setmetatable(L, -2);\n"); - fprintf(source, " lua_setglobal(L, singleton_fun[i].name);\n"); - fprintf(source, " }\n"); - - fprintf(source, "\n"); fprintf(source, "}\n\n"); } -void emit_sandbox(void) { +void emit_userdata_new_funcs(void) { struct userdata *data = parsed_userdata; fprintf(source, "const struct userdata {\n"); fprintf(source, " const char *name;\n"); @@ -2568,8 +2563,8 @@ void emit_sandbox(void) { // Dont expose creation function for all read only items int expose_creation = FALSE; if (data->creation || data->methods) { - // Custom creation or methods - expose_creation = TRUE; + // Custom creation or methods, if not specifically disabled + expose_creation = !(data->creation && data->creation_args == -1); } else { // Feilds only struct userdata_field * field = data->fields; @@ -2607,23 +2602,14 @@ void emit_sandbox(void) { } } fprintf(source, "};\n\n"); +} +void emit_sandbox(void) { fprintf(source, "void load_generated_sandbox(lua_State *L) {\n"); - // load the singletons - fprintf(source, " for (uint32_t i = 0; i < ARRAY_SIZE(singleton_fun); i++) {\n"); - fprintf(source, " lua_pushstring(L, singleton_fun[i].name);\n"); - fprintf(source, " lua_getglobal(L, singleton_fun[i].name);\n"); - fprintf(source, " lua_settable(L, -3);\n"); - fprintf(source, " }\n"); - - // load the userdata allactors and globals - fprintf(source, " for (uint32_t i = 0; i < ARRAY_SIZE(new_userdata); i++) {\n"); - fprintf(source, " lua_pushstring(L, new_userdata[i].name);\n"); - fprintf(source, " lua_pushcfunction(L, new_userdata[i].fun);\n"); - fprintf(source, " lua_settable(L, -3);\n"); - fprintf(source, " }\n"); - - fprintf(source, "\n"); + fprintf(source, " lua_createtable(L, 0, 1);\n"); + fprintf(source, " lua_pushcfunction(L, binding_index);\n"); + fprintf(source, " lua_setfield(L, -2, \"__index\");\n"); + fprintf(source, " lua_setmetatable(L, -2);\n"); fprintf(source, "}\n"); } @@ -2640,6 +2626,10 @@ void emit_argcheck_helper(void) { fprintf(source, " return 0;\n"); fprintf(source, "}\n\n"); + fprintf(source, "int field_argerror(lua_State *L) {\n"); + fprintf(source, " return binding_argcheck(L, -1); // force too many args error\n"); + fprintf(source, "}\n\n"); + // emit warning if augments are parsed fprintf(source, "bool userdata_zero_arg_check(lua_State *L) {\n"); fprintf(source, " if (lua_gettop(L) == 0) {\n"); @@ -2709,12 +2699,19 @@ void emit_argcheck_helper(void) { fprintf(source, " return lua_unint32;\n"); fprintf(source, "}\n\n"); - fprintf(source, "int new_ap_object(lua_State *L, size_t size, const char * name) {\n"); - fprintf(source, " luaL_checkstack(L, 2, \"Out of stack\");\n"); - fprintf(source, " lua_newuserdata(L, size);\n"); + fprintf(source, "void * new_ap_object(lua_State *L, size_t size, const char * name) {\n"); + fprintf(source, " void * ud = lua_newuserdata(L, size);\n"); fprintf(source, " luaL_getmetatable(L, name);\n"); fprintf(source, " lua_setmetatable(L, -2);\n"); - fprintf(source, " return 1;\n"); + fprintf(source, " return ud;\n"); + fprintf(source, "}\n\n"); + + fprintf(source, "void ** check_ap_object(lua_State *L, int arg_num, const char * name) {\n"); + fprintf(source, " void ** data = (void **)luaL_checkudata(L, arg_num, name);\n"); + fprintf(source, " if (*data == NULL) {\n"); + fprintf(source, " luaL_error(L, \"internal error: %%s is null\", name); // does not return\n"); + fprintf(source, " }\n"); + fprintf(source, " return data;\n"); fprintf(source, "}\n\n"); } @@ -2866,7 +2863,8 @@ void emit_docs(struct userdata *node, int is_userdata, int emit_creation) { // local userdata fprintf(docs, "local %s = {}\n\n", name); - if (emit_creation) { + int creation_disabled = (node->creation && node->creation_args == -1); + if (emit_creation && (!node->creation || !creation_disabled)) { // creation function if (node->creation != NULL) { for (int i = 0; i < node->creation_args; ++i) { @@ -2984,14 +2982,15 @@ void emit_docs(struct userdata *node, int is_userdata, int emit_creation) { void emit_index_helpers(void) { - fprintf(source, "static bool load_function(lua_State *L, const luaL_Reg *list, const uint8_t length, const char* name) {\n"); + fprintf(source, "static int load_function(lua_State *L, const luaL_Reg *list, const uint8_t length) {\n"); + fprintf(source, " const char * name = luaL_checkstring(L, 2);\n"); fprintf(source, " for (uint8_t i = 0; i < length; i++) {\n"); fprintf(source, " if (strcmp(name,list[i].name) == 0) {\n"); fprintf(source, " lua_pushcfunction(L, list[i].func);\n"); - fprintf(source, " return true;\n"); + fprintf(source, " return 1;\n"); fprintf(source, " }\n"); fprintf(source, " }\n"); - fprintf(source, " return false;\n"); + fprintf(source, " return 0;\n"); fprintf(source, "}\n\n"); // If enough stuff is defined out we can end up with no enums. @@ -2999,14 +2998,15 @@ void emit_index_helpers(void) { fprintf(source, "#pragma GCC diagnostic push\n"); fprintf(source, "#pragma GCC diagnostic ignored \"-Wunused-function\"\n"); - fprintf(source, "static bool load_enum(lua_State *L, const userdata_enum *list, const uint8_t length, const char* name) {\n"); + fprintf(source, "static int load_enum(lua_State *L, const userdata_enum *list, const uint8_t length) {\n"); + fprintf(source, " const char * name = luaL_checkstring(L, 2);\n"); fprintf(source, " for (uint8_t i = 0; i < length; i++) {\n"); fprintf(source, " if (strcmp(name,list[i].name) == 0) {\n"); fprintf(source, " lua_pushinteger(L, list[i].value);\n"); - fprintf(source, " return true;\n"); + fprintf(source, " return 1;\n"); fprintf(source, " }\n"); fprintf(source, " }\n"); - fprintf(source, " return false;\n"); + fprintf(source, " return 0;\n"); fprintf(source, "}\n"); fprintf(source, "#pragma GCC diagnostic pop\n\n"); @@ -3166,7 +3166,7 @@ int main(int argc, char **argv) { emit_methods(parsed_ap_objects); emit_index(parsed_ap_objects); - + emit_userdata_new_funcs(); emit_loaders(); emit_sandbox(); @@ -3197,6 +3197,7 @@ int main(int argc, char **argv) { fprintf(header, "void load_generated_bindings(lua_State *L);\n"); fprintf(header, "void load_generated_sandbox(lua_State *L);\n"); fprintf(header, "int binding_argcheck(lua_State *L, int expected_arg_count);\n"); + fprintf(header, "int field_argerror(lua_State *L);\n"); fprintf(header, "bool userdata_zero_arg_check(lua_State *L);\n"); fprintf(header, "lua_Integer get_integer(lua_State *L, int arg_num, lua_Integer min_val, lua_Integer max_val);\n"); fprintf(header, "int8_t get_int8_t(lua_State *L, int arg_num);\n"); @@ -3205,7 +3206,8 @@ int main(int argc, char **argv) { fprintf(header, "uint16_t get_uint16_t(lua_State *L, int arg_num);\n"); fprintf(header, "float get_number(lua_State *L, int arg_num, float min_val, float max_val);\n"); fprintf(header, "uint32_t get_uint32(lua_State *L, int arg_num, uint32_t min_val, uint32_t max_val);\n"); - fprintf(header, "int new_ap_object(lua_State *L, size_t size, const char * name);\n"); + fprintf(header, "void * new_ap_object(lua_State *L, size_t size, const char * name);\n"); + fprintf(header, "void ** check_ap_object(lua_State *L, int arg_num, const char * name);\n"); struct userdata * node = parsed_singletons; while (node) { diff --git a/libraries/AP_Scripting/lua/src/loadlib.c b/libraries/AP_Scripting/lua/src/loadlib.c index 20af8e4766..12ff54b6d0 100644 --- a/libraries/AP_Scripting/lua/src/loadlib.c +++ b/libraries/AP_Scripting/lua/src/loadlib.c @@ -622,26 +622,25 @@ static void findloader (lua_State *L, const char *name) { static int ll_require (lua_State *L) { const char *name = luaL_checkstring(L, 1); lua_settop(L, 1); - lua_rawgeti(L, LUA_REGISTRYINDEX, lua_get_current_ref()); /* get the current script */ - lua_getupvalue(L, 2, 1); /* get the environment of the script */ - lua_getfield(L, 3, LUA_LOADED_TABLE); /* get _LOADED */ - lua_getfield(L, 4, name); /* LOADED[name] */ + lua_rawgeti(L, LUA_REGISTRYINDEX, lua_get_current_env_ref()); /* get the environment of the current script */ + lua_getfield(L, 2, LUA_LOADED_TABLE); /* get _LOADED */ + lua_getfield(L, 3, name); /* LOADED[name] */ if (lua_toboolean(L, -1)) /* is it there? */ return 1; /* package is already loaded */ /* else must load package */ lua_pop(L, 1); /* remove 'getfield' result */ findloader(L, name); - lua_pushvalue(L, 3); /* push current script's environment */ + lua_pushvalue(L, 2); /* push current script's environment */ lua_setupvalue(L, -3, 1); /* set the environment of the module */ lua_pushstring(L, name); /* pass name as argument to module loader */ lua_insert(L, -2); /* name is 1st argument (before search data) */ lua_call(L, 2, 1); /* run loader to load module */ if (!lua_isnil(L, -1)) /* non-nil return? */ - lua_setfield(L, 4, name); /* LOADED[name] = returned value */ - if (lua_getfield(L, 4, name) == LUA_TNIL) { /* module set no value? */ + lua_setfield(L, 3, name); /* LOADED[name] = returned value */ + if (lua_getfield(L, 3, name) == LUA_TNIL) { /* module set no value? */ lua_pushboolean(L, 1); /* use true as result */ lua_pushvalue(L, -1); /* extra copy to be returned */ - lua_setfield(L, 4, name); /* LOADED[name] = true */ + lua_setfield(L, 3, name); /* LOADED[name] = true */ } return 1; } diff --git a/libraries/AP_Scripting/lua/src/lstrlib.c b/libraries/AP_Scripting/lua/src/lstrlib.c index 5f649b6f6f..99ea2477ed 100644 --- a/libraries/AP_Scripting/lua/src/lstrlib.c +++ b/libraries/AP_Scripting/lua/src/lstrlib.c @@ -1585,7 +1585,11 @@ static void createmetatable (lua_State *L) { */ LUAMOD_API int luaopen_string (lua_State *L) { luaL_newlib(L, strlib); +#if defined(ARDUPILOT_BUILD) + // metatable setup handled by Ardupilot scripting system +#else createmetatable(L); +#endif return 1; } diff --git a/libraries/AP_Scripting/lua_bindings.cpp b/libraries/AP_Scripting/lua_bindings.cpp index de82efd870..269eceedfa 100644 --- a/libraries/AP_Scripting/lua_bindings.cpp +++ b/libraries/AP_Scripting/lua_bindings.cpp @@ -16,6 +16,7 @@ #include "lua_boxed_numerics.h" #include +#include #include #include @@ -33,8 +34,7 @@ extern const AP_HAL::HAL& hal; int lua_millis(lua_State *L) { binding_argcheck(L, 0); - new_uint32_t(L); - *check_uint32_t(L, -1) = AP_HAL::millis(); + *new_uint32_t(L) = AP_HAL::millis(); return 1; } @@ -43,8 +43,7 @@ int lua_millis(lua_State *L) { int lua_micros(lua_State *L) { binding_argcheck(L, 0); - new_uint32_t(L); - *check_uint32_t(L, -1) = AP_HAL::micros(); + *new_uint32_t(L) = AP_HAL::micros(); return 1; } @@ -100,8 +99,7 @@ int lua_mavlink_receive_chan(lua_State *L) { luaL_addlstring(&b, (char *)&msg.msg, sizeof(msg.msg)); luaL_pushresult(&b); lua_pushinteger(L, msg.chan); - new_uint32_t(L); - *check_uint32_t(L, -1) = msg.timestamp_ms; + *new_uint32_t(L) = msg.timestamp_ms; return 3; } else { // no MAVLink to handle, just return no results @@ -239,8 +237,7 @@ int lua_mission_receive(lua_State *L) { return 0; } - new_uint32_t(L); - *check_uint32_t(L, -1) = cmd.time_ms; + *new_uint32_t(L) = cmd.time_ms; lua_pushinteger(L, cmd.p1); lua_pushnumber(L, cmd.content_p1); @@ -459,11 +456,17 @@ int AP_Logger_Write(lua_State *L) { case 'M': // uint8_t (flight mode) case 'B': { // uint8_t int isnum; - const lua_Integer tmp1 = lua_tointegerx(L, arg_index, &isnum); + lua_Integer tmp1 = lua_tointegerx(L, arg_index, &isnum); if (!isnum || (tmp1 < 0) || (tmp1 > UINT8_MAX)) { - luaM_free(L, buffer); - luaL_argerror(L, arg_index, "argument out of range"); - // no return + // Also allow boolean + if (!isnum && lua_isboolean(L, arg_index)) { + tmp1 = lua_toboolean(L, arg_index); + + } else { + luaM_free(L, buffer); + luaL_argerror(L, arg_index, "argument out of range"); + // no return + } } uint8_t tmp = static_cast(tmp1); memcpy(&buffer[offset], &tmp, sizeof(uint8_t)); @@ -599,8 +602,7 @@ int lua_get_i2c_device(lua_State *L) { return luaL_argerror(L, 1, "i2c device nullptr"); } - new_AP_HAL__I2CDevice(L); - *((AP_HAL::I2CDevice**)luaL_checkudata(L, -1, "AP_HAL::I2CDevice")) = scripting->_i2c_dev[scripting->num_i2c_devices]->get(); + *new_AP_HAL__I2CDevice(L) = scripting->_i2c_dev[scripting->num_i2c_devices]->get(); scripting->num_i2c_devices++; @@ -649,27 +651,30 @@ int AP_HAL__I2CDevice_read_registers(lua_State *L) { return success; } -int AP_HAL__UARTDriver_readstring(lua_State *L) { - binding_argcheck(L, 2); +int AP_HAL__I2CDevice_transfer(lua_State *L) { + binding_argcheck(L, 3); - AP_HAL::UARTDriver * ud = *check_AP_HAL__UARTDriver(L, 1); + AP_HAL::I2CDevice * ud = *check_AP_HAL__I2CDevice(L, 1); - const uint16_t count = get_uint16_t(L, 2); - uint8_t *data = (uint8_t*)malloc(count); - if (data == nullptr) { + // Parse string of bytes to send + size_t send_len; + const uint8_t* send_data = (const uint8_t*)(lua_tolstring(L, 2, &send_len)); + + // Parse and setup rx buffer + uint32_t rx_len = get_uint8_t(L, 3); + uint8_t rx_data[rx_len]; + + // Transfer + ud->get_semaphore()->take_blocking(); + const bool success = ud->transfer(send_data, send_len, rx_data, rx_len); + ud->get_semaphore()->give(); + + if (!success) { return 0; } - const auto ret = ud->read(data, count); - if (ret < 0) { - free(data); - return 0; - } - - // push to lua string - lua_pushlstring(L, (const char *)data, ret); - free(data); - + // Return a string + lua_pushlstring(L, (const char *)rx_data, rx_len); return 1; } @@ -699,8 +704,7 @@ int lua_get_CAN_device(lua_State *L) { return 0; } - new_ScriptingCANBuffer(L); - *((ScriptingCANBuffer**)luaL_checkudata(L, -1, "ScriptingCANBuffer")) = scripting->_CAN_dev->add_buffer(buffer_len); + *new_ScriptingCANBuffer(L) = scripting->_CAN_dev->add_buffer(buffer_len); return 1; } @@ -730,13 +734,115 @@ int lua_get_CAN_device2(lua_State *L) { return 0; } - new_ScriptingCANBuffer(L); - *((ScriptingCANBuffer**)luaL_checkudata(L, -1, "ScriptingCANBuffer")) = scripting->_CAN_dev2->add_buffer(buffer_len); + *new_ScriptingCANBuffer(L) = scripting->_CAN_dev2->add_buffer(buffer_len); return 1; } #endif // AP_SCRIPTING_CAN_SENSOR_ENABLED +#if AP_SERIALMANAGER_ENABLED +int lua_serial_find_serial(lua_State *L) { + // Allow : and . access + const int arg_offset = (luaL_testudata(L, 1, "serial") != NULL) ? 1 : 0; + + binding_argcheck(L, 1 + arg_offset); + + uint8_t instance = get_uint8_t(L, 1 + arg_offset); + + AP_SerialManager *mgr = &AP::serialmanager(); + AP_HAL::UARTDriver *driver_stream = mgr->find_serial( + AP_SerialManager::SerialProtocol_Scripting, instance); + + if (driver_stream == nullptr) { // not found + return 0; + } + + AP_Scripting_SerialAccess *port = new_AP_Scripting_SerialAccess(L); + port->stream = driver_stream; +#if AP_SCRIPTING_SERIALDEVICE_ENABLED + port->is_device_port = false; +#endif + + return 1; +} +#endif // AP_SERIALMANAGER_ENABLED + +#if AP_SCRIPTING_SERIALDEVICE_ENABLED +int lua_serial_find_simulated_device(lua_State *L) { + // Allow : and . access + const int arg_offset = (luaL_testudata(L, 1, "serial") != NULL) ? 1 : 0; + + binding_argcheck(L, 2 + arg_offset); + + const int8_t protocol = (int8_t)get_uint32(L, 1 + arg_offset, 0, 127); + uint32_t instance = get_uint16_t(L, 2 + arg_offset); + + auto *scripting = AP::scripting(); + AP_Scripting_SerialDevice::Port *device_stream = nullptr; + + for (auto &port : scripting->_serialdevice.ports) { + if (port.state.protocol == protocol) { + if (instance-- == 0) { + device_stream = &port; + break; + } + } + } + + if (!scripting->_serialdevice.enable || device_stream == nullptr) { + // serial devices as a whole are disabled, or port not found + return 0; + } + + AP_Scripting_SerialAccess *port = new_AP_Scripting_SerialAccess(L); + port->stream = device_stream; + port->is_device_port = true; + + return 1; +} +#endif // AP_SCRIPTING_SERIALDEVICE_ENABLED + +int lua_serial_writestring(lua_State *L) +{ + binding_argcheck(L, 2); + + AP_Scripting_SerialAccess * port = check_AP_Scripting_SerialAccess(L, 1); + + // get the bytes the user wants to write, along with their length + size_t req_bytes; + const char *data = lua_tolstring(L, 2, &req_bytes); + + // write up to that number of bytes + const uint32_t written_bytes = port->write((const uint8_t*)data, req_bytes); + + // return the number of bytes that were actually written + lua_pushinteger(L, written_bytes); + + return 1; +} + +int lua_serial_readstring(lua_State *L) { + binding_argcheck(L, 2); + + AP_Scripting_SerialAccess * port = check_AP_Scripting_SerialAccess(L, 1); + + // create a buffer sized to hold the number of bytes the user wants to read + luaL_Buffer b; + const uint16_t req_bytes = get_uint16_t(L, 2); + uint8_t *data = (uint8_t *)luaL_buffinitsize(L, &b, req_bytes); + + // read up to that number of bytes + const ssize_t read_bytes = port->read(data, req_bytes); + if (read_bytes < 0) { + return 0; // error, return nil + } + + // push the buffer as a string, truncated to the number of bytes actually read + luaL_pushresultsize(&b, read_bytes); + + return 1; +} + /* directory listing, return table of files in a directory */ @@ -774,7 +880,7 @@ int lua_dirlist(lua_State *L) { int lua_removefile(lua_State *L) { binding_argcheck(L, 1); const char *filename = luaL_checkstring(L, 1); - return luaL_fileresult(L, remove(filename) == 0, filename); + return luaL_fileresult(L, AP::FS().unlink(filename) == 0, filename); } // Manual binding to allow SRV_Channels table to see safety state @@ -800,8 +906,7 @@ int lua_get_PWMSource(lua_State *L) { return luaL_argerror(L, 1, "PWMSources device nullptr"); } - new_AP_HAL__PWMSource(L); - *((AP_HAL::PWMSource**)luaL_checkudata(L, -1, "AP_HAL::PWMSource")) = scripting->_pwm_source[scripting->num_pwm_source]; + *new_AP_HAL__PWMSource(L) = scripting->_pwm_source[scripting->num_pwm_source]; scripting->num_pwm_source++; @@ -824,8 +929,7 @@ int lua_get_SocketAPM(lua_State *L) { for (uint8_t i=0; i_net_sockets[i] == nullptr) { scripting->_net_sockets[i] = sock; - new_SocketAPM(L); - *((SocketAPM**)luaL_checkudata(L, -1, "SocketAPM")) = scripting->_net_sockets[i]; + *new_SocketAPM(L) = scripting->_net_sockets[i]; return 1; } } @@ -924,8 +1028,7 @@ int SocketAPM_accept(lua_State *L) { if (scripting->_net_sockets[i] == nullptr) { return 0; } - new_SocketAPM(L); - *((SocketAPM**)luaL_checkudata(L, -1, "SocketAPM")) = scripting->_net_sockets[i]; + *new_SocketAPM(L) = scripting->_net_sockets[i]; return 1; } } @@ -937,10 +1040,10 @@ int SocketAPM_accept(lua_State *L) { #endif // AP_NETWORKING_ENABLED -int lua_get_current_ref() +int lua_get_current_env_ref() { auto *scripting = AP::scripting(); - return scripting->get_current_ref(); + return scripting->get_current_env_ref(); } // This is used when loading modules with require, lua must only look in enabled directory's @@ -980,7 +1083,7 @@ int lua_print(lua_State *L) { return 0; } -#if (!defined(HAL_BUILD_AP_PERIPH) || defined(HAL_PERIPH_ENABLE_RANGEFINDER)) +#if AP_RANGEFINDER_ENABLED int lua_range_finder_handle_script_msg(lua_State *L) { // Arg 1 => self (an instance of rangefinder_backend) // Arg 2 => a float distance or a RangeFinder_State user data @@ -1004,7 +1107,7 @@ int lua_range_finder_handle_script_msg(lua_State *L) { lua_pushboolean(L, result); return 1; } -#endif +#endif // AP_RANGEFINDER_ENABLED /* lua wants to abort, and doesn't have access to a panic function @@ -1025,4 +1128,76 @@ void lua_abort() #endif } +#if HAL_GCS_ENABLED +/* + implement gcs:command_int() access to MAV_CMD_xxx commands + */ +int lua_GCS_command_int(lua_State *L) +{ + GCS *_gcs = check_GCS(L); + binding_argcheck(L, 3); + + const uint16_t command = get_uint16_t(L, 2); + if (!lua_istable(L, 3)) { + // must have parameter table + return 0; + } + + mavlink_command_int_t pkt {}; + + pkt.command = command; + + float *params = &pkt.param1; + int32_t *xy = &pkt.x; + + // extract the first 4 parameters as floats + for (uint8_t i=0; i<4; i++) { + char pname[3] { 'p' , char('1' + i), 0 }; + lua_pushstring(L, pname); + lua_gettable(L, 3); + if (lua_isnumber(L, -1)) { + params[i] = lua_tonumber(L, -1); + } + lua_pop(L, 1); + } + + // extract the xy values + for (uint8_t i=0; i<2; i++) { + const char *names[] = { "x", "y" }; + lua_pushstring(L, names[i]); + lua_gettable(L, 3); + if (lua_isinteger(L, -1)) { + xy[i] = lua_tointeger(L, -1); + } + lua_pop(L, 1); + } + + // and z + lua_pushstring(L, "z"); + lua_gettable(L, 3); + if (lua_isnumber(L, -1)) { + pkt.z = lua_tonumber(L, -1); + } + lua_pop(L, 1); + + // optional frame + lua_pushstring(L, "frame"); + lua_gettable(L, 3); + if (lua_isinteger(L, -1)) { + pkt.frame = lua_tointeger(L, -1); + } + lua_pop(L, 1); + + // call the interface with scheduler lock + WITH_SEMAPHORE(AP::scheduler().get_semaphore()); + + auto result = _gcs->lua_command_int_packet(pkt); + + // Return the resulting MAV_RESULT + lua_pushinteger(L, result); + + return 1; +} +#endif + #endif // AP_SCRIPTING_ENABLED diff --git a/libraries/AP_Scripting/lua_bindings.h b/libraries/AP_Scripting/lua_bindings.h index add40faa0a..1c6a8358c3 100644 --- a/libraries/AP_Scripting/lua_bindings.h +++ b/libraries/AP_Scripting/lua_bindings.h @@ -8,9 +8,13 @@ int lua_mission_receive(lua_State *L); int AP_Logger_Write(lua_State *L); int lua_get_i2c_device(lua_State *L); int AP_HAL__I2CDevice_read_registers(lua_State *L); -int AP_HAL__UARTDriver_readstring(lua_State *L); +int AP_HAL__I2CDevice_transfer(lua_State *L); int lua_get_CAN_device(lua_State *L); int lua_get_CAN_device2(lua_State *L); +int lua_serial_find_serial(lua_State *L); +int lua_serial_find_simulated_device(lua_State *L); +int lua_serial_writestring(lua_State *L); +int lua_serial_readstring(lua_State *L); int lua_dirlist(lua_State *L); int lua_removefile(lua_State *L); int SRV_Channels_get_safety_state(lua_State *L); @@ -27,3 +31,4 @@ int lua_mavlink_send_chan(lua_State *L); int lua_mavlink_block_command(lua_State *L); int lua_print(lua_State *L); int lua_range_finder_handle_script_msg(lua_State *L); +int lua_GCS_command_int(lua_State *L); diff --git a/libraries/AP_Scripting/lua_boxed_numerics.cpp b/libraries/AP_Scripting/lua_boxed_numerics.cpp index cedc2a373d..4aa1f3aad0 100644 --- a/libraries/AP_Scripting/lua_boxed_numerics.cpp +++ b/libraries/AP_Scripting/lua_boxed_numerics.cpp @@ -79,8 +79,7 @@ int lua_new_uint32_t(lua_State *L) { return luaL_argerror(L, args, "too many arguments"); } - new_uint32_t(L); - *check_uint32_t(L, -1) = (args == 1) ? coerce_to_uint32_t(L, 1) : 0; + *new_uint32_t(L) = (args == 1) ? coerce_to_uint32_t(L, 1) : 0; return 1; } @@ -110,8 +109,7 @@ int lua_new_uint64_t(lua_State *L) { break; } - new_uint64_t(L); - *check_uint64_t(L, -1) = value; + *new_uint64_t(L) = value; return 1; } @@ -193,12 +191,10 @@ int uint64_t_split(lua_State *L) { const uint64_t v = *check_uint64_t(L, 1); // high - new_uint32_t(L); - *check_uint32_t(L, -1) = v >> 32; + *new_uint32_t(L) = v >> 32; // low - new_uint32_t(L); - *check_uint32_t(L, -1) = v & 0xFFFFFFFF; + *new_uint32_t(L) = v & 0xFFFFFFFF; return 2; } diff --git a/libraries/AP_Scripting/lua_common_defs.h b/libraries/AP_Scripting/lua_common_defs.h index 595665a1e8..f48a79c19d 100644 --- a/libraries/AP_Scripting/lua_common_defs.h +++ b/libraries/AP_Scripting/lua_common_defs.h @@ -10,7 +10,7 @@ #endif //HAL_OS_FATFS_IO #endif // SCRIPTING_DIRECTORY -int lua_get_current_ref(); +int lua_get_current_env_ref(); const char* lua_get_modules_path(); void lua_abort(void) __attribute__((noreturn)); diff --git a/libraries/AP_Scripting/lua_scripts.cpp b/libraries/AP_Scripting/lua_scripts.cpp index 5a55e302d2..a3e587c53e 100644 --- a/libraries/AP_Scripting/lua_scripts.cpp +++ b/libraries/AP_Scripting/lua_scripts.cpp @@ -191,7 +191,8 @@ lua_scripts::script_info *lua_scripts::load_script(lua_State *L, char *filename) create_sandbox(L); - lua_setupvalue(L, -2, 1); + lua_pushvalue(L, -1); // duplicate environment for reference below + lua_setupvalue(L, -3, 1); const uint32_t loadEnd = AP_HAL::micros(); const int endMem = lua_gc(L, LUA_GCCOUNT, 0) * 1024 + lua_gc(L, LUA_GCCOUNTB, 0); @@ -199,7 +200,8 @@ lua_scripts::script_info *lua_scripts::load_script(lua_State *L, char *filename) update_stats(filename, loadEnd-loadStart, endMem, loadMem); new_script->name = filename; - new_script->lua_ref = luaL_ref(L, LUA_REGISTRYINDEX); // cache the reference + new_script->env_ref = luaL_ref(L, LUA_REGISTRYINDEX); // store reference to script's environment + new_script->run_ref = luaL_ref(L, LUA_REGISTRYINDEX); // store reference to function to run new_script->next_run_ms = AP_HAL::millis64() - 1; // force the script to be stale // Get checksum of file @@ -268,8 +270,8 @@ void lua_scripts::load_all_scripts_in_dir(lua_State *L, const char *dirname) { continue; } - if (strncmp(&de->d_name[length-4], ".lua", 4)) { - // doesn't end in .lua + if ((de->d_name[0] == '.') || strncmp(&de->d_name[length-4], ".lua", 4)) { + // starts with . (hidden file) or doesn't end in .lua continue; } @@ -325,8 +327,9 @@ void lua_scripts::run_next_script(lua_State *L) { int stack_top = lua_gettop(L); // pop the function to the top of the stack - lua_rawgeti(L, LUA_REGISTRYINDEX, script->lua_ref); - AP::scripting()->set_current_ref(script->lua_ref); + lua_rawgeti(L, LUA_REGISTRYINDEX, script->run_ref); + // set current environment for other users + AP::scripting()->set_current_env_ref(script->env_ref); if(lua_pcall(L, 0, LUA_MULTRET, 0)) { if (overtime) { @@ -364,8 +367,8 @@ void lua_scripts::run_next_script(lua_State *L) { // types match the expectations, go ahead and reschedule script->next_run_ms = start_time_ms + (uint64_t)luaL_checknumber(L, -1); lua_pop(L, 1); - int old_ref = script->lua_ref; - script->lua_ref = luaL_ref(L, LUA_REGISTRYINDEX); + int old_ref = script->run_ref; + script->run_ref = luaL_ref(L, LUA_REGISTRYINDEX); luaL_unref(L, LUA_REGISTRYINDEX, old_ref); reschedule_script(script); break; @@ -409,7 +412,8 @@ void lua_scripts::remove_script(lua_State *L, script_info *script) { if (L != nullptr) { // state could be null if we are force killing all scripts - luaL_unref(L, LUA_REGISTRYINDEX, script->lua_ref); + luaL_unref(L, LUA_REGISTRYINDEX, script->env_ref); + luaL_unref(L, LUA_REGISTRYINDEX, script->run_ref); } _heap.deallocate(script->name); _heap.deallocate(script); @@ -495,6 +499,16 @@ void lua_scripts::run(void) { lua_atpanic(L, atpanic); load_generated_bindings(L); + // set up string metatable. we set up one for all scripts that no script has + // access to, as it's impossible to set up one per-script and we don't want + // any script to be able to mess with it. + lua_pushliteral(L, ""); /* dummy string */ + lua_createtable(L, 0, 1); /* table to be metatable for strings */ + luaopen_string(L); /* get string library */ + lua_setfield(L, -2, "__index"); /* metatable.__index = string */ + lua_setmetatable(L, -2); /* set table as metatable for strings */ + lua_pop(L, 1); /* pop dummy string */ + #ifndef HAL_CONSOLE_DISABLED const int loaded_mem = lua_gc(L, LUA_GCCOUNT, 0) * 1024 + lua_gc(L, LUA_GCCOUNTB, 0); DEV_PRINTF("Lua: State memory usage: %i + %i\n", inital_mem, loaded_mem - inital_mem); @@ -550,8 +564,11 @@ void lua_scripts::run(void) { if ((_debug_options.get() & uint8_t(DebugLevel::RUNTIME_MSG)) != 0) { GCS_SEND_TEXT(MAV_SEVERITY_DEBUG, "Lua: Running %s", scripts->name); } - // copy name for logging, cant do it after as script reschedule moves the pointers - const char * script_name = scripts->name; + // take a copy of the script name for the purposes of + // logging statistics. "scripts" may become invalid + // during the "run_next_script" call, below. + char script_name[128+1] {}; + strncpy_noterm(script_name, scripts->name, 128); #if DISABLE_INTERRUPTS_FOR_SCRIPT_RUN void *istate = hal.scheduler->disable_interrupts_save(); @@ -560,6 +577,10 @@ void lua_scripts::run(void) { const int startMem = lua_gc(L, LUA_GCCOUNT, 0) * 1024 + lua_gc(L, LUA_GCCOUNTB, 0); const uint32_t loadEnd = AP_HAL::micros(); + // NOTE! the base pointer of our scripts linked list, + // *and all its contents* may become invalid as part of + // "run_next_script"! So do *NOT* attempt to access + // anything that was in *scripts after this call. run_next_script(L); const uint32_t runEnd = AP_HAL::micros(); diff --git a/libraries/AP_Scripting/lua_scripts.h b/libraries/AP_Scripting/lua_scripts.h index 3f7129172e..437b8d2035 100644 --- a/libraries/AP_Scripting/lua_scripts.h +++ b/libraries/AP_Scripting/lua_scripts.h @@ -62,7 +62,8 @@ private: void create_sandbox(lua_State *L); typedef struct script_info { - int lua_ref; // reference to the loaded script object + int env_ref; // reference to the script's environment table + int run_ref; // reference to the function to run uint64_t next_run_ms; // time (in milliseconds) the script should next be run at uint32_t crc; // crc32 checksum char *name; // filename for the script // FIXME: This information should be available from Lua @@ -110,7 +111,6 @@ private: static HAL_Semaphore error_msg_buf_sem; static uint8_t print_error_count; static uint32_t last_print_ms; - int current_ref; // XOR of crc32 of running scripts static uint32_t loaded_checksum; diff --git a/libraries/AP_Scripting/modules/MAVLink/Readme.md b/libraries/AP_Scripting/modules/MAVLink/Readme.md new file mode 100644 index 0000000000..97924a1c33 --- /dev/null +++ b/libraries/AP_Scripting/modules/MAVLink/Readme.md @@ -0,0 +1,6 @@ +These .lua definition for messages can be generated using pymavlink with the following command: +(change the last path acoordingly to place the files where you need them) +``` +cd ardupilot/modules/mavlink +python ./pymavlink/tools/mavgen.py --lang Lua ./message_definitions/v1.0/all.xml --out ./modules/MAVLink +``` \ No newline at end of file diff --git a/libraries/AP_Scripting/modules/MAVLink/mavlink_msg_SERIAL_CONTROL.lua b/libraries/AP_Scripting/modules/MAVLink/mavlink_msg_SERIAL_CONTROL.lua new file mode 100644 index 0000000000..e33110f7b7 --- /dev/null +++ b/libraries/AP_Scripting/modules/MAVLink/mavlink_msg_SERIAL_CONTROL.lua @@ -0,0 +1,11 @@ +local SERIAL_CONTROL = {} +SERIAL_CONTROL.id = 126 +SERIAL_CONTROL.fields = { + { "baudrate", "> 16) & 0xFF + local RDP = (message_id >> 24) & 0x3 + if PF < 0xF0 then + return (RDP << 16) | (PF << 8) + else + local PS = (message_id >> 8) & 0xFF + return (RDP << 16) | (PF << 8) | PS + end +end + +--[[ + extract data from a CAN frame as a lua binary string +--]] +local function extract_data(frame, max_len) + local ret = "" + local dlc = frame:dlc() + local len = math.min(dlc, max_len) + for ofs = 1, len do + ret = ret .. string.char(frame:data(ofs-1)) + end + return ret +end + +--[[ + set table of PGNs that we are interested in along with the expected packet size + + The table should be indexed by the PGN and give the expected size + of that PGN any frames with PGNs not in this table will be + discarded +--]] +function M.set_PGN_table(t) + M.PGN_table = t +end + +-- Parse CAN frame and reassemble messages +function M.parse(can_frame) + if not can_frame:isExtended() then + -- NMEA 2000 frame are always extended (29 bit address) + return nil + end + local message_id = can_frame:id_signed() + + local pgn = extract_pgn(message_id) + local dlc = can_frame:dlc() + + local exp_size = M.PGN_table[pgn] + if not exp_size then + -- discard unwated frame and reset pending + M.pending.pgn = nil + return nil + end + + if exp_size <= 8 and exp_size > dlc then + -- discard short frame + M.pending.pgn = nil + return nil + end + + if exp_size <= 8 then + -- single frame + local data = extract_data(can_frame, exp_size) + M.pending.pgn = nil + return pgn, data + end + + -- multi-frame + local data = extract_data(can_frame, dlc) + local subframe = string.byte(data, 1) & 0x1F + if M.pending.pgn ~= pgn or subframe ~= M.pending.count then + -- reset + M.pending.pgn = nil + M.pending.data = "" + M.pending.count = 0 + + if subframe ~= 0 then + -- discard, lost first frame or out of order + return nil + end + end + + if subframe == 0 then + M.pending.expected_size = string.byte(data, 2) + if M.pending.expected_size < exp_size then + M.pending.pgn = nil + return nil + end + M.pending.data = M.pending.data .. string.sub(data, 3, #data) + else + M.pending.data = M.pending.data .. string.sub(data, 2, #data) + end + M.pending.pgn = pgn + M.pending.count = M.pending.count + 1 + + -- do we have a complete frame + if #M.pending.data >= M.pending.expected_size then + M.pending.pgn = nil + return pgn, M.pending.data + end + + return nil +end + +return M diff --git a/libraries/AP_Scripting/modules/mavport.lua b/libraries/AP_Scripting/modules/mavport.lua new file mode 100644 index 0000000000..7bb616899f --- /dev/null +++ b/libraries/AP_Scripting/modules/mavport.lua @@ -0,0 +1,166 @@ +-- class to cast mavlink SERIAL_CONTROL message functionality as a serial port. +-- currently always uses the "dev shell" device (which is ignored by Ardupilot). +-- designed for use with the Lua REPL applet. +-- note that flush() must be called to empty internal transmit buffers. + +local mavport = {} + +local mavlink_msgs = require("MAVLink/mavlink_msgs") + +local SERIAL_CONTROL_DATA_LEN = 70 +local SERIAL_CONTROL = require("MAVLink/mavlink_msg_SERIAL_CONTROL") +local msg_map = { + [SERIAL_CONTROL.id] = "SERIAL_CONTROL", +} + +function mavport:begin(_) + local data = {} + for i = 1, SERIAL_CONTROL_DATA_LEN do + data[i] = 0 + end + self._tx_template = { + baudrate = 0, + timeout = 0, + device = 10, -- dev shell + flags = 1, -- is reply + count = 0, + data = data, + } + + self._tx_buf = data + self._tx_count = 0 + self._tx_msg = nil + + self._chan = 0 -- send to channel 0 by default + + self._rx_buf = nil + self._rx_pos = 1 + + mavlink.init(1, 4) -- only one message we care about, don't need huge queue + mavlink.register_rx_msgid(SERIAL_CONTROL.id) -- register it +end + +function mavport:write(value) + return self:writestring(string.char(value)) +end + +function mavport:writestring(str) + if self._tx_msg then -- message already queued? + self:flush() + if self._tx_msg then return 0 end -- reject if flush failed + end + + local count = self._tx_count + local buf = self._tx_buf + for ci = 1, #str do + if count == SERIAL_CONTROL_DATA_LEN then break end + count = count + 1 + buf[count] = str:byte(ci) + end + local sent = count - self._tx_count + self._tx_count = count + + if count == SERIAL_CONTROL_DATA_LEN then + self:flush() + end + + return sent +end + +function mavport:flush() -- send queued data if possible + if not self._tx_msg and self._tx_count > 0 then + -- encode the message and store it for transmission + local msg = self._tx_template + msg.count = self._tx_count + _, self._tx_msg = mavlink_msgs.encode("SERIAL_CONTROL", msg) + self._tx_count = 0 + end + + if self._tx_msg then -- message to send? + if mavlink.send_chan(self._chan, SERIAL_CONTROL.id, self._tx_msg) then + self._tx_msg = nil -- successfully sent + end + end +end + +function mavport:read() + if not self._rx_buf then + self:_receive() + if not self._rx_buf then return -1 end + end + + local b = self._rx_buf + local pos = self._rx_pos + local c = b[pos] + + self._rx_pos = pos + 1 + if pos == #b then + self._rx_buf = nil + end + + return c +end + +function mavport:readstring(count) + local avail = self:available() -- also fills rx buf + if avail == 0 then return "" end + if count > avail then count = avail end + + local b = self._rx_buf + local pos = self._rx_pos + local s = string.char(table.unpack(b, pos, pos+count-1)) + + pos = pos + count + if pos > #b then + self._rx_buf = nil + end + self._rx_pos = pos + + return s +end + +function mavport:_receive() + local msg, chan + while true do + msg, chan = mavlink.receive_chan() + if not msg then return end -- no new messages + + -- decode message and handle if it's for us + msg = mavlink_msgs.decode(msg, msg_map) + if msg.device == 10 then -- for the dev shell? + self._chan = chan -- reply on the same channel + break + end + end + + local data = msg.data + local count = msg.count + -- remove trailing nulls, they shouldn't happen but they do + while data[count] == 0 do + count = count - 1 + end + + -- store received bytes + if count > 0 then + if count < SERIAL_CONTROL_DATA_LEN then -- remove trailing junk + data = table.move(data, 1, count, 1, {}) + end + self._rx_buf = data + self._rx_pos = 1 + end +end + +function mavport:available() + if not self._rx_buf then + self:_receive() + if not self._rx_buf then return 0 end + end + + return #self._rx_buf - self._rx_pos + 1 +end + +-- for completeness +function mavport.set_flow_control(_, _) +end + +return mavport diff --git a/libraries/AP_Scripting/tests/scripting_require_test_2.lua b/libraries/AP_Scripting/tests/scripting_require_test_2.lua new file mode 100644 index 0000000000..f0bd9d2704 --- /dev/null +++ b/libraries/AP_Scripting/tests/scripting_require_test_2.lua @@ -0,0 +1,35 @@ +-- main require tests are in scripting_test.lua + +-- DO NOT EDIT!!!! it's very easy to make this accidentally pass even when the +-- original problem is still present!! we do some very careful work to check +-- that require works even when the function's first upvalue is not the script +-- environment. + +local loop_time = 500 -- number of ms between runs + +-- need to shadow gcs to make the upvalues right +local gcs = gcs -- luacheck: ignore + +local passes = 0 -- run both before and after scheduling + +local require_global = require("test/nested") + +local function update() + -- need to send before requiring to make the upvalues right + gcs:send_text(6, "testing") + local require_local = require("test/nested") -- should not crash + + -- validate we got the same object (object contents validated in main test) + if require_local == require_global then + passes = passes + 1 + else + gcs:send_text(0, "Failed: require returned different objects") + end + if passes >= 3 then + gcs:send_text(3, "Require test 2 passed") + end + + return update, loop_time +end + +return update() -- run immediately before starting to reschedule diff --git a/libraries/AP_Scripting/tests/serial_loopback.lua b/libraries/AP_Scripting/tests/serial_loopback.lua new file mode 100644 index 0000000000..9893c8f7d8 --- /dev/null +++ b/libraries/AP_Scripting/tests/serial_loopback.lua @@ -0,0 +1,36 @@ +local ser_driver = serial:find_serial(0) +local ser_device = serial:find_simulated_device(28, 0) + +if ser_driver == nil or ser_device == nil then + error("bad config") +end + +ser_driver:begin(115200) -- baud rate does not matter + +function test_driver_to_device() + local msg_send = "hello device" + local num_sent = 0 + for ci = 1,#msg_send do + num_sent = num_sent + ser_driver:write(msg_send:byte(ci, ci)):toint() + end + local msg_recv = ser_device:readstring(#msg_send) + if msg_send == msg_recv and num_sent == #msg_send then + gcs:send_text(6, "driver -> device good") + end +end + +function test_device_to_driver() + local msg_send = "hello driver" + local num_sent = ser_device:writestring(msg_send) + local msg_recv = ser_driver:readstring(#msg_send) + if msg_send == msg_recv and num_sent == #msg_send then + gcs:send_text(6, "device -> driver good") + end +end + +function update() + test_driver_to_device() + test_device_to_driver() +end + +return update() diff --git a/libraries/AP_SerialManager/AP_SerialManager.cpp b/libraries/AP_SerialManager/AP_SerialManager.cpp index 1ff5dae93d..06afa465f4 100644 --- a/libraries/AP_SerialManager/AP_SerialManager.cpp +++ b/libraries/AP_SerialManager/AP_SerialManager.cpp @@ -183,7 +183,7 @@ const AP_Param::GroupInfo AP_SerialManager::var_info[] = { // @Param: 1_PROTOCOL // @DisplayName: Telem1 protocol selection // @Description: Control what protocol to use on the Telem1 port. Note that the Frsky options require external converter hardware. See the wiki for details. - // @Values: -1:None, 1:MAVLink1, 2:MAVLink2, 3:Frsky D, 4:Frsky SPort, 5:GPS, 7:Alexmos Gimbal Serial, 8:Gimbal, 9:Rangefinder, 10:FrSky SPort Passthrough (OpenTX), 11:Lidar360, 13:Beacon, 14:Volz servo out, 15:SBus servo out, 16:ESC Telemetry, 17:Devo Telemetry, 18:OpticalFlow, 19:RobotisServo, 20:NMEA Output, 21:WindVane, 22:SLCAN, 23:RCIN, 24:EFI Serial, 25:LTM, 26:RunCam, 27:HottTelem, 28:Scripting, 29:Crossfire VTX, 30:Generator, 31:Winch, 32:MSP, 33:DJI FPV, 34:AirSpeed, 35:ADSB, 36:AHRS, 37:SmartAudio, 38:FETtecOneWire, 39:Torqeedo, 40:AIS, 41:CoDevESC, 42:DisplayPort, 43:MAVLink High Latency, 44:IRC Tramp, 45:DDS XRCE, 46:IMUDATA + // @Values: -1:None, 1:MAVLink1, 2:MAVLink2, 3:Frsky D, 4:Frsky SPort, 5:GPS, 7:Alexmos Gimbal Serial, 8:Gimbal, 9:Rangefinder, 10:FrSky SPort Passthrough (OpenTX), 11:Lidar360, 13:Beacon, 14:Volz servo out, 15:SBus servo out, 16:ESC Telemetry, 17:Devo Telemetry, 18:OpticalFlow, 19:RobotisServo, 20:NMEA Output, 21:WindVane, 22:SLCAN, 23:RCIN, 24:EFI Serial, 25:LTM, 26:RunCam, 27:HottTelem, 28:Scripting, 29:Crossfire VTX, 30:Generator, 31:Winch, 32:MSP, 33:DJI FPV, 34:AirSpeed, 35:ADSB, 36:AHRS, 37:SmartAudio, 38:FETtecOneWire, 39:Torqeedo, 40:AIS, 41:CoDevESC, 42:DisplayPort, 43:MAVLink High Latency, 44:IRC Tramp, 45:DDS XRCE, 46:IMUDATA, 48:PPP // @User: Standard // @RebootRequired: True AP_GROUPINFO("1_PROTOCOL", 1, AP_SerialManager, state[1].protocol, DEFAULT_SERIAL1_PROTOCOL), @@ -502,14 +502,9 @@ void AP_SerialManager::init() state[i].protocol.set_and_save(SerialProtocol_Rangefinder); break; case SerialProtocol_Volz: - // Note baudrate is hardcoded to 115200 - state[i].baud.set_and_default(AP_SERIALMANAGER_VOLZ_BAUD); // update baud param in case user looks at it - uart->begin(state[i].baudrate(), - AP_SERIALMANAGER_VOLZ_BUFSIZE_RX, - AP_SERIALMANAGER_VOLZ_BUFSIZE_TX); - uart->set_unbuffered_writes(true); - uart->set_flow_control(AP_HAL::UARTDriver::FLOW_CONTROL_DISABLE); - break; + // Note baudrate is hardcoded to 115200 + state[i].baud.set_and_default(AP_SERIALMANAGER_VOLZ_BAUD); // update baud param in case user looks at it + break; case SerialProtocol_Sbus1: state[i].baud.set_and_default(AP_SERIALMANAGER_SBUS1_BAUD / 1000); // update baud param in case user looks at it uart->begin(state[i].baudrate(), @@ -546,6 +541,8 @@ void AP_SerialManager::init() case SerialProtocol_RCIN: if (!AP::RC().has_uart()) { AP::RC().add_uart(uart); + } else { + GCS_SEND_TEXT(MAV_SEVERITY_WARNING, "SERIAL%u_PROTOCOL: duplicate RCIN not permitted", i); } break; diff --git a/libraries/AP_SerialManager/AP_SerialManager.h b/libraries/AP_SerialManager/AP_SerialManager.h index 6165102a1c..1933c3411c 100644 --- a/libraries/AP_SerialManager/AP_SerialManager.h +++ b/libraries/AP_SerialManager/AP_SerialManager.h @@ -85,6 +85,7 @@ public: SerialProtocol_IMUOUT = 46, // Reserving Serial Protocol 47 for SerialProtocol_IQ SerialProtocol_PPP = 48, + SerialProtocol_IBUS_Telem = 49, // i-BUS telemetry data, ie via sensor port of FS-iA6B SerialProtocol_NumProtocols // must be the last value }; diff --git a/libraries/AP_SerialManager/AP_SerialManager_config.h b/libraries/AP_SerialManager/AP_SerialManager_config.h index fb25527a8f..7ed9e502d6 100644 --- a/libraries/AP_SerialManager/AP_SerialManager_config.h +++ b/libraries/AP_SerialManager/AP_SerialManager_config.h @@ -71,6 +71,9 @@ #define AP_SERIALMANAGER_CAN_D1_PORT_1 41 // CAN_D1_UC_S1_* #define AP_SERIALMANAGER_CAN_D2_PORT_1 51 // CAN_D2_UC_S1_* +// serial device simulation ports registered by AP_Scripting will use IDs starting at 61 for the first port +#define AP_SERIALMANAGER_SCR_PORT_1 61 // SCR_SDEV1_* + // console default baud rates and buffer sizes #ifdef DEFAULT_SERIAL0_BAUD #define AP_SERIALMANAGER_CONSOLE_BAUD DEFAULT_SERIAL0_BAUD @@ -111,8 +114,6 @@ #define AP_SERIALMANAGER_GIMBAL_BUFSIZE_TX 128 #define AP_SERIALMANAGER_VOLZ_BAUD 115 -#define AP_SERIALMANAGER_VOLZ_BUFSIZE_RX 128 -#define AP_SERIALMANAGER_VOLZ_BUFSIZE_TX 128 #define AP_SERIALMANAGER_ROBOTIS_BUFSIZE_RX 128 #define AP_SERIALMANAGER_ROBOTIS_BUFSIZE_TX 128 diff --git a/libraries/AP_SmartRTL/AP_SmartRTL.cpp b/libraries/AP_SmartRTL/AP_SmartRTL.cpp index 173d12c8f4..ed25eee43b 100644 --- a/libraries/AP_SmartRTL/AP_SmartRTL.cpp +++ b/libraries/AP_SmartRTL/AP_SmartRTL.cpp @@ -117,7 +117,7 @@ void AP_SmartRTL::init() // check if memory allocation failed if (_path == nullptr || _prune.loops == nullptr || _simplify.stack == nullptr) { - log_action(SRTL_DEACTIVATED_INIT_FAILED); + log_action(Action::DEACTIVATED_INIT_FAILED); GCS_SEND_TEXT(MAV_SEVERITY_WARNING, "SmartRTL deactivated: init failed"); free(_path); free(_prune.loops); @@ -150,7 +150,7 @@ bool AP_SmartRTL::pop_point(Vector3f& point) // get semaphore if (!_path_sem.take_nonblocking()) { - log_action(SRTL_POP_FAILED_NO_SEMAPHORE); + log_action(Action::POP_FAILED_NO_SEMAPHORE); return false; } @@ -180,7 +180,7 @@ bool AP_SmartRTL::peek_point(Vector3f& point) // get semaphore if (!_path_sem.take_nonblocking()) { - log_action(SRTL_PEEK_FAILED_NO_SEMAPHORE); + log_action(Action::PEEK_FAILED_NO_SEMAPHORE); return false; } @@ -268,12 +268,12 @@ void AP_SmartRTL::update(bool position_ok, const Vector3f& current_pos) _last_position_save_ms = now; } else if (AP_HAL::millis() - _last_position_save_ms > SMARTRTL_TIMEOUT) { // deactivate after timeout due to failure to save points to path (most likely due to buffer filling up) - deactivate(SRTL_DEACTIVATED_PATH_FULL_TIMEOUT, "buffer full"); + deactivate(Action::DEACTIVATED_PATH_FULL_TIMEOUT, "buffer full"); } } else { // check for timeout due to bad position if (AP_HAL::millis() - _last_good_position_ms > SMARTRTL_TIMEOUT) { - deactivate(SRTL_DEACTIVATED_BAD_POSITION_TIMEOUT, "bad position"); + deactivate(Action::DEACTIVATED_BAD_POSITION_TIMEOUT, "bad position"); return; } } @@ -322,7 +322,7 @@ bool AP_SmartRTL::add_point(const Vector3f& point) { // get semaphore if (!_path_sem.take_nonblocking()) { - log_action(SRTL_ADD_FAILED_NO_SEMAPHORE, point); + log_action(Action::ADD_FAILED_NO_SEMAPHORE, point); return false; } @@ -338,13 +338,13 @@ bool AP_SmartRTL::add_point(const Vector3f& point) // check we have space in the path if (_path_points_count >= _path_points_max) { _path_sem.give(); - log_action(SRTL_ADD_FAILED_PATH_FULL, point); + log_action(Action::ADD_FAILED_PATH_FULL, point); return false; } // add point to path _path[_path_points_count++] = point; - log_action(SRTL_POINT_ADD, point); + log_action(Action::POINT_ADD, point); _path_sem.give(); return true; @@ -672,7 +672,7 @@ void AP_SmartRTL::remove_points_by_simplify_bitmask() uint16_t removed = 0; for (uint16_t src = 1; src < _path_points_count; src++) { if (!_simplify.bitmask.get(src)) { - log_action(SRTL_POINT_SIMPLIFY, _path[src]); + log_action(Action::POINT_SIMPLIFY, _path[src]); removed++; } else { _path[dest] = _path[src]; @@ -687,7 +687,7 @@ void AP_SmartRTL::remove_points_by_simplify_bitmask() _simplify.path_points_completed = _simplify.path_points_count; } else { // this is an error that should never happen so deactivate - deactivate(SRTL_DEACTIVATED_PROGRAM_ERROR, "program error"); + deactivate(Action::DEACTIVATED_PROGRAM_ERROR, "program error"); } _path_sem.give(); @@ -724,7 +724,7 @@ bool AP_SmartRTL::remove_points_by_loops(uint16_t num_points_to_remove) // shift points after the end of the loop down by the number of points in the loop uint16_t loop_num_points_to_remove = loop.end_index - loop.start_index; for (uint16_t dest = loop.start_index + 1; dest < _path_points_count - loop_num_points_to_remove; dest++) { - log_action(SRTL_POINT_PRUNE, _path[dest]); + log_action(Action::POINT_PRUNE, _path[dest]); _path[dest] = _path[dest + loop_num_points_to_remove]; } @@ -733,7 +733,7 @@ bool AP_SmartRTL::remove_points_by_loops(uint16_t num_points_to_remove) removed_points += loop_num_points_to_remove; } else { // this is an error that should never happen so deactivate - deactivate(SRTL_DEACTIVATED_PROGRAM_ERROR, "program error"); + deactivate(Action::DEACTIVATED_PROGRAM_ERROR, "program error"); _path_sem.give(); // we return true so thorough_cleanup does not get stuck return true; @@ -862,7 +862,7 @@ AP_SmartRTL::dist_point AP_SmartRTL::segment_segment_dist(const Vector3f &p1, co } // de-activate SmartRTL, send warning to GCS and logger -void AP_SmartRTL::deactivate(SRTL_Actions action, const char *reason) +void AP_SmartRTL::deactivate(Action action, const char *reason) { _active = false; log_action(action); @@ -871,7 +871,7 @@ void AP_SmartRTL::deactivate(SRTL_Actions action, const char *reason) #if HAL_LOGGING_ENABLED // logging -void AP_SmartRTL::log_action(SRTL_Actions action, const Vector3f &point) const +void AP_SmartRTL::log_action(Action action, const Vector3f &point) const { if (!_example_mode) { AP::logger().Write_SRTL(_active, _path_points_count, _path_points_max, action, point); diff --git a/libraries/AP_SmartRTL/AP_SmartRTL.h b/libraries/AP_SmartRTL/AP_SmartRTL.h index 144762e512..d2c5b439e0 100644 --- a/libraries/AP_SmartRTL/AP_SmartRTL.h +++ b/libraries/AP_SmartRTL/AP_SmartRTL.h @@ -41,6 +41,9 @@ public: // get a point on the path const Vector3f& get_point(uint16_t index) const { return _path[index]; } + // add point to end of path. returns true on success, false on failure (due to failure to take the semaphore) + bool add_point(const Vector3f& point); + // get next point on the path to home, returns true on success bool pop_point(Vector3f& point); @@ -88,19 +91,19 @@ public: private: // enums for logging latest actions - enum SRTL_Actions { - SRTL_POINT_ADD, - SRTL_POINT_PRUNE, - SRTL_POINT_SIMPLIFY, - SRTL_ADD_FAILED_NO_SEMAPHORE, - SRTL_ADD_FAILED_PATH_FULL, - SRTL_POP_FAILED_NO_SEMAPHORE, - SRTL_PEEK_FAILED_NO_SEMAPHORE, - SRTL_DEACTIVATED_INIT_FAILED, - SRTL_DEACTIVATED_BAD_POSITION, - SRTL_DEACTIVATED_BAD_POSITION_TIMEOUT, - SRTL_DEACTIVATED_PATH_FULL_TIMEOUT, - SRTL_DEACTIVATED_PROGRAM_ERROR, + enum Action : uint8_t { + POINT_ADD = 0, + POINT_PRUNE = 1, + POINT_SIMPLIFY = 2, + ADD_FAILED_NO_SEMAPHORE = 3, + ADD_FAILED_PATH_FULL = 4, + POP_FAILED_NO_SEMAPHORE = 5, + PEEK_FAILED_NO_SEMAPHORE = 6, + DEACTIVATED_INIT_FAILED = 7, + // DEACTIVATED_BAD_POSITION = 8, unused, but historical + DEACTIVATED_BAD_POSITION_TIMEOUT = 9, + DEACTIVATED_PATH_FULL_TIMEOUT = 10, + DEACTIVATED_PROGRAM_ERROR = 11, }; // enum for SRTL_OPTIONS parameter @@ -109,9 +112,6 @@ private: IgnorePilotYaw = (1U << 2), }; - // add point to end of path - bool add_point(const Vector3f& point); - // routine cleanup attempts to remove 10 points (see SMARTRTL_CLEANUP_POINT_MIN definition) by simplification or loop pruning void routine_cleanup(uint16_t path_points_count, uint16_t path_points_complete_limit); @@ -171,13 +171,13 @@ private: static dist_point segment_segment_dist(const Vector3f& p1, const Vector3f& p2, const Vector3f& p3, const Vector3f& p4); // de-activate SmartRTL, send warning to GCS and logger - void deactivate(SRTL_Actions action, const char *reason); + void deactivate(Action action, const char *reason); #if HAL_LOGGING_ENABLED // logging - void log_action(SRTL_Actions action, const Vector3f &point = Vector3f()) const; + void log_action(Action action, const Vector3f &point = Vector3f()) const; #else - void log_action(SRTL_Actions action, const Vector3f &point = Vector3f()) const {} + void log_action(Action action, const Vector3f &point = Vector3f()) const {} #endif // parameters diff --git a/libraries/AP_Soaring/AP_Soaring.cpp b/libraries/AP_Soaring/AP_Soaring.cpp index bb51cd3948..6133e1e920 100644 --- a/libraries/AP_Soaring/AP_Soaring.cpp +++ b/libraries/AP_Soaring/AP_Soaring.cpp @@ -432,15 +432,15 @@ void SoaringController::update_active_state(bool override_disable) switch (status) { case ActiveStatus::SOARING_DISABLED: // It's not enabled, but was enabled on the last loop. - gcs().send_text(MAV_SEVERITY_INFO, "Soaring: Disabled."); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Soaring: Disabled."); set_throttle_suppressed(false); break; case ActiveStatus::MANUAL_MODE_CHANGE: // It's enabled, but wasn't on the last loop. - gcs().send_text(MAV_SEVERITY_INFO, "Soaring: Enabled, manual mode changes."); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Soaring: Enabled, manual mode changes."); break; case ActiveStatus::AUTO_MODE_CHANGE: - gcs().send_text(MAV_SEVERITY_INFO, "Soaring: Enabled, automatic mode changes."); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Soaring: Enabled, automatic mode changes."); break; } diff --git a/libraries/AP_TECS/AP_TECS.cpp b/libraries/AP_TECS/AP_TECS.cpp index 9307502caa..e3843a02ae 100644 --- a/libraries/AP_TECS/AP_TECS.cpp +++ b/libraries/AP_TECS/AP_TECS.cpp @@ -222,7 +222,7 @@ const AP_Param::GroupInfo AP_TECS::var_info[] = { // @Param: TKOFF_IGAIN // @DisplayName: Controller integrator during takeoff - // @Description: This is the integrator gain on the control loop during takeoff. When set to 0 then TECS_INTEG_GAIN is used. Increase to increase the rate at which speed and height offsets are trimmed out. Typically values higher than TECS_INTEG_GAIN work best + // @Description: This is the integrator gain on the control loop during takeoff. Increase to increase the rate at which speed and height offsets are trimmed out. // @Range: 0.0 0.5 // @Increment: 0.02 // @User: Advanced @@ -415,7 +415,11 @@ void AP_TECS::_update_speed(float DT) if (aparm.stall_prevention) { // when stall prevention is active we raise the minimum // airspeed based on aerodynamic load factor - _TASmin *= _load_factor; + if (is_positive(aparm.airspeed_stall)) { + _TASmin = MAX(_TASmin, aparm.airspeed_stall*EAS2TAS*_load_factor); + } else { + _TASmin *= _load_factor; + } } if (_TASmax < _TASmin) { @@ -775,7 +779,6 @@ void AP_TECS::_update_throttle_with_airspeed(void) // ensure we run at full throttle until we reach the target airspeed _throttle_dem = MAX(_throttle_dem, _THRmaxf - _integTHR_state); } - _integTHR_state = integ_max; } else { _integTHR_state = constrain_float(_integTHR_state, integ_min, integ_max); } @@ -823,7 +826,12 @@ void AP_TECS::_update_throttle_with_airspeed(void) #endif } - // Constrain throttle demand and record clipping + constrain_throttle(); + +} + +// Constrain throttle demand and record clipping +void AP_TECS::constrain_throttle() { if (_throttle_dem > _THRmaxf) { _thr_clip_status = clipStatus::MAX; _throttle_dem = _THRmaxf; @@ -839,9 +847,7 @@ float AP_TECS::_get_i_gain(void) { float i_gain = _integGain; if (_flight_stage == AP_FixedWing::FlightStage::TAKEOFF || _flight_stage == AP_FixedWing::FlightStage::ABORT_LANDING) { - if (!is_zero(_integGain_takeoff)) { - i_gain = _integGain_takeoff; - } + i_gain = _integGain_takeoff; } else if (_flags.is_doing_auto_land) { if (!is_zero(_integGain_land)) { i_gain = _integGain_land; @@ -889,18 +895,6 @@ void AP_TECS::_update_throttle_without_airspeed(int16_t throttle_nudge, float pi _throttle_dem = nomThr; } - if (_flight_stage == AP_FixedWing::FlightStage::TAKEOFF) { - const uint32_t now = AP_HAL::millis(); - if (_takeoff_start_ms == 0) { - _takeoff_start_ms = now; - } - const uint32_t dt = now - _takeoff_start_ms; - if (dt*0.001 < aparm.takeoff_throttle_max_t) { - _throttle_dem = _THRmaxf; - } - } else { - _takeoff_start_ms = 0; - } if (_flags.is_gliding) { _throttle_dem = 0.0f; return; @@ -914,6 +908,8 @@ void AP_TECS::_update_throttle_without_airspeed(int16_t throttle_nudge, float pi float cosPhi = sqrtf((rotMat.a.y*rotMat.a.y) + (rotMat.b.y*rotMat.b.y)); float STEdot_dem = _rollComp * (1.0f/constrain_float(cosPhi * cosPhi, 0.1f, 1.0f) - 1.0f); _throttle_dem = _throttle_dem + STEdot_dem / (_STEdot_max - _STEdot_min) * (_THRmaxf - _THRminf); + + constrain_throttle(); } void AP_TECS::_detect_bad_descent(void) @@ -1084,17 +1080,17 @@ void AP_TECS::_update_pitch(void) // @Field: PEW: Potential energy weighting // @Field: KEW: Kinetic energy weighting // @Field: EBD: Energy balance demand - // @Field: EBE: Energy balance error + // @Field: EBE: Energy balance estimate // @Field: EBDD: Energy balance rate demand - // @Field: EBDE: Energy balance rate error + // @Field: EBDE: Energy balance rate estimate // @Field: EBDDT: Energy balance rate demand + Energy balance rate error*pitch_damping // @Field: Imin: Minimum integrator value // @Field: Imax: Maximum integrator value // @Field: I: Energy balance error integral // @Field: KI: Pitch demand kinetic energy integral - // @Field: pmin: Pitch min - // @Field: pmax: Pitch max - AP::logger().WriteStreaming("TEC2","TimeUS,PEW,KEW,EBD,EBE,EBDD,EBDE,EBDDT,Imin,Imax,I,KI,pmin,pmax", + // @Field: tmin: Throttle min + // @Field: tmax: Throttle max + AP::logger().WriteStreaming("TEC2","TimeUS,PEW,KEW,EBD,EBE,EBDD,EBDE,EBDDT,Imin,Imax,I,KI,tmin,tmax", "Qfffffffffffff", AP_HAL::micros64(), (double)SPE_weighting, @@ -1108,8 +1104,8 @@ void AP_TECS::_update_pitch(void) (double)integSEBdot_max, (double)_integSEBdot, (double)_integKE, - (double)_PITCHminf, - (double)_PITCHmaxf); + (double)_THRminf, + (double)_THRmaxf); } #endif } @@ -1168,22 +1164,25 @@ void AP_TECS::_initialise_states(int32_t ptchMinCO_cd, float hgt_afe) _hgt_dem = hgt_afe; _hgt_dem_in_prev = hgt_afe; _hgt_dem_in_raw = hgt_afe; - _TAS_dem_adj = _TAS_dem; - _flags.reset = true; - _post_TO_hgt_offset = _climb_rate * _hgt_dem_tconst; _flags.underspeed = false; _flags.badDescent = false; - + _post_TO_hgt_offset = _climb_rate_limit * _hgt_dem_tconst; // Replacement prevents oscillating hgt_rate_dem. + _TAS_dem_adj = _TAS_dem; _max_climb_scaler = 1.0f; _max_sink_scaler = 1.0f; - _pitch_demand_lpf.reset(_ahrs.get_pitch()); _pitch_measured_lpf.reset(_ahrs.get_pitch()); + + if (!_flag_have_reset_after_takeoff) { + _flags.reset = true; + _flag_have_reset_after_takeoff = true; + } } if (_flight_stage != AP_FixedWing::FlightStage::TAKEOFF && _flight_stage != AP_FixedWing::FlightStage::ABORT_LANDING) { // reset takeoff speed flag when not in takeoff _flags.reached_speed_takeoff = false; + _flag_have_reset_after_takeoff = false; } } @@ -1248,16 +1247,8 @@ void AP_TECS::update_pitch_throttle(int32_t hgt_dem_cm, _hgt_dem_in = _hgt_dem_in_raw; } - if (aparm.takeoff_throttle_max != 0 && - (_flight_stage == AP_FixedWing::FlightStage::TAKEOFF || _flight_stage == AP_FixedWing::FlightStage::ABORT_LANDING)) { - _THRmaxf = aparm.takeoff_throttle_max * 0.01f; - } else { - _THRmaxf = aparm.throttle_max * 0.01f; - } - _THRminf = aparm.throttle_min * 0.01f; - - // min of 1% throttle range to prevent a numerical error - _THRmaxf = MAX(_THRmaxf, _THRminf+0.01); + // Update the throttle limits. + _update_throttle_limits(); // work out the maximum and minimum pitch // if TECS_PITCH_{MAX,MIN} isn't set then use @@ -1308,9 +1299,6 @@ void AP_TECS::update_pitch_throttle(int32_t hgt_dem_cm, // note that this allows a flare pitch outside the normal TECS auto limits _PITCHmaxf = _land_pitch_max; } - - // and allow zero throttle - _THRminf = 0; } else if (_landing.is_on_approach()) { _PITCHminf = MAX(_PITCHminf, aparm.pitch_limit_min); _pitch_min_at_flare_entry = _PITCHminf; @@ -1335,7 +1323,7 @@ void AP_TECS::update_pitch_throttle(int32_t hgt_dem_cm, } if (flight_stage == AP_FixedWing::FlightStage::TAKEOFF || flight_stage == AP_FixedWing::FlightStage::ABORT_LANDING) { - if (!_flags.reached_speed_takeoff && _TAS_state >= _TAS_dem_adj) { + if (!_flags.reached_speed_takeoff && _TAS_state >= _TASmin && _TASmin > 0) { // we have reached our target speed in takeoff, allow for // normal throttle control _flags.reached_speed_takeoff = true; @@ -1436,3 +1424,80 @@ void AP_TECS::update_pitch_throttle(int32_t hgt_dem_cm, } #endif } + +// set minimum throttle override, [-1, -1] range +// it is applicable for one control cycle only +void AP_TECS::set_throttle_min(const float thr_min) { + // Don't change the limit if it is already covered. + if (thr_min > _THRminf_ext) { + _THRminf_ext = thr_min; + } +} + +// set minimum throttle override, [0, -1] range +// it is applicable for one control cycle only +void AP_TECS::set_throttle_max(const float thr_max) { + // Don't change the limit if it is already covered. + if (thr_max < _THRmaxf_ext) { + _THRmaxf_ext = thr_max; + } +} + +void AP_TECS::_update_throttle_limits() { + + // Configure max throttle. + + // Read the maximum throttle limit. + _THRmaxf = aparm.throttle_max * 0.01f; + // If more max throttle is allowed during takeoff, use it. + if (aparm.takeoff_throttle_max*0.01f > _THRmaxf + && (_flight_stage == AP_FixedWing::FlightStage::TAKEOFF || _flight_stage == AP_FixedWing::FlightStage::ABORT_LANDING) + ) { + _THRmaxf = aparm.takeoff_throttle_max * 0.01f; + } + // In any case, constrain to the external safety limits. + _THRmaxf = MIN(_THRmaxf, _THRmaxf_ext); + + // Configure min throttle. + + // If less min throttle is allowed during takeoff, use it. + bool use_takeoff_throttle = _flight_stage == AP_FixedWing::FlightStage::TAKEOFF || _flight_stage == AP_FixedWing::FlightStage::ABORT_LANDING; + const bool use_throttle_range = (aparm.takeoff_options & (uint32_t)AP_FixedWing::TakeoffOption::THROTTLE_RANGE); + use_takeoff_throttle = use_takeoff_throttle && (use_throttle_range == 1) && (aparm.takeoff_throttle_min != 0); + if ( use_takeoff_throttle ) { + _THRminf = MIN(_THRminf, aparm.takeoff_throttle_min * 0.01f); + } + else { // Otherwise, during normal situations let regular limit. + _THRminf = aparm.throttle_min * 0.01f; + } + // Raise min to force max throttle for TKOFF_THR_MAX_T after a takeoff. + if (_flight_stage == AP_FixedWing::FlightStage::TAKEOFF) { + const uint32_t now = AP_HAL::millis(); + if (_takeoff_start_ms == 0) { + _takeoff_start_ms = now; + } + const uint32_t dt = now - _takeoff_start_ms; + if (dt*0.001 < aparm.takeoff_throttle_max_t) { + _THRminf = _THRmaxf; + } + } else { + _takeoff_start_ms = 0; + } + // If we are flaring, allow the throttle to go to 0. + if (_landing.is_flaring()) { + _THRminf = 0; + } + // In any case, constrain to the external safety limits. + _THRminf = MAX(_THRminf, _THRminf_ext); + + // Allow a minimum of 1% throttle range, primarily to prevent TECS numerical errors. + if (_THRmaxf < 1) { + _THRmaxf = MAX(_THRmaxf, _THRminf + 0.01f); + } else { + _THRminf = MIN(_THRminf, _THRmaxf - 0.01f); + } + + // Reset the external throttle limits. + _THRminf_ext = -1.0f; + _THRmaxf_ext = 1.0f; +} \ No newline at end of file diff --git a/libraries/AP_TECS/AP_TECS.h b/libraries/AP_TECS/AP_TECS.h index fcd3fe97f9..8ffff211fb 100644 --- a/libraries/AP_TECS/AP_TECS.h +++ b/libraries/AP_TECS/AP_TECS.h @@ -134,6 +134,14 @@ public: _pitch_max_limit = pitch_limit; } + // set minimum throttle override, [-1, -1] range + // it is applicable for one control cycle only + void set_throttle_min(const float thr_min); + + // set minimum throttle override, [0, -1] range + // it is applicable for one control cycle only + void set_throttle_max(const float thr_max); + // force use of synthetic airspeed for one loop void use_synthetic_airspeed(void) { _use_synthetic_airspeed_once = true; @@ -360,6 +368,9 @@ private: // Maximum and minimum floating point throttle limits float _THRmaxf; float _THRminf; + // Maximum and minimum throttle safety limits, set externally, typically by servos.cpp:apply_throttle_limits() + float _THRmaxf_ext = 1.0f; + float _THRminf_ext = -1.0f; // Maximum and minimum floating point pitch limits float _PITCHmaxf; @@ -419,6 +430,9 @@ private: // need to reset on next loop bool _need_reset; + // Checks if we reset at the beginning of takeoff. + bool _flag_have_reset_after_takeoff; + float _SKE_weighting; AP_Int8 _use_synthetic_airspeed; @@ -458,6 +472,9 @@ private: // Update Demanded Throttle Non-Airspeed void _update_throttle_without_airspeed(int16_t throttle_nudge, float pitch_trim_deg); + // Constrain throttle demand and record clipping + void constrain_throttle(); + // get integral gain which is flight_stage dependent float _get_i_gain(void); @@ -478,4 +495,7 @@ private: // current time constant float timeConstant(void) const; + + // Update the allowable throttle range. + void _update_throttle_limits(); }; diff --git a/libraries/AP_TemperatureSensor/AP_TemperatureSensor.cpp b/libraries/AP_TemperatureSensor/AP_TemperatureSensor.cpp index 86c56778f7..42a8c4f640 100644 --- a/libraries/AP_TemperatureSensor/AP_TemperatureSensor.cpp +++ b/libraries/AP_TemperatureSensor/AP_TemperatureSensor.cpp @@ -40,12 +40,14 @@ const AP_Param::GroupInfo AP_TemperatureSensor::var_info[] = { // SKIP INDEX 0 +#if HAL_LOGGING_ENABLED // @Param: _LOG // @DisplayName: Logging // @Description: Enables temperature sensor logging - // @Values: 0:Disabled, 1:Enabled + // @Values: 0:Disabled, 1:Log all instances, 2: Log only instances with sensor source set to None // @User: Standard - AP_GROUPINFO("_LOG", 1, AP_TemperatureSensor, _log_flag, 0), + AP_GROUPINFO("_LOG", 1, AP_TemperatureSensor, _logging_type, 0), +#endif // SKIP Index 2-9 to be for parameters that apply to every sensor @@ -239,7 +241,9 @@ void AP_TemperatureSensor::update() #if HAL_LOGGING_ENABLED const AP_Logger *logger = AP_Logger::get_singleton(); - if (logger != nullptr && _log_flag) { + const bool should_log = (_logging_type == LoggingType::All) || + ((_logging_type == LoggingType::SourceNone) && (_params[i].source == AP_TemperatureSensor_Params::Source::None)); + if (logger != nullptr && should_log) { drivers[i]->Log_Write_TEMP(); } #endif diff --git a/libraries/AP_TemperatureSensor/AP_TemperatureSensor.h b/libraries/AP_TemperatureSensor/AP_TemperatureSensor.h index 1a9538d775..4b27e72d6a 100644 --- a/libraries/AP_TemperatureSensor/AP_TemperatureSensor.h +++ b/libraries/AP_TemperatureSensor/AP_TemperatureSensor.h @@ -88,8 +88,14 @@ private: uint8_t _num_instances; // number of temperature sensors - // Parameters - AP_Int8 _log_flag; // log_flag: true if we should log all sensors data +#if HAL_LOGGING_ENABLED + enum class LoggingType : uint8_t { + All = 1, + SourceNone = 2, + }; + AP_Enum _logging_type; +#endif + }; namespace AP { diff --git a/libraries/AP_TemperatureSensor/AP_TemperatureSensor_Analog.cpp b/libraries/AP_TemperatureSensor/AP_TemperatureSensor_Analog.cpp index e2871ca146..91a7686f1d 100644 --- a/libraries/AP_TemperatureSensor/AP_TemperatureSensor_Analog.cpp +++ b/libraries/AP_TemperatureSensor/AP_TemperatureSensor_Analog.cpp @@ -26,36 +26,41 @@ const AP_Param::GroupInfo AP_TemperatureSensor_Analog::var_info[] = { // @Param: PIN // @DisplayName: Temperature sensor analog voltage sensing pin - // @Description: Sets the analog input pin that should be used for temprature monitoring. + // @Description: Sets the analog input pin that should be used for temprature monitoring. Values for some autopilots are given as examples. Search wiki for "Analog pins". // @Values: -1:Disabled, 2:Pixhawk/Pixracer/Navio2/Pixhawk2_PM1, 5:Navigator, 13:Pixhawk2_PM2/CubeOrange_PM2, 14:CubeOrange, 16:Durandal, 100:PX4-v1 // @User: Standard AP_GROUPINFO("PIN", 1, AP_TemperatureSensor_Analog, _pin, -1), // @Param: A0 // @DisplayName: Temperature sensor analog 0th polynomial coefficient - // @Description: a0 in polynomial of form temperature in deg = a0 + a1*voltage + a2*voltage^2 + a3*voltage^3 + a4*voltage^4 + // @Description: a0 in polynomial of form temperature in deg = a0 + a1*voltage + a2*voltage^2 + a3*voltage^3 + a4*voltage^4 + a5*voltage^5 AP_GROUPINFO("A0", 2, AP_TemperatureSensor_Analog, _a[0], 0), // @Param: A1 // @DisplayName: Temperature sensor analog 1st polynomial coefficient - // @Description: a1 in polynomial of form temperature in deg = a0 + a1*voltage + a2*voltage^2 + a3*voltage^3 + a4*voltage^4 + // @Description: a1 in polynomial of form temperature in deg = a0 + a1*voltage + a2*voltage^2 + a3*voltage^3 + a4*voltage^4 + a5*voltage^5 AP_GROUPINFO("A1", 3, AP_TemperatureSensor_Analog, _a[1], 0), // @Param: A2 // @DisplayName: Temperature sensor analog 2nd polynomial coefficient - // @Description: a2 in polynomial of form temperature in deg = a0 + a1*voltage + a2*voltage^2 + a3*voltage^3 + a4*voltage^4 + // @Description: a2 in polynomial of form temperature in deg = a0 + a1*voltage + a2*voltage^2 + a3*voltage^3 + a4*voltage^4 + a5*voltage^5 AP_GROUPINFO("A2", 4, AP_TemperatureSensor_Analog, _a[2], 0), // @Param: A3 // @DisplayName: Temperature sensor analog 3rd polynomial coefficient - // @Description: a3 in polynomial of form temperature in deg = a0 + a1*voltage + a2*voltage^2 + a3*voltage^3 + a4*voltage^4 + // @Description: a3 in polynomial of form temperature in deg = a0 + a1*voltage + a2*voltage^2 + a3*voltage^3 + a4*voltage^4 + a5*voltage^5 AP_GROUPINFO("A3", 5, AP_TemperatureSensor_Analog, _a[3], 0), // @Param: A4 // @DisplayName: Temperature sensor analog 4th polynomial coefficient - // @Description: a4 in polynomial of form temperature in deg = a0 + a1*voltage + a2*voltage^2 + a3*voltage^3 + a4*voltage^4 + // @Description: a4 in polynomial of form temperature in deg = a0 + a1*voltage + a2*voltage^2 + a3*voltage^3 + a4*voltage^4 + a5*voltage^5 AP_GROUPINFO("A4", 6, AP_TemperatureSensor_Analog, _a[4], 0), + // @Param: A5 + // @DisplayName: Temperature sensor analog 5th polynomial coefficient + // @Description: a5 in polynomial of form temperature in deg = a0 + a1*voltage + a2*voltage^2 + a3*voltage^3 + a4*voltage^4 + a5*voltage^5 + AP_GROUPINFO("A5", 7, AP_TemperatureSensor_Analog, _a[5], 0), + AP_GROUPEND }; @@ -81,7 +86,7 @@ void AP_TemperatureSensor_Analog::update() const float voltage = _analog_source->voltage_average_ratiometric(); // Evaluate polynomial - // temperature (deg) = a0 + a1*voltage + a2*voltage^2 + a3*voltage^3 + a4*voltage^4 + // temperature (deg) = a0 + a1*voltage + a2*voltage^2 + a3*voltage^3 + a4*voltage^4 + a5*voltage^5 float temp = 0.0; float poly = 1.0; for (uint8_t i = 0; i < ARRAY_SIZE(_a); i++) { diff --git a/libraries/AP_TemperatureSensor/AP_TemperatureSensor_Analog.h b/libraries/AP_TemperatureSensor/AP_TemperatureSensor_Analog.h index a342c16533..99c3ba4ed1 100644 --- a/libraries/AP_TemperatureSensor/AP_TemperatureSensor_Analog.h +++ b/libraries/AP_TemperatureSensor/AP_TemperatureSensor_Analog.h @@ -35,10 +35,10 @@ private: AP_HAL::AnalogSource *_analog_source; // Pin used to measure voltage - AP_Int8 _pin; + AP_Int8 _pin; // Polynomial coefficients to calculate temperature from voltage - AP_Float _a[5]; + AP_Float _a[6]; }; diff --git a/libraries/AP_Terrain/AP_Terrain.h b/libraries/AP_Terrain/AP_Terrain.h index 7dfd2653d8..1bbdaeb05b 100644 --- a/libraries/AP_Terrain/AP_Terrain.h +++ b/libraries/AP_Terrain/AP_Terrain.h @@ -108,6 +108,7 @@ public: bool pre_arm_checks(char *failure_msg, uint8_t failure_msg_len) const; +#if HAL_GCS_ENABLED // send any pending terrain request message bool send_cache_request(mavlink_channel_t chan); void send_request(mavlink_channel_t chan); @@ -117,6 +118,7 @@ public: void handle_data(mavlink_channel_t chan, const mavlink_message_t &msg); void handle_terrain_check(mavlink_channel_t chan, const mavlink_message_t &msg); void handle_terrain_data(const mavlink_message_t &msg); +#endif /* find the terrain height in meters above sea level for a location @@ -318,11 +320,13 @@ private: */ bool check_bitmap(const struct grid_block &grid, uint8_t idx_x, uint8_t idx_y); +#if HAL_GCS_ENABLED /* request any missing 4x4 grids from a block */ bool request_missing(mavlink_channel_t chan, struct grid_cache &gcache); bool request_missing(mavlink_channel_t chan, const struct grid_info &info); +#endif /* look for blocks that need to be read/written to disk @@ -394,8 +398,10 @@ private: volatile enum DiskIoState disk_io_state; union grid_io_block disk_block; +#if HAL_GCS_ENABLED // last time we asked for more grids uint32_t last_request_time_ms[MAVLINK_COMM_NUM_BUFFERS]; +#endif static const uint64_t bitmap_mask = (((uint64_t)1U)<<(TERRAIN_GRID_BLOCK_MUL_X*TERRAIN_GRID_BLOCK_MUL_Y)) - 1; diff --git a/libraries/AP_Terrain/TerrainGCS.cpp b/libraries/AP_Terrain/TerrainGCS.cpp index 30a2067c29..e65b874041 100644 --- a/libraries/AP_Terrain/TerrainGCS.cpp +++ b/libraries/AP_Terrain/TerrainGCS.cpp @@ -32,14 +32,12 @@ extern const AP_HAL::HAL& hal; +#if HAL_GCS_ENABLED /* request any missing 4x4 grids from a block, given a grid_cache */ bool AP_Terrain::request_missing(mavlink_channel_t chan, struct grid_cache &gcache) { -#if !HAL_GCS_ENABLED - return false; -#else struct grid_block &grid = gcache.grid; if (options.get() & uint16_t(Options::DisableDownload)) { @@ -75,7 +73,6 @@ bool AP_Terrain::request_missing(mavlink_channel_t chan, struct grid_cache &gcac last_request_time_ms[chan] = AP_HAL::millis(); return true; -#endif } /* @@ -157,6 +154,7 @@ void AP_Terrain::send_request(mavlink_channel_t chan) return; } } +#endif // HAL_GCS_ENABLED /* count bits in a uint64_t @@ -196,7 +194,8 @@ void AP_Terrain::get_statistics(uint16_t &pending, uint16_t &loaded) const } } -/* +#if HAL_GCS_ENABLED +/* handle terrain messages from GCS */ void AP_Terrain::handle_data(mavlink_channel_t chan, const mavlink_message_t &msg) @@ -312,6 +311,7 @@ void AP_Terrain::handle_terrain_data(const mavlink_message_t &msg) // see if we need to schedule some disk IO update(); } +#endif // HAL_GCS_ENABLED #endif // AP_TERRAIN_AVAILABLE diff --git a/libraries/AP_Vehicle/AP_FixedWing.h b/libraries/AP_Vehicle/AP_FixedWing.h index 7aee38d5c5..722c53dcaf 100644 --- a/libraries/AP_Vehicle/AP_FixedWing.h +++ b/libraries/AP_Vehicle/AP_FixedWing.h @@ -11,9 +11,12 @@ struct AP_FixedWing { AP_Int8 throttle_slewrate; AP_Int8 throttle_cruise; AP_Int8 takeoff_throttle_max; + AP_Int8 takeoff_throttle_min; + AP_Int32 takeoff_options; AP_Int16 airspeed_min; AP_Int16 airspeed_max; AP_Float airspeed_cruise; + AP_Float airspeed_stall; AP_Float min_groundspeed; AP_Int8 crash_detection_enable; AP_Float roll_limit; @@ -48,4 +51,9 @@ struct AP_FixedWing { LAND = 4, ABORT_LANDING = 7 }; + + // Bitfields of TKOFF_OPTIONS + enum class TakeoffOption { + THROTTLE_RANGE = (1U << 0), // Unset: Max throttle. Set: Throttle range. + }; }; diff --git a/libraries/AP_Vehicle/AP_Vehicle.cpp b/libraries/AP_Vehicle/AP_Vehicle.cpp index 6b13e2b409..562ac60607 100644 --- a/libraries/AP_Vehicle/AP_Vehicle.cpp +++ b/libraries/AP_Vehicle/AP_Vehicle.cpp @@ -223,6 +223,7 @@ const AP_Param::GroupInfo AP_Vehicle::var_info[] = { are too deep in the parameter tree */ +#if AP_NETWORKING_REGISTER_PORT_ENABLED #if AP_NETWORKING_NUM_PORTS > 0 // @Group: NET_P1_ // @Path: ../AP_Networking/AP_Networking_port.cpp @@ -246,6 +247,7 @@ const AP_Param::GroupInfo AP_Vehicle::var_info[] = { // @Path: ../AP_Networking/AP_Networking_port.cpp AP_SUBGROUPINFO(networking.ports[3], "NET_P4_", 25, AP_Vehicle, AP_Networking::Port), #endif +#endif // AP_NETWORKING_REGISTER_PORT_ENABLED #endif // AP_NETWORKING_ENABLED #if AP_FILTER_ENABLED @@ -367,6 +369,14 @@ void AP_Vehicle::setup() networking.init(); #endif +#if AP_SCRIPTING_ENABLED +#if AP_SCRIPTING_SERIALDEVICE_ENABLED + // must be done now so ports are registered and drivers get set up properly + // (in particular mavlink which checks during init_ardupilot()) + scripting.init_serialdevice_ports(); +#endif +#endif + #if AP_SCHEDULER_ENABLED // Register scheduler_delay_cb, which will run anytime you have // more than 5ms remaining in your call to hal.scheduler->delay @@ -522,6 +532,10 @@ void AP_Vehicle::setup() GCS_SEND_TEXT(MAV_SEVERITY_ERROR, "%s Failed to Initialize", AP_DDS_Client::msg_prefix); } #endif + +#if AP_IBUS_TELEM_ENABLED + ibus_telem.init(); +#endif } void AP_Vehicle::loop() @@ -764,21 +778,43 @@ bool AP_Vehicle::is_crashed() const // update the harmonic notch filter for throttle based notch void AP_Vehicle::update_throttle_notch(AP_InertialSensor::HarmonicNotch ¬ch) { -#if APM_BUILD_TYPE(APM_BUILD_ArduPlane)||APM_BUILD_COPTER_OR_HELI||APM_BUILD_TYPE(APM_BUILD_Rover) +#if APM_BUILD_TYPE(APM_BUILD_ArduPlane) || APM_BUILD_COPTER_OR_HELI || APM_BUILD_TYPE(APM_BUILD_Rover) const float ref_freq = notch.params.center_freq_hz(); const float ref = notch.params.reference(); -#if APM_BUILD_TYPE(APM_BUILD_ArduPlane)||APM_BUILD_COPTER_OR_HELI +#if APM_BUILD_TYPE(APM_BUILD_ArduPlane) || APM_BUILD_COPTER_OR_HELI const AP_Motors* motors = AP::motors(); - const float motors_throttle = motors != nullptr ? MAX(0,motors->get_throttle_out()) : 0; + if (motors == nullptr) { + notch.update_freq_hz(0); + return; + } + const float motors_throttle = MAX(0,motors->get_throttle_out()); + // set the harmonic notch filter frequency scaled on measured frequency + if (notch.params.hasOption(HarmonicNotchFilterParams::Options::DynamicHarmonic)) { + float notches[INS_MAX_NOTCHES]; + uint8_t motor_num = 0; + for (uint8_t i = 0; i < AP_MOTORS_MAX_NUM_MOTORS; i++) { + float motor_throttle = 0; + if (motors->get_thrust(i, motor_throttle)) { + notches[motor_num] = ref_freq * sqrtf(MAX(0, motor_throttle) / ref); + motor_num++; + } + if (motor_num >= INS_MAX_NOTCHES) { + break; + } + } + notch.update_frequencies_hz(motor_num, notches); + } else #else // APM_BUILD_Rover const AP_MotorsUGV *motors = AP::motors_ugv(); const float motors_throttle = motors != nullptr ? abs(motors->get_throttle() / 100.0f) : 0; #endif + { + float throttle_freq = ref_freq * sqrtf(MAX(0,motors_throttle) / ref); - float throttle_freq = ref_freq * sqrtf(MAX(0,motors_throttle) / ref); + notch.update_freq_hz(throttle_freq); + } - notch.update_freq_hz(throttle_freq); #endif } diff --git a/libraries/AP_Vehicle/AP_Vehicle.h b/libraries/AP_Vehicle/AP_Vehicle.h index 8b22c9395d..2e08815991 100644 --- a/libraries/AP_Vehicle/AP_Vehicle.h +++ b/libraries/AP_Vehicle/AP_Vehicle.h @@ -80,6 +80,8 @@ #include #endif +#include + class AP_DDS_Client; class AP_Vehicle : public AP_HAL::HAL::Callbacks { @@ -169,10 +171,10 @@ public: // returns true if the vehicle has crashed virtual bool is_crashed() const; -#if AP_EXTERNAL_CONTROL_ENABLED +#if AP_SCRIPTING_ENABLED || AP_EXTERNAL_CONTROL_ENABLED // Method to control vehicle position for use by external control virtual bool set_target_location(const Location& target_loc) { return false; } -#endif // AP_EXTERNAL_CONTROL_ENABLED +#endif // AP_SCRIPTING_ENABLED || AP_EXTERNAL_CONTROL_ENABLED #if AP_SCRIPTING_ENABLED /* methods to control vehicle for use by scripting @@ -333,7 +335,9 @@ protected: #if HAL_BUTTON_ENABLED AP_Button button; #endif +#if AP_RANGEFINDER_ENABLED RangeFinder rangefinder; +#endif #if HAL_LOGGING_ENABLED AP_Logger logger; @@ -348,6 +352,10 @@ protected: AP_Gripper gripper; #endif +#if AP_IBUS_TELEM_ENABLED + AP_IBus_Telem ibus_telem; +#endif + #if AP_RSSI_ENABLED AP_RSSI rssi; #endif diff --git a/libraries/AP_VideoTX/AP_VideoTX.cpp b/libraries/AP_VideoTX/AP_VideoTX.cpp index d0887080d6..3f50914c16 100644 --- a/libraries/AP_VideoTX/AP_VideoTX.cpp +++ b/libraries/AP_VideoTX/AP_VideoTX.cpp @@ -51,7 +51,7 @@ const AP_Param::GroupInfo AP_VideoTX::var_info[] = { // @DisplayName: Video Transmitter Band // @Description: Video Transmitter Band // @User: Standard - // @Values: 0:Band A,1:Band B,2:Band E,3:Airwave,4:RaceBand,5:Low RaceBand,6:1G3 Band A,7:1G3 Band B,8:Band X + // @Values: 0:Band A,1:Band B,2:Band E,3:Airwave,4:RaceBand,5:Low RaceBand,6:1G3 Band A,7:1G3 Band B,8:Band X,9:3G3 Band A,10:3G3 Band B AP_GROUPINFO("BAND", 4, AP_VideoTX, _band, 0), // @Param: FREQ @@ -87,7 +87,7 @@ const AP_Param::GroupInfo AP_VideoTX::var_info[] = { extern const AP_HAL::HAL& hal; -const char * AP_VideoTX::band_names[] = {"A","B","E","F","R","L","1G3_A","1G3_B","X"}; +const char * AP_VideoTX::band_names[] = {"A","B","E","F","R","L","1G3_A","1G3_B","X","3G3_A","3G3_B"}; const uint16_t AP_VideoTX::VIDEO_CHANNELS[AP_VideoTX::MAX_BANDS][VTX_MAX_CHANNELS] = { @@ -99,7 +99,9 @@ const uint16_t AP_VideoTX::VIDEO_CHANNELS[AP_VideoTX::MAX_BANDS][VTX_MAX_CHANNEL { 5621, 5584, 5547, 5510, 5473, 5436, 5399, 5362}, /* LO Race */ { 1080, 1120, 1160, 1200, 1240, 1280, 1320, 1360}, /* Band 1G3_A */ { 1080, 1120, 1160, 1200, 1258, 1280, 1320, 1360}, /* Band 1G3_B */ - { 4990, 5020, 5050, 5080, 5110, 5140, 5170, 5200} /* Band X */ + { 4990, 5020, 5050, 5080, 5110, 5140, 5170, 5200}, /* Band X */ + { 3330, 3350, 3370, 3390, 3410, 3430, 3450, 3470}, /* Band 3G3_A */ + { 3170, 3190, 3210, 3230, 3250, 3270, 3290, 3310} /* Band 3G3_B */ }; // mapping of power level to milliwatt to dbm diff --git a/libraries/AP_VideoTX/AP_VideoTX.h b/libraries/AP_VideoTX/AP_VideoTX.h index 67e7444937..b544154abf 100644 --- a/libraries/AP_VideoTX/AP_VideoTX.h +++ b/libraries/AP_VideoTX/AP_VideoTX.h @@ -65,6 +65,8 @@ public: BAND_1G3_A, BAND_1G3_B, BAND_X, + BAND_3G3_A, + BAND_3G3_B, MAX_BANDS }; diff --git a/libraries/AP_VideoTX/AP_VideoTX_config.h b/libraries/AP_VideoTX/AP_VideoTX_config.h index c95b1a151c..c65141c5e6 100644 --- a/libraries/AP_VideoTX/AP_VideoTX_config.h +++ b/libraries/AP_VideoTX/AP_VideoTX_config.h @@ -1,7 +1,7 @@ #pragma once #include -#include +#include #ifndef AP_VIDEOTX_ENABLED #define AP_VIDEOTX_ENABLED 1 diff --git a/libraries/AP_VisualOdom/AP_VisualOdom_IntelT265.cpp b/libraries/AP_VisualOdom/AP_VisualOdom_IntelT265.cpp index c26bd38b71..744fac017b 100644 --- a/libraries/AP_VisualOdom/AP_VisualOdom_IntelT265.cpp +++ b/libraries/AP_VisualOdom/AP_VisualOdom_IntelT265.cpp @@ -192,7 +192,7 @@ void AP_VisualOdom_IntelT265::align_yaw(const Vector3f &position, const Quaterni // trim yaw by difference between ahrs and sensor yaw const float yaw_trim_orig = _yaw_trim; _yaw_trim = wrap_2PI(yaw_rad - sens_yaw); - gcs().send_text(MAV_SEVERITY_INFO, "VisOdom: yaw shifted %d to %d deg", + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "VisOdom: yaw shifted %d to %d deg", (int)degrees(_yaw_trim - yaw_trim_orig), (int)wrap_360(degrees(sens_yaw + _yaw_trim))); @@ -349,7 +349,7 @@ void AP_VisualOdom_IntelT265::handle_voxl_camera_reset_jump(const Vector3f &sens } // warng user of reset - gcs().send_text(MAV_SEVERITY_WARNING, "VisOdom: reset"); + GCS_SEND_TEXT(MAV_SEVERITY_WARNING, "VisOdom: reset"); // align sensor yaw to match current yaw estimate align_yaw_to_ahrs(sensor_pos, sensor_att); diff --git a/libraries/AP_Volz_Protocol/AP_Volz_Protocol.cpp b/libraries/AP_Volz_Protocol/AP_Volz_Protocol.cpp index fdd788b429..84091522e9 100644 --- a/libraries/AP_Volz_Protocol/AP_Volz_Protocol.cpp +++ b/libraries/AP_Volz_Protocol/AP_Volz_Protocol.cpp @@ -12,6 +12,22 @@ #include #include +#include + +#define SET_EXTENDED_POSITION_CMD 0xDC + +// Extended Position Data Format defines -100 as 0x0080 decimal 128, we map this to a PWM of 1000 (if range is default) +#define PWM_POSITION_MIN 1000 +#define ANGLE_POSITION_MIN -100.0 +#define EXTENDED_POSITION_MIN 0x0080 + +// Extended Position Data Format defines +100 as 0x0F80 decimal 3968, we map this to a PWM of 2000 (if range is default) +#define PWM_POSITION_MAX 2000 +#define ANGLE_POSITION_MAX 100.0 +#define EXTENDED_POSITION_MAX 0x0F80 + +#define UART_BUFSIZE_RX 128 +#define UART_BUFSIZE_TX 128 extern const AP_HAL::HAL& hal; @@ -23,6 +39,12 @@ const AP_Param::GroupInfo AP_Volz_Protocol::var_info[] = { // @User: Standard AP_GROUPINFO("MASK", 1, AP_Volz_Protocol, bitmask, 0), + // @Param: RANGE + // @DisplayName: Range of travel + // @Description: Range to map between 1000 and 2000 PWM. Default value of 200 gives full +-100 deg range of extended position command. This results in 0.2 deg movement per US change in PWM. If the full range is not needed it can be reduced to increase resolution. 40 deg range gives 0.04 deg movement per US change in PWM, this is higher resolution than possible with the VOLZ protocol so further reduction in range will not improve resolution. Reduced range does allow PWMs outside the 1000 to 2000 range, with 40 deg range 750 PWM results in a angle of -30 deg, 2250 would be +30 deg. This is still limited by the 200 deg maximum range of the actuator. + // @Units: deg + AP_GROUPINFO("RANGE", 2, AP_Volz_Protocol, range, 200), + AP_GROUPEND }; @@ -35,89 +57,133 @@ AP_Volz_Protocol::AP_Volz_Protocol(void) void AP_Volz_Protocol::init(void) { - AP_SerialManager &serial_manager = AP::serialmanager(); + if (uint32_t(bitmask.get()) == 0) { + // No servos enabled + return; + } + + const AP_SerialManager &serial_manager = AP::serialmanager(); port = serial_manager.find_serial(AP_SerialManager::SerialProtocol_Volz,0); - update_volz_bitmask(bitmask); + if (port == nullptr) { + // No port configured + return; + } + + // Create thread to handle output + if (!hal.scheduler->thread_create(FUNCTOR_BIND_MEMBER(&AP_Volz_Protocol::loop, void), + "Volz", + 1024, AP_HAL::Scheduler::PRIORITY_RCOUT, 1)) { + AP_BoardConfig::allocation_error("Volz thread"); + } } -void AP_Volz_Protocol::update() +void AP_Volz_Protocol::loop() { - if (!initialised) { - initialised = true; - init(); - } - - if (port == nullptr) { - return; - } + const uint32_t baudrate = 115200; + port->begin(baudrate, UART_BUFSIZE_RX, UART_BUFSIZE_TX); + port->set_unbuffered_writes(true); + port->set_flow_control(AP_HAL::UARTDriver::FLOW_CONTROL_DISABLE); - if (last_used_bitmask != uint32_t(bitmask.get())) { - update_volz_bitmask(bitmask); - } + // Calculate the amount of time it should take to send a command + // Multiply by 10 to convert from bit rate to byte rate (8 data bits + start and stop bits) + // B/s to s/B, 1000000 converts to microseconds, multiply by number of bytes + // 6 bytes at 11520 bytes per second takes 520 us + const uint16_t send_us = (sizeof(CMD) * 1000000 * 10) / baudrate; - uint32_t now = AP_HAL::micros(); - if (now - last_volz_update_time < volz_time_frame_micros || - port->txspace() < VOLZ_DATA_FRAME_SIZE) { - return; - } + // receive packet is same length as sent, double to allow some time for the servo respond + const uint16_t receive_us = send_us * 2; - last_volz_update_time = now; + // This gives a total time of 1560ms, message rate of 641 Hz. + // One servo at 641Hz, two at 320.5 each, three at 213.7 each ect... - uint8_t i; - uint16_t value; + while (port != nullptr) { - // loop for all channels - for (i=0; idelay_microseconds(send_us + receive_us); - SRV_Channel *c = SRV_Channels::srv_channel(i); - if (c == nullptr) { + while (port->txspace() < sizeof(CMD)) { + // Wait until there is enough space to transmit a full command + hal.scheduler->delay_microseconds(100); + } + + // loop for all channels + for (uint8_t i=0; iget_output_pwm() < VOLZ_PWM_POSITION_MIN) { - value = 0; - } else { - value = c->get_output_pwm() - VOLZ_PWM_POSITION_MIN; + last_sent_index = index; + + // Get PWM from saved array + const uint16_t pwm = servo_pwm[index]; + if (pwm == 0) { + // Never use zero PWM, the check in update should ensure this never happens + // If we were to use zero the range extrapolation would result in a -100 deg angle request + continue; } - // scale the PWM value to Volz value - value = value * VOLZ_SCALE_VALUE / (VOLZ_PWM_POSITION_MAX - VOLZ_PWM_POSITION_MIN); - value = value + VOLZ_EXTENDED_POSITION_MIN; + // Map PWM to angle, this is a un-constrained interpolation + // ratio = 0 at PWM_POSITION_MIN to 1 at PWM_POSITION_MAX + const float ratio = (float(pwm) - PWM_POSITION_MIN) / (PWM_POSITION_MAX - PWM_POSITION_MIN); + // Convert ratio to +-0.5 and multiply by stroke + const float angle = (ratio - 0.5) * constrain_float(range, 0.0, 200.0); - // make sure value stays in range - if (value > VOLZ_EXTENDED_POSITION_MAX) { - value = VOLZ_EXTENDED_POSITION_MAX; - } + // Map angle to command out of full range, add 0.5 so that float to int truncation rounds correctly + const uint16_t value = linear_interpolate(EXTENDED_POSITION_MIN, EXTENDED_POSITION_MAX, angle, ANGLE_POSITION_MIN, ANGLE_POSITION_MAX) + 0.5; // prepare Volz protocol data. - uint8_t data[VOLZ_DATA_FRAME_SIZE]; + CMD cmd; + cmd.ID = SET_EXTENDED_POSITION_CMD; + cmd.actuator_id = index + 1; // send actuator id as 1 based index so ch1 will have id 1, ch2 will have id 2 .... + cmd.arg1 = HIGHBYTE(value); + cmd.arg2 = LOWBYTE(value); - data[0] = VOLZ_SET_EXTENDED_POSITION_CMD; - data[1] = i + 1; // send actuator id as 1 based index so ch1 will have id 1, ch2 will have id 2 .... - data[2] = HIGHBYTE(value); - data[3] = LOWBYTE(value); - - send_command(data); + send_command(cmd); + break; } } } -// calculate CRC for volz serial protocol and send the data. -void AP_Volz_Protocol::send_command(uint8_t data[VOLZ_DATA_FRAME_SIZE]) +// Called each time the servo outputs are sent +void AP_Volz_Protocol::update() +{ + if (!initialised) { + // One time setup + initialised = true; + init(); + } + + if (port == nullptr) { + // no point if we don't have a valid port + return; + } + + // take semaphore and loop for all channels + for (uint8_t i=0; iget_output_pwm(); + servo_pwm[i] = (pwm == 0) ? c->get_trim() : pwm; + } +} + +// calculate CRC for volz serial protocol and send the data. +void AP_Volz_Protocol::send_command(CMD &cmd) { - uint8_t i,j; uint16_t crc = 0xFFFF; // calculate Volz CRC value according to protocol definition - for(i=0; i<4; i++) { + for(uint8_t i=0; i<4; i++) { // take input data into message that will be transmitted. - crc = ((data[i] << 8) ^ crc); - - for(j=0; j<8; j++) { + crc = (cmd.data[i] << 8) ^ crc; + for(uint8_t j=0; j<8; j++) { if (crc & 0x8000) { crc = (crc << 1) ^ 0x8005; } else { @@ -127,37 +193,9 @@ void AP_Volz_Protocol::send_command(uint8_t data[VOLZ_DATA_FRAME_SIZE]) } // add CRC result to the message - data[4] = HIGHBYTE(crc); - data[5] = LOWBYTE(crc); - port->write(data, VOLZ_DATA_FRAME_SIZE); -} - -void AP_Volz_Protocol::update_volz_bitmask(uint32_t new_bitmask) -{ - uint8_t count = 0; - last_used_bitmask = new_bitmask; - - for (uint8_t i=0; iwrite(cmd.data, sizeof(cmd)); } #endif // AP_VOLZ_ENABLED diff --git a/libraries/AP_Volz_Protocol/AP_Volz_Protocol.h b/libraries/AP_Volz_Protocol/AP_Volz_Protocol.h index c4f5705bd0..d1ccfbe841 100644 --- a/libraries/AP_Volz_Protocol/AP_Volz_Protocol.h +++ b/libraries/AP_Volz_Protocol/AP_Volz_Protocol.h @@ -43,18 +43,7 @@ #include #include - -#define VOLZ_SCALE_VALUE (uint16_t)(VOLZ_EXTENDED_POSITION_MAX - VOLZ_EXTENDED_POSITION_MIN) // Extended Position Data Format defines 100 as 0x0F80, which results in 1920 steps for +100 deg and 1920 steps for -100 degs meaning if you take movement a scaled between -1 ... 1 and multiply by 1920 you get the travel from center -#define VOLZ_SET_EXTENDED_POSITION_CMD 0xDC -#define VOLZ_SET_EXTENDED_POSITION_RSP 0x2C -#define VOLZ_DATA_FRAME_SIZE 6 - -#define VOLZ_EXTENDED_POSITION_MIN 0x0080 // Extended Position Data Format defines -100 as 0x0080 decimal 128 -#define VOLZ_EXTENDED_POSITION_CENTER 0x0800 // Extended Position Data Format defines 0 as 0x0800 - decimal 2048 -#define VOLZ_EXTENDED_POSITION_MAX 0x0F80 // Extended Position Data Format defines +100 as 0x0F80 decimal 3968 -> full range decimal 3840 - -#define VOLZ_PWM_POSITION_MIN 1000 -#define VOLZ_PWM_POSITION_MAX 2000 +#include class AP_Volz_Protocol { public: @@ -64,21 +53,38 @@ public: CLASS_NO_COPY(AP_Volz_Protocol); static const struct AP_Param::GroupInfo var_info[]; - + void update(); private: - AP_HAL::UARTDriver *port; - - void init(void); - void send_command(uint8_t data[VOLZ_DATA_FRAME_SIZE]); - void update_volz_bitmask(uint32_t new_bitmask); - uint32_t last_volz_update_time; - uint32_t volz_time_frame_micros; - uint32_t last_used_bitmask; + // Command frame + union CMD { + struct PACKED { + uint8_t ID; // CMD ID + uint8_t actuator_id; // actuator send to or receiving from + uint8_t arg1; // CMD dependant argument 1 + uint8_t arg2; // CMD dependant argument 2 + uint8_t crc1; + uint8_t crc2; + }; + uint8_t data[6]; + }; + + AP_HAL::UARTDriver *port; + + // Loop in thread to output to uart + void loop(); + uint8_t last_sent_index; + + void init(void); + void send_command(CMD &cmd); + + // Incoming PWM commands from the servo lib + uint16_t servo_pwm[NUM_SERVO_CHANNELS]; AP_Int32 bitmask; + AP_Int16 range; bool initialised; }; diff --git a/libraries/AP_Winch/AP_Winch.cpp b/libraries/AP_Winch/AP_Winch.cpp index 75ef73fdfe..613679ceec 100644 --- a/libraries/AP_Winch/AP_Winch.cpp +++ b/libraries/AP_Winch/AP_Winch.cpp @@ -78,12 +78,16 @@ void AP_Winch::init() switch ((WinchType)config.type.get()) { case WinchType::NONE: break; +#if AP_WINCH_PWM_ENABLED case WinchType::PWM: backend = NEW_NOTHROW AP_Winch_PWM(config); break; +#endif +#if AP_WINCH_DAIWA_ENABLED case WinchType::DAIWA: backend = NEW_NOTHROW AP_Winch_Daiwa(config); break; +#endif default: break; } diff --git a/libraries/AR_Motors/AP_MotorsUGV.cpp b/libraries/AR_Motors/AP_MotorsUGV.cpp index b211384e1c..e27ef29cdc 100644 --- a/libraries/AR_Motors/AP_MotorsUGV.cpp +++ b/libraries/AR_Motors/AP_MotorsUGV.cpp @@ -33,7 +33,7 @@ const AP_Param::GroupInfo AP_MotorsUGV::var_info[] = { // @Values: 0:Normal,1:OneShot,2:OneShot125,3:BrushedWithRelay,4:BrushedBiPolar,5:DShot150,6:DShot300,7:DShot600,8:DShot1200 // @User: Advanced // @RebootRequired: True - AP_GROUPINFO("PWM_TYPE", 1, AP_MotorsUGV, _pwm_type, PWM_TYPE_NORMAL), + AP_GROUPINFO("PWM_TYPE", 1, AP_MotorsUGV, _pwm_type, PWMType::NORMAL), // @Param: PWM_FREQ // @DisplayName: Motor Output PWM freq for brushed motors @@ -149,7 +149,7 @@ void AP_MotorsUGV::init(uint8_t frtype) bool AP_MotorsUGV::get_legacy_relay_index(int8_t &index1, int8_t &index2, int8_t &index3, int8_t &index4) const { - if (_pwm_type != PWM_TYPE_BRUSHED_WITH_RELAY) { + if (_pwm_type != PWMType::BRUSHED_WITH_RELAY) { // Relays only used if PWM type is set to brushed with relay return false; } @@ -177,7 +177,7 @@ bool AP_MotorsUGV::get_legacy_relay_index(int8_t &index1, int8_t &index2, int8_t // setup output in case of main CPU failure void AP_MotorsUGV::setup_safety_output() { - if (_pwm_type == PWM_TYPE_BRUSHED_WITH_RELAY) { + if (_pwm_type == PWMType::BRUSHED_WITH_RELAY) { // set trim to min to set duty cycle range (0 - 100%) to servo range // ignore servo revese flag, it is used by the relay SRV_Channels::set_trim_to_min_for(SRV_Channel::k_throttle, true); @@ -529,7 +529,7 @@ bool AP_MotorsUGV::pre_arm_check(bool report) const // Check relays are configured for brushed with relay outputs #if AP_RELAY_ENABLED AP_Relay*relay = AP::relay(); - if ((_pwm_type == PWM_TYPE_BRUSHED_WITH_RELAY) && (relay != nullptr)) { + if ((_pwm_type == PWMType::BRUSHED_WITH_RELAY) && (relay != nullptr)) { // If a output is configured its relay must be enabled struct RelayTable { bool output_assigned; @@ -546,7 +546,7 @@ bool AP_MotorsUGV::pre_arm_check(bool report) const for (uint8_t i=0; ienabled(relay_table[i].fun)) { if (report) { - gcs().send_text(MAV_SEVERITY_CRITICAL, "PreArm: relay function %u unassigned", uint8_t(relay_table[i].fun)); + GCS_SEND_TEXT(MAV_SEVERITY_CRITICAL, "PreArm: relay function %u unassigned", uint8_t(relay_table[i].fun)); } return false; } @@ -581,27 +581,27 @@ void AP_MotorsUGV::setup_pwm_type() } switch (_pwm_type) { - case PWM_TYPE_ONESHOT: + case PWMType::ONESHOT: hal.rcout->set_output_mode(_motor_mask, AP_HAL::RCOutput::MODE_PWM_ONESHOT); break; - case PWM_TYPE_ONESHOT125: + case PWMType::ONESHOT125: hal.rcout->set_output_mode(_motor_mask, AP_HAL::RCOutput::MODE_PWM_ONESHOT125); break; - case PWM_TYPE_BRUSHED_WITH_RELAY: - case PWM_TYPE_BRUSHED_BIPOLAR: + case PWMType::BRUSHED_WITH_RELAY: + case PWMType::BRUSHED_BIPOLAR: hal.rcout->set_output_mode(_motor_mask, AP_HAL::RCOutput::MODE_PWM_BRUSHED); hal.rcout->set_freq(_motor_mask, uint16_t(_pwm_freq * 1000)); break; - case PWM_TYPE_DSHOT150: + case PWMType::DSHOT150: hal.rcout->set_output_mode(_motor_mask, AP_HAL::RCOutput::MODE_PWM_DSHOT150); break; - case PWM_TYPE_DSHOT300: + case PWMType::DSHOT300: hal.rcout->set_output_mode(_motor_mask, AP_HAL::RCOutput::MODE_PWM_DSHOT300); break; - case PWM_TYPE_DSHOT600: + case PWMType::DSHOT600: hal.rcout->set_output_mode(_motor_mask, AP_HAL::RCOutput::MODE_PWM_DSHOT600); break; - case PWM_TYPE_DSHOT1200: + case PWMType::DSHOT1200: hal.rcout->set_output_mode(_motor_mask, AP_HAL::RCOutput::MODE_PWM_DSHOT1200); break; default: @@ -647,6 +647,13 @@ void AP_MotorsUGV::setup_omni() add_omni_motor(2, 0.0f, -1.0f, 1.0f); add_omni_motor(3, 1.0f, 0.0f, 0.0f); break; + + case FRAME_TYPE_OMNI3MECANUM: + _motors_num = 3; + add_omni_motor(0, -1.0f, 1.0f, -0.26795f); + add_omni_motor(1, 0.73205f, 1.0f, -0.73205f); + add_omni_motor(2, 0.26795f, 1.0f, 1.0f); + break; } } @@ -981,7 +988,7 @@ void AP_MotorsUGV::output_throttle(SRV_Channel::Aux_servo_function_t function, f // set relay if necessary #if AP_RELAY_ENABLED AP_Relay*relay = AP::relay(); - if ((_pwm_type == PWM_TYPE_BRUSHED_WITH_RELAY) && (relay != nullptr)) { + if ((_pwm_type == PWMType::BRUSHED_WITH_RELAY) && (relay != nullptr)) { // find the output channel, if not found return const SRV_Channel *out_chan = SRV_Channels::get_channel_for(function); @@ -1146,17 +1153,17 @@ bool AP_MotorsUGV::active() const bool AP_MotorsUGV::is_digital_pwm_type() const { switch (_pwm_type) { - case PWM_TYPE_DSHOT150: - case PWM_TYPE_DSHOT300: - case PWM_TYPE_DSHOT600: - case PWM_TYPE_DSHOT1200: - return true; - case PWM_TYPE_NORMAL: - case PWM_TYPE_ONESHOT: - case PWM_TYPE_ONESHOT125: - case PWM_TYPE_BRUSHED_WITH_RELAY: - case PWM_TYPE_BRUSHED_BIPOLAR: - break; + case PWMType::DSHOT150: + case PWMType::DSHOT300: + case PWMType::DSHOT600: + case PWMType::DSHOT1200: + return true; + case PWMType::NORMAL: + case PWMType::ONESHOT: + case PWMType::ONESHOT125: + case PWMType::BRUSHED_WITH_RELAY: + case PWMType::BRUSHED_BIPOLAR: + break; } return false; } diff --git a/libraries/AR_Motors/AP_MotorsUGV.h b/libraries/AR_Motors/AP_MotorsUGV.h index 42c2df5377..45df9fe2b5 100644 --- a/libraries/AR_Motors/AP_MotorsUGV.h +++ b/libraries/AR_Motors/AP_MotorsUGV.h @@ -27,6 +27,7 @@ public: FRAME_TYPE_OMNI3 = 1, FRAME_TYPE_OMNIX = 2, FRAME_TYPE_OMNIPLUS = 3, + FRAME_TYPE_OMNI3MECANUM = 4, }; // initialise motors @@ -130,16 +131,16 @@ public: private: - enum pwm_type { - PWM_TYPE_NORMAL = 0, - PWM_TYPE_ONESHOT = 1, - PWM_TYPE_ONESHOT125 = 2, - PWM_TYPE_BRUSHED_WITH_RELAY = 3, - PWM_TYPE_BRUSHED_BIPOLAR = 4, - PWM_TYPE_DSHOT150 = 5, - PWM_TYPE_DSHOT300 = 6, - PWM_TYPE_DSHOT600 = 7, - PWM_TYPE_DSHOT1200 = 8 + enum PWMType { + NORMAL = 0, + ONESHOT = 1, + ONESHOT125 = 2, + BRUSHED_WITH_RELAY = 3, + BRUSHED_BIPOLAR = 4, + DSHOT150 = 5, + DSHOT300 = 6, + DSHOT600 = 7, + DSHOT1200 = 8 }; // sanity check parameters diff --git a/libraries/Filter/HarmonicNotchFilter.cpp b/libraries/Filter/HarmonicNotchFilter.cpp index 835e53192a..ea42cf249e 100644 --- a/libraries/Filter/HarmonicNotchFilter.cpp +++ b/libraries/Filter/HarmonicNotchFilter.cpp @@ -125,7 +125,7 @@ const AP_Param::GroupInfo HarmonicNotchFilterParams::var_info[] = { // @Param: OPTS // @DisplayName: Harmonic Notch Filter options // @Description: Harmonic Notch Filter options. Triple and double-notches can provide deeper attenuation across a wider bandwidth with reduced latency than single notches and are suitable for larger aircraft. Multi-Source attaches a harmonic notch to each detected noise frequency instead of simply being multiples of the base frequency, in the case of FFT it will attach notches to each of three detected noise peaks, in the case of ESC it will attach notches to each of four motor RPM values. Loop rate update changes the notch center frequency at the scheduler loop rate rather than at the default of 200Hz. If both double and triple notches are specified only double notches will take effect. - // @Bitmask: 0:Double notch,1:Multi-Source,2:Update at loop rate,3:EnableOnAllIMUs,4:Triple notch, 5:Use min freq on RPM failure + // @Bitmask: 0:Double notch,1:Multi-Source,2:Update at loop rate,3:EnableOnAllIMUs,4:Triple notch, 5:Use min freq on RPM source failure // @User: Advanced // @RebootRequired: True AP_GROUPINFO("OPTS", 8, HarmonicNotchFilterParams, _options, 0), diff --git a/libraries/GCS_MAVLink/GCS.cpp b/libraries/GCS_MAVLink/GCS.cpp index 9539ded757..c4a11f666d 100644 --- a/libraries/GCS_MAVLink/GCS.cpp +++ b/libraries/GCS_MAVLink/GCS.cpp @@ -125,7 +125,7 @@ void GCS::send_named_float(const char *name, float value) const void GCS::enable_high_latency_connections(bool enabled) { high_latency_link_enabled = enabled; - gcs().send_text(MAV_SEVERITY_NOTICE, "High Latency %s", enabled ? "enabled" : "disabled"); + GCS_SEND_TEXT(MAV_SEVERITY_NOTICE, "High Latency %s", enabled ? "enabled" : "disabled"); } bool GCS::get_high_latency_status() @@ -406,4 +406,25 @@ bool GCS_MAVLINK::check_payload_size(uint16_t max_payload_len) return true; } +#if AP_SCRIPTING_ENABLED +/* + lua access to command_int + + Note that this is called with the AP_Scheduler lock, ensuring the + main thread does not race with a lua command_int +*/ +MAV_RESULT GCS::lua_command_int_packet(const mavlink_command_int_t &packet) +{ + // for now we assume channel 0. In the future we may create a dedicated channel + auto *ch = chan(0); + if (ch == nullptr) { + return MAV_RESULT_UNSUPPORTED; + } + // we need a dummy message for some calls + mavlink_message_t msg {}; + + return ch->handle_command_int_packet(packet, msg); +} +#endif // AP_SCRIPTING_ENABLED + #endif // HAL_GCS_ENABLED diff --git a/libraries/GCS_MAVLink/GCS.h b/libraries/GCS_MAVLink/GCS.h index 59b86fbb1c..71725275b3 100644 --- a/libraries/GCS_MAVLink/GCS.h +++ b/libraries/GCS_MAVLink/GCS.h @@ -732,7 +732,7 @@ protected: #endif // HAL_HIGH_LATENCY2_ENABLED static constexpr const float magic_force_arm_value = 2989.0f; - static constexpr const float magic_force_disarm_value = 21196.0f; + static constexpr const float magic_force_arm_disarm_value = 21196.0f; void manual_override(class RC_Channel *c, int16_t value_in, uint16_t offset, float scaler, const uint32_t tnow, bool reversed = false); @@ -1271,6 +1271,11 @@ public: virtual uint8_t sysid_this_mav() const = 0; +#if AP_SCRIPTING_ENABLED + // lua access to command_int + MAV_RESULT lua_command_int_packet(const mavlink_command_int_t &packet); +#endif + protected: virtual GCS_MAVLINK *new_gcs_mavlink_backend(GCS_MAVLINK_Parameters ¶ms, diff --git a/libraries/GCS_MAVLink/GCS_Common.cpp b/libraries/GCS_MAVLink/GCS_Common.cpp index 77369ba55b..4e22558349 100644 --- a/libraries/GCS_MAVLink/GCS_Common.cpp +++ b/libraries/GCS_MAVLink/GCS_Common.cpp @@ -379,7 +379,8 @@ bool GCS_MAVLINK::send_battery_status() const uint8_t battery_id = (last_battery_status_idx + 1) % AP_BATT_MONITOR_MAX_INSTANCES; const auto configured_type = battery.configured_type(battery_id); if (configured_type != AP_BattMonitor::Type::NONE && - configured_type == battery.allocated_type(battery_id)) { + configured_type == battery.allocated_type(battery_id) && + !battery.option_is_set(battery_id, AP_BattMonitor_Params::Options::InternalUseOnly)) { CHECK_PAYLOAD_SIZE(BATTERY_STATUS); send_battery_status(battery_id); last_battery_status_idx = battery_id; @@ -1002,7 +1003,9 @@ ap_message GCS_MAVLINK::mavlink_id_to_ap_message_id(const uint32_t mavlink_id) c { MAVLINK_MSG_ID_MISSION_CURRENT, MSG_CURRENT_WAYPOINT}, { MAVLINK_MSG_ID_SERVO_OUTPUT_RAW, MSG_SERVO_OUTPUT_RAW}, { MAVLINK_MSG_ID_RC_CHANNELS, MSG_RC_CHANNELS}, +#if AP_MAVLINK_MSG_RC_CHANNELS_RAW_ENABLED { MAVLINK_MSG_ID_RC_CHANNELS_RAW, MSG_RC_CHANNELS_RAW}, +#endif { MAVLINK_MSG_ID_RAW_IMU, MSG_RAW_IMU}, { MAVLINK_MSG_ID_SCALED_IMU, MSG_SCALED_IMU}, { MAVLINK_MSG_ID_SCALED_IMU2, MSG_SCALED_IMU2}, @@ -1135,7 +1138,7 @@ bool GCS_MAVLINK::set_mavlink_message_id_interval(const uint32_t mavlink_id, { const ap_message id = mavlink_id_to_ap_message_id(mavlink_id); if (id == MSG_LAST) { - gcs().send_text(MAV_SEVERITY_INFO, "No ap_message for mavlink id (%u)", (unsigned int)mavlink_id); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "No ap_message for mavlink id (%u)", (unsigned int)mavlink_id); return false; } return set_ap_message_interval(id, interval_ms); @@ -1899,7 +1902,7 @@ GCS_MAVLINK::update_receive(uint32_t max_time_us) if (uint16_t(now16_ms - try_send_message_stats.statustext_last_sent_ms) > 10000U) { if (try_send_message_stats.longest_time_us) { - gcs().send_text(MAV_SEVERITY_INFO, + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "GCS.chan(%u): ap_msg=%u took %uus to send", chan, try_send_message_stats.longest_id, @@ -1908,42 +1911,42 @@ GCS_MAVLINK::update_receive(uint32_t max_time_us) } if (try_send_message_stats.no_space_for_message && (is_active() || is_streaming())) { - gcs().send_text(MAV_SEVERITY_INFO, + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "GCS.chan(%u): out-of-space: %u", chan, try_send_message_stats.no_space_for_message); try_send_message_stats.no_space_for_message = 0; } if (try_send_message_stats.out_of_time) { - gcs().send_text(MAV_SEVERITY_INFO, + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "GCS.chan(%u): out-of-time=%u", chan, try_send_message_stats.out_of_time); try_send_message_stats.out_of_time = 0; } if (max_slowdown_ms) { - gcs().send_text(MAV_SEVERITY_INFO, + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "GCS.chan(%u): max slowdown=%u", chan, max_slowdown_ms); max_slowdown_ms = 0; } if (try_send_message_stats.behind) { - gcs().send_text(MAV_SEVERITY_INFO, + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "GCS.chan(%u): behind=%u", chan, try_send_message_stats.behind); try_send_message_stats.behind = 0; } if (try_send_message_stats.fnbts_maxtime) { - gcs().send_text(MAV_SEVERITY_INFO, + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "GCS.chan(%u): fnbts_maxtime=%uus", chan, try_send_message_stats.fnbts_maxtime); try_send_message_stats.fnbts_maxtime = 0; } if (try_send_message_stats.max_retry_deferred_body_us) { - gcs().send_text(MAV_SEVERITY_INFO, + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "GCS.chan(%u): retry_body_maxtime=%uus (%u)", chan, try_send_message_stats.max_retry_deferred_body_us, @@ -1953,7 +1956,7 @@ GCS_MAVLINK::update_receive(uint32_t max_time_us) } for (uint8_t i=0; iget_soft_armed()) { // *preflight*, remember? - gcs().send_text(MAV_SEVERITY_NOTICE, "Disarm to allow calibration"); + GCS_SEND_TEXT(MAV_SEVERITY_NOTICE, "Disarm to allow calibration"); return MAV_RESULT_FAILED; } // now call subclass methods: @@ -4921,7 +4926,7 @@ MAV_RESULT GCS_MAVLINK::handle_command_component_arm_disarm(const mavlink_comman return MAV_RESULT_ACCEPTED; } // run pre_arm_checks and arm_checks and display failures - const bool do_arming_checks = !is_equal(packet.param2,magic_force_arm_value); + const bool do_arming_checks = !is_equal(packet.param2,magic_force_arm_value) && !is_equal(packet.param2,magic_force_arm_disarm_value); if (AP::arming().arm(AP_Arming::Method::MAVLINK, do_arming_checks)) { return MAV_RESULT_ACCEPTED; } @@ -4931,7 +4936,7 @@ MAV_RESULT GCS_MAVLINK::handle_command_component_arm_disarm(const mavlink_comman if (!AP::arming().is_armed()) { return MAV_RESULT_ACCEPTED; } - const bool forced = is_equal(packet.param2, magic_force_disarm_value); + const bool forced = is_equal(packet.param2, magic_force_arm_disarm_value); // note disarm()'s second parameter is "do_disarm_checks" if (AP::arming().disarm(AP_Arming::Method::MAVLINK, !forced)) { return MAV_RESULT_ACCEPTED; @@ -6205,10 +6210,13 @@ bool GCS_MAVLINK::try_send_message(const enum ap_message id) send_rc_channels(); break; +#if AP_MAVLINK_MSG_RC_CHANNELS_RAW_ENABLED case MSG_RC_CHANNELS_RAW: CHECK_PAYLOAD_SIZE(RC_CHANNELS_RAW); send_rc_channels_raw(); break; +#endif // AP_MAVLINK_MSG_RC_CHANNELS_RAW_ENABLED + #endif case MSG_RAW_IMU: @@ -6394,7 +6402,7 @@ bool GCS_MAVLINK::try_send_message(const enum ap_message id) // message as part of send_message. // This message will be sent out at the same rate as the // unknown message, so should be safe. - gcs().send_text(MAV_SEVERITY_DEBUG, "Sending unknown message (%u)", id); + GCS_SEND_TEXT(MAV_SEVERITY_DEBUG, "Sending unknown message (%u)", id); #if CONFIG_HAL_BOARD == HAL_BOARD_SITL AP_HAL::panic("Sending unknown ap_message %u", id); #endif @@ -6740,7 +6748,7 @@ void GCS::update_passthru(void) _passthru.baud2 = baud2; _passthru.parity1 = parity1 = _passthru.port1->get_parity(); _passthru.parity2 = parity2 = _passthru.port2->get_parity(); - gcs().send_text(MAV_SEVERITY_INFO, "Passthru enabled"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Passthru enabled"); if (!_passthru.timer_installed) { _passthru.timer_installed = true; hal.scheduler->register_timer_process(FUNCTOR_BIND_MEMBER(&GCS::passthru_timer, void)); @@ -6765,7 +6773,7 @@ void GCS::update_passthru(void) if (_passthru.parity2 != parity2) { _passthru.port2->configure_parity(parity2); } - gcs().send_text(MAV_SEVERITY_INFO, "Passthru disabled"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Passthru disabled"); } else if (enabled && _passthru.timeout_s && now - _passthru.last_port1_data_ms > uint32_t(_passthru.timeout_s)*1000U) { @@ -6790,7 +6798,7 @@ void GCS::update_passthru(void) if (_passthru.parity2 != parity2) { _passthru.port2->configure_parity(parity2); } - gcs().send_text(MAV_SEVERITY_INFO, "Passthru timed out"); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Passthru timed out"); } } @@ -6886,7 +6894,7 @@ bool GCS_MAVLINK::mavlink_coordinate_frame_to_location_alt_frame(const MAV_FRAME return true; default: #if CONFIG_HAL_BOARD == HAL_BOARD_SITL - gcs().send_text(MAV_SEVERITY_INFO, "Unknown mavlink coordinate frame %u", coordinate_frame); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Unknown mavlink coordinate frame %u", coordinate_frame); #endif return false; } diff --git a/libraries/GCS_MAVLink/GCS_FTP.cpp b/libraries/GCS_MAVLink/GCS_FTP.cpp index e3e6509579..0430dc2f3b 100644 --- a/libraries/GCS_MAVLink/GCS_FTP.cpp +++ b/libraries/GCS_MAVLink/GCS_FTP.cpp @@ -63,7 +63,7 @@ bool GCS_MAVLINK::ftp_init(void) { failed: delete ftp.requests; ftp.requests = nullptr; - gcs().send_text(MAV_SEVERITY_WARNING, "failed to initialize MAVFTP"); + GCS_SEND_TEXT(MAV_SEVERITY_WARNING, "failed to initialize MAVFTP"); return false; } @@ -572,7 +572,7 @@ void GCS_MAVLINK::ftp_worker(void) { case FTP_OP::TruncateFile: default: // this was bad data, just nack it - gcs().send_text(MAV_SEVERITY_DEBUG, "Unsupported FTP: %d", static_cast(request.opcode)); + GCS_SEND_TEXT(MAV_SEVERITY_DEBUG, "Unsupported FTP: %d", static_cast(request.opcode)); ftp_error(reply, FTP_ERROR::Fail); break; } @@ -588,16 +588,23 @@ void GCS_MAVLINK::ftp_worker(void) { // calculates how much string length is needed to fit this in a list response int GCS_MAVLINK::gen_dir_entry(char *dest, size_t space, const char *path, const struct dirent * entry) { +#if AP_FILESYSTEM_HAVE_DIRENT_DTYPE const bool is_file = entry->d_type == DT_REG || entry->d_type == DT_LNK; +#else + // assume true initially, then handle below + const bool is_file = true; +#endif if (space < 3) { return -1; } dest[0] = 0; +#if AP_FILESYSTEM_HAVE_DIRENT_DTYPE if (!is_file && entry->d_type != DT_DIR) { return -1; // this just forces it so we can't send this back, it's easier then sending skips to a GCS } +#endif if (is_file) { #ifdef MAX_NAME_LEN @@ -612,6 +619,12 @@ int GCS_MAVLINK::gen_dir_entry(char *dest, size_t space, const char *path, const if (AP::FS().stat(full_path, &st)) { return -1; } + +#if !AP_FILESYSTEM_HAVE_DIRENT_DTYPE + if (S_ISDIR(st.st_mode)) { + return hal.util->snprintf(dest, space, "D%s%c", entry->d_name, (char)0); + } +#endif return hal.util->snprintf(dest, space, "F%s\t%u%c", entry->d_name, (unsigned)st.st_size, (char)0); } else { return hal.util->snprintf(dest, space, "D%s%c", entry->d_name, (char)0); diff --git a/libraries/GCS_MAVLink/GCS_Fence.cpp b/libraries/GCS_MAVLink/GCS_Fence.cpp index d6dad1a769..b3bfb78a37 100644 --- a/libraries/GCS_MAVLink/GCS_Fence.cpp +++ b/libraries/GCS_MAVLink/GCS_Fence.cpp @@ -16,20 +16,24 @@ MAV_RESULT GCS_MAVLINK::handle_command_do_fence_enable(const mavlink_command_int return MAV_RESULT_UNSUPPORTED; } - switch ((uint16_t)packet.param1) { - case 0: // disable fence - fence->enable(false); + uint8_t fences = AC_FENCE_ALL_FENCES; + if (uint8_t(packet.param2)) { + fences = uint8_t(packet.param2); + } + + switch (AC_Fence::MavlinkFenceActions(packet.param1)) { + case AC_Fence::MavlinkFenceActions::DISABLE_FENCE: + fence->enable(false, fences); return MAV_RESULT_ACCEPTED; - case 1: // enable fence - if (!fence->present()) - { + case AC_Fence::MavlinkFenceActions::ENABLE_FENCE: + if (!(fence->present() & fences)) { return MAV_RESULT_FAILED; } - - fence->enable(true); + + fence->enable(true, fences); return MAV_RESULT_ACCEPTED; - case 2: // disable fence floor only - fence->disable_floor(); + case AC_Fence::MavlinkFenceActions::DISABLE_ALT_MIN_FENCE: + fence->enable(false, AC_FENCE_TYPE_ALT_MIN); return MAV_RESULT_ACCEPTED; default: return MAV_RESULT_FAILED; @@ -82,7 +86,7 @@ void GCS_MAVLINK::send_fence_status() const mavlink_breach_type = FENCE_BREACH_BOUNDARY; } - // report on Avoidance liminting + // report on Avoidance limiting uint8_t breach_mitigation = FENCE_MITIGATE_UNKNOWN; #if AP_AVOIDANCE_ENABLED && !APM_BUILD_TYPE(APM_BUILD_ArduPlane) const AC_Avoid* avoid = AC_Avoid::get_singleton(); diff --git a/libraries/GCS_MAVLink/GCS_Param.cpp b/libraries/GCS_MAVLink/GCS_Param.cpp index fe6ab7c11b..5d73e8a646 100644 --- a/libraries/GCS_MAVLink/GCS_Param.cpp +++ b/libraries/GCS_MAVLink/GCS_Param.cpp @@ -290,7 +290,7 @@ void GCS_MAVLINK::handle_param_set(const mavlink_message_t &msg) } if ((parameter_flags & AP_PARAM_FLAG_INTERNAL_USE_ONLY) || vp->is_read_only()) { - gcs().send_text(MAV_SEVERITY_WARNING, "Param write denied (%s)", key); + GCS_SEND_TEXT(MAV_SEVERITY_WARNING, "Param write denied (%s)", key); // send the readonly value send_parameter_value(key, var_type, old_value); return; diff --git a/libraries/GCS_MAVLink/GCS_config.h b/libraries/GCS_MAVLink/GCS_config.h index e5d78fb860..0bf028f64f 100644 --- a/libraries/GCS_MAVLink/GCS_config.h +++ b/libraries/GCS_MAVLink/GCS_config.h @@ -40,6 +40,10 @@ #define AP_MAVLINK_AUTOPILOT_VERSION_REQUEST_ENABLED 1 #endif +#ifndef AP_MAVLINK_MSG_RC_CHANNELS_RAW_ENABLED +#define AP_MAVLINK_MSG_RC_CHANNELS_RAW_ENABLED 1 +#endif + // handling of MAV_CMD_REQUEST_AUTOPILOT_CAPABILITIES is slated to be // removed; the message can be requested with MAV_CMD_REQUEST_MESSAGE #ifndef AP_MAVLINK_MAV_CMD_REQUEST_AUTOPILOT_CAPABILITIES_ENABLED @@ -127,3 +131,7 @@ #ifndef AP_MAVLINK_MSG_HIGHRES_IMU_ENABLED #define AP_MAVLINK_MSG_HIGHRES_IMU_ENABLED (BOARD_FLASH_SIZE > 1024) && AP_INERTIALSENSOR_ENABLED #endif + +#ifndef AP_MAVLINK_MAV_CMD_SET_HAGL_ENABLED +#define AP_MAVLINK_MAV_CMD_SET_HAGL_ENABLED (BOARD_FLASH_SIZE > 1024) +#endif diff --git a/libraries/GCS_MAVLink/GCS_serial_control.cpp b/libraries/GCS_MAVLink/GCS_serial_control.cpp index 0c60dcb4e2..e0a2b3fa09 100644 --- a/libraries/GCS_MAVLink/GCS_serial_control.cpp +++ b/libraries/GCS_MAVLink/GCS_serial_control.cpp @@ -74,12 +74,6 @@ void GCS_MAVLINK::handle_serial_control(const mavlink_message_t &msg) AP::gps().lock_port(1, exclusive); break; #endif // AP_GPS_ENABLED - case SERIAL_CONTROL_DEV_SHELL: - stream = hal.util->get_shell_stream(); - if (stream == nullptr) { - return; - } - break; case SERIAL_CONTROL_SERIAL0 ... SERIAL_CONTROL_SERIAL9: { // direct access to a SERIALn port stream = port = AP::serialmanager().get_serial_by_id(packet.device - SERIAL_CONTROL_SERIAL0); diff --git a/libraries/GCS_MAVLink/MAVLink_routing.cpp b/libraries/GCS_MAVLink/MAVLink_routing.cpp index bd05159157..c66ad86975 100644 --- a/libraries/GCS_MAVLink/MAVLink_routing.cpp +++ b/libraries/GCS_MAVLink/MAVLink_routing.cpp @@ -101,7 +101,7 @@ bool MAVLink_routing::check_and_forward(GCS_MAVLINK &in_link, const mavlink_mess // of mavlink messages to a private channel (Solo Gimbal case) if (!gopro_status_check && (msg.msgid == MAVLINK_MSG_ID_GOPRO_HEARTBEAT)) { gopro_status_check = true; - gcs().send_text(MAV_SEVERITY_NOTICE, "GoPro in Solo gimbal detected"); + GCS_SEND_TEXT(MAV_SEVERITY_NOTICE, "GoPro in Solo gimbal detected"); } #endif // HAL_SOLO_GIMBAL_ENABLED @@ -199,7 +199,7 @@ bool MAVLink_routing::check_and_forward(GCS_MAVLINK &in_link, const mavlink_mess #if ROUTING_DEBUG ::printf("fwd msg %u from chan %u on chan %u sysid=%d compid=%d\n", msg.msgid, - (unsigned)in_link->get_chan(), + (unsigned)in_link.get_chan(), (unsigned)routes[i].channel, (int)target_system, (int)target_component); diff --git a/libraries/GCS_MAVLink/MissionItemProtocol.cpp b/libraries/GCS_MAVLink/MissionItemProtocol.cpp index bf42339d12..3d4017fcef 100644 --- a/libraries/GCS_MAVLink/MissionItemProtocol.cpp +++ b/libraries/GCS_MAVLink/MissionItemProtocol.cpp @@ -47,7 +47,7 @@ bool MissionItemProtocol::mavlink2_requirement_met(const GCS_MAVLINK &_link, con if (!_link.sending_mavlink1()) { return true; } - gcs().send_text(MAV_SEVERITY_WARNING, "Need mavlink2 for item transfer"); + GCS_SEND_TEXT(MAV_SEVERITY_WARNING, "Need mavlink2 for item transfer"); send_mission_ack(_link, msg, MAV_MISSION_UNSUPPORTED); return false; } @@ -199,7 +199,7 @@ void MissionItemProtocol::handle_mission_request(GCS_MAVLINK &_link, if (!mission_request_warning_sent) { mission_request_warning_sent = true; - gcs().send_text(MAV_SEVERITY_WARNING, "got MISSION_REQUEST; use MISSION_REQUEST_INT!"); + GCS_SEND_TEXT(MAV_SEVERITY_WARNING, "got MISSION_REQUEST; use MISSION_REQUEST_INT!"); } // buffer space is checked by send_message @@ -213,7 +213,7 @@ void MissionItemProtocol::send_mission_item_warning() return; } mission_item_warning_sent = true; - gcs().send_text(MAV_SEVERITY_WARNING, "got MISSION_ITEM; GCS should send MISSION_ITEM_INT"); + GCS_SEND_TEXT(MAV_SEVERITY_WARNING, "got MISSION_ITEM; GCS should send MISSION_ITEM_INT"); } void MissionItemProtocol::handle_mission_write_partial_list(GCS_MAVLINK &_link, @@ -238,7 +238,7 @@ void MissionItemProtocol::handle_mission_write_partial_list(GCS_MAVLINK &_link, if ((unsigned)packet.start_index > item_count() || (unsigned)packet.end_index > item_count() || packet.end_index < packet.start_index) { - gcs().send_text(MAV_SEVERITY_WARNING,"Flight plan update rejected"); // FIXME: Remove this anytime after 2020-01-22 + GCS_SEND_TEXT(MAV_SEVERITY_WARNING,"Flight plan update rejected"); // FIXME: Remove this anytime after 2020-01-22 send_mission_ack(_link, msg, MAV_MISSION_ERROR); return; } diff --git a/libraries/GCS_MAVLink/MissionItemProtocol_Fence.cpp b/libraries/GCS_MAVLink/MissionItemProtocol_Fence.cpp index 4db88146b1..fed0560e07 100644 --- a/libraries/GCS_MAVLink/MissionItemProtocol_Fence.cpp +++ b/libraries/GCS_MAVLink/MissionItemProtocol_Fence.cpp @@ -222,7 +222,7 @@ MAV_MISSION_RESULT MissionItemProtocol_Fence::allocate_receive_resources(const u if (allocation_size != 0) { _new_items = (AC_PolyFenceItem*)malloc(allocation_size); if (_new_items == nullptr) { - gcs().send_text(MAV_SEVERITY_WARNING, "Out of memory for upload"); + GCS_SEND_TEXT(MAV_SEVERITY_WARNING, "Out of memory for upload"); return MAV_MISSION_ERROR; } } diff --git a/libraries/RC_Channel/RC_Channel.cpp b/libraries/RC_Channel/RC_Channel.cpp index f3cecf7e4a..04508c3f7b 100644 --- a/libraries/RC_Channel/RC_Channel.cpp +++ b/libraries/RC_Channel/RC_Channel.cpp @@ -209,6 +209,7 @@ const AP_Param::GroupInfo RC_Channel::var_info[] = { // @Values{Copter}: 109:use Custom Controller // @Values{Copter, Rover, Plane, Blimp}: 110:KillIMU3 // @Values{Copter,Plane,Rover,Blimp,Sub,Tracker}: 112:SwitchExternalAHRS + // @Values{Copter, Rover, Plane}: 113:Retract Mount2 // @Values{Plane}: 150:CRUISE Mode // @Values{Copter}: 151:TURTLE Mode // @Values{Copter}: 152:SIMPLE heading reset @@ -238,6 +239,7 @@ const AP_Param::GroupInfo RC_Channel::var_info[] = { // @Values{Plane}: 176:Quadplane Fwd Throttle Override enable // @Values{Copter, Rover, Plane, Blimp}: 177:Mount LRF enable // @Values{Copter}: 178:FlightMode Pause/Resume + // @Values{Copter, Plane}: 180:Test autotuned gains after tune is complete // @Values{Rover}: 201:Roll // @Values{Rover}: 202:Pitch // @Values{Rover}: 207:MainSail @@ -246,6 +248,7 @@ const AP_Param::GroupInfo RC_Channel::var_info[] = { // @Values{Plane}: 210:Airbrakes // @Values{Rover}: 211:Walking Height // @Values{Copter, Rover, Plane}: 212:Mount1 Roll, 213:Mount1 Pitch, 214:Mount1 Yaw, 215:Mount2 Roll, 216:Mount2 Pitch, 217:Mount2 Yaw + // @Values{Copter}: 219:Transmitter Tuning // @Values{Copter, Rover, Plane}: 300:Scripting1, 301:Scripting2, 302:Scripting3, 303:Scripting4, 304:Scripting5, 305:Scripting6, 306:Scripting7, 307:Scripting8 // @User: Standard AP_GROUPINFO_FRAME("OPTION", 6, RC_Channel, option, 0, AP_PARAM_FRAME_COPTER|AP_PARAM_FRAME_ROVER|AP_PARAM_FRAME_PLANE|AP_PARAM_FRAME_BLIMP), @@ -626,26 +629,41 @@ void RC_Channel::init_aux_function(const AUX_FUNC ch_option, const AuxSwitchPos // the following functions do not need to be initialised: case AUX_FUNC::ARMDISARM: case AUX_FUNC::ARMDISARM_AIRMODE: +#if AP_BATTERY_ENABLED case AUX_FUNC::BATTERY_MPPT_ENABLE: +#endif +#if AP_CAMERA_ENABLED case AUX_FUNC::CAMERA_TRIGGER: +#endif case AUX_FUNC::CLEAR_WP: case AUX_FUNC::COMPASS_LEARN: case AUX_FUNC::DISARM: case AUX_FUNC::DO_NOTHING: +#if AP_LANDINGGEAR_ENABLED case AUX_FUNC::LANDING_GEAR: +#endif case AUX_FUNC::LOST_VEHICLE_SOUND: +#if AP_SERVORELAYEVENTS_ENABLED && AP_RELAY_ENABLED case AUX_FUNC::RELAY: case AUX_FUNC::RELAY2: case AUX_FUNC::RELAY3: case AUX_FUNC::RELAY4: case AUX_FUNC::RELAY5: case AUX_FUNC::RELAY6: +#endif +#if HAL_VISUALODOM_ENABLED case AUX_FUNC::VISODOM_ALIGN: +#endif case AUX_FUNC::EKF_LANE_SWITCH: case AUX_FUNC::EKF_YAW_RESET: +#if HAL_GENERATOR_ENABLED case AUX_FUNC::GENERATOR: // don't turn generator on or off initially +#endif case AUX_FUNC::EKF_POS_SOURCE: +#if HAL_TORQEEDO_ENABLED case AUX_FUNC::TORQEEDO_CLEAR_ERR: +#endif +#if AP_SCRIPTING_ENABLED case AUX_FUNC::SCRIPTING_1: case AUX_FUNC::SCRIPTING_2: case AUX_FUNC::SCRIPTING_3: @@ -654,21 +672,30 @@ void RC_Channel::init_aux_function(const AUX_FUNC ch_option, const AuxSwitchPos case AUX_FUNC::SCRIPTING_6: case AUX_FUNC::SCRIPTING_7: case AUX_FUNC::SCRIPTING_8: +#endif #if AP_VIDEOTX_ENABLED case AUX_FUNC::VTX_POWER: #endif +#if AP_OPTICALFLOW_CALIBRATOR_ENABLED case AUX_FUNC::OPTFLOW_CAL: +#endif case AUX_FUNC::TURBINE_START: +#if HAL_MOUNT_ENABLED case AUX_FUNC::MOUNT1_ROLL: case AUX_FUNC::MOUNT1_PITCH: case AUX_FUNC::MOUNT1_YAW: case AUX_FUNC::MOUNT2_ROLL: case AUX_FUNC::MOUNT2_PITCH: case AUX_FUNC::MOUNT2_YAW: +#endif case AUX_FUNC::LOWEHEISER_STARTER: case AUX_FUNC::MAG_CAL: +#if AP_CAMERA_ENABLED case AUX_FUNC::CAMERA_IMAGE_TRACKING: +#endif +#if HAL_MOUNT_ENABLED case AUX_FUNC::MOUNT_LRF_ENABLE: +#endif break; // not really aux functions: @@ -678,9 +705,13 @@ void RC_Channel::init_aux_function(const AUX_FUNC ch_option, const AuxSwitchPos case AUX_FUNC::AVOID_ADSB: #endif case AUX_FUNC::AVOID_PROXIMITY: +#if AP_FENCE_ENABLED case AUX_FUNC::FENCE: +#endif +#if AP_GPS_ENABLED case AUX_FUNC::GPS_DISABLE: case AUX_FUNC::GPS_DISABLE_YAW: +#endif #if AP_GRIPPER_ENABLED case AUX_FUNC::GRIPPER: #endif @@ -692,22 +723,31 @@ void RC_Channel::init_aux_function(const AUX_FUNC ch_option, const AuxSwitchPos case AUX_FUNC::MISSION_RESET: case AUX_FUNC::MOTOR_ESTOP: case AUX_FUNC::RC_OVERRIDE_ENABLE: +#if HAL_RUNCAM_ENABLED case AUX_FUNC::RUNCAM_CONTROL: case AUX_FUNC::RUNCAM_OSD_CONTROL: +#endif +#if HAL_SPRAYER_ENABLED case AUX_FUNC::SPRAYER: +#endif case AUX_FUNC::DISABLE_AIRSPEED_USE: case AUX_FUNC::FFT_NOTCH_TUNE: #if HAL_MOUNT_ENABLED case AUX_FUNC::RETRACT_MOUNT1: + case AUX_FUNC::RETRACT_MOUNT2: case AUX_FUNC::MOUNT_LOCK: #endif +#if HAL_LOGGING_ENABLED case AUX_FUNC::LOG_PAUSE: +#endif case AUX_FUNC::ARM_EMERGENCY_STOP: +#if AP_CAMERA_ENABLED case AUX_FUNC::CAMERA_REC_VIDEO: case AUX_FUNC::CAMERA_ZOOM: case AUX_FUNC::CAMERA_MANUAL_FOCUS: case AUX_FUNC::CAMERA_AUTO_FOCUS: case AUX_FUNC::CAMERA_LENS: +#endif case AUX_FUNC::AHRS_TYPE: run_aux_function(ch_option, ch_flag, AuxFuncTriggerSource::INIT); break; @@ -734,7 +774,10 @@ const RC_Channel::LookupTable RC_Channel::lookuptable[] = { { AUX_FUNC::PARACHUTE_RELEASE,"ParachuteRelease"}, { AUX_FUNC::PARACHUTE_3POS,"Parachute3Position"}, { AUX_FUNC::MISSION_RESET,"MissionReset"}, +#if HAL_MOUNT_ENABLED { AUX_FUNC::RETRACT_MOUNT1,"RetractMount1"}, + { AUX_FUNC::RETRACT_MOUNT2,"RetractMount2"}, +#endif { AUX_FUNC::RELAY,"Relay1"}, { AUX_FUNC::MOTOR_ESTOP,"MotorEStop"}, { AUX_FUNC::MOTOR_INTERLOCK,"MotorInterlock"}, @@ -1049,9 +1092,9 @@ bool RC_Channel::do_aux_function_camera_lens(const AuxSwitchPos ch_flag) } #endif // AP_CAMERA_ENABLED +#if HAL_RUNCAM_ENABLED void RC_Channel::do_aux_function_runcam_control(const AuxSwitchPos ch_flag) { -#if HAL_RUNCAM_ENABLED AP_RunCam *runcam = AP::runcam(); if (runcam == nullptr) { return; @@ -1068,12 +1111,10 @@ void RC_Channel::do_aux_function_runcam_control(const AuxSwitchPos ch_flag) runcam->stop_recording(); break; } -#endif } void RC_Channel::do_aux_function_runcam_osd_control(const AuxSwitchPos ch_flag) { -#if HAL_RUNCAM_ENABLED AP_RunCam *runcam = AP::runcam(); if (runcam == nullptr) { return; @@ -1088,8 +1129,8 @@ void RC_Channel::do_aux_function_runcam_osd_control(const AuxSwitchPos ch_flag) runcam->exit_osd(); break; } -#endif } +#endif #if AP_FENCE_ENABLED // enable or disable the fence @@ -1100,7 +1141,7 @@ void RC_Channel::do_aux_function_fence(const AuxSwitchPos ch_flag) return; } - fence->enable(ch_flag == AuxSwitchPos::HIGH); + fence->enable_configured(ch_flag == AuxSwitchPos::HIGH); } #endif @@ -1248,6 +1289,34 @@ void RC_Channel::do_aux_function_fft_notch_tune(const AuxSwitchPos ch_flag) #endif } +/** + * Perform the RETRACT_MOUNT 1/2 process. + * + * @param [in] ch_flag Position of the switch. HIGH, MIDDLE and LOW. + * @param [in] instance 0: RETRACT MOUNT 1
+ * 1: RETRACT MOUNT 2 +*/ +#if HAL_MOUNT_ENABLED +void RC_Channel::do_aux_function_retract_mount(const AuxSwitchPos ch_flag, const uint8_t instance) +{ + AP_Mount *mount = AP::mount(); + if (mount == nullptr) { + return; + } + switch (ch_flag) { + case AuxSwitchPos::HIGH: + mount->set_mode(instance,MAV_MOUNT_MODE_RETRACT); + break; + case AuxSwitchPos::MIDDLE: + // nothing + break; + case AuxSwitchPos::LOW: + mount->set_mode_to_default(instance); + break; + } +} +#endif // HAL_MOUNT_ENABLED + bool RC_Channel::run_aux_function(AUX_FUNC ch_option, AuxSwitchPos pos, AuxFuncTriggerSource source) { #if AP_SCRIPTING_ENABLED @@ -1328,6 +1397,7 @@ bool RC_Channel::do_aux_function(const AUX_FUNC ch_option, const AuxSwitchPos ch break; #endif // AP_SERVORELAYEVENTS_ENABLED && AP_RELAY_ENABLED +#if HAL_RUNCAM_ENABLED case AUX_FUNC::RUNCAM_CONTROL: do_aux_function_runcam_control(ch_flag); break; @@ -1335,6 +1405,7 @@ bool RC_Channel::do_aux_function(const AUX_FUNC ch_option, const AuxSwitchPos ch case AUX_FUNC::RUNCAM_OSD_CONTROL: do_aux_function_runcam_osd_control(ch_flag); break; +#endif case AUX_FUNC::CLEAR_WP: do_aux_function_clear_wp(ch_flag); @@ -1415,6 +1486,7 @@ bool RC_Channel::do_aux_function(const AUX_FUNC ch_option, const AuxSwitchPos ch } #endif +#if AP_GPS_ENABLED case AUX_FUNC::GPS_DISABLE: AP::gps().force_disable(ch_flag == AuxSwitchPos::HIGH); #if HAL_EXTERNAL_AHRS_ENABLED @@ -1425,6 +1497,7 @@ bool RC_Channel::do_aux_function(const AUX_FUNC ch_option, const AuxSwitchPos ch case AUX_FUNC::GPS_DISABLE_YAW: AP::gps().set_force_disable_yaw(ch_flag == AuxSwitchPos::HIGH); break; +#endif // AP_GPS_ENABLED #if AP_AIRSPEED_ENABLED case AUX_FUNC::DISABLE_AIRSPEED_USE: { @@ -1570,24 +1643,13 @@ bool RC_Channel::do_aux_function(const AUX_FUNC ch_option, const AuxSwitchPos ch #endif // AP_CAMERA_ENABLED #if HAL_MOUNT_ENABLED - case AUX_FUNC::RETRACT_MOUNT1: { - AP_Mount *mount = AP::mount(); - if (mount == nullptr) { - break; - } - switch (ch_flag) { - case AuxSwitchPos::HIGH: - mount->set_mode(0,MAV_MOUNT_MODE_RETRACT); - break; - case AuxSwitchPos::MIDDLE: - // nothing - break; - case AuxSwitchPos::LOW: - mount->set_mode_to_default(0); - break; - } + case AUX_FUNC::RETRACT_MOUNT1: + do_aux_function_retract_mount(ch_flag, 0); + break; + + case AUX_FUNC::RETRACT_MOUNT2: + do_aux_function_retract_mount(ch_flag, 1); break; - } case AUX_FUNC::MOUNT_LOCK: { AP_Mount *mount = AP::mount(); @@ -1798,7 +1860,7 @@ RC_Channel *RC_Channels::find_channel_for_option(const RC_Channel::AUX_FUNC opti // duplicate_options_exist - returns true if any options are duplicated bool RC_Channels::duplicate_options_exist() { - uint8_t auxsw_option_counts[512] = {}; + Bitmask<(uint16_t)RC_Channel::AUX_FUNC::AUX_FUNCTION_MAX> used_auxsw_options; for (uint8_t i=0; ioption.get(); - if (option >= sizeof(auxsw_option_counts)) { + if (option == (uint16_t)RC_Channel::AUX_FUNC::DO_NOTHING) { continue; } - auxsw_option_counts[option]++; - } - - for (uint16_t i=0; i= used_auxsw_options.size()) { continue; } - if (auxsw_option_counts[i] > 1) { + if (used_auxsw_options.get(option)) { return true; } + used_auxsw_options.set(option); } return false; } diff --git a/libraries/RC_Channel/RC_Channel.h b/libraries/RC_Channel/RC_Channel.h index 2d8d1ab850..496a3187d5 100644 --- a/libraries/RC_Channel/RC_Channel.h +++ b/libraries/RC_Channel/RC_Channel.h @@ -119,7 +119,7 @@ public: ACRO_TRAINER = 14, // low = disabled, middle = leveled, high = leveled and limited SPRAYER = 15, // enable/disable the crop sprayer AUTO = 16, // change to auto flight mode - AUTOTUNE = 17, // auto tune + AUTOTUNE_MODE = 17, // auto tune LAND = 18, // change to LAND flight mode GRIPPER = 19, // Operate cargo grippers low=off, middle=neutral, high=on PARACHUTE_ENABLE = 21, // Parachute enable/disable @@ -217,6 +217,7 @@ public: KILL_IMU3 = 110, // disable third IMU (for IMU failure testing) LOWEHEISER_STARTER = 111, // allows for manually running starter AHRS_TYPE = 112, // change AHRS_EKF_TYPE + RETRACT_MOUNT2 = 113, // Retract Mount2 // if you add something here, make sure to update the documentation of the parameter in RC_Channel.cpp! // also, if you add an option >255, you will need to fix duplicate_options_exist @@ -251,6 +252,7 @@ public: VFWD_THR_OVERRIDE = 176, // force enabled VTOL forward throttle method MOUNT_LRF_ENABLE = 177, // mount LRF enable/disable FLIGHTMODE_PAUSE = 178, // e.g. pause movement towards waypoint + AUTOTUNE_TEST_GAINS = 180, // auto tune tuning switch to test or revert gains // inputs from 200 will eventually used to replace RCMAP @@ -270,6 +272,7 @@ public: MOUNT2_PITCH = 216, // mount3 pitch input MOUNT2_YAW = 217, // mount4 yaw input LOWEHEISER_THROTTLE= 218, // allows for throttle on slider + TRANSMITTER_TUNING = 219, // use a transmitter knob or slider for in-flight tuning // inputs 248-249 are reserved for the Skybrush fork at // https://github.com/skybrush-io/ardupilot @@ -362,6 +365,7 @@ protected: void do_aux_function_sprayer(const AuxSwitchPos ch_flag); void do_aux_function_generator(const AuxSwitchPos ch_flag); void do_aux_function_fft_notch_tune(const AuxSwitchPos ch_flag); + void do_aux_function_retract_mount(const AuxSwitchPos ch_flag, const uint8_t instance); typedef int8_t modeswitch_pos_t; virtual void mode_switch_changed(modeswitch_pos_t new_pos) { diff --git a/libraries/SITL/SIM_Aircraft.cpp b/libraries/SITL/SIM_Aircraft.cpp index 4cc7284526..9ca985a145 100644 --- a/libraries/SITL/SIM_Aircraft.cpp +++ b/libraries/SITL/SIM_Aircraft.cpp @@ -181,7 +181,7 @@ void Aircraft::update_position(void) uint32_t now = AP_HAL::millis(); if (now - last_one_hz_ms >= 1000) { // shift origin of position at 1Hz to current location - // this prevents sperical errors building up in the GPS data + // this prevents spherical errors building up in the GPS data last_one_hz_ms = now; Vector2d diffNE = origin.get_distance_NE_double(location); position.xy() -= diffNE; @@ -796,6 +796,11 @@ void Aircraft::update_dynamics(const Vector3f &rot_accel) } } + // update slung payload +#if AP_SIM_SLUNGPAYLOAD_ENABLED + sitl->models.slung_payload_sim.update(get_position_relhome(), velocity_ef, accel_earth); +#endif + // allow for changes in physics step adjust_frame_time(constrain_float(sitl->loop_rate_hz, rate_hz-1, rate_hz+1)); } @@ -1093,6 +1098,19 @@ void Aircraft::update_external_payload(const struct sitl_input &input) dronecan->update(); } #endif + +#if AP_SIM_GPIO_LED_1_ENABLED + sim_led1.update(*this); +#endif +#if AP_SIM_GPIO_LED_2_ENABLED + sim_led2.update(*this); +#endif +#if AP_SIM_GPIO_LED_3_ENABLED + sim_led3.update(*this); +#endif +#if AP_SIM_GPIO_LED_RGB_ENABLED + sim_ledrgb.update(*this); +#endif } void Aircraft::add_shove_forces(Vector3f &rot_accel, Vector3f &body_accel) @@ -1214,6 +1232,19 @@ void Aircraft::add_twist_forces(Vector3f &rot_accel) } } +#if AP_SIM_SLUNGPAYLOAD_ENABLED +// add body-frame force due to slung payload +void Aircraft::add_slungpayload_forces(Vector3f &body_accel) +{ + Vector3f forces_ef; + sitl->models.slung_payload_sim.get_forces_on_vehicle(forces_ef); + + // convert ef forces to body-frame accelerations (acceleration = force / mass) + const Vector3f accel_bf = dcm.transposed() * forces_ef / mass; + body_accel += accel_bf; +} +#endif + /* get position relative to home */ diff --git a/libraries/SITL/SIM_Aircraft.h b/libraries/SITL/SIM_Aircraft.h index 56ed55860d..e84a078ac8 100644 --- a/libraries/SITL/SIM_Aircraft.h +++ b/libraries/SITL/SIM_Aircraft.h @@ -38,6 +38,10 @@ #include #include "SIM_JSON_Master.h" #include "ServoModel.h" +#include "SIM_GPIO_LED_1.h" +#include "SIM_GPIO_LED_2.h" +#include "SIM_GPIO_LED_3.h" +#include "SIM_GPIO_LED_RGB.h" namespace SITL { @@ -318,6 +322,11 @@ protected: void add_shove_forces(Vector3f &rot_accel, Vector3f &body_accel); void add_twist_forces(Vector3f &rot_accel); +#if AP_SIM_SLUNGPAYLOAD_ENABLED + // add body-frame force due to slung payload + void add_slungpayload_forces(Vector3f &body_accel); +#endif + // get local thermal updraft float get_local_updraft(const Vector3d ¤tPos); @@ -372,6 +381,21 @@ private: #if AP_TEST_DRONECAN_DRIVERS DroneCANDevice *dronecan; #endif + + +#if AP_SIM_GPIO_LED_1_ENABLED + GPIO_LED_1 sim_led1{8}; // pin to match sitl.h +#endif +#if AP_SIM_GPIO_LED_2_ENABLED + GPIO_LED_2 sim_led2{13, 14}; // pins to match sitl.h +#endif +#if AP_SIM_GPIO_LED_3_ENABLED + GPIO_LED_3 sim_led3{13, 14, 15}; // pins to match sitl.h +#endif +#if AP_SIM_GPIO_LED_RGB_ENABLED + GPIO_LED_RGB sim_ledrgb{8, 9, 10}; // pins to match sitl.h +#endif + }; } // namespace SITL diff --git a/libraries/SITL/SIM_Buzzer.cpp b/libraries/SITL/SIM_Buzzer.cpp index 0cd1545052..3e7a1b05e2 100644 --- a/libraries/SITL/SIM_Buzzer.cpp +++ b/libraries/SITL/SIM_Buzzer.cpp @@ -102,19 +102,19 @@ void Buzzer::update(const struct sitl_input &input) const uint32_t now = AP_HAL::millis(); if (on) { if (!was_on) { - gcs().send_text(MAV_SEVERITY_WARNING, "%u: Buzzer on", now); + GCS_SEND_TEXT(MAV_SEVERITY_WARNING, "%u: Buzzer on", now); on_time = now; was_on = true; xdemoSound.play(); } if (now - on_time > duration_ms/2) { - gcs().send_text(MAV_SEVERITY_WARNING, "%u: Buzzer on again", now); + GCS_SEND_TEXT(MAV_SEVERITY_WARNING, "%u: Buzzer on again", now); on_time = now; xdemoSound.play(); } } else { if (was_on) { - gcs().send_text(MAV_SEVERITY_WARNING, "%u: Buzzer off", now); + GCS_SEND_TEXT(MAV_SEVERITY_WARNING, "%u: Buzzer off", now); xdemoSound.stop(); was_on = false; } diff --git a/libraries/SITL/SIM_GPIO_LED_1.cpp b/libraries/SITL/SIM_GPIO_LED_1.cpp new file mode 100644 index 0000000000..5ae8a40ef4 --- /dev/null +++ b/libraries/SITL/SIM_GPIO_LED_1.cpp @@ -0,0 +1,31 @@ +#include "SIM_config.h" + +#if AP_SIM_GPIO_LED_1_ENABLED + +#include "SIM_GPIO_LED_1.h" + +#include + +using namespace SITL; + +void GPIO_LED_1::init() +{ + leds.init(); +} + +void GPIO_LED_1::update(const class Aircraft &aircraft) +{ + if (!init_done) { + init(); + init_done = true; + } + + const uint16_t pin_mask = AP::sitl()->pin_mask.get(); + const bool new_led_states[1] { + ((pin_mask & uint16_t((1U<::LEDColour colours[1] { + SIM_LED_n<1>::LEDColour::RED, + }; + + SIM_LED_n<1> leds{"GPIO_LED_1", colours}; + + uint8_t LED_A_PIN; +}; + +} // namespace SITL + +#endif // AP_SIM_GPIO_LED_2_ENABLED diff --git a/libraries/SITL/SIM_GPIO_LED_2.cpp b/libraries/SITL/SIM_GPIO_LED_2.cpp new file mode 100644 index 0000000000..429e3d8875 --- /dev/null +++ b/libraries/SITL/SIM_GPIO_LED_2.cpp @@ -0,0 +1,32 @@ +#include "SIM_config.h" + +#if AP_SIM_GPIO_LED_2_ENABLED + +#include "SIM_GPIO_LED_2.h" + +#include + +using namespace SITL; + +void GPIO_LED_2::init() +{ + leds.init(); +} + +void GPIO_LED_2::update(const class Aircraft &aircraft) +{ + if (!init_done) { + init(); + init_done = true; + } + + const uint16_t pin_mask = AP::sitl()->pin_mask.get(); + const bool new_led_states[2] { + ((pin_mask & uint16_t((1U<::LEDColour colours[2] { + SIM_LED_n<2>::LEDColour::RED, + SIM_LED_n<2>::LEDColour::BLUE, + }; + + SIM_LED_n<2> leds{"GPIO_LED_2", colours}; + + uint8_t LED_A_PIN; + uint8_t LED_B_PIN; +}; + +} // namespace SITL + +#endif // AP_SIM_GPIO_LED_2_ENABLED diff --git a/libraries/SITL/SIM_GPIO_LED_3.cpp b/libraries/SITL/SIM_GPIO_LED_3.cpp new file mode 100644 index 0000000000..d078f30d30 --- /dev/null +++ b/libraries/SITL/SIM_GPIO_LED_3.cpp @@ -0,0 +1,33 @@ +#include "SIM_config.h" + +#if AP_SIM_GPIO_LED_3_ENABLED + +#include "SIM_GPIO_LED_3.h" + +#include + +using namespace SITL; + +void GPIO_LED_3::init() +{ + leds.init(); +} + +void GPIO_LED_3::update(const class Aircraft &aircraft) +{ + if (!init_done) { + init(); + init_done = true; + } + + const uint16_t pin_mask = AP::sitl()->pin_mask.get(); + const bool new_led_states[3] { + ((pin_mask & uint16_t((1U<::LEDColour colours[3] { + SIM_LED_n<3>::LEDColour::RED, + SIM_LED_n<3>::LEDColour::BLUE, + SIM_LED_n<3>::LEDColour::YELLOW, + }; + + SIM_LED_n<3> leds{"GPIO_LED_3", colours}; + + uint8_t LED_A_PIN; + uint8_t LED_B_PIN; + uint8_t LED_C_PIN; +}; + +} // namespace SITL + +#endif // AP_SIM_GPIO_LED_3_ENABLED diff --git a/libraries/SITL/SIM_GPIO_LED_RGB.cpp b/libraries/SITL/SIM_GPIO_LED_RGB.cpp new file mode 100644 index 0000000000..940240c6c4 --- /dev/null +++ b/libraries/SITL/SIM_GPIO_LED_RGB.cpp @@ -0,0 +1,38 @@ +#include "SIM_config.h" + +#if AP_SIM_GPIO_LED_RGB_ENABLED + +#include "SIM_GPIO_LED_RGB.h" + +#include + +using namespace SITL; + +void GPIO_LED_RGB::init() +{ + leds.init(); + rgbled.init(); +} + +void GPIO_LED_RGB::update(const class Aircraft &aircraft) +{ + if (!init_done) { + init(); + init_done = true; + } + + const uint16_t pin_mask = AP::sitl()->pin_mask.get(); + + const bool red = ((pin_mask & uint16_t((1U<::LEDColour colours[3] { + SIM_LED_n<3>::LEDColour::RED, + SIM_LED_n<3>::LEDColour::GREEN, + SIM_LED_n<3>::LEDColour::BLUE, + }; + + SIM_LED_n<3> leds{"GPIO_LED_RGB", colours}; + SIM_RGBLED rgbled{"GPIO_LED_RGB Mixed"}; + + uint8_t LED_RED_PIN; + uint8_t LED_GREEN_PIN; + uint8_t LED_BLUE_PIN; +}; + +} // namespace SITL + +#endif // AP_SIM_GPIO_LED_RGB_ENABLED diff --git a/libraries/SITL/SIM_GPS.cpp b/libraries/SITL/SIM_GPS.cpp index f95d5922c3..290b432c23 100644 --- a/libraries/SITL/SIM_GPS.cpp +++ b/libraries/SITL/SIM_GPS.cpp @@ -11,6 +11,7 @@ #if HAL_SIM_GPS_ENABLED #include +#include #include #include diff --git a/libraries/SITL/SIM_GPS.h b/libraries/SITL/SIM_GPS.h index 954bbd45ac..9f5e226b39 100644 --- a/libraries/SITL/SIM_GPS.h +++ b/libraries/SITL/SIM_GPS.h @@ -27,6 +27,7 @@ param set SERIAL5_PROTOCOL 5 #if HAL_SIM_GPS_ENABLED +#include #include "SIM_SerialDevice.h" namespace SITL { diff --git a/libraries/SITL/SIM_GPS_MSP.cpp b/libraries/SITL/SIM_GPS_MSP.cpp index 2bf9db476f..65d8838b7d 100644 --- a/libraries/SITL/SIM_GPS_MSP.cpp +++ b/libraries/SITL/SIM_GPS_MSP.cpp @@ -7,6 +7,7 @@ #include #include +#include using namespace SITL; diff --git a/libraries/SITL/SIM_GPS_NMEA.cpp b/libraries/SITL/SIM_GPS_NMEA.cpp index bda820cabf..30c705382e 100644 --- a/libraries/SITL/SIM_GPS_NMEA.cpp +++ b/libraries/SITL/SIM_GPS_NMEA.cpp @@ -9,6 +9,7 @@ #include #include +#include extern const AP_HAL::HAL& hal; diff --git a/libraries/SITL/SIM_GPS_NOVA.cpp b/libraries/SITL/SIM_GPS_NOVA.cpp index cd4608b7f0..08f793f4d2 100644 --- a/libraries/SITL/SIM_GPS_NOVA.cpp +++ b/libraries/SITL/SIM_GPS_NOVA.cpp @@ -142,36 +142,12 @@ void GPS_NOVA::publish(const GPS_Data *d) void GPS_NOVA::nova_send_message(uint8_t *header, uint8_t headerlength, uint8_t *payload, uint8_t payloadlen) { write_to_autopilot((char*)header, headerlength); -write_to_autopilot((char*)payload, payloadlen); + write_to_autopilot((char*)payload, payloadlen); - uint32_t crc = CalculateBlockCRC32(headerlength, header, (uint32_t)0); - crc = CalculateBlockCRC32(payloadlen, payload, crc); + uint32_t crc = crc_crc32((uint32_t)0, header, headerlength); + crc = crc_crc32(crc, payload, payloadlen); write_to_autopilot((char*)&crc, 4); } -#define CRC32_POLYNOMIAL 0xEDB88320L -uint32_t GPS_NOVA::CRC32Value(uint32_t icrc) -{ - int i; - uint32_t crc = icrc; - for ( i = 8 ; i > 0; i-- ) - { - if ( crc & 1 ) - crc = ( crc >> 1 ) ^ CRC32_POLYNOMIAL; - else - crc >>= 1; - } - return crc; -} - -uint32_t GPS_NOVA::CalculateBlockCRC32(uint32_t length, uint8_t *buffer, uint32_t crc) -{ - while ( length-- != 0 ) - { - crc = ((crc >> 8) & 0x00FFFFFFL) ^ (CRC32Value(((uint32_t) crc ^ *buffer++) & 0xff)); - } - return( crc ); -} - #endif // AP_SIM_GPS_NOVA_ENABLED diff --git a/libraries/SITL/SIM_GPS_NOVA.h b/libraries/SITL/SIM_GPS_NOVA.h index 4df22b32d8..0801dd9533 100644 --- a/libraries/SITL/SIM_GPS_NOVA.h +++ b/libraries/SITL/SIM_GPS_NOVA.h @@ -21,8 +21,6 @@ public: private: void nova_send_message(uint8_t *header, uint8_t headerlength, uint8_t *payload, uint8_t payloadlen); - uint32_t CRC32Value(uint32_t icrc); - uint32_t CalculateBlockCRC32(uint32_t length, uint8_t *buffer, uint32_t crc); }; }; diff --git a/libraries/SITL/SIM_GeneratorEngine.cpp b/libraries/SITL/SIM_GeneratorEngine.cpp index 5e862cf1d7..d0d5ba25cf 100644 --- a/libraries/SITL/SIM_GeneratorEngine.cpp +++ b/libraries/SITL/SIM_GeneratorEngine.cpp @@ -42,7 +42,7 @@ void SIM_GeneratorEngine::update() temperature = MIN(temperature, 150); // now lose some heat to the environment const float heat_loss = ((temperature * heat_environment_loss_factor * (time_delta_ms * (1/1000.0f)))); // lose some % of heat per second - // gcs().send_text(MAV_SEVERITY_INFO, "heat=%f loss=%f", temperature, heat_loss); + // GCS_SEND_TEXT(MAV_SEVERITY_INFO, "heat=%f loss=%f", temperature, heat_loss); temperature -= heat_loss; } diff --git a/libraries/SITL/SIM_Gimbal.cpp b/libraries/SITL/SIM_Gimbal.cpp index 5aede11b3b..a905a38d73 100644 --- a/libraries/SITL/SIM_Gimbal.cpp +++ b/libraries/SITL/SIM_Gimbal.cpp @@ -13,19 +13,17 @@ along with this program. If not, see . */ /* - gimbal simulator class for MAVLink gimbal + gimbal simulator class for gimbal */ #include "SIM_Gimbal.h" -#if HAL_SIM_GIMBAL_ENABLED +#if AP_SIM_GIMBAL_ENABLED #include #include "SIM_Aircraft.h" -#include - extern const AP_HAL::HAL& hal; #define GIMBAL_DEBUG 0 @@ -38,27 +36,10 @@ extern const AP_HAL::HAL& hal; namespace SITL { -Gimbal::Gimbal(const struct sitl_fdm &_fdm) : - fdm(_fdm), - target_address("127.0.0.1"), - target_port(5762), - lower_joint_limits(radians(-40), radians(-135), radians(-7.5)), - upper_joint_limits(radians(40), radians(45), radians(7.5)), - travelLimitGain(20), - reporting_period_ms(10), - seen_heartbeat(false), - seen_gimbal_control(false), - mav_socket(false) -{ - memset(&mavlink, 0, sizeof(mavlink)); - fdm.quaternion.rotation_matrix(dcm); -} - - /* update the gimbal state */ -void Gimbal::update(void) +void Gimbal::update(const class Aircraft &aircraft) { // calculate delta time in seconds uint32_t now_us = AP_HAL::micros(); @@ -66,8 +47,10 @@ void Gimbal::update(void) float delta_t = (now_us - last_update_us) * 1.0e-6f; last_update_us = now_us; - Matrix3f vehicle_dcm; - fdm.quaternion.rotation_matrix(vehicle_dcm); + const Matrix3f &vehicle_dcm = aircraft.get_dcm(); + if (!init_done) { + dcm = vehicle_dcm; + } const Vector3f &vehicle_gyro = AP::ins().get_gyro(); const Vector3f &vehicle_accel_body = AP::ins().get_accel(); @@ -181,234 +164,21 @@ void Gimbal::update(void) // integrate velocity delta_velocity += accel * delta_t; - - // see if we should do a report - send_report(); } -static struct gimbal_param { - const char *name; - float value; -} gimbal_params[] = { - {"GMB_OFF_ACC_X", 0}, - {"GMB_OFF_ACC_Y", 0}, - {"GMB_OFF_ACC_Z", 0}, - {"GMB_GN_ACC_X", 0}, - {"GMB_GN_ACC_Y", 0}, - {"GMB_GN_ACC_Z", 0}, - {"GMB_OFF_GYRO_X", 0}, - {"GMB_OFF_GYRO_Y", 0}, - {"GMB_OFF_GYRO_Z", 0}, - {"GMB_OFF_JNT_X", 0}, - {"GMB_OFF_JNT_Y", 0}, - {"GMB_OFF_JNT_Z", 0}, - {"GMB_K_RATE", 0}, - {"GMB_POS_HOLD", 0}, - {"GMB_MAX_TORQUE", 0}, - {"GMB_SND_TORQUE", 0}, - {"GMB_SYSID", 0}, - {"GMB_FLASH", 0}, -}; - -/* - find a parameter structure - */ -struct gimbal_param *Gimbal::param_find(const char *name) +void Gimbal::get_deltas(Vector3f &_delta_angle, Vector3f &_delta_velocity, uint32_t &_delta_time_us) { - for (uint8_t i=0; iname, sizeof(param_value.param_id)); - param_value.param_value = p->value; - param_value.param_count = 0; - param_value.param_index = 0; - param_value.param_type = MAV_PARAM_TYPE_REAL32; + const uint32_t now_us = AP_HAL::micros(); - uint16_t len = mavlink_msg_param_value_encode_status(vehicle_system_id, - vehicle_component_id, - &mavlink.status, - &msg, ¶m_value); + _delta_angle = delta_angle; + _delta_velocity = delta_velocity; + _delta_time_us = now_us - delta_start_us; - uint8_t msgbuf[len]; - len = mavlink_msg_to_send_buffer(msgbuf, &msg); - if (len > 0) { - mav_socket.send(msgbuf, len); - } -} - - -/* - send a report to the vehicle control code over MAVLink -*/ -void Gimbal::send_report(void) -{ - uint32_t now = AP_HAL::millis(); - if (now < 10000) { - // don't send gimbal reports until 10s after startup. This - // avoids a windows threading issue with non-blocking sockets - // and the initial wait on SERIAL0 - return; - } - if (!mavlink.connected && mav_socket.connect(target_address, target_port)) { - ::printf("Gimbal connected to %s:%u\n", target_address, (unsigned)target_port); - mavlink.connected = true; - } - if (!mavlink.connected) { - return; - } - - if (param_send_last_ms && now - param_send_last_ms > 100) { - param_send(&gimbal_params[param_send_idx]); - if (++param_send_idx == ARRAY_SIZE(gimbal_params)) { - printf("Finished sending parameters\n"); - param_send_last_ms = 0; - } - } - - // check for incoming MAVLink messages - uint8_t buf[100]; - ssize_t ret; - - while ((ret=mav_socket.recv(buf, sizeof(buf), 0)) > 0) { - for (uint8_t i=0; ivalue = pkt.param_value; - param_send(p); - } - - break; - } - case MAVLINK_MSG_ID_PARAM_REQUEST_LIST: { - mavlink_param_request_list_t pkt; - mavlink_msg_param_request_list_decode(&msg, &pkt); - if (pkt.target_system == 0 && pkt.target_component == MAV_COMP_ID_GIMBAL) { - // start param send - param_send_idx = 0; - param_send_last_ms = AP_HAL::millis(); - } - printf("Gimbal sending %u parameters\n", (unsigned)ARRAY_SIZE(gimbal_params)); - break; - } - default: - debug("got unexpected msg %u\n", msg.msgid); - break; - } - } - } - } - - if (!seen_heartbeat) { - return; - } - mavlink_message_t msg; - uint16_t len; - - if (now - last_heartbeat_ms >= 1000) { - mavlink_heartbeat_t heartbeat; - heartbeat.type = MAV_TYPE_GIMBAL; - heartbeat.autopilot = MAV_AUTOPILOT_ARDUPILOTMEGA; - heartbeat.base_mode = 0; - heartbeat.system_status = 0; - heartbeat.mavlink_version = 0; - heartbeat.custom_mode = 0; - - len = mavlink_msg_heartbeat_encode_status(vehicle_system_id, - vehicle_component_id, - &mavlink.status, - &msg, &heartbeat); - - mav_socket.send(&msg.magic, len); - last_heartbeat_ms = now; - } - - /* - send a GIMBAL_REPORT message - */ - uint32_t now_us = AP_HAL::micros(); - if (now_us - last_report_us > reporting_period_ms*1000UL) { - mavlink_gimbal_report_t gimbal_report; - float delta_time = (now_us - last_report_us) * 1.0e-6f; - last_report_us = now_us; - gimbal_report.target_system = vehicle_system_id; - gimbal_report.target_component = vehicle_component_id; - gimbal_report.delta_time = delta_time; - gimbal_report.delta_angle_x = delta_angle.x; - gimbal_report.delta_angle_y = delta_angle.y; - gimbal_report.delta_angle_z = delta_angle.z; - gimbal_report.delta_velocity_x = delta_velocity.x; - gimbal_report.delta_velocity_y = delta_velocity.y; - gimbal_report.delta_velocity_z = delta_velocity.z; - gimbal_report.joint_roll = joint_angles.x; - gimbal_report.joint_el = joint_angles.y; - gimbal_report.joint_az = joint_angles.z; - - len = mavlink_msg_gimbal_report_encode_status(vehicle_system_id, - vehicle_component_id, - &mavlink.status, - &msg, &gimbal_report); - - uint8_t msgbuf[len]; - len = mavlink_msg_to_send_buffer(msgbuf, &msg); - if (len > 0) { - mav_socket.send(msgbuf, len); - } - - delta_velocity.zero(); - delta_angle.zero(); - } + delta_angle.zero(); + delta_velocity.zero(); + delta_start_us = now_us; } } // namespace SITL -#endif // HAL_SIM_GIMBAL_ENABLED +#endif // AP_SIM_GIMBAL_ENABLED diff --git a/libraries/SITL/SIM_Gimbal.h b/libraries/SITL/SIM_Gimbal.h index 2cedd3a1cf..d3814383b6 100644 --- a/libraries/SITL/SIM_Gimbal.h +++ b/libraries/SITL/SIM_Gimbal.h @@ -18,32 +18,31 @@ #pragma once -#include +#include "SIM_config.h" -#ifndef HAL_SIM_GIMBAL_ENABLED -#define HAL_SIM_GIMBAL_ENABLED (CONFIG_HAL_BOARD == HAL_BOARD_SITL) && !defined(HAL_BUILD_AP_PERIPH) -#endif +#if AP_SIM_GIMBAL_ENABLED -#if HAL_SIM_GIMBAL_ENABLED - -#include - -#include "SIM_Aircraft.h" +#include +#include namespace SITL { class Gimbal { public: - Gimbal(const struct sitl_fdm &_fdm); - void update(void); + + void update(const class Aircraft &aircraft); + void set_demanded_rates(const Vector3f &rates) { + demanded_angular_rate = rates; + } + + void get_deltas(Vector3f &_delta_angle, Vector3f &_delta_velocity, uint32_t &_delta_time_us); + void get_joint_angles(Vector3f &_angles) { _angles = joint_angles; } private: - const struct sitl_fdm &fdm; - const char *target_address; - const uint16_t target_port; // rotation matrix (gimbal body -> earth) Matrix3f dcm; + bool init_done; // time of last update uint32_t last_update_us; @@ -63,19 +62,16 @@ private: Vector3f joint_angles; // physical constraints on joint angles in (roll, pitch, azimuth) order - Vector3f lower_joint_limits; - Vector3f upper_joint_limits; + Vector3f lower_joint_limits{radians(-40), radians(-135), radians(-7.5)}; + Vector3f upper_joint_limits{radians(40), radians(45), radians(7.5)}; - const float travelLimitGain; + const float travelLimitGain = 20; // true gyro bias Vector3f true_gyro_bias; - // reporting variables. gimbal pushes these to vehicle code over - // MAVLink at approx 100Hz - - // reporting period in ms - const float reporting_period_ms; + // time since delta angles/velocities returned + uint32_t delta_start_us; // integral of gyro vector over last time interval. In radians Vector3f delta_angle; @@ -92,32 +88,9 @@ private: // gyro bias provided by EKF on vehicle. In rad/s. // Should be subtracted from the gyro readings to get true body // rotatation rates - Vector3f supplied_gyro_bias; - - uint32_t last_report_us; - uint32_t last_heartbeat_ms; - bool seen_heartbeat; - bool seen_gimbal_control; - uint8_t vehicle_system_id; - uint8_t vehicle_component_id; - - SocketAPM_native mav_socket; - struct { - // socket to telem2 on aircraft - bool connected; - mavlink_message_t rxmsg; - mavlink_status_t status; - uint8_t seq; - } mavlink; - - uint32_t param_send_last_ms; - uint8_t param_send_idx; - - void send_report(void); - void param_send(const struct gimbal_param *p); - struct gimbal_param *param_find(const char *name); + // Vector3f supplied_gyro_bias; }; } // namespace SITL -#endif // HAL_SIM_GIMBAL_ENABLED +#endif // AP_SIM_GIMBAL_ENABLED diff --git a/libraries/SITL/SIM_Glider.cpp b/libraries/SITL/SIM_Glider.cpp index 5ac36148d4..a1334aac61 100644 --- a/libraries/SITL/SIM_Glider.cpp +++ b/libraries/SITL/SIM_Glider.cpp @@ -14,6 +14,26 @@ */ /* glider model for high altitude balloon drop + + controls: + - servo6: balloon lift, 1000 for no lift, 2000 for maximum lift + - servo10: balloon cut, this cuts away the balloon when high + + Note that the glider starts off in a lifted by tail pose, with pitch + -80 degrees. The balloon then lifts the glider above the ground. The + balloon automatically bursts at a height of SIM_GLD_BLN_BRST meters, + or can be cut away early with servo10. + + The maximum rate of the balloon lift is in SIM_GLD_BLN_RATE, in m/s + + To perform a takeoff first arm on the ground then use + servo set 6 2000 + to release the ground hold. Use this to cut away the balloon: + servo set 10 2000 + + For an automatic mission, NAV_ALTITUDE_WAIT should be used to wait + for a desired altitude under balloon lift. Then a DO_SET_SERVO with + servo 10 and a value of 2000 to cut away the balloon. */ #include "SIM_Glider.h" @@ -211,7 +231,7 @@ void Glider::calculate_forces(const struct sitl_input &input, Vector3f &rot_acce float aileron = 0.5*(filtered_servo_angle(input, 1) + filtered_servo_angle(input, 4)); float elevator = filtered_servo_angle(input, 2); float rudder = filtered_servo_angle(input, 3); - float balloon = filtered_servo_range(input, 5); + float balloon = MAX(0.0f, filtered_servo_range(input, 5)); // Don't let the balloon receive downwards commands. float balloon_cut = filtered_servo_range(input, 9); // Move balloon upwards using balloon velocity from channel 6 @@ -221,7 +241,7 @@ void Glider::calculate_forces(const struct sitl_input &input, Vector3f &rot_acce balloon_velocity = Vector3f(-wind_ef.x, -wind_ef.y, -wind_ef.z -balloon_rate * balloon); balloon_position += balloon_velocity * (1.0e-6 * (float)frame_time_us); const float height_AMSL = 0.01f * (float)home.alt - position.z; - // release at burst height or when channel 9 goes high + // release at burst height or when balloon cut output goes high if (hal.scheduler->is_system_initialized() && (height_AMSL > balloon_burst_amsl || balloon_cut > 0.8)) { GCS_SEND_TEXT(MAV_SEVERITY_INFO, "pre-release at %i m AMSL\n", (int)height_AMSL); @@ -360,7 +380,7 @@ bool Glider::update_balloon(float balloon, Vector3f &force, Vector3f &rot_accel) // NED unit vector pointing from tether attachment on plane to attachment on balloon Vector3f tether_unit_vec_ef = relative_position.normalized(); - // NED velocity of attahment point on plane + // NED velocity of attachment point on plane Vector3f attachment_velocity_ef = velocity_ef + dcm * (gyro % tether_pos_bf); // NED velocity of attachment point on balloon as seen by observer on attachemnt point on plane diff --git a/libraries/SITL/SIM_Helicopter.cpp b/libraries/SITL/SIM_Helicopter.cpp index f1ba61dc57..28727829e7 100644 --- a/libraries/SITL/SIM_Helicopter.cpp +++ b/libraries/SITL/SIM_Helicopter.cpp @@ -33,7 +33,7 @@ Helicopter::Helicopter(const char *frame_str) : _time_delay = 30; nominal_rpm = 1300; mass = 9.08f; - iyy = 0.2f; + iyy = 5.0f; } else if (strstr(frame_str, "-compound")) { frame_type = HELI_FRAME_COMPOUND; _time_delay = 50; @@ -218,7 +218,7 @@ void Helicopter::update(const struct sitl_input &input) case HELI_FRAME_DUAL: { - float Ma1s = 617.5f; + float Ma1s = 617.5f/5.0f; float Lb1s = 3588.6f; float Mu = 0.003f; float Lv = -0.006f; @@ -259,7 +259,7 @@ void Helicopter::update(const struct sitl_input &input) // rotational acceleration, in rad/s/s, in body frame rot_accel.x = (_tpp_angle_1.x + _tpp_angle_2.x) * Lb1s + Lv * velocity_air_bf.y; - rot_accel.y = (_tpp_angle_1.y + _tpp_angle_2.y) * Ma1s + (thrust_1 - thrust_2) * hub_dist / iyy + Mu * velocity_air_bf.x + hub_dist * gyro.y * Zw; + rot_accel.y = (_tpp_angle_1.y + _tpp_angle_2.y) * Ma1s + (thrust_1 - thrust_2) * hub_dist / iyy + Mu * velocity_air_bf.x; rot_accel.z = (_tpp_angle_1.x * thrust_1 - _tpp_angle_2.x * thrust_2) * hub_dist / (iyy * 2.0f) - 0.5f * gyro.z; lateral_y_thrust = GRAVITY_MSS * (_tpp_angle_1.x + _tpp_angle_2.x) + Yv * velocity_air_bf.y; diff --git a/libraries/SITL/SIM_JSON.cpp b/libraries/SITL/SIM_JSON.cpp index 95b51904c4..701d07621a 100644 --- a/libraries/SITL/SIM_JSON.cpp +++ b/libraries/SITL/SIM_JSON.cpp @@ -323,14 +323,15 @@ void JSON::recv_fdm(const struct sitl_input &input) airspeed_pitot = state.airspeed; } else { + + // wind is not supported yet for JSON sim, assume zero for now + wind_ef.zero(); + + // velocity relative to airmass in Earth's frame + velocity_air_ef = velocity_ef - wind_ef; + // velocity relative to airmass in body frame - velocity_air_bf = dcm.transposed() * velocity_ef; - - // airspeed - airspeed = velocity_air_bf.length(); - - // airspeed as seen by a fwd pitot tube (limited to 120m/s) - airspeed_pitot = constrain_float(velocity_air_bf * Vector3f(1.0f, 0.0f, 0.0f), 0.0f, 120.0f); + velocity_air_bf = dcm.transposed() * velocity_air_ef; // airspeed fix for eas2tas update_eas_airspeed(); diff --git a/libraries/SITL/SIM_LED_n.cpp b/libraries/SITL/SIM_LED_n.cpp new file mode 100644 index 0000000000..df721612f7 --- /dev/null +++ b/libraries/SITL/SIM_LED_n.cpp @@ -0,0 +1,97 @@ +#include "SIM_config.h" + +#if AP_SIM_LED_N_ENABLED + +#include "SIM_LED_n.h" + +#include + +#ifdef HAVE_SFML_GRAPHICS_H +#include +#else +#include +#endif + +#include + +template +void SIM_LED_n::update_thread(void) +{ + sf::RenderWindow *w = nullptr; + { + WITH_SEMAPHORE(AP::notify().sf_window_mutex); + w = NEW_NOTHROW sf::RenderWindow(sf::VideoMode(total_width, height), name); + w->clear(sf::Color(0, 0, 0, 255)); // blacken + } + + if (w == nullptr) { + AP_HAL::panic("Unable to create SIM_LED_n window"); + } + + while (true) { + { + WITH_SEMAPHORE(AP::notify().sf_window_mutex); + sf::Event event; + while (w->pollEvent(event)) { + if (event.type == sf::Event::Closed) { + w->close(); + break; + } + } + if (!w->isOpen()) { + break; + } + if (memcmp(new_state, last_state, sizeof(new_state)) != 0) { + memcpy(last_state, new_state, sizeof(last_state)); + w->clear(sf::Color(0, 0, 0, 255)); // blacken + sf::RectangleShape rectangle(sf::Vector2f(width, height)); + for (uint8_t i=0; idraw(rectangle); + } + w->display(); + } + } + usleep(10000); + } +} + +// trampoline for update thread +template +void *SIM_LED_n::update_thread_start(void *obj) +{ + ((SIM_LED_n *)obj)->update_thread(); + return nullptr; +} + +template +void SIM_LED_n::init() +{ + pthread_create(&thread, NULL, update_thread_start, this); +} + +template class SIM_LED_n<1>; +template class SIM_LED_n<2>; +template class SIM_LED_n<3>; + +#endif // AP_SIM_LED_N_ENABLED diff --git a/libraries/SITL/SIM_LED_n.h b/libraries/SITL/SIM_LED_n.h new file mode 100644 index 0000000000..c6f5da09b3 --- /dev/null +++ b/libraries/SITL/SIM_LED_n.h @@ -0,0 +1,62 @@ +#pragma once + +#include "SIM_config.h" + +#if AP_SIM_LED_N_ENABLED + +#include +#include + +/* + A class to create output of some description or another for a group + of N LEDs. + + Hopefully something visual, but perhaps just text +*/ + +template +class SIM_LED_n +{ +public: + enum class LEDColour : uint8_t { + RED, + GREEN, + BLUE, + YELLOW, + }; + + SIM_LED_n(const char *_name, const LEDColour _led_colours[NUM_LEDS]) : + name{_name} + { + memcpy(led_colours, _led_colours, sizeof(led_colours)); + } + + void set_state(const bool state[NUM_LEDS]) { + memcpy(new_state, state, sizeof(new_state)); + } + + void init(); + +private: + + const char *name; + LEDColour led_colours[NUM_LEDS]; + + static constexpr uint8_t height = 50; + static constexpr uint8_t width = height; + static constexpr uint8_t total_width = width * NUM_LEDS; + + pthread_t thread; + static void *update_thread_start(void *obj); + void update_thread(void); + + // state to be written to LEDs; note lack of thread protection. + bool new_state[NUM_LEDS]; + + // avoid too-frequent display updates: + bool last_state[NUM_LEDS]; + + const bool ON_VALUE = 0; // so if the pin is low we are lit +}; + +#endif // AP_SIM_LED_N_ENABLED diff --git a/libraries/SITL/SIM_MicroStrain.cpp b/libraries/SITL/SIM_MicroStrain.cpp index d56cc87fce..7cbff8263c 100644 --- a/libraries/SITL/SIM_MicroStrain.cpp +++ b/libraries/SITL/SIM_MicroStrain.cpp @@ -25,6 +25,7 @@ */ #include "SIM_MicroStrain.h" #include +#include #include #include #include diff --git a/libraries/SITL/SIM_MicroStrain.h b/libraries/SITL/SIM_MicroStrain.h index 80684f1ef4..84e3b261bc 100644 --- a/libraries/SITL/SIM_MicroStrain.h +++ b/libraries/SITL/SIM_MicroStrain.h @@ -6,6 +6,7 @@ #include #include "SIM_SerialDevice.h" +#include namespace SITL { diff --git a/libraries/SITL/SIM_Multicopter.cpp b/libraries/SITL/SIM_Multicopter.cpp index a866762593..4e019dde9b 100644 --- a/libraries/SITL/SIM_Multicopter.cpp +++ b/libraries/SITL/SIM_Multicopter.cpp @@ -48,6 +48,11 @@ void MultiCopter::calculate_forces(const struct sitl_input &input, Vector3f &rot add_shove_forces(rot_accel, body_accel); add_twist_forces(rot_accel); + +#if AP_SIM_SLUNGPAYLOAD_ENABLED + // add forces from slung payload + add_slungpayload_forces(body_accel); +#endif } /* diff --git a/libraries/SITL/SIM_RF_Wasp.cpp b/libraries/SITL/SIM_RF_Wasp.cpp index 48338346b0..cf8b2fb04e 100644 --- a/libraries/SITL/SIM_RF_Wasp.cpp +++ b/libraries/SITL/SIM_RF_Wasp.cpp @@ -57,7 +57,7 @@ void RF_Wasp::check_configuration() offs += 1; // for '>' offs += 1; // for space strncpy(string_configs[i].value, &_buffer[offs], MIN(ARRAY_SIZE(config.format), unsigned(cr - _buffer - offs - 1))); // -1 for the lf, -1 for the cr -// gcs().send_text(MAV_SEVERITY_INFO, "Wasp: config (%s) (%s)", string_configs[i].name, string_configs[i].value); +// GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Wasp: config (%s) (%s)", string_configs[i].name, string_configs[i].value); char response[128]; const size_t x = snprintf(response, ARRAY_SIZE(response), @@ -80,7 +80,7 @@ void RF_Wasp::check_configuration() char tmp[32]{}; strncpy(tmp, &_buffer[offs], MIN(ARRAY_SIZE(config.format), unsigned(cr - _buffer - offs - 1))); // -1 for the lf, -1 for the cr *(integer_configs[i].value) = atoi(tmp); -// gcs().send_text(MAV_SEVERITY_INFO, "Wasp: config (%s) (%d)", integer_configs[i].name, *(integer_configs[i].value)); +// GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Wasp: config (%s) (%d)", integer_configs[i].name, *(integer_configs[i].value)); char response[128]; const size_t x = snprintf(response, ARRAY_SIZE(response), diff --git a/libraries/SITL/SIM_Rover.cpp b/libraries/SITL/SIM_Rover.cpp index c1a7afb608..3182700dd9 100644 --- a/libraries/SITL/SIM_Rover.cpp +++ b/libraries/SITL/SIM_Rover.cpp @@ -21,6 +21,8 @@ #include #include +#include + namespace SITL { SimRover::SimRover(const char *frame_str) : @@ -41,11 +43,15 @@ SimRover::SimRover(const char *frame_str) : if (vectored_thrust) { printf("Vectored Thrust Rover Simulation Started\n"); } + + omni3 = strstr(frame_str, "omni3mecanum") != nullptr; + if (omni3) { + printf("Omni3 Mecanum Rover Simulation Started\n"); + } + lock_step_scheduled = true; } - - /* return turning circle (diameter) in meters for steering angle proportion in degrees */ @@ -93,55 +99,17 @@ float SimRover::calc_lat_accel(float steering_angle, float speed) */ void SimRover::update(const struct sitl_input &input) { - float steering, throttle; - - // if in skid steering mode the steering and throttle values are used for motor1 and motor2 - if (skid_steering) { - float motor1 = 2*((input.servos[0]-1000)/1000.0f - 0.5f); - float motor2 = 2*((input.servos[2]-1000)/1000.0f - 0.5f); - steering = motor1 - motor2; - throttle = 0.5*(motor1 + motor2); - } else { - steering = 2*((input.servos[0]-1000)/1000.0f - 0.5f); - throttle = 2*((input.servos[2]-1000)/1000.0f - 0.5f); - - // vectored thrust conversion - if (vectored_thrust) { - const float steering_angle_rad = radians(steering * vectored_angle_max); - steering = sinf(steering_angle_rad) * throttle; - throttle *= cosf(steering_angle_rad); - } - } - // how much time has passed? float delta_time = frame_time_us * 1.0e-6f; - // speed in m/s in body frame - Vector3f velocity_body = dcm.transposed() * velocity_ef; + // update gyro and accel_body according to frame type + if (omni3) { + update_omni3(input, delta_time); + } else { + update_ackermann_or_skid(input, delta_time); + } - // speed along x axis, +ve is forward - float speed = velocity_body.x; - - // yaw rate in degrees/s - float yaw_rate = calc_yaw_rate(steering, speed); - - // target speed with current throttle - float target_speed = throttle * max_speed; - - // linear acceleration in m/s/s - very crude model - float accel = max_accel * (target_speed - speed) / max_speed; - - gyro = Vector3f(0,0,radians(yaw_rate)); - - // update attitude - dcm.rotate(gyro * delta_time); - dcm.normalize(); - - // accel in body frame due to motor - accel_body = Vector3f(accel, 0, 0); - - // add in accel due to direction change - accel_body.y += radians(yaw_rate) * speed; + // common to all rovers // now in earth frame Vector3f accel_earth = dcm * accel_body; @@ -170,4 +138,126 @@ void SimRover::update(const struct sitl_input &input) update_mag_field_bf(); } +/* + update the ackermann or skid rover simulation by one time step + */ +void SimRover::update_ackermann_or_skid(const struct sitl_input &input, float delta_time) +{ + float steering, throttle; + + // if in skid steering mode the steering and throttle values are used for motor1 and motor2 + if (skid_steering) { + float motor1 = 2*((input.servos[0]-1000)/1000.0f - 0.5f); + float motor2 = 2*((input.servos[2]-1000)/1000.0f - 0.5f); + steering = motor1 - motor2; + throttle = 0.5*(motor1 + motor2); + } else { + steering = 2*((input.servos[0]-1000)/1000.0f - 0.5f); + throttle = 2*((input.servos[2]-1000)/1000.0f - 0.5f); + + // vectored thrust conversion + if (vectored_thrust) { + const float steering_angle_rad = radians(steering * vectored_angle_max); + steering = sinf(steering_angle_rad) * throttle; + throttle *= cosf(steering_angle_rad); + } + } + + // speed in m/s in body frame + Vector3f velocity_body = dcm.transposed() * velocity_ef; + + // speed along x axis, +ve is forward + float speed = velocity_body.x; + + // yaw rate in degrees/s + float yaw_rate = calc_yaw_rate(steering, speed); + + // target speed with current throttle + float target_speed = throttle * max_speed; + + // linear acceleration in m/s/s - very crude model + float accel = max_accel * (target_speed - speed) / max_speed; + + gyro = Vector3f(0,0,radians(yaw_rate)); + + // update attitude + dcm.rotate(gyro * delta_time); + dcm.normalize(); + + // accel in body frame due to motor (excluding gravity) + accel_body = Vector3f(accel, 0, 0); + + // add in accel due to direction change + accel_body.y += radians(yaw_rate) * speed; +} + +/* + update the omni3 rover simulation by one time step + */ +void SimRover::update_omni3(const struct sitl_input &input, float delta_time) +{ + // in omni3 mode the first three servos are motor speeds + float motor1 = 2*((input.servos[0]-1000)/1000.0f - 0.5f); + float motor2 = 2*((input.servos[1]-1000)/1000.0f - 0.5f); + float motor3 = 2*((input.servos[2]-1000)/1000.0f - 0.5f); + + // use forward kinematics to calculate body frame velocity + Vector3f wheel_ang_vel( + motor1 * omni3_wheel_max_ang_vel, + motor2 * omni3_wheel_max_ang_vel, + motor3 * omni3_wheel_max_ang_vel + ); + + // derivation of forward kinematics for an Omni3Mecanum rover + // A. Gfrerrer. "Geometry and kinematics of the Mecanum wheel", + // Computer Aided Geometric Design 25 (2008) 784–791. + // Retrieved from https://www.geometrie.tugraz.at/gfrerrer/publications/MecanumWheel.pdf. + // + // the frame is equilateral triangle + // + // d[i] = 0.18 m is distance from frame centre to each wheel + // r_w = 0.04725 m is the wheel radius. + // delta = radians(-45) is angle of the roller to the direction of forward rotation + // alpha[i] is the angle the wheel axis is rotated about the body z-axis + // c[i] = cos(alpha[i] + delta) + // s[i] = sin(alpha[i] + delta) + // + // wheel d[i] alpha[i] a_x[i] a_y[i] c[i] s[i] + // 1 0.18 1.04719 0.09 0.15588 0.965925 0.258819 + // 2 0.18 3.14159 -0.18 0.0 -0.707106 0.707106 + // 3 0.18 5.23598 0.09 -0.15588 -0.258819 -0.965925 + // + // k = 1/(r_w * sin(delta)) = -29.930445 is a scale factor + // + // inverse kinematic matrix + // M[i, 0] = k * c[i] + // M[i, 1] = k * s[i] + // M[i, 2] = k * (a_x[i] s[i] - a_y[i] c[i]) + // + // forward kinematics matrix: Minv = M^-1 + constexpr Matrix3f Minv( + -0.0215149, 0.01575, 0.0057649, + -0.0057649, -0.01575, 0.0215149, + 0.0875, 0.0875, 0.0875); + + // twist - this is the target linear and angular velocity + Vector3f twist = Minv * wheel_ang_vel; + + // speed in m/s in body frame + Vector3f velocity_body = dcm.transposed() * velocity_ef; + + // linear acceleration in m/s/s - very crude model + float accel_x = omni3_max_accel * (twist.x - velocity_body.x) / omni3_max_speed; + float accel_y = omni3_max_accel * (twist.y - velocity_body.y) / omni3_max_speed; + + gyro = Vector3f(0, 0, twist.z); + + // update attitude + dcm.rotate(gyro * delta_time); + dcm.normalize(); + + // accel in body frame due to motors (excluding gravity) + accel_body = Vector3f(accel_x, accel_y, 0); +} + } // namespace SITL diff --git a/libraries/SITL/SIM_Rover.h b/libraries/SITL/SIM_Rover.h index 42009a48a1..113bc55dfc 100644 --- a/libraries/SITL/SIM_Rover.h +++ b/libraries/SITL/SIM_Rover.h @@ -51,6 +51,15 @@ private: float vectored_angle_max = 90.0f; // maximum angle (in degrees) to which thrust can be turned float vectored_turn_rate_max = 90.0f; // maximum turn rate (in deg/sec) with full throttle angled at 90deg + // omni3 Mecanum related members + bool omni3; // true if vehicle is omni-directional with 3 Mecanum wheels + float omni3_max_speed = 2.3625f; // omni vehicle's maximum forward speed in m/s + float omni3_max_accel = 1.0f; // omni vehicle's maximum forward acceleration in m/s/s + float omni3_wheel_max_ang_vel = 50.0f; // omni vehicle's wheel maximum angular velocity in rad/s + + void update_ackermann_or_skid(const struct sitl_input &input, float delta_time); + void update_omni3(const struct sitl_input &input, float delta_time); + float turn_circle(float steering) const; float calc_yaw_rate(float steering, float speed); float calc_lat_accel(float steering_angle, float speed); diff --git a/libraries/SITL/SIM_Sailboat.cpp b/libraries/SITL/SIM_Sailboat.cpp index 7d3dba6745..846f077f43 100644 --- a/libraries/SITL/SIM_Sailboat.cpp +++ b/libraries/SITL/SIM_Sailboat.cpp @@ -32,6 +32,8 @@ namespace SITL { #define STEERING_SERVO_CH 0 // steering controlled by servo output 1 #define MAINSAIL_SERVO_CH 3 // main sail controlled by servo output 4 #define THROTTLE_SERVO_CH 2 // throttle controlled by servo output 3 +#define MOTORLEFT_SERVO_CH 0 // skid-steering left motor controlled by servo output 1 +#define MOTORRIGHT_SERVO_CH 2 // skid-steering right motor controlled by servo output 3 #define DIRECT_WING_SERVO_CH 4 // very roughly sort of a stability factors for waves @@ -45,6 +47,7 @@ Sailboat::Sailboat(const char *frame_str) : sail_area(1.0) { motor_connected = (strcmp(frame_str, "sailboat-motor") == 0); + skid_steering = strstr(frame_str, "skid") != nullptr; lock_step_scheduled = true; } @@ -97,13 +100,19 @@ float Sailboat::get_turn_circle(float steering) const // return yaw rate in deg/sec given a steering input (in the range -1 to +1) and speed in m/s float Sailboat::get_yaw_rate(float steering, float speed) const { - if (is_zero(steering) || is_zero(speed)) { - return 0; + float rate = 0.0f; + if (is_zero(steering) || (!skid_steering && is_zero(speed))) { + return rate; + } + + if (is_zero(speed) && skid_steering) { + rate = steering * M_PI * 5; + } else { + float d = get_turn_circle(steering); + float c = M_PI * d; + float t = c / speed; + rate = 360.0f / t; } - float d = get_turn_circle(steering); - float c = M_PI * d; - float t = c / speed; - float rate = 360.0f / t; return rate; } @@ -179,7 +188,14 @@ void Sailboat::update(const struct sitl_input &input) update_wind(input); // in sailboats the steering controls the rudder, the throttle controls the main sail position - float steering = 2*((input.servos[STEERING_SERVO_CH]-1000)/1000.0f - 0.5f); + float steering = 0.0f; + if (skid_steering) { + float steering_left = 2.0f*((input.servos[MOTORLEFT_SERVO_CH]-1000)/1000.0f - 0.5f); + float steering_right = 2.0f*((input.servos[MOTORRIGHT_SERVO_CH]-1000)/1000.0f - 0.5f); + steering = steering_left - steering_right; + } else { + steering = 2*((input.servos[STEERING_SERVO_CH]-1000)/1000.0f - 0.5f); + } // calculate apparent wind in earth-frame (this is the direction the wind is coming from) // Note than the SITL wind direction is defined as the direction the wind is travelling to @@ -257,8 +273,14 @@ void Sailboat::update(const struct sitl_input &input) // gives throttle force == hull drag at 10m/s float throttle_force = 0.0f; if (motor_connected) { - const uint16_t throttle_out = constrain_int16(input.servos[THROTTLE_SERVO_CH], 1000, 2000); - throttle_force = (throttle_out-1500) * 0.1f; + if (skid_steering) { + const uint16_t throttle_left = constrain_int16(input.servos[MOTORLEFT_SERVO_CH], 1000, 2000); + const uint16_t throttle_right = constrain_int16(input.servos[MOTORRIGHT_SERVO_CH], 1000, 2000); + throttle_force = (0.5f*(throttle_left + throttle_right)-1500) * 0.1f; + } else { + const uint16_t throttle_out = constrain_int16(input.servos[THROTTLE_SERVO_CH], 1000, 2000); + throttle_force = (throttle_out-1500) * 0.1f; + } } // accel in body frame due acceleration from sail and deceleration from hull friction diff --git a/libraries/SITL/SIM_Sailboat.h b/libraries/SITL/SIM_Sailboat.h index 4cb70e0448..e17d2c05dc 100644 --- a/libraries/SITL/SIM_Sailboat.h +++ b/libraries/SITL/SIM_Sailboat.h @@ -41,6 +41,7 @@ public: protected: bool motor_connected; // true if this frame has a motor + bool skid_steering; // true if this vehicle is a skid-steering vehicle float sail_area; // 1.0 for normal area private: diff --git a/libraries/SITL/SIM_SlungPayload.cpp b/libraries/SITL/SIM_SlungPayload.cpp new file mode 100644 index 0000000000..03b5363300 --- /dev/null +++ b/libraries/SITL/SIM_SlungPayload.cpp @@ -0,0 +1,458 @@ +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ +/* + simulate a slung payload +*/ + +#include "SIM_config.h" + +#if AP_SIM_SLUNGPAYLOAD_ENABLED + +#include "SIM_SlungPayload.h" +#include "SITL.h" +#include +#include "SIM_Aircraft.h" +#include +#include +#include + +using namespace SITL; + +// SlungPayloadSim parameters +const AP_Param::GroupInfo SlungPayloadSim::var_info[] = { + // @Param: ENABLE + // @DisplayName: Slung Payload Sim enable/disable + // @Description: Slung Payload Sim enable/disable + // @Values: 0:Disabled,1:Enabled + // @User: Advanced + AP_GROUPINFO_FLAGS("ENABLE", 1, SlungPayloadSim, enable, 0, AP_PARAM_FLAG_ENABLE), + + // @Param: WEIGHT + // @DisplayName: Slung Payload weight + // @Description: Slung Payload weight in kg + // @Units: kg + // @Range: 0 15 + // @User: Advanced + AP_GROUPINFO("WEIGHT", 2, SlungPayloadSim, weight_kg, 1.0), + + // @Param: LINELEN + // @DisplayName: Slung Payload line length + // @Description: Slung Payload line length in meters + // @Units: m + // @Range: 0 100 + // @User: Advanced + AP_GROUPINFO("LINELEN", 3, SlungPayloadSim, line_length, 30.0), + + // @Param: DRAG + // @DisplayName: Slung Payload drag coefficient + // @Description: Slung Payload drag coefficient. Higher values increase drag and slow the payload more quickly + // @Units: m + // @Range: 0 10 + // @User: Advanced + AP_GROUPINFO("DRAG", 4, SlungPayloadSim, drag_coef, 1), + + // @Param: SYSID + // @DisplayName: Slung Payload MAVLink system ID + // @Description: Slung Payload MAVLink system id to distinguish it from others on the same network + // @Range: 0 255 + // @User: Advanced + AP_GROUPINFO("SYSID", 5, SlungPayloadSim, sys_id, 2), + + AP_GROUPEND +}; + +// SlungPayloadSim handles interaction with main vehicle +SlungPayloadSim::SlungPayloadSim() +{ + AP_Param::setup_object_defaults(this, var_info); +} + +// update the SlungPayloadSim's state using the vehicle's earth-frame position, velocity and acceleration +void SlungPayloadSim::update(const Vector3p& veh_pos, const Vector3f& veh_vel_ef, const Vector3f& veh_accel_ef) +{ + if (!enable) { + return; + } + + // initialise slung payload location + const uint32_t now_us = AP_HAL::micros(); + if (!initialised) { + // capture EKF origin + auto *sitl = AP::sitl(); + const Location ekf_origin = sitl->state.home; + if (ekf_origin.lat == 0 && ekf_origin.lng == 0) { + return; + } + + // more initialisation + last_update_us = now_us; + initialised = true; + } + + // calculate dt and update slung payload + const float dt = (now_us - last_update_us)*1.0e-6; + last_update_us = now_us; + update_payload(veh_pos, veh_vel_ef, veh_accel_ef, dt); + + // send payload location to GCS at 5hz + const uint32_t now_ms = AP_HAL::millis(); + if (now_ms - last_report_ms >= reporting_period_ms) { + last_report_ms = now_ms; + send_report(); + write_log(); + } +} + +// get earth-frame forces on the vehicle from slung payload +// returns true on success and fills in forces_ef argument, false on failure +bool SlungPayloadSim::get_forces_on_vehicle(Vector3f& forces_ef) const +{ + if (!enable) { + return false; + } + + forces_ef = veh_forces_ef; + return true; +} + +// send a report to the vehicle control code over MAVLink +void SlungPayloadSim::send_report(void) +{ + if (!mavlink_connected && mav_socket.connect(target_address, target_port)) { + ::printf("SlungPayloadSim connected to %s:%u\n", target_address, (unsigned)target_port); + mavlink_connected = true; + } + if (!mavlink_connected) { + return; + } + + // get current time + uint32_t now_ms = AP_HAL::millis(); + + // send heartbeat at 1hz + const uint8_t component_id = MAV_COMP_ID_USER11; + if (now_ms - last_heartbeat_ms >= 1000) { + last_heartbeat_ms = now_ms; + + const mavlink_heartbeat_t heartbeat{ + custom_mode: 0, + type : MAV_TYPE_AIRSHIP, + autopilot : MAV_AUTOPILOT_INVALID, + base_mode: 0, + system_status: 0, + mavlink_version: 0, + }; + + mavlink_message_t msg; + mavlink_msg_heartbeat_encode_status( + sys_id.get(), + component_id, + &mav_status, + &msg, + &heartbeat); + uint8_t buf[300]; + const uint16_t len = mavlink_msg_to_send_buffer(buf, &msg); + mav_socket.send(buf, len); + } + + // send a GLOBAL_POSITION_INT messages + { + Location payload_loc; + int32_t alt_amsl_cm, alt_rel_cm; + if (!get_payload_location(payload_loc) || + !payload_loc.get_alt_cm(Location::AltFrame::ABSOLUTE, alt_amsl_cm) || + !payload_loc.get_alt_cm(Location::AltFrame::ABOVE_HOME, alt_rel_cm)) { + return; + } + const mavlink_global_position_int_t global_position_int{ + time_boot_ms: now_ms, + lat: payload_loc.lat, + lon: payload_loc.lng, + alt: alt_amsl_cm * 10, // amsl alt in mm + relative_alt: alt_rel_cm * 10, // relative alt in mm + vx: int16_t(velocity_NED.x * 100), // velocity in cm/s + vy: int16_t(velocity_NED.y * 100), // velocity in cm/s + vz: int16_t(velocity_NED.z * 100), // velocity in cm/s + hdg: 0 // heading in centi-degrees + }; + mavlink_message_t msg; + mavlink_msg_global_position_int_encode_status(sys_id, component_id, &mav_status, &msg, &global_position_int); + uint8_t buf[300]; + const uint16_t len = mavlink_msg_to_send_buffer(buf, &msg); + if (len > 0) { + mav_socket.send(buf, len); + } + } + + // send ATTITUDE so MissionPlanner can display orientation + { + const mavlink_attitude_t attitude{ + time_boot_ms: now_ms, + roll: 0, + pitch: 0, + yaw: 0, // heading in radians + rollspeed: 0, + pitchspeed: 0, + yawspeed: 0 + }; + mavlink_message_t msg; + mavlink_msg_attitude_encode_status( + sys_id, + component_id, + &mav_status, + &msg, + &attitude); + uint8_t buf[300]; + const uint16_t len = mavlink_msg_to_send_buffer(buf, &msg); + if (len > 0) { + mav_socket.send(buf, len); + } + } +} + +// write onboard log +void SlungPayloadSim::write_log() +{ +#if HAL_LOGGING_ENABLED + // write log of slung payload state + // @LoggerMessage: SLUP + // @Description: Slung payload + // @Field: TimeUS: Time since system startup + // @Field: Land: 1 if payload is landed, 0 otherwise + // @Field: Tens: Tension ratio, 1 if line is taut, 0 if slack + // @Field: Len: Line length + // @Field: PN: Payload position as offset from vehicle in North direction + // @Field: PE: Payload position as offset from vehicle in East direction + // @Field: PD: Payload position as offset from vehicle in Down direction + // @Field: VN: Payload velocity in North direction + // @Field: VE: Payload velocity in East direction + // @Field: VD: Payload velocity in Down direction + // @Field: AN: Payload acceleration in North direction + // @Field: AE: Payload acceleration in East direction + // @Field: AD: Payload acceleration in Down direction + // @Field: VFN: Force on vehicle in North direction + // @Field: VFE: Force on vehicle in East direction + // @Field: VFD: Force on vehicle in Down direction + AP::logger().WriteStreaming("SLUP", + "TimeUS,Land,Tens,Len,PN,PE,PD,VN,VE,VD,AN,AE,AD,VFN,VFE,VFD", // labels + "s-%mmmmnnnooo---", // units + "F-20000000000000", // multipliers + "Qbffffffffffffff", // format + AP_HAL::micros64(), + (uint8_t)landed, + (float)tension_ratio, + (float)payload_to_veh.length(), + (double)-payload_to_veh.x, + (double)-payload_to_veh.y, + (double)-payload_to_veh.z, + (double)velocity_NED.x, + (double)velocity_NED.y, + (double)velocity_NED.z, + (double)accel_NED.x, + (double)accel_NED.y, + (double)accel_NED.z, + (double)veh_forces_ef.x, + (double)veh_forces_ef.y, + (double)veh_forces_ef.z); +#endif +} + +// returns true on success and fills in payload_loc argument, false on failure +bool SlungPayloadSim::get_payload_location(Location& payload_loc) const +{ + // get EKF origin + auto *sitl = AP::sitl(); + if (sitl == nullptr) { + return false; + } + const Location ekf_origin = sitl->state.home; + if (ekf_origin.lat == 0 && ekf_origin.lng == 0) { + return false; + } + + // calculate location + payload_loc = ekf_origin; + payload_loc.offset(position_NED); + return true; +} + +// update the slung payloads position, velocity, acceleration +// vehicle position, velocity and acceleration should be in earth-frame NED frame +void SlungPayloadSim::update_payload(const Vector3p& veh_pos, const Vector3f& veh_vel_ef, const Vector3f& veh_accel_ef, float dt) +{ + // how we calculate the payload's position, velocity and acceleration + // 1. update the payload's position, velocity using the previous iterations acceleration + // 2. check that the payload does not fall below the terrain + // 3. check if the line is taught and that the payload does not move more than the line length from the vehicle + // 4. calculate gravity and drag forces on the payload + // 5. calculate the tension force between the payload and vehicle including force countering gravity, drag and centripetal force + // 6. update the payload's acceleration using the sum of the above forces + + // initialise position_NED from vehicle position + if (position_NED.is_zero()) { + if (!veh_pos.is_zero()) { + position_NED = veh_pos; + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "SlungPayload: initialised at %f %f %f", position_NED.x, position_NED.y, position_NED.z); + } + return; + } + + // integrate previous iterations acceleration into velocity and position + velocity_NED += accel_NED * dt; + position_NED += (velocity_NED * dt).todouble(); + + // calculate distance from payload to vehicle + payload_to_veh = veh_pos - position_NED; + float payload_to_veh_length = payload_to_veh.length(); + + // update landed state by checking if payload has dropped below terrain + Location payload_loc; + if (get_payload_location(payload_loc)) { + int32_t alt_terrain_cm; + bool landed_orig = landed; + if (payload_loc.get_alt_cm(Location::AltFrame::ABOVE_TERRAIN, alt_terrain_cm)) { + + // landed if below terrain + if (alt_terrain_cm <= 0) { + landed = true; + + // raise payload to match terrain + position_NED.z += (alt_terrain_cm * 0.01); + + // zero out velocity and acceleration in horizontal and downward direction + velocity_NED.xy().zero(); + velocity_NED.z = MIN(velocity_NED.z, 0); + accel_NED.xy().zero(); + accel_NED.z = MIN(accel_NED.z, 0); + + // zero out forces on vehicle + veh_forces_ef.zero(); + } + + // not landed if above terrain + if (landed && (alt_terrain_cm > 1)) { + landed = false; + } + } + + // inform user if landed state has changed + if (landed != landed_orig) { + if (landed) { + // get payload location again in case it has moved + get_payload_location(payload_loc); + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "SlungPayload: landed lat:%f lon:%f alt:%4.1f", + (double)payload_loc.lat * 1e-7, + (double)payload_loc.lng * 1e-7, + (double)payload_loc.alt * 1e-2); + } else { + GCS_SEND_TEXT(MAV_SEVERITY_INFO, "SlungPayload: liftoff"); + } + } + } + + // calculate forces of gravity + Vector3f force_gravity_NED = Vector3f(0.0f, 0.0f, GRAVITY_MSS * weight_kg); + + // tension force on payload (resists gravity, drag, centripetal force) + Vector3f tension_force_NED; + + // tension ratio to smooth transition from line being taut to slack + tension_ratio = 0; + + // calculate drag force (0.5 * drag_coef * air_density * velocity^2 * surface area) + Vector3f force_drag_NED; + if (drag_coef > 0 && !velocity_NED.is_zero()) { + const float air_density = 1.225; // 1.225 kg/m^3 (standard sea-level density) + const float surface_area_m2 = 0.07; // 30cm diameter sphere + const float drag_force = 0.5 * drag_coef * air_density * velocity_NED.length_squared() * surface_area_m2; + force_drag_NED = -velocity_NED.normalized() * drag_force; + } + + // sanity check payload distance from vehicle and calculate tension force + if (is_positive(payload_to_veh_length)) { + + // calculate unit vector from payload to vehicle + const Vector3f payload_to_veh_norm = payload_to_veh.normalized().tofloat(); + + // ensure payload is no more than line_length from vehicle + if (payload_to_veh_length > line_length) { + payload_to_veh *= (line_length / payload_to_veh_length); + position_NED = veh_pos - payload_to_veh; + } + + // calculate tension ratio as value between 0 and 1 + // tension ratio is 0 when payload-to-vehicle distance is 10cm less than line length + // tension ratio is 1 when payload-to-vehicle distance is equal to line length + tension_ratio = constrain_float(1.0 - (line_length - payload_to_veh_length) * 10, 0, 1); + + // calculate tension forces when line is taut + if (is_positive(tension_ratio)) { + + // tension resists gravity if vehicle is above payload + if (is_negative(payload_to_veh_norm.z)) { + tension_force_NED += -force_gravity_NED.projected(payload_to_veh_norm); + } + + // calculate tension force resulting from velocity difference between vehicle and payload + // use time constant to convert velocity to acceleration + const float velocity_to_accel_TC = 2.0; + Vector3f velocity_diff_NED = (veh_vel_ef - velocity_NED).projected(payload_to_veh_norm); + + // add to tension force if the vehicle is moving faster than the payload + if (vectors_same_direction(velocity_diff_NED, payload_to_veh_norm)) { + tension_force_NED += velocity_diff_NED / velocity_to_accel_TC * weight_kg; + } + + // tension force resisting payload drag + tension_force_NED += -force_drag_NED.projected(payload_to_veh_norm); + + // calculate centripetal force + const Vector3f velocity_parallel = velocity_NED.projected(payload_to_veh_norm); + const Vector3f velocity_perpendicular = velocity_NED - velocity_parallel; + const float tension_force_centripetal = velocity_perpendicular.length_squared() * weight_kg / line_length; + const Vector3f tension_force_centripetal_NED = payload_to_veh_norm * tension_force_centripetal; + + // add centripetal force to tension force + tension_force_NED += tension_force_centripetal_NED; + + // scale tension force by tension ratio + tension_force_NED *= tension_ratio; + } + } + + // force on vehicle is opposite to tension force on payload + veh_forces_ef = -tension_force_NED; + + // convert force to acceleration (f=m*a => a=f/m) + accel_NED = (force_gravity_NED + force_drag_NED + tension_force_NED) / weight_kg; + + // if slung payload is landed we zero out downward (e.g positive) acceleration + if (landed) { + accel_NED.z = MIN(accel_NED.z, 0); + // should probably zero out forces_ef vertical component as well? + } +} + +// returns true if the two vectors point in the same direction, false if perpendicular or opposite +bool SlungPayloadSim::vectors_same_direction(const Vector3f& v1, const Vector3f& v2) const +{ + // check both vectors are non-zero + if (v1.is_zero() || v2.is_zero()) { + return false; + } + return v1.dot(v2) > 0; +} + +#endif diff --git a/libraries/SITL/SIM_SlungPayload.h b/libraries/SITL/SIM_SlungPayload.h new file mode 100644 index 0000000000..3f668af547 --- /dev/null +++ b/libraries/SITL/SIM_SlungPayload.h @@ -0,0 +1,102 @@ +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ +/* + simulate a payload slung from a line under a vehicle +*/ + +#pragma once + +#include "SIM_config.h" + +#if AP_SIM_SLUNGPAYLOAD_ENABLED + +#include +#include +#include +#include + +namespace SITL { + +// SlungPayloadSim handles interaction with main vehicle +class SlungPayloadSim { +public: + friend class SlungPayload; + + // constructor + SlungPayloadSim(); + + // update the SlungPayloadSim's state using thevehicle's earth-frame position, velocity and acceleration + void update(const Vector3p& veh_pos, const Vector3f& veh_vel_ef, const Vector3f& veh_accel_ef); + + // get earth-frame forces on the vehicle from slung payload + // returns true on success and fills in forces_ef argument, false on failure + bool get_forces_on_vehicle(Vector3f& forces_ef) const; + + // parameter table + static const struct AP_Param::GroupInfo var_info[]; + +private: + + // parameters + AP_Int8 enable; // enable parameter + AP_Float weight_kg; // payload weight in kg + AP_Float line_length; // line length in meters + AP_Int8 sys_id; // mavlink system id for reporting to GCS + AP_Float drag_coef; // drag coefficient (spheres=0.5, cubes=1.05, barrels=0.8~1.2) + + // send MAVLink messages to GCS + void send_report(); + + // write onboard log + void write_log(); + + // get payload location + // returns true on success and fills in payload_loc argument, false on failure + bool get_payload_location(Location& payload_loc) const; + + // update the slung payload's position, velocity, acceleration + // vehicle position, velocity and acceleration should be in earth-frame NED frame + void update_payload(const Vector3p& veh_pos, const Vector3f& veh_vel_ef, const Vector3f& veh_accel_ef, float dt); + + // returns true if the two vectors point in the same direction, false if perpendicular or opposite + bool vectors_same_direction(const Vector3f& v1, const Vector3f& v2) const; + + // socket connection variables + const char *target_address = "127.0.0.1"; + const uint16_t target_port = 5763; + SocketAPM_native mav_socket { false }; + bool initialised; // true if this class has been initialised + uint32_t last_update_us; // system time of last update + + // mavlink reporting variables + const float reporting_period_ms = 200; // reporting period in ms + uint32_t last_report_ms; // system time of last MAVLink report sent to GCS + uint32_t last_heartbeat_ms; // system time of last MAVLink heartbeat sent to GCS + bool mavlink_connected; // true if a mavlink connection has been established + mavlink_status_t mav_status; // reported mavlink status + + // payload variables + bool landed = true; // true if the payload is on the ground + float tension_ratio; // 0 if line is loose, 1 if completely taut + Vector3p payload_to_veh;// distance vector (in meters in NED frame) from payload to vehicle (used for reporting purposes) + Vector3p position_NED; // payload's position (as an offset from EKF origin? offset from vehicle?) in meters + Vector3f velocity_NED; // payload velocity + Vector3f accel_NED; // payload's acceleration + Vector3f veh_forces_ef; // earth-frame forces on the vehicle caused by the payload +}; + +} // namespace SITL + +#endif // AP_SIM_SLUNGPAYLOAD_ENABLED diff --git a/libraries/SITL/SIM_SoloGimbal.cpp b/libraries/SITL/SIM_SoloGimbal.cpp new file mode 100644 index 0000000000..dccf157272 --- /dev/null +++ b/libraries/SITL/SIM_SoloGimbal.cpp @@ -0,0 +1,281 @@ +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ +/* + gimbal simulator class for MAVLink gimbal +*/ + +#include "SIM_SoloGimbal.h" + +#if AP_SIM_SOLOGIMBAL_ENABLED + +#include + +#include "SIM_Aircraft.h" + +extern const AP_HAL::HAL& hal; + +#define GIMBAL_DEBUG 0 + +#if GIMBAL_DEBUG +#define debug(fmt, args...) do { printf("GIMBAL: " fmt, ##args); } while(0) +#else +#define debug(fmt, args...) do { } while(0) +#endif + +namespace SITL { + +/* + update the gimbal state +*/ +void SoloGimbal::update(const Aircraft &aircraft) +{ + gimbal.update(aircraft); + + // see if we should do a report + send_report(); +} + +static struct gimbal_param { + const char *name; + float value; +} gimbal_params[] = { + {"GMB_OFF_ACC_X", 0}, + {"GMB_OFF_ACC_Y", 0}, + {"GMB_OFF_ACC_Z", 0}, + {"GMB_GN_ACC_X", 0}, + {"GMB_GN_ACC_Y", 0}, + {"GMB_GN_ACC_Z", 0}, + {"GMB_OFF_GYRO_X", 0}, + {"GMB_OFF_GYRO_Y", 0}, + {"GMB_OFF_GYRO_Z", 0}, + {"GMB_OFF_JNT_X", 0}, + {"GMB_OFF_JNT_Y", 0}, + {"GMB_OFF_JNT_Z", 0}, + {"GMB_K_RATE", 0}, + {"GMB_POS_HOLD", 0}, + {"GMB_MAX_TORQUE", 0}, + {"GMB_SND_TORQUE", 0}, + {"GMB_SYSID", 0}, + {"GMB_FLASH", 0}, +}; + +/* + find a parameter structure + */ +struct gimbal_param *SoloGimbal::param_find(const char *name) +{ + for (uint8_t i=0; iname, sizeof(param_value.param_id)); + param_value.param_value = p->value; + param_value.param_count = 0; + param_value.param_index = 0; + param_value.param_type = MAV_PARAM_TYPE_REAL32; + + uint16_t len = mavlink_msg_param_value_encode_status(vehicle_system_id, + gimbal_component_id, + &mavlink.status, + &msg, ¶m_value); + + uint8_t msgbuf[len]; + len = mavlink_msg_to_send_buffer(msgbuf, &msg); + if (len > 0) { + mav_socket.send(msgbuf, len); + } +} + + +/* + send a report to the vehicle control code over MAVLink +*/ +void SoloGimbal::send_report(void) +{ + uint32_t now = AP_HAL::millis(); + if (now < 10000) { + // don't send gimbal reports until 10s after startup. This + // avoids a windows threading issue with non-blocking sockets + // and the initial wait on SERIAL0 + return; + } + if (!mavlink.connected && mav_socket.connect(target_address, target_port)) { + ::printf("SoloGimbal connected to %s:%u\n", target_address, (unsigned)target_port); + mavlink.connected = true; + } + if (!mavlink.connected) { + return; + } + + if (param_send_last_ms && now - param_send_last_ms > 100) { + param_send(&gimbal_params[param_send_idx]); + if (++param_send_idx == ARRAY_SIZE(gimbal_params)) { + printf("Finished sending parameters\n"); + param_send_last_ms = 0; + } + } + + // check for incoming MAVLink messages + uint8_t buf[100]; + ssize_t ret; + + while ((ret=mav_socket.recv(buf, sizeof(buf), 0)) > 0) { + for (uint8_t i=0; ivalue = pkt.param_value; + param_send(p); + } + + break; + } + case MAVLINK_MSG_ID_PARAM_REQUEST_LIST: { + mavlink_param_request_list_t pkt; + mavlink_msg_param_request_list_decode(&msg, &pkt); + if (pkt.target_system == 0 && pkt.target_component == MAV_COMP_ID_GIMBAL) { + // start param send + param_send_idx = 0; + param_send_last_ms = AP_HAL::millis(); + } + printf("SoloGimbal sending %u parameters\n", (unsigned)ARRAY_SIZE(gimbal_params)); + break; + } + default: + debug("got unexpected msg %u\n", msg.msgid); + break; + } + } + } + } + + if (!seen_heartbeat) { + return; + } + mavlink_message_t msg; + uint16_t len; + + if (now - last_heartbeat_ms >= 1000) { + mavlink_heartbeat_t heartbeat; + heartbeat.type = MAV_TYPE_GIMBAL; + heartbeat.autopilot = MAV_AUTOPILOT_ARDUPILOTMEGA; + heartbeat.base_mode = 0; + heartbeat.system_status = 0; + heartbeat.mavlink_version = 0; + heartbeat.custom_mode = 0; + + len = mavlink_msg_heartbeat_encode_status(vehicle_system_id, + gimbal_component_id, + &mavlink.status, + &msg, &heartbeat); + + mav_socket.send(&msg.magic, len); + last_heartbeat_ms = now; + } + + /* + send a GIMBAL_REPORT message + */ + uint32_t now_us = AP_HAL::micros(); + if (now_us - last_report_us > reporting_period_ms*1000UL) { + last_report_us = now_us; + + uint32_t delta_time_us; + Vector3f delta_angle; + Vector3f delta_velocity; + gimbal.get_deltas(delta_angle, delta_velocity, delta_time_us); + + Vector3f joint_angles; + gimbal.get_joint_angles(joint_angles); + + mavlink_gimbal_report_t gimbal_report; + gimbal_report.target_system = vehicle_system_id; + gimbal_report.target_component = vehicle_component_id; + gimbal_report.delta_time = delta_time_us * 1e-6; + gimbal_report.delta_angle_x = delta_angle.x; + gimbal_report.delta_angle_y = delta_angle.y; + gimbal_report.delta_angle_z = delta_angle.z; + gimbal_report.delta_velocity_x = delta_velocity.x; + gimbal_report.delta_velocity_y = delta_velocity.y; + gimbal_report.delta_velocity_z = delta_velocity.z; + gimbal_report.joint_roll = joint_angles.x; + gimbal_report.joint_el = joint_angles.y; + gimbal_report.joint_az = joint_angles.z; + + len = mavlink_msg_gimbal_report_encode_status(vehicle_system_id, + gimbal_component_id, + &mavlink.status, + &msg, &gimbal_report); + + uint8_t msgbuf[len]; + len = mavlink_msg_to_send_buffer(msgbuf, &msg); + if (len > 0) { + mav_socket.send(msgbuf, len); + } + + delta_velocity.zero(); + delta_angle.zero(); + } +} + +} // namespace SITL + +#endif // AP_SIM_SOLOGIMBAL_ENABLED diff --git a/libraries/SITL/SIM_SoloGimbal.h b/libraries/SITL/SIM_SoloGimbal.h new file mode 100644 index 0000000000..d3fdb6d2d2 --- /dev/null +++ b/libraries/SITL/SIM_SoloGimbal.h @@ -0,0 +1,88 @@ +/* + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ +/* + gimbal simulator class + +./Tools/autotest/sim_vehicle.py -D -G -v ArduCopter --mavlink-gimbal +param set MNT1_TYPE 2 +param set RC6_OPTION 213 # MOUNT1_PITCH +rc 6 1818 # for neutral pitch input +*/ + +#pragma once + +#include "SIM_config.h" + +#if AP_SIM_SOLOGIMBAL_ENABLED + +#include "SIM_Gimbal.h" + +#include +#include +#include + +namespace SITL { + +class SoloGimbal { +public: + + SoloGimbal() {} + void update(const Aircraft &aicraft); + +private: + + const char *target_address = "127.0.0.1"; + const uint16_t target_port = 5762; + + // physic simulation of gimbal: + Gimbal gimbal; + + // reporting variables. gimbal pushes these to vehicle code over + // MAVLink at approx 100Hz + + // reporting period in ms + const float reporting_period_ms = 10; + + uint32_t last_report_us; + uint32_t last_heartbeat_ms; + bool seen_heartbeat; + bool seen_gimbal_control; + uint8_t vehicle_system_id; + uint8_t vehicle_component_id; + + SocketAPM_native mav_socket{false}; + struct { + // socket to telem2 on aircraft + bool connected; + mavlink_message_t rxmsg; + mavlink_status_t status; + uint8_t seq; + } mavlink; + + uint32_t param_send_last_ms; + uint8_t param_send_idx; + + // component ID we send from: + const uint8_t gimbal_component_id = 154; // MAV_COMP_ID_GIMBAL + + void send_report(void); + void param_send(const struct gimbal_param *p); + struct gimbal_param *param_find(const char *name); +}; + +} // namespace SITL + +#endif // AP_SIM_SOLOGIMBAL_ENABLED + diff --git a/libraries/SITL/SIM_ToshibaLED.cpp b/libraries/SITL/SIM_ToshibaLED.cpp index 7d54c7cc7f..82a55311a9 100644 --- a/libraries/SITL/SIM_ToshibaLED.cpp +++ b/libraries/SITL/SIM_ToshibaLED.cpp @@ -17,7 +17,7 @@ void SITL::ToshibaLED::update(const class Aircraft &aircraft) last_print_pwm1 = get_register(ToshibaLEDDevReg::PWM1); last_print_pwm2 = get_register(ToshibaLEDDevReg::PWM2); last_print_enable = get_register(ToshibaLEDDevReg::ENABLE); - // gcs().send_text(MAV_SEVERITY_INFO, "SIM_ToshibaLED: PWM0=%u PWM1=%u PWM2=%u ENABLE=%u", last_print_pwm0, last_print_pwm1, last_print_pwm2, last_print_enable); + // GCS_SEND_TEXT(MAV_SEVERITY_INFO, "SIM_ToshibaLED: PWM0=%u PWM1=%u PWM2=%u ENABLE=%u", last_print_pwm0, last_print_pwm1, last_print_pwm2, last_print_enable); if (get_register(ToshibaLEDDevReg::ENABLE)) { // here we convert from 0-15 BGR (the PWM values from the i2c bus) diff --git a/libraries/SITL/SIM_VectorNav.cpp b/libraries/SITL/SIM_VectorNav.cpp index 27c19be7f0..545445da46 100644 --- a/libraries/SITL/SIM_VectorNav.cpp +++ b/libraries/SITL/SIM_VectorNav.cpp @@ -18,6 +18,7 @@ #include "SIM_VectorNav.h" #include +#include #include #include #include @@ -29,37 +30,49 @@ VectorNav::VectorNav() : { } -struct PACKED VN_packet1 { - float uncompMag[3]; + +struct PACKED VN_IMU_packet_sim { + static constexpr uint8_t header[]{0x01, 0x21, 0x07}; + uint64_t timeStartup; + float gyro[3]; + float accel[3]; float uncompAccel[3]; float uncompAngRate[3]; - float pressure; float mag[3]; - float accel[3]; - float gyro[3]; + float temp; + float pressure; +}; +constexpr uint8_t VN_IMU_packet_sim::header[]; + +struct PACKED VN_INS_ekf_packet_sim { + static constexpr uint8_t header[]{0x31, 0x01, 0x00, 0x06, 0x01, 0x13, 0x06}; + uint64_t timeStartup; float ypr[3]; float quaternion[4]; float yprU[3]; - double positionLLA[3]; - float velNED[3]; + uint16_t insStatus; + double posLla[3]; + float velNed[3]; float posU; float velU; }; +constexpr uint8_t VN_INS_ekf_packet_sim::header[]; -struct PACKED VN_packet2 { - uint64_t timeGPS; - float temp; - uint8_t numGPS1Sats; - uint8_t GPS1Fix; - double GPS1posLLA[3]; - float GPS1velNED[3]; - float GPS1DOP[7]; - uint8_t numGPS2Sats; - uint8_t GPS2Fix; +struct PACKED VN_INS_gnss_packet_sim { + static constexpr uint8_t header[]{0x49, 0x03, 0x00, 0xB8, 0x26, 0x18, 0x00}; + uint64_t timeStartup; + uint64_t timeGps; + uint8_t numSats1; + uint8_t fix1; + double posLla1[3]; + float velNed1[3]; + float posU1[3]; + float velU1; + float dop1[7]; + uint8_t numSats2; + uint8_t fix2; }; - -#define VN_PKT1_HEADER { 0xFA, 0x34, 0x2E, 0x07, 0x06, 0x01, 0x12, 0x06 } -#define VN_PKT2_HEADER { 0xFA, 0x4E, 0x02, 0x00, 0x10, 0x00, 0xB8, 0x20, 0x18, 0x00 } +constexpr uint8_t VN_INS_gnss_packet_sim::header[]; /* get timeval using simulation time @@ -80,36 +93,62 @@ static void simulation_timeval(struct timeval *tv) tv->tv_usec = new_usec % 1000000ULL; } -void VectorNav::send_packet1(void) +void VectorNav::send_imu_packet(void) { const auto &fdm = _sitl->state; - struct VN_packet1 pkt {}; + struct VN_IMU_packet_sim pkt {}; + + pkt.timeStartup = AP_HAL::micros() * 1e3; + + + const float gyro_noise = 0.05; + + pkt.gyro[0] = radians(fdm.rollRate + rand_float() * gyro_noise); + pkt.gyro[1] = radians(fdm.pitchRate + rand_float() * gyro_noise); + pkt.gyro[2] = radians(fdm.yawRate + rand_float() * gyro_noise); + + pkt.accel[0] = fdm.xAccel; + pkt.accel[1] = fdm.yAccel; + pkt.accel[2] = fdm.zAccel; pkt.uncompAccel[0] = fdm.xAccel; pkt.uncompAccel[1] = fdm.yAccel; pkt.uncompAccel[2] = fdm.zAccel; - const float gyro_noise = 0.05; + pkt.uncompAngRate[0] = radians(fdm.rollRate + gyro_noise * rand_float()); pkt.uncompAngRate[1] = radians(fdm.pitchRate + gyro_noise * rand_float()); pkt.uncompAngRate[2] = radians(fdm.yawRate + gyro_noise * rand_float()); - const float pressure_Pa = AP_Baro::get_pressure_for_alt_amsl(fdm.altitude); - pkt.pressure = pressure_Pa*0.001 + rand_float() * 0.01; - pkt.mag[0] = fdm.bodyMagField.x*0.001; pkt.mag[1] = fdm.bodyMagField.y*0.001; pkt.mag[2] = fdm.bodyMagField.z*0.001; - pkt.uncompMag[0] = pkt.mag[0]; - pkt.uncompMag[1] = pkt.mag[1]; - pkt.uncompMag[2] = pkt.mag[2]; - pkt.accel[0] = fdm.xAccel; - pkt.accel[1] = fdm.yAccel; - pkt.accel[2] = fdm.zAccel; - pkt.gyro[0] = radians(fdm.rollRate + rand_float() * gyro_noise); - pkt.gyro[1] = radians(fdm.pitchRate + rand_float() * gyro_noise); - pkt.gyro[2] = radians(fdm.yawRate + rand_float() * gyro_noise); + pkt.temp = AP_Baro::get_temperatureC_for_alt_amsl(fdm.altitude); + + const float pressure_Pa = AP_Baro::get_pressure_for_alt_amsl(fdm.altitude); + pkt.pressure = pressure_Pa*0.001 + rand_float() * 0.01; + + const uint8_t sync_byte = 0xFA; + write_to_autopilot((const char *)&sync_byte, 1); + write_to_autopilot((const char *)&VN_IMU_packet_sim::header, sizeof(VN_IMU_packet_sim::header)); + write_to_autopilot((const char *)&pkt, sizeof(pkt)); + + uint16_t crc = crc16_ccitt(&VN_IMU_packet_sim::header[0], sizeof(VN_IMU_packet_sim::header), 0); + crc = crc16_ccitt((const uint8_t *)&pkt, sizeof(pkt), crc); + uint16_t crc2; + swab(&crc, &crc2, 2); + + write_to_autopilot((const char *)&crc2, sizeof(crc2)); +} + +void VectorNav::send_ins_ekf_packet(void) +{ + const auto &fdm = _sitl->state; + + struct VN_INS_ekf_packet_sim pkt {}; + + pkt.timeStartup = AP_HAL::micros() * 1e3; pkt.ypr[0] = fdm.yawDeg; pkt.ypr[1] = fdm.pitchDeg; @@ -120,64 +159,80 @@ void VectorNav::send_packet1(void) pkt.quaternion[2] = fdm.quaternion.q4; pkt.quaternion[3] = fdm.quaternion.q1; - pkt.positionLLA[0] = fdm.latitude; - pkt.positionLLA[1] = fdm.longitude; - pkt.positionLLA[2] = fdm.altitude; - pkt.velNED[0] = fdm.speedN; - pkt.velNED[1] = fdm.speedE; - pkt.velNED[2] = fdm.speedD; + pkt.yprU[0] = 0.03; + pkt.yprU[1] = 0.03; + pkt.yprU[2] = 0.15; + + pkt.insStatus = 0x0306; + + pkt.posLla[0] = fdm.latitude; + pkt.posLla[1] = fdm.longitude; + pkt.posLla[2] = fdm.altitude; + pkt.velNed[0] = fdm.speedN; + pkt.velNed[1] = fdm.speedE; + pkt.velNed[2] = fdm.speedD; pkt.posU = 0.5; pkt.velU = 0.25; - const uint8_t header[] VN_PKT1_HEADER; + const uint8_t sync_byte = 0xFA; + write_to_autopilot((const char *)&sync_byte, 1); + write_to_autopilot((const char *)&VN_INS_ekf_packet_sim::header, sizeof(VN_INS_ekf_packet_sim::header)); + write_to_autopilot((const char *)&pkt, sizeof(pkt)); - write_to_autopilot((char *)&header, sizeof(header)); - write_to_autopilot((char *)&pkt, sizeof(pkt)); - - uint16_t crc = crc16_ccitt(&header[1], sizeof(header)-1, 0); + uint16_t crc = crc16_ccitt(&VN_INS_ekf_packet_sim::header[0], sizeof(VN_INS_ekf_packet_sim::header), 0); crc = crc16_ccitt((const uint8_t *)&pkt, sizeof(pkt), crc); + uint16_t crc2; swab(&crc, &crc2, 2); - write_to_autopilot((char *)&crc2, sizeof(crc2)); + write_to_autopilot((const char *)&crc2, sizeof(crc2)); } -void VectorNav::send_packet2(void) +void VectorNav::send_ins_gnss_packet(void) { const auto &fdm = _sitl->state; - struct VN_packet2 pkt {}; + struct VN_INS_gnss_packet_sim pkt {}; + + pkt.timeStartup = AP_HAL::micros() * 1e3; struct timeval tv; simulation_timeval(&tv); - pkt.timeGPS = tv.tv_usec * 1000ULL; + pkt.timeGps = tv.tv_usec * 1000ULL; - pkt.temp = AP_Baro::get_temperatureC_for_alt_amsl(fdm.altitude); - pkt.numGPS1Sats = 19; - pkt.GPS1Fix = 3; - pkt.GPS1posLLA[0] = fdm.latitude; - pkt.GPS1posLLA[1] = fdm.longitude; - pkt.GPS1posLLA[2] = fdm.altitude; - pkt.GPS1velNED[0] = fdm.speedN; - pkt.GPS1velNED[1] = fdm.speedE; - pkt.GPS1velNED[2] = fdm.speedD; - // pkt.GPS1DOP = - pkt.numGPS2Sats = 18; - pkt.GPS2Fix = 3; + pkt.numSats1 = 19; + pkt.fix1 = 3; + pkt.posLla1[0] = fdm.latitude; + pkt.posLla1[1] = fdm.longitude; + pkt.posLla1[2] = fdm.altitude; + pkt.velNed1[0] = fdm.speedN; + pkt.velNed1[1] = fdm.speedE; + pkt.velNed1[2] = fdm.speedD; - const uint8_t header[] VN_PKT2_HEADER; + pkt.posU1[0] = 1; + pkt.posU1[0] = 1; + pkt.posU1[0] = 1.5; - write_to_autopilot((char *)&header, sizeof(header)); - write_to_autopilot((char *)&pkt, sizeof(pkt)); + pkt.velNed1[0] = 0.05; + pkt.velNed1[0] = 0.05; + pkt.velNed1[0] = 0.05; + // pkt.dop1 = + pkt.numSats2 = 18; + pkt.fix2 = 3; - uint16_t crc = crc16_ccitt(&header[1], sizeof(header)-1, 0); + const uint8_t sync_byte = 0xFA; + write_to_autopilot((const char *)&sync_byte, 1); + write_to_autopilot((const char *)&VN_INS_gnss_packet_sim::header, sizeof(VN_INS_gnss_packet_sim::header)); + write_to_autopilot((const char *)&pkt, sizeof(pkt)); + + uint16_t crc = crc16_ccitt(&VN_INS_gnss_packet_sim::header[0], sizeof(VN_INS_gnss_packet_sim::header), 0); crc = crc16_ccitt((const uint8_t *)&pkt, sizeof(pkt), crc); uint16_t crc2; swab(&crc, &crc2, 2); - write_to_autopilot((char *)&crc2, sizeof(crc2)); + write_to_autopilot((const char *)&crc2, sizeof(crc2)); } void VectorNav::nmea_printf(const char *fmt, ...) @@ -203,22 +258,40 @@ void VectorNav::update(void) } uint32_t now = AP_HAL::micros(); - if (now - last_pkt1_us >= 20000) { - last_pkt1_us = now; - send_packet1(); + if (now - last_imu_pkt_us >= 20000) { + last_imu_pkt_us = now; + send_imu_packet(); + } + + if (now - last_ekf_pkt_us >= 20000) { + last_ekf_pkt_us = now; + send_ins_ekf_packet(); + } + + if (now - last_gnss_pkt_us >= 200000) { + last_gnss_pkt_us = now; + send_ins_gnss_packet(); } - if (now - last_pkt2_us >= 200000) { - last_pkt2_us = now; - send_packet2(); + char receive_buf[50]; + ssize_t n = read_from_autopilot(&receive_buf[0], ARRAY_SIZE(receive_buf)); + if (n <= 0) { + return; } - // Strictly we should send this in responce to the request - // but sending it occasionally acheaves the same thing - if (now - last_type_us >= 1000000) { - last_type_us = now; - nmea_printf("$VNRRG,01,VN-300-SITL"); + // avoid parsing the NMEA stream here by making assumptions about + // how we receive configuration strings. Generally we can just + // echo back the configuration string to make the driver happy. + if (n >= 9) { + // intercept device-version query, respond with simulated version: + const char *ver_query_string = "$VNRRG,01"; + if (strncmp(receive_buf, ver_query_string, strlen(ver_query_string)) == 0) { + nmea_printf("$VNRRG,01,VN-300-SITL"); + // consume the query so we don't "respond" twice: + memmove(&receive_buf[0], &receive_buf[strlen(ver_query_string)], n - strlen(ver_query_string)); + n -= strlen(ver_query_string); + } } - + write_to_autopilot(receive_buf, n); } diff --git a/libraries/SITL/SIM_VectorNav.h b/libraries/SITL/SIM_VectorNav.h index 589539e5d9..77fde25625 100644 --- a/libraries/SITL/SIM_VectorNav.h +++ b/libraries/SITL/SIM_VectorNav.h @@ -41,12 +41,13 @@ public: void update(void); private: - uint32_t last_pkt1_us; - uint32_t last_pkt2_us; - uint32_t last_type_us; + uint32_t last_imu_pkt_us; + uint32_t last_ekf_pkt_us; + uint32_t last_gnss_pkt_us; - void send_packet1(); - void send_packet2(); + void send_imu_packet(); + void send_ins_ekf_packet(); + void send_ins_gnss_packet(); void nmea_printf(const char *fmt, ...); }; diff --git a/libraries/SITL/SIM_config.h b/libraries/SITL/SIM_config.h index d5f6a00192..8ec2d7ff42 100644 --- a/libraries/SITL/SIM_config.h +++ b/libraries/SITL/SIM_config.h @@ -23,6 +23,26 @@ #define AP_SIM_IS31FL3195_ENABLED (CONFIG_HAL_BOARD == HAL_BOARD_SITL) #endif +#ifndef AP_SIM_LED_N_ENABLED +#define AP_SIM_LED_N_ENABLED (CONFIG_HAL_BOARD == HAL_BOARD_SITL) && defined(WITH_SITL_RGBLED) +#endif + +#ifndef AP_SIM_GPIO_LED_1_ENABLED +#define AP_SIM_GPIO_LED_1_ENABLED AP_SIM_LED_N_ENABLED && 0 +#endif + +#ifndef AP_SIM_GPIO_LED_2_ENABLED +#define AP_SIM_GPIO_LED_2_ENABLED AP_SIM_LED_N_ENABLED && 0 +#endif + +#ifndef AP_SIM_GPIO_LED_3_ENABLED +#define AP_SIM_GPIO_LED_3_ENABLED AP_SIM_LED_N_ENABLED && 0 +#endif + +#ifndef AP_SIM_GPIO_LED_RGB_ENABLED +#define AP_SIM_GPIO_LED_RGB_ENABLED AP_SIM_LED_N_ENABLED && 0 +#endif + #ifndef AP_SIM_LOWEHEISER_ENABLED #define AP_SIM_LOWEHEISER_ENABLED AP_SIM_ENABLED && HAL_MAVLINK_BINDINGS_ENABLED #endif @@ -31,6 +51,10 @@ #define AP_SIM_SHIP_ENABLED (CONFIG_HAL_BOARD == HAL_BOARD_SITL) #endif +#ifndef AP_SIM_SLUNGPAYLOAD_ENABLED +#define AP_SIM_SLUNGPAYLOAD_ENABLED (CONFIG_HAL_BOARD == HAL_BOARD_SITL) +#endif + #ifndef AP_SIM_TSYS03_ENABLED #define AP_SIM_TSYS03_ENABLED (CONFIG_HAL_BOARD == HAL_BOARD_SITL) #endif @@ -101,3 +125,12 @@ #ifndef AP_SIM_GLIDER_ENABLED #define AP_SIM_GLIDER_ENABLED (CONFIG_HAL_BOARD == HAL_BOARD_SITL) #endif + +#ifndef AP_SIM_SOLOGIMBAL_ENABLED +#define AP_SIM_SOLOGIMBAL_ENABLED (CONFIG_HAL_BOARD == HAL_BOARD_SITL && HAL_MAVLINK_BINDINGS_ENABLED) +#endif + +#ifndef AP_SIM_GIMBAL_ENABLED +#define AP_SIM_GIMBAL_ENABLED (AP_SIM_SOLOGIMBAL_ENABLED) +#endif + diff --git a/libraries/SITL/SITL.cpp b/libraries/SITL/SITL.cpp index 9b895dc8a6..ee9d59f281 100644 --- a/libraries/SITL/SITL.cpp +++ b/libraries/SITL/SITL.cpp @@ -68,6 +68,10 @@ const AP_Param::GroupInfo SIM::var_info[] = { AP_GROUPINFO("DRIFT_SPEED", 5, SIM, drift_speed, 0.05f), AP_GROUPINFO("DRIFT_TIME", 6, SIM, drift_time, 5), + // @Param: ENGINE_MUL + // @DisplayName: Engine failure thrust scaler + // @Description: Thrust from Motors in SIM_ENGINE_FAIL will be multiplied by this factor + // @Units: ms AP_GROUPINFO("ENGINE_MUL", 8, SIM, engine_mul, 1), // @Param: WIND_SPD // @DisplayName: Simulated Wind speed @@ -133,7 +137,7 @@ const AP_Param::GroupInfo SIM::var_info[] = { // @Param: CAN_TYPE1 // @DisplayName: transport type for first CAN interface // @Description: transport type for first CAN interface - // @Values: 0:MulticastUDP,1:SocketCAN + // @Values: 0:None,1:MulticastUDP,2:SocketCAN // @User: Advanced AP_GROUPINFO("CAN_TYPE1", 30, SIM, can_transport[0], uint8_t(CANTransport::MulticastUDP)), #endif @@ -142,7 +146,7 @@ const AP_Param::GroupInfo SIM::var_info[] = { // @Param: CAN_TYPE2 // @DisplayName: transport type for second CAN interface // @Description: transport type for second CAN interface - // @Values: 0:MulticastUDP,1:SocketCAN + // @Values: 0:None,1:MulticastUDP,2:SocketCAN // @User: Advanced AP_GROUPINFO("CAN_TYPE2", 31, SIM, can_transport[1], uint8_t(CANTransport::MulticastUDP)), #endif @@ -189,6 +193,10 @@ const AP_Param::GroupInfo SIM::var_info[] = { // @Units: m // @Vector3Parameter: 1 AP_GROUPINFO("FLOW_POS", 56, SIM, optflow_pos_offset, 0), + // @Param: ENGINE_FAIL + // @DisplayName: Engine Fail Mask + // @Description: mask of motors which SIM_ENGINE_MUL will be applied to + // @Bitmask: 0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8 AP_GROUPINFO("ENGINE_FAIL", 58, SIM, engine_fail, 0), AP_SUBGROUPINFO(models, "", 59, SIM, SIM::ModelParm), AP_SUBGROUPEXTENSION("", 60, SIM, var_mag), @@ -207,6 +215,11 @@ const AP_Param::GroupInfo SIM::var_info2[] = { AP_GROUPINFO("TEMP_TCONST", 3, SIM, temp_tconst, 30), AP_GROUPINFO("TEMP_BFACTOR", 4, SIM, temp_baro_factor, 0), + // @Param: WIND_DIR_Z + // @DisplayName: Simulated wind vertical direction + // @Description: Allows you to set vertical wind direction (true deg) in sim. 0 means pure horizontal wind. 90 means pure updraft. + // @Units: deg + // @User: Advanced AP_GROUPINFO("WIND_DIR_Z", 10, SIM, wind_dir_z, 0), // @Param: WIND_T // @DisplayName: Wind Profile Type @@ -919,11 +932,21 @@ const AP_Param::GroupInfo SIM::var_ins[] = { #if INS_MAX_INSTANCES > 2 AP_GROUPINFO("GYR3_RND", 10, SIM, gyro_noise[2], 0), #endif + // @Param: ACC1_RND + // @DisplayName: Accel 1 motor noise factor + // @Description: scaling factor for simulated vibration from motors + // @User: Advanced AP_GROUPINFO("ACC1_RND", 11, SIM, accel_noise[0], 0), #if INS_MAX_INSTANCES > 1 + // @Param: ACC2_RND + // @DisplayName: Accel 2 motor noise factor + // @CopyFieldsFrom: SIM_ACC1_RND AP_GROUPINFO("ACC2_RND", 12, SIM, accel_noise[1], 0), #endif #if INS_MAX_INSTANCES > 2 + // @Param: ACC3_RND + // @DisplayName: Accel 3 motor noise factor + // @CopyFieldsFrom: SIM_ACC1_RND AP_GROUPINFO("ACC3_RND", 13, SIM, accel_noise[2], 0), #endif // @Param: GYR1_SCALE @@ -1101,6 +1124,9 @@ const AP_Param::GroupInfo SIM::var_ins[] = { // @Vector3Parameter: 1 AP_GROUPINFO("GYR4_SCALE", 36, SIM, gyro_scale[3], 0), + // @Param: ACC4_RND + // @DisplayName: Accel 4 motor noise factor + // @CopyFieldsFrom: SIM_ACC1_RND AP_GROUPINFO("ACC4_RND", 37, SIM, accel_noise[3], 0), AP_GROUPINFO("GYR4_RND", 38, SIM, gyro_noise[3], 0), @@ -1151,6 +1177,9 @@ const AP_Param::GroupInfo SIM::var_ins[] = { // @Vector3Parameter: 1 AP_GROUPINFO("GYR5_SCALE", 43, SIM, gyro_scale[4], 0), + // @Param: ACC5_RND + // @DisplayName: Accel 5 motor noise factor + // @CopyFieldsFrom: SIM_ACC1_RND AP_GROUPINFO("ACC5_RND", 44, SIM, accel_noise[4], 0), AP_GROUPINFO("GYR5_RND", 45, SIM, gyro_noise[4], 0), @@ -1228,6 +1257,12 @@ const AP_Param::GroupInfo SIM::ModelParm::var_info[] = { AP_SUBGROUPPTR(glider_ptr, "GLD_", 3, SIM::ModelParm, Glider), #endif +#if AP_SIM_SLUNGPAYLOAD_ENABLED + // @Group: SLUP_ + // @Path: ./SIM_SlungPayload.cpp + AP_SUBGROUPINFO(slung_payload_sim, "SLUP_", 4, SIM::ModelParm, SlungPayloadSim), +#endif + AP_GROUPEND }; diff --git a/libraries/SITL/SITL.h b/libraries/SITL/SITL.h index fdf3bddf5d..d3ad9ebbd9 100644 --- a/libraries/SITL/SITL.h +++ b/libraries/SITL/SITL.h @@ -27,6 +27,7 @@ #include "SIM_FETtecOneWireESC.h" #include "SIM_IntelligentEnergy24.h" #include "SIM_Ship.h" +#include "SIM_SlungPayload.h" #include "SIM_GPS.h" #include "SIM_DroneCANDevice.h" #include "SIM_ADSB_Sagetech_MXS.h" @@ -229,8 +230,9 @@ public: #if HAL_NUM_CAN_IFACES enum class CANTransport : uint8_t { - MulticastUDP = 0, - SocketCAN = 1 + None = 0, + MulticastUDP = 1, + SocketCAN = 2, }; AP_Enum can_transport[HAL_NUM_CAN_IFACES]; #endif @@ -321,6 +323,9 @@ public: #endif #if AP_SIM_GLIDER_ENABLED Glider *glider_ptr; +#endif +#if AP_SIM_SLUNGPAYLOAD_ENABLED + SlungPayloadSim slung_payload_sim; #endif }; ModelParm models; diff --git a/libraries/SRV_Channel/SRV_Channels.cpp b/libraries/SRV_Channel/SRV_Channels.cpp index 54b86b0254..67a9af5b00 100644 --- a/libraries/SRV_Channel/SRV_Channels.cpp +++ b/libraries/SRV_Channel/SRV_Channels.cpp @@ -229,7 +229,7 @@ const AP_Param::GroupInfo SRV_Channels::var_info[] = { // @Param: _DSHOT_ESC // @DisplayName: Servo DShot ESC type // @Description: DShot ESC type for all outputs. The ESC type affects the range of DShot commands available and the bit widths used. None means that no dshot commands will be executed. Some ESC types support Extended DShot Telemetry (EDT) which allows telemetry other than RPM data to be returned when using bi-directional dshot. If you enable EDT you must install EDT capable firmware for correct operation. - // @Values: 0:None,1:BLHeli32/Kiss,2:BLHeli_S,3:BLHeli32/Kiss+EDT,4:BLHeli_S+EDT + // @Values: 0:None,1:BLHeli32/Kiss/AM32,2:BLHeli_S/BlueJay,3:BLHeli32/AM32/Kiss+EDT,4:BLHeli_S/BlueJay+EDT // @User: Advanced AP_GROUPINFO("_DSHOT_ESC", 24, SRV_Channels, dshot_esc_type, 0), diff --git a/modules/DroneCAN/dronecan_dsdlc b/modules/DroneCAN/dronecan_dsdlc index 2465ace6c8..43d8a9ed90 160000 --- a/modules/DroneCAN/dronecan_dsdlc +++ b/modules/DroneCAN/dronecan_dsdlc @@ -1 +1 @@ -Subproject commit 2465ace6c8cb0148e3ff5865aa9e4dd17d691a71 +Subproject commit 43d8a9ed909e18f169c001a0f418edc72269b36b diff --git a/modules/mavlink b/modules/mavlink index 2825252d6d..603e3c8e0c 160000 --- a/modules/mavlink +++ b/modules/mavlink @@ -1 +1 @@ -Subproject commit 2825252d6d13eb347520f028b3c580ab29bd78e5 +Subproject commit 603e3c8e0c6031992da4206239681d13df5915be