diff --git a/.travis.yml b/.travis.yml index da50f6cf..6a6c0b9f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,12 +2,21 @@ language: cpp cache: apt -before_install: - - sudo add-apt-repository ppa:terry.guo/gcc-arm-embedded -y - - sudo apt-get update -qq - - sudo apt-get install -y gcc-arm-none-eabi +notifications: + irc: + channels: + - "chat.freenode.net#portapack" + template: + - "%{repository}#%{build_number} (%{branch} - %{commit} : %{author}): %{message}" + - "Change view : %{compare_url}" + - "Build details : %{build_url}" + # TODO: The "build_number.1" in this URL is almost certainly wrong, but correct value not available from Travis? + - "Firmware download : https://portapack-h1-builds.s3.amazonaws.com/%{repository_slug}/%{build_number}/%{build_number}.1/firmware/portapack-h1-firmware-%{commit}.tar.bz2" before_script: + - wget https://launchpad.net/gcc-arm-embedded/5.0/5-2015-q4-major/+download/gcc-arm-none-eabi-5_2-2015q4-20151219-linux.tar.bz2 -O /tmp/gcc-arm.tar.bz2 + - tar -xf /tmp/gcc-arm.tar.bz2 + - export PATH=$PWD/gcc-arm-none-eabi-5_2-2015q4/bin:$PATH - export CC="arm-none-eabi-gcc" - export CXX="arm-none-eabi-g++" @@ -18,6 +27,10 @@ script: - popd addons: + apt_packages: + - lib32bz2-1.0 + - lib32ncurses5 + - lib32z1 artifacts: paths: - $(ls firmware/portapack-h1-firmware-*.tar.bz2 | tr "\n" ":") diff --git a/firmware/application/Makefile b/firmware/application/Makefile index a7efa837..d74a662d 100755 --- a/firmware/application/Makefile +++ b/firmware/application/Makefile @@ -127,6 +127,7 @@ CPPSRC = main.cpp \ hackrf_hal.cpp \ portapack.cpp \ portapack_shared_memory.cpp \ + baseband_api.cpp \ portapack_persistent_memory.cpp \ portapack_io.cpp \ i2c_pp.cpp \ @@ -146,6 +147,7 @@ CPPSRC = main.cpp \ touch.cpp \ touch_adc.cpp \ encoder.cpp \ + audio.cpp \ lcd_ili9341.cpp \ ui.cpp \ ui_alphanum.cpp \ @@ -167,6 +169,7 @@ CPPSRC = main.cpp \ ui_debug.cpp \ ui_baseband_stats_view.cpp \ ui_sd_card_status_view.cpp \ + ui_sd_card_debug.cpp \ ui_console.cpp \ ui_receiver.cpp \ ui_spectrum.cpp \ @@ -185,12 +188,15 @@ CPPSRC = main.cpp \ ../commom/ais_packet.cpp \ ais_app.cpp \ tpms_app.cpp \ + ../common/tpms_packet.cpp \ ert_app.cpp \ ../common/ert_packet.cpp \ - spectrum_analysis_app.cpp \ + capture_app.cpp \ sd_card.cpp \ file.cpp \ log_file.cpp \ + png_writer.cpp \ + audio_thread.cpp \ manchester.cpp \ string_format.cpp \ temperature_logger.cpp \ @@ -198,7 +204,8 @@ CPPSRC = main.cpp \ ../common/chibios_cpp.cpp \ ../common/debug.cpp \ ../common/gcc.cpp \ - m4_startup.cpp \ + ../common/lfsr_random.cpp \ + core_control.cpp \ cpld_max5.cpp \ jtag.cpp \ cpld_update.cpp \ diff --git a/firmware/application/ais_app.cpp b/firmware/application/ais_app.cpp index c3867e34..7fde92a4 100644 --- a/firmware/application/ais_app.cpp +++ b/firmware/application/ais_app.cpp @@ -25,8 +25,7 @@ #include "string_format.hpp" -#include "portapack.hpp" -using namespace portapack; +#include "baseband_api.hpp" #include @@ -42,26 +41,6 @@ static std::string latlon_abs_normalized(const int32_t normalized, const char su return to_string_dec_uint(degrees) + "." + to_string_dec_uint(fraction, 6, '0') + suffix; } -static std::string latitude(const Latitude value) { - if( value.is_not_available() ) { - return "not available"; - } else if( value.is_valid() ) { - return latlon_abs_normalized(value.normalized(), "SN"); - } else { - return "invalid"; - } -} - -static std::string longitude(const Longitude value) { - if( value.is_not_available() ) { - return "not available"; - } else if( value.is_valid() ) { - return latlon_abs_normalized(value.normalized(), "WE"); - } else { - return "invalid"; - } -} - static std::string latlon(const Latitude latitude, const Longitude longitude) { if( latitude.is_valid() && longitude.is_valid() ) { return latlon_abs_normalized(latitude.normalized(), "SN") + " " + latlon_abs_normalized(longitude.normalized(), "WE"); @@ -78,17 +57,6 @@ static std::string mmsi( return to_string_dec_uint(mmsi, 9); } -static std::string datetime( - const ais::DateTime& datetime -) { - return to_string_dec_uint(datetime.year, 4, '0') + "/" + - to_string_dec_uint(datetime.month, 2, '0') + "/" + - to_string_dec_uint(datetime.day, 2, '0') + " " + - to_string_dec_uint(datetime.hour, 2, '0') + ":" + - to_string_dec_uint(datetime.minute, 2, '0') + ":" + - to_string_dec_uint(datetime.second, 2, '0'); -} - static std::string navigational_status(const unsigned int value) { switch(value) { case 0: return "under way w/engine"; @@ -160,6 +128,12 @@ static std::string true_heading(const TrueHeading value) { } /* namespace format */ } /* namespace ais */ +AISLogger::AISLogger( + const std::string& file_path +) : log_file { file_path } +{ +} + void AISLogger::on_packet(const ais::Packet& packet) { // TODO: Unstuff here, not in baseband! if( log_file.is_ready() ) { @@ -340,22 +314,28 @@ AISAppView::AISAppView(NavigationView&) { } } ); + + target_frequency_ = initial_target_frequency; + + radio::enable({ + tuning_frequency(), + sampling_rate, + baseband_bandwidth, + rf::Direction::Receive, + false, 32, 32, + 1, + }); + + baseband::start({ + .mode = 3, + .sampling_rate = sampling_rate, + .decimation_factor = 1, + }); options_channel.on_change = [this](size_t, OptionsField::value_t v) { this->on_frequency_changed(v); }; - options_channel.set_by_value(162025000); - - receiver_model.set_baseband_configuration({ - .mode = 3, - .sampling_rate = 2457600, - .decimation_factor = 1, - }); - receiver_model.set_baseband_bandwidth(1750000); - receiver_model.set_rf_amp(false); - receiver_model.set_lna(32); - receiver_model.set_vga(32); - receiver_model.enable(); + options_channel.set_by_value(target_frequency()); recent_entries_view.on_select = [this](const AISRecentEntry& entry) { this->on_show_detail(entry); @@ -363,10 +343,14 @@ AISAppView::AISAppView(NavigationView&) { recent_entry_detail_view.on_close = [this]() { this->on_show_list(); }; + + logger = std::make_unique("ais.txt"); } AISAppView::~AISAppView() { - receiver_model.disable(); + baseband::stop(); + radio::disable(); + EventDispatcher::message_map().unregister_handler(Message::ID::AISPacket); } @@ -382,7 +366,10 @@ void AISAppView::set_parent_rect(const Rect new_parent_rect) { } void AISAppView::on_packet(const ais::Packet& packet) { - logger.on_packet(packet); + if( logger ) { + logger->on_packet(packet); + } + const auto updated_entry = recent.on_packet(packet.source_id(), packet); recent_entries_view.set_dirty(); @@ -405,8 +392,21 @@ void AISAppView::on_show_detail(const AISRecentEntry& entry) { recent_entry_detail_view.focus(); } -void AISAppView::on_frequency_changed(const uint32_t new_frequency) { - receiver_model.set_tuning_frequency(new_frequency); +void AISAppView::on_frequency_changed(const uint32_t new_target_frequency) { + set_target_frequency(new_target_frequency); +} + +void AISAppView::set_target_frequency(const uint32_t new_value) { + target_frequency_ = new_value; + radio::set_tuning_frequency(tuning_frequency()); +} + +uint32_t AISAppView::target_frequency() const { + return target_frequency_; +} + +uint32_t AISAppView::tuning_frequency() const { + return target_frequency() - (sampling_rate / 4); } } /* namespace ui */ diff --git a/firmware/application/ais_app.hpp b/firmware/application/ais_app.hpp index 73b005d3..f0f81c91 100644 --- a/firmware/application/ais_app.hpp +++ b/firmware/application/ais_app.hpp @@ -90,10 +90,12 @@ using AISRecentEntries = RecentEntries; class AISLogger { public: + AISLogger(const std::string& file_path); + void on_packet(const ais::Packet& packet); private: - LogFile log_file { "ais.txt" }; + LogFile log_file; }; namespace ui { @@ -145,8 +147,12 @@ public: std::string title() const override { return "AIS"; }; private: + static constexpr uint32_t initial_target_frequency = 162025000; + static constexpr uint32_t sampling_rate = 2457600; + static constexpr uint32_t baseband_bandwidth = 1750000; + AISRecentEntries recent; - AISLogger logger; + std::unique_ptr logger; AISRecentEntriesView recent_entries_view { recent }; AISRecentEntryDetailView recent_entry_detail_view; @@ -167,11 +173,18 @@ private: } }; + uint32_t target_frequency_ = initial_target_frequency; + void on_packet(const ais::Packet& packet); void on_show_list(); void on_show_detail(const AISRecentEntry& entry); - void on_frequency_changed(const uint32_t new_frequency); + void on_frequency_changed(const uint32_t new_target_frequency); + + uint32_t target_frequency() const; + void set_target_frequency(const uint32_t new_value); + + uint32_t tuning_frequency() const; }; } /* namespace ui */ diff --git a/firmware/application/analog_audio_app.cpp b/firmware/application/analog_audio_app.cpp index fcd9cda1..5e4593b4 100644 --- a/firmware/application/analog_audio_app.cpp +++ b/firmware/application/analog_audio_app.cpp @@ -22,9 +22,12 @@ #include "analog_audio_app.hpp" #include "portapack.hpp" -#include "portapack_shared_memory.hpp" +#include "portapack_persistent_memory.hpp" using namespace portapack; +#include "audio.hpp" +#include "file.hpp" + #include "utility.hpp" namespace ui { @@ -115,6 +118,9 @@ AnalogAudioView::AnalogAudioView( field_vga.on_change = [this](int32_t v_db) { this->on_vga_changed(v_db); }; + field_vga.on_show_options = [this]() { + this->on_show_options_rf_gain(); + }; const auto modulation = receiver_model.modulation(); options_modulation.set_by_value(modulation); @@ -125,18 +131,20 @@ AnalogAudioView::AnalogAudioView( this->on_show_options_modulation(); }; - field_volume.set_value((receiver_model.headphone_volume() - wolfson::wm8731::headphone_gain_range.max).decibel() + 99); + field_volume.set_value((receiver_model.headphone_volume() - audio::headphone::volume_range().max).decibel() + 99); field_volume.on_change = [this](int32_t v) { this->on_headphone_volume_changed(v); }; + audio::output::start(); + update_modulation(static_cast(modulation)); } AnalogAudioView::~AnalogAudioView() { // TODO: Manipulating audio codec here, and in ui_receiver.cpp. Good to do // both? - audio_codec.headphone_mute(); + audio::output::stop(); receiver_model.disable(); } @@ -212,16 +220,13 @@ void AnalogAudioView::on_show_options_frequency() { field_frequency.set_style(&style_options_group); - auto widget = std::make_unique( - Rect { 0 * 8, 1 * 16, 30 * 8, 1 * 16 }, - &style_options_group - ); + auto widget = std::make_unique(options_view_rect, &style_options_group); widget->set_step(receiver_model.frequency_step()); widget->on_change_step = [this](rf::Frequency f) { this->on_frequency_step_changed(f); }; - widget->set_reference_ppm_correction(receiver_model.reference_ppm_correction()); + widget->set_reference_ppm_correction(persistent_memory::correction_ppb() / 1000); widget->on_change_reference_ppm_correction = [this](int32_t v) { this->on_reference_ppm_correction_changed(v); }; @@ -235,10 +240,7 @@ void AnalogAudioView::on_show_options_rf_gain() { field_lna.set_style(&style_options_group); - auto widget = std::make_unique( - Rect { 0 * 8, 1 * 16, 30 * 8, 1 * 16 }, - &style_options_group - ); + auto widget = std::make_unique(options_view_rect, &style_options_group); widget->set_rf_amp(receiver_model.rf_amp()); widget->on_change_rf_amp = [this](bool enable) { @@ -255,18 +257,12 @@ void AnalogAudioView::on_show_options_modulation() { const auto modulation = static_cast(receiver_model.modulation()); if( modulation == ReceiverModel::Mode::AMAudio ) { options_modulation.set_style(&style_options_group); - auto widget = std::make_unique( - Rect { 0 * 8, 1 * 16, 30 * 8, 1 * 16 }, - &style_options_group - ); + auto widget = std::make_unique(options_view_rect, &style_options_group); set_options_widget(std::move(widget)); } if( modulation == ReceiverModel::Mode::NarrowbandFMAudio ) { options_modulation.set_style(&style_options_group); - auto widget = std::make_unique( - Rect { 0 * 8, 1 * 16, 30 * 8, 1 * 16 }, - &style_options_group - ); + auto widget = std::make_unique(options_view_rect, &style_options_group); set_options_widget(std::move(widget)); } } @@ -277,15 +273,18 @@ void AnalogAudioView::on_frequency_step_changed(rf::Frequency f) { } void AnalogAudioView::on_reference_ppm_correction_changed(int32_t v) { - receiver_model.set_reference_ppm_correction(v); + persistent_memory::set_correction_ppb(v * 1000); } void AnalogAudioView::on_headphone_volume_changed(int32_t v) { - const auto new_volume = volume_t::decibel(v - 99) + wolfson::wm8731::headphone_gain_range.max; + const auto new_volume = volume_t::decibel(v - 99) + audio::headphone::volume_range().max; receiver_model.set_headphone_volume(new_volume); } void AnalogAudioView::update_modulation(const ReceiverModel::Mode modulation) { + audio::output::mute(); + audio_thread.reset(); + const auto is_wideband_spectrum_mode = (modulation == ReceiverModel::Mode::SpectrumAnalysis); receiver_model.set_baseband_configuration({ .mode = toUType(modulation), @@ -294,6 +293,14 @@ void AnalogAudioView::update_modulation(const ReceiverModel::Mode modulation) { }); receiver_model.set_baseband_bandwidth(is_wideband_spectrum_mode ? 12000000 : 1750000); receiver_model.enable(); + + if( !is_wideband_spectrum_mode ) { + const auto filename = next_filename_matching_pattern("AUD_????.S16"); + if( !filename.empty() ) { + audio_thread = std::make_unique(filename); + } + audio::output::unmute(); + } } } /* namespace ui */ diff --git a/firmware/application/analog_audio_app.hpp b/firmware/application/analog_audio_app.hpp index e3bd24a4..dace3245 100644 --- a/firmware/application/analog_audio_app.hpp +++ b/firmware/application/analog_audio_app.hpp @@ -27,6 +27,8 @@ #include "ui_receiver.hpp" #include "ui_spectrum.hpp" +#include "audio_thread.hpp" + #include "ui_font_fixed_8x16.hpp" namespace ui { @@ -93,6 +95,8 @@ public: private: static constexpr ui::Dim header_height = 2 * 16; + const Rect options_view_rect { 0 * 8, 1 * 16, 30 * 8, 1 * 16 }; + RSSI rssi { { 21 * 8, 0, 6 * 8, 4 }, }; @@ -113,12 +117,8 @@ private: { 15 * 8, 0 * 16 } }; - NumberField field_vga { - { 18 * 8, 0 * 16}, - 2, - { max2837::vga::gain_db_range.minimum, max2837::vga::gain_db_range.maximum }, - max2837::vga::gain_db_step, - ' ', + VGAGainField field_vga { + { 18 * 8, 0 * 16 } }; OptionsField options_modulation { @@ -144,6 +144,8 @@ private: spectrum::WaterfallWidget waterfall; + std::unique_ptr audio_thread; + void on_tuning_frequency_changed(rf::Frequency f); void on_baseband_bandwidth_changed(uint32_t bandwidth_hz); void on_rf_amp_changed(bool v); diff --git a/firmware/common/audio.hpp b/firmware/application/audio.cpp similarity index 61% rename from firmware/common/audio.hpp rename to firmware/application/audio.cpp index a9ccaefa..ac04e106 100644 --- a/firmware/common/audio.hpp +++ b/firmware/application/audio.cpp @@ -19,27 +19,21 @@ * Boston, MA 02110-1301, USA. */ -#ifndef __AUDIO_H__ -#define __AUDIO_H__ +#include "audio.hpp" -#include "buffer.hpp" +#include "portapack.hpp" +using portapack::i2c0; +using portapack::clock_manager; + +#include "wm8731.hpp" +using wolfson::wm8731::WM8731; #include "i2s.hpp" using namespace lpc43xx; namespace audio { -struct sample_t { - union { - struct { - int16_t left; - int16_t right; - }; - uint32_t raw; - }; -}; - -using buffer_t = buffer_t; +namespace { constexpr i2s::ConfigTX i2s0_config_tx { .dao = i2s::DAO { @@ -103,6 +97,78 @@ constexpr i2s::ConfigDMA i2s0_config_dma { }, }; -} /* namespace audio */ +constexpr uint8_t wm8731_i2c_address = 0x1a; -#endif/*__AUDIO_H__*/ +WM8731 audio_codec { i2c0, wm8731_i2c_address }; + +} /* namespace */ + +namespace output { + +void start() { + i2s::i2s0::tx_start(); + unmute(); +} + +void stop() { + mute(); + i2s::i2s0::tx_stop(); +} + +void mute() { + i2s::i2s0::tx_mute(); + + audio_codec.headphone_mute(); +} + +void unmute() { + i2s::i2s0::tx_unmute(); +} + +} /* namespace output */ + +namespace headphone { + +volume_range_t volume_range() { + return wolfson::wm8731::headphone_gain_range; +} + +void set_volume(const volume_t volume) { + audio_codec.set_headphone_volume(volume); +} + +} /* namespace headphone */ + +namespace debug { + +int reg_count() { + return wolfson::wm8731::reg_count; +} + +uint16_t reg_read(const int register_number) { + return audio_codec.read(register_number); +} + +} /* namespace debug */ + +void init() { + clock_manager.start_audio_pll(); + audio_codec.init(); + + i2s::i2s0::configure( + i2s0_config_tx, + i2s0_config_rx, + i2s0_config_dma + ); +} + +void shutdown() { + audio_codec.reset(); + output::stop(); +} + +void set_rate(const Rate rate) { + clock_manager.set_base_audio_clock_divider(toUType(rate)); +} + +} /* namespace audio */ diff --git a/firmware/application/audio.hpp b/firmware/application/audio.hpp new file mode 100644 index 00000000..e3d7544f --- /dev/null +++ b/firmware/application/audio.hpp @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __AUDIO_H__ +#define __AUDIO_H__ + +#include "volume.hpp" + +#include + +namespace audio { + +namespace output { + +void start(); +void stop(); + +void mute(); +void unmute(); + +} /* namespace output */ + +namespace headphone { + +volume_range_t volume_range(); + +void set_volume(const volume_t volume); + +} /* namespace headphone */ + +namespace debug { + +int reg_count(); +uint16_t reg_read(const int register_number); + +} /* namespace debug */ + +void init(); +void shutdown(); + +enum class Rate { + Hz_12000 = 4, + Hz_24000 = 2, + Hz_48000 = 1, +}; + +void set_rate(const Rate rate); + +} /* namespace audio */ + +#endif/*__AUDIO_H__*/ diff --git a/firmware/common/audio.cpp b/firmware/application/audio_thread.cpp similarity index 85% rename from firmware/common/audio.cpp rename to firmware/application/audio_thread.cpp index 2f7f17ed..eed06109 100644 --- a/firmware/common/audio.cpp +++ b/firmware/application/audio_thread.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. * * This file is part of PortaPack. * @@ -19,8 +19,6 @@ * Boston, MA 02110-1301, USA. */ -#include "audio.hpp" +#include "audio_thread.hpp" -namespace audio { - -} /* namespace audio */ +Thread* AudioThread::thread = nullptr; diff --git a/firmware/application/audio_thread.hpp b/firmware/application/audio_thread.hpp new file mode 100644 index 00000000..37802fe8 --- /dev/null +++ b/firmware/application/audio_thread.hpp @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __AUDIO_THREAD_H__ +#define __AUDIO_THREAD_H__ + +#include "ch.h" + +#include "file.hpp" + +#include "event_m0.hpp" + +#include "portapack_shared_memory.hpp" + +#include "hackrf_gpio.hpp" +using namespace hackrf::one; + +#include + +class StreamOutput { +public: + StreamOutput( + FIFO* const fifo + ) : fifo { fifo } + { + } + + size_t available() { + return fifo->len(); + } + + size_t read(void* const data, const size_t length) { + return fifo->out(reinterpret_cast(data), length); + } + +private: + FIFO* const fifo; +}; + +class AudioThread { +public: + AudioThread( + std::string file_path + ) : file_path { std::move(file_path) }, + write_buffer { std::make_unique>() } + { + // Need significant stack for FATFS + thread = chThdCreateFromHeap(NULL, 1024, NORMALPRIO + 10, AudioThread::static_fn, this); + } + + ~AudioThread() { + chThdTerminate(thread); + chEvtSignal(thread, EVT_FIFO_HIGHWATER); + const auto success = chThdWait(thread); + + if( !success ) { + led_tx.on(); + } + } + + static void check_fifo_isr() { + if( (shared_memory.FIFO_HACK != nullptr) && (thread != nullptr) ) { + auto fifo = reinterpret_cast*>(shared_memory.FIFO_HACK); + if( fifo->len() >= write_size ) { + chEvtSignalI(thread, EVT_FIFO_HIGHWATER); + } + } + } + +private: + static constexpr size_t write_size = 16384; + static constexpr eventmask_t EVT_FIFO_HIGHWATER = 1; + + const std::string file_path; + std::unique_ptr> write_buffer; + File file; + static Thread* thread; + + static msg_t static_fn(void* arg) { + auto obj = static_cast(arg); + return obj->run(); + } + + msg_t run() { + if( !file.open_for_writing(file_path) ) { + return false; + } + + auto fifo = reinterpret_cast*>(shared_memory.FIFO_HACK); + if( !fifo ) { + return false; + } + + StreamOutput stream { fifo }; + + while( !chThdShouldTerminate() ) { + chEvtWaitAny(EVT_FIFO_HIGHWATER); + + while( stream.available() >= write_buffer->size() ) { + if( !transfer(stream, write_buffer.get()) ) { + return false; + } + } + } + + return true; + } + + bool transfer(StreamOutput& stream, std::array* const write_buffer) { + bool success = false; + + led_usb.on(); + + const auto bytes_to_write = stream.read(write_buffer->data(), write_buffer->size()); + if( bytes_to_write == write_buffer->size() ) { + if( file.write(write_buffer->data(), write_buffer->size()) ) { + success = true; + } + } + + led_usb.off(); + + return success; + } +}; + +#endif/*__AUDIO_THREAD_H__*/ diff --git a/firmware/application/baseband_api.cpp b/firmware/application/baseband_api.cpp new file mode 100644 index 00000000..3c87682b --- /dev/null +++ b/firmware/application/baseband_api.cpp @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "baseband_api.hpp" + +#include "audio.hpp" +#include "dsp_iir_config.hpp" + +#include "portapack_shared_memory.hpp" + +namespace baseband { + +void AMConfig::apply() const { + const AMConfigureMessage message { + taps_6k0_decim_0, + taps_6k0_decim_1, + taps_6k0_decim_2, + channel, + modulation, + audio_12k_hpf_300hz_config + }; + shared_memory.baseband_queue.push(message); + audio::set_rate(audio::Rate::Hz_12000); +} + +void NBFMConfig::apply() const { + const NBFMConfigureMessage message { + decim_0, + decim_1, + channel, + 2, + deviation, + audio_24k_hpf_300hz_config, + audio_24k_deemph_300_6_config + }; + shared_memory.baseband_queue.push(message); + audio::set_rate(audio::Rate::Hz_24000); +} + +void WFMConfig::apply() const { + const WFMConfigureMessage message { + taps_200k_wfm_decim_0, + taps_200k_wfm_decim_1, + taps_64_lp_156_198, + 75000, + audio_48k_hpf_30hz_config, + audio_48k_deemph_2122_6_config + }; + shared_memory.baseband_queue.push(message); + audio::set_rate(audio::Rate::Hz_48000); +} + +void start(BasebandConfiguration configuration) { + BasebandConfigurationMessage message { configuration }; + shared_memory.baseband_queue.push(message); +} + +void stop() { + shared_memory.baseband_queue.push_and_wait( + BasebandConfigurationMessage { + .configuration = { }, + } + ); +} + +void shutdown() { + ShutdownMessage shutdown_message; + shared_memory.baseband_queue.push(shutdown_message); +} + +void spectrum_streaming_start() { + shared_memory.baseband_queue.push_and_wait( + SpectrumStreamingConfigMessage { + SpectrumStreamingConfigMessage::Mode::Running + } + ); +} + +void spectrum_streaming_stop() { + shared_memory.baseband_queue.push_and_wait( + SpectrumStreamingConfigMessage { + SpectrumStreamingConfigMessage::Mode::Stopped + } + ); +} + +} /* namespace baseband */ diff --git a/firmware/application/baseband_api.hpp b/firmware/application/baseband_api.hpp new file mode 100644 index 00000000..15959142 --- /dev/null +++ b/firmware/application/baseband_api.hpp @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __BASEBAND_API_H__ +#define __BASEBAND_API_H__ + +#include "message.hpp" + +#include "dsp_fir_taps.hpp" + +#include + +namespace baseband { + +struct AMConfig { + const fir_taps_complex<64> channel; + const AMConfigureMessage::Modulation modulation; + + void apply() const; +}; + +struct NBFMConfig { + const fir_taps_real<24> decim_0; + const fir_taps_real<32> decim_1; + const fir_taps_real<32> channel; + const size_t deviation; + + void apply() const; +}; + +struct WFMConfig { + void apply() const; +}; + +void start(BasebandConfiguration configuration); +void stop(); + +void shutdown(); + +void spectrum_streaming_start(); +void spectrum_streaming_stop(); + +} /* namespace baseband */ + +#endif/*__BASEBAND_API_H__*/ diff --git a/firmware/application/capture_app.cpp b/firmware/application/capture_app.cpp new file mode 100644 index 00000000..617d4e6b --- /dev/null +++ b/firmware/application/capture_app.cpp @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "capture_app.hpp" + +#include "portapack.hpp" +using namespace portapack; + +#include "file.hpp" + +#include "utility.hpp" + +namespace ui { + +CaptureAppView::CaptureAppView(NavigationView& nav) { + add_children({ { + &button_start_stop, + &rssi, + &channel, + &field_frequency, + &field_lna, + &field_vga, + &waterfall, + } }); + + field_frequency.set_value(receiver_model.tuning_frequency()); + field_frequency.set_step(receiver_model.frequency_step()); + field_frequency.on_change = [this](rf::Frequency f) { + this->on_tuning_frequency_changed(f); + }; + field_frequency.on_edit = [this, &nav]() { + // TODO: Provide separate modal method/scheme? + auto new_view = nav.push(receiver_model.tuning_frequency()); + new_view->on_changed = [this](rf::Frequency f) { + this->on_tuning_frequency_changed(f); + this->field_frequency.set_value(f); + }; + }; + + field_lna.set_value(receiver_model.lna()); + field_lna.on_change = [this](int32_t v) { + this->on_lna_changed(v); + }; + + field_vga.set_value(receiver_model.vga()); + field_vga.on_change = [this](int32_t v_db) { + this->on_vga_changed(v_db); + }; + + button_start_stop.on_select = [this](ImageButton&) { + this->on_start_stop(); + }; + + receiver_model.set_baseband_configuration({ + .mode = toUType(ReceiverModel::Mode::Capture), + .sampling_rate = sampling_rate, + .decimation_factor = 1, + }); + receiver_model.set_baseband_bandwidth(baseband_bandwidth); + receiver_model.enable(); +} + +CaptureAppView::~CaptureAppView() { + receiver_model.disable(); +} + +void CaptureAppView::on_hide() { + // TODO: Terrible kludge because widget system doesn't notify Waterfall that + // it's being shown or hidden. + waterfall.on_hide(); + View::on_hide(); +} + +void CaptureAppView::set_parent_rect(const Rect new_parent_rect) { + View::set_parent_rect(new_parent_rect); + + const ui::Rect waterfall_rect { 0, header_height, new_parent_rect.width(), static_cast(new_parent_rect.height() - header_height) }; + waterfall.set_parent_rect(waterfall_rect); +} + +void CaptureAppView::focus() { + button_start_stop.focus(); +} + +void CaptureAppView::on_start_stop() { + if( capture_thread ) { + capture_thread.reset(); + button_start_stop.set_bitmap(&bitmap_record); + } else { + const auto filename = next_filename_matching_pattern("BBD_????.C16"); + if( filename.empty() ) { + return; + } + + capture_thread = std::make_unique(filename); + button_start_stop.set_bitmap(&bitmap_stop); + } +} + +void CaptureAppView::on_tuning_frequency_changed(rf::Frequency f) { + receiver_model.set_tuning_frequency(f); +} + +void CaptureAppView::on_lna_changed(int32_t v_db) { + receiver_model.set_lna(v_db); +} + +void CaptureAppView::on_vga_changed(int32_t v_db) { + receiver_model.set_vga(v_db); +} + +} /* namespace ui */ diff --git a/firmware/application/capture_app.hpp b/firmware/application/capture_app.hpp new file mode 100644 index 00000000..8888f9f0 --- /dev/null +++ b/firmware/application/capture_app.hpp @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __CAPTURE_APP_HPP__ +#define __CAPTURE_APP_HPP__ + +#include "ui_widget.hpp" +#include "ui_navigation.hpp" +#include "ui_receiver.hpp" +#include "ui_spectrum.hpp" + +#include "audio_thread.hpp" + +#include +#include + +namespace ui { + +static constexpr uint8_t bitmap_record_data[] = { + 0x00, 0x00, + 0x00, 0x00, + 0xc0, 0x03, + 0xf0, 0x0f, + 0xf8, 0x1f, + 0xf8, 0x1f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xf8, 0x1f, + 0xf8, 0x1f, + 0xf0, 0x0f, + 0xc0, 0x03, + 0x00, 0x00, + 0x00, 0x00, +}; + +static constexpr Bitmap bitmap_record { + { 16, 16 }, bitmap_record_data +}; + +static constexpr uint8_t bitmap_stop_data[] = { + 0x00, 0x00, + 0x00, 0x00, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0xfc, 0x3f, + 0x00, 0x00, + 0x00, 0x00, +}; + +static constexpr Bitmap bitmap_stop { + { 16, 16 }, bitmap_stop_data +}; + +class CaptureAppView : public View { +public: + CaptureAppView(NavigationView& nav); + ~CaptureAppView(); + + void on_hide() override; + + void set_parent_rect(const Rect new_parent_rect) override; + + void focus() override; + + std::string title() const override { return "Capture"; }; + +private: + static constexpr ui::Dim header_height = 2 * 16; + + static constexpr uint32_t sampling_rate = 4000000; + static constexpr uint32_t baseband_bandwidth = 2500000; + + std::unique_ptr capture_thread; + + void on_start_stop(); + + void on_tuning_frequency_changed(rf::Frequency f); + void on_lna_changed(int32_t v_db); + void on_vga_changed(int32_t v_db); + + ImageButton button_start_stop { + { 0 * 8, 0, 2 * 8, 1 * 16 }, + &bitmap_record, + Color::red(), + Color::black() + }; + + RSSI rssi { + { 21 * 8, 0, 6 * 8, 4 }, + }; + + Channel channel { + { 21 * 8, 5, 6 * 8, 4 }, + }; + + FrequencyField field_frequency { + { 5 * 8, 0 * 16 }, + }; + + LNAGainField field_lna { + { 15 * 8, 0 * 16 } + }; + + VGAGainField field_vga { + { 18 * 8, 0 * 16 } + }; + + spectrum::WaterfallWidget waterfall; +}; + +} /* namespace ui */ + +#endif/*__CAPTURE_APP_HPP__*/ diff --git a/firmware/application/core_control.cpp b/firmware/application/core_control.cpp new file mode 100644 index 00000000..6fdc8856 --- /dev/null +++ b/firmware/application/core_control.cpp @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "core_control.hpp" + +#include "hal.h" + +#include "lpc43xx_cpp.hpp" +using namespace lpc43xx; + +#include "message.hpp" +#include "baseband_api.hpp" + +#include + +char * modhash; + +/* TODO: OK, this is cool, but how do I put the M4 to sleep so I can switch to + * a different image? Other than asking the old image to sleep while the M0 + * makes changes? + * + * I suppose I could force M4MEMMAP to an invalid memory reason which would + * cause an exception and effectively halt the M4. But that feels gross. + */ +void m4_init(const portapack::spi_flash::region_t from, const portapack::memory::region_t to) { + /* Initialize M4 code RAM */ + std::memcpy(reinterpret_cast(to.base()), from.base(), from.size); + + /* M4 core is assumed to be sleeping with interrupts off, so we can mess + * with its address space and RAM without concern. + */ + LPC_CREG->M4MEMMAP = to.base(); + + /* Reset M4 core */ + LPC_RGU->RESET_CTRL[0] = (1 << 13); +} + +void m4_request_shutdown() { + baseband::shutdown(); +} + +void m0_halt() { + rgu::reset(rgu::Reset::M0APP); + while(true) { + port_wait_for_interrupt(); + } +} diff --git a/firmware/application/m4_startup.hpp b/firmware/application/core_control.hpp similarity index 91% rename from firmware/application/m4_startup.hpp rename to firmware/application/core_control.hpp index c158e3a8..e8f71bb4 100644 --- a/firmware/application/m4_startup.hpp +++ b/firmware/application/core_control.hpp @@ -19,8 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#ifndef __M4_STARTUP_H__ -#define __M4_STARTUP_H__ +#ifndef __CORE_CONTROL_H__ +#define __CORE_CONTROL_H__ #include @@ -34,4 +34,6 @@ void m4_request_shutdown(); void m4_switch(const char * hash); int m4_load_image(void); -#endif/*__M4_STARTUP_H__*/ +void m0_halt(); + +#endif/*__CORE_CONTROL_H__*/ diff --git a/firmware/application/ert_app.cpp b/firmware/application/ert_app.cpp index 9ca5800d..938aef9d 100644 --- a/firmware/application/ert_app.cpp +++ b/firmware/application/ert_app.cpp @@ -23,8 +23,7 @@ #include "event_m0.hpp" -#include "portapack.hpp" -using namespace portapack; +#include "baseband_api.hpp" #include "manchester.hpp" @@ -52,10 +51,20 @@ std::string consumption(Consumption value) { return to_string_dec_uint(value, 10); } +std::string commodity_type(CommodityType value) { + return to_string_dec_uint(value, 2); +} + } /* namespace format */ } /* namespace ert */ +ERTLogger::ERTLogger( + const std::string& file_path +) : log_file { file_path } +{ +} + void ERTLogger::on_packet(const ert::Packet& packet) { if( log_file.is_ready() ) { const auto formatted = packet.symbols_formatted(); @@ -63,6 +72,8 @@ void ERTLogger::on_packet(const ert::Packet& packet) { } } +const ERTRecentEntry::Key ERTRecentEntry::invalid_key { }; + void ERTRecentEntry::update(const ert::Packet& packet) { received_count++; @@ -71,8 +82,9 @@ void ERTRecentEntry::update(const ert::Packet& packet) { namespace ui { -static const std::array, 3> ert_columns { { +static const std::array, 4> ert_columns { { { "ID", 10 }, + { "Tp", 2 }, { "Consumpt", 10 }, { "Cnt", 3 }, } }; @@ -106,7 +118,7 @@ void RecentEntriesView::draw( ) { const auto& draw_style = is_selected ? style.invert() : style; - std::string line = ert::format::id(entry.id) + " " + ert::format::consumption(entry.last_consumption); + std::string line = ert::format::id(entry.id) + " " + ert::format::commodity_type(entry.commodity_type) + " " + ert::format::consumption(entry.last_consumption); if( entry.received_count > 999 ) { line += " +++"; @@ -131,21 +143,28 @@ ERTAppView::ERTAppView(NavigationView&) { } ); - receiver_model.set_baseband_configuration({ + radio::enable({ + initial_target_frequency, + sampling_rate, + baseband_bandwidth, + rf::Direction::Receive, + false, 32, 32, + 1, + }); + + baseband::start({ .mode = 6, - .sampling_rate = 4194304, + .sampling_rate = sampling_rate, .decimation_factor = 1, }); - receiver_model.set_baseband_bandwidth(2500000); - receiver_model.set_rf_amp(false); - receiver_model.set_lna(32); - receiver_model.set_vga(32); - receiver_model.set_tuning_frequency(911600000); - receiver_model.enable(); + + logger = std::make_unique("ert.txt"); } ERTAppView::~ERTAppView() { - receiver_model.disable(); + baseband::stop(); + radio::disable(); + EventDispatcher::message_map().unregister_handler(Message::ID::ERTPacket); } @@ -159,10 +178,12 @@ void ERTAppView::set_parent_rect(const Rect new_parent_rect) { } void ERTAppView::on_packet(const ert::Packet& packet) { - logger.on_packet(packet); + if( logger ) { + logger->on_packet(packet); + } if( packet.crc_ok() ) { - recent.on_packet(packet.id(), packet); + recent.on_packet({ packet.id(), packet.commodity_type() }, packet); recent_entries_view.set_dirty(); } } diff --git a/firmware/application/ert_app.hpp b/firmware/application/ert_app.hpp index 065f7f9b..e280f379 100644 --- a/firmware/application/ert_app.hpp +++ b/firmware/application/ert_app.hpp @@ -33,13 +33,37 @@ #include #include +struct ERTKey { + ert::ID id; + ert::CommodityType commodity_type; + + constexpr ERTKey( + ert::ID id = ert::invalid_id, + ert::CommodityType commodity_type = ert::invalid_commodity_type + ) : id { id }, + commodity_type { commodity_type } + { + } + + ERTKey& operator=(const ERTKey& other) { + id = other.id; + commodity_type = other.commodity_type; + return *this; + } + + bool operator==(const ERTKey& other) const { + return (id == other.id) && (commodity_type == other.commodity_type); + } +}; + struct ERTRecentEntry { - using Key = ert::ID; + using Key = ERTKey; // TODO: Is this the right choice of invalid key value? - static constexpr Key invalid_key = 0; + static const Key invalid_key; - ert::ID id { invalid_key }; + ert::ID id { ert::invalid_id }; + ert::CommodityType commodity_type { ert::invalid_commodity_type }; size_t received_count { 0 }; @@ -47,12 +71,13 @@ struct ERTRecentEntry { ERTRecentEntry( const Key& key - ) : id { key } + ) : id { key.id }, + commodity_type { key.commodity_type } { } Key key() const { - return id; + return { id, commodity_type }; } void update(const ert::Packet& packet); @@ -60,10 +85,12 @@ struct ERTRecentEntry { class ERTLogger { public: + ERTLogger(const std::string& file_path); + void on_packet(const ert::Packet& packet); private: - LogFile log_file { "ert.txt" }; + LogFile log_file; }; using ERTRecentEntries = RecentEntries; @@ -74,6 +101,10 @@ using ERTRecentEntriesView = RecentEntriesView; class ERTAppView : public View { public: + static constexpr uint32_t initial_target_frequency = 911600000; + static constexpr uint32_t sampling_rate = 4194304; + static constexpr uint32_t baseband_bandwidth = 2500000; + ERTAppView(NavigationView& nav); ~ERTAppView(); @@ -89,7 +120,7 @@ public: private: ERTRecentEntries recent; - ERTLogger logger; + std::unique_ptr logger; ERTRecentEntriesView recent_entries_view { recent }; diff --git a/firmware/application/event_m0.cpp b/firmware/application/event_m0.cpp index dc557397..af12bee1 100644 --- a/firmware/application/event_m0.cpp +++ b/firmware/application/event_m0.cpp @@ -31,6 +31,8 @@ #include "irq_controls.hpp" +#include "audio_thread.hpp" + #include "ch.h" #include "lpc43xx_cpp.hpp" @@ -44,6 +46,7 @@ CH_IRQ_HANDLER(M4Core_IRQHandler) { CH_IRQ_PROLOGUE(); chSysLockFromIsr(); + AudioThread::check_fifo_isr(); EventDispatcher::events_flag_isr(EVT_MASK_APPLICATION); chSysUnlockFromIsr(); @@ -56,6 +59,7 @@ CH_IRQ_HANDLER(M4Core_IRQHandler) { MessageHandlerMap EventDispatcher::message_map_; Thread* EventDispatcher::thread_event_loop = nullptr; +Thread* EventDispatcher::thread_record = nullptr; EventDispatcher::EventDispatcher( ui::Widget* const top_widget, @@ -65,6 +69,8 @@ EventDispatcher::EventDispatcher( painter(painter), context(context) { + init_message_queues(); + thread_event_loop = chThdSelf(); touch_manager.on_event = [this](const ui::TouchEvent event) { this->on_touch_event(event); @@ -132,10 +138,9 @@ void EventDispatcher::dispatch(const eventmask_t events) { } void EventDispatcher::handle_application_queue() { - std::array message_buffer; - while(Message* const message = shared_memory.application_queue.pop(message_buffer)) { + shared_memory.application_queue.handle([](Message* const message) { message_map().send(message); - } + }); } void EventDispatcher::handle_rtc_tick() { @@ -241,4 +246,15 @@ void EventDispatcher::event_bubble_encoder(const ui::EncoderEvent event) { while( (target != nullptr) && !target->on_encoder(event) ) { target = target->parent(); } -} \ No newline at end of file +} + +void EventDispatcher::init_message_queues() { + new (&shared_memory.baseband_queue) MessageQueue( + shared_memory.baseband_queue_data, SharedMemory::baseband_queue_k + ); + new (&shared_memory.application_queue) MessageQueue( + shared_memory.application_queue_data, SharedMemory::application_queue_k + ); + + shared_memory.FIFO_HACK = nullptr; +} diff --git a/firmware/application/event_m0.hpp b/firmware/application/event_m0.hpp index d8b1b396..69dcede2 100644 --- a/firmware/application/event_m0.hpp +++ b/firmware/application/event_m0.hpp @@ -73,6 +73,8 @@ public: return message_map_; } + static Thread* thread_record; + private: static MessageHandlerMap message_map_; static Thread* thread_event_loop; @@ -105,6 +107,8 @@ private: bool event_bubble_key(const ui::KeyEvent event); void event_bubble_encoder(const ui::EncoderEvent event); + + void init_message_queues(); }; #endif/*__EVENT_M0_H__*/ diff --git a/firmware/application/ffconf.h b/firmware/application/ffconf.h index b838f9f2..2212ff1e 100644 --- a/firmware/application/ffconf.h +++ b/firmware/application/ffconf.h @@ -1,273 +1,279 @@ -/* CHIBIOS FIX */ -#include "ch.h" - -/*---------------------------------------------------------------------------/ -/ FatFs - FAT file system module configuration file R0.10c (C)ChaN, 2014 -/---------------------------------------------------------------------------*/ - -#define _FFCONF 80376 /* Revision ID */ - -/*---------------------------------------------------------------------------/ -/ Functions and Buffer Configurations -/---------------------------------------------------------------------------*/ - -#define _FS_TINY 0 -/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) -/ At the tiny configuration, size of the file object (FIL) is reduced _MAX_SS -/ bytes. Instead of private sector buffer eliminated from the file object, -/ common sector buffer in the file system object (FATFS) is used for the file -/ data transfer. */ - - -#define _FS_READONLY 0 -/* This option switches read-only configuration. (0:Read/Write or 1:Read-only) -/ Read-only configuration removes basic writing API functions, f_write(), -/ f_sync(), f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), -/ f_getfree() and optional writing functions as well. */ - - -#define _FS_MINIMIZE 0 -/* This option defines minimization level to remove some API functions. -/ -/ 0: All basic functions are enabled. -/ 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_chmod(), f_utime(), -/ f_truncate() and f_rename() function are removed. -/ 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. -/ 3: f_lseek() function is removed in addition to 2. */ - - -#define _USE_STRFUNC 1 -/* This option switches string functions, f_gets(), f_putc(), f_puts() and -/ f_printf(). -/ -/ 0: Disable string functions. -/ 1: Enable without LF-CRLF conversion. -/ 2: Enable with LF-CRLF conversion. */ - - -#define _USE_MKFS 0 -/* This option switches f_mkfs() function. (0:Disable or 1:Enable) -/ To enable it, also _FS_READONLY need to be set to 0. */ - - -#define _USE_FASTSEEK 0 -/* This option switches fast seek feature. (0:Disable or 1:Enable) */ - - -#define _USE_LABEL 0 -/* This option switches volume label functions, f_getlabel() and f_setlabel(). -/ (0:Disable or 1:Enable) */ - - -#define _USE_FORWARD 0 -/* This option switches f_forward() function. (0:Disable or 1:Enable) */ -/* To enable it, also _FS_TINY need to be set to 1. */ - - -/*---------------------------------------------------------------------------/ -/ Locale and Namespace Configurations -/---------------------------------------------------------------------------*/ - -#define _CODE_PAGE 1252 -/* This option specifies the OEM code page to be used on the target system. -/ Incorrect setting of the code page can cause a file open failure. -/ -/ 932 - Japanese Shift_JIS (DBCS, OEM, Windows) -/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) -/ 949 - Korean (DBCS, OEM, Windows) -/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) -/ 1250 - Central Europe (Windows) -/ 1251 - Cyrillic (Windows) -/ 1252 - Latin 1 (Windows) -/ 1253 - Greek (Windows) -/ 1254 - Turkish (Windows) -/ 1255 - Hebrew (Windows) -/ 1256 - Arabic (Windows) -/ 1257 - Baltic (Windows) -/ 1258 - Vietnam (OEM, Windows) -/ 437 - U.S. (OEM) -/ 720 - Arabic (OEM) -/ 737 - Greek (OEM) -/ 775 - Baltic (OEM) -/ 850 - Multilingual Latin 1 (OEM) -/ 858 - Multilingual Latin 1 + Euro (OEM) -/ 852 - Latin 2 (OEM) -/ 855 - Cyrillic (OEM) -/ 866 - Russian (OEM) -/ 857 - Turkish (OEM) -/ 862 - Hebrew (OEM) -/ 874 - Thai (OEM, Windows) -/ 1 - ASCII (No extended character. Valid for only non-LFN configuration.) */ - - -#define _USE_LFN 0 -#define _MAX_LFN 255 -/* The _USE_LFN option switches the LFN feature. -/ -/ 0: Disable LFN feature. _MAX_LFN has no effect. -/ 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. -/ 2: Enable LFN with dynamic working buffer on the STACK. -/ 3: Enable LFN with dynamic working buffer on the HEAP. -/ -/ When enable the LFN feature, Unicode handling functions (option/unicode.c) must -/ be added to the project. The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. -/ When use stack for the working buffer, take care on stack overflow. When use heap -/ memory for the working buffer, memory management functions, ff_memalloc() and -/ ff_memfree(), must be added to the project. */ - - -#define _LFN_UNICODE 0 -/* This option switches character encoding on the API. (0:ANSI/OEM or 1:Unicode) -/ To use Unicode string for the path name, enable LFN feature and set _LFN_UNICODE -/ to 1. This option also affects behavior of string I/O functions. */ - - -#define _STRF_ENCODE 3 -/* When _LFN_UNICODE is 1, this option selects the character encoding on the file to -/ be read/written via string I/O functions, f_gets(), f_putc(), f_puts and f_printf(). -/ -/ 0: ANSI/OEM -/ 1: UTF-16LE -/ 2: UTF-16BE -/ 3: UTF-8 -/ -/ When _LFN_UNICODE is 0, this option has no effect. */ - - -#define _FS_RPATH 0 -/* This option configures relative path feature. -/ -/ 0: Disable relative path feature and remove related functions. -/ 1: Enable relative path feature. f_chdir() and f_chdrive() are available. -/ 2: f_getcwd() function is available in addition to 1. -/ -/ Note that directory items read via f_readdir() are affected by this option. */ - - -/*---------------------------------------------------------------------------/ -/ Drive/Volume Configurations -/---------------------------------------------------------------------------*/ - -#define _VOLUMES 1 -/* Number of volumes (logical drives) to be used. */ - - -#define _STR_VOLUME_ID 0 -#define _VOLUME_STRS "RAM","NAND","CF","SD1","SD2","USB1","USB2","USB3" -/* _STR_VOLUME_ID option switches string volume ID feature. -/ When _STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive -/ number in the path name. _VOLUME_STRS defines the drive ID strings for each -/ logical drives. Number of items must be equal to _VOLUMES. Valid characters for -/ the drive ID strings are: A-Z and 0-9. */ - - -#define _MULTI_PARTITION 0 -/* This option switches multi-partition feature. By default (0), each logical drive -/ number is bound to the same physical drive number and only an FAT volume found on -/ the physical drive will be mounted. When multi-partition feature is enabled (1), -/ each logical drive number is bound to arbitrary physical drive and partition -/ listed in the VolToPart[]. Also f_fdisk() funciton will be enabled. */ - - -#define _MIN_SS 512 -#define _MAX_SS 512 -/* These options configure the range of sector size to be supported. (512, 1024, -/ 2048 or 4096) Always set both 512 for most systems, all type of memory cards and -/ harddisk. But a larger value may be required for on-board flash memory and some -/ type of optical media. When _MAX_SS is larger than _MIN_SS, FatFs is configured -/ to variable sector size and GET_SECTOR_SIZE command must be implemented to the -/ disk_ioctl() function. */ - - -#define _USE_TRIM 0 -/* This option switches ATA-TRIM feature. (0:Disable or 1:Enable) -/ To enable Trim feature, also CTRL_TRIM command should be implemented to the -/ disk_ioctl() function. */ - - -#define _FS_NOFSINFO 0 -/* If you need to know correct free space on the FAT32 volume, set bit 0 of this -/ option, and f_getfree() function at first time after volume mount will force -/ a full FAT scan. Bit 1 controls the use of last allocated cluster number. -/ -/ bit0=0: Use free cluster count in the FSINFO if available. -/ bit0=1: Do not trust free cluster count in the FSINFO. -/ bit1=0: Use last allocated cluster number in the FSINFO if available. -/ bit1=1: Do not trust last allocated cluster number in the FSINFO. -*/ - - - -/*---------------------------------------------------------------------------/ -/ System Configurations -/---------------------------------------------------------------------------*/ - -#define _FS_NORTC 0 -#define _NORTC_MON 11 -#define _NORTC_MDAY 9 -#define _NORTC_YEAR 2014 -/* The _FS_NORTC option switches timestamp feature. If the system does not have -/ an RTC function or valid timestamp is not needed, set _FS_NORTC to 1 to disable -/ the timestamp feature. All objects modified by FatFs will have a fixed timestamp -/ defined by _NORTC_MON, _NORTC_MDAY and _NORTC_YEAR. -/ When timestamp feature is enabled (_FS_NORTC == 0), get_fattime() function need -/ to be added to the project to read current time form RTC. _NORTC_MON, -/ _NORTC_MDAY and _NORTC_YEAR have no effect. -/ These options have no effect at read-only configuration (_FS_READONLY == 1). */ - - -#define _FS_LOCK 0 -/* The _FS_LOCK option switches file lock feature to control duplicated file open -/ and illegal operation to open objects. This option must be 0 when _FS_READONLY -/ is 1. -/ -/ 0: Disable file lock feature. To avoid volume corruption, application program -/ should avoid illegal open, remove and rename to the open objects. -/ >0: Enable file lock feature. The value defines how many files/sub-directories -/ can be opened simultaneously under file lock control. Note that the file -/ lock feature is independent of re-entrancy. */ - - -#define _FS_REENTRANT 1 -#define _FS_TIMEOUT 1000 -#define _SYNC_t Semaphore * -/* The _FS_REENTRANT option switches the re-entrancy (thread safe) of the FatFs -/ module itself. Note that regardless of this option, file access to different -/ volume is always re-entrant and volume control functions, f_mount(), f_mkfs() -/ and f_fdisk() function, are always not re-entrant. Only file/directory access -/ to the same volume is under control of this feature. -/ -/ 0: Disable re-entrancy. _FS_TIMEOUT and _SYNC_t have no effect. -/ 1: Enable re-entrancy. Also user provided synchronization handlers, -/ ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj() -/ function, must be added to the project. Samples are available in -/ option/syscall.c. -/ -/ The _FS_TIMEOUT defines timeout period in unit of time tick. -/ The _SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, -/ SemaphoreHandle_t and etc.. */ - - -#define _WORD_ACCESS 0 -/* The _WORD_ACCESS option is an only platform dependent option. It defines -/ which access method is used to the word data on the FAT volume. -/ -/ 0: Byte-by-byte access. Always compatible with all platforms. -/ 1: Word access. Do not choose this unless under both the following conditions. -/ -/ * Address misaligned memory access is always allowed to ALL instructions. -/ * Byte order on the memory is little-endian. -/ -/ If it is the case, _WORD_ACCESS can also be set to 1 to reduce code size. -/ Following table shows allowable settings of some processor types. -/ -/ ARM7TDMI 0 ColdFire 0 V850E 0 -/ Cortex-M3 0 Z80 0/1 V850ES 0/1 -/ Cortex-M0 0 x86 0/1 TLCS-870 0/1 -/ AVR 0/1 RX600(LE) 0/1 TLCS-900 0/1 -/ AVR32 0 RL78 0 R32C 0 -/ PIC18 0/1 SH-2 0 M16C 0/1 -/ PIC24 0 H8S 0 MSP430 0 -/ PIC32 0 H8/300H 0 8051 0/1 -*/ - +/* CHIBIOS FIX */ +#include "ch.h" + +/*---------------------------------------------------------------------------/ +/ FatFs - FAT file system module configuration file R0.11a (C)ChaN, 2015 +/---------------------------------------------------------------------------*/ + +#define _FFCONF 64180 /* Revision ID */ + +/*---------------------------------------------------------------------------/ +/ Function Configurations +/---------------------------------------------------------------------------*/ + +#define _FS_READONLY 0 +/* This option switches read-only configuration. (0:Read/Write or 1:Read-only) +/ Read-only configuration removes writing API functions, f_write(), f_sync(), +/ f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() +/ and optional writing functions as well. */ + + +#define _FS_MINIMIZE 0 +/* This option defines minimization level to remove some basic API functions. +/ +/ 0: All basic functions are enabled. +/ 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_chmod(), f_utime(), +/ f_truncate() and f_rename() function are removed. +/ 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. +/ 3: f_lseek() function is removed in addition to 2. */ + + +#define _USE_STRFUNC 1 +/* This option switches string functions, f_gets(), f_putc(), f_puts() and +/ f_printf(). +/ +/ 0: Disable string functions. +/ 1: Enable without LF-CRLF conversion. +/ 2: Enable with LF-CRLF conversion. */ + + +#define _USE_FIND 1 +/* This option switches filtered directory read feature and related functions, +/ f_findfirst() and f_findnext(). (0:Disable or 1:Enable) */ + + +#define _USE_MKFS 0 +/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ + + +#define _USE_FASTSEEK 1 +/* This option switches fast seek feature. (0:Disable or 1:Enable) */ + + +#define _USE_LABEL 0 +/* This option switches volume label functions, f_getlabel() and f_setlabel(). +/ (0:Disable or 1:Enable) */ + + +#define _USE_FORWARD 0 +/* This option switches f_forward() function. (0:Disable or 1:Enable) +/ To enable it, also _FS_TINY need to be set to 1. */ + + +/*---------------------------------------------------------------------------/ +/ Locale and Namespace Configurations +/---------------------------------------------------------------------------*/ + +#define _CODE_PAGE 437 +/* This option specifies the OEM code page to be used on the target system. +/ Incorrect setting of the code page can cause a file open failure. +/ +/ 1 - ASCII (No extended character. Non-LFN cfg. only) +/ 437 - U.S. +/ 720 - Arabic +/ 737 - Greek +/ 771 - KBL +/ 775 - Baltic +/ 850 - Latin 1 +/ 852 - Latin 2 +/ 855 - Cyrillic +/ 857 - Turkish +/ 860 - Portuguese +/ 861 - Icelandic +/ 862 - Hebrew +/ 863 - Canadian French +/ 864 - Arabic +/ 865 - Nordic +/ 866 - Russian +/ 869 - Greek 2 +/ 932 - Japanese (DBCS) +/ 936 - Simplified Chinese (DBCS) +/ 949 - Korean (DBCS) +/ 950 - Traditional Chinese (DBCS) +*/ + + +#define _USE_LFN 0 +#define _MAX_LFN 255 +/* The _USE_LFN option switches the LFN feature. +/ +/ 0: Disable LFN feature. _MAX_LFN has no effect. +/ 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. +/ 2: Enable LFN with dynamic working buffer on the STACK. +/ 3: Enable LFN with dynamic working buffer on the HEAP. +/ +/ When enable the LFN feature, Unicode handling functions (option/unicode.c) must +/ be added to the project. The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. +/ When use stack for the working buffer, take care on stack overflow. When use heap +/ memory for the working buffer, memory management functions, ff_memalloc() and +/ ff_memfree(), must be added to the project. */ + + +#define _LFN_UNICODE 0 +/* This option switches character encoding on the API. (0:ANSI/OEM or 1:Unicode) +/ To use Unicode string for the path name, enable LFN feature and set _LFN_UNICODE +/ to 1. This option also affects behavior of string I/O functions. */ + + +#define _STRF_ENCODE 3 +/* When _LFN_UNICODE is 1, this option selects the character encoding on the file to +/ be read/written via string I/O functions, f_gets(), f_putc(), f_puts and f_printf(). +/ +/ 0: ANSI/OEM +/ 1: UTF-16LE +/ 2: UTF-16BE +/ 3: UTF-8 +/ +/ When _LFN_UNICODE is 0, this option has no effect. */ + + +#define _FS_RPATH 0 +/* This option configures relative path feature. +/ +/ 0: Disable relative path feature and remove related functions. +/ 1: Enable relative path feature. f_chdir() and f_chdrive() are available. +/ 2: f_getcwd() function is available in addition to 1. +/ +/ Note that directory items read via f_readdir() are affected by this option. */ + + +/*---------------------------------------------------------------------------/ +/ Drive/Volume Configurations +/---------------------------------------------------------------------------*/ + +#define _VOLUMES 1 +/* Number of volumes (logical drives) to be used. */ + + +#define _STR_VOLUME_ID 0 +#define _VOLUME_STRS "RAM","NAND","CF","SD1","SD2","USB1","USB2","USB3" +/* _STR_VOLUME_ID option switches string volume ID feature. +/ When _STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive +/ number in the path name. _VOLUME_STRS defines the drive ID strings for each +/ logical drives. Number of items must be equal to _VOLUMES. Valid characters for +/ the drive ID strings are: A-Z and 0-9. */ + + +#define _MULTI_PARTITION 0 +/* This option switches multi-partition feature. By default (0), each logical drive +/ number is bound to the same physical drive number and only an FAT volume found on +/ the physical drive will be mounted. When multi-partition feature is enabled (1), +/ each logical drive number is bound to arbitrary physical drive and partition +/ listed in the VolToPart[]. Also f_fdisk() funciton will be available. */ + + +#define _MIN_SS 512 +#define _MAX_SS 512 +/* These options configure the range of sector size to be supported. (512, 1024, +/ 2048 or 4096) Always set both 512 for most systems, all type of memory cards and +/ harddisk. But a larger value may be required for on-board flash memory and some +/ type of optical media. When _MAX_SS is larger than _MIN_SS, FatFs is configured +/ to variable sector size and GET_SECTOR_SIZE command must be implemented to the +/ disk_ioctl() function. */ + + +#define _USE_TRIM 0 +/* This option switches ATA-TRIM feature. (0:Disable or 1:Enable) +/ To enable Trim feature, also CTRL_TRIM command should be implemented to the +/ disk_ioctl() function. */ + + +#define _FS_NOFSINFO 0 +/* If you need to know correct free space on the FAT32 volume, set bit 0 of this +/ option, and f_getfree() function at first time after volume mount will force +/ a full FAT scan. Bit 1 controls the use of last allocated cluster number. +/ +/ bit0=0: Use free cluster count in the FSINFO if available. +/ bit0=1: Do not trust free cluster count in the FSINFO. +/ bit1=0: Use last allocated cluster number in the FSINFO if available. +/ bit1=1: Do not trust last allocated cluster number in the FSINFO. +*/ + + + +/*---------------------------------------------------------------------------/ +/ System Configurations +/---------------------------------------------------------------------------*/ + +#define _FS_TINY 0 +/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) +/ At the tiny configuration, size of the file object (FIL) is reduced _MAX_SS +/ bytes. Instead of private sector buffer eliminated from the file object, +/ common sector buffer in the file system object (FATFS) is used for the file +/ data transfer. */ + + +#define _FS_NORTC 0 +#define _NORTC_MON 1 +#define _NORTC_MDAY 1 +#define _NORTC_YEAR 2015 +/* The _FS_NORTC option switches timestamp feature. If the system does not have +/ an RTC function or valid timestamp is not needed, set _FS_NORTC to 1 to disable +/ the timestamp feature. All objects modified by FatFs will have a fixed timestamp +/ defined by _NORTC_MON, _NORTC_MDAY and _NORTC_YEAR. +/ When timestamp feature is enabled (_FS_NORTC == 0), get_fattime() function need +/ to be added to the project to read current time form RTC. _NORTC_MON, +/ _NORTC_MDAY and _NORTC_YEAR have no effect. +/ These options have no effect at read-only configuration (_FS_READONLY == 1). */ + + +#define _FS_LOCK 0 +/* The _FS_LOCK option switches file lock feature to control duplicated file open +/ and illegal operation to open objects. This option must be 0 when _FS_READONLY +/ is 1. +/ +/ 0: Disable file lock feature. To avoid volume corruption, application program +/ should avoid illegal open, remove and rename to the open objects. +/ >0: Enable file lock feature. The value defines how many files/sub-directories +/ can be opened simultaneously under file lock control. Note that the file +/ lock feature is independent of re-entrancy. */ + + +#define _FS_REENTRANT 1 +#define _FS_TIMEOUT 1000 +#define _SYNC_t Semaphore * +/* The _FS_REENTRANT option switches the re-entrancy (thread safe) of the FatFs +/ module itself. Note that regardless of this option, file access to different +/ volume is always re-entrant and volume control functions, f_mount(), f_mkfs() +/ and f_fdisk() function, are always not re-entrant. Only file/directory access +/ to the same volume is under control of this feature. +/ +/ 0: Disable re-entrancy. _FS_TIMEOUT and _SYNC_t have no effect. +/ 1: Enable re-entrancy. Also user provided synchronization handlers, +/ ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj() +/ function, must be added to the project. Samples are available in +/ option/syscall.c. +/ +/ The _FS_TIMEOUT defines timeout period in unit of time tick. +/ The _SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, +/ SemaphoreHandle_t and etc.. A header file for O/S definitions needs to be +/ included somewhere in the scope of ff.c. */ + + +#define _WORD_ACCESS 0 +/* The _WORD_ACCESS option is an only platform dependent option. It defines +/ which access method is used to the word data on the FAT volume. +/ +/ 0: Byte-by-byte access. Always compatible with all platforms. +/ 1: Word access. Do not choose this unless under both the following conditions. +/ +/ * Address misaligned memory access is always allowed to ALL instructions. +/ * Byte order on the memory is little-endian. +/ +/ If it is the case, _WORD_ACCESS can also be set to 1 to reduce code size. +/ Following table shows allowable settings of some type of processors. +/ +/ ARM7TDMI 0 *2 ColdFire 0 *1 V850E 0 *2 +/ Cortex-M3 0 *3 Z80 0/1 V850ES 0/1 +/ Cortex-M0 0 *2 x86 0/1 TLCS-870 0/1 +/ AVR 0/1 RX600(LE) 0/1 TLCS-900 0/1 +/ AVR32 0 *1 RL78 0 *2 R32C 0 *2 +/ PIC18 0/1 SH-2 0 *1 M16C 0/1 +/ PIC24 0 *2 H8S 0 *1 MSP430 0 *2 +/ PIC32 0 *1 H8/300H 0 *1 8051 0/1 +/ +/ *1:Big-endian. +/ *2:Unaligned memory access is not supported. +/ *3:Some compilers generate LDM/STM for mem_cpy function. +*/ + diff --git a/firmware/application/file.cpp b/firmware/application/file.cpp index 439c0a9c..288f5bde 100644 --- a/firmware/application/file.cpp +++ b/firmware/application/file.cpp @@ -21,13 +21,24 @@ #include "file.hpp" +#include + File::~File() { close(); } -bool File::open_for_append(const std::string file_path) { +bool File::open_for_writing(const std::string& file_path) { const auto open_result = f_open(&f, file_path.c_str(), FA_WRITE | FA_OPEN_ALWAYS); - if( open_result == FR_OK ) { + return (open_result == FR_OK); +} + +bool File::open_for_reading(const std::string& file_path) { + const auto open_result = f_open(&f, file_path.c_str(), FA_READ | FA_OPEN_EXISTING); + return (open_result == FR_OK); +} + +bool File::open_for_append(const std::string& file_path) { + if( open_for_writing(file_path) ) { const auto seek_result = f_lseek(&f, f_size(&f)); if( seek_result == FR_OK ) { return true; @@ -60,7 +71,7 @@ bool File::write(const void* const data, const size_t bytes_to_write) { return (result == FR_OK) && (bytes_written == bytes_to_write); } -bool File::puts(const std::string string) { +bool File::puts(const std::string& string) { const auto result = f_puts(string.c_str(), &f); return (result >= 0); } @@ -69,3 +80,91 @@ bool File::sync() { const auto result = f_sync(&f); return (result == FR_OK); } + +static std::string find_last_file_matching_pattern(const std::string& pattern) { + std::string last_match; + for(const auto& entry : std::filesystem::directory_iterator("", pattern.c_str())) { + if( std::filesystem::is_regular_file(entry.status()) ) { + const auto match = entry.path(); + if( match > last_match ) { + last_match = match; + } + } + } + return last_match; +} + +static std::string increment_filename_ordinal(const std::string& filename) { + std::string result { filename }; + + auto it = result.rbegin(); + + // Back up past extension. + for(; it != result.rend(); ++it) { + if( *it == '.' ) { + ++it; + break; + } + } + if( it == result.rend() ) { + return { }; + } + + // Increment decimal number before the extension. + for(; it != result.rend(); ++it) { + const auto c = *it; + if( c < '0' ) { + return { }; + } else if( c < '9' ) { + *it += 1; + break; + } else if( c == '9' ) { + *it = '0'; + } else { + return { }; + } + } + + return result; +} + +std::string next_filename_matching_pattern(const std::string& filename_pattern) { + auto filename = find_last_file_matching_pattern(filename_pattern); + if( filename.empty() ) { + filename = filename_pattern; + std::replace(std::begin(filename), std::end(filename), '?', '0'); + } else { + filename = increment_filename_ordinal(filename); + } + return filename; +} + +namespace std { +namespace filesystem { + +directory_iterator::directory_iterator( + const char* path, + const char* wild +) { + impl = std::make_shared(); + const auto result = f_findfirst(&impl->dir, &impl->filinfo, path, wild); + if( result != FR_OK ) { + impl.reset(); + // TODO: Throw exception if/when I enable exceptions... + } +} + +directory_iterator& directory_iterator::operator++() { + const auto result = f_findnext(&impl->dir, &impl->filinfo); + if( (result != FR_OK) || (impl->filinfo.fname[0] == 0) ) { + impl.reset(); + } + return *this; +} + +bool is_regular_file(const file_status s) { + return !(s & AM_DIR); +} + +} /* namespace filesystem */ +} /* namespace std */ diff --git a/firmware/application/file.hpp b/firmware/application/file.hpp index 363bd866..71e454be 100644 --- a/firmware/application/file.hpp +++ b/firmware/application/file.hpp @@ -26,12 +26,17 @@ #include #include +#include +#include +#include class File { public: ~File(); - bool open_for_append(const std::string file_path); + bool open_for_writing(const std::string& file_path); + bool open_for_reading(const std::string& file_path); + bool open_for_append(const std::string& file_path); bool close(); bool is_ready(); @@ -39,14 +44,76 @@ public: bool read(void* const data, const size_t bytes_to_read); bool write(const void* const data, const size_t bytes_to_write); - bool puts(const std::string string); + template + bool write(const std::array& data) { + return write(data.data(), N); + } + + bool puts(const std::string& string); bool sync(); private: - const std::string file_path; - FIL f; }; +std::string next_filename_matching_pattern(const std::string& filename_pattern); + +namespace std { +namespace filesystem { + +using file_status = BYTE; + +struct directory_entry : public FILINFO { + file_status status() const { + return fattrib; + } + + const std::string path() const noexcept { return fname; }; +}; + +class directory_iterator { + struct Impl { + DIR dir; + directory_entry filinfo; + + ~Impl() { + f_closedir(&dir); + } + }; + + std::shared_ptr impl; + + friend bool operator!=(const directory_iterator& lhs, const directory_iterator& rhs); + +public: + using difference_type = std::ptrdiff_t; + using value_type = directory_entry; + using pointer = const directory_entry*; + using reference = const directory_entry&; + using iterator_category = std::input_iterator_tag; + + directory_iterator() noexcept { }; + directory_iterator(const char* path, const char* wild); + + ~directory_iterator() { } + + directory_iterator& operator++(); + + reference operator*() const { + // TODO: Exception or assert if impl == nullptr. + return impl->filinfo; + } +}; + +inline const directory_iterator& begin(const directory_iterator& iter) noexcept { return iter; }; +inline directory_iterator end(const directory_iterator&) noexcept { return { }; }; + +inline bool operator!=(const directory_iterator& lhs, const directory_iterator& rhs) { return lhs.impl != rhs.impl; }; + +bool is_regular_file(const file_status s); + +} /* namespace filesystem */ +} /* namespace std */ + #endif/*__FILE_H__*/ diff --git a/firmware/application/halconf.h b/firmware/application/halconf.h index b99a040d..ea3e9866 100755 --- a/firmware/application/halconf.h +++ b/firmware/application/halconf.h @@ -261,7 +261,7 @@ * lower priority, this may slow down the driver a bit however. */ #if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE +#define SDC_NICE_WAITING FALSE #endif /*===========================================================================*/ diff --git a/firmware/application/log_file.cpp b/firmware/application/log_file.cpp index 3b5f4f01..e87cce36 100644 --- a/firmware/application/log_file.cpp +++ b/firmware/application/log_file.cpp @@ -27,7 +27,7 @@ using namespace lpc43xx; LogFile::LogFile( - const std::string file_path + const std::string& file_path ) : file_path { file_path } { file.open_for_append(file_path); diff --git a/firmware/application/log_file.hpp b/firmware/application/log_file.hpp index 0ddf781c..30883b0f 100644 --- a/firmware/application/log_file.hpp +++ b/firmware/application/log_file.hpp @@ -32,7 +32,7 @@ using namespace lpc43xx; class LogFile { public: - LogFile(const std::string file_path); + LogFile(const std::string& file_path); ~LogFile(); bool is_ready(); diff --git a/firmware/application/m4_startup.cpp b/firmware/application/m4_startup.cpp deleted file mode 100644 index 0354b1a4..00000000 --- a/firmware/application/m4_startup.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * 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 2, 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; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "m4_startup.hpp" - -#include "hal.h" -#include "lpc43xx_cpp.hpp" -#include "message.hpp" -#include "portapack_shared_memory.hpp" - -#include - -char * modhash; - -/* TODO: OK, this is cool, but how do I put the M4 to sleep so I can switch to - * a different image? Other than asking the old image to sleep while the M0 - * makes changes? - * - * I suppose I could force M4MEMMAP to an invalid memory reason which would - * cause an exception and effectively halt the M4. But that feels gross. - */ -void m4_init(const portapack::spi_flash::region_t from, const portapack::memory::region_t to) { - /* Initialize M4 code RAM */ - // DEBUG - std::memcpy(reinterpret_cast(to.base()), from.base(), from.size); - - /* M4 core is assumed to be sleeping with interrupts off, so we can mess - * with its address space and RAM without concern. - */ - LPC_CREG->M4MEMMAP = to.base(); - - /* Reset M4 core */ - LPC_RGU->RESET_CTRL[0] = (1 << 13); -} - -int m4_load_image(void) { - const char magic[6] = {'P', 'P', 'M', ' ', 0x01, 0x00}; - //uint32_t mod_size; - UINT bw; - uint8_t i; - uint16_t cnt; - char md5sum[16]; - FILINFO modinfo; - FIL modfile; - DIR rootdir; - FRESULT res; - - // Scan SD card root directory for files with the right MD5 fingerprint at the right location - f_opendir(&rootdir, "/"); - for (;;) { - res = f_readdir(&rootdir, &modinfo); - if (res != FR_OK || modinfo.fname[0] == 0) break; // Reached last file, abort - // Only care about files with .bin extension - if ((!(modinfo.fattrib & AM_DIR)) && (modinfo.fname[9] == 'B') && (modinfo.fname[10] == 'I') && (modinfo.fname[11] == 'N')) { - f_open(&modfile, modinfo.fname, FA_OPEN_EXISTING | FA_READ); - // Magic bytes and version check - f_read(&modfile, &md5sum, 6, &bw); - for (i = 0; i < 6; i++) { - if (md5sum[i] != magic[i]) break; - } - if (i == 6) { - f_lseek(&modfile, 26); - f_read(&modfile, &md5sum, 16, &bw); - for (i = 0; i < 16; i++) { - if (md5sum[i] != modhash[i]) break; - } - if (i == 16) { - //f_lseek(&modfile, 6); - //f_read(&modfile, &mod_size, 4, &bw); - f_lseek(&modfile, 256); - // For some reason, f_read > 512 bytes at once crashes everything... :/ - for (cnt=0;cnt<256;cnt++) - f_read(&modfile, reinterpret_cast(portapack::memory::map::m4_code.base()+(cnt*256)), 256, &bw); - f_close(&modfile); - LPC_RGU->RESET_CTRL[0] = (1 << 13); - return 1; - } - } - f_close(&modfile); - } - } - - return 0; -} - -void m4_switch(const char * hash) { - modhash = const_cast(hash); - - // Ask M4 to enter wait loop in RAM - /*BasebandConfiguration baseband_switch { - .mode = 255, - .sampling_rate = 0, - .decimation_factor = 1, - }; - - BasebandConfigurationMessage message { baseband_switch }; - shared_memory.baseband_queue.push(message);*/ -} - -void m4_request_shutdown() { - ShutdownMessage shutdown_message; - shared_memory.baseband_queue.push(shutdown_message); -} diff --git a/firmware/application/main.cpp b/firmware/application/main.cpp index 0b374a16..36a81e1c 100755 --- a/firmware/application/main.cpp +++ b/firmware/application/main.cpp @@ -68,7 +68,7 @@ #include "event_m0.hpp" -#include "m4_startup.hpp" +#include "core_control.hpp" #include "spi_image.hpp" #include "debug.hpp" @@ -76,9 +76,6 @@ #include "gcc.hpp" -#include "lpc43xx_cpp.hpp" -using namespace lpc43xx; - #include "sd_card.hpp" #include @@ -95,8 +92,6 @@ int main(void) { sdcStart(&SDCD1, nullptr); - init_message_queues(); - ui::Context context; ui::SystemView system_view { context, @@ -129,8 +124,7 @@ int main(void) { portapack::shutdown(); m4_init(portapack::spi_flash::hackrf, portapack::memory::map::m4_code_hackrf); - - rgu::reset(rgu::Reset::M0APP); + m0_halt(); return 0; } diff --git a/firmware/application/portapack.cpp b/firmware/application/portapack.cpp index 8f107c3c..6e3c50ad 100644 --- a/firmware/application/portapack.cpp +++ b/firmware/application/portapack.cpp @@ -29,9 +29,8 @@ using namespace hackrf::one; #include "clock_manager.hpp" -#include "i2c_pp.hpp" - #include "touch_adc.hpp" +#include "audio.hpp" namespace portapack { @@ -51,8 +50,6 @@ I2C i2c0(&I2CD0); SPI ssp0(&SPID1); SPI ssp1(&SPID2); -wolfson::wm8731::WM8731 audio_codec { i2c0, portapack::wm8731_i2c_address }; - si5351::Si5351 clock_generator { i2c0, hackrf::one::si5351_i2c_address }; @@ -134,9 +131,8 @@ void init() { clock_manager.set_reference_ppb(persistent_memory::correction_ppb()); clock_manager.run_at_full_speed(); - clock_manager.start_audio_pll(); - audio_codec.init(); - + audio::init(); + clock_manager.enable_first_if_clock(); clock_manager.enable_second_if_clock(); clock_manager.enable_codec_clocks(); @@ -149,7 +145,7 @@ void shutdown() { display.shutdown(); radio::disable(); - audio_codec.reset(); + audio::shutdown(); clock_manager.shutdown(); power.shutdown(); diff --git a/firmware/application/portapack.hpp b/firmware/application/portapack.hpp index d0ce5db8..111132a9 100644 --- a/firmware/application/portapack.hpp +++ b/firmware/application/portapack.hpp @@ -24,8 +24,8 @@ #include "receiver_model.hpp" #include "transmitter_model.hpp" +#include "i2c_pp.hpp" #include "spi_pp.hpp" -#include "wm8731.hpp" #include "si5351.hpp" #include "lcd_ili9341.hpp" @@ -39,11 +39,10 @@ extern portapack::IO io; extern lcd::ILI9341 display; +extern I2C i2c0; extern SPI ssp0; extern SPI ssp1; -extern wolfson::wm8731::WM8731 audio_codec; - extern si5351::Si5351 clock_generator; extern ClockManager clock_manager; diff --git a/firmware/application/radio.cpp b/firmware/application/radio.cpp index b58222c5..88ef4a21 100644 --- a/firmware/application/radio.cpp +++ b/firmware/application/radio.cpp @@ -22,9 +22,11 @@ #include "radio.hpp" #include "rf_path.hpp" + +#include "rffc507x.hpp" +#include "max2837.hpp" #include "max5864.hpp" #include "baseband_cpld.hpp" -#include "portapack_shared_memory.hpp" #include "tuning.hpp" @@ -148,6 +150,10 @@ void set_baseband_filter_bandwidth(const uint32_t bandwidth_minimum) { second_if.set_lpf_rf_bandwidth(bandwidth_minimum); } +void set_baseband_rate(const uint32_t rate) { + portapack::clock_manager.set_sampling_frequency(rate); +} + void set_baseband_decimation_by(const size_t n) { baseband_cpld.set_decimation_by(n); } @@ -165,4 +171,43 @@ void disable() { set_rf_amp(false); } +void enable(Configuration configuration) { + configure(configuration); +} + +void configure(Configuration configuration) { + set_tuning_frequency(configuration.tuning_frequency); + set_rf_amp(configuration.rf_amp); + set_lna_gain(configuration.lna_gain); + set_vga_gain(configuration.vga_gain); + set_baseband_rate(configuration.baseband_rate); + set_baseband_decimation_by(configuration.baseband_decimation); + set_baseband_filter_bandwidth(configuration.baseband_filter_bandwidth); + set_direction(configuration.direction); +} + +namespace debug { + +namespace first_if { + +uint32_t register_read(const size_t register_number) { + return radio::first_if.read(register_number); +} + +} /* namespace first_if */ + +namespace second_if { + +uint32_t register_read(const size_t register_number) { + return radio::second_if.read(register_number); +} + +uint8_t temp_sense() { + return radio::second_if.temp_sense() & 0x1f; +} + +} /* namespace second_if */ + +} /* namespace debug */ + } /* namespace radio */ diff --git a/firmware/application/radio.hpp b/firmware/application/radio.hpp index 715fd0d5..4c1faa78 100644 --- a/firmware/application/radio.hpp +++ b/firmware/application/radio.hpp @@ -27,11 +27,19 @@ #include #include -#include "rffc507x.hpp" -#include "max2837.hpp" - namespace radio { +struct Configuration { + rf::Frequency tuning_frequency; + uint32_t baseband_rate; + uint32_t baseband_filter_bandwidth; + rf::Direction direction; + bool rf_amp; + int8_t lna_gain; + int8_t vga_gain; + uint8_t baseband_decimation; +}; + void init(); void set_direction(const rf::Direction new_direction); @@ -39,15 +47,33 @@ bool set_tuning_frequency(const rf::Frequency frequency); void set_rf_amp(const bool rf_amp); void set_lna_gain(const int_fast8_t db); void set_vga_gain(const int_fast8_t db); -void set_sampling_frequency(const uint32_t frequency); void set_baseband_filter_bandwidth(const uint32_t bandwidth_minimum); +void set_baseband_rate(const uint32_t rate); void set_baseband_decimation_by(const size_t n); void set_antenna_bias(const bool on); +void enable(Configuration configuration); +void configure(Configuration configuration); void disable(); -extern rffc507x::RFFC507x first_if; -extern max2837::MAX2837 second_if; +namespace debug { + +namespace first_if { + +uint32_t register_read(const size_t register_number); + +} /* namespace first_if */ + +namespace second_if { + +uint32_t register_read(const size_t register_number); + +// TODO: This belongs somewhere else. +uint8_t temp_sense(); + +} /* namespace second_if */ + +} /* namespace debug */ } /* namespace radio */ diff --git a/firmware/application/receiver_model.cpp b/firmware/application/receiver_model.cpp index 7947a652..cf8607b8 100644 --- a/firmware/application/receiver_model.cpp +++ b/firmware/application/receiver_model.cpp @@ -21,90 +21,33 @@ #include "receiver_model.hpp" -#include "portapack_shared_memory.hpp" +#include "baseband_api.hpp" + #include "portapack_persistent_memory.hpp" -#include "portapack.hpp" using namespace portapack; +#include "radio.hpp" +#include "audio.hpp" + #include "dsp_fir_taps.hpp" #include "dsp_iir.hpp" #include "dsp_iir_config.hpp" namespace { -struct AMConfig { - const fir_taps_complex<64> channel; - const AMConfigureMessage::Modulation modulation; - - void apply() const; -}; - -struct NBFMConfig { - const fir_taps_real<24> decim_0; - const fir_taps_real<32> decim_1; - const fir_taps_real<32> channel; - const size_t deviation; - - void apply() const; -}; - -struct WFMConfig { - void apply() const; -}; - -void AMConfig::apply() const { - const AMConfigureMessage message { - taps_6k0_decim_0, - taps_6k0_decim_1, - taps_6k0_decim_2, - channel, - modulation, - audio_12k_hpf_300hz_config - }; - shared_memory.baseband_queue.push(message); - clock_manager.set_base_audio_clock_divider(4); -} - -void NBFMConfig::apply() const { - const NBFMConfigureMessage message { - decim_0, - decim_1, - channel, - 2, - deviation, - audio_24k_hpf_300hz_config, - audio_24k_deemph_300_6_config - }; - shared_memory.baseband_queue.push(message); - clock_manager.set_base_audio_clock_divider(2); -} - -void WFMConfig::apply() const { - const WFMConfigureMessage message { - taps_200k_wfm_decim_0, - taps_200k_wfm_decim_1, - taps_64_lp_156_198, - 75000, - audio_48k_hpf_30hz_config, - audio_48k_deemph_2122_6_config - }; - shared_memory.baseband_queue.push(message); - clock_manager.set_base_audio_clock_divider(1); -} - -static constexpr std::array am_configs { { +static constexpr std::array am_configs { { { taps_6k0_dsb_channel, AMConfigureMessage::Modulation::DSB }, { taps_2k8_usb_channel, AMConfigureMessage::Modulation::SSB }, { taps_2k8_lsb_channel, AMConfigureMessage::Modulation::SSB }, } }; -static constexpr std::array nbfm_configs { { +static constexpr std::array nbfm_configs { { { taps_4k25_decim_0, taps_4k25_decim_1, taps_4k25_channel, 2500 }, { taps_11k0_decim_0, taps_11k0_decim_1, taps_11k0_channel, 2500 }, { taps_16k0_decim_0, taps_16k0_decim_1, taps_16k0_channel, 5000 }, } }; -static constexpr std::array wfm_configs { { +static constexpr std::array wfm_configs { { { }, } }; @@ -127,15 +70,6 @@ void ReceiverModel::set_frequency_step(rf::Frequency f) { frequency_step_ = f; } -int32_t ReceiverModel::reference_ppm_correction() const { - return persistent_memory::correction_ppb() / 1000; -} - -void ReceiverModel::set_reference_ppm_correction(int32_t v) { - persistent_memory::set_correction_ppb(v * 1000); - clock_manager.set_reference_ppb(v * 1000); -} - bool ReceiverModel::antenna_bias() const { return antenna_bias_; } @@ -217,18 +151,10 @@ void ReceiverModel::enable() { update_headphone_volume(); } -void ReceiverModel::baseband_disable() { - shared_memory.baseband_queue.push_and_wait( - BasebandConfigurationMessage { - .configuration = { }, - } - ); -} - void ReceiverModel::disable() { enabled_ = false; update_antenna_bias(); - baseband_disable(); + baseband::stop(); // TODO: Responsibility for enabling/disabling the radio is muddy. // Some happens in ReceiverModel, some inside radio namespace. @@ -236,8 +162,7 @@ void ReceiverModel::disable() { } int32_t ReceiverModel::tuning_offset() { - if( (baseband_configuration.mode == 4) || - (baseband_configuration.mode == 6) ) { + if( (baseband_configuration.mode == 4) ) { return 0; } else { return -(sampling_rate() / 4); @@ -300,21 +225,20 @@ void ReceiverModel::update_baseband_configuration() { // protocols that need quick RX/TX turn-around. // Disabling baseband while changing sampling rates seems like a good idea... - baseband_disable(); + baseband::stop(); - clock_manager.set_sampling_frequency(sampling_rate() * baseband_oversampling()); + radio::set_baseband_rate(sampling_rate() * baseband_oversampling()); update_tuning_frequency(); radio::set_baseband_decimation_by(baseband_oversampling()); - BasebandConfigurationMessage message { baseband_configuration }; - shared_memory.baseband_queue.push(message); + baseband::start(baseband_configuration); } void ReceiverModel::update_headphone_volume() { // TODO: Manipulating audio codec here, and in ui_receiver.cpp. Good to do // both? - audio_codec.set_headphone_volume(headphone_volume_); + audio::headphone::set_volume(headphone_volume_); } void ReceiverModel::update_modulation_configuration() { diff --git a/firmware/application/receiver_model.hpp b/firmware/application/receiver_model.hpp index 4b21c87b..ad664700 100644 --- a/firmware/application/receiver_model.hpp +++ b/firmware/application/receiver_model.hpp @@ -36,10 +36,8 @@ public: AMAudio = 0, NarrowbandFMAudio = 1, WidebandFMAudio = 2, - AIS = 3, SpectrumAnalysis = 4, - TPMS = 5, - ERT = 6, + Capture = 7, }; rf::Frequency tuning_frequency() const; @@ -48,9 +46,6 @@ public: rf::Frequency frequency_step() const; void set_frequency_step(rf::Frequency f); - int32_t reference_ppm_correction() const; - void set_reference_ppm_correction(int32_t v); - bool antenna_bias() const; void set_antenna_bias(bool enabled); @@ -122,8 +117,6 @@ private: void update_am_configuration(); void update_nbfm_configuration(); void update_wfm_configuration(); - - void baseband_disable(); }; #endif/*__RECEIVER_MODEL_H__*/ diff --git a/firmware/application/recent_entries.hpp b/firmware/application/recent_entries.hpp index 8fbbb71a..84afb868 100644 --- a/firmware/application/recent_entries.hpp +++ b/firmware/application/recent_entries.hpp @@ -129,7 +129,7 @@ public: Entries& recent ) : recent { recent } { - flags.focusable = true; + set_focusable(true); } void paint(Painter& painter) override { diff --git a/firmware/application/rffc507x.cpp b/firmware/application/rffc507x.cpp index e15265e4..fc5a585d 100644 --- a/firmware/application/rffc507x.cpp +++ b/firmware/application/rffc507x.cpp @@ -278,21 +278,4 @@ spi::reg_t RFFC507x::readback(const Readback readback) { return read(Register::READBACK); } -#if 0 -/* Test of RFFC507x reset over temperature */ -while(true) { - first_if.write(rffc507x::Register::P1_FREQ2, 0xAAAA); - first_if.reset(); - const auto after_reset = first_if.read(rffc507x::Register::P1_FREQ2); - if( after_reset != 0x6276 ) { - led_usb.off(); - led_tx.on(); - chThdSleepMilliseconds(100); - } else { - led_usb.on(); - led_tx.off(); - } -} -#endif - } /* namespace rffc507x */ diff --git a/firmware/application/sd_card.cpp b/firmware/application/sd_card.cpp index 78f8e287..ed2a90b2 100644 --- a/firmware/application/sd_card.cpp +++ b/firmware/application/sd_card.cpp @@ -39,16 +39,12 @@ FRESULT mount() { return f_mount(&fs, "", 0); } -FRESULT unmount() { - return f_mount(NULL, "", 0); -} - } /* namespace */ Signal status_signal; void poll_inserted() { - const auto card_present_now = sdc_lld_is_card_inserted(&SDCD1); + const auto card_present_now = sdcIsCardInserted(&SDCD1); if( card_present_now != card_present ) { card_present = card_present_now; diff --git a/firmware/application/temperature_logger.cpp b/firmware/application/temperature_logger.cpp index 474c3dd0..152c4d5b 100644 --- a/firmware/application/temperature_logger.cpp +++ b/firmware/application/temperature_logger.cpp @@ -54,7 +54,7 @@ std::vector TemperatureLogger::history() const { TemperatureLogger::sample_t TemperatureLogger::read_sample() { // MAX2837 does not return a valid temperature if in "shutdown" mode. - return radio::second_if.temp_sense() & 0x1f; + return radio::debug::second_if::temp_sense(); } void TemperatureLogger::push_sample(const TemperatureLogger::sample_t sample) { diff --git a/firmware/application/touch.cpp b/firmware/application/touch.cpp index a32f5b17..09f8db8f 100644 --- a/firmware/application/touch.cpp +++ b/firmware/application/touch.cpp @@ -22,9 +22,6 @@ #include "touch.hpp" namespace touch { - -float Manager::cmx; -float Manager::cmy; struct Metrics { const float x; @@ -32,7 +29,7 @@ struct Metrics { const float r; }; -static Metrics calculate_metrics(const Frame frame) { +static Metrics calculate_metrics(const Frame& frame) { /* TODO: Yikes! M0 doesn't have floating point, so this code is * expensive! On the other hand, it seems to be working well (and * fast *enough*?), so maybe leave it alone at least for now. @@ -69,14 +66,7 @@ static Metrics calculate_metrics(const Frame frame) { }; } -ui::Point Manager::raw_point() const { - return { - static_cast(cmx), - static_cast(cmy) - }; -} - -void Manager::feed(const Frame frame) { +void Manager::feed(const Frame& frame) { // touch_debounce.feed(touch_raw); const auto touch_raw = frame.touch; //const auto touch_stable = touch_debounce.state(); @@ -91,9 +81,6 @@ void Manager::feed(const Frame frame) { // TODO: Add touch pressure hysteresis? touch_pressure = (metrics.r < r_touch_threshold); if( touch_pressure ) { - cmx = metrics.x*100; - cmy = metrics.y*100; - const float x = width_pixels * (metrics.x - calib_x_low) / calib_x_range; filter_x.feed(x); const float y = height_pixels * (calib_y_high - metrics.y) / calib_y_range; diff --git a/firmware/application/touch.hpp b/firmware/application/touch.hpp index 25d2dcd3..eee2bbe1 100644 --- a/firmware/application/touch.hpp +++ b/firmware/application/touch.hpp @@ -165,7 +165,7 @@ class Manager { public: std::function on_event; - void feed(const Frame frame); + void feed(const Frame& frame); private: enum State { diff --git a/firmware/application/tpms_app.cpp b/firmware/application/tpms_app.cpp index 2cc05c08..c80bfb9d 100644 --- a/firmware/application/tpms_app.cpp +++ b/firmware/application/tpms_app.cpp @@ -23,13 +23,10 @@ #include "event_m0.hpp" -#include "portapack.hpp" -using namespace portapack; +#include "baseband_api.hpp" #include "string_format.hpp" -#include "crc.hpp" - #include "utility.hpp" namespace tpms { @@ -54,96 +51,20 @@ std::string temperature(Temperature temperature) { } /* namespace format */ -Timestamp Packet::received_at() const { - return packet_.timestamp(); -} - -ManchesterFormatted Packet::symbols_formatted() const { - return format_manchester(decoder_); -} - -Optional Packet::reading() const { - const auto length = crc_valid_length(); - - switch(length) { - case 64: - return Reading { - Reading::Type::FLM_64, - reader_.read(0, 32), - Pressure { static_cast(reader_.read(32, 8)) * 4 / 3 }, - Temperature { static_cast(reader_.read(40, 8) & 0x7f) - 50 } - }; - - case 72: - return Reading { - Reading::Type::FLM_72, - reader_.read(0, 32), - Pressure { static_cast(reader_.read(40, 8)) * 4 / 3 }, - Temperature { static_cast(reader_.read(48, 8)) - 50 } - }; - - case 80: - return Reading { - Reading::Type::FLM_80, - reader_.read(8, 32), - Pressure { static_cast(reader_.read(48, 8)) * 4 / 3 }, - Temperature { static_cast(reader_.read(56, 8)) - 50 } - }; - - default: - return { }; - } -} - -size_t Packet::crc_valid_length() const { - constexpr uint32_t checksum_bytes = 0b1111111; - constexpr uint32_t crc_72_bytes = 0b111111111; - constexpr uint32_t crc_80_bytes = 0b1111111110; - - std::array bytes; - for(size_t i=0; i crc_72 { 0x01, 0x00 }; - CRC crc_80 { 0x01, 0x00 }; - - for(size_t i=0; i= 1<<32, weirdness will ensue! - const auto tuning_frequency_str = to_string_dec_uint(tuning_frequency, 10); + const auto tuning_frequency_str = to_string_dec_uint(target_frequency, 10); std::string entry = tuning_frequency_str + " FSK 38.4 19.2 " + hex_formatted.data + "/" + hex_formatted.errors; log_file.write_entry(packet.received_at(), entry); @@ -235,25 +156,32 @@ TPMSAppView::TPMSAppView(NavigationView&) { [this](Message* const p) { const auto message = static_cast(p); const tpms::Packet packet { message->packet }; - this->on_packet(packet); + this->on_packet(message->signal_type, packet); } ); - receiver_model.set_baseband_configuration({ + radio::enable({ + tuning_frequency(), + sampling_rate, + baseband_bandwidth, + rf::Direction::Receive, + false, 32, 32, + 1, + }); + + baseband::start({ .mode = 5, - .sampling_rate = 2457600, + .sampling_rate = sampling_rate, .decimation_factor = 1, }); - receiver_model.set_baseband_bandwidth(1750000); - receiver_model.set_rf_amp(false); - receiver_model.set_lna(32); - receiver_model.set_vga(32); - receiver_model.set_tuning_frequency(315000000); - receiver_model.enable(); + + logger = std::make_unique("tpms.txt"); } TPMSAppView::~TPMSAppView() { - receiver_model.disable(); + baseband::stop(); + radio::disable(); + EventDispatcher::message_map().unregister_handler(Message::ID::TPMSPacket); } @@ -266,10 +194,12 @@ void TPMSAppView::set_parent_rect(const Rect new_parent_rect) { recent_entries_view.set_parent_rect({ 0, 0, new_parent_rect.width(), new_parent_rect.height() }); } -void TPMSAppView::on_packet(const tpms::Packet& packet) { - logger.on_packet(packet); +void TPMSAppView::on_packet(const tpms::SignalType signal_type, const tpms::Packet& packet) { + if( logger ) { + logger->on_packet(packet, target_frequency()); + } - const auto reading_opt = packet.reading(); + const auto reading_opt = packet.reading(signal_type); if( reading_opt.is_valid() ) { const auto reading = reading_opt.value(); recent.on_packet({ reading.type(), reading.id() }, reading); @@ -282,4 +212,12 @@ void TPMSAppView::on_show_list() { recent_entries_view.focus(); } +uint32_t TPMSAppView::target_frequency() const { + return initial_target_frequency; +} + +uint32_t TPMSAppView::tuning_frequency() const { + return target_frequency() - (sampling_rate / 4); +} + } /* namespace ui */ diff --git a/firmware/application/tpms_app.hpp b/firmware/application/tpms_app.hpp index 0ecf4884..24516908 100644 --- a/firmware/application/tpms_app.hpp +++ b/firmware/application/tpms_app.hpp @@ -25,127 +25,11 @@ #include "ui_widget.hpp" #include "ui_navigation.hpp" -#include "field_reader.hpp" -#include "baseband_packet.hpp" -#include "manchester.hpp" #include "log_file.hpp" #include "recent_entries.hpp" -#include "optional.hpp" - -#include "units.hpp" -using units::Temperature; -using units::Pressure; - -namespace tpms { - -class TransponderID { -public: - constexpr TransponderID( - ) : id_ { 0 } - { - } - - constexpr TransponderID( - const uint32_t id - ) : id_ { id } - { - } - - constexpr uint32_t value() const { - return id_; - } - -private: - uint32_t id_; -}; - -class Reading { -public: - enum Type { - None = 0, - FLM_64 = 1, - FLM_72 = 2, - FLM_80 = 3, - }; - - constexpr Reading( - ) : type_ { Type::None } - { - } - - constexpr Reading( - Type type, - TransponderID id - ) : type_ { type }, - id_ { id } - { - } - - constexpr Reading( - Type type, - TransponderID id, - Optional pressure = { }, - Optional temperature = { } - ) : type_ { type }, - id_ { id }, - pressure_ { pressure }, - temperature_ { temperature } - { - } - - Type type() const { - return type_; - } - - TransponderID id() const { - return id_; - } - - Optional pressure() const { - return pressure_; - } - - Optional temperature() const { - return temperature_; - } - -private: - Type type_ { Type::None }; - TransponderID id_ { 0 }; - Optional pressure_ { }; - Optional temperature_ { }; -}; - -class Packet { -public: - constexpr Packet( - const baseband::Packet& packet - ) : packet_ { packet }, - decoder_ { packet_, 0 }, - reader_ { decoder_ } - { - } - - Timestamp received_at() const; - - ManchesterFormatted symbols_formatted() const; - - Optional reading() const; - -private: - using Reader = FieldReader; - - const baseband::Packet packet_; - const ManchesterDecoder decoder_; - - const Reader reader_; - - size_t crc_valid_length() const; -}; - -} /* namespace tpms */ +#include "tpms_packet.hpp" namespace std { @@ -186,10 +70,12 @@ using TPMSRecentEntries = RecentEntries; class TPMSLogger { public: - void on_packet(const tpms::Packet& packet); + TPMSLogger(const std::string& file_path); + + void on_packet(const tpms::Packet& packet, const uint32_t target_frequency); private: - LogFile log_file { "tpms.txt" }; + LogFile log_file; }; namespace ui { @@ -212,13 +98,20 @@ public: std::string title() const override { return "TPMS"; }; private: + static constexpr uint32_t initial_target_frequency = 315000000; + static constexpr uint32_t sampling_rate = 2457600; + static constexpr uint32_t baseband_bandwidth = 1750000; + TPMSRecentEntries recent; - TPMSLogger logger; + std::unique_ptr logger; TPMSRecentEntriesView recent_entries_view { recent }; - void on_packet(const tpms::Packet& packet); + void on_packet(const tpms::SignalType signal_type, const tpms::Packet& packet); void on_show_list(); + + uint32_t target_frequency() const; + uint32_t tuning_frequency() const; }; } /* namespace ui */ diff --git a/firmware/application/ui_console.cpp b/firmware/application/ui_console.cpp index 65482236..28b9f298 100644 --- a/firmware/application/ui_console.cpp +++ b/firmware/application/ui_console.cpp @@ -35,7 +35,7 @@ void Console::clear() { display.scroll_set_position(0); } -void Console::write(const std::string message) { +void Console::write(const std::string& message) { const Style& s = style(); const Font& font = s.font; const auto rect = screen_rect(); @@ -58,7 +58,7 @@ void Console::write(const std::string message) { } } -void Console::writeln(const std::string message) { +void Console::writeln(const std::string& message) { write(message); crlf(); } diff --git a/firmware/application/ui_console.hpp b/firmware/application/ui_console.hpp index 4f29486a..db49acc7 100644 --- a/firmware/application/ui_console.hpp +++ b/firmware/application/ui_console.hpp @@ -33,8 +33,8 @@ namespace ui { class Console : public Widget { public: void clear(); - void write(const std::string message); - void writeln(const std::string message); + void write(const std::string& message); + void writeln(const std::string& message); void paint(Painter& painter) override; diff --git a/firmware/application/ui_debug.cpp b/firmware/application/ui_debug.cpp index 004c7769..e3d673a0 100644 --- a/firmware/application/ui_debug.cpp +++ b/firmware/application/ui_debug.cpp @@ -26,6 +26,10 @@ #include "radio.hpp" #include "string_format.hpp" +#include "audio.hpp" + +#include "ui_sd_card_debug.hpp" + namespace ui { /* DebugMemoryView *******************************************************/ @@ -33,8 +37,8 @@ namespace ui { DebugMemoryView::DebugMemoryView(NavigationView& nav) { add_children({ { &text_title, - &text_label_m0_free, - &text_label_m0_free_value, + &text_label_m0_core_free, + &text_label_m0_core_free_value, &text_label_m0_heap_fragmented_free, &text_label_m0_heap_fragmented_free_value, &text_label_m0_heap_fragments, @@ -42,8 +46,8 @@ DebugMemoryView::DebugMemoryView(NavigationView& nav) { &button_done } }); - const auto m0_free = chCoreStatus(); - text_label_m0_free_value.set(to_string_dec_uint(m0_free, 5)); + const auto m0_core_free = chCoreStatus(); + text_label_m0_core_free_value.set(to_string_dec_uint(m0_core_free, 5)); size_t m0_fragmented_free_space = 0; const auto m0_fragments = chHeapStatus(NULL, &m0_fragmented_free_space); @@ -240,68 +244,39 @@ void RegistersView::focus() { button_done.focus(); } -char hexify(char in) { - if (in > 9) in += 7; - return in + 0x30; -} +/* DebugPeripheralsMenuView **********************************************/ -DebugLCRView::DebugLCRView(NavigationView& nav, char * lcrstring, uint8_t checksum) { - char cstr[15] = "Checksum: 0x "; - - add_children({ { - &text_lcr1, - &text_lcr2, - &text_lcr3, - &text_lcr4, - &text_lcr5, - &text_checksum, - &button_done +DebugPeripheralsMenuView::DebugPeripheralsMenuView(NavigationView& nav) { + add_items<4>({ { + { "RFFC5072", [&nav](){ nav.push( + "RFFC5072", RegistersWidgetConfig { 31, 2, 4, 4 }, + [](const size_t register_number) { return radio::debug::first_if::register_read(register_number); } + ); } }, + { "MAX2837", [&nav](){ nav.push( + "MAX2837", RegistersWidgetConfig { 32, 2, 3, 4 }, + [](const size_t register_number) { return radio::debug::second_if::register_read(register_number); } + ); } }, + { "Si5351C", [&nav](){ nav.push( + "Si5351C", RegistersWidgetConfig { 96, 2, 2, 8 }, + [](const size_t register_number) { return portapack::clock_generator.read_register(register_number); } + ); } }, + { "WM8731", [&nav](){ nav.push( + "WM8731", RegistersWidgetConfig { audio::debug::reg_count(), 1, 3, 4 }, + [](const size_t register_number) { return audio::debug::reg_read(register_number); } + ); } }, } }); - - std::string b = std::string(lcrstring); - - text_lcr1.set(b.substr(8+(0*26),26)); - if (strlen(lcrstring) > 34) text_lcr2.set(b.substr(8+(1*26),26)); - if (strlen(lcrstring) > 34+26) text_lcr3.set(b.substr(8+(2*26),26)); - if (strlen(lcrstring) > 34+26+26) text_lcr4.set(b.substr(8+(3*26),26)); - if (strlen(lcrstring) > 34+26+26+26) text_lcr5.set(b.substr(8+(4*26),26)); - - cstr[12] = hexify(checksum >> 4); - cstr[13] = hexify(checksum & 15); - - text_checksum.set(cstr); - - button_done.on_select = [&nav](Button&){ nav.pop(); }; -} - -void DebugLCRView::focus() { - button_done.focus(); + on_left = [&nav](){ nav.pop(); }; } /* DebugMenuView *********************************************************/ DebugMenuView::DebugMenuView(NavigationView& nav) { - add_items<8>({ { - { "Memory", ui::Color::white(), [&nav](){ nav.push(); } }, - { "Radio State", ui::Color::white(), [&nav](){ nav.push(); } }, - { "SD Card", ui::Color::white(), [&nav](){ nav.push(); } }, - { "RFFC5072", ui::Color::white(), [&nav](){ nav.push( - "RFFC5072", RegistersWidgetConfig { 31, 2, 4, 4 }, - [](const size_t register_number) { return radio::first_if.read(register_number); } - ); } }, - { "MAX2837", ui::Color::white(), [&nav](){ nav.push( - "MAX2837", RegistersWidgetConfig { 32, 2, 3, 4 }, - [](const size_t register_number) { return radio::second_if.read(register_number); } - ); } }, - { "Si5351C", ui::Color::white(), [&nav](){ nav.push( - "Si5351C", RegistersWidgetConfig { 96, 2, 2, 8 }, - [](const size_t register_number) { return portapack::clock_generator.read_register(register_number); } - ); } }, - { "WM8731", ui::Color::white(), [&nav](){ nav.push( - "WM8731", RegistersWidgetConfig { wolfson::wm8731::reg_count, 1, 3, 4 }, - [](const size_t register_number) { return portapack::audio_codec.read(register_number); } - ); } }, - { "Temperature", ui::Color::white(), [&nav](){ nav.push(); } }, + add_items<5>({ { + { "Memory", [&nav](){ nav.push(); } }, + { "Radio State", [&nav](){ nav.push(); } }, + { "SD Card", [&nav](){ nav.push(); } }, + { "Peripherals", [&nav](){ nav.push(); } }, + { "Temperature", [&nav](){ nav.push(); } }, } }); on_left = [&nav](){ nav.pop(); }; } diff --git a/firmware/application/ui_debug.hpp b/firmware/application/ui_debug.hpp index 3340c969..504ab063 100644 --- a/firmware/application/ui_debug.hpp +++ b/firmware/application/ui_debug.hpp @@ -36,8 +36,6 @@ #include namespace ui { - -char hexify(char in); class DebugMemoryView : public View { public: @@ -51,12 +49,12 @@ private: "Memory", }; - Text text_label_m0_free { - { 0, 128, 104, 16 }, - "M0 Free Bytes", + Text text_label_m0_core_free { + { 0, 128, 144, 16 }, + "M0 Core Free Bytes", }; - Text text_label_m0_free_value { + Text text_label_m0_core_free_value { { 200, 128, 40, 16 }, }; @@ -279,6 +277,11 @@ private: }; }; +class DebugPeripheralsMenuView : public MenuView { +public: + DebugPeripheralsMenuView(NavigationView& nav); +}; + class DebugMenuView : public MenuView { public: DebugMenuView(NavigationView& nav); diff --git a/firmware/application/ui_menu.cpp b/firmware/application/ui_menu.cpp index 0924f016..9f45a468 100644 --- a/firmware/application/ui_menu.cpp +++ b/firmware/application/ui_menu.cpp @@ -32,17 +32,19 @@ void MenuItemView::select() { } void MenuItemView::highlight() { - set_highlight(true); + set_highlighted(true); + set_dirty(); } void MenuItemView::unhighlight() { - set_highlight(false); + set_highlighted(false); + set_dirty(); } void MenuItemView::paint(Painter& painter) { const auto r = screen_rect(); - const auto paint_style = (flags.highlighted && parent()->has_focus()) ? style().invert() : style(); + const auto paint_style = (highlighted() && parent()->has_focus()) ? style().invert() : style(); const auto font_height = paint_style.font.line_height(); @@ -68,11 +70,6 @@ void MenuItemView::paint(Painter& painter) { ); } -void MenuItemView::set_highlight(const bool value) { - flags.highlighted = value; - set_dirty(); -} - /* MenuView **************************************************************/ MenuView::~MenuView() { diff --git a/firmware/application/ui_menu.hpp b/firmware/application/ui_menu.hpp index c52f2c3a..9740bc1f 100644 --- a/firmware/application/ui_menu.hpp +++ b/firmware/application/ui_menu.hpp @@ -36,6 +36,10 @@ struct MenuItem { std::string text; ui::Color color; std::function on_select; + + // TODO: Prevent default-constructed MenuItems. + // I managed to construct a menu with three extra, unspecified menu items + // in the array that were default constructed... }; class MenuItemView : public Widget { @@ -54,8 +58,6 @@ public: private: const MenuItem item; - - void set_highlight(const bool value); }; class MenuView : public View { @@ -63,7 +65,7 @@ public: std::function on_left; MenuView() { - flags.focusable = true; + set_focusable(true); } ~MenuView(); @@ -71,7 +73,7 @@ public: void add_item(const MenuItem item); template - void add_items(const std::array items) { + void add_items(const std::array& items) { for(const auto& item : items) { add_item(item); } diff --git a/firmware/application/ui_navigation.cpp b/firmware/application/ui_navigation.cpp index 103a3505..3ccaacbb 100644 --- a/firmware/application/ui_navigation.cpp +++ b/firmware/application/ui_navigation.cpp @@ -23,37 +23,23 @@ #include "portapack.hpp" #include "event_m0.hpp" -#include "receiver_model.hpp" -#include "transmitter_model.hpp" -#include "portapack_persistent_memory.hpp" #include "splash.hpp" #include "ui_about.hpp" #include "ui_setup.hpp" #include "ui_debug.hpp" -#include "ui_receiver.hpp" -#include "ui_rds.hpp" -#include "ui_lcr.hpp" -#include "ui_whistle.hpp" -#include "ui_jammer.hpp" -#include "ui_loadmodule.hpp" -#include "ui_afskrx.hpp" -#include "ui_xylos.hpp" -#include "ui_sigfrx.hpp" -#include "ui_numbers.hpp" #include "analog_audio_app.hpp" #include "ais_app.hpp" #include "ert_app.hpp" #include "tpms_app.hpp" +#include "capture_app.hpp" -#include "m4_startup.hpp" -#include "spi_image.hpp" +#include "core_control.hpp" -#include "modules.h" - -using namespace portapack; +#include "file.hpp" +#include "png_writer.hpp" namespace ui { @@ -63,6 +49,7 @@ SystemStatusView::SystemStatusView() { add_children({ { &button_back, &title, + &button_camera, &button_sleep, &sd_card_status_view, } }); @@ -73,14 +60,19 @@ SystemStatusView::SystemStatusView() { } }; + button_camera.on_select = [this](ImageButton&) { + this->on_camera(); + }; + button_sleep.on_select = [this](ImageButton&) { DisplaySleepMessage message; EventDispatcher::message_map().send(&message); }; } -void SystemStatusView::set_back_visible(bool new_value) { - button_back.hidden(!new_value); +void SystemStatusView::set_back_enabled(bool new_value) { + button_back.set_text(new_value ? back_text_enabled : back_text_disabled); + button_back.set_focusable(new_value); } void SystemStatusView::set_title(const std::string new_value) { @@ -91,6 +83,21 @@ void SystemStatusView::set_title(const std::string new_value) { } } +void SystemStatusView::on_camera() { + const auto filename = next_filename_matching_pattern("SCR_????.PNG"); + if( filename.empty() ) { + return; + } + + PNGWriter png { filename }; + + for(int i=0; i<320; i++) { + std::array row; + portapack::display.read_pixels({ 0, i, 240, 1 }, row); + png.write_scanline(row); + } +} + /* Navigation ************************************************************/ bool NavigationView::is_top() const { @@ -108,10 +115,6 @@ View* NavigationView::push_view(std::unique_ptr new_view) { return p; } -void NavigationView::push(View* v) { - push_view(std::unique_ptr(v)); -} - void NavigationView::pop() { // Can't pop last item from stack. if( view_stack.size() > 1 ) { @@ -153,25 +156,37 @@ void NavigationView::focus() { TranspondersMenuView::TranspondersMenuView(NavigationView& nav) { add_items<3>({ { - { "AIS: Boats", ui::Color::white(), [&nav](){ nav.push(); } }, - { "ERT: Utility Meters", ui::Color::white(), [&nav](){ nav.push(); } }, - { "TPMS: Cars", ui::Color::white(), [&nav](){ nav.push(); } }, + { "AIS: Boats", [&nav](){ nav.push(); } }, + { "ERT: Utility Meters", [&nav](){ nav.push(); } }, + { "TPMS: Cars", [&nav](){ nav.push(); } }, } }); + on_left = [&nav](){ nav.pop(); }; } /* ReceiverMenuView ******************************************************/ ReceiverMenuView::ReceiverMenuView(NavigationView& nav) { add_items<2>({ { - { "Audio", ui::Color::white(), [&nav](){ nav.push(); } }, - { "Transponders", ui::Color::white(), [&nav](){ nav.push(); } }, + { "Audio", [&nav](){ nav.push(); } }, + { "Transponders", [&nav](){ nav.push(); } }, } }); + on_left = [&nav](){ nav.pop(); }; } /* SystemMenuView ********************************************************/ SystemMenuView::SystemMenuView(NavigationView& nav) { - add_items<10>({ { + add_items<7>({ { + { "Receiver", [&nav](){ nav.push(); } }, + { "Capture", [&nav](){ nav.push(); } }, + { "Analyze", [&nav](){ nav.push(); } }, + { "Setup", [&nav](){ nav.push(); } }, + { "About", [&nav](){ nav.push(); } }, + { "Debug", [&nav](){ nav.push(); } }, + { "HackRF", [&nav](){ nav.push(); } }, + } }); + +/* add_items<10>({ { { "Play dead", ui::Color::red(), [&nav](){ nav.push(false); } }, { "Receiver", ui::Color::cyan(), [&nav](){ nav.push(md5_baseband, new ReceiverMenuView(nav)); } }, //{ "Nordic/BTLE RX", ui::Color::cyan(), [&nav](){ nav.push(new NotImplementedView { nav }); } }, @@ -190,7 +205,7 @@ SystemMenuView::SystemMenuView(NavigationView& nav) { { "About", ui::Color::white(), [&nav](){ nav.push(); } }, { "Debug", ui::Color::white(), [&nav](){ nav.push(); } }, { "HackRF", ui::Color::white(), [&nav](){ nav.push(); } }, - } }); + } });*/ } /* SystemView ************************************************************/ @@ -207,7 +222,7 @@ SystemView::SystemView( ) : View { parent_rect }, context_(context) { - style_ = &style_default; + set_style(&style_default); constexpr ui::Dim status_view_height = 16; @@ -226,7 +241,7 @@ SystemView::SystemView( { parent_rect.width(), static_cast(parent_rect.height() - status_view_height) } }); navigation_view.on_view_changed = [this](const View& new_view) { - this->status_view.set_back_visible(!this->navigation_view.is_top()); + this->status_view.set_back_enabled(!this->navigation_view.is_top()); this->status_view.set_title(new_view.title()); }; diff --git a/firmware/application/ui_navigation.hpp b/firmware/application/ui_navigation.hpp index 12b67dea..2d8f1e99 100644 --- a/firmware/application/ui_navigation.hpp +++ b/firmware/application/ui_navigation.hpp @@ -60,21 +60,46 @@ static constexpr Bitmap bitmap_sleep { { 16, 16 }, bitmap_sleep_data }; +static constexpr uint8_t bitmap_camera_data[] = { + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, + 0xcc, 0x03, + 0xe8, 0x07, + 0xfc, 0x3f, + 0x3c, 0x3c, + 0x9c, 0x39, + 0xdc, 0x3b, + 0xdc, 0x3b, + 0x9c, 0x39, + 0x3c, 0x3c, + 0xfc, 0x3f, + 0x00, 0x00, + 0x00, 0x00, + 0x00, 0x00, +}; + +static constexpr Bitmap bitmap_camera { + { 16, 16 }, bitmap_camera_data +}; + class SystemStatusView : public View { public: std::function on_back; SystemStatusView(); - void set_back_visible(bool new_value); + void set_back_enabled(bool new_value); void set_title(const std::string new_value); private: static constexpr auto default_title = "PortaPack"; + static constexpr auto back_text_enabled = " < "; + static constexpr auto back_text_disabled = " * "; Button button_back { { 0 * 8, 0 * 16, 3 * 8, 16 }, - " < ", + back_text_disabled, }; Text title { @@ -82,6 +107,13 @@ private: default_title, }; + ImageButton button_camera { + { 22 * 8, 0, 2 * 8, 1 * 16 }, + &bitmap_camera, + Color::white(), + Color::black() + }; + ImageButton button_sleep { { 25 * 8, 0, 2 * 8, 1 * 16 }, &bitmap_sleep, @@ -92,6 +124,8 @@ private: SDCardStatusView sd_card_status_view { { 28 * 8, 0 * 16, 2 * 8, 1 * 16 } }; + + void on_camera(); }; class NavigationView : public View { diff --git a/firmware/application/ui_receiver.cpp b/firmware/application/ui_receiver.cpp index f80db742..0494d47c 100644 --- a/firmware/application/ui_receiver.cpp +++ b/firmware/application/ui_receiver.cpp @@ -38,7 +38,7 @@ FrequencyField::FrequencyField( length_ { 11 }, range(rf::tuning_range) { - flags.focusable = true; + set_focusable(true); } rf::Frequency FrequencyField::value() const { @@ -318,4 +318,24 @@ void LNAGainField::on_focus() { } } +/* VGAGainField **********************************************************/ + +VGAGainField::VGAGainField( + Point parent_pos +) : NumberField { + parent_pos, 2, + { max2837::vga::gain_db_range.minimum, max2837::vga::gain_db_range.maximum }, + max2837::vga::gain_db_step, + ' ', + } +{ +} + +void VGAGainField::on_focus() { + //Widget::on_focus(); + if( on_show_options ) { + on_show_options(); + } +} + } /* namespace ui */ diff --git a/firmware/application/ui_receiver.hpp b/firmware/application/ui_receiver.hpp index fa74f970..6aff9dda 100644 --- a/firmware/application/ui_receiver.hpp +++ b/firmware/application/ui_receiver.hpp @@ -315,6 +315,15 @@ public: void on_focus() override; }; +class VGAGainField : public NumberField { +public: + std::function on_show_options; + + VGAGainField(Point parent_pos); + + void on_focus() override; +}; + } /* namespace ui */ #endif/*__UI_RECEIVER_H__*/ diff --git a/firmware/application/ui_sd_card_debug.cpp b/firmware/application/ui_sd_card_debug.cpp new file mode 100644 index 00000000..25d9ba5d --- /dev/null +++ b/firmware/application/ui_sd_card_debug.cpp @@ -0,0 +1,409 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "ui_sd_card_debug.hpp" + +#include "string_format.hpp" + +#include "file.hpp" +#include "lfsr_random.hpp" + +#include "ff.h" + +#include "ch.h" +#include "hal.h" + +class SDCardTestThread { +public: + enum Result { + FailCompare = -8, + FailReadIncomplete = -7, + FailWriteIncomplete = -6, + FailAbort = -5, + FailFileOpenRead = -4, + FailFileOpenWrite = -3, + FailHeap = -2, + FailThread = -1, + Incomplete = 0, + OK = 1, + }; + + struct Stats { + halrtcnt_t write_duration_min { 0 }; + halrtcnt_t write_duration_max { 0 }; + halrtcnt_t write_test_duration { 0 }; + size_t write_bytes { 0 }; + size_t write_count { 0 }; + + halrtcnt_t read_duration_min { 0 }; + halrtcnt_t read_duration_max { 0 }; + halrtcnt_t read_test_duration { 0 }; + size_t read_bytes { 0 }; + size_t read_count { 0 }; + }; + + SDCardTestThread( + ) { + thread = chThdCreateFromHeap(NULL, 2048, NORMALPRIO + 10, SDCardTestThread::static_fn, this); + } + + Result result() const { + return _result; + } + + const Stats& stats() const { + return _stats; + } + + ~SDCardTestThread() { + chThdTerminate(thread); + chThdWait(thread); + } + +private: + static constexpr size_t write_size = 16384; + static constexpr size_t bytes_to_write = 16 * 1024 * 1024; + static constexpr size_t bytes_to_read = bytes_to_write; + + static Thread* thread; + volatile Result _result { Result::Incomplete }; + Stats _stats; + + static msg_t static_fn(void* arg) { + auto obj = static_cast(arg); + obj->_result = obj->run(); + return 0; + } + + Result run() { + const std::string filename { "_PPTEST_.DAT" }; + + const auto write_result = write(filename); + if( write_result != Result::OK ) { + return write_result; + } + + if( _stats.write_bytes < bytes_to_write ) { + return Result::FailWriteIncomplete; + } + + if( chThdShouldTerminate() ) { + return Result::FailAbort; + } + + const auto read_result = read(filename); + if( read_result != Result::OK ) { + return read_result; + } + + f_unlink(filename.c_str()); + + if( _stats.read_bytes < bytes_to_read ) { + return Result::FailReadIncomplete; + } + + if( chThdShouldTerminate() ) { + return Result::FailAbort; + } + + return Result::OK; + } + + Result write(const std::string& filename) { + const auto buffer = std::make_unique>(); + if( !buffer ) { + return Result::FailHeap; + } + + File file; + if( !file.open_for_writing(filename) ) { + return Result::FailFileOpenWrite; + } + + lfsr_word_t v = 1; + + const halrtcnt_t test_start = halGetCounterValue(); + while( !chThdShouldTerminate() && file.is_ready() && (_stats.write_bytes < bytes_to_write) ) { + lfsr_fill(v, + reinterpret_cast(buffer->data()), + sizeof(*buffer.get()) / sizeof(lfsr_word_t) + ); + + const halrtcnt_t write_start = halGetCounterValue(); + if( !file.write(buffer->data(), buffer->size()) ) { + break; + } + const halrtcnt_t write_end = halGetCounterValue(); + _stats.write_bytes += buffer->size(); + _stats.write_count++; + + const halrtcnt_t write_duration = write_end - write_start; + if( (_stats.write_duration_min == 0) || (write_duration < _stats.write_duration_min) ) { + _stats.write_duration_min = write_duration; + } + if( write_duration > _stats.write_duration_max ) { + _stats.write_duration_max = write_duration; + } + } + + file.close(); + + const halrtcnt_t test_end = halGetCounterValue(); + _stats.write_test_duration = test_end - test_start; + + return Result::OK; + } + + Result read(const std::string& filename) { + const auto buffer = std::make_unique>(); + if( !buffer ) { + return Result::FailHeap; + } + + File file; + if( !file.open_for_reading(filename) ) { + return Result::FailFileOpenRead; + } + + lfsr_word_t v = 1; + + const halrtcnt_t test_start = halGetCounterValue(); + while( !chThdShouldTerminate() && file.is_ready() && (_stats.read_bytes < bytes_to_read) ) { + const halrtcnt_t read_start = halGetCounterValue(); + if( !file.read(buffer->data(), buffer->size()) ) { + break; + } + const halrtcnt_t read_end = halGetCounterValue(); + _stats.read_bytes += buffer->size(); + _stats.read_count++; + + const halrtcnt_t read_duration = read_end - read_start; + if( (_stats.read_duration_min == 0) || (read_duration < _stats.read_duration_min) ) { + _stats.read_duration_min = read_duration; + } + if( read_duration > _stats.read_duration_max ) { + _stats.read_duration_max = read_duration; + } + + if( !lfsr_compare(v, + reinterpret_cast(buffer->data()), + sizeof(*buffer.get()) / sizeof(lfsr_word_t)) + ) { + return Result::FailCompare; + } + } + + file.close(); + + const halrtcnt_t test_end = halGetCounterValue(); + _stats.read_test_duration = test_end - test_start; + + return Result::OK; + } +}; + +Thread* SDCardTestThread::thread { nullptr }; + +namespace ui { + +SDCardDebugView::SDCardDebugView(NavigationView& nav) { + add_children({ { + &text_title, + &text_detected_title, + &text_detected_value, + &text_bus_width_title, + &text_bus_width_value, + &text_card_mode_title, + &text_card_mode_value, + // &text_csd_title, + // &text_csd_value, + &text_block_size_title, + &text_block_size_value, + &text_block_count_title, + &text_block_count_value, + &text_capacity_title, + &text_capacity_value, + &text_test_write_time_title, + &text_test_write_time_value, + &text_test_write_rate_title, + &text_test_write_rate_value, + &text_test_read_time_title, + &text_test_read_time_value, + &text_test_read_rate_title, + &text_test_read_rate_value, + &button_test, + &button_ok, + } }); + + button_test.on_select = [this](Button&){ this->on_test(); }; + button_ok.on_select = [&nav](Button&){ nav.pop(); }; +} + +void SDCardDebugView::on_show() { + sd_card_status_signal_token = sd_card::status_signal += [this](const sd_card::Status status) { + this->on_status(status); + }; + on_status(sd_card::status()); +} + +void SDCardDebugView::on_hide() { + sd_card::status_signal -= sd_card_status_signal_token; +} + +void SDCardDebugView::focus() { + button_ok.focus(); +} + +void SDCardDebugView::on_status(const sd_card::Status) { + text_bus_width_value.set(""); + text_card_mode_value.set(""); + // text_csd_value.set(""); + text_block_size_value.set(""); + text_block_count_value.set(""); + text_capacity_value.set(""); + text_test_write_time_value.set(""); + text_test_write_rate_value.set(""); + text_test_read_time_value.set(""); + text_test_read_rate_value.set(""); + + const bool is_inserted = sdcIsCardInserted(&SDCD1); + text_detected_value.set(is_inserted ? "Yes" : " No"); + + if( is_inserted ) { + const auto card_width_flags = LPC_SDMMC->CTYPE & 0x10001; + size_t card_width = 0; + switch(card_width_flags) { + case 0x00000: card_width = 1; break; + case 0x00001: card_width = 4; break; + case 0x10001: card_width = 8; break; + default: break; + } + + text_bus_width_value.set(card_width ? to_string_dec_uint(card_width, 1) : "X"); + text_card_mode_value.set("0x" + to_string_hex(SDCD1.cardmode, 8)); + // text_csd_value.set("0x" + to_string_hex(SDCD1.csd, 8)); + + BlockDeviceInfo block_device_info; + if( sdcGetInfo(&SDCD1, &block_device_info) == CH_SUCCESS ) { + text_block_size_value.set(to_string_dec_uint(block_device_info.blk_size, 5)); + text_block_count_value.set(to_string_dec_uint(block_device_info.blk_num, 9)); + const uint64_t capacity = block_device_info.blk_size * uint64_t(block_device_info.blk_num); + if( capacity >= 1000000000 ) { + const uint32_t capacity_mb = capacity / 1000000U; + const uint32_t fraction_gb = capacity_mb % 1000; + const uint32_t capacity_gb = capacity_mb / 1000U; + text_capacity_value.set( + to_string_dec_uint(capacity_gb, 3) + "." + + to_string_dec_uint(fraction_gb, 3, '0') + " GB" + ); + } else { + const uint32_t capacity_kb = capacity / 1000U; + const uint32_t fraction_mb = capacity_kb % 1000; + const uint32_t capacity_mb = capacity_kb / 1000U; + text_capacity_value.set( + to_string_dec_uint(capacity_mb, 3) + "." + + to_string_dec_uint(fraction_mb, 3, '0') + " MB" + ); + } + } + } +} + +static std::string format_ticks_as_ms(const halrtcnt_t value) { + const uint32_t us = uint64_t(value) * 1000000U / halGetCounterFrequency(); + const uint32_t ms_frac = us % 1000U; + const uint32_t ms_int = us / 1000U; + if( ms_int < 1000 ) { + return to_string_dec_uint(ms_int, 3) + "." + to_string_dec_uint(ms_frac, 3, '0'); + } else { + return "HHH.HHH"; + } +} + +static std::string format_bytes_per_ticks_as_mib(const size_t bytes, const halrtcnt_t ticks) { + const uint32_t bps = uint64_t(bytes) * halGetCounterFrequency() / ticks; + const uint32_t kbps = bps / 1000U; + const uint32_t mbps_frac = kbps % 1000U; + const uint32_t mbps_int = kbps / 1000U; + if( mbps_int < 1000 ) { + return to_string_dec_uint(mbps_int, 3) + "." + to_string_dec_uint(mbps_frac, 3, '0'); + } else { + return "HHH.HHH"; + } +} + +void SDCardDebugView::on_test() { + text_test_write_time_value.set(""); + text_test_write_rate_value.set(""); + text_test_read_time_value.set(""); + text_test_read_rate_value.set(""); + + SDCardTestThread thread; + + // uint32_t spinner_phase = 0; + while( thread.result() == SDCardTestThread::Result::Incomplete ) { + chThdSleepMilliseconds(100); + + // spinner_phase += 1; + // char c = '*'; + // switch(spinner_phase % 4) { + // case 0: c = '-'; break; + // case 1: c = '\\'; break; + // case 2: c = '|'; break; + // case 3: c = '/'; break; + // default: c = '*'; break; + // } + // text_test_write_value.set({ c }); + } + + if( thread.result() == SDCardTestThread::Result::OK ) { + const auto stats = thread.stats(); + const auto write_duration_avg = stats.write_test_duration / stats.write_count; + + text_test_write_time_value.set( + format_ticks_as_ms(stats.write_duration_min) + "/" + + format_ticks_as_ms(write_duration_avg) + "/" + + format_ticks_as_ms(stats.write_duration_max) + ); + + text_test_write_rate_value.set( + format_bytes_per_ticks_as_mib(stats.write_bytes, stats.write_duration_min * stats.write_count) + " " + + format_bytes_per_ticks_as_mib(stats.write_bytes, stats.write_test_duration) + ); + + const auto read_duration_avg = stats.read_test_duration / stats.read_count; + + text_test_read_time_value.set( + format_ticks_as_ms(stats.read_duration_min) + "/" + + format_ticks_as_ms(read_duration_avg) + "/" + + format_ticks_as_ms(stats.read_duration_max) + ); + + text_test_read_rate_value.set( + format_bytes_per_ticks_as_mib(stats.read_bytes, stats.read_duration_min * stats.read_count) + " " + + format_bytes_per_ticks_as_mib(stats.read_bytes, stats.read_test_duration) + ); + } else { + text_test_write_time_value.set("Fail: " + to_string_dec_int(toUType(thread.result()), 4)); + } +} + +} /* namespace ui */ diff --git a/firmware/application/ui_sd_card_debug.hpp b/firmware/application/ui_sd_card_debug.hpp new file mode 100644 index 00000000..a573f3a1 --- /dev/null +++ b/firmware/application/ui_sd_card_debug.hpp @@ -0,0 +1,203 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __UI_SD_CARD_DEBUG_H__ +#define __UI_SD_CARD_DEBUG_H__ + +#include "ui_widget.hpp" +#include "ui_navigation.hpp" + +#include "sd_card.hpp" + +namespace ui { + +class SDCardDebugView : public View { +public: + SDCardDebugView(NavigationView& nav); + + void on_show() override; + void on_hide() override; + + void focus() override; + +private: + SignalToken sd_card_status_signal_token; + + void on_status(const sd_card::Status status); + void on_test(); + + Text text_title { + { (240 - (7 * 8)) / 2, 1 * 16, (7 * 8), 16 }, + "SD Card", + }; + + static constexpr size_t detected_characters = 3; + + Text text_detected_title { + { 0, 3 * 16, (8 * 8), 16 }, + "Detected", + }; + + Text text_detected_value { + { 240 - (detected_characters * 8), 3 * 16, (detected_characters * 8), 16 }, + "", + }; + + static constexpr size_t bus_width_characters = 1; + + Text text_bus_width_title { + { 0, 5 * 16, (9 * 8), 16 }, + "Bus width", + }; + + Text text_bus_width_value { + { 240 - (bus_width_characters * 8), 5 * 16, (bus_width_characters * 8), 16 }, + "", + }; + + static constexpr size_t card_mode_characters = 10; + + Text text_card_mode_title { + { 0, 6 * 16, (9 * 8), 16 }, + "Card mode", + }; + + Text text_card_mode_value { + { 240 - (card_mode_characters * 8), 6 * 16, (card_mode_characters * 8), 16 }, + "", + }; + + // static constexpr size_t csd_characters = 10; + + // Text text_csd_title { + // { 0, 7 * 16, (3 * 8), 16 }, + // "CSD", + // }; + + // Text text_csd_value { + // { 240 - (csd_characters * 8), 7 * 16, (csd_characters * 8), 16 }, + // "", + // }; + + static constexpr size_t block_size_characters = 5; + + Text text_block_size_title { + { 0, 8 * 16, (10 * 8), 16 }, + "Block size", + }; + + Text text_block_size_value { + { 240 - (block_size_characters * 8), 8 * 16, (block_size_characters * 8), 16 }, + "", + }; + + static constexpr size_t block_count_characters = 9; + + Text text_block_count_title { + { 0, 9 * 16, (11 * 8), 16 }, + "Block count", + }; + + Text text_block_count_value { + { 240 - (block_count_characters * 8), 9 * 16, (block_count_characters * 8), 16 }, + "", + }; + + static constexpr size_t capacity_characters = 10; + + Text text_capacity_title { + { 0, 10 * 16, (8 * 8), 16 }, + "Capacity", + }; + + Text text_capacity_value { + { 240 - (capacity_characters * 8), 10 * 16, (capacity_characters * 8), 16 }, + "", + }; + + /////////////////////////////////////////////////////////////////////// + + static constexpr size_t test_write_time_characters = 23; + + Text text_test_write_time_title { + { 0, 12 * 16, (4 * 8), 16 }, + "W ms", + }; + + Text text_test_write_time_value { + { 240 - (test_write_time_characters * 8), 12 * 16, (test_write_time_characters * 8), 16 }, + "", + }; + + static constexpr size_t test_write_rate_characters = 23; + + Text text_test_write_rate_title { + { 0, 13 * 16, (6 * 8), 16 }, + "W MB/s", + }; + + Text text_test_write_rate_value { + { 240 - (test_write_rate_characters * 8), 13 * 16, (test_write_rate_characters * 8), 16 }, + "", + }; + + /////////////////////////////////////////////////////////////////////// + + static constexpr size_t test_read_time_characters = 23; + + Text text_test_read_time_title { + { 0, 14 * 16, (4 * 8), 16 }, + "R ms", + }; + + Text text_test_read_time_value { + { 240 - (test_read_time_characters * 8), 14 * 16, (test_read_time_characters * 8), 16 }, + "", + }; + + static constexpr size_t test_read_rate_characters = 23; + + Text text_test_read_rate_title { + { 0, 15 * 16, (6 * 8), 16 }, + "R MB/s", + }; + + Text text_test_read_rate_value { + { 240 - (test_read_rate_characters * 8), 15 * 16, (test_read_rate_characters * 8), 16 }, + "", + }; + + /////////////////////////////////////////////////////////////////////// + + Button button_test { + { 16, 17 * 16, 96, 24 }, + "Test" + }; + + Button button_ok { + { 240 - 96 - 16, 17 * 16, 96, 24 }, + "OK" + }; +}; + +} /* namespace ui */ + +#endif/*__UI_SD_CARD_DEBUG_H__*/ diff --git a/firmware/application/ui_sd_card_status_view.cpp b/firmware/application/ui_sd_card_status_view.cpp index 46a07720..567d9d99 100644 --- a/firmware/application/ui_sd_card_status_view.cpp +++ b/firmware/application/ui_sd_card_status_view.cpp @@ -54,8 +54,8 @@ static constexpr Bitmap bitmap_sd_card_unknown { static constexpr uint8_t bitmap_sd_card_error_data[] = { 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1f, 0xf0, 0x1f, - 0xf8, 0x1f, 0xf8, 0x1b, 0xf8, 0x19, 0xf8, 0x1c, - 0xf8, 0x1e, 0xf8, 0x1c, 0xf8, 0x19, 0xf8, 0x1b, + 0xf8, 0x1f, 0xd8, 0x1b, 0x98, 0x19, 0x38, 0x1c, + 0x78, 0x1e, 0x38, 0x1c, 0x98, 0x19, 0xd8, 0x1b, 0xf8, 0x1f, 0xf8, 0x1f, 0x00, 0x00, 0x00, 0x00, }; diff --git a/firmware/application/ui_setup.cpp b/firmware/application/ui_setup.cpp index abb0a3c7..baa50c44 100644 --- a/firmware/application/ui_setup.cpp +++ b/firmware/application/ui_setup.cpp @@ -85,7 +85,7 @@ void SetDateTimeView::focus() { button_cancel.focus(); } -void SetDateTimeView::form_init(const SetDateTimeModel model) { +void SetDateTimeView::form_init(const SetDateTimeModel& model) { field_year.set_value(model.year); field_month.set_value(model.month); field_day.set_value(model.day); @@ -137,7 +137,7 @@ void SetFrequencyCorrectionView::focus() { button_cancel.focus(); } -void SetFrequencyCorrectionView::form_init(const SetFrequencyCorrectionModel model) { +void SetFrequencyCorrectionView::form_init(const SetFrequencyCorrectionModel& model) { field_ppm.set_value(model.ppm); } diff --git a/firmware/application/ui_setup.hpp b/firmware/application/ui_setup.hpp index 0d25baeb..a11f60e8 100644 --- a/firmware/application/ui_setup.hpp +++ b/firmware/application/ui_setup.hpp @@ -42,9 +42,6 @@ struct SetDateTimeModel { class SetDateTimeView : public View { public: - std::function on_ok; - std::function on_cancel; - SetDateTimeView(NavigationView& nav); void focus() override; @@ -129,7 +126,7 @@ private: "Cancel", }; - void form_init(const SetDateTimeModel model); + void form_init(const SetDateTimeModel& model); SetDateTimeModel form_collect(); }; @@ -139,9 +136,6 @@ struct SetFrequencyCorrectionModel { class SetFrequencyCorrectionView : public View { public: - std::function on_ok; - std::function on_cancel; - SetFrequencyCorrectionView(NavigationView& nav); void focus() override; @@ -173,7 +167,7 @@ private: "Cancel", }; - void form_init(const SetFrequencyCorrectionModel model); + void form_init(const SetFrequencyCorrectionModel& model); SetFrequencyCorrectionModel form_collect(); }; diff --git a/firmware/application/ui_spectrum.cpp b/firmware/application/ui_spectrum.cpp index 27e7da43..4362db67 100644 --- a/firmware/application/ui_spectrum.cpp +++ b/firmware/application/ui_spectrum.cpp @@ -26,9 +26,10 @@ #include "spectrum_color_lut.hpp" #include "portapack.hpp" -#include "portapack_shared_memory.hpp" using namespace portapack; +#include "baseband_api.hpp" + #include "string_format.hpp" #include @@ -251,19 +252,11 @@ void WaterfallWidget::on_show() { } ); - shared_memory.baseband_queue.push_and_wait( - SpectrumStreamingConfigMessage { - SpectrumStreamingConfigMessage::Mode::Running - } - ); + baseband::spectrum_streaming_start(); } void WaterfallWidget::on_hide() { - shared_memory.baseband_queue.push_and_wait( - SpectrumStreamingConfigMessage { - SpectrumStreamingConfigMessage::Mode::Stopped - } - ); + baseband::spectrum_streaming_stop(); EventDispatcher::message_map().unregister_handler(Message::ID::DisplayFrameSync); EventDispatcher::message_map().unregister_handler(Message::ID::ChannelSpectrumConfig); diff --git a/firmware/baseband/Makefile b/firmware/baseband/Makefile index 816809b6..ffb80d85 100755 --- a/firmware/baseband/Makefile +++ b/firmware/baseband/Makefile @@ -127,6 +127,7 @@ CPPSRC = main.cpp \ message_queue.cpp \ event.cpp \ event_m4.cpp \ + thread_wait.cpp \ gpdma.cpp \ baseband_dma.cpp \ baseband_sgpio.cpp \ @@ -145,6 +146,7 @@ CPPSRC = main.cpp \ proc_wideband_spectrum.cpp \ proc_tpms.cpp \ proc_ert.cpp \ + proc_capture.cpp \ dsp_squelch.cpp \ clock_recovery.cpp \ packet_builder.cpp \ @@ -155,7 +157,7 @@ CPPSRC = main.cpp \ rssi.cpp \ rssi_dma.cpp \ rssi_thread.cpp \ - audio.cpp \ + audio_compressor.cpp \ audio_output.cpp \ audio_dma.cpp \ audio_stats_collector.cpp \ diff --git a/firmware/baseband/audio_compressor.cpp b/firmware/baseband/audio_compressor.cpp new file mode 100644 index 00000000..95bbaee3 --- /dev/null +++ b/firmware/baseband/audio_compressor.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "audio_compressor.hpp" + +float GainComputer::operator()(const float x) const { + const auto abs_x = std::abs(x); + const auto db = (abs_x < lin_floor) ? db_floor : log2_db_k * fast_log2(abs_x); + const auto overshoot_db = db - threshold_db; + if( knee_width_db > 0.0f ) { + const auto w2 = knee_width_db / 2.0f; + const auto a = w2 / (knee_width_db * knee_width_db); + const auto in_transition = (overshoot_db > -w2) && (overshoot_db < w2); + const auto rectified_overshoot = in_transition ? (a * std::pow(overshoot_db + w2, 2.0f)) : std::max(overshoot_db, 0.0f); + return rectified_overshoot * slope; + } else { + const auto rectified_overshoot = std::max(overshoot_db, 0.0f); + return rectified_overshoot * slope; + } +} + +void FeedForwardCompressor::execute_in_place(const buffer_f32_t& buffer) { + constexpr float makeup_gain = std::pow(10.0f, (threshold - (threshold / ratio)) / -20.0f); + for(size_t i=0; i + +/* Code based on article in Journal of the Audio Engineering Society + * Vol. 60, No. 6, 2012 June, by Dimitrios Giannoulis, Michael Massberg, + * Joshua D. Reiss "Digital Dynamic Range Compressor Design – A Tutorial + * and Analysis" + */ + +class GainComputer { +public: + constexpr GainComputer( + float ratio, + float threshold + ) : ratio { ratio }, + slope { 1.0f / ratio - 1.0f }, + threshold_db { threshold } + { + } + + float operator()(const float x) const; + +private: + const float ratio; + const float slope; + const float threshold_db; + + static constexpr float knee_width_db = 0.0f; + + static constexpr float db_floor = -120.0f; + static constexpr float lin_floor = std::pow(10.0f, db_floor / 20.0f); + static constexpr float log2_db_k = 20.0f * std::log10(2.0f); +}; + +class PeakDetectorBranchingSmooth { +public: + constexpr PeakDetectorBranchingSmooth( + float att_a, + float rel_a + ) : att_a { att_a }, + rel_a { rel_a } + { + } + + float operator()(const float db) { + const auto a = (db > state) ? att_a : rel_a; + state = db + a * (state - db); + return state; + } + +private: + float state { 0.0f }; + const float att_a; + const float rel_a; +}; + +class FeedForwardCompressor { +public: + void execute_in_place(const buffer_f32_t& buffer); + +private: + static constexpr float fs = 12000.0f; + static constexpr float ratio = 10.0f; + static constexpr float threshold = -30.0f; + + GainComputer gain_computer { ratio, threshold }; + PeakDetectorBranchingSmooth peak_detector { tau_alpha(0.010f, fs), tau_alpha(0.300f, fs) }; + + float execute_once(const float x); + + static constexpr float tau_alpha(const float tau, const float fs) { + return std::exp(-1.0f / (tau * fs)); + } +}; + +#endif/*__AUDIO_COMPRESSOR_H__*/ diff --git a/firmware/baseband/audio_dma.hpp b/firmware/baseband/audio_dma.hpp index ec85f080..863a4f39 100644 --- a/firmware/baseband/audio_dma.hpp +++ b/firmware/baseband/audio_dma.hpp @@ -24,9 +24,22 @@ #include -#include "audio.hpp" +#include "buffer.hpp" namespace audio { + +struct sample_t { + union { + struct { + int16_t left; + int16_t right; + }; + uint32_t raw; + }; +}; + +using buffer_t = buffer_t; + namespace dma { void init(); diff --git a/firmware/baseband/audio_output.cpp b/firmware/baseband/audio_output.cpp index fa67eab2..05d56d20 100644 --- a/firmware/baseband/audio_output.cpp +++ b/firmware/baseband/audio_output.cpp @@ -46,7 +46,7 @@ void AudioOutput::write( ) { std::array audio_f; for(size_t i=0; i audio_int; + auto audio_buffer = audio::dma::tx_empty_buffer(); for(size_t i=0; i block_buffer { 1 }; IIRBiquadFilter hpf; IIRBiquadFilter deemph; FMSquelch squelch; + StreamInput stream { 14 }; + AudioStatsCollector audio_stats; uint64_t audio_present_history = 0; void on_block(const buffer_f32_t& audio); - void fill_audio_buffer(const buffer_f32_t& audio); + void fill_audio_buffer(const buffer_f32_t& audio, const bool send_to_fifo); void feed_audio_stats(const buffer_f32_t& audio); }; diff --git a/firmware/baseband/audio_stats_collector.cpp b/firmware/baseband/audio_stats_collector.cpp index 227d5887..53fceea8 100644 --- a/firmware/baseband/audio_stats_collector.cpp +++ b/firmware/baseband/audio_stats_collector.cpp @@ -42,8 +42,8 @@ bool AudioStatsCollector::update_stats(const size_t sample_count, const size_t s const size_t samples_per_update = sampling_rate * update_interval; if( count >= samples_per_update ) { - statistics.rms_db = complex16_mag_squared_to_dbv_norm(squared_sum / count); - statistics.max_db = complex16_mag_squared_to_dbv_norm(max_squared); + statistics.rms_db = mag2_to_dbv_norm(squared_sum / count); + statistics.max_db = mag2_to_dbv_norm(max_squared); statistics.count = count; squared_sum = 0; diff --git a/firmware/baseband/baseband_dma.cpp b/firmware/baseband/baseband_dma.cpp index 7467f551..f5dcca1e 100644 --- a/firmware/baseband/baseband_dma.cpp +++ b/firmware/baseband/baseband_dma.cpp @@ -32,6 +32,8 @@ using namespace lpc43xx; #include "portapack_dma.hpp" +#include "thread_wait.hpp" + namespace baseband { namespace dma { @@ -99,21 +101,19 @@ constexpr size_t msg_count = transfers_per_buffer - 1; static std::array lli_loop; static constexpr auto& gpdma_channel_sgpio = gpdma::channels[portapack::sgpio_gpdma_channel_number]; -static Semaphore semaphore; - -static volatile const gpdma::channel::LLI* next_lli = nullptr; +static ThreadWait thread_wait; static void transfer_complete() { - next_lli = gpdma_channel_sgpio.next_lli(); - chSemSignalI(&semaphore); + const auto next_lli_index = gpdma_channel_sgpio.next_lli() - &lli_loop[0]; + thread_wait.wake_from_interrupt(next_lli_index); } static void dma_error() { + thread_wait.wake_from_interrupt(-1); disable(); } void init() { - chSemInit(&semaphore, 0); gpdma_channel_sgpio.set_handlers(transfer_complete, dma_error); // LPC_GPDMA->SYNC |= (1 << gpdma_src_peripheral); @@ -138,9 +138,6 @@ void configure( void enable(const baseband::Direction direction) { const auto gpdma_config = config(direction); gpdma_channel_sgpio.configure(lli_loop[0], gpdma_config); - - chSemReset(&semaphore, 0); - gpdma_channel_sgpio.enable(); } @@ -153,16 +150,11 @@ void disable() { } baseband::buffer_t wait_for_rx_buffer() { - const auto status = chSemWait(&semaphore); - if( status == RDY_OK ) { - const auto next = next_lli; - if( next ) { - const size_t next_index = next - &lli_loop[0]; - const size_t free_index = (next_index + transfers_per_buffer - 2) & transfers_mask; - return { reinterpret_cast(lli_loop[free_index].destaddr), transfer_samples }; - } else { - return { }; - } + const auto next_index = thread_wait.sleep(); + + if( next_index >= 0 ) { + const size_t free_index = (next_index + transfers_per_buffer - 2) & transfers_mask; + return { reinterpret_cast(lli_loop[free_index].destaddr), transfer_samples }; } else { return { }; } diff --git a/firmware/baseband/baseband_thread.cpp b/firmware/baseband/baseband_thread.cpp index b6773489..7ebfa912 100644 --- a/firmware/baseband/baseband_thread.cpp +++ b/firmware/baseband/baseband_thread.cpp @@ -38,6 +38,7 @@ #include "proc_wideband_spectrum.hpp" #include "proc_tpms.hpp" #include "proc_ert.hpp" +#include "proc_capture.hpp" #include "portapack_shared_memory.hpp" @@ -85,7 +86,7 @@ void BasebandThread::run() { baseband_sgpio.init(); baseband::dma::init(); - const auto baseband_buffer = new std::array(); + const auto baseband_buffer = std::make_unique>(); baseband::dma::configure( baseband_buffer->data(), direction() @@ -123,22 +124,6 @@ void BasebandThread::run() { delete baseband_buffer; } -char ram_loop[32]; -typedef int (*fn_ptr)(void); -fn_ptr loop_ptr; - -void ram_loop_fn(void) { - while(1) {} -} - -void BasebandThread::wait_for_switch(void) { - memcpy(&ram_loop[0], reinterpret_cast(&ram_loop_fn), 32); - loop_ptr = reinterpret_cast(&ram_loop[0]); - ReadyForSwitchMessage message; - shared_memory.application_queue.push(message); - (*loop_ptr)(); -} - BasebandProcessor* BasebandThread::create_processor(const int32_t mode) { switch(mode) { case 0: return new NarrowbandAMAudio(); @@ -148,7 +133,7 @@ BasebandProcessor* BasebandThread::create_processor(const int32_t mode) { case 4: return new WidebandSpectrum(); case 5: return new TPMSProcessor(); case 6: return new ERTProcessor(); - case 255: wait_for_switch(); + case 7: return new CaptureProcessor(); default: return nullptr; } } diff --git a/firmware/baseband/baseband_thread.hpp b/firmware/baseband/baseband_thread.hpp index b6da7636..e30de422 100644 --- a/firmware/baseband/baseband_thread.hpp +++ b/firmware/baseband/baseband_thread.hpp @@ -30,11 +30,6 @@ class BasebandThread : public ThreadBase { public: - BasebandThread( - ) : ThreadBase { "baseband" } - { - } - Thread* start(const tprio_t priority); void on_message(const Message* const message); @@ -49,9 +44,10 @@ public: Thread* thread_main { nullptr }; Thread* thread_rssi { nullptr }; - BasebandProcessor* baseband_processor { nullptr }; private: + BasebandProcessor* baseband_processor { nullptr }; + BasebandConfiguration baseband_configuration; void run() override; diff --git a/firmware/baseband/channel_stats_collector.hpp b/firmware/baseband/channel_stats_collector.hpp index d03f03a1..ca7d0eed 100644 --- a/firmware/baseband/channel_stats_collector.hpp +++ b/firmware/baseband/channel_stats_collector.hpp @@ -49,7 +49,7 @@ public: if( count >= samples_per_update ) { const float max_squared_f = max_squared; - const int32_t max_db = complex16_mag_squared_to_dbv_norm(max_squared_f); + const int32_t max_db = mag2_to_dbv_norm(max_squared_f * (1.0f / (32768.0f * 32768.0f))); callback({ max_db, count }); max_squared = 0; diff --git a/firmware/baseband/chconf.h b/firmware/baseband/chconf.h index 8045cf4f..0ad24529 100755 --- a/firmware/baseband/chconf.h +++ b/firmware/baseband/chconf.h @@ -129,7 +129,7 @@ * @note The default is @p TRUE. */ #if !defined(CH_USE_REGISTRY) || defined(__DOXYGEN__) -#define CH_USE_REGISTRY TRUE +#define CH_USE_REGISTRY FALSE #endif /** diff --git a/firmware/baseband/clock_recovery.hpp b/firmware/baseband/clock_recovery.hpp index bd17255d..9a6904a3 100644 --- a/firmware/baseband/clock_recovery.hpp +++ b/firmware/baseband/clock_recovery.hpp @@ -116,19 +116,21 @@ private: template class ClockRecovery { public: + using SymbolHandler = std::function; + ClockRecovery( const float sampling_rate, const float symbol_rate, ErrorFilter error_filter, - std::function symbol_handler - ) : symbol_handler { symbol_handler } + SymbolHandler symbol_handler + ) : symbol_handler { std::move(symbol_handler) } { configure(sampling_rate, symbol_rate, error_filter); } ClockRecovery( - std::function symbol_handler - ) : symbol_handler { symbol_handler } + SymbolHandler symbol_handler + ) : symbol_handler { std::move(symbol_handler) } { } @@ -155,7 +157,7 @@ private: dsp::interpolation::LinearResampler resampler; GardnerTimingErrorDetector timing_error_detector; ErrorFilter error_filter; - std::function symbol_handler; + const SymbolHandler symbol_handler; void resampler_callback(const float interpolated_sample) { timing_error_detector(interpolated_sample, @@ -166,7 +168,12 @@ private: } void symbol_callback(const float symbol, const float lateness) { - symbol_handler(symbol); + // NOTE: This check is to avoid std::function nullptr check, which + // brings in "_ZSt25__throw_bad_function_callv" and a lot of extra code. + // TODO: Make symbol_handler known at compile time. + if( symbol_handler) { + symbol_handler(symbol); + } const float adjustment = error_filter(lateness); resampler.advance(adjustment); diff --git a/firmware/baseband/dsp_decimate.cpp b/firmware/baseband/dsp_decimate.cpp index abd8e7d0..93dbc602 100644 --- a/firmware/baseband/dsp_decimate.cpp +++ b/firmware/baseband/dsp_decimate.cpp @@ -177,6 +177,20 @@ static inline uint32_t scale_round_and_pack( return __PKHBT(saturated_real, saturated_imag, 16); } +template +static void taps_copy( + const Tap* const source, + Tap* const target, + const size_t count, + const bool shift_up +) { + const uint32_t negate_pattern = shift_up ? 0b1110 : 0b0100; + for(size_t i=0; i> (i & 3)) & 1; + target[i] = negate ? -source[i] : source[i]; + } +} + // FIRC8xR16x24FS4Decim4 ////////////////////////////////////////////////// void FIRC8xR16x24FS4Decim4::configure( @@ -184,13 +198,7 @@ void FIRC8xR16x24FS4Decim4::configure( const int32_t scale, const Shift shift ) { - const int negate_factor = (shift == Shift::Up) ? -1 : 1; - for(size_t i=0; i(taps_count); + taps_reversed_ = std::make_unique(taps_count); + taps_count_ = taps_count; + decimation_factor_ = decimation_factor; +} + buffer_c16_t FIRAndDecimateComplex::execute( const buffer_c16_t& src, const buffer_c16_t& dst diff --git a/firmware/baseband/dsp_decimate.hpp b/firmware/baseband/dsp_decimate.hpp index 1a9bf303..52727075 100644 --- a/firmware/baseband/dsp_decimate.hpp +++ b/firmware/baseband/dsp_decimate.hpp @@ -241,12 +241,14 @@ private: const size_t taps_count, const size_t decimation_factor ) { - samples_ = std::make_unique(taps_count); - taps_reversed_ = std::make_unique(taps_count); - taps_count_ = taps_count; - decimation_factor_ = decimation_factor; + configure_common(taps_count, decimation_factor); std::reverse_copy(&taps[0], &taps[taps_count], &taps_reversed_[0]); } + + void configure_common( + const size_t taps_count, + const size_t decimation_factor + ); }; class DecimateBy2CIC4Real { diff --git a/firmware/baseband/dsp_demodulate.cpp b/firmware/baseband/dsp_demodulate.cpp index 1c59c174..cf79d0d0 100644 --- a/firmware/baseband/dsp_demodulate.cpp +++ b/firmware/baseband/dsp_demodulate.cpp @@ -42,8 +42,8 @@ buffer_f32_t AM::execute( const uint32_t sample1 = *__SIMD32(src_p)++; const uint32_t mag_sq0 = __SMUAD(sample0, sample0); const uint32_t mag_sq1 = __SMUAD(sample1, sample1); - *(dst_p++) = __builtin_sqrtf(mag_sq0); - *(dst_p++) = __builtin_sqrtf(mag_sq1); + *(dst_p++) = __builtin_sqrtf(mag_sq0) * k; + *(dst_p++) = __builtin_sqrtf(mag_sq1) * k; } return { dst.p, src.count, src.sampling_rate }; @@ -57,10 +57,10 @@ buffer_f32_t SSB::execute( const auto src_end = &src.p[src.count]; auto dst_p = dst.p; while(src_p < src_end) { - *(dst_p++) = (src_p++)->real(); - *(dst_p++) = (src_p++)->real(); - *(dst_p++) = (src_p++)->real(); - *(dst_p++) = (src_p++)->real(); + *(dst_p++) = (src_p++)->real() * k; + *(dst_p++) = (src_p++)->real() * k; + *(dst_p++) = (src_p++)->real() * k; + *(dst_p++) = (src_p++)->real() * k; } return { dst.p, src.count, src.sampling_rate }; @@ -99,8 +99,8 @@ buffer_f32_t FM::execute( const auto t0 = multiply_conjugate_s16_s32(s0, z); const auto t1 = multiply_conjugate_s16_s32(s1, s0); z = s1; - *(dst_p++) = angle_precise(t0) * k; - *(dst_p++) = angle_precise(t1) * k; + *(dst_p++) = angle_precise(t0) * kf; + *(dst_p++) = angle_precise(t1) * kf; } z_ = z; @@ -122,9 +122,9 @@ buffer_s16_t FM::execute( const auto t0 = multiply_conjugate_s16_s32(s0, z); const auto t1 = multiply_conjugate_s16_s32(s1, s0); z = s1; - const int32_t theta0_int = angle_approx_0deg27(t0) * k; + const int32_t theta0_int = angle_approx_0deg27(t0) * ks16; const int32_t theta0_sat = __SSAT(theta0_int, 16); - const int32_t theta1_int = angle_approx_0deg27(t1) * k; + const int32_t theta1_int = angle_approx_0deg27(t1) * ks16; const int32_t theta1_sat = __SSAT(theta1_int, 16); *__SIMD32(dst_p)++ = __PKHBT( theta0_sat, @@ -137,5 +137,15 @@ buffer_s16_t FM::execute( return { dst.p, src.count, src.sampling_rate }; } +void FM::configure(const float sampling_rate, const float deviation_hz) { + /* + * angle: -pi to pi. output range: -32768 to 32767. + * Maximum delta-theta (output of atan2) at maximum deviation frequency: + * delta_theta_max = 2 * pi * deviation / sampling_rate + */ + kf = static_cast(1.0f / (2.0 * pi * deviation_hz / sampling_rate)); + ks16 = 32767.0f * kf; +} + } } diff --git a/firmware/baseband/dsp_demodulate.hpp b/firmware/baseband/dsp_demodulate.hpp index d7117b9d..72706167 100644 --- a/firmware/baseband/dsp_demodulate.hpp +++ b/firmware/baseband/dsp_demodulate.hpp @@ -33,6 +33,9 @@ public: const buffer_c16_t& src, const buffer_f32_t& dst ); + +private: + static constexpr float k = 1.0f / 32768.0f; }; class SSB { @@ -41,6 +44,9 @@ public: const buffer_c16_t& src, const buffer_f32_t& dst ); + +private: + static constexpr float k = 1.0f / 32768.0f; }; class FM { @@ -55,18 +61,12 @@ public: const buffer_s16_t& dst ); - void configure(const float sampling_rate, const float deviation_hz) { - /* - * angle: -pi to pi. output range: -32768 to 32767. - * Maximum delta-theta (output of atan2) at maximum deviation frequency: - * delta_theta_max = 2 * pi * deviation / sampling_rate - */ - k = static_cast(32767.0f / (2.0 * pi * deviation_hz / sampling_rate)); - } + void configure(const float sampling_rate, const float deviation_hz); private: complex16_t::rep_type z_ { 0 }; - float k { 0 }; + float kf { 0 }; + float ks16 { 0 }; }; } /* namespace demodulate */ diff --git a/firmware/baseband/event_m4.cpp b/firmware/baseband/event_m4.cpp index 0e90cd15..797ef5cb 100644 --- a/firmware/baseband/event_m4.cpp +++ b/firmware/baseband/event_m4.cpp @@ -86,11 +86,9 @@ void EventDispatcher::dispatch(const eventmask_t events) { } void EventDispatcher::handle_baseband_queue() { - std::array message_buffer; - while(Message* const message = shared_memory.baseband_queue.peek(message_buffer)) { - on_message(message); - shared_memory.baseband_queue.skip(); - } + shared_memory.baseband_queue.handle([this](Message* const message) { + this->on_message(message); + }); } void EventDispatcher::on_message(const Message* const message) { diff --git a/firmware/baseband/halconf.h b/firmware/baseband/halconf.h index 658d5869..c157afbd 100755 --- a/firmware/baseband/halconf.h +++ b/firmware/baseband/halconf.h @@ -261,7 +261,7 @@ * lower priority, this may slow down the driver a bit however. */ #if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) -#define SDC_NICE_WAITING TRUE +#define SDC_NICE_WAITING FALSE #endif /*===========================================================================*/ diff --git a/firmware/baseband/main.cpp b/firmware/baseband/main.cpp index d6a895a7..5f8a7da0 100755 --- a/firmware/baseband/main.cpp +++ b/firmware/baseband/main.cpp @@ -42,7 +42,6 @@ #include "debug.hpp" -#include "audio.hpp" #include "audio_dma.hpp" #include "gcc.hpp" @@ -73,19 +72,10 @@ void __late_init(void) { } static void init() { - i2s::i2s0::configure( - audio::i2s0_config_tx, - audio::i2s0_config_rx, - audio::i2s0_config_dma - ); - audio::dma::init(); audio::dma::configure(); audio::dma::enable(); - i2s::i2s0::tx_start(); - i2s::i2s0::rx_start(); - LPC_CREG->DMAMUX = portapack::gpdma_mux; gpdma::controller.enable(); nvicEnableVector(DMA_IRQn, CORTEX_PRIORITY_MASK(LPC_DMA_IRQ_PRIORITY)); diff --git a/firmware/baseband/matched_filter.cpp b/firmware/baseband/matched_filter.cpp index 511410df..9471a202 100644 --- a/firmware/baseband/matched_filter.cpp +++ b/firmware/baseband/matched_filter.cpp @@ -38,6 +38,7 @@ void MatchedFilter::configure( taps_reversed_ = std::make_unique(taps_count); taps_count_ = taps_count; decimation_factor_ = decimation_factor; + output = 0; std::reverse_copy(&taps[0], &taps[taps_count], &taps_reversed_[0]); } diff --git a/firmware/baseband/matched_filter.hpp b/firmware/baseband/matched_filter.hpp index d3ee30be..49045db8 100644 --- a/firmware/baseband/matched_filter.hpp +++ b/firmware/baseband/matched_filter.hpp @@ -71,7 +71,7 @@ private: size_t taps_count_ { 0 }; size_t decimation_factor_ { 1 }; size_t decimation_phase { 0 }; - float output; + float output { 0 }; void shift_by_decimation_factor(); diff --git a/firmware/baseband/ook.hpp b/firmware/baseband/ook.hpp new file mode 100644 index 00000000..27333922 --- /dev/null +++ b/firmware/baseband/ook.hpp @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __OOK_HPP__ +#define __OOK_HPP__ + +#include "phase_detector.hpp" +#include "phase_accumulator.hpp" + +#include +#include +#include +#include + +class OOKSlicerMagSquaredInt { +public: + using symbol_t = bool; + + constexpr OOKSlicerMagSquaredInt( + const float samples_per_symbol + ) : mag2_threshold_leak_factor { + static_cast( + factor_sq(-1.0f / (8.0f * samples_per_symbol)) * float(1ULL << 32) + ) + } + { + } + + symbol_t operator()(const std::complex in) { + const uint32_t real2 = in.real() * in.real(); + const uint32_t imag2 = in.imag() * in.imag(); + const uint32_t mag2 = real2 + imag2; + + const uint32_t mag2_attenuated = mag2 >> 3; // Approximation of (-4.5dB)^2 + mag2_threshold = (uint64_t(mag2_threshold) * uint64_t(mag2_threshold_leak_factor)) >> 32; + mag2_threshold = std::max(mag2_threshold, mag2_attenuated); + const bool symbol = (mag2 > mag2_threshold); + return symbol; + } + +private: + const uint32_t mag2_threshold_leak_factor; + uint32_t mag2_threshold = 0; + + constexpr float factor_sq(float db) { + return std::pow(10.0f, db / (10.0f / 2)); + } +}; + +class OOKClockRecovery { +public: + constexpr OOKClockRecovery( + const float samples_per_symbol + ) : symbol_phase_inc_nominal { static_cast(std::round((1ULL << 32) / samples_per_symbol)) }, + phase_detector { samples_per_symbol }, + phase_accumulator { symbol_phase_inc_nominal } + { + } + + template + void operator()(const uint32_t slicer_history, SymbolHandler symbol_handler) { + if( phase_accumulator() ) { + const auto detector_result = phase_detector(slicer_history); + phase_accumulator.set_inc(symbol_phase_inc_nominal + detector_result.error * (symbol_phase_inc_nominal >> 3)); + symbol_handler(detector_result.symbol); + } + } + +private: + const uint32_t symbol_phase_inc_nominal; + PhaseDetectorEarlyLateGate phase_detector; + PhaseAccumulator phase_accumulator; +}; + +#endif/*__OOK_HPP__*/ diff --git a/firmware/baseband/packet_builder.hpp b/firmware/baseband/packet_builder.hpp index d32d129d..c8a9ea5b 100644 --- a/firmware/baseband/packet_builder.hpp +++ b/firmware/baseband/packet_builder.hpp @@ -53,8 +53,8 @@ public: const PreambleMatcher preamble_matcher, const UnstuffMatcher unstuff_matcher, const EndMatcher end_matcher, - const PayloadHandlerFunc payload_handler - ) : payload_handler { payload_handler }, + PayloadHandlerFunc payload_handler + ) : payload_handler { std::move(payload_handler) }, preamble(preamble_matcher), unstuff(unstuff_matcher), end(end_matcher) @@ -89,8 +89,13 @@ public: } if( end(bit_history, packet.size()) ) { - packet.set_timestamp(Timestamp::now()); - payload_handler(packet); + // NOTE: This check is to avoid std::function nullptr check, which + // brings in "_ZSt25__throw_bad_function_callv" and a lot of extra code. + // TODO: Make payload_handler known at compile time. + if( payload_handler ) { + packet.set_timestamp(Timestamp::now()); + payload_handler(packet); + } reset_state(); } else { if( packet_truncated() ) { diff --git a/firmware/baseband/phase_accumulator.hpp b/firmware/baseband/phase_accumulator.hpp new file mode 100644 index 00000000..bf3b331a --- /dev/null +++ b/firmware/baseband/phase_accumulator.hpp @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __PHASE_ACCUMULATOR_HPP__ +#define __PHASE_ACCUMULATOR_HPP__ + +#include + +class PhaseAccumulator { +public: + constexpr PhaseAccumulator( + const uint32_t phase_inc + ) : phase_inc { phase_inc } + { + } + + bool operator()() { + const auto last_phase = phase; + phase += phase_inc; + return (phase < last_phase); + } + + void set_inc(const uint32_t new_phase_inc) { + phase_inc = new_phase_inc; + } + +private: + uint32_t phase { 0 }; + uint32_t phase_inc; +}; + +#endif/*__PHASE_ACCUMULATOR_HPP__*/ diff --git a/firmware/baseband/phase_detector.hpp b/firmware/baseband/phase_detector.hpp new file mode 100644 index 00000000..89cf4b5c --- /dev/null +++ b/firmware/baseband/phase_detector.hpp @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __PHASE_DETECTOR_HPP__ +#define __PHASE_DETECTOR_HPP__ + +#include +#include +#include + +class PhaseDetectorEarlyLateGate { +public: + using history_t = uint32_t; + + using symbol_t = bool; + using error_t = int; + + struct result_t { + symbol_t symbol; + error_t error; + }; + + constexpr PhaseDetectorEarlyLateGate( + const float samples_per_symbol + ) : late_mask { (1U << static_cast(std::ceil(samples_per_symbol / 2))) - 1 }, + early_mask { late_mask << static_cast(std::floor(samples_per_symbol / 2)) }, + sample_bit { static_cast(std::floor(samples_per_symbol / 2)) } + { + } + + result_t operator()(const history_t symbol_history) const { + // history = ...0111, early + // history = ...1110, late + + const symbol_t symbol = (symbol_history >> sample_bit) & 1; + const int late_side = __builtin_popcount(symbol_history & late_mask); + const int early_side = __builtin_popcount(symbol_history & early_mask); + const int lateness = late_side - early_side; + const int direction = lateness; //std::min(std::max(lateness, -1), 1); + const error_t error = direction; + return { symbol, error }; + } + +private: + const history_t late_mask; + const history_t early_mask; + const size_t sample_bit; +}; + +#endif/*__PHASE_DETECTOR_HPP__*/ diff --git a/firmware/baseband/proc_am_audio.cpp b/firmware/baseband/proc_am_audio.cpp index 3a073db4..0a4b5faf 100644 --- a/firmware/baseband/proc_am_audio.cpp +++ b/firmware/baseband/proc_am_audio.cpp @@ -40,6 +40,7 @@ void NarrowbandAMAudio::execute(const buffer_c8_t& buffer) { channel_spectrum.feed(channel_out, channel_filter_pass_f, channel_filter_stop_f); auto audio = demodulate(channel_out); + audio_compressor.execute_in_place(audio); audio_output.write(audio); } @@ -86,7 +87,7 @@ void NarrowbandAMAudio::configure(const AMConfigureMessage& message) { channel_filter.configure(message.channel_filter.taps, channel_filter_decimation_factor); channel_filter_pass_f = message.channel_filter.pass_frequency_normalized * channel_filter_input_fs; channel_filter_stop_f = message.channel_filter.stop_frequency_normalized * channel_filter_input_fs; - channel_spectrum.set_decimation_factor(std::floor((channel_filter_output_fs / 2) / ((channel_filter_pass_f + channel_filter_stop_f) / 2))); + channel_spectrum.set_decimation_factor(std::floor(channel_filter_output_fs / (channel_filter_pass_f + channel_filter_stop_f))); modulation_ssb = (message.modulation == AMConfigureMessage::Modulation::SSB); audio_output.configure(message.audio_hpf_config); diff --git a/firmware/baseband/proc_am_audio.hpp b/firmware/baseband/proc_am_audio.hpp index 226720e2..af94c416 100644 --- a/firmware/baseband/proc_am_audio.hpp +++ b/firmware/baseband/proc_am_audio.hpp @@ -26,6 +26,7 @@ #include "dsp_decimate.hpp" #include "dsp_demodulate.hpp" +#include "audio_compressor.hpp" #include "audio_output.hpp" #include "spectrum_collector.hpp" @@ -64,7 +65,7 @@ private: bool modulation_ssb = false; dsp::demodulate::AM demod_am; dsp::demodulate::SSB demod_ssb; - + FeedForwardCompressor audio_compressor; AudioOutput audio_output; SpectrumCollector channel_spectrum; diff --git a/firmware/baseband/proc_capture.cpp b/firmware/baseband/proc_capture.cpp new file mode 100644 index 00000000..f069c206 --- /dev/null +++ b/firmware/baseband/proc_capture.cpp @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "proc_capture.hpp" + +#include "dsp_fir_taps.hpp" + +#include "utility.hpp" + +CaptureProcessor::CaptureProcessor() { + const auto& decim_0_filter = taps_200k_decim_0; + constexpr size_t decim_0_input_fs = baseband_fs; + constexpr size_t decim_0_output_fs = decim_0_input_fs / decim_0.decimation_factor; + + const auto& decim_1_filter = taps_200k_decim_1; + constexpr size_t decim_1_input_fs = decim_0_output_fs; + constexpr size_t decim_1_output_fs = decim_1_input_fs / decim_1.decimation_factor; + + const auto& channel_filter = decim_1_filter; + constexpr size_t channel_filter_input_fs = decim_1_output_fs; + constexpr size_t channel_decimation = 1; + const size_t channel_filter_output_fs = channel_filter_input_fs / channel_decimation; + + decim_0.configure(decim_0_filter.taps, 33554432); + decim_1.configure(decim_1_filter.taps, 131072); + + channel_filter_pass_f = channel_filter.pass_frequency_normalized * channel_filter_input_fs; + channel_filter_stop_f = channel_filter.stop_frequency_normalized * channel_filter_input_fs; + + spectrum_interval_samples = channel_filter_output_fs / spectrum_rate_hz; + spectrum_samples = 0; + + channel_spectrum.set_decimation_factor(1); + + stream = std::make_unique(15); +} + +void CaptureProcessor::execute(const buffer_c8_t& buffer) { + /* 2.4576MHz, 2048 samples */ + const auto decim_0_out = decim_0.execute(buffer, dst_buffer); + const auto decim_1_out = decim_1.execute(decim_0_out, dst_buffer); + const auto& decimator_out = decim_1_out; + const auto& channel = decimator_out; + + if( stream ) { + const size_t bytes_to_write = sizeof(*decimator_out.p) * decimator_out.count; + const auto result = stream->write(decimator_out.p, bytes_to_write); + } + + feed_channel_stats(channel); + + spectrum_samples += channel.count; + if( spectrum_samples >= spectrum_interval_samples ) { + spectrum_samples -= spectrum_interval_samples; + channel_spectrum.feed(channel, channel_filter_pass_f, channel_filter_stop_f); + } +} + +void CaptureProcessor::on_message(const Message* const message) { + switch(message->id) { + case Message::ID::UpdateSpectrum: + case Message::ID::SpectrumStreamingConfig: + channel_spectrum.on_message(message); + break; + + default: + break; + } +} diff --git a/firmware/baseband/proc_capture.hpp b/firmware/baseband/proc_capture.hpp new file mode 100644 index 00000000..008c10d2 --- /dev/null +++ b/firmware/baseband/proc_capture.hpp @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __PROC_CAPTURE_HPP__ +#define __PROC_CAPTURE_HPP__ + +#include "baseband_processor.hpp" +#include "dsp_decimate.hpp" + +#include "spectrum_collector.hpp" + +#include "stream_input.hpp" + +#include +#include + +class CaptureProcessor : public BasebandProcessor { +public: + CaptureProcessor(); + + void execute(const buffer_c8_t& buffer) override; + + void on_message(const Message* const message) override; + +private: + static constexpr size_t baseband_fs = 2457600; + static constexpr auto spectrum_rate_hz = 50.0f; + + std::array dst; + const buffer_c16_t dst_buffer { + dst.data(), + dst.size() + }; + + dsp::decimate::FIRC8xR16x24FS4Decim4 decim_0; + dsp::decimate::FIRC16xR16x16Decim2 decim_1; + uint32_t channel_filter_pass_f = 0; + uint32_t channel_filter_stop_f = 0; + + std::unique_ptr stream; + + SpectrumCollector channel_spectrum; + size_t spectrum_interval_samples = 0; + size_t spectrum_samples = 0; +}; + +#endif/*__PROC_CAPTURE_HPP__*/ diff --git a/firmware/baseband/proc_nfm_audio.cpp b/firmware/baseband/proc_nfm_audio.cpp index 2a0349ac..3fd546b9 100644 --- a/firmware/baseband/proc_nfm_audio.cpp +++ b/firmware/baseband/proc_nfm_audio.cpp @@ -76,8 +76,8 @@ void NarrowbandFMAudio::configure(const NBFMConfigureMessage& message) { demod.configure(demod_input_fs, message.deviation); channel_filter_pass_f = message.channel_filter.pass_frequency_normalized * channel_filter_input_fs; channel_filter_stop_f = message.channel_filter.stop_frequency_normalized * channel_filter_input_fs; - channel_spectrum.set_decimation_factor(std::floor((channel_filter_output_fs / 2) / ((channel_filter_pass_f + channel_filter_stop_f) / 2))); - audio_output.configure(message.audio_hpf_config, message.audio_deemph_config, 12288); + channel_spectrum.set_decimation_factor(std::floor(channel_filter_output_fs / (channel_filter_pass_f + channel_filter_stop_f))); + audio_output.configure(message.audio_hpf_config, message.audio_deemph_config, 0.5f); configured = true; } diff --git a/firmware/baseband/proc_tpms.cpp b/firmware/baseband/proc_tpms.cpp index d9b2375a..9d401a1c 100644 --- a/firmware/baseband/proc_tpms.cpp +++ b/firmware/baseband/proc_tpms.cpp @@ -21,31 +21,8 @@ #include "proc_tpms.hpp" -#include "portapack_shared_memory.hpp" - #include "dsp_fir_taps.hpp" -// IFIR image-reject filter: fs=2457600, pass=100000, stop=407200, decim=4, fout=614400 -static constexpr fir_taps_real<24> taps_200k_decim_0 = { - .pass_frequency_normalized = 100000.0f / 2457600.0f, - .stop_frequency_normalized = 407200.0f / 2457600.0f, - .taps = { { - 90, 94, 4, -240, -570, -776, -563, 309, - 1861, 3808, 5618, 6710, 6710, 5618, 3808, 1861, - 309, -563, -776, -570, -240, 4, 94, 90, - } }, -}; - -// IFIR prototype filter: fs=614400, pass=100000, stop=207200, decim=2, fout=307200 -static constexpr fir_taps_real<16> taps_200k_decim_1 = { - .pass_frequency_normalized = 100000.0f / 614400.0f, - .stop_frequency_normalized = 207200.0f / 614400.0f, - .taps = { { - -132, -256, 545, 834, -1507, -2401, 4666, 14583, - 14583, 4666, -2401, -1507, 834, 545, -256, -132, - } }, -}; - TPMSProcessor::TPMSProcessor() { decim_0.configure(taps_200k_decim_0.taps, 33554432); decim_1.configure(taps_200k_decim_1.taps, 131072); @@ -66,6 +43,18 @@ void TPMSProcessor::execute(const buffer_c8_t& buffer) { clock_recovery(mf.get_output()); } } + + for(size_t i=0; ipacket_builder_ook_subaru.execute(symbol); + }); + ook_clock_recovery_gmc(slicer_history, [this](const bool symbol) { + this->packet_builder_ook_gmc.execute(symbol); + }); + } } void TPMSProcessor::consume_symbol( @@ -78,6 +67,6 @@ void TPMSProcessor::consume_symbol( void TPMSProcessor::payload_handler( const baseband::Packet& packet ) { - const TPMSPacketMessage message { packet }; + const TPMSPacketMessage message { tpms::SignalType::FLM, packet }; shared_memory.application_queue.push(message); } diff --git a/firmware/baseband/proc_tpms.hpp b/firmware/baseband/proc_tpms.hpp index 0c42beb7..759f7383 100644 --- a/firmware/baseband/proc_tpms.hpp +++ b/firmware/baseband/proc_tpms.hpp @@ -32,7 +32,10 @@ #include "packet_builder.hpp" #include "baseband_packet.hpp" +#include "ook.hpp" + #include "message.hpp" +#include "portapack_shared_memory.hpp" #include #include @@ -83,6 +86,38 @@ private: } }; + static constexpr float channel_rate_in = 307200.0f; + static constexpr size_t channel_decimation = 8; + static constexpr float channel_sample_rate = channel_rate_in / channel_decimation; + OOKSlicerMagSquaredInt ook_slicer_5sps { 5 }; + uint32_t slicer_history { 0 }; + + OOKClockRecovery ook_clock_recovery_subaru { + channel_sample_rate / 8192.0f + }; + + PacketBuilder packet_builder_ook_subaru { + { 0b010101010101010101011110, 24, 0 }, + { }, + { 80 }, + [](const baseband::Packet& packet) { + const TPMSPacketMessage message { tpms::SignalType::Subaru, packet }; + shared_memory.application_queue.push(message); + } + }; + OOKClockRecovery ook_clock_recovery_gmc { + channel_sample_rate / 8400.0f + }; + + PacketBuilder packet_builder_ook_gmc { + { 0b01010101010101010101010101100101, 32, 0 }, + { }, + { 192 }, + [](const baseband::Packet& packet) { + const TPMSPacketMessage message { tpms::SignalType::GMC, packet }; + shared_memory.application_queue.push(message); + } + }; void consume_symbol(const float symbol); void payload_handler(const baseband::Packet& packet); }; diff --git a/firmware/baseband/rssi_dma.cpp b/firmware/baseband/rssi_dma.cpp index 91f3b496..355698ad 100644 --- a/firmware/baseband/rssi_dma.cpp +++ b/firmware/baseband/rssi_dma.cpp @@ -33,6 +33,8 @@ using namespace lpc43xx; #include "portapack_dma.hpp" #include "portapack_adc.hpp" +#include "thread_wait.hpp" + namespace rf { namespace rssi { namespace dma { @@ -99,20 +101,19 @@ static buffers_config_t buffers_config; static sample_t *samples { nullptr }; static gpdma::channel::LLI *lli { nullptr }; -static Semaphore semaphore; -static volatile const gpdma::channel::LLI* next_lli = nullptr; +static ThreadWait thread_wait; static void transfer_complete() { - next_lli = gpdma_channel.next_lli(); - chSemSignalI(&semaphore); + const auto next_lli_index = gpdma_channel.next_lli() - &lli[0]; + thread_wait.wake_from_interrupt(next_lli_index); } static void dma_error() { + thread_wait.wake_from_interrupt(-1); disable(); } void init() { - chSemInit(&semaphore, 0); gpdma_channel.set_handlers(transfer_complete, dma_error); // LPC_GPDMA->SYNC |= (1 << gpdma_peripheral); @@ -147,8 +148,6 @@ void free() { void enable() { const auto gpdma_config = config(); gpdma_channel.configure(lli[0], gpdma_config); - - chSemReset(&semaphore, 0); gpdma_channel.enable(); } @@ -161,16 +160,11 @@ void disable() { } rf::rssi::buffer_t wait_for_buffer() { - const auto status = chSemWait(&semaphore); - if( status == RDY_OK ) { - const auto next = next_lli; - if( next ) { - const size_t next_index = next - &lli[0]; - const size_t free_index = (next_index + buffers_config.count - 2) % buffers_config.count; - return { reinterpret_cast(lli[free_index].destaddr), buffers_config.items_per_buffer }; - } else { - return { nullptr, 0 }; - } + const auto next_index = thread_wait.sleep(); + + if( next_index >= 0 ) { + const size_t free_index = (next_index + buffers_config.count - 2) % buffers_config.count; + return { reinterpret_cast(lli[free_index].destaddr), buffers_config.items_per_buffer }; } else { // TODO: Should I return here, or loop if RDY_RESET? return { nullptr, 0 }; diff --git a/firmware/baseband/rssi_thread.hpp b/firmware/baseband/rssi_thread.hpp index 0a00ef8e..5233ddd5 100644 --- a/firmware/baseband/rssi_thread.hpp +++ b/firmware/baseband/rssi_thread.hpp @@ -30,11 +30,6 @@ class RSSIThread : public ThreadBase { public: - RSSIThread( - ) : ThreadBase { "rssi" } - { - } - Thread* start(const tprio_t priority); private: diff --git a/firmware/baseband/spectrum_collector.cpp b/firmware/baseband/spectrum_collector.cpp index 2b661c9a..0d288bee 100644 --- a/firmware/baseband/spectrum_collector.cpp +++ b/firmware/baseband/spectrum_collector.cpp @@ -117,8 +117,8 @@ void SpectrumCollector::update() { // Three point Hamming window. const auto corrected_sample = channel_spectrum[i] * 0.54f + (channel_spectrum[(i-1) & 0xff] + channel_spectrum[(i+1) & 0xff]) * -0.23f; - const auto mag2 = magnitude_squared(corrected_sample); - const float db = complex16_mag_squared_to_dbv_norm(mag2); + const auto mag2 = magnitude_squared(corrected_sample * (1.0f / 32768.0f)); + const float db = mag2_to_dbv_norm(mag2); constexpr float mag_scale = 5.0f; const unsigned int v = (db * mag_scale) + 255.0f; spectrum.db[i] = std::max(0U, std::min(255U, v)); diff --git a/firmware/baseband/spectrum_collector.hpp b/firmware/baseband/spectrum_collector.hpp index 6c50120b..b238c1fe 100644 --- a/firmware/baseband/spectrum_collector.hpp +++ b/firmware/baseband/spectrum_collector.hpp @@ -35,7 +35,8 @@ class SpectrumCollector { public: constexpr SpectrumCollector( - ) : channel_spectrum_decimator { 1 } + ) : channel_spectrum_decimator { 1 }, + fifo { fifo_data, ChannelSpectrumConfigMessage::fifo_k } { } @@ -52,6 +53,7 @@ public: private: BlockDecimator channel_spectrum_decimator; ChannelSpectrumFIFO fifo; + ChannelSpectrum fifo_data[1 << ChannelSpectrumConfigMessage::fifo_k]; volatile bool channel_spectrum_request_update { false }; bool streaming { false }; diff --git a/firmware/baseband/stream_input.hpp b/firmware/baseband/stream_input.hpp new file mode 100644 index 00000000..1b1ec552 --- /dev/null +++ b/firmware/baseband/stream_input.hpp @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __STREAM_INPUT_H__ +#define __STREAM_INPUT_H__ + +#include "portapack_shared_memory.hpp" + +#include "fifo.hpp" + +#include +#include +#include + +class StreamInput { +public: + StreamInput(const size_t K) : + K { K }, + data { std::make_unique(1UL << K) }, + fifo { data.get(), K } + { + // TODO: Send stream creation message. + shared_memory.FIFO_HACK = &fifo; + } + + ~StreamInput() { + // TODO: Send stream distruction message. + shared_memory.FIFO_HACK = nullptr; + } + + size_t write(const void* const data, const size_t length) { + const auto written = fifo.in(reinterpret_cast(data), length); + + const auto last_bytes_written = bytes_written; + bytes_written += written; + if( (bytes_written & event_bytes_mask) < (last_bytes_written & event_bytes_mask) ) { + creg::m4txevent::assert(); + } + + return written; + } + + uint64_t written() const { + return bytes_written; + } + +private: + const size_t K; + const uint64_t event_bytes_mask = (1ULL << (K - 2)) - 1; + uint64_t bytes_written = 0; + std::unique_ptr data; + FIFO fifo; +}; + +#endif/*__STREAM_INPUT_H__*/ diff --git a/firmware/baseband/thread_base.hpp b/firmware/baseband/thread_base.hpp index 9b5e8a99..921aeeb9 100644 --- a/firmware/baseband/thread_base.hpp +++ b/firmware/baseband/thread_base.hpp @@ -26,24 +26,17 @@ class ThreadBase { public: - constexpr ThreadBase( - const char* const name - ) : name { name } - { - } - + virtual ~ThreadBase() = default; + protected: static msg_t fn(void* arg) { auto obj = static_cast(arg); - chRegSetThreadName(obj->name); obj->run(); return 0; } private: - const char* const name; - virtual void run() = 0; }; diff --git a/firmware/chibios-portapack/ext/fatfs/doc/00index_e.html b/firmware/chibios-portapack/ext/fatfs/doc/00index_e.html index 9dc9d8e8..2eef02ee 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/00index_e.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/00index_e.html @@ -19,14 +19,14 @@
layer -

FatFs is a generic FAT file system module for small embedded systems. The FatFs module is written in compliance with ANSI C (C89) and completely separated from the disk I/O layer. Therefore it is independent of the platform. It can be incorporated into small microcontrollers with limited resource, such as 8051, PIC, AVR, ARM, Z80, 78K and etc. Also Petit FatFs module for tiny microcontrollers is available here↗.

+

FatFs is a generic FAT file system module for small embedded systems. The FatFs module is written in compliance with ANSI C (C89) and completely separated from the disk I/O layer. Therefore it is independent of the platform. It can be incorporated into small microcontrollers with limited resource, such as 8051, PIC, AVR, ARM, Z80, 78K and etc. Also Petit FatFs module for tiny microcontrollers is available here.

Features

  • Windows compatible FAT file system.
  • Platform independent. Easy to port.
  • Very small footprint for code and work area.
  • -
  • Various configuration options: +
  • Various configuration options:
    • Multiple volumes (physical drives and partitions).
    • Multiple ANSI/OEM code pages including DBCS.
    • @@ -42,49 +42,68 @@

      Application Interface

      -

      FatFs module provides following functions to the applications. In other words, this list describes what FatFs can do to access the FAT volumes.

      +layer
        -
      • f_mount - Register/Unregister a work area
      • -
      • f_open - Open/Create a file
      • -
      • f_close - Close an open file
      • -
      • f_read - Read file
      • -
      • f_write - Write file
      • -
      • f_lseek - Move read/write pointer, Expand file size
      • -
      • f_truncate - Truncate file size
      • -
      • f_sync - Flush cached data
      • -
      • f_forward - Forward file data to the stream
      • -
      • f_stat - Check existance of a file or sub-directory
      • -
      • f_opendir - Open a directory
      • -
      • f_closedir - Close an open directory
      • -
      • f_readdir - Read a directory item
      • -
      • f_mkdir - Create a sub-directory
      • -
      • f_unlink - Remove a file or sub-directory
      • -
      • f_chmod - Change attribute
      • -
      • f_utime - Change timestamp
      • -
      • f_rename - Rename/Move a file or sub-directory
      • -
      • f_chdir - Change current directory
      • -
      • f_chdrive - Change current drive
      • -
      • f_getcwd - Retrieve the current directory
      • -
      • f_getfree - Get free space on the volume
      • -
      • f_getlabel - Get volume label
      • -
      • f_setlabel - Set volume label
      • -
      • f_mkfs - Create a file system on the drive
      • -
      • f_fdisk - Divide a physical drive
      • -
      • f_gets - Read a string
      • -
      • f_putc - Write a character
      • -
      • f_puts - Write a string
      • -
      • f_printf - Write a formatted string
      • -
      • f_tell - Get current read/write pointer
      • -
      • f_eof - Test for end-of-file on a file
      • -
      • f_size - Get size of a file
      • -
      • f_error - Test for an error on a file
      • +
      • File Access + +
      • +
      • Directory Access + +
      • +
      • File/Directory Management +
          +
        • f_stat - Check existance of a file or sub-directory
        • +
        • f_unlink - Remove a file or sub-directory
        • +
        • f_rename - Rename or move a file or sub-directory
        • +
        • f_chmod - Change attribute of a file or sub-directory
        • +
        • f_utime - Change timestamp of a file or sub-directory
        • +
        • f_mkdir - Create a sub-directory
        • +
        • f_chdir - Change current directory
        • +
        • f_chdrive - Change current drive
        • +
        • f_getcwd - Retrieve the current directory and drive
        • +
        +
      • +
      • Volume Management +
          +
        • f_mount - Register/Unregister a work area of a volume
        • +
        • f_mkfs - Create an FAT volume on the logical drive
        • +
        • f_fdisk - Create logical drives on the physical drive
        • +
        • f_getfree - Get total size and free size on the volume
        • +
        • f_getlabel - Get volume label
        • +
        • f_setlabel - Set volume label
        • +
        +

      Device Control Interface

      -

      Since the FatFs module is a file system layer, it is completely separated from physical devices, such as memory card, harddisk and any type of storage devices. FatFs accesses the storage device via a simple interface described below. The low level device control module is not a part of FatFs module. It is provided by implementer. Also sample implementations for some platforms are available in the downloads.

      +layer +

      Since the FatFs module is a file system layer, it is completely separated from the physical devices, such as memory card, harddisk and any type of storage devices. FatFs accesses the storage devices via a simple interface shown below. The low level device control module is not a part of FatFs module. It is provided by implementer. Also sample implementations for some platforms are available in the downloads.

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/00index_j.html b/firmware/chibios-portapack/ext/fatfs/doc/00index_j.html index b13297dc..fc8444e1 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/00index_j.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/00index_j.html @@ -19,13 +19,13 @@
      layer -

      FatFsã¯å°è¦æ¨¡ãªçµ„ã¿è¾¼ã¿ã‚·ã‚¹ãƒ†ãƒ å‘ã‘ã®æ±Žç”¨FATファイルシステム モジュールã§ã™ã€‚ANSI C(C89)準拠ã§ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ アーキテクãƒãƒ£ã«ã¯ä¾å­˜ã—ãªã„ã®ã§ã€å¿…è¦ãªãƒ¯ãƒ¼ã‚¯ エリアãŒç¢ºä¿ã§ãã‚Œã°ã€8051, PIC, AVR, SH, Z80, 68k, H8, ARMãªã©å®‰ä¾¡ãªãƒžã‚¤ã‚³ãƒ³ã§ã‚‚使用å¯èƒ½ã§ã™ã€‚ã“ã®ã»ã‹ã€FatFsを極å°ãƒžã‚¤ã‚³ãƒ³å‘ã‘ã«ã‚·ãƒ¥ãƒªãƒ³ã‚¯ã—ãŸã·ã¡FatFs↗ ã‚‚ã‚ã‚Šã¾ã™ã€‚

      +

      FatFsã¯å°è¦æ¨¡ãªçµ„ã¿è¾¼ã¿ã‚·ã‚¹ãƒ†ãƒ å‘ã‘ã®æ±Žç”¨FATファイルシステム モジュールã§ã™ã€‚ANSI C(C89)準拠ã§ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ アーキテクãƒãƒ£ã«ã¯ä¾å­˜ã—ãªã„ã®ã§ã€å¿…è¦ãªãƒ¯ãƒ¼ã‚¯ エリアãŒç¢ºä¿ã§ãã‚Œã°ã€8051, PIC, AVR, SH, Z80, 68k, H8, ARMãªã©å®‰ä¾¡ãªãƒžã‚¤ã‚³ãƒ³ã§ã‚‚使用å¯èƒ½ã§ã™ã€‚ã“ã®ã»ã‹ã€FatFsを極å°ãƒžã‚¤ã‚³ãƒ³å‘ã‘ã«ã‚·ãƒ¥ãƒªãƒ³ã‚¯ã—ãŸã·ã¡FatFsã‚‚ã‚ã‚Šã¾ã™ã€‚

      FatFsモジュールã®ç‰¹å¾´

      • Windowsäº’æ› FATファイル システム
      • プラットフォームéžä¾å­˜
      • コンパクトãªã‚³ãƒ¼ãƒ‰ã¨RAM使用é‡
      • -
      • 多ãã®æ§‹æˆã‚ªãƒ—ション: +
      • 多ãã®æ§‹æˆã‚ªãƒ—ション:
        • 複数ã®ãƒœãƒªãƒ¥ãƒ¼ãƒ (物ç†ãƒ‰ãƒ©ã‚¤ãƒ–・区画)
        • DBCSã‚’å«ã‚€è¤‡æ•°ã®ANSI/OEMコード ページã®é¸æŠž
        • @@ -41,49 +41,68 @@

          上ä½ãƒ¬ã‚¤ãƒ¤ インターフェース

          -

          FatFsモジュールã¯ã€ã‚¢ãƒ—リケーション レイヤã«å¯¾ã—ã€æ¬¡ã®ãƒ•ã‚¡ã‚¤ãƒ«æ“作関数(API)ã‚’æä¾›ã—ã¾ã™ã€‚ã¤ã¾ã‚Šã€ã“ã®ãƒªã‚¹ãƒˆã¯FatFsã«ã§ãã‚‹ã“ã¨ã‚’シンプルã«ç¤ºã—ã¦ã„ã¾ã™ã€‚

          +layer
            -
          • f_mount - ワークエリアã®ç™»éŒ²ãƒ»æŠ¹æ¶ˆ
          • -
          • f_open - ファイルã®ã‚ªãƒ¼ãƒ—ン・作æˆ
          • -
          • f_close - ファイルã®ã‚¯ãƒ­ãƒ¼ã‚º
          • -
          • f_read - ファイルã®èª­ã¿å‡ºã—
          • -
          • f_write - ファイルã®æ›¸ãè¾¼ã¿
          • -
          • f_lseek - リード/ライト ãƒã‚¤ãƒ³ã‚¿ã®ç§»å‹•, ファイルã®æ‹¡å¼µ
          • -
          • f_truncate - ファイル サイズã®åˆ‡ã‚Šè©°ã‚
          • -
          • f_sync - キャッシュã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã®ãƒ•ãƒ©ãƒƒã‚·ãƒ¥
          • -
          • f_forward - ファイル データをストリーム関数ã«è»¢é€
          • -
          • f_stat - ファイル/サブ ディレクトリã®å­˜åœ¨ãƒã‚§ãƒƒã‚¯ã¨æƒ…å ±ã®å–å¾—
          • -
          • f_opendir - ディレクトリã®ã‚ªãƒ¼ãƒ—ン
          • -
          • f_closedir - ディレクトリã®ã‚¯ãƒ­ãƒ¼ã‚º
          • -
          • f_readdir - ディレクトリã®èª­ã¿å‡ºã—
          • -
          • f_mkdir - サブ ディレクトリã®ä½œæˆ
          • -
          • f_unlink - ファイル/サブ ディレクトリã®å‰Šé™¤
          • -
          • f_chmod - ファイル/サブ ディレクトリã®å±žæ€§ã®å¤‰æ›´
          • -
          • f_utime - ファイル/サブ ディレクトリã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ã®å¤‰æ›´
          • -
          • f_rename - ファイル/サブ ディレクトリã®åå‰ã®å¤‰æ›´ãƒ»ç§»å‹•
          • -
          • f_chdir - カレント ディレクトリã®å¤‰æ›´
          • -
          • f_chdrive - カレント ドライブã®å¤‰æ›´
          • -
          • f_getcwd - カレント ディレクトリã®å–å¾—
          • -
          • f_getfree - ボリューム空ã領域ã®å–å¾—
          • -
          • f_getlabel - ボリューム ラベルã®å–å¾—
          • -
          • f_setlabel - ボリューム ラベルã®è¨­å®š
          • -
          • f_mkfs - è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆ
          • -
          • f_fdisk - 物ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®åˆ†å‰²
          • -
          • f_gets - 文字列ã®èª­ã¿å‡ºã—
          • -
          • f_putc - 文字ã®æ›¸ãè¾¼ã¿
          • -
          • f_puts - 文字列ã®æ›¸ãè¾¼ã¿
          • -
          • f_printf - 書å¼åŒ–文字列ã®æ›¸ãè¾¼ã¿
          • -
          • f_tell - ç¾åœ¨ã®ãƒªãƒ¼ãƒ‰/ライト ãƒã‚¤ãƒ³ã‚¿ã®å–å¾—
          • -
          • f_eof - ファイル終端ã®æœ‰ç„¡ã®å–å¾—
          • -
          • f_size - ファイル サイズã®å–å¾—
          • -
          • f_error - ファイルã®ã‚¨ãƒ©ãƒ¼ã®æœ‰ç„¡ã®å–å¾—
          • +
          • ファイル アクセス +
              +
            • f_open - ファイルã®ã‚ªãƒ¼ãƒ—ン・作æˆ
            • +
            • f_close - ファイルã®ã‚¯ãƒ­ãƒ¼ã‚º
            • +
            • f_read - データã®èª­ã¿å‡ºã—
            • +
            • f_write - データã®æ›¸ãè¾¼ã¿
            • +
            • f_lseek - リード/ライト ãƒã‚¤ãƒ³ã‚¿ã®ç§»å‹•, サイズã®æ‹¡å¼µ
            • +
            • f_truncate - サイズã®åˆ‡ã‚Šè©°ã‚
            • +
            • f_sync - キャッシュã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã®ãƒ•ãƒ©ãƒƒã‚·ãƒ¥
            • +
            • f_forward - データをストリーム関数ã«è»¢é€
            • +
            • f_gets - 文字列ã®èª­ã¿å‡ºã—
            • +
            • f_putc - 文字ã®æ›¸ãè¾¼ã¿
            • +
            • f_puts - 文字列ã®æ›¸ãè¾¼ã¿
            • +
            • f_printf - 書å¼åŒ–文字列ã®æ›¸ãè¾¼ã¿
            • +
            • f_tell - リード/ライト ãƒã‚¤ãƒ³ã‚¿ã®å–å¾—
            • +
            • f_eof - 終端ã®æœ‰ç„¡ã®å–å¾—
            • +
            • f_size - サイズã®å–å¾—
            • +
            • f_error - エラーã®æœ‰ç„¡ã®å–å¾—
            • +
            +
          • +
          • ディレクトリ アクセス +
              +
            • f_opendir - ディレクトリã®ã‚ªãƒ¼ãƒ—ン
            • +
            • f_closedir - ディレクトリã®ã‚¯ãƒ­ãƒ¼ã‚º
            • +
            • f_readdir - é …ç›®ã®èª­ã¿å‡ºã—
            • +
            • f_findfirst - ディレクトリã®ã‚ªãƒ¼ãƒ—ンã¨æœ€åˆã®æ¤œç´¢é …ç›®ã®èª­ã¿å‡ºã—
            • +
            • f_findnext - 次ã®æ¤œç´¢é …ç›®ã®èª­ã¿å‡ºã—
            • +
            +
          • +
          • ファイル/ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªç®¡ç† +
              +
            • f_stat - ファイル/サブ ディレクトリã®å­˜åœ¨ãƒã‚§ãƒƒã‚¯ã¨æƒ…å ±ã®å–å¾—
            • +
            • f_unlink - ファイル/サブ ディレクトリã®å‰Šé™¤
            • +
            • f_rename - ファイル/サブ ディレクトリã®åå‰ã®å¤‰æ›´ãƒ»ç§»å‹•
            • +
            • f_chmod - ファイル/サブ ディレクトリã®å±žæ€§ã®å¤‰æ›´
            • +
            • f_utime - ファイル/サブ ディレクトリã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ã®å¤‰æ›´
            • +
            • f_mkdir - サブ ディレクトリã®ä½œæˆ
            • +
            • f_chdir - カレント ディレクトリã®å¤‰æ›´
            • +
            • f_chdrive - カレント ドライブã®å¤‰æ›´
            • +
            • f_getcwd - カレント ディレクトリã®å–å¾—
            • +
            +
          • +
          • ãƒœãƒªãƒ¥ãƒ¼ãƒ ç®¡ç† +
              +
            • f_mount - ボリューム ワーク エリアã®ç™»éŒ²ãƒ»æŠ¹æ¶ˆ
            • +
            • f_mkfs - è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã«FATボリュームを作æˆ
            • +
            • f_fdisk - 物ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã«è¤‡æ•°ã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–を作æˆ
            • +
            • f_getfree - ボリュームã®ã‚µã‚¤ã‚ºã¨ç©ºãサイズã®å–å¾—
            • +
            • f_getlabel - ボリューム ラベルã®å–å¾—
            • +
            • f_setlabel - ボリューム ラベルã®è¨­å®š
            • +
            +

          下ä½ãƒ¬ã‚¤ãƒ¤ インターフェース

          -

          FatFsモジュールã¯ã€å˜ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ« システム レイヤãªã®ã§ã€ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ デãƒã‚¤ã‚¹åˆ¶å¾¡ãƒ¬ã‚¤ãƒ¤ã¯å«ã¾ã‚Œã¾ã›ã‚“。使用ã™ã‚‹ãƒ—ラットフォームやストレージ デãƒã‚¤ã‚¹ã«å¯¾å¿œã—ãŸåˆ¶å¾¡é–¢æ•°ã¯ã€ãƒ¦ãƒ¼ã‚¶ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚FatFsモジュールã¯ã€ä¸‹ä½ãƒ¬ã‚¤ãƒ¤ã«å¯¾ã—標準的ã«ã¯æ¬¡ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’è¦æ±‚ã—ã¾ã™ã€‚拡張機能ã€ãŸã¨ãˆã°OS関連機能を有効ã«ã—ãŸã¨ãã¯ã€åŠ ãˆã¦ãƒ—ロセス/メモリæ“作関数ãªã©ã‚‚å¿…è¦ã«ãªã‚Šã¾ã™ã€‚サンプル プロジェクトã«ä¸‹ä½ãƒ¬ã‚¤ãƒ¤ã®å®Ÿè£…例を示ã—ã¾ã™ã€‚

          +layer +

          FatFsモジュールã¯ã€å˜ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ« システム レイヤãªã®ã§ã€ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ デãƒã‚¤ã‚¹åˆ¶å¾¡ãƒ¬ã‚¤ãƒ¤ã¯å«ã¾ã‚Œã¾ã›ã‚“。使用ã™ã‚‹ãƒ—ラットフォームやストレージ デãƒã‚¤ã‚¹ã«å¯¾å¿œã—ãŸåˆ¶å¾¡é–¢æ•°ã¯ã€ã‚¤ãƒ³ãƒ—リメンタã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚FatFsモジュールã¯ã€ä¸‹ä½ãƒ¬ã‚¤ãƒ¤ã«å¯¾ã—標準的ã«ã¯æ¬¡ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’è¦æ±‚ã—ã¾ã™ã€‚一部ã®æ‹¡å¼µæ©Ÿèƒ½ã€ãŸã¨ãˆã°OS関連機能を有効ã«ã—ãŸã¨ãã¯ã€åŠ ãˆã¦ãƒ—ロセス/メモリæ“作関数ãªã©ã‚‚å¿…è¦ã«ãªã‚Šã¾ã™ã€‚サンプル プロジェクトã«ä¸‹ä½ãƒ¬ã‚¤ãƒ¤ã®å®Ÿè£…例を示ã—ã¾ã™ã€‚

          • disk_status - デãƒã‚¤ã‚¹ã®çŠ¶æ…‹å–å¾—
          • disk_initialize - デãƒã‚¤ã‚¹ã®åˆæœŸåŒ–
          • @@ -99,15 +118,17 @@

            資料

            FatFsモジュールã¯ãƒ•ãƒªãƒ¼ ソフトウェアã¨ã—ã¦æ•™è‚²ãƒ»ç ”究・開発用ã«å…¬é–‹ã—ã¦ã„ã¾ã™ã€‚ã©ã®ã‚ˆã†ãªåˆ©ç”¨ç›®çš„(個人利用ã‹ã‚‰å•†ç”¨ã¾ã§ï¼‰ã§ã‚‚使用・改変・é…布ã«ã¤ã„ã¦ä¸€åˆ‡ã®åˆ¶é™ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€å…¨ã¦åˆ©ç”¨è€…ã®è²¬ä»»ã®ä¸‹ã§ã®åˆ©ç”¨ã¨ã—ã¾ã™ã€‚詳ã—ãã¯ã‚¢ãƒ—リケーション ノートをå‚ç…§ã—ã¦ãã ã•ã„。

            diff --git a/firmware/chibios-portapack/ext/fatfs/doc/css_e.css b/firmware/chibios-portapack/ext/fatfs/doc/css_e.css index 2fa0cc1c..99c6714a 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/css_e.css +++ b/firmware/chibios-portapack/ext/fatfs/doc/css_e.css @@ -19,6 +19,7 @@ tt {margin: 0 0.2em; font-size: 0.85em; font-family: "Consolas", "Courier New", tt.arg {font-style: italic;} ol {margin: 0.5em 2.5em;} ul {margin: 0.5em 2em;} +ul ul {margin: 0 2em 0.5em 1em;} dl {margin: 0.5em 1em;} dd {margin: 0 2em;} dt {font-size: 0.85em; font-family: "Consolas", "Courier New", monospace;} @@ -43,13 +44,14 @@ a.imglnk img {border: 1px solid;} .cal {text-align: center; } h1 {line-height: 1em; font-size: 2em; font-family: sans-serif; padding: 0.3em 0 0.3em;} -p.hdd {float: right; text-align: right; margin-top: 0.5em;} -hr.hds {clear: both; margin-bottom: 1em;} - h2 {font-size: 2em; font-family: sans-serif; background-color: #d8d8FF; padding: 0.5em 0.5em; margin: 0 0 0.5em;} h3 {font-size: 1.5em; font-family: sans-serif; margin: 1.5em 0 0.5em;} -h4 {font-size: 1.2em; font-family: sans-serif; margin: 1em 0 0.2em;} -h5 {font-size: 1em; font-family: sans-serif; margin: 0.5em 0 0em;} +div.doc h3 {border-color: #b0d8d8; border-style: solid; border-width: 0px 0px 4px 12px; padding: 4px; margin-top: 3em;} +h4 {font-size: 1.2em; font-family: sans-serif; margin: 2em 0 0.2em;} +h5 {font-size: 1em; font-family: sans-serif; margin: 1em 0 0em;} +p.hdd {float: right; text-align: right; margin-top: 0.5em;} +hr.hds {clear: both; margin-bottom: 1em;} +kbd {letter-spacing: 0;} small {font-size: 80%;} .indent {margin-left: 2em;} diff --git a/firmware/chibios-portapack/ext/fatfs/doc/css_j.css b/firmware/chibios-portapack/ext/fatfs/doc/css_j.css index b226a8b7..3b1a9646 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/css_j.css +++ b/firmware/chibios-portapack/ext/fatfs/doc/css_j.css @@ -9,7 +9,7 @@ a:hover {background-color: #a0ffff;} a:active {color: darkmagenta; overflow: hidden; outline:none; position: relative; top: 1px; left: 1px;} abbr {border-width: 1px;} -p {text-indent: 1em; margin: 0 0 0.3em 0.5em;} +p {text-indent: 0.8em; margin: 0 0 0.3em 0.5em;} i {margin: 0 0.3em 0 0;} b {margin: 0 0.1em;} em {font-style: normal; font-weight: bold; margin: 0 0.1em;} @@ -22,6 +22,7 @@ tt {margin: 0 0.2em; letter-spacing: 0; font-size: 0.85em; font-family: "Consola tt.arg {font-style: italic;} ol {margin: 0.5em 2.5em;} ul {margin: 0.5em 2em;} +ul ul {margin: 0 2em 0.5em 1em;} dl {margin: 0.5em 1em;} dd {margin: 0em 2em;} dt {font-size: 0.85em; font-family: "Consolas", "Courier New", "‚l‚r ƒSƒVƒbƒN", monospace;} @@ -46,13 +47,14 @@ a.imglnk img {border: 1px solid;} .cal {text-align: center; } h1 {line-height: 1em; font-size: 2em; font-family: sans-serif; padding: 0.3em 0 0.3em;} -p.hdd {float: right; text-align: right; margin-top: 0.5em;} -hr.hds {clear: both; margin-bottom: 1em;} - h2 {font-size: 2em; font-family: "‚l‚r ‚oƒSƒVƒbƒN",sans-serif; background-color: #d8d8FF; padding: 0.5em 0.5em; margin: 0 0 0.5em;} h3 {font-size: 1.5em; font-family: "‚l‚r ‚oƒSƒVƒbƒN",sans-serif; margin: 1.5em 0 0.5em;} -h4 {font-size: 1.2em; font-family: "‚l‚r ‚oƒSƒVƒbƒN",sans-serif; margin: 1em 0 0.2em;} -h5 {font-size: 1em; font-family: "‚l‚r ‚oƒSƒVƒbƒN",sans-serif; margin: 0.5em 0 0em;} +div.doc h3 {border-color: #b0d8d8; border-style: solid; border-width: 0px 0px 4px 12px; padding: 4px; margin-top: 3em;} +h4 {font-size: 1.2em; font-family: "‚l‚r ‚oƒSƒVƒbƒN",sans-serif; margin: 2em 0 0.2em;} +h5 {font-size: 1em; font-family: "‚l‚r ‚oƒSƒVƒbƒN",sans-serif; margin: 1em 0 0em;} +p.hdd {float: right; text-align: right; margin-top: 0.5em;} +hr.hds {clear: both; margin-bottom: 1em;} +kbd {letter-spacing: 0;} small {font-size: 80%;} .indent {margin-left: 2em;} diff --git a/firmware/chibios-portapack/ext/fatfs/doc/css_p.css b/firmware/chibios-portapack/ext/fatfs/doc/css_p.css deleted file mode 100644 index f8589aa6..00000000 --- a/firmware/chibios-portapack/ext/fatfs/doc/css_p.css +++ /dev/null @@ -1 +0,0 @@ -body {margin: 8px; background-color: #ffecf0; font-color: black; font-family: serif; line-height: 133%; max-width: 1024px;} diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/appnote.html b/firmware/chibios-portapack/ext/fatfs/doc/en/appnote.html index fee2af9d..aa989320 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/appnote.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/appnote.html @@ -26,9 +26,8 @@
          • Extended Use of FatFs API
          • About FatFs License
          • -
            -
            +

            How to Port

            Basic considerations

            @@ -44,149 +43,142 @@ The FatFs module assumes that size of char/short/long are 8/16/32 bit and int is

            The dependency diagram shown below is a typical configuration of the embedded system with FatFs module.

            dependency diagram

            (a) If a working disk module with FatFs API is provided, no additional function is needed. (b) To attach existing disk drivers with different API, glue functions are needed to translate the APIs between FatFs and the drivers.

            -

            functional diagram

            +

            functional diagram

            Which function is required?

            -

            You need to provide only low level disk I/O functions that required by FatFs module and nothing else. If a working disk module for the target is already existing, you need to write only glue functions to attach it to the FatFs module. If not, you need to port any other disk module or write it from scratch. Most of defined functions are not that always required. For example, disk write function is not required in read-only configuration. Following table shows which function is required depends on configuration options.

            +

            You need to provide only low level disk I/O functions that required by FatFs module and nothing else. If a working disk module for the target system is already existing, you need to write only glue functions to attach it to the FatFs module. If not, you need to port any other disk module or write it from scratch. Most of defined functions are not that always required. For example, disk write function is not required at read-only configuration. Following table shows which function is required depends on the configuration options.

            - + - +
            FunctionRequired when:Note
            FunctionRequired whenNote
            disk_status
            disk_initialize
            disk_read
            AlwaysDisk I/O functions.
            Samples available in ffsample.zip.
            There are many implementations on the web.
            disk_write
            get_fattime
            disk_ioctl (CTRL_SYNC)
            _FS_READONLY == 0
            disk_ioctl (GET_SECTOR_COUNT)
            disk_ioctl (GET_BLOCK_SIZE)
            _USE_MKFS == 1
            disk_ioctl (GET_SECTOR_SIZE)_MAX_SS != _MIN_SS
            disk_ioctl (CTRL_TRIM)_USE_TRIM == 1
            ff_convert
            ff_wtoupper
            _USE_LFN >= 1Unicode support functions.
            Available in option/unicode.c.
            ff_convert
            ff_wtoupper
            _USE_LFN != 0Unicode support functions.
            Just add option/unicode.c to the project.
            ff_cre_syncobj
            ff_del_syncobj
            ff_req_grant
            ff_rel_grant
            _FS_REENTRANT == 1O/S dependent functions.
            Samples available in option/syscall.c.
            ff_mem_alloc
            ff_mem_free
            _USE_LFN == 3
            -
            +

            Limits

            • FAT sub-types: FAT12, FAT16 and FAT32.
            • -
            • Number of open files: Unlimited, depends on available memory.
            • +
            • Number of open files: Unlimited. (depends on available memory)
            • Number of volumes: Upto 10.
            • -
            • File size: Depends on the FAT specs. (upto 4G-1 bytes)
            • -
            • Volume size: Depends on the FAT specs. (upto 2T bytes at 512 bytes/sector)
            • -
            • Cluster size: Depends on the FAT specs. (upto 64K bytes at 512 bytes/sector)
            • -
            • Sector size: Depends on the FAT specs. (512, 1024, 2048 and 4096 bytes)
            • +
            • File size: Upto 4G-1 bytes. (by FAT specs.)
            • +
            • Volume size: Upto 2T bytes at 512 bytes/sector. (by FAT specs.)
            • +
            • Cluster size: Upto 64K bytes at 512 bytes/sector. (by FAT specs.)
            • +
            • Sector size: 512, 1024, 2048 and 4096 bytes. (by FAT specs.)
            -
            +

            Memory Usage

            +

            The memory usage varies depends on the configuration options.

            - - - - - - + + + + +
            ARM7
            32bit
            ARM7
            Thumb
            CM3
            Thumb-2
            AVRH8/300HPIC24RL78V850ESSH-2ARX600IA-32
            CompilerGCCGCCGCCGCCCH38C30CC78K0RCA850SHCRXCVC6
            _WORD_ACCESS00010001011
            text (Full, R/W)1067571716617133551094011722132628113904860327952
            text (Min, R/W) 672746314331 8569 7262 7720 90885287580039485183
            text (Full, R/O) 473131472889 6235 5170 5497 64823833397228623719
            text (Min, R/O) 355924852295 4575 4064 4240 50192993310422142889
            text (Full, R/W)10.6k7.1k6.5k13.3k10.9k11.7k13.3k8.1k9.0k6.0k7.9k
            text (Min, R/W) 6.7k4.6k4.2k 8.6k 7.3k 7.7k 9.1k5.3k5.8k3.9k5.2k
            text (Full, R/O) 4.8k3.2k2.9k 6.2k 5.2k 5.5k 6.5k3.8k4.0k2.9k3.7k
            text (Min, R/O) 3.6k2.5k2.3k 4.6k 4.1k 4.3k 5.0k3.0k3.1k2.2k2.9k
            bssV*4 + 2V*4 + 2V*4 + 2V*2 + 2V*4 + 2V*2 + 2V*2 + 2V*4 + 2V*4 + 2V*4 + 2V*4 + 2
            Work area
            (_FS_TINY == 0)
            V*560
            + F*550
            V*560
            + F*550
            V*560
            + F*550
            V*560
            + F*544
            V*560
            + F*550
            V*560
            + F*544
            V*560
            + F*544
            V*560
            + F*544
            V*560
            + F*550
            V*560
            + F*550
            V*560
            + F*550
            Work area
            (_FS_TINY == 1)
            V*560
            + F*36
            V*560
            + F*36
            V*560
            + F*36
            V*560
            + F*32
            V*560
            + F*36
            V*560
            + F*32
            V*560
            + F*32
            V*560
            + F*36
            V*560
            + F*36
            V*560
            + F*36
            V*560
            + F*36

            These are the memory usage on some target systems with following condition. The memory sizes are in unit of byte, V denotes number of volumes and F denotes number of open files. All samples are optimezed in code size.

            -FatFs R0.10a options:
            -_FS_READONLY     0 (R/W) or 1 (R/O)
            -_FS_MINIMIZE     0 (Full function) or 3 (Minimized function)
            -_USE_STRFUNC     0 (Disable string functions)
            -_USE_MKFS        0 (Disable f_mkfs function)
            -_USE_FORWARD     0 (Disable f_forward function)
            -_USE_FASTSEEK    0 (Disable fast seek feature)
            -_CODE_PAGE       932 (Japanese Shift_JIS)
            -_USE_LFN         0 (Disable LFN feature)
            -_MAX_SS          512 (Fixed sector size)
            -_FS_RPATH        0 (Disable relative path feature)
            -_FS_LABEL        0 (Disable volume label functions)
            -_VOLUMES         V (Number of logical drives to be used)
            -_MULTI_PARTITION 0 (Single partition per drive)
            -_FS_REENTRANT    0 (Disable thread safe)
            -_FS_LOCK         0 (Disable file lock control)
            +FatFs R0.11 options:
            +_FS_READONLY   0 (R/W) or 1 (R/O)
            +_FS_MINIMIZE   0 (Full basic function) or 3 (Minimized function)
            +_VOLUMES       V (Number of logical drives to be used)
            +_WORD_ACCESS   0 or 1 (Set for 1 if possible)
            +(Any other options are left not changed from default setting)
             
            -
            +

            Module Size Reduction

            -

            Follwing table shows which API function is removed by configuration options for the module size reduction.

            +

            Follwing table shows which API function is removed by configuration options for the module size reduction. To use any API function, the row of the function must be clear.

            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            Function_FS_MINIMIZE_FS_READONLY_USE_STRFUNC_FS_RPATH_FS_LABEL_USE_MKFS_USE_FORWARD_MULTI_PARTITION
            0123010  1/201201010101
            f_mount
            f_open
            f_close
            f_read
            f_writex
            f_syncx
            f_lseekx
            f_opendirxx
            f_closedirxx
            f_readdirxx
            f_statxxx
            f_getfreexxxx
            f_truncatexxxx
            f_unlinkxxxx
            f_mkdirxxxx
            f_chmodxxxx
            f_utimexxxx
            f_renamexxxx
            f_chdirx
            f_chdrivex
            f_getcwdxx
            f_getlabelx
            f_setlabelxx
            f_forwardx
            f_mkfsxx
            f_fdiskxxx
            f_putcxx
            f_putsxx
            f_printfxx
            f_getsx
            Function_FS_MINIMIZE_FS_READONLY_USE_STRFUNC_FS_RPATH_USE_FIND_USE_LABEL_USE_MKFS_USE_FORWARD_MULTI_PARTITION
            0123010  1/20120101010101
            f_mount
            f_open
            f_close
            f_read
            f_writex
            f_syncx
            f_lseekx
            f_opendirxx
            f_closedirxx
            f_readdirxx
            f_findfirstxxx
            f_findnextxxx
            f_statxxx
            f_getfreexxxx
            f_truncatexxxx
            f_unlinkxxxx
            f_mkdirxxxx
            f_chmodxxxx
            f_utimexxxx
            f_renamexxxx
            f_chdirx
            f_chdrivex
            f_getcwdxx
            f_getlabelx
            f_setlabelxx
            f_forwardx
            f_mkfsxx
            f_fdiskxxx
            f_putcxx
            f_putsxx
            f_printfxx
            f_getsx
            -
            +

            Long File Name

            -

            FatFs module supports LFN (long file name). The two different file names, SFN (short file name) and LFN, of a file is transparent on the API except for f_readdir() function. The LFN feature is disabled by default. To enable it, set _USE_LFN to 1, 2 or 3, and add option/unicode.c to the project. The LFN feature requiers a certain working buffer in addition. The buffer size can be configured by _MAX_LFN according to the available memory. The length of an LFN will reach up to 255 characters, so that the _MAX_LFN should be set to 255 for full featured LFN operation. If the size of working buffer is insufficient for the input file name, the file function fails with FR_INVALID_NAME. When enable the LFN feature under re-entrant configuration, _USE_LFN must be set to 2 or 3. In this case, the file function allocates the working buffer on the stack or heap. The working buffer occupies (_MAX_LFN + 1) * 2 bytes.

            +

            FatFs module supports LFN (long file name). The two different file names, SFN (short file name) and LFN, of a file is transparent on the API except for f_readdir function. The LFN feature is disabled by default. To enable it, set _USE_LFN to 1, 2 or 3, and add option/unicode.c to the project. The LFN feature requiers a certain working buffer in addition. The buffer size can be configured by _MAX_LFN according to the available memory. The length of an LFN will reach up to 255 characters, so that the _MAX_LFN should be set to 255 for full featured LFN operation. If the size of working buffer is insufficient for the input file name, the file function fails with FR_INVALID_NAME. When use any re-entry to the API with the LFN feature, _USE_LFN must be set to 2 or 3. In this case, the file function allocates the working buffer on the stack or heap. The working buffer occupies (_MAX_LFN + 1) * 2 bytes.

            - - - - - - - + + + + + + +
            LFN cfg on ARM7TDMI
            Code pageProgram size
            SBCS+3.7K
            932(Shift_JIS)+62K
            936(GBK)+177K
            949(Korean)+139K
            950(Big5)+111K
            LFN cfg. at CM3/gcc
            _CODE_PAGECode size
            SBCS+2.8K
            932(Japanese)+62.6k
            936(Simplified Chinese)+177k
            949(Korean)+139k
            950(Traditional Chinese)+111k
            -

            When the LFN feature is enabled, the module size will be increased depends on the selected code page. Right table shows how many bytes increased when LFN feature is enabled with some code pages. Especially, in the CJK region, tens of thousands of characters are being used. Unfortunately, it requires a huge OEM-Unicode bidirectional conversion table and the module size will be drastically increased as shown in the table. As the result, the FatFs with LFN feature with those code pages will not able to be implemented to most 8-bit microcontrollers.

            -

            Note that the LFN feature on the FAT file system is a patent of Microsoft Corporation. This is not the case on FAT32 but most FAT32 drivers come with the LFN feature. FatFs can swich the LFN feature off by configuration option. When enable LFN feature on the commercial products, a license from Microsoft may be required depends on the final destination.

            +

            When the LFN feature is enabled, the module size will be increased depends on the configured code page. Right table shows how much code size increased when LFN feature is enabled with some code pages. Especially, in the CJK region, tens of thousands of characters are being used. Unfortunately, it requires a huge OEM-Unicode bidirectional conversion table and the module size will be drastically increased as shown in the table. As the result, the FatFs with LFN feature with those code pages will not able to be implemented to most 8-bit microcontrollers.

            +

            Note that the LFN feature on the FAT file system is a patent of Microsoft Corporation. This is not the case on FAT32 but most FAT32 drivers come with the LFN feature. FatFs can swich the LFN feature on/off by configuration option. When enable LFN feature on the commercial products, a license from Microsoft may be required depends on the final destination.

            -
            +

            Unicode API

            -

            By default, FatFs uses ANSI/OEM code set on the API under LFN configuration. FatFs can also switch the character encoding to Unicode on the API by _LFN_UNICODE option. This means that the FatFs supports the True-LFN feature. For more information, refer to the description in the file name.

            +

            By default, FatFs uses ANSI/OEM code set on the API even at LFN configuration. FatFs can also switch the character encoding on the API to Unicode by _LFN_UNICODE option. This means that the FatFs supports the True-LFN feature. For more information, refer to the description in the file name.

            -
            +

            Re-entrancy

            -

            The file operations to the different volume is always re-entrant and can work simultaneously. The file operations to the same volume is not re-entrant but it can also be configured to thread-safe by _FS_REENTRANT option. In this case, also the OS dependent synchronization object control functions, ff_cre_syncobj(), ff_del_syncobj(), ff_req_grant() and ff_rel_grant() must be added to the project. There are some examples in the option/syscall.c.

            -

            When a file function is called while the volume is in use by any other task, the file function is suspended until that task leaves the file function. If wait time exceeded a period defined by _TIMEOUT, the file function will abort with FR_TIMEOUT. The timeout feature might not be supported by some RTOS.

            -

            There is an exception for f_mount(), f_mkfs(), f_fdisk() function. These functions are not re-entrant to the same volume or corresponding physical drive. When use these functions, all other tasks must unmount the volume and avoid to access the volume.

            -

            Note that this section describes on the re-entrancy of the FatFs module itself but also the low level disk I/O layer will need to be re-entrant.

            +

            The file operations to the different volume is always re-entrant regardless of configurations and it can work simultaneously without any mutual exclusion.

            +

            The file operations to the same volume is not re-entrant but it can also be configured to thread-safe by _FS_REENTRANT option. It enables to control exclusive use of each file system object. In this case, also the OS dependent synchronization object control functions, ff_cre_syncobj/ff_del_syncobj/ff_req_grant/ff_rel_grant, needed to be added to the project. There are some examples in the option/syscall.c.

            +

            When a file function is called while the volume is being accessed by any other task, the file function to the volume will be suspended until that task leaves the file function. If the wait time exceeded a period defined by _TIMEOUT, the file function will abort with FR_TIMEOUT. The timeout feature might not be supported on the some RTOSs.

            +

            There is an exception on the re-entrancy for f_mount/f_mkfs/f_fdisk function. These volume management functions are not re-entrant to the same volume and corresponding physical drive. When use these functions, any other tasks need to avoid to access the volume.

            +

            Note that this section describes on the re-entrancy of the FatFs module itself. The _FS_REENTRANT controls only exclusive use of each file system object and it does not that prevent to re-enter the low level disk functions. For example, only disk_status function can be re-entered at single volume system and any disk function can be re-entered at multiple volume system. Thus the low level disk I/O layer must be always thread-safe when any FatFs API is re-entered by two or more tasks.

            -
            +

            Duplicated File Access

            -

            FatFs module does not support the read/write collision control of duplicated open to a file. The duplicated open is permitted only when each of open method to a file is read mode. The duplicated open with one or more write mode to a file is always prohibited, and also open file must not be renamed and deleted. A violation of these rules can cause data colluption.

            -

            The file lock control can be enabled by _FS_LOCK option. The value of option defines the number of open objects to manage simultaneously. In this case, if any open, rename or remove that violating the file shareing rule that described above is attempted, the file function will fail with FR_LOCKED. If number of open objects, files and sub-directories, is equal to _FS_LOCK, an extra f_open(), f_optndir() function will fail with FR_TOO_MANY_OPEN_FILES.

            +

            FatFs module does not support the read/write collision control of duplicated open to a file. The duplicated open is permitted only when each of open method to a file is read mode. The duplicated open with one or more write mode to a file is always prohibited, and also open file must not be renamed or deleted. A violation of these rules can cause data colluption.

            +

            The file lock control can be enabled by _FS_LOCK option. The value of option defines the number of open objects to manage simultaneously. In this case, if any open, rename or remove that violating the file shareing rule that described above is attempted, the file function will rejected with FR_LOCKED. If number of open objects, files and sub-directories, is equal to _FS_LOCK, an extra f_open/f_opendir function will fail with FR_TOO_MANY_OPEN_FILES.

            -
            +

            Performance Effective File Access

            -

            For good read/write throughput on the small embedded systems with limited size of memory, application programmer should consider what process is done in the FatFs module. The file data on the volume is transferred in following sequence by f_read() function.

            +

            For good read/write throughput on the small embedded systems with limited size of memory, application programmer should consider what process is done in the FatFs module. The file data on the volume is transferred in following sequence by f_read function.

            Figure 1. Sector misaligned read (short)

            @@ -196,12 +188,12 @@ _FS_LOCK 0 (Disable file lock control)

            Figure 3. Fully sector aligned read

            -

            The file I/O buffer is a sector buffer to read/write a partial data on the sector. The sector buffer is either file private sector buffer on each file object or shared sector buffer in the file system object. The buffer configuration option _FS_TINY determins which sector buffer is used for the file data transfer. When tiny buffer configuration (1) is selected, data memory consumption is reduced _MAX_SS bytes each file object. In this case, FatFs module uses only a sector buffer in the file system object for file data transfer and FAT/directory access. The disadvantage of the tiny buffer configuration is: the FAT data cached in the sector buffer will be lost by file data transfer and it must be reloaded at every cluster boundary. However it will be suitable for most application from view point of the decent performance and low memory comsumption.

            -

            Figure 1 shows that a partial sector, sector misaligned part of the file, is transferred via the file I/O buffer. At long data transfer shown in Figure 2, middle of transfer data that covers one or more sector is transferred to the application buffer directly. Figure 3 shows that the case of entier transfer data is aligned to the sector boundary. In this case, file I/O buffer is not used. On the direct transfer, the maximum extent of sectors are read with disk_read() function at a time but the multiple sector transfer is divided at cluster boundary even if it is contiguous.

            +

            The file I/O buffer is a sector buffer to read/write a partial data on the sector. The sector buffer is either file private sector buffer on each file object or shared sector buffer in the file system object. The buffer configuration option _FS_TINY determins which sector buffer is used for the file data transfer. When tiny buffer configuration (1) is selected, data memory consumption is reduced _MAX_SS bytes each file object. In this case, FatFs module uses only a sector buffer in the file system object for file data transfer and FAT/directory access. The disadvantage of the tiny buffer configuration is: the FAT data cached in the sector buffer will be lost by file data transfer and it must be reloaded at every cluster boundary. However it will be suitable for most application from view point of the decent performance and low memory comsumption.

            +

            Figure 1 shows that a partial sector, sector misaligned part of the file, is transferred via the file I/O buffer. At long data transfer shown in Figure 2, middle of transfer data that covers one or more sector is transferred to the application buffer directly. Figure 3 shows that the case of entier transfer data is aligned to the sector boundary. In this case, file I/O buffer is not used. On the direct transfer, the maximum extent of sectors are read with disk_read function at a time but the multiple sector transfer is divided at cluster boundary even if it is contiguous.

            Therefore taking effort to sector aligned read/write accesss eliminates buffered data transfer and the read/write performance will be improved. Besides the effect, cached FAT data will not be flushed by file data transfer at the tiny configuration, so that it can achieve same performance as non-tiny configuration with small memory footprint.

            -
            +

            Considerations on Flash Memory Media

            To maximize the write performance of flash memory media, such as SDC, CFC and U Disk, it must be controlled in consideration of its characteristitcs.

            Using Mutiple-Sector Write

            @@ -209,14 +201,15 @@ _FS_LOCK 0 (Disable file lock control) Figure 6. Comparison between Multiple/Single Sector Write
            fig.6
            -

            The write throughput of the flash memory media becomes the worst at single sector write transaction. The write throughput increases as the number of sectors per a write transaction. This effect more appers at faster interface speed and the performance ratio often becomes grater than ten. This graph is clearly explaining how fast is multiple block write (W:16K, 32 sectors) than single block write (W:100, 1 sector), and also larger card tends to be slow at single block write. The number of write transactions also affects the life time of the flash memory media. Therefore the application program should write the data in large block as possible. The ideal write chunk size and alighment is size of sector, and size of cluster is the best. Of course all layers between the application and the storage device must have consideration on multiple sector write, however most of open-source disk drivers lack it. Do not split a multiple sector write request into single sector write transactions or the write throughput gets poor. Note that FatFs module and its sample disk drivers supprt multiple sector read/write feature.

            +

            The write throughput of the flash memory media becomes the worst at single sector write transaction. The write throughput increases as the number of sectors per a write transaction as shown in Figure 6. This effect more appers at faster interface speed and the performance ratio often becomes grater than ten. This graph is clearly explaining how fast is multiple block write (W:16K, 32 sectors) than single block write (W:100, 1 sector), and also larger card tends to be slow at single block write. Number of write transactions also affects life time of the flash memory media. When compared at same amount of write data, the single sector write in Figure 6 above wears flash memory media 16 times more than multiple sector write in Figure 6 below. Single sector write is pretty pain for the flash memory media.

            +

            Therefore the application program should write the data in large block as possible. The ideal write chunk size and alighment is size of sector, and size of cluster is the best. Of course all layers between the application and the storage device must have consideration on multiple sector write, however most of open-source memory card drivers lack it. Do not split a multiple sector write request into single sector write transactions or the write throughput gets poor. Note that FatFs module and its sample disk drivers supprt multiple sector read/write feature.

            Forcing Memory Erase

            -

            When remove a file with f_remove() function, the data clusters occupied by the file are marked 'free' on the FAT. But the data sectors containing the file data are not that applied any process, so that the file data left occupies a part of the flash memory array as 'live block'. If the file data is forced erased on removing the file, those data blocks will be turned in to the free block pool. This may skip internal block erase operation to the data block on next write operation. As the result the write performance might be improved. FatFs can manage this feature by setting _USE_TRIM to 1. Note that this is an expectation of internal process of the flash memory storage and not that always effective. Also f_remove() function will take a time when remove a large file. Most applications will not need this feature.

            +

            When remove a file with f_remove function, the data clusters occupied by the file are marked 'free' on the FAT. But the data sectors containing the file data are not that applied any process, so that the file data left occupies a part of the flash memory array as 'live block'. If the file data is forced erased on removing the file, those data blocks will be turned in to the free block pool. This may skip internal block erase operation to the data block on next write operation. As the result the write performance might be improved. FatFs can manage this feature by setting _USE_TRIM to 1. Note that this is an expectation of internal process of the flash memory storage and not that always effective. Also f_remove function will take a time when remove a large file. Most applications will not need this feature.

            -
            +

            Critical Section

            -

            If a write operation to the FAT volume is interrupted due to any accidental failure, such as sudden blackout, incorrect disk removal and unrecoverable disk error, the FAT structure on the volume can be broken. Following images shows the critical section of the FatFs module.

            +

            If a write operation to the FAT volume is interrupted due to any accidental failure, such as sudden blackout, incorrect media removal and unrecoverable disk error, the FAT structure on the volume can be broken. Following images shows the critical section of the FatFs module.

            Figure 4. Long critical section
            fig.4 @@ -234,10 +227,10 @@ Figure 5. Minimized critical section
          • The file created as new or overwritten remains but no content.
          • Efficiency of disk use gets worse due to lost clusters.
          -

          Each case does not affect the files that not opened in write mode. To minimize risk of data loss, the critical section can be minimized by minimizing the time that file is opened in write mode or using f_sync() function as shown in Figure 5.

          +

          Each case does not affect the files that not opened in write mode. To minimize risk of data loss, the critical section can be minimized by minimizing the time that file is opened in write mode or using f_sync function as shown in Figure 5.

          -
          +

          Extended Use of FatFs API

          These are examples of extended use of FatFs APIs. New item will be added whenever a useful code is found.

            @@ -249,27 +242,30 @@ Figure 5. Minimized critical section
          -
          +

          About FatFs License

          FatFs has being developped as a personal project of author, ChaN. It is free from the code anyone else wrote. Following code block shows a copy of the FatFs license document that included in the source files.

          -
          /*----------------------------------------------------------------------------/
          -/  FatFs - FAT file system module  R0.10b                    (C)ChaN, 2014
          +
          +/*----------------------------------------------------------------------------/
          +/  FatFs - FAT file system module  R0.11                 (C)ChaN, 2015
           /-----------------------------------------------------------------------------/
          -/ FatFs module is a generic FAT file system module for small embedded systems.
          -/ This is a free software that opened for education, research and commercial
          -/ developments under license policy of following trems.
          +/ FatFs module is a free software that opened under license policy of
          +/ following conditions.
           /
          -/  Copyright (C) 2014, ChaN, all right reserved.
          +/ Copyright (C) 2015, ChaN, all right reserved.
           /
          -/ * The FatFs module is a free software and there is NO WARRANTY.
          -/ * No restriction on use. You can use, modify and redistribute it for
          -/   personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY.
          -/ * Redistributions of source code must retain the above copyright notice.
          +/ 1. Redistributions of source code must retain the above copyright notice,
          +/    this condition and the following disclaimer.
           /
          -/-----------------------------------------------------------------------------/
          -

          Therefore FatFs license is one of the BSD-style licenses but there is a significant feature. Because FatFs is mainly intended for embedded projects, the redistributions in binary form, such as embedded code or any forms without source code, need not to explain about FatFs in order to extend usability for commercial products. The documentation of the distributions need not include about FatFs and its license documents, and it may also. This is equivalent to the BSD 1-Clause License. Of course FatFs is compatible with the projects under GNU GPL. When redistribute the FatFs with any modification or branch it as a fork, the license can also be changed to GNU GPL, BSD-style license or any free software licenses that not conflict with FatFs license.

          +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/----------------------------------------------------------------------------*/ +
          +

          Therefore FatFs license is one of the BSD-style licenses but there is a significant feature. FatFs is mainly intended for embedded systems. In order to extend the usability for commercial products, the redistributions of FatFs in binary form, such as embedded code or any forms without source code, does not need to explain about use of FatFs in the documentations. This is equivalent to the 1-clause BSD license. Of course FatFs is compatible with the most open source software licenses including GNU GPL. When you redistribute the FatFs source code with any modification or create a fork, the license can also be changed to GNU GPL, BSD-style license or any open source software licenses that not conflict with FatFs license.

          -

          Return

          +

          Return Home

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/chdir.html b/firmware/chibios-portapack/ext/fatfs/doc/en/chdir.html index 063b8f56..b9009fc5 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/chdir.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/chdir.html @@ -50,7 +50,7 @@ FRESULT f_chdir (

          Description

          -

          The f_chdir() function changes the current directory of the logical drive. The current directory of a drive is initialized to the root directory when the drive is auto-mounted. Note that the current directory is retained in the each file system object so that it also affects other tasks that using the volume.

          +

          The f_chdir function changes the current directory of the logical drive. The current directory of a drive is initialized to the root directory when the drive is auto-mounted. Note that the current directory is retained in the each file system object so that it also affects other tasks that using the volume.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/chdrive.html b/firmware/chibios-portapack/ext/fatfs/doc/en/chdrive.html index 665e5430..79509944 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/chdrive.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/chdrive.html @@ -41,7 +41,7 @@ FRESULT f_chdrive (

          Description

          -

          The f_chdrive() function changes the current drive. The initial value of the current drive number is 0. Note that the current drive is retained in a static variable so that it also affects other tasks that using the file functions.

          +

          The f_chdrive function changes the current drive. The initial value of the current drive number is 0. Note that the current drive is retained in a static variable so that it also affects other tasks that using the file functions.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/chmod.html b/firmware/chibios-portapack/ext/fatfs/doc/en/chmod.html index 6d539746..8604873c 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/chmod.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/chmod.html @@ -66,7 +66,7 @@ FRESULT f_chmod (

          Description

          -

          The f_chmod() function changes the attribute of a file or sub-directory.

          +

          The f_chmod function changes the attribute of a file or sub-directory.

          @@ -80,7 +80,7 @@ FRESULT f_chmod (

          Example

               /* Set read-only flag, clear archive flag and others are left unchanged. */
          -    f_chmod("file.txt", AR_RDO, AR_RDO | AR_ARC);
          +    f_chmod("file.txt", AM_RDO, AM_RDO | AM_ARC);
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/close.html b/firmware/chibios-portapack/ext/fatfs/doc/en/close.html index f3423fa1..e7ac2fd1 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/close.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/close.html @@ -36,7 +36,6 @@ FRESULT f_close ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT

          @@ -45,7 +44,7 @@ FRESULT f_close (

          Description

          -

          The f_close() function closes an open file object. If any data has been written to the file, the cached information of the file is written back to the volume. After the function succeeded, the file object is no longer valid and it can be discarded.

          +

          The f_close function closes an open file object. If any data has been written to the file, the cached information of the file is written back to the volume. After the function succeeded, the file object is no longer valid and it can be discarded.

          Note that if the file object is in read-only mode and _FS_LOCK option is not enabled, the file object can also be discarded without this process. However this is not recommended for future compatibility.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/closedir.html b/firmware/chibios-portapack/ext/fatfs/doc/en/closedir.html index 4f97b6be..1494d7e4 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/closedir.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/closedir.html @@ -43,7 +43,7 @@ FRESULT f_closedir (

          Description

          -

          The f_closedir() function closes an open directory object. After the function succeeded, the directory object is no longer valid and it can be discarded.

          +

          The f_closedir function closes an open directory object. After the function succeeded, the directory object is no longer valid and it can be discarded.

          Note that the directory object can also be discarded without this process if _FS_LOCK option is not enabled. However this is not recommended for future compatibility.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/config.html b/firmware/chibios-portapack/ext/fatfs/doc/en/config.html new file mode 100644 index 00000000..82e25c6c --- /dev/null +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/config.html @@ -0,0 +1,220 @@ + + + + + + + + +FatFs - Configuration Options + + + +

          Configuration Options

          +

          There are many options to configure the functions of FatFs for each project. The configuration options are defined in the ffconf.h.

          + +
          +

          Function Configurations

          + +

          _FS_READONLY

          +

          Read/Write(0) or Read-only(1). Read-only configuration removes writing API functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, f_truncate, f_getfree and optional writing functions as well.

          + +

          _FS_MINIMIZE

          +

          This option defines minimization level to remove some basic API functions as follows:

          + + + + + + +
          ValueDescription
          0All basic API functions are available.
          1f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_utime, f_truncate and f_rename function are removed.
          2f_opendir, f_readdir and f_closedir function are removed in addition to 1.
          3f_lseek function is removed in addition to 2.
          + +

          _USE_STRFUNC

          +

          This option switches string functions, f_gets, f_putc, f_puts and f_printf.

          + + + + + +
          ValueDescription
          0Disable string functions.
          1Enable string functions without LF-CRLF conversion.
          2Enable string functions with LF-CRLF conversion.
          + +

          _USE_FIND

          +

          Disable(0) or Enable(1). This option switches filtered directory read feature and related functions, f_findfirst and f_findnext.

          + +

          _USE_MKFS

          +

          Disable(0) or Enable(1). This option switches f_mkfs function.

          + +

          _USE_FASTSEEK

          +

          Disable(0) or Enable(1). This option switches fast seek feature to enable accelerated mode of f_lseek, f_read and f_write function. For more information, read here.

          + +

          _USE_LABEL

          +

          Disable(0) or Enable(1). This option switches volume label functions, f_getlabel and f_setlabel.

          + +

          _USE_FORWARD

          +

          Disable(0) or Enable(1). This option switches f_forward function. also _FS_TINY needs to be set to 1.

          + +
          + + +
          +

          Namespace and Locale Configurations

          + +

          _CODE_PAGE

          +

          This option specifies the OEM code page to be used on the target system. Incorrect setting of the code page can cause a file open failure. If any extended character is not used at all, there is no difference between any code pages.

          + + + + + + + + + + + + + + + + + + + + + + + + +
          ValueDescription
          1ASCII (valid at non-LFN cfg.)
          437U.S.
          720Arabic
          737Greek
          771KBL
          775Baltic
          850Latin 1
          852Latin 2
          855Cyrillic
          857Turkish
          860Portuguese
          861Icelandic
          862Hebrew
          863Canadian French
          864Arabic
          865Nordic
          866Russian
          869Greek 2
          932Japanese (DBCS)
          936Simplified Chinese (DBCS)
          949Korean (DBCS)
          950Traditional Chinese (DBCS)
          + +

          _USE_LFN

          +

          This option switches the LFN feature. When enable the LFN feature, Unicode handling functions option/unicode.c must be added to the project. The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. When use stack for the working buffer, take care on stack overflow. When use heap memory for the working buffer, memory management functions, ff_memalloc and ff_memfree, must be added to the project.

          + + + + + + +
          ValueDescription
          0Disable LFN feature. Only 8.3 format can be used.
          1Enable LFN with static working buffer on the BSS. Always NOT thread-safe.
          2Enable LFN with dynamic working buffer on the STACK.
          3Enable LFN with dynamic working buffer on the HEAP.
          + +

          _MAX_LFN

          +

          This option defines the size of LFN working buffer from 12 to 255 in unit of character. This option has no effect when LFN feature is disabled.

          + +

          _LFN_UNICODE

          +

          ANSI/OEM(0) or Unicode(1). This option switches character encoding on the API. To use Unicode (UTF16) string for the path name, enable LFN feature and set this option to 1. This option also affects behavior of string I/O functions. When LFN feature is disabled, this option must be 0. For more information, read here.

          + +

          _STRF_ENCODE

          +

          When Unicode API is selected by _LFN_UNICODE, this option defines the assumption of character encoding on the file to be read/written via string I/O functions, f_gets, f_putc, f_puts and f_printf. This option has no effect when _LFN_UNICODE == 0.

          + + + + + + +
          ValueDescription
          0ANSI/OEM
          1UTF-16LE
          2UTF-16BE
          3UTF-8
          + +

          _FS_RPATH

          +

          This option configures relative path feature. Note that directory items read via directory functions are affected by this option. For more information, read here.

          + + + + + +
          ValueDescription
          0Disable relative path feature and remove related functions.
          1Enable relative path feature. f_chdir and f_chdrive function is available.
          2f_getcwd function is available in addition to 1
          + +
          + + +
          +

          Volume/Drive Configurations

          + +

          _VOLUMES

          +

          This option configures number of volumes (logical drives, from 1 to 9) to be used.

          + +

          _STR_VOLUME_ID

          +

          Disable(0) or Enable(1). This option switches string volume ID feature. When enabled, also pre-defined strings in _VOLUME_STRS can be used as drive identifier in the path name.

          + +

          _VOLUME_STRS

          +

          This option defines the drive ID strings for each logical drives. Number of items must be equal to _VOLUMES. Valid characters for the drive ID strings are: A-Z and 0-9.

          + +

          _MULTI_PARTITION

          +

          Disable(0) or Enable(1). This option switches multi-partition feature. By default (0), each logical drive number is bound to the same physical drive number and only an FAT volume each physical drive are mounted. When enabled, each logical drive is bound to the partition on the physical drive listed in the user defined partition resolution table VolToPart[]. Also f_fdisk funciton will be enabled. For more information, read here.

          + +

          _MIN_SS, _MAX_SS

          +

          This set of options defines size of sector on the low level disk I/O interface, disk_read and disk_write function. Valid numbers are 512, 1024, 2048 and 4096. _MIN_SS defines minimum size of sector and _MAX_SS defines the maximum size of sector. Always set both 512 for all type of memory cards and harddisk. But a larger value may be required for on-board flash memory and some type of optical media. When _MAX_SS > _MIN_SS, FatFs is configured to variable sector size and GET_SECTOR_SIZE command must be implemented to the disk_ioctl function.

          + +

          _USE_TRIM

          +

          Disable(0) or Enable(1). This option switches ATA-TRIM feature. To enable Trim feature, also CTRL_TRIM command should be implemented to the disk_ioctl function.

          + +

          _FS_NOFSINFO

          +

          0 to 3. If you need to know correct free space on the FAT32 volume, set bit 0 of this option, and f_getfree function at first time after volume mount will force a full FAT scan. Bit 1 controls the use of last allocated cluster number.

          + + + + + + +
          ValueDescription
          bit0=0Use free cluster count in the FSINFO if available.
          bit0=1Do not trust free cluster count in the FSINFO.
          bit1=0Use last allocated cluster number in the FSINFO to find a free cluster if available.
          bit1=1Do not trust last allocated cluster number in the FSINFO.
          + +
          + + +
          +

          System Configurations

          + +

          _FS_TINY

          +

          Normal(0) or Tiny(1). At the tiny configuration, size of the file object FIL is reduced _MAX_SS bytes. Instead of private data buffer eliminated from the file object, common sector buffer in the file system object FATFS is used for the file data transfer.

          + +

          _FS_NORTC

          +

          Use RTC(0) or Do not use RTC(1). This option controls timestamp feature. If the system does not have an RTC function or valid timestamp is not needed, set _FS_NORTC to 1 to disable the timestamp feature. Any object modified by FatFs will have a fixed timestamp value defined by _NORTC_MON, _NORTC_MDAY and _NORTC_YEAR. To use the timestamp feature, set _FS_NORTC to 0 and add get_fattime function to the project to get the current time form RTC. This option has no effect at read-only configuration.

          + +

          _NORTC_MON, _NORTC_MDAY, _NORTC_YEAR

          +

          This set of options defines default timestamp to be used at no RTC systems. This option has no effect at read-only configuration or _FS_NORTC == 0.

          + +

          _FS_LOCK

          +

          This option switches file lock feature to control duplicated file open and illegal operations to open objects. Note that the file lock feature is independent of re-entrancy. This option must be 0 at read-only configuration.

          + + + + +
          ValueDescription
          0Disable file lock feature. To avoid volume corruption, application program should avoid illegal open, remove and rename to the open objects.
          >0Enable file lock feature. The value defines how many files/sub-directories can be opened simultaneously under file lock control. Illigal operations to the open object will be rejected with FR_LOCKED.
          + +

          _FS_REENTRANT

          +

          Disable(0) or Enable(1). This option switches the re-entrancy (thread safe) of the FatFs module itself. Note that file/directory access to the different volume is always re-entrant and it can work simultaneously regardless of this option but volume control functions, f_mount, f_mkfs and f_fdisk, are always not re-entrant. Only file/directory access to the same volume, in other words, exclusive use of each file system object, is under control of this feature. To enable this feature, also user provided synchronization handlers, ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj, must be added to the project. Samples are available in option/syscall.c.

          + +

          _FS_TIMEOUT

          +

          Number of time ticks to abort the file function with FR_TIMEOUT when wait time is too long. This option has no effect when _FS_REENTRANT == 0.

          + +

          _SYNC_t

          +

          This option defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, SemaphoreHandle_t and etc. A header file for O/S definitions needs to be included somewhere in the scope of ff.c. This option has no effect when _FS_REENTRANT == 0.

          + +

          _WORD_ACCESS

          +

          This is an only platform dependent option. It defines which access method is used to the word data on the FAT volume.

          + + + + +
          ValueDescription
          0Byte-by-byte access. Always compatible with all platforms.
          1Word access. Code size will be slightly reduced but do not choose this unless under both the following conditions.
          +* Unaligned memory access is always allowed to ALL instructions.
          +* Byte order on the memory is little-endian.
          +

          Following table shows an example of allowable settings of some type of processors.

          +
          +   ARM7TDMI   0   *2         ColdFire   0   *1         V850E      0   *2
          +   Cortex-M3  0   *3         Z80        0/1            V850ES     0/1
          +   Cortex-M0  0   *2         x86        0/1            TLCS-870   0/1
          +   AVR        0/1            RX600(LE)  0/1            TLCS-900   0/1
          +   AVR32      0   *1         RL78       0   *2         R32C       0   *2
          +   PIC18      0/1            SH-2       0   *1         M16C       0/1
          +   PIC24      0   *2         H8S        0   *1         MSP430     0   *2
          +   PIC32      0   *1         H8/300H    0   *1         8051       0/1
          +
          +   *1:Big-endian.
          +   *2:Unaligned memory access is not supported.
          +   *3:Some compilers generate LDM/STM for mem_cpy function.
          +
          + +
          + +

          Return

          + + diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/dinit.html b/firmware/chibios-portapack/ext/fatfs/doc/en/dinit.html index a85eecd3..d66a0a19 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/dinit.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/dinit.html @@ -32,13 +32,13 @@ DSTATUS disk_initialize (

          Return Values

          -

          This function returns the current drive status flags as the result. For details of the drive status, refer to the disk_status() function.

          +

          This function returns the current drive status flags as the result. For details of the drive status, refer to the disk_status function.

          Description

          This function initializes the storage device and put it ready to generic read/write. When the function succeeded, STA_NOINIT flag in the return value is cleared.

          -

          Application program MUST NOT call this function, or FAT structure on the volume can be broken. To re-initialize the file system, use f_mount() function instead. This function is called at volume mount process by FatFs module to manage the media change.

          +

          This function is under control of FatFs module. Application program MUST NOT call this function, or FAT structure on the volume can be broken. To re-initialize the file system, use f_mount function instead.

          Return

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/dioctl.html b/firmware/chibios-portapack/ext/fatfs/doc/en/dioctl.html index 8fe62eca..e05b80af 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/dioctl.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/dioctl.html @@ -57,11 +57,11 @@ DRESULT disk_ioctl ( - - + + - - + +
          Standard ioctl command used by FatFs
          CommandDescription
          CTRL_SYNCMake sure that the device has finished pending write process. If the disk I/O module has a write back cache, the dirty buffers must be written back to the media immediately. Nothing to do for this command if each write operation to the media is completed within the disk_write() function.
          GET_SECTOR_COUNTReturns number of available sectors on the drive into the DWORD variable pointed by buff. This command is used by only f_mkfs() and f_fdisk() function to determine the volume/partition size to be created. Required at _USE_MKFS == 1 or _MULTI_PARTITION == 1.
          CTRL_SYNCMake sure that the device has finished pending write process. If the disk I/O module has a write back cache, the dirty buffers must be written back to the media immediately. Nothing to do for this command if each write operation to the media is completed within the disk_write function.
          GET_SECTOR_COUNTReturns number of available sectors on the drive into the DWORD variable pointed by buff. This command is used by only f_mkfs and f_fdisk function to determine the volume/partition size to be created. Required at _USE_MKFS == 1 or _MULTI_PARTITION == 1.
          GET_SECTOR_SIZEReturns sector size of the media into the WORD variable pointed by buff. Valid return values of this command are 512, 1024, 2048 and 4096. This command is required only at variable sector size configuration, _MAX_SS > _MIN_SS. At fixed sector size configuration, _MAX_SS == _MIN_SS, this command is not used and the device must work at that sector size.
          GET_BLOCK_SIZEReturns erase block size of the flash memory media in unit of sector into the DWORD variable pointed by buff. The allowable value is from 1 to 32768 in power of 2. Return 1 if the erase block size is unknown or non flash memory media. This command is used by only f_mkfs() function and it attempts to align data area to the erase block boundary. Required at _USE_MKFS == 1.
          CTRL_TRIMInforms the device the data on the block of sectors that specified by DWORD array {<start sector>, <end sector>} pointed by buff is no longer needed and it may be erased. This is an identical command to Trim of ATA device. When this feature is not supported or not a flash memory device, nothing to do for this command. The FatFs does not check the result code and the file function is not affected even if the sector block was not erased well. This command is called on removing a cluster chain and f_mkfs() function. Required at _USE_TRIM == 1.
          GET_BLOCK_SIZEReturns erase block size of the flash memory media in unit of sector into the DWORD variable pointed by buff. The allowable value is from 1 to 32768 in power of 2. Return 1 if the erase block size is unknown or non flash memory media. This command is used by only f_mkfs function and it attempts to align data area to the erase block boundary. Required at _USE_MKFS == 1.
          CTRL_TRIMInforms the device the data on the block of sectors that specified by DWORD array {<start sector>, <end sector>} pointed by buff is no longer needed and it may be erased. This is an identical command to Trim of ATA device. When this feature is not supported or not a flash memory device, nothing to do for this command. The FatFs does not check the result code and the file function is not affected even if the sector block was not erased well. This command is called on removing a cluster chain and f_mkfs function. Required at _USE_TRIM == 1.

          FatFs never uses any device dependent command nor user defined command. Following table shows an example of non-standard commands usable for some applications.

          @@ -70,7 +70,7 @@ DRESULT disk_ioctl ( CommandDescription CTRL_FORMATCreate a physical format on the media. If buff is not null, it is pointer to the call-back function for progress notification. CTRL_POWER_IDLEPut the device idle state. STA_NOINIT in status flag may not be set if the device goes active state by generic read/write function. -CTRL_POWER_OFFPut the device off state. Shut-down the power to the device and deinitialize the device interface if needed. STA_NOINIT in status flag must be set. The device goes active state by disk_initialize() function. +CTRL_POWER_OFFPut the device off state. Shut-down the power to the device and deinitialize the device interface if needed. STA_NOINIT in status flag must be set. The device goes active state by disk_initialize function. CTRL_LOCKLock media eject mechanism. CTRL_UNLOCKUnlock media eject mechanism. CTRL_EJECTEject media cartridge. STA_NOINIT and STA_NODISK in status flag are set after the function succeeded. diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/dread.html b/firmware/chibios-portapack/ext/fatfs/doc/en/dread.html index 2e7c279c..ba31d034 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/dread.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/dread.html @@ -34,7 +34,7 @@ DRESULT disk_read (
          sector
          Start sector number in 32-bit LBA.
          count
          -
          Number of sectors to read in range of from 1 to 128..
          +
          Number of sectors to read. FatFs specifies the value in range of from 1 to 128.
          @@ -56,12 +56,12 @@ DRESULT disk_read (

          Description

          -

          The data read/write operation to the storage devices is done in unit of sector. FatFs supports the sector size in range of from 512 to 4096 bytes. When FatFs is configured to fixed sector size (_MIN_SS == MAX_SS, this will be the most case), the read/write function must work at that sector size. If variable sector size is selected (_MIN_SS < MAX_SS), FatFs inquires the sector size with disk_ioctl() after initialization. +

          The data read/write operation to the storage devices is done in unit of sector. FatFs supports the sector size in range of from 512 to 4096 bytes. When FatFs is configured to fixed sector size (_MIN_SS == MAX_SS, this will be the most case), the read/write function must work at that sector size. When FatFs is configured to variable sector size (_MIN_SS < MAX_SS), sector size is inquired with disk_ioctl function following disk_initialize function.

          The memory address specified by buff is not that always aligned to word boundary because the argument is defined as BYTE*. The misaligned read/write request can occure at direct transfer. If the bus architecture, especially DMA controller, does not allow misaligned memory access, it should be solved in this function. There are some workarounds described below to avoid this issue.

          • Convert word transfer to byte transfer in this function if needed. - Recommended.
          • -
          • For f_read(), avoid long read request that includes a whole of sector. - Direct transfer will never occure.
          • -
          • For f_read(fp, buff, btr, &br), make sure that (((UINT)buff & 3) == (f_tell(fp) & 3)) is true. - Word aligned direct transfer is guaranteed.
          • +
          • At the any f_read calls, avoid long read request that includes a whole of sector. - Direct transfer will never occure.
          • +
          • At the f_read(fp, data, btr, &br) call, make sure that (((UINT)data & 3) == (f_tell(fp) & 3)) is true. - Word alignment of buff is guaranteed.

          Generally, a multiple sector transfer request must not be split into single sector transactions to the storage device, or you will not get good read throughput.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/dstat.html b/firmware/chibios-portapack/ext/fatfs/doc/en/dstat.html index c8204cc3..cadcd41d 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/dstat.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/dstat.html @@ -35,7 +35,7 @@ DSTATUS disk_status (

          The current drive status is returned in combination of status flags described below. FatFs refers only STA_NOINIT and STA_PROTECT.

          STA_NOINIT
          -
          Indicates that the device is not initialized. This flag is set on system reset, media removal or failure of disk_initialize() function. It is cleared on disk_initialize() function succeeded. Media change that occurs asynchronously must be captured and reflect it to the status flags, or auto-mount feature will not work correctly. If the system does not support media change detect feature, application program needs to force de-initialize the file system object with f_mount() function after the media change.
          +
          Indicates that the device is not initialized. This flag is set on system reset, media removal or failure of disk_initialize function. It is cleared on disk_initialize function succeeded. Media change that occurs asynchronously must be captured and reflect it to the status flags, or auto-mount feature will not work correctly. If the system does not support media change detect feature, application program needs to force de-initialize the file system object with f_mount function after the media change.
          STA_NODISK
          Indicates that no medium in the drive. This is always cleared on fixed disk drive. Note that FatFs does not refer this flag.
          STA_PROTECT
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/dwrite.html b/firmware/chibios-portapack/ext/fatfs/doc/en/dwrite.html index fd4bf488..b29b6f34 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/dwrite.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/dwrite.html @@ -34,7 +34,7 @@ DRESULT disk_write (
          sector
          Start sector number in 32-bit LBA.
          count
          -
          Number of sectors to write in range of from 1 to 128.
          +
          Number of sectors to write. FatFs specifies the value in range of from 1 to 128.
          @@ -58,9 +58,9 @@ DRESULT disk_write (

          Description

          -

          The specified memory address is not that always aligned to word boundary because the type of pointer is defined as BYTE*. For more information, refer to the description of disk_read() function.

          +

          The specified memory address is not that always aligned to word boundary because the type of pointer is defined as BYTE*. For more information, refer to the description of disk_read function.

          Generally, a multiple sector transfer request must not be split into single sector transactions to the storage device, or you will never get good write throughput.

          -

          FatFs expects delayed write feature of the disk functions. The write operation to the media need not to be completed due to write operation is in progress or only stored it into the cache buffer when return from this function. But data on the buff is invalid after return from this function. The write completion request is done by CTRL_SYNC command of disk_ioctl() function. Therefore, if delayed write feature is implemented, the write throughput may be improved.

          +

          FatFs expects delayed write feature of the disk control layer. The write operation to the media need not to be completed due to write operation is in progress or data is stored into the write-back cache when return from this function. But write data on the buff is invalid after return from this function. The write completion request is done by CTRL_SYNC command of disk_ioctl function. Therefore, if a delayed write feature is implemented, the write throughput will be improved.

          Application program MUST NOT call this function, or FAT structure on the volume can be collapsed.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/eof.html b/firmware/chibios-portapack/ext/fatfs/doc/en/eof.html index 337697b7..40944c3c 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/eof.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/eof.html @@ -33,13 +33,13 @@ int f_eof (

          Return Values

          -

          The f_eof() function returns a non-zero value if the read/write pointer has reached end of the file; otherwise it returns a zero.

          +

          The f_eof function returns a non-zero value if the read/write pointer has reached end of the file; otherwise it returns a zero.

          Description

          -

          In this revision, this function is implemented as a macro.

          +

          In this revision, this function is implemented as a macro. It has not any validation and mutual exclusion.

           #define f_eof(fp) ((int)((fp)->fptr == (fp)->fsize))
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/error.html b/firmware/chibios-portapack/ext/fatfs/doc/en/error.html index a14deb1a..b8ceef5e 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/error.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/error.html @@ -39,7 +39,7 @@ int f_error (

          Description

          -

          In this revision, this function is implemented as a macro.

          +

          In this revision, this function is implemented as a macro. It has not any validation and mutual exclusion.

           #define f_error(fp) ((fp)->flag)
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/fattime.html b/firmware/chibios-portapack/ext/fatfs/doc/en/fattime.html index d8c245ec..e4ff768b 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/fattime.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/fattime.html @@ -22,7 +22,7 @@ DWORD get_fattime (void);

          Return Value

          -

          Currnet time is returned with packed into a DWORD value. The bit field is as follows:

          +

          Currnet local time is returned with packed into a DWORD value. The bit field is as follows:

          bit31:25
          Year origin from the 1980 (0..127)
          @@ -42,13 +42,13 @@ DWORD get_fattime (void);

          Description

          -

          The get_fattime() function shall return any valid time even if the system does not support a real time clock. If a zero is returned, the file will not have a valid timestamp.

          +

          The get_fattime function shall return any valid time even if the system does not support a real time clock. If a zero is returned, the file will not have a valid timestamp.

          QuickInfo

          -

          This function is not needed when _FS_READONLY == 1.

          +

          This function is not needed when _FS_READONLY == 1 or _FS_NORTC == 1.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/fdisk.html b/firmware/chibios-portapack/ext/fatfs/doc/en/fdisk.html index ad4e4fd6..828bbe55 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/fdisk.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/fdisk.html @@ -48,7 +48,7 @@ FRESULT f_fdisk (

          Description

          -

          The f_fdisk() function creates a partition table into the MBR of the physical drive. The partitioning rule is in generic FDISK format, so that it can create upto four primary partitions. Logical volumes in the extended partition is not supported. The part[] with four items specifies how to divide the physical drive. The first item specifies the size of first primary partition and fourth item specifies the fourth primary partition. If the value is less than or equal to 100, it specifies percentage of the partition in the entire disk space. If it is larger than 100, it specifies the partition size in unit of sector.

          +

          The f_fdisk function creates a partition table into the MBR of the physical drive. The partitioning rule is in generic FDISK format, so that it can create upto four primary partitions. Logical volumes in the extended partition is not supported. The part[] with four items specifies how to divide the physical drive. The first item specifies the size of first primary partition and fourth item specifies the fourth primary partition. If the value is less than or equal to 100, it specifies percentage of the partition in the entire disk space. If it is larger than 100, it specifies the partition size in unit of sector.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/filename.html b/firmware/chibios-portapack/ext/fatfs/doc/en/filename.html index 49dcc2d4..1faafdf9 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/filename.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/filename.html @@ -12,16 +12,16 @@

          Path Names

          -
          +

          Format of the path names

          The format of path name on the FatFs module is similer to the filename specs of DOS/Windos as follows:

          "[drive:][/]directory/file"
          -

          The FatFs module supports long file name (LFN) and 8.3 format file name (SFN). The LFN can be used when LFN feature is enabled (_USE_LFN > 0). The sub directories are separated with a \ or / in the same way as DOS/Windows API. Duplicated separators are skipped and ignored. Only a difference is that the logical drive is specified in a numeral with a colon. When drive number is omitted, the drive number is assumed as default drive (drive 0 or current drive).

          +

          The FatFs module supports long file name (LFN) and 8.3 format file name (SFN). The LFN can be used when LFN feature is enabled (_USE_LFN > 0). The sub directories are separated with a \ or / in the same way as DOS/Windows API. Duplicated separators are skipped and ignored. Only a difference is that the logical drive is specified in a numeral with a colon. When drive number is omitted, the drive number is assumed as default drive (drive 0 or current drive).

          Control characters ('\0' to '\x1F') are recognized as end of the path name. Leading/embedded spaces in the path name are valid as a part of the name at LFN configuration but the space is recognized as end of the path name at non-LFN configuration. Trailing spaces and dots are ignored at both configurations.

          -

          In default configuration (_FS_RPATH == 0), it does not have a concept of current directory like OS oriented file system. All objects on the volume are always specified in full path name that follows from the root directory. Dot directory names are not allowed. Heading separator is ignored and it can be exist or omitted. The default drive is fixed to drive 0.

          -

          When relative path feature is enabled (_FS_RPATH == 1), specified path is followed from the root directory if a heading separator is exist. If not, it is followed from the current directory of the drive set by f_chdir function. Dot names are also allowed for the path name. The default drive is the current drive set by f_chdrive function.

          +

          In default configuration (_FS_RPATH >= 0), it does not have a concept of current directory like OS oriented file system. All objects on the volume are always specified in full path name that follows from the root directory. Dot directory names (".", "..") are not allowed. Heading separator is ignored and it can be exist or omitted. The default drive is fixed to drive 0.

          +

          When relative path feature is enabled (_FS_RPATH >= 1), specified path is followed from the root directory if a heading separator is exist. If not, it is followed from the current directory of the drive set by f_chdir function. Dot names are also allowed for the path names. The default drive is the current drive set by f_chdrive function.

          - + @@ -35,13 +35,19 @@
          Path name_FS_RPATH == 0_FS_RPATH == 1
          Path name_FS_RPATH == 0_FS_RPATH >= 1
          file.txtA file in the root directory of the drive 0A file in the current directory of the current drive
          /file.txtA file in the root directory of the drive 0A file in the root directory of the current drive
          The root directory of the drive 0The current directory of the current drive
          dir1/..Invalid nameThe current directory
          /..Invalid nameThe root directory (sticks the top level)
          -

          When option _STR_VOLUME_ID is specified, also pre-defined strings can be used as drive identifier in the path name instead of a numeral. e.g. "sd:file1.txt" or "ram:swapfile.dat".

          +

          When option _STR_VOLUME_ID is specified, also pre-defined strings can be used as drive identifier in the path name instead of a numeral. e.g. "sd:file1.txt" or "ram:swapfile.dat".

          -


          -
          +
          +

          Legal Characters and Case Sensitivity

          +

          On the FAT file system, legal characters for file name are, 0-9 A-Z ! # $ % & ' ( ) - @ ^ _ ` { } ~ and extended characters (\x80-\xFF). Under LFN supported system, also white space and + , ; = [ ] are legal for the file name and the white spaces and periods can be placed anywhere in the name except for end of the name string.

          +

          FAT file system is case-insensitive to the object names on the volume. All object names are compared in case-insensitive. For example, these three names, file.txt, File.Txt and FILE.TXT, are identical. This is applied to also extended charactres. When an object is created on the FAT volume, upper converted name is recorded to the SFN entry, and the raw name is recorded to the LFN entry.

          +

          As for the DBCS language MS-DOS, it was case-sensitive to the extended characters. To follow this specification, FatFs works with case-sensitive to the extended characters at only non-LFN with DBCS configuration (DOS/DBCS specs). But at LFN configuration, FatFs works with case-insensitive to all characters (WindowsNT specs). This can cause a problem on compatibility with Windows system when an object with extended characters is created on the volume at non-LFN and DBCS configuration; therfore the object names with DBCS extended characters should not be used on the FAT volume shared by those systems.

          +
          + +

          Unicode API

          -

          The path names are input/output in either ANSI/OEM code or Unicode depends on the configuration options. The type of arguments which specify the path names are defined as TCHAR. It is an alias of char by default. The code set used to the path name string is ANSI/OEM specifid by _CODE_PAGE. When _LFN_UNICODE is set to 1, the type of the TCHAR is switched to WCHAR to support Unicode (UTF-16 encoding). In this case, the LFN feature is fully supported and the Unicode specific characters, such as âœâ˜ªâœ¡â˜¸â˜­, can also be used for the path name. It also affects data types and encoding of the string I/O functions. To define literal strings, _T(s) and _TEXT(s) macro are available to select either ANSI/OEM or Unicode automatically. The code shown below is an example to define the literal strings.

          +

          The path names are input/output in either ANSI/OEM code or Unicode depends on the configuration options. The type of arguments which specify the path names are defined as TCHAR. It is an alias of char by default. The code set used to the path name string is ANSI/OEM specifid by _CODE_PAGE. When _LFN_UNICODE is set to 1, the type of the TCHAR is switched to WCHAR to support Unicode (UTF-16 encoding). In this case, the LFN feature is fully supported and the Unicode specific characters, such as âœâ˜ªâœ¡â˜¸â˜­, can also be used for the path name. It also affects data types and encoding of the string I/O functions. To define literal strings, _T(s) and _TEXT(s) macro are available to select either ANSI/OEM or Unicode automatically. The code shown below is an example to define the literal strings.

            f_open(fp, "filename.txt", FA_READ);      /* ANSI/OEM string */
            f_open(fp, L"filename.txt", FA_READ);     /* Unicode string */
          @@ -49,11 +55,10 @@
           
          -


          -
          +

          Volume Management

          -

          The FatFs module needs dynamic work area called file system object for each volume (logical drive). It is registered to the FatFs module by f_mount() function. By default, each logical drive is bound to the physical drive with the same drive number and an FAT volume on the drive is serched by auto detect feature. It loads boot sectors and checks it if it is an FAT boot sector in order of sector 0 as SFD format, 1st partition, 2nd partition, 3rd partition and 4th partition as FDISK format.

          -

          When _MULTI_PARTITION == 1 is specified by configuration option, each individual logical drive is bound to the partition on the physical drive specified by volume management table. The volume management table must be defined by user to resolve relationship between logical drives and partitions. Following code is an example of a volume management table.

          +

          The FatFs module needs dynamic work area called file system object for each volume (logical drive). It is registered to the FatFs module by f_mount function. By default, each logical drive is bound to the physical drive with the same drive number and an FAT volume on the drive is serched by auto detect feature. It loads boot sectors and checks it if it is an FAT boot sector in order of sector 0 as SFD format, 1st partition, 2nd partition, 3rd partition and 4th partition as FDISK format.

          +

          When _MULTI_PARTITION == 1 is specified by configuration option, each individual logical drive is bound to the partition on the physical drive specified by volume management table. The volume management table must be defined by user to resolve the relationship between logical drives and partitions. Following code is an example of a volume management table.

           Example: Logical drive 0-2 are tied to three pri-partitions on the physical drive 0 (fixed disk)
                    Logical drive 3 is tied to an FAT volume on the physical drive 1 (removable disk)
          @@ -66,7 +71,7 @@ PARTITION VolToPart[] = {
           };
           
          relationship between logical drive and physical drive
          -

          There are some considerations on using _MULTI_PARTITION configuration.

          +

          There are some considerations on using multi-partition configuration.

          • The physical drive that has two or more mounted partitions must be non-removable. Media change while a system operation is prohibited.
          • Only four primary partitions can be specified. Extended partition is not supported.
          • @@ -74,5 +79,6 @@ PARTITION VolToPart[] = {
          +

          Return

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/findfirst.html b/firmware/chibios-portapack/ext/fatfs/doc/en/findfirst.html new file mode 100644 index 00000000..66130386 --- /dev/null +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/findfirst.html @@ -0,0 +1,119 @@ + + + + + + + + +FatFs - f_findfirst + + + + +
          +

          f_findfirst

          +

          The f_findfirst function searches a directroy for an item.

          +
          +FRESULT f_findfirst (
          +  DIR* dp,              /* [OUT] Poninter to the directory object */
          +  FILINFO* fno,         /* [OUT] Pointer to the file information structure */
          +  const TCHAR* path,    /* [IN] Pointer to the directory name to be opened */
          +  const TCHAR* pattern  /* [IN] Pointer to the matching pattern string */
          +);
          +
          +
          + +
          +

          Parameters

          +
          +
          dp
          +
          Pointer to the blank directory object.
          +
          fno
          +
          Pointer to the file information structure to store the information about the found item.
          +
          path
          +
          Pointer to the null-terminated string that specifies the directory name to be opened.
          +
          pattern
          +
          Pointer to the null-terminated string that specifies the name matching pattern to be searched for. It is referred by also subsequent f_findnext function, so that the string must be valid while the successive function calls.
          +
          +
          + + + + + +
          +

          Description

          +

          After the directory specified by path could be opened, it starts to search the directory for the item with a name specified by pattern. If found, the information about the object is stored into the file information structure. For more information about file information structure, refer to f_readdir function.

          +

          The matching pattern can contain wildcard characters (? and *). A ? matches an any character and an * matches an any string in length of zero or longer. At LFN configuration, both names of the item, SFN and LFN (if exist), are tested. In this revision, there are some differences listed below between FatFs and standard systems in matching condition.

          +
            +
          • "*.*" never matches any name without extension. (It matches all names at the standard systems)
          • +
          • Any pattern terminated with a period never matches any name. (It matches the names without extensiton at the standard systems)
          • +
          • DBCS extended characters are compared in case-sensitive at LFN with non-Unicode configuration.
          • +
          +
          + + +
          +

          QuickInfo

          +

          This is a wrapper function of f_opendir and f_readdir function. Available when _USE_FIND == 1 and _FS_MINIMIZE <= 1.

          +
          + + +
          +

          Examples

          +
          +/* Search a directory for objects and display it */
          +
          +void find_image (void)
          +{
          +    FRESULT fr;     /* Return value */
          +    DIR dj;         /* Directory search object */
          +    FILINFO fno;    /* File information */
          +#if _USE_LFN
          +    char lfn[_MAX_LFN + 1];
          +    fno.lfname = lfn;
          +    fno.lfsize = _MAX_LFN + 1;
          +#endif
          +
          +    fr = f_findfirst(&dj, &fno, "", "dsc*.jpg");  /* Start to search for JPEG files with the name started by "dsc" */
          +
          +    while (fr == FR_OK && fno.fname[0]) {         /* Repeat while an item is found */
          +#if _USE_LFN
          +        printf("%-12s  %s\n", fno.fname, fno.lfname);/* Display the item name */
          +#else
          +        printf("%s\n", fno.fname);
          +#endif
          +        fr = f_findnext(&dj, &fno);               /* Search for next item */
          +    }
          +    f_closedir(&dj);
          +}
          +
          +
          + + +
          +

          See Also

          +

          f_findnext, f_closedir, DIR, FILINFO

          +
          + +

          Return

          + + diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/findnext.html b/firmware/chibios-portapack/ext/fatfs/doc/en/findnext.html new file mode 100644 index 00000000..c8dd3f5d --- /dev/null +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/findnext.html @@ -0,0 +1,69 @@ + + + + + + + + +FatFs - f_findnext + + + + +
          +

          f_findnext

          +

          The f_findnext function searches for a next matched object

          +
          +FRESULT f_findnext (
          +  DIR* dp,              /* [IN] Poninter to the directory object */
          +  FILINFO* fno          /* [OUT] Pointer to the file information structure */
          +);
          +
          +
          + +
          +

          Parameters

          +
          +
          dp
          +
          Pointer to the valid directory object created by f_findfirst function.
          +
          fno
          +
          Pointer to the file information structure to store the information about the found directory item.
          +
          +
          + + + + + +
          +

          Description

          +

          It continues the search from a previous call to the f_findfirst or f_findnext function. If found, the information about the object is stored into the file information structure. If no item to be read, a null string will be returned into fno->fname[].

          +
          + + +
          +

          QuickInfo

          +

          This is a wrapper function of f_readdir function. Available when _USE_FIND == 1 and _FS_MINIMIZE <= 1.

          +
          + + + + +

          Return

          + + diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/forward.html b/firmware/chibios-portapack/ext/fatfs/doc/en/forward.html index 714c48d1..7581140c 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/forward.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/forward.html @@ -45,7 +45,6 @@ FRESULT f_forward ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT

          @@ -54,7 +53,7 @@ FRESULT f_forward (

          Description

          -

          The f_forward() function reads the data from the file and forward it to the outgoing stream without data buffer. This is suitable for small memory system because it does not require any data buffer at application module. The file pointer of the file object increases in number of bytes forwarded. In case of *bf is less than btf without error, it means the requested bytes could not be transferred due to end of file or stream goes busy during data transfer.

          +

          The f_forward function reads the data from the file and forward it to the outgoing stream without data buffer. This is suitable for small memory system because it does not require any data buffer at application module. The file pointer of the file object increases in number of bytes forwarded. In case of *bf is less than btf without error, it means the requested bytes could not be transferred due to end of file or stream goes busy during data transfer.

          @@ -113,7 +112,7 @@ FRESULT play_file ( if (rc) return rc; /* Repeat until the file pointer reaches end of the file */ - while (rc == FR_OK && fil.fptr < fil.fsize) { + while (rc == FR_OK && !f_eof(&fil)) { /* any other processes... */ diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/getcwd.html b/firmware/chibios-portapack/ext/fatfs/doc/en/getcwd.html index 045cce47..cee958a6 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/getcwd.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/getcwd.html @@ -13,7 +13,7 @@

          f_getcwd

          -

          The f_getcwd function retrieves the current directory.

          +

          The f_getcwd function retrieves the current directory and current drive.

           FRESULT f_getcwd (
             TCHAR* buff, /* [OUT] Buffer to return path name */
          @@ -50,7 +50,7 @@ FRESULT f_getcwd (
           
           

          Description

          -

          The f_getcwd() function retrieves full path name of the current directory of the current drive. When _VOLUMES is larger than 1, a logical drive number is added to top of the path name.

          +

          The f_getcwd function retrieves full path name of the current directory of the current drive. When _VOLUMES is larger than 1, a logical drive number is added to top of the path name.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/getfree.html b/firmware/chibios-portapack/ext/fatfs/doc/en/getfree.html index 5a689751..1cfc09a1 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/getfree.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/getfree.html @@ -27,7 +27,7 @@ FRESULT f_getfree (

          Parameters

          path
          -
          Pinter to the null-terminated string that specifies the logical drive. A null-string means the default drive.
          +
          Pointer to the null-terminated string that specifies the logical drive. A null-string means the default drive.
          nclst
          Pointer to the DWORD variable to store number of free clusters.
          fatfs
          @@ -53,7 +53,7 @@ FRESULT f_getfree (

          Descriptions

          -

          The f_getfree() function gets number of free clusters on the volume. The member csize in the file system object indicates number of sectors per cluster, so that the free space in unit of sector can be calcurated with this information. When FSINFO structure on the FAT32 volume is not in sync, this function can return an incorrect free cluster count. To avoid this problem, FatFs can be forced full FAT scan by _FS_NOFSINFO option.

          +

          The f_getfree function gets number of free clusters on the volume. The member csize in the file system object indicates number of sectors per cluster, so that the free space in unit of sector can be calcurated with this information. When FSINFO structure on the FAT32 volume is not in sync, this function can return an incorrect free cluster count. To avoid this problem, FatFs can be forced full FAT scan by _FS_NOFSINFO option.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/gets.html b/firmware/chibios-portapack/ext/fatfs/doc/en/gets.html index c8439523..8059d351 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/gets.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/gets.html @@ -44,14 +44,14 @@ TCHAR* f_gets (

          Description

          -

          The f_gets() function is a wrapper function of f_read() function. The read operation continues until a '\n' is stored, reached end of the file or the buffer is filled with len - 1 characters. The read string is terminated with a '\0'. When no character to read or any error occured during read operation, it returns a null pointer. The status of EOF and error can be examined with f_eof() and f_error() macros.

          -

          When FatFs is configured to Unicode API (_LFN_UNICODE == 1), data types on the srting fuctions, f_putc(), f_puts(), f_printf() and f_gets(), is also switched to Unicode. The character encoding on the file to be read/written via those functions is selected by _STRF_ENCODE option.

          +

          The read operation continues until a '\n' is stored, reached end of the file or the buffer is filled with len - 1 characters. The read string is terminated with a '\0'. When no character to read or any error occured during read operation, it returns a null pointer. The status of EOF and error can be examined with f_eof and f_error function.

          +

          When FatFs is configured to Unicode API (_LFN_UNICODE == 1), data types on the srting fuctions, f_putc, f_puts, f_printf and f_gets, is also switched to Unicode. The character encoding on the file to be read/written via those functions is selected by _STRF_ENCODE option.

          QuickInfo

          -

          Available when _USE_STRFUNC is 1 or 2. When it is set to 2, '\r's contained in the file are stripped out.

          +

          This is a wrapper function of f_read function. Available when _USE_STRFUNC is 1 or 2. When it is set to 2, '\r's contained in the file are stripped out.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/lseek.html b/firmware/chibios-portapack/ext/fatfs/doc/en/lseek.html index 0f22cf91..e684a380 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/lseek.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/lseek.html @@ -40,7 +40,6 @@ FRESULT f_lseek ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT

          @@ -49,19 +48,19 @@ FRESULT f_lseek (

          Description

          -

          The f_lseek() function moves the file read/write pointer of an open file. The offset can be specified in only origin from top of the file. When an offset beyond the file size is specified at write mode, the file size is expanded to the specified offset. The file data in the expanded area is undefined because no data is written to the file. This is suitable to pre-allocate a cluster chain quickly, for fast write operation. After the f_lseek() function succeeded, the current read/write pointer should be checked in order to make sure the read/write pointer has been moved correctry. In case of the current read/write pointer is not the expected value, either of followings has been occured.

          +

          The f_lseek function moves the file read/write pointer of an open file. The offset can be specified in only origin from top of the file. When an offset beyond the file size is specified at write mode, the file size is expanded to the specified offset. The file data in the expanded area is undefined because no data is written to the file. This is suitable to pre-allocate a cluster chain quickly, for fast write operation. After the f_lseek function succeeded, the current read/write pointer should be checked in order to make sure the read/write pointer has been moved correctry. In case of the current read/write pointer is not the expected value, either of followings has been occured.

          • End of file. The specified ofs was clipped at end of the file because the file has been opened in read-only mode.
          • Disk full. There is insufficient free space on the volume to expand the file.
          -

          Fast seek feature is enabled when _USE_FASTSEEK is set to 1 and the member cltbl in the file object is not NULL. This feature enables fast backward/long seek operations without FAT access by using CLMT (cluster link map table). The fast seek feature is also applied to f_read()/f_write() function, however, the file size cannot be expanded by f_write()/f_lseek() function.

          -

          The CLMT must be created in the user defined DWORD array prior to use the fast seek feature. To create the CLMT, set address of the DWORD array to the member cltbl in the file object, set the array size in unit of items into the first item and call the f_lseek() function with ofs = CREATE_LINKMAP. After the function succeeded and CLMT is created, no FAT access is occured at subsequent f_read()/f_write()/f_lseek() function to the file. If the function failed with FR_NOT_ENOUGH_CORE, the given array size is insufficient for the file and number of items required is returned into the first item of the array. The required array size is (number of fragments + 1) * 2 items. For example, when the file is fragmented in 5, 12 items will be required for the CLMT.

          +

          The fast seek feature enables fast backward/long seek operations without FAT access by using an on-memory CLMT (cluster link map table). It is applied to f_read and f_write function as well, however, the file size cannot be expanded by f_write, f_lseek function while the file is in fast seek mode.

          +

          The fast seek feature is enabled when the member cltbl in the file object is not NULL. The CLMT must be created into the DWORD array prior to use the fast seek feature. To create the CLMT, set address of the DWORD array to the member cltbl in the open file object, set the size of array in unit of items to the first item and call the f_lseek function with ofs = CREATE_LINKMAP. After the function succeeded and CLMT is created, no FAT access is occured in subsequent f_read, f_write, f_lseek function to the file. The number of items used or required is returned into the first item of the array. The number of items to be used is (number of the file fragments + 1) * 2. For example, when the file is fragmented in 5, 12 items in the array will be used. If the function failed with FR_NOT_ENOUGH_CORE, the given array size is insufficient for the file.

          QuickInfo

          -

          Available when _FS_MINIMIZE <= 2.

          +

          Available when _FS_MINIMIZE <= 2. To use fast seek feature, _USE_FASTSEEK needs to be set 1.

          @@ -94,7 +93,7 @@ FRESULT f_lseek ( if (res || f_tell(fp) != PRE_SIZE) ... /* Check if the file has been expanded */ res = f_lseek(fp, DATA_START); /* Record data stream WITHOUT cluster allocation delay */ - ... /* DATA_START and write block size should be aligned to sector boundary */ + ... /* Write operation should be aligned to sector boundary to optimize the write throughput */ res = f_truncate(fp); /* Truncate unused area */ res = f_lseek(fp, 0); /* Put file header */ @@ -107,6 +106,8 @@ FRESULT f_lseek ( DWORD clmt[SZ_TBL]; /* Cluster link map table buffer */ + res = f_open(fp, fname, FA_READ | FA_WRITE); /* Open a file */ + res = f_lseek(fp, ofs1); /* This is normal seek (cltbl is nulled on file open) */ fp->cltbl = clmt; /* Enable fast seek feature (cltbl != NULL) */ diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/mkdir.html b/firmware/chibios-portapack/ext/fatfs/doc/en/mkdir.html index c2c1f4db..970627c9 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/mkdir.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/mkdir.html @@ -53,7 +53,7 @@ FRESULT f_mkdir (

          Description

          -

          This function creates a new directory.

          +

          This function creates a new directory. To remove a directory, use f_unlink function.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/mkfs.html b/firmware/chibios-portapack/ext/fatfs/doc/en/mkfs.html index 5f733fa2..1637a0e2 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/mkfs.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/mkfs.html @@ -13,7 +13,7 @@

          f_mkfs

          -

          The f_mkfs fucntion creates an FAT file system on the logical drive.

          +

          The f_mkfs fucntion creates an FAT volume on the logical drive.

           FRESULT f_mkfs (
             const TCHAR* path,  /* [IN] Logical drive number */
          @@ -27,7 +27,7 @@ FRESULT f_mkfs (
           

          Parameters

          path
          -
          Pinter to the null-terminated string that specifies the logical drive to be formatted. If there is no drive number, it means the default drive.
          +
          Pointer to the null-terminated string that specifies the logical drive to be formatted. If there is no drive number, it means the default drive.
          sfd
          Specifies partitioning rule (FDISK(0) or SFD(1)). This argument will be ignored on some case.
          au
          @@ -51,8 +51,8 @@ FRESULT f_mkfs (

          Description

          -

          The f_mkfs() function creates an FAT volume on the specified logical drive. When FDISK format is specified, a primary partition occupies entire space of the physical drive is created and then an FAT volume is created on the partition. When SFD format is specified, the FAT volume starts from the first sector of the physical drive.

          -

          If the logical drive is bound to the specific partition (1-4) by multiple partition feature (_MULTI_PARTITION), the FAT volume is created into the partition. In this case, the second argument sfd is ignored. The physical drive must have been partitioned with f_fdisk() function or any other partitioning tools prior to create the FAT volume with this function.

          +

          The f_mkfs function creates an FAT volume on the specified logical drive. When FDISK format is specified, a primary partition occupies entire space of the physical drive is created and then an FAT volume is created on the partition. When SFD format is specified, the FAT volume starts from the first sector of the physical drive.

          +

          If the logical drive is bound to the specific partition (1-4) by multiple partition feature (_MULTI_PARTITION), the FAT volume is created into the partition. In this case, the second argument sfd is ignored. The physical drive must have been partitioned with f_fdisk function or any other partitioning tools prior to create the FAT volume with this function.

          Note that there are two partitioning rules, FDISK and SFD. The FDISK partitioning is usually used for harddisk, MMC, SDC, CFC and U Disk. It can divide a physical drive into one or more partitions with a partition table on the MBR. However Windows does not support multiple partition on the removable disk. The SFD is non-partitioned method. The FAT volume starts from the first sector on the physical drive without partition table. It is usually used for floppy disk, Microdrive, optical disk and any type of super-floppy media.

          The FAT sub-type, FAT12/FAT16/FAT32, is determined by number of clusters on the volume and nothing else, according to the FAT specification issued by Microsoft. Thus which FAT sub-type is selected, is depends on the volume size and the specified cluster size. The cluster size affects read/write throughput and space usage efficiency. Larger cluster size increases the read/write throughput and decreases the space usage efficiency of the volume.

          In case of the number of clusters gets near the FAT sub-type boundaries, the function can fail with FR_MKFS_ABORTED.

          @@ -66,7 +66,7 @@ FRESULT f_mkfs (

          Example

          -/* Format the default drive */
          +/* Format default drive and create a file */
           int main (void)
           {
               FATFS fs;      /* File system object (volume work area) */
          @@ -75,7 +75,7 @@ int main (void)
               UINT bw;       /* Bytes written */
           
           
          -    /* Register work area */
          +    /* Register work area (do not care about error) */
               f_mount(&fs, "", 0);
           
               /* Create FAT volume with default cluster size */
          @@ -83,19 +83,18 @@ int main (void)
               if (res) ...
           
               /* Create a file as new */
          -    res = f_open(&fil, "hello.txt", FA_CREATE_NEW | FA_WRITE);
          +    res = f_open(&fil, "hello.txt", FA_CREATE_NEW | FA_WRITE);
               if (res) ...
           
               /* Write a message */
          -    f_write(&fil, "Hello, World!\r\n", 15, &bw);
          +    f_write(&fil, "Hello, World!\r\n", 15, &bw);
               if (bw != 15) ...
           
               /* Close the file */
          -    f_close(&fil);
          +    f_close(&fil);
           
               /* Unregister work area */
               f_mount(0, "", 0);
          -
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/mount.html b/firmware/chibios-portapack/ext/fatfs/doc/en/mount.html index 0edb73aa..5ab9a1f2 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/mount.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/mount.html @@ -27,11 +27,11 @@ FRESULT f_mount (

          Parameters

          fs
          -
          Pointer to the new file system object to be registered. Null pointer unregisters the registered file system object.
          +
          Pointer to the file system object to be registered and cleared. Null pointer unregisters the registered file system object.
          path
          -
          Pointer to the null-terminated string that specifies the logical drive. The string with no drive number means the default drive.
          +
          Pointer to the null-terminated string that specifies the logical drive. The string without drive number means the default drive.
          opt
          -
          Initialization option. 0: Do not mount now (to be mounted later), 1: Force mounted the volume to check if the FAT volume is available.
          +
          Initialization option. 0: Do not mount now (to be mounted later), 1: Force mounted the volume to check if the FAT volume is ready to work.
          @@ -49,21 +49,21 @@ FRESULT f_mount (

          Description

          -

          The f_mount() function registers/unregisters a file system object used for the logical drive to the FatFs module as follows:

          +

          The f_mount function registers/unregisters a file system object used for the logical drive to the FatFs module as follows:

          1. Determines the logical drive which specified by path.
          2. Clears and unregisters the regsitered work area of the drive.
          3. Clears and registers the new work area to the drive if fs is not NULL.
          4. Performs volume mount process to the drive if forced mount is specified.
          -

          The file system object is the work area needed for each logical drive. It must be given to the logical drive with this function prior to use any other file functions except for f_fdisk() function. To unregister a work area, specify a NULL to the fs, and then the work area can be discarded.

          -

          If forced mount is not specified, this function always succeeds regardless of the physical drive status due to delayed mount feature. It only clears (de-initializes) the given work area and registers its address to the internal table. No activity of the physical drive in this function. It can also be used to force de-initialized the registered work area of a logical drive. The volume mount processes, initialize the corresponding physical drive, find the FAT volume in it and initialize the work area, is performed in the subsequent file access functions when either or both of following condition is true.

          +

          The file system object is the work area needed for each logical drive. It must be given to the logical drive with this function prior to use any other file functions except for f_fdisk function to the logical drive. To unregister the work area, specify a NULL to the fs, and then the work area can be discarded.

          +

          If forced mounting is not specified, this function always succeeds regardless of the physical drive status due to delayed mount feature. It only clears (de-initializes) the given work area and registers its address to the internal table. No activity of the physical drive in this function. It can also be used to force de-initialized the registered work area of a logical drive. The volume mount processes, initialize the corresponding physical drive, find the FAT volume in it and initialize the work area, is performed in the subsequent file access functions when either or both of following condition is true.

            -
          • File system object is not initialized. It is cleared by f_mount().
          • +
          • File system object is not initialized. It is de-initialized by f_mount function.
          • Physical drive is not initialized. It is de-initialized by system reset or media removal.
          -

          If the function with forced mount failed, it means that the file system object has been registered successfully but the volume is currently not ready to use. Mount process will also be attempted in subsequent file access functions.

          -

          If implementation of the disk I/O layer lacks media change detection, application program needs to perform a f_mount() after each media change to force cleared the file system object.

          +

          If the function with forced mounting failed, it means that the file system object has been registered successfully but the volume is currently not ready to work. The volume mount process will also be attempted at subsequent file access functions.

          +

          If implementation of the disk I/O layer lacks media change detection, application program needs to perform a f_mount function after each media change to force cleared the file system object.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/open.html b/firmware/chibios-portapack/ext/fatfs/doc/en/open.html index d61a7a45..eaaa3235 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/open.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/open.html @@ -27,18 +27,18 @@ FRESULT f_open (

          Parameters

          fp
          -
          Pointer to the blank file object structure to be created.
          +
          Pointer to the blank file object structure.
          path
          -
          Pointer to a null-terminated string that specifies the file name to open or create.
          +
          Pointer to the null-terminated string that specifies the file name to open or create.
          mode
          Mode flags that specifies the type of access and open method for the file. It is specified by a combination of following flags.
          - + - +
          ValueDescription
          FA_READSpecifies read access to the object. Data can be read from the file. Combine with FA_WRITE for read-write access.
          FA_READSpecifies read access to the object. Data can be read from the file.
          FA_WRITESpecifies write access to the object. Data can be written to the file. Combine with FA_READ for read-write access.
          FA_OPEN_EXISTINGOpens the file. The function fails if the file is not existing. (Default)
          FA_OPEN_ALWAYSOpens the file if it is existing. If not, a new file is created.
          -To append data to the file, use f_lseek() function after file open in this method.
          FA_OPEN_ALWAYSOpens the file if it is existing. If not, a new file will be created.
          +To append data to the file, use f_lseek function after the file open in this method.
          FA_CREATE_NEWCreates a new file. The function fails with FR_EXIST if the file is existing.
          FA_CREATE_ALWAYSCreates a new file. If the file is existing, it will be truncated and overwritten.
          @@ -74,9 +74,9 @@ To append data to the file, use f_lseek() func

          Description

          -

          After f_open() function succeeded, the file object is valid. The file object is used for subsequent read/write functions to identify the file. To close an open file, use f_close() function. If the file is modified and not closed properly, the file data will be collapsed.

          -

          If duplicated file open is needed, read here carefully. However duplicated open of a file with write mode flag is always prohibited.

          -

          Before using any file function, a work area (file system object) must be registered to the logical drive with f_mount() function. All API functions except for f_fdisk() function can work after this procedure.

          +

          Before using any file function, a work area (file system object) must be registered to the logical drive with f_mount function. All API functions except for f_fdisk function can work after this procedure.

          +

          After f_open function succeeded, the file object is valid. The file object is used for subsequent operations to the file to identify the file. Open file must be closed prior to power down, media removal or re-mount, or the file can be collapsed. To close an open file, use f_close function.

          +

          If duplicated file open is needed, read here carefully. However duplicated open of a file with any write mode flag is always prohibited.

          @@ -134,11 +134,11 @@ int main (void) f_mount(&fs[1], "1:", 0); /* Open source file on the drive 1 */ - fr = f_open(&fsrc, "1:file.bin", FA_OPEN_EXISTING | FA_READ); + fr = f_open(&fsrc, "1:file.bin", FA_READ); if (fr) return (int)fr; /* Create destination file on the drive 0 */ - fr = f_open(&fdst, "0:file.bin", FA_CREATE_ALWAYS | FA_WRITE); + fr = f_open(&fdst, "0:file.bin", FA_WRITE | FA_CREATE_ALWAYS); if (fr) return (int)fr; /* Copy source to destination */ diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/opendir.html b/firmware/chibios-portapack/ext/fatfs/doc/en/opendir.html index 2fd4e457..56e66b2e 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/opendir.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/opendir.html @@ -28,7 +28,7 @@ FRESULT f_opendir (
          dp
          Pointer to the blank directory object to create a new one.
          path
          -
          Pinter to the null-terminated string that specifies the directory name to be opened.
          +
          Pointer to the null-terminated string that specifies the directory name to be opened.
          @@ -55,7 +55,7 @@ FRESULT f_opendir (

          Description

          -

          The f_opendir() function opens an exsisting directory and creates a directory object for subsequent f_readdir() function.

          +

          The f_opendir function opens an exsisting directory and creates a directory object for subsequent f_readdir function.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/printf.html b/firmware/chibios-portapack/ext/fatfs/doc/en/printf.html index 96a84b81..7d917510 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/printf.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/printf.html @@ -45,7 +45,7 @@ int f_printf (

          Description

          -

          The f_printf() is a wrapper function of f_write(). The format control directive is a sub-set of standard library shown as follos:

          +

          The format control directive is a sub-set of standard library shown as follos:

          • Type: c C s S d D u U x X b B
          • Size: l L
          • @@ -56,8 +56,8 @@ int f_printf (

            QuickInfo

            -

            Available when _FS_READONLY == 0 and _USE_STRFUNC is 1 or 2. When it is set to 2, '\n's contained in the output are converted to '\r'+'\n'.

            -

            When FatFs is configured to Unicode API (_LFN_UNICODE == 1), data types on the srting fuctions, f_putc(), f_puts(), f_printf() and f_gets(), is also switched to Unicode. The character encoding on the file to be read/written via those functions is selected by _STRF_ENCODE option.

            +

            This is a wrapper function of f_write function. Available when _FS_READONLY == 0 and _USE_STRFUNC is 1 or 2. When it is set to 2, '\n's contained in the output are converted to '\r'+'\n'.

            +

            When FatFs is configured to Unicode API (_LFN_UNICODE == 1), data types on the srting fuctions, f_putc, f_puts, f_printf and f_gets function, is also switched to Unicode. The character encoding on the file to be read/written via those functions is selected by _STRF_ENCODE option.

            diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/putc.html b/firmware/chibios-portapack/ext/fatfs/doc/en/putc.html index 52db016b..9a97baba 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/putc.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/putc.html @@ -36,19 +36,13 @@ int f_putc (

            Return Values

            When the character was written successfuly, it returns number of characters written. When the function failed due to disk full or any error, an EOF (-1) will be returned.

            -

            When FatFs is configured to Unicode API (_LFN_UNICODE == 1), character encoding on the string fuctions, f_putc(), f_puts(), f_printf() and f_gets(), is also switched to Unicode. The character encoding on the file to be read/written via those functions is selected by _STRF_ENCODE option.

            -
            - - -
            -

            Description

            -

            The f_putc() function is a wrapper function of f_write() function.

            +

            When FatFs is configured to Unicode API (_LFN_UNICODE == 1), character encoding on the string fuctions, f_putc, f_puts, f_printf and f_gets function, is also switched to Unicode. The character encoding on the file to be read/written via those functions is selected by _STRF_ENCODE option.

            QuickInfo

            -

            Available when _FS_READONLY == 0 and _USE_STRFUNC is 1 or 2. When it is set to 2, a '\n' is converted to '\r'+'\n'.

            +

            This is a wrapper function of f_write function. Available when _FS_READONLY == 0 and _USE_STRFUNC is 1 or 2. When it is set to 2, a '\n' is converted to '\r'+'\n'.

            diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/puts.html b/firmware/chibios-portapack/ext/fatfs/doc/en/puts.html index 30b1dd35..b213e44c 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/puts.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/puts.html @@ -36,19 +36,13 @@ int f_puts (

            Return Value

            When the function succeeded, it returns number of characters written. When the write operation is aborted due to disk full or any error, an EOF (-1) will be returned.

            -

            When FatFs is configured to Unicode API (_LFN_UNICODE == 1), character encoding on the srting fuctions, f_putc(), f_puts(), f_printf() and f_gets(), is also switched to Unicode. The character encoding on the file to be read/written via those functions is selected by _STRF_ENCODE option.

            -
            - - -
            -

            Description

            -

            The f_puts() function is a wrapper function of f_write() function.

            +

            When FatFs is configured to Unicode API (_LFN_UNICODE == 1), character encoding on the srting fuctions, f_putc, f_puts, f_printf and f_gets function, is also switched to Unicode. The character encoding on the file to be read/written via those functions is selected by _STRF_ENCODE option.

            QuickInfo

            -

            Available when _FS_READONLY == 0 and _USE_STRFUNC is 1 or 2. When it is set to 2, '\n's contained in the string are converted to '\r'+'\n'.

            +

            This is a wrapper function of f_write function. Available when _FS_READONLY == 0 and _USE_STRFUNC is 1 or 2. When it is set to 2, '\n's contained in the string are converted to '\r'+'\n'.

            diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/rc.html b/firmware/chibios-portapack/ext/fatfs/doc/en/rc.html index 306671af..872083f7 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/rc.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/rc.html @@ -17,7 +17,7 @@
            FR_OK (0)
            The function succeeded.
            FR_DISK_ERR
            -
            An unrecoverable hard error occured in the lower layer, disk_read(), disk_write() or disk_ioctl() function.
            Note that if once this error occured at any operation to an open file, the file object is aborted and all operations to the file except for close will be rejected.
            +
            An unrecoverable hard error occured in the lower layer, disk_read, disk_write or disk_ioctl function.
            Note that if once this error occured at any operation to an open file, the file object is aborted and all operations to the file except for close will be rejected.
            FR_INT_ERR
            Assertion failed. An insanity is detected in the internal process. One of the following possibilities is suspected.
              @@ -27,7 +27,7 @@ Note that if once this error occured at any operation to an open file, the file object is aborted and all operations to the file except for close will be rejected.
            FR_NOT_READY
            -
            The disk drive cannot work due to incorrect medium removal or disk_initialize() function failed.
            +
            The storage device cannot work due to a failure of disk_initialize function due to no medium or any other reason.
            FR_NO_FILE
            Could not find the file.
            FR_NO_PATH
            @@ -49,39 +49,46 @@ Note that if once this error occured at any operation to an open file, the file
            FR_EXIST
            Name collision. Any object that has the same name is already existing.
            FR_INVALID_OBJECT
            -
            The file/directory object structure is invalid or a null pointer is given. All open objects of the logical drive are invalidated by the voulme mount process.
            +
            The file/directory object is invalid or a null pointer is given. There are some reasons as follows: +
              +
            • It has been closed, it is not opened or it can be collapsed.
            • +
            • It has been invalidated by a voulme mount process. All open objects of the volume are invalidated as well.
            • +
            • The corresponding physical drive is not ready due to a media removal.
            • +
            +
            FR_WRITE_PROTECTED
            Any write mode operation against the write-protected media.
            FR_INVALID_DRIVE
            -
            Invalid drive number is specified in the path name. A null pointer is given as the path name. (Related option: _VOLUMES)
            +
            Invalid drive number is specified in the path name. A null pointer is given as the path name. (Related option: _VOLUMES)
            FR_NOT_ENABLED
            -
            Work area for the logical drive has not been registered by f_mount() function.
            +
            Work area for the logical drive has not been registered by f_mount function.
            FR_NO_FILESYSTEM
            There is no valid FAT volume on the drive.
            FR_MKFS_ABORTED
            -
            The f_mkfs() function aborted before start in format due to a reason as follows: +
            The f_mkfs function aborted before start in format due to a reason as follows:
            • The disk/partition size is too small.
            • Not allowable cluster size for this disk. This can occure when number of clusters gets near the boundaries of FAT sub-types.
            • -
            • There is no partition related to the logical drive. (Related option: _MULTI_PARTITION)
            • +
            • There is no partition related to the logical drive. (Related option: _MULTI_PARTITION)
            FR_TIMEOUT
            -
            The function was canceled due to a timeout of thread-safe control. (Related option: _TIMEOUT)
            +
            The function was canceled due to a timeout of thread-safe control. (Related option: _TIMEOUT)
            FR_LOCKED
            -
            The operation to the object was rejected by file sharing control. (Related option: _FS_LOCK)
            +
            The operation to the object was rejected by file sharing control. (Related option: _FS_LOCK)
            FR_NOT_ENOUGH_CORE
            Not enough memory for the operation. There is one of the following reasons:
              -
            • Could not allocate a memory for LFN working buffer. (Related option: _USE_LFN)
            • +
            • Could not allocate a memory for LFN working buffer. (Related option: _USE_LFN)
            • Size of the given buffer is insufficient for the size required.
            FR_TOO_MANY_OPEN_FILES
            -
            Number of open objects has been reached maximum value and no more object can be opened. (Related option: _FS_LOCK)
            +
            Number of open objects has been reached maximum value and no more object can be opened. (Related option: _FS_LOCK)
            FR_INVALID_PARAMETER
            The given parameter is invalid or there is any inconsistent.
          +

          Return

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/read.html b/firmware/chibios-portapack/ext/fatfs/doc/en/read.html index de593f0e..8ddc0296 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/read.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/read.html @@ -45,7 +45,6 @@ FRESULT f_read ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/readdir.html b/firmware/chibios-portapack/ext/fatfs/doc/en/readdir.html index bf83ebe6..2cb12107 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/readdir.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/readdir.html @@ -26,9 +26,9 @@ FRESULT f_readdir (

          Parameters

          dp
          -
          Pointer to the open directory object.
          +
          Pointer to the directory object created by f_opendir function.
          fno
          -
          Pointer to the file information structure to store the read item.
          +
          Pointer to the file information structure to store the information about read item.
          @@ -39,7 +39,6 @@ FRESULT f_readdir ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT, FR_NOT_ENOUGH_CORE @@ -49,14 +48,13 @@ FRESULT f_readdir (

          Description

          -

          The f_readdir() function reads directory items, file and directory, in sequence. All items in the directory can be read by calling f_readdir() function repeatedly. When relative path feature is enabled (_FS_RPATH >= 1), dot entries ("." and "..") are not filtered out and they will appear in the read items. When all directory items have been read and no item to read, a null string is returned into the fname[] without any error. When a null pointer is given to the fno, the read index of the directory object is rewinded.

          -

          When LFN feature is enabled, lfname and lfsize in the file information structure must be initialized with valid value prior to use it. The lfname is a pointer to the LFN read buffer. The lfsize is size of the LFN read buffer in unit of TCHAR. If the LFN is not needed, set a null pointer to the lfname and the LFN is not returned. A null string will be returned into the LFN read buffer in case of following conditions.

          +

          The f_readdir function reads directory items, informations about file and directory, in sequence. All items in the directory can be read by calling f_readdir function repeatedly. When relative path feature is enabled (_FS_RPATH >= 1), dot entries ("." and "..") are not filtered out and they will appear in the read items. When all directory items have been read and no item to read, a null string is stored into the fno->fname[] without any error. When a null pointer is given to the fno, the read index of the directory object is rewinded.

          +

          When LFN feature is enabled, fno->lfname and fno->lfsize in the file information structure must be initialized with valid value prior to use it. The lfname points the LFN read buffer. The lfsize is size of the LFN read buffer in unit of TCHAR. If the LFN is not needed, set a null pointer to the lfname and the LFN is not returned. A null string will be returned into the LFN read buffer in case of following conditions.

            -
          • The directory item has no LFN information.
          • +
          • The directory item has no LFN information. In this case, lower case characters can be contained in the fname[].
          • Either the size of read buffer or LFN working buffer is insufficient for the LFN.
          • -
          • The LFN contains any Unicode character that cannot be converted to OEM code. (not the case at Unicode API cfg.)
          • +
          • The LFN contains any Unicode character that cannot be converted to OEM code. (Not the case at Unicode API configuration)
          -

          When the directory item has no LFN information, lower case characters can be contained in the fname[].

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/rename.html b/firmware/chibios-portapack/ext/fatfs/doc/en/rename.html index 2593e890..47cca44f 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/rename.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/rename.html @@ -26,9 +26,9 @@ FRESULT f_rename (

          Parameters

          old_name
          -
          Pointer to a null-terminated string that specifies an existing file or sub-directory to be renamed.
          +
          Pointer to a null-terminated string that specifies the existing file or sub-directory to be renamed.
          new_name
          -
          Pointer to a null-terminated string that specifies the new object name. The drive number specified in this string is ignored and one determined by old_name is used instead.
          +
          Pointer to a null-terminated string that specifies the new object name. Any drive number may be specified in this string but it is ignored and assumed as the same drive of the old_name.
          @@ -58,7 +58,7 @@ FRESULT f_rename (

          Description

          -

          Renames a file or sub-directory and can also move it to other directory within the same logical drive. Do not rename open objects or directry table can be broken.

          +

          Renames a file or sub-directory and can also move it to other directory in the same logical drive. The object to be renamed must not be an open object, or the FAT volume can be collapsed. Such the wrong operation can be rejected safely when file lock feature is enabled.

          @@ -71,11 +71,14 @@ FRESULT f_rename (

          Example

          -    /* Rename an object */
          +    /* Rename an object in the default drive */
               f_rename("oldname.txt", "newname.txt");
           
          -    /* Rename and move an object to other directory */
          -    f_rename("oldname.txt", "dir1/newname.txt");
          +    /* Rename an object in the drive 2 */
          +    f_rename("2:oldname.txt", "newname.txt");
          +
          +    /* Rename an object and move it to other directory */
          +    f_rename("log.txt", "old/log0001.txt");
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/sdir.html b/firmware/chibios-portapack/ext/fatfs/doc/en/sdir.html index 7eba5551..27b205f5 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/sdir.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/sdir.html @@ -13,7 +13,7 @@

          DIR

          -

          The DIR structure is used for the work area to read a directory by f_oepndir()/f_readdir() function. Application program must not modify any member in this structure.

          +

          The DIR structure is used for the work area to read a directory by f_oepndir, f_readdir, f_findfirst and f_findnext function. Application program must not modify any member in this structure, or any data on the FAT volume can be collapsed.

           typedef struct {
               FATFS*  fs;         /* Pointer to the owner file system object */
          @@ -31,6 +31,9 @@
               WCHAR*  lfn;        /* Pointer to the LFN buffer (in/out) */
               WORD    lfn_idx;    /* Index of the LFN entris (0xFFFF:No LFN) */
           #endif
          +#if _USE_FIND
          +    const TCHAR*  pat;  /* Ponter to the matching pattern */
          +#endif
           } DIR;
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/setlabel.html b/firmware/chibios-portapack/ext/fatfs/doc/en/setlabel.html index 91179fc2..e76a285d 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/setlabel.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/setlabel.html @@ -49,12 +49,13 @@ FRESULT f_setlabel (

          Description

          -

          When the string has a drive number, the volume label will be set to the volume specified by the drive number. If not, the label will be set to the default drive. If the given string is a null-string, the volume label on the volume will be removed. The format of the volume label is similar to the short file name but there are some differences shown below:

          +

          When the string has a drive number, the volume label will be set to the volume specified by the drive number. If not, the volume label will be set to the default drive. If length of the given volume label is zero, the volume label on the volume will be removed. The format of the volume label is similar to the short file name but there are some differences shown below:

            -
          • 11 bytes or less in length as local character code. LFN extention is not applied to the volume label.
          • +
          • 11 bytes or less in length as conversion into OEM code page. LFN feature is not applied to the volume label.
          • Cannot contain period.
          • -
          • Can contain spaces anywhere in the volume label. Trailing spaces are truncated off.
          • +
          • Can contain spaces anywhere in it. Trailing spaces are truncated off.
          +

          Remark: The standard system (Windows) has a problem on handling of the volume label with a heading \xE5. To avoid this problem, this function rejects such volume labels as invalid name.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/sfatfs.html b/firmware/chibios-portapack/ext/fatfs/doc/en/sfatfs.html index b420850e..b4c9b71f 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/sfatfs.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/sfatfs.html @@ -13,10 +13,10 @@

          FATFS

          -

          The FATFS structure (file system object) holds dynamic work area of individual logical drives. It is given by application program and registerd/unregisterd to the FatFs module with f_mount() function. Initialization is done on first API call after f_mount() function or media change. Application program must not modify any member in this structure.

          +

          The FATFS structure (file system object) holds dynamic work area of individual logical drives. It is given by application program and registerd/unregisterd to the FatFs module with f_mount function. Initialization is done on first API call after f_mount function or media change. Application program must not modify any member in this structure, or any data on the FAT volume can be collapsed.

           typedef struct {
          -    BYTE    fs_type;      /* FAT sub-type (0:Not mounted) */
          +    BYTE    fs_type;      /* FAT sub-type (0:Not mounted, FS_FAT12/FS_FAT16/FS_FAT32) */
               BYTE    drv;          /* Physical drive number */
               BYTE    csize;        /* Sectors per cluster (1,2,4,...,128) */
               BYTE    n_fats;       /* Number of FAT copies (1,2) */
          @@ -31,19 +31,19 @@
               _SYNC_t sobj;         /* Identifier of sync object */
           #endif
           #if !_FS_READONLY
          -    DWORD   last_clust;   /* FSINFO: Last allocated cluster */
          -    DWORD   free_clust;   /* FSINFO: Number of free clusters */
          +    DWORD   last_clust;   /* FSINFO: Last allocated cluster (0xFFFFFFFF if invalid) */
          +    DWORD   free_clust;   /* FSINFO: Number of free clusters (0xFFFFFFFF if invalid) */
           #endif
           #if _FS_RPATH
          -    DWORD   cdir;         /* Current directory start cluster (0:root) */
          +    DWORD   cdir;         /* Cluster number of current directory (0:root) */
           #endif
          -    DWORD   n_fatent;     /* Number of FAT entries (== Number of clusters + 2) */
          +    DWORD   n_fatent;     /* Number of FAT entries (Number of clusters + 2) */
               DWORD   fsize;        /* Sectors per FAT */
          -    DWORD   volbase;      /* Volume start sector */
          -    DWORD   fatbase;      /* FAT area start sector */
          -    DWORD   dirbase;      /* Root directory area start sector (FAT32: Cluster#) */
          -    DWORD   database;     /* Data area start sector */
          -    DWORD   winsect;      /* Current sector appearing in the win[] */
          +    DWORD   volbase;      /* Volume base LBA */
          +    DWORD   fatbase;      /* FAT base LBA */
          +    DWORD   dirbase;      /* Root directory base (LBA|Cluster) */
          +    DWORD   database;     /* Data base LBA */
          +    DWORD   winsect;      /* Sector LBA appearing in the win[] */
               BYTE    win[_MAX_SS]; /* Disk access window for directory, FAT (and file data at tiny cfg) */
           } FATFS;
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/sfile.html b/firmware/chibios-portapack/ext/fatfs/doc/en/sfile.html index 1ed98990..ee62071f 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/sfile.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/sfile.html @@ -13,7 +13,7 @@

          FIL

          -

          The FIL structure (file object) holds the state of an open file. It is created by f_open() function and discarded by f_close() function. Application program must not modify any member in this structure except for cltbl. Note that a sector buffer is defined in this structure at non-tiny configuration (_FS_TINY == 0), so that the FIL structures at that configuration should not be defined as auto variable.

          +

          The FIL structure (file object) holds the state of an open file. It is created by f_open function and discarded by f_close function. Application program must not modify any member in this structure except for cltbl, or any data on the FAT volume can be collapsed. Note that a sector buffer is defined in this structure at non-tiny configuration (_FS_TINY == 0), so that the FIL structures at that configuration should not be defined as auto variable.

           typedef struct {
          @@ -24,20 +24,20 @@
               DWORD   fptr;         /* File read/write pointer (Byte offset origin from top of the file) */
               DWORD   fsize;        /* File size in unit of byte */
               DWORD   sclust;       /* File start cluster */
          -    DWORD   clust;        /* Current cluster */
          -    DWORD   dsect;        /* Current data sector */
          +    DWORD   clust;        /* Current cluster of fptr (One cluster behind if fptr is on the cluster boundary. Invalid if fptr == 0.) */
          +    DWORD   dsect;        /* Current data sector (Can be invalid if fptr is on the cluster boundary.)*/
           #if !_FS_READONLY
          -    DWORD   dir_sect;     /* Sector containing the directory entry */
          +    DWORD   dir_sect;     /* Sector number containing the directory entry */
               BYTE*   dir_ptr;      /* Ponter to the directory entry in the window */
           #endif
           #if _USE_FASTSEEK
          -    DWORD*  cltbl;        /* Pointer to the cluster link map table (Nulled on file open) */
          +    DWORD*  cltbl;        /* Pointer to the cluster link map table (Nulled on file open. Set by application.) */
           #endif
           #if _FS_LOCK
               UINT    lockid;       /* Fle lock ID */
           #endif
           #if !_FS_TINY
          -    BYTE    buf[_MAX_SS]; /* File private data transfer buffer */
          +    BYTE    buf[_MAX_SS]; /* File private data transfer buffer (Always valid if fptr is not on the sector boundary but can be invalid if fptr is on the sector boundary.) */
           #endif
           } FIL;
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/sfileinfo.html b/firmware/chibios-portapack/ext/fatfs/doc/en/sfileinfo.html index ac254a12..70e20e4e 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/sfileinfo.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/sfileinfo.html @@ -13,7 +13,7 @@

          FILINFO

          -

          The FILINFO structure holds a file information returned by f_readdir() and f_stat() function.

          +

          The FILINFO structure holds information about the object returned by f_readdir, f_findfirst, f_findnext and f_stat function.

           typedef struct {
               DWORD fsize;      /* File size */
          @@ -58,9 +58,9 @@
           
          fattrib
          Indicates the file/directory attribute in combination of AM_DIR, AM_RDO, AM_HID, AM_SYS and AM_ARC.
          fname[]
          -
          Indicates the file/directory name in 8.3 format null-terminated string. It is always returnd with upper case in non-LFN configuration but it can be returned with lower case in LFN configuration.
          +
          The object name in 8.3 format (SFN) null-terminated string is stored. It is always upper case at non-LFN configuration but it can be returned with lower case at LFN configuration. A null string is stored when no item to read and this structure is invalid.
          lfname
          -
          Pointer to the LFN buffer to store the read LFN. This member must be initialized by application program prior to use this structure. Set a null pointer if LFN is not needed. Not available at non-LFN configuration.
          +
          Pointer to the string buffer to store the long file name (LFN). This member must be initialized by application program prior to use this structure. Set a null pointer if LFN is not needed. Not available at non-LFN configuration.
          lfsize
          Size of the LFN buffer in unit of TCHAR. This member must be initialized by application program prior to use this structure. Not available at non-LFN configuration.
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/size.html b/firmware/chibios-portapack/ext/fatfs/doc/en/size.html index bb786c61..a25a32cc 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/size.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/size.html @@ -39,7 +39,7 @@ DWORD f_size (

          Description

          -

          In this revision, the f_size() function is implemented as a macro.

          +

          In this revision, the f_size function is implemented as a macro. It has not any validation and mutual exclusion.

           #define f_size(fp) ((fp)->fsize)
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/stat.html b/firmware/chibios-portapack/ext/fatfs/doc/en/stat.html index db53c5d5..5651c956 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/stat.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/stat.html @@ -54,7 +54,7 @@ FRESULT f_stat (

          Description

          -

          The f_stat() function checks the existence of a file or sub-directory. If not exist, the function returns with FR_NO_FILE. If exist, the function returns with FR_OK and the informations of the object, file size, timestamp, attribute and SFN, are stored to the file information structure. For details of the file information, refer to the FILINFO structure and f_readdir() function.

          +

          The f_stat function checks the existence of a file or sub-directory. If not exist, the function returns with FR_NO_FILE. If exist, the function returns with FR_OK and the informations of the object, file size, timestamp, attribute and SFN, are stored to the file information structure. For details of the file information, refer to the FILINFO structure and f_readdir function.

          When LFN feature is enabled, lfname in the file information structure must be NULLed prior to use it.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/sync.html b/firmware/chibios-portapack/ext/fatfs/doc/en/sync.html index 3e86b7ff..3c16ac47 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/sync.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/sync.html @@ -36,7 +36,6 @@ FRESULT f_sync ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT

          @@ -45,8 +44,8 @@ FRESULT f_sync (

          Description

          -

          The f_sync() function performs the same process as f_close() function but the file is left opened and can continue read/write/seek operations to the file. This is suitable for the applications that open files for a long time in write mode, such as data logger. Performing f_sync() function of periodic or immediataly after f_write() function can minimize the risk of data loss due to a sudden blackout or an unintentional media removal. For more information, refer to application note.

          -

          However there is no sense in f_sync() function immediataly before f_close() function because it performs f_sync() function in it. In other words, the differnce between those functions is that the file object is invalidated or not.

          +

          The f_sync function performs the same process as f_close function but the file is left opened and can continue read/write/seek operations to the file. This is suitable for the applications that open files for a long time in write mode, such as data logger. Performing f_sync function of periodic or immediataly after f_write function can minimize the risk of data loss due to a sudden blackout or an unintentional media removal. For more information, refer to application note.

          +

          However there is no sense in f_sync function immediataly before f_close function because it performs f_sync function in it. In other words, the differnce between those functions is that the file object is invalidated or not.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/tell.html b/firmware/chibios-portapack/ext/fatfs/doc/en/tell.html index 93d03c91..49a2c578 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/tell.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/tell.html @@ -39,7 +39,7 @@ DWORD f_tell (

          Description

          -

          In this revision, the f_tell() function is implemented as a macro.

          +

          In this revision, the f_tell function is implemented as a macro. It has not any validation and mutual exclusion.

           #define f_tell(fp) ((fp)->fptr)
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/truncate.html b/firmware/chibios-portapack/ext/fatfs/doc/en/truncate.html index 7dc980d4..9be17b12 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/truncate.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/truncate.html @@ -36,7 +36,6 @@ FRESULT f_truncate ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT

          @@ -45,7 +44,7 @@ FRESULT f_truncate (

          Description

          -

          The f_truncate() function truncates the file size to the current file read/write pointer. This function has no effect if the file read/write pointer is already pointing end of the file.

          +

          The f_truncate function truncates the file size to the current file read/write pointer. This function has no effect if the file read/write pointer is already pointing end of the file.

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/unlink.html b/firmware/chibios-portapack/ext/fatfs/doc/en/unlink.html index fc884c3c..34db349a 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/unlink.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/unlink.html @@ -25,7 +25,7 @@ FRESULT f_unlink (

          Parameter

          path
          -
          Pointer to the null-terminated string that specifies an object to be removed.
          +
          Pointer to a null-terminated string that specifies the file or sub-directory to be removed.
          @@ -59,7 +59,7 @@ FRESULT f_unlink ( If condition of the object to be removed is applicable to the following terms, the function will be rejected.
          • The file/sub-directory must not have read-only attribute (AM_RDO), or the function will be rejected with FR_DENIED.
          • The sub-directory must be empty and must not be current directory, or the function will be rejected with FR_DENIED.
          • -
          • The file/sub-directory must not be opened, or the FAT volume can be collapsed. It can be rejected with FR_LOCKED when file lock feature is enabled.
          • +
          • The file/sub-directory must not be opened, or the FAT volume can be collapsed. It will be rejected safely when file lock feature is enabled.
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/utime.html b/firmware/chibios-portapack/ext/fatfs/doc/en/utime.html index 7466c19f..ac646e38 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/utime.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/utime.html @@ -55,7 +55,7 @@ FRESULT f_utime (

          Description

          -

          The f_utime() function changes the timestamp of a file or sub-directory

          +

          The f_utime function changes the timestamp of a file or sub-directory

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/en/write.html b/firmware/chibios-portapack/ext/fatfs/doc/en/write.html index 925fd564..5bcd5a79 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/en/write.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/en/write.html @@ -45,7 +45,6 @@ FRESULT f_write ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/img/app3.c b/firmware/chibios-portapack/ext/fatfs/doc/img/app3.c index 662c403f..6733ee61 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/img/app3.c +++ b/firmware/chibios-portapack/ext/fatfs/doc/img/app3.c @@ -4,11 +4,10 @@ / This function checks if the file is contiguous with desired size. / If not, a block of contiguous sectors is allocated to the file. / If the file has been opened without FA_WRITE flag, it only checks if -/ the file is contiguous and returns the resulut. */ - -#if _FATFS != 80367 /* Check if R0.10c */ -#error This function may not be compatible with this revision of FatFs module. -#endif +/ the file is contiguous and returns the resulut. +/-----------------------------------------------------------------------/ +/ This function can work with FatFs R0.09 to R0.11a. +/----------------------------------------------------------------------*/ /* Declarations of FatFs internal functions accessible from applications. / This is intended to be used for disk checking/fixing or dirty hacks :-) */ @@ -37,16 +36,20 @@ DWORD allocate_contiguous_clusters ( /* Returns the first sector in LBA (0:er do { cl = get_fat(fp->fs, ccl); /* Get the cluster status */ if (cl + 1 < 3) return 0; /* Hard error? */ - if (cl != ccl + 1 &&; cl < fp->fs->n_fatent) break; /* Not contiguous? */ + if (cl != ccl + 1 && cl < fp->fs->n_fatent) break; /* Not contiguous? */ ccl = cl; } while (++ncl < tcl); if (ncl == tcl) /* Is the file contiguous? */ - return clust2sect(fp->fs, fp->sclust); /* Return file start sector */ + return clust2sect(fp->fs, fp->sclust); /* File is contiguous. Return the start sector */ } + + /* File is not contiguous */ #if _FS_READONLY - return 0; + return 0; /* Exit if in read-only cfg. */ #else - if (f_truncate(fp)) return 0; /* Remove the existing chain */ + if (!(fp->flag & FA_WRITE)) return 0; /* Exit if the file object is for read-only */ + + if (f_truncate(fp)) return 0; /* Remove the non-contiguous chain */ /* Find a free contiguous area */ ccl = cl = 2; ncl = 0; @@ -80,24 +83,23 @@ int main (void) DWORD org; - /* Open or create a file */ + /* Open or create a file to write */ f_mount(&fs, "", 0); - fr = f_open(&fil, "swapfile.sys", FA_READ | FA_WRITE | FA_OPEN_ALWAYS); + fr = f_open(&fil, "fastrec.log", FA_READ | FA_WRITE | FA_OPEN_ALWAYS); if (fr) return 1; - /* Check if the file is 64MB in size and occupies a contiguous area. + /* Check if the file is 256MB in size and occupies a contiguous area. / If not, a contiguous area will be re-allocated to the file. */ - org = allocate_contiguous_clusters(&fil, 0x4000000); + org = allocate_contiguous_clusters(&fil, 0x10000000); if (!org) { printf("Function failed due to any error or insufficient contiguous area.\n"); f_close(&fil); return 1; } - /* Now you can read/write the file with disk functions bypassing the file system layer. */ - + /* Now you can read/write the file without file system layer. */ + ... dr = disk_write(fil.fs->drv, Buff, org, 1024); /* Write 512KiB from top of the file */ - ... f_close(&fil); diff --git a/firmware/chibios-portapack/ext/fatfs/doc/img/app4.c b/firmware/chibios-portapack/ext/fatfs/doc/img/app4.c index 993eb4f4..03d124de 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/img/app4.c +++ b/firmware/chibios-portapack/ext/fatfs/doc/img/app4.c @@ -48,7 +48,6 @@ int test_diskio ( DRESULT dr; - printf("test_diskio(%u, %u, 0x%08X, 0x%08X)\n", pdrv, ncyc, (UINT)buff, sz_buff); if (sz_buff < _MAX_SS + 4) { @@ -306,11 +305,11 @@ int main (int argc, char* argv[]) DWORD buff[512]; /* 2048 byte working buffer */ /* Check function/compatibility of the physical drive #0 */ - rc = test_diskio(0, 1, buff, sizeof buff); - if (res) { - printf("Sorry the function/compatibility test failed.\nFatFs will not work on this disk driver.\n"); + rc = test_diskio(0, 3, buff, sizeof buff); + if (rc) { + printf("Sorry the function/compatibility test failed. (rc=%d)\nFatFs will not work on this disk driver.\n", rc); } else { - printf("Congratulations! The disk I/O layer works well.\n"); + printf("Congratulations! The disk driver works well.\n"); } return rc; diff --git a/firmware/chibios-portapack/ext/fatfs/doc/img/f6.png b/firmware/chibios-portapack/ext/fatfs/doc/img/f6.png index a7b0d71e..ec6eb215 100644 Binary files a/firmware/chibios-portapack/ext/fatfs/doc/img/f6.png and b/firmware/chibios-portapack/ext/fatfs/doc/img/f6.png differ diff --git a/firmware/chibios-portapack/ext/fatfs/doc/img/funcs.png b/firmware/chibios-portapack/ext/fatfs/doc/img/funcs.png index 03e7d6d1..81105d71 100644 Binary files a/firmware/chibios-portapack/ext/fatfs/doc/img/funcs.png and b/firmware/chibios-portapack/ext/fatfs/doc/img/funcs.png differ diff --git a/firmware/chibios-portapack/ext/fatfs/doc/img/layers.png b/firmware/chibios-portapack/ext/fatfs/doc/img/layers.png index d485d6b6..f9880927 100644 Binary files a/firmware/chibios-portapack/ext/fatfs/doc/img/layers.png and b/firmware/chibios-portapack/ext/fatfs/doc/img/layers.png differ diff --git a/firmware/chibios-portapack/ext/fatfs/doc/img/layers1.png b/firmware/chibios-portapack/ext/fatfs/doc/img/layers1.png new file mode 100644 index 00000000..1b54f860 Binary files /dev/null and b/firmware/chibios-portapack/ext/fatfs/doc/img/layers1.png differ diff --git a/firmware/chibios-portapack/ext/fatfs/doc/img/layers2.png b/firmware/chibios-portapack/ext/fatfs/doc/img/layers2.png new file mode 100644 index 00000000..406c4536 Binary files /dev/null and b/firmware/chibios-portapack/ext/fatfs/doc/img/layers2.png differ diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/appnote.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/appnote.html index 4985bae5..fdc69a9f 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/appnote.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/appnote.html @@ -17,7 +17,6 @@
        • メモリ使用é‡
        • モジュール サイズã®ç¸®å°
        • é•·ã„ファイルå
        • -
        • 日本語ファイルåã®å¤§æ–‡å­—変æ›
        • Unicode入出力ã¸ã®å¯¾å¿œ
        • リエントランシー
        • 多é‡ãƒ•ã‚¡ã‚¤ãƒ« アクセス
        • @@ -27,13 +26,12 @@
        • APIã®æ‹¡å¼µçš„使用例
        • FatFsã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã«ã¤ã„ã¦
        • -
          -
          +

          ãƒãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã®éš›ã«é…æ…®ã™ã¹ãã“ã¨

          -

          移æ¤ã®éš›ã®å‰ææ¡ä»¶

          -

          FatFsモジュールã¯ç§»æ¤æ€§ã«é–¢ã—ã¦æ¬¡ã®ç‚¹ã‚’å‰æã¨ã—ã¦ã„ã¾ã™ã€‚

          +

          ãƒãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã®éš›ã®å‰ææ¡ä»¶

          +

          FatFsモジュールã¯ãƒãƒ¼ã‚¿ãƒ“リティã«é–¢ã—ã¦æ¬¡ã®ç‚¹ã‚’å‰æã¨ã—ã¦ã„ã¾ã™ã€‚

          • 処ç†ç³»ã¯ANSI C準拠ã§ã‚ã‚‹ã“ã¨ã€‚
            FatFsモジュールã¯ANSI C(C89)準拠ã§è¨˜è¿°ã•ã‚Œã¦ã„ã‚‹ã®ã§ã€æ™®é€šã®Cコンパイラãªã‚‰ç‰¹ã«å‡¦ç†ç³»ä¾å­˜ã«ãªã‚‹ç‚¹ã¯ã‚ã‚Šã¾ã›ã‚“。
          • @@ -45,10 +43,10 @@ FatFsモジュールã¯ANSI C(C89)準拠ã§è¨˜è¿°ã•ã‚Œã¦ã„ã‚‹ã®ã§ã€æ™®é€š

            下ã«ç¤ºã™ä¾å­˜é–¢ä¿‚図ã¯ã€FatFsモジュール利用ã®çµ„ã¿è¾¼ã¿ã‚·ã‚¹ãƒ†ãƒ ã«ãŠã‘る代表的ãªæ§‹æˆã‚’示ã—ã¾ã™ã€‚

            システム構æˆå›³

            (a) FatFs用ã«æ›¸ã‹ã‚ŒãŸãƒ‡ã‚£ã‚¹ã‚¯ モジュールãŒã‚ã‚‹å ´åˆã¯ã€ãã®ã¾ã¾è¿½åŠ ã™ã‚‹ã ã‘ã§ã™ã€‚ (b) ã—ã‹ã—ã€å¤šãã®æ—¢å­˜ã®ãƒ‡ã‚£ã‚¹ã‚¯ モジュールã¯ãã®APIã‚’FatFsã«åˆã‚ã›ã‚‹ãŸã‚ã€ã‚°ãƒ«ãƒ¼é–¢æ•°ãŒå¿…è¦ã«ãªã‚‹ã§ã—ょã†ã€‚

            -

            functional diagram

            +

            functional diagram

            ユーザã®ä½œæˆã™ã‚‹é–¢æ•°

            -

            å¿…è¦ãªã®ã¯FatFsモジュールã®è¦æ±‚ã™ã‚‹ãƒ‡ã‚£ã‚¹ã‚¯é–¢æ•°ã‚’用æ„ã™ã‚‹ã“ã¨ã ã‘ã§ã€ãれ以外ã«ã™ã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。既ã«å‹•ä½œã—ã¦ã„るディスク モジュールãŒã‚ã‚‹ãªã‚‰ã€ãã®APIã‚’FatFsã«åˆã‚ã›ã‚‹ã‹ã‚°ãƒ«ãƒ¼é–¢æ•°ã‚’介ã—ã¦ã¤ãªãã ã‘ã§æ¸ˆã¿ã¾ã™ãŒã€ç„¡ã„å ´åˆã¯ã»ã‹ã‹ã‚‰ç§»æ¤ã™ã‚‹ã‹æœ€åˆã‹ã‚‰æ›¸ãã‹ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚定義ã•ã‚Œã¦ã„ã‚‹å…¨ã¦ã®é–¢æ•°ãŒå¸¸ã«å¿…è¦ãªã‚ã‘ã§ã¯ã‚ã‚Šã¾ã›ã‚“。例ãˆã°ã€ãƒªãƒ¼ãƒ‰ オンリー構æˆã§ã¯æ›¸ãè¾¼ã¿ç³»é–¢æ•°ã¯å¿…è¦ã‚ã‚Šã¾ã›ã‚“。次ã®è¡¨ã«æ§‹æˆã‚ªãƒ—ションã¨è¦æ±‚ã•ã‚Œã‚‹é–¢æ•°ã®å¯¾å¿œã‚’示ã—ã¾ã™ã€‚

            +

            ãƒãƒ¼ãƒ†ã‚£ãƒ³ã‚°ä½œæ¥­ã¯ã€è¦æ±‚ã•ã‚Œã‚‹ãƒ‡ãƒã‚¤ã‚¹åˆ¶å¾¡é–¢æ•°ã‚’用æ„ã™ã‚‹ã“ã¨ãŒå…¨ã¦ã§ã€ãれ以外ã«ã™ã‚‹ã“ã¨ã¯ä½•ã‚‚ã‚ã‚Šã¾ã›ã‚“。既ã«å‹•ä½œã—ã¦ã„るデãƒã‚¤ã‚¹åˆ¶å¾¡ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ãŒã‚ã‚‹ãªã‚‰ã€ãã®APIã‚’FatFsã«åˆã‚ã›ã‚‹ã‹ã‚°ãƒ«ãƒ¼é–¢æ•°ã‚’介ã—ã¦ã¤ãªãã ã‘ã§æ¸ˆã¿ã¾ã™ãŒã€ç„¡ã„å ´åˆã¯ã»ã‹ã‹ã‚‰ç§»æ¤ã™ã‚‹ã‹æœ€åˆã‹ã‚‰æ›¸ãã‹ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚定義ã•ã‚Œã¦ã„ã‚‹å…¨ã¦ã®é–¢æ•°ãŒå¸¸ã«å¿…è¦ãªã‚ã‘ã§ã¯ã‚ã‚Šã¾ã›ã‚“。例ãˆã°ã€ãƒªãƒ¼ãƒ‰ オンリ構æˆã§ã¯æ›¸ãè¾¼ã¿ç³»é–¢æ•°ã¯å¿…è¦ã‚ã‚Šã¾ã›ã‚“。次ã®è¡¨ã«æ§‹æˆã‚ªãƒ—ションã¨è¦æ±‚ã•ã‚Œã‚‹é–¢æ•°ã®å¯¾å¿œã‚’示ã—ã¾ã™ã€‚

            @@ -56,66 +54,56 @@ FatFsモジュールã¯ANSI C(C89)準拠ã§è¨˜è¿°ã•ã‚Œã¦ã„ã‚‹ã®ã§ã€æ™®é€š - +
            å¿…è¦ãªé–¢æ•°å¿…è¦ã¨ãªã‚‹æ¡ä»¶å‚™è€ƒ
            disk_status
            disk_initialize
            disk_read
            常時ffsample.zip (サンプル)
            ãã®ä»–web上ã«å¤šæ•°
            disk_ioctl (GET_SECTOR_COUNT)
            disk_ioctl (GET_BLOCK_SIZE)
            _USE_MKFS == 1
            disk_ioctl (GET_SECTOR_SIZE)_MAX_SS != _MIN_SS
            disk_ioctl (CTRL_TRIM)_USE_TRIM == 1
            ff_convert
            ff_wtoupper
            _USE_LFN >= 1option/unicode.c
            ff_convert
            ff_wtoupper
            _USE_LFN != 0option/unicode.cをプロジェクトã«
            加ãˆã‚Œã°ã‚ˆã„
            ff_cre_syncobj
            ff_rel_grant
            ff_req_grant
            ff_del_syncobj
            _FS_REENTRANT == 1option/syscall.c (サンプル)
            ff_mem_alloc
            ff_mem_free
            _USE_LFN == 3
          -
          +

          é™ç•Œå€¤

          • FATタイプ: FAT12, FAT16, FAT32。
          • åŒæ™‚オープン ファイル数: 無制é™ã€‚(利用å¯èƒ½ãƒ¡ãƒ¢ãƒªã«ã‚ˆã‚‹)
          • -
          • ボリューム数: 最大 10。
          • -
          • ファイル サイズ: FATè¦æ ¼ã«ä¾å­˜ã€‚(最大 4G-1ãƒã‚¤ãƒˆ)
          • -
          • ボリューム サイズ: FATè¦æ ¼ã«ä¾å­˜ã€‚(最大 2Tãƒã‚¤ãƒˆ(512ãƒã‚¤ãƒˆ/セクタ時))
          • -
          • クラスタ サイズ: FATè¦æ ¼ã«ä¾å­˜ã€‚(最大 64Kãƒã‚¤ãƒˆ(512ãƒã‚¤ãƒˆ/セクタ時))
          • -
          • セクタ サイズ: FATè¦æ ¼ã«ä¾å­˜ã€‚(512~4096ãƒã‚¤ãƒˆ)
          • +
          • åŒæ™‚マウント ボリューム数: 最大 10。
          • +
          • ファイル サイズ: 最大 4G-1ãƒã‚¤ãƒˆã€‚
          • +
          • ボリューム サイズ: 最大 2Tãƒã‚¤ãƒˆ(512ãƒã‚¤ãƒˆ/セクタ時)。
          • +
          • クラスタ サイズ: 最大 64Kãƒã‚¤ãƒˆ(512ãƒã‚¤ãƒˆ/セクタ時)。
          • +
          • セクタ サイズ: 512, 1024, 2048, 4096ãƒã‚¤ãƒˆã€‚
          -
          +

          メモリ使用é‡

          次ã®è¡¨ã«ã„ãã¤ã‹ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã«ãŠã‘るメモリ使用é‡ã®ä¾‹ã‚’示ã—ã¾ã™ã€‚テスト時ã®æ§‹æˆã‚ªãƒ—ションã¯ãã®ä¸‹ã®é€šã‚Šã§ã™ã€‚数値ã®å˜ä½ã¯ãƒã‚¤ãƒˆã§ã€Vã¯ãƒœãƒªãƒ¥ãƒ¼ãƒ æ•°ã€Fã¯åŒæ™‚オープン ファイル数を示ã—ã¾ã™ã€‚コンパイラã®æœ€é©åŒ–オプションã¯ã‚³ãƒ¼ãƒ‰ サイズã¨ã—ã¦ã„ã¾ã™ã€‚

          - - - - - + + + + +
          ARM7
          32bit
          ARM7
          Thumb
          CM3
          Thumb-2
          AVRH8/300HPIC24RL78V850ESSH-2ARX600IA-32
          CompilerGCCGCCGCCGCCCH38C30CC78K0RCA850SHCRXCVC6
          _WORD_ACCESS00010001011
          text (Full, R/W)1067571716617133551094011722132628113904860327952
          text (Min, R/W) 672746314331 8569 7262 7720 90885287580039485183
          text (Full, R/O) 473131472889 6235 5170 5497 64823833397228623719
          text (Min, R/O) 355924852295 4575 4064 4240 50192993310422142889
          text (Full, R/W)10.6k7.1k6.5k13.3k10.9k11.7k13.3k8.1k9.0k6.0k7.9k
          text (Min, R/W) 6.7k4.6k4.2k 8.6k 7.3k 7.7k 9.1k5.3k5.8k3.9k5.2k
          text (Full, R/O) 4.8k3.2k2.9k 6.2k 5.2k 5.5k 6.5k3.8k4.0k2.9k3.7k
          text (Min, R/O) 3.6k2.5k2.3k 4.6k 4.1k 4.3k 5.0k3.0k3.1k2.2k2.9k
          bssV*4 + 2V*4 + 2V*4 + 2V*2 + 2V*4 + 2V*2 + 2V*2 + 2V*4 + 2V*4 + 2V*4 + 2V*4 + 2
          Work area
          (_FS_TINY == 0)
          V*560
          + F*550
          V*560
          + F*550
          V*560
          + F*550
          V*560
          + F*544
          V*560
          + F*550
          V*560
          + F*544
          V*560
          + F*544
          V*560
          + F*544
          V*560
          + F*550
          V*560
          + F*550
          V*560
          + F*550
          Work area
          (_FS_TINY == 1)
          V*560
          + F*36
          V*560
          + F*36
          V*560
          + F*36
          V*560
          + F*32
          V*560
          + F*36
          V*560
          + F*32
          V*560
          + F*32
          V*560
          + F*36
          V*560
          + F*36
          V*560
          + F*36
          V*560
          + F*36
          -FatFs R0.10a options:
          -_FS_READONLY     0 (R/W) or 1 (R/O)
          -_FS_MINIMIZE     0 (Full function) or 3 (Minimized function)
          -_USE_STRFUNC     0 (Disable string functions)
          -_USE_MKFS        0 (Disable f_mkfs function)
          -_USE_FORWARD     0 (Disable f_forward function)
          -_USE_FASTSEEK    0 (Disable fast seek feature)
          -_CODE_PAGE       932 (Japanese Shift_JIS)
          -_USE_LFN         0 (Disable LFN feature)
          -_MAX_SS          512 (Fixed sector size)
          -_FS_RPATH        0 (Disable relative path feature)
          -_FS_LABEL        0 (Disable volume label functions)
          -_VOLUMES         V (Number of logical drives to be used)
          -_MULTI_PARTITION 0 (Single partition per drive)
          -_FS_REENTRANT    0 (Disable thread safe)
          -_FS_LOCK         0 (Disable file lock control)
          +FatFs R0.11 options:
          +_FS_READONLY   0 (R/W) or 1 (R/O)
          +_FS_MINIMIZE   0 (Full basic function) or 3 (Minimized function)
          +_VOLUMES       V (Number of logical drives to be used)
          +_WORD_ACCESS   0 or 1 (Set by processor architecture)
          +(Any other options are left not changed from default setting)
           
          -
          +

          モジュール サイズã®ç¸®å°

          -

          次ã®è¡¨ã¯æ§‹æˆã‚ªãƒ—ションã®è¨­å®šå€¤ã«ã‚ˆã‚Šã©ã®æ©Ÿèƒ½ãŒå‰Šé™¤ã•ã‚Œã‚‹ã‹ã‚’示ã—ã¾ã™ã€‚

          +

          次ã®è¡¨ã¯æ§‹æˆã‚ªãƒ—ションã®è¨­å®šå€¤ã«ã‚ˆã‚Šã©ã®æ©Ÿèƒ½ãŒå‰Šé™¤ã•ã‚Œã‚‹ã‹ã‚’示ã—ã¾ã™ã€‚使用ã™ã‚‹API関数ã®è¡Œã«xãŒç„¡ã‘ã‚Œã°ãã®é–¢æ•°ã¯ä½¿ç”¨å¯èƒ½ã§ã™ã€‚

          - + @@ -150,50 +138,46 @@ _FS_LOCK 0 (Disable file lock control)
          Function_FS_MINIMIZE_FS_READONLY_USE_STRFUNC_FS_RPATH_FS_LABEL_USE_MKFS_USE_FORWARD_MULTI_PARTITION
          Function_FS_MINIMIZE_FS_READONLY_USE_STRFUNC_FS_RPATH_USE_LABEL_USE_MKFS_USE_FORWARD_MULTI_PARTITION
          0123010  1/20120101010/12
          f_mount
          f_open
          -
          +

          é•·ã„ファイルå

          -

          FatFsモジュールã¯ã€é•·ã„ファイルå(LFN)をサãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ファイルã«ä»˜ã‘られãŸ2ã¤ã®ç•°ãªã‚‹åå‰(短ã„ファルåã¨é•·ã„ファイルå)ã¯ã€f_readdir()を除ãファイルæ“作関数ã«ãŠã„ã¦é€éŽã§ã™ã€‚デフォルト構æˆã§ã¯ã€LFN機能ã¯OFFã«ãªã£ã¦ã„ã¾ã™ã€‚LFN機能を有効ã«ã™ã‚‹ã«ã¯ã€_USE_LFNã‚’1,2ã¾ãŸã¯3ã«è¨­å®šã—ã€option/unicode.cをプロジェクトã«è¿½åŠ ã—ã¾ã™ã€‚LFN機能ã¯ã€åŠ ãˆã¦ã‚る程度ã®ãƒ¯ãƒ¼ã‚¯ エリア(LFNæ“作ãƒãƒƒãƒ•ã‚¡)ã‚’å¿…è¦ã¨ã—ã¾ã™ã€‚ãƒãƒƒãƒ•ã‚¡é•·ã¯ä½¿ç”¨ã§ãるメモリã«å¿œã˜ã¦_MAX_LFNオプションã§æ§‹æˆã•ã‚Œã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚LFNã®é•·ã•ã¯æœ€å¤§255文字ã«é”ã™ã‚‹ã®ã§ã€LFN完全対応ã®ãŸã‚ã«ã¯_MAX_LFNã¯255ã«è¨­å®šã•ã‚Œã‚‹ã¹ãã§ã™ã€‚与ãˆã‚‰ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«åã«å¯¾ã—ã¦ãƒãƒƒãƒ•ã‚¡é•·ãŒä¸è¶³ã—ãŸå ´åˆã€ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ã¯FR_INVALID_NAMEã§å¤±æ•—ã—ã¾ã™ã€‚

          -

          ファイル関数ã«å†å…¥ã‚’è¡Œã†æ¡ä»¶ã®ä¸‹ã§LFN機能を使用ã™ã‚‹å ´åˆã¯ã€_USE_LFNã¯2ã¾ãŸã¯3ã«è¨­å®šã•ã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。ã“ã®å ´åˆã€ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ã¯ãƒ¯ãƒ¼ã‚¯ エリアを動的ã«ç¢ºä¿(スタックã¾ãŸã¯ãƒ’ープ)ã—ã¾ã™ã€‚ãƒãƒƒãƒ•ã‚¡ サイズã¯ã€(_MAX_LFN + 1) * 2ãƒã‚¤ãƒˆã«ãªã‚‹ã®ã§ã€ã‚¹ã‚¿ãƒƒã‚¯ç­‰ã®ã‚µã‚¤ã‚ºã¯ãれを考慮ã—ãŸå分ãªã‚µã‚¤ã‚ºã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。

          +

          FatFsモジュールã¯ã€é•·ã„ファイルå(LFN)をサãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ファイルã«ä»˜ã‘られãŸ2ã¤ã®ç•°ãªã‚‹åå‰(短ã„ファルåã¨é•·ã„ファイルå)ã¯ã€f_readdir関数を除ãファイルæ“作関数ã«ãŠã„ã¦é€éŽã§ã™ã€‚デフォルト構æˆã§ã¯ã€LFN機能ã¯OFFã«ãªã£ã¦ã„ã¾ã™ã€‚LFN機能を有効ã«ã™ã‚‹ã«ã¯ã€_USE_LFNã‚’1,2ã¾ãŸã¯3ã«è¨­å®šã—ã€option/unicode.cをプロジェクトã«è¿½åŠ ã—ã¾ã™ã€‚LFN機能ã¯ã€åŠ ãˆã¦ã‚る程度ã®ãƒ¯ãƒ¼ã‚¯ エリア(LFNæ“作ãƒãƒƒãƒ•ã‚¡)ã‚’å¿…è¦ã¨ã—ã¾ã™ã€‚ãƒãƒƒãƒ•ã‚¡é•·ã¯ä½¿ç”¨ã§ãるメモリã«å¿œã˜ã¦_MAX_LFNオプションã§æ§‹æˆã•ã‚Œã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚LFNã®é•·ã•ã¯æœ€å¤§255文字ã«é”ã™ã‚‹ã®ã§ã€LFN完全対応ã®ãŸã‚ã«ã¯_MAX_LFNã¯255ã«è¨­å®šã•ã‚Œã‚‹ã¹ãã§ã™ã€‚与ãˆã‚‰ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«åã«å¯¾ã—ã¦ãƒãƒƒãƒ•ã‚¡é•·ãŒä¸è¶³ã—ãŸå ´åˆã€ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ã¯FR_INVALID_NAMEã§å¤±æ•—ã—ã¾ã™ã€‚

          +

          ファイル関数ã«å†å…¥ã‚’è¡Œã†æ¡ä»¶ã®ä¸‹ã§LFN機能を使用ã™ã‚‹å ´åˆã¯ã€_USE_LFNã¯2ã¾ãŸã¯3ã«è¨­å®šã•ã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。ã“ã®å ´åˆã€ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ã¯ãƒ¯ãƒ¼ã‚¯ エリアを動的ã«ç¢ºä¿(スタックã¾ãŸã¯ãƒ’ープ)ã—ã¾ã™ã€‚ワーク エリアã®ã‚µã‚¤ã‚ºã¯ã€(_MAX_LFN + 1) * 2ãƒã‚¤ãƒˆã«ãªã‚‹ã®ã§ã€ã‚¹ã‚¿ãƒƒã‚¯ç­‰ã®ã‚µã‚¤ã‚ºã¯ãれを考慮ã—ãŸå分ãªä½™è£•ãŒãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。

          - - - - - - - + + + + + + +
          LFN cfg on ARM7
          コードページコードサイズ[bytes]
          SBCS+3721
          932(Shift_JIS)+62609
          936(GBK)+177797
          949(Korean)+139857
          950(Big5)+111497
          LFNæ§‹æˆ at CM3
          _CODE_PAGE追加コード
          SBCS+2.8K
          932(Shift_JIS)+62.6k
          936(GBK)+177k
          949(Korean)+139k
          950(Big5)+111k

          LFN機能ã®ä¸Šæ‰‹ãªä½¿ã„æ–¹ã¯ã€ãれを使ã‚ãªã„ã¨ã„ã†ã“ã¨ã§ã™ã€‚実際ã€çµ„ã¿è¾¼ã¿ç”¨é€”ã§ã¯LFN機能ãŒã©ã†ã—ã¦ã‚‚å¿…è¦ã«ãªã‚‹ã¨ã„ã†ã“ã¨ã¯ã»ã¨ã‚“ã©ç„¡ã„ã¯ãšã§ã™ã€‚LFNを有効ã«ã™ã‚‹ã¨ã€é¸æŠžã•ã‚ŒãŸã‚³ãƒ¼ãƒ‰ ページã«å¿œã˜ã¦ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ« サイズãŒå¢—大ã—ã¾ã™ã€‚å³ã®è¡¨ã«å„コード ページã«ãŠã‘ã‚‹LFNを有効ã«ã—ãŸã¨ãã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ« サイズã®é•ã„を示ã—ã¾ã™ã€‚特ã«ã€CJK地域ã§ã¯æ•°ä¸‡ã®æ–‡å­—ãŒä½¿ã‚ã‚Œã¦ã„ã¾ã™ãŒã€ä¸å¹¸ãªã“ã¨ã«ãã‚Œã¯å·¨å¤§ãªOEMï¼Unicode相互変æ›ãƒ†ãƒ¼ãƒ–ルをè¦æ±‚ã—ã€ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ« サイズã¯åŠ‡çš„ã«å¢—大ã—ã¾ã™ã€‚ãã®çµæžœã€ãれらã®ã‚³ãƒ¼ãƒ‰ ページã«ãŠã„ã¦LFNを有効ã«ã—ãŸFatFsモジュールã¯ã€å¤šãã®8ビット マイコンã«ã‚¤ãƒ³ãƒ—リメントã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。

          LFN機能ã®ãƒãƒ¼ãƒ‰ãƒ«ã¯ãã‚Œã ã‘ã§ã¯ã‚ã‚Šã¾ã›ã‚“。マイクロソフト社ã¯FATファイル システムã«ã¤ã„ã¦ã„ãã¤ã‹ã®ç‰¹è¨±ã‚’ä¿æœ‰ã—ã¦ã„ã¾ã™ã€‚ã„ãšã‚Œã‚‚LFN機能ã®å®Ÿè£…ã«é–¢ã™ã‚‹ã‚‚ã®ã§ã€ãã®åˆ©ç”¨ã«å¯¾ã—ã¦$0.25/unitã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ–™ã‚’è¦æ±‚ã—ã¦ã„ã¾ã™ã€‚ã“ã®ãŸã‚ã€å•†ç”¨è£½å“ã§LFN機能を利用ã™ã‚‹ã¨ãã¯ã€æœ€çµ‚仕å‘地ã«ã‚ˆã£ã¦ã¯ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ãŒå¿…è¦ã«ãªã‚Šã¾ã™ã€‚最近ã®FAT32ドライãƒã®å¤šãã¯LFN機能をå«ã‚“ã§ã„ã‚‹ãŸã‚ã€ãれらã®ä½¿ç”¨ã«å½“ãŸã£ã¦ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ãŒå¿…è¦ã«ãªã‚Šã¾ã™ãŒã€FatFsã§ã¯LFN機能を構æˆã‚ªãƒ—ションã§ä»»æ„ã«ON/OFFã§ãã‚‹ãŸã‚ã€ç„¡åŠ¹ã«ã—ã¦ãƒ©ã‚¤ã‚»ãƒ³ã‚¹å•é¡Œã‚’回é¿ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚

          -
          -

          日本語ファイルåã®å¤§æ–‡å­—変æ›

          -

          CP932(Shift_JIS)ã§ã‹ã¤éžLFN構æˆã®ã¨ãã¯ã€æ‹¡å¼µæ–‡å­—ã®å°æ–‡å­—(2ãƒã‚¤ãƒˆè‹±å­—・キリル文字・ギリシャ文字)ã«å¯¾ã—ã¦å¤§æ–‡å­—変æ›ã‚’è¡Œã‚ãšã€å°æ–‡å­—ã®ã¾ã¾SFNエントリã«è¨˜éŒ²ãƒ»æ¤œç´¢ã•ã‚Œã¾ã™(日本語MSDOS仕様)。ã“ã®ãŸã‚ã€éžLFN構æˆã§å…¨è§’å°æ–‡å­—ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã™ã‚‹ã¨ã€NTç³»Windowsã§ãã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ã‘ãªããªã‚Šã¾ã™ã€‚LFN構æˆã§ã¯å¤§æ–‡å­—変æ›ã‚’è¡Œã„ã¾ã™(NTç³»Windows仕様)。

          -
          - -
          +

          Unicode入出力ã¸ã®å¯¾å¿œ

          -

          FatFs API上ã«ãŠã‘るファイルåç­‰ã®æ–‡å­—列データã®å…¥å‡ºåŠ›ã¯ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã¯ANSI/OEMコードã§è¡Œã‚ã‚Œã¾ã™ãŒã€ã“れをUnicode(UTF-16)ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã“ã¨ã‚‚ã§ãã¾ã™(_LFN_UNICODEオプションã§è¨­å®š)。ã¤ã¾ã‚Šã€ã“ã‚Œã¯FatFsãŒLFN機能ã«å®Œå…¨å¯¾å¿œã—ã¦ã„ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚Unicodeã®ãƒ•ã‚¡ã‚¤ãƒ«åã«é–¢ã™ã‚‹è©³ç´°ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«åã‚’å‚ç…§ã—ã¦ãã ã•ã„。

          +

          FatFs API上ã«ãŠã‘るファイルåç­‰ã®æ–‡å­—列データã®å…¥å‡ºåŠ›ã¯ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã¯ANSI/OEMコードã§è¡Œã‚ã‚Œã¾ã™ãŒã€ã“れをUnicode(UTF-16)ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã“ã¨ã‚‚ã§ãã¾ã™(_LFN_UNICODEオプションã§è¨­å®š)。ã¤ã¾ã‚Šã€ã“ã‚Œã¯FatFsãŒLFN機能ã«å®Œå…¨å¯¾å¿œã—ã¦ã„ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚Unicodeã®ãƒ•ã‚¡ã‚¤ãƒ«åã«é–¢ã™ã‚‹è©³ç´°ã¯ã€ãƒ‘スåã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚’å‚ç…§ã—ã¦ãã ã•ã„。

          -
          +

          リエントランシー

          -

          互ã„ã«ç•°ãªã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ ã«å¯¾ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«æ“作ã¯ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆã§ã€å¸¸ã«åŒæ™‚平行ã«å‹•ä½œã§ãã¾ã™ã€‚åŒã˜ãƒœãƒªãƒ¥ãƒ¼ãƒ ã«å¯¾ã—ã¦ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã¯ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆã§ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€_FS_REENTRANTオプションã§ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆ(スレッド セーフ)ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã™ã€‚ã“ã®å ´åˆã€OSä¾å­˜ã®åŒæœŸã‚ªãƒ–ジェクトæ“作関数ff_cre_syncobj(), ff_del_syncobj(), ff_req_grant(), ff_rel_grant()ã‚‚ã¾ãŸãƒ—ロジェクトã«è¿½åŠ ã•ã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。サンプル コードã¨è§£èª¬ã¯option/syncobj.cã«ã‚ã‚Šã¾ã™ã€‚

          -

          ã“ã®å ´åˆã€ã‚るタスクãŒãƒœãƒªãƒ¥ãƒ¼ãƒ ã‚’使用中ã«ä»–ã®ã‚¿ã‚¹ã‚¯ã‹ã‚‰ãã®ãƒœãƒªãƒ¥ãƒ¼ãƒ ã«å¯¾ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹ã¨ã€ãã®ã‚¢ã‚¯ã‚»ã‚¹ã¯å…ˆã®ã‚¿ã‚¹ã‚¯ãŒãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ã‚’抜ã‘ã‚‹ã¾ã§ãƒ–ロックã•ã‚Œã¾ã™ã€‚ã‚‚ã—ã€å¾…ã¡æ™‚é–“ãŒ_TIMEOUTã§æŒ‡å®šã•ã‚ŒãŸæœŸé–“を越ã™ã¨ã€ãã®é–¢æ•°ã¯FR_TIMEOUTã§ã‚¢ãƒœãƒ¼ãƒˆã—ã¾ã™ã€‚ã„ãã¤ã‹ã®RTOSã§ã¯ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆæ©Ÿèƒ½ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œãªã„ã‹ã‚‚知れã¾ã›ã‚“。

          -

          ã²ã¨ã¤ã®ä¾‹å¤–ãŒf_mount(), f_mkfs(), f_fdisk()ã«ã‚ã‚Šã¾ã™ã€‚ã“れらã®é–¢æ•°ã¯åŒã˜ãƒœãƒªãƒ¥ãƒ¼ãƒ (ã¾ãŸã¯é–¢é€£ã™ã‚‹ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–)ã«å¯¾ã—ã¦ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆã§ã¯ã‚ã‚Šã¾ã›ã‚“。ã“れらã®é–¢æ•°ã‚’使用ã™ã‚‹ã¨ãã¯ã€ã‚¢ãƒ—リケーション レベルã§æŽ’他制御ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。

          -

          注: ã“ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã¯FatFsモジュールãれ自体ã®ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ã‚·ãƒ¼ã«ã¤ã„ã¦èª¬æ˜Žã—ã¦ã„ã¾ã™ã€‚ãã®ä¸‹ä½ã®ãƒ‡ã‚£ã‚¹ã‚¯I/Oモジュールã®ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ã‚·ãƒ¼ã«é–¢ã—ã¦ã¯ä½•ã®å‰æã‚‚ã‚ã‚Šã¾ã›ã‚“。

          +

          互ã„ã«ç•°ãªã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ ã«å¯¾ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«æ“作ã¯æ§‹æˆã«ã‹ã‹ã‚らãšãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆã§ã€å¸¸ã«åŒæ™‚平行ã«å‹•ä½œã§ãã¾ã™ã€‚

          +

          åŒã˜ãƒœãƒªãƒ¥ãƒ¼ãƒ ã«å¯¾ã—ã¦ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã¯ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆã§ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€_FS_REENTRANTオプションã§ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆ(スレッド セーフ)ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã™ã€‚ã“ã®å ´åˆã€OSä¾å­˜ã®åŒæœŸã‚ªãƒ–ジェクトæ“作関数ff_cre_syncobj, ff_del_syncobj, ff_req_grant, ff_rel_grant関数もã¾ãŸãƒ—ロジェクトã«è¿½åŠ ã•ã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。サンプル コードã¨è§£èª¬ã¯option/syncobj.cã«ã‚ã‚Šã¾ã™ã€‚

          +

          ã“ã®å ´åˆã€ã‚るタスクãŒãƒœãƒªãƒ¥ãƒ¼ãƒ ã‚’使用中ã«ä»–ã®ã‚¿ã‚¹ã‚¯ã‹ã‚‰ãã®ãƒœãƒªãƒ¥ãƒ¼ãƒ ã«å¯¾ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹ã¨ã€ãã®ã‚¢ã‚¯ã‚»ã‚¹ã¯å…ˆã®ã‚¿ã‚¹ã‚¯ãŒãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ã‚’抜ã‘ã‚‹ã¾ã§ã‚µã‚¹ãƒšãƒ³ãƒ‰ã•ã‚Œã¾ã™ã€‚å¾…ã¡æ™‚é–“ãŒ_TIMEOUTã§æŒ‡å®šã•ã‚ŒãŸæœŸé–“を越ãˆãŸå ´åˆã€ãã®é–¢æ•°ã¯FR_TIMEOUTã§ã‚¢ãƒœãƒ¼ãƒˆã—ã¾ã™ã€‚ã„ãã¤ã‹ã®RTOSã§ã¯ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆæ©Ÿèƒ½ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œãªã„ã‹ã‚‚知れã¾ã›ã‚“。

          +

          ã²ã¨ã¤ã®ä¾‹å¤–ãŒf_mount, f_mkfs, f_fdisk関数ã«ã‚ã‚Šã¾ã™ã€‚ã“れらã®ãƒœãƒªãƒ¥ãƒ¼ãƒ åˆ¶å¾¡é–¢æ•°ã¯åŒã˜ãƒœãƒªãƒ¥ãƒ¼ãƒ (ã¾ãŸã¯é–¢é€£ã™ã‚‹ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–)ã«å¯¾ã—ã¦ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆã§ã¯ã‚ã‚Šã¾ã›ã‚“。ã“れらã®é–¢æ•°ã‚’使用ã™ã‚‹ã¨ãã¯ã€ã‚¢ãƒ—リケーション レベルã§æŽ’他制御ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。

          +

          注: ã“ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã¯FatFsモジュールãれ自体ã®ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ã‚·ãƒ¼ã«ã¤ã„ã¦èª¬æ˜Žã—ã¦ã„ã¾ã™ã€‚_FS_REENTRANTã¯ã€å„ファイル システム オブジェクトã®æŽ’他制御を行ã†ã®ã¿ã§ã€ä¸‹ä½ã®ãƒ‡ã‚£ã‚¹ã‚¯é–¢æ•°ã¸ã®å†å…¥ã‚’防止ã™ã‚‹ã‚‚ã®ã§ã¯ã‚ã‚Šã¾ã›ã‚“。ãŸã¨ãˆã°ã€ã‚·ãƒ³ã‚°ãƒ« ボリューム構æˆã§ã¯disk_status関数ã®ã¿å†å…¥ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã€ãƒžãƒ«ãƒ ボリューム構æˆã§ã¯ã©ã®ãƒ‡ã‚£ã‚¹ã‚¯é–¢æ•°ã‚‚å†å…¥ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ã‚ˆã†ã«ã€è¤‡æ•°ã®ã‚¿ã‚¹ã‚¯ã‹ã‚‰åŒæ™‚ã«FatFs APIを使ã†æ¡ä»¶ã§ã¯ã€ãƒ‡ã‚£ã‚¹ã‚¯I/Oモジュールã¯ã‚¹ãƒ¬ãƒƒãƒ‰ セーフã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

          -
          +

          多é‡ãƒ•ã‚¡ã‚¤ãƒ« アクセス

          FatFsモジュールã§ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã¯å¤šé‡ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡æ©Ÿèƒ½ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。ファイルã«å¯¾ã™ã‚‹å¤šé‡ã‚¢ã‚¯ã‚»ã‚¹ã¯ã€ãã®ã‚¢ã‚¯ã‚»ã‚¹ モードã«ã‚ˆã£ã¦åˆ¶é™ã•ã‚Œã¾ã™ã€‚一ã¤ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã™ã‚‹å¤šé‡ã‚ªãƒ¼ãƒ—ンã¯ã€ãれらãŒå…¨ã¦ãƒªãƒ¼ãƒ‰ モードã®ã¨ãã«é™ã£ã¦è¨±å¯ã•ã‚Œã¾ã™ã€‚書ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã‚’å«ã‚€å¤šé‡ã‚ªãƒ¼ãƒ—ンã€ã¾ãŸé–‹ã‹ã‚Œã¦ã„るファイルã«å¯¾ã™ã‚‹ãƒªãƒãƒ¼ãƒ ã‚„削除を行ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“。ã•ã‚‚ãªã„ã¨ã€ãã®ãƒœãƒªãƒ¥ãƒ¼ãƒ ã®FAT構造ãŒç ´å£Šã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚

          -

          _FS_LOCKã«1以上ã®å€¤(値ã¯åŒæ™‚ã«ç®¡ç†ã§ãるファイル数)をセットã™ã‚‹ã“ã¨ã§å¤šé‡ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡æ©Ÿèƒ½ãŒæœ‰åŠ¹ã«ãªã‚Šã€ãƒ•ã‚¡ã‚¤ãƒ«å˜ä½ã®ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ã‚’自動ã§è¡Œã†ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã“ã®å ´åˆã€ä¸Šè¨˜ã®ãƒ«ãƒ¼ãƒ«ã‚’ç ´ã£ãŸã‚ªãƒ¼ãƒ—ン・リãƒãƒ¼ãƒ ãƒ»å‰Šé™¤ã‚’試ã¿ã‚‹ã¨ã€ãã®é–¢æ•°ã¯FR_LOCKEDã§å¤±æ•—ã—ã¾ã™ã€‚ã¾ãŸã€_FS_LOCKを越ãˆã‚‹æ•°ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚„サブ ディレクトリをåŒæ™‚ã«ã‚ªãƒ¼ãƒ—ンã—よã†ã¨ã™ã‚‹ã¨ã€FR_TOO_MANY_OPEN_FILESã§å¤±æ•—ã—ã¾ã™ã€‚

          +

          _FS_LOCKã«1以上ã®å€¤(値ã¯åŒæ™‚ã«ç®¡ç†ã§ãるファイル数)をセットã™ã‚‹ã“ã¨ã§å¤šé‡ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡æ©Ÿèƒ½ãŒæœ‰åŠ¹ã«ãªã‚Šã€ãƒ•ã‚¡ã‚¤ãƒ«å˜ä½ã®ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ã‚’自動ã§è¡Œã†ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã“ã®å ´åˆã€ä¸Šè¨˜ã®ãƒ«ãƒ¼ãƒ«ã‚’ç ´ã£ãŸã‚ªãƒ¼ãƒ—ン・リãƒãƒ¼ãƒ ãƒ»å‰Šé™¤ã‚’試ã¿ã‚‹ã¨ã€ãã®é–¢æ•°ã¯FR_LOCKEDã§å¤±æ•—ã—ã¾ã™ã€‚ã¾ãŸã€_FS_LOCKを越ãˆã‚‹æ•°ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚„サブ ディレクトリをåŒæ™‚ã«ã‚ªãƒ¼ãƒ—ンã—よã†ã¨ã™ã‚‹ã¨ã€FR_TOO_MANY_OPEN_FILESã§å¤±æ•—ã—ã¾ã™ã€‚

          -
          +

          効率的ãªãƒ•ã‚¡ã‚¤ãƒ« アクセス

          -

          å°è¦æ¨¡ãªçµ„込システムã§ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®èª­ã¿æ›¸ãã«ãŠã‘る効率ã®è‰¯ã„アクセスã®ãŸã‚ã€ã‚¢ãƒ—リケーション プログラマã¯FatFsモジュールã®ä¸­ã§ã©ã®ã‚ˆã†ãªå‡¦ç†ãŒè¡Œã‚ã‚Œã¦ã„ã‚‹ã‹è€ƒæ…®ã™ã¹ãã§ã™ã€‚ストレージ上ã®ãƒ‡ãƒ¼ã‚¿ã¯f_read()ã«ã‚ˆã‚Šæ¬¡ã®ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã§è»¢é€ã•ã‚Œã¾ã™ã€‚

          +

          å°è¦æ¨¡ãªçµ„込システムã§ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®èª­ã¿æ›¸ãã«ãŠã‘る効率ã®è‰¯ã„アクセスã®ãŸã‚ã€ã‚¢ãƒ—リケーション プログラマã¯FatFsモジュールã®ä¸­ã§ã©ã®ã‚ˆã†ãªå‡¦ç†ãŒè¡Œã‚ã‚Œã¦ã„ã‚‹ã‹è€ƒæ…®ã™ã¹ãã§ã™ã€‚ストレージ上ã®ãƒ‡ãƒ¼ã‚¿ã¯f_read関数ã«ã‚ˆã‚Šæ¬¡ã®ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã§è»¢é€ã•ã‚Œã¾ã™ã€‚

          図1. セクタ ミスアラインド リード (ショート)
          fig.1

          @@ -203,12 +187,12 @@ _FS_LOCK 0 (Disable file lock control)

          図3. セクタ アラインド リード
          fig.3

          -

          ファイルI/Oãƒãƒƒãƒ•ã‚¡ã¯ã‚»ã‚¯ã‚¿ã®ä¸€éƒ¨ã®ãƒ‡ãƒ¼ã‚¿ã‚’読ã¿æ›¸ãã™ã‚‹ãŸã‚ã®ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ã‚’æ„味ã—ã¾ã™ã€‚セクタ ãƒãƒƒãƒ•ã‚¡ã¯ã€ãã‚Œãžã‚Œã®ãƒ•ã‚¡ã‚¤ãƒ« オブジェクト内ã®ãƒ—ライベート セクタ ãƒãƒƒãƒ•ã‚¡ã¾ãŸã¯ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクト内ã®å…±æœ‰ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ã®ã©ã¡ã‚‰ã‹ã§ã™ã€‚ãƒãƒƒãƒ•ã‚¡æ§‹æˆã‚ªãƒ—ションã®_FS_TINYã¯ã€ãƒ‡ãƒ¼ã‚¿è»¢é€ã«ã©ã¡ã‚‰ã‚’使ã†ã‹ã‚’決定ã—ã¾ã™ã€‚タイニー ãƒãƒƒãƒ•ã‚¡(1)ãŒé¸æŠžã•ã‚Œã‚‹ã¨ãƒ‡ãƒ¼ã‚¿ メモリã®æ¶ˆè²»ã¯ãã‚Œãžã‚Œã®ãƒ•ã‚¡ã‚¤ãƒ« オブジェクトã§_MAX_SSãƒã‚¤ãƒˆæ¸›å°‘ã•ã‚Œã¾ã™ã€‚ã“ã®å ´åˆã€FatFsモジュールã¯ãƒ•ã‚¡ã‚¤ãƒ« データã®è»¢é€ã¨FAT/ディレクトリ アクセスã«ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクト内ã®ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ã ã‘を使用ã—ã¾ã™ã€‚タイニー ãƒãƒƒãƒ•ã‚¡ã®æ¬ ç‚¹ã¯ã€ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•ã‚ŒãŸFATデータãŒãƒ•ã‚¡ã‚¤ãƒ« データã®è»¢é€ã«ã‚ˆã‚Šå¤±ã‚ã‚Œã€ã‚¯ãƒ©ã‚¹ã‚¿å¢ƒç•Œã®æ¯Žã«ãƒªãƒ­ãƒ¼ãƒ‰ã•ã‚Œãªã‘ã‚Œã°ãªã‚‰ãªã„ã“ã¨ã§ã™ã€‚ã§ã‚‚ã€æ‚ªããªã„性能ã¨å°‘ãªã„メモリ消費ã®è¦–点ã‹ã‚‰å¤šãã®ã‚¢ãƒ—リケーションã«é©ã™ã‚‹ã§ã—ょã†ã€‚

          -

          図1ã¯ã‚»ã‚¯ã‚¿ã®ä¸€éƒ¨ã®ãƒ‡ãƒ¼ã‚¿ãŒãƒ•ã‚¡ã‚¤ãƒ«I/Oãƒãƒƒãƒ•ã‚¡ã‚’経由ã§è»¢é€ã•ã‚Œã‚‹ã“ã¨ã‚’示ã—ã¾ã™ã€‚図2ã«ç¤ºã•ã‚Œã‚‹é•·ã„データã®è»¢é€ã§ã¯ã€è»¢é€ãƒ‡ãƒ¼ã‚¿ã®ä¸­é–“ã®1セクタã¾ãŸã¯ãれ以上ã®ã‚»ã‚¯ã‚¿ã«ã¾ãŸãŒã‚‹è»¢é€ãƒ‡ãƒ¼ã‚¿ãŒã‚¢ãƒ—リケーション ãƒãƒƒãƒ•ã‚¡ã«ç›´æŽ¥è»¢é€ã•ã‚Œã¦ã„ã¾ã™ã€‚図3ã¯è»¢é€ãƒ‡ãƒ¼ã‚¿å…¨ä½“ãŒã‚»ã‚¯ã‚¿å¢ƒç•Œã«ã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆã•ã‚Œã¦ã„ã‚‹å ´åˆã‚’示ã—ã¦ã„ã¾ã™ã€‚ã“ã®å ´åˆã€ãƒ•ã‚¡ã‚¤ãƒ«I/Oãƒãƒƒãƒ•ã‚¡ã¯ä½¿ç”¨ã•ã‚Œã¾ã›ã‚“。直接転é€ã«ãŠã„ã¦ã¯æœ€å¤§ã®ç¯„囲ã®ã‚»ã‚¯ã‚¿ãŒdisk_read()ã§ä¸€åº¦ã«èª­ã¿è¾¼ã¾ã‚Œã¾ã™ãŒã€ã‚¯ãƒ©ã‚¹ã‚¿å¢ƒç•Œã‚’越ãˆã‚‹ãƒžãƒ«ãƒ セクタ転é€ã¯ãã‚ŒãŒéš£æŽ¥ã§ã‚ã£ã¦ã‚‚è¡Œã‚ã‚Œã¾ã›ã‚“。

          +

          ファイルI/Oãƒãƒƒãƒ•ã‚¡ã¯ã‚»ã‚¯ã‚¿ã®ä¸€éƒ¨ã®ãƒ‡ãƒ¼ã‚¿ã‚’読ã¿æ›¸ãã™ã‚‹ãŸã‚ã®ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ã‚’æ„味ã—ã¾ã™ã€‚セクタ ãƒãƒƒãƒ•ã‚¡ã¯ã€ãã‚Œãžã‚Œã®ãƒ•ã‚¡ã‚¤ãƒ« オブジェクト内ã®ãƒ—ライベート セクタ ãƒãƒƒãƒ•ã‚¡ã¾ãŸã¯ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクト内ã®å…±æœ‰ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ã®ã©ã¡ã‚‰ã‹ã§ã™ã€‚ãƒãƒƒãƒ•ã‚¡æ§‹æˆã‚ªãƒ—ションã®_FS_TINYã¯ã€ãƒ‡ãƒ¼ã‚¿è»¢é€ã«ã©ã¡ã‚‰ã‚’使ã†ã‹ã‚’決定ã—ã¾ã™ã€‚タイニー ãƒãƒƒãƒ•ã‚¡(1)ãŒé¸æŠžã•ã‚Œã‚‹ã¨ãƒ‡ãƒ¼ã‚¿ メモリã®æ¶ˆè²»ã¯ãã‚Œãžã‚Œã®ãƒ•ã‚¡ã‚¤ãƒ« オブジェクトã§_MAX_SSãƒã‚¤ãƒˆæ¸›å°‘ã•ã‚Œã¾ã™ã€‚ã“ã®å ´åˆã€FatFsモジュールã¯ãƒ•ã‚¡ã‚¤ãƒ« データã®è»¢é€ã¨FAT/ディレクトリ アクセスã«ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクト内ã®ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ã ã‘を使用ã—ã¾ã™ã€‚タイニー ãƒãƒƒãƒ•ã‚¡ã®æ¬ ç‚¹ã¯ã€ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•ã‚ŒãŸFATデータãŒãƒ•ã‚¡ã‚¤ãƒ« データã®è»¢é€ã«ã‚ˆã‚Šå¤±ã‚ã‚Œã€ã‚¯ãƒ©ã‚¹ã‚¿å¢ƒç•Œã®æ¯Žã«ãƒªãƒ­ãƒ¼ãƒ‰ã•ã‚Œãªã‘ã‚Œã°ãªã‚‰ãªã„ã“ã¨ã§ã™ã€‚ã§ã‚‚ã€æ‚ªããªã„性能ã¨å°‘ãªã„メモリ消費ã®è¦–点ã‹ã‚‰å¤šãã®ã‚¢ãƒ—リケーションã«é©ã™ã‚‹ã§ã—ょã†ã€‚

          +

          図1ã¯ã‚»ã‚¯ã‚¿ã®ä¸€éƒ¨ã®ãƒ‡ãƒ¼ã‚¿ãŒãƒ•ã‚¡ã‚¤ãƒ«I/Oãƒãƒƒãƒ•ã‚¡ã‚’経由ã§è»¢é€ã•ã‚Œã‚‹ã“ã¨ã‚’示ã—ã¾ã™ã€‚図2ã«ç¤ºã•ã‚Œã‚‹é•·ã„データã®è»¢é€ã§ã¯ã€è»¢é€ãƒ‡ãƒ¼ã‚¿ã®ä¸­é–“ã®1セクタã¾ãŸã¯ãれ以上ã®ã‚»ã‚¯ã‚¿ã«ã¾ãŸãŒã‚‹è»¢é€ãƒ‡ãƒ¼ã‚¿ãŒã‚¢ãƒ—リケーション ãƒãƒƒãƒ•ã‚¡ã«ç›´æŽ¥è»¢é€ã•ã‚Œã¦ã„ã¾ã™ã€‚図3ã¯è»¢é€ãƒ‡ãƒ¼ã‚¿å…¨ä½“ãŒã‚»ã‚¯ã‚¿å¢ƒç•Œã«ã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆã•ã‚Œã¦ã„ã‚‹å ´åˆã‚’示ã—ã¦ã„ã¾ã™ã€‚ã“ã®å ´åˆã€ãƒ•ã‚¡ã‚¤ãƒ«I/Oãƒãƒƒãƒ•ã‚¡ã¯ä½¿ç”¨ã•ã‚Œã¾ã›ã‚“。直接転é€ã«ãŠã„ã¦ã¯æœ€å¤§ã®ç¯„囲ã®ã‚»ã‚¯ã‚¿ãŒdisk_read関数ã§ä¸€åº¦ã«èª­ã¿è¾¼ã¾ã‚Œã¾ã™ãŒã€ã‚¯ãƒ©ã‚¹ã‚¿å¢ƒç•Œã‚’越ãˆã‚‹ãƒžãƒ«ãƒ セクタ転é€ã¯ãã‚ŒãŒéš£æŽ¥ã§ã‚ã£ã¦ã‚‚è¡Œã‚ã‚Œã¾ã›ã‚“。

          ã“ã®ã‚ˆã†ã«ã€ã‚»ã‚¯ã‚¿ã«ã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã®èª­ã¿æ›¸ãã¸ã®é…æ…®ã¯ãƒãƒƒãƒ•ã‚¡çµŒç”±ã®ãƒ‡ãƒ¼ã‚¿è»¢é€ã‚’é¿ã‘ã€èª­ã¿æ›¸ã性能ã¯æ”¹å–„ã•ã‚Œã‚‹ã§ã—ょã†ã€‚ãã®åŠ¹æžœã«åŠ ãˆã€ã‚¿ã‚¤ãƒ‹ãƒ¼æ§‹æˆã§ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•ã‚ŒãŸFATデータãŒãƒ•ã‚¡ã‚¤ãƒ« データã®è»¢é€ã«ã‚ˆã‚Šãƒ•ãƒ©ãƒƒã‚·ãƒ¥ã•ã‚Œãšã€éžã‚¿ã‚¤ãƒ‹ãƒ¼æ§‹æˆã¨åŒã˜æ€§èƒ½ã‚’å°ã•ãªãƒ¡ãƒ¢ãƒª フットプリントã§é”æˆã§ãã¾ã™ã€‚

          -
          +

          フラッシュ メモリã®ç‰¹æ€§ã¸ã®é…æ…®

          HDDãªã©ã®ãƒ‡ã‚£ã‚¹ã‚¯ メディアã¨ã¯ç•°ãªã‚Šã€SDCã‚„CFCãªã©ã®ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ メモリ メディアã®æ€§èƒ½ã‚’引ã出ã™ã«ã¯ã€ãã®ç‰¹æ€§ã‚’æ„è­˜ã—ãŸåˆ¶å¾¡ãŒå¿…è¦ã«ãªã‚Šã¾ã™ã€‚

          マルムセクタ書ãè¾¼ã¿

          @@ -216,12 +200,13 @@ _FS_LOCK 0 (Disable file lock control) 図6. マルãƒ/シングル セクタ ライトã®æ¯”較
          fig.6
          -

          フラッシュ メモリ メディアã®æ›¸ãè¾¼ã¿é€Ÿåº¦ã¯ã‚·ãƒ³ã‚°ãƒ« セクタ書ãè¾¼ã¿ã®æ™‚ã«æœ€ã‚‚低ã„ã‚‚ã®ã«ãªã‚Šã€ä¸€å›žã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã§è»¢é€ã•ã‚Œã‚‹ã‚»ã‚¯ã‚¿æ•°ãŒå¤§ãããªã‚‹ã»ã©æ›¸ãè¾¼ã¿é€Ÿåº¦ã¯å‘上ã—ã¾ã™ã€‚ã“ã®åŠ¹æžœã¯ãƒã‚¹é€Ÿåº¦ãŒé«˜é€Ÿã«ãªã‚‹ã»ã©é¡•è‘—ã§ã€10å€ä»¥ä¸Šã®å·®ãŒç¾ã‚Œã‚‹ã“ã¨ã‚‚çã—ãã‚ã‚Šã¾ã›ã‚“。テストçµæžœã¯ã€ãƒžãƒ«ãƒ セクタ書ãè¾¼ã¿(W:16K, 32 sectors)ãŒã‚·ãƒ³ã‚°ãƒ« セクタ書ãè¾¼ã¿(W:100, 1 sector)よりã©ã®ç¨‹åº¦é€Ÿã„ã‹ã‚’明確ã«ç¤ºã—ã¦ã„ã¾ã™ã€‚大容é‡ãƒ¡ãƒ‡ã‚£ã‚¢ã»ã©ã‚·ãƒ³ã‚°ãƒ« セクタ書ãè¾¼ã¿ãŒé…ããªã‚‹ç‚¹ã‚‚ã¾ãŸé‡è¦ã§ã™ã€‚書ãè¾¼ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®å›žæ•°ã¯ã¾ãŸã€ãƒ¡ãƒ‡ã‚£ã‚¢ã®å¯¿å‘½ã«ã‚‚影響ã—ã¦ãã¾ã™ã€‚ã“ã®ãŸã‚ã€ã‚¢ãƒ—リケーションã¯ãªã‚‹ã¹ã大ããªãƒ–ロック(クラスタ サイズã¾ãŸã¯2ã®ç´¯ä¹—セクタ境界ã«ã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆã—ãŸ)ã§èª­ã¿æ›¸ãã‚’è¡Œã†å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã‚‚ã¡ã‚ã‚“ã€ã‚¢ãƒ—リケーションã‹ã‚‰ãƒ¡ãƒ‡ã‚£ã‚¢ã«è‡³ã‚‹å…¨ã¦ã®ãƒ¬ã‚¤ãƒ¤ãŒãƒžãƒ«ãƒ セクタ転é€ã«å¯¾å¿œã—ã¦ã„ãªã„ã¨æ„味ãŒã‚ã‚Šã¾ã›ã‚“。残念ãªãŒã‚‰ã€æ—¢å­˜ã®ã‚ªãƒ¼ãƒ—ン ソースã®ãƒ‰ãƒ©ã‚¤ãƒã®å¤šãã¯ãƒžãƒ«ãƒ セクタ転é€ã«æœªå¯¾å¿œã§ã™ã€‚ãªãŠã€FatFsモジュールãŠã‚ˆã³ã‚µãƒ³ãƒ—ル ドライãƒã¯ãƒžãƒ«ãƒ セクタ転é€ã«å¯¾å¿œã—ã¦ã„ã¾ã™ã€‚

          +

          フラッシュ メモリ メディアã®æ›¸ãè¾¼ã¿é€Ÿåº¦ã¯ã‚·ãƒ³ã‚°ãƒ« セクタ書ãè¾¼ã¿ã®æ™‚ã«æœ€ã‚‚低ã„ã‚‚ã®ã«ãªã‚Šã€ä¸€å›žã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã§è»¢é€ã•ã‚Œã‚‹ã‚»ã‚¯ã‚¿æ•°ãŒå¤§ãããªã‚‹ã»ã©æ›¸ãè¾¼ã¿é€Ÿåº¦ã¯å‘上ã—ã¾ã™(図6)。ã“ã®åŠ¹æžœã¯ãƒã‚¹é€Ÿåº¦ãŒé«˜é€Ÿã«ãªã‚‹ã»ã©å¤§ããã€10å€ä»¥ä¸Šã®å·®ãŒç¾ã‚Œã‚‹ã“ã¨ã‚‚çã—ãã‚ã‚Šã¾ã›ã‚“。テストçµæžœã¯ã€ãƒžãƒ«ãƒ セクタ書ãè¾¼ã¿(W:16K, 32 sectors)ãŒã‚·ãƒ³ã‚°ãƒ« セクタ書ãè¾¼ã¿(W:100, 1 sector)よりã©ã®ç¨‹åº¦é€Ÿã„ã‹ã‚’明確ã«ç¤ºã—ã¦ã„ã¾ã™ã€‚大容é‡ãƒ¡ãƒ‡ã‚£ã‚¢ã»ã©ã‚·ãƒ³ã‚°ãƒ« セクタ書ãè¾¼ã¿ãŒé…ããªã‚‹ç‚¹ã‚‚ã¾ãŸé‡è¦ã§ã™ã€‚書ãè¾¼ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®å›žæ•°ã¯ã¾ãŸã€ãƒ¡ãƒ‡ã‚£ã‚¢ã®å¯¿å‘½ã«ã‚‚影響ã—ã¦ãã¾ã™ã€‚ã¤ã¾ã‚Šã€åŒã˜é‡ã®ãƒ‡ãƒ¼ã‚¿ã‚’書ã込む場åˆã€å›³6上ã®ã‚·ãƒ³ã‚°ãƒ« セクタ書ãè¾¼ã¿ã¯ã€å›³6下ã®ãƒžãƒ«ãƒ セクタ書ãè¾¼ã¿ã«æ¯”ã¹ã¦16å€æ—©ãフラッシュ メモリ メディアを消耗ã•ã›ã¦ã—ã¾ã†ã¨ã„ã†ã“ã¨ã§ã™ã€‚

          +

          ã“ã®ã‚ˆã†ã«ã€ã‚¢ãƒ—リケーションã¯ãªã‚‹ã¹ã大ããªãƒ–ロック(クラスタ サイズã¾ãŸã¯2ã®ç´¯ä¹—セクタ境界ã«ã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆã—ãŸ)ã§èª­ã¿æ›¸ãã‚’è¡Œã†å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã‚‚ã¡ã‚ã‚“ã€ã‚¢ãƒ—リケーションã‹ã‚‰ãƒ¡ãƒ‡ã‚£ã‚¢ã«è‡³ã‚‹å…¨ã¦ã®ãƒ¬ã‚¤ãƒ¤ãŒãƒžãƒ«ãƒ セクタ転é€ã«å¯¾å¿œã—ã¦ã„ãªã„ã¨æ„味ãŒã‚ã‚Šã¾ã›ã‚“。残念ãªãŒã‚‰ã€æ—¢å­˜ã®ã‚ªãƒ¼ãƒ—ン ソースã®ãƒ‰ãƒ©ã‚¤ãƒã®å¤šãã¯ãƒžãƒ«ãƒ セクタ転é€ã«æœªå¯¾å¿œã§ã™ã€‚ãªãŠã€FatFsモジュールãŠã‚ˆã³ã‚µãƒ³ãƒ—ル ドライãƒã¯ãƒžãƒ«ãƒ セクタ転é€ã«å¯¾å¿œã—ã¦ã„ã¾ã™ã€‚

          明示的ãªãƒ¡ãƒ¢ãƒªæ¶ˆåŽ»

          -

          通常ã®ãƒ•ã‚¡ã‚¤ãƒ«æ¶ˆåŽ»ã§ã¯ã€è¨˜éŒ²ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã«å¯¾ã—ã¦ä½•ã‚‰ã‹ã®åˆ¶å¾¡ãŒè¡Œã‚れるã‚ã‘ã§ã¯ãªãã€å˜ã«FAT上ã«æœªä½¿ç”¨ã‚¯ãƒ©ã‚¹ã‚¿ã¨ã—ã¦è¨˜éŒ²ã•ã‚Œã¦ã„ã‚‹ã ã‘ã§ã™ã€‚ã“ã®ãŸã‚ã€ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ¶ˆåŽ»ã•ã‚ŒãŸã‚ã¨ã‚‚ãれらã¯æœ‰åŠ¹ãªãƒ¡ãƒ¢ãƒª ブロックã¨ã—ã¦ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ メモリ上ã«æ®‹ã‚Šã¾ã™ã€‚ãã“ã§ã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚’消去ã™ã‚‹ã¨ãã€å æœ‰ã—ã¦ã„ãŸãƒ‡ãƒ¼ã‚¿ セクタを明示的ã«æ¶ˆåŽ»(ã¤ã¾ã‚Šæœªä½¿ç”¨ãƒ–ロックã«ã™ã‚‹)ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ãƒ¡ãƒ‡ã‚£ã‚¢å†…ã®ç©ºãブロックを増やã™ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€æ¬¡ã«ãã®ãƒ–ロックã«æ›¸ã込むã¨ãã®æ¶ˆåŽ»å‹•ä½œãŒç„¡ããªã‚Šã€æ›¸ãè¾¼ã¿æ€§èƒ½ãŒå‘上ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã¾ãŸã€ã‚¦ã‚§ã‚¢ãƒ¬ãƒ™ãƒªãƒ³ã‚°ã«ä½¿ãˆã‚‹ãƒ–ロックãŒå¢—ãˆã€ãƒ¡ãƒ‡ã‚£ã‚¢ã®è€ä¹…性もå‘上ã™ã‚‹ã‹ã‚‚知れã¾ã›ã‚“。ã“ã®æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹ã«ã¯ã€æ§‹æˆã‚ªãƒ—ションã®_USE_TRIMã«1を設定ã—ã¾ã™ã€‚ã“ã‚Œã¯ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ メモリ メディアã®å†…部動作ã«æœŸå¾…ã—ãŸåˆ¶å¾¡ãªã®ã§ã€åŠ¹æžœãŒã‚ã‚‹ã¨ã¯é™ã‚Šã¾ã›ã‚“。ã¾ãŸã€ãƒ•ã‚¡ã‚¤ãƒ«æ¶ˆåŽ»ã®æ™‚é–“ãŒå»¶ã³ã‚‹ã“ã¨ã‚‚考慮ã«å…¥ã‚Œã‚‹ã¹ãã§ã™ã€‚

          +

          通常ã®ãƒ•ã‚¡ã‚¤ãƒ«æ¶ˆåŽ»ã§ã¯ã€è¨˜éŒ²ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã«å¯¾ã—ã¦ä½•ã‚‰ã‹ã®åˆ¶å¾¡ãŒè¡Œã‚れるã‚ã‘ã§ã¯ãªãã€å˜ã«FAT上ã«æœªä½¿ç”¨ã‚¯ãƒ©ã‚¹ã‚¿ã¨ã—ã¦è¨˜éŒ²ã•ã‚Œã¦ã„ã‚‹ã ã‘ã§ã™ã€‚ã“ã®ãŸã‚ã€ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ¶ˆåŽ»ã•ã‚ŒãŸã‚ã¨ã‚‚ãれらã¯æœ‰åŠ¹ãªãƒ¡ãƒ¢ãƒª ブロックã¨ã—ã¦ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ メモリ上ã«æ®‹ã‚Šã¾ã™ã€‚ãã“ã§ã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚’消去ã™ã‚‹ã¨ãã€å æœ‰ã—ã¦ã„ãŸãƒ‡ãƒ¼ã‚¿ セクタを明示的ã«æ¶ˆåŽ»(ã¤ã¾ã‚Šæœªä½¿ç”¨ãƒ–ロックã«ã™ã‚‹)ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ãƒ¡ãƒ‡ã‚£ã‚¢å†…ã®ç©ºãブロックを増やã™ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€æ¬¡ã«ãã®ãƒ–ロックã«æ›¸ã込むã¨ãã®æ¶ˆåŽ»å‹•ä½œãŒç„¡ããªã‚Šã€æ›¸ãè¾¼ã¿æ€§èƒ½ãŒå‘上ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã¾ãŸã€ã‚¦ã‚§ã‚¢ãƒ¬ãƒ™ãƒªãƒ³ã‚°ã«ä½¿ãˆã‚‹ãƒ–ロックãŒå¢—ãˆã€ãƒ¡ãƒ‡ã‚£ã‚¢ã®è€ä¹…性もå‘上ã™ã‚‹ã‹ã‚‚知れã¾ã›ã‚“。ã“ã®æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹ã«ã¯ã€æ§‹æˆã‚ªãƒ—ションã®_USE_TRIMã«1を設定ã—ã¾ã™ã€‚ã“ã‚Œã¯ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ メモリ メディアã®å†…部動作ã«æœŸå¾…ã—ãŸåˆ¶å¾¡ãªã®ã§ã€åŠ¹æžœãŒã‚ã‚‹ã¨ã¯é™ã‚Šã¾ã›ã‚“。ã¾ãŸã€ãƒ•ã‚¡ã‚¤ãƒ«æ¶ˆåŽ»ã®æ™‚é–“ãŒå»¶ã³ã‚‹ã“ã¨ã‚‚考慮ã«å…¥ã‚Œã‚‹ã¹ãã§ã™ã€‚

          -
          +

          クリãƒã‚«ãƒ« セクション

          ストレージ上ã®FAT構造をæ“作ã—ã¦ã„る途中ã§ã€åœé›»ã€ä¸æ­£ãªãƒ¡ãƒ‡ã‚£ã‚¢ã®å–り外ã—ã€å›žå¾©ä¸èƒ½ãªãƒ‡ãƒ¼ã‚¿ エラー等ã®éšœå®³ãŒç™ºç”Ÿã™ã‚‹ã¨ã€å‡¦ç†ãŒä¸­é€”åŠç«¯ãªçŠ¶æ…‹ã§ä¸­æ–­ã•ã‚Œã€ãã®çµæžœã¨ã—ã¦FATボリュームã®æ§‹é€ ãŒç ´å£Šã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚次ã«FatFsモジュールã«ãŠã‘るクリãƒã‚«ãƒ« セクションã¨ã€ãã®é–“ã®éšœå®³ã«ã‚ˆã‚Šèµ·ãã†ã‚‹ã‚¨ãƒ©ãƒ¼ã®çŠ¶æ…‹ã‚’示ã—ã¾ã™ã€‚

          @@ -233,18 +218,18 @@ _FS_LOCK 0 (Disable file lock control) fig.5

          -

          赤ã§ç¤ºã—ãŸã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行中ã«éšœå®³ãŒç™ºç”Ÿã—ãŸå ´åˆã€ã‚¯ãƒ­ã‚¹ リンクãŒç™ºç”Ÿã—ã¦æ“作対象ã®ãƒ•ã‚¡ã‚¤ãƒ« ディレクトリãŒå¤±ã‚れるå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚黄色ã§ç¤ºã—ãŸã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行中ã«éšœå®³ãŒç™ºç”Ÿã—ãŸå ´åˆã€ã¤ãŽã®ã†ã¡ã„ãšã‚Œã‹ã¾ãŸã¯è¤‡æ•°ã®çµæžœãŒç”Ÿã˜ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚

          +

          赤ã§ç¤ºã—ãŸã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行中ã«ä¸­æ–­ãŒç™ºç”Ÿã—ãŸå ´åˆã€ã‚¯ãƒ­ã‚¹ リンクãŒç™ºç”Ÿã—ã¦æ“作中ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚„ディレクトリãŒå¤±ã‚れるå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚黄色ã§ç¤ºã—ãŸã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行中ã«ä¸­æ–­ãŒç™ºç”Ÿã—ãŸå ´åˆã€æ¬¡ã®ã†ã¡ã„ãšã‚Œã‹ã¾ãŸã¯è¤‡æ•°ã®çµæžœãŒç”Ÿã˜ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚

            -
          • 書ãæ›ãˆä¸­ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‡ãƒ¼ã‚¿ãŒç ´å£Šã•ã‚Œã‚‹ã€‚
          • -
          • 追記中ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚ªãƒ¼ãƒ—ンå‰ã®çŠ¶æ…‹ã«æˆ»ã‚‹ã€‚
          • -
          • æ–°è¦ã«ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ãŒæ¶ˆãˆã‚‹ã€‚
          • -
          • æ–°è¦ã¾ãŸã¯ä¸Šæ›¸ãã§ä½œæˆã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã®é•·ã•ãŒã‚¼ãƒ­ã«ãªã£ã¦æ®‹ã‚‹ã€‚
          • -
          • ロストãƒã‚§ãƒ¼ãƒ³ã®ç™ºç”Ÿã«ã‚ˆã‚Šãƒœãƒªãƒ¥ãƒ¼ãƒ ã®åˆ©ç”¨åŠ¹çŽ‡ãŒæ‚ªåŒ–ã™ã‚‹ã€‚
          • +
          • ファイルã®ä¸€éƒ¨ã‚’書ãæ›ãˆä¸­: 書ãæ›ãˆãŒä¸­é€”åŠç«¯ãªçŠ¶æ…‹ã¨ãªã‚Šã€çµæžœãƒ‡ãƒ¼ã‚¿ãŒç ´å£Šã•ã‚Œã‚‹ã€‚
          • +
          • 追記モードã§ãƒ‡ãƒ¼ã‚¿è¨˜éŒ²ä¸­: ファイルãŒè¨˜éŒ²é–‹å§‹ã®å‰ã®çŠ¶æ…‹ã«æˆ»ã‚‹ã€‚
          • +
          • æ–°è¦ä½œæˆã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã«è¨˜éŒ²ä¸­: ãã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ¶ˆãˆã‚‹ã€‚
          • +
          • æ–°è¦ã¾ãŸã¯ä¸Šæ›¸ãã§ä½œæˆã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã«è¨˜éŒ²ä¸­: ファイルã®é•·ã•ãŒã‚¼ãƒ­ã«ãªã£ã¦æ®‹ã‚‹ã€‚
          • +
          • ã“れらã®éšœå®³ã®çµæžœã€ãƒ­ã‚¹ãƒˆ クラスタãŒç™ºç”Ÿã—ã¦ãƒœãƒªãƒ¥ãƒ¼ãƒ ã®åˆ©ç”¨åŠ¹çŽ‡ãŒæ‚ªåŒ–ã™ã‚‹ã€‚
          -

          ã„ãšã‚Œã‚‚書ãè¾¼ã¿ä¸­ã‚„æ“作ã®å¯¾è±¡ã§ãªã„ファイルã«ã¯å½±éŸ¿ã¯ã‚ã‚Šã¾ã›ã‚“。ã“れらã®ã‚¯ãƒªãƒã‚«ãƒ« セクションã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚’書ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã§é–‹ã„ã¦ã„る時間を最å°é™ã«ã™ã‚‹ã‹ã€f_sync()ã‚’é©å®œä½¿ç”¨ã™ã‚‹ã“ã¨ã§å›³5ã®ã‚ˆã†ã«ãƒªã‚¹ã‚¯ã‚’最å°åŒ–ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

          +

          ã„ãšã‚Œã®å ´åˆã‚‚æ“作ã®å¯¾è±¡ã§ãªã„ファイルã«ã¯å½±éŸ¿ã¯ã‚ã‚Šã¾ã›ã‚“。ã“れらã®ã‚¯ãƒªãƒã‚«ãƒ« セクションã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã‚’書ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã§é–‹ã„ã¦ã„る時間を最å°é™ã«ã™ã‚‹ã‹ã€f_sync関数をé©å®œä½¿ç”¨ã™ã‚‹ã“ã¨ã§å›³5ã®ã‚ˆã†ã«ãƒªã‚¹ã‚¯ã‚’最å°åŒ–ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

          -
          +

          APIã®æ‹¡å¼µçš„使用例

          FatFs APIã®æ‹¡å¼µçš„使用例ã§ã™ã€‚有用ãªã‚³ãƒ¼ãƒ‰ãŒã‚ã£ãŸå ´åˆã¯ã€éšæ™‚追加ã—ã¦ã„ãã¾ã™ã€‚。

            @@ -256,25 +241,27 @@ _FS_LOCK 0 (Disable file lock control)
          -
          +

          FatFsã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã«ã¤ã„ã¦

          -

          ソース ファイルã®ãƒ˜ãƒƒãƒ€ã«ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ¡ä»¶ãŒè¨˜è¿°ã•ã‚Œã¦ã„ã‚‹ã®ã§ã€åˆ©ç”¨ã®éš›ã¯ãã‚Œã«å¾“ã†ã“ã¨ã€‚英語を読ã‚ãªã„æ–¹ã®ãŸã‚ã«ä»¥ä¸‹ã«æ—¥æœ¬èªžè¨³ã‚’示ã—ã¦ãŠãã¾ã™ã€‚

          -
          /*----------------------------------------------------------------------------/
          -/  FatFs - FAT file system module  R0.10b                   (C)ChaN, 2014
          +

          ソース ファイルã«ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ¡ä»¶ãŒè¨˜è¿°ã•ã‚Œã¦ã„ã‚‹ã®ã§ã€åˆ©ç”¨ã®éš›ã¯ãã‚Œã«å¾“ã†ã“ã¨ã€‚原文ã¯è‹±èªžã§ã™ãŒã€å‚考ã¾ã§ã«ä»¥ä¸‹ã«æ—¥æœ¬èªžè¨³ã‚’示ã—ã¦ãŠãã¾ã™ã€‚

          +
          +/*----------------------------------------------------------------------------/
          +/  FatFs - FAT file system module  R0.11                 (C)ChaN, 2015
           /-----------------------------------------------------------------------------/
          -/ FatFsモジュールã¯ã€å°è¦æ¨¡ãªçµ„ã¿è¾¼ã¿ã‚·ã‚¹ãƒ†ãƒ å‘ã‘ã®æ±Žç”¨FATファイルシステム 
          -/ モジュールã§ã™ã€‚ã“ã‚Œã¯ãƒ•ãƒªãƒ¼ ソフトウェアã¨ã—ã¦ã€æ•™è‚²ãƒ»ç ”究・開発ã®ãŸã‚ã«
          -/ 以下ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ ãƒãƒªã‚·ãƒ¼ã®ä¸‹ã§å…¬é–‹ã•ã‚Œã¦ã„ã¾ã™ã€‚
          +/ FatFsモジュールã¯ãƒ•ãƒªãƒ¼ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã€æ¬¡ã«ç¤ºã™æ¡ä»¶ã®ä¸‹ã«å…¬é–‹ã•ã‚Œã¦ã„ã¾ã™ã€‚
           /
          -/  Copyright (C) 2014, ChaN, all right reserved.
          +/ Copyright (C) 2015, ChaN, all right reserved.
           /
          -/ * FatFsモジュールã¯ãƒ•ãƒªãƒ¼ ソフトウェアã§ã‚ã‚Šã€ã¾ãŸç„¡ä¿è¨¼ã§ã™ã€‚
          -/ * 用途ã«åˆ¶é™ã¯ã‚ã‚Šã¾ã›ã‚“。ã‚ãªãŸã®è²¬ä»»ã®ä¸‹ã«ãŠã„ã¦ã€å€‹äººçš„・éžå–¶åˆ©çš„ãª
          -/   ã‚‚ã®ã‹ã‚‰å•†ç”¨è£½å“ã®é–‹ç™ºã«åŠã¶ç›®çš„ã«ä½¿ç”¨ãƒ»æ”¹å¤‰ãƒ»å†é…布ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
          -/ * ソース コードをå†é…布ã™ã‚‹ã¨ãã¯ã€ä¸Šè¨˜ã®è‘—作権表示をä¿æŒã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。
          -/
          -/-----------------------------------------------------------------------------/
          -

          è¦ã™ã‚‹ã«FatFsã¯ã‚¿ãƒ€ã§è‡ªç”±ã«ä½¿ãˆã‚‹ã¨ã„ã†ã“ã¨ã§ã™ã€‚ソース コードをå†é…布ã™ã‚‹ã¨ãã¯ã€ã“ã®ãƒ–ロックをãã®ã¾ã¾ä¿æŒã—ã¦ãŠãã“ã¨ã€‚ã“ã®ã‚ˆã†ã«FatFsã¯BSDライクãªãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã¨ã—ã¦ã„ã¾ã™ãŒã€ä¸€ã¤å¤§ããªé•ã„ãŒã‚ã‚Šã¾ã™ã€‚特ã«çµ„ã¿è¾¼ã¿ç”¨é€”ã§ã®åˆ©ç”¨ä¾¡å€¤ã‚’高ã‚ã‚‹ãŸã‚ã€ãƒã‚¤ãƒŠãƒªå½¢å¼(ソース コードをå«ã¾ãªã„å½¢å¼å…¨ã¦)ã§ã®å†é…布ã«ã¤ã„ã¦ã¯ã€æ¡ä»¶ã¯è¨­ã‘ã¦ã„ã¾ã›ã‚“。ãã®å ´åˆã¯ã€FatFsãŠã‚ˆã³ãã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ–‡æ›¸ã«ã¤ã„ã¦ã¯ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã«æ˜Žè¨˜ã—ã¦ã‚‚ã—ãªãã¦ã‚‚ã‹ã¾ã„ã¾ã›ã‚“。ã“ã‚Œã¯ã€ä¸€æ¡é …BSDライセンスã¨ç­‰ä¾¡ã¨ã„ã†ã“ã¨ã§ã™ã€‚ã‚‚ã¡ã‚ã‚“GNU GPLプロジェクトã¨ã‚‚共存å¯èƒ½ã§ã™ã€‚何らã‹ã®å¤‰æ›´ã‚’加ãˆã¦å†é…布ã™ã‚‹éš›ã¯ã€çŸ›ç›¾ã—ãªã„ä»–ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹(GNU GPLや修正BSDライセンスãªã©)ã«å¤‰æ›´ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚

          +/ 1. ソースコードã§å†é…布ã™ã‚‹ã¨ãã¯ã€ãã®ä¸­ã«ä¸Šè¨˜ã®è‘—作権表示ã€ã“ã®æ¡æ–‡ã€ãŠã‚ˆã³ +/ 次ã®å…責事項をä¿æŒã™ã‚‹ã“㨠+/ +/ ã“ã®ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ã€è‘—作権者らãŠã‚ˆã³ã‚³ãƒ³ãƒˆãƒªãƒ“ューターらã«ã‚ˆã£ã¦ç¾çŠ¶ã®ã¾ã¾ +/ æä¾›ã•ã‚Œã¦ãŠã‚Šã€ã„ã‹ãªã‚‹ä¿è¨¼ã‚‚ã‚ã‚Šã¾ã›ã‚“。 +/ 著作権者もコントリビューターもã€ã“ã®ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ä½¿ç”¨ã«ã‚ˆã‚Šç™ºç”Ÿã™ã‚‹ã„ã‹ãªã‚‹ +/ æ害ã«ã¤ã„ã¦ã‚‚ã€è²¬ä»»ã‚’è² ã„ã¾ã›ã‚“。 +/----------------------------------------------------------------------------*/ +
          +

          ã“ã®ã‚ˆã†ã«FatFsã¯BSDライクãªãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã¨ã—ã¦ã„ã¾ã™ãŒã€ä¸€ã¤å¤§ããªé•ã„ãŒã‚ã‚Šã¾ã™ã€‚FatFsã¯ä¸»ã«çµ„ã¿è¾¼ã¿å‘ã‘ã¨ã—ã¦é–‹ç™ºã•ã‚ŒãŸãŸã‚ã€ãƒã‚¤ãƒŠãƒªå½¢å¼(ソース コードをå«ã¾ãªã„å½¢å¼å…¨ã¦)ã§ã®å†é…布ã«ã¤ã„ã¦ã¯ã€å•†ç”¨ã§ã®ä½¿ã„ã‚„ã™ã•ã‚’考慮ã—ã¦é…布時ã®æ¡ä»¶ã‚’設ã‘ã¦ã„ã¾ã›ã‚“。ã¤ã¾ã‚Šã€ãƒã‚¤ãƒŠãƒªé…布ã®å ´åˆã¯ã€FatFsãŠã‚ˆã³ãã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ–‡æ›¸ã«ã¤ã„ã¦ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã«æ˜Žè¨˜ã—ã¦ã‚‚ã—ãªãã¦ã‚‚ã‹ã¾ã„ã¾ã›ã‚“。ã“ã‚Œã¯ã€ä¸€æ¡é …BSDライセンスã¨ç­‰ä¾¡ã¨ã„ã†ã“ã¨ã§ã™ã€‚ã‚‚ã¡ã‚ã‚“ã€GNU GPLãªã©ã»ã¨ã‚“ã©å…¨ã¦ã®ã‚ªãƒ¼ãƒ—ン ソース ライセンスã®ä¸‹ã®ãƒ—ロジェクトã«ãŠã„ã¦å…±å­˜å¯èƒ½ã§ã™ã€‚FatFsã«ä½•ã‚‰ã‹ã®ä¿®æ­£ã‚„拡張を加ãˆã¦ã‚½ãƒ¼ã‚¹ コードã§å†é…布ã™ã‚‹å ´åˆã¯ã€çŸ›ç›¾ã—ãªã„ä»–ã®ã‚ªãƒ¼ãƒ—ン ソース ライセンス(GNU GPLや修正BSDライセンスãªã©)ã«å¤‰æ›´ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚

          戻る

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/close.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/close.html index 71d3c01b..f9c4c276 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/close.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/close.html @@ -36,7 +36,6 @@ FRESULT f_close ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/config.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/config.html new file mode 100644 index 00000000..2b059d29 --- /dev/null +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/config.html @@ -0,0 +1,225 @@ + + + + + + + + + +FatFs - 構æˆã‚ªãƒ—ション + + + +

          構æˆã‚ªãƒ—ション

          +

          FatFsã«ã¯å¤šãã®æ§‹æˆã‚ªãƒ—ションãŒã‚ã‚Šã€ãã‚Œãžã‚Œã®ãƒ—ロジェクトã®è¦æ±‚ã«å¿œã˜ã¦æŸ”軟ã«æ©Ÿèƒ½ã‚’構æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚構æˆã‚ªãƒ—ションã¯ã€ffconf.hã«è¨˜è¿°ã•ã‚Œã¾ã™ã€‚

          + +
          +

          基本機能ã®è¨­å®š

          + +

          _FS_READONLY

          +

          0:リード/ライト or 1:リード オンリ。リード オンリ構æˆã§ã¯ã€f_writeã€f_syncã€f_unlinkã€f_mkdirã€f_chmodã€f_renameã€f_truncateã€f_getfreeã®åŸºæœ¬API関数ãŠã‚ˆã³ã‚ªãƒ—ションã®æ›¸ãè¾¼ã¿ç³»API関数ãŒå‰Šé™¤ã•ã‚Œã¾ã™ã€‚

          + +

          _FS_MINIMIZE

          +

          基本API関数を段階的ã«å‰Šé™¤ã—ã¾ã™ã€‚

          + + + + + + +
          値解説
          0å…¨ã¦ã®åŸºæœ¬API関数ãŒåˆ©ç”¨å¯èƒ½ã€‚
          1f_statã€f_getfreeã€f_unlinkã€f_mkdirã€f_chmodã€f_utimeã€f_truncateã€f_rename関数ãŒå‰Šé™¤ã•ã‚Œã‚‹ã€‚
          21ã«åŠ ãˆã€f_opendirã€f_readdirã€f_closedir関数ãŒå‰Šé™¤ã•ã‚Œã‚‹ã€‚
          32ã«åŠ ãˆã€f_lseek関数ãŒå‰Šé™¤ã•ã‚Œã‚‹ã€‚
          + +

          _USE_STRFUNC

          +

          文字列入出力API関数f_gets, f_putc, f_puts and f_printfã®æ§‹æˆã€‚

          + + + + + +
          値解説
          0文字列入出力API関数を使用ã—ãªã„。
          1文字列入出力API関数を使用ã™ã‚‹ã€‚データã®LF-CRLF変æ›ã¯ã—ãªã„。
          2文字列入出力API関数を使用ã™ã‚‹ã€‚データã®LF-CRLF変æ›ã‚’ã™ã‚‹ã€‚
          + +

          _USE_FIND

          +

          フィルタ付ãディレクトリ読ã¿å‡ºã—機能ã®æ§‹æˆ(0:無効 ã¾ãŸã¯ 1:有効)。有効ã«ã™ã‚‹ã¨ã€f_findfirstã€f_findnext関数ãŒåˆ©ç”¨å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚

          + +

          _USE_MKFS

          +

          ボリューム作æˆæ©Ÿèƒ½ã®æ§‹æˆ(0:無効 ã¾ãŸã¯ 1:有効)。有効ã«ã™ã‚‹ã¨f_mkfs関数ãŒåˆ©ç”¨å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚

          + +

          _USE_FASTSEEK

          +

          高速シーク機能ã®æ§‹æˆ(0:無効 ã¾ãŸã¯ 1:有効)。有効ã«ã™ã‚‹ã¨ã€f_lseekã€f_readã€f_write関数ã®é«˜é€ŸåŒ–モードãŒåˆ©ç”¨å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚詳ã—ãã¯ã€ã“ã¡ã‚‰ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

          + +

          _USE_LABEL

          +

          ボリューム ラベルæ“作機能ã®æ§‹æˆ(0:無効 ã¾ãŸã¯ 1:有効)。有効ã«ã™ã‚‹ã¨ã€f_getlabelã€f_setlabel関数ãŒåˆ©ç”¨å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚

          + +

          _USE_FORWARD

          +

          ストリーミング読ã¿å‡ºã—機能ã®æ§‹æˆ(0:無効 ã¾ãŸã¯ 1:有効)。ã“ã‚Œã¨_FS_TINYを有効ã«ã™ã‚‹ã¨ã€f_forward関数ãŒåˆ©ç”¨å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚

          + +
          + + +
          +

          åå‰ç©ºé–“ã¨ãƒ­ã‚±ãƒ¼ãƒ«ã®è¨­å®š

          + +

          _CODE_PAGE

          +

          パスåç­‰ã®æ–‡å­—列データã®ã‚³ãƒ¼ãƒ‰ ページを指定ã—ã¾ã™ã€‚ä¸é©åˆ‡ãªè¨­å®šã¯ã€ãƒ•ã‚¡ã‚¤ãƒ« オープン エラーã®åŽŸå› ã«ãªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚拡張文字ãŒå…¨ã使ã‚ã‚Œãªã„å ´åˆã¯ã€ã©ã‚Œã‚’é¸ã‚“ã§ã‚‚åŒã˜ã§ã™ã€‚

          + + + + + + + + + + + + + + + + + + + + + + + + +
          値解説
          1ASCII (éžLFN構æˆã§ã®ã¿æœ‰åŠ¹)
          437U.S.
          720Arabic
          737Greek
          771KBL
          775Baltic
          850Latin 1
          852Latin 2
          855Cyrillic
          857Turkish
          860Portuguese
          861Icelandic
          862Hebrew
          863Canadian French
          864Arabic
          865Nordic
          866Russian
          869Greek 2
          932日本語 (DBCS)
          936簡体字中国語 (DBCS)
          949韓国語 (DBCS)
          950ç¹ä½“字中国語 (DBCS)
          + +

          _USE_LFN

          +

          LFN(é•·ã„ファイルå)対応を設定ã—ã¾ã™ã€‚LFN機能を有効ã«ã™ã‚‹ã¨ãã¯ã€Unicodeæ“作関数option/unicode.cをプロジェクトã«åŠ ãˆã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã¾ãŸã€LFNæ“作ãƒãƒƒãƒ•ã‚¡((_MAX_LFN + 1) * 2ãƒã‚¤ãƒˆã‚’å æœ‰)を使用ã—ã¾ã™ã€‚ãƒãƒƒãƒ•ã‚¡ã‚’スタックã«ç¢ºä¿ã™ã‚‹ã¨ãã¯ã€ã‚¹ã‚¿ãƒƒã‚¯ オームフローã«æ³¨æ„ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ヒープã«ç¢ºä¿ã™ã‚‹ã¨ãã¯ã€ãƒ¡ãƒ¢ãƒªæ“作関数ã€ff_memallocã¨ff_memfree(option/syscall.cã«ã‚µãƒ³ãƒ—ルã‚ã‚Š)ã€ã‚’プロジェクトã«åŠ ãˆã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

          + + + + + + +
          値解説
          0LFN機能を使ã‚ãªã„。8.3å½¢å¼ã®åå‰ã®ã¿ä½¿ç”¨å¯èƒ½ã€‚
          1LFN機能を使ã†ã€‚LFNæ“作ãƒãƒƒãƒ•ã‚¡ã¯é™çš„ã«ç¢ºä¿ã€‚常ã«ã‚¹ãƒ¬ãƒƒãƒ‰ セーフã§ã¯ãªã„。
          2LFN機能を使ã†ã€‚LFNæ“作ãƒãƒƒãƒ•ã‚¡ã¯ã‚¹ã‚¿ãƒƒã‚¯ã‹ã‚‰ç¢ºä¿ã€‚
          3LFN機能を使ã†ã€‚LFNæ“作ãƒãƒƒãƒ•ã‚¡ã¯ãƒ’ープã‹ã‚‰ç¢ºä¿ã€‚
          + +

          _MAX_LFN

          +

          LFNæ“作ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’文字å˜ä½ã§æŒ‡å®š(12~255)ã—ã¾ã™ã€‚LFN機能ãŒç„¡åŠ¹ã®ã¨ãã¯æ„味をæŒã¡ã¾ã›ã‚“。

          + +

          _LFN_UNICODE

          +

          ファイルAPI上ã«ãŠã‘ã‚‹Unicode対応機能を設定ã—ã¾ã™ã€‚éžLFN構æˆã®ã¨ãã¯ã€0ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。LFN構æˆã®ã¨ãã«1ã‚’é¸æŠžã™ã‚‹ã¨ã€ãƒ•ã‚¡ã‚¤ãƒ«API上ã®æ–‡å­—列データTCHARåž‹ã®å®šç¾©ãŒåˆ‡ã‚Šæ›¿ã‚ã‚Šã€ãƒ‘スåç­‰ã«Unicodeを使用ã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯ã€æ–‡å­—列入出力関数ã«ã‚‚影響ã—ã¾ã™ã€‚詳ã—ãã¯ã€ã“ã¡ã‚‰ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

          + +

          _STRF_ENCODE

          +

          Unicode API構æˆã®ã¨ãã€æ–‡å­—列入出力関数ã€f_getsã€f_putcã€f_putsã€f_printfã€ã«ãŠã‘るファイル上ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã‚’指定ã—ã¾ã™ã€‚éžUnicode API構æˆã®ã¨ãã¯æ„味をæŒã¡ã¾ã›ã‚“。

          + + + + + + +
          値解説
          0ANSI/OEM
          1UTF-16LE
          2UTF-16BE
          3UTF-8
          + +

          _FS_RPATH

          +

          相対パス機能を設定ã—ã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªèª­ã¿å‡ºã—関数ã®å‡ºåŠ›ã«ã‚‚影響ã—ã¾ã™ã€‚詳ã—ãã¯ã€ã“ã¡ã‚‰ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

          + + + + + +
          値解説
          0相対パス機能を使ã‚ãªã„。パスåã¯å¸¸ã«ãƒ«ãƒ¼ãƒˆ ディレクトリã‹ã‚‰è¾¿ã‚‹ã€‚
          1相対パス機能を使ã†ã€‚f_chdirã€f_chdrive関数ãŒåˆ©ç”¨å¯èƒ½ã«ãªã‚‹ã€‚
          21ã«åŠ ãˆã€f_getcwd関数ãŒåˆ©ç”¨å¯èƒ½ã«ãªã‚‹ã€‚
          + +
          + + +
          +

          ボリューム/物ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®è¨­å®š

          + +

          _VOLUMES

          +

          利用ã™ã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ (è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–)ã®æ•°ã‚’1~9ã®ç¯„囲ã§è¨­å®šã—ã¾ã™ã€‚

          + +

          _STR_VOLUME_ID

          +

          文字列ボリュームIDã®è¨­å®š(0:無効 ã¾ãŸã¯ 1:有効)。パスå中ã®ãƒœãƒªãƒ¥ãƒ¼ãƒ IDã«æ•°å­—ã«åŠ ãˆä»»æ„ã®æ–‡å­—列も使用ã§ãるよã†ã«ã™ã‚‹ã‚ªãƒ—ションã§ã™ã€‚ボリュームID文字列ã¯_VOLUME_STRSã§å®šç¾©ã—ã¾ã™ã€‚

          + +

          _VOLUME_STRS

          +

          ボリュームID文字列を定義ã—ã¾ã™ã€‚_VOLUMESã§è¨­å®šã•ã‚ŒãŸå€‹æ•°ã®æ–‡å­—列を"RAM","SD","CF",... ã®ã‚ˆã†ã«æŒ™åˆ—ã—ã¾ã™ã€‚使用å¯èƒ½ãªæ–‡å­—ã¯A~ZãŠã‚ˆã³0~9ã§ã€å…ˆé ­ã®é …ç›®ãŒè«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–0ã«å¯¾å¿œã—ã¾ã™ã€‚

          + +

          _MULTI_PARTITION

          +

          マルãƒåŒºç”»æ©Ÿèƒ½ã®è¨­å®š(0:無効 ã¾ãŸã¯ 1:有効)。無効ã®ã¨ãã¯ã€å€‹ã€…ã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã¯åŒã˜ç•ªå·ã®ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«1:1ã§å¯¾å¿œã—ã€ãã‚Œãžã‚Œã®ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–中ã®æœ€åˆã®åŒºç”»ã«çµã³ã¤ã‘られã¾ã™ã€‚マルãƒåŒºç”»æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹ã¨ã€è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã¯ãã‚Œãžã‚Œä»»æ„ã®ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®ä»»æ„ã®åŒºç”»ã«çµã³ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚マッピングã¯ã€ãƒ¦ãƒ¼ã‚¶å®šç¾©ã®å¤‰æ›ãƒ†ãƒ¼ãƒ–ルVolToPart[]ã«ã‚ˆã£ã¦è¡Œã„ã¾ã™ã€‚ã¾ãŸã€f_fdisk関数ãŒåˆ©ç”¨å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚詳ã—ãã¯ã€ã“ã¡ã‚‰ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

          + +

          _MIN_SSã€_MAX_SS

          +

          使用ã™ã‚‹ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®ã‚»ã‚¯ã‚¿ サイズ(データã®èª­ã¿æ›¸ãã®æœ€å°å˜ä½)を設定ã—ã¾ã™ã€‚有効ãªå€¤ã¯ã€512ã€1024ã€2048ã€4096ã§ã™ã€‚_MIN_SSã¯æœ€å°ã‚µã‚¤ã‚ºã€_MAX_SSã¯æœ€å¤§ã‚µã‚¤ã‚ºã‚’設定ã—ã¾ã™ã€‚メモリ カードやãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã§ã¯ã€å¸¸ã«ä¸¡æ–¹ã«512を設定ã—ã¾ã™ãŒã€ã‚ªãƒ³ãƒœãƒ¼ãƒ‰ メモリや一部ã®å…‰å­¦ãƒ¡ãƒ‡ã‚£ã‚¢ã§ã¯å¤§ããªå€¤ã‚’設定ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚知れã¾ã›ã‚“。_MAX_SS > _MIN_SSã«è¨­å®šã—ãŸã¨ãã¯å¯å¤‰ã‚»ã‚¯ã‚¿ サイズ構æˆã¨ãªã‚Šã€disk_ioctl関数ã«ã¯GET_SECTOR_SIZEコマンドを実装ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

          + +

          _USE_TRIM

          +

          ATA-TRIM機能ã®ä½¿ç”¨ã®è¨­å®š(0:無効 ã¾ãŸã¯ 1:有効)。ã“ã®æ©Ÿèƒ½ã‚’有効ã«ã—ãŸã¨ãã¯ã€disk_ioctl関数ã«CTRL_TRIMコマンドを実装ã™ã‚‹ã¹ãã§ã™ã€‚

          + +

          _FS_NOFSINFO

          +

          FAT32ボリュームã®FSINFOã®ä½¿ç”¨ã®è¨­å®š(0~3)。FAT32ボリュームã§å¿…ãšæ­£ç¢ºãªç©ºã容é‡ã‚’å–å¾—ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã¨ãã€è¨­å®šå€¤ã®ãƒ“ット0をセットã™ã‚‹ã¨f_getfree関数ã¯FSINFOã®æƒ…報を使ã‚ãšã«å…¨FATスキャンを行ã£ã¦ç©ºã容é‡ã‚’å¾—ã¾ã™ã€‚ビット1ã¯æœ€çµ‚割り当ã¦ã‚¯ãƒ©ã‚¹ã‚¿ç•ªå·ã®åˆ©ç”¨ã®åˆ¶å¾¡ã§ã™ã€‚

          + + + + + + +
          値解説
          bit0=0FSINFOã®ç©ºãクラスタ情報ãŒæœ‰åŠ¹ãªã¨ãã¯ãれを利用ã™ã‚‹ã€‚
          bit0=1FSINFOã®ç©ºãクラスタ情報を利用ã—ãªã„。
          bit1=0FSINFOã®æœ€çµ‚割り当ã¦ã‚¯ãƒ©ã‚¹ã‚¿ç•ªå·ãŒæœ‰åŠ¹ãªã¨ãã¯ãれを利用ã™ã‚‹ã€‚
          bit1=1FSINFOã®æœ€çµ‚割り当ã¦ã‚¯ãƒ©ã‚¹ã‚¿ç•ªå·ã‚’利用ã—ãªã„。
          + +
          + + +
          +

          システムã®è¨­å®š

          + +

          _FS_TINY

          +

          ファイル データ転é€ãƒãƒƒãƒ•ã‚¡ã®æ§‹æˆ(0:ノーマル ã¾ãŸã¯ 1:タイニ)。タイニ構æˆã§ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ« オブジェクトFIL内ã®ãƒ—ライベート セクタ ãƒãƒƒãƒ•ã‚¡ãŒå‰Šé™¤ã•ã‚Œã€_MAX_SSãƒã‚¤ãƒˆå°ã•ããªã‚Šã¾ã™ã€‚ファイル データã®è»¢é€ã«ã¯ã€ä»£ã‚ã‚Šã«ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトFATFS内ã®ãƒœãƒªãƒ¥ãƒ¼ãƒ å…±æœ‰ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ãŒä½¿ã‚ã‚Œã¾ã™ã€‚

          + +

          _FS_NORTC

          +

          RTC機能ã®ä½¿ç”¨ã®è¨­å®š(0:使用ã™ã‚‹ ã¾ãŸã¯ 1:使用ã—ãªã„)。システムãŒRTC(カレンダ時計)をサãƒãƒ¼ãƒˆã—ãªã„å ´åˆã¯ã€1をセットã—ã¾ã™ã€‚ã“ã®å ´åˆã€FatFsãŒå¤‰æ›´ã‚’加ãˆãŸã‚ªãƒ–ジェクトã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®æ—¥æ™‚ã‚’æŒã¡ã¾ã™ã€‚RTCãŒä½¿ç”¨å¯èƒ½ãªã¨ãã¯ã€0を設定ã—ã€get_fattime関数をプロジェクトã«åŠ ãˆã¾ã™ã€‚リード オンリ構æˆã§ã¯ã“ã®ã‚ªãƒ—ションã¯æ„味をæŒã¡ã¾ã›ã‚“。

          + +

          _NORTC_MONã€_NORTC_MDAYã€_NORTC_YEAR

          +

          デフォルト日時ã®è¨­å®šã€‚_FS_NORTCãŒ1ã®ã¨ãã€å›ºå®šã—ã¦ä¸Žãˆã‚‰ã‚Œã‚‹æ—¥ä»˜ã‚’指定ã—ã¾ã™ã€‚_FS_NORTCãŒ0ã®ã¨ãã€ãŠã‚ˆã³ãƒªãƒ¼ãƒ‰ オンリ構æˆã§ã¯ã“れらã®ã‚ªãƒ—ションã¯æ„味をæŒã¡ã¾ã›ã‚“。

          + +

          _FS_LOCK

          +

          ファイル ロック機能ã®è¨­å®šã€‚ã“ã®ã‚ªãƒ—ションã¯ã€é–‹ã‹ã‚ŒãŸã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹ä¸æ­£ãªæ“作ã®åˆ¶å¾¡æ©Ÿèƒ½ã‚’設定ã—ã¾ã™ã€‚リード オンリ構æˆã§ã¯0ã«è¨­å®šã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。ãªãŠã€ãƒ•ã‚¡ã‚¤ãƒ« ロック機能ã¯ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ã‚·ãƒ¼ã¨ã¯é–¢ä¿‚ã‚ã‚Šã¾ã›ã‚“。

          + + + + + +
          値解説
          0ファイル ロック機能を使ã‚ãªã„。ボリュームã®ç ´æを防ããŸã‚ã€ã‚¢ãƒ—リケーションã¯ä¸æ­£ãªãƒ•ã‚¡ã‚¤ãƒ«æ“作をé¿ã‘ãªã‘ã‚Œã°ãªã‚‰ãªã„。
          >0ファイル ロック機能を使ã†ã€‚数値ã¯åŒæ™‚ã«ã‚ªãƒ¼ãƒ—ンã§ãるファイルやサブ ディレクトリã®æ•°ã‚’設定ã—ã¾ã™ã€‚
          + +

          _FS_REENTRANT

          +

          リエントランシーã®è¨­å®š(0:無効 ã¾ãŸã¯ 1:有効)。ã“ã®ã‚ªãƒ—ションã¯ã€FatFsモジュール自体ã®ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ã‚·ãƒ¼(スレッド セーフ)ã®è¨­å®šã‚’ã—ã¾ã™ã€‚ç•°ãªã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ ã«å¯¾ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ« アクセスã¯ã“ã®ã‚ªãƒ—ションã«é–¢ä¿‚ãªã常ã«ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆã§ã€f_mountã€f_mkfsã€f_fdiskãªã©ã®ãƒœãƒªãƒ¥ãƒ¼ãƒ æ“作関数ã¯ã“ã®ã‚ªãƒ—ションã«é–¢ä¿‚ãªã常ã«ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆã§ã¯ã‚ã‚Šã¾ã›ã‚“。åŒã˜ãƒœãƒªãƒ¥ãƒ¼ãƒ ã«å¯¾ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ« アクセス(ã¤ã¾ã‚Šã€ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã®æŽ’他使用)ã®ã¿ãŒã“ã®ã‚ªãƒ—ションã®åˆ¶å¾¡ä¸‹ã«ã‚ã‚Šã¾ã™ã€‚ã“ã®ã‚ªãƒ—ションを有効ã«ã—ãŸã¨ãã¯ã€åŒæœŸé–¢æ•°ã§ã‚ã‚‹ff_req_grantã€ff_rel_grantã€ff_del_syncobjã€ff_cre_syncobjをプロジェクトã«è¿½åŠ ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚サンプルãŒoption/syscall.cã«ã‚ã‚Šã¾ã™ã€‚

          + +

          _FS_TIMEOUT

          +

          タイムアウト時間ã®è¨­å®šã€‚å¾…ã¡åˆã‚ã›æ™‚é–“ãŒé•·ã„ã¨ãã«FR_TIMEOUTã§ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ã‚’アボートã™ã‚‹æ™‚間を設定ã—ã¾ã™ã€‚_FS_REENTRANTãŒ0ã®ã¨ãã¯æ„味をæŒã¡ã¾ã›ã‚“。

          + +

          _SYNC_t

          +

          O/S定義ã®åŒæœŸã‚ªãƒ–ジェクトã®åž‹ã‚’設定ã—ã¾ã™ã€‚例: HANDLEã€IDã€OS_EVENT*ã€SemaphoreHandle_tãªã©ã€‚ã¾ãŸã€O/S機能ã®ãƒ˜ãƒƒãƒ€ ファイルをff.cã®ã‚¹ã‚³ãƒ¼ãƒ—内ã«ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚_FS_REENTRANTãŒ0ã®ã¨ãã¯æ„味をæŒã¡ã¾ã›ã‚“。

          + +

          _WORD_ACCESS

          +

          ボリューム上ã®ãƒ¯ãƒ¼ãƒ‰ データã¸ã®ã‚¢ã‚¯ã‚»ã‚¹æ–¹æ³•ã‚’設定ã—ã¾ã™ã€‚唯一ã®ãƒ—ラットフォームä¾å­˜ã‚ªãƒ—ションã§ã™ã€‚

          + + + + +
          値解説
          0Byte-by-byteアクセス。全ã¦ã®ãƒ—ラットフォームã§ã‚³ãƒ³ãƒ‘ãƒãƒ–ル。
          1ワード アクセス。コード サイズãŒå°‘ã—減るãŒã€æ¬¡ã®æ¡ä»¶ã‚’å…±ã«æº€ãŸã—ã¦ã„ãªã„é™ã‚Šé¸æŠžã§ããªã„。
          +・éžã‚¢ãƒ©ã‚¤ãƒ³ メモリ アクセスãŒå¸¸ã«å…¨ã¦ã®å‘½ä»¤ã§ä½¿ç”¨å¯èƒ½ã€‚
          +・メモリ上ã®ãƒã‚¤ãƒˆé †ãŒãƒªãƒˆãƒ« エンディアン。
          +

          次ã«ã„ãã¤ã‹ã®ãƒ—ロセッサã«ãŠã‘る許å¯ã•ã‚ŒãŸè¨­å®šã‚’示ã—ã¾ã™ã€‚

          +
          +   ARM7TDMI   0   *2          ColdFire   0    *1         V850E      0    *2
          +   Cortex-M3  0   *3          Z80        0/1             V850ES     0/1
          +   Cortex-M0  0   *2          x86        0/1             TLCS-870   0/1
          +   AVR        0/1             RX600(LE)  0/1             TLCS-900   0/1
          +   AVR32      0   *1          RL78       0    *2         R32C       0    *2
          +   PIC18      0/1             SH-2       0    *1         M16C       0/1
          +   PIC24      0   *2          H8S        0    *1         MSP430     0    *2
          +   PIC32      0   *1          H8/300H    0    *1         8051       0/1
          +
          +   *1:ビッグ エンディアン
          +   *2:éžã‚¢ãƒ©ã‚¤ãƒ³ メモリ アクセスä¸å¯
          +   *3:ã„ãã¤ã‹ã®ã‚³ãƒ³ãƒ‘イラãŒmem_cpy関数ã«LDM/STM命令を生æˆã™ã‚‹
          +
          + +
          + +

          戻る

          + + diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/dinit.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/dinit.html index 63291503..68f4cc3f 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/dinit.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/dinit.html @@ -32,13 +32,13 @@ DSTATUS disk_initialize (

          戻り値

          -

          ã“ã®é–¢æ•°ã¯æˆ»ã‚Šå€¤ã¨ã—ã¦ãƒ‡ã‚£ã‚¹ã‚¯ ステータスを返ã—ã¾ã™ã€‚ディスク ステータスã®è©³ç´°ã«é–¢ã—ã¦ã¯disk_status()ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

          +

          ã“ã®é–¢æ•°ã¯æˆ»ã‚Šå€¤ã¨ã—ã¦ãƒ‡ã‚£ã‚¹ã‚¯ ステータスを返ã—ã¾ã™ã€‚ディスク ステータスã®è©³ç´°ã«é–¢ã—ã¦ã¯disk_status関数をå‚ç…§ã—ã¦ãã ã•ã„。

          解説

          ストレージ デãƒã‚¤ã‚¹ã‚’åˆæœŸåŒ–ã—ã€ãƒ‡ãƒ¼ã‚¿ã®èª­ã¿æ›¸ããªã©å…¨ã¦ã®å‹•ä½œãŒå¯èƒ½ãªçŠ¶æ…‹ã«ã—ã¾ã™ã€‚関数ãŒæˆåŠŸã™ã‚‹ã¨ã€æˆ»ã‚Šå€¤ã®STA_NOINITフラグãŒã‚¯ãƒªã‚¢ã•ã‚Œã¾ã™ã€‚

          -

          アプリケーションã‹ã‚‰ã¯ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¦ã¯ãªã‚Šã¾ã›ã‚“。ã•ã‚‚ãªã„ã¨ã€FATボリュームãŒç ´å£Šã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚エラー等ã«ã‚ˆã‚Šå†åˆæœŸåŒ–ãŒå¿…è¦ãªã¨ãã¯ã€f_mount()を使用ã—ã¦ãã ã•ã„。FatFsモジュールã¯ã€è‡ªå‹•ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œã«ã‚ˆã‚Šã€å¿…è¦ã«å¿œã˜ã¦ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¾ã™ã€‚

          +

          ã“ã®é–¢æ•°ã¯FatFsã®ç®¡ç†ä¸‹ã«ã‚ã‚Šã€è‡ªå‹•ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œã«ã‚ˆã‚Šå¿…è¦ã«å¿œã˜ã¦å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚アプリケーションã‹ã‚‰ã¯ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¦ã¯ãªã‚Šã¾ã›ã‚“。ã•ã‚‚ãªã„ã¨ã€FATボリュームãŒç ´å£Šã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚å†åˆæœŸåŒ–ãŒå¿…è¦ãªã¨ãã¯ã€f_mount関数を使用ã—ã¦ãã ã•ã„。

          戻る

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/dioctl.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/dioctl.html index 120d7984..f5715a7b 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/dioctl.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/dioctl.html @@ -27,7 +27,7 @@ DRESULT disk_ioctl (

          引数

          pdrv
          -
          対象ã®ãƒ‡ãƒã‚¤ã‚¹ã‚’示ã™ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·(0-9)ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚
          +
          対象ã®ãƒ‡ãƒã‚¤ã‚¹ã‚’識別ã™ã‚‹ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·(0-9)ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚
          cmd
          制御コマンド コードãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚
          buff
          @@ -55,10 +55,10 @@ DRESULT disk_ioctl ( - - - - + + + +
          標準ioctlコマンド
          コマンド解説
          CTRL_SYNCデãƒã‚¤ã‚¹ã®ãƒ‡ãƒ¼ã‚¿æ›¸ãè¾¼ã¿å‡¦ç†ã‚’完了ã•ã›ã¾ã™ã€‚ドライãƒãŒãƒ©ã‚¤ãƒˆ ãƒãƒƒã‚¯ キャッシュãªã©ã‚’æŒã£ã¦ã„ã‚‹å ´åˆã¯ã€æ›¸ãè¾¼ã¾ã‚Œã¦ã„ãªã„データをå³æ™‚書ãè¾¼ã¿ã¾ã™ã€‚メディア上ã¸ã®æ›¸ãè¾¼ã¿ãŒãã‚Œãžã‚Œdisk_write()ã®ä¸­ã§å®Œäº†ã™ã‚‹å ´åˆã¯ã€ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«å¯¾ã—ã¦ã™ã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。
          GET_SECTOR_COUNTç·ã‚»ã‚¯ã‚¿æ•°ã®å–得。buffã®æŒ‡ã™DWORD型変数ã«ãƒ‰ãƒ©ã‚¤ãƒ–上ã®ç·ã‚»ã‚¯ã‚¿æ•°ã‚’è¿”ã—ã¾ã™ã€‚f_mkfs()ãŠã‚ˆã³f_fdisk()内ã‹ã‚‰å‘¼ã³å‡ºã•ã‚Œã€ä½œæˆã™ã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ ã®ã‚µã‚¤ã‚ºã‚’決定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚
          GET_SECTOR_SIZEセクタ サイズã®å–得。buffã®æŒ‡ã™WORD型変数ã«ãƒ‰ãƒ©ã‚¤ãƒ–ã®ã‚»ã‚¯ã‚¿ サイズを返ã—ã¾ã™ã€‚有効値ã¯512ã€1024ã€2048ã¾ãŸã¯4096ã§ã™ã€‚セクタ サイズãŒå›ºå®š(_MAX_SS ==_MIN_SS)ã®ã¨ãã¯ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ä½¿ã‚れるã“ã¨ã¯ãªãã€ãƒ‡ãƒã‚¤ã‚¹ã¯å¸¸ã«ãã®ã‚»ã‚¯ã‚¿ サイズã§å‹•ä½œã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。
          GET_BLOCK_SIZE消去ブロック サイズã®å–得。buffã®æŒ‡ã™DWORD型変数ã«ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ メモリã®æ¶ˆåŽ»ãƒ–ロック サイズ(セクタå˜ä½)ã‚’è¿”ã—ã¾ã™ã€‚1ã‹ã‚‰32768ã®ç¯„囲ã§2ã®ç´¯ä¹—ã®å€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。ブロック サイズä¸æ˜Žã¾ãŸã¯ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ メモリ以外ã®ãƒ‡ãƒã‚¤ã‚¹ã§ã¯1ã‚’è¿”ã—ã¾ã™ã€‚f_mkfs()内ã§ã®ã¿ä½¿ç”¨ã•ã‚Œã€ä½œæˆã•ã‚Œã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ ã®ãƒ‡ãƒ¼ã‚¿é ˜åŸŸã¯ã“ã®å¢ƒç•Œã«ã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆã•ã‚Œã¾ã™ã€‚
          CTRL_SYNCデãƒã‚¤ã‚¹ã®ãƒ‡ãƒ¼ã‚¿æ›¸ãè¾¼ã¿å‡¦ç†ã‚’完了ã•ã›ã¾ã™ã€‚ドライãƒãŒãƒ©ã‚¤ãƒˆ ãƒãƒƒã‚¯ キャッシュãªã©ã‚’æŒã£ã¦ã„ã‚‹å ´åˆã¯ã€æ›¸ãè¾¼ã¾ã‚Œã¦ã„ãªã„データをå³æ™‚書ãè¾¼ã¿ã¾ã™ã€‚メディア上ã¸ã®æ›¸ãè¾¼ã¿ãŒãã‚Œãžã‚Œdisk_write関数ã®ä¸­ã§å®Œäº†ã™ã‚‹å ´åˆã¯ã€ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«å¯¾ã—ã¦ã™ã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。
          GET_SECTOR_COUNTç·ã‚»ã‚¯ã‚¿æ•°ã®å–得。buffã®æŒ‡ã™DWORD型変数ã«ãƒ‰ãƒ©ã‚¤ãƒ–上ã®ç·ã‚»ã‚¯ã‚¿æ•°ã‚’è¿”ã—ã¾ã™ã€‚f_mkfs, f_fdisk関数内ã‹ã‚‰å‘¼ã³å‡ºã•ã‚Œã€ä½œæˆã™ã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ ã®ã‚µã‚¤ã‚ºã‚’決定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚
          GET_SECTOR_SIZEセクタ サイズã®å–得。セクタ サイズå¯å¤‰(_MAX_SS > _MIN_SS)ã®ã¨ãã€disk_initailize関数ã®æˆåŠŸã«ç¶šã呼ã³å‡ºã•ã‚Œã‚‹ã®ã§ã€buffã®æŒ‡ã™WORD型変数ã«ç¾åœ¨ã®ã‚»ã‚¯ã‚¿ サイズを返ã—ã¾ã™ã€‚有効値ã¯512ã€1024ã€2048ã¾ãŸã¯4096ã§ã™ã€‚セクタ サイズ固定(_MAX_SS == _MIN_SS)ã®ã¨ãã¯ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ä½¿ã‚れるã“ã¨ã¯ãªãã€ãƒ‡ãƒã‚¤ã‚¹ã¯å¸¸ã«ãã®ã‚»ã‚¯ã‚¿ サイズã§å‹•ä½œã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。
          GET_BLOCK_SIZE消去ブロック サイズã®å–得。buffã®æŒ‡ã™DWORD型変数ã«ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ メモリã®æ¶ˆåŽ»ãƒ–ロック サイズ(セクタå˜ä½)ã‚’è¿”ã—ã¾ã™ã€‚1ã‹ã‚‰32768ã®ç¯„囲ã§2ã®ç´¯ä¹—ã®å€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。ブロック サイズä¸æ˜Žã¾ãŸã¯ãƒ•ãƒ©ãƒƒã‚·ãƒ¥ メモリ以外ã®ãƒ‡ãƒã‚¤ã‚¹ã§ã¯1ã‚’è¿”ã—ã¾ã™ã€‚f_mkfs関数内ã§ã®ã¿ä½¿ç”¨ã•ã‚Œã€ä½œæˆã•ã‚Œã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ ã®ãƒ‡ãƒ¼ã‚¿é ˜åŸŸã¯ã“ã®å¢ƒç•Œã«ã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆã•ã‚Œã¾ã™ã€‚
          CTRL_TRIMä¸å¿…è¦ã‚»ã‚¯ã‚¿ã®é€šçŸ¥ã€‚buffã®æŒ‡ã™DWORDåž‹é…列ã«ã¯ä¸å¿…è¦ã«ãªã£ãŸé ˜åŸŸ {開始セクタ,終了セクタ} を指定ã—ã¦å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚TRIM機能ãŒæœ‰åŠ¹(_USE_TRIM == 1)ã§ã€ã‚¯ãƒ©ã‚¹ã‚¿ãŒè§£æ”¾ã•ã‚Œã‚‹ã¨ãã€ãŠã‚ˆã³ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆæ™‚ã«å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã€ATAコマンド セットã®Trimコマンドã¨ç­‰ä¾¡ã§ã€ã“ã®æ©Ÿèƒ½ã‚’サãƒãƒ¼ãƒˆã—ãªã„デãƒã‚¤ã‚¹ã¯ä½•ã‚‚ã™ã‚‹å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“。ã¾ãŸã€æˆ»ã‚Šå€¤ã¯ãƒã‚§ãƒƒã‚¯ã•ã‚Œãšã€çµæžœã«ã‚ˆã£ã¦FatFsã®å‹•ä½œãŒå½±éŸ¿ã‚’å—ã‘ã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。
          @@ -68,7 +68,7 @@ DRESULT disk_ioctl ( コマンド解説 CTRL_FORMATメディアã®ç‰©ç†ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚’è¡Œã„ã¾ã™ã€‚buffã¯NULLã§ãªã„ã¨ãã€é€²è¡Œè¡¨ç¤ºã®ãŸã‚ã®ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’示ã—ã¾ã™ã€‚ CTRL_POWER_IDLEデãƒã‚¤ã‚¹ã‚’アイドル状態ã«ã—ã¾ã™ã€‚通常ã®èª­ã¿æ›¸ãè¦æ±‚ã§ã‚¢ã‚¯ãƒ†ã‚£ãƒ–状態ã«æˆ»ã‚‹ãªã‚‰ã€STA_NOINITフラグをセットã™ã‚‹å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“。 -CTRL_POWER_OFFデãƒã‚¤ã‚¹ã‚’シャットダウン状態ã«ã—ã¾ã™ã€‚STA_NOINITã¯ã‚»ãƒƒãƒˆã•ã‚Œã¾ã™ã€‚デãƒã‚¤ã‚¹ã¯disk_initialize()ã§ã‚¢ã‚¯ãƒ†ã‚£ãƒ–状態ã«æˆ»ã‚Šã¾ã™ã€‚ +CTRL_POWER_OFFデãƒã‚¤ã‚¹ã‚’シャットダウン状態ã«ã—ã¾ã™ã€‚STA_NOINITã¯ã‚»ãƒƒãƒˆã•ã‚Œã¾ã™ã€‚デãƒã‚¤ã‚¹ã¯disk_initialize関数ã§ã‚¢ã‚¯ãƒ†ã‚£ãƒ–状態ã«æˆ»ã‚Šã¾ã™ã€‚ CTRL_LOCKユーザã«ã‚ˆã‚‹ãƒ¡ãƒ‡ã‚£ã‚¢ã®å–り出ã—ã‚’ç¦æ­¢ã—ã¾ã™ã€‚ CTRL_UNLOCKユーザã«ã‚ˆã‚‹ãƒ¡ãƒ‡ã‚£ã‚¢ã®å–り出ã—を許å¯ã—ã¾ã™ã€‚ CTRL_EJECTメディアを排出ã—ã¾ã™ã€‚完了後ã€STA_NOINITã¨STA_NODISKフラグã¯ã‚»ãƒƒãƒˆã•ã‚Œã¾ã™ã€‚ diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/dread.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/dread.html index 2dac64e2..24991dbf 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/dread.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/dread.html @@ -28,13 +28,13 @@ DRESULT disk_read (

          引数

          pdrv
          -
          対象ã®ãƒ‡ãƒã‚¤ã‚¹ã‚’示ã™ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·(0-9)ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚シングル ドライブ システムã§ã¯ã€å¸¸ã«0ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚
          +
          対象ã®ãƒ‡ãƒã‚¤ã‚¹ã‚’識別ã™ã‚‹ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·(0-9)ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚シングル ドライブ システムã§ã¯ã€å¸¸ã«0ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚
          buff
          ストレージ デãƒã‚¤ã‚¹ã‹ã‚‰èª­ã¿å‡ºã—ãŸãƒ‡ãƒ¼ã‚¿ã‚’æ ¼ç´ã™ã‚‹ãƒã‚¤ãƒˆé…列ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚
          sector
          読ã¿å‡ºã—を開始ã™ã‚‹ã‚»ã‚¯ã‚¿ç•ªå·ã€‚32ビットLBAã§æŒ‡å®šã•ã‚Œã¾ã™ã€‚
          count
          -
          読ã¿å‡ºã™ã‚»ã‚¯ã‚¿æ•°(1~128)。
          +
          読ã¿å‡ºã™ã‚»ã‚¯ã‚¿æ•°ãŒ1~128ã®ç¯„囲ã§æŒ‡å®šã•ã‚Œã¾ã™ã€‚
          @@ -49,19 +49,19 @@ DRESULT disk_read (
          RES_PARERR
          パラメータãŒä¸æ­£ã€‚
          RES_NOTRDY
          -
          ドライブãŒå‹•ä½œå¯èƒ½çŠ¶æ…‹ã§ã¯ãªã„(åˆæœŸåŒ–ã•ã‚Œã¦ã„ãªã„)。
          +
          ストレージ デãƒã‚¤ã‚¹ãŒå‹•ä½œå¯èƒ½çŠ¶æ…‹ã§ã¯ãªã„(åˆæœŸåŒ–ã•ã‚Œã¦ã„ãªã„)。

          解説

          -

          ストレージ デãƒã‚¤ã‚¹ã«å¯¾ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ã®èª­ã¿æ›¸ãã¯ã€ã‚»ã‚¯ã‚¿å˜ä½ã§è¡Œã‚ã‚Œã¾ã™ã€‚FatFsã§ã¯512~4096ãƒã‚¤ãƒˆã®ã‚»ã‚¯ã‚¿ サイズをサãƒãƒ¼ãƒˆã—ã¾ã™ã€‚固定セクタ サイズ構æˆ(_MIN_SS == MAX_SS)ã®ã¨ãã¯ã€æš—黙的ã«ãã®ã‚»ã‚¯ã‚¿ サイズã§å‹•ä½œã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。å¯å¤‰ã‚»ã‚¯ã‚¿ サイズ構æˆ(_MIN_SS < MAX_SS)

          ã®ã¨ãã¯ã€åˆæœŸåŒ–後disk_ioctl()ã§ã‚»ã‚¯ã‚¿ サイズをå•ã„åˆã‚ã›ã¦ãã‚‹ã®ã§ã€ãã‚Œã«å¯¾ã—ã¦æ­£ã—ã„値を返ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ +

          ストレージ デãƒã‚¤ã‚¹ã«å¯¾ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ã®èª­ã¿æ›¸ãã¯ã€ã‚»ã‚¯ã‚¿å˜ä½ã§è¡Œã‚ã‚Œã¾ã™ã€‚FatFsã§ã¯512~4096ãƒã‚¤ãƒˆã®ã‚»ã‚¯ã‚¿ サイズをサãƒãƒ¼ãƒˆã—ã¾ã™ã€‚固定セクタ サイズ構æˆ(_MIN_SS == MAX_SS)ã®ã¨ãã¯ã€æš—黙的ã«ãã®ã‚»ã‚¯ã‚¿ サイズã§å‹•ä½œã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。å¯å¤‰ã‚»ã‚¯ã‚¿ サイズ構æˆ(_MIN_SS < MAX_SS)ã®ã¨ãã¯ã€disk_initialize関数ã«ç¶šã„ã¦disk_ioctl関数ã§ã‚»ã‚¯ã‚¿ サイズをå•ã„åˆã‚ã›ã¦ãã‚‹ã®ã§ã€ãã‚Œã«å¯¾ã—ã¦æ­£ã—ã„値を返ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

          buffã¯BYTEåž‹ãªã®ã§ã€æŒ‡å®šã•ã‚Œã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯å¸¸ã«ãƒ¯ãƒ¼ãƒ‰ アライメントã•ã‚Œã¦ã„ã‚‹ã¨ã¯é™ã‚Šã¾ã›ã‚“。éžã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆ アドレスã¸ã®è»¢é€ã¯ã€ç›´æŽ¥è»¢é€ã«ãŠã„ã¦ç™ºç”Ÿã™ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ã‚‚ã—ã‚‚ã€ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ä¸Šã®åˆ¶ç´„ã§ãã®ã‚ˆã†ãªè»¢é€ãŒä¸å¯èƒ½ãªã¨ãã¯ã€ã“ã®é–¢æ•°å†…ã§äºŒæ®µè»¢é€ã™ã‚‹ãªã©ã—ã¦è§£æ±ºã™ã‚‹ã‹ã€ã¾ãŸã¯åˆ¥ã®æ–¹æ³•ã§å¯¾å¿œã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。次ã«ã„ãã¤ã‹ã®å¯¾å¿œæ–¹æ³•ã‚’示ã—ã¾ã™(ã„ãšã‚Œã‹ä¸€ã¤ã§OK)。

          • ã“ã®é–¢æ•°å†…ã§è§£æ±ºã™ã‚‹ - 推奨
          • -
          • f_read()ã«ãŠã„ã¦ã€ã‚»ã‚¯ã‚¿å…¨ä½“ã‚’å«ã‚€è»¢é€ã‚’é¿ã‘ã‚‹ - 直接転é€ãŒç™ºç”Ÿã—ãªã„
          • -
          • f_read(fp, buff, btr, &br)ã«ãŠã„ã¦ã€(((UINT)buff & 3) == (f_tell(fp) & 3))を満足ã•ã›ã‚‹ - buffã®ãƒ¯ãƒ¼ãƒ‰ アライメントãŒä¿è¨¼ã•ã‚Œã‚‹
          • +
          • å…¨ã¦ã®f_read()ã«ãŠã„ã¦ã€ã‚»ã‚¯ã‚¿å…¨ä½“ã‚’å«ã‚€è»¢é€ã‚’é¿ã‘ã‚‹ - 直接転é€ãŒç™ºç”Ÿã—ãªã„
          • +
          • f_read(fp, data, btr, &br)ã«ãŠã„ã¦ã€(((UINT)data & 3) == (f_tell(fp) & 3))を満足ã•ã›ã‚‹ - 直接転é€ã§ã®buffã®ãƒ¯ãƒ¼ãƒ‰ アライメントãŒä¿è¨¼ã•ã‚Œã‚‹

          一般的ã«ã€è¤‡æ•°ã‚»ã‚¯ã‚¿ã®è»¢é€è¦æ±‚ã¯ã€ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ デãƒã‚¤ã‚¹ã«å¯¾ã—ã¦å¯èƒ½ãªé™ã‚Šãƒžãƒ«ãƒ セクタ転é€ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。複数ã®ã‚·ãƒ³ã‚°ãƒ« セクタ読ã¿å‡ºã—ã«åˆ†è§£ã•ã‚ŒãŸå ´åˆã€ã‚¹ãƒ«ãƒ¼ãƒ—ットãŒä½Žä¸‹ã™ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/dstat.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/dstat.html index 6a309446..f965649f 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/dstat.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/dstat.html @@ -35,7 +35,7 @@ DSTATUS disk_status (

          ç¾åœ¨ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ デãƒã‚¤ã‚¹ã®çŠ¶æ…‹ã‚’次ã®ãƒ•ãƒ©ã‚°ã®çµ„ã¿åˆã‚ã›å€¤ã§è¿”ã—ã¾ã™ã€‚

          STA_NOINIT
          -
          デãƒã‚¤ã‚¹ãŒåˆæœŸåŒ–ã•ã‚Œã¦ã„ãªã„ã“ã¨ã‚’示ã™ãƒ•ãƒ©ã‚°ã€‚システム リセットやメディアã®å–り外ã—ç­‰ã§ã‚»ãƒƒãƒˆã•ã‚Œã€disk_initialize()ã®æ­£å¸¸çµ‚了ã§ã‚¯ãƒªã‚¢ã€å¤±æ•—ã§ã‚»ãƒƒãƒˆã•ã‚Œã¾ã™ã€‚メディア交æ›ã¯éžåŒæœŸã«ç™ºç”Ÿã™ã‚‹ã‚¤ãƒ™ãƒ³ãƒˆãªã®ã§ã€éŽåŽ»ã«ãƒ¡ãƒ‡ã‚£ã‚¢äº¤æ›ãŒã‚ã£ãŸå ´åˆã‚‚ã“ã®ãƒ•ãƒ©ã‚°ã«å映ã•ã›ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚FatFsモジュールã¯ã€ã“ã®ãƒ•ãƒ©ã‚°ã‚’å‚ç…§ã—ã¦ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œãŒå¿…è¦ã‹ã©ã†ã‹ã‚’判断ã—ã¾ã™ã€‚
          +
          デãƒã‚¤ã‚¹ãŒåˆæœŸåŒ–ã•ã‚Œã¦ã„ãªã„ã“ã¨ã‚’示ã™ãƒ•ãƒ©ã‚°ã€‚システム リセットやメディアã®å–り外ã—ç­‰ã§ã‚»ãƒƒãƒˆã•ã‚Œã€disk_initialize関数ã®æ­£å¸¸çµ‚了ã§ã‚¯ãƒªã‚¢ã€å¤±æ•—ã§ã‚»ãƒƒãƒˆã•ã‚Œã¾ã™ã€‚メディア交æ›ã¯éžåŒæœŸã«ç™ºç”Ÿã™ã‚‹ã‚¤ãƒ™ãƒ³ãƒˆãªã®ã§ã€éŽåŽ»ã«ãƒ¡ãƒ‡ã‚£ã‚¢äº¤æ›ãŒã‚ã£ãŸå ´åˆã‚‚ã“ã®ãƒ•ãƒ©ã‚°ã«å映ã•ã›ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚FatFsモジュールã¯ã€ã“ã®ãƒ•ãƒ©ã‚°ã‚’å‚ç…§ã—ã¦ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œãŒå¿…è¦ã‹ã©ã†ã‹ã‚’判断ã—ã¾ã™ã€‚
          STA_NODISK
          メディアãŒå­˜åœ¨ã—ãªã„ã“ã¨ã‚’示ã™ãƒ•ãƒ©ã‚°ã€‚メディアãŒå–り外ã•ã‚Œã¦ã„ã‚‹é–“ã¯ã‚»ãƒƒãƒˆã•ã‚Œã€ã‚»ãƒƒãƒˆã•ã‚Œã¦ã„ã‚‹é–“ã¯ã‚¯ãƒªã‚¢ã•ã‚Œã¾ã™ã€‚固定ディスクã§ã¯å¸¸ã«ã‚¯ãƒªã‚¢ã—ã¾ã™ã€‚ãªãŠã€ã“ã®ãƒ•ãƒ©ã‚°ã¯FatFsモジュールã§ã¯å‚ç…§ã•ã‚Œã¾ã›ã‚“。
          STA_PROTECT
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/dwrite.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/dwrite.html index 15d4ead4..020d5f1c 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/dwrite.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/dwrite.html @@ -28,13 +28,13 @@ DRESULT disk_write (

          引数

          pdrv
          -
          対象ã®ãƒ‡ãƒã‚¤ã‚¹ã‚’示ã™ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·(0-9)ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚
          +
          対象ã®ãƒ‡ãƒã‚¤ã‚¹ã‚’識別ã™ã‚‹ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·(0-9)ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚
          buff
          ストレージ デãƒã‚¤ã‚¹ã«æ›¸ã込むセクタ データãŒæ ¼ç´ã•ã‚ŒãŸãƒã‚¤ãƒˆé…列ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚ãƒã‚¤ãƒˆæ•°ã¯ã€ã‚»ã‚¯ã‚¿ サイズ*countã¨ãªã‚Šã¾ã™ã€‚
          sector
          書ãè¾¼ã¿ã‚’開始ã™ã‚‹ã‚»ã‚¯ã‚¿ç•ªå·ã€‚32ビットLBAã§æŒ‡å®šã•ã‚Œã¾ã™ã€‚
          count
          -
          書ã込むセクタ数(1~128)。
          +
          書ã込むセクタ数ãŒ1~128ã®ç¯„囲ã§æŒ‡å®šã•ã‚Œã¾ã™ã€‚
          @@ -51,16 +51,16 @@ DRESULT disk_write (
          RES_PARERR
          パラメータãŒä¸æ­£ã€‚
          RES_NOTRDY
          -
          デãƒã‚¤ã‚¹ãŒå‹•ä½œå¯èƒ½çŠ¶æ…‹ã§ã¯ãªã„(åˆæœŸåŒ–ã•ã‚Œã¦ã„ãªã„)。
          +
          ストレージ デãƒã‚¤ã‚¹ãŒå‹•ä½œå¯èƒ½çŠ¶æ…‹ã§ã¯ãªã„(åˆæœŸåŒ–ã•ã‚Œã¦ã„ãªã„)。

          解説

          -

          buffã«æŒ‡å®šã•ã‚Œã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯å¸¸ã«ãƒ¯ãƒ¼ãƒ‰ アライメントã•ã‚Œã¦ã„ã‚‹ã¨ã¯é™ã‚Šã¾ã›ã‚“。詳細ã¯ã€disk_read()ã®è§£èª¬ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

          +

          buffã«æŒ‡å®šã•ã‚Œã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯å¸¸ã«ãƒ¯ãƒ¼ãƒ‰ アライメントã•ã‚Œã¦ã„ã‚‹ã¨ã¯é™ã‚Šã¾ã›ã‚“。ã“ã‚Œã«ã¤ã„ã¦ã¯ã€disk_read関数ã®è§£èª¬ã‚’å‚ç…§ã—ã¦ãã ã•ã„。

          一般的ã«ã€è¤‡æ•°ã‚»ã‚¯ã‚¿ã®è»¢é€è¦æ±‚ã¯ã€ãƒ‡ãƒã‚¤ã‚¹ã«å¯¾ã—ã¦å¯èƒ½ãªé™ã‚Šãƒžãƒ«ãƒ セクタ転é€ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。複数ã®ã‚·ãƒ³ã‚°ãƒ« セクタ書ãè¾¼ã¿ã«åˆ†è§£ã•ã‚ŒãŸå ´åˆã€ã‚¹ãƒ«ãƒ¼ãƒ—ットãŒè‘—ã—ã低下ã™ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚

          -

          FatFsã¯ãƒ‡ã‚£ã‚¹ã‚¯é–¢æ•°ãŒé…延書ãè¾¼ã¿æ©Ÿèƒ½ã‚’æŒã¤ã“ã¨ã‚‚想定ã—ã¦ã„ã¾ã™ã€‚ã“ã®é–¢æ•°ã‹ã‚‰æˆ»ã‚‹ã¨ãã€ãƒ‡ãƒã‚¤ã‚¹ãŒæ›¸ãè¾¼ã¿ä¸­ã¨ã‹ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã«æ›¸ãè¾¼ã¾ã‚ŒãŸã ã‘ãªã©ã€å¿…ãšã—もメディアã¸ã®æ›¸ãè¾¼ã¿ãŒå®Œäº†ã—ã¦ã„ã‚‹å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“。ãŸã ã—ã€buffã®ãƒ‡ãƒ¼ã‚¿ã¯ã€ã“ã®é–¢æ•°ã‹ã‚‰æˆ»ã‚‹ã¨ç„¡åŠ¹ã¨ãªã‚Šã¾ã™ã€‚書ãè¾¼ã¿å®Œäº†ã®è¦æ±‚ã¯ã€disk_ioctl()ã®CTRL_SYNCコマンドã«ã‚ˆã£ã¦è¡Œã‚ã‚Œã¾ã™ã€‚ã“ã®ã‚ˆã†ãªé…延書ãè¾¼ã¿æ©Ÿèƒ½ãŒå®Ÿè£…ã•ã‚ŒãŸå ´åˆã€ã‚¹ãƒ«ãƒ¼ãƒ—ットをã•ã‚‰ã«å‘上ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

          +

          FatFsã¯ãƒ‡ã‚£ã‚¹ã‚¯åˆ¶å¾¡ãƒ¬ã‚¤ãƒ¤ãŒé…延書ãè¾¼ã¿æ©Ÿèƒ½ã‚’æŒã¤ã“ã¨ã‚‚想定ã—ã¦ã„ã¾ã™ã€‚ã“ã®é–¢æ•°ã‹ã‚‰æˆ»ã‚‹ã¨ãã€ãƒ‡ãƒã‚¤ã‚¹ãŒæ›¸ãè¾¼ã¿ã‚’実行中ã ã£ãŸã‚Šå˜ã«ãƒ©ã‚¤ãƒˆãƒãƒƒã‚¯ キャッシュã«æ›¸ãè¾¼ã¾ã‚ŒãŸã ã‘ãªã©ã€å¿…ãšã—もメディアã¸ã®æ›¸ãè¾¼ã¿ãŒå®Œäº†ã—ã¦ã„ã‚‹å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“。ãŸã ã—ã€buffã®ãƒ‡ãƒ¼ã‚¿ã¯ã€ã“ã®é–¢æ•°ã‹ã‚‰æˆ»ã‚‹ã¨ç„¡åŠ¹ã¨ãªã‚Šã¾ã™ã€‚書ãè¾¼ã¿å®Œäº†ã®è¦æ±‚ã¯ã€disk_ioctl関数ã®CTRL_SYNCコマンドã«ã‚ˆã£ã¦è¡Œã‚ã‚Œã¾ã™ã€‚ã“ã®ã‚ˆã†ãªé…延書ãè¾¼ã¿æ©Ÿèƒ½ãŒå®Ÿè£…ã•ã‚ŒãŸå ´åˆã€æ›¸ãè¾¼ã¿ã‚¹ãƒ«ãƒ¼ãƒ—ットをå‘上ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

          アプリケーションã‹ã‚‰ã¯ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¦ã¯ãªã‚Šã¾ã›ã‚“。ã•ã‚‚ãªã„ã¨ã€FATボリュームãŒç ´å£Šã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/eof.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/eof.html index b9098b35..7b38141a 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/eof.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/eof.html @@ -39,7 +39,7 @@ int f_eof (

          解説

          -

          f_eof関数ã¯ã€ç¾ãƒªãƒ“ジョンã§ã¯ãƒžã‚¯ãƒ­ã¨ã—ã¦å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã™ã€‚

          +

          ã“ã®é–¢æ•°ã¯ã€ç¾ãƒªãƒ“ジョンã§ã¯ãƒžã‚¯ãƒ­ã¨ã—ã¦å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã™ã€‚ファイル オブジェクトã®æ­£å½“性ãƒã‚§ãƒƒã‚¯ã‚„排他制御ã¯è¡Œã„ã¾ã›ã‚“。

           #define f_eof(fp) ((int)((fp)->fptr == (fp)->fsize))
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/error.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/error.html index bb01d800..19796862 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/error.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/error.html @@ -39,7 +39,7 @@ int f_error (

          解説

          -

          f_error関数ã¯ã€ç¾ãƒªãƒ“ジョンã§ã¯ãƒžã‚¯ãƒ­ã¨ã—ã¦å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã™ã€‚

          +

          ã“ã®é–¢æ•°ã¯ã€ç¾ãƒªãƒ“ジョンã§ã¯ãƒžã‚¯ãƒ­ã¨ã—ã¦å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã™ã€‚ファイル オブジェクトã®æ­£å½“性ãƒã‚§ãƒƒã‚¯ã‚„排他制御ã¯è¡Œã„ã¾ã›ã‚“。

           #define f_error(fp) ((fp)->err)
           
          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/fattime.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/fattime.html index c8bbed7d..ef694ca4 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/fattime.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/fattime.html @@ -48,7 +48,7 @@ DWORD get_fattime (void);

          対応情報

          -

          リード オンリー構æˆ(_FS_READONLY == 1)ã§ã¯ã“ã®é–¢æ•°ã¯å¿…è¦ã¨ã•ã‚Œã¾ã›ã‚“。

          +

          リード オンリー構æˆ(_FS_READONLY == 1)ã¾ãŸã¯ã€éžRTCサãƒãƒ¼ãƒˆæ§‹æˆ(_RTC_NOUSE == 1)ã§ã¯ã“ã®é–¢æ•°ã¯å¿…è¦ã¨ã•ã‚Œã¾ã›ã‚“。

          diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/filename.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/filename.html index 524566cc..72c98487 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/filename.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/filename.html @@ -11,16 +11,16 @@

          パスåã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆ

          -
          +

          ファイル ディレクトリå

          -

          FatFsモジュールã§ã®ãƒ•ã‚¡ã‚¤ãƒ«ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€ãƒ‰ãƒ©ã‚¤ãƒ–ã®æŒ‡å®šæ–¹æ³•ã¯DOS/Windows APIã¨ã»ã¼åŒã˜ã§ã™ã€‚パスåã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã¯æ¬¡ã®é€šã‚Šã§ã™ã€‚

          +

          FatFsモジュールã§ã¯ã€ãƒ‘スåã«ã‚ˆã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€ãƒ‰ãƒ©ã‚¤ãƒ–ã®æŒ‡å®šæ–¹æ³•ã¯DOS/Windows APIã¨ã»ã¼åŒã˜ã§ã™ã€‚パスåã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã¯æ¬¡ã®é€šã‚Šã§ã™ã€‚

          "[è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·:][/]ディレクトリå/ファイルå"
          -

          FatFsモジュールã¯é•·ã„ファイルå(LFN)ãŠã‚ˆã³8.3å½¢å¼ãƒ•ã‚¡ã‚¤ãƒ«å(SFN)ã«å¯¾å¿œã—ã¦ã„ã¾ã™ã€‚LFNã¯ã€(_USE_LFN > 0)ã®ã¨ã使用å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ディレクトリ セパレータã«ã¯DOS/Windows APIã¨åŒã˜ã'/'ã¨'\'を使用ã—ã¾ã™ã€‚連続ã—ãŸã‚»ãƒ‘レータã¯ç„¡è¦–ã•ã‚Œ1個ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚唯一ã®é•ã„ã¯ã€è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®æŒ‡å®šã ã‘ã§ã™ã€‚è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·ã¯ã€'0'~'9'ã®ä¸€æ–‡å­—ã®æ•°å­—ã¨ã‚³ãƒ­ãƒ³ã§æŒ‡å®šã—ã€çœç•¥ã—ãŸå ´åˆã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆ ドライブ(0ã¾ãŸã¯ã‚«ãƒ¬ãƒ³ãƒˆ ドライブ)ãŒé¸æŠžã•ã‚Œã¾ã™ã€‚

          +

          FatFsモジュールã¯é•·ã„ファイルå(LFN)ãŠã‚ˆã³8.3å½¢å¼ãƒ•ã‚¡ã‚¤ãƒ«å(SFN)ã«å¯¾å¿œã—ã¦ã„ã¾ã™ã€‚LFNã¯ã€(_USE_LFN > 0)ã®ã¨ã使用å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ディレクトリ セパレータã«ã¯DOS/Windows APIã¨åŒã˜ã'/'ã¨'\'を使用ã—ã¾ã™ã€‚連続ã—ãŸã‚»ãƒ‘レータã¯ç„¡è¦–ã•ã‚Œ1個ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚唯一ã®é•ã„ã¯ã€è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®æŒ‡å®šã ã‘ã§ã™ã€‚è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·ã¯ã€'0'~'9'ã®ä¸€æ–‡å­—ã®æ•°å­—ã¨ã‚³ãƒ­ãƒ³ã§æŒ‡å®šã—ã€çœç•¥ã—ãŸå ´åˆã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆ ドライブ(0ã¾ãŸã¯ã‚«ãƒ¬ãƒ³ãƒˆ ドライブ)ãŒé¸æŠžã•ã‚Œã¾ã™ã€‚

          ヌル文字や制御文字('\0'~'\x1F')ã¯ã€ãƒ‘スåã®çµ‚端ã¨ã—ã¦èªè­˜ã•ã‚Œã¾ã™ã€‚パスåã«å…ˆè¡Œã‚ã‚‹ã„ã¯ä¸­ã«å«ã¾ã‚Œã‚‹ã‚¹ãƒšãƒ¼ã‚¹ã¯ã€LFN構æˆã§ã¯åå‰ã®ä¸€éƒ¨ã¨ã—ã¦æœ‰åŠ¹ã§ã™ãŒã€éžLFN構æˆã§ã¯ã‚¹ãƒšãƒ¼ã‚¹ã¯ãƒ‘スåã®çµ‚端ã¨ã—ã¦èªè­˜ã•ã‚Œã¾ã™ã€‚

          -

          標準構æˆ(_FS_RPATH == 0)ã®ã¨ãã¯ã€å…¨ã¦ã®ã‚ªãƒ–ジェクトãŒãƒ«ãƒ¼ãƒˆ ディレクトリã‹ã‚‰è¾¿ã‚‹çµ¶å¯¾ãƒ‘スã§æŒ‡å®šã•ã‚Œã¾ã™ã€‚OS指å‘ãªã‚«ãƒ¬ãƒ³ãƒˆ ディレクトリã¨ã„ã†æ¦‚念ã¯ç„¡ãã€ã¾ãŸãƒ‰ãƒƒãƒˆ ディレクトリ("."ã‚„"..")ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。パスå先頭ã®ã‚»ãƒ‘レータã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚デフォルト ドライブ番å·ã¯å¸¸ã«0ã«ãªã‚Šã¾ã™ã€‚

          -

          相対パスを有効(_FS_RPATH == 1)ã«ã—ãŸã¨ãã¯ã€å…ˆè¡Œã™ã‚‹ã‚»ãƒ‘レータã®æœ‰ç„¡ã«ã‚ˆã£ã¦æ¤œç´¢é–‹å§‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒå¤‰ã‚ã‚Šã€ã‚»ãƒ‘レータãŒã‚ã‚‹å ´åˆã¯ãƒ«ãƒ¼ãƒˆ ディレクトリã‹ã‚‰ã€ç„¡ã„å ´åˆã¯f_chdir()ã§è¨­å®šã•ã‚Œã‚‹ã‚«ãƒ¬ãƒ³ãƒˆ ディレクトリã‹ã‚‰ã«ãªã‚Šã¾ã™ã€‚ã¾ãŸãƒ‘スåã«ãƒ‰ãƒƒãƒˆ ディレクトリãŒä½¿ç”¨ã§ãã¾ã™ã€‚デフォルト ドライブ番å·ã¯f_chdrive()ã§è¨­å®šã•ã‚ŒãŸå€¤ã¨ãªã‚Šã¾ã™ã€‚

          +

          標準構æˆ(_FS_RPATH == 0)ã®ã¨ãã¯ã€å…¨ã¦ã®ã‚ªãƒ–ジェクトãŒãƒ«ãƒ¼ãƒˆ ディレクトリã‹ã‚‰è¾¿ã‚‹çµ¶å¯¾ãƒ‘スã§æŒ‡å®šã•ã‚Œã¾ã™ã€‚OS指å‘ãªã‚«ãƒ¬ãƒ³ãƒˆ ディレクトリã¨ã„ã†æ¦‚念ã¯ç„¡ãã€ã¾ãŸãƒ‰ãƒƒãƒˆ ディレクトリ("."ã‚„"..")ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。パスå先頭ã®ã‚»ãƒ‘レータã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚デフォルト ドライブ番å·ã¯å¸¸ã«0ã«ãªã‚Šã¾ã™ã€‚

          +

          相対パスを有効(_FS_RPATH >= 1)ã«ã—ãŸã¨ãã¯ã€å…ˆè¡Œã™ã‚‹ã‚»ãƒ‘レータã®æœ‰ç„¡ã«ã‚ˆã£ã¦æ¤œç´¢é–‹å§‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒå¤‰ã‚ã‚Šã€ã‚»ãƒ‘レータãŒã‚ã‚‹å ´åˆã¯ãƒ«ãƒ¼ãƒˆ ディレクトリã‹ã‚‰ã€ç„¡ã„å ´åˆã¯f_chdir関数ã§è¨­å®šã•ã‚Œã‚‹ã‚«ãƒ¬ãƒ³ãƒˆ ディレクトリã‹ã‚‰ã«ãªã‚Šã¾ã™ã€‚ã¾ãŸãƒ‘スåã«ãƒ‰ãƒƒãƒˆ ディレクトリãŒä½¿ç”¨ã§ãã¾ã™ã€‚デフォルト ドライブ番å·ã¯f_chdrive関数ã§è¨­å®šã•ã‚ŒãŸå€¤ã¨ãªã‚Šã¾ã™ã€‚

          - + @@ -33,13 +33,19 @@
          パスåã®ä¾‹_FS_RPATH == 0_FS_RPATH == 1
          パスåã®ä¾‹_FS_RPATH == 0_FS_RPATH >= 1
          file.txtドライブ0ã®ãƒ«ãƒ¼ãƒˆ ディレクトリ下ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚«ãƒ¬ãƒ³ãƒˆ ドライブã®ã‚«ãƒ¬ãƒ³ãƒˆ ディレクトリ下ã®ãƒ•ã‚¡ã‚¤ãƒ«
          /file.txtドライブ0ã®ãƒ«ãƒ¼ãƒˆ ディレクトリ下ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚«ãƒ¬ãƒ³ãƒˆ ドライブã®ãƒ«ãƒ¼ãƒˆ ディレクトリ下ã®ãƒ•ã‚¡ã‚¤ãƒ«
          ドライブ0ã®ãƒ«ãƒ¼ãƒˆ ディレクトリカレント ドライブã®ã‚«ãƒ¬ãƒ³ãƒˆ ディレクトリ
          dir1/..無効カレント ディレクトリ
          /..無効ルート ディレクトリ(ãã®ä¸Šã¯è¾¿ã‚Œãªã„)
          -

          ã¾ãŸã€_STR_VOLUME_IDオプションを有効ã«ã™ã‚‹ã“ã¨ã§ãƒ‰ãƒ©ã‚¤ãƒ–番å·ã®è­˜åˆ¥ã«ã¯æ•°å­—ã®ã»ã‹ã€"sd:file1.txt"ã‚„"ram:swapfile.dat"ã®ã‚ˆã†ã«ã€ä»»æ„ã®æ–‡å­—列を使用ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚

          +

          ã¾ãŸã€_STR_VOLUME_IDオプションを有効ã«ã™ã‚‹ã“ã¨ã§ãƒ‰ãƒ©ã‚¤ãƒ–番å·ã®è­˜åˆ¥ã«ã¯æ•°å­—ã®ã»ã‹ã€"sd:file1.txt"ã‚„"ram:swapfile.dat"ã®ã‚ˆã†ã«ã€ä»»æ„ã®æ–‡å­—列を使用ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚

          -


          -
          +
          +

          使用å¯èƒ½ãªæ–‡å­—ã¨å¤§æ–‡å­—å°æ–‡å­—ã®è­˜åˆ¥

          +

          FATファイル システムã§ãƒ•ã‚¡ã‚¤ãƒ«åã«ä½¿ç”¨å¯èƒ½ãªæ–‡å­—ã¯ã€0~9 A~Z ! # $ % & ' ( ) - @ ^ _ ` { } ~ãŠã‚ˆã³æ‹¡å¼µæ–‡å­—(\x80~\xFF)ã¨ãªã£ã¦ã„ã¾ã™ã€‚LFNæ‹¡å¼µã§ã¯ã“れらã«åŠ ãˆã€+ , ; = [ ]ãŠã‚ˆã³ã‚¹ãƒšãƒ¼ã‚¹ãŒä½¿ç”¨å¯èƒ½ã«ãªã‚Šã€ã‚¹ãƒšãƒ¼ã‚¹ã¨ãƒ”リオドã¯ãƒ•ã‚¡ã‚¤ãƒ«åã®æœ«å°¾ã‚’除ãä»»æ„ã®ä½ç½®ã«æŒ¿å…¥ã§ãã¾ã™ã€‚

          +

          FATファイル システムã§ã¯ã€ãƒ‘スåã«ã¤ã„ã¦ã‚±ãƒ¼ã‚¹ インセンシティブã§ã™ã€‚ãŸã¨ãˆã°ã€file.txt, File.Txt, FILE.TXTã®3ã¤ã®åå‰ã¯åŒã˜ç‰©ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã€ASCII文字ã ã‘ã§ãªã拡張文字ã«ã¤ã„ã¦ã‚‚é©ç”¨ã•ã‚Œã¾ã™ã€‚ファイルãŒä½œæˆã•ã‚Œã‚‹éš›ã€SFNエントリã«ã¯å…¨ã¦å¤§æ–‡å­—ã«å¤‰æ›ã•ã‚ŒãŸåå‰ãŒè¨˜éŒ²ã•ã‚Œã¾ã™ã€‚LFN対応システムã§ã¯ã€LFNエントリã«ã¯å¤§æ–‡å­—変æ›ã•ã‚Œãªã„åå‰ãŒè¨˜éŒ²ã•ã‚Œã¾ã™ã€‚

          +

          å¤ã„日本語MS-DOSã§ã¯æ‹¡å¼µæ–‡å­—(ã„ã‚ゆる全角文字)ã«ã¤ã„ã¦ã¯ã‚±ãƒ¼ã‚¹ センシティブã§ã—ãŸã€‚FatFsモジュールã§ã¯ã“ã‚Œã«ã—ãŸãŒã„ã€éžLFN構æˆã§æ–‡å­—コードã«DBCSãŒé¸æŠžã•ã‚ŒãŸã¨ãã«é™ã‚Šã€æ‹¡å¼µæ–‡å­—ã«å¯¾ã—ã¦å¤§æ–‡å­—変æ›ã‚’è¡Œã‚ãšã«SFNエントリã«è¨˜éŒ²ãŠã‚ˆã³æ¤œç´¢ã•ã‚Œã¾ã™(日本語MSDOS仕様)。LFN構æˆã§ã¯æ‹¡å¼µæ–‡å­—ã«ã¤ã„ã¦ã‚‚大文字変æ›ã‚’è¡Œã„ã¾ã™(WindowsNT仕様)。ã“ã®ãŸã‚ã€éžLFN構æˆã§å…¨è§’å°æ–‡å­—ã‚’å«ã‚€åå‰ã§ãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã™ã‚‹ã¨ã€Windowsã§ãã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ã‘ãªããªã‚‹ãªã©ã®äº’æ›æ€§å•é¡Œã‚’èµ·ã“ã™ã®ã§ã€ãれらã®ã‚·ã‚¹ãƒ†ãƒ ã§ç›¸äº’利用ã™ã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ ä¸Šã§ã¯DBCS拡張文字ã®ä½¿ç”¨ã¯é¿ã‘ã‚‹ã¹ãã§ã™ã€‚

          +
          + +

          Unicode API

          -

          ファイル関数ã®å…¥å‡ºåŠ›ã®ã†ã¡ãƒ•ã‚¡ã‚¤ãƒ«åやパスåを指定ã™ã‚‹å¼•æ•°ã®åž‹ã¯ã€TCHARã§å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ãŒã€ã“ã‚Œã¯é€šå¸¸ã¯charã®ã‚¨ãƒªã‚¢ã‚¹ã«ãªã£ã¦ã„ã¾ã™ã€‚ãã—ã¦ã€_CODE_PAGEã§æŒ‡å®šã•ã‚Œã‚‹ANSI/OEMコード(SBCSã¾ãŸã¯DBCS)ã®æ–‡å­—列ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚ファイルå入出力をUnicodeã¨ã™ã‚‹æ§‹æˆ(_LFN_UNICODE == 1)ã«ã—ãŸã¨ãã¯ã€TCHARã¯ãƒ¯ã‚¤ãƒ‰æ–‡å­—(WCHAR, unsigned short)ã«åˆ‡ã‚Šæ›¿ã‚ã‚Šã€ãƒ‘スåã®å…¥å‡ºåŠ›ã«Unicodeを使用ã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚ŠLFNè¦æ ¼ã«å®Œå…¨å¯¾å¿œã¨ãªã‚Šã€ANSI/OEMコードã«ãªã„文字(ãŸã¨ãˆã° âœâ˜ªâœ¡â˜¸â˜­ãªã©)も使用ã§ãã¾ã™ã€‚ã“ã®è¨­å®šã¯æ–‡å­—列入出力関数ã®ãƒ‡ãƒ¼ã‚¿åž‹ã¨ãƒ•ã‚¡ã‚¤ãƒ«ä¸Šã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã«ã‚‚影響を与ãˆã¾ã™ã€‚リテラル文字列を定義ã™ã‚‹ã¨ãã€æ¬¡ã«ç¤ºã™ã‚ˆã†ã«_T(s)ãŠã‚ˆã³_TEXT(s)マクロを使ã£ã¦ANSI/OEMã¨Unicodeを自動切り替ãˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

          +

          ファイル関数ã®å…¥å‡ºåŠ›ã®ã†ã¡ãƒ•ã‚¡ã‚¤ãƒ«åやパスåを指定ã™ã‚‹å¼•æ•°ã®åž‹ã¯ã€TCHARã§å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ãŒã€ã“ã‚Œã¯é€šå¸¸ã¯charã®ã‚¨ãƒªã‚¢ã‚¹ã«ãªã£ã¦ã„ã¾ã™ã€‚ãã—ã¦ã€_CODE_PAGEã§æŒ‡å®šã•ã‚Œã‚‹ANSI/OEMコード(SBCSã¾ãŸã¯DBCS)ã®æ–‡å­—列ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚ファイルå入出力をUnicodeã¨ã™ã‚‹æ§‹æˆ(_LFN_UNICODE == 1)ã«ã—ãŸã¨ãã¯ã€TCHARã¯ãƒ¯ã‚¤ãƒ‰æ–‡å­—(WCHAR, unsigned short)ã«åˆ‡ã‚Šæ›¿ã‚ã‚Šã€ãƒ‘スåã®å…¥å‡ºåŠ›ã«Unicodeを使用ã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚ŠLFNè¦æ ¼ã«å®Œå…¨å¯¾å¿œã¨ãªã‚Šã€ãƒ•ã‚¡ã‚¤ãƒ«åã¨ã—ã¦ANSI/OEMコードã«ãªã„文字(ãŸã¨ãˆã° âœâ˜ªâœ¡â˜¸â˜­ãªã©)も使用ã§ãã¾ã™ã€‚ã“ã®è¨­å®šã¯æ–‡å­—列入出力関数ã«ãŠã„ã¦ã¯ã€ãƒ‡ãƒ¼ã‚¿åž‹ã¨ãƒ•ã‚¡ã‚¤ãƒ«ä¸Šã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã«å½±éŸ¿ã‚’与ãˆã¾ã™ã€‚リテラル文字列を定義ã™ã‚‹ã¨ãã€æ¬¡ã«ç¤ºã™ã‚ˆã†ã«_T(s)ãŠã‚ˆã³_TEXT(s)マクロを使ã£ã¦ANSI/OEMã¨Unicodeを自動切り替ãˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

            f_open(fp, "filename.txt", FA_READ);      /* ANSI/OEM専用コード */
            f_open(fp, L"filename.txt", FA_READ);     /* Unicode専用コード */
          @@ -47,11 +53,10 @@
           
          -


          -
          +

          ボリューム管ç†

          デフォルトã®æ§‹æˆã§ã¯ã€ãã‚Œãžã‚Œã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã¯åŒã˜ç•ªå·ã®ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«1:1ã§çµã³ã¤ã‘られã¦ã„ã¦ã€è‡ªå‹•æ¤œå‡ºæ©Ÿèƒ½ã«ã‚ˆã‚Šãã®ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã®ä¸€ã¤ã®FATボリュームãŒãƒžã‚¦ãƒ³ãƒˆã•ã‚Œã¾ã™ã€‚FATボリュームã®æ¤œå‡ºã¯ã€ã‚»ã‚¯ã‚¿0ã€ç¬¬ä¸€åŒºç”»ï½žç¬¬å››åŒºç”»ã®é †ã«è¡Œã‚ã‚Œã¾ã™ã€‚

          -

          _MULTI_PARTITIONã«1を指定ã™ã‚‹ã¨ã€ãã‚Œãžã‚Œã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«å¯¾ã—ã¦å€‹åˆ¥ã«ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·ã¨åŒºç”»ã‚’指定ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ã“ã®æ§‹æˆã§ã¯ã€è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã¨åŒºç”»ã®å¯¾å¿œã‚’解決ã™ã‚‹ãŸã‚ã®ãƒ†ãƒ¼ãƒ–ルを次ã«ç¤ºã™ã‚ˆã†ã«å®šç¾©ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

          +

          _MULTI_PARTITIONã«1を指定ã™ã‚‹ã¨ã€ãã‚Œãžã‚Œã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«å¯¾ã—ã¦å€‹åˆ¥ã«ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·ã¨åŒºç”»ã‚’指定ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ã“ã®æ§‹æˆã§ã¯ã€è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã¨åŒºç”»ã®å¯¾å¿œã‚’解決ã™ã‚‹ãŸã‚ã®ãƒ†ãƒ¼ãƒ–ルを次ã«ç¤ºã™ã‚ˆã†ã«å®šç¾©ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

           例:è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–0~2を物ç†ãƒ‰ãƒ©ã‚¤ãƒ–0(éžãƒªãƒ ãƒ¼ãƒãƒ–ル)ã®3ã¤ã®åŸºæœ¬åŒºç”»ã«å‰²ã‚Šå½“ã¦ã€
              è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–3を物ç†ãƒ‰ãƒ©ã‚¤ãƒ–1(リムーãƒãƒ–ル)ã«å‰²ã‚Šå½“ã¦ã‚‹å ´åˆã€‚
          @@ -72,5 +77,6 @@ PARTITION VolToPart[] = {
           
      +

      戻る

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/findfirst.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/findfirst.html new file mode 100644 index 00000000..b809908c --- /dev/null +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/findfirst.html @@ -0,0 +1,119 @@ + + + + + + + + +FatFs - f_findfirst + + + + +
      +

      f_findfirst

      +

      ディレクトリ内ã®ã‚ªãƒ–ジェクトã®æ¤œç´¢ã‚’開始ã—ã¾ã™ã€‚

      +
      +FRESULT f_findfirst (
      +  DIR* dp,              /* [OUT] ディレクトリ オブジェクト構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
      +  FILINFO* fno,         /* [OUT] ファイル情報構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
      +  const TCHAR* path,    /* [IN] ディレクトリåã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
      +  const TCHAR* pattern  /* [IN] マッムパターン文字列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
      +);
      +
      +
      + +
      +

      引数

      +
      +
      dp
      +
      空ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª オブジェクト構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
      +
      fno
      +
      最åˆã«ãƒžãƒƒãƒã—ãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªé …目を格ç´ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«æƒ…報構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
      +
      path
      +
      オープンã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒ‘スåを示ã™ãƒŒãƒ«æ–‡å­—'\0'終端ã®æ–‡å­—列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
      +
      pattern
      +
      検索ã™ã‚‹åå‰ã‚’示ã™ãƒŒãƒ«æ–‡å­—'\0'終端ã®æ–‡å­—列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚ã“ã®æ–‡å­—列ã¯ã€ç¶šãf_findnext関数ã§ã‚‚å‚ç…§ã•ã‚Œã‚‹ãŸã‚ã€ä¸€é€£ã®å‡¦ç†ãŒçµ‚了ã™ã‚‹ã¾ã§æœ‰åŠ¹ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。
      +
      +
      + + + + + +
      +

      解説

      +

      pathã§æŒ‡å®šã•ã‚Œã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é–‹ãã€ãã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªå†…ã®é …ç›®ã®æ¤œç´¢ã‚’開始ã—ã¾ã™ã€‚正常終了ã™ã‚‹ã¨ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª オブジェクト構造体ãŒä½œæˆã•ã‚Œã€æœ€åˆã«æ¤œç´¢å文字列ã«åå‰ãŒãƒžãƒƒãƒã—ãŸé …ç›®ã®æƒ…å ±ãŒfnoã®æŒ‡å®šã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«æƒ…報構造体ã«ã‚¹ãƒˆã‚¢ã•ã‚Œã¾ã™ã€‚åå‰ã®ãƒžãƒƒãƒã™ã‚‹é …ç›®ãŒè¦‹ã¤ã‹ã‚‰ãªã‹ã£ãŸå ´åˆã¯ã€fno->fname[]ã«ãƒŒãƒ«æ–‡å­—列ãŒè¿”ã•ã‚Œã¾ã™ã€‚ファイル情報構造体ã®ä½¿ã„æ–¹ã«ã¤ã„ã¦ã¯ã€f_readdir関数をå‚ç…§ã—ã¦ãã ã•ã„。

      +

      マッムパターン文字列ã¯ã€ãƒ¯ã‚¤ãƒ«ãƒ‰ã‚«ãƒ¼ãƒ‰æ–‡å­—(?ã¨*)ã‚’å«ã‚€ã“ã¨ãŒã§ãã¾ã™ã€‚?ã¯ä»»æ„ã®1文字ã«ã€*ã¯0文字以上ã®ä»»æ„ã®æ–‡å­—列ã«ãƒžãƒƒãƒã—ã¾ã™ã€‚LFN構æˆã§ã¯ã€SFNã¨LFN(ã‚ã‚Œã°)ã®ä¸¡æ–¹ã«å¯¾ã—ã¦ãƒ†ã‚¹ãƒˆã‚’è¡Œã„ã¾ã™ã€‚ç¾ãƒªãƒ“ジョンã§ã¯ãƒ‘ターン マッãƒãƒ³ã‚°ã«ãŠã„ã¦æ¬¡ã®ç‚¹ã§æ¨™æº–システムã¨ã¯ç•°ãªã‚‹å‹•ä½œã¨ãªã‚Šã¾ã™ã€‚

      +
        +
      • "*.*"ã¯æ‹¡å¼µå­ãªã—ã®åå‰ã«ãƒžãƒƒãƒã—ãªã„。(標準システムã§ã¯å…¨ã¦ã®åå‰ã«ãƒžãƒƒãƒ)
      • +
      • ピリオドã§çµ‚ã‚るパターンã¯ã€ã©ã®åå‰ã«ã‚‚マッãƒã—ãªã„。(標準システムã§ã¯æ‹¡å¼µå­ç„¡ã—ã®åå‰ã«ãƒžãƒƒãƒ)
      • +
      • DBCS拡張文字ã«ã¤ã„ã¦ã¯ã€LFN構æˆã§ã‚‚éžUnicode API構æˆã§ã¯ã‚±ãƒ¼ã‚¹ センシティブã¨ãªã‚‹ã€‚
      • +
      +
      + + +
      +

      対応情報

      +

      ã“ã®é–¢æ•°ã¯ã€f_opendir関数ãŠã‚ˆã³f_readdir関数ã®ãƒ©ãƒƒãƒ‘ー関数ã§ã™ã€‚_USE_FIND == 1ã§ã€ã‹ã¤_FS_MINIMIZE <= 1ã®ã¨ã使用å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚

      +
      + + +
      +

      使用例

      +
      +/* ディレクトリ内ã®ã‚ªãƒ–ジェクトã®æ¤œç´¢ã¨è¡¨ç¤º */
      +
      +void find_image (void)
      +{
      +    FRESULT fr;     /* 戻り値 */
      +    DIR dj;         /* ディレクトリ オブジェクト */
      +    FILINFO fno;    /* ファイル情報構造体 */
      +#if _USE_LFN
      +    char lfn[_MAX_LFN + 1];
      +    fno.lfname = lfn;
      +    fno.lfsize = _MAX_LFN + 1;
      +#endif
      +
      +    fr = f_findfirst(&dj, &fno, "", "dsc*.jpg");  /* "dsc"ã§å§‹ã¾ã‚‹JPEGファイルを検索 */
      +
      +    while (fr == FR_OK && fno.fname[0]) {         /* 見ã¤ã‹ã‚‹é–“繰り返㗠*/
      +#if _USE_LFN
      +        printf("%s  %s\n", fno.fname, fno.lfname);/* 見ã¤ã‘ãŸé …ç›®ã®åå‰ã‚’表示 */
      +#else
      +        printf("%s\n", fno.fname);
      +#endif
      +        fr = f_findnext(&dj, &fno);               /* 次を検索 */
      +    }
      +    f_closedir(&dj);
      +}
      +
      +
      + + +
      +

      å‚ç…§

      +

      f_findnext, f_closedir, DIR, FILINFO

      +
      + +

      戻る

      + + diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/findnext.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/findnext.html new file mode 100644 index 00000000..40191a02 --- /dev/null +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/findnext.html @@ -0,0 +1,68 @@ + + + + + + + + +FatFs - f_findnext + + + + +
      +

      f_findnext

      +

      次ã«ãƒžãƒƒãƒã™ã‚‹ã‚ªãƒ–ジェクトを検索ã—ã¾ã™ã€‚

      +
      +FRESULT f_findnext (
      +  DIR* dp,              /* [IN] ディレクトリ構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
      +  FILINFO* fno          /* [OUT] ファイル情報構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
      +);
      +
      +
      + +
      +

      引数

      +
      +
      dp
      +
      f_findfirst関数ã§ä½œæˆã•ã‚ŒãŸæœ‰åŠ¹ãªãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæ§‹é€ ä½“ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
      +
      fno
      +
      マッãƒã—ãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªé …目を格ç´ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«æƒ…報構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
      +
      +
      + + + + + +
      +

      解説

      +

      次ã«åå‰ã®ãƒžãƒƒãƒã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªé …目を検索ã—ã€è¦‹ã¤ã‹ã£ãŸé …目をファイル情報構造体ã«ã‚¹ãƒˆã‚¢ã—ã¾ã™ã€‚åå‰ã®ãƒžãƒƒãƒã™ã‚‹é …ç›®ãŒè¦‹ã¤ã‹ã‚‰ãšãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®æœ€å¾Œã¾ã§é”ã—ãŸå ´åˆã¯ã€fno->fname[]ã«ãƒŒãƒ«æ–‡å­—列ãŒè¿”ã•ã‚Œã¾ã™ã€‚

      +
      + + +
      +

      対応情報

      +

      ã“ã®é–¢æ•°ã¯ã€f_readdir関数ã®ãƒ©ãƒƒãƒ‘ー関数ã§ã™ã€‚_USE_FIND == 1ã§ã€ã‹ã¤_FS_MINIMIZE <= 1ã®ã¨ã使用å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚

      +
      + + +
      +

      å‚ç…§

      +

      f_findfirst, f_closedir, DIR, FILINFO

      +
      + +

      戻る

      + + diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/forward.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/forward.html index e9212ce1..acbb4677 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/forward.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/forward.html @@ -45,7 +45,6 @@ FRESULT f_forward ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_DENIED, FR_INVALID_OBJECT, FR_TIMEOUT @@ -114,7 +113,7 @@ FRESULT play_file ( if (rc) return rc; /* å…¨ã¦ã®ãƒ‡ãƒ¼ã‚¿ãŒè»¢é€ã•ã‚Œã‚‹ã‹ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã™ã‚‹ã¾ã§ç¶šã‘ã‚‹ */ - while (rc == FR_OK && fil.fptr < fil.fsize) { + while (rc == FR_OK && !f_eof(&fil)) { /* ã»ã‹ã®å‡¦ç†... */ diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/getfree.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/getfree.html index 8b99c764..91a14090 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/getfree.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/getfree.html @@ -53,7 +53,7 @@ FRESULT f_getfree (

      解説

      -

      è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã®ç©ºã領域ã®ã‚µã‚¤ã‚ºã‚’クラスタå˜ä½ã§å–å¾—ã—ã¾ã™ã€‚è¿”ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã®csizeメンãƒãŒã‚¯ãƒ©ã‚¹ã‚¿ã‚ãŸã‚Šã®ã‚»ã‚¯ã‚¿æ•°ã‚’示ã—ã¦ã„ã‚‹ã®ã§ã€ã“れを元ã«ã‚»ã‚¯ã‚¿å˜ä½ã®ç©ºãサイズãŒè¨ˆç®—ã§ãã¾ã™ã€‚FAT32ボリュームã«ãŠã„ã¦ã¯ã€FSINFOã®æƒ…å ±ãŒå®Ÿéš›ã®ç©ºãクラスタ数ã¨åŒæœŸã—ã¦ã„ãªã„å ´åˆã€ä¸æ­£ç¢ºãªå€¤ã‚’è¿”ã™å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®å•é¡Œã‚’é¿ã‘ã‚‹ãŸã‚ã€_FS_NOFSINFOオプションã§ãƒžã‚¦ãƒ³ãƒˆå¾Œã®åˆå›žã¯å¿…ãšãƒ•ãƒ«FATスキャンをã™ã‚‹ã‚ˆã†ã«æ§‹æˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚

      +

      è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã®ç©ºã領域ã®ã‚µã‚¤ã‚ºã‚’クラスタå˜ä½ã§å–å¾—ã—ã¾ã™ã€‚è¿”ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã®csizeメンãƒãŒã‚¯ãƒ©ã‚¹ã‚¿ã‚ãŸã‚Šã®ã‚»ã‚¯ã‚¿æ•°ã‚’示ã—ã¦ã„ã‚‹ã®ã§ã€ã“れを元ã«ã‚»ã‚¯ã‚¿å˜ä½ã®ç©ºãサイズãŒè¨ˆç®—ã§ãã¾ã™ã€‚FAT32ボリュームã«ãŠã„ã¦ã¯ã€FSINFOã®æƒ…å ±ãŒå®Ÿéš›ã®ç©ºãクラスタ数ã¨åŒæœŸã—ã¦ã„ãªã„å ´åˆã€ä¸æ­£ç¢ºãªå€¤ã‚’è¿”ã™å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®å•é¡Œã‚’é¿ã‘ã‚‹ãŸã‚ã€_FS_NOFSINFOオプションã§ãƒžã‚¦ãƒ³ãƒˆå¾Œã®åˆå›žã¯å¿…ãšãƒ•ãƒ«FATスキャンをã™ã‚‹ã‚ˆã†ã«æ§‹æˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/gets.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/gets.html index 74e0b22e..a979068d 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/gets.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/gets.html @@ -44,14 +44,14 @@ TCHAR* f_gets (

      解説

      -

      ã“ã®é–¢æ•°ã¯f_read()ã®ãƒ©ãƒƒãƒ‘ー関数ã§ã™ã€‚読ã¿å‡ºã—動作ã¯ã€æœ€åˆã®'\n'を読ã¿è¾¼ã‚€ã‹ã€ãƒ•ã‚¡ã‚¤ãƒ«çµ‚端ã«é”ã™ã‚‹ã‹ã€len - 1文字を読ã¿å‡ºã™ã¾ã§ç¶šãã¾ã™ã€‚読ã¿è¾¼ã¾ã‚ŒãŸæ–‡å­—列ã®çµ‚端ã«ã¯'\0'ãŒä»˜åŠ ã•ã‚Œã¾ã™ã€‚æ—¢ã«ãƒ•ã‚¡ã‚¤ãƒ«çµ‚端ã§1文字も読ã¿è¾¼ã¾ã‚Œãªã‹ã£ãŸã¨ãã€ã¾ãŸã¯ä½•ã‚‰ã‹ã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã¨ãã¯é–¢æ•°ã¯å¤±æ•—ã—ヌル ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ファイル終端ã‹ã‚¨ãƒ©ãƒ¼ã‹ã¯f_eof(),f_error()マクロã§èª¿ã¹ã‚‰ã‚Œã¾ã™ã€‚

      +

      読ã¿å‡ºã—動作ã¯ã€æœ€åˆã®'\n'を読ã¿è¾¼ã‚€ã‹ã€ãƒ•ã‚¡ã‚¤ãƒ«çµ‚端ã«é”ã™ã‚‹ã‹ã€len - 1文字を読ã¿å‡ºã™ã¾ã§ç¶šãã¾ã™ã€‚読ã¿è¾¼ã¾ã‚ŒãŸæ–‡å­—列ã®çµ‚端ã«ã¯'\0'ãŒä»˜åŠ ã•ã‚Œã¾ã™ã€‚æ—¢ã«ãƒ•ã‚¡ã‚¤ãƒ«çµ‚端ã§1文字も読ã¿è¾¼ã¾ã‚Œãªã‹ã£ãŸã¨ãã€ã¾ãŸã¯ä½•ã‚‰ã‹ã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã¨ãã¯é–¢æ•°ã¯å¤±æ•—ã—ヌル ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ファイル終端ã‹ã‚¨ãƒ©ãƒ¼ã‹ã¯f_eof/f_error関数ã§èª¿ã¹ã‚‰ã‚Œã¾ã™ã€‚

      Unicode API構æˆ(_LFN_UNICODE == 1)ãŒé¸æŠžã•ã‚Œã¦ã„ã‚‹ã¨ãã¯ã€buffã¯UTF-16文字列ã«ãªã‚Šã¾ã™ãŒã€ãƒ•ã‚¡ã‚¤ãƒ«ä¸Šã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã¯ã€_STRF_ENCODEオプションã§é¸æŠžã§ãã¾ã™ã€‚ãれ以外ã®æ™‚ã¯ç„¡å¤‰æ›(1ãƒã‚¤ãƒˆ/1文字)ã§èª­ã¿å‡ºã—ã¾ã™ã€‚

      対応情報

      -

      _USE_STRFUNCãŒ1ã¾ãŸã¯2ã®ã¨ã使用å¯èƒ½ã§ã™ã€‚2ã®ã¨ãã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã«å«ã¾ã‚Œã‚‹'\r'ãŒå–り除ã‹ã‚Œã¦ãƒãƒƒãƒ•ã‚¡ã«èª­ã¿è¾¼ã¾ã‚Œã¾ã™ã€‚

      +

      ã“ã®é–¢æ•°ã¯f_read関数ã®ãƒ©ãƒƒãƒ‘ー関数ã§ã™ã€‚_USE_STRFUNCãŒ1ã¾ãŸã¯2ã®ã¨ã使用å¯èƒ½ã§ã™ã€‚2ã®ã¨ãã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã«å«ã¾ã‚Œã‚‹'\r'ãŒå–り除ã‹ã‚Œã¦ãƒãƒƒãƒ•ã‚¡ã«èª­ã¿è¾¼ã¾ã‚Œã¾ã™ã€‚

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/lseek.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/lseek.html index 88e1ab2a..88bb5ec0 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/lseek.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/lseek.html @@ -39,7 +39,6 @@ FRESULT f_lseek ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT, FR_NOT_ENOUGH_CORE @@ -49,19 +48,19 @@ FRESULT f_lseek (

      解説

      -

      ファイルã®ãƒªãƒ¼ãƒ‰/ライト ãƒã‚¤ãƒ³ã‚¿(次ã«èª­ã¿å‡ºã—・書ãè¾¼ã¿ã•ã‚Œã‚‹ãƒã‚¤ãƒˆã®ã‚ªãƒ•ã‚»ãƒƒãƒˆ)を移動ã—ã¾ã™ã€‚オフセットã®åŽŸç‚¹ã¯ãƒ•ã‚¡ã‚¤ãƒ«å…ˆé ­ã§ã™ã€‚書ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã§ãƒ•ã‚¡ã‚¤ãƒ« サイズより大ããªå€¤ã‚’指定ã™ã‚‹ã¨ã€ãã“ã¾ã§ãƒ•ã‚¡ã‚¤ãƒ« サイズãŒæ‹¡å¼µã•ã‚Œã€æ‹¡å¼µã•ã‚ŒãŸéƒ¨åˆ†ã®ãƒ‡ãƒ¼ã‚¿ã¯æœªå®šç¾©ã¨ãªã‚Šã¾ã™ã€‚データをé…延無ã高速ã«æ›¸ãè¾¼ã¿ãŸã„ã¨ãã¯ã€äºˆã‚ã“ã®é–¢æ•°ã§å¿…è¦ãªã‚µã‚¤ã‚ºã¾ã§ãƒ•ã‚¡ã‚¤ãƒ« サイズを拡張ã—ã¦ãŠãã¨è‰¯ã„ã§ã—ょã†ã€‚f_lseek()ãŒæ­£å¸¸çµ‚了ã—ãŸã‚ã¨ã¯ã€ãƒªãƒ¼ãƒ‰/ライト ãƒã‚¤ãƒ³ã‚¿ãŒæ­£ã—ã移動ã—ãŸã‹ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¹ãã§ã™ã€‚リード/ライト ãƒã‚¤ãƒ³ã‚¿ãŒæŒ‡å®šã‚ˆã‚Šå°ã•ã„ã¨ãã¯ã€æ¬¡ã®åŽŸå› ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ã€‚

      +

      ファイルã®ãƒªãƒ¼ãƒ‰/ライト ãƒã‚¤ãƒ³ã‚¿(次ã«èª­ã¿å‡ºã—・書ãè¾¼ã¿ã•ã‚Œã‚‹ãƒã‚¤ãƒˆã®ã‚ªãƒ•ã‚»ãƒƒãƒˆ)を移動ã—ã¾ã™ã€‚オフセットã®åŽŸç‚¹ã¯ãƒ•ã‚¡ã‚¤ãƒ«å…ˆé ­ã§ã™ã€‚書ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã§ãƒ•ã‚¡ã‚¤ãƒ« サイズより大ããªå€¤ã‚’指定ã™ã‚‹ã¨ã€ãã“ã¾ã§ãƒ•ã‚¡ã‚¤ãƒ« サイズãŒæ‹¡å¼µã•ã‚Œã€æ‹¡å¼µã•ã‚ŒãŸéƒ¨åˆ†ã®ãƒ‡ãƒ¼ã‚¿ã¯æœªå®šç¾©ã¨ãªã‚Šã¾ã™ã€‚データをé…延無ã高速ã«æ›¸ãè¾¼ã¿ãŸã„ã¨ãã¯ã€äºˆã‚ã“ã®é–¢æ•°ã§å¿…è¦ãªã‚µã‚¤ã‚ºã¾ã§ãƒ•ã‚¡ã‚¤ãƒ« サイズを拡張ã—ã¦ãŠãã¨è‰¯ã„ã§ã—ょã†ã€‚f_lseek関数ãŒæ­£å¸¸çµ‚了ã—ãŸã‚ã¨ã¯ã€ãƒªãƒ¼ãƒ‰/ライト ãƒã‚¤ãƒ³ã‚¿ãŒæ­£ã—ã移動ã—ãŸã‹ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¹ãã§ã™ã€‚リード/ライト ãƒã‚¤ãƒ³ã‚¿ãŒæŒ‡å®šã‚ˆã‚Šå°ã•ã„ã¨ãã¯ã€æ¬¡ã®åŽŸå› ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ã€‚

      • éžæ›¸ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã¾ãŸã¯é«˜é€Ÿã‚·ãƒ¼ã‚¯ モードã®ãŸã‚ã€ãƒ•ã‚¡ã‚¤ãƒ« サイズã§ã‚¯ãƒªãƒƒãƒ—ã•ã‚ŒãŸã€‚
      • ファイル拡張中ã«ãƒ‡ã‚£ã‚¹ã‚¯ãŒæº€æ¯ã«ãªã£ãŸã€‚
      -

      _USE_FASTSEEKãŒ1ã§ã€ä¸”ã¤ãƒ•ã‚¡ã‚¤ãƒ« オブジェクトã®cltblメンãƒãŒNULL以外(f_open()ã§NULLã«è¨­å®šã•ã‚Œã‚‹)ã®ã¨ãã€é«˜é€Ÿã‚·ãƒ¼ã‚¯ モードã«ãªã‚Šã¾ã™ã€‚ã“ã‚Œã¯ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¯ãƒ©ã‚¹ã‚¿é…置情報(CLMT)をメモリ上ã«ä¿æŒã—ã¦ãŠãã“ã¨ã«ã‚ˆã‚Šã€FATã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ãªã後方シークやロング シークを高速ã«è¡Œã†æ©Ÿèƒ½ã§ã™ã€‚高速シーク モードã¯ã€f_read()/f_wtite()ã®å‹•ä½œã«ã‚‚é©ç”¨ã•ã‚Œã¾ã™ã€‚高速シーク モードã§ã¯f_wtite()/f_lseek()ã«ã‚ˆã‚‹ãƒ•ã‚¡ã‚¤ãƒ« サイズã®æ‹¡å¼µã¯ã§ãã¾ã›ã‚“。

      -

      高速シーク動作を行ã†å‰ã«ã€CLMTを作æˆã—ã¦ãŠãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“れを作æˆã™ã‚‹ã«ã¯ã€ã¾ãšCLMTæ ¼ç´ãƒãƒƒãƒ•ã‚¡(DWORDåž‹é…列)を準備ã—ã€cltblメンãƒã«ãã®ãƒã‚¤ãƒ³ã‚¿ã‚’セットã—ã¾ã™ã€‚ãã—ã¦ã€é…列ã®å…ˆé ­è¦ç´ ã«ãã®é…列ã®ã‚µã‚¤ã‚º(è¦ç´ æ•°)を入れã€f_lseek()ã‚’ofsã«CREATE_LINKMAPを指定ã—ã¦å‘¼ã³å‡ºã—ã¾ã™ã€‚関数ãŒæˆåŠŸã™ã‚‹ã¨CLMTãŒä½œæˆã•ã‚Œã€ä»¥é™ã®f_read()/f_write()/f_lseek()ã§ã¯FATã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯ç™ºç”Ÿã—ã¾ã›ã‚“。FR_NOT_ENOUGH_COREã§å¤±æ•—ã—ãŸã¨ãã¯é…列サイズãŒä¸è¶³ã§ã€å…ˆé ­è¦ç´ ã«ã¯å®Ÿéš›ã«å¿…è¦ã¨ãªã‚‹è¦ç´ æ•°ãŒè¿”ã•ã‚Œã¾ã™ã€‚å¿…è¦ãªè¦ç´ æ•°ã¯ã€(ファイルã®åˆ†å‰²æ•° + 1) * 2 ã§ã™ã€‚ãŸã¨ãˆã°ã€ãƒ•ã‚¡ã‚¤ãƒ«ãŒ5ã¤ã®ãƒ•ãƒ©ã‚°ãƒ¡ãƒ³ãƒˆã«åˆ†æ–­ã•ã‚Œã¦ã„ã‚‹ã¨ãã«å¿…è¦ãªè¦ç´ æ•°ã¯ã€12ã¨ãªã‚Šã¾ã™ã€‚

      +

      高速シーク モードã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¯ãƒ©ã‚¹ã‚¿é…置情報(CLMT)をメモリ上ã«ä¿æŒã—ã¦ãŠãã“ã¨ã«ã‚ˆã‚Šã€FATã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ãªã後方シークやロング シークを高速ã«è¡Œã†æ©Ÿèƒ½ã§ã€ã‚·ãƒ¼ã‚¯å‹•ä½œã®ã»ã‹f_read/f_wtite関数ã®å‹•ä½œã«ã‚‚é©ç”¨ã•ã‚Œã¾ã™ã€‚ファイルãŒé«˜é€Ÿã‚·ãƒ¼ã‚¯ モードã®é–“ã¯f_wtite/f_lseek関数ã«ã‚ˆã‚‹ãƒ•ã‚¡ã‚¤ãƒ« サイズã®æ‹¡å¼µã¯ã§ãã¾ã›ã‚“。

      +

      高速シーク モードã¯ã€ãƒ•ã‚¡ã‚¤ãƒ« オブジェクトã®ãƒ¡ãƒ³ãƒcltbl(f_open関数ã§NULLã«ãªã‚‹)ã«NULL以外を設定ã—ãŸã¨ã有効ã«ãªã‚‹ã®ã§ã€ã¾ãšCLMTを作æˆã—ã¦ãŠãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“れを作æˆã™ã‚‹ã«ã¯ã€ã¾ãšCLMTæ ¼ç´ãƒãƒƒãƒ•ã‚¡(DWORDåž‹é…列)を準備ã—ã€cltblã«ãã®ãƒã‚¤ãƒ³ã‚¿ã‚’セットã—ã¾ã™ã€‚ãã—ã¦ã€é…列ã®å…ˆé ­è¦ç´ ã«ãã®é…列ã®ã‚µã‚¤ã‚º(è¦ç´ æ•°)を入れã€f_lseek関数をofsã«CREATE_LINKMAPを指定ã—ã¦å‘¼ã³å‡ºã—ã¾ã™ã€‚関数ãŒæˆåŠŸã™ã‚‹ã¨CLMTãŒä½œæˆã•ã‚Œã€ä»¥é™ã®f_read/f_write/f_lseek関数ã§ã¯FATã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯ç™ºç”Ÿã—ã¾ã›ã‚“。CLMTã®å…ˆé ­è¦ç´ ã«ã¯å®Ÿéš›ã«ä½¿ç”¨ã—ãŸ(ã¾ãŸã¯å¿…è¦ã¨ãªã‚‹)è¦ç´ æ•°ãŒè¿”ã•ã‚Œã¾ã™ã€‚使用ã•ã‚Œã‚‹è¦ç´ æ•°ã¯ã€(ファイルã®åˆ†å‰²æ•° + 1) * 2 ã§ã™ã€‚ãŸã¨ãˆã°ã€ãƒ•ã‚¡ã‚¤ãƒ«ãŒ5ã¤ã®ãƒ•ãƒ©ã‚°ãƒ¡ãƒ³ãƒˆã«åˆ†æ–­ã•ã‚Œã¦ã„ã‚‹ã¨ãã¯ã€12è¦ç´ ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚FR_NOT_ENOUGH_COREã§å¤±æ•—ã—ãŸã¨ãã¯ã€é…列サイズãŒä¸è¶³ã§ã™ã€‚

      対応情報

      -

      _FS_MINIMIZE < 3ã®ã¨ã使用å¯èƒ½ã§ã™ã€‚

      +

      _FS_MINIMIZE < 3ã®ã¨ã使用å¯èƒ½ã§ã™ã€‚高速シーク モードを利用ã™ã‚‹ã¨ãã¯ã€_USE_FASTSEEK == 1ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

      @@ -107,6 +106,8 @@ FRESULT f_lseek ( DWORD clmt[SZ_TBL]; /* リンク マップ テーブル格ç´ãƒãƒƒãƒ•ã‚¡ */ + res = f_open(fp, fname, FA_READ | FA_WRITE); /* ファイルを開ã */ + res = f_lseek(fp, ofs1); /* 通常シーク (オープン時ã€cltblã¯NULLã«åˆæœŸåŒ–ã•ã‚Œã‚‹) */ fp->cltbl = clmt; /* 高速シーク機能ã®æœ‰åŠ¹åŒ– */ diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/mkdir.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/mkdir.html index 63da7078..5e92469a 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/mkdir.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/mkdir.html @@ -13,7 +13,7 @@

      f_mkdir

      -

      ディレクトリを作æˆã—ã¾ã™ã€‚

      +

      サブ ディレクトリを作æˆã—ã¾ã™ã€‚

       FRESULT f_mkdir (
         const TCHAR* path /* [IN] 作æˆã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªåã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
      @@ -53,7 +53,7 @@ FRESULT f_mkdir (
       
       

      解説

      -

      空ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’作æˆã—ã¾ã™ã€‚

      +

      空ã®ã‚µãƒ– ディレクトリを作æˆã—ã¾ã™ã€‚ディレクトリを削除ã™ã‚‹ã¨ãã¯f_unlink関数を使用ã—ã¦ãã ã•ã„。

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/mkfs.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/mkfs.html index 19b4341e..20bee57a 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/mkfs.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/mkfs.html @@ -13,7 +13,7 @@

      f_mkfs

      -

      è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã«FATボリュームを作æˆ(フォーマット)ã—ã¾ã™ã€‚

      +

      è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã«FATボリュームを作æˆã—ã¾ã™ã€‚

       FRESULT f_mkfs (
         const TCHAR* path, /* [IN] è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ç•ªå· */
      @@ -27,7 +27,7 @@ FRESULT f_mkfs (
       

      引数

      path
      -
      フォーマット対象ã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–を示ã™ãƒ‘スåを示ã™ãƒŒãƒ«æ–‡å­—'\0'終端ã®æ–‡å­—列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚ドライブ番å·ã‚’å«ã¾ãªã„å ´åˆã¯ã€ã‚«ãƒ¬ãƒ³ãƒˆ ドライブをæ„味ã—ã¾ã™ã€‚
      +
      対象ã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–を示ã™ãƒ‘スåを示ã™ãƒŒãƒ«æ–‡å­—'\0'終端ã®æ–‡å­—列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚ドライブ番å·ã‚’å«ã¾ãªã„å ´åˆã¯ã€ã‚«ãƒ¬ãƒ³ãƒˆ ドライブをæ„味ã—ã¾ã™ã€‚
      sfd
      パーテーション形å¼ã€‚(0(FDISK) ã¾ãŸã¯ 1(SFD))
      au
      @@ -49,8 +49,8 @@ FRESULT f_mkfs (

      説明

      -

      物ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã«FATボリュームを作æˆã—ã¾ã™ã€‚FDISKå½¢å¼ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã¯ã€ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–全体をå ã‚る基本区画(パーテーション)ãŒä½œæˆã•ã‚Œã€ãã®ä¸­ã«FATボリュームãŒä½œæˆã•ã‚Œã¾ã™ã€‚SFDå½¢å¼ã§ã¯ã€FATボリュームãŒç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®å…ˆé ­ã‚»ã‚¯ã‚¿ã‹ã‚‰ãƒ™ã‚¿ã§ä½œæˆã•ã‚Œã¾ã™ã€‚

      -

      フォーマットã™ã‚‹è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ãŒãƒžãƒ«ãƒ パーテーション機能(_MULTI_PARTITION)ã«ã‚ˆã£ã¦ç‰¹å®šã®åŒºç”»(1~4)ã«çµã³ä»˜ã‘られã¦ã„ã‚‹å ´åˆã¯ã€ãã®åŒºç”»ã®ä¸­ã«FATボリュームãŒä½œæˆã•ã‚Œã¾ã™ã€‚sfdã¯ç„¡è¦–ã•ã‚Œã€ã¾ãŸå¯¾å¿œã™ã‚‹ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã¯ã“ã‚Œã«å…ˆç«‹ã¡ã€f_fdisk()ã¾ãŸã¯ä»–ã®ãƒ„ールã§é©åˆ‡ã«åŒºç”»è¨­å®šã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

      +

      物ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã«FATボリュームを作æˆ(フォーマット)ã—ã¾ã™ã€‚FDISKå½¢å¼ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã¯ã€ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–全体をå ã‚る基本区画(パーテーション)ãŒä½œæˆã•ã‚Œã€ãã®ä¸­ã«FATボリュームãŒä½œæˆã•ã‚Œã¾ã™ã€‚SFDå½¢å¼ã§ã¯ã€FATボリュームãŒç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®å…ˆé ­ã‚»ã‚¯ã‚¿ã‹ã‚‰ãƒ™ã‚¿ã§ä½œæˆã•ã‚Œã¾ã™ã€‚

      +

      マルムパーテーション機能(_MULTI_PARTITION)ãŒæœ‰åŠ¹ã§ã€ã‹ã¤ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆå¯¾è±¡ã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ãŒç‰¹å®šã®åŒºç”»(1~4)ã«çµã³ä»˜ã‘られã¦ã„ã‚‹å ´åˆã¯ã€ãã®åŒºç”»ã®ä¸­ã«FATボリュームãŒä½œæˆã•ã‚Œã¾ã™ã€‚sfdã¯ç„¡è¦–ã•ã‚Œã€ãã®ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã¯ã“ã‚Œã«å…ˆç«‹ã¡ã€f_fdisk関数ã¾ãŸã¯ä»–ã®ãƒ„ールã§é©åˆ‡ã«åŒºç”»è¨­å®šã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

      パーテーション形å¼ã«ã¯ã€FDISKå½¢å¼ã¨SFDå½¢å¼ã®äºŒé€šã‚Šã‚ã‚Šã¾ã™ã€‚FDISKå½¢å¼ã¯ã€ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã€MMCã€SDCã€CFCã€U Diskãªã©ã§æ¨™æº–çš„ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚FDISKå½¢å¼ã§ã¯ä¸€å°ã®ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã«ä¸€ã¤ã¾ãŸã¯è¤‡æ•°ã®åŒºç”»ã‚’作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚区画管ç†æƒ…å ±ã¯MBR(物ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®å…ˆé ­ã‚»ã‚¯ã‚¿)ã«è¨˜éŒ²ã•ã‚Œã¾ã™ã€‚SFDå½¢å¼ã¯å˜ã«ä½•ã®åˆ†å‰²ã‚‚è¡Œã‚ãªã„å½¢å¼ã§ã€ãƒœãƒªãƒ¥ãƒ¼ãƒ ã¯ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®å…ˆé ­ã‚»ã‚¯ã‚¿ã‹ã‚‰é–‹å§‹ã—ã¾ã™ã€‚SFDå½¢å¼ã¯ã€ãƒ•ãƒ­ãƒƒãƒ”ー ディスクã€ãƒžã‚¤ã‚¯ãƒ­ãƒ‰ãƒ©ã‚¤ãƒ–ã€å…‰å­¦ãƒ‡ã‚£ã‚¹ã‚¯ã€ãŠã‚ˆã³ãã®ä»–スーパー フロッピー メディアã§æ¨™æº–çš„ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã¾ã™ã€‚

      FATタイプ(FAT12/FAT16/FAT32)ã¯ã€ãã®ãƒœãƒªãƒ¥ãƒ¼ãƒ ä¸Šã®ã‚¯ãƒ©ã‚¹ã‚¿æ•°ã«ã‚ˆã£ã¦ã®ã¿æ±ºå®šã•ã‚Œã‚‹æ±ºã¾ã‚Š[FAT仕様書より]ã«ãªã£ã¦ã„ã¦ã€ãれ以外ã®è¦å› ã¯ã‚ã‚Šã¾ã›ã‚“。ã—ãŸãŒã£ã¦ã€ã©ã®FATタイプã«ãªã‚‹ã‹ã¯ãƒœãƒªãƒ¥ãƒ¼ãƒ  サイズã¨ã‚¯ãƒ©ã‚¹ã‚¿ サイズã«ä¾å­˜ã—ã¾ã™ã€‚クラスタ サイズã¯å¤§ããã™ã‚‹ã»ã©æ€§èƒ½ãŒä¸ŠãŒã‚Šã¾ã™ã€‚

      クラスタ数ãŒFATタイプã®å¢ƒç•Œã«è¿‘ããªã‚‹ã¨ãã¯ã€FR_MKFS_ABORTEDã§é–¢æ•°ãŒå¤±æ•—ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚

      @@ -66,7 +66,7 @@ FRESULT f_mkfs (

      使用例

      -/* Format the default drive */
      +/* Format default drive and create a file */
       int main (void)
       {
           FATFS fs;      /* File system object (volume work area) */
      @@ -75,7 +75,7 @@ int main (void)
           UINT bw;       /* Bytes written */
       
       
      -    /* Register work area */
      +    /* Register work area (do not care about error) */
           f_mount(&fs, "", 0);
       
           /* Create FAT volume with default cluster size */
      @@ -83,19 +83,18 @@ int main (void)
           if (res) ...
       
           /* Create a file as new */
      -    res = f_open(&fil, "hello.txt", FA_CREATE_NEW | FA_WRITE);
      +    res = f_open(&fil, "hello.txt", FA_CREATE_NEW | FA_WRITE);
           if (res) ...
       
           /* Write a message */
      -    f_write(&fil, "Hello, World!\r\n", 15, &bw);
      +    f_write(&fil, "Hello, World!\r\n", 15, &bw);
           if (bw != 15) ...
       
           /* Close the file */
      -    f_close(&fil);
      +    f_close(&fil);
       
           /* Unregister work area */
           f_mount(0, "", 0);
      -
       
      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/mount.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/mount.html index d465edb2..239ae20c 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/mount.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/mount.html @@ -27,7 +27,7 @@ FRESULT f_mount (

      引数

      fs
      -
      登録ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚
      +
      登録ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€ã¾ãŸã¯ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿
      path
      対象ã¨ãªã‚‹è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®ãƒ‘スåを示ã™ãƒŒãƒ«æ–‡å­—'\0'終端ã®æ–‡å­—列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚パスåã«ãƒ‰ãƒ©ã‚¤ãƒ–番å·ãŒå«ã¾ã‚Œãªã„å ´åˆã¯ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆ ドライブを指定ã—ãŸã“ã¨ã«ãªã‚Šã¾ã™ã€‚
      opt
      @@ -49,20 +49,20 @@ FRESULT f_mount (

      解説

      -

      FatFsモジュールã§ã¯ã€ãã‚Œãžã‚Œã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã¨ã„ã†ãƒ¯ãƒ¼ã‚¯ エリアãŒå¿…è¦ã§ã™ã€‚ã“ã®é–¢æ•°ã¯è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトを登録ã—ãŸã‚ŠæŠ¹æ¶ˆã—ãŸã‚Šã—ã¾ã™ã€‚何らã‹ã®ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ã‚’使用ã™ã‚‹å‰ã«ã€ã“ã®é–¢æ•°ã§ãã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトを与ãˆã¦ãŠã‹ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。fsã«ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã™ã‚‹ã¨ã€ãã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã®ç™»éŒ²ã¯æŠ¹æ¶ˆã•ã‚Œã‚‹ã ã‘ã§ã™ã€‚登録抹消ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã®ãƒ¡ãƒ¢ãƒªã¯è§£æ”¾ã§ãã¾ã™ã€‚æ“作対象ã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã«é–‹ã‹ã‚ŒãŸã¾ã¾ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚„ディレクトリãŒã‚ã£ãŸå ´åˆã€ãれらã«å¯¾ã—ã¦ä½œæˆã•ã‚ŒãŸæ§‹é€ ä½“ã¯å…¨ã¦ç„¡åŠ¹ã«ãªã‚Šã¾ã™ã€‚ã“ã®é–¢æ•°ã®å†…部処ç†ã¯æ¬¡ã®ã‚ˆã†ãªé †ã«è¡Œã‚ã‚Œã¾ã™ã€‚

      +

      FatFsモジュールã§ã¯ã€ãã‚Œãžã‚Œã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã¨ã„ã†ãƒ¯ãƒ¼ã‚¯ エリアãŒå¿…è¦ã§ã™ã€‚ã“ã®é–¢æ•°ã¯è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトを登録ã—ãŸã‚ŠæŠ¹æ¶ˆã—ãŸã‚Šã—ã¾ã™ã€‚何らã‹ã®ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ã‚’使用ã™ã‚‹å‰ã«ã€ã“ã®é–¢æ•°ã§ãã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトを与ãˆã¦ãŠã‹ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。fsã«ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã™ã‚‹ã¨ã€ãã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã®ç™»éŒ²ã¯æŠ¹æ¶ˆã•ã‚Œã‚‹ã ã‘ã§ã™ã€‚登録抹消ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトã®ãƒ¡ãƒ¢ãƒªã¯è§£æ”¾ã§ãã¾ã™ã€‚æ“作ã®å¯¾è±¡ã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã«é–‹ã‹ã‚ŒãŸã¾ã¾ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚„ディレクトリãŒã‚ã£ãŸå ´åˆã€ãれらã«å¯¾ã—ã¦ä½œæˆã•ã‚ŒãŸæ§‹é€ ä½“ã¯å…¨ã¦ç„¡åŠ¹ã«ãªã‚Šã¾ã™ã€‚ã“ã®é–¢æ•°ã®å†…部処ç†ã¯æ¬¡ã®ã‚ˆã†ãªé †ã«è¡Œã‚ã‚Œã¾ã™ã€‚

      1. 対象ã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã‚’pathã‹ã‚‰å¾—る。
      2. -
      3. æ—¢ã«ç™»éŒ²ã•ã‚Œã¦ã„るファイル システム オブジェクトã¯ã‚¯ãƒªã‚¢ã—ã€ç™»éŒ²ã‚’解除ã™ã‚‹ã€‚
      4. +
      5. æ—¢ã«ç™»éŒ²ã•ã‚Œã¦ã„るファイル システム オブジェクトã¯ã‚¯ãƒªã‚¢(無効化)ã—ã€ç™»éŒ²ã‚’解除ã™ã‚‹ã€‚
      6. fsãŒæœ‰åŠ¹ãªãƒã‚¤ãƒ³ã‚¿ã®ã¨ãã¯ã€ãã®ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトをクリアã—登録ã™ã‚‹ã€‚
      7. マウント動作ãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹ã¨ãã¯ã€ãれを実行ã™ã‚‹ã€‚

      optã«0を指定ã™ã‚‹ã¨ã€ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œ(物ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®åˆæœŸåŒ–ã€FATボリュームã®æ¤œç´¢ã€BPBを解æžã—ファイル システム オブジェクトをåˆæœŸåŒ–)ã¯è¡Œã‚ã‚Œãšã€é–¢æ•°ã¯ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®çŠ¶æ…‹ã«é–¢ã‚らãšå¸¸ã«æˆåŠŸã—ã¾ã™ã€‚関数内ã§ã¯ä¸‹ä½ãƒ¬ã‚¤ãƒ¤ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯ç™ºç”Ÿã›ãšã€æŒ‡å®šã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトをクリア(無効化)ã—ã€ãã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’内部é…列ã«ç™»éŒ²ã™ã‚‹ã ã‘ã§ã™ã€‚å˜ã«ç™»éŒ²æ¸ˆã¿ã®ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトをクリアã™ã‚‹ç›®çš„ã«ã‚‚使ãˆã¾ã™ã€‚実際ã®ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œã¯ã€ãƒœãƒªãƒ¥ãƒ¼ãƒ ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹(パスåを渡ã™ã‚‚ã®å…¨ã¦)ãŒè¡Œã‚ã‚ŒãŸã¨ãã«ã€æ¬¡ã®ã†ã¡ã„ãšã‚Œã‹ã®æ¡ä»¶ãŒçœŸã®å ´åˆã«è¡Œã‚ã‚Œã¾ã™ã€‚

        -
      • ファイル システム オブジェクトãŒã‚¯ãƒªã‚¢(無効)状態(f_mount()ã®å®Ÿè¡Œã«ã‚ˆã‚‹)
      • +
      • ファイル システム オブジェクトãŒã‚¯ãƒªã‚¢(無効)状態(f_mount関数ã®å®Ÿè¡Œã«ã‚ˆã‚‹)
      • 物ç†ãƒ‰ãƒ©ã‚¤ãƒ–ãŒæœªåˆæœŸåŒ–状態(システム リセットやメディアã®äº¤æ›ã«ã‚ˆã‚‹)
      -

      optã«1を指定ã™ã‚‹ã¨ã€ãƒ•ã‚¡ã‚¤ãƒ« システムオブジェクトã®ç™»éŒ²ã«ç¶šãマウント動作ãŒè¡Œã‚ã‚Œã¾ã™ã€‚メディアãŒç„¡ã„ãªã©ã®ç†ç”±ã§ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œã«å¤±æ•—ã™ã‚‹ã¨å¯¾å¿œã™ã‚‹ã‚¨ãƒ©ãƒ¼ã‚’è¿”ã—ファイル システム オブジェクト無効状態ã®ã¾ã¾ã«ãªã‚Šã¾ã™ãŒã€ç™»éŒ²è‡ªä½“ã¯æœ‰åŠ¹ãªã®ã§ç¶šã„ã¦ãƒœãƒªãƒ¥ãƒ¼ãƒ ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒã‚ã‚Œã°å†ã³ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œãŒå®Ÿè¡Œã•ã‚Œã¾ã™ã€‚

      -

      下ä½ãƒ¬ã‚¤ãƒ¤ã®å®Ÿè£…上メディア交æ›ã®æ¤œå‡ºãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œãªã„(disk_status()ã«å映ã•ã‚Œãªã„)ã¨ãã¯ã€ã‚¢ãƒ—リケーションã¯ãƒ¡ãƒ‡ã‚£ã‚¢äº¤æ›ã®å¾Œã“ã®é–¢æ•°ã§ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトを明示的ã«ã‚¯ãƒªã‚¢ã—ã€ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œãŒæ­£å¸¸ã«è¡Œãˆã‚‹ã‚ˆã†ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

      +

      optã«1を指定ã™ã‚‹ã¨ã€ãƒ•ã‚¡ã‚¤ãƒ« システムオブジェクトã®ç™»éŒ²ã«ç¶šãマウント動作ãŒè¡Œã‚ã‚Œã¾ã™ã€‚メディアãŒç„¡ã„ãªã©ã®ç†ç”±ã§ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œã«å¤±æ•—ã™ã‚‹ã¨å¯¾å¿œã™ã‚‹ã‚¨ãƒ©ãƒ¼ã‚’è¿”ã—ファイル システム オブジェクトã¯ã‚¯ãƒªã‚¢çŠ¶æ…‹ã®ã¾ã¾ã«ãªã‚Šã¾ã™ãŒã€ç™»éŒ²è‡ªä½“ã¯æœ‰åŠ¹ãªã®ã§ç¶šã„ã¦ãƒœãƒªãƒ¥ãƒ¼ãƒ ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒã‚ã‚Œã°å†ã³ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œãŒå®Ÿè¡Œã•ã‚Œã¾ã™ã€‚

      +

      下ä½ãƒ¬ã‚¤ãƒ¤ã®å®Ÿè£…上メディア交æ›ã®æ¤œå‡ºãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œãªã„(disk_status関数ã«å映ã•ã‚Œãªã„)ã¨ãã¯ã€ã‚¢ãƒ—リケーションã¯ãƒ¡ãƒ‡ã‚£ã‚¢äº¤æ›ã®å¾Œã“ã®é–¢æ•°ã§ãƒ•ã‚¡ã‚¤ãƒ« システム オブジェクトを明示的ã«ã‚¯ãƒªã‚¢ã—ã€ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œãŒæ­£å¸¸ã«è¡Œãˆã‚‹ã‚ˆã†ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/open.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/open.html index c3083983..016341de 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/open.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/open.html @@ -37,7 +37,7 @@ FRESULT f_open ( FA_READ読ã¿å‡ºã—モードã§é–‹ãã¾ã™ã€‚読ã¿æ›¸ãã™ã‚‹å ´åˆã¯FA_WRITEã¨å…±ã«æŒ‡å®šã—ã¾ã™ã€‚ FA_WRITE書ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã§é–‹ãã¾ã™ã€‚読ã¿æ›¸ãã™ã‚‹å ´åˆã¯FA_READã¨å…±ã«æŒ‡å®šã—ã¾ã™ã€‚ FA_OPEN_EXISTING既存ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ãã¾ã™ã€‚ファイルãŒç„¡ã„ã¨ãã¯ã‚¨ãƒ©ãƒ¼ã«ãªã‚Šã¾ã™ã€‚(デフォルト) -FA_OPEN_ALWAYS既存ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ãã¾ã™ã€‚ファイルãŒç„¡ã„ã¨ãã¯ãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã—ã¾ã™ã€‚追記ã®å ´åˆã¯ã€ã“ã®æ–¹æ³•ã§ã‚ªãƒ¼ãƒ—ンã—ãŸå¾Œã€f_lseek()ã§ãƒ•ã‚¡ã‚¤ãƒ«ã®æœ€å¾Œå°¾ã«ç§»å‹•ã—ã¦ãã ã•ã„。 +FA_OPEN_ALWAYS既存ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ãã¾ã™ã€‚ファイルãŒç„¡ã„ã¨ãã¯ãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã—ã¾ã™ã€‚追記ã®å ´åˆã¯ã€ã“ã®æ–¹æ³•ã§ã‚ªãƒ¼ãƒ—ンã—ãŸå¾Œã€f_lseek関数ã§ãƒ•ã‚¡ã‚¤ãƒ«ã®æœ€å¾Œå°¾ã«ç§»å‹•ã—ã¦ãã ã•ã„。 FA_CREATE_NEWファイルを作æˆã—ã¾ã™ã€‚åŒåã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚ã‚‹å ´åˆã¯ã€FR_EXISTã§å¤±æ•—ã—ã¾ã™ã€‚ FA_CREATE_ALWAYSファイルを作æˆã—ã¾ã™ã€‚åŒåã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚ã‚‹å ´åˆã¯ã€ã‚µã‚¤ã‚ºã‚’0ã«ã—ã¦ã‹ã‚‰é–‹ãã¾ã™ã€‚ @@ -73,9 +73,9 @@ FRESULT f_open (

      解説

      -

      既存ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ã„ãŸã‚Šã€æ–°ã—ã„ファイルを作æˆã—ã¾ã™ã€‚関数ãŒæˆåŠŸã™ã‚‹ã¨ãƒ•ã‚¡ã‚¤ãƒ« オブジェクトãŒä½œæˆã•ã‚Œã€ä»¥é™ãã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚»ã‚¹ã«ä½¿ç”¨ã—ã¾ã™ã€‚ファイルを閉ã˜ã‚‹ã¨ãã¯ã€f_close()を使用ã—ã¾ã™ã€‚何らã‹ã®å¤‰æ›´ãŒè¡Œã‚ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ãŒãã®å¾Œæ­£ã—ãé–‰ã˜ã‚‰ã‚Œãªã‹ã£ãŸå ´åˆã€ãã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒç ´æã™ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚

      +

      既存ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ã„ãŸã‚Šã€æ–°ã—ã„ファイルを作æˆã—ã¾ã™ã€‚関数ãŒæˆåŠŸã™ã‚‹ã¨ãƒ•ã‚¡ã‚¤ãƒ« オブジェクトãŒä½œæˆã•ã‚Œã€ä»¥é™ãã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚»ã‚¹ã«ä½¿ç”¨ã—ã¾ã™ã€‚ファイルを閉ã˜ã‚‹ã¨ãã¯ã€f_close関数を使用ã—ã¾ã™ã€‚何らã‹ã®å¤‰æ›´ãŒè¡Œã‚ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ãŒãã®å¾Œæ­£ã—ãé–‰ã˜ã‚‰ã‚Œãªã‹ã£ãŸå ´åˆã€ãã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒç ´æã™ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚

      æ—¢ã«é–‹ã‹ã‚Œã¦ã„るファイルを開ãå¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã€å¤šé‡ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ã‚’å‚ç…§ã—ã¦ãã ã•ã„。ã—ã‹ã—ã€ä¸€ã¤ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã™ã‚‹æ›¸ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã‚’å«ã‚€é‡è¤‡ã‚ªãƒ¼ãƒ—ンã¯å¸¸ã«ç¦æ­¢ã§ã™ã€‚

      -

      ファイル アクセスを開始ã™ã‚‹å‰ã«ã€f_mount()を使ã£ã¦ãã‚Œãžã‚Œã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«ãƒ¯ãƒ¼ã‚¯ エリア(ファイル システム オブジェクト)を与ãˆã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®åˆæœŸåŒ–ã®å¾Œã€ãã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«å¯¾ã—ã¦å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ãŒä½¿ãˆã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚

      +

      ファイル アクセスを開始ã™ã‚‹å‰ã«ã€f_mount関数を使ã£ã¦ãã‚Œãžã‚Œã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«ãƒ¯ãƒ¼ã‚¯ エリア(ファイル システム オブジェクト)を与ãˆã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®åˆæœŸåŒ–ã®å¾Œã€ãã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«å¯¾ã—ã¦å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«é–¢æ•°ãŒä½¿ãˆã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/opendir.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/opendir.html index ae409849..15009b94 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/opendir.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/opendir.html @@ -28,7 +28,7 @@ FRESULT f_opendir (
      dp
      空ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª オブジェクト構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
      path
      -
      オープンã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒ‘スåを示ã™ãƒŒãƒ«æ–‡å­—'\0'終端ã®æ–‡å­—列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
      +
      é–‹ãディレクトリã®ãƒ‘スåを示ã™ãƒŒãƒ«æ–‡å­—'\0'終端ã®æ–‡å­—列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
      @@ -50,13 +50,12 @@ FRESULT f_opendir ( FR_NOT_ENOUGH_CORE, FR_TOO_MANY_OPEN_FILES

      -

      解説

      -

      ディレクトリを開ãã¾ã™ã€‚正常終了ã—ãŸã‚‰ã€ä½œæˆã•ã‚ŒãŸDIR構造体を使ã£ã¦ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®é …目を順次読ã¿å‡ºã›ã¾ã™ã€‚

      +

      ディレクトリを開ãã¾ã™ã€‚正常終了ã—ãŸã‚‰ã€ä½œæˆã•ã‚ŒãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª オブジェクト構造体を使ã£ã¦ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®é …目を順次読ã¿å‡ºã›ã¾ã™ã€‚

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/printf.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/printf.html index 4de1da2f..6e3a3f8f 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/printf.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/printf.html @@ -45,7 +45,7 @@ int f_printf (

      解説

      -

      ã“ã®é–¢æ•°ã¯ã€f_putc()ãŠã‚ˆã³f_puts()ã®ãƒ©ãƒƒãƒ‘ー関数ã§ã™ã€‚書å¼åˆ¶å¾¡æ©Ÿèƒ½ã¯C標準ライブラリã®ã‚µãƒ–セットã¨ãªã£ã¦ã„ã¦ã€æ›¸å¼åˆ¶å¾¡æ–‡å­—ã¯æ¬¡ã«ç¤ºã™ã‚‚ã®ãŒä½¿ç”¨å¯èƒ½ã§ã™ã€‚

      +

      書å¼åˆ¶å¾¡æ©Ÿèƒ½ã¯C標準ライブラリã®ã‚µãƒ–セットã¨ãªã£ã¦ã„ã¦ã€æ›¸å¼åˆ¶å¾¡æ–‡å­—ã¯æ¬¡ã«ç¤ºã™ã‚‚ã®ãŒä½¿ç”¨å¯èƒ½ã§ã™ã€‚

      • タイプ: c C s S d D u U x X b B
      • 精度指定: l L
      • @@ -56,7 +56,7 @@ int f_printf (

        対応情報

        -

        _FS_READONLY == 0ã§ã€ä¸”ã¤_USE_STRFUNCãŒ1ã¾ãŸã¯2ã®ã¨ã使用å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚2ã®æ™‚ã¯ã€å‡ºåŠ›ã«å«ã¾ã‚Œã‚‹'\n'ãŒ'\r'+'\n'ã«å±•é–‹ã•ã‚Œã¦ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã¾ã‚Œã¾ã™ã€‚

        +

        ã“ã®é–¢æ•°ã¯ã€f_putc関数ãŠã‚ˆã³f_puts関数ã®ãƒ©ãƒƒãƒ‘ー関数ã§ã™ã€‚_FS_READONLY == 0ã§ã€ä¸”ã¤_USE_STRFUNCãŒ1ã¾ãŸã¯2ã®ã¨ã使用å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚2ã®æ™‚ã¯ã€å‡ºåŠ›ã«å«ã¾ã‚Œã‚‹'\n'ãŒ'\r'+'\n'ã«å±•é–‹ã•ã‚Œã¦ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã¾ã‚Œã¾ã™ã€‚

        APIã«UnicodeãŒé¸æŠž(_LFN_UNICODEãŒ1)ã•ã‚Œã¦ã„ã‚‹ã¨ãã¯ã€fmtã¯Unicode文字列ã«ãªã‚Šã¾ã™ãŒã€ãƒ•ã‚¡ã‚¤ãƒ«ä¸Šã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã¯ã€_STRF_ENCODEオプションã§é¸æŠžã§ãã¾ã™ã€‚ãれ以外ã®æ™‚ã¯ç„¡å¤‰æ›(1ãƒã‚¤ãƒˆ/1文字)ã§æ›¸ãè¾¼ã¿ã¾ã™ã€‚

        diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/putc.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/putc.html index 6b80b1a7..2e0f4948 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/putc.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/putc.html @@ -42,13 +42,13 @@ int f_putc (

        解説

        -

        1文字をファイルã«æ›¸ãè¾¼ã¿ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯f_write()ã®ãƒ©ãƒƒãƒ‘ー関数ã§ã™ã€‚

        +

        1文字をファイルã«æ›¸ãè¾¼ã¿ã¾ã™ã€‚

        対応情報

        -

        _FS_READONLY == 0ã§ã€ä¸”ã¤_USE_STRFUNC㌠1ã¾ãŸã¯ 2ã®ã¨ã使用å¯èƒ½ã§ã™ã€‚2を指定ã™ã‚‹ã¨ã€'\n'ã¯'\r'+'\n'ã«å±•é–‹ã•ã‚Œã¦ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã¾ã‚Œã¾ã™ã€‚

        +

        ã“ã®é–¢æ•°ã¯f_write関数ã®ãƒ©ãƒƒãƒ‘ー関数ã§ã™ã€‚_FS_READONLY == 0ã§ã€ä¸”ã¤_USE_STRFUNC㌠1ã¾ãŸã¯ 2ã®ã¨ã使用å¯èƒ½ã§ã™ã€‚2を指定ã™ã‚‹ã¨ã€'\n'ã¯'\r'+'\n'ã«å±•é–‹ã•ã‚Œã¦ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã¾ã‚Œã¾ã™ã€‚

        diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/puts.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/puts.html index 4f3167cb..a772e5e5 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/puts.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/puts.html @@ -42,13 +42,13 @@ int f_puts (

        解説

        -

        文字列をファイルã«æ›¸ãè¾¼ã¿ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯f_write()ã®ãƒ©ãƒƒãƒ‘ー関数ã§ã™ã€‚

        +

        文字列をファイルã«æ›¸ãè¾¼ã¿ã¾ã™ã€‚

        対応情報

        -

        _FS_READONLY == 0ã§ã€ä¸”ã¤_USE_STRFUNCãŒ1ã¾ãŸã¯2ã®ã¨ã使用å¯èƒ½ã§ã™ã€‚2を指定ã™ã‚‹ã¨ã€æ–‡å­—列ã«å«ã¾ã‚Œã‚‹'\n'ã¯'\r'+'\n'ã«å±•é–‹ã•ã‚Œã¦ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã¾ã‚Œã¾ã™ã€‚

        +

        ã“ã®é–¢æ•°ã¯f_write関数ã®ãƒ©ãƒƒãƒ‘ー関数ã§ã™ã€‚_FS_READONLY == 0ã§ã€ä¸”ã¤_USE_STRFUNCãŒ1ã¾ãŸã¯2ã®ã¨ã使用å¯èƒ½ã§ã™ã€‚2を指定ã™ã‚‹ã¨ã€æ–‡å­—列ã«å«ã¾ã‚Œã‚‹'\n'ã¯'\r'+'\n'ã«å±•é–‹ã•ã‚Œã¦ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã¾ã‚Œã¾ã™ã€‚

        diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/rc.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/rc.html index 45a47388..37bd11f4 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/rc.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/rc.html @@ -17,7 +17,7 @@
        FR_OK (0)
        関数ã¯æˆåŠŸã—ãŸã€‚
        FR_DISK_ERR
        -
        下ä½ãƒ¬ã‚¤ãƒ¤(disk_read(), disk_write(), disk_ioctl()関数)ã§å›žå¾©ä¸èƒ½ãªã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã€‚
        ※開ã‹ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã®æ“作ã«ãŠã„ã¦ã“ã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã™ã‚‹ã¨ã€ãã®ãƒ•ã‚¡ã‚¤ãƒ« オブジェクトã¯ã‚¢ãƒœãƒ¼ãƒˆçŠ¶æ…‹ã¨ãªã‚Šã€ã‚¯ãƒ­ãƒ¼ã‚ºä»¥å¤–ã®ã®æ“作ãŒã§ããªããªã‚Šã¾ã™ã€‚
        +
        下ä½ãƒ¬ã‚¤ãƒ¤(disk_read/disk_write/disk_ioctl関数)ã§å›žå¾©ä¸èƒ½ãªã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã€‚
        ※開ã‹ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã®æ“作ã«ãŠã„ã¦ã“ã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã™ã‚‹ã¨ã€ãã®ãƒ•ã‚¡ã‚¤ãƒ« オブジェクトã¯ã‚¢ãƒœãƒ¼ãƒˆçŠ¶æ…‹ã¨ãªã‚Šã€ã‚¯ãƒ­ãƒ¼ã‚ºä»¥å¤–ã®ã®æ“作ãŒã§ããªããªã‚Šã¾ã™ã€‚
        FR_INT_ERR
        内部処ç†ã®å¥å…¨æ€§ã«ç•°å¸¸ãŒæ¤œå‡ºã•ã‚ŒãŸã€‚原因ã¨ã—ã¦ã¯æ¬¡ã®ã‚ˆã†ãªã“ã¨ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ã€‚
          @@ -26,7 +26,7 @@
        ※開ã‹ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã®æ“作ã«ãŠã„ã¦ã“ã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã™ã‚‹ã¨ã€ãã®ãƒ•ã‚¡ã‚¤ãƒ« オブジェクトã¯ã‚¢ãƒœãƒ¼ãƒˆçŠ¶æ…‹ã¨ãªã‚Šã€ã‚¯ãƒ­ãƒ¼ã‚ºä»¥å¤–ã®æ“作ãŒã§ããªããªã‚Šã¾ã™ã€‚
        FR_NOT_READY
        -
        物ç†ãƒ‰ãƒ©ã‚¤ãƒ–ãŒå‹•ä½œå¯èƒ½ãªçŠ¶æ…‹ã«ãªã„。ã¾ãŸã¯ã€ãƒ‰ãƒ©ã‚¤ãƒ–ã®åˆæœŸåŒ–ã«å¤±æ•—ã—ãŸã€‚
        +
        disk_initialize関数ã®å¤±æ•—。物ç†ãƒ‰ãƒ©ã‚¤ãƒ–ãŒå‹•ä½œå¯èƒ½ãªçŠ¶æ…‹ã«ãªã„。
        FR_NO_FILE
        指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ãŒè¦‹ã¤ã‹ã‚‰ãªã‹ã£ãŸã€‚
        FR_NO_PATH
        @@ -47,39 +47,46 @@
        FR_EXIST
        æ–°ã—ã作æˆã—よã†ã¨ã—ãŸã‚ªãƒ–ジェクトã¨åŒã˜åå‰ã®ã‚ªãƒ–ジェクトãŒæ—¢ã«å­˜åœ¨ã™ã‚‹ã€‚
        FR_INVALID_OBJECT
        -
        指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« オブジェクトやディレクトリ オブジェクトãŒç„¡åŠ¹(オープンã•ã‚Œã¦ã„ãªã„ã€æ—¢ã«é–‰ã˜ã‚‰ã‚ŒãŸã€ç ´æã—ã¦ã„ã‚‹ãªã©)ã€ã¾ãŸã¯ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿ãŒæ¸¡ã•ã‚ŒãŸã€‚ã¾ãŸã€é–‹ã‹ã‚ŒãŸã¾ã¾ã®ã‚ªãƒ–ジェクトã¯ã€ãã‚Œã®å±žã™ã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ ã®ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œã«ã‚ˆã‚Šç„¡åŠ¹ã¨ãªã‚Šã¾ã™ã€‚
        +
        指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« オブジェクトやディレクトリ オブジェクトãŒç„¡åŠ¹ã€ã¾ãŸã¯ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿ãŒæ¸¡ã•ã‚ŒãŸã€‚無効ã«ãªã‚‹ç†ç”±ã¯æ¬¡ã®ã“ã¨ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ +
          +
        • オープンã•ã‚Œã¦ã„ãªã„ã€æ—¢ã«é–‰ã˜ã‚‰ã‚ŒãŸã€ç ´æã—ã¦ã„ã‚‹ãªã©ã€‚
        • +
        • ãã‚Œã®å±žã™ã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ ã®ãƒžã‚¦ãƒ³ãƒˆå‹•ä½œãŒã‚ã£ãŸã€‚ボリューム上ã§é–‹ã‹ã‚ŒãŸã‚ªãƒ–ジェクトã¯å…¨ã¦ç„¡åŠ¹åŒ–ã•ã‚Œã‚‹ã€‚
        • +
        • 関連ã™ã‚‹ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ãŒãƒ¡ãƒ‡ã‚£ã‚¢ã®å–り外ã—ã§å‹•ä½œä¸å¯èƒ½ã«ãªã£ã¦ã„る。
        • +
        +
        FR_WRITE_PROTECTED
        物ç†ãƒ‰ãƒ©ã‚¤ãƒ–ãŒæ›¸ãè¾¼ã¿ç¦æ­¢çŠ¶æ…‹ã®ã¨ãã€æ›¸ãè¾¼ã¿ã‚’ä¼´ã†æ“作を行ãŠã†ã¨ã—ãŸã€‚
        FR_INVALID_DRIVE
        -
        パスå中ã«æŒ‡å®šã•ã‚ŒãŸãƒ‰ãƒ©ã‚¤ãƒ–番å·ãŒç„¡åŠ¹ã€ã¾ãŸã¯ãƒ‘スåã«ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿ãŒæ¸¡ã•ã‚ŒãŸã€‚(関連オプション: _VOLUMES)
        +
        パスå中ã«æŒ‡å®šã•ã‚ŒãŸãƒ‰ãƒ©ã‚¤ãƒ–番å·ãŒç„¡åŠ¹ã€ã¾ãŸã¯ãƒ‘スåã«ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿ãŒæ¸¡ã•ã‚ŒãŸã€‚(関連オプション: _VOLUMES)
        FR_NOT_ENABLED
        ãã®ãƒœãƒªãƒ¥ãƒ¼ãƒ ã®æ“作ã«å¿…è¦ãªãƒ¯ãƒ¼ã‚¯ エリア(ファイル システム オブジェクト構造体)ãŒä¸Žãˆã‚‰ã‚Œã¦ã„ãªã„。
        FR_NO_FILESYSTEM
        物ç†ãƒ‰ãƒ©ã‚¤ãƒ–上ã«æœ‰åŠ¹ãªFATボリュームãŒè¦‹ã¤ã‹ã‚‰ãªã‹ã£ãŸã€‚
        FR_MKFS_ABORTED
        -
        f_mkfs()ã®å‡¦ç†ãŒé–‹å§‹å‰ã«ä¸­æ–­ã•ã‚ŒãŸã€‚原因ã¨ã—ã¦ã¯æ¬¡ã®ã‚ˆã†ãªã“ã¨ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ +
        f_mkfs関数ã®å‡¦ç†ãŒé–‹å§‹å‰ã«ä¸­æ–­ã•ã‚ŒãŸã€‚原因ã¨ã—ã¦ã¯æ¬¡ã®ã‚ˆã†ãªã“ã¨ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ã€‚
        • ボリュームãŒå°ã•ã™ãŽã‚‹ã€‚
        • FATタイプã®è¨ˆç®—ã«çŸ›ç›¾ãŒè¦‹ã¤ã‹ã£ãŸã€‚クラスタ数ãŒFATタイプã®å¢ƒç•Œä»˜è¿‘ã«ãªã‚‹ã¨ãã«ç™ºç”Ÿã™ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚
        • -
        • ãã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«å¯¾å¿œã™ã‚‹åŒºç”»ãŒè¦‹ã¤ã‹ã‚‰ãªã‹ã£ãŸã€‚(関連オプション: _MULTI_PARTITION)
        • +
        • ãã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«å¯¾å¿œã™ã‚‹åŒºç”»ãŒè¦‹ã¤ã‹ã‚‰ãªã‹ã£ãŸã€‚(関連オプション: _MULTI_PARTITION)
        FR_TIMEOUT
        -
        å†å…¥åˆ¶å¾¡ã«ã‚ˆã‚‹å¾…ã¡æ™‚é–“ãŒå®šç¾©ã•ã‚ŒãŸæ™‚間を越ãˆãŸãŸã‚ã€é–¢æ•°ã¯å®Ÿè¡Œã•ã‚Œãªã‹ã£ãŸã€‚(関連オプション: _TIMEOUT)
        +
        å†å…¥åˆ¶å¾¡ã«ã‚ˆã‚‹å¾…ã¡æ™‚é–“ãŒå®šç¾©ã•ã‚ŒãŸæ™‚間を越ãˆãŸãŸã‚ã€é–¢æ•°ã¯å®Ÿè¡Œã•ã‚Œãªã‹ã£ãŸã€‚(関連オプション: _TIMEOUT)
        FR_LOCKED
        -
        多é‡ã‚¢ã‚¯ã‚»ã‚¹æŽ’他機能ã«ã‚ˆã‚Šã€ãã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚„ディレクトリã«å¯¾ã—ã¦è¡ŒãŠã†ã¨ã—ãŸã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•ã‚ŒãŸã€‚(関連オプション: _FS_LOCK)
        +
        多é‡ã‚¢ã‚¯ã‚»ã‚¹æŽ’他機能ã«ã‚ˆã‚Šã€ãã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚„ディレクトリã«å¯¾ã—ã¦è¡ŒãŠã†ã¨ã—ãŸã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•ã‚ŒãŸã€‚(関連オプション: _FS_LOCK)
        FR_NOT_ENOUGH_CORE
        メモリä¸è¶³ã«ã‚ˆã‚‹å¤±æ•—。原因ã¨ã—ã¦ã¯æ¬¡ã®ã‚ˆã†ãªã“ã¨ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ã€‚
          -
        • LFNæ“作ãƒãƒƒãƒ•ã‚¡ã®å‹•çš„確ä¿ã«å¤±æ•—ã—ãŸã€‚(関連オプション: _USE_LFN)
        • +
        • LFNæ“作ãƒãƒƒãƒ•ã‚¡ã®å‹•çš„確ä¿ã«å¤±æ•—ã—ãŸã€‚(関連オプション: _USE_LFN)
        • 与ãˆã‚‰ã‚ŒãŸé…列ã®ã‚µã‚¤ã‚ºãŒå®Ÿéš›ã«å¿…è¦ãªã‚µã‚¤ã‚ºã«å¯¾ã—ã¦ä¸è¶³ã—ã¦ã„る。
        FR_TOO_MANY_OPEN_FILES
        -
        åŒæ™‚オープンå¯èƒ½ãªãƒ•ã‚¡ã‚¤ãƒ«æ•°ã‚’越ãˆã¦ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ã“ã†ã¨ã—ãŸã€‚(関連オプション: _FS_LOCK)
        +
        åŒæ™‚オープンå¯èƒ½ãªãƒ•ã‚¡ã‚¤ãƒ«æ•°ã‚’越ãˆã¦ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ã“ã†ã¨ã—ãŸã€‚(関連オプション: _FS_LOCK)
        FR_INVALID_PARAMETER
        与ãˆã‚‰ã‚ŒãŸãƒ‘ラメータãŒç„¡åŠ¹ã¾ãŸã¯çŸ›ç›¾ã—ã¦ã„る。
        +

        戻る

        diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/read.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/read.html index c7f2d25d..e33e564e 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/read.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/read.html @@ -45,7 +45,6 @@ FRESULT f_read ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_DENIED, FR_INVALID_OBJECT, FR_TIMEOUT diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/readdir.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/readdir.html index fc8fc5c6..2480a6b5 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/readdir.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/readdir.html @@ -26,7 +26,7 @@ FRESULT f_readdir (

        引数

        dp
        -
        有効ãªãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª オブジェクト構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
        +
        f_opendir関数ã§ä½œæˆã•ã‚ŒãŸæœ‰åŠ¹ãªãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª オブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
        fno
        読ã¿å‡ºã—ãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªé …目を格ç´ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«æƒ…報構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã—ã¾ã™ã€‚
        @@ -39,7 +39,6 @@ FRESULT f_readdir ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT, FR_NOT_ENOUGH_CORE @@ -49,15 +48,14 @@ FRESULT f_readdir (

        解説

        -

        ディレクトリã®é …ç›®(ファイルã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª)を順次読ã¿å‡ºã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã‚’ç¹°ã‚Šè¿”ã—実行ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šãã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®å…¨ã¦ã®é …目を読ã¿å‡ºã™ã“ã¨ãŒã§ãã¾ã™ã€‚得られるファイル情報ã®è©³ç´°ã«ã¤ã„ã¦ã¯ FILINFO構造体をå‚ç…§ã—ã¦ãã ã•ã„。全ã¦ã®é …ç›®ãŒèª­ã¿å‡ºã•ã‚Œã€èª­ã¿å‡ºã™é …ç›®ãŒã‚‚ã†ç„¡ã„ã¨ãã¯ã€fname[]メンãƒã«ãƒŒãƒ«æ–‡å­—列ãŒè¿”ã•ã‚Œã¾ã™ã€‚fnoã«ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã™ã‚‹ã¨ã€ãã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒªãƒ¼ãƒ‰ インデックスを先頭ã«å·»ã戻ã—ã¾ã™ã€‚ã¾ãŸã€ã“ã®é–¢æ•°ã¯æ¬¡ã«ç¤ºã™ã‚ˆã†ã«é–¢é€£ã™ã‚‹æ§‹æˆã‚ªãƒ—ションã«ã‚ˆã‚Šå‹•ä½œãŒå¤‰ã‚ã‚Šã¾ã™ã€‚

        -

        ドット エントリ("."ã€"..")ã¯ã€ç›¸å¯¾ãƒ‘スãŒæœ‰åŠ¹ãªã¨ã(_FS_RPATH >= 1)ã«ã®ã¿å‡ºåŠ›ã«ç¾ã‚Œã¾ã™ã€‚

        -

        LFN機能ãŒæœ‰åŠ¹ãªæ™‚ã¯ã€ã“ã®é–¢æ•°ã®å‘¼ã³å‡ºã—ã«å…ˆç«‹ã£ã¦FILINFO構造体ã®lfnameã¨lfsizeãŒæœ‰åŠ¹ãªå€¤ã§åˆæœŸåŒ–ã•ã‚Œã¦ã„ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。lfnameã¯LFNã‚’æ ¼ç´ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã§ã€lfsizeã¯ãã®ãƒãƒƒãƒ•ã‚¡ã®è¦ç´ æ•°ã§ã™ã€‚LFNを読ã¿å‡ºã™å¿…è¦ãŒãªã„ã¨ãã¯ã€lfnameã«ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿ã‚’セットã—ã¦ãã ã•ã„。次ã®æ¡ä»¶ã«ä¸€ã¤ã§ã‚‚該当ã™ã‚‹å ´åˆã¯ã€LFNæ ¼ç´ãƒãƒƒãƒ•ã‚¡ã«ãƒŒãƒ«æ–‡å­—列ãŒè¿”ã•ã‚Œã¾ã™ã€‚

        +

        ディレクトリã®é …ç›®(ファイルãŠã‚ˆã³ã‚µãƒ– ディレクトリ)を順次読ã¿å‡ºã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã‚’ç¹°ã‚Šè¿”ã—実行ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šãã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®å…¨ã¦ã®é …目を読ã¿å‡ºã™ã“ã¨ãŒã§ãã¾ã™ã€‚得られるファイル情報ã®è©³ç´°ã«ã¤ã„ã¦ã¯ FILINFO構造体をå‚ç…§ã—ã¦ãã ã•ã„。全ã¦ã®é …ç›®ãŒèª­ã¿å‡ºã•ã‚Œã€èª­ã¿å‡ºã™é …ç›®ãŒã‚‚ã†ç„¡ã„ã¨ãã¯ã€fno->fname[]ã«ãƒŒãƒ«æ–‡å­—列ãŒè¿”ã•ã‚Œã¾ã™ã€‚fnoã«ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿ã‚’指定ã™ã‚‹ã¨ã€ãã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ãƒªãƒ¼ãƒ‰ インデックスを先頭ã«å·»ã戻ã—ã¾ã™ã€‚ã¾ãŸã€ã“ã®é–¢æ•°ã¯æ¬¡ã«ç¤ºã™ã‚ˆã†ã«é–¢é€£ã™ã‚‹æ§‹æˆã‚ªãƒ—ションã«ã‚ˆã‚Šå‹•ä½œãŒå¤‰ã‚ã‚Šã¾ã™ã€‚

        +

        ドット エントリ("."ã¨"..")ã¯ã€ç›¸å¯¾ãƒ‘スãŒæœ‰åŠ¹ãªã¨ã(_FS_RPATH >= 1)ã«ã®ã¿å‡ºåŠ›ã«ç¾ã‚Œã¾ã™ã€‚

        +

        LFN機能ãŒæœ‰åŠ¹ãªæ™‚ã¯ã€ã“ã®é–¢æ•°ã®å‘¼ã³å‡ºã—ã«å…ˆç«‹ã£ã¦fno->lfnameã¨fno->lfsizeãŒæœ‰åŠ¹ãªå€¤ã§åˆæœŸåŒ–ã•ã‚Œã¦ã„ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。lfnameã¯LFNã‚’æ ¼ç´ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã‚’示ã—ã€lfsizeã¯ãã®ãƒãƒƒãƒ•ã‚¡ã®è¦ç´ æ•°ã‚’示ã—ã¾ã™ã€‚LFNを読ã¿å‡ºã™å¿…è¦ãŒãªã„ã¨ãã¯ã€lfnameã«ãƒŒãƒ« ãƒã‚¤ãƒ³ã‚¿ã‚’セットã—ã¦ãã ã•ã„。次ã®æ¡ä»¶ã«ä¸€ã¤ã§ã‚‚該当ã™ã‚‹å ´åˆã¯ã€LFNæ ¼ç´ãƒãƒƒãƒ•ã‚¡ã«ãƒŒãƒ«æ–‡å­—列ãŒè¿”ã•ã‚Œã¾ã™ã€‚

          -
        • ディレクトリ項目ã«LFN情報ãŒå­˜åœ¨ã—ãªã„。
        • +
        • ãã®é …ç›®ã«LFNãŒå­˜åœ¨ã—ãªã„。ã“ã®ã¨ãã€fname[]ã«è‹±å°æ–‡å­—ãŒå«ã¾ã‚Œã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚
        • LFNã®é•·ã•ã«å¯¾ã—ã¦LFNæ ¼ç´ãƒãƒƒãƒ•ã‚¡ã¾ãŸã¯LFNæ“作ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºãŒä¸å分。
        • -
        • LFNã«ç¾åœ¨ã®OEMコードã«å­˜åœ¨ã—ãªã„文字ãŒå«ã¾ã‚Œã¦ã„る。(éžUnicode構æˆã®ã¨ã)
        • +
        • LFNã«ç¾åœ¨ã®OEMコードã§è¡¨ç¾ã§ããªã„文字ãŒå«ã¾ã‚Œã¦ã„る。(éžUnicode構æˆã®ã¨ã)
        -

        ã¾ãŸã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªé …ç›®ã«LFN情報ãŒå­˜åœ¨ã—ãªã„å ´åˆã¯ã€fname[]ã«è‹±å°æ–‡å­—ãŒå«ã¾ã‚Œã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚

        diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/rename.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/rename.html index 52598467..a768b9aa 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/rename.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/rename.html @@ -56,7 +56,7 @@ FRESULT f_rename (

        解説

        -

        ファイルã¾ãŸã¯ã‚µãƒ– ディレクトリã®åå‰ã‚’変更ã—ã¾ã™ã€‚ã¾ãŸã€åŒæ™‚ã«åˆ¥ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¸ã®ç§»å‹•ã‚‚å¯èƒ½ã§ã™ãŒã€ç•°ãªã‚‹ãƒ‰ãƒ©ã‚¤ãƒ–ã¸ã®ç§»å‹•ã¯ã§ãã¾ã›ã‚“。開ã‹ã‚Œã¦ã„るオブジェクトã«å¯¾ã—ã¦ä½¿ç”¨ã—ã¦ã¯ãªã‚Šã¾ã›ã‚“。

        +

        ファイルã¾ãŸã¯ã‚µãƒ– ディレクトリã®åå‰ã‚’変更ã—ã¾ã™ã€‚ã¾ãŸã€åŒæ™‚ã«åˆ¥ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¸ã®ç§»å‹•ã‚‚å¯èƒ½ã§ã™ãŒã€ç•°ãªã‚‹ãƒ‰ãƒ©ã‚¤ãƒ–é–“ã®ç§»å‹•ã¯ã§ãã¾ã›ã‚“。開ã‹ã‚Œã¦ã„るオブジェクトã«å¯¾ã™ã‚‹ä½¿ç”¨ã¯ä¸æ­£ãªæ“作ã¨ãªã‚Šã€FAT構造ãŒç ´å£Šã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚多é‡ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ãŒæœ‰åŠ¹ã®ã¨ãã¯å®‰å…¨ã«æ‹’å¦ã•ã‚Œã¾ã™ã€‚

        @@ -69,11 +69,14 @@ FRESULT f_rename (

        使用例

        -    /* ファイルã¾ãŸã¯ã‚µãƒ–ディレクトリã®åå‰ã‚’変更ã™ã‚‹ */
        +    /* デフォルト ドライブã«ã‚るオブジェクトã®åå‰ã‚’変更 */
             f_rename("oldname.txt", "newname.txt");
         
        -    /* ファイルã¾ãŸã¯ã‚µãƒ–ディレクトリã®åå‰ã®å¤‰æ›´ã¨åˆ¥ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¸ã®ç§»å‹• */
        -    f_rename("oldname.txt", "dir1/newname.txt");
        +    /* ドライブ2ã«ã‚るオブジェクトã®åå‰ã‚’変更 */
        +    f_rename("2:oldname.txt", "newname.txt");
        +
        +    /* åå‰ã®å¤‰æ›´ã¨åŒæ™‚ã«åˆ¥ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ç§»å‹• */
        +    f_rename("log.txt", "old/log0001.txt");
         
        diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/sdir.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/sdir.html index 33905493..4ee3e53a 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/sdir.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/sdir.html @@ -13,7 +13,7 @@

        DIR

        -

        DIR構造体ã¯ã€f_opendir(), f_readdir()ã®ãƒ¯ãƒ¼ã‚¯ エリアã¨ã—ã¦ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚アプリケーションã¯ã€ã“ã®æ§‹é€ ä½“ã®ãƒ¡ãƒ³ãƒã‚’書ãæ›ãˆã¦ã¯ãªã‚Šã¾ã›ã‚“。

        +

        DIR構造体ã¯ã€f_opendir/f_readdir/f_findfirst/f_findnext関数ã®ãƒ¯ãƒ¼ã‚¯ エリアã¨ã—ã¦ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚アプリケーションã¯ã€ã“ã®æ§‹é€ ä½“ã®ãƒ¡ãƒ³ãƒã‚’書ãæ›ãˆã¦ã¯ãªã‚Šã¾ã›ã‚“。

         typedef struct {
             FATFS*  fs;        /* 親ファイル システム オブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
        @@ -22,15 +22,18 @@
             DWORD   sclust;    /* テーブル開始クラスタ (0:ルート) */
             DWORD   clust;     /* ç¾åœ¨ã®ã‚¯ãƒ©ã‚¹ã‚¿ç•ªå· */
             DWORD   sect;      /* ç¾åœ¨ã®ã‚»ã‚¯ã‚¿ç•ªå· */
        -    BYTE*   dir;       /* ç¾åœ¨ã®SFNエントリã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
        +    BYTE*   dir;       /* ç¾åœ¨ã®SFNエントリ(Win[]内)ã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
             BYTE*   fn;        /* SFNãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ (in/out) {file[8],ext[3],status[1]} */
         #if _FS_LOCK
        -    UINT    lockid;    /* ロックID */
        +    UINT    lockid;    /* サブ ディレクトリ ロックID (0:ルート) */
         #endif
         #if _USE_LFN
             WCHAR*  lfn;       /* LFNãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ (in/out) */
             WORD    lfn_idx;   /* LFNエントリã®å…ˆé ­ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ (0xFFFF:無効) */
         #endif
        +#if _USE_FIND
        +    const TCHAR*  pat; /* マッãƒãƒ³ã‚° パターンã¸ã®ãƒã‚¤ãƒ³ã‚¿ */
        +#endif
         } DIR;
         
        diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/setlabel.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/setlabel.html index dc71ac3e..26dce4b6 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/setlabel.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/setlabel.html @@ -51,10 +51,11 @@ FRESULT f_setlabel (

        解説

        文字列ã®å…ˆé ­ã«ãƒ‰ãƒ©ã‚¤ãƒ–番å·ã‚’å«ã‚€å ´åˆã¯ã€ãã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«å¯¾ã—ã¦è¨­å®šã•ã‚Œã¾ã™ã€‚å«ã¾ãªã„å ´åˆã¯ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆ ドライブã«è¨­å®šã•ã‚Œã¾ã™ã€‚ボリューム ラベルを削除ã™ã‚‹ã¨ãã¯ã€ãƒŒãƒ«æ–‡å­—列を指定ã—ã¾ã™ã€‚ボリューム ラベルã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«å(SFN)ã¨ã»ã¼åŒã˜ã§ã™ãŒã€æ¬¡ã®ç‚¹ãŒç•°ãªã‚Šã¾ã™ã€‚

          -
        • ローカル文字コードæ›ç®—ã§11ãƒã‚¤ãƒˆä»¥ä¸‹ã€‚LFNæ‹¡å¼µã¯é©ç”¨ã•ã‚Œã¾ã›ã‚“。
        • +
        • OEMコードæ›ç®—ã§11ãƒã‚¤ãƒˆä»¥ä¸‹ã€‚ボリューム ラベルã«ã¯LFNæ‹¡å¼µã¯é©ç”¨ã•ã‚Œã¾ã›ã‚“。
        • ピリオドをå«ã‚€ã“ã¨ã¯ã§ããªã„。
        • ä»»æ„ã®ä½ç½®ã«ã‚¹ãƒšãƒ¼ã‚¹ã‚’ç½®ãã“ã¨ãŒã§ãる。ãŸã ã—ã€æœ€å¾Œå°¾ã¨ãªã‚‹ã‚¹ãƒšãƒ¼ã‚¹ã¯é™¤åŽ»ã•ã‚Œã‚‹ã€‚
        +

        ã€è£œè¶³ã€‘ 標準システム(Windows)ã§ã¯\xE5ã§å§‹ã¾ã‚‹ãƒœãƒ¼ãƒªãƒ¥ãƒ¼ãƒ  ラベル(CP932ãªã‚‰ã€Œè–”è–‡ã€ãªã©)ã®æ‰±ã„ã«å•é¡ŒãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ãŸã‚ã€ã“ã®é–¢æ•°ã§ã¯ãã®ã‚ˆã†ãªåå‰ã¯ç„¡åŠ¹ã¨ã—ã¦å‡¦ç†ã—ã¦ã„ã¾ã™ã€‚

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/sfatfs.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/sfatfs.html index 93b9e7c8..fd7405dd 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/sfatfs.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/sfatfs.html @@ -13,16 +13,16 @@

      FATFS

      -

      FATFS構造体(ファイル システム オブジェクト)ã¯ã€å€‹ã€…ã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®ãƒ€ã‚¤ãƒŠãƒŸãƒƒã‚¯ ワーク エリアをä¿æŒã—ã€f_mount()ã§FatFsモジュールã«ç™»éŒ²ã•ã‚Œã¾ã™ã€‚åˆæœŸåŒ–ãŒè¡Œã‚れるタイミングã¯ã€f_mount()(強制マウント指定)ã®å®Ÿè¡Œã¾ãŸã¯ãƒ¡ãƒ‡ã‚£ã‚¢äº¤æ›ã®å¾Œã®æœ€åˆã®ãƒ•ã‚¡ã‚¤ãƒ« アクセスã®æ™‚ã§ã™ã€‚アプリケーションã¯ã€ã“ã®æ§‹é€ ä½“ã®ãƒ¡ãƒ³ãƒã‚’書ãæ›ãˆã¦ã¯ãªã‚Šã¾ã›ã‚“。

      +

      FATFS構造体(ファイル システム オブジェクト)ã¯ã€å€‹ã€…ã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®ãƒ€ã‚¤ãƒŠãƒŸãƒƒã‚¯ ワーク エリアをä¿æŒã—ã€f_mount関数ã§FatFsモジュールã«ç™»éŒ²ã•ã‚Œã¾ã™ã€‚åˆæœŸåŒ–ãŒè¡Œã‚れるタイミングã¯ã€f_mount関数(強制マウント指定)ã®å®Ÿè¡Œã¾ãŸã¯ãƒ¡ãƒ‡ã‚£ã‚¢äº¤æ›ã®å¾Œã®æœ€åˆã®ãƒ•ã‚¡ã‚¤ãƒ« アクセスã®æ™‚ã§ã™ã€‚アプリケーションã¯ã€ã“ã®æ§‹é€ ä½“ã®ãƒ¡ãƒ³ãƒã‚’書ãæ›ãˆã¦ã¯ãªã‚Šã¾ã›ã‚“。

       typedef struct {
      -    BYTE    fs_type;      /* FATタイプ */
      +    BYTE    fs_type;      /* FATタイプ (0:無効, FS_FAT12, FS_FAT16 or FS_FAT32) */
           BYTE    drv;          /* 物ç†ãƒ‰ãƒ©ã‚¤ãƒ–ç•ªå· */
      -    BYTE    csize;        /* クラスタ当ãŸã‚Šã®ã‚»ã‚¯ã‚¿æ•° (1,2,4,8,...,128)*/
      +    BYTE    csize;        /* クラスタ当ãŸã‚Šã®ã‚»ã‚¯ã‚¿æ•° (1,2,4,8,...,128) */
           BYTE    n_fats;       /* FATã®å¤šé‡åŒ–æ•° (1,2) */
           BYTE    wflag;        /* win[]ダーティ フラグ */
      -    BYTE    fsi_flag;     /* FSINFOフラグ (b7:Disabled, b0:Dirty)*/
      +    BYTE    fsi_flag;     /* FSINFOフラグ (b7:Disabled, b0:Dirty) */
           WORD    id;           /* ファイル システム マウントID */
           WORD    n_rootdir;    /* ルート ディレクトリã®ã‚¨ãƒ³ãƒˆãƒªæ•° (FAT12/16) */
       #if _MAX_SS != _MIN_SS
      @@ -36,13 +36,13 @@
           DWORD   free_clust;   /* FSINFO: 空ãクラスタ数 */
       #endif
       #if _FS_RPATH
      -    DWORD   cdir;         /* カレント ディレクトリã®ã‚¯ãƒ©ã‚¹ã‚¿ (0:ルート) */
      +    DWORD   cdir;         /* カレント ディレクトリã®ã‚¯ãƒ©ã‚¹ã‚¿ç•ªå· (0:ルート) */
       #endif
           DWORD   n_fatent;     /* FATエントリ数 (ç·ã‚¯ãƒ©ã‚¹ã‚¿æ•° + 2) */
           DWORD   fsize;        /* FAT 1個ã®ã‚»ã‚¯ã‚¿æ•° */
           DWORD   volbase;      /* ボリューム開始セクタ */
           DWORD   fatbase;      /* FAT領域開始セクタ */
      -    DWORD   dirbase;      /* ルート ディレクトリ領域開始セクタ(クラスタ) */
      +    DWORD   dirbase;      /* ルート ディレクトリ領域開始(セクタ|クラスタ) */
           DWORD   database;     /* データ領域開始セクタ */
           DWORD   winsect;      /* win[]ã«ç¾ã‚Œã¦ã„ã‚‹ã‚»ã‚¯ã‚¿ç•ªå· */
           BYTE    win[_MAX_SS]; /* ディスク アクセス ウィンドウ */
      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/sfile.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/sfile.html
      index 5da60f96..f5f70256 100644
      --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/sfile.html
      +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/sfile.html
      @@ -13,7 +13,7 @@
       
       

      FIL

      -

      FIL構造体(ファイル オブジェクト)ã¯ã€f_open()ã§åˆæœŸåŒ–ã•ã‚Œã€ä»¥å¾Œãã®ãƒ•ã‚¡ã‚¤ãƒ«ã®çŠ¶æ…‹ã‚’ä¿æŒã—ã¾ã™ã€‚ã¾ãŸã€f_close()ã§ãƒ•ã‚¡ã‚¤ãƒ«ãŒé–‰ã˜ã‚‰ã‚Œã‚‹ã¨ç„¡åŠ¹åŒ–ã•ã‚Œã¾ã™ã€‚アプリケーションã¯ã€ã“ã®æ§‹é€ ä½“ã®ãƒ¡ãƒ³ãƒã‚’書ãæ›ãˆã¦ã¯ãªã‚Šã¾ã›ã‚“(cltblã¯ä¾‹å¤–)。éžã‚¿ã‚¤ãƒ‹ãƒ¼æ§‹æˆ(_FS_TINY == 0)ã§ã¯ã€å†…部ã«_MAX_SSãƒã‚¤ãƒˆã®ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ãŒç¢ºä¿ã•ã‚Œã‚‹ã®ã§ã€ãã®ã‚µã‚¤ã‚ºã«ã¯æ³¨æ„ãŒå¿…è¦ã§ã™ã€‚

      +

      FIL構造体(ファイル オブジェクト)ã¯ã€f_open関数ã§åˆæœŸåŒ–ã•ã‚Œã€ä»¥å¾Œãã®ãƒ•ã‚¡ã‚¤ãƒ«ã®çŠ¶æ…‹ã‚’ä¿æŒã—ã¾ã™ã€‚ã¾ãŸã€f_close関数ã§ãƒ•ã‚¡ã‚¤ãƒ«ãŒé–‰ã˜ã‚‰ã‚Œã‚‹ã¨ç„¡åŠ¹åŒ–ã•ã‚Œã¾ã™ã€‚アプリケーションã¯ã€ã“ã®æ§‹é€ ä½“ã®ãƒ¡ãƒ³ãƒã‚’書ãæ›ãˆã¦ã¯ãªã‚Šã¾ã›ã‚“(cltblã¯ä¾‹å¤–)。éžã‚¿ã‚¤ãƒ‹ãƒ¼æ§‹æˆ(_FS_TINY == 0)ã§ã¯ã€å†…部ã«_MAX_SSãƒã‚¤ãƒˆã®ã‚»ã‚¯ã‚¿ ãƒãƒƒãƒ•ã‚¡ãŒç¢ºä¿ã•ã‚Œã‚‹ã®ã§ã€ãã®ã‚µã‚¤ã‚ºã«ã¯æ³¨æ„ãŒå¿…è¦ã§ã™ã€‚

       typedef struct {
      @@ -24,7 +24,7 @@
           DWORD   fptr;         /* ファイル読ã¿æ›¸ããƒã‚¤ãƒ³ã‚¿ (ファイル先頭ã‹ã‚‰ã®ãƒã‚¤ãƒˆ オフセット) */
           DWORD   fsize;        /* ファイル サイズ(ãƒã‚¤ãƒˆå˜ä½) */
           DWORD   sclust;       /* ãƒ•ã‚¡ã‚¤ãƒ«é–‹å§‹ã‚¯ãƒ©ã‚¹ã‚¿ç•ªå· (0:割り当ã¦ç„¡ã—) */
      -    DWORD   clust;        /* ç¾åœ¨ã®ã‚¯ãƒ©ã‚¹ã‚¿ */
      +    DWORD   clust;        /* ç¾åœ¨ã®ã‚¯ãƒ©ã‚¹ã‚¿ (fptrãŒ0ã®ã¨ãã¯ç„¡åŠ¹ã€fptrãŒã‚¯ãƒ©ã‚¹ã‚¿å¢ƒç•Œä¸Šã®ã¨ãã¯å‰ã®ã‚¯ãƒ©ã‚¹ã‚¿) */
           DWORD   dsect;        /* ç¾åœ¨ã®ãƒ‡ãƒ¼ã‚¿ セクタ */
       #if !_FS_READONLY
           DWORD   dir_sect;     /* ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª エントリã®ã‚るセクタ */
      @@ -37,7 +37,7 @@
           UINT    lockid;       /* ファイル ロックID */
       #endif
       #if !_FS_TINY
      -    BYTE    buf[_MAX_SS]; /* ファイル プライベート データ転é€ãƒãƒƒãƒ•ã‚¡ */
      +    BYTE    buf[_MAX_SS]; /* ファイル プライベート データ転é€ãƒãƒƒãƒ•ã‚¡ (fptrãŒã‚»ã‚¯ã‚¿å¢ƒç•Œä¸Šã«ãªã„時ã¯å¸¸ã«æœ‰åŠ¹ã ãŒã€fptrãŒã‚»ã‚¯ã‚¿å¢ƒç•Œä¸Šã®ã¨ãã¯ç„¡åŠ¹ãªå ´åˆãŒã‚ã‚‹) */
       #endif
       } FIL;
       
      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/sfileinfo.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/sfileinfo.html index a9167f1e..108e332e 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/sfileinfo.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/sfileinfo.html @@ -13,7 +13,7 @@

      FILINFO

      -

      FILINFO構造体ã¯ã€f_stat(), f_readdir()ã§è¿”ã•ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«æƒ…報をä¿æŒã—ã¾ã™ã€‚

      +

      FILINFO構造体ã¯ã€f_stat/f_readdir/f_findfirst/f_findnext関数ã§è¿”ã•ã‚Œã‚‹ã‚ªãƒ–ジェクトã«é–¢ã™ã‚‹æƒ…報をä¿æŒã—ã¾ã™ã€‚

       typedef struct {
           DWORD fsize;     /* ファイル サイズ */
      @@ -58,11 +58,11 @@
       
      fattrib
      属性フラグãŒæ ¼ç´ã•ã‚Œã¾ã™ã€‚フラグã¯AM_DIR, AM_RDO, AM_HID, AM_SYS, AM_ARCã®çµ„ã¿åˆã‚ã›ã¨ãªã‚Šã¾ã™ã€‚
      fname[]
      -
      8.3å½¢å¼ã®åå‰ãŒ'\0'ã§çµ‚ã‚る文字列ã¨ã—ã¦æ ¼ç´ã•ã‚Œã¾ã™ã€‚éžLFN構æˆã®ã¨ãã¯ã€å¸¸ã«å¤§æ–‡å­—ã§è¿”ã•ã‚Œã¾ã™ã€‚LFN構æˆã®ã¨ãã¯çŸ­ã„åå‰ãŒè¿”ã•ã‚Œã¾ã™ãŒã€ASCII英字ãŒå°æ–‡å­—ã«ãªã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚
      +
      8.3å½¢å¼ã®åå‰(SFN)ãŒ'\0'ã§çµ‚ã‚る文字列ã¨ã—ã¦æ ¼ç´ã•ã‚Œã¾ã™ã€‚éžLFN構æˆã®ã¨ãã¯ã€å¸¸ã«å¤§æ–‡å­—ã§è¿”ã•ã‚Œã¾ã™ã€‚LFN構æˆã®ã¨ãã¯ã€æ–‡å­—列ã«å«ã¾ã‚Œã‚‹ASCII英字ãŒå°æ–‡å­—ã«ãªã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚
      lfname
      -
      è¿”ã•ã‚Œã‚‹é•·ã„ファイルåã‚’æ ¼ç´ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ã“ã®æ§‹é€ ä½“を使用ã™ã‚‹å‰ã«ã‚¢ãƒ—リケーションã«ã‚ˆã‚ŠåˆæœŸåŒ–ã•ã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。ã“ã®ãƒ¡ãƒ³ãƒã«NULLãŒè¨­å®šã•ã‚Œã‚‹ã¨LFNã¯è¿”ã•ã‚Œã¾ã›ã‚“。éžLFN構æˆã®ã¨ãã¯ã“ã®ãƒ¡ãƒ³ãƒã¯å­˜åœ¨ã—ã¾ã›ã‚“。
      +
      é•·ã„ファイルå(LFN)ã‚’æ ¼ç´ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ã“ã®ãƒ¡ãƒ³ãƒã¯ã€ã“ã®æ§‹é€ ä½“を使用ã™ã‚‹å‰ã«ã‚¢ãƒ—リケーションã«ã‚ˆã‚ŠåˆæœŸåŒ–ã•ã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。NULLãŒè¨­å®šã•ã‚Œã‚‹ã¨LFNã¯è¿”ã•ã‚Œã¾ã›ã‚“。éžLFN構æˆã®ã¨ãã¯ã“ã®ãƒ¡ãƒ³ãƒã¯å­˜åœ¨ã—ã¾ã›ã‚“。
      lfsize
      -
      é•·ã„ファイルåã‚’æ ¼ç´ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º(è¦ç´ æ•°)。ã“ã®æ§‹é€ ä½“を使用ã™ã‚‹å‰ã«ã‚¢ãƒ—リケーションã«ã‚ˆã‚ŠåˆæœŸåŒ–ã•ã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。éžLFN構æˆã®ã¨ãã¯ã“ã®ãƒ¡ãƒ³ãƒã¯å­˜åœ¨ã—ã¾ã›ã‚“。
      +
      é•·ã„ファイルåã‚’æ ¼ç´ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º(è¦ç´ æ•°)。ã“ã®ãƒ¡ãƒ³ãƒã¯ã€ã“ã®æ§‹é€ ä½“を使用ã™ã‚‹å‰ã«ã‚¢ãƒ—リケーションã«ã‚ˆã‚ŠåˆæœŸåŒ–ã•ã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。éžLFN構æˆã®ã¨ãã¯ã“ã®ãƒ¡ãƒ³ãƒã¯å­˜åœ¨ã—ã¾ã›ã‚“。

      戻る

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/size.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/size.html index d75ffc34..207b4f9e 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/size.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/size.html @@ -39,7 +39,7 @@ DWORD f_size (

      解説

      -

      f_size関数ã¯ã€ç¾ãƒªãƒ“ジョンã§ã¯ãƒžã‚¯ãƒ­ã¨ã—ã¦å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã™ã€‚

      +

      ã“ã®é–¢æ•°ã¯ã€ç¾ãƒªãƒ“ジョンã§ã¯ãƒžã‚¯ãƒ­ã¨ã—ã¦å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã™ã€‚ファイル オブジェクトã®æ­£å½“性ãƒã‚§ãƒƒã‚¯ã‚„排他制御ã¯è¡Œã„ã¾ã›ã‚“。

       #define f_size(fp) ((fp)->fsize)
       
      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/stat.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/stat.html index 724a9d5b..6e89c3ee 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/stat.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/stat.html @@ -55,6 +55,7 @@ FRESULT f_stat (

      解説

      指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¾ãŸã¯ã‚µãƒ– ディレクトリã®å­˜åœ¨ã‚’調ã¹ã¾ã™ã€‚存在ã—ãªã„å ´åˆã¯ã€FR_NO_FILEãŒå¸°ã‚Šã¾ã™ã€‚存在ã™ã‚‹å ´åˆã¯FR_OKãŒå¸°ã‚Šã€ãƒ•ã‚¡ã‚¤ãƒ«æƒ…報構造体ã«ãれ関ã™ã‚‹æƒ…å ±(サイズã€ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ã€å±žæ€§ãŠã‚ˆã³çŸ­ã„ファイルå)ãŒã‚¹ãƒˆã‚¢ã•ã‚Œã¾ã™ã€‚

      +

      LFN構æˆã®ã¨ãã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«æƒ…報構造体を使ã†å‰ã«fno.lfnameをヌルã«è¨­å®šã—ã¦ãŠãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/sync.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/sync.html index 4b594d64..35afbb4d 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/sync.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/sync.html @@ -36,7 +36,6 @@ FRESULT f_sync ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_INVALID_OBJECT, FR_TIMEOUT

      @@ -45,8 +44,8 @@ FRESULT f_sync (

      解説

      -

      ã“ã®é–¢æ•°ã¯f_close()ã¨åŒã˜å‡¦ç†ã‚’実行ã—ã¾ã™ãŒã€ãƒ•ã‚¡ã‚¤ãƒ«ã¯å¼•ã続ãé–‹ã‹ã‚ŒãŸã¾ã¾ã«ãªã‚Šã€èª­ã¿æ›¸ãを続行ã§ãã¾ã™ã€‚ロギングãªã©ã€æ›¸ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã§é•·æ™‚間ファイルãŒé–‹ã‹ã‚Œã¦ã„るアプリケーションã«ãŠã„ã¦ã€å®šæœŸçš„ã¾ãŸã¯åŒºåˆ‡ã‚Šã®è‰¯ã„ã¨ã“ã‚ã§ã“ã®é–¢æ•°ã‚’使用ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ä¸æ„ã®é›»æºæ–­ã‚„メディアã®å–り外ã—ã«ã‚ˆã‚Šå¤±ã‚れるデータを最å°ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®èƒŒæ™¯ã«ã¤ã„ã¦ã¯ã€ã‚¢ãƒ—リケーション ノートもå‚ç…§ã—ã¦ãã ã•ã„。

      -

      実際ã®ã¨ã“ã‚ã€f_close()内ã§ã¯ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ãŸå¾Œãƒ•ã‚¡ã‚¤ãƒ« オブジェクトを無効化ã—ã¦ã„ã‚‹ã ã‘ãªã®ã§ã€f_close()ç›´å‰ã«f_sync()ã‚’ç½®ãã“ã¨ã¯ç„¡æ„味ã§ã™ã€‚

      +

      ã“ã®é–¢æ•°ã¯f_close関数ã¨åŒã˜å‡¦ç†ã‚’実行ã—ã¾ã™ãŒã€ãƒ•ã‚¡ã‚¤ãƒ«ã¯å¼•ã続ãé–‹ã‹ã‚ŒãŸã¾ã¾ã«ãªã‚Šã€èª­ã¿æ›¸ãを続行ã§ãã¾ã™ã€‚ロギングãªã©ã€æ›¸ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã§é•·æ™‚間ファイルãŒé–‹ã‹ã‚Œã¦ã„るアプリケーションã«ãŠã„ã¦ã€å®šæœŸçš„ã¾ãŸã¯åŒºåˆ‡ã‚Šã®è‰¯ã„ã¨ã“ã‚ã§ã“ã®é–¢æ•°ã‚’使用ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ä¸æ„ã®é›»æºæ–­ã‚„メディアã®å–り外ã—ã«ã‚ˆã‚Šå¤±ã‚れるデータを最å°ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®èƒŒæ™¯ã«ã¤ã„ã¦ã¯ã€ã‚¢ãƒ—リケーション ノートもå‚ç…§ã—ã¦ãã ã•ã„。

      +

      実際ã®ã¨ã“ã‚ã€f_close関数内ã§ã¯ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ãŸå¾Œãƒ•ã‚¡ã‚¤ãƒ« オブジェクトを無効化ã—ã¦ã„ã‚‹ã ã‘ãªã®ã§ã€f_close関数ã®ç›´å‰ã«f_sync関数を置ãã“ã¨ã¯ç„¡æ„味ã§ã™ã€‚

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/tell.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/tell.html index d0506910..c0194447 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/tell.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/tell.html @@ -39,7 +39,7 @@ DWORD f_tell (

      解説

      -

      f_tell関数ã¯ã€ç¾ãƒªãƒ“ジョンã§ã¯ãƒžã‚¯ãƒ­ã¨ã—ã¦å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã™ã€‚

      +

      f_tell関数ã¯ã€ç¾ãƒªãƒ“ジョンã§ã¯ãƒžã‚¯ãƒ­ã¨ã—ã¦å®Ÿè£…ã•ã‚Œã¦ã„ã¾ã™ã€‚ファイル オブジェクトã®æ­£å½“性ãƒã‚§ãƒƒã‚¯ã‚„排他制御ã¯è¡Œã„ã¾ã›ã‚“。

       #define f_tell(fp) ((fp)->fptr)
       
      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/truncate.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/truncate.html index b33a757e..54026031 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/truncate.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/truncate.html @@ -36,7 +36,6 @@ FRESULT f_truncate ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_DENIED, FR_INVALID_OBJECT, FR_TIMEOUT diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/unlink.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/unlink.html index 3ae691a2..d9b631b0 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/unlink.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/unlink.html @@ -54,13 +54,12 @@ FRESULT f_unlink (

      解説

      -

      削除対象ã®ã‚ªãƒ–ジェクトãŒæ¬¡ã®æ¡ä»¶ã«å½“ã¦ã¯ã¾ã‚‹å ´åˆã€ãã®ã‚¢ã‚¯ã‚»ã‚¹ã¯æ‹’å¦ã•ã‚Œé–¢æ•°ã¯å¤±æ•—ã—ã¾ã™ã€‚ +

      削除対象ã®ã‚ªãƒ–ジェクトãŒæ¬¡ã®æ¡ä»¶ã«å½“ã¦ã¯ã¾ã‚‹å ´åˆã€ãã®ã‚¢ã‚¯ã‚»ã‚¹ã¯æ‹’å¦(FR_DENIED)ã•ã‚Œé–¢æ•°ã¯å¤±æ•—ã—ã¾ã™ã€‚

        -
      • リード オンリー属性(AM_RDO)ã‚’æŒã£ã¦ã„ã‚‹å ´åˆã¯ã€æ‹’å¦(FR_DENIED)ã•ã‚Œã‚‹ã€‚
      • -
      • 空ã§ãªã„サブ ディレクトリã¾ãŸã¯ã‚«ãƒ¬ãƒ³ãƒˆ ディレクトリã§ã‚ã‚‹å ´åˆã¯ã€æ‹’å¦(FR_DENIED)ã•ã‚Œã‚‹ã€‚
      • -
      • é–‹ã‹ã‚Œã¦ã„るファイルã¾ãŸã¯ã‚µãƒ– ディレクトリã§ã‚ã‚‹å ´åˆã¯ã€å¤šé‡ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ãŒæœ‰åŠ¹ãªã‚‰å®‰å…¨ã«æ‹’å¦(FR_LOCKED)ã•ã‚Œã¾ã™ãŒã€ãã†ã§ãªã„ã¨ãã¯ä¸æ­£ãªæ“作ã¨ãªã‚Šã€FAT構造ãŒç ´å£Šã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚
      • +
      • リード オンリー属性(AM_RDO)ã‚’æŒã£ã¦ã„ã‚‹å ´åˆã€‚
      • +
      • 空ã§ãªã„サブ ディレクトリã¾ãŸã¯ã‚«ãƒ¬ãƒ³ãƒˆ ディレクトリã§ã‚ã‚‹å ´åˆã€‚
      • +
      • é–‹ã‹ã‚Œã¦ã„るオブジェクトã§ã‚ã‚‹å ´åˆã€‚多é‡ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ãŒæœ‰åŠ¹ã®ã¨ãã¯å®‰å…¨ã«æ‹’å¦ã•ã‚Œã‚‹ãŒã€ãã†ã§ãªã„ã¨ãã¯ä¸æ­£ãªæ“作ã¨ãªã‚ŠFAT構造ãŒç ´å£Šã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚る。
      -

      diff --git a/firmware/chibios-portapack/ext/fatfs/doc/ja/write.html b/firmware/chibios-portapack/ext/fatfs/doc/ja/write.html index c3de4a0c..a5ea4654 100644 --- a/firmware/chibios-portapack/ext/fatfs/doc/ja/write.html +++ b/firmware/chibios-portapack/ext/fatfs/doc/ja/write.html @@ -45,7 +45,6 @@ FRESULT f_write ( FR_OK, FR_DISK_ERR, FR_INT_ERR, -FR_NOT_READY, FR_DENIED, FR_INVALID_OBJECT, FR_TIMEOUT diff --git a/firmware/chibios-portapack/ext/fatfs/doc/updates.txt b/firmware/chibios-portapack/ext/fatfs/doc/updates.txt deleted file mode 100644 index 20f64f46..00000000 --- a/firmware/chibios-portapack/ext/fatfs/doc/updates.txt +++ /dev/null @@ -1,152 +0,0 @@ -R0.10c, Nov 09, 2014 - Added a configuration option for the platforms without RTC. (_FS_NORTC) - Fixed volume label created by Mac OS X cannot be retrieved with f_getlabel(). - Fixed a potential problem of FAT access that can appear on disk error. - Fixed null pointer dereference on attempting to delete the root direcotry. - -R0.10b, May 19, 2014 - Fixed a hard error in the disk I/O layer can collapse the directory entry. - Fixed LFN entry is not deleted on delete/rename an object with its lossy converted SFN. - -R0.10a, Jan 15, 2014 - Added arbitrary strings as drive number in the path name. (_STR_VOLUME_ID) - Added an option for minimum sector size. (_MIN_SS) - 2nd argument of f_rename() can have a drive number and it will be ignored. - Fixed f_mount() with forced mount fails when drive number is larger than 0. - Fixed f_close() invalidates the file object without volume lock. - Fixed volume lock is left acquired after return from f_closedir(). - Fixed creation of a directory entry with LFN fails on too many SFN collisions. - -R0.10, Oct 02, 2013 - Added an option for character encoding on the file. (_STRF_ENCODE) - Added f_closedir(). - Added forced full FAT scan option for f_getfree(). (_FS_NOFSINFO) - Added forced mount feature with changes of f_mount(). - Improved behavior of volume auto detection. - Improved write throughput of f_puts() and f_printf(). - Changed argument of f_chdrive(), f_mkfs(), disk_read() and disk_write(). - Fixed f_write() can be truncated when the file size is close to 4GB. - Fixed f_open(), f_mkdir() and f_setlabel() can return incorrect result code on error. - -R0.09b, Jan 24, 2013 - Added f_getlabel() and f_setlabel(). (_USE_LABEL = 1) - -R0.09a, Aug 27, 2012 - Fixed assertion failure due to OS/2 EA on FAT12/16 volume. - Changed file functions reject null object pointer to avoid crash. - Changed option name _FS_SHARE to _FS_LOCK. - -R0.09, Sep 06, 2011 - f_mkfs() supports multiple partition to complete the multiple partition feature. - Added f_fdisk(). (_MULTI_PARTITION = 2) - -R0.08b, Jan 15, 2011 - Fast seek feature is also applied to f_read() and f_write(). - f_lseek() reports required table size on creating CLMP. - Extended format syntax of f_printf(). - Ignores duplicated directory separators in given path names. - -R0.08a, Aug 16, 2010 - Added f_getcwd(). (_FS_RPATH = 2) - Added sector erase feature. (_USE_ERASE) - Moved file lock semaphore table from fs object to the bss. - Fixed a wrong directory entry is created on non-LFN cfg when the given name contains ';'. - Fixed f_mkfs() creates wrong FAT32 volume. - -R0.08, May 15, 2010 - Added a memory configuration option. (_USE_LFN) - Added file lock feature. (_FS_SHARE) - Added fast seek feature. (_USE_FASTSEEK) - Changed some types on the API, XCHAR->TCHAR. - Changed fname member in the FILINFO structure on Unicode cfg. - String functions support UTF-8 encoding files on Unicode cfg. - -R0.07e, Nov 3, 2009 - Separated out configuration options from ff.h to ffconf.h. - Added a configuration option, _LFN_UNICODE. - Fixed f_unlink() fails to remove a sub-dir on _FS_RPATH. - Fixed name matching error on the 13 char boundary. - Changed f_readdir() to return the SFN with always upper case on non-LFN cfg. - -R0.07c, Jun 21, 2009 - Fixed f_unlink() may return FR_OK on error. - Fixed wrong cache control in f_lseek(). - Added relative path feature. - Added f_chdir(). - Added f_chdrive(). - Added proper case conversion to extended characters. - -R0.07a, Apr 14, 2009 - Separated out OS dependent code on re-entrant configuration. - Added multiple sector size support. - -R0.07, Apr 01, 2009 - Merged Tiny-FatFs into FatFs as a buffer configuration option. - Added long file name support. - Added multiple code page support. - Added re-entrancy for multitask operation. - Added auto cluster size selection to f_mkfs(). - Added rewind option to f_readdir(). - Changed result code of critical errors. - Renamed string functions to avoid name collision. - -R0.06, Apr 01, 2008 - Added f_forward. (Tiny-FatFs) - Added string functions: fgets, fputc, fputs and fprintf. - Improved performance of f_lseek on moving to the same or following cluster. - -R0.05a, Feb 03, 2008 - Added f_truncate. - Added f_utime. - Fixed off by one error at FAT sub-type determination. - Fixed btr in f_read can be mistruncated. - Fixed cached sector is left not flushed when create and close without write. - -R0.05, Aug 26, 2007 - Changed arguments of f_read, f_write. - Changed arguments of f_mkfs. (FatFs) - Fixed f_mkfs on FAT32 creates incorrect FSInfo. (FatFs) - Fixed f_mkdir on FAT32 creates incorrect directory. (FatFs) - -R0.04b, May 05, 2007 - Added _USE_NTFLAG option. - Added FSInfo support. - Fixed some problems corresponds to FAT32. (Tiny-FatFs) - Fixed DBCS name can result FR_INVALID_NAME. - Fixed short seek (<= csize) collapses the file object. - -R0.04a, Apr 01, 2007 - Supported multiple partitions on a plysical drive. (FatFs) - Added minimization level 3. - Added a capability of extending file size to f_lseek. - Fixed an endian sensitive code in f_mkfs. (FatFs) - Fixed a problem corresponds to FAT32 support. (Tiny-FatFs) - -R0.04, Feb 04, 2007 - Supported multiple drive system. (FatFs) - Changed some APIs for multiple drive system. - Added f_mkfs. (FatFs) - Added _USE_FAT32 option. (Tiny-FatFs) - -R0.03a, Dec 11, 2006 - Improved cluster scan algolithm to write files fast. - Fixed f_mkdir creates incorrect directory on FAT32. - -R0.03, Sep 22, 2006 - Added f_rename. - Changed option _FS_MINIMUM to _FS_MINIMIZE. - -R0.02a, Jun 10, 2006 - Added a configuration option _FS_MINIMUM. - -R0.02, Jun 01, 2006 - Added FAT12. - Removed unbuffered mode. - Fixed a problem on small (<32M) patition. - -R0.01, Apr 29, 2006 - First release - -R0.00, Feb 26, 2006 - Prototype (not released) - diff --git a/firmware/chibios-portapack/ext/fatfs/src/00history.txt b/firmware/chibios-portapack/ext/fatfs/src/00history.txt new file mode 100644 index 00000000..8afb4813 --- /dev/null +++ b/firmware/chibios-portapack/ext/fatfs/src/00history.txt @@ -0,0 +1,245 @@ +---------------------------------------------------------------------------- + Revision history of FatFs module +---------------------------------------------------------------------------- + +R0.00 (February 26, 2006) + + Prototype. + + + +R0.01 (April 29, 2006) + + First stable version. + + + +R0.02 (June 01, 2006) + + Added FAT12 support. + Removed unbuffered mode. + Fixed a problem on small (<32M) partition. + + + +R0.02a (June 10, 2006) + + Added a configuration option (_FS_MINIMUM). + + + +R0.03 (September 22, 2006) + + Added f_rename(). + Changed option _FS_MINIMUM to _FS_MINIMIZE. + + + +R0.03a (December 11, 2006) + + Improved cluster scan algorithm to write files fast. + Fixed f_mkdir() creates incorrect directory on FAT32. + + + +R0.04 (February 04, 2007) + + Added f_mkfs(). + Supported multiple drive system. + Changed some interfaces for multiple drive system. + Changed f_mountdrv() to f_mount(). + + + +R0.04a (April 01, 2007) + + Supported multiple partitions on a physical drive. + Added a capability of extending file size to f_lseek(). + Added minimization level 3. + Fixed an endian sensitive code in f_mkfs(). + + + +R0.04b (May 05, 2007) + + Added a configuration option _USE_NTFLAG. + Added FSINFO support. + Fixed DBCS name can result FR_INVALID_NAME. + Fixed short seek (<= csize) collapses the file object. + + + +R0.05 (August 25, 2007) + + Changed arguments of f_read(), f_write() and f_mkfs(). + Fixed f_mkfs() on FAT32 creates incorrect FSINFO. + Fixed f_mkdir() on FAT32 creates incorrect directory. + + + +R0.05a (February 03, 2008) + + Added f_truncate() and f_utime(). + Fixed off by one error at FAT sub-type determination. + Fixed btr in f_read() can be mistruncated. + Fixed cached sector is not flushed when create and close without write. + + + +R0.06 (April 01, 2008) + + Added fputc(), fputs(), fprintf() and fgets(). + Improved performance of f_lseek() on moving to the same or following cluster. + + + +R0.07 (April 01, 2009) + + Merged Tiny-FatFs as a configuration option. (_FS_TINY) + Added long file name feature. (_USE_LFN) + Added multiple code page feature. (_CODE_PAGE) + Added re-entrancy for multitask operation. (_FS_REENTRANT) + Added auto cluster size selection to f_mkfs(). + Added rewind option to f_readdir(). + Changed result code of critical errors. + Renamed string functions to avoid name collision. + + + +R0.07a (April 14, 2009) + + Septemberarated out OS dependent code on reentrant cfg. + Added multiple sector size feature. + + + +R0.07c (June 21, 2009) + + Fixed f_unlink() can return FR_OK on error. + Fixed wrong cache control in f_lseek(). + Added relative path feature. + Added f_chdir() and f_chdrive(). + Added proper case conversion to extended character. + + + +R0.07e (November 03, 2009) + + Septemberarated out configuration options from ff.h to ffconf.h. + Fixed f_unlink() fails to remove a sub-directory on _FS_RPATH. + Fixed name matching error on the 13 character boundary. + Added a configuration option, _LFN_UNICODE. + Changed f_readdir() to return the SFN with always upper case on non-LFN cfg. + + + +R0.08 (May 15, 2010) + + Added a memory configuration option. (_USE_LFN = 3) + Added file lock feature. (_FS_SHARE) + Added fast seek feature. (_USE_FASTSEEK) + Changed some types on the API, XCHAR->TCHAR. + Changed .fname in the FILINFO structure on Unicode cfg. + String functions support UTF-8 encoding files on Unicode cfg. + + + +R0.08a (August 16, 2010) + + Added f_getcwd(). (_FS_RPATH = 2) + Added sector erase feature. (_USE_ERASE) + Moved file lock semaphore table from fs object to the bss. + Fixed f_mkfs() creates wrong FAT32 volume. + + + +R0.08b (January 15, 2011) + + Fast seek feature is also applied to f_read() and f_write(). + f_lseek() reports required table size on creating CLMP. + Extended format syntax of f_printf(). + Ignores duplicated directory separators in given path name. + + + +R0.09 (September 06, 2011) + + f_mkfs() supports multiple partition to complete the multiple partition feature. + Added f_fdisk(). + + + +R0.09a (August 27, 2012) + + Changed f_open() and f_opendir() reject null object pointer to avoid crash. + Changed option name _FS_SHARE to _FS_LOCK. + Fixed assertion failure due to OS/2 EA on FAT12/16 volume. + + + +R0.09b (January 24, 2013) + + Added f_setlabel() and f_getlabel(). + + + +R0.10 (October 02, 2013) + + Added selection of character encoding on the file. (_STRF_ENCODE) + Added f_closedir(). + Added forced full FAT scan for f_getfree(). (_FS_NOFSINFO) + Added forced mount feature with changes of f_mount(). + Improved behavior of volume auto detection. + Improved write throughput of f_puts() and f_printf(). + Changed argument of f_chdrive(), f_mkfs(), disk_read() and disk_write(). + Fixed f_write() can be truncated when the file size is close to 4GB. + Fixed f_open(), f_mkdir() and f_setlabel() can return incorrect error code. + + + +R0.10a (January 15, 2014) + + Added arbitrary strings as drive number in the path name. (_STR_VOLUME_ID) + Added a configuration option of minimum sector size. (_MIN_SS) + 2nd argument of f_rename() can have a drive number and it will be ignored. + Fixed f_mount() with forced mount fails when drive number is >= 1. (appeared at R0.10) + Fixed f_close() invalidates the file object without volume lock. + Fixed f_closedir() returns but the volume lock is left acquired. (appeared at R0.10) + Fixed creation of an entry with LFN fails on too many SFN collisions. (appeared at R0.07) + + + +R0.10b (May 19, 2014) + + Fixed a hard error in the disk I/O layer can collapse the directory entry. + Fixed LFN entry is not deleted on delete/rename an object with lossy converted SFN. (appeared at R0.07) + + + +R0.10c (November 09, 2014) + + Added a configuration option for the platforms without RTC. (_FS_NORTC) + Changed option name _USE_ERASE to _USE_TRIM. + Fixed volume label created by Mac OS X cannot be retrieved with f_getlabel(). (appeared at R0.09b) + Fixed a potential problem of FAT access that can appear on disk error. + Fixed null pointer dereference on attempting to delete the root direcotry. (appeared at R0.08) + + + +R0.11 (February 09, 2015) + + Added f_findfirst(), f_findnext() and f_findclose(). (_USE_FIND) + Fixed f_unlink() does not remove cluster chain of the file. (appeared at R0.10c) + Fixed _FS_NORTC option does not work properly. (appeared at R0.10c) + + + +R0.11a (September 05, 2015) + + Fixed wrong media change can lead a deadlock at thread-safe configuration. + Added code page 771, 860, 861, 863, 864, 865 and 869. (_CODE_PAGE) + Removed some code pages actually not exist on the standard systems. (_CODE_PAGE) + Fixed errors in the case conversion teble of code page 437 and 850 (ff.c). + Fixed errors in the case conversion teble of Unicode (cc*.c). + + diff --git a/firmware/chibios-portapack/ext/fatfs/src/00readme.txt b/firmware/chibios-portapack/ext/fatfs/src/00readme.txt index b30f7d38..70994eda 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/00readme.txt +++ b/firmware/chibios-portapack/ext/fatfs/src/00readme.txt @@ -1,163 +1,21 @@ -FatFs Module Source Files R0.10c (C)ChaN, 2014 +FatFs Module Source Files R0.11 FILES - ffconf.h Configuration file for FatFs module. - ff.h Common include file for FatFs and application module. - ff.c FatFs module. - diskio.h Common include file for FatFs and disk I/O module. - diskio.c An example of glue function to attach existing disk I/O module to FatFs. - integer.h Integer type definitions for FatFs. - option Optional external functions. + 00readme.txt This file. + history.txt Revision history. + ffconf.h Configuration file for FatFs module. + ff.h Common include file for FatFs and application module. + ff.c FatFs module. + diskio.h Common include file for FatFs and disk I/O module. + diskio.c An example of glue function to attach existing disk I/O module to FatFs. + integer.h Integer type definitions for FatFs. + option Optional external functions. + Low level disk I/O module is not included in this archive because the FatFs module is only a generic file system layer and not depend on any specific storage device. You have to provide a low level disk I/O module that written - to control your storage device. + to control the target storage device. - - -AGREEMENTS - - FatFs module is an open source software to implement FAT file system to - small embedded systems. This is a free software and is opened for education, - research and commercial developments under license policy of following trems. - - Copyright (C) 2014, ChaN, all right reserved. - - * The FatFs module is a free software and there is NO WARRANTY. - * No restriction on use. You can use, modify and redistribute it for - personal, non-profit or commercial product UNDER YOUR RESPONSIBILITY. - * Redistributions of source code must retain the above copyright notice. - - - -REVISION HISTORY - - Feb 26, 2006 R0.00 Prototype - - Apr 29, 2006 R0.01 First release. - - Jun 01, 2006 R0.02 Added FAT12. - Removed unbuffered mode. - Fixed a problem on small (<32M) patition. - - Jun 10, 2006 R0.02a Added a configuration option _FS_MINIMUM. - - Sep 22, 2006 R0.03 Added f_rename. - Changed option _FS_MINIMUM to _FS_MINIMIZE. - - Dec 11, 2006 R0.03a Improved cluster scan algolithm to write files fast. - Fixed f_mkdir creates incorrect directory on FAT32. - - Feb 04, 2007 R0.04 Supported multiple drive system. (FatFs) - Changed some APIs for multiple drive system. - Added f_mkfs. (FatFs) - Added _USE_FAT32 option. (Tiny-FatFs) - - Apr 01, 2007 R0.04a Supported multiple partitions on a plysical drive. (FatFs) - Fixed an endian sensitive code in f_mkfs. (FatFs) - Added a capability of extending the file size to f_lseek. - Added minimization level 3. - Fixed a problem that can collapse a sector when recreate an - existing file in any sub-directory at non FAT32 cfg. (Tiny-FatFs) - - May 05, 2007 R0.04b Added _USE_NTFLAG option. - Added FSInfo support. - Fixed some problems corresponds to FAT32. (Tiny-FatFs) - Fixed DBCS name can result FR_INVALID_NAME. - Fixed short seek (0 < ofs <= csize) collapses the file object. - - Aug 25, 2007 R0.05 Changed arguments of f_read, f_write. - Changed arguments of f_mkfs. (FatFs) - Fixed f_mkfs on FAT32 creates incorrect FSInfo. (FatFs) - Fixed f_mkdir on FAT32 creates incorrect directory. (FatFs) - - Feb 03, 2008 R0.05a Added f_truncate(). - Added f_utime(). - Fixed off by one error at FAT sub-type determination. - Fixed btr in f_read() can be mistruncated. - Fixed cached sector is not flushed when create and close without write. - - Apr 01, 2008 R0.06 Added f_forward(). (Tiny-FatFs) - Added string functions: fputc(), fputs(), fprintf() and fgets(). - Improved performance of f_lseek() on move to the same or following cluster. - - Apr 01, 2009, R0.07 Merged Tiny-FatFs as a buffer configuration option. - Added long file name support. - Added multiple code page support. - Added re-entrancy for multitask operation. - Added auto cluster size selection to f_mkfs(). - Added rewind option to f_readdir(). - Changed result code of critical errors. - Renamed string functions to avoid name collision. - - Apr 14, 2009, R0.07a Separated out OS dependent code on reentrant cfg. - Added multiple sector size support. - - Jun 21, 2009, R0.07c Fixed f_unlink() may return FR_OK on error. - Fixed wrong cache control in f_lseek(). - Added relative path feature. - Added f_chdir(). - Added f_chdrive(). - Added proper case conversion for extended characters. - - Nov 03, 2009 R0.07e Separated out configuration options from ff.h to ffconf.h. - Added a configuration option, _LFN_UNICODE. - Fixed f_unlink() fails to remove a sub-dir on _FS_RPATH. - Fixed name matching error on the 13 char boundary. - Changed f_readdir() to return the SFN with always upper case on non-LFN cfg. - - May 15, 2010, R0.08 Added a memory configuration option. (_USE_LFN) - Added file lock feature. (_FS_SHARE) - Added fast seek feature. (_USE_FASTSEEK) - Changed some types on the API, XCHAR->TCHAR. - Changed fname member in the FILINFO structure on Unicode cfg. - String functions support UTF-8 encoding files on Unicode cfg. - - Aug 16,'10 R0.08a Added f_getcwd(). (_FS_RPATH = 2) - Added sector erase feature. (_USE_ERASE) - Moved file lock semaphore table from fs object to the bss. - Fixed a wrong directory entry is created on non-LFN cfg when the given name contains ';'. - Fixed f_mkfs() creates wrong FAT32 volume. - - Jan 15,'11 R0.08b Fast seek feature is also applied to f_read() and f_write(). - f_lseek() reports required table size on creating CLMP. - Extended format syntax of f_printf function. - Ignores duplicated directory separators in given path names. - - Sep 06,'11 R0.09 f_mkfs() supports multiple partition to finish the multiple partition feature. - Added f_fdisk(). (_MULTI_PARTITION = 2) - - Aug 27,'12 R0.09a Fixed assertion failure due to OS/2 EA on FAT12/16. - Changed f_open() and f_opendir() reject null object pointer to avoid crash. - Changed option name _FS_SHARE to _FS_LOCK. - - Jan 23,'13 R0.09b Added f_getlabel() and f_setlabel(). (_USE_LABEL) - - Oct 02,'13 R0.10 Added selection of character encoding on the file. (_STRF_ENCODE) - Added f_closedir(). - Added forced full FAT scan for f_getfree(). (_FS_NOFSINFO) - Added forced mount feature with changes of f_mount(). - Improved behavior of volume auto detection. - Improved write throughput of f_puts() and f_printf(). - Changed argument of f_chdrive(), f_mkfs(), disk_read() and disk_write(). - Fixed f_write() can be truncated when the file size is close to 4GB. - Fixed f_open(), f_mkdir() and f_setlabel() can return incorrect error code. - - Jan 15,'14 R0.10a Added arbitrary strings as drive number in the path name. (_STR_VOLUME_ID) - Added a configuration option of minimum sector size. (_MIN_SS) - 2nd argument of f_rename() can have a drive number and it will be ignored. - Fixed f_mount() with forced mount fails when drive number is >= 1. - Fixed f_close() invalidates the file object without volume lock. - Fixed f_closedir() returns but the volume lock is left acquired. - Fixed creation of an entry with LFN fails on too many SFN collisions. - - Mar 19,'14 R0.10b Fixed a hard error in the disk I/O layer can collapse the directory entry. - Fixed LFN entry is not deleted on delete/rename an object with lossy converted SFN. - - Nov 09,'14 R0.10c Added a configuration option for the platforms without RTC. (_FS_NORTC) - Fixed volume label created by Mac OS X cannot be retrieved with f_getlabel(). - Fixed a potential problem of FAT access that can appear on disk error. - Fixed null pointer dereference on attempting to delete the root direcotry. diff --git a/firmware/chibios-portapack/ext/fatfs/src/diskio.c b/firmware/chibios-portapack/ext/fatfs/src/diskio.c index 169ae95e..82200ad0 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/diskio.c +++ b/firmware/chibios-portapack/ext/fatfs/src/diskio.c @@ -8,14 +8,14 @@ /*-----------------------------------------------------------------------*/ #include "diskio.h" /* FatFs lower layer API */ -#include "usbdisk.h" /* Example: USB drive control */ -#include "atadrive.h" /* Example: ATA drive control */ -#include "sdcard.h" /* Example: MMC/SDC contorl */ +#include "usbdisk.h" /* Example: Header file of existing USB MSD control module */ +#include "atadrive.h" /* Example: Header file of existing ATA harddisk control module */ +#include "sdcard.h" /* Example: Header file of existing MMC/SDC contorl module */ /* Definitions of physical drive number for each drive */ -#define ATA 0 /* Example: Map ATA drive to drive number 0 */ -#define MMC 1 /* Example: Map MMC/SD card to drive number 1 */ -#define USB 2 /* Example: Map USB drive to drive number 2 */ +#define ATA 0 /* Example: Map ATA harddisk to physical drive 0 */ +#define MMC 1 /* Example: Map MMC/SD card to physical drive 1 */ +#define USB 2 /* Example: Map USB MSD to physical drive 2 */ /*-----------------------------------------------------------------------*/ diff --git a/firmware/chibios-portapack/ext/fatfs/src/ff.c b/firmware/chibios-portapack/ext/fatfs/src/ff.c index 385063f5..201df59e 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/ff.c +++ b/firmware/chibios-portapack/ext/fatfs/src/ff.c @@ -1,137 +1,32 @@ /*----------------------------------------------------------------------------/ -/ FatFs - FAT file system module R0.10c (C)ChaN, 2014 +/ FatFs - FAT file system module R0.11a (C)ChaN, 2015 / /-----------------------------------------------------------------------------/ -/ FatFs module is a generic FAT file system module for small embedded systems. -/ This is a free software that opened for education, research and commercial -/ developments under license policy of following terms. +/ FatFs module is a free software that opened under license policy of +/ following conditions. / -/ Copyright (C) 2014, ChaN, all right reserved. +/ Copyright (C) 2015, ChaN, all right reserved. / -/ * The FatFs module is a free software and there is NO WARRANTY. -/ * No restriction on use. You can use, modify and redistribute it for -/ personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. -/ * Redistributions of source code must retain the above copyright notice. +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. / -/-----------------------------------------------------------------------------/ -/ Feb 26,'06 R0.00 Prototype. -/ -/ Apr 29,'06 R0.01 First stable version. -/ -/ Jun 01,'06 R0.02 Added FAT12 support. -/ Removed unbuffered mode. -/ Fixed a problem on small (<32M) partition. -/ Jun 10,'06 R0.02a Added a configuration option (_FS_MINIMUM). -/ -/ Sep 22,'06 R0.03 Added f_rename(). -/ Changed option _FS_MINIMUM to _FS_MINIMIZE. -/ Dec 11,'06 R0.03a Improved cluster scan algorithm to write files fast. -/ Fixed f_mkdir() creates incorrect directory on FAT32. -/ -/ Feb 04,'07 R0.04 Supported multiple drive system. -/ Changed some interfaces for multiple drive system. -/ Changed f_mountdrv() to f_mount(). -/ Added f_mkfs(). -/ Apr 01,'07 R0.04a Supported multiple partitions on a physical drive. -/ Added a capability of extending file size to f_lseek(). -/ Added minimization level 3. -/ Fixed an endian sensitive code in f_mkfs(). -/ May 05,'07 R0.04b Added a configuration option _USE_NTFLAG. -/ Added FSINFO support. -/ Fixed DBCS name can result FR_INVALID_NAME. -/ Fixed short seek (<= csize) collapses the file object. -/ -/ Aug 25,'07 R0.05 Changed arguments of f_read(), f_write() and f_mkfs(). -/ Fixed f_mkfs() on FAT32 creates incorrect FSINFO. -/ Fixed f_mkdir() on FAT32 creates incorrect directory. -/ Feb 03,'08 R0.05a Added f_truncate() and f_utime(). -/ Fixed off by one error at FAT sub-type determination. -/ Fixed btr in f_read() can be mistruncated. -/ Fixed cached sector is not flushed when create and close without write. -/ -/ Apr 01,'08 R0.06 Added fputc(), fputs(), fprintf() and fgets(). -/ Improved performance of f_lseek() on moving to the same or following cluster. -/ -/ Apr 01,'09 R0.07 Merged Tiny-FatFs as a configuration option. (_FS_TINY) -/ Added long file name feature. -/ Added multiple code page feature. -/ Added re-entrancy for multitask operation. -/ Added auto cluster size selection to f_mkfs(). -/ Added rewind option to f_readdir(). -/ Changed result code of critical errors. -/ Renamed string functions to avoid name collision. -/ Apr 14,'09 R0.07a Separated out OS dependent code on reentrant cfg. -/ Added multiple sector size feature. -/ Jun 21,'09 R0.07c Fixed f_unlink() can return FR_OK on error. -/ Fixed wrong cache control in f_lseek(). -/ Added relative path feature. -/ Added f_chdir() and f_chdrive(). -/ Added proper case conversion to extended character. -/ Nov 03,'09 R0.07e Separated out configuration options from ff.h to ffconf.h. -/ Fixed f_unlink() fails to remove a sub-directory on _FS_RPATH. -/ Fixed name matching error on the 13 character boundary. -/ Added a configuration option, _LFN_UNICODE. -/ Changed f_readdir() to return the SFN with always upper case on non-LFN cfg. -/ -/ May 15,'10 R0.08 Added a memory configuration option. (_USE_LFN = 3) -/ Added file lock feature. (_FS_SHARE) -/ Added fast seek feature. (_USE_FASTSEEK) -/ Changed some types on the API, XCHAR->TCHAR. -/ Changed .fname in the FILINFO structure on Unicode cfg. -/ String functions support UTF-8 encoding files on Unicode cfg. -/ Aug 16,'10 R0.08a Added f_getcwd(). -/ Added sector erase feature. (_USE_ERASE) -/ Moved file lock semaphore table from fs object to the bss. -/ Fixed a wrong directory entry is created on non-LFN cfg when the given name contains ';'. -/ Fixed f_mkfs() creates wrong FAT32 volume. -/ Jan 15,'11 R0.08b Fast seek feature is also applied to f_read() and f_write(). -/ f_lseek() reports required table size on creating CLMP. -/ Extended format syntax of f_printf(). -/ Ignores duplicated directory separators in given path name. -/ -/ Sep 06,'11 R0.09 f_mkfs() supports multiple partition to complete the multiple partition feature. -/ Added f_fdisk(). -/ Aug 27,'12 R0.09a Changed f_open() and f_opendir() reject null object pointer to avoid crash. -/ Changed option name _FS_SHARE to _FS_LOCK. -/ Fixed assertion failure due to OS/2 EA on FAT12/16 volume. -/ Jan 24,'13 R0.09b Added f_setlabel() and f_getlabel(). -/ -/ Oct 02,'13 R0.10 Added selection of character encoding on the file. (_STRF_ENCODE) -/ Added f_closedir(). -/ Added forced full FAT scan for f_getfree(). (_FS_NOFSINFO) -/ Added forced mount feature with changes of f_mount(). -/ Improved behavior of volume auto detection. -/ Improved write throughput of f_puts() and f_printf(). -/ Changed argument of f_chdrive(), f_mkfs(), disk_read() and disk_write(). -/ Fixed f_write() can be truncated when the file size is close to 4GB. -/ Fixed f_open(), f_mkdir() and f_setlabel() can return incorrect error code. -/ Jan 15,'14 R0.10a Added arbitrary strings as drive number in the path name. (_STR_VOLUME_ID) -/ Added a configuration option of minimum sector size. (_MIN_SS) -/ 2nd argument of f_rename() can have a drive number and it will be ignored. -/ Fixed f_mount() with forced mount fails when drive number is >= 1. -/ Fixed f_close() invalidates the file object without volume lock. -/ Fixed f_closedir() returns but the volume lock is left acquired. -/ Fixed creation of an entry with LFN fails on too many SFN collisions. -/ May 19,'14 R0.10b Fixed a hard error in the disk I/O layer can collapse the directory entry. -/ Fixed LFN entry is not deleted on delete/rename an object with lossy converted SFN. -/ Nov 09,'14 R0.10c Added a configuration option for the platforms without RTC. (_FS_NORTC) -/ Fixed volume label created by Mac OS X cannot be retrieved with f_getlabel(). -/ Fixed a potential problem of FAT access that can appear on disk error. -/ Fixed null pointer dereference on attempting to delete the root direcotry. -/---------------------------------------------------------------------------*/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/----------------------------------------------------------------------------*/ + #include "ff.h" /* Declarations of FatFs API */ #include "diskio.h" /* Declarations of disk I/O functions */ - - /*-------------------------------------------------------------------------- Module Private Definitions ---------------------------------------------------------------------------*/ -#if _FATFS != 80376 /* Revision ID */ +#if _FATFS != 64180 /* Revision ID */ #error Wrong include file (ff.h). #endif @@ -163,8 +58,11 @@ /* Timestamp feature */ -#if _FS_NORTC -#define GET_FATTIME() ((DWORD)_NORTC_YEAR << 25 | (DWORD)_NORTC_MON << 21 | (DWORD)_NORTC_MDAY << 16) +#if _FS_NORTC == 1 +#if _NORTC_YEAR < 1980 || _NORTC_YEAR > 2107 || _NORTC_MON < 1 || _NORTC_MON > 12 || _NORTC_MDAY < 1 || _NORTC_MDAY > 31 +#error Invalid _FS_NORTC settings +#endif +#define GET_FATTIME() ((DWORD)(_NORTC_YEAR - 1980) << 25 | (DWORD)_NORTC_MON << 21 | (DWORD)_NORTC_MDAY << 16) #else #define GET_FATTIME() get_fattime() #endif @@ -185,7 +83,7 @@ typedef struct { -/* DBCS code ranges and SBCS extend character conversion table */ +/* DBCS code ranges and SBCS upper conversion tables */ #if _CODE_PAGE == 932 /* Japanese Shift-JIS */ #define _DF1S 0x81 /* DBC 1st byte range 1 start */ @@ -223,152 +121,192 @@ typedef struct { #define _DS2S 0xA1 #define _DS2E 0xFE -#elif _CODE_PAGE == 437 /* U.S. (OEM) */ +#elif _CODE_PAGE == 437 /* U.S. */ #define _DF1S 0 -#define _EXCVT {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F,0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ - 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 720 /* Arabic (OEM) */ +#elif _CODE_PAGE == 720 /* Arabic */ #define _DF1S 0 -#define _EXCVT {0x80,0x81,0x45,0x41,0x84,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x49,0x49,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ - 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 737 /* Greek (OEM) */ +#elif _CODE_PAGE == 737 /* Greek */ #define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \ - 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xE7,0xE8,0xF1,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \ + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xEF,0xF5,0xF0,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 775 /* Baltic (OEM) */ +#elif _CODE_PAGE == 771 /* KBL */ #define _DF1S 0 -#define _EXCVT {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ - 0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDC,0xDE,0xDE, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFE,0xFF} -#elif _CODE_PAGE == 850 /* Multilingual Latin 1 (OEM) */ +#elif _CODE_PAGE == 775 /* Baltic */ #define _DF1S 0 -#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ - 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 852 /* Latin 2 (OEM) */ +#elif _CODE_PAGE == 850 /* Latin 1 */ #define _DF1S 0 -#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F,0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0x9F, \ - 0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF} +#define _EXCVT {0x43,0x55,0x45,0x41,0x41,0x41,0x41,0x43,0x45,0x45,0x45,0x49,0x49,0x49,0x41,0x41, \ + 0x45,0x92,0x92,0x4F,0x4F,0x4F,0x55,0x55,0x59,0x4F,0x55,0x4F,0x9C,0x4F,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0x41,0x41,0x41,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0x41,0x41,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0x45,0x45,0x45,0x49,0x49,0x49,0x49,0xD9,0xDA,0xDB,0xDC,0xDD,0x49,0xDF, \ + 0x4F,0xE1,0x4F,0x4F,0x4F,0x4F,0xE6,0xE8,0xE8,0x55,0x55,0x55,0x59,0x59,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 855 /* Cyrillic (OEM) */ +#elif _CODE_PAGE == 852 /* Latin 2 */ #define _DF1S 0 -#define _EXCVT {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F,0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \ - 0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \ - 0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0xAC, \ + 0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF} -#elif _CODE_PAGE == 857 /* Turkish (OEM) */ +#elif _CODE_PAGE == 855 /* Cyrillic */ #define _DF1S 0 -#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x98,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \ - 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0x59,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F, \ + 0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \ + 0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \ + 0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF, \ + 0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 858 /* Multilingual Latin 1 + Euro (OEM) */ +#elif _CODE_PAGE == 857 /* Turkish */ #define _DF1S 0 -#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ - 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0x49,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 862 /* Hebrew (OEM) */ +#elif _CODE_PAGE == 860 /* Portuguese */ #define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ - 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x80,0x9A,0x90,0x8F,0x8E,0x91,0x86,0x80,0x89,0x89,0x92,0x8B,0x8C,0x98,0x8E,0x8F, \ + 0x90,0x91,0x92,0x8C,0x99,0xA9,0x96,0x9D,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x86,0x8B,0x9F,0x96,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 866 /* Russian (OEM) */ +#elif _CODE_PAGE == 861 /* Icelandic */ #define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ - 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0x90,0x91,0x92,0x93,0x9d,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x8B,0x8B,0x8D,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x8D,0x55,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA4,0xA5,0xA6,0xA7,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 874 /* Thai (OEM, Windows) */ +#elif _CODE_PAGE == 862 /* Hebrew */ #define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ - 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 1250 /* Central Europe (Windows) */ +#elif _CODE_PAGE == 863 /* Canadian-French */ #define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \ - 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xA3,0xB4,0xB5,0xB6,0xB7,0xB8,0xA5,0xAA,0xBB,0xBC,0xBD,0xBC,0xAF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF} +#define _EXCVT {0x43,0x55,0x45,0x41,0x41,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x41,0x8F, \ + 0x45,0x45,0x45,0x4F,0x45,0x49,0x55,0x55,0x98,0x4F,0x55,0x9B,0x9C,0x55,0x55,0x9F, \ + 0xA0,0xA1,0x4F,0x55,0xA4,0xA5,0xA6,0xA7,0x49,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 1251 /* Cyrillic (Windows) */ +#elif _CODE_PAGE == 864 /* Arabic */ #define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x82,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x80,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \ - 0xA0,0xA2,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB2,0xA5,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xA3,0xBD,0xBD,0xAF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF} +#define _EXCVT {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 1252 /* Latin 1 (Windows) */ +#elif _CODE_PAGE == 865 /* Nordic */ #define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xAd,0x9B,0x8C,0x9D,0xAE,0x9F, \ - 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F} +#define _EXCVT {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \ + 0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \ + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 1253 /* Greek (Windows) */ +#elif _CODE_PAGE == 866 /* Russian */ #define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ - 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xA2,0xB8,0xB9,0xBA, \ - 0xE0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xFB,0xBC,0xFD,0xBF,0xFF} +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x90,0x91,0x92,0x93,0x9d,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} -#elif _CODE_PAGE == 1254 /* Turkish (Windows) */ +#elif _CODE_PAGE == 869 /* Greek 2 */ #define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x9D,0x9E,0x9F, \ - 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F} - -#elif _CODE_PAGE == 1255 /* Hebrew (Windows) */ -#define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ - 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} - -#elif _CODE_PAGE == 1256 /* Arabic (Windows) */ -#define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x8C,0x9D,0x9E,0x9F, \ - 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0x41,0xE1,0x41,0xE3,0xE4,0xE5,0xE6,0x43,0x45,0x45,0x45,0x45,0xEC,0xED,0x49,0x49,0xF0,0xF1,0xF2,0xF3,0x4F,0xF5,0xF6,0xF7,0xF8,0x55,0xFA,0x55,0x55,0xFD,0xFE,0xFF} - -#elif _CODE_PAGE == 1257 /* Baltic (Windows) */ -#define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ - 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xBC,0xBD,0xBE,0xAF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF} - -#elif _CODE_PAGE == 1258 /* Vietnam (OEM, Windows) */ -#define _DF1S 0 -#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0xAC,0x9D,0x9E,0x9F, \ - 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ - 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xEC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xFE,0x9F} +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \ + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x86,0x9C,0x8D,0x8F,0x90, \ + 0x91,0x90,0x92,0x95,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \ + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \ + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xA4,0xA5,0xA6,0xD9,0xDA,0xDB,0xDC,0xA7,0xA8,0xDF, \ + 0xA9,0xAA,0xAC,0xAD,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xCF,0xCF,0xD0,0xEF, \ + 0xF0,0xF1,0xD1,0xD2,0xD3,0xF5,0xD4,0xF7,0xF8,0xF9,0xD5,0x96,0x95,0x98,0xFE,0xFF} #elif _CODE_PAGE == 1 /* ASCII (for only non-LFN cfg) */ #if _USE_LFN @@ -420,12 +358,12 @@ typedef struct { /* FAT sub-type boundaries (Differ from specs but correct for real DOS/Windows) */ -#define MIN_FAT16 4086U /* Minimum number of clusters as FAT16 */ -#define MIN_FAT32 65526U /* Minimum number of clusters as FAT32 */ +#define MIN_FAT16 4086U /* Minimum number of clusters of FAT16 */ +#define MIN_FAT32 65526U /* Minimum number of clusters of FAT32 */ /* FatFs refers the members in the FAT structures as byte array instead of -/ structure member because the structure is not binary compatible between +/ structure members because the structure is not binary compatible between / different platforms */ #define BS_jmpBoot 0 /* x86 jump instruction (3) */ @@ -442,7 +380,8 @@ typedef struct { #define BPB_NumHeads 26 /* Number of heads (2) */ #define BPB_HiddSec 28 /* Number of special hidden sectors (4) */ #define BPB_TotSec32 32 /* Volume size [sector] (4) */ -#define BS_DrvNum 36 /* Physical drive number (2) */ +#define BS_DrvNum 36 /* Physical drive number (1) */ +#define BS_NTres 37 /* Error flag (1) */ #define BS_BootSig 38 /* Extended boot signature (1) */ #define BS_VolID 39 /* Volume serial number (4) */ #define BS_VolLab 43 /* Volume label (8) */ @@ -453,7 +392,8 @@ typedef struct { #define BPB_RootClus 44 /* Root directory first cluster (4) */ #define BPB_FSInfo 48 /* Offset of FSINFO sector (2) */ #define BPB_BkBootSec 50 /* Offset of backup boot sector (2) */ -#define BS_DrvNum32 64 /* Physical drive number (2) */ +#define BS_DrvNum32 64 /* Physical drive number (1) */ +#define BS_NTres32 65 /* Error flag (1) */ #define BS_BootSig32 66 /* Extended boot signature (1) */ #define BS_VolID32 67 /* Volume serial number (4) */ #define BS_VolLab32 71 /* Volume label (8) */ @@ -468,7 +408,7 @@ typedef struct { #define DIR_Name 0 /* Short file name (11) */ #define DIR_Attr 11 /* Attribute (1) */ -#define DIR_NTres 12 /* NT flag (1) */ +#define DIR_NTres 12 /* Lower case flag (1) */ #define DIR_CrtTimeTenth 13 /* Created time sub-second (1) */ #define DIR_CrtTime 14 /* Created time (2) */ #define DIR_CrtDate 16 /* Created date (2) */ @@ -481,22 +421,25 @@ typedef struct { #define LDIR_Ord 0 /* LFN entry order and LLE flag (1) */ #define LDIR_Attr 11 /* LFN attribute (1) */ #define LDIR_Type 12 /* LFN type (1) */ -#define LDIR_Chksum 13 /* Sum of corresponding SFN entry */ -#define LDIR_FstClusLO 26 /* Filled by zero (0) */ -#define SZ_DIR 32 /* Size of a directory entry */ -#define LLE 0x40 /* Last long entry flag in LDIR_Ord */ -#define DDE 0xE5 /* Deleted directory entry mark in DIR_Name[0] */ -#define NDDE 0x05 /* Replacement of the character collides with DDE */ +#define LDIR_Chksum 13 /* Checksum of corresponding SFN entry */ +#define LDIR_FstClusLO 26 /* Must be zero (0) */ +#define SZ_DIRE 32 /* Size of a directory entry */ +#define LLEF 0x40 /* Last long entry flag in LDIR_Ord */ +#define DDEM 0xE5 /* Deleted directory entry mark at DIR_Name[0] */ +#define RDDEM 0x05 /* Replacement of the character collides with DDEM */ -/*------------------------------------------------------------*/ -/* Module private work area */ -/*------------------------------------------------------------*/ -/* Remark: Uninitialized variables with static duration are -/ guaranteed zero/null at start-up. If not, either the linker -/ or start-up routine being used is out of ANSI-C standard. +/*-------------------------------------------------------------------------- + + Module Private Work Area + +---------------------------------------------------------------------------*/ + +/* Remark: Uninitialized variables with static duration are guaranteed +/ zero/null at start-up. If not, either the linker or start-up routine +/ being used is not compliance with ANSI-C standard. */ #if _VOLUMES < 1 || _VOLUMES > 9 @@ -514,7 +457,7 @@ static FILESEM Files[_FS_LOCK]; /* Open object lock semaphores */ #endif #if _USE_LFN == 0 /* Non LFN feature */ -#define DEF_NAMEBUF BYTE sfn[12] +#define DEFINE_NAMEBUF BYTE sfn[12] #define INIT_BUF(dobj) (dobj).fn = sfn #define FREE_BUF() #else @@ -522,16 +465,16 @@ static FILESEM Files[_FS_LOCK]; /* Open object lock semaphores */ #error Wrong _MAX_LFN setting #endif #if _USE_LFN == 1 /* LFN feature with static working buffer */ -static WCHAR LfnBuf[_MAX_LFN+1]; -#define DEF_NAMEBUF BYTE sfn[12] +static WCHAR LfnBuf[_MAX_LFN + 1]; +#define DEFINE_NAMEBUF BYTE sfn[12] #define INIT_BUF(dobj) { (dobj).fn = sfn; (dobj).lfn = LfnBuf; } #define FREE_BUF() #elif _USE_LFN == 2 /* LFN feature with dynamic working buffer on the stack */ -#define DEF_NAMEBUF BYTE sfn[12]; WCHAR lbuf[_MAX_LFN+1] +#define DEFINE_NAMEBUF BYTE sfn[12]; WCHAR lbuf[_MAX_LFN + 1] #define INIT_BUF(dobj) { (dobj).fn = sfn; (dobj).lfn = lbuf; } #define FREE_BUF() #elif _USE_LFN == 3 /* LFN feature with dynamic working buffer on the heap */ -#define DEF_NAMEBUF BYTE sfn[12]; WCHAR *lfn +#define DEFINE_NAMEBUF BYTE sfn[12]; WCHAR *lfn #define INIT_BUF(dobj) { lfn = ff_memalloc((_MAX_LFN + 1) * 2); if (!lfn) LEAVE_FF((dobj).fs, FR_NOT_ENOUGH_CORE); (dobj).lfn = lfn; (dobj).fn = sfn; } #define FREE_BUF() ff_memfree(lfn) #else @@ -540,7 +483,7 @@ static WCHAR LfnBuf[_MAX_LFN+1]; #endif #ifdef _EXCVT -static const BYTE ExCvt[] = _EXCVT; /* Upper conversion table for extended characters */ +static const BYTE ExCvt[] = _EXCVT; /* Upper conversion table for SBCS extended characters */ #endif @@ -754,7 +697,7 @@ void clear_lock ( /* Clear lock entries of the volume */ /*-----------------------------------------------------------------------*/ #if !_FS_READONLY static -FRESULT sync_window ( +FRESULT sync_window ( /* FR_OK:succeeded, !=0:error */ FATFS* fs /* File system object */ ) { @@ -783,7 +726,7 @@ FRESULT sync_window ( static -FRESULT move_window ( +FRESULT move_window ( /* FR_OK(0):succeeded, !=0:error */ FATFS* fs, /* File system object */ DWORD sector /* Sector number to make appearance in the fs->win[] */ ) @@ -814,7 +757,7 @@ FRESULT move_window ( /*-----------------------------------------------------------------------*/ #if !_FS_READONLY static -FRESULT sync_fs ( /* FR_OK: successful, FR_DISK_ERR: failed */ +FRESULT sync_fs ( /* FR_OK:succeeded, !=0:error */ FATFS* fs /* File system object */ ) { @@ -823,16 +766,16 @@ FRESULT sync_fs ( /* FR_OK: successful, FR_DISK_ERR: failed */ res = sync_window(fs); if (res == FR_OK) { - /* Update FSINFO sector if needed */ + /* Update FSInfo sector if needed */ if (fs->fs_type == FS_FAT32 && fs->fsi_flag == 1) { - /* Create FSINFO structure */ + /* Create FSInfo structure */ mem_set(fs->win, 0, SS(fs)); - ST_WORD(fs->win+BS_55AA, 0xAA55); - ST_DWORD(fs->win+FSI_LeadSig, 0x41615252); - ST_DWORD(fs->win+FSI_StrucSig, 0x61417272); - ST_DWORD(fs->win+FSI_Free_Count, fs->free_clust); - ST_DWORD(fs->win+FSI_Nxt_Free, fs->last_clust); - /* Write it into the FSINFO sector */ + ST_WORD(fs->win + BS_55AA, 0xAA55); + ST_DWORD(fs->win + FSI_LeadSig, 0x41615252); + ST_DWORD(fs->win + FSI_StrucSig, 0x61417272); + ST_DWORD(fs->win + FSI_Free_Count, fs->free_clust); + ST_DWORD(fs->win + FSI_Nxt_Free, fs->last_clust); + /* Write it into the FSInfo sector */ fs->winsect = fs->volbase + 1; disk_write(fs->drv, fs->win, fs->winsect, 1); fs->fsi_flag = 0; @@ -854,7 +797,7 @@ FRESULT sync_fs ( /* FR_OK: successful, FR_DISK_ERR: failed */ /*-----------------------------------------------------------------------*/ /* Hidden API for hacks and disk tools */ -DWORD clust2sect ( /* !=0: Sector number, 0: Failed - invalid cluster# */ +DWORD clust2sect ( /* !=0:Sector number, 0:Failed (invalid cluster#) */ FATFS* fs, /* File system object */ DWORD clst /* Cluster# to be converted */ ) @@ -874,7 +817,7 @@ DWORD clust2sect ( /* !=0: Sector number, 0: Failed - invalid cluster# */ DWORD get_fat ( /* 0xFFFFFFFF:Disk error, 1:Internal error, 2..0x0FFFFFFF:Cluster status */ FATFS* fs, /* File system object */ - DWORD clst /* FAT item index (cluster#) to get the value */ + DWORD clst /* FAT index number (cluster number) to get the value */ ) { UINT wc, bc; @@ -882,7 +825,7 @@ DWORD get_fat ( /* 0xFFFFFFFF:Disk error, 1:Internal error, 2..0x0FFFFFFF:Cluste DWORD val; - if (clst < 2 || clst >= fs->n_fatent) { /* Check range */ + if (clst < 2 || clst >= fs->n_fatent) { /* Check if in valid range */ val = 1; /* Internal error */ } else { @@ -927,10 +870,10 @@ DWORD get_fat ( /* 0xFFFFFFFF:Disk error, 1:Internal error, 2..0x0FFFFFFF:Cluste /* Hidden API for hacks and disk tools */ #if !_FS_READONLY -FRESULT put_fat ( - FATFS* fs, /* File system object */ - DWORD clst, /* FAT item index (cluster#) to be set */ - DWORD val /* New value to mark the cluster */ +FRESULT put_fat ( /* FR_OK(0):succeeded, !=0:error */ + FATFS* fs, /* File system object */ + DWORD clst, /* FAT index number (cluster number) to be changed */ + DWORD val /* New value to be set to the entry */ ) { UINT bc; @@ -938,7 +881,7 @@ FRESULT put_fat ( FRESULT res; - if (clst < 2 || clst >= fs->n_fatent) { /* Check range */ + if (clst < 2 || clst >= fs->n_fatent) { /* Check if in valid range */ res = FR_INT_ERR; } else { @@ -991,7 +934,7 @@ FRESULT put_fat ( /*-----------------------------------------------------------------------*/ #if !_FS_READONLY static -FRESULT remove_chain ( +FRESULT remove_chain ( /* FR_OK(0):succeeded, !=0:error */ FATFS* fs, /* File system object */ DWORD clst /* Cluster# to remove a chain from */ ) @@ -1002,7 +945,7 @@ FRESULT remove_chain ( DWORD scl = clst, ecl = clst, rt[2]; #endif - if (clst < 2 || clst >= fs->n_fatent) { /* Check range */ + if (clst < 2 || clst >= fs->n_fatent) { /* Check if in valid range */ res = FR_INT_ERR; } else { @@ -1046,7 +989,7 @@ FRESULT remove_chain ( static DWORD create_chain ( /* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# */ FATFS* fs, /* File system object */ - DWORD clst /* Cluster# to stretch. 0 means create a new chain. */ + DWORD clst /* Cluster# to stretch, 0:Create a new chain */ ) { DWORD cs, ncl, scl; @@ -1134,7 +1077,7 @@ DWORD clmt_clust ( /* <2:Error, >=2:Cluster number */ /*-----------------------------------------------------------------------*/ static -FRESULT dir_sdi ( +FRESULT dir_sdi ( /* FR_OK(0):succeeded, !=0:error */ DIR* dp, /* Pointer to directory object */ UINT idx /* Index of directory table */ ) @@ -1156,7 +1099,7 @@ FRESULT dir_sdi ( sect = dp->fs->dirbase; } else { /* Dynamic table (root-directory in FAT32 or sub-directory) */ - ic = SS(dp->fs) / SZ_DIR * dp->fs->csize; /* Entries per cluster */ + ic = SS(dp->fs) / SZ_DIRE * dp->fs->csize; /* Entries per cluster */ while (idx >= ic) { /* Follow cluster chain */ clst = get_fat(dp->fs, clst); /* Get next cluster */ if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ @@ -1168,8 +1111,8 @@ FRESULT dir_sdi ( } dp->clust = clst; /* Current cluster# */ if (!sect) return FR_INT_ERR; - dp->sect = sect + idx / (SS(dp->fs) / SZ_DIR); /* Sector# of the directory entry */ - dp->dir = dp->fs->win + (idx % (SS(dp->fs) / SZ_DIR)) * SZ_DIR; /* Ptr to the entry in the sector */ + dp->sect = sect + idx / (SS(dp->fs) / SZ_DIRE); /* Sector# of the directory entry */ + dp->dir = dp->fs->win + (idx % (SS(dp->fs) / SZ_DIRE)) * SZ_DIRE; /* Ptr to the entry in the sector */ return FR_OK; } @@ -1182,20 +1125,23 @@ FRESULT dir_sdi ( /*-----------------------------------------------------------------------*/ static -FRESULT dir_next ( /* FR_OK:Succeeded, FR_NO_FILE:End of table, FR_DENIED:Could not stretch */ +FRESULT dir_next ( /* FR_OK(0):succeeded, FR_NO_FILE:End of table, FR_DENIED:Could not stretch */ DIR* dp, /* Pointer to the directory object */ int stretch /* 0: Do not stretch table, 1: Stretch table if needed */ ) { DWORD clst; UINT i; +#if !_FS_READONLY + UINT c; +#endif i = dp->index + 1; if (!(i & 0xFFFF) || !dp->sect) /* Report EOT when index has reached 65535 */ return FR_NO_FILE; - if (!(i % (SS(dp->fs) / SZ_DIR))) { /* Sector changed? */ + if (!(i % (SS(dp->fs) / SZ_DIRE))) { /* Sector changed? */ dp->sect++; /* Next sector */ if (!dp->clust) { /* Static table */ @@ -1203,13 +1149,12 @@ FRESULT dir_next ( /* FR_OK:Succeeded, FR_NO_FILE:End of table, FR_DENIED:Could return FR_NO_FILE; } else { /* Dynamic table */ - if (((i / (SS(dp->fs) / SZ_DIR)) & (dp->fs->csize - 1)) == 0) { /* Cluster changed? */ + if (((i / (SS(dp->fs) / SZ_DIRE)) & (dp->fs->csize - 1)) == 0) { /* Cluster changed? */ clst = get_fat(dp->fs, dp->clust); /* Get next cluster */ if (clst <= 1) return FR_INT_ERR; if (clst == 0xFFFFFFFF) return FR_DISK_ERR; if (clst >= dp->fs->n_fatent) { /* If it reached end of dynamic table, */ #if !_FS_READONLY - UINT c; if (!stretch) return FR_NO_FILE; /* If do not stretch, report EOT */ clst = create_chain(dp->fs, dp->clust); /* Stretch cluster chain */ if (clst == 0) return FR_DENIED; /* No free cluster */ @@ -1237,7 +1182,7 @@ FRESULT dir_next ( /* FR_OK:Succeeded, FR_NO_FILE:End of table, FR_DENIED:Could } dp->index = (WORD)i; /* Current index */ - dp->dir = dp->fs->win + (i % (SS(dp->fs) / SZ_DIR)) * SZ_DIR; /* Current entry in the window */ + dp->dir = dp->fs->win + (i % (SS(dp->fs) / SZ_DIRE)) * SZ_DIRE; /* Current entry in the window */ return FR_OK; } @@ -1251,9 +1196,9 @@ FRESULT dir_next ( /* FR_OK:Succeeded, FR_NO_FILE:End of table, FR_DENIED:Could #if !_FS_READONLY static -FRESULT dir_alloc ( - DIR* dp, /* Pointer to the directory object */ - UINT nent /* Number of contiguous entries to allocate (1-21) */ +FRESULT dir_alloc ( /* FR_OK(0):succeeded, !=0:error */ + DIR* dp, /* Pointer to the directory object */ + UINT nent /* Number of contiguous entries to allocate (1-21) */ ) { FRESULT res; @@ -1266,7 +1211,7 @@ FRESULT dir_alloc ( do { res = move_window(dp->fs, dp->sect); if (res != FR_OK) break; - if (dp->dir[0] == DDE || dp->dir[0] == 0) { /* Is it a free entry? */ + if (dp->dir[0] == DDEM || dp->dir[0] == 0) { /* Is it a free entry? */ if (++n == nent) break; /* A block of contiguous free entries is found */ } else { n = 0; /* Not a blank entry. Restart to search */ @@ -1287,16 +1232,16 @@ FRESULT dir_alloc ( /*-----------------------------------------------------------------------*/ static -DWORD ld_clust ( - FATFS* fs, /* Pointer to the fs object */ - BYTE* dir /* Pointer to the directory entry */ +DWORD ld_clust ( /* Returns the top cluster value of the SFN entry */ + FATFS* fs, /* Pointer to the fs object */ + const BYTE* dir /* Pointer to the SFN entry */ ) { DWORD cl; - cl = LD_WORD(dir+DIR_FstClusLO); + cl = LD_WORD(dir + DIR_FstClusLO); if (fs->fs_type == FS_FAT32) - cl |= (DWORD)LD_WORD(dir+DIR_FstClusHI) << 16; + cl |= (DWORD)LD_WORD(dir + DIR_FstClusHI) << 16; return cl; } @@ -1305,12 +1250,12 @@ DWORD ld_clust ( #if !_FS_READONLY static void st_clust ( - BYTE* dir, /* Pointer to the directory entry */ + BYTE* dir, /* Pointer to the SFN entry */ DWORD cl /* Value to be set */ ) { - ST_WORD(dir+DIR_FstClusLO, cl); - ST_WORD(dir+DIR_FstClusHI, cl >> 16); + ST_WORD(dir + DIR_FstClusLO, cl); + ST_WORD(dir + DIR_FstClusHI, cl >> 16); } #endif @@ -1326,94 +1271,97 @@ const BYTE LfnOfs[] = {1,3,5,7,9,14,16,18,20,22,24,28,30}; /* Offset of LFN char static -int cmp_lfn ( /* 1:Matched, 0:Not matched */ - WCHAR* lfnbuf, /* Pointer to the LFN to be compared */ - BYTE* dir /* Pointer to the directory entry containing a part of LFN */ +int cmp_lfn ( /* 1:matched, 0:not matched */ + WCHAR* lfnbuf, /* Pointer to the LFN working buffer to be compared */ + BYTE* dir /* Pointer to the directory entry containing the part of LFN */ ) { UINT i, s; WCHAR wc, uc; - i = ((dir[LDIR_Ord] & ~LLE) - 1) * 13; /* Get offset in the LFN buffer */ - s = 0; wc = 1; - do { - uc = LD_WORD(dir+LfnOfs[s]); /* Pick an LFN character from the entry */ - if (wc) { /* Last character has not been processed */ - wc = ff_wtoupper(uc); /* Convert it to upper case */ - if (i >= _MAX_LFN || wc != ff_wtoupper(lfnbuf[i++])) /* Compare it */ - return 0; /* Not matched */ - } else { - if (uc != 0xFFFF) return 0; /* Check filler */ - } - } while (++s < 13); /* Repeat until all characters in the entry are checked */ + if (LD_WORD(dir + LDIR_FstClusLO) != 0) return 0; /* Check LDIR_FstClusLO */ - if ((dir[LDIR_Ord] & LLE) && wc && lfnbuf[i]) /* Last segment matched but different length */ + i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ + + for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ + uc = LD_WORD(dir + LfnOfs[s]); /* Pick an LFN character */ + if (wc) { + if (i >= _MAX_LFN || ff_wtoupper(uc) != ff_wtoupper(lfnbuf[i++])) /* Compare it */ + return 0; /* Not matched */ + wc = uc; + } else { + if (uc != 0xFFFF) return 0; /* Check filler */ + } + } + + if ((dir[LDIR_Ord] & LLEF) && wc && lfnbuf[i]) /* Last segment matched but different length */ return 0; - return 1; /* The part of LFN matched */ + return 1; /* The part of LFN matched */ } static -int pick_lfn ( /* 1:Succeeded, 0:Buffer overflow */ - WCHAR* lfnbuf, /* Pointer to the Unicode-LFN buffer */ - BYTE* dir /* Pointer to the directory entry */ +int pick_lfn ( /* 1:succeeded, 0:buffer overflow or invalid LFN entry */ + WCHAR* lfnbuf, /* Pointer to the LFN working buffer */ + BYTE* dir /* Pointer to the LFN entry */ ) { UINT i, s; WCHAR wc, uc; + if (LD_WORD(dir + LDIR_FstClusLO) != 0) return 0; /* Check LDIR_FstClusLO */ + i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ - s = 0; wc = 1; - do { - uc = LD_WORD(dir+LfnOfs[s]); /* Pick an LFN character from the entry */ - if (wc) { /* Last character has not been processed */ + for (wc = 1, s = 0; s < 13; s++) { /* Process all characters in the entry */ + uc = LD_WORD(dir + LfnOfs[s]); /* Pick an LFN character */ + if (wc) { if (i >= _MAX_LFN) return 0; /* Buffer overflow? */ lfnbuf[i++] = wc = uc; /* Store it */ } else { if (uc != 0xFFFF) return 0; /* Check filler */ } - } while (++s < 13); /* Read all character in the entry */ + } - if (dir[LDIR_Ord] & LLE) { /* Put terminator if it is the last LFN part */ + if (dir[LDIR_Ord] & LLEF) { /* Put terminator if it is the last LFN part */ if (i >= _MAX_LFN) return 0; /* Buffer overflow? */ lfnbuf[i] = 0; } - return 1; + return 1; /* The part of LFN is valid */ } #if !_FS_READONLY static void fit_lfn ( - const WCHAR* lfnbuf, /* Pointer to the LFN buffer */ - BYTE* dir, /* Pointer to the directory entry */ + const WCHAR* lfnbuf, /* Pointer to the LFN working buffer */ + BYTE* dir, /* Pointer to the LFN entry to be processed */ BYTE ord, /* LFN order (1-20) */ - BYTE sum /* SFN sum */ + BYTE sum /* Checksum of the corresponding SFN */ ) { UINT i, s; WCHAR wc; - dir[LDIR_Chksum] = sum; /* Set check sum */ + dir[LDIR_Chksum] = sum; /* Set checksum */ dir[LDIR_Attr] = AM_LFN; /* Set attribute. LFN entry */ dir[LDIR_Type] = 0; - ST_WORD(dir+LDIR_FstClusLO, 0); + ST_WORD(dir + LDIR_FstClusLO, 0); - i = (ord - 1) * 13; /* Get offset in the LFN buffer */ + i = (ord - 1) * 13; /* Get offset in the LFN working buffer */ s = wc = 0; do { if (wc != 0xFFFF) wc = lfnbuf[i++]; /* Get an effective character */ ST_WORD(dir+LfnOfs[s], wc); /* Put it */ if (!wc) wc = 0xFFFF; /* Padding characters following last character */ } while (++s < 13); - if (wc == 0xFFFF || !lfnbuf[i]) ord |= LLE; /* Bottom LFN part is the start of LFN sequence */ + if (wc == 0xFFFF || !lfnbuf[i]) ord |= LLEF; /* Bottom LFN part is the start of LFN sequence */ dir[LDIR_Ord] = ord; /* Set the LFN order */ } @@ -1437,14 +1385,14 @@ void gen_numname ( { BYTE ns[8], c; UINT i, j; + WCHAR wc; + DWORD sr; mem_cpy(dst, src, 11); if (seq > 5) { /* On many collisions, generate a hash number instead of sequential number */ - WCHAR wc; - DWORD sr = seq; - + sr = seq; while (*lfn) { /* Create a CRC */ wc = *lfn++; for (i = 0; i < 16; i++) { @@ -1483,7 +1431,7 @@ void gen_numname ( /*-----------------------------------------------------------------------*/ -/* Calculate sum of an SFN */ +/* Calculate checksum of an SFN entry */ /*-----------------------------------------------------------------------*/ #if _USE_LFN static @@ -1507,7 +1455,7 @@ BYTE sum_sfn ( /*-----------------------------------------------------------------------*/ static -FRESULT dir_find ( +FRESULT dir_find ( /* FR_OK(0):succeeded, !=0:error */ DIR* dp /* Pointer to the directory object linked to the file name */ ) { @@ -1531,14 +1479,14 @@ FRESULT dir_find ( if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ #if _USE_LFN /* LFN configuration */ a = dir[DIR_Attr] & AM_MASK; - if (c == DDE || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ + if (c == DDEM || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ ord = 0xFF; dp->lfn_idx = 0xFFFF; /* Reset LFN sequence */ } else { if (a == AM_LFN) { /* An LFN entry is found */ if (dp->lfn) { - if (c & LLE) { /* Is it start of LFN sequence? */ + if (c & LLEF) { /* Is it start of LFN sequence? */ sum = dir[LDIR_Chksum]; - c &= ~LLE; ord = c; /* LFN start order */ + c &= ~LLEF; ord = c; /* LFN start order */ dp->lfn_idx = dp->index; /* Start index of LFN */ } /* Check validity of the LFN entry and compare it with given name */ @@ -1588,13 +1536,13 @@ FRESULT dir_read ( if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ a = dir[DIR_Attr] & AM_MASK; #if _USE_LFN /* LFN configuration */ - if (c == DDE || (!_FS_RPATH && c == '.') || (int)((a & ~AM_ARC) == AM_VOL) != vol) { /* An entry without valid data */ + if (c == DDEM || (!_FS_RPATH && c == '.') || (int)((a & ~AM_ARC) == AM_VOL) != vol) { /* An entry without valid data */ ord = 0xFF; } else { if (a == AM_LFN) { /* An LFN entry is found */ - if (c & LLE) { /* Is it start of LFN sequence? */ + if (c & LLEF) { /* Is it start of LFN sequence? */ sum = dir[LDIR_Chksum]; - c &= ~LLE; ord = c; + c &= ~LLEF; ord = c; dp->lfn_idx = dp->index; } /* Check LFN validity and capture it */ @@ -1606,7 +1554,7 @@ FRESULT dir_read ( } } #else /* Non LFN configuration */ - if (c != DDE && (_FS_RPATH || c != '.') && a != AM_LFN && (int)((a & ~AM_ARC) == AM_VOL) == vol) /* Is it a valid entry? */ + if (c != DDEM && (_FS_RPATH || c != '.') && a != AM_LFN && (int)((a & ~AM_ARC) == AM_VOL) == vol) /* Is it a valid entry? */ break; #endif res = dir_next(dp, 0); /* Next entry */ @@ -1627,7 +1575,7 @@ FRESULT dir_read ( /*-----------------------------------------------------------------------*/ #if !_FS_READONLY static -FRESULT dir_register ( /* FR_OK:Successful, FR_DENIED:No free entry or too many SFN collision, FR_DISK_ERR:Disk error */ +FRESULT dir_register ( /* FR_OK:succeeded, FR_DENIED:no free entry or too many SFN collision, FR_DISK_ERR:disk error */ DIR* dp /* Target directory with object name to be created */ ) { @@ -1667,7 +1615,7 @@ FRESULT dir_register ( /* FR_OK:Successful, FR_DENIED:No free entry or too many if (res == FR_OK && --nent) { /* Set LFN entry if needed */ res = dir_sdi(dp, dp->index - nent); if (res == FR_OK) { - sum = sum_sfn(dp->fn); /* Sum value of the SFN tied to the LFN */ + sum = sum_sfn(dp->fn); /* Checksum value of the SFN tied to the LFN */ do { /* Store LFN entries in bottom first */ res = move_window(dp->fs, dp->sect); if (res != FR_OK) break; @@ -1684,7 +1632,7 @@ FRESULT dir_register ( /* FR_OK:Successful, FR_DENIED:No free entry or too many if (res == FR_OK) { /* Set SFN entry */ res = move_window(dp->fs, dp->sect); if (res == FR_OK) { - mem_set(dp->dir, 0, SZ_DIR); /* Clean the entry */ + mem_set(dp->dir, 0, SZ_DIRE); /* Clean the entry */ mem_cpy(dp->dir, dp->fn, 11); /* Put SFN */ #if _USE_LFN dp->dir[DIR_NTres] = dp->fn[NSFLAG] & (NS_BODY | NS_EXT); /* Put NT flag */ @@ -1705,7 +1653,7 @@ FRESULT dir_register ( /* FR_OK:Successful, FR_DENIED:No free entry or too many /*-----------------------------------------------------------------------*/ #if !_FS_READONLY && !_FS_MINIMIZE static -FRESULT dir_remove ( /* FR_OK: Successful, FR_DISK_ERR: A disk error */ +FRESULT dir_remove ( /* FR_OK:Succeeded, FR_DISK_ERR:A disk error */ DIR* dp /* Directory object pointing the entry to be removed */ ) { @@ -1719,8 +1667,8 @@ FRESULT dir_remove ( /* FR_OK: Successful, FR_DISK_ERR: A disk error */ do { res = move_window(dp->fs, dp->sect); if (res != FR_OK) break; - mem_set(dp->dir, 0, SZ_DIR); /* Clear and mark the entry "deleted" */ - *dp->dir = DDE; + mem_set(dp->dir, 0, SZ_DIRE); /* Clear and mark the entry "deleted" */ + *dp->dir = DDEM; dp->fs->wflag = 1; if (dp->index >= i) break; /* When reached SFN, all entries of the object has been deleted. */ res = dir_next(dp, 0); /* Next entry */ @@ -1733,8 +1681,8 @@ FRESULT dir_remove ( /* FR_OK: Successful, FR_DISK_ERR: A disk error */ if (res == FR_OK) { res = move_window(dp->fs, dp->sect); if (res == FR_OK) { - mem_set(dp->dir, 0, SZ_DIR); /* Clear and mark the entry "deleted" */ - *dp->dir = DDE; + mem_set(dp->dir, 0, SZ_DIRE); /* Clear and mark the entry "deleted" */ + *dp->dir = DDEM; dp->fs->wflag = 1; } } @@ -1759,18 +1707,20 @@ void get_fileinfo ( /* No return code */ { UINT i; TCHAR *p, c; - + BYTE *dir; +#if _USE_LFN + WCHAR w, *lfn; +#endif p = fno->fname; if (dp->sect) { /* Get SFN */ - BYTE *dir = dp->dir; - + dir = dp->dir; i = 0; while (i < 11) { /* Copy name body and extension */ c = (TCHAR)dir[i++]; - if (c == ' ') continue; /* Skip padding spaces */ - if (c == NDDE) c = (TCHAR)DDE; /* Restore replaced DDE character */ - if (i == 9) *p++ = '.'; /* Insert a . if extension is exist */ + if (c == ' ') continue; /* Skip padding spaces */ + if (c == RDDEM) c = (TCHAR)DDEM; /* Restore replaced DDEM character */ + if (i == 9) *p++ = '.'; /* Insert a . if extension is exist */ #if _USE_LFN if (IsUpper(c) && (dir[DIR_NTres] & (i >= 9 ? NS_EXT : NS_BODY))) c += 0x20; /* To lower */ @@ -1784,16 +1734,14 @@ void get_fileinfo ( /* No return code */ *p++ = c; } fno->fattrib = dir[DIR_Attr]; /* Attribute */ - fno->fsize = LD_DWORD(dir+DIR_FileSize); /* Size */ - fno->fdate = LD_WORD(dir+DIR_WrtDate); /* Date */ - fno->ftime = LD_WORD(dir+DIR_WrtTime); /* Time */ + fno->fsize = LD_DWORD(dir + DIR_FileSize); /* Size */ + fno->fdate = LD_WORD(dir + DIR_WrtDate); /* Date */ + fno->ftime = LD_WORD(dir + DIR_WrtTime); /* Time */ } *p = 0; /* Terminate SFN string by a \0 */ #if _USE_LFN if (fno->lfname) { - WCHAR w, *lfn; - i = 0; p = fno->lfname; if (dp->sect && fno->lfsize && dp->lfn_idx != 0xFFFF) { /* Get LFN if available */ lfn = dp->lfn; @@ -1812,17 +1760,87 @@ void get_fileinfo ( /* No return code */ } #endif } -#endif /* _FS_MINIMIZE <= 1 || _FS_RPATH >= 2*/ +#endif /* _FS_MINIMIZE <= 1 || _FS_RPATH >= 2 */ /*-----------------------------------------------------------------------*/ -/* Pick a segment and create the object name in directory form */ +/* Pattern matching */ +/*-----------------------------------------------------------------------*/ +#if _USE_FIND && _FS_MINIMIZE <= 1 +static +WCHAR get_achar ( /* Get a character and advances ptr 1 or 2 */ + const TCHAR** ptr /* Pointer to pointer to the SBCS/DBCS/Unicode string */ +) +{ + WCHAR chr; + +#if !_LFN_UNICODE + chr = (BYTE)*(*ptr)++; /* Get a byte */ + if (IsLower(chr)) chr -= 0x20; /* To upper ASCII char */ + if (IsDBCS1(chr) && IsDBCS2(**ptr)) /* Get DBC 2nd byte if needed */ + chr = chr << 8 | (BYTE)*(*ptr)++; +#ifdef _EXCVT + if (chr >= 0x80) chr = ExCvt[chr - 0x80]; /* To upper SBCS extended char */ +#endif +#else + chr = ff_wtoupper(*(*ptr)++); /* Get a word and to upper */ +#endif + return chr; +} + + +static +int pattern_matching ( /* 0:mismatched, 1:matched */ + const TCHAR* pat, /* Matching pattern */ + const TCHAR* nam, /* String to be tested */ + int skip, /* Number of pre-skip chars (number of ?s) */ + int inf /* Infinite search (* specified) */ +) +{ + const TCHAR *pp, *np; + WCHAR pc, nc; + int nm, nx; + + + while (skip--) { /* Pre-skip name chars */ + if (!get_achar(&nam)) return 0; /* Branch mismatched if less name chars */ + } + if (!*pat && inf) return 1; /* (short circuit) */ + + do { + pp = pat; np = nam; /* Top of pattern and name to match */ + for (;;) { + if (*pp == '?' || *pp == '*') { /* Wildcard? */ + nm = nx = 0; + do { /* Analyze the wildcard chars */ + if (*pp++ == '?') nm++; else nx = 1; + } while (*pp == '?' || *pp == '*'); + if (pattern_matching(pp, np, nm, nx)) return 1; /* Test new branch (recurs upto number of wildcard blocks in the pattern) */ + nc = *np; break; /* Branch mismatched */ + } + pc = get_achar(&pp); /* Get a pattern char */ + nc = get_achar(&np); /* Get a name char */ + if (pc != nc) break; /* Branch mismatched? */ + if (!pc) return 1; /* Branch matched? (matched at end of both strings) */ + } + get_achar(&nam); /* nam++ */ + } while (inf && nc); /* Retry until end of name if infinite search is specified */ + + return 0; +} +#endif /* _USE_FIND && _FS_MINIMIZE <= 1 */ + + + + +/*-----------------------------------------------------------------------*/ +/* Pick a top segment and create the object name in directory form */ /*-----------------------------------------------------------------------*/ static -FRESULT create_name ( +FRESULT create_name ( /* FR_OK: successful, FR_INVALID_NAME: could not create */ DIR* dp, /* Pointer to the directory object */ const TCHAR** path /* Pointer to pointer to the segment in the path string */ ) @@ -1846,9 +1864,9 @@ FRESULT create_name ( w &= 0xFF; if (IsDBCS1(w)) { /* Check if it is a DBC 1st byte (always false on SBCS cfg) */ b = (BYTE)p[si++]; /* Get 2nd byte */ + w = (w << 8) + b; /* Create a DBC */ if (!IsDBCS2(b)) return FR_INVALID_NAME; /* Reject invalid sequence */ - w = (w << 8) + b; /* Create a DBC */ } w = ff_convert(w, 1); /* Convert ANSI/OEM to Unicode */ if (!w) return FR_INVALID_NAME; /* Reject invalid code */ @@ -1860,22 +1878,21 @@ FRESULT create_name ( *path = &p[si]; /* Return pointer to the next segment */ cf = (w < ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ #if _FS_RPATH - if ((di == 1 && lfn[di-1] == '.') || /* Is this a dot entry? */ - (di == 2 && lfn[di-1] == '.' && lfn[di-2] == '.')) { + if ((di == 1 && lfn[di - 1] == '.') || + (di == 2 && lfn[di - 1] == '.' && lfn[di - 2] == '.')) { /* Is this segment a dot entry? */ lfn[di] = 0; - for (i = 0; i < 11; i++) + for (i = 0; i < 11; i++) /* Create dot name for SFN entry */ dp->fn[i] = (i < di) ? '.' : ' '; dp->fn[i] = cf | NS_DOT; /* This is a dot entry */ return FR_OK; } #endif - while (di) { /* Strip trailing spaces and dots */ - w = lfn[di-1]; + while (di) { /* Snip off trailing spaces and dots if exist */ + w = lfn[di - 1]; if (w != ' ' && w != '.') break; di--; } if (!di) return FR_INVALID_NAME; /* Reject nul string */ - lfn[di] = 0; /* LFN is created */ /* Create SFN in directory form */ @@ -1912,12 +1929,12 @@ FRESULT create_name ( cf |= NS_LFN; /* Force create LFN entry */ } - if (_DF1S && w >= 0x100) { /* Double byte character (always false on SBCS cfg) */ + if (_DF1S && w >= 0x100) { /* Is this DBC? (always false at SBCS cfg) */ if (i >= ni - 1) { cf |= NS_LOSS | NS_LFN; i = ni; continue; } dp->fn[i++] = (BYTE)(w >> 8); - } else { /* Single byte character */ + } else { /* SBC */ if (!w || chk_chr("+,;=[]", w)) { /* Replace illegal characters for SFN */ w = '_'; cf |= NS_LOSS | NS_LFN;/* Lossy conversion */ } else { @@ -1933,7 +1950,7 @@ FRESULT create_name ( dp->fn[i++] = (BYTE)w; } - if (dp->fn[0] == DDE) dp->fn[0] = NDDE; /* If the first character collides with deleted mark, replace it with 0x05 */ + if (dp->fn[0] == DDEM) dp->fn[0] = RDDEM; /* If the first character collides with DDEM, replace it with RDDEM */ if (ni == 8) b <<= 2; if ((b & 0x0C) == 0x0C || (b & 0x03) == 0x03) /* Create LFN entry when there are composite capitals */ @@ -1954,7 +1971,7 @@ FRESULT create_name ( const char *p; /* Create file name in directory form */ - for (p = *path; *p == '/' || *p == '\\'; p++) ; /* Strip duplicated separator */ + for (p = *path; *p == '/' || *p == '\\'; p++) ; /* Skip duplicated separator */ sfn = dp->fn; mem_set(sfn, ' ', 11); si = i = b = 0; ni = 8; @@ -1989,13 +2006,13 @@ FRESULT create_name ( #endif #endif } - if (IsDBCS1(c)) { /* Check if it is a DBC 1st byte (always false on SBCS cfg) */ + if (IsDBCS1(c)) { /* Check if it is a DBC 1st byte (always false at SBCS cfg.) */ d = (BYTE)p[si++]; /* Get 2nd byte */ if (!IsDBCS2(d) || i >= ni - 1) /* Reject invalid DBC */ return FR_INVALID_NAME; sfn[i++] = c; sfn[i++] = d; - } else { /* Single byte code */ + } else { /* SBC */ if (chk_chr("\"*+,:;<=>\?[]|\x7F", c)) /* Reject illegal chrs for SFN */ return FR_INVALID_NAME; if (IsUpper(c)) { /* ASCII large capital? */ @@ -2012,7 +2029,7 @@ FRESULT create_name ( c = (c <= ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ if (!i) return FR_INVALID_NAME; /* Reject nul string */ - if (sfn[0] == DDE) sfn[0] = NDDE; /* When first character collides with DDE, replace it with 0x05 */ + if (sfn[0] == DDEM) sfn[0] = RDDEM; /* When first character collides with DDEM, replace it with RDDEM */ if (ni == 8) b <<= 2; if ((b & 0x03) == 0x01) c |= NS_EXT; /* NT flag (Name extension has only small capital) */ @@ -2101,6 +2118,12 @@ int get_ldnumber ( /* Returns logical drive number (-1:invalid drive) */ const TCHAR *tp, *tt; UINT i; int vol = -1; +#if _STR_VOLUME_ID /* Find string drive id */ + static const char* const str[] = {_VOLUME_STRS}; + const char *sp; + char c; + TCHAR tc; +#endif if (*path) { /* If the pointer is not a null */ @@ -2113,13 +2136,9 @@ int get_ldnumber ( /* Returns logical drive number (-1:invalid drive) */ vol = (int)i; *path = ++tt; } - } else { /* No numeric drive number */ -#if _STR_VOLUME_ID /* Find string drive id */ - static const char* const str[] = {_VOLUME_STRS}; - const char *sp; - char c; - TCHAR tc; - + } +#if _STR_VOLUME_ID + else { /* No numeric drive number, find string drive id */ i = 0; tt++; do { sp = str[i]; tp = *path; @@ -2132,8 +2151,8 @@ int get_ldnumber ( /* Returns logical drive number (-1:invalid drive) */ vol = (int)i; *path = tt; } -#endif } +#endif return vol; } #if _FS_RPATH && _VOLUMES >= 2 @@ -2153,7 +2172,7 @@ int get_ldnumber ( /* Returns logical drive number (-1:invalid drive) */ /*-----------------------------------------------------------------------*/ static -BYTE check_fs ( /* 0:FAT boor sector, 1:Valid boor sector but not FAT, 2:Not a boot sector, 3:Disk error */ +BYTE check_fs ( /* 0:Valid FAT-BS, 1:Valid BS but not FAT, 2:Not a BS, 3:Disk error */ FATFS* fs, /* File system object */ DWORD sect /* Sector# (lba) to check if it is an FAT boot record or not */ ) @@ -2187,12 +2206,13 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */ BYTE wmode /* !=0: Check write protection for write access */ ) { - BYTE fmt; + BYTE fmt, *pt; int vol; DSTATUS stat; - DWORD bsect, fasize, tsect, sysect, nclst, szbfat; + DWORD bsect, fasize, tsect, sysect, nclst, szbfat, br[4]; WORD nrsv; FATFS *fs; + UINT i; /* Get logical drive number from the path name */ @@ -2234,11 +2254,8 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */ bsect = 0; fmt = check_fs(fs, bsect); /* Load sector 0 and check if it is an FAT boot sector as SFD */ if (fmt == 1 || (!fmt && (LD2PT(vol)))) { /* Not an FAT boot sector or forced partition number */ - UINT i; - DWORD br[4]; - for (i = 0; i < 4; i++) { /* Get partition offset */ - BYTE *pt = fs->win+MBR_Table + i * SZ_PTE; + pt = fs->win + MBR_Table + i * SZ_PTE; br[i] = pt[4] ? LD_DWORD(&pt[8]) : 0; } i = LD2PT(vol); /* Partition number: 0:auto, 1-4:forced */ @@ -2253,11 +2270,11 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */ /* An FAT volume is found. Following code initializes the file system object */ - if (LD_WORD(fs->win+BPB_BytsPerSec) != SS(fs)) /* (BPB_BytsPerSec must be equal to the physical sector size) */ + if (LD_WORD(fs->win + BPB_BytsPerSec) != SS(fs)) /* (BPB_BytsPerSec must be equal to the physical sector size) */ return FR_NO_FILESYSTEM; - fasize = LD_WORD(fs->win+BPB_FATSz16); /* Number of sectors per FAT */ - if (!fasize) fasize = LD_DWORD(fs->win+BPB_FATSz32); + fasize = LD_WORD(fs->win + BPB_FATSz16); /* Number of sectors per FAT */ + if (!fasize) fasize = LD_DWORD(fs->win + BPB_FATSz32); fs->fsize = fasize; fs->n_fats = fs->win[BPB_NumFATs]; /* Number of FAT copies */ @@ -2269,18 +2286,18 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */ if (!fs->csize || (fs->csize & (fs->csize - 1))) /* (Must be power of 2) */ return FR_NO_FILESYSTEM; - fs->n_rootdir = LD_WORD(fs->win+BPB_RootEntCnt); /* Number of root directory entries */ - if (fs->n_rootdir % (SS(fs) / SZ_DIR)) /* (Must be sector aligned) */ + fs->n_rootdir = LD_WORD(fs->win + BPB_RootEntCnt); /* Number of root directory entries */ + if (fs->n_rootdir % (SS(fs) / SZ_DIRE)) /* (Must be sector aligned) */ return FR_NO_FILESYSTEM; - tsect = LD_WORD(fs->win+BPB_TotSec16); /* Number of sectors on the volume */ - if (!tsect) tsect = LD_DWORD(fs->win+BPB_TotSec32); + tsect = LD_WORD(fs->win + BPB_TotSec16); /* Number of sectors on the volume */ + if (!tsect) tsect = LD_DWORD(fs->win + BPB_TotSec32); - nrsv = LD_WORD(fs->win+BPB_RsvdSecCnt); /* Number of reserved sectors */ + nrsv = LD_WORD(fs->win + BPB_RsvdSecCnt); /* Number of reserved sectors */ if (!nrsv) return FR_NO_FILESYSTEM; /* (Must not be 0) */ /* Determine the FAT sub type */ - sysect = nrsv + fasize + fs->n_rootdir / (SS(fs) / SZ_DIR); /* RSV+FAT+DIR */ + sysect = nrsv + fasize + fs->n_rootdir / (SS(fs) / SZ_DIRE); /* RSV + FAT + DIR */ if (tsect < sysect) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ nclst = (tsect - sysect) / fs->csize; /* Number of clusters */ if (!nclst) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ @@ -2295,7 +2312,7 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */ fs->database = bsect + sysect; /* Data start sector */ if (fmt == FS_FAT32) { if (fs->n_rootdir) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must be 0) */ - fs->dirbase = LD_DWORD(fs->win+BPB_RootClus); /* Root directory start cluster */ + fs->dirbase = LD_DWORD(fs->win + BPB_RootClus); /* Root directory start cluster */ szbfat = fs->n_fatent * 4; /* (Needed FAT size) */ } else { if (!fs->n_rootdir) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must not be 0) */ @@ -2313,20 +2330,20 @@ FRESULT find_volume ( /* FR_OK(0): successful, !=0: any error occurred */ /* Get fsinfo if available */ fs->fsi_flag = 0x80; #if (_FS_NOFSINFO & 3) != 3 - if (fmt == FS_FAT32 /* Enable FSINFO only if FAT32 and BPB_FSInfo is 1 */ - && LD_WORD(fs->win+BPB_FSInfo) == 1 + if (fmt == FS_FAT32 /* Enable FSINFO only if FAT32 and BPB_FSInfo == 1 */ + && LD_WORD(fs->win + BPB_FSInfo) == 1 && move_window(fs, bsect + 1) == FR_OK) { fs->fsi_flag = 0; - if (LD_WORD(fs->win+BS_55AA) == 0xAA55 /* Load FSINFO data if available */ - && LD_DWORD(fs->win+FSI_LeadSig) == 0x41615252 - && LD_DWORD(fs->win+FSI_StrucSig) == 0x61417272) + if (LD_WORD(fs->win + BS_55AA) == 0xAA55 /* Load FSINFO data if available */ + && LD_DWORD(fs->win + FSI_LeadSig) == 0x41615252 + && LD_DWORD(fs->win + FSI_StrucSig) == 0x61417272) { #if (_FS_NOFSINFO & 1) == 0 - fs->free_clust = LD_DWORD(fs->win+FSI_Free_Count); + fs->free_clust = LD_DWORD(fs->win + FSI_Free_Count); #endif #if (_FS_NOFSINFO & 2) == 0 - fs->last_clust = LD_DWORD(fs->win+FSI_Nxt_Free); + fs->last_clust = LD_DWORD(fs->win + FSI_Nxt_Free); #endif } } @@ -2359,14 +2376,11 @@ FRESULT validate ( /* FR_OK(0): The object is valid, !=0: Invalid */ FIL *fil = (FIL*)obj; /* Assuming offset of .fs and .id in the FIL/DIR structure is identical */ - if (!fil || !fil->fs || !fil->fs->fs_type || fil->fs->id != fil->id) + if (!fil || !fil->fs || !fil->fs->fs_type || fil->fs->id != fil->id || (disk_status(fil->fs->drv) & STA_NOINIT)) return FR_INVALID_OBJECT; ENTER_FF(fil->fs); /* Lock file system */ - if (disk_status(fil->fs->drv) & STA_NOINIT) - return FR_NOT_READY; - return FR_OK; } @@ -2377,7 +2391,7 @@ FRESULT validate ( /* FR_OK(0): The object is valid, !=0: Invalid */ Public Functions ---------------------------------------------------------------------------*/ +---------------------------------------------------------------------------*/ @@ -2441,7 +2455,10 @@ FRESULT f_open ( FRESULT res; DIR dj; BYTE *dir; - DEF_NAMEBUF; + DEFINE_NAMEBUF; +#if !_FS_READONLY + DWORD dw, cl; +#endif if (!fp) return FR_INVALID_OBJECT; @@ -2470,8 +2487,6 @@ FRESULT f_open ( } /* Create or Open a file */ if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) { - DWORD dw, cl; - if (res != FR_OK) { /* No file, create new */ if (res == FR_NO_FILE) /* There is no file to open, create a new entry */ #if _FS_LOCK @@ -2491,12 +2506,13 @@ FRESULT f_open ( } } if (res == FR_OK && (mode & FA_CREATE_ALWAYS)) { /* Truncate it if overwrite mode */ - dw = GET_FATTIME(); /* Created time */ - ST_DWORD(dir+DIR_CrtTime, dw); + dw = GET_FATTIME(); + ST_DWORD(dir + DIR_CrtTime, dw);/* Set created time */ + ST_DWORD(dir + DIR_WrtTime, dw);/* Set modified time */ dir[DIR_Attr] = 0; /* Reset attribute */ - ST_DWORD(dir+DIR_FileSize, 0); /* size = 0 */ - cl = ld_clust(dj.fs, dir); /* Get start cluster */ - st_clust(dir, 0); /* cluster = 0 */ + ST_DWORD(dir + DIR_FileSize, 0);/* Reset file size */ + cl = ld_clust(dj.fs, dir); /* Get cluster chain */ + st_clust(dir, 0); /* Reset cluster */ dj.fs->wflag = 1; if (cl) { /* Remove the cluster chain if exist */ dw = dj.fs->winsect; @@ -2509,7 +2525,7 @@ FRESULT f_open ( } } else { /* Open an existing file */ - if (res == FR_OK) { /* Follow succeeded */ + if (res == FR_OK) { /* Following succeeded */ if (dir[DIR_Attr] & AM_DIR) { /* It is a directory */ res = FR_NO_FILE; } else { @@ -2546,7 +2562,7 @@ FRESULT f_open ( fp->flag = mode; /* File access mode */ fp->err = 0; /* Clear error flag */ fp->sclust = ld_clust(dj.fs, dir); /* File start cluster */ - fp->fsize = LD_DWORD(dir+DIR_FileSize); /* File size */ + fp->fsize = LD_DWORD(dir + DIR_FileSize); /* File size */ fp->fptr = 0; /* File pointer */ fp->dsect = 0; #if _USE_FASTSEEK @@ -2800,10 +2816,9 @@ FRESULT f_sync ( res = validate(fp); /* Check validity of the object */ if (res == FR_OK) { - if (fp->flag & FA__WRITTEN) { /* Has the file been written? */ - /* Write-back dirty buffer */ + if (fp->flag & FA__WRITTEN) { /* Is there any change to the file? */ #if !_FS_TINY - if (fp->flag & FA__DIRTY) { + if (fp->flag & FA__DIRTY) { /* Write-back cached data if needed */ if (disk_write(fp->fs->drv, fp->buf, fp->dsect, 1) != RES_OK) LEAVE_FF(fp->fs, FR_DISK_ERR); fp->flag &= ~FA__DIRTY; @@ -2814,11 +2829,11 @@ FRESULT f_sync ( if (res == FR_OK) { dir = fp->dir_ptr; dir[DIR_Attr] |= AM_ARC; /* Set archive bit */ - ST_DWORD(dir+DIR_FileSize, fp->fsize); /* Update file size */ + ST_DWORD(dir + DIR_FileSize, fp->fsize); /* Update file size */ st_clust(dir, fp->sclust); /* Update start cluster */ - tm = GET_FATTIME(); /* Update updated time */ - ST_DWORD(dir+DIR_WrtTime, tm); - ST_WORD(dir+DIR_LstAccDate, 0); + tm = GET_FATTIME(); /* Update modified time */ + ST_DWORD(dir + DIR_WrtTime, tm); + ST_WORD(dir + DIR_LstAccDate, 0); fp->flag &= ~FA__WRITTEN; fp->fs->wflag = 1; res = sync_fs(fp->fs); @@ -2900,7 +2915,7 @@ FRESULT f_chdir ( { FRESULT res; DIR dj; - DEF_NAMEBUF; + DEFINE_NAMEBUF; /* Get logical drive number */ @@ -2938,7 +2953,7 @@ FRESULT f_getcwd ( DWORD ccl; TCHAR *tp; FILINFO fno; - DEF_NAMEBUF; + DEFINE_NAMEBUF; *buff = 0; @@ -3016,6 +3031,10 @@ FRESULT f_lseek ( ) { FRESULT res; + DWORD clst, bcs, nsect, ifptr; +#if _USE_FASTSEEK + DWORD cl, pcl, ncl, tcl, dsc, tlen, ulen, *tbl; +#endif res = validate(fp); /* Check validity of the object */ @@ -3025,8 +3044,6 @@ FRESULT f_lseek ( #if _USE_FASTSEEK if (fp->cltbl) { /* Fast seek */ - DWORD cl, pcl, ncl, tcl, dsc, tlen, ulen, *tbl; - if (ofs == CREATE_LINKMAP) { /* Create CLMT */ tbl = fp->cltbl; tlen = *tbl++; ulen = 2; /* Given table size and required table size */ @@ -3082,8 +3099,6 @@ FRESULT f_lseek ( /* Normal Seek */ { - DWORD clst, bcs, nsect, ifptr; - if (ofs > fp->fsize /* In read-only mode, clip offset with the file size */ #if !_FS_READONLY && !(fp->flag & FA_WRITE) @@ -3175,7 +3190,7 @@ FRESULT f_opendir ( { FRESULT res; FATFS* fs; - DEF_NAMEBUF; + DEFINE_NAMEBUF; if (!dp) return FR_INVALID_OBJECT; @@ -3262,7 +3277,7 @@ FRESULT f_readdir ( ) { FRESULT res; - DEF_NAMEBUF; + DEFINE_NAMEBUF; res = validate(dp); /* Check validity of the object */ @@ -3293,6 +3308,58 @@ FRESULT f_readdir ( +#if _USE_FIND +/*-----------------------------------------------------------------------*/ +/* Find next file */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_findnext ( + DIR* dp, /* Pointer to the open directory object */ + FILINFO* fno /* Pointer to the file information structure */ +) +{ + FRESULT res; + + + for (;;) { + res = f_readdir(dp, fno); /* Get a directory item */ + if (res != FR_OK || !fno || !fno->fname[0]) break; /* Terminate if any error or end of directory */ +#if _USE_LFN + if (fno->lfname && pattern_matching(dp->pat, fno->lfname, 0, 0)) break; /* Test for LFN if exist */ +#endif + if (pattern_matching(dp->pat, fno->fname, 0, 0)) break; /* Test for SFN */ + } + return res; + +} + + + +/*-----------------------------------------------------------------------*/ +/* Find first file */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_findfirst ( + DIR* dp, /* Pointer to the blank directory object */ + FILINFO* fno, /* Pointer to the file information structure */ + const TCHAR* path, /* Pointer to the directory to open */ + const TCHAR* pattern /* Pointer to the matching pattern */ +) +{ + FRESULT res; + + + dp->pat = pattern; /* Save pointer to pattern string */ + res = f_opendir(dp, path); /* Open the target directory */ + if (res == FR_OK) + res = f_findnext(dp, fno); /* Find the first item */ + return res; +} + +#endif /* _USE_FIND */ + + + #if _FS_MINIMIZE == 0 /*-----------------------------------------------------------------------*/ /* Get File Status */ @@ -3305,7 +3372,7 @@ FRESULT f_stat ( { FRESULT res; DIR dj; - DEF_NAMEBUF; + DEFINE_NAMEBUF; /* Get logical drive number */ @@ -3341,7 +3408,7 @@ FRESULT f_getfree ( { FRESULT res; FATFS *fs; - DWORD n, clst, sect, stat; + DWORD nfree, clst, sect, stat; UINT i; BYTE fat, *p; @@ -3356,18 +3423,17 @@ FRESULT f_getfree ( } else { /* Get number of free clusters */ fat = fs->fs_type; - n = 0; - if (fat == FS_FAT12) { + nfree = 0; + if (fat == FS_FAT12) { /* Sector unalighed entries: Search FAT via regular routine. */ clst = 2; do { stat = get_fat(fs, clst); if (stat == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } if (stat == 1) { res = FR_INT_ERR; break; } - if (stat == 0) n++; + if (stat == 0) nfree++; } while (++clst < fs->n_fatent); - } else { - clst = fs->n_fatent; - sect = fs->fatbase; + } else { /* Sector alighed entries: Accelerate the FAT search. */ + clst = fs->n_fatent; sect = fs->fatbase; i = 0; p = 0; do { if (!i) { @@ -3377,17 +3443,17 @@ FRESULT f_getfree ( i = SS(fs); } if (fat == FS_FAT16) { - if (LD_WORD(p) == 0) n++; + if (LD_WORD(p) == 0) nfree++; p += 2; i -= 2; } else { - if ((LD_DWORD(p) & 0x0FFFFFFF) == 0) n++; + if ((LD_DWORD(p) & 0x0FFFFFFF) == 0) nfree++; p += 4; i -= 4; } } while (--clst); } - fs->free_clust = n; - fs->fsi_flag |= 1; - *nclst = n; + fs->free_clust = nfree; /* free_clust is valid */ + fs->fsi_flag |= 1; /* FSInfo is to be updated */ + *nclst = nfree; /* Return the free clusters */ } } LEAVE_FF(fs, res); @@ -3464,7 +3530,7 @@ FRESULT f_unlink ( DIR dj, sdj; BYTE *dir; DWORD dclst = 0; - DEF_NAMEBUF; + DEFINE_NAMEBUF; /* Get logical drive number */ @@ -3485,22 +3551,23 @@ FRESULT f_unlink ( if (dir[DIR_Attr] & AM_RDO) res = FR_DENIED; /* Cannot remove R/O object */ } - if (res == FR_OK && (dir[DIR_Attr] & AM_DIR)) { /* Is it a sub-dir? */ + if (res == FR_OK) { dclst = ld_clust(dj.fs, dir); - if (!dclst) { - res = FR_INT_ERR; - } else { /* Make sure the sub-directory is empty */ - mem_cpy(&sdj, &dj, sizeof (DIR)); - sdj.sclust = dclst; - res = dir_sdi(&sdj, 2); /* Exclude dot entries */ - if (res == FR_OK) { - res = dir_read(&sdj, 0); /* Read an item */ - if (res == FR_OK /* Not empty directory */ + if (dclst && (dir[DIR_Attr] & AM_DIR)) { /* Is it a sub-directory ? */ #if _FS_RPATH - || dclst == dj.fs->cdir /* or current directory */ + if (dclst == dj.fs->cdir) { /* Is it the current directory? */ + res = FR_DENIED; + } else #endif - ) res = FR_DENIED; - if (res == FR_NO_FILE) res = FR_OK; /* It is empty */ + { + mem_cpy(&sdj, &dj, sizeof (DIR)); /* Open the sub-directory */ + sdj.sclust = dclst; + res = dir_sdi(&sdj, 2); + if (res == FR_OK) { + res = dir_read(&sdj, 0); /* Read an item (excluding dot entries) */ + if (res == FR_OK) res = FR_DENIED; /* Not empty? (cannot remove) */ + if (res == FR_NO_FILE) res = FR_OK; /* Empty? (can remove) */ + } } } } @@ -3532,7 +3599,7 @@ FRESULT f_mkdir ( DIR dj; BYTE *dir, n; DWORD dsc, dcl, pcl, tm = GET_FATTIME(); - DEF_NAMEBUF; + DEFINE_NAMEBUF; /* Get logical drive number */ @@ -3555,16 +3622,16 @@ FRESULT f_mkdir ( dsc = clust2sect(dj.fs, dcl); dir = dj.fs->win; mem_set(dir, 0, SS(dj.fs)); - mem_set(dir+DIR_Name, ' ', 11); /* Create "." entry */ + mem_set(dir + DIR_Name, ' ', 11); /* Create "." entry */ dir[DIR_Name] = '.'; dir[DIR_Attr] = AM_DIR; - ST_DWORD(dir+DIR_WrtTime, tm); + ST_DWORD(dir + DIR_WrtTime, tm); st_clust(dir, dcl); - mem_cpy(dir+SZ_DIR, dir, SZ_DIR); /* Create ".." entry */ - dir[SZ_DIR+1] = '.'; pcl = dj.sclust; + mem_cpy(dir + SZ_DIRE, dir, SZ_DIRE); /* Create ".." entry */ + dir[SZ_DIRE + 1] = '.'; pcl = dj.sclust; if (dj.fs->fs_type == FS_FAT32 && pcl == dj.fs->dirbase) pcl = 0; - st_clust(dir+SZ_DIR, pcl); + st_clust(dir + SZ_DIRE, pcl); for (n = dj.fs->csize; n; n--) { /* Write dot entries and clear following sectors */ dj.fs->winsect = dsc++; dj.fs->wflag = 1; @@ -3579,7 +3646,7 @@ FRESULT f_mkdir ( } else { dir = dj.dir; dir[DIR_Attr] = AM_DIR; /* Attribute */ - ST_DWORD(dir+DIR_WrtTime, tm); /* Created time */ + ST_DWORD(dir + DIR_WrtTime, tm); /* Created time */ st_clust(dir, dcl); /* Table start cluster */ dj.fs->wflag = 1; res = sync_fs(dj.fs); @@ -3600,18 +3667,17 @@ FRESULT f_mkdir ( FRESULT f_chmod ( const TCHAR* path, /* Pointer to the file path */ - BYTE value, /* Attribute bits */ + BYTE attr, /* Attribute bits */ BYTE mask /* Attribute mask to change */ ) { FRESULT res; DIR dj; BYTE *dir; - DEF_NAMEBUF; + DEFINE_NAMEBUF; - /* Get logical drive number */ - res = find_volume(&dj.fs, &path, 1); + res = find_volume(&dj.fs, &path, 1); /* Get logical drive number */ if (res == FR_OK) { INIT_BUF(dj); res = follow_path(&dj, path); /* Follow the file path */ @@ -3624,7 +3690,7 @@ FRESULT f_chmod ( res = FR_INVALID_NAME; } else { /* File or sub directory */ mask &= AM_RDO|AM_HID|AM_SYS|AM_ARC; /* Valid attribute mask */ - dir[DIR_Attr] = (value & mask) | (dir[DIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + dir[DIR_Attr] = (attr & mask) | (dir[DIR_Attr] & (BYTE)~mask); /* Apply attribute change */ dj.fs->wflag = 1; res = sync_fs(dj.fs); } @@ -3650,7 +3716,7 @@ FRESULT f_rename ( DIR djo, djn; BYTE buf[21], *dir; DWORD dw; - DEF_NAMEBUF; + DEFINE_NAMEBUF; /* Get logical drive number of the source object */ @@ -3668,7 +3734,7 @@ FRESULT f_rename ( if (!djo.dir) { /* Is root dir? */ res = FR_NO_FILE; } else { - mem_cpy(buf, djo.dir+DIR_Attr, 21); /* Save the object information except name */ + mem_cpy(buf, djo.dir + DIR_Attr, 21); /* Save information about object except name */ mem_cpy(&djn, &djo, sizeof (DIR)); /* Duplicate the directory object */ if (get_ldnumber(&path_new) >= 0) /* Snip drive number off and ignore it */ res = follow_path(&djn, path_new); /* and make sure if new object name is not conflicting */ @@ -3676,20 +3742,20 @@ FRESULT f_rename ( res = FR_INVALID_DRIVE; if (res == FR_OK) res = FR_EXIST; /* The new object name is already existing */ if (res == FR_NO_FILE) { /* It is a valid path and no name collision */ -/* Start of critical section that any interruption can cause a cross-link */ res = dir_register(&djn); /* Register the new entry */ if (res == FR_OK) { - dir = djn.dir; /* Copy object information except name */ - mem_cpy(dir+13, buf+2, 19); +/* Start of critical section where any interruption can cause a cross-link */ + dir = djn.dir; /* Copy information about object except name */ + mem_cpy(dir + 13, buf + 2, 19); dir[DIR_Attr] = buf[0] | AM_ARC; djo.fs->wflag = 1; - if ((dir[DIR_Attr] & AM_DIR) && djo.sclust != djn.sclust) { /* Update .. entry in the directory if needed */ + if ((dir[DIR_Attr] & AM_DIR) && djo.sclust != djn.sclust) { /* Update .. entry in the sub-directory if needed */ dw = clust2sect(djo.fs, ld_clust(djo.fs, dir)); if (!dw) { res = FR_INT_ERR; } else { res = move_window(djo.fs, dw); - dir = djo.fs->win+SZ_DIR; /* .. entry */ + dir = djo.fs->win + SZ_DIRE * 1; /* Ptr to .. entry */ if (res == FR_OK && dir[1] == '.') { st_clust(dir, djn.sclust); djo.fs->wflag = 1; @@ -3701,8 +3767,8 @@ FRESULT f_rename ( if (res == FR_OK) res = sync_fs(djo.fs); } - } /* End of critical section */ + } } } } @@ -3727,7 +3793,7 @@ FRESULT f_utime ( FRESULT res; DIR dj; BYTE *dir; - DEF_NAMEBUF; + DEFINE_NAMEBUF; /* Get logical drive number */ @@ -3743,8 +3809,8 @@ FRESULT f_utime ( if (!dir) { /* Root directory */ res = FR_INVALID_NAME; } else { /* File or sub-directory */ - ST_WORD(dir+DIR_WrtTime, fno->ftime); - ST_WORD(dir+DIR_WrtDate, fno->fdate); + ST_WORD(dir + DIR_WrtTime, fno->ftime); + ST_WORD(dir + DIR_WrtDate, fno->fdate); dj.fs->wflag = 1; res = sync_fs(dj.fs); } @@ -3761,6 +3827,7 @@ FRESULT f_utime ( + #if _USE_LABEL /*-----------------------------------------------------------------------*/ /* Get volume label */ @@ -3775,6 +3842,9 @@ FRESULT f_getlabel ( FRESULT res; DIR dj; UINT i, j; +#if _USE_LFN && _LFN_UNICODE + WCHAR w; +#endif /* Get logical drive number */ @@ -3788,7 +3858,6 @@ FRESULT f_getlabel ( res = dir_read(&dj, 1); /* Get an entry with AM_VOL */ if (res == FR_OK) { /* A volume label is exist */ #if _USE_LFN && _LFN_UNICODE - WCHAR w; i = j = 0; do { w = (i < 11) ? dj.dir[i++] : ' '; @@ -3850,7 +3919,7 @@ FRESULT f_setlabel ( /* Create a volume label in directory form */ vn[0] = 0; for (sl = 0; label[sl]; sl++) ; /* Get name length */ - for ( ; sl && label[sl-1] == ' '; sl--) ; /* Remove trailing spaces */ + for ( ; sl && label[sl - 1] == ' '; sl--) ; /* Remove trailing spaces */ if (sl) { /* Create volume label in directory form */ i = j = 0; do { @@ -3876,7 +3945,8 @@ FRESULT f_setlabel ( if (w >= 0x100) vn[j++] = (BYTE)(w >> 8); vn[j++] = (BYTE)w; } while (i < sl); - while (j < 11) vn[j++] = ' '; + while (j < 11) vn[j++] = ' '; /* Fill remaining name field */ + if (vn[0] == DDEM) LEAVE_FF(dj.fs, FR_INVALID_NAME); /* Reject illegal name (heading DDEM) */ } /* Set volume label */ @@ -3888,9 +3958,9 @@ FRESULT f_setlabel ( if (vn[0]) { mem_cpy(dj.dir, vn, 11); /* Change the volume label name */ tm = GET_FATTIME(); - ST_DWORD(dj.dir+DIR_WrtTime, tm); + ST_DWORD(dj.dir + DIR_WrtTime, tm); } else { - dj.dir[0] = DDE; /* Remove the volume label */ + dj.dir[0] = DDEM; /* Remove the volume label */ } dj.fs->wflag = 1; res = sync_fs(dj.fs); @@ -3900,11 +3970,11 @@ FRESULT f_setlabel ( if (vn[0]) { /* Create volume label as new */ res = dir_alloc(&dj, 1); /* Allocate an entry for volume label */ if (res == FR_OK) { - mem_set(dj.dir, 0, SZ_DIR); /* Set volume label */ + mem_set(dj.dir, 0, SZ_DIRE); /* Set volume label */ mem_cpy(dj.dir, vn, 11); dj.dir[DIR_Attr] = AM_VOL; tm = GET_FATTIME(); - ST_DWORD(dj.dir+DIR_WrtTime, tm); + ST_DWORD(dj.dir + DIR_WrtTime, tm); dj.fs->wflag = 1; res = sync_fs(dj.fs); } @@ -3983,7 +4053,7 @@ FRESULT f_forward ( #if _USE_MKFS && !_FS_READONLY /*-----------------------------------------------------------------------*/ -/* Create File System on the Drive */ +/* Create file system on the logical drive */ /*-----------------------------------------------------------------------*/ #define N_ROOTDIR 512 /* Number of root directory entries for FAT12/16 */ #define N_FATS 1 /* Number of FATs (1 or 2) */ @@ -4005,6 +4075,9 @@ FRESULT f_mkfs ( DWORD n_vol, n_rsv, n_fat, n_dir; /* Size */ FATFS *fs; DSTATUS stat; +#if _USE_TRIM + DWORD eb[2]; +#endif /* Check mounted drive and clear work area */ @@ -4028,11 +4101,11 @@ FRESULT f_mkfs ( if (_MULTI_PARTITION && part) { /* Get partition information from partition table in the MBR */ if (disk_read(pdrv, fs->win, 0, 1) != RES_OK) return FR_DISK_ERR; - if (LD_WORD(fs->win+BS_55AA) != 0xAA55) return FR_MKFS_ABORTED; + if (LD_WORD(fs->win + BS_55AA) != 0xAA55) return FR_MKFS_ABORTED; tbl = &fs->win[MBR_Table + (part - 1) * SZ_PTE]; if (!tbl[4]) return FR_MKFS_ABORTED; /* No partition? */ - b_vol = LD_DWORD(tbl+8); /* Volume start sector */ - n_vol = LD_DWORD(tbl+12); /* Volume size */ + b_vol = LD_DWORD(tbl + 8); /* Volume start sector */ + n_vol = LD_DWORD(tbl + 12); /* Volume size */ } else { /* Create a partition in this function */ if (disk_ioctl(pdrv, GET_SECTOR_COUNT, &n_vol) != RES_OK || n_vol < 128) @@ -4066,7 +4139,7 @@ FRESULT f_mkfs ( n_fat = (fmt == FS_FAT12) ? (n_clst * 3 + 1) / 2 + 3 : (n_clst * 2) + 4; n_fat = (n_fat + SS(fs) - 1) / SS(fs); n_rsv = 1; - n_dir = (DWORD)N_ROOTDIR * SZ_DIR / SS(fs); + n_dir = (DWORD)N_ROOTDIR * SZ_DIRE / SS(fs); } b_fat = b_vol + n_rsv; /* FAT area start sector */ b_dir = b_fat + n_fat * N_FATS; /* Directory area start sector */ @@ -4113,7 +4186,7 @@ FRESULT f_mkfs ( md = 0xF0; } else { /* Create partition table (FDISK) */ mem_set(fs->win, 0, SS(fs)); - tbl = fs->win+MBR_Table; /* Create partition table for single partition in the drive */ + tbl = fs->win + MBR_Table; /* Create partition table for single partition in the drive */ tbl[1] = 1; /* Partition start head */ tbl[2] = 1; /* Partition start sector */ tbl[3] = 0; /* Partition start cylinder */ @@ -4122,9 +4195,9 @@ FRESULT f_mkfs ( n = (b_vol + n_vol) / 63 / 255; tbl[6] = (BYTE)(n >> 2 | 63); /* Partition end sector */ tbl[7] = (BYTE)n; /* End cylinder */ - ST_DWORD(tbl+8, 63); /* Partition start in LBA */ - ST_DWORD(tbl+12, n_vol); /* Partition size in LBA */ - ST_WORD(fs->win+BS_55AA, 0xAA55); /* MBR signature */ + ST_DWORD(tbl + 8, 63); /* Partition start in LBA */ + ST_DWORD(tbl + 12, n_vol); /* Partition size in LBA */ + ST_WORD(fs->win + BS_55AA, 0xAA55); /* MBR signature */ if (disk_write(pdrv, fs->win, 0, 1) != RES_OK) /* Write it to the MBR */ return FR_DISK_ERR; md = 0xF8; @@ -4136,42 +4209,42 @@ FRESULT f_mkfs ( mem_set(tbl, 0, SS(fs)); mem_cpy(tbl, "\xEB\xFE\x90" "MSDOS5.0", 11);/* Boot jump code, OEM name */ i = SS(fs); /* Sector size */ - ST_WORD(tbl+BPB_BytsPerSec, i); + ST_WORD(tbl + BPB_BytsPerSec, i); tbl[BPB_SecPerClus] = (BYTE)au; /* Sectors per cluster */ - ST_WORD(tbl+BPB_RsvdSecCnt, n_rsv); /* Reserved sectors */ + ST_WORD(tbl + BPB_RsvdSecCnt, n_rsv); /* Reserved sectors */ tbl[BPB_NumFATs] = N_FATS; /* Number of FATs */ i = (fmt == FS_FAT32) ? 0 : N_ROOTDIR; /* Number of root directory entries */ - ST_WORD(tbl+BPB_RootEntCnt, i); + ST_WORD(tbl + BPB_RootEntCnt, i); if (n_vol < 0x10000) { /* Number of total sectors */ - ST_WORD(tbl+BPB_TotSec16, n_vol); + ST_WORD(tbl + BPB_TotSec16, n_vol); } else { - ST_DWORD(tbl+BPB_TotSec32, n_vol); + ST_DWORD(tbl + BPB_TotSec32, n_vol); } tbl[BPB_Media] = md; /* Media descriptor */ - ST_WORD(tbl+BPB_SecPerTrk, 63); /* Number of sectors per track */ - ST_WORD(tbl+BPB_NumHeads, 255); /* Number of heads */ - ST_DWORD(tbl+BPB_HiddSec, b_vol); /* Hidden sectors */ + ST_WORD(tbl + BPB_SecPerTrk, 63); /* Number of sectors per track */ + ST_WORD(tbl + BPB_NumHeads, 255); /* Number of heads */ + ST_DWORD(tbl + BPB_HiddSec, b_vol); /* Hidden sectors */ n = GET_FATTIME(); /* Use current time as VSN */ if (fmt == FS_FAT32) { - ST_DWORD(tbl+BS_VolID32, n); /* VSN */ - ST_DWORD(tbl+BPB_FATSz32, n_fat); /* Number of sectors per FAT */ - ST_DWORD(tbl+BPB_RootClus, 2); /* Root directory start cluster (2) */ - ST_WORD(tbl+BPB_FSInfo, 1); /* FSINFO record offset (VBR+1) */ - ST_WORD(tbl+BPB_BkBootSec, 6); /* Backup boot record offset (VBR+6) */ + ST_DWORD(tbl + BS_VolID32, n); /* VSN */ + ST_DWORD(tbl + BPB_FATSz32, n_fat); /* Number of sectors per FAT */ + ST_DWORD(tbl + BPB_RootClus, 2); /* Root directory start cluster (2) */ + ST_WORD(tbl + BPB_FSInfo, 1); /* FSINFO record offset (VBR + 1) */ + ST_WORD(tbl + BPB_BkBootSec, 6); /* Backup boot record offset (VBR + 6) */ tbl[BS_DrvNum32] = 0x80; /* Drive number */ tbl[BS_BootSig32] = 0x29; /* Extended boot signature */ - mem_cpy(tbl+BS_VolLab32, "NO NAME " "FAT32 ", 19); /* Volume label, FAT signature */ + mem_cpy(tbl + BS_VolLab32, "NO NAME " "FAT32 ", 19); /* Volume label, FAT signature */ } else { - ST_DWORD(tbl+BS_VolID, n); /* VSN */ - ST_WORD(tbl+BPB_FATSz16, n_fat); /* Number of sectors per FAT */ + ST_DWORD(tbl + BS_VolID, n); /* VSN */ + ST_WORD(tbl + BPB_FATSz16, n_fat); /* Number of sectors per FAT */ tbl[BS_DrvNum] = 0x80; /* Drive number */ tbl[BS_BootSig] = 0x29; /* Extended boot signature */ - mem_cpy(tbl+BS_VolLab, "NO NAME " "FAT ", 19); /* Volume label, FAT signature */ + mem_cpy(tbl + BS_VolLab, "NO NAME " "FAT ", 19); /* Volume label, FAT signature */ } - ST_WORD(tbl+BS_55AA, 0xAA55); /* Signature (Offset is fixed here regardless of sector size) */ + ST_WORD(tbl + BS_55AA, 0xAA55); /* Signature (Offset is fixed here regardless of sector size) */ if (disk_write(pdrv, tbl, b_vol, 1) != RES_OK) /* Write it to the VBR sector */ return FR_DISK_ERR; - if (fmt == FS_FAT32) /* Write backup VBR if needed (VBR+6) */ + if (fmt == FS_FAT32) /* Write it to the backup VBR if needed (VBR + 6) */ disk_write(pdrv, tbl, b_vol + 6, 1); /* Initialize FAT area */ @@ -4181,12 +4254,12 @@ FRESULT f_mkfs ( n = md; /* Media descriptor byte */ if (fmt != FS_FAT32) { n |= (fmt == FS_FAT12) ? 0x00FFFF00 : 0xFFFFFF00; - ST_DWORD(tbl+0, n); /* Reserve cluster #0-1 (FAT12/16) */ + ST_DWORD(tbl + 0, n); /* Reserve cluster #0-1 (FAT12/16) */ } else { n |= 0xFFFFFF00; - ST_DWORD(tbl+0, n); /* Reserve cluster #0-1 (FAT32) */ - ST_DWORD(tbl+4, 0xFFFFFFFF); - ST_DWORD(tbl+8, 0x0FFFFFFF); /* Reserve cluster #2 for root directory */ + ST_DWORD(tbl + 0, n); /* Reserve cluster #0-1 (FAT32) */ + ST_DWORD(tbl + 4, 0xFFFFFFFF); + ST_DWORD(tbl + 8, 0x0FFFFFFF); /* Reserve cluster #2 for root directory */ } if (disk_write(pdrv, tbl, wsect++, 1) != RES_OK) return FR_DISK_ERR; @@ -4206,8 +4279,6 @@ FRESULT f_mkfs ( #if _USE_TRIM /* Erase data area if needed */ { - DWORD eb[2]; - eb[0] = wsect; eb[1] = wsect + (n_clst - ((fmt == FS_FAT32) ? 1 : 0)) * au - 1; disk_ioctl(pdrv, CTRL_TRIM, eb); } @@ -4215,13 +4286,13 @@ FRESULT f_mkfs ( /* Create FSINFO if needed */ if (fmt == FS_FAT32) { - ST_DWORD(tbl+FSI_LeadSig, 0x41615252); - ST_DWORD(tbl+FSI_StrucSig, 0x61417272); - ST_DWORD(tbl+FSI_Free_Count, n_clst - 1); /* Number of free clusters */ - ST_DWORD(tbl+FSI_Nxt_Free, 2); /* Last allocated cluster# */ - ST_WORD(tbl+BS_55AA, 0xAA55); - disk_write(pdrv, tbl, b_vol + 1, 1); /* Write original (VBR+1) */ - disk_write(pdrv, tbl, b_vol + 7, 1); /* Write backup (VBR+7) */ + ST_DWORD(tbl + FSI_LeadSig, 0x41615252); + ST_DWORD(tbl + FSI_StrucSig, 0x61417272); + ST_DWORD(tbl + FSI_Free_Count, n_clst - 1); /* Number of free clusters */ + ST_DWORD(tbl + FSI_Nxt_Free, 2); /* Last allocated cluster# */ + ST_WORD(tbl + BS_55AA, 0xAA55); + disk_write(pdrv, tbl, b_vol + 1, 1); /* Write original (VBR + 1) */ + disk_write(pdrv, tbl, b_vol + 7, 1); /* Write backup (VBR + 7) */ } return (disk_ioctl(pdrv, CTRL_SYNC, 0) == RES_OK) ? FR_OK : FR_DISK_ERR; @@ -4231,7 +4302,7 @@ FRESULT f_mkfs ( #if _MULTI_PARTITION /*-----------------------------------------------------------------------*/ -/* Divide Physical Drive */ +/* Create partition table on the physical drive */ /*-----------------------------------------------------------------------*/ FRESULT f_fdisk ( @@ -4379,6 +4450,7 @@ TCHAR* f_gets ( + #if !_FS_READONLY #include /*-----------------------------------------------------------------------*/ diff --git a/firmware/chibios-portapack/ext/fatfs/src/ff.h b/firmware/chibios-portapack/ext/fatfs/src/ff.h index 5eaad5fe..917908d2 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/ff.h +++ b/firmware/chibios-portapack/ext/fatfs/src/ff.h @@ -1,21 +1,23 @@ /*---------------------------------------------------------------------------/ -/ FatFs - FAT file system module include file R0.10c (C)ChaN, 2014 +/ FatFs - FAT file system module include R0.11a (C)ChaN, 2015 /----------------------------------------------------------------------------/ -/ FatFs module is a generic FAT file system module for small embedded systems. -/ This is a free software that opened for education, research and commercial -/ developments under license policy of following terms. +/ FatFs module is a free software that opened under license policy of +/ following conditions. / -/ Copyright (C) 2014, ChaN, all right reserved. +/ Copyright (C) 2015, ChaN, all right reserved. / -/ * The FatFs module is a free software and there is NO WARRANTY. -/ * No restriction on use. You can use, modify and redistribute it for -/ personal, non-profit or commercial product UNDER YOUR RESPONSIBILITY. -/ * Redistributions of source code must retain the above copyright notice. +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. / -/----------------------------------------------------------------------------*/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/---------------------------------------------------------------------------*/ + #ifndef _FATFS -#define _FATFS 80376 /* Revision ID */ +#define _FATFS 64180 /* Revision ID */ #ifdef __cplusplus extern "C" { @@ -154,11 +156,14 @@ typedef struct { WCHAR* lfn; /* Pointer to the LFN working buffer */ WORD lfn_idx; /* Last matched LFN index number (0xFFFF:No LFN) */ #endif +#if _USE_FIND + const TCHAR* pat; /* Pointer to the name matching pattern */ +#endif } DIR; -/* File status structure (FILINFO) */ +/* File information structure (FILINFO) */ typedef struct { DWORD fsize; /* File size */ @@ -195,7 +200,7 @@ typedef enum { FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */ FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */ FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */ - FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > _FS_SHARE */ + FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > _FS_LOCK */ FR_INVALID_PARAMETER /* (19) Given parameter is invalid */ } FRESULT; @@ -215,11 +220,13 @@ FRESULT f_sync (FIL* fp); /* Flush cached data of a writing file */ FRESULT f_opendir (DIR* dp, const TCHAR* path); /* Open a directory */ FRESULT f_closedir (DIR* dp); /* Close an open directory */ FRESULT f_readdir (DIR* dp, FILINFO* fno); /* Read a directory item */ +FRESULT f_findfirst (DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern); /* Find first file */ +FRESULT f_findnext (DIR* dp, FILINFO* fno); /* Find next file */ FRESULT f_mkdir (const TCHAR* path); /* Create a sub directory */ FRESULT f_unlink (const TCHAR* path); /* Delete an existing file or directory */ FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new); /* Rename/Move a file or directory */ FRESULT f_stat (const TCHAR* path, FILINFO* fno); /* Get file status */ -FRESULT f_chmod (const TCHAR* path, BYTE value, BYTE mask); /* Change attribute of the file/dir */ +FRESULT f_chmod (const TCHAR* path, BYTE attr, BYTE mask); /* Change attribute of the file/dir */ FRESULT f_utime (const TCHAR* path, const FILINFO* fno); /* Change times-tamp of the file/dir */ FRESULT f_chdir (const TCHAR* path); /* Change current directory */ FRESULT f_chdrive (const TCHAR* path); /* Change current drive */ @@ -239,6 +246,8 @@ TCHAR* f_gets (TCHAR* buff, int len, FIL* fp); /* Get a string from the fil #define f_error(fp) ((fp)->err) #define f_tell(fp) ((fp)->fptr) #define f_size(fp) ((fp)->fsize) +#define f_rewind(fp) f_lseek((fp), 0) +#define f_rewinddir(dp) f_readdir((dp), 0) #ifndef EOF #define EOF (-1) diff --git a/firmware/chibios-portapack/ext/fatfs/src/ffconf_template.h b/firmware/chibios-portapack/ext/fatfs/src/ffconf_template.h index f968d7e0..bbe74e43 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/ffconf_template.h +++ b/firmware/chibios-portapack/ext/fatfs/src/ffconf_template.h @@ -1,30 +1,22 @@ /*---------------------------------------------------------------------------/ -/ FatFs - FAT file system module configuration file R0.10c (C)ChaN, 2014 +/ FatFs - FAT file system module configuration file R0.11a (C)ChaN, 2015 /---------------------------------------------------------------------------*/ -#define _FFCONF 80376 /* Revision ID */ +#define _FFCONF 64180 /* Revision ID */ /*---------------------------------------------------------------------------/ -/ Functions and Buffer Configurations +/ Function Configurations /---------------------------------------------------------------------------*/ -#define _FS_TINY 0 -/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) -/ At the tiny configuration, size of the file object (FIL) is reduced _MAX_SS -/ bytes. Instead of private sector buffer eliminated from the file object, -/ common sector buffer in the file system object (FATFS) is used for the file -/ data transfer. */ - - #define _FS_READONLY 0 /* This option switches read-only configuration. (0:Read/Write or 1:Read-only) -/ Read-only configuration removes basic writing API functions, f_write(), -/ f_sync(), f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), -/ f_getfree() and optional writing functions as well. */ +/ Read-only configuration removes writing API functions, f_write(), f_sync(), +/ f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() +/ and optional writing functions as well. */ #define _FS_MINIMIZE 0 -/* This option defines minimization level to remove some API functions. +/* This option defines minimization level to remove some basic API functions. / / 0: All basic functions are enabled. / 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_chmod(), f_utime(), @@ -42,9 +34,13 @@ / 2: Enable with LF-CRLF conversion. */ +#define _USE_FIND 0 +/* This option switches filtered directory read feature and related functions, +/ f_findfirst() and f_findnext(). (0:Disable or 1:Enable) */ + + #define _USE_MKFS 0 -/* This option switches f_mkfs() function. (0:Disable or 1:Enable) -/ To enable it, also _FS_READONLY need to be set to 0. */ +/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ #define _USE_FASTSEEK 0 @@ -57,8 +53,8 @@ #define _USE_FORWARD 0 -/* This option switches f_forward() function. (0:Disable or 1:Enable) */ -/* To enable it, also _FS_TINY need to be set to 1. */ +/* This option switches f_forward() function. (0:Disable or 1:Enable) +/ To enable it, also _FS_TINY need to be set to 1. */ /*---------------------------------------------------------------------------/ @@ -69,32 +65,29 @@ /* This option specifies the OEM code page to be used on the target system. / Incorrect setting of the code page can cause a file open failure. / -/ 932 - Japanese Shift_JIS (DBCS, OEM, Windows) -/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) -/ 949 - Korean (DBCS, OEM, Windows) -/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) -/ 1250 - Central Europe (Windows) -/ 1251 - Cyrillic (Windows) -/ 1252 - Latin 1 (Windows) -/ 1253 - Greek (Windows) -/ 1254 - Turkish (Windows) -/ 1255 - Hebrew (Windows) -/ 1256 - Arabic (Windows) -/ 1257 - Baltic (Windows) -/ 1258 - Vietnam (OEM, Windows) -/ 437 - U.S. (OEM) -/ 720 - Arabic (OEM) -/ 737 - Greek (OEM) -/ 775 - Baltic (OEM) -/ 850 - Multilingual Latin 1 (OEM) -/ 858 - Multilingual Latin 1 + Euro (OEM) -/ 852 - Latin 2 (OEM) -/ 855 - Cyrillic (OEM) -/ 866 - Russian (OEM) -/ 857 - Turkish (OEM) -/ 862 - Hebrew (OEM) -/ 874 - Thai (OEM, Windows) -/ 1 - ASCII (No extended character. Valid for only non-LFN configuration.) */ +/ 1 - ASCII (No extended character. Non-LFN cfg. only) +/ 437 - U.S. +/ 720 - Arabic +/ 737 - Greek +/ 771 - KBL +/ 775 - Baltic +/ 850 - Latin 1 +/ 852 - Latin 2 +/ 855 - Cyrillic +/ 857 - Turkish +/ 860 - Portuguese +/ 861 - Icelandic +/ 862 - Hebrew +/ 863 - Canadian French +/ 864 - Arabic +/ 865 - Nordic +/ 866 - Russian +/ 869 - Greek 2 +/ 932 - Japanese (DBCS) +/ 936 - Simplified Chinese (DBCS) +/ 949 - Korean (DBCS) +/ 950 - Traditional Chinese (DBCS) +*/ #define _USE_LFN 0 @@ -163,7 +156,7 @@ / number is bound to the same physical drive number and only an FAT volume found on / the physical drive will be mounted. When multi-partition feature is enabled (1), / each logical drive number is bound to arbitrary physical drive and partition -/ listed in the VolToPart[]. Also f_fdisk() funciton will be enabled. */ +/ listed in the VolToPart[]. Also f_fdisk() funciton will be available. */ #define _MIN_SS 512 @@ -199,15 +192,23 @@ / System Configurations /---------------------------------------------------------------------------*/ +#define _FS_TINY 0 +/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) +/ At the tiny configuration, size of the file object (FIL) is reduced _MAX_SS +/ bytes. Instead of private sector buffer eliminated from the file object, +/ common sector buffer in the file system object (FATFS) is used for the file +/ data transfer. */ + + #define _FS_NORTC 0 -#define _NORTC_MON 11 -#define _NORTC_MDAY 9 -#define _NORTC_YEAR 2014 +#define _NORTC_MON 1 +#define _NORTC_MDAY 1 +#define _NORTC_YEAR 2015 /* The _FS_NORTC option switches timestamp feature. If the system does not have / an RTC function or valid timestamp is not needed, set _FS_NORTC to 1 to disable / the timestamp feature. All objects modified by FatFs will have a fixed timestamp / defined by _NORTC_MON, _NORTC_MDAY and _NORTC_YEAR. -/ When timestamp feature is enabled (_FS_NORTC == 0), get_fattime() function need +/ When timestamp feature is enabled (_FS_NORTC == 0), get_fattime() function need / to be added to the project to read current time form RTC. _NORTC_MON, / _NORTC_MDAY and _NORTC_YEAR have no effect. / These options have no effect at read-only configuration (_FS_READONLY == 1). */ @@ -242,7 +243,8 @@ / / The _FS_TIMEOUT defines timeout period in unit of time tick. / The _SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, -/ SemaphoreHandle_t and etc.. */ +/ SemaphoreHandle_t and etc.. A header file for O/S definitions needs to be +/ included somewhere in the scope of ff.c. */ #define _WORD_ACCESS 0 @@ -256,15 +258,19 @@ / * Byte order on the memory is little-endian. / / If it is the case, _WORD_ACCESS can also be set to 1 to reduce code size. -/ Following table shows allowable settings of some processor types. +/ Following table shows allowable settings of some type of processors. / -/ ARM7TDMI 0 ColdFire 0 V850E 0 -/ Cortex-M3 0 Z80 0/1 V850ES 0/1 -/ Cortex-M0 0 x86 0/1 TLCS-870 0/1 -/ AVR 0/1 RX600(LE) 0/1 TLCS-900 0/1 -/ AVR32 0 RL78 0 R32C 0 -/ PIC18 0/1 SH-2 0 M16C 0/1 -/ PIC24 0 H8S 0 MSP430 0 -/ PIC32 0 H8/300H 0 8051 0/1 +/ ARM7TDMI 0 *2 ColdFire 0 *1 V850E 0 *2 +/ Cortex-M3 0 *3 Z80 0/1 V850ES 0/1 +/ Cortex-M0 0 *2 x86 0/1 TLCS-870 0/1 +/ AVR 0/1 RX600(LE) 0/1 TLCS-900 0/1 +/ AVR32 0 *1 RL78 0 *2 R32C 0 *2 +/ PIC18 0/1 SH-2 0 *1 M16C 0/1 +/ PIC24 0 *2 H8S 0 *1 MSP430 0 *2 +/ PIC32 0 *1 H8/300H 0 *1 8051 0/1 +/ +/ *1:Big-endian. +/ *2:Unaligned memory access is not supported. +/ *3:Some compilers generate LDM/STM for mem_cpy function. */ diff --git a/firmware/chibios-portapack/ext/fatfs/src/integer.h b/firmware/chibios-portapack/ext/fatfs/src/integer.h index 074a46bd..584bd1a9 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/integer.h +++ b/firmware/chibios-portapack/ext/fatfs/src/integer.h @@ -5,26 +5,26 @@ #ifndef _FF_INTEGER #define _FF_INTEGER -#ifdef _WIN32 /* FatFs development platform */ +#ifdef _WIN32 /* Development platform */ #include #include #else /* Embedded platform */ -/* This type MUST be 8 bit */ +/* This type MUST be 8-bit */ typedef unsigned char BYTE; -/* These types MUST be 16 bit */ +/* These types MUST be 16-bit */ typedef short SHORT; typedef unsigned short WORD; typedef unsigned short WCHAR; -/* These types MUST be 16 bit or 32 bit */ +/* These types MUST be 16-bit or 32-bit */ typedef int INT; typedef unsigned int UINT; -/* These types MUST be 32 bit */ +/* These types MUST be 32-bit */ typedef long LONG; typedef unsigned long DWORD; diff --git a/firmware/chibios-portapack/ext/fatfs/src/option/cc932.c b/firmware/chibios-portapack/ext/fatfs/src/option/cc932.c index 36db384b..19231a2b 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/option/cc932.c +++ b/firmware/chibios-portapack/ext/fatfs/src/option/cc932.c @@ -1,6 +1,5 @@ /*------------------------------------------------------------------------*/ -/* Unicode - OEM code bidirectional converter (C)ChaN, 2009 */ -/* */ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2015 */ /* CP932 (Japanese Shift-JIS) */ /*------------------------------------------------------------------------*/ @@ -111,1759 +110,1759 @@ const WCHAR uni2sjis[] = { 0x3088, 0x82E6, 0x3089, 0x82E7, 0x308A, 0x82E8, 0x308B, 0x82E9, 0x308C, 0x82EA, 0x308D, 0x82EB, 0x308E, 0x82EC, 0x308F, 0x82ED, 0x3090, 0x82EE, 0x3091, 0x82EF, 0x3092, 0x82F0, 0x3093, 0x82F1, - 0x309B, 0x814A, 0x309C, 0x814B, 0x309D, 0x8154, - 0x309E, 0x8155, 0x30A1, 0x8340, 0x30A2, 0x8341, 0x30A3, 0x8342, - 0x30A4, 0x8343, 0x30A5, 0x8344, 0x30A6, 0x8345, 0x30A7, 0x8346, - 0x30A8, 0x8347, 0x30A9, 0x8348, 0x30AA, 0x8349, 0x30AB, 0x834A, - 0x30AC, 0x834B, 0x30AD, 0x834C, 0x30AE, 0x834D, 0x30AF, 0x834E, - 0x30B0, 0x834F, 0x30B1, 0x8350, 0x30B2, 0x8351, 0x30B3, 0x8352, - 0x30B4, 0x8353, 0x30B5, 0x8354, 0x30B6, 0x8355, 0x30B7, 0x8356, - 0x30B8, 0x8357, 0x30B9, 0x8358, 0x30BA, 0x8359, 0x30BB, 0x835A, - 0x30BC, 0x835B, 0x30BD, 0x835C, 0x30BE, 0x835D, 0x30BF, 0x835E, - 0x30C0, 0x835F, 0x30C1, 0x8360, 0x30C2, 0x8361, 0x30C3, 0x8362, - 0x30C4, 0x8363, 0x30C5, 0x8364, 0x30C6, 0x8365, 0x30C7, 0x8366, - 0x30C8, 0x8367, 0x30C9, 0x8368, 0x30CA, 0x8369, 0x30CB, 0x836A, - 0x30CC, 0x836B, 0x30CD, 0x836C, 0x30CE, 0x836D, 0x30CF, 0x836E, - 0x30D0, 0x836F, 0x30D1, 0x8370, 0x30D2, 0x8371, 0x30D3, 0x8372, - 0x30D4, 0x8373, 0x30D5, 0x8374, 0x30D6, 0x8375, 0x30D7, 0x8376, - 0x30D8, 0x8377, 0x30D9, 0x8378, 0x30DA, 0x8379, 0x30DB, 0x837A, - 0x30DC, 0x837B, 0x30DD, 0x837C, 0x30DE, 0x837D, 0x30DF, 0x837E, - 0x30E0, 0x8380, 0x30E1, 0x8381, 0x30E2, 0x8382, 0x30E3, 0x8383, - 0x30E4, 0x8384, 0x30E5, 0x8385, 0x30E6, 0x8386, 0x30E7, 0x8387, - 0x30E8, 0x8388, 0x30E9, 0x8389, 0x30EA, 0x838A, 0x30EB, 0x838B, - 0x30EC, 0x838C, 0x30ED, 0x838D, 0x30EE, 0x838E, 0x30EF, 0x838F, - 0x30F0, 0x8390, 0x30F1, 0x8391, 0x30F2, 0x8392, 0x30F3, 0x8393, - 0x30F4, 0x8394, 0x30F5, 0x8395, 0x30F6, 0x8396, 0x30FB, 0x8145, - 0x30FC, 0x815B, 0x30FD, 0x8152, 0x30FE, 0x8153, 0x3231, 0x878A, - 0x3232, 0x878B, 0x3239, 0x878C, 0x32A4, 0x8785, 0x32A5, 0x8786, - 0x32A6, 0x8787, 0x32A7, 0x8788, 0x32A8, 0x8789, 0x3303, 0x8765, - 0x330D, 0x8769, 0x3314, 0x8760, 0x3318, 0x8763, 0x3322, 0x8761, - 0x3323, 0x876B, 0x3326, 0x876A, 0x3327, 0x8764, 0x332B, 0x876C, - 0x3336, 0x8766, 0x333B, 0x876E, 0x3349, 0x875F, 0x334A, 0x876D, - 0x334D, 0x8762, 0x3351, 0x8767, 0x3357, 0x8768, 0x337B, 0x877E, - 0x337C, 0x878F, 0x337D, 0x878E, 0x337E, 0x878D, 0x338E, 0x8772, - 0x338F, 0x8773, 0x339C, 0x876F, 0x339D, 0x8770, 0x339E, 0x8771, - 0x33A1, 0x8775, 0x33C4, 0x8774, 0x33CD, 0x8783, 0x4E00, 0x88EA, - 0x4E01, 0x929A, 0x4E03, 0x8EB5, 0x4E07, 0x969C, 0x4E08, 0x8FE4, - 0x4E09, 0x8E4F, 0x4E0A, 0x8FE3, 0x4E0B, 0x89BA, 0x4E0D, 0x9573, - 0x4E0E, 0x975E, 0x4E10, 0x98A0, 0x4E11, 0x894E, 0x4E14, 0x8A8E, - 0x4E15, 0x98A1, 0x4E16, 0x90A2, 0x4E17, 0x99C0, 0x4E18, 0x8B75, - 0x4E19, 0x95B8, 0x4E1E, 0x8FE5, 0x4E21, 0x97BC, 0x4E26, 0x95C0, - 0x4E28, 0xFA68, 0x4E2A, 0x98A2, 0x4E2D, 0x9286, 0x4E31, 0x98A3, - 0x4E32, 0x8BF8, 0x4E36, 0x98A4, 0x4E38, 0x8ADB, 0x4E39, 0x924F, - 0x4E3B, 0x8EE5, 0x4E3C, 0x98A5, 0x4E3F, 0x98A6, 0x4E42, 0x98A7, - 0x4E43, 0x9454, 0x4E45, 0x8B76, 0x4E4B, 0x9456, 0x4E4D, 0x93E1, - 0x4E4E, 0x8CC1, 0x4E4F, 0x9652, 0x4E55, 0xE568, 0x4E56, 0x98A8, - 0x4E57, 0x8FE6, 0x4E58, 0x98A9, 0x4E59, 0x89B3, 0x4E5D, 0x8BE3, - 0x4E5E, 0x8CEE, 0x4E5F, 0x96E7, 0x4E62, 0x9BA4, 0x4E71, 0x9790, - 0x4E73, 0x93FB, 0x4E7E, 0x8AA3, 0x4E80, 0x8B54, 0x4E82, 0x98AA, - 0x4E85, 0x98AB, 0x4E86, 0x97B9, 0x4E88, 0x975C, 0x4E89, 0x9188, - 0x4E8A, 0x98AD, 0x4E8B, 0x8E96, 0x4E8C, 0x93F1, 0x4E8E, 0x98B0, - 0x4E91, 0x895D, 0x4E92, 0x8CDD, 0x4E94, 0x8CDC, 0x4E95, 0x88E4, - 0x4E98, 0x986A, 0x4E99, 0x9869, 0x4E9B, 0x8DB1, 0x4E9C, 0x889F, - 0x4E9E, 0x98B1, 0x4E9F, 0x98B2, 0x4EA0, 0x98B3, 0x4EA1, 0x9653, - 0x4EA2, 0x98B4, 0x4EA4, 0x8CF0, 0x4EA5, 0x88E5, 0x4EA6, 0x9692, - 0x4EA8, 0x8B9C, 0x4EAB, 0x8B9D, 0x4EAC, 0x8B9E, 0x4EAD, 0x92E0, - 0x4EAE, 0x97BA, 0x4EB0, 0x98B5, 0x4EB3, 0x98B6, 0x4EB6, 0x98B7, - 0x4EBA, 0x906C, 0x4EC0, 0x8F59, 0x4EC1, 0x906D, 0x4EC2, 0x98BC, - 0x4EC4, 0x98BA, 0x4EC6, 0x98BB, 0x4EC7, 0x8B77, 0x4ECA, 0x8DA1, - 0x4ECB, 0x89EE, 0x4ECD, 0x98B9, 0x4ECE, 0x98B8, 0x4ECF, 0x95A7, - 0x4ED4, 0x8E65, 0x4ED5, 0x8E64, 0x4ED6, 0x91BC, 0x4ED7, 0x98BD, - 0x4ED8, 0x9574, 0x4ED9, 0x90E5, 0x4EDD, 0x8157, 0x4EDE, 0x98BE, - 0x4EDF, 0x98C0, 0x4EE1, 0xFA69, 0x4EE3, 0x91E3, 0x4EE4, 0x97DF, - 0x4EE5, 0x88C8, 0x4EED, 0x98BF, 0x4EEE, 0x89BC, 0x4EF0, 0x8BC2, - 0x4EF2, 0x9287, 0x4EF6, 0x8C8F, 0x4EF7, 0x98C1, 0x4EFB, 0x9443, - 0x4EFC, 0xFA6A, 0x4F00, 0xFA6B, 0x4F01, 0x8AE9, 0x4F03, 0xFA6C, - 0x4F09, 0x98C2, 0x4F0A, 0x88C9, 0x4F0D, 0x8CDE, 0x4F0E, 0x8AEA, - 0x4F0F, 0x959A, 0x4F10, 0x94B0, 0x4F11, 0x8B78, 0x4F1A, 0x89EF, - 0x4F1C, 0x98E5, 0x4F1D, 0x9360, 0x4F2F, 0x948C, 0x4F30, 0x98C4, - 0x4F34, 0x94BA, 0x4F36, 0x97E0, 0x4F38, 0x904C, 0x4F39, 0xFA6D, - 0x4F3A, 0x8E66, 0x4F3C, 0x8E97, 0x4F3D, 0x89BE, 0x4F43, 0x92CF, - 0x4F46, 0x9241, 0x4F47, 0x98C8, 0x4F4D, 0x88CA, 0x4F4E, 0x92E1, - 0x4F4F, 0x8F5A, 0x4F50, 0x8DB2, 0x4F51, 0x9743, 0x4F53, 0x91CC, - 0x4F55, 0x89BD, 0x4F56, 0xFA6E, 0x4F57, 0x98C7, 0x4F59, 0x975D, - 0x4F5A, 0x98C3, 0x4F5B, 0x98C5, 0x4F5C, 0x8DEC, 0x4F5D, 0x98C6, - 0x4F5E, 0x9B43, 0x4F69, 0x98CE, 0x4F6F, 0x98D1, 0x4F70, 0x98CF, - 0x4F73, 0x89C0, 0x4F75, 0x95B9, 0x4F76, 0x98C9, 0x4F7B, 0x98CD, - 0x4F7C, 0x8CF1, 0x4F7F, 0x8E67, 0x4F83, 0x8AA4, 0x4F86, 0x98D2, - 0x4F88, 0x98CA, 0x4F8A, 0xFA70, 0x4F8B, 0x97E1, 0x4F8D, 0x8E98, - 0x4F8F, 0x98CB, 0x4F91, 0x98D0, 0x4F92, 0xFA6F, 0x4F94, 0xFA72, - 0x4F96, 0x98D3, 0x4F98, 0x98CC, 0x4F9A, 0xFA71, 0x4F9B, 0x8B9F, - 0x4F9D, 0x88CB, 0x4FA0, 0x8BA0, 0x4FA1, 0x89BF, 0x4FAB, 0x9B44, - 0x4FAD, 0x9699, 0x4FAE, 0x958E, 0x4FAF, 0x8CF2, 0x4FB5, 0x904E, - 0x4FB6, 0x97B5, 0x4FBF, 0x95D6, 0x4FC2, 0x8C57, 0x4FC3, 0x91A3, - 0x4FC4, 0x89E2, 0x4FC9, 0xFA61, 0x4FCA, 0x8F72, 0x4FCD, 0xFA73, - 0x4FCE, 0x98D7, 0x4FD0, 0x98DC, 0x4FD1, 0x98DA, 0x4FD4, 0x98D5, - 0x4FD7, 0x91AD, 0x4FD8, 0x98D8, 0x4FDA, 0x98DB, 0x4FDB, 0x98D9, - 0x4FDD, 0x95DB, 0x4FDF, 0x98D6, 0x4FE1, 0x904D, 0x4FE3, 0x9693, - 0x4FE4, 0x98DD, 0x4FE5, 0x98DE, 0x4FEE, 0x8F43, 0x4FEF, 0x98EB, - 0x4FF3, 0x946F, 0x4FF5, 0x9555, 0x4FF6, 0x98E6, 0x4FF8, 0x95EE, - 0x4FFA, 0x89B4, 0x4FFE, 0x98EA, 0x4FFF, 0xFA76, 0x5005, 0x98E4, - 0x5006, 0x98ED, 0x5009, 0x9171, 0x500B, 0x8CC2, 0x500D, 0x947B, - 0x500F, 0xE0C5, 0x5011, 0x98EC, 0x5012, 0x937C, 0x5014, 0x98E1, - 0x5016, 0x8CF4, 0x5019, 0x8CF3, 0x501A, 0x98DF, 0x501E, 0xFA77, - 0x501F, 0x8ED8, 0x5021, 0x98E7, 0x5022, 0xFA75, 0x5023, 0x95ED, - 0x5024, 0x926C, 0x5025, 0x98E3, 0x5026, 0x8C91, 0x5028, 0x98E0, - 0x5029, 0x98E8, 0x502A, 0x98E2, 0x502B, 0x97CF, 0x502C, 0x98E9, - 0x502D, 0x9860, 0x5036, 0x8BE4, 0x5039, 0x8C90, 0x5040, 0xFA74, - 0x5042, 0xFA7A, 0x5043, 0x98EE, 0x5046, 0xFA78, 0x5047, 0x98EF, - 0x5048, 0x98F3, 0x5049, 0x88CC, 0x504F, 0x95CE, 0x5050, 0x98F2, - 0x5055, 0x98F1, 0x5056, 0x98F5, 0x505A, 0x98F4, 0x505C, 0x92E2, - 0x5065, 0x8C92, 0x506C, 0x98F6, 0x5070, 0xFA79, 0x5072, 0x8EC3, - 0x5074, 0x91A4, 0x5075, 0x92E3, 0x5076, 0x8BF4, 0x5078, 0x98F7, - 0x507D, 0x8B55, 0x5080, 0x98F8, 0x5085, 0x98FA, 0x508D, 0x9654, - 0x5091, 0x8C86, 0x5094, 0xFA7B, 0x5098, 0x8E50, 0x5099, 0x94F5, - 0x509A, 0x98F9, 0x50AC, 0x8DC3, 0x50AD, 0x9762, 0x50B2, 0x98FC, - 0x50B3, 0x9942, 0x50B4, 0x98FB, 0x50B5, 0x8DC2, 0x50B7, 0x8F9D, - 0x50BE, 0x8C58, 0x50C2, 0x9943, 0x50C5, 0x8BCD, 0x50C9, 0x9940, - 0x50CA, 0x9941, 0x50CD, 0x93AD, 0x50CF, 0x919C, 0x50D1, 0x8BA1, - 0x50D5, 0x966C, 0x50D6, 0x9944, 0x50D8, 0xFA7D, 0x50DA, 0x97BB, - 0x50DE, 0x9945, 0x50E3, 0x9948, 0x50E5, 0x9946, 0x50E7, 0x916D, - 0x50ED, 0x9947, 0x50EE, 0x9949, 0x50F4, 0xFA7C, 0x50F5, 0x994B, - 0x50F9, 0x994A, 0x50FB, 0x95C6, 0x5100, 0x8B56, 0x5101, 0x994D, - 0x5102, 0x994E, 0x5104, 0x89AD, 0x5109, 0x994C, 0x5112, 0x8EF2, - 0x5114, 0x9951, 0x5115, 0x9950, 0x5116, 0x994F, 0x5118, 0x98D4, - 0x511A, 0x9952, 0x511F, 0x8F9E, 0x5121, 0x9953, 0x512A, 0x9744, - 0x5132, 0x96D7, 0x5137, 0x9955, 0x513A, 0x9954, 0x513B, 0x9957, - 0x513C, 0x9956, 0x513F, 0x9958, 0x5140, 0x9959, 0x5141, 0x88F2, - 0x5143, 0x8CB3, 0x5144, 0x8C5A, 0x5145, 0x8F5B, 0x5146, 0x929B, - 0x5147, 0x8BA2, 0x5148, 0x90E6, 0x5149, 0x8CF5, 0x514A, 0xFA7E, - 0x514B, 0x8D8E, 0x514C, 0x995B, 0x514D, 0x96C6, 0x514E, 0x9365, - 0x5150, 0x8E99, 0x5152, 0x995A, 0x5154, 0x995C, 0x515A, 0x937D, - 0x515C, 0x8A95, 0x5162, 0x995D, 0x5164, 0xFA80, 0x5165, 0x93FC, - 0x5168, 0x9153, 0x5169, 0x995F, 0x516A, 0x9960, 0x516B, 0x94AA, - 0x516C, 0x8CF6, 0x516D, 0x985A, 0x516E, 0x9961, 0x5171, 0x8BA4, - 0x5175, 0x95BA, 0x5176, 0x91B4, 0x5177, 0x8BEF, 0x5178, 0x9354, - 0x517C, 0x8C93, 0x5180, 0x9962, 0x5182, 0x9963, 0x5185, 0x93E0, - 0x5186, 0x897E, 0x5189, 0x9966, 0x518A, 0x8DFB, 0x518C, 0x9965, - 0x518D, 0x8DC4, 0x518F, 0x9967, 0x5190, 0xE3EC, 0x5191, 0x9968, - 0x5192, 0x9660, 0x5193, 0x9969, 0x5195, 0x996A, 0x5196, 0x996B, - 0x5197, 0x8FE7, 0x5199, 0x8ECA, 0x519D, 0xFA81, 0x51A0, 0x8AA5, - 0x51A2, 0x996E, 0x51A4, 0x996C, 0x51A5, 0x96BB, 0x51A6, 0x996D, - 0x51A8, 0x9579, 0x51A9, 0x996F, 0x51AA, 0x9970, 0x51AB, 0x9971, - 0x51AC, 0x937E, 0x51B0, 0x9975, 0x51B1, 0x9973, 0x51B2, 0x9974, - 0x51B3, 0x9972, 0x51B4, 0x8DE1, 0x51B5, 0x9976, 0x51B6, 0x96E8, - 0x51B7, 0x97E2, 0x51BD, 0x9977, 0x51BE, 0xFA82, 0x51C4, 0x90A6, - 0x51C5, 0x9978, 0x51C6, 0x8F79, 0x51C9, 0x9979, 0x51CB, 0x929C, - 0x51CC, 0x97BD, 0x51CD, 0x9380, 0x51D6, 0x99C3, 0x51DB, 0x997A, - 0x51DC, 0xEAA3, 0x51DD, 0x8BC3, 0x51E0, 0x997B, 0x51E1, 0x967D, - 0x51E6, 0x8F88, 0x51E7, 0x91FA, 0x51E9, 0x997D, 0x51EA, 0x93E2, - 0x51EC, 0xFA83, 0x51ED, 0x997E, 0x51F0, 0x9980, 0x51F1, 0x8A4D, - 0x51F5, 0x9981, 0x51F6, 0x8BA5, 0x51F8, 0x93CA, 0x51F9, 0x899A, - 0x51FA, 0x8F6F, 0x51FD, 0x949F, 0x51FE, 0x9982, 0x5200, 0x9381, - 0x5203, 0x906E, 0x5204, 0x9983, 0x5206, 0x95AA, 0x5207, 0x90D8, - 0x5208, 0x8AA0, 0x520A, 0x8AA7, 0x520B, 0x9984, 0x520E, 0x9986, - 0x5211, 0x8C59, 0x5214, 0x9985, 0x5215, 0xFA84, 0x5217, 0x97F1, - 0x521D, 0x8F89, 0x5224, 0x94BB, 0x5225, 0x95CA, 0x5227, 0x9987, - 0x5229, 0x9798, 0x522A, 0x9988, 0x522E, 0x9989, 0x5230, 0x939E, - 0x5233, 0x998A, 0x5236, 0x90A7, 0x5237, 0x8DFC, 0x5238, 0x8C94, - 0x5239, 0x998B, 0x523A, 0x8E68, 0x523B, 0x8D8F, 0x5243, 0x92E4, - 0x5244, 0x998D, 0x5247, 0x91A5, 0x524A, 0x8DED, 0x524B, 0x998E, - 0x524C, 0x998F, 0x524D, 0x914F, 0x524F, 0x998C, 0x5254, 0x9991, - 0x5256, 0x9655, 0x525B, 0x8D84, 0x525E, 0x9990, 0x5263, 0x8C95, - 0x5264, 0x8DDC, 0x5265, 0x948D, 0x5269, 0x9994, 0x526A, 0x9992, - 0x526F, 0x959B, 0x5270, 0x8FE8, 0x5271, 0x999B, 0x5272, 0x8A84, - 0x5273, 0x9995, 0x5274, 0x9993, 0x5275, 0x916E, 0x527D, 0x9997, - 0x527F, 0x9996, 0x5283, 0x8A63, 0x5287, 0x8C80, 0x5288, 0x999C, - 0x5289, 0x97AB, 0x528D, 0x9998, 0x5291, 0x999D, 0x5292, 0x999A, - 0x5294, 0x9999, 0x529B, 0x97CD, 0x529C, 0xFA85, 0x529F, 0x8CF7, - 0x52A0, 0x89C1, 0x52A3, 0x97F2, 0x52A6, 0xFA86, 0x52A9, 0x8F95, - 0x52AA, 0x9377, 0x52AB, 0x8D85, 0x52AC, 0x99A0, 0x52AD, 0x99A1, - 0x52AF, 0xFB77, 0x52B1, 0x97E3, 0x52B4, 0x984A, 0x52B5, 0x99A3, - 0x52B9, 0x8CF8, 0x52BC, 0x99A2, 0x52BE, 0x8A4E, 0x52C0, 0xFA87, - 0x52C1, 0x99A4, 0x52C3, 0x9675, 0x52C5, 0x92BA, 0x52C7, 0x9745, - 0x52C9, 0x95D7, 0x52CD, 0x99A5, 0x52D2, 0xE8D3, 0x52D5, 0x93AE, - 0x52D7, 0x99A6, 0x52D8, 0x8AA8, 0x52D9, 0x96B1, 0x52DB, 0xFA88, - 0x52DD, 0x8F9F, 0x52DE, 0x99A7, 0x52DF, 0x95E5, 0x52E0, 0x99AB, - 0x52E2, 0x90A8, 0x52E3, 0x99A8, 0x52E4, 0x8BCE, 0x52E6, 0x99A9, - 0x52E7, 0x8AA9, 0x52F2, 0x8C4D, 0x52F3, 0x99AC, 0x52F5, 0x99AD, - 0x52F8, 0x99AE, 0x52F9, 0x99AF, 0x52FA, 0x8ED9, 0x52FE, 0x8CF9, - 0x52FF, 0x96DC, 0x5300, 0xFA89, 0x5301, 0x96E6, 0x5302, 0x93F5, - 0x5305, 0x95EF, 0x5306, 0x99B0, 0x5307, 0xFA8A, 0x5308, 0x99B1, - 0x530D, 0x99B3, 0x530F, 0x99B5, 0x5310, 0x99B4, 0x5315, 0x99B6, - 0x5316, 0x89BB, 0x5317, 0x966B, 0x5319, 0x8DFA, 0x531A, 0x99B7, - 0x531D, 0x9178, 0x5320, 0x8FA0, 0x5321, 0x8BA7, 0x5323, 0x99B8, - 0x5324, 0xFA8B, 0x532A, 0x94D9, 0x532F, 0x99B9, 0x5331, 0x99BA, - 0x5333, 0x99BB, 0x5338, 0x99BC, 0x5339, 0x9543, 0x533A, 0x8BE6, - 0x533B, 0x88E3, 0x533F, 0x93BD, 0x5340, 0x99BD, 0x5341, 0x8F5C, - 0x5343, 0x90E7, 0x5345, 0x99BF, 0x5346, 0x99BE, 0x5347, 0x8FA1, - 0x5348, 0x8CDF, 0x5349, 0x99C1, 0x534A, 0x94BC, 0x534D, 0x99C2, - 0x5351, 0x94DA, 0x5352, 0x91B2, 0x5353, 0x91EC, 0x5354, 0x8BA6, - 0x5357, 0x93EC, 0x5358, 0x9250, 0x535A, 0x948E, 0x535C, 0x966D, - 0x535E, 0x99C4, 0x5360, 0x90E8, 0x5366, 0x8C54, 0x5369, 0x99C5, - 0x536E, 0x99C6, 0x536F, 0x894B, 0x5370, 0x88F3, 0x5371, 0x8AEB, - 0x5372, 0xFA8C, 0x5373, 0x91A6, 0x5374, 0x8B70, 0x5375, 0x9791, - 0x5377, 0x99C9, 0x5378, 0x89B5, 0x537B, 0x99C8, 0x537F, 0x8BA8, - 0x5382, 0x99CA, 0x5384, 0x96EF, 0x5393, 0xFA8D, 0x5396, 0x99CB, - 0x5398, 0x97D0, 0x539A, 0x8CFA, 0x539F, 0x8CB4, 0x53A0, 0x99CC, - 0x53A5, 0x99CE, 0x53A6, 0x99CD, 0x53A8, 0x907E, 0x53A9, 0x8958, - 0x53AD, 0x897D, 0x53AE, 0x99CF, 0x53B0, 0x99D0, 0x53B2, 0xFA8E, - 0x53B3, 0x8CB5, 0x53B6, 0x99D1, 0x53BB, 0x8B8E, 0x53C2, 0x8E51, - 0x53C3, 0x99D2, 0x53C8, 0x9694, 0x53C9, 0x8DB3, 0x53CA, 0x8B79, - 0x53CB, 0x9746, 0x53CC, 0x916F, 0x53CD, 0x94BD, 0x53CE, 0x8EFB, - 0x53D4, 0x8F66, 0x53D6, 0x8EE6, 0x53D7, 0x8EF3, 0x53D9, 0x8F96, - 0x53DB, 0x94BE, 0x53DD, 0xFA8F, 0x53DF, 0x99D5, 0x53E1, 0x8962, - 0x53E2, 0x9170, 0x53E3, 0x8CFB, 0x53E4, 0x8CC3, 0x53E5, 0x8BE5, - 0x53E8, 0x99D9, 0x53E9, 0x9240, 0x53EA, 0x91FC, 0x53EB, 0x8BA9, - 0x53EC, 0x8FA2, 0x53ED, 0x99DA, 0x53EE, 0x99D8, 0x53EF, 0x89C2, - 0x53F0, 0x91E4, 0x53F1, 0x8EB6, 0x53F2, 0x8E6A, 0x53F3, 0x8945, - 0x53F6, 0x8A90, 0x53F7, 0x8D86, 0x53F8, 0x8E69, 0x53FA, 0x99DB, - 0x5401, 0x99DC, 0x5403, 0x8B68, 0x5404, 0x8A65, 0x5408, 0x8D87, - 0x5409, 0x8B67, 0x540A, 0x92DD, 0x540B, 0x8944, 0x540C, 0x93AF, - 0x540D, 0x96BC, 0x540E, 0x8D40, 0x540F, 0x9799, 0x5410, 0x9366, - 0x5411, 0x8CFC, 0x541B, 0x8C4E, 0x541D, 0x99E5, 0x541F, 0x8BE1, - 0x5420, 0x9669, 0x5426, 0x94DB, 0x5429, 0x99E4, 0x542B, 0x8ADC, - 0x542C, 0x99DF, 0x542D, 0x99E0, 0x542E, 0x99E2, 0x5436, 0x99E3, - 0x5438, 0x8B7A, 0x5439, 0x9081, 0x543B, 0x95AB, 0x543C, 0x99E1, - 0x543D, 0x99DD, 0x543E, 0x8CE1, 0x5440, 0x99DE, 0x5442, 0x9843, - 0x5446, 0x95F0, 0x5448, 0x92E6, 0x5449, 0x8CE0, 0x544A, 0x8D90, - 0x544E, 0x99E6, 0x5451, 0x93DB, 0x545F, 0x99EA, 0x5468, 0x8EFC, - 0x546A, 0x8EF4, 0x5470, 0x99ED, 0x5471, 0x99EB, 0x5473, 0x96A1, - 0x5475, 0x99E8, 0x5476, 0x99F1, 0x5477, 0x99EC, 0x547B, 0x99EF, - 0x547C, 0x8CC4, 0x547D, 0x96BD, 0x5480, 0x99F0, 0x5484, 0x99F2, - 0x5486, 0x99F4, 0x548A, 0xFA92, 0x548B, 0x8DEE, 0x548C, 0x9861, - 0x548E, 0x99E9, 0x548F, 0x99E7, 0x5490, 0x99F3, 0x5492, 0x99EE, - 0x549C, 0xFA91, 0x54A2, 0x99F6, 0x54A4, 0x9A42, 0x54A5, 0x99F8, - 0x54A8, 0x99FC, 0x54A9, 0xFA93, 0x54AB, 0x9A40, 0x54AC, 0x99F9, - 0x54AF, 0x9A5D, 0x54B2, 0x8DE7, 0x54B3, 0x8A50, 0x54B8, 0x99F7, - 0x54BC, 0x9A44, 0x54BD, 0x88F4, 0x54BE, 0x9A43, 0x54C0, 0x88A3, - 0x54C1, 0x9569, 0x54C2, 0x9A41, 0x54C4, 0x99FA, 0x54C7, 0x99F5, - 0x54C8, 0x99FB, 0x54C9, 0x8DC6, 0x54D8, 0x9A45, 0x54E1, 0x88F5, - 0x54E2, 0x9A4E, 0x54E5, 0x9A46, 0x54E6, 0x9A47, 0x54E8, 0x8FA3, - 0x54E9, 0x9689, 0x54ED, 0x9A4C, 0x54EE, 0x9A4B, 0x54F2, 0x934E, - 0x54FA, 0x9A4D, 0x54FD, 0x9A4A, 0x54FF, 0xFA94, 0x5504, 0x8953, - 0x5506, 0x8DB4, 0x5507, 0x904F, 0x550F, 0x9A48, 0x5510, 0x9382, - 0x5514, 0x9A49, 0x5516, 0x88A0, 0x552E, 0x9A53, 0x552F, 0x9742, - 0x5531, 0x8FA5, 0x5533, 0x9A59, 0x5538, 0x9A58, 0x5539, 0x9A4F, - 0x553E, 0x91C1, 0x5540, 0x9A50, 0x5544, 0x91ED, 0x5545, 0x9A55, - 0x5546, 0x8FA4, 0x554C, 0x9A52, 0x554F, 0x96E2, 0x5553, 0x8C5B, - 0x5556, 0x9A56, 0x5557, 0x9A57, 0x555C, 0x9A54, 0x555D, 0x9A5A, - 0x5563, 0x9A51, 0x557B, 0x9A60, 0x557C, 0x9A65, 0x557E, 0x9A61, - 0x5580, 0x9A5C, 0x5583, 0x9A66, 0x5584, 0x9150, 0x5586, 0xFA95, - 0x5587, 0x9A68, 0x5589, 0x8D41, 0x558A, 0x9A5E, 0x558B, 0x929D, - 0x5598, 0x9A62, 0x5599, 0x9A5B, 0x559A, 0x8AAB, 0x559C, 0x8AEC, - 0x559D, 0x8A85, 0x559E, 0x9A63, 0x559F, 0x9A5F, 0x55A7, 0x8C96, - 0x55A8, 0x9A69, 0x55A9, 0x9A67, 0x55AA, 0x9172, 0x55AB, 0x8B69, - 0x55AC, 0x8BAA, 0x55AE, 0x9A64, 0x55B0, 0x8BF2, 0x55B6, 0x8963, - 0x55C4, 0x9A6D, 0x55C5, 0x9A6B, 0x55C7, 0x9AA5, 0x55D4, 0x9A70, - 0x55DA, 0x9A6A, 0x55DC, 0x9A6E, 0x55DF, 0x9A6C, 0x55E3, 0x8E6B, - 0x55E4, 0x9A6F, 0x55F7, 0x9A72, 0x55F9, 0x9A77, 0x55FD, 0x9A75, - 0x55FE, 0x9A74, 0x5606, 0x9251, 0x5609, 0x89C3, 0x5614, 0x9A71, - 0x5616, 0x9A73, 0x5617, 0x8FA6, 0x5618, 0x8952, 0x561B, 0x9A76, - 0x5629, 0x89DC, 0x562F, 0x9A82, 0x5631, 0x8FFA, 0x5632, 0x9A7D, - 0x5634, 0x9A7B, 0x5636, 0x9A7C, 0x5638, 0x9A7E, 0x5642, 0x895C, - 0x564C, 0x9158, 0x564E, 0x9A78, 0x5650, 0x9A79, 0x565B, 0x8A9A, - 0x5664, 0x9A81, 0x5668, 0x8AED, 0x566A, 0x9A84, 0x566B, 0x9A80, - 0x566C, 0x9A83, 0x5674, 0x95AC, 0x5678, 0x93D3, 0x567A, 0x94B6, - 0x5680, 0x9A86, 0x5686, 0x9A85, 0x5687, 0x8A64, 0x568A, 0x9A87, - 0x568F, 0x9A8A, 0x5694, 0x9A89, 0x56A0, 0x9A88, 0x56A2, 0x9458, - 0x56A5, 0x9A8B, 0x56AE, 0x9A8C, 0x56B4, 0x9A8E, 0x56B6, 0x9A8D, - 0x56BC, 0x9A90, 0x56C0, 0x9A93, 0x56C1, 0x9A91, 0x56C2, 0x9A8F, - 0x56C3, 0x9A92, 0x56C8, 0x9A94, 0x56CE, 0x9A95, 0x56D1, 0x9A96, - 0x56D3, 0x9A97, 0x56D7, 0x9A98, 0x56D8, 0x9964, 0x56DA, 0x8EFA, - 0x56DB, 0x8E6C, 0x56DE, 0x89F1, 0x56E0, 0x88F6, 0x56E3, 0x9263, - 0x56EE, 0x9A99, 0x56F0, 0x8DA2, 0x56F2, 0x88CD, 0x56F3, 0x907D, - 0x56F9, 0x9A9A, 0x56FA, 0x8CC5, 0x56FD, 0x8D91, 0x56FF, 0x9A9C, - 0x5700, 0x9A9B, 0x5703, 0x95DE, 0x5704, 0x9A9D, 0x5708, 0x9A9F, - 0x5709, 0x9A9E, 0x570B, 0x9AA0, 0x570D, 0x9AA1, 0x570F, 0x8C97, - 0x5712, 0x8980, 0x5713, 0x9AA2, 0x5716, 0x9AA4, 0x5718, 0x9AA3, - 0x571C, 0x9AA6, 0x571F, 0x9379, 0x5726, 0x9AA7, 0x5727, 0x88B3, - 0x5728, 0x8DDD, 0x572D, 0x8C5C, 0x5730, 0x926E, 0x5737, 0x9AA8, - 0x5738, 0x9AA9, 0x573B, 0x9AAB, 0x5740, 0x9AAC, 0x5742, 0x8DE2, - 0x5747, 0x8BCF, 0x574A, 0x9656, 0x574E, 0x9AAA, 0x574F, 0x9AAD, - 0x5750, 0x8DBF, 0x5751, 0x8D42, 0x5759, 0xFA96, 0x5761, 0x9AB1, - 0x5764, 0x8DA3, 0x5765, 0xFA97, 0x5766, 0x9252, 0x5769, 0x9AAE, - 0x576A, 0x92D8, 0x577F, 0x9AB2, 0x5782, 0x9082, 0x5788, 0x9AB0, - 0x5789, 0x9AB3, 0x578B, 0x8C5E, 0x5793, 0x9AB4, 0x57A0, 0x9AB5, - 0x57A2, 0x8D43, 0x57A3, 0x8A5F, 0x57A4, 0x9AB7, 0x57AA, 0x9AB8, - 0x57AC, 0xFA98, 0x57B0, 0x9AB9, 0x57B3, 0x9AB6, 0x57C0, 0x9AAF, - 0x57C3, 0x9ABA, 0x57C6, 0x9ABB, 0x57C7, 0xFA9A, 0x57C8, 0xFA99, - 0x57CB, 0x9684, 0x57CE, 0x8FE9, 0x57D2, 0x9ABD, 0x57D3, 0x9ABE, - 0x57D4, 0x9ABC, 0x57D6, 0x9AC0, 0x57DC, 0x9457, 0x57DF, 0x88E6, - 0x57E0, 0x9575, 0x57E3, 0x9AC1, 0x57F4, 0x8FFB, 0x57F7, 0x8EB7, - 0x57F9, 0x947C, 0x57FA, 0x8AEE, 0x57FC, 0x8DE9, 0x5800, 0x9678, - 0x5802, 0x93B0, 0x5805, 0x8C98, 0x5806, 0x91CD, 0x580A, 0x9ABF, - 0x580B, 0x9AC2, 0x5815, 0x91C2, 0x5819, 0x9AC3, 0x581D, 0x9AC4, - 0x5821, 0x9AC6, 0x5824, 0x92E7, 0x582A, 0x8AAC, 0x582F, 0xEA9F, - 0x5830, 0x8981, 0x5831, 0x95F1, 0x5834, 0x8FEA, 0x5835, 0x9367, - 0x583A, 0x8DE4, 0x583D, 0x9ACC, 0x5840, 0x95BB, 0x5841, 0x97DB, - 0x584A, 0x89F2, 0x584B, 0x9AC8, 0x5851, 0x9159, 0x5852, 0x9ACB, - 0x5854, 0x9383, 0x5857, 0x9368, 0x5858, 0x9384, 0x5859, 0x94B7, - 0x585A, 0x92CB, 0x585E, 0x8DC7, 0x5862, 0x9AC7, 0x5869, 0x8996, - 0x586B, 0x9355, 0x5870, 0x9AC9, 0x5872, 0x9AC5, 0x5875, 0x906F, - 0x5879, 0x9ACD, 0x587E, 0x8F6D, 0x5883, 0x8BAB, 0x5885, 0x9ACE, - 0x5893, 0x95E6, 0x5897, 0x919D, 0x589C, 0x92C4, 0x589E, 0xFA9D, - 0x589F, 0x9AD0, 0x58A8, 0x966E, 0x58AB, 0x9AD1, 0x58AE, 0x9AD6, - 0x58B2, 0xFA9E, 0x58B3, 0x95AD, 0x58B8, 0x9AD5, 0x58B9, 0x9ACF, - 0x58BA, 0x9AD2, 0x58BB, 0x9AD4, 0x58BE, 0x8DA4, 0x58C1, 0x95C7, - 0x58C5, 0x9AD7, 0x58C7, 0x9264, 0x58CA, 0x89F3, 0x58CC, 0x8FEB, - 0x58D1, 0x9AD9, 0x58D3, 0x9AD8, 0x58D5, 0x8D88, 0x58D7, 0x9ADA, - 0x58D8, 0x9ADC, 0x58D9, 0x9ADB, 0x58DC, 0x9ADE, 0x58DE, 0x9AD3, - 0x58DF, 0x9AE0, 0x58E4, 0x9ADF, 0x58E5, 0x9ADD, 0x58EB, 0x8E6D, - 0x58EC, 0x9070, 0x58EE, 0x9173, 0x58EF, 0x9AE1, 0x58F0, 0x90BA, - 0x58F1, 0x88EB, 0x58F2, 0x9484, 0x58F7, 0x92D9, 0x58F9, 0x9AE3, - 0x58FA, 0x9AE2, 0x58FB, 0x9AE4, 0x58FC, 0x9AE5, 0x58FD, 0x9AE6, - 0x5902, 0x9AE7, 0x5909, 0x95CF, 0x590A, 0x9AE8, 0x590B, 0xFA9F, - 0x590F, 0x89C4, 0x5910, 0x9AE9, 0x5915, 0x975B, 0x5916, 0x8A4F, - 0x5918, 0x99C7, 0x5919, 0x8F67, 0x591A, 0x91BD, 0x591B, 0x9AEA, - 0x591C, 0x96E9, 0x5922, 0x96B2, 0x5925, 0x9AEC, 0x5927, 0x91E5, - 0x5929, 0x9356, 0x592A, 0x91BE, 0x592B, 0x9576, 0x592C, 0x9AED, - 0x592D, 0x9AEE, 0x592E, 0x899B, 0x5931, 0x8EB8, 0x5932, 0x9AEF, - 0x5937, 0x88CE, 0x5938, 0x9AF0, 0x593E, 0x9AF1, 0x5944, 0x8982, - 0x5947, 0x8AEF, 0x5948, 0x93DE, 0x5949, 0x95F2, 0x594E, 0x9AF5, - 0x594F, 0x9174, 0x5950, 0x9AF4, 0x5951, 0x8C5F, 0x5953, 0xFAA0, - 0x5954, 0x967A, 0x5955, 0x9AF3, 0x5957, 0x9385, 0x5958, 0x9AF7, - 0x595A, 0x9AF6, 0x595B, 0xFAA1, 0x595D, 0xFAA2, 0x5960, 0x9AF9, - 0x5962, 0x9AF8, 0x5963, 0xFAA3, 0x5965, 0x899C, 0x5967, 0x9AFA, - 0x5968, 0x8FA7, 0x5969, 0x9AFC, 0x596A, 0x9244, 0x596C, 0x9AFB, - 0x596E, 0x95B1, 0x5973, 0x8F97, 0x5974, 0x937A, 0x5978, 0x9B40, - 0x597D, 0x8D44, 0x5981, 0x9B41, 0x5982, 0x9440, 0x5983, 0x94DC, - 0x5984, 0x96CF, 0x598A, 0x9444, 0x598D, 0x9B4A, 0x5993, 0x8B57, - 0x5996, 0x9764, 0x5999, 0x96AD, 0x599B, 0x9BAA, 0x599D, 0x9B42, - 0x59A3, 0x9B45, 0x59A4, 0xFAA4, 0x59A5, 0x91C3, 0x59A8, 0x9657, - 0x59AC, 0x9369, 0x59B2, 0x9B46, 0x59B9, 0x9685, 0x59BA, 0xFAA5, - 0x59BB, 0x8DC8, 0x59BE, 0x8FA8, 0x59C6, 0x9B47, 0x59C9, 0x8E6F, - 0x59CB, 0x8E6E, 0x59D0, 0x88B7, 0x59D1, 0x8CC6, 0x59D3, 0x90A9, - 0x59D4, 0x88CF, 0x59D9, 0x9B4B, 0x59DA, 0x9B4C, 0x59DC, 0x9B49, - 0x59E5, 0x8957, 0x59E6, 0x8AAD, 0x59E8, 0x9B48, 0x59EA, 0x96C3, - 0x59EB, 0x9550, 0x59F6, 0x88A6, 0x59FB, 0x88F7, 0x59FF, 0x8E70, - 0x5A01, 0x88D0, 0x5A03, 0x88A1, 0x5A09, 0x9B51, 0x5A11, 0x9B4F, - 0x5A18, 0x96BA, 0x5A1A, 0x9B52, 0x5A1C, 0x9B50, 0x5A1F, 0x9B4E, - 0x5A20, 0x9050, 0x5A25, 0x9B4D, 0x5A29, 0x95D8, 0x5A2F, 0x8CE2, - 0x5A35, 0x9B56, 0x5A36, 0x9B57, 0x5A3C, 0x8FA9, 0x5A40, 0x9B53, - 0x5A41, 0x984B, 0x5A46, 0x946B, 0x5A49, 0x9B55, 0x5A5A, 0x8DA5, - 0x5A62, 0x9B58, 0x5A66, 0x9577, 0x5A6A, 0x9B59, 0x5A6C, 0x9B54, - 0x5A7F, 0x96B9, 0x5A92, 0x947D, 0x5A9A, 0x9B5A, 0x5A9B, 0x9551, - 0x5ABC, 0x9B5B, 0x5ABD, 0x9B5F, 0x5ABE, 0x9B5C, 0x5AC1, 0x89C5, - 0x5AC2, 0x9B5E, 0x5AC9, 0x8EB9, 0x5ACB, 0x9B5D, 0x5ACC, 0x8C99, - 0x5AD0, 0x9B6B, 0x5AD6, 0x9B64, 0x5AD7, 0x9B61, 0x5AE1, 0x9284, - 0x5AE3, 0x9B60, 0x5AE6, 0x9B62, 0x5AE9, 0x9B63, 0x5AFA, 0x9B65, - 0x5AFB, 0x9B66, 0x5B09, 0x8AF0, 0x5B0B, 0x9B68, 0x5B0C, 0x9B67, - 0x5B16, 0x9B69, 0x5B22, 0x8FEC, 0x5B2A, 0x9B6C, 0x5B2C, 0x92DA, - 0x5B30, 0x8964, 0x5B32, 0x9B6A, 0x5B36, 0x9B6D, 0x5B3E, 0x9B6E, - 0x5B40, 0x9B71, 0x5B43, 0x9B6F, 0x5B45, 0x9B70, 0x5B50, 0x8E71, - 0x5B51, 0x9B72, 0x5B54, 0x8D45, 0x5B55, 0x9B73, 0x5B56, 0xFAA6, - 0x5B57, 0x8E9A, 0x5B58, 0x91B6, 0x5B5A, 0x9B74, 0x5B5B, 0x9B75, - 0x5B5C, 0x8E79, 0x5B5D, 0x8D46, 0x5B5F, 0x96D0, 0x5B63, 0x8B47, - 0x5B64, 0x8CC7, 0x5B65, 0x9B76, 0x5B66, 0x8A77, 0x5B69, 0x9B77, - 0x5B6B, 0x91B7, 0x5B70, 0x9B78, 0x5B71, 0x9BA1, 0x5B73, 0x9B79, - 0x5B75, 0x9B7A, 0x5B78, 0x9B7B, 0x5B7A, 0x9B7D, 0x5B80, 0x9B7E, - 0x5B83, 0x9B80, 0x5B85, 0x91EE, 0x5B87, 0x8946, 0x5B88, 0x8EE7, - 0x5B89, 0x88C0, 0x5B8B, 0x9176, 0x5B8C, 0x8AAE, 0x5B8D, 0x8EB3, - 0x5B8F, 0x8D47, 0x5B95, 0x9386, 0x5B97, 0x8F40, 0x5B98, 0x8AAF, - 0x5B99, 0x9288, 0x5B9A, 0x92E8, 0x5B9B, 0x88B6, 0x5B9C, 0x8B58, - 0x5B9D, 0x95F3, 0x5B9F, 0x8EC0, 0x5BA2, 0x8B71, 0x5BA3, 0x90E9, - 0x5BA4, 0x8EBA, 0x5BA5, 0x9747, 0x5BA6, 0x9B81, 0x5BAE, 0x8B7B, - 0x5BB0, 0x8DC9, 0x5BB3, 0x8A51, 0x5BB4, 0x8983, 0x5BB5, 0x8FAA, - 0x5BB6, 0x89C6, 0x5BB8, 0x9B82, 0x5BB9, 0x9765, 0x5BBF, 0x8F68, - 0x5BC0, 0xFAA7, 0x5BC2, 0x8EE2, 0x5BC3, 0x9B83, 0x5BC4, 0x8AF1, - 0x5BC5, 0x93D0, 0x5BC6, 0x96A7, 0x5BC7, 0x9B84, 0x5BC9, 0x9B85, - 0x5BCC, 0x9578, 0x5BD0, 0x9B87, 0x5BD2, 0x8AA6, 0x5BD3, 0x8BF5, - 0x5BD4, 0x9B86, 0x5BD8, 0xFAA9, 0x5BDB, 0x8AB0, 0x5BDD, 0x9051, - 0x5BDE, 0x9B8B, 0x5BDF, 0x8E40, 0x5BE1, 0x89C7, 0x5BE2, 0x9B8A, - 0x5BE4, 0x9B88, 0x5BE5, 0x9B8C, 0x5BE6, 0x9B89, 0x5BE7, 0x944A, - 0x5BE8, 0x9ECB, 0x5BE9, 0x9052, 0x5BEB, 0x9B8D, 0x5BEC, 0xFAAA, - 0x5BEE, 0x97BE, 0x5BF0, 0x9B8E, 0x5BF3, 0x9B90, 0x5BF5, 0x929E, - 0x5BF6, 0x9B8F, 0x5BF8, 0x90A1, 0x5BFA, 0x8E9B, 0x5BFE, 0x91CE, - 0x5BFF, 0x8EF5, 0x5C01, 0x9595, 0x5C02, 0x90EA, 0x5C04, 0x8ECB, - 0x5C05, 0x9B91, 0x5C06, 0x8FAB, 0x5C07, 0x9B92, 0x5C08, 0x9B93, - 0x5C09, 0x88D1, 0x5C0A, 0x91B8, 0x5C0B, 0x9071, 0x5C0D, 0x9B94, - 0x5C0E, 0x93B1, 0x5C0F, 0x8FAC, 0x5C11, 0x8FAD, 0x5C13, 0x9B95, - 0x5C16, 0x90EB, 0x5C1A, 0x8FAE, 0x5C1E, 0xFAAB, 0x5C20, 0x9B96, - 0x5C22, 0x9B97, 0x5C24, 0x96DE, 0x5C28, 0x9B98, 0x5C2D, 0x8BC4, - 0x5C31, 0x8F41, 0x5C38, 0x9B99, 0x5C39, 0x9B9A, 0x5C3A, 0x8EDA, - 0x5C3B, 0x904B, 0x5C3C, 0x93F2, 0x5C3D, 0x9073, 0x5C3E, 0x94F6, - 0x5C3F, 0x9441, 0x5C40, 0x8BC7, 0x5C41, 0x9B9B, 0x5C45, 0x8B8F, - 0x5C46, 0x9B9C, 0x5C48, 0x8BFC, 0x5C4A, 0x93CD, 0x5C4B, 0x89AE, - 0x5C4D, 0x8E72, 0x5C4E, 0x9B9D, 0x5C4F, 0x9BA0, 0x5C50, 0x9B9F, - 0x5C51, 0x8BFB, 0x5C53, 0x9B9E, 0x5C55, 0x9357, 0x5C5E, 0x91AE, - 0x5C60, 0x936A, 0x5C61, 0x8EC6, 0x5C64, 0x9177, 0x5C65, 0x979A, - 0x5C6C, 0x9BA2, 0x5C6E, 0x9BA3, 0x5C6F, 0x93D4, 0x5C71, 0x8E52, - 0x5C76, 0x9BA5, 0x5C79, 0x9BA6, 0x5C8C, 0x9BA7, 0x5C90, 0x8AF2, - 0x5C91, 0x9BA8, 0x5C94, 0x9BA9, 0x5CA1, 0x89AA, 0x5CA6, 0xFAAC, - 0x5CA8, 0x915A, 0x5CA9, 0x8AE2, 0x5CAB, 0x9BAB, 0x5CAC, 0x96A6, - 0x5CB1, 0x91D0, 0x5CB3, 0x8A78, 0x5CB6, 0x9BAD, 0x5CB7, 0x9BAF, - 0x5CB8, 0x8ADD, 0x5CBA, 0xFAAD, 0x5CBB, 0x9BAC, 0x5CBC, 0x9BAE, - 0x5CBE, 0x9BB1, 0x5CC5, 0x9BB0, 0x5CC7, 0x9BB2, 0x5CD9, 0x9BB3, - 0x5CE0, 0x93BB, 0x5CE1, 0x8BAC, 0x5CE8, 0x89E3, 0x5CE9, 0x9BB4, - 0x5CEA, 0x9BB9, 0x5CED, 0x9BB7, 0x5CEF, 0x95F5, 0x5CF0, 0x95F4, - 0x5CF5, 0xFAAE, 0x5CF6, 0x9387, 0x5CFA, 0x9BB6, 0x5CFB, 0x8F73, - 0x5CFD, 0x9BB5, 0x5D07, 0x9092, 0x5D0B, 0x9BBA, 0x5D0E, 0x8DE8, - 0x5D11, 0x9BC0, 0x5D14, 0x9BC1, 0x5D15, 0x9BBB, 0x5D16, 0x8A52, - 0x5D17, 0x9BBC, 0x5D18, 0x9BC5, 0x5D19, 0x9BC4, 0x5D1A, 0x9BC3, - 0x5D1B, 0x9BBF, 0x5D1F, 0x9BBE, 0x5D22, 0x9BC2, 0x5D27, 0xFAAF, - 0x5D29, 0x95F6, 0x5D42, 0xFAB2, 0x5D4B, 0x9BC9, 0x5D4C, 0x9BC6, - 0x5D4E, 0x9BC8, 0x5D50, 0x9792, 0x5D52, 0x9BC7, 0x5D53, 0xFAB0, - 0x5D5C, 0x9BBD, 0x5D69, 0x9093, 0x5D6C, 0x9BCA, 0x5D6D, 0xFAB3, - 0x5D6F, 0x8DB5, 0x5D73, 0x9BCB, 0x5D76, 0x9BCC, 0x5D82, 0x9BCF, - 0x5D84, 0x9BCE, 0x5D87, 0x9BCD, 0x5D8B, 0x9388, 0x5D8C, 0x9BB8, - 0x5D90, 0x9BD5, 0x5D9D, 0x9BD1, 0x5DA2, 0x9BD0, 0x5DAC, 0x9BD2, - 0x5DAE, 0x9BD3, 0x5DB7, 0x9BD6, 0x5DB8, 0xFAB4, 0x5DB9, 0xFAB5, - 0x5DBA, 0x97E4, 0x5DBC, 0x9BD7, 0x5DBD, 0x9BD4, 0x5DC9, 0x9BD8, - 0x5DCC, 0x8ADE, 0x5DCD, 0x9BD9, 0x5DD0, 0xFAB6, 0x5DD2, 0x9BDB, - 0x5DD3, 0x9BDA, 0x5DD6, 0x9BDC, 0x5DDB, 0x9BDD, 0x5DDD, 0x90EC, - 0x5DDE, 0x8F42, 0x5DE1, 0x8F84, 0x5DE3, 0x9183, 0x5DE5, 0x8D48, - 0x5DE6, 0x8DB6, 0x5DE7, 0x8D49, 0x5DE8, 0x8B90, 0x5DEB, 0x9BDE, - 0x5DEE, 0x8DB7, 0x5DF1, 0x8CC8, 0x5DF2, 0x9BDF, 0x5DF3, 0x96A4, - 0x5DF4, 0x9462, 0x5DF5, 0x9BE0, 0x5DF7, 0x8D4A, 0x5DFB, 0x8AAA, - 0x5DFD, 0x9246, 0x5DFE, 0x8BD0, 0x5E02, 0x8E73, 0x5E03, 0x957A, - 0x5E06, 0x94BF, 0x5E0B, 0x9BE1, 0x5E0C, 0x8AF3, 0x5E11, 0x9BE4, - 0x5E16, 0x929F, 0x5E19, 0x9BE3, 0x5E1A, 0x9BE2, 0x5E1B, 0x9BE5, - 0x5E1D, 0x92E9, 0x5E25, 0x9083, 0x5E2B, 0x8E74, 0x5E2D, 0x90C8, - 0x5E2F, 0x91D1, 0x5E30, 0x8B41, 0x5E33, 0x92A0, 0x5E36, 0x9BE6, - 0x5E37, 0x9BE7, 0x5E38, 0x8FED, 0x5E3D, 0x9658, 0x5E40, 0x9BEA, - 0x5E43, 0x9BE9, 0x5E44, 0x9BE8, 0x5E45, 0x959D, 0x5E47, 0x9BF1, - 0x5E4C, 0x9679, 0x5E4E, 0x9BEB, 0x5E54, 0x9BED, 0x5E55, 0x968B, - 0x5E57, 0x9BEC, 0x5E5F, 0x9BEE, 0x5E61, 0x94A6, 0x5E62, 0x9BEF, - 0x5E63, 0x95BC, 0x5E64, 0x9BF0, 0x5E72, 0x8AB1, 0x5E73, 0x95BD, - 0x5E74, 0x944E, 0x5E75, 0x9BF2, 0x5E76, 0x9BF3, 0x5E78, 0x8D4B, - 0x5E79, 0x8AB2, 0x5E7A, 0x9BF4, 0x5E7B, 0x8CB6, 0x5E7C, 0x9763, - 0x5E7D, 0x9748, 0x5E7E, 0x8AF4, 0x5E7F, 0x9BF6, 0x5E81, 0x92A1, - 0x5E83, 0x8D4C, 0x5E84, 0x8FAF, 0x5E87, 0x94DD, 0x5E8A, 0x8FB0, - 0x5E8F, 0x8F98, 0x5E95, 0x92EA, 0x5E96, 0x95F7, 0x5E97, 0x9358, - 0x5E9A, 0x8D4D, 0x5E9C, 0x957B, 0x5EA0, 0x9BF7, 0x5EA6, 0x9378, - 0x5EA7, 0x8DC0, 0x5EAB, 0x8CC9, 0x5EAD, 0x92EB, 0x5EB5, 0x88C1, - 0x5EB6, 0x8F8E, 0x5EB7, 0x8D4E, 0x5EB8, 0x9766, 0x5EC1, 0x9BF8, - 0x5EC2, 0x9BF9, 0x5EC3, 0x9470, 0x5EC8, 0x9BFA, 0x5EC9, 0x97F5, - 0x5ECA, 0x984C, 0x5ECF, 0x9BFC, 0x5ED0, 0x9BFB, 0x5ED3, 0x8A66, - 0x5ED6, 0x9C40, 0x5EDA, 0x9C43, 0x5EDB, 0x9C44, 0x5EDD, 0x9C42, - 0x5EDF, 0x955F, 0x5EE0, 0x8FB1, 0x5EE1, 0x9C46, 0x5EE2, 0x9C45, - 0x5EE3, 0x9C41, 0x5EE8, 0x9C47, 0x5EE9, 0x9C48, 0x5EEC, 0x9C49, - 0x5EF0, 0x9C4C, 0x5EF1, 0x9C4A, 0x5EF3, 0x9C4B, 0x5EF4, 0x9C4D, - 0x5EF6, 0x8984, 0x5EF7, 0x92EC, 0x5EF8, 0x9C4E, 0x5EFA, 0x8C9A, - 0x5EFB, 0x89F4, 0x5EFC, 0x9455, 0x5EFE, 0x9C4F, 0x5EFF, 0x93F9, - 0x5F01, 0x95D9, 0x5F03, 0x9C50, 0x5F04, 0x984D, 0x5F09, 0x9C51, - 0x5F0A, 0x95BE, 0x5F0B, 0x9C54, 0x5F0C, 0x989F, 0x5F0D, 0x98AF, - 0x5F0F, 0x8EAE, 0x5F10, 0x93F3, 0x5F11, 0x9C55, 0x5F13, 0x8B7C, - 0x5F14, 0x92A2, 0x5F15, 0x88F8, 0x5F16, 0x9C56, 0x5F17, 0x95A4, - 0x5F18, 0x8D4F, 0x5F1B, 0x926F, 0x5F1F, 0x92ED, 0x5F21, 0xFAB7, - 0x5F25, 0x96ED, 0x5F26, 0x8CB7, 0x5F27, 0x8CCA, 0x5F29, 0x9C57, - 0x5F2D, 0x9C58, 0x5F2F, 0x9C5E, 0x5F31, 0x8EE3, 0x5F34, 0xFAB8, - 0x5F35, 0x92A3, 0x5F37, 0x8BAD, 0x5F38, 0x9C59, 0x5F3C, 0x954A, - 0x5F3E, 0x9265, 0x5F41, 0x9C5A, 0x5F45, 0xFA67, 0x5F48, 0x9C5B, - 0x5F4A, 0x8BAE, 0x5F4C, 0x9C5C, 0x5F4E, 0x9C5D, 0x5F51, 0x9C5F, - 0x5F53, 0x9396, 0x5F56, 0x9C60, 0x5F57, 0x9C61, 0x5F59, 0x9C62, - 0x5F5C, 0x9C53, 0x5F5D, 0x9C52, 0x5F61, 0x9C63, 0x5F62, 0x8C60, - 0x5F66, 0x9546, 0x5F67, 0xFAB9, 0x5F69, 0x8DCA, 0x5F6A, 0x9556, - 0x5F6B, 0x92A4, 0x5F6C, 0x956A, 0x5F6D, 0x9C64, 0x5F70, 0x8FB2, - 0x5F71, 0x8965, 0x5F73, 0x9C65, 0x5F77, 0x9C66, 0x5F79, 0x96F0, - 0x5F7C, 0x94DE, 0x5F7F, 0x9C69, 0x5F80, 0x899D, 0x5F81, 0x90AA, - 0x5F82, 0x9C68, 0x5F83, 0x9C67, 0x5F84, 0x8C61, 0x5F85, 0x91D2, - 0x5F87, 0x9C6D, 0x5F88, 0x9C6B, 0x5F8A, 0x9C6A, 0x5F8B, 0x97A5, - 0x5F8C, 0x8CE3, 0x5F90, 0x8F99, 0x5F91, 0x9C6C, 0x5F92, 0x936B, - 0x5F93, 0x8F5D, 0x5F97, 0x93BE, 0x5F98, 0x9C70, 0x5F99, 0x9C6F, - 0x5F9E, 0x9C6E, 0x5FA0, 0x9C71, 0x5FA1, 0x8CE4, 0x5FA8, 0x9C72, - 0x5FA9, 0x959C, 0x5FAA, 0x8F7A, 0x5FAD, 0x9C73, 0x5FAE, 0x94F7, - 0x5FB3, 0x93BF, 0x5FB4, 0x92A5, 0x5FB7, 0xFABA, 0x5FB9, 0x934F, - 0x5FBC, 0x9C74, 0x5FBD, 0x8B4A, 0x5FC3, 0x9053, 0x5FC5, 0x954B, - 0x5FCC, 0x8AF5, 0x5FCD, 0x9445, 0x5FD6, 0x9C75, 0x5FD7, 0x8E75, - 0x5FD8, 0x9659, 0x5FD9, 0x965A, 0x5FDC, 0x899E, 0x5FDD, 0x9C7A, - 0x5FDE, 0xFABB, 0x5FE0, 0x9289, 0x5FE4, 0x9C77, 0x5FEB, 0x89F5, - 0x5FF0, 0x9CAB, 0x5FF1, 0x9C79, 0x5FF5, 0x944F, 0x5FF8, 0x9C78, - 0x5FFB, 0x9C76, 0x5FFD, 0x8D9A, 0x5FFF, 0x9C7C, 0x600E, 0x9C83, - 0x600F, 0x9C89, 0x6010, 0x9C81, 0x6012, 0x937B, 0x6015, 0x9C86, - 0x6016, 0x957C, 0x6019, 0x9C80, 0x601B, 0x9C85, 0x601C, 0x97E5, - 0x601D, 0x8E76, 0x6020, 0x91D3, 0x6021, 0x9C7D, 0x6025, 0x8B7D, - 0x6026, 0x9C88, 0x6027, 0x90AB, 0x6028, 0x8985, 0x6029, 0x9C82, - 0x602A, 0x89F6, 0x602B, 0x9C87, 0x602F, 0x8BAF, 0x6031, 0x9C84, - 0x603A, 0x9C8A, 0x6041, 0x9C8C, 0x6042, 0x9C96, 0x6043, 0x9C94, - 0x6046, 0x9C91, 0x604A, 0x9C90, 0x604B, 0x97F6, 0x604D, 0x9C92, - 0x6050, 0x8BB0, 0x6052, 0x8D50, 0x6055, 0x8F9A, 0x6059, 0x9C99, - 0x605A, 0x9C8B, 0x605D, 0xFABC, 0x605F, 0x9C8F, 0x6060, 0x9C7E, - 0x6062, 0x89F8, 0x6063, 0x9C93, 0x6064, 0x9C95, 0x6065, 0x9270, - 0x6068, 0x8DA6, 0x6069, 0x89B6, 0x606A, 0x9C8D, 0x606B, 0x9C98, - 0x606C, 0x9C97, 0x606D, 0x8BB1, 0x606F, 0x91A7, 0x6070, 0x8A86, - 0x6075, 0x8C62, 0x6077, 0x9C8E, 0x6081, 0x9C9A, 0x6083, 0x9C9D, - 0x6084, 0x9C9F, 0x6085, 0xFABD, 0x6089, 0x8EBB, 0x608A, 0xFABE, - 0x608B, 0x9CA5, 0x608C, 0x92EE, 0x608D, 0x9C9B, 0x6092, 0x9CA3, - 0x6094, 0x89F7, 0x6096, 0x9CA1, 0x6097, 0x9CA2, 0x609A, 0x9C9E, - 0x609B, 0x9CA0, 0x609F, 0x8CE5, 0x60A0, 0x9749, 0x60A3, 0x8AB3, - 0x60A6, 0x8978, 0x60A7, 0x9CA4, 0x60A9, 0x9459, 0x60AA, 0x88AB, - 0x60B2, 0x94DF, 0x60B3, 0x9C7B, 0x60B4, 0x9CAA, 0x60B5, 0x9CAE, - 0x60B6, 0x96E3, 0x60B8, 0x9CA7, 0x60BC, 0x9389, 0x60BD, 0x9CAC, - 0x60C5, 0x8FEE, 0x60C6, 0x9CAD, 0x60C7, 0x93D5, 0x60D1, 0x9866, - 0x60D3, 0x9CA9, 0x60D5, 0xFAC0, 0x60D8, 0x9CAF, 0x60DA, 0x8D9B, - 0x60DC, 0x90C9, 0x60DE, 0xFABF, 0x60DF, 0x88D2, 0x60E0, 0x9CA8, - 0x60E1, 0x9CA6, 0x60E3, 0x9179, 0x60E7, 0x9C9C, 0x60E8, 0x8E53, - 0x60F0, 0x91C4, 0x60F1, 0x9CBB, 0x60F2, 0xFAC2, 0x60F3, 0x917A, - 0x60F4, 0x9CB6, 0x60F6, 0x9CB3, 0x60F7, 0x9CB4, 0x60F9, 0x8EE4, - 0x60FA, 0x9CB7, 0x60FB, 0x9CBA, 0x6100, 0x9CB5, 0x6101, 0x8F44, - 0x6103, 0x9CB8, 0x6106, 0x9CB2, 0x6108, 0x96FA, 0x6109, 0x96F9, - 0x610D, 0x9CBC, 0x610E, 0x9CBD, 0x610F, 0x88D3, 0x6111, 0xFAC3, - 0x6115, 0x9CB1, 0x611A, 0x8BF0, 0x611B, 0x88A4, 0x611F, 0x8AB4, - 0x6120, 0xFAC1, 0x6121, 0x9CB9, 0x6127, 0x9CC1, 0x6128, 0x9CC0, - 0x612C, 0x9CC5, 0x6130, 0xFAC5, 0x6134, 0x9CC6, 0x6137, 0xFAC4, - 0x613C, 0x9CC4, 0x613D, 0x9CC7, 0x613E, 0x9CBF, 0x613F, 0x9CC3, - 0x6142, 0x9CC8, 0x6144, 0x9CC9, 0x6147, 0x9CBE, 0x6148, 0x8E9C, - 0x614A, 0x9CC2, 0x614B, 0x91D4, 0x614C, 0x8D51, 0x614D, 0x9CB0, - 0x614E, 0x9054, 0x6153, 0x9CD6, 0x6155, 0x95E7, 0x6158, 0x9CCC, - 0x6159, 0x9CCD, 0x615A, 0x9CCE, 0x615D, 0x9CD5, 0x615F, 0x9CD4, - 0x6162, 0x969D, 0x6163, 0x8AB5, 0x6165, 0x9CD2, 0x6167, 0x8C64, - 0x6168, 0x8A53, 0x616B, 0x9CCF, 0x616E, 0x97B6, 0x616F, 0x9CD1, - 0x6170, 0x88D4, 0x6171, 0x9CD3, 0x6173, 0x9CCA, 0x6174, 0x9CD0, - 0x6175, 0x9CD7, 0x6176, 0x8C63, 0x6177, 0x9CCB, 0x617E, 0x977C, - 0x6182, 0x974A, 0x6187, 0x9CDA, 0x618A, 0x9CDE, 0x618E, 0x919E, - 0x6190, 0x97F7, 0x6191, 0x9CDF, 0x6194, 0x9CDC, 0x6196, 0x9CD9, - 0x6198, 0xFAC6, 0x6199, 0x9CD8, 0x619A, 0x9CDD, 0x61A4, 0x95AE, - 0x61A7, 0x93B2, 0x61A9, 0x8C65, 0x61AB, 0x9CE0, 0x61AC, 0x9CDB, - 0x61AE, 0x9CE1, 0x61B2, 0x8C9B, 0x61B6, 0x89AF, 0x61BA, 0x9CE9, - 0x61BE, 0x8AB6, 0x61C3, 0x9CE7, 0x61C6, 0x9CE8, 0x61C7, 0x8DA7, - 0x61C8, 0x9CE6, 0x61C9, 0x9CE4, 0x61CA, 0x9CE3, 0x61CB, 0x9CEA, - 0x61CC, 0x9CE2, 0x61CD, 0x9CEC, 0x61D0, 0x89F9, 0x61E3, 0x9CEE, - 0x61E6, 0x9CED, 0x61F2, 0x92A6, 0x61F4, 0x9CF1, 0x61F6, 0x9CEF, - 0x61F7, 0x9CE5, 0x61F8, 0x8C9C, 0x61FA, 0x9CF0, 0x61FC, 0x9CF4, - 0x61FD, 0x9CF3, 0x61FE, 0x9CF5, 0x61FF, 0x9CF2, 0x6200, 0x9CF6, - 0x6208, 0x9CF7, 0x6209, 0x9CF8, 0x620A, 0x95E8, 0x620C, 0x9CFA, - 0x620D, 0x9CF9, 0x620E, 0x8F5E, 0x6210, 0x90AC, 0x6211, 0x89E4, - 0x6212, 0x89FA, 0x6213, 0xFAC7, 0x6214, 0x9CFB, 0x6216, 0x88BD, - 0x621A, 0x90CA, 0x621B, 0x9CFC, 0x621D, 0xE6C1, 0x621E, 0x9D40, - 0x621F, 0x8C81, 0x6221, 0x9D41, 0x6226, 0x90ED, 0x622A, 0x9D42, - 0x622E, 0x9D43, 0x622F, 0x8B59, 0x6230, 0x9D44, 0x6232, 0x9D45, - 0x6233, 0x9D46, 0x6234, 0x91D5, 0x6238, 0x8CCB, 0x623B, 0x96DF, - 0x623F, 0x965B, 0x6240, 0x8F8A, 0x6241, 0x9D47, 0x6247, 0x90EE, - 0x6248, 0xE7BB, 0x6249, 0x94E0, 0x624B, 0x8EE8, 0x624D, 0x8DCB, - 0x624E, 0x9D48, 0x6253, 0x91C5, 0x6255, 0x95A5, 0x6258, 0x91EF, - 0x625B, 0x9D4B, 0x625E, 0x9D49, 0x6260, 0x9D4C, 0x6263, 0x9D4A, - 0x6268, 0x9D4D, 0x626E, 0x95AF, 0x6271, 0x88B5, 0x6276, 0x957D, - 0x6279, 0x94E1, 0x627C, 0x9D4E, 0x627E, 0x9D51, 0x627F, 0x8FB3, - 0x6280, 0x8B5A, 0x6282, 0x9D4F, 0x6283, 0x9D56, 0x6284, 0x8FB4, - 0x6289, 0x9D50, 0x628A, 0x9463, 0x6291, 0x977D, 0x6292, 0x9D52, - 0x6293, 0x9D53, 0x6294, 0x9D57, 0x6295, 0x938A, 0x6296, 0x9D54, - 0x6297, 0x8D52, 0x6298, 0x90DC, 0x629B, 0x9D65, 0x629C, 0x94B2, - 0x629E, 0x91F0, 0x62A6, 0xFAC8, 0x62AB, 0x94E2, 0x62AC, 0x9DAB, - 0x62B1, 0x95F8, 0x62B5, 0x92EF, 0x62B9, 0x9695, 0x62BB, 0x9D5A, - 0x62BC, 0x899F, 0x62BD, 0x928A, 0x62C2, 0x9D63, 0x62C5, 0x9253, - 0x62C6, 0x9D5D, 0x62C7, 0x9D64, 0x62C8, 0x9D5F, 0x62C9, 0x9D66, - 0x62CA, 0x9D62, 0x62CC, 0x9D61, 0x62CD, 0x948F, 0x62CF, 0x9D5B, - 0x62D0, 0x89FB, 0x62D1, 0x9D59, 0x62D2, 0x8B91, 0x62D3, 0x91F1, - 0x62D4, 0x9D55, 0x62D7, 0x9D58, 0x62D8, 0x8D53, 0x62D9, 0x90D9, - 0x62DB, 0x8FB5, 0x62DC, 0x9D60, 0x62DD, 0x9471, 0x62E0, 0x8B92, - 0x62E1, 0x8A67, 0x62EC, 0x8A87, 0x62ED, 0x9040, 0x62EE, 0x9D68, - 0x62EF, 0x9D6D, 0x62F1, 0x9D69, 0x62F3, 0x8C9D, 0x62F5, 0x9D6E, - 0x62F6, 0x8E41, 0x62F7, 0x8D89, 0x62FE, 0x8F45, 0x62FF, 0x9D5C, - 0x6301, 0x8E9D, 0x6302, 0x9D6B, 0x6307, 0x8E77, 0x6308, 0x9D6C, - 0x6309, 0x88C2, 0x630C, 0x9D67, 0x6311, 0x92A7, 0x6319, 0x8B93, - 0x631F, 0x8BB2, 0x6327, 0x9D6A, 0x6328, 0x88A5, 0x632B, 0x8DC1, - 0x632F, 0x9055, 0x633A, 0x92F0, 0x633D, 0x94D2, 0x633E, 0x9D70, - 0x633F, 0x917D, 0x6349, 0x91A8, 0x634C, 0x8E4A, 0x634D, 0x9D71, - 0x634F, 0x9D73, 0x6350, 0x9D6F, 0x6355, 0x95DF, 0x6357, 0x92BB, - 0x635C, 0x917B, 0x6367, 0x95F9, 0x6368, 0x8ECC, 0x6369, 0x9D80, - 0x636B, 0x9D7E, 0x636E, 0x9098, 0x6372, 0x8C9E, 0x6376, 0x9D78, - 0x6377, 0x8FB7, 0x637A, 0x93E6, 0x637B, 0x9450, 0x6380, 0x9D76, - 0x6383, 0x917C, 0x6388, 0x8EF6, 0x6389, 0x9D7B, 0x638C, 0x8FB6, - 0x638E, 0x9D75, 0x638F, 0x9D7A, 0x6392, 0x9472, 0x6396, 0x9D74, - 0x6398, 0x8C40, 0x639B, 0x8A7C, 0x639F, 0x9D7C, 0x63A0, 0x97A9, - 0x63A1, 0x8DCC, 0x63A2, 0x9254, 0x63A3, 0x9D79, 0x63A5, 0x90DA, - 0x63A7, 0x8D54, 0x63A8, 0x9084, 0x63A9, 0x8986, 0x63AA, 0x915B, - 0x63AB, 0x9D77, 0x63AC, 0x8B64, 0x63B2, 0x8C66, 0x63B4, 0x92CD, - 0x63B5, 0x9D7D, 0x63BB, 0x917E, 0x63BE, 0x9D81, 0x63C0, 0x9D83, - 0x63C3, 0x91B5, 0x63C4, 0x9D89, 0x63C6, 0x9D84, 0x63C9, 0x9D86, - 0x63CF, 0x9560, 0x63D0, 0x92F1, 0x63D2, 0x9D87, 0x63D6, 0x974B, - 0x63DA, 0x9767, 0x63DB, 0x8AB7, 0x63E1, 0x88AC, 0x63E3, 0x9D85, - 0x63E9, 0x9D82, 0x63EE, 0x8AF6, 0x63F4, 0x8987, 0x63F5, 0xFAC9, - 0x63F6, 0x9D88, 0x63FA, 0x9768, 0x6406, 0x9D8C, 0x640D, 0x91B9, - 0x640F, 0x9D93, 0x6413, 0x9D8D, 0x6416, 0x9D8A, 0x6417, 0x9D91, - 0x641C, 0x9D72, 0x6426, 0x9D8E, 0x6428, 0x9D92, 0x642C, 0x94C0, - 0x642D, 0x938B, 0x6434, 0x9D8B, 0x6436, 0x9D8F, 0x643A, 0x8C67, - 0x643E, 0x8DEF, 0x6442, 0x90DB, 0x644E, 0x9D97, 0x6458, 0x9345, - 0x6460, 0xFACA, 0x6467, 0x9D94, 0x6469, 0x9680, 0x646F, 0x9D95, - 0x6476, 0x9D96, 0x6478, 0x96CC, 0x647A, 0x90A0, 0x6483, 0x8C82, - 0x6488, 0x9D9D, 0x6492, 0x8E54, 0x6493, 0x9D9A, 0x6495, 0x9D99, - 0x649A, 0x9451, 0x649D, 0xFACB, 0x649E, 0x93B3, 0x64A4, 0x9350, - 0x64A5, 0x9D9B, 0x64A9, 0x9D9C, 0x64AB, 0x958F, 0x64AD, 0x9464, - 0x64AE, 0x8E42, 0x64B0, 0x90EF, 0x64B2, 0x966F, 0x64B9, 0x8A68, - 0x64BB, 0x9DA3, 0x64BC, 0x9D9E, 0x64C1, 0x9769, 0x64C2, 0x9DA5, - 0x64C5, 0x9DA1, 0x64C7, 0x9DA2, 0x64CD, 0x9180, 0x64CE, 0xFACC, - 0x64D2, 0x9DA0, 0x64D4, 0x9D5E, 0x64D8, 0x9DA4, 0x64DA, 0x9D9F, - 0x64E0, 0x9DA9, 0x64E1, 0x9DAA, 0x64E2, 0x9346, 0x64E3, 0x9DAC, - 0x64E6, 0x8E43, 0x64E7, 0x9DA7, 0x64EC, 0x8B5B, 0x64EF, 0x9DAD, - 0x64F1, 0x9DA6, 0x64F2, 0x9DB1, 0x64F4, 0x9DB0, 0x64F6, 0x9DAF, - 0x64FA, 0x9DB2, 0x64FD, 0x9DB4, 0x64FE, 0x8FEF, 0x6500, 0x9DB3, - 0x6505, 0x9DB7, 0x6518, 0x9DB5, 0x651C, 0x9DB6, 0x651D, 0x9D90, - 0x6523, 0x9DB9, 0x6524, 0x9DB8, 0x652A, 0x9D98, 0x652B, 0x9DBA, - 0x652C, 0x9DAE, 0x652F, 0x8E78, 0x6534, 0x9DBB, 0x6535, 0x9DBC, - 0x6536, 0x9DBE, 0x6537, 0x9DBD, 0x6538, 0x9DBF, 0x6539, 0x89FC, - 0x653B, 0x8D55, 0x653E, 0x95FA, 0x653F, 0x90AD, 0x6545, 0x8CCC, - 0x6548, 0x9DC1, 0x654D, 0x9DC4, 0x654E, 0xFACD, 0x654F, 0x9571, - 0x6551, 0x8B7E, 0x6555, 0x9DC3, 0x6556, 0x9DC2, 0x6557, 0x9473, - 0x6558, 0x9DC5, 0x6559, 0x8BB3, 0x655D, 0x9DC7, 0x655E, 0x9DC6, - 0x6562, 0x8AB8, 0x6563, 0x8E55, 0x6566, 0x93D6, 0x656C, 0x8C68, - 0x6570, 0x9094, 0x6572, 0x9DC8, 0x6574, 0x90AE, 0x6575, 0x9347, - 0x6577, 0x957E, 0x6578, 0x9DC9, 0x6582, 0x9DCA, 0x6583, 0x9DCB, - 0x6587, 0x95B6, 0x6588, 0x9B7C, 0x6589, 0x90C4, 0x658C, 0x956B, - 0x658E, 0x8DD6, 0x6590, 0x94E3, 0x6591, 0x94C1, 0x6597, 0x936C, - 0x6599, 0x97BF, 0x659B, 0x9DCD, 0x659C, 0x8ECE, 0x659F, 0x9DCE, - 0x65A1, 0x88B4, 0x65A4, 0x8BD2, 0x65A5, 0x90CB, 0x65A7, 0x9580, - 0x65AB, 0x9DCF, 0x65AC, 0x8E61, 0x65AD, 0x9266, 0x65AF, 0x8E7A, - 0x65B0, 0x9056, 0x65B7, 0x9DD0, 0x65B9, 0x95FB, 0x65BC, 0x8997, - 0x65BD, 0x8E7B, 0x65C1, 0x9DD3, 0x65C3, 0x9DD1, 0x65C4, 0x9DD4, - 0x65C5, 0x97B7, 0x65C6, 0x9DD2, 0x65CB, 0x90F9, 0x65CC, 0x9DD5, - 0x65CF, 0x91B0, 0x65D2, 0x9DD6, 0x65D7, 0x8AF8, 0x65D9, 0x9DD8, - 0x65DB, 0x9DD7, 0x65E0, 0x9DD9, 0x65E1, 0x9DDA, 0x65E2, 0x8AF9, - 0x65E5, 0x93FA, 0x65E6, 0x9255, 0x65E7, 0x8B8C, 0x65E8, 0x8E7C, - 0x65E9, 0x9181, 0x65EC, 0x8F7B, 0x65ED, 0x88AE, 0x65F1, 0x9DDB, - 0x65FA, 0x89A0, 0x65FB, 0x9DDF, 0x6600, 0xFACE, 0x6602, 0x8D56, - 0x6603, 0x9DDE, 0x6606, 0x8DA9, 0x6607, 0x8FB8, 0x6609, 0xFAD1, - 0x660A, 0x9DDD, 0x660C, 0x8FB9, 0x660E, 0x96BE, 0x660F, 0x8DA8, - 0x6613, 0x88D5, 0x6614, 0x90CC, 0x6615, 0xFACF, 0x661C, 0x9DE4, - 0x661E, 0xFAD3, 0x661F, 0x90AF, 0x6620, 0x8966, 0x6624, 0xFAD4, - 0x6625, 0x8F74, 0x6627, 0x9686, 0x6628, 0x8DF0, 0x662D, 0x8FBA, - 0x662E, 0xFAD2, 0x662F, 0x90A5, 0x6631, 0xFA63, 0x6634, 0x9DE3, - 0x6635, 0x9DE1, 0x6636, 0x9DE2, 0x663B, 0xFAD0, 0x663C, 0x928B, - 0x663F, 0x9E45, 0x6641, 0x9DE8, 0x6642, 0x8E9E, 0x6643, 0x8D57, - 0x6644, 0x9DE6, 0x6649, 0x9DE7, 0x664B, 0x9057, 0x664F, 0x9DE5, - 0x6652, 0x8E4E, 0x6657, 0xFAD6, 0x6659, 0xFAD7, 0x665D, 0x9DEA, - 0x665E, 0x9DE9, 0x665F, 0x9DEE, 0x6662, 0x9DEF, 0x6664, 0x9DEB, - 0x6665, 0xFAD5, 0x6666, 0x8A41, 0x6667, 0x9DEC, 0x6668, 0x9DED, - 0x6669, 0x94D3, 0x666E, 0x9581, 0x666F, 0x8C69, 0x6670, 0x9DF0, - 0x6673, 0xFAD9, 0x6674, 0x90B0, 0x6676, 0x8FBB, 0x667A, 0x9271, - 0x6681, 0x8BC5, 0x6683, 0x9DF1, 0x6684, 0x9DF5, 0x6687, 0x89C9, - 0x6688, 0x9DF2, 0x6689, 0x9DF4, 0x668E, 0x9DF3, 0x6691, 0x8F8B, - 0x6696, 0x9267, 0x6697, 0x88C3, 0x6698, 0x9DF6, 0x6699, 0xFADA, - 0x669D, 0x9DF7, 0x66A0, 0xFADB, 0x66A2, 0x92A8, 0x66A6, 0x97EF, - 0x66AB, 0x8E62, 0x66AE, 0x95E9, 0x66B2, 0xFADC, 0x66B4, 0x965C, - 0x66B8, 0x9E41, 0x66B9, 0x9DF9, 0x66BC, 0x9DFC, 0x66BE, 0x9DFB, - 0x66BF, 0xFADD, 0x66C1, 0x9DF8, 0x66C4, 0x9E40, 0x66C7, 0x93DC, - 0x66C9, 0x9DFA, 0x66D6, 0x9E42, 0x66D9, 0x8F8C, 0x66DA, 0x9E43, - 0x66DC, 0x976A, 0x66DD, 0x9498, 0x66E0, 0x9E44, 0x66E6, 0x9E46, - 0x66E9, 0x9E47, 0x66F0, 0x9E48, 0x66F2, 0x8BC8, 0x66F3, 0x8967, - 0x66F4, 0x8D58, 0x66F5, 0x9E49, 0x66F7, 0x9E4A, 0x66F8, 0x8F91, - 0x66F9, 0x9182, 0x66FA, 0xFADE, 0x66FB, 0xFA66, 0x66FC, 0x99D6, - 0x66FD, 0x915D, 0x66FE, 0x915C, 0x66FF, 0x91D6, 0x6700, 0x8DC5, - 0x6703, 0x98F0, 0x6708, 0x8C8E, 0x6709, 0x974C, 0x670B, 0x95FC, - 0x670D, 0x959E, 0x670E, 0xFADF, 0x670F, 0x9E4B, 0x6714, 0x8DF1, - 0x6715, 0x92BD, 0x6716, 0x9E4C, 0x6717, 0x984E, 0x671B, 0x965D, - 0x671D, 0x92A9, 0x671E, 0x9E4D, 0x671F, 0x8AFA, 0x6726, 0x9E4E, - 0x6727, 0x9E4F, 0x6728, 0x96D8, 0x672A, 0x96A2, 0x672B, 0x9696, - 0x672C, 0x967B, 0x672D, 0x8E44, 0x672E, 0x9E51, 0x6731, 0x8EE9, - 0x6734, 0x9670, 0x6736, 0x9E53, 0x6737, 0x9E56, 0x6738, 0x9E55, - 0x673A, 0x8AF7, 0x673D, 0x8B80, 0x673F, 0x9E52, 0x6741, 0x9E54, - 0x6746, 0x9E57, 0x6749, 0x9099, 0x674E, 0x979B, 0x674F, 0x88C7, - 0x6750, 0x8DDE, 0x6751, 0x91BA, 0x6753, 0x8EDB, 0x6756, 0x8FF1, - 0x6759, 0x9E5A, 0x675C, 0x936D, 0x675E, 0x9E58, 0x675F, 0x91A9, - 0x6760, 0x9E59, 0x6761, 0x8FF0, 0x6762, 0x96DB, 0x6763, 0x9E5B, - 0x6764, 0x9E5C, 0x6765, 0x9788, 0x6766, 0xFAE1, 0x676A, 0x9E61, - 0x676D, 0x8D59, 0x676F, 0x9474, 0x6770, 0x9E5E, 0x6771, 0x938C, - 0x6772, 0x9DDC, 0x6773, 0x9DE0, 0x6775, 0x8B6E, 0x6777, 0x9466, - 0x677C, 0x9E60, 0x677E, 0x8FBC, 0x677F, 0x94C2, 0x6785, 0x9E66, - 0x6787, 0x94F8, 0x6789, 0x9E5D, 0x678B, 0x9E63, 0x678C, 0x9E62, - 0x6790, 0x90CD, 0x6795, 0x968D, 0x6797, 0x97D1, 0x679A, 0x9687, - 0x679C, 0x89CA, 0x679D, 0x8E7D, 0x67A0, 0x9867, 0x67A1, 0x9E65, - 0x67A2, 0x9095, 0x67A6, 0x9E64, 0x67A9, 0x9E5F, 0x67AF, 0x8CCD, - 0x67B3, 0x9E6B, 0x67B4, 0x9E69, 0x67B6, 0x89CB, 0x67B7, 0x9E67, - 0x67B8, 0x9E6D, 0x67B9, 0x9E73, 0x67BB, 0xFAE2, 0x67C0, 0xFAE4, - 0x67C1, 0x91C6, 0x67C4, 0x95BF, 0x67C6, 0x9E75, 0x67CA, 0x9541, - 0x67CE, 0x9E74, 0x67CF, 0x9490, 0x67D0, 0x965E, 0x67D1, 0x8AB9, - 0x67D3, 0x90F5, 0x67D4, 0x8F5F, 0x67D8, 0x92D1, 0x67DA, 0x974D, - 0x67DD, 0x9E70, 0x67DE, 0x9E6F, 0x67E2, 0x9E71, 0x67E4, 0x9E6E, - 0x67E7, 0x9E76, 0x67E9, 0x9E6C, 0x67EC, 0x9E6A, 0x67EE, 0x9E72, - 0x67EF, 0x9E68, 0x67F1, 0x928C, 0x67F3, 0x96F6, 0x67F4, 0x8EC4, - 0x67F5, 0x8DF2, 0x67FB, 0x8DB8, 0x67FE, 0x968F, 0x67FF, 0x8A60, - 0x6801, 0xFAE5, 0x6802, 0x92CC, 0x6803, 0x93C8, 0x6804, 0x8968, - 0x6813, 0x90F0, 0x6816, 0x90B2, 0x6817, 0x8C49, 0x681E, 0x9E78, - 0x6821, 0x8D5A, 0x6822, 0x8A9C, 0x6829, 0x9E7A, 0x682A, 0x8A94, - 0x682B, 0x9E81, 0x6832, 0x9E7D, 0x6834, 0x90F1, 0x6838, 0x8A6A, - 0x6839, 0x8DAA, 0x683C, 0x8A69, 0x683D, 0x8DCD, 0x6840, 0x9E7B, - 0x6841, 0x8C85, 0x6842, 0x8C6A, 0x6843, 0x938D, 0x6844, 0xFAE6, - 0x6846, 0x9E79, 0x6848, 0x88C4, 0x684D, 0x9E7C, 0x684E, 0x9E7E, - 0x6850, 0x8BCB, 0x6851, 0x8C4B, 0x6852, 0xFAE3, 0x6853, 0x8ABA, - 0x6854, 0x8B6A, 0x6859, 0x9E82, 0x685C, 0x8DF7, 0x685D, 0x9691, - 0x685F, 0x8E56, 0x6863, 0x9E83, 0x6867, 0x954F, 0x6874, 0x9E8F, - 0x6876, 0x89B1, 0x6877, 0x9E84, 0x687E, 0x9E95, 0x687F, 0x9E85, - 0x6881, 0x97C0, 0x6883, 0x9E8C, 0x6885, 0x947E, 0x688D, 0x9E94, - 0x688F, 0x9E87, 0x6893, 0x88B2, 0x6894, 0x9E89, 0x6897, 0x8D5B, - 0x689B, 0x9E8B, 0x689D, 0x9E8A, 0x689F, 0x9E86, 0x68A0, 0x9E91, - 0x68A2, 0x8FBD, 0x68A6, 0x9AEB, 0x68A7, 0x8CE6, 0x68A8, 0x979C, - 0x68AD, 0x9E88, 0x68AF, 0x92F2, 0x68B0, 0x8A42, 0x68B1, 0x8DAB, - 0x68B3, 0x9E80, 0x68B5, 0x9E90, 0x68B6, 0x8A81, 0x68B9, 0x9E8E, - 0x68BA, 0x9E92, 0x68BC, 0x938E, 0x68C4, 0x8AFC, 0x68C6, 0x9EB0, - 0x68C8, 0xFA64, 0x68C9, 0x96C7, 0x68CA, 0x9E97, 0x68CB, 0x8AFB, - 0x68CD, 0x9E9E, 0x68CF, 0xFAE7, 0x68D2, 0x965F, 0x68D4, 0x9E9F, - 0x68D5, 0x9EA1, 0x68D7, 0x9EA5, 0x68D8, 0x9E99, 0x68DA, 0x9249, - 0x68DF, 0x938F, 0x68E0, 0x9EA9, 0x68E1, 0x9E9C, 0x68E3, 0x9EA6, - 0x68E7, 0x9EA0, 0x68EE, 0x9058, 0x68EF, 0x9EAA, 0x68F2, 0x90B1, - 0x68F9, 0x9EA8, 0x68FA, 0x8ABB, 0x6900, 0x986F, 0x6901, 0x9E96, - 0x6904, 0x9EA4, 0x6905, 0x88D6, 0x6908, 0x9E98, 0x690B, 0x96B8, - 0x690C, 0x9E9D, 0x690D, 0x9041, 0x690E, 0x92C5, 0x690F, 0x9E93, - 0x6912, 0x9EA3, 0x6919, 0x909A, 0x691A, 0x9EAD, 0x691B, 0x8A91, - 0x691C, 0x8C9F, 0x6921, 0x9EAF, 0x6922, 0x9E9A, 0x6923, 0x9EAE, - 0x6925, 0x9EA7, 0x6926, 0x9E9B, 0x6928, 0x9EAB, 0x692A, 0x9EAC, - 0x6930, 0x9EBD, 0x6934, 0x93CC, 0x6936, 0x9EA2, 0x6939, 0x9EB9, - 0x693D, 0x9EBB, 0x693F, 0x92D6, 0x694A, 0x976B, 0x6953, 0x9596, - 0x6954, 0x9EB6, 0x6955, 0x91C8, 0x6959, 0x9EBC, 0x695A, 0x915E, - 0x695C, 0x9EB3, 0x695D, 0x9EC0, 0x695E, 0x9EBF, 0x6960, 0x93ED, - 0x6961, 0x9EBE, 0x6962, 0x93E8, 0x6968, 0xFAE9, 0x696A, 0x9EC2, - 0x696B, 0x9EB5, 0x696D, 0x8BC6, 0x696E, 0x9EB8, 0x696F, 0x8F7C, - 0x6973, 0x9480, 0x6974, 0x9EBA, 0x6975, 0x8BC9, 0x6977, 0x9EB2, - 0x6978, 0x9EB4, 0x6979, 0x9EB1, 0x697C, 0x984F, 0x697D, 0x8A79, - 0x697E, 0x9EB7, 0x6981, 0x9EC1, 0x6982, 0x8A54, 0x698A, 0x8DE5, - 0x698E, 0x897C, 0x6991, 0x9ED2, 0x6994, 0x9850, 0x6995, 0x9ED5, - 0x6998, 0xFAEB, 0x699B, 0x9059, 0x699C, 0x9ED4, 0x69A0, 0x9ED3, - 0x69A7, 0x9ED0, 0x69AE, 0x9EC4, 0x69B1, 0x9EE1, 0x69B2, 0x9EC3, - 0x69B4, 0x9ED6, 0x69BB, 0x9ECE, 0x69BE, 0x9EC9, 0x69BF, 0x9EC6, - 0x69C1, 0x9EC7, 0x69C3, 0x9ECF, 0x69C7, 0xEAA0, 0x69CA, 0x9ECC, - 0x69CB, 0x8D5C, 0x69CC, 0x92C6, 0x69CD, 0x9184, 0x69CE, 0x9ECA, - 0x69D0, 0x9EC5, 0x69D3, 0x9EC8, 0x69D8, 0x976C, 0x69D9, 0x968A, - 0x69DD, 0x9ECD, 0x69DE, 0x9ED7, 0x69E2, 0xFAEC, 0x69E7, 0x9EDF, - 0x69E8, 0x9ED8, 0x69EB, 0x9EE5, 0x69ED, 0x9EE3, 0x69F2, 0x9EDE, - 0x69F9, 0x9EDD, 0x69FB, 0x92CE, 0x69FD, 0x9185, 0x69FF, 0x9EDB, - 0x6A02, 0x9ED9, 0x6A05, 0x9EE0, 0x6A0A, 0x9EE6, 0x6A0B, 0x94F3, - 0x6A0C, 0x9EEC, 0x6A12, 0x9EE7, 0x6A13, 0x9EEA, 0x6A14, 0x9EE4, - 0x6A17, 0x9294, 0x6A19, 0x9557, 0x6A1B, 0x9EDA, 0x6A1E, 0x9EE2, - 0x6A1F, 0x8FBE, 0x6A21, 0x96CD, 0x6A22, 0x9EF6, 0x6A23, 0x9EE9, - 0x6A29, 0x8CA0, 0x6A2A, 0x89A1, 0x6A2B, 0x8A7E, 0x6A2E, 0x9ED1, - 0x6A30, 0xFAED, 0x6A35, 0x8FBF, 0x6A36, 0x9EEE, 0x6A38, 0x9EF5, - 0x6A39, 0x8EF7, 0x6A3A, 0x8A92, 0x6A3D, 0x924D, 0x6A44, 0x9EEB, - 0x6A46, 0xFAEF, 0x6A47, 0x9EF0, 0x6A48, 0x9EF4, 0x6A4B, 0x8BB4, - 0x6A58, 0x8B6B, 0x6A59, 0x9EF2, 0x6A5F, 0x8B40, 0x6A61, 0x93C9, - 0x6A62, 0x9EF1, 0x6A66, 0x9EF3, 0x6A6B, 0xFAEE, 0x6A72, 0x9EED, - 0x6A73, 0xFAF0, 0x6A78, 0x9EEF, 0x6A7E, 0xFAF1, 0x6A7F, 0x8A80, - 0x6A80, 0x9268, 0x6A84, 0x9EFA, 0x6A8D, 0x9EF8, 0x6A8E, 0x8CE7, - 0x6A90, 0x9EF7, 0x6A97, 0x9F40, 0x6A9C, 0x9E77, 0x6AA0, 0x9EF9, - 0x6AA2, 0x9EFB, 0x6AA3, 0x9EFC, 0x6AAA, 0x9F4B, 0x6AAC, 0x9F47, - 0x6AAE, 0x9E8D, 0x6AB3, 0x9F46, 0x6AB8, 0x9F45, 0x6ABB, 0x9F42, - 0x6AC1, 0x9EE8, 0x6AC2, 0x9F44, 0x6AC3, 0x9F43, 0x6AD1, 0x9F49, - 0x6AD3, 0x9845, 0x6ADA, 0x9F4C, 0x6ADB, 0x8BF9, 0x6ADE, 0x9F48, - 0x6ADF, 0x9F4A, 0x6AE2, 0xFAF2, 0x6AE4, 0xFAF3, 0x6AE8, 0x94A5, - 0x6AEA, 0x9F4D, 0x6AFA, 0x9F51, 0x6AFB, 0x9F4E, 0x6B04, 0x9793, - 0x6B05, 0x9F4F, 0x6B0A, 0x9EDC, 0x6B12, 0x9F52, 0x6B16, 0x9F53, - 0x6B1D, 0x8954, 0x6B1F, 0x9F55, 0x6B20, 0x8C87, 0x6B21, 0x8E9F, - 0x6B23, 0x8BD3, 0x6B27, 0x89A2, 0x6B32, 0x977E, 0x6B37, 0x9F57, - 0x6B38, 0x9F56, 0x6B39, 0x9F59, 0x6B3A, 0x8B5C, 0x6B3D, 0x8BD4, - 0x6B3E, 0x8ABC, 0x6B43, 0x9F5C, 0x6B47, 0x9F5B, 0x6B49, 0x9F5D, - 0x6B4C, 0x89CC, 0x6B4E, 0x9256, 0x6B50, 0x9F5E, 0x6B53, 0x8ABD, - 0x6B54, 0x9F60, 0x6B59, 0x9F5F, 0x6B5B, 0x9F61, 0x6B5F, 0x9F62, - 0x6B61, 0x9F63, 0x6B62, 0x8E7E, 0x6B63, 0x90B3, 0x6B64, 0x8D9F, - 0x6B66, 0x9590, 0x6B69, 0x95E0, 0x6B6A, 0x9863, 0x6B6F, 0x8E95, - 0x6B73, 0x8DCE, 0x6B74, 0x97F0, 0x6B78, 0x9F64, 0x6B79, 0x9F65, - 0x6B7B, 0x8E80, 0x6B7F, 0x9F66, 0x6B80, 0x9F67, 0x6B83, 0x9F69, - 0x6B84, 0x9F68, 0x6B86, 0x9677, 0x6B89, 0x8F7D, 0x6B8A, 0x8EEA, - 0x6B8B, 0x8E63, 0x6B8D, 0x9F6A, 0x6B95, 0x9F6C, 0x6B96, 0x9042, - 0x6B98, 0x9F6B, 0x6B9E, 0x9F6D, 0x6BA4, 0x9F6E, 0x6BAA, 0x9F6F, - 0x6BAB, 0x9F70, 0x6BAF, 0x9F71, 0x6BB1, 0x9F73, 0x6BB2, 0x9F72, - 0x6BB3, 0x9F74, 0x6BB4, 0x89A3, 0x6BB5, 0x9269, 0x6BB7, 0x9F75, - 0x6BBA, 0x8E45, 0x6BBB, 0x8A6B, 0x6BBC, 0x9F76, 0x6BBF, 0x9361, - 0x6BC0, 0x9ACA, 0x6BC5, 0x8B42, 0x6BC6, 0x9F77, 0x6BCB, 0x9F78, - 0x6BCD, 0x95EA, 0x6BCE, 0x9688, 0x6BD2, 0x93C5, 0x6BD3, 0x9F79, - 0x6BD4, 0x94E4, 0x6BD6, 0xFAF4, 0x6BD8, 0x94F9, 0x6BDB, 0x96D1, - 0x6BDF, 0x9F7A, 0x6BEB, 0x9F7C, 0x6BEC, 0x9F7B, 0x6BEF, 0x9F7E, - 0x6BF3, 0x9F7D, 0x6C08, 0x9F81, 0x6C0F, 0x8E81, 0x6C11, 0x96AF, - 0x6C13, 0x9F82, 0x6C14, 0x9F83, 0x6C17, 0x8B43, 0x6C1B, 0x9F84, - 0x6C23, 0x9F86, 0x6C24, 0x9F85, 0x6C34, 0x9085, 0x6C37, 0x9558, - 0x6C38, 0x8969, 0x6C3E, 0x94C3, 0x6C3F, 0xFAF5, 0x6C40, 0x92F3, - 0x6C41, 0x8F60, 0x6C42, 0x8B81, 0x6C4E, 0x94C4, 0x6C50, 0x8EAC, - 0x6C55, 0x9F88, 0x6C57, 0x8ABE, 0x6C5A, 0x8998, 0x6C5C, 0xFAF6, - 0x6C5D, 0x93F0, 0x6C5E, 0x9F87, 0x6C5F, 0x8D5D, 0x6C60, 0x9272, - 0x6C62, 0x9F89, 0x6C68, 0x9F91, 0x6C6A, 0x9F8A, 0x6C6F, 0xFAF8, - 0x6C70, 0x91BF, 0x6C72, 0x8B82, 0x6C73, 0x9F92, 0x6C7A, 0x8C88, - 0x6C7D, 0x8B44, 0x6C7E, 0x9F90, 0x6C81, 0x9F8E, 0x6C82, 0x9F8B, - 0x6C83, 0x9780, 0x6C86, 0xFAF7, 0x6C88, 0x92BE, 0x6C8C, 0x93D7, - 0x6C8D, 0x9F8C, 0x6C90, 0x9F94, 0x6C92, 0x9F93, 0x6C93, 0x8C42, - 0x6C96, 0x89AB, 0x6C99, 0x8DB9, 0x6C9A, 0x9F8D, 0x6C9B, 0x9F8F, - 0x6CA1, 0x9676, 0x6CA2, 0x91F2, 0x6CAB, 0x9697, 0x6CAE, 0x9F9C, - 0x6CB1, 0x9F9D, 0x6CB3, 0x89CD, 0x6CB8, 0x95A6, 0x6CB9, 0x96FB, - 0x6CBA, 0x9F9F, 0x6CBB, 0x8EA1, 0x6CBC, 0x8FC0, 0x6CBD, 0x9F98, - 0x6CBE, 0x9F9E, 0x6CBF, 0x8988, 0x6CC1, 0x8BB5, 0x6CC4, 0x9F95, - 0x6CC5, 0x9F9A, 0x6CC9, 0x90F2, 0x6CCA, 0x9491, 0x6CCC, 0x94E5, - 0x6CD3, 0x9F97, 0x6CD5, 0x9640, 0x6CD7, 0x9F99, 0x6CD9, 0x9FA2, - 0x6CDA, 0xFAF9, 0x6CDB, 0x9FA0, 0x6CDD, 0x9F9B, 0x6CE1, 0x9641, - 0x6CE2, 0x9467, 0x6CE3, 0x8B83, 0x6CE5, 0x9344, 0x6CE8, 0x928D, - 0x6CEA, 0x9FA3, 0x6CEF, 0x9FA1, 0x6CF0, 0x91D7, 0x6CF1, 0x9F96, - 0x6CF3, 0x896A, 0x6D04, 0xFAFA, 0x6D0B, 0x976D, 0x6D0C, 0x9FAE, - 0x6D12, 0x9FAD, 0x6D17, 0x90F4, 0x6D19, 0x9FAA, 0x6D1B, 0x978C, - 0x6D1E, 0x93B4, 0x6D1F, 0x9FA4, 0x6D25, 0x92C3, 0x6D29, 0x896B, - 0x6D2A, 0x8D5E, 0x6D2B, 0x9FA7, 0x6D32, 0x8F46, 0x6D33, 0x9FAC, - 0x6D35, 0x9FAB, 0x6D36, 0x9FA6, 0x6D38, 0x9FA9, 0x6D3B, 0x8A88, - 0x6D3D, 0x9FA8, 0x6D3E, 0x9468, 0x6D41, 0x97AC, 0x6D44, 0x8FF2, - 0x6D45, 0x90F3, 0x6D59, 0x9FB4, 0x6D5A, 0x9FB2, 0x6D5C, 0x956C, - 0x6D63, 0x9FAF, 0x6D64, 0x9FB1, 0x6D66, 0x8959, 0x6D69, 0x8D5F, - 0x6D6A, 0x9851, 0x6D6C, 0x8A5C, 0x6D6E, 0x9582, 0x6D6F, 0xFAFC, - 0x6D74, 0x9781, 0x6D77, 0x8A43, 0x6D78, 0x905A, 0x6D79, 0x9FB3, - 0x6D85, 0x9FB8, 0x6D87, 0xFAFB, 0x6D88, 0x8FC1, 0x6D8C, 0x974F, - 0x6D8E, 0x9FB5, 0x6D93, 0x9FB0, 0x6D95, 0x9FB6, 0x6D96, 0xFB40, - 0x6D99, 0x97DC, 0x6D9B, 0x9393, 0x6D9C, 0x93C0, 0x6DAC, 0xFB41, - 0x6DAF, 0x8A55, 0x6DB2, 0x8974, 0x6DB5, 0x9FBC, 0x6DB8, 0x9FBF, - 0x6DBC, 0x97C1, 0x6DC0, 0x9784, 0x6DC5, 0x9FC6, 0x6DC6, 0x9FC0, - 0x6DC7, 0x9FBD, 0x6DCB, 0x97D2, 0x6DCC, 0x9FC3, 0x6DCF, 0xFB42, - 0x6DD1, 0x8F69, 0x6DD2, 0x9FC5, 0x6DD5, 0x9FCA, 0x6DD8, 0x9391, - 0x6DD9, 0x9FC8, 0x6DDE, 0x9FC2, 0x6DE1, 0x9257, 0x6DE4, 0x9FC9, - 0x6DE6, 0x9FBE, 0x6DE8, 0x9FC4, 0x6DEA, 0x9FCB, 0x6DEB, 0x88FA, - 0x6DEC, 0x9FC1, 0x6DEE, 0x9FCC, 0x6DF1, 0x905B, 0x6DF2, 0xFB44, - 0x6DF3, 0x8F7E, 0x6DF5, 0x95A3, 0x6DF7, 0x8DAC, 0x6DF8, 0xFB43, - 0x6DF9, 0x9FB9, 0x6DFA, 0x9FC7, 0x6DFB, 0x9359, 0x6DFC, 0xFB45, - 0x6E05, 0x90B4, 0x6E07, 0x8A89, 0x6E08, 0x8DCF, 0x6E09, 0x8FC2, - 0x6E0A, 0x9FBB, 0x6E0B, 0x8F61, 0x6E13, 0x8C6B, 0x6E15, 0x9FBA, - 0x6E19, 0x9FD0, 0x6E1A, 0x8F8D, 0x6E1B, 0x8CB8, 0x6E1D, 0x9FDF, - 0x6E1F, 0x9FD9, 0x6E20, 0x8B94, 0x6E21, 0x936E, 0x6E23, 0x9FD4, - 0x6E24, 0x9FDD, 0x6E25, 0x88AD, 0x6E26, 0x8951, 0x6E27, 0xFB48, - 0x6E29, 0x89B7, 0x6E2B, 0x9FD6, 0x6E2C, 0x91AA, 0x6E2D, 0x9FCD, - 0x6E2E, 0x9FCF, 0x6E2F, 0x8D60, 0x6E38, 0x9FE0, 0x6E39, 0xFB46, - 0x6E3A, 0x9FDB, 0x6E3C, 0xFB49, 0x6E3E, 0x9FD3, 0x6E43, 0x9FDA, - 0x6E4A, 0x96A9, 0x6E4D, 0x9FD8, 0x6E4E, 0x9FDC, 0x6E56, 0x8CCE, - 0x6E58, 0x8FC3, 0x6E5B, 0x9258, 0x6E5C, 0xFB47, 0x6E5F, 0x9FD2, - 0x6E67, 0x974E, 0x6E6B, 0x9FD5, 0x6E6E, 0x9FCE, 0x6E6F, 0x9392, - 0x6E72, 0x9FD1, 0x6E76, 0x9FD7, 0x6E7E, 0x9870, 0x6E7F, 0x8EBC, - 0x6E80, 0x969E, 0x6E82, 0x9FE1, 0x6E8C, 0x94AC, 0x6E8F, 0x9FED, - 0x6E90, 0x8CB9, 0x6E96, 0x8F80, 0x6E98, 0x9FE3, 0x6E9C, 0x97AD, - 0x6E9D, 0x8D61, 0x6E9F, 0x9FF0, 0x6EA2, 0x88EC, 0x6EA5, 0x9FEE, - 0x6EAA, 0x9FE2, 0x6EAF, 0x9FE8, 0x6EB2, 0x9FEA, 0x6EB6, 0x976E, - 0x6EB7, 0x9FE5, 0x6EBA, 0x934D, 0x6EBD, 0x9FE7, 0x6EBF, 0xFB4A, - 0x6EC2, 0x9FEF, 0x6EC4, 0x9FE9, 0x6EC5, 0x96C5, 0x6EC9, 0x9FE4, - 0x6ECB, 0x8EA0, 0x6ECC, 0x9FFC, 0x6ED1, 0x8A8A, 0x6ED3, 0x9FE6, - 0x6ED4, 0x9FEB, 0x6ED5, 0x9FEC, 0x6EDD, 0x91EA, 0x6EDE, 0x91D8, - 0x6EEC, 0x9FF4, 0x6EEF, 0x9FFA, 0x6EF2, 0x9FF8, 0x6EF4, 0x9348, - 0x6EF7, 0xE042, 0x6EF8, 0x9FF5, 0x6EFE, 0x9FF6, 0x6EFF, 0x9FDE, - 0x6F01, 0x8B99, 0x6F02, 0x9559, 0x6F06, 0x8EBD, 0x6F09, 0x8D97, - 0x6F0F, 0x9852, 0x6F11, 0x9FF2, 0x6F13, 0xE041, 0x6F14, 0x8989, - 0x6F15, 0x9186, 0x6F20, 0x9499, 0x6F22, 0x8ABF, 0x6F23, 0x97F8, - 0x6F2B, 0x969F, 0x6F2C, 0x92D0, 0x6F31, 0x9FF9, 0x6F32, 0x9FFB, - 0x6F38, 0x9151, 0x6F3E, 0xE040, 0x6F3F, 0x9FF7, 0x6F41, 0x9FF1, - 0x6F45, 0x8AC1, 0x6F54, 0x8C89, 0x6F58, 0xE04E, 0x6F5B, 0xE049, - 0x6F5C, 0x90F6, 0x6F5F, 0x8A83, 0x6F64, 0x8F81, 0x6F66, 0xE052, - 0x6F6D, 0xE04B, 0x6F6E, 0x92AA, 0x6F6F, 0xE048, 0x6F70, 0x92D7, - 0x6F74, 0xE06B, 0x6F78, 0xE045, 0x6F7A, 0xE044, 0x6F7C, 0xE04D, - 0x6F80, 0xE047, 0x6F81, 0xE046, 0x6F82, 0xE04C, 0x6F84, 0x909F, - 0x6F86, 0xE043, 0x6F88, 0xFB4B, 0x6F8E, 0xE04F, 0x6F91, 0xE050, - 0x6F97, 0x8AC0, 0x6FA1, 0xE055, 0x6FA3, 0xE054, 0x6FA4, 0xE056, - 0x6FAA, 0xE059, 0x6FB1, 0x9362, 0x6FB3, 0xE053, 0x6FB5, 0xFB4C, - 0x6FB9, 0xE057, 0x6FC0, 0x8C83, 0x6FC1, 0x91F7, 0x6FC2, 0xE051, - 0x6FC3, 0x945A, 0x6FC6, 0xE058, 0x6FD4, 0xE05D, 0x6FD5, 0xE05B, - 0x6FD8, 0xE05E, 0x6FDB, 0xE061, 0x6FDF, 0xE05A, 0x6FE0, 0x8D8A, - 0x6FE1, 0x9447, 0x6FE4, 0x9FB7, 0x6FEB, 0x9794, 0x6FEC, 0xE05C, - 0x6FEE, 0xE060, 0x6FEF, 0x91F3, 0x6FF1, 0xE05F, 0x6FF3, 0xE04A, - 0x6FF5, 0xFB4D, 0x6FF6, 0xE889, 0x6FFA, 0xE064, 0x6FFE, 0xE068, - 0x7001, 0xE066, 0x7005, 0xFB4E, 0x7007, 0xFB4F, 0x7009, 0xE062, - 0x700B, 0xE063, 0x700F, 0xE067, 0x7011, 0xE065, 0x7015, 0x956D, - 0x7018, 0xE06D, 0x701A, 0xE06A, 0x701B, 0xE069, 0x701D, 0xE06C, - 0x701E, 0x93D2, 0x701F, 0xE06E, 0x7026, 0x9295, 0x7027, 0x91EB, - 0x7028, 0xFB50, 0x702C, 0x90A3, 0x7030, 0xE06F, 0x7032, 0xE071, - 0x703E, 0xE070, 0x704C, 0x9FF3, 0x7051, 0xE072, 0x7058, 0x93E5, - 0x7063, 0xE073, 0x706B, 0x89CE, 0x706F, 0x9394, 0x7070, 0x8A44, - 0x7078, 0x8B84, 0x707C, 0x8EDC, 0x707D, 0x8DD0, 0x7085, 0xFB51, - 0x7089, 0x9846, 0x708A, 0x9086, 0x708E, 0x898A, 0x7092, 0xE075, - 0x7099, 0xE074, 0x70AB, 0xFB52, 0x70AC, 0xE078, 0x70AD, 0x9259, - 0x70AE, 0xE07B, 0x70AF, 0xE076, 0x70B3, 0xE07A, 0x70B8, 0xE079, - 0x70B9, 0x935F, 0x70BA, 0x88D7, 0x70BB, 0xFA62, 0x70C8, 0x97F3, - 0x70CB, 0xE07D, 0x70CF, 0x8947, 0x70D9, 0xE080, 0x70DD, 0xE07E, - 0x70DF, 0xE07C, 0x70F1, 0xE077, 0x70F9, 0x9642, 0x70FD, 0xE082, - 0x7104, 0xFB54, 0x7109, 0xE081, 0x710F, 0xFB53, 0x7114, 0x898B, - 0x7119, 0xE084, 0x711A, 0x95B0, 0x711C, 0xE083, 0x7121, 0x96B3, - 0x7126, 0x8FC5, 0x7136, 0x9152, 0x713C, 0x8FC4, 0x7146, 0xFB56, - 0x7147, 0xFB57, 0x7149, 0x97F9, 0x714C, 0xE08A, 0x714E, 0x90F7, - 0x7155, 0xE086, 0x7156, 0xE08B, 0x7159, 0x898C, 0x715C, 0xFB55, - 0x7162, 0xE089, 0x7164, 0x9481, 0x7165, 0xE085, 0x7166, 0xE088, - 0x7167, 0x8FC6, 0x7169, 0x94CF, 0x716C, 0xE08C, 0x716E, 0x8ECF, - 0x717D, 0x90F8, 0x7184, 0xE08F, 0x7188, 0xE087, 0x718A, 0x8C46, - 0x718F, 0xE08D, 0x7194, 0x976F, 0x7195, 0xE090, 0x7199, 0xEAA4, - 0x719F, 0x8F6E, 0x71A8, 0xE091, 0x71AC, 0xE092, 0x71B1, 0x944D, - 0x71B9, 0xE094, 0x71BE, 0xE095, 0x71C1, 0xFB59, 0x71C3, 0x9452, - 0x71C8, 0x9395, 0x71C9, 0xE097, 0x71CE, 0xE099, 0x71D0, 0x97D3, - 0x71D2, 0xE096, 0x71D4, 0xE098, 0x71D5, 0x898D, 0x71D7, 0xE093, - 0x71DF, 0x9A7A, 0x71E0, 0xE09A, 0x71E5, 0x9187, 0x71E6, 0x8E57, - 0x71E7, 0xE09C, 0x71EC, 0xE09B, 0x71ED, 0x9043, 0x71EE, 0x99D7, - 0x71F5, 0xE09D, 0x71F9, 0xE09F, 0x71FB, 0xE08E, 0x71FC, 0xE09E, - 0x71FE, 0xFB5A, 0x71FF, 0xE0A0, 0x7206, 0x949A, 0x720D, 0xE0A1, - 0x7210, 0xE0A2, 0x721B, 0xE0A3, 0x7228, 0xE0A4, 0x722A, 0x92DC, - 0x722C, 0xE0A6, 0x722D, 0xE0A5, 0x7230, 0xE0A7, 0x7232, 0xE0A8, - 0x7235, 0x8EDD, 0x7236, 0x9583, 0x723A, 0x96EA, 0x723B, 0xE0A9, - 0x723C, 0xE0AA, 0x723D, 0x9175, 0x723E, 0x8EA2, 0x723F, 0xE0AB, - 0x7240, 0xE0AC, 0x7246, 0xE0AD, 0x7247, 0x95D0, 0x7248, 0x94C5, - 0x724B, 0xE0AE, 0x724C, 0x9476, 0x7252, 0x92AB, 0x7258, 0xE0AF, - 0x7259, 0x89E5, 0x725B, 0x8B8D, 0x725D, 0x96C4, 0x725F, 0x96B4, - 0x7261, 0x89B2, 0x7262, 0x9853, 0x7267, 0x9671, 0x7269, 0x95A8, - 0x7272, 0x90B5, 0x7274, 0xE0B0, 0x7279, 0x93C1, 0x727D, 0x8CA1, - 0x727E, 0xE0B1, 0x7280, 0x8DD2, 0x7281, 0xE0B3, 0x7282, 0xE0B2, - 0x7287, 0xE0B4, 0x7292, 0xE0B5, 0x7296, 0xE0B6, 0x72A0, 0x8B5D, - 0x72A2, 0xE0B7, 0x72A7, 0xE0B8, 0x72AC, 0x8CA2, 0x72AF, 0x94C6, - 0x72B1, 0xFB5B, 0x72B2, 0xE0BA, 0x72B6, 0x8FF3, 0x72B9, 0xE0B9, - 0x72BE, 0xFB5C, 0x72C2, 0x8BB6, 0x72C3, 0xE0BB, 0x72C4, 0xE0BD, - 0x72C6, 0xE0BC, 0x72CE, 0xE0BE, 0x72D0, 0x8CCF, 0x72D2, 0xE0BF, - 0x72D7, 0x8BE7, 0x72D9, 0x915F, 0x72DB, 0x8D9D, 0x72E0, 0xE0C1, - 0x72E1, 0xE0C2, 0x72E2, 0xE0C0, 0x72E9, 0x8EEB, 0x72EC, 0x93C6, - 0x72ED, 0x8BB7, 0x72F7, 0xE0C4, 0x72F8, 0x924B, 0x72F9, 0xE0C3, - 0x72FC, 0x9854, 0x72FD, 0x9482, 0x730A, 0xE0C7, 0x7316, 0xE0C9, - 0x7317, 0xE0C6, 0x731B, 0x96D2, 0x731C, 0xE0C8, 0x731D, 0xE0CA, - 0x731F, 0x97C2, 0x7324, 0xFB5D, 0x7325, 0xE0CE, 0x7329, 0xE0CD, - 0x732A, 0x9296, 0x732B, 0x944C, 0x732E, 0x8CA3, 0x732F, 0xE0CC, - 0x7334, 0xE0CB, 0x7336, 0x9750, 0x7337, 0x9751, 0x733E, 0xE0CF, - 0x733F, 0x898E, 0x7344, 0x8D96, 0x7345, 0x8E82, 0x734E, 0xE0D0, - 0x734F, 0xE0D1, 0x7357, 0xE0D3, 0x7363, 0x8F62, 0x7368, 0xE0D5, - 0x736A, 0xE0D4, 0x7370, 0xE0D6, 0x7372, 0x8A6C, 0x7375, 0xE0D8, - 0x7377, 0xFB5F, 0x7378, 0xE0D7, 0x737A, 0xE0DA, 0x737B, 0xE0D9, - 0x7384, 0x8CBA, 0x7387, 0x97A6, 0x7389, 0x8BCA, 0x738B, 0x89A4, - 0x7396, 0x8BE8, 0x73A9, 0x8ADF, 0x73B2, 0x97E6, 0x73B3, 0xE0DC, - 0x73BB, 0xE0DE, 0x73BD, 0xFB60, 0x73C0, 0xE0DF, 0x73C2, 0x89CF, - 0x73C8, 0xE0DB, 0x73C9, 0xFB61, 0x73CA, 0x8E58, 0x73CD, 0x92BF, - 0x73CE, 0xE0DD, 0x73D2, 0xFB64, 0x73D6, 0xFB62, 0x73DE, 0xE0E2, - 0x73E0, 0x8EEC, 0x73E3, 0xFB63, 0x73E5, 0xE0E0, 0x73EA, 0x8C5D, - 0x73ED, 0x94C7, 0x73EE, 0xE0E1, 0x73F1, 0xE0FC, 0x73F5, 0xFB66, - 0x73F8, 0xE0E7, 0x73FE, 0x8CBB, 0x7403, 0x8B85, 0x7405, 0xE0E4, - 0x7406, 0x979D, 0x7407, 0xFB65, 0x7409, 0x97AE, 0x7422, 0x91F4, - 0x7425, 0xE0E6, 0x7426, 0xFB67, 0x7429, 0xFB69, 0x742A, 0xFB68, - 0x742E, 0xFB6A, 0x7432, 0xE0E8, 0x7433, 0x97D4, 0x7434, 0x8BD5, - 0x7435, 0x94FA, 0x7436, 0x9469, 0x743A, 0xE0E9, 0x743F, 0xE0EB, - 0x7441, 0xE0EE, 0x7455, 0xE0EA, 0x7459, 0xE0ED, 0x745A, 0x8CE8, - 0x745B, 0x896C, 0x745C, 0xE0EF, 0x745E, 0x9090, 0x745F, 0xE0EC, - 0x7460, 0x97DA, 0x7462, 0xFB6B, 0x7463, 0xE0F2, 0x7464, 0xEAA2, - 0x7469, 0xE0F0, 0x746A, 0xE0F3, 0x746F, 0xE0E5, 0x7470, 0xE0F1, - 0x7473, 0x8DBA, 0x7476, 0xE0F4, 0x747E, 0xE0F5, 0x7483, 0x979E, - 0x7489, 0xFB6C, 0x748B, 0xE0F6, 0x749E, 0xE0F7, 0x749F, 0xFB6D, - 0x74A2, 0xE0E3, 0x74A7, 0xE0F8, 0x74B0, 0x8AC2, 0x74BD, 0x8EA3, - 0x74CA, 0xE0F9, 0x74CF, 0xE0FA, 0x74D4, 0xE0FB, 0x74DC, 0x895A, - 0x74E0, 0xE140, 0x74E2, 0x955A, 0x74E3, 0xE141, 0x74E6, 0x8AA2, - 0x74E7, 0xE142, 0x74E9, 0xE143, 0x74EE, 0xE144, 0x74F0, 0xE146, - 0x74F1, 0xE147, 0x74F2, 0xE145, 0x74F6, 0x9572, 0x74F7, 0xE149, - 0x74F8, 0xE148, 0x7501, 0xFB6E, 0x7503, 0xE14B, 0x7504, 0xE14A, - 0x7505, 0xE14C, 0x750C, 0xE14D, 0x750D, 0xE14F, 0x750E, 0xE14E, - 0x7511, 0x8D99, 0x7513, 0xE151, 0x7515, 0xE150, 0x7518, 0x8AC3, - 0x751A, 0x9072, 0x751C, 0x935B, 0x751E, 0xE152, 0x751F, 0x90B6, - 0x7523, 0x8E59, 0x7525, 0x8999, 0x7526, 0xE153, 0x7528, 0x9770, - 0x752B, 0x95E1, 0x752C, 0xE154, 0x752F, 0xFAA8, 0x7530, 0x9363, - 0x7531, 0x9752, 0x7532, 0x8D62, 0x7533, 0x905C, 0x7537, 0x926A, - 0x7538, 0x99B2, 0x753A, 0x92AC, 0x753B, 0x89E6, 0x753C, 0xE155, - 0x7544, 0xE156, 0x7546, 0xE15B, 0x7549, 0xE159, 0x754A, 0xE158, - 0x754B, 0x9DC0, 0x754C, 0x8A45, 0x754D, 0xE157, 0x754F, 0x88D8, - 0x7551, 0x94A8, 0x7554, 0x94C8, 0x7559, 0x97AF, 0x755A, 0xE15C, - 0x755B, 0xE15A, 0x755C, 0x927B, 0x755D, 0x90A4, 0x7560, 0x94A9, - 0x7562, 0x954C, 0x7564, 0xE15E, 0x7565, 0x97AA, 0x7566, 0x8C6C, - 0x7567, 0xE15F, 0x7569, 0xE15D, 0x756A, 0x94D4, 0x756B, 0xE160, - 0x756D, 0xE161, 0x756F, 0xFB6F, 0x7570, 0x88D9, 0x7573, 0x8FF4, - 0x7574, 0xE166, 0x7576, 0xE163, 0x7577, 0x93EB, 0x7578, 0xE162, - 0x757F, 0x8B45, 0x7582, 0xE169, 0x7586, 0xE164, 0x7587, 0xE165, - 0x7589, 0xE168, 0x758A, 0xE167, 0x758B, 0x9544, 0x758E, 0x9161, - 0x758F, 0x9160, 0x7591, 0x8B5E, 0x7594, 0xE16A, 0x759A, 0xE16B, - 0x759D, 0xE16C, 0x75A3, 0xE16E, 0x75A5, 0xE16D, 0x75AB, 0x8975, - 0x75B1, 0xE176, 0x75B2, 0x94E6, 0x75B3, 0xE170, 0x75B5, 0xE172, - 0x75B8, 0xE174, 0x75B9, 0x905D, 0x75BC, 0xE175, 0x75BD, 0xE173, - 0x75BE, 0x8EBE, 0x75C2, 0xE16F, 0x75C3, 0xE171, 0x75C5, 0x9561, - 0x75C7, 0x8FC7, 0x75CA, 0xE178, 0x75CD, 0xE177, 0x75D2, 0xE179, - 0x75D4, 0x8EA4, 0x75D5, 0x8DAD, 0x75D8, 0x9397, 0x75D9, 0xE17A, - 0x75DB, 0x92C9, 0x75DE, 0xE17C, 0x75E2, 0x979F, 0x75E3, 0xE17B, - 0x75E9, 0x9189, 0x75F0, 0xE182, 0x75F2, 0xE184, 0x75F3, 0xE185, - 0x75F4, 0x9273, 0x75FA, 0xE183, 0x75FC, 0xE180, 0x75FE, 0xE17D, - 0x75FF, 0xE17E, 0x7601, 0xE181, 0x7609, 0xE188, 0x760B, 0xE186, - 0x760D, 0xE187, 0x761F, 0xE189, 0x7620, 0xE18B, 0x7621, 0xE18C, - 0x7622, 0xE18D, 0x7624, 0xE18E, 0x7627, 0xE18A, 0x7630, 0xE190, - 0x7634, 0xE18F, 0x763B, 0xE191, 0x7642, 0x97C3, 0x7646, 0xE194, - 0x7647, 0xE192, 0x7648, 0xE193, 0x764C, 0x8AE0, 0x7652, 0x96FC, - 0x7656, 0x95C8, 0x7658, 0xE196, 0x765C, 0xE195, 0x7661, 0xE197, - 0x7662, 0xE198, 0x7667, 0xE19C, 0x7668, 0xE199, 0x7669, 0xE19A, - 0x766A, 0xE19B, 0x766C, 0xE19D, 0x7670, 0xE19E, 0x7672, 0xE19F, - 0x7676, 0xE1A0, 0x7678, 0xE1A1, 0x767A, 0x94AD, 0x767B, 0x936F, - 0x767C, 0xE1A2, 0x767D, 0x9492, 0x767E, 0x9553, 0x7680, 0xE1A3, - 0x7682, 0xFB70, 0x7683, 0xE1A4, 0x7684, 0x9349, 0x7686, 0x8A46, - 0x7687, 0x8D63, 0x7688, 0xE1A5, 0x768B, 0xE1A6, 0x768E, 0xE1A7, - 0x7690, 0x8E48, 0x7693, 0xE1A9, 0x7696, 0xE1A8, 0x7699, 0xE1AA, - 0x769A, 0xE1AB, 0x769B, 0xFB73, 0x769C, 0xFB71, 0x769E, 0xFB72, - 0x76A6, 0xFB74, 0x76AE, 0x94E7, 0x76B0, 0xE1AC, 0x76B4, 0xE1AD, - 0x76B7, 0xEA89, 0x76B8, 0xE1AE, 0x76B9, 0xE1AF, 0x76BA, 0xE1B0, - 0x76BF, 0x8E4D, 0x76C2, 0xE1B1, 0x76C3, 0x9475, 0x76C6, 0x967E, - 0x76C8, 0x896D, 0x76CA, 0x8976, 0x76CD, 0xE1B2, 0x76D2, 0xE1B4, - 0x76D6, 0xE1B3, 0x76D7, 0x9390, 0x76DB, 0x90B7, 0x76DC, 0x9F58, - 0x76DE, 0xE1B5, 0x76DF, 0x96BF, 0x76E1, 0xE1B6, 0x76E3, 0x8AC4, - 0x76E4, 0x94D5, 0x76E5, 0xE1B7, 0x76E7, 0xE1B8, 0x76EA, 0xE1B9, - 0x76EE, 0x96DA, 0x76F2, 0x96D3, 0x76F4, 0x92BC, 0x76F8, 0x918A, - 0x76FB, 0xE1BB, 0x76FE, 0x8F82, 0x7701, 0x8FC8, 0x7704, 0xE1BE, - 0x7707, 0xE1BD, 0x7708, 0xE1BC, 0x7709, 0x94FB, 0x770B, 0x8AC5, - 0x770C, 0x8CA7, 0x771B, 0xE1C4, 0x771E, 0xE1C1, 0x771F, 0x905E, - 0x7720, 0x96B0, 0x7724, 0xE1C0, 0x7725, 0xE1C2, 0x7726, 0xE1C3, - 0x7729, 0xE1BF, 0x7737, 0xE1C5, 0x7738, 0xE1C6, 0x773A, 0x92AD, - 0x773C, 0x8AE1, 0x7740, 0x9285, 0x7746, 0xFB76, 0x7747, 0xE1C7, - 0x775A, 0xE1C8, 0x775B, 0xE1CB, 0x7761, 0x9087, 0x7763, 0x93C2, - 0x7765, 0xE1CC, 0x7766, 0x9672, 0x7768, 0xE1C9, 0x776B, 0xE1CA, - 0x7779, 0xE1CF, 0x777E, 0xE1CE, 0x777F, 0xE1CD, 0x778B, 0xE1D1, - 0x778E, 0xE1D0, 0x7791, 0xE1D2, 0x779E, 0xE1D4, 0x77A0, 0xE1D3, - 0x77A5, 0x95CB, 0x77AC, 0x8F75, 0x77AD, 0x97C4, 0x77B0, 0xE1D5, - 0x77B3, 0x93B5, 0x77B6, 0xE1D6, 0x77B9, 0xE1D7, 0x77BB, 0xE1DB, - 0x77BC, 0xE1D9, 0x77BD, 0xE1DA, 0x77BF, 0xE1D8, 0x77C7, 0xE1DC, - 0x77CD, 0xE1DD, 0x77D7, 0xE1DE, 0x77DA, 0xE1DF, 0x77DB, 0x96B5, - 0x77DC, 0xE1E0, 0x77E2, 0x96EE, 0x77E3, 0xE1E1, 0x77E5, 0x926D, - 0x77E7, 0x948A, 0x77E9, 0x8BE9, 0x77ED, 0x925A, 0x77EE, 0xE1E2, - 0x77EF, 0x8BB8, 0x77F3, 0x90CE, 0x77FC, 0xE1E3, 0x7802, 0x8DBB, - 0x780C, 0xE1E4, 0x7812, 0xE1E5, 0x7814, 0x8CA4, 0x7815, 0x8DD3, - 0x7820, 0xE1E7, 0x7821, 0xFB78, 0x7825, 0x9375, 0x7826, 0x8DD4, - 0x7827, 0x8B6D, 0x7832, 0x9643, 0x7834, 0x946A, 0x783A, 0x9376, - 0x783F, 0x8D7B, 0x7845, 0xE1E9, 0x784E, 0xFB79, 0x785D, 0x8FC9, - 0x7864, 0xFB7A, 0x786B, 0x97B0, 0x786C, 0x8D64, 0x786F, 0x8CA5, - 0x7872, 0x94A1, 0x7874, 0xE1EB, 0x787A, 0xFB7B, 0x787C, 0xE1ED, - 0x7881, 0x8CE9, 0x7886, 0xE1EC, 0x7887, 0x92F4, 0x788C, 0xE1EF, - 0x788D, 0x8A56, 0x788E, 0xE1EA, 0x7891, 0x94E8, 0x7893, 0x894F, - 0x7895, 0x8DEA, 0x7897, 0x9871, 0x789A, 0xE1EE, 0x78A3, 0xE1F0, - 0x78A7, 0x95C9, 0x78A9, 0x90D7, 0x78AA, 0xE1F2, 0x78AF, 0xE1F3, - 0x78B5, 0xE1F1, 0x78BA, 0x8A6D, 0x78BC, 0xE1F9, 0x78BE, 0xE1F8, - 0x78C1, 0x8EA5, 0x78C5, 0xE1FA, 0x78C6, 0xE1F5, 0x78CA, 0xE1FB, - 0x78CB, 0xE1F6, 0x78D0, 0x94D6, 0x78D1, 0xE1F4, 0x78D4, 0xE1F7, - 0x78DA, 0xE241, 0x78E7, 0xE240, 0x78E8, 0x9681, 0x78EC, 0xE1FC, - 0x78EF, 0x88E9, 0x78F4, 0xE243, 0x78FD, 0xE242, 0x7901, 0x8FCA, - 0x7907, 0xE244, 0x790E, 0x9162, 0x7911, 0xE246, 0x7912, 0xE245, - 0x7919, 0xE247, 0x7926, 0xE1E6, 0x792A, 0xE1E8, 0x792B, 0xE249, - 0x792C, 0xE248, 0x7930, 0xFB7C, 0x793A, 0x8EA6, 0x793C, 0x97E7, - 0x793E, 0x8ED0, 0x7940, 0xE24A, 0x7941, 0x8C56, 0x7947, 0x8B5F, - 0x7948, 0x8B46, 0x7949, 0x8E83, 0x7950, 0x9753, 0x7953, 0xE250, - 0x7955, 0xE24F, 0x7956, 0x9163, 0x7957, 0xE24C, 0x795A, 0xE24E, - 0x795D, 0x8F6A, 0x795E, 0x905F, 0x795F, 0xE24D, 0x7960, 0xE24B, - 0x7962, 0x9449, 0x7965, 0x8FCB, 0x7968, 0x955B, 0x796D, 0x8DD5, - 0x7977, 0x9398, 0x797A, 0xE251, 0x797F, 0xE252, 0x7980, 0xE268, - 0x7981, 0x8BD6, 0x7984, 0x985C, 0x7985, 0x9154, 0x798A, 0xE253, - 0x798D, 0x89D0, 0x798E, 0x92F5, 0x798F, 0x959F, 0x7994, 0xFB81, - 0x799B, 0xFB83, 0x799D, 0xE254, 0x79A6, 0x8B9A, 0x79A7, 0xE255, - 0x79AA, 0xE257, 0x79AE, 0xE258, 0x79B0, 0x9448, 0x79B3, 0xE259, - 0x79B9, 0xE25A, 0x79BA, 0xE25B, 0x79BD, 0x8BD7, 0x79BE, 0x89D1, - 0x79BF, 0x93C3, 0x79C0, 0x8F47, 0x79C1, 0x8E84, 0x79C9, 0xE25C, - 0x79CB, 0x8F48, 0x79D1, 0x89C8, 0x79D2, 0x9562, 0x79D5, 0xE25D, - 0x79D8, 0x94E9, 0x79DF, 0x9164, 0x79E1, 0xE260, 0x79E3, 0xE261, - 0x79E4, 0x9489, 0x79E6, 0x9060, 0x79E7, 0xE25E, 0x79E9, 0x9281, - 0x79EC, 0xE25F, 0x79F0, 0x8FCC, 0x79FB, 0x88DA, 0x7A00, 0x8B48, - 0x7A08, 0xE262, 0x7A0B, 0x92F6, 0x7A0D, 0xE263, 0x7A0E, 0x90C5, - 0x7A14, 0x96AB, 0x7A17, 0x9542, 0x7A18, 0xE264, 0x7A19, 0xE265, - 0x7A1A, 0x9274, 0x7A1C, 0x97C5, 0x7A1F, 0xE267, 0x7A20, 0xE266, - 0x7A2E, 0x8EED, 0x7A31, 0xE269, 0x7A32, 0x88EE, 0x7A37, 0xE26C, - 0x7A3B, 0xE26A, 0x7A3C, 0x89D2, 0x7A3D, 0x8C6D, 0x7A3E, 0xE26B, - 0x7A3F, 0x8D65, 0x7A40, 0x8D92, 0x7A42, 0x95E4, 0x7A43, 0xE26D, - 0x7A46, 0x9673, 0x7A49, 0xE26F, 0x7A4D, 0x90CF, 0x7A4E, 0x896E, - 0x7A4F, 0x89B8, 0x7A50, 0x88AA, 0x7A57, 0xE26E, 0x7A61, 0xE270, - 0x7A62, 0xE271, 0x7A63, 0x8FF5, 0x7A69, 0xE272, 0x7A6B, 0x8A6E, - 0x7A70, 0xE274, 0x7A74, 0x8C8A, 0x7A76, 0x8B86, 0x7A79, 0xE275, - 0x7A7A, 0x8BF3, 0x7A7D, 0xE276, 0x7A7F, 0x90FA, 0x7A81, 0x93CB, - 0x7A83, 0x90DE, 0x7A84, 0x8DF3, 0x7A88, 0xE277, 0x7A92, 0x9282, - 0x7A93, 0x918B, 0x7A95, 0xE279, 0x7A96, 0xE27B, 0x7A97, 0xE278, - 0x7A98, 0xE27A, 0x7A9F, 0x8C41, 0x7AA9, 0xE27C, 0x7AAA, 0x8C45, - 0x7AAE, 0x8B87, 0x7AAF, 0x9771, 0x7AB0, 0xE27E, 0x7AB6, 0xE280, - 0x7ABA, 0x894D, 0x7ABF, 0xE283, 0x7AC3, 0x8A96, 0x7AC4, 0xE282, - 0x7AC5, 0xE281, 0x7AC7, 0xE285, 0x7AC8, 0xE27D, 0x7ACA, 0xE286, - 0x7ACB, 0x97A7, 0x7ACD, 0xE287, 0x7ACF, 0xE288, 0x7AD1, 0xFB84, - 0x7AD2, 0x9AF2, 0x7AD3, 0xE28A, 0x7AD5, 0xE289, 0x7AD9, 0xE28B, - 0x7ADA, 0xE28C, 0x7ADC, 0x97B3, 0x7ADD, 0xE28D, 0x7ADF, 0xE8ED, - 0x7AE0, 0x8FCD, 0x7AE1, 0xE28E, 0x7AE2, 0xE28F, 0x7AE3, 0x8F76, - 0x7AE5, 0x93B6, 0x7AE6, 0xE290, 0x7AE7, 0xFB85, 0x7AEA, 0x9247, - 0x7AEB, 0xFB87, 0x7AED, 0xE291, 0x7AEF, 0x925B, 0x7AF0, 0xE292, - 0x7AF6, 0x8BA3, 0x7AF8, 0x995E, 0x7AF9, 0x927C, 0x7AFA, 0x8EB1, - 0x7AFF, 0x8AC6, 0x7B02, 0xE293, 0x7B04, 0xE2A0, 0x7B06, 0xE296, - 0x7B08, 0x8B88, 0x7B0A, 0xE295, 0x7B0B, 0xE2A2, 0x7B0F, 0xE294, - 0x7B11, 0x8FCE, 0x7B18, 0xE298, 0x7B19, 0xE299, 0x7B1B, 0x934A, - 0x7B1E, 0xE29A, 0x7B20, 0x8A7D, 0x7B25, 0x9079, 0x7B26, 0x9584, - 0x7B28, 0xE29C, 0x7B2C, 0x91E6, 0x7B33, 0xE297, 0x7B35, 0xE29B, - 0x7B36, 0xE29D, 0x7B39, 0x8DF9, 0x7B45, 0xE2A4, 0x7B46, 0x954D, - 0x7B48, 0x94A4, 0x7B49, 0x9399, 0x7B4B, 0x8BD8, 0x7B4C, 0xE2A3, - 0x7B4D, 0xE2A1, 0x7B4F, 0x94B3, 0x7B50, 0xE29E, 0x7B51, 0x927D, - 0x7B52, 0x939B, 0x7B54, 0x939A, 0x7B56, 0x8DF4, 0x7B5D, 0xE2B6, - 0x7B65, 0xE2A6, 0x7B67, 0xE2A8, 0x7B6C, 0xE2AB, 0x7B6E, 0xE2AC, - 0x7B70, 0xE2A9, 0x7B71, 0xE2AA, 0x7B74, 0xE2A7, 0x7B75, 0xE2A5, - 0x7B7A, 0xE29F, 0x7B86, 0x95CD, 0x7B87, 0x89D3, 0x7B8B, 0xE2B3, - 0x7B8D, 0xE2B0, 0x7B8F, 0xE2B5, 0x7B92, 0xE2B4, 0x7B94, 0x9493, - 0x7B95, 0x96A5, 0x7B97, 0x8E5A, 0x7B98, 0xE2AE, 0x7B99, 0xE2B7, - 0x7B9A, 0xE2B2, 0x7B9C, 0xE2B1, 0x7B9D, 0xE2AD, 0x7B9E, 0xFB88, - 0x7B9F, 0xE2AF, 0x7BA1, 0x8AC7, 0x7BAA, 0x925C, 0x7BAD, 0x90FB, - 0x7BB1, 0x94A0, 0x7BB4, 0xE2BC, 0x7BB8, 0x94A2, 0x7BC0, 0x90DF, - 0x7BC1, 0xE2B9, 0x7BC4, 0x94CD, 0x7BC6, 0xE2BD, 0x7BC7, 0x95D1, - 0x7BC9, 0x927A, 0x7BCB, 0xE2B8, 0x7BCC, 0xE2BA, 0x7BCF, 0xE2BB, - 0x7BDD, 0xE2BE, 0x7BE0, 0x8EC2, 0x7BE4, 0x93C4, 0x7BE5, 0xE2C3, - 0x7BE6, 0xE2C2, 0x7BE9, 0xE2BF, 0x7BED, 0x9855, 0x7BF3, 0xE2C8, - 0x7BF6, 0xE2CC, 0x7BF7, 0xE2C9, 0x7C00, 0xE2C5, 0x7C07, 0xE2C6, - 0x7C0D, 0xE2CB, 0x7C11, 0xE2C0, 0x7C12, 0x99D3, 0x7C13, 0xE2C7, - 0x7C14, 0xE2C1, 0x7C17, 0xE2CA, 0x7C1F, 0xE2D0, 0x7C21, 0x8AC8, - 0x7C23, 0xE2CD, 0x7C27, 0xE2CE, 0x7C2A, 0xE2CF, 0x7C2B, 0xE2D2, - 0x7C37, 0xE2D1, 0x7C38, 0x94F4, 0x7C3D, 0xE2D3, 0x7C3E, 0x97FA, - 0x7C3F, 0x95EB, 0x7C40, 0xE2D8, 0x7C43, 0xE2D5, 0x7C4C, 0xE2D4, - 0x7C4D, 0x90D0, 0x7C4F, 0xE2D7, 0x7C50, 0xE2D9, 0x7C54, 0xE2D6, - 0x7C56, 0xE2DD, 0x7C58, 0xE2DA, 0x7C5F, 0xE2DB, 0x7C60, 0xE2C4, - 0x7C64, 0xE2DC, 0x7C65, 0xE2DE, 0x7C6C, 0xE2DF, 0x7C73, 0x95C4, - 0x7C75, 0xE2E0, 0x7C7E, 0x96E0, 0x7C81, 0x8BCC, 0x7C82, 0x8C48, - 0x7C83, 0xE2E1, 0x7C89, 0x95B2, 0x7C8B, 0x9088, 0x7C8D, 0x96AE, - 0x7C90, 0xE2E2, 0x7C92, 0x97B1, 0x7C95, 0x9494, 0x7C97, 0x9165, - 0x7C98, 0x9453, 0x7C9B, 0x8F6C, 0x7C9F, 0x88BE, 0x7CA1, 0xE2E7, - 0x7CA2, 0xE2E5, 0x7CA4, 0xE2E3, 0x7CA5, 0x8A9F, 0x7CA7, 0x8FCF, - 0x7CA8, 0xE2E8, 0x7CAB, 0xE2E6, 0x7CAD, 0xE2E4, 0x7CAE, 0xE2EC, - 0x7CB1, 0xE2EB, 0x7CB2, 0xE2EA, 0x7CB3, 0xE2E9, 0x7CB9, 0xE2ED, - 0x7CBD, 0xE2EE, 0x7CBE, 0x90B8, 0x7CC0, 0xE2EF, 0x7CC2, 0xE2F1, - 0x7CC5, 0xE2F0, 0x7CCA, 0x8CD0, 0x7CCE, 0x9157, 0x7CD2, 0xE2F3, - 0x7CD6, 0x939C, 0x7CD8, 0xE2F2, 0x7CDC, 0xE2F4, 0x7CDE, 0x95B3, - 0x7CDF, 0x918C, 0x7CE0, 0x8D66, 0x7CE2, 0xE2F5, 0x7CE7, 0x97C6, - 0x7CEF, 0xE2F7, 0x7CF2, 0xE2F8, 0x7CF4, 0xE2F9, 0x7CF6, 0xE2FA, - 0x7CF8, 0x8E85, 0x7CFA, 0xE2FB, 0x7CFB, 0x8C6E, 0x7CFE, 0x8B8A, - 0x7D00, 0x8B49, 0x7D02, 0xE340, 0x7D04, 0x96F1, 0x7D05, 0x8D67, - 0x7D06, 0xE2FC, 0x7D0A, 0xE343, 0x7D0B, 0x96E4, 0x7D0D, 0x945B, - 0x7D10, 0x9552, 0x7D14, 0x8F83, 0x7D15, 0xE342, 0x7D17, 0x8ED1, - 0x7D18, 0x8D68, 0x7D19, 0x8E86, 0x7D1A, 0x8B89, 0x7D1B, 0x95B4, - 0x7D1C, 0xE341, 0x7D20, 0x9166, 0x7D21, 0x9661, 0x7D22, 0x8DF5, - 0x7D2B, 0x8E87, 0x7D2C, 0x92DB, 0x7D2E, 0xE346, 0x7D2F, 0x97DD, - 0x7D30, 0x8DD7, 0x7D32, 0xE347, 0x7D33, 0x9061, 0x7D35, 0xE349, - 0x7D39, 0x8FD0, 0x7D3A, 0x8DAE, 0x7D3F, 0xE348, 0x7D42, 0x8F49, - 0x7D43, 0x8CBC, 0x7D44, 0x9167, 0x7D45, 0xE344, 0x7D46, 0xE34A, - 0x7D48, 0xFB8A, 0x7D4B, 0xE345, 0x7D4C, 0x8C6F, 0x7D4E, 0xE34D, - 0x7D4F, 0xE351, 0x7D50, 0x8C8B, 0x7D56, 0xE34C, 0x7D5B, 0xE355, - 0x7D5C, 0xFB8B, 0x7D5E, 0x8D69, 0x7D61, 0x978D, 0x7D62, 0x88BA, - 0x7D63, 0xE352, 0x7D66, 0x8B8B, 0x7D68, 0xE34F, 0x7D6E, 0xE350, - 0x7D71, 0x939D, 0x7D72, 0xE34E, 0x7D73, 0xE34B, 0x7D75, 0x8A47, - 0x7D76, 0x90E2, 0x7D79, 0x8CA6, 0x7D7D, 0xE357, 0x7D89, 0xE354, - 0x7D8F, 0xE356, 0x7D93, 0xE353, 0x7D99, 0x8C70, 0x7D9A, 0x91B1, - 0x7D9B, 0xE358, 0x7D9C, 0x918E, 0x7D9F, 0xE365, 0x7DA0, 0xFB8D, - 0x7DA2, 0xE361, 0x7DA3, 0xE35B, 0x7DAB, 0xE35F, 0x7DAC, 0x8EF8, - 0x7DAD, 0x88DB, 0x7DAE, 0xE35A, 0x7DAF, 0xE362, 0x7DB0, 0xE366, - 0x7DB1, 0x8D6A, 0x7DB2, 0x96D4, 0x7DB4, 0x92D4, 0x7DB5, 0xE35C, - 0x7DB7, 0xFB8C, 0x7DB8, 0xE364, 0x7DBA, 0xE359, 0x7DBB, 0x925D, - 0x7DBD, 0xE35E, 0x7DBE, 0x88BB, 0x7DBF, 0x96C8, 0x7DC7, 0xE35D, - 0x7DCA, 0x8BD9, 0x7DCB, 0x94EA, 0x7DCF, 0x918D, 0x7DD1, 0x97CE, - 0x7DD2, 0x8F8F, 0x7DD5, 0xE38E, 0x7DD6, 0xFB8E, 0x7DD8, 0xE367, - 0x7DDA, 0x90FC, 0x7DDC, 0xE363, 0x7DDD, 0xE368, 0x7DDE, 0xE36A, - 0x7DE0, 0x92F7, 0x7DE1, 0xE36D, 0x7DE4, 0xE369, 0x7DE8, 0x95D2, - 0x7DE9, 0x8AC9, 0x7DEC, 0x96C9, 0x7DEF, 0x88DC, 0x7DF2, 0xE36C, - 0x7DF4, 0x97FB, 0x7DFB, 0xE36B, 0x7E01, 0x898F, 0x7E04, 0x93EA, - 0x7E05, 0xE36E, 0x7E09, 0xE375, 0x7E0A, 0xE36F, 0x7E0B, 0xE376, - 0x7E12, 0xE372, 0x7E1B, 0x949B, 0x7E1E, 0x8EC8, 0x7E1F, 0xE374, - 0x7E21, 0xE371, 0x7E22, 0xE377, 0x7E23, 0xE370, 0x7E26, 0x8F63, - 0x7E2B, 0x9644, 0x7E2E, 0x8F6B, 0x7E31, 0xE373, 0x7E32, 0xE380, - 0x7E35, 0xE37B, 0x7E37, 0xE37E, 0x7E39, 0xE37C, 0x7E3A, 0xE381, - 0x7E3B, 0xE37A, 0x7E3D, 0xE360, 0x7E3E, 0x90D1, 0x7E41, 0x94C9, - 0x7E43, 0xE37D, 0x7E46, 0xE378, 0x7E4A, 0x9140, 0x7E4B, 0x8C71, - 0x7E4D, 0x8F4A, 0x7E52, 0xFB8F, 0x7E54, 0x9044, 0x7E55, 0x9155, - 0x7E56, 0xE384, 0x7E59, 0xE386, 0x7E5A, 0xE387, 0x7E5D, 0xE383, - 0x7E5E, 0xE385, 0x7E66, 0xE379, 0x7E67, 0xE382, 0x7E69, 0xE38A, - 0x7E6A, 0xE389, 0x7E6D, 0x969A, 0x7E70, 0x8C4A, 0x7E79, 0xE388, - 0x7E7B, 0xE38C, 0x7E7C, 0xE38B, 0x7E7D, 0xE38F, 0x7E7F, 0xE391, - 0x7E82, 0x8E5B, 0x7E83, 0xE38D, 0x7E88, 0xE392, 0x7E89, 0xE393, - 0x7E8A, 0xFA5C, 0x7E8C, 0xE394, 0x7E8E, 0xE39A, 0x7E8F, 0x935A, - 0x7E90, 0xE396, 0x7E92, 0xE395, 0x7E93, 0xE397, 0x7E94, 0xE398, - 0x7E96, 0xE399, 0x7E9B, 0xE39B, 0x7E9C, 0xE39C, 0x7F36, 0x8ACA, - 0x7F38, 0xE39D, 0x7F3A, 0xE39E, 0x7F45, 0xE39F, 0x7F47, 0xFB90, - 0x7F4C, 0xE3A0, 0x7F4D, 0xE3A1, 0x7F4E, 0xE3A2, 0x7F50, 0xE3A3, - 0x7F51, 0xE3A4, 0x7F54, 0xE3A6, 0x7F55, 0xE3A5, 0x7F58, 0xE3A7, - 0x7F5F, 0xE3A8, 0x7F60, 0xE3A9, 0x7F67, 0xE3AC, 0x7F68, 0xE3AA, - 0x7F69, 0xE3AB, 0x7F6A, 0x8DDF, 0x7F6B, 0x8C72, 0x7F6E, 0x9275, - 0x7F70, 0x94B1, 0x7F72, 0x8F90, 0x7F75, 0x946C, 0x7F77, 0x94EB, - 0x7F78, 0xE3AD, 0x7F79, 0x9CEB, 0x7F82, 0xE3AE, 0x7F83, 0xE3B0, - 0x7F85, 0x9785, 0x7F86, 0xE3AF, 0x7F87, 0xE3B2, 0x7F88, 0xE3B1, - 0x7F8A, 0x9772, 0x7F8C, 0xE3B3, 0x7F8E, 0x94FC, 0x7F94, 0xE3B4, - 0x7F9A, 0xE3B7, 0x7F9D, 0xE3B6, 0x7F9E, 0xE3B5, 0x7FA1, 0xFB91, - 0x7FA3, 0xE3B8, 0x7FA4, 0x8C51, 0x7FA8, 0x9141, 0x7FA9, 0x8B60, - 0x7FAE, 0xE3BC, 0x7FAF, 0xE3B9, 0x7FB2, 0xE3BA, 0x7FB6, 0xE3BD, - 0x7FB8, 0xE3BE, 0x7FB9, 0xE3BB, 0x7FBD, 0x8948, 0x7FC1, 0x89A5, - 0x7FC5, 0xE3C0, 0x7FC6, 0xE3C1, 0x7FCA, 0xE3C2, 0x7FCC, 0x9782, - 0x7FD2, 0x8F4B, 0x7FD4, 0xE3C4, 0x7FD5, 0xE3C3, 0x7FE0, 0x9089, - 0x7FE1, 0xE3C5, 0x7FE6, 0xE3C6, 0x7FE9, 0xE3C7, 0x7FEB, 0x8AE3, - 0x7FF0, 0x8ACB, 0x7FF3, 0xE3C8, 0x7FF9, 0xE3C9, 0x7FFB, 0x967C, - 0x7FFC, 0x9783, 0x8000, 0x9773, 0x8001, 0x9856, 0x8003, 0x8D6C, - 0x8004, 0xE3CC, 0x8005, 0x8ED2, 0x8006, 0xE3CB, 0x800B, 0xE3CD, - 0x800C, 0x8EA7, 0x8010, 0x91CF, 0x8012, 0xE3CE, 0x8015, 0x8D6B, - 0x8017, 0x96D5, 0x8018, 0xE3CF, 0x8019, 0xE3D0, 0x801C, 0xE3D1, - 0x8021, 0xE3D2, 0x8028, 0xE3D3, 0x8033, 0x8EA8, 0x8036, 0x96EB, - 0x803B, 0xE3D5, 0x803D, 0x925E, 0x803F, 0xE3D4, 0x8046, 0xE3D7, - 0x804A, 0xE3D6, 0x8052, 0xE3D8, 0x8056, 0x90B9, 0x8058, 0xE3D9, - 0x805A, 0xE3DA, 0x805E, 0x95B7, 0x805F, 0xE3DB, 0x8061, 0x918F, - 0x8062, 0xE3DC, 0x8068, 0xE3DD, 0x806F, 0x97FC, 0x8070, 0xE3E0, - 0x8072, 0xE3DF, 0x8073, 0xE3DE, 0x8074, 0x92AE, 0x8076, 0xE3E1, - 0x8077, 0x9045, 0x8079, 0xE3E2, 0x807D, 0xE3E3, 0x807E, 0x9857, - 0x807F, 0xE3E4, 0x8084, 0xE3E5, 0x8085, 0xE3E7, 0x8086, 0xE3E6, - 0x8087, 0x94A3, 0x8089, 0x93F7, 0x808B, 0x985D, 0x808C, 0x94A7, - 0x8093, 0xE3E9, 0x8096, 0x8FD1, 0x8098, 0x9549, 0x809A, 0xE3EA, - 0x809B, 0xE3E8, 0x809D, 0x8ACC, 0x80A1, 0x8CD2, 0x80A2, 0x8E88, - 0x80A5, 0x94EC, 0x80A9, 0x8CA8, 0x80AA, 0x9662, 0x80AC, 0xE3ED, - 0x80AD, 0xE3EB, 0x80AF, 0x8D6D, 0x80B1, 0x8D6E, 0x80B2, 0x88E7, - 0x80B4, 0x8DE6, 0x80BA, 0x9478, 0x80C3, 0x88DD, 0x80C4, 0xE3F2, - 0x80C6, 0x925F, 0x80CC, 0x9477, 0x80CE, 0x91D9, 0x80D6, 0xE3F4, - 0x80D9, 0xE3F0, 0x80DA, 0xE3F3, 0x80DB, 0xE3EE, 0x80DD, 0xE3F1, - 0x80DE, 0x9645, 0x80E1, 0x8CD3, 0x80E4, 0x88FB, 0x80E5, 0xE3EF, - 0x80EF, 0xE3F6, 0x80F1, 0xE3F7, 0x80F4, 0x93B7, 0x80F8, 0x8BB9, - 0x80FC, 0xE445, 0x80FD, 0x945C, 0x8102, 0x8E89, 0x8105, 0x8BBA, - 0x8106, 0x90C6, 0x8107, 0x9865, 0x8108, 0x96AC, 0x8109, 0xE3F5, - 0x810A, 0x90D2, 0x811A, 0x8B72, 0x811B, 0xE3F8, 0x8123, 0xE3FA, - 0x8129, 0xE3F9, 0x812F, 0xE3FB, 0x8131, 0x9245, 0x8133, 0x945D, - 0x8139, 0x92AF, 0x813E, 0xE442, 0x8146, 0xE441, 0x814B, 0xE3FC, - 0x814E, 0x9074, 0x8150, 0x9585, 0x8151, 0xE444, 0x8153, 0xE443, - 0x8154, 0x8D6F, 0x8155, 0x9872, 0x815F, 0xE454, 0x8165, 0xE448, - 0x8166, 0xE449, 0x816B, 0x8EEE, 0x816E, 0xE447, 0x8170, 0x8D98, - 0x8171, 0xE446, 0x8174, 0xE44A, 0x8178, 0x92B0, 0x8179, 0x95A0, - 0x817A, 0x9142, 0x817F, 0x91DA, 0x8180, 0xE44E, 0x8182, 0xE44F, - 0x8183, 0xE44B, 0x8188, 0xE44C, 0x818A, 0xE44D, 0x818F, 0x8D70, - 0x8193, 0xE455, 0x8195, 0xE451, 0x819A, 0x9586, 0x819C, 0x968C, - 0x819D, 0x9547, 0x81A0, 0xE450, 0x81A3, 0xE453, 0x81A4, 0xE452, - 0x81A8, 0x9663, 0x81A9, 0xE456, 0x81B0, 0xE457, 0x81B3, 0x9156, - 0x81B5, 0xE458, 0x81B8, 0xE45A, 0x81BA, 0xE45E, 0x81BD, 0xE45B, - 0x81BE, 0xE459, 0x81BF, 0x945E, 0x81C0, 0xE45C, 0x81C2, 0xE45D, - 0x81C6, 0x89B0, 0x81C8, 0xE464, 0x81C9, 0xE45F, 0x81CD, 0xE460, - 0x81D1, 0xE461, 0x81D3, 0x919F, 0x81D8, 0xE463, 0x81D9, 0xE462, - 0x81DA, 0xE465, 0x81DF, 0xE466, 0x81E0, 0xE467, 0x81E3, 0x9062, - 0x81E5, 0x89E7, 0x81E7, 0xE468, 0x81E8, 0x97D5, 0x81EA, 0x8EA9, - 0x81ED, 0x8F4C, 0x81F3, 0x8E8A, 0x81F4, 0x9276, 0x81FA, 0xE469, - 0x81FB, 0xE46A, 0x81FC, 0x8950, 0x81FE, 0xE46B, 0x8201, 0xE46C, - 0x8202, 0xE46D, 0x8205, 0xE46E, 0x8207, 0xE46F, 0x8208, 0x8BBB, - 0x8209, 0x9DA8, 0x820A, 0xE470, 0x820C, 0x90E3, 0x820D, 0xE471, - 0x820E, 0x8EC9, 0x8210, 0xE472, 0x8212, 0x98AE, 0x8216, 0xE473, - 0x8217, 0x95DC, 0x8218, 0x8ADA, 0x821B, 0x9143, 0x821C, 0x8F77, - 0x821E, 0x9591, 0x821F, 0x8F4D, 0x8229, 0xE474, 0x822A, 0x8D71, - 0x822B, 0xE475, 0x822C, 0x94CA, 0x822E, 0xE484, 0x8233, 0xE477, - 0x8235, 0x91C7, 0x8236, 0x9495, 0x8237, 0x8CBD, 0x8238, 0xE476, - 0x8239, 0x9144, 0x8240, 0xE478, 0x8247, 0x92F8, 0x8258, 0xE47A, - 0x8259, 0xE479, 0x825A, 0xE47C, 0x825D, 0xE47B, 0x825F, 0xE47D, - 0x8262, 0xE480, 0x8264, 0xE47E, 0x8266, 0x8ACD, 0x8268, 0xE481, - 0x826A, 0xE482, 0x826B, 0xE483, 0x826E, 0x8DAF, 0x826F, 0x97C7, - 0x8271, 0xE485, 0x8272, 0x9046, 0x8276, 0x8990, 0x8277, 0xE486, - 0x8278, 0xE487, 0x827E, 0xE488, 0x828B, 0x88F0, 0x828D, 0xE489, - 0x8292, 0xE48A, 0x8299, 0x9587, 0x829D, 0x8EC5, 0x829F, 0xE48C, - 0x82A5, 0x8A48, 0x82A6, 0x88B0, 0x82AB, 0xE48B, 0x82AC, 0xE48E, - 0x82AD, 0x946D, 0x82AF, 0x9063, 0x82B1, 0x89D4, 0x82B3, 0x9646, - 0x82B8, 0x8C7C, 0x82B9, 0x8BDA, 0x82BB, 0xE48D, 0x82BD, 0x89E8, - 0x82C5, 0x8AA1, 0x82D1, 0x8991, 0x82D2, 0xE492, 0x82D3, 0x97E8, - 0x82D4, 0x91DB, 0x82D7, 0x9563, 0x82D9, 0xE49E, 0x82DB, 0x89D5, - 0x82DC, 0xE49C, 0x82DE, 0xE49A, 0x82DF, 0xE491, 0x82E1, 0xE48F, - 0x82E3, 0xE490, 0x82E5, 0x8EE1, 0x82E6, 0x8BEA, 0x82E7, 0x9297, - 0x82EB, 0x93CF, 0x82F1, 0x8970, 0x82F3, 0xE494, 0x82F4, 0xE493, - 0x82F9, 0xE499, 0x82FA, 0xE495, 0x82FB, 0xE498, 0x8301, 0xFB93, - 0x8302, 0x96CE, 0x8303, 0xE497, 0x8304, 0x89D6, 0x8305, 0x8A9D, - 0x8306, 0xE49B, 0x8309, 0xE49D, 0x830E, 0x8C73, 0x8316, 0xE4A1, - 0x8317, 0xE4AA, 0x8318, 0xE4AB, 0x831C, 0x88A9, 0x8323, 0xE4B2, - 0x8328, 0x88EF, 0x832B, 0xE4A9, 0x832F, 0xE4A8, 0x8331, 0xE4A3, - 0x8332, 0xE4A2, 0x8334, 0xE4A0, 0x8335, 0xE49F, 0x8336, 0x9283, - 0x8338, 0x91F9, 0x8339, 0xE4A5, 0x8340, 0xE4A4, 0x8345, 0xE4A7, - 0x8349, 0x9190, 0x834A, 0x8C74, 0x834F, 0x8960, 0x8350, 0xE4A6, - 0x8352, 0x8D72, 0x8358, 0x9191, 0x8362, 0xFB94, 0x8373, 0xE4B8, - 0x8375, 0xE4B9, 0x8377, 0x89D7, 0x837B, 0x89AC, 0x837C, 0xE4B6, - 0x837F, 0xFB95, 0x8385, 0xE4AC, 0x8387, 0xE4B4, 0x8389, 0xE4BB, - 0x838A, 0xE4B5, 0x838E, 0xE4B3, 0x8393, 0xE496, 0x8396, 0xE4B1, - 0x839A, 0xE4AD, 0x839E, 0x8ACE, 0x839F, 0xE4AF, 0x83A0, 0xE4BA, - 0x83A2, 0xE4B0, 0x83A8, 0xE4BC, 0x83AA, 0xE4AE, 0x83AB, 0x949C, - 0x83B1, 0x9789, 0x83B5, 0xE4B7, 0x83BD, 0xE4CD, 0x83C1, 0xE4C5, - 0x83C5, 0x909B, 0x83C7, 0xFB96, 0x83CA, 0x8B65, 0x83CC, 0x8BDB, - 0x83CE, 0xE4C0, 0x83D3, 0x89D9, 0x83D6, 0x8FD2, 0x83D8, 0xE4C3, - 0x83DC, 0x8DD8, 0x83DF, 0x9370, 0x83E0, 0xE4C8, 0x83E9, 0x95EC, - 0x83EB, 0xE4BF, 0x83EF, 0x89D8, 0x83F0, 0x8CD4, 0x83F1, 0x9548, - 0x83F2, 0xE4C9, 0x83F4, 0xE4BD, 0x83F6, 0xFB97, 0x83F7, 0xE4C6, - 0x83FB, 0xE4D0, 0x83FD, 0xE4C1, 0x8403, 0xE4C2, 0x8404, 0x93B8, - 0x8407, 0xE4C7, 0x840B, 0xE4C4, 0x840C, 0x9647, 0x840D, 0xE4CA, - 0x840E, 0x88DE, 0x8413, 0xE4BE, 0x8420, 0xE4CC, 0x8422, 0xE4CB, - 0x8429, 0x948B, 0x842A, 0xE4D2, 0x842C, 0xE4DD, 0x8431, 0x8A9E, - 0x8435, 0xE4E0, 0x8438, 0xE4CE, 0x843C, 0xE4D3, 0x843D, 0x978E, - 0x8446, 0xE4DC, 0x8448, 0xFB98, 0x8449, 0x9774, 0x844E, 0x97A8, - 0x8457, 0x9298, 0x845B, 0x8A8B, 0x8461, 0x9592, 0x8462, 0xE4E2, - 0x8463, 0x939F, 0x8466, 0x88AF, 0x8469, 0xE4DB, 0x846B, 0xE4D7, - 0x846C, 0x9192, 0x846D, 0xE4D1, 0x846E, 0xE4D9, 0x846F, 0xE4DE, - 0x8471, 0x944B, 0x8475, 0x88A8, 0x8477, 0xE4D6, 0x8479, 0xE4DF, - 0x847A, 0x9598, 0x8482, 0xE4DA, 0x8484, 0xE4D5, 0x848B, 0x8FD3, - 0x8490, 0x8F4E, 0x8494, 0x8EAA, 0x8499, 0x96D6, 0x849C, 0x9566, - 0x849F, 0xE4E5, 0x84A1, 0xE4EE, 0x84AD, 0xE4D8, 0x84B2, 0x8A97, - 0x84B4, 0xFB99, 0x84B8, 0x8FF6, 0x84B9, 0xE4E3, 0x84BB, 0xE4E8, - 0x84BC, 0x9193, 0x84BF, 0xE4E4, 0x84C1, 0xE4EB, 0x84C4, 0x927E, - 0x84C6, 0xE4EC, 0x84C9, 0x9775, 0x84CA, 0xE4E1, 0x84CB, 0x8A57, - 0x84CD, 0xE4E7, 0x84D0, 0xE4EA, 0x84D1, 0x96AA, 0x84D6, 0xE4ED, - 0x84D9, 0xE4E6, 0x84DA, 0xE4E9, 0x84DC, 0xFA60, 0x84EC, 0x9648, - 0x84EE, 0x9840, 0x84F4, 0xE4F1, 0x84FC, 0xE4F8, 0x84FF, 0xE4F0, - 0x8500, 0x8EC1, 0x8506, 0xE4CF, 0x8511, 0x95CC, 0x8513, 0x96A0, - 0x8514, 0xE4F7, 0x8515, 0xE4F6, 0x8517, 0xE4F2, 0x8518, 0xE4F3, - 0x851A, 0x8955, 0x851F, 0xE4F5, 0x8521, 0xE4EF, 0x8526, 0x92D3, - 0x852C, 0xE4F4, 0x852D, 0x88FC, 0x8535, 0x91A0, 0x853D, 0x95C1, - 0x8540, 0xE4F9, 0x8541, 0xE540, 0x8543, 0x94D7, 0x8548, 0xE4FC, - 0x8549, 0x8FD4, 0x854A, 0x8EC7, 0x854B, 0xE542, 0x854E, 0x8BBC, - 0x8553, 0xFB9A, 0x8555, 0xE543, 0x8557, 0x9599, 0x8558, 0xE4FB, - 0x8559, 0xFB9B, 0x855A, 0xE4D4, 0x8563, 0xE4FA, 0x8568, 0x986E, - 0x8569, 0x93A0, 0x856A, 0x9593, 0x856B, 0xFB9C, 0x856D, 0xE54A, - 0x8577, 0xE550, 0x857E, 0xE551, 0x8580, 0xE544, 0x8584, 0x9496, - 0x8587, 0xE54E, 0x8588, 0xE546, 0x858A, 0xE548, 0x8590, 0xE552, - 0x8591, 0xE547, 0x8594, 0xE54B, 0x8597, 0x8992, 0x8599, 0x93E3, - 0x859B, 0xE54C, 0x859C, 0xE54F, 0x85A4, 0xE545, 0x85A6, 0x9145, - 0x85A8, 0xE549, 0x85A9, 0x8E46, 0x85AA, 0x9064, 0x85AB, 0x8C4F, - 0x85AC, 0x96F2, 0x85AE, 0x96F7, 0x85AF, 0x8F92, 0x85B0, 0xFB9E, - 0x85B9, 0xE556, 0x85BA, 0xE554, 0x85C1, 0x986D, 0x85C9, 0xE553, - 0x85CD, 0x9795, 0x85CF, 0xE555, 0x85D0, 0xE557, 0x85D5, 0xE558, - 0x85DC, 0xE55B, 0x85DD, 0xE559, 0x85E4, 0x93A1, 0x85E5, 0xE55A, - 0x85E9, 0x94CB, 0x85EA, 0xE54D, 0x85F7, 0x8F93, 0x85F9, 0xE55C, - 0x85FA, 0xE561, 0x85FB, 0x9194, 0x85FE, 0xE560, 0x8602, 0xE541, - 0x8606, 0xE562, 0x8607, 0x9168, 0x860A, 0xE55D, 0x860B, 0xE55F, - 0x8613, 0xE55E, 0x8616, 0x9F50, 0x8617, 0x9F41, 0x861A, 0xE564, - 0x8622, 0xE563, 0x862D, 0x9796, 0x862F, 0xE1BA, 0x8630, 0xE565, - 0x863F, 0xE566, 0x864D, 0xE567, 0x864E, 0x8CD5, 0x8650, 0x8B73, - 0x8654, 0xE569, 0x8655, 0x997C, 0x865A, 0x8B95, 0x865C, 0x97B8, - 0x865E, 0x8BF1, 0x865F, 0xE56A, 0x8667, 0xE56B, 0x866B, 0x928E, - 0x8671, 0xE56C, 0x8679, 0x93F8, 0x867B, 0x88B8, 0x868A, 0x89E1, - 0x868B, 0xE571, 0x868C, 0xE572, 0x8693, 0xE56D, 0x8695, 0x8E5C, - 0x86A3, 0xE56E, 0x86A4, 0x9461, 0x86A9, 0xE56F, 0x86AA, 0xE570, - 0x86AB, 0xE57A, 0x86AF, 0xE574, 0x86B0, 0xE577, 0x86B6, 0xE573, - 0x86C4, 0xE575, 0x86C6, 0xE576, 0x86C7, 0x8ED6, 0x86C9, 0xE578, - 0x86CB, 0x9260, 0x86CD, 0x8C75, 0x86CE, 0x8A61, 0x86D4, 0xE57B, - 0x86D9, 0x8A5E, 0x86DB, 0xE581, 0x86DE, 0xE57C, 0x86DF, 0xE580, - 0x86E4, 0x94B8, 0x86E9, 0xE57D, 0x86EC, 0xE57E, 0x86ED, 0x9567, - 0x86EE, 0x94D8, 0x86EF, 0xE582, 0x86F8, 0x91FB, 0x86F9, 0xE58C, - 0x86FB, 0xE588, 0x86FE, 0x89E9, 0x8700, 0xE586, 0x8702, 0x9649, - 0x8703, 0xE587, 0x8706, 0xE584, 0x8708, 0xE585, 0x8709, 0xE58A, - 0x870A, 0xE58D, 0x870D, 0xE58B, 0x8711, 0xE589, 0x8712, 0xE583, - 0x8718, 0x9277, 0x871A, 0xE594, 0x871C, 0x96A8, 0x8725, 0xE592, - 0x8729, 0xE593, 0x8734, 0xE58E, 0x8737, 0xE590, 0x873B, 0xE591, - 0x873F, 0xE58F, 0x8749, 0x90E4, 0x874B, 0x9858, 0x874C, 0xE598, - 0x874E, 0xE599, 0x8753, 0xE59F, 0x8755, 0x9049, 0x8757, 0xE59B, - 0x8759, 0xE59E, 0x875F, 0xE596, 0x8760, 0xE595, 0x8763, 0xE5A0, - 0x8766, 0x89DA, 0x8768, 0xE59C, 0x876A, 0xE5A1, 0x876E, 0xE59D, - 0x8774, 0xE59A, 0x8776, 0x92B1, 0x8778, 0xE597, 0x877F, 0x9488, - 0x8782, 0xE5A5, 0x878D, 0x975A, 0x879F, 0xE5A4, 0x87A2, 0xE5A3, - 0x87AB, 0xE5AC, 0x87AF, 0xE5A6, 0x87B3, 0xE5AE, 0x87BA, 0x9786, - 0x87BB, 0xE5B1, 0x87BD, 0xE5A8, 0x87C0, 0xE5A9, 0x87C4, 0xE5AD, - 0x87C6, 0xE5B0, 0x87C7, 0xE5AF, 0x87CB, 0xE5A7, 0x87D0, 0xE5AA, - 0x87D2, 0xE5BB, 0x87E0, 0xE5B4, 0x87EF, 0xE5B2, 0x87F2, 0xE5B3, - 0x87F6, 0xE5B8, 0x87F7, 0xE5B9, 0x87F9, 0x8A49, 0x87FB, 0x8B61, - 0x87FE, 0xE5B7, 0x8805, 0xE5A2, 0x8807, 0xFBA1, 0x880D, 0xE5B6, - 0x880E, 0xE5BA, 0x880F, 0xE5B5, 0x8811, 0xE5BC, 0x8815, 0xE5BE, - 0x8816, 0xE5BD, 0x8821, 0xE5C0, 0x8822, 0xE5BF, 0x8823, 0xE579, - 0x8827, 0xE5C4, 0x8831, 0xE5C1, 0x8836, 0xE5C2, 0x8839, 0xE5C3, - 0x883B, 0xE5C5, 0x8840, 0x8C8C, 0x8842, 0xE5C7, 0x8844, 0xE5C6, - 0x8846, 0x8F4F, 0x884C, 0x8D73, 0x884D, 0x9FA5, 0x8852, 0xE5C8, - 0x8853, 0x8F70, 0x8857, 0x8A58, 0x8859, 0xE5C9, 0x885B, 0x8971, - 0x885D, 0x8FD5, 0x885E, 0xE5CA, 0x8861, 0x8D74, 0x8862, 0xE5CB, - 0x8863, 0x88DF, 0x8868, 0x955C, 0x886B, 0xE5CC, 0x8870, 0x908A, - 0x8872, 0xE5D3, 0x8875, 0xE5D0, 0x8877, 0x928F, 0x887D, 0xE5D1, - 0x887E, 0xE5CE, 0x887F, 0x8BDC, 0x8881, 0xE5CD, 0x8882, 0xE5D4, - 0x8888, 0x8C55, 0x888B, 0x91DC, 0x888D, 0xE5DA, 0x8892, 0xE5D6, - 0x8896, 0x91B3, 0x8897, 0xE5D5, 0x8899, 0xE5D8, 0x889E, 0xE5CF, - 0x88A2, 0xE5D9, 0x88A4, 0xE5DB, 0x88AB, 0x94ED, 0x88AE, 0xE5D7, - 0x88B0, 0xE5DC, 0x88B1, 0xE5DE, 0x88B4, 0x8CD1, 0x88B5, 0xE5D2, - 0x88B7, 0x88BF, 0x88BF, 0xE5DD, 0x88C1, 0x8DD9, 0x88C2, 0x97F4, - 0x88C3, 0xE5DF, 0x88C4, 0xE5E0, 0x88C5, 0x9195, 0x88CF, 0x97A0, - 0x88D4, 0xE5E1, 0x88D5, 0x9754, 0x88D8, 0xE5E2, 0x88D9, 0xE5E3, - 0x88DC, 0x95E2, 0x88DD, 0xE5E4, 0x88DF, 0x8DBE, 0x88E1, 0x97A1, - 0x88E8, 0xE5E9, 0x88F2, 0xE5EA, 0x88F3, 0x8FD6, 0x88F4, 0xE5E8, - 0x88F5, 0xFBA2, 0x88F8, 0x9787, 0x88F9, 0xE5E5, 0x88FC, 0xE5E7, - 0x88FD, 0x90BB, 0x88FE, 0x909E, 0x8902, 0xE5E6, 0x8904, 0xE5EB, - 0x8907, 0x95A1, 0x890A, 0xE5ED, 0x890C, 0xE5EC, 0x8910, 0x8A8C, - 0x8912, 0x964A, 0x8913, 0xE5EE, 0x891C, 0xFA5D, 0x891D, 0xE5FA, - 0x891E, 0xE5F0, 0x8925, 0xE5F1, 0x892A, 0xE5F2, 0x892B, 0xE5F3, - 0x8936, 0xE5F7, 0x8938, 0xE5F8, 0x893B, 0xE5F6, 0x8941, 0xE5F4, - 0x8943, 0xE5EF, 0x8944, 0xE5F5, 0x894C, 0xE5F9, 0x894D, 0xE8B5, - 0x8956, 0x89A6, 0x895E, 0xE5FC, 0x895F, 0x8BDD, 0x8960, 0xE5FB, - 0x8964, 0xE641, 0x8966, 0xE640, 0x896A, 0xE643, 0x896D, 0xE642, - 0x896F, 0xE644, 0x8972, 0x8F50, 0x8974, 0xE645, 0x8977, 0xE646, - 0x897E, 0xE647, 0x897F, 0x90BC, 0x8981, 0x9776, 0x8983, 0xE648, - 0x8986, 0x95A2, 0x8987, 0x9465, 0x8988, 0xE649, 0x898A, 0xE64A, - 0x898B, 0x8CA9, 0x898F, 0x8B4B, 0x8993, 0xE64B, 0x8996, 0x8E8B, - 0x8997, 0x9460, 0x8998, 0xE64C, 0x899A, 0x8A6F, 0x89A1, 0xE64D, - 0x89A6, 0xE64F, 0x89A7, 0x9797, 0x89A9, 0xE64E, 0x89AA, 0x9065, - 0x89AC, 0xE650, 0x89AF, 0xE651, 0x89B2, 0xE652, 0x89B3, 0x8ACF, - 0x89BA, 0xE653, 0x89BD, 0xE654, 0x89BF, 0xE655, 0x89C0, 0xE656, - 0x89D2, 0x8A70, 0x89DA, 0xE657, 0x89DC, 0xE658, 0x89DD, 0xE659, - 0x89E3, 0x89F0, 0x89E6, 0x9047, 0x89E7, 0xE65A, 0x89F4, 0xE65B, - 0x89F8, 0xE65C, 0x8A00, 0x8CBE, 0x8A02, 0x92F9, 0x8A03, 0xE65D, - 0x8A08, 0x8C76, 0x8A0A, 0x9075, 0x8A0C, 0xE660, 0x8A0E, 0x93A2, - 0x8A10, 0xE65F, 0x8A12, 0xFBA3, 0x8A13, 0x8C50, 0x8A16, 0xE65E, - 0x8A17, 0x91F5, 0x8A18, 0x8B4C, 0x8A1B, 0xE661, 0x8A1D, 0xE662, - 0x8A1F, 0x8FD7, 0x8A23, 0x8C8D, 0x8A25, 0xE663, 0x8A2A, 0x964B, - 0x8A2D, 0x90DD, 0x8A31, 0x8B96, 0x8A33, 0x96F3, 0x8A34, 0x9169, - 0x8A36, 0xE664, 0x8A37, 0xFBA4, 0x8A3A, 0x9066, 0x8A3B, 0x9290, - 0x8A3C, 0x8FD8, 0x8A41, 0xE665, 0x8A46, 0xE668, 0x8A48, 0xE669, - 0x8A50, 0x8DBC, 0x8A51, 0x91C0, 0x8A52, 0xE667, 0x8A54, 0x8FD9, - 0x8A55, 0x955D, 0x8A5B, 0xE666, 0x8A5E, 0x8E8C, 0x8A60, 0x8972, - 0x8A62, 0xE66D, 0x8A63, 0x8C77, 0x8A66, 0x8E8E, 0x8A69, 0x8E8D, - 0x8A6B, 0x986C, 0x8A6C, 0xE66C, 0x8A6D, 0xE66B, 0x8A6E, 0x9146, - 0x8A70, 0x8B6C, 0x8A71, 0x9862, 0x8A72, 0x8A59, 0x8A73, 0x8FDA, - 0x8A79, 0xFBA5, 0x8A7C, 0xE66A, 0x8A82, 0xE66F, 0x8A84, 0xE670, - 0x8A85, 0xE66E, 0x8A87, 0x8CD6, 0x8A89, 0x975F, 0x8A8C, 0x8E8F, - 0x8A8D, 0x9446, 0x8A91, 0xE673, 0x8A93, 0x90BE, 0x8A95, 0x9261, - 0x8A98, 0x9755, 0x8A9A, 0xE676, 0x8A9E, 0x8CEA, 0x8AA0, 0x90BD, - 0x8AA1, 0xE672, 0x8AA3, 0xE677, 0x8AA4, 0x8CEB, 0x8AA5, 0xE674, - 0x8AA6, 0xE675, 0x8AA7, 0xFBA6, 0x8AA8, 0xE671, 0x8AAC, 0x90E0, - 0x8AAD, 0x93C7, 0x8AB0, 0x924E, 0x8AB2, 0x89DB, 0x8AB9, 0x94EE, - 0x8ABC, 0x8B62, 0x8ABE, 0xFBA7, 0x8ABF, 0x92B2, 0x8AC2, 0xE67A, - 0x8AC4, 0xE678, 0x8AC7, 0x926B, 0x8ACB, 0x90BF, 0x8ACC, 0x8AD0, - 0x8ACD, 0xE679, 0x8ACF, 0x907A, 0x8AD2, 0x97C8, 0x8AD6, 0x985F, - 0x8ADA, 0xE67B, 0x8ADB, 0xE687, 0x8ADC, 0x92B3, 0x8ADE, 0xE686, - 0x8ADF, 0xFBA8, 0x8AE0, 0xE683, 0x8AE1, 0xE68B, 0x8AE2, 0xE684, - 0x8AE4, 0xE680, 0x8AE6, 0x92FA, 0x8AE7, 0xE67E, 0x8AEB, 0xE67C, - 0x8AED, 0x9740, 0x8AEE, 0x8E90, 0x8AF1, 0xE681, 0x8AF3, 0xE67D, - 0x8AF6, 0xFBAA, 0x8AF7, 0xE685, 0x8AF8, 0x8F94, 0x8AFA, 0x8CBF, - 0x8AFE, 0x91F8, 0x8B00, 0x9664, 0x8B01, 0x8979, 0x8B02, 0x88E0, - 0x8B04, 0x93A3, 0x8B07, 0xE689, 0x8B0C, 0xE688, 0x8B0E, 0x93E4, - 0x8B10, 0xE68D, 0x8B14, 0xE682, 0x8B16, 0xE68C, 0x8B17, 0xE68E, - 0x8B19, 0x8CAA, 0x8B1A, 0xE68A, 0x8B1B, 0x8D75, 0x8B1D, 0x8ED3, - 0x8B20, 0xE68F, 0x8B21, 0x9777, 0x8B26, 0xE692, 0x8B28, 0xE695, - 0x8B2B, 0xE693, 0x8B2C, 0x9554, 0x8B33, 0xE690, 0x8B39, 0x8BDE, - 0x8B3E, 0xE694, 0x8B41, 0xE696, 0x8B49, 0xE69A, 0x8B4C, 0xE697, - 0x8B4E, 0xE699, 0x8B4F, 0xE698, 0x8B53, 0xFBAB, 0x8B56, 0xE69B, - 0x8B58, 0x8EAF, 0x8B5A, 0xE69D, 0x8B5B, 0xE69C, 0x8B5C, 0x9588, - 0x8B5F, 0xE69F, 0x8B66, 0x8C78, 0x8B6B, 0xE69E, 0x8B6C, 0xE6A0, - 0x8B6F, 0xE6A1, 0x8B70, 0x8B63, 0x8B71, 0xE3BF, 0x8B72, 0x8FF7, - 0x8B74, 0xE6A2, 0x8B77, 0x8CEC, 0x8B7D, 0xE6A3, 0x8B7F, 0xFBAC, - 0x8B80, 0xE6A4, 0x8B83, 0x8E5D, 0x8B8A, 0x9DCC, 0x8B8C, 0xE6A5, - 0x8B8E, 0xE6A6, 0x8B90, 0x8F51, 0x8B92, 0xE6A7, 0x8B93, 0xE6A8, - 0x8B96, 0xE6A9, 0x8B99, 0xE6AA, 0x8B9A, 0xE6AB, 0x8C37, 0x924A, - 0x8C3A, 0xE6AC, 0x8C3F, 0xE6AE, 0x8C41, 0xE6AD, 0x8C46, 0x93A4, - 0x8C48, 0xE6AF, 0x8C4A, 0x964C, 0x8C4C, 0xE6B0, 0x8C4E, 0xE6B1, - 0x8C50, 0xE6B2, 0x8C55, 0xE6B3, 0x8C5A, 0x93D8, 0x8C61, 0x8FDB, - 0x8C62, 0xE6B4, 0x8C6A, 0x8D8B, 0x8C6B, 0x98AC, 0x8C6C, 0xE6B5, - 0x8C78, 0xE6B6, 0x8C79, 0x955E, 0x8C7A, 0xE6B7, 0x8C7C, 0xE6BF, - 0x8C82, 0xE6B8, 0x8C85, 0xE6BA, 0x8C89, 0xE6B9, 0x8C8A, 0xE6BB, - 0x8C8C, 0x9665, 0x8C8D, 0xE6BC, 0x8C8E, 0xE6BD, 0x8C94, 0xE6BE, - 0x8C98, 0xE6C0, 0x8C9D, 0x8A4C, 0x8C9E, 0x92E5, 0x8CA0, 0x9589, - 0x8CA1, 0x8DE0, 0x8CA2, 0x8D76, 0x8CA7, 0x956E, 0x8CA8, 0x89DD, - 0x8CA9, 0x94CC, 0x8CAA, 0xE6C3, 0x8CAB, 0x8AD1, 0x8CAC, 0x90D3, - 0x8CAD, 0xE6C2, 0x8CAE, 0xE6C7, 0x8CAF, 0x9299, 0x8CB0, 0x96E1, - 0x8CB2, 0xE6C5, 0x8CB3, 0xE6C6, 0x8CB4, 0x8B4D, 0x8CB6, 0xE6C8, - 0x8CB7, 0x9483, 0x8CB8, 0x91DD, 0x8CBB, 0x94EF, 0x8CBC, 0x935C, - 0x8CBD, 0xE6C4, 0x8CBF, 0x9666, 0x8CC0, 0x89EA, 0x8CC1, 0xE6CA, - 0x8CC2, 0x9847, 0x8CC3, 0x92C0, 0x8CC4, 0x9864, 0x8CC7, 0x8E91, - 0x8CC8, 0xE6C9, 0x8CCA, 0x91AF, 0x8CCD, 0xE6DA, 0x8CCE, 0x9147, - 0x8CD1, 0x93F6, 0x8CD3, 0x956F, 0x8CDA, 0xE6CD, 0x8CDB, 0x8E5E, - 0x8CDC, 0x8E92, 0x8CDE, 0x8FDC, 0x8CE0, 0x9485, 0x8CE2, 0x8CAB, - 0x8CE3, 0xE6CC, 0x8CE4, 0xE6CB, 0x8CE6, 0x958A, 0x8CEA, 0x8EBF, - 0x8CED, 0x9371, 0x8CF0, 0xFBAD, 0x8CF4, 0xFBAE, 0x8CFA, 0xE6CF, - 0x8CFB, 0xE6D0, 0x8CFC, 0x8D77, 0x8CFD, 0xE6CE, 0x8D04, 0xE6D1, - 0x8D05, 0xE6D2, 0x8D07, 0xE6D4, 0x8D08, 0x91A1, 0x8D0A, 0xE6D3, - 0x8D0B, 0x8AE4, 0x8D0D, 0xE6D6, 0x8D0F, 0xE6D5, 0x8D10, 0xE6D7, - 0x8D12, 0xFBAF, 0x8D13, 0xE6D9, 0x8D14, 0xE6DB, 0x8D16, 0xE6DC, - 0x8D64, 0x90D4, 0x8D66, 0x8ECD, 0x8D67, 0xE6DD, 0x8D6B, 0x8A71, - 0x8D6D, 0xE6DE, 0x8D70, 0x9196, 0x8D71, 0xE6DF, 0x8D73, 0xE6E0, - 0x8D74, 0x958B, 0x8D76, 0xFBB0, 0x8D77, 0x8B4E, 0x8D81, 0xE6E1, - 0x8D85, 0x92B4, 0x8D8A, 0x897A, 0x8D99, 0xE6E2, 0x8DA3, 0x8EEF, - 0x8DA8, 0x9096, 0x8DB3, 0x91AB, 0x8DBA, 0xE6E5, 0x8DBE, 0xE6E4, - 0x8DC2, 0xE6E3, 0x8DCB, 0xE6EB, 0x8DCC, 0xE6E9, 0x8DCF, 0xE6E6, - 0x8DD6, 0xE6E8, 0x8DDA, 0xE6E7, 0x8DDB, 0xE6EA, 0x8DDD, 0x8B97, - 0x8DDF, 0xE6EE, 0x8DE1, 0x90D5, 0x8DE3, 0xE6EF, 0x8DE8, 0x8CD7, - 0x8DEA, 0xE6EC, 0x8DEB, 0xE6ED, 0x8DEF, 0x9848, 0x8DF3, 0x92B5, - 0x8DF5, 0x9148, 0x8DFC, 0xE6F0, 0x8DFF, 0xE6F3, 0x8E08, 0xE6F1, - 0x8E09, 0xE6F2, 0x8E0A, 0x9778, 0x8E0F, 0x93A5, 0x8E10, 0xE6F6, - 0x8E1D, 0xE6F4, 0x8E1E, 0xE6F5, 0x8E1F, 0xE6F7, 0x8E2A, 0xE748, - 0x8E30, 0xE6FA, 0x8E34, 0xE6FB, 0x8E35, 0xE6F9, 0x8E42, 0xE6F8, - 0x8E44, 0x92FB, 0x8E47, 0xE740, 0x8E48, 0xE744, 0x8E49, 0xE741, - 0x8E4A, 0xE6FC, 0x8E4C, 0xE742, 0x8E50, 0xE743, 0x8E55, 0xE74A, - 0x8E59, 0xE745, 0x8E5F, 0x90D6, 0x8E60, 0xE747, 0x8E63, 0xE749, - 0x8E64, 0xE746, 0x8E72, 0xE74C, 0x8E74, 0x8F52, 0x8E76, 0xE74B, - 0x8E7C, 0xE74D, 0x8E81, 0xE74E, 0x8E84, 0xE751, 0x8E85, 0xE750, - 0x8E87, 0xE74F, 0x8E8A, 0xE753, 0x8E8B, 0xE752, 0x8E8D, 0x96F4, - 0x8E91, 0xE755, 0x8E93, 0xE754, 0x8E94, 0xE756, 0x8E99, 0xE757, - 0x8EA1, 0xE759, 0x8EAA, 0xE758, 0x8EAB, 0x9067, 0x8EAC, 0xE75A, - 0x8EAF, 0x8BEB, 0x8EB0, 0xE75B, 0x8EB1, 0xE75D, 0x8EBE, 0xE75E, - 0x8EC5, 0xE75F, 0x8EC6, 0xE75C, 0x8EC8, 0xE760, 0x8ECA, 0x8ED4, - 0x8ECB, 0xE761, 0x8ECC, 0x8B4F, 0x8ECD, 0x8C52, 0x8ECF, 0xFBB2, - 0x8ED2, 0x8CAC, 0x8EDB, 0xE762, 0x8EDF, 0x93EE, 0x8EE2, 0x935D, - 0x8EE3, 0xE763, 0x8EEB, 0xE766, 0x8EF8, 0x8EB2, 0x8EFB, 0xE765, - 0x8EFC, 0xE764, 0x8EFD, 0x8C79, 0x8EFE, 0xE767, 0x8F03, 0x8A72, - 0x8F05, 0xE769, 0x8F09, 0x8DDA, 0x8F0A, 0xE768, 0x8F0C, 0xE771, - 0x8F12, 0xE76B, 0x8F13, 0xE76D, 0x8F14, 0x95E3, 0x8F15, 0xE76A, - 0x8F19, 0xE76C, 0x8F1B, 0xE770, 0x8F1C, 0xE76E, 0x8F1D, 0x8B50, - 0x8F1F, 0xE76F, 0x8F26, 0xE772, 0x8F29, 0x9479, 0x8F2A, 0x97D6, - 0x8F2F, 0x8F53, 0x8F33, 0xE773, 0x8F38, 0x9741, 0x8F39, 0xE775, - 0x8F3B, 0xE774, 0x8F3E, 0xE778, 0x8F3F, 0x9760, 0x8F42, 0xE777, - 0x8F44, 0x8A8D, 0x8F45, 0xE776, 0x8F46, 0xE77B, 0x8F49, 0xE77A, - 0x8F4C, 0xE779, 0x8F4D, 0x9351, 0x8F4E, 0xE77C, 0x8F57, 0xE77D, - 0x8F5C, 0xE77E, 0x8F5F, 0x8D8C, 0x8F61, 0x8C44, 0x8F62, 0xE780, - 0x8F63, 0xE781, 0x8F64, 0xE782, 0x8F9B, 0x9068, 0x8F9C, 0xE783, - 0x8F9E, 0x8EAB, 0x8F9F, 0xE784, 0x8FA3, 0xE785, 0x8FA7, 0x999F, - 0x8FA8, 0x999E, 0x8FAD, 0xE786, 0x8FAE, 0xE390, 0x8FAF, 0xE787, - 0x8FB0, 0x9243, 0x8FB1, 0x904A, 0x8FB2, 0x945F, 0x8FB7, 0xE788, - 0x8FBA, 0x95D3, 0x8FBB, 0x92D2, 0x8FBC, 0x8D9E, 0x8FBF, 0x9248, - 0x8FC2, 0x8949, 0x8FC4, 0x9698, 0x8FC5, 0x9076, 0x8FCE, 0x8C7D, - 0x8FD1, 0x8BDF, 0x8FD4, 0x95D4, 0x8FDA, 0xE789, 0x8FE2, 0xE78B, - 0x8FE5, 0xE78A, 0x8FE6, 0x89DE, 0x8FE9, 0x93F4, 0x8FEA, 0xE78C, - 0x8FEB, 0x9497, 0x8FED, 0x9352, 0x8FEF, 0xE78D, 0x8FF0, 0x8F71, - 0x8FF4, 0xE78F, 0x8FF7, 0x96C0, 0x8FF8, 0xE79E, 0x8FF9, 0xE791, - 0x8FFA, 0xE792, 0x8FFD, 0x92C7, 0x9000, 0x91DE, 0x9001, 0x9197, - 0x9003, 0x93A6, 0x9005, 0xE790, 0x9006, 0x8B74, 0x900B, 0xE799, - 0x900D, 0xE796, 0x900E, 0xE7A3, 0x900F, 0x93A7, 0x9010, 0x9280, - 0x9011, 0xE793, 0x9013, 0x92FC, 0x9014, 0x9372, 0x9015, 0xE794, - 0x9016, 0xE798, 0x9017, 0x9080, 0x9019, 0x9487, 0x901A, 0x92CA, - 0x901D, 0x90C0, 0x901E, 0xE797, 0x901F, 0x91AC, 0x9020, 0x91A2, - 0x9021, 0xE795, 0x9022, 0x88A7, 0x9023, 0x9841, 0x9027, 0xE79A, - 0x902E, 0x91DF, 0x9031, 0x8F54, 0x9032, 0x9069, 0x9035, 0xE79C, - 0x9036, 0xE79B, 0x9038, 0x88ED, 0x9039, 0xE79D, 0x903C, 0x954E, - 0x903E, 0xE7A5, 0x9041, 0x93D9, 0x9042, 0x908B, 0x9045, 0x9278, - 0x9047, 0x8BF6, 0x9049, 0xE7A4, 0x904A, 0x9756, 0x904B, 0x895E, - 0x904D, 0x95D5, 0x904E, 0x89DF, 0x904F, 0xE79F, 0x9050, 0xE7A0, - 0x9051, 0xE7A1, 0x9052, 0xE7A2, 0x9053, 0x93B9, 0x9054, 0x9242, - 0x9055, 0x88E1, 0x9056, 0xE7A6, 0x9058, 0xE7A7, 0x9059, 0xEAA1, - 0x905C, 0x91BB, 0x905E, 0xE7A8, 0x9060, 0x8993, 0x9061, 0x916B, - 0x9063, 0x8CAD, 0x9065, 0x9779, 0x9067, 0xFBB5, 0x9068, 0xE7A9, - 0x9069, 0x934B, 0x906D, 0x9198, 0x906E, 0x8ED5, 0x906F, 0xE7AA, - 0x9072, 0xE7AD, 0x9075, 0x8F85, 0x9076, 0xE7AB, 0x9077, 0x914A, - 0x9078, 0x9149, 0x907A, 0x88E2, 0x907C, 0x97C9, 0x907D, 0xE7AF, - 0x907F, 0x94F0, 0x9080, 0xE7B1, 0x9081, 0xE7B0, 0x9082, 0xE7AE, - 0x9083, 0xE284, 0x9084, 0x8AD2, 0x9087, 0xE78E, 0x9089, 0xE7B3, - 0x908A, 0xE7B2, 0x908F, 0xE7B4, 0x9091, 0x9757, 0x90A3, 0x93DF, - 0x90A6, 0x964D, 0x90A8, 0xE7B5, 0x90AA, 0x8ED7, 0x90AF, 0xE7B6, - 0x90B1, 0xE7B7, 0x90B5, 0xE7B8, 0x90B8, 0x9340, 0x90C1, 0x88E8, - 0x90CA, 0x8D78, 0x90CE, 0x9859, 0x90DB, 0xE7BC, 0x90DE, 0xFBB6, - 0x90E1, 0x8C53, 0x90E2, 0xE7B9, 0x90E4, 0xE7BA, 0x90E8, 0x9594, - 0x90ED, 0x8A73, 0x90F5, 0x9758, 0x90F7, 0x8BBD, 0x90FD, 0x9373, - 0x9102, 0xE7BD, 0x9112, 0xE7BE, 0x9115, 0xFBB8, 0x9119, 0xE7BF, - 0x9127, 0xFBB9, 0x912D, 0x9341, 0x9130, 0xE7C1, 0x9132, 0xE7C0, - 0x9149, 0x93D1, 0x914A, 0xE7C2, 0x914B, 0x8F55, 0x914C, 0x8EDE, - 0x914D, 0x947A, 0x914E, 0x9291, 0x9152, 0x8EF0, 0x9154, 0x908C, - 0x9156, 0xE7C3, 0x9158, 0xE7C4, 0x9162, 0x907C, 0x9163, 0xE7C5, - 0x9165, 0xE7C6, 0x9169, 0xE7C7, 0x916A, 0x978F, 0x916C, 0x8F56, - 0x9172, 0xE7C9, 0x9173, 0xE7C8, 0x9175, 0x8D79, 0x9177, 0x8D93, - 0x9178, 0x8E5F, 0x9182, 0xE7CC, 0x9187, 0x8F86, 0x9189, 0xE7CB, - 0x918B, 0xE7CA, 0x918D, 0x91E7, 0x9190, 0x8CED, 0x9192, 0x90C1, - 0x9197, 0x94AE, 0x919C, 0x8F58, 0x91A2, 0xE7CD, 0x91A4, 0x8FDD, - 0x91AA, 0xE7D0, 0x91AB, 0xE7CE, 0x91AF, 0xE7CF, 0x91B4, 0xE7D2, - 0x91B5, 0xE7D1, 0x91B8, 0x8FF8, 0x91BA, 0xE7D3, 0x91C0, 0xE7D4, - 0x91C1, 0xE7D5, 0x91C6, 0x94CE, 0x91C7, 0x8DD1, 0x91C8, 0x8EDF, - 0x91C9, 0xE7D6, 0x91CB, 0xE7D7, 0x91CC, 0x97A2, 0x91CD, 0x8F64, - 0x91CE, 0x96EC, 0x91CF, 0x97CA, 0x91D0, 0xE7D8, 0x91D1, 0x8BE0, - 0x91D6, 0xE7D9, 0x91D7, 0xFBBB, 0x91D8, 0x9342, 0x91DA, 0xFBBA, - 0x91DB, 0xE7DC, 0x91DC, 0x8A98, 0x91DD, 0x906A, 0x91DE, 0xFBBC, - 0x91DF, 0xE7DA, 0x91E1, 0xE7DB, 0x91E3, 0x92DE, 0x91E4, 0xFBBF, - 0x91E5, 0xFBC0, 0x91E6, 0x9674, 0x91E7, 0x8BFA, 0x91ED, 0xFBBD, - 0x91EE, 0xFBBE, 0x91F5, 0xE7DE, 0x91F6, 0xE7DF, 0x91FC, 0xE7DD, - 0x91FF, 0xE7E1, 0x9206, 0xFBC1, 0x920A, 0xFBC3, 0x920D, 0x93DD, - 0x920E, 0x8A62, 0x9210, 0xFBC2, 0x9211, 0xE7E5, 0x9214, 0xE7E2, - 0x9215, 0xE7E4, 0x921E, 0xE7E0, 0x9229, 0xE86E, 0x922C, 0xE7E3, - 0x9234, 0x97E9, 0x9237, 0x8CD8, 0x9239, 0xFBCA, 0x923A, 0xFBC4, - 0x923C, 0xFBC6, 0x923F, 0xE7ED, 0x9240, 0xFBC5, 0x9244, 0x9353, - 0x9245, 0xE7E8, 0x9248, 0xE7EB, 0x9249, 0xE7E9, 0x924B, 0xE7EE, - 0x924E, 0xFBC7, 0x9250, 0xE7EF, 0x9251, 0xFBC9, 0x9257, 0xE7E7, - 0x9259, 0xFBC8, 0x925A, 0xE7F4, 0x925B, 0x8994, 0x925E, 0xE7E6, - 0x9262, 0x94AB, 0x9264, 0xE7EA, 0x9266, 0x8FDE, 0x9267, 0xFBCB, - 0x9271, 0x8D7A, 0x9277, 0xFBCD, 0x9278, 0xFBCE, 0x927E, 0x9667, - 0x9280, 0x8BE2, 0x9283, 0x8F65, 0x9285, 0x93BA, 0x9288, 0xFA5F, - 0x9291, 0x914C, 0x9293, 0xE7F2, 0x9295, 0xE7EC, 0x9296, 0xE7F1, - 0x9298, 0x96C1, 0x929A, 0x92B6, 0x929B, 0xE7F3, 0x929C, 0xE7F0, - 0x92A7, 0xFBCC, 0x92AD, 0x914B, 0x92B7, 0xE7F7, 0x92B9, 0xE7F6, - 0x92CF, 0xE7F5, 0x92D0, 0xFBD2, 0x92D2, 0x964E, 0x92D3, 0xFBD6, - 0x92D5, 0xFBD4, 0x92D7, 0xFBD0, 0x92D9, 0xFBD1, 0x92E0, 0xFBD5, - 0x92E4, 0x8F9B, 0x92E7, 0xFBCF, 0x92E9, 0xE7F8, 0x92EA, 0x95DD, - 0x92ED, 0x8973, 0x92F2, 0x9565, 0x92F3, 0x9292, 0x92F8, 0x8B98, - 0x92F9, 0xFA65, 0x92FA, 0xE7FA, 0x92FB, 0xFBD9, 0x92FC, 0x8D7C, - 0x92FF, 0xFBDC, 0x9302, 0xFBDE, 0x9306, 0x8E4B, 0x930F, 0xE7F9, - 0x9310, 0x908D, 0x9318, 0x908E, 0x9319, 0xE840, 0x931A, 0xE842, - 0x931D, 0xFBDD, 0x931E, 0xFBDB, 0x9320, 0x8FF9, 0x9321, 0xFBD8, - 0x9322, 0xE841, 0x9323, 0xE843, 0x9325, 0xFBD7, 0x9326, 0x8BD1, - 0x9328, 0x9564, 0x932B, 0x8EE0, 0x932C, 0x9842, 0x932E, 0xE7FC, - 0x932F, 0x8DF6, 0x9332, 0x985E, 0x9335, 0xE845, 0x933A, 0xE844, - 0x933B, 0xE846, 0x9344, 0xE7FB, 0x9348, 0xFA5E, 0x934B, 0x93E7, - 0x934D, 0x9374, 0x9354, 0x92D5, 0x9356, 0xE84B, 0x9357, 0xFBE0, - 0x935B, 0x9262, 0x935C, 0xE847, 0x9360, 0xE848, 0x936C, 0x8C4C, - 0x936E, 0xE84A, 0x9370, 0xFBDF, 0x9375, 0x8CAE, 0x937C, 0xE849, - 0x937E, 0x8FDF, 0x938C, 0x8A99, 0x9394, 0xE84F, 0x9396, 0x8DBD, - 0x9397, 0x9199, 0x939A, 0x92C8, 0x93A4, 0xFBE1, 0x93A7, 0x8A5A, - 0x93AC, 0xE84D, 0x93AD, 0xE84E, 0x93AE, 0x92C1, 0x93B0, 0xE84C, - 0x93B9, 0xE850, 0x93C3, 0xE856, 0x93C6, 0xFBE2, 0x93C8, 0xE859, - 0x93D0, 0xE858, 0x93D1, 0x934C, 0x93D6, 0xE851, 0x93D7, 0xE852, - 0x93D8, 0xE855, 0x93DD, 0xE857, 0x93DE, 0xFBE3, 0x93E1, 0x8BBE, - 0x93E4, 0xE85A, 0x93E5, 0xE854, 0x93E8, 0xE853, 0x93F8, 0xFBE4, - 0x9403, 0xE85E, 0x9407, 0xE85F, 0x9410, 0xE860, 0x9413, 0xE85D, - 0x9414, 0xE85C, 0x9418, 0x8FE0, 0x9419, 0x93A8, 0x941A, 0xE85B, - 0x9421, 0xE864, 0x942B, 0xE862, 0x9431, 0xFBE5, 0x9435, 0xE863, - 0x9436, 0xE861, 0x9438, 0x91F6, 0x943A, 0xE865, 0x9441, 0xE866, - 0x9444, 0xE868, 0x9445, 0xFBE6, 0x9448, 0xFBE7, 0x9451, 0x8AD3, - 0x9452, 0xE867, 0x9453, 0x96F8, 0x945A, 0xE873, 0x945B, 0xE869, - 0x945E, 0xE86C, 0x9460, 0xE86A, 0x9462, 0xE86B, 0x946A, 0xE86D, - 0x9470, 0xE86F, 0x9475, 0xE870, 0x9477, 0xE871, 0x947C, 0xE874, - 0x947D, 0xE872, 0x947E, 0xE875, 0x947F, 0xE877, 0x9481, 0xE876, - 0x9577, 0x92B7, 0x9580, 0x96E5, 0x9582, 0xE878, 0x9583, 0x914D, - 0x9587, 0xE879, 0x9589, 0x95C2, 0x958A, 0xE87A, 0x958B, 0x8A4A, - 0x958F, 0x895B, 0x9591, 0x8AD5, 0x9592, 0xFBE8, 0x9593, 0x8AD4, - 0x9594, 0xE87B, 0x9596, 0xE87C, 0x9598, 0xE87D, 0x9599, 0xE87E, - 0x95A0, 0xE880, 0x95A2, 0x8AD6, 0x95A3, 0x8A74, 0x95A4, 0x8D7D, - 0x95A5, 0x94B4, 0x95A7, 0xE882, 0x95A8, 0xE881, 0x95AD, 0xE883, - 0x95B2, 0x897B, 0x95B9, 0xE886, 0x95BB, 0xE885, 0x95BC, 0xE884, - 0x95BE, 0xE887, 0x95C3, 0xE88A, 0x95C7, 0x88C5, 0x95CA, 0xE888, - 0x95CC, 0xE88C, 0x95CD, 0xE88B, 0x95D4, 0xE88E, 0x95D5, 0xE88D, - 0x95D6, 0xE88F, 0x95D8, 0x93AC, 0x95DC, 0xE890, 0x95E1, 0xE891, - 0x95E2, 0xE893, 0x95E5, 0xE892, 0x961C, 0x958C, 0x9621, 0xE894, - 0x9628, 0xE895, 0x962A, 0x8DE3, 0x962E, 0xE896, 0x962F, 0xE897, - 0x9632, 0x9668, 0x963B, 0x916A, 0x963F, 0x88A2, 0x9640, 0x91C9, - 0x9642, 0xE898, 0x9644, 0x958D, 0x964B, 0xE89B, 0x964C, 0xE899, - 0x964D, 0x8D7E, 0x964F, 0xE89A, 0x9650, 0x8CC0, 0x965B, 0x95C3, - 0x965C, 0xE89D, 0x965D, 0xE89F, 0x965E, 0xE89E, 0x965F, 0xE8A0, - 0x9662, 0x8940, 0x9663, 0x9077, 0x9664, 0x8F9C, 0x9665, 0x8AD7, - 0x9666, 0xE8A1, 0x966A, 0x9486, 0x966C, 0xE8A3, 0x9670, 0x8941, - 0x9672, 0xE8A2, 0x9673, 0x92C2, 0x9675, 0x97CB, 0x9676, 0x93A9, - 0x9677, 0xE89C, 0x9678, 0x97A4, 0x967A, 0x8CAF, 0x967D, 0x977A, - 0x9685, 0x8BF7, 0x9686, 0x97B2, 0x9688, 0x8C47, 0x968A, 0x91E0, - 0x968B, 0xE440, 0x968D, 0xE8A4, 0x968E, 0x8A4B, 0x968F, 0x908F, - 0x9694, 0x8A75, 0x9695, 0xE8A6, 0x9697, 0xE8A7, 0x9698, 0xE8A5, - 0x9699, 0x8C84, 0x969B, 0x8DDB, 0x969C, 0x8FE1, 0x969D, 0xFBEB, - 0x96A0, 0x8942, 0x96A3, 0x97D7, 0x96A7, 0xE8A9, 0x96A8, 0xE7AC, - 0x96AA, 0xE8A8, 0x96AF, 0xFBEC, 0x96B0, 0xE8AC, 0x96B1, 0xE8AA, - 0x96B2, 0xE8AB, 0x96B4, 0xE8AD, 0x96B6, 0xE8AE, 0x96B7, 0x97EA, - 0x96B8, 0xE8AF, 0x96B9, 0xE8B0, 0x96BB, 0x90C7, 0x96BC, 0x94B9, - 0x96C0, 0x909D, 0x96C1, 0x8AE5, 0x96C4, 0x9759, 0x96C5, 0x89EB, - 0x96C6, 0x8F57, 0x96C7, 0x8CD9, 0x96C9, 0xE8B3, 0x96CB, 0xE8B2, - 0x96CC, 0x8E93, 0x96CD, 0xE8B4, 0x96CE, 0xE8B1, 0x96D1, 0x8E47, - 0x96D5, 0xE8B8, 0x96D6, 0xE5AB, 0x96D9, 0x99D4, 0x96DB, 0x9097, - 0x96DC, 0xE8B6, 0x96E2, 0x97A3, 0x96E3, 0x93EF, 0x96E8, 0x894A, - 0x96EA, 0x90E1, 0x96EB, 0x8EB4, 0x96F0, 0x95B5, 0x96F2, 0x895F, - 0x96F6, 0x97EB, 0x96F7, 0x978B, 0x96F9, 0xE8B9, 0x96FB, 0x9364, - 0x9700, 0x8EF9, 0x9704, 0xE8BA, 0x9706, 0xE8BB, 0x9707, 0x906B, - 0x9708, 0xE8BC, 0x970A, 0x97EC, 0x970D, 0xE8B7, 0x970E, 0xE8BE, - 0x970F, 0xE8C0, 0x9711, 0xE8BF, 0x9713, 0xE8BD, 0x9716, 0xE8C1, - 0x9719, 0xE8C2, 0x971C, 0x919A, 0x971E, 0x89E0, 0x9724, 0xE8C3, - 0x9727, 0x96B6, 0x972A, 0xE8C4, 0x9730, 0xE8C5, 0x9732, 0x9849, - 0x9733, 0xFBED, 0x9738, 0x9E50, 0x9739, 0xE8C6, 0x973B, 0xFBEE, - 0x973D, 0xE8C7, 0x973E, 0xE8C8, 0x9742, 0xE8CC, 0x9743, 0xFBEF, - 0x9744, 0xE8C9, 0x9746, 0xE8CA, 0x9748, 0xE8CB, 0x9749, 0xE8CD, - 0x974D, 0xFBF0, 0x974F, 0xFBF1, 0x9751, 0xFBF2, 0x9752, 0x90C2, - 0x9755, 0xFBF3, 0x9756, 0x96F5, 0x9759, 0x90C3, 0x975C, 0xE8CE, - 0x975E, 0x94F1, 0x9760, 0xE8CF, 0x9761, 0xEA72, 0x9762, 0x96CA, - 0x9764, 0xE8D0, 0x9766, 0xE8D1, 0x9768, 0xE8D2, 0x9769, 0x8A76, - 0x976B, 0xE8D4, 0x976D, 0x9078, 0x9771, 0xE8D5, 0x9774, 0x8C43, - 0x9779, 0xE8D6, 0x977A, 0xE8DA, 0x977C, 0xE8D8, 0x9781, 0xE8D9, - 0x9784, 0x8A93, 0x9785, 0xE8D7, 0x9786, 0xE8DB, 0x978B, 0xE8DC, - 0x978D, 0x88C6, 0x978F, 0xE8DD, 0x9790, 0xE8DE, 0x9798, 0x8FE2, - 0x979C, 0xE8DF, 0x97A0, 0x8B66, 0x97A3, 0xE8E2, 0x97A6, 0xE8E1, - 0x97A8, 0xE8E0, 0x97AB, 0xE691, 0x97AD, 0x95DA, 0x97B3, 0xE8E3, - 0x97B4, 0xE8E4, 0x97C3, 0xE8E5, 0x97C6, 0xE8E6, 0x97C8, 0xE8E7, - 0x97CB, 0xE8E8, 0x97D3, 0x8AD8, 0x97DC, 0xE8E9, 0x97ED, 0xE8EA, - 0x97EE, 0x9442, 0x97F2, 0xE8EC, 0x97F3, 0x89B9, 0x97F5, 0xE8EF, - 0x97F6, 0xE8EE, 0x97FB, 0x8943, 0x97FF, 0x8BBF, 0x9801, 0x95C5, - 0x9802, 0x92B8, 0x9803, 0x8DA0, 0x9805, 0x8D80, 0x9806, 0x8F87, - 0x9808, 0x907B, 0x980C, 0xE8F1, 0x980F, 0xE8F0, 0x9810, 0x9761, - 0x9811, 0x8AE6, 0x9812, 0x94D0, 0x9813, 0x93DA, 0x9817, 0x909C, - 0x9818, 0x97CC, 0x981A, 0x8C7A, 0x9821, 0xE8F4, 0x9824, 0xE8F3, - 0x982C, 0x966A, 0x982D, 0x93AA, 0x9834, 0x896F, 0x9837, 0xE8F5, - 0x9838, 0xE8F2, 0x983B, 0x9570, 0x983C, 0x978A, 0x983D, 0xE8F6, - 0x9846, 0xE8F7, 0x984B, 0xE8F9, 0x984C, 0x91E8, 0x984D, 0x8A7A, - 0x984E, 0x8A7B, 0x984F, 0xE8F8, 0x9854, 0x8AE7, 0x9855, 0x8CB0, - 0x9857, 0xFBF4, 0x9858, 0x8AE8, 0x985B, 0x935E, 0x985E, 0x97DE, - 0x9865, 0xFBF5, 0x9867, 0x8CDA, 0x986B, 0xE8FA, 0x986F, 0xE8FB, - 0x9870, 0xE8FC, 0x9871, 0xE940, 0x9873, 0xE942, 0x9874, 0xE941, - 0x98A8, 0x9597, 0x98AA, 0xE943, 0x98AF, 0xE944, 0x98B1, 0xE945, - 0x98B6, 0xE946, 0x98C3, 0xE948, 0x98C4, 0xE947, 0x98C6, 0xE949, - 0x98DB, 0x94F2, 0x98DC, 0xE3CA, 0x98DF, 0x9048, 0x98E2, 0x8B51, - 0x98E9, 0xE94A, 0x98EB, 0xE94B, 0x98ED, 0x99AA, 0x98EE, 0x9F5A, - 0x98EF, 0x94D1, 0x98F2, 0x88F9, 0x98F4, 0x88B9, 0x98FC, 0x8E94, - 0x98FD, 0x964F, 0x98FE, 0x8FFC, 0x9903, 0xE94C, 0x9905, 0x96DD, - 0x9909, 0xE94D, 0x990A, 0x977B, 0x990C, 0x8961, 0x9910, 0x8E60, - 0x9912, 0xE94E, 0x9913, 0x89EC, 0x9914, 0xE94F, 0x9918, 0xE950, - 0x991D, 0xE952, 0x991E, 0xE953, 0x9920, 0xE955, 0x9921, 0xE951, - 0x9924, 0xE954, 0x9927, 0xFBF8, 0x9928, 0x8AD9, 0x992C, 0xE956, - 0x992E, 0xE957, 0x993D, 0xE958, 0x993E, 0xE959, 0x9942, 0xE95A, - 0x9945, 0xE95C, 0x9949, 0xE95B, 0x994B, 0xE95E, 0x994C, 0xE961, - 0x9950, 0xE95D, 0x9951, 0xE95F, 0x9952, 0xE960, 0x9955, 0xE962, - 0x9957, 0x8BC0, 0x9996, 0x8EF1, 0x9997, 0xE963, 0x9998, 0xE964, - 0x9999, 0x8D81, 0x999E, 0xFBFA, 0x99A5, 0xE965, 0x99A8, 0x8A5D, - 0x99AC, 0x946E, 0x99AD, 0xE966, 0x99AE, 0xE967, 0x99B3, 0x9279, - 0x99B4, 0x93E9, 0x99BC, 0xE968, 0x99C1, 0x949D, 0x99C4, 0x91CA, - 0x99C5, 0x8977, 0x99C6, 0x8BEC, 0x99C8, 0x8BED, 0x99D0, 0x9293, - 0x99D1, 0xE96D, 0x99D2, 0x8BEE, 0x99D5, 0x89ED, 0x99D8, 0xE96C, - 0x99DB, 0xE96A, 0x99DD, 0xE96B, 0x99DF, 0xE969, 0x99E2, 0xE977, - 0x99ED, 0xE96E, 0x99EE, 0xE96F, 0x99F1, 0xE970, 0x99F2, 0xE971, - 0x99F8, 0xE973, 0x99FB, 0xE972, 0x99FF, 0x8F78, 0x9A01, 0xE974, - 0x9A05, 0xE976, 0x9A0E, 0x8B52, 0x9A0F, 0xE975, 0x9A12, 0x919B, - 0x9A13, 0x8CB1, 0x9A19, 0xE978, 0x9A28, 0x91CB, 0x9A2B, 0xE979, - 0x9A30, 0x93AB, 0x9A37, 0xE97A, 0x9A3E, 0xE980, 0x9A40, 0xE97D, - 0x9A42, 0xE97C, 0x9A43, 0xE97E, 0x9A45, 0xE97B, 0x9A4D, 0xE982, - 0x9A4E, 0xFBFB, 0x9A55, 0xE981, 0x9A57, 0xE984, 0x9A5A, 0x8BC1, - 0x9A5B, 0xE983, 0x9A5F, 0xE985, 0x9A62, 0xE986, 0x9A64, 0xE988, - 0x9A65, 0xE987, 0x9A69, 0xE989, 0x9A6A, 0xE98B, 0x9A6B, 0xE98A, - 0x9AA8, 0x8D9C, 0x9AAD, 0xE98C, 0x9AB0, 0xE98D, 0x9AB8, 0x8A5B, - 0x9ABC, 0xE98E, 0x9AC0, 0xE98F, 0x9AC4, 0x9091, 0x9ACF, 0xE990, - 0x9AD1, 0xE991, 0x9AD3, 0xE992, 0x9AD4, 0xE993, 0x9AD8, 0x8D82, - 0x9AD9, 0xFBFC, 0x9ADC, 0xFC40, 0x9ADE, 0xE994, 0x9ADF, 0xE995, - 0x9AE2, 0xE996, 0x9AE3, 0xE997, 0x9AE6, 0xE998, 0x9AEA, 0x94AF, - 0x9AEB, 0xE99A, 0x9AED, 0x9545, 0x9AEE, 0xE99B, 0x9AEF, 0xE999, - 0x9AF1, 0xE99D, 0x9AF4, 0xE99C, 0x9AF7, 0xE99E, 0x9AFB, 0xE99F, - 0x9B06, 0xE9A0, 0x9B18, 0xE9A1, 0x9B1A, 0xE9A2, 0x9B1F, 0xE9A3, - 0x9B22, 0xE9A4, 0x9B23, 0xE9A5, 0x9B25, 0xE9A6, 0x9B27, 0xE9A7, - 0x9B28, 0xE9A8, 0x9B29, 0xE9A9, 0x9B2A, 0xE9AA, 0x9B2E, 0xE9AB, - 0x9B2F, 0xE9AC, 0x9B31, 0x9F54, 0x9B32, 0xE9AD, 0x9B3B, 0xE2F6, - 0x9B3C, 0x8B53, 0x9B41, 0x8A40, 0x9B42, 0x8DB0, 0x9B43, 0xE9AF, - 0x9B44, 0xE9AE, 0x9B45, 0x96A3, 0x9B4D, 0xE9B1, 0x9B4E, 0xE9B2, - 0x9B4F, 0xE9B0, 0x9B51, 0xE9B3, 0x9B54, 0x9682, 0x9B58, 0xE9B4, - 0x9B5A, 0x8B9B, 0x9B6F, 0x9844, 0x9B72, 0xFC42, 0x9B74, 0xE9B5, - 0x9B75, 0xFC41, 0x9B83, 0xE9B7, 0x9B8E, 0x88BC, 0x9B8F, 0xFC43, - 0x9B91, 0xE9B8, 0x9B92, 0x95A9, 0x9B93, 0xE9B6, 0x9B96, 0xE9B9, - 0x9B97, 0xE9BA, 0x9B9F, 0xE9BB, 0x9BA0, 0xE9BC, 0x9BA8, 0xE9BD, - 0x9BAA, 0x968E, 0x9BAB, 0x8E4C, 0x9BAD, 0x8DF8, 0x9BAE, 0x914E, - 0x9BB1, 0xFC44, 0x9BB4, 0xE9BE, 0x9BB9, 0xE9C1, 0x9BBB, 0xFC45, - 0x9BC0, 0xE9BF, 0x9BC6, 0xE9C2, 0x9BC9, 0x8CEF, 0x9BCA, 0xE9C0, - 0x9BCF, 0xE9C3, 0x9BD1, 0xE9C4, 0x9BD2, 0xE9C5, 0x9BD4, 0xE9C9, - 0x9BD6, 0x8E49, 0x9BDB, 0x91E2, 0x9BE1, 0xE9CA, 0x9BE2, 0xE9C7, - 0x9BE3, 0xE9C6, 0x9BE4, 0xE9C8, 0x9BE8, 0x8C7E, 0x9BF0, 0xE9CE, - 0x9BF1, 0xE9CD, 0x9BF2, 0xE9CC, 0x9BF5, 0x88B1, 0x9C00, 0xFC46, - 0x9C04, 0xE9D8, 0x9C06, 0xE9D4, 0x9C08, 0xE9D5, 0x9C09, 0xE9D1, - 0x9C0A, 0xE9D7, 0x9C0C, 0xE9D3, 0x9C0D, 0x8A82, 0x9C10, 0x986B, - 0x9C12, 0xE9D6, 0x9C13, 0xE9D2, 0x9C14, 0xE9D0, 0x9C15, 0xE9CF, - 0x9C1B, 0xE9DA, 0x9C21, 0xE9DD, 0x9C24, 0xE9DC, 0x9C25, 0xE9DB, - 0x9C2D, 0x9568, 0x9C2E, 0xE9D9, 0x9C2F, 0x88F1, 0x9C30, 0xE9DE, - 0x9C32, 0xE9E0, 0x9C39, 0x8A8F, 0x9C3A, 0xE9CB, 0x9C3B, 0x8956, - 0x9C3E, 0xE9E2, 0x9C46, 0xE9E1, 0x9C47, 0xE9DF, 0x9C48, 0x924C, - 0x9C52, 0x9690, 0x9C57, 0x97D8, 0x9C5A, 0xE9E3, 0x9C60, 0xE9E4, - 0x9C67, 0xE9E5, 0x9C76, 0xE9E6, 0x9C78, 0xE9E7, 0x9CE5, 0x92B9, - 0x9CE7, 0xE9E8, 0x9CE9, 0x94B5, 0x9CEB, 0xE9ED, 0x9CEC, 0xE9E9, - 0x9CF0, 0xE9EA, 0x9CF3, 0x9650, 0x9CF4, 0x96C2, 0x9CF6, 0x93CE, - 0x9D03, 0xE9EE, 0x9D06, 0xE9EF, 0x9D07, 0x93BC, 0x9D08, 0xE9EC, - 0x9D09, 0xE9EB, 0x9D0E, 0x89A8, 0x9D12, 0xE9F7, 0x9D15, 0xE9F6, - 0x9D1B, 0x8995, 0x9D1F, 0xE9F4, 0x9D23, 0xE9F3, 0x9D26, 0xE9F1, - 0x9D28, 0x8A9B, 0x9D2A, 0xE9F0, 0x9D2B, 0x8EB0, 0x9D2C, 0x89A7, - 0x9D3B, 0x8D83, 0x9D3E, 0xE9FA, 0x9D3F, 0xE9F9, 0x9D41, 0xE9F8, - 0x9D44, 0xE9F5, 0x9D46, 0xE9FB, 0x9D48, 0xE9FC, 0x9D50, 0xEA44, - 0x9D51, 0xEA43, 0x9D59, 0xEA45, 0x9D5C, 0x894C, 0x9D5D, 0xEA40, - 0x9D5E, 0xEA41, 0x9D60, 0x8D94, 0x9D61, 0x96B7, 0x9D64, 0xEA42, - 0x9D6B, 0xFC48, 0x9D6C, 0x9651, 0x9D6F, 0xEA4A, 0x9D70, 0xFC47, - 0x9D72, 0xEA46, 0x9D7A, 0xEA4B, 0x9D87, 0xEA48, 0x9D89, 0xEA47, - 0x9D8F, 0x8C7B, 0x9D9A, 0xEA4C, 0x9DA4, 0xEA4D, 0x9DA9, 0xEA4E, - 0x9DAB, 0xEA49, 0x9DAF, 0xE9F2, 0x9DB2, 0xEA4F, 0x9DB4, 0x92DF, - 0x9DB8, 0xEA53, 0x9DBA, 0xEA54, 0x9DBB, 0xEA52, 0x9DC1, 0xEA51, - 0x9DC2, 0xEA57, 0x9DC4, 0xEA50, 0x9DC6, 0xEA55, 0x9DCF, 0xEA56, - 0x9DD3, 0xEA59, 0x9DD9, 0xEA58, 0x9DE6, 0xEA5B, 0x9DED, 0xEA5C, - 0x9DEF, 0xEA5D, 0x9DF2, 0x9868, 0x9DF8, 0xEA5A, 0x9DF9, 0x91E9, - 0x9DFA, 0x8DEB, 0x9DFD, 0xEA5E, 0x9E19, 0xFC4A, 0x9E1A, 0xEA5F, - 0x9E1B, 0xEA60, 0x9E1E, 0xEA61, 0x9E75, 0xEA62, 0x9E78, 0x8CB2, - 0x9E79, 0xEA63, 0x9E7D, 0xEA64, 0x9E7F, 0x8EAD, 0x9E81, 0xEA65, - 0x9E88, 0xEA66, 0x9E8B, 0xEA67, 0x9E8C, 0xEA68, 0x9E91, 0xEA6B, - 0x9E92, 0xEA69, 0x9E93, 0x985B, 0x9E95, 0xEA6A, 0x9E97, 0x97ED, - 0x9E9D, 0xEA6C, 0x9E9F, 0x97D9, 0x9EA5, 0xEA6D, 0x9EA6, 0x949E, - 0x9EA9, 0xEA6E, 0x9EAA, 0xEA70, 0x9EAD, 0xEA71, 0x9EB8, 0xEA6F, - 0x9EB9, 0x8D8D, 0x9EBA, 0x96CB, 0x9EBB, 0x9683, 0x9EBC, 0x9BF5, - 0x9EBE, 0x9F80, 0x9EBF, 0x969B, 0x9EC4, 0x89A9, 0x9ECC, 0xEA73, - 0x9ECD, 0x8B6F, 0x9ECE, 0xEA74, 0x9ECF, 0xEA75, 0x9ED0, 0xEA76, - 0x9ED1, 0xFC4B, 0x9ED2, 0x8D95, 0x9ED4, 0xEA77, 0x9ED8, 0xE0D2, - 0x9ED9, 0x96D9, 0x9EDB, 0x91E1, 0x9EDC, 0xEA78, 0x9EDD, 0xEA7A, - 0x9EDE, 0xEA79, 0x9EE0, 0xEA7B, 0x9EE5, 0xEA7C, 0x9EE8, 0xEA7D, - 0x9EEF, 0xEA7E, 0x9EF4, 0xEA80, 0x9EF6, 0xEA81, 0x9EF7, 0xEA82, - 0x9EF9, 0xEA83, 0x9EFB, 0xEA84, 0x9EFC, 0xEA85, 0x9EFD, 0xEA86, - 0x9F07, 0xEA87, 0x9F08, 0xEA88, 0x9F0E, 0x9343, 0x9F13, 0x8CDB, - 0x9F15, 0xEA8A, 0x9F20, 0x916C, 0x9F21, 0xEA8B, 0x9F2C, 0xEA8C, - 0x9F3B, 0x9540, 0x9F3E, 0xEA8D, 0x9F4A, 0xEA8E, 0x9F4B, 0xE256, - 0x9F4E, 0xE6D8, 0x9F4F, 0xE8EB, 0x9F52, 0xEA8F, 0x9F54, 0xEA90, - 0x9F5F, 0xEA92, 0x9F60, 0xEA93, 0x9F61, 0xEA94, 0x9F62, 0x97EE, - 0x9F63, 0xEA91, 0x9F66, 0xEA95, 0x9F67, 0xEA96, 0x9F6A, 0xEA98, - 0x9F6C, 0xEA97, 0x9F72, 0xEA9A, 0x9F76, 0xEA9B, 0x9F77, 0xEA99, - 0x9F8D, 0x97B4, 0x9F95, 0xEA9C, 0x9F9C, 0xEA9D, 0x9F9D, 0xE273, - 0x9FA0, 0xEA9E, 0xF929, 0xFAE0, 0xF9DC, 0xFBE9, 0xFA0E, 0xFA90, - 0xFA0F, 0xFA9B, 0xFA10, 0xFA9C, 0xFA11, 0xFAB1, 0xFA12, 0xFAD8, - 0xFA13, 0xFAE8, 0xFA14, 0xFAEA, 0xFA15, 0xFB58, 0xFA16, 0xFB5E, - 0xFA17, 0xFB75, 0xFA18, 0xFB7D, 0xFA19, 0xFB7E, 0xFA1A, 0xFB80, - 0xFA1B, 0xFB82, 0xFA1C, 0xFB86, 0xFA1D, 0xFB89, 0xFA1E, 0xFB92, - 0xFA1F, 0xFB9D, 0xFA20, 0xFB9F, 0xFA21, 0xFBA0, 0xFA22, 0xFBA9, - 0xFA23, 0xFBB1, 0xFA24, 0xFBB3, 0xFA25, 0xFBB4, 0xFA26, 0xFBB7, - 0xFA27, 0xFBD3, 0xFA28, 0xFBDA, 0xFA29, 0xFBEA, 0xFA2A, 0xFBF6, - 0xFA2B, 0xFBF7, 0xFA2C, 0xFBF9, 0xFA2D, 0xFC49, 0xFF01, 0x8149, - 0xFF02, 0xFA57, 0xFF03, 0x8194, 0xFF04, 0x8190, 0xFF05, 0x8193, - 0xFF06, 0x8195, 0xFF07, 0xFA56, 0xFF08, 0x8169, 0xFF09, 0x816A, - 0xFF0A, 0x8196, 0xFF0B, 0x817B, 0xFF0C, 0x8143, 0xFF0D, 0x817C, - 0xFF0E, 0x8144, 0xFF0F, 0x815E, 0xFF10, 0x824F, 0xFF11, 0x8250, - 0xFF12, 0x8251, 0xFF13, 0x8252, 0xFF14, 0x8253, 0xFF15, 0x8254, - 0xFF16, 0x8255, 0xFF17, 0x8256, 0xFF18, 0x8257, 0xFF19, 0x8258, - 0xFF1A, 0x8146, 0xFF1B, 0x8147, 0xFF1C, 0x8183, 0xFF1D, 0x8181, - 0xFF1E, 0x8184, 0xFF1F, 0x8148, 0xFF20, 0x8197, 0xFF21, 0x8260, - 0xFF22, 0x8261, 0xFF23, 0x8262, 0xFF24, 0x8263, 0xFF25, 0x8264, - 0xFF26, 0x8265, 0xFF27, 0x8266, 0xFF28, 0x8267, 0xFF29, 0x8268, - 0xFF2A, 0x8269, 0xFF2B, 0x826A, 0xFF2C, 0x826B, 0xFF2D, 0x826C, - 0xFF2E, 0x826D, 0xFF2F, 0x826E, 0xFF30, 0x826F, 0xFF31, 0x8270, - 0xFF32, 0x8271, 0xFF33, 0x8272, 0xFF34, 0x8273, 0xFF35, 0x8274, - 0xFF36, 0x8275, 0xFF37, 0x8276, 0xFF38, 0x8277, 0xFF39, 0x8278, - 0xFF3A, 0x8279, 0xFF3B, 0x816D, 0xFF3C, 0x815F, 0xFF3D, 0x816E, - 0xFF3E, 0x814F, 0xFF3F, 0x8151, 0xFF40, 0x814D, 0xFF41, 0x8281, - 0xFF42, 0x8282, 0xFF43, 0x8283, 0xFF44, 0x8284, 0xFF45, 0x8285, - 0xFF46, 0x8286, 0xFF47, 0x8287, 0xFF48, 0x8288, 0xFF49, 0x8289, - 0xFF4A, 0x828A, 0xFF4B, 0x828B, 0xFF4C, 0x828C, 0xFF4D, 0x828D, - 0xFF4E, 0x828E, 0xFF4F, 0x828F, 0xFF50, 0x8290, 0xFF51, 0x8291, - 0xFF52, 0x8292, 0xFF53, 0x8293, 0xFF54, 0x8294, 0xFF55, 0x8295, - 0xFF56, 0x8296, 0xFF57, 0x8297, 0xFF58, 0x8298, 0xFF59, 0x8299, - 0xFF5A, 0x829A, 0xFF5B, 0x816F, 0xFF5C, 0x8162, 0xFF5D, 0x8170, - 0xFF5E, 0x8160, 0xFF61, 0x00A1, 0xFF62, 0x00A2, 0xFF63, 0x00A3, - 0xFF64, 0x00A4, 0xFF65, 0x00A5, 0xFF66, 0x00A6, 0xFF67, 0x00A7, - 0xFF68, 0x00A8, 0xFF69, 0x00A9, 0xFF6A, 0x00AA, 0xFF6B, 0x00AB, - 0xFF6C, 0x00AC, 0xFF6D, 0x00AD, 0xFF6E, 0x00AE, 0xFF6F, 0x00AF, - 0xFF70, 0x00B0, 0xFF71, 0x00B1, 0xFF72, 0x00B2, 0xFF73, 0x00B3, - 0xFF74, 0x00B4, 0xFF75, 0x00B5, 0xFF76, 0x00B6, 0xFF77, 0x00B7, - 0xFF78, 0x00B8, 0xFF79, 0x00B9, 0xFF7A, 0x00BA, 0xFF7B, 0x00BB, - 0xFF7C, 0x00BC, 0xFF7D, 0x00BD, 0xFF7E, 0x00BE, 0xFF7F, 0x00BF, - 0xFF80, 0x00C0, 0xFF81, 0x00C1, 0xFF82, 0x00C2, 0xFF83, 0x00C3, - 0xFF84, 0x00C4, 0xFF85, 0x00C5, 0xFF86, 0x00C6, 0xFF87, 0x00C7, - 0xFF88, 0x00C8, 0xFF89, 0x00C9, 0xFF8A, 0x00CA, 0xFF8B, 0x00CB, - 0xFF8C, 0x00CC, 0xFF8D, 0x00CD, 0xFF8E, 0x00CE, 0xFF8F, 0x00CF, - 0xFF90, 0x00D0, 0xFF91, 0x00D1, 0xFF92, 0x00D2, 0xFF93, 0x00D3, - 0xFF94, 0x00D4, 0xFF95, 0x00D5, 0xFF96, 0x00D6, 0xFF97, 0x00D7, - 0xFF98, 0x00D8, 0xFF99, 0x00D9, 0xFF9A, 0x00DA, 0xFF9B, 0x00DB, - 0xFF9C, 0x00DC, 0xFF9D, 0x00DD, 0xFF9E, 0x00DE, 0xFF9F, 0x00DF, - 0xFFE0, 0x8191, 0xFFE1, 0x8192, 0xFFE2, 0x81CA, 0xFFE3, 0x8150, - 0xFFE4, 0xFA55, 0xFFE5, 0x818F, 0, 0 + 0x309B, 0x814A, 0x309C, 0x814B, 0x309D, 0x8154, 0x309E, 0x8155, + 0x30A1, 0x8340, 0x30A2, 0x8341, 0x30A3, 0x8342, 0x30A4, 0x8343, + 0x30A5, 0x8344, 0x30A6, 0x8345, 0x30A7, 0x8346, 0x30A8, 0x8347, + 0x30A9, 0x8348, 0x30AA, 0x8349, 0x30AB, 0x834A, 0x30AC, 0x834B, + 0x30AD, 0x834C, 0x30AE, 0x834D, 0x30AF, 0x834E, 0x30B0, 0x834F, + 0x30B1, 0x8350, 0x30B2, 0x8351, 0x30B3, 0x8352, 0x30B4, 0x8353, + 0x30B5, 0x8354, 0x30B6, 0x8355, 0x30B7, 0x8356, 0x30B8, 0x8357, + 0x30B9, 0x8358, 0x30BA, 0x8359, 0x30BB, 0x835A, 0x30BC, 0x835B, + 0x30BD, 0x835C, 0x30BE, 0x835D, 0x30BF, 0x835E, 0x30C0, 0x835F, + 0x30C1, 0x8360, 0x30C2, 0x8361, 0x30C3, 0x8362, 0x30C4, 0x8363, + 0x30C5, 0x8364, 0x30C6, 0x8365, 0x30C7, 0x8366, 0x30C8, 0x8367, + 0x30C9, 0x8368, 0x30CA, 0x8369, 0x30CB, 0x836A, 0x30CC, 0x836B, + 0x30CD, 0x836C, 0x30CE, 0x836D, 0x30CF, 0x836E, 0x30D0, 0x836F, + 0x30D1, 0x8370, 0x30D2, 0x8371, 0x30D3, 0x8372, 0x30D4, 0x8373, + 0x30D5, 0x8374, 0x30D6, 0x8375, 0x30D7, 0x8376, 0x30D8, 0x8377, + 0x30D9, 0x8378, 0x30DA, 0x8379, 0x30DB, 0x837A, 0x30DC, 0x837B, + 0x30DD, 0x837C, 0x30DE, 0x837D, 0x30DF, 0x837E, 0x30E0, 0x8380, + 0x30E1, 0x8381, 0x30E2, 0x8382, 0x30E3, 0x8383, 0x30E4, 0x8384, + 0x30E5, 0x8385, 0x30E6, 0x8386, 0x30E7, 0x8387, 0x30E8, 0x8388, + 0x30E9, 0x8389, 0x30EA, 0x838A, 0x30EB, 0x838B, 0x30EC, 0x838C, + 0x30ED, 0x838D, 0x30EE, 0x838E, 0x30EF, 0x838F, 0x30F0, 0x8390, + 0x30F1, 0x8391, 0x30F2, 0x8392, 0x30F3, 0x8393, 0x30F4, 0x8394, + 0x30F5, 0x8395, 0x30F6, 0x8396, 0x30FB, 0x8145, 0x30FC, 0x815B, + 0x30FD, 0x8152, 0x30FE, 0x8153, 0x3231, 0x878A, 0x3232, 0x878B, + 0x3239, 0x878C, 0x32A4, 0x8785, 0x32A5, 0x8786, 0x32A6, 0x8787, + 0x32A7, 0x8788, 0x32A8, 0x8789, 0x3303, 0x8765, 0x330D, 0x8769, + 0x3314, 0x8760, 0x3318, 0x8763, 0x3322, 0x8761, 0x3323, 0x876B, + 0x3326, 0x876A, 0x3327, 0x8764, 0x332B, 0x876C, 0x3336, 0x8766, + 0x333B, 0x876E, 0x3349, 0x875F, 0x334A, 0x876D, 0x334D, 0x8762, + 0x3351, 0x8767, 0x3357, 0x8768, 0x337B, 0x877E, 0x337C, 0x878F, + 0x337D, 0x878E, 0x337E, 0x878D, 0x338E, 0x8772, 0x338F, 0x8773, + 0x339C, 0x876F, 0x339D, 0x8770, 0x339E, 0x8771, 0x33A1, 0x8775, + 0x33C4, 0x8774, 0x33CD, 0x8783, 0x4E00, 0x88EA, 0x4E01, 0x929A, + 0x4E03, 0x8EB5, 0x4E07, 0x969C, 0x4E08, 0x8FE4, 0x4E09, 0x8E4F, + 0x4E0A, 0x8FE3, 0x4E0B, 0x89BA, 0x4E0D, 0x9573, 0x4E0E, 0x975E, + 0x4E10, 0x98A0, 0x4E11, 0x894E, 0x4E14, 0x8A8E, 0x4E15, 0x98A1, + 0x4E16, 0x90A2, 0x4E17, 0x99C0, 0x4E18, 0x8B75, 0x4E19, 0x95B8, + 0x4E1E, 0x8FE5, 0x4E21, 0x97BC, 0x4E26, 0x95C0, 0x4E28, 0xFA68, + 0x4E2A, 0x98A2, 0x4E2D, 0x9286, 0x4E31, 0x98A3, 0x4E32, 0x8BF8, + 0x4E36, 0x98A4, 0x4E38, 0x8ADB, 0x4E39, 0x924F, 0x4E3B, 0x8EE5, + 0x4E3C, 0x98A5, 0x4E3F, 0x98A6, 0x4E42, 0x98A7, 0x4E43, 0x9454, + 0x4E45, 0x8B76, 0x4E4B, 0x9456, 0x4E4D, 0x93E1, 0x4E4E, 0x8CC1, + 0x4E4F, 0x9652, 0x4E55, 0xE568, 0x4E56, 0x98A8, 0x4E57, 0x8FE6, + 0x4E58, 0x98A9, 0x4E59, 0x89B3, 0x4E5D, 0x8BE3, 0x4E5E, 0x8CEE, + 0x4E5F, 0x96E7, 0x4E62, 0x9BA4, 0x4E71, 0x9790, 0x4E73, 0x93FB, + 0x4E7E, 0x8AA3, 0x4E80, 0x8B54, 0x4E82, 0x98AA, 0x4E85, 0x98AB, + 0x4E86, 0x97B9, 0x4E88, 0x975C, 0x4E89, 0x9188, 0x4E8A, 0x98AD, + 0x4E8B, 0x8E96, 0x4E8C, 0x93F1, 0x4E8E, 0x98B0, 0x4E91, 0x895D, + 0x4E92, 0x8CDD, 0x4E94, 0x8CDC, 0x4E95, 0x88E4, 0x4E98, 0x986A, + 0x4E99, 0x9869, 0x4E9B, 0x8DB1, 0x4E9C, 0x889F, 0x4E9E, 0x98B1, + 0x4E9F, 0x98B2, 0x4EA0, 0x98B3, 0x4EA1, 0x9653, 0x4EA2, 0x98B4, + 0x4EA4, 0x8CF0, 0x4EA5, 0x88E5, 0x4EA6, 0x9692, 0x4EA8, 0x8B9C, + 0x4EAB, 0x8B9D, 0x4EAC, 0x8B9E, 0x4EAD, 0x92E0, 0x4EAE, 0x97BA, + 0x4EB0, 0x98B5, 0x4EB3, 0x98B6, 0x4EB6, 0x98B7, 0x4EBA, 0x906C, + 0x4EC0, 0x8F59, 0x4EC1, 0x906D, 0x4EC2, 0x98BC, 0x4EC4, 0x98BA, + 0x4EC6, 0x98BB, 0x4EC7, 0x8B77, 0x4ECA, 0x8DA1, 0x4ECB, 0x89EE, + 0x4ECD, 0x98B9, 0x4ECE, 0x98B8, 0x4ECF, 0x95A7, 0x4ED4, 0x8E65, + 0x4ED5, 0x8E64, 0x4ED6, 0x91BC, 0x4ED7, 0x98BD, 0x4ED8, 0x9574, + 0x4ED9, 0x90E5, 0x4EDD, 0x8157, 0x4EDE, 0x98BE, 0x4EDF, 0x98C0, + 0x4EE1, 0xFA69, 0x4EE3, 0x91E3, 0x4EE4, 0x97DF, 0x4EE5, 0x88C8, + 0x4EED, 0x98BF, 0x4EEE, 0x89BC, 0x4EF0, 0x8BC2, 0x4EF2, 0x9287, + 0x4EF6, 0x8C8F, 0x4EF7, 0x98C1, 0x4EFB, 0x9443, 0x4EFC, 0xFA6A, + 0x4F00, 0xFA6B, 0x4F01, 0x8AE9, 0x4F03, 0xFA6C, 0x4F09, 0x98C2, + 0x4F0A, 0x88C9, 0x4F0D, 0x8CDE, 0x4F0E, 0x8AEA, 0x4F0F, 0x959A, + 0x4F10, 0x94B0, 0x4F11, 0x8B78, 0x4F1A, 0x89EF, 0x4F1C, 0x98E5, + 0x4F1D, 0x9360, 0x4F2F, 0x948C, 0x4F30, 0x98C4, 0x4F34, 0x94BA, + 0x4F36, 0x97E0, 0x4F38, 0x904C, 0x4F39, 0xFA6D, 0x4F3A, 0x8E66, + 0x4F3C, 0x8E97, 0x4F3D, 0x89BE, 0x4F43, 0x92CF, 0x4F46, 0x9241, + 0x4F47, 0x98C8, 0x4F4D, 0x88CA, 0x4F4E, 0x92E1, 0x4F4F, 0x8F5A, + 0x4F50, 0x8DB2, 0x4F51, 0x9743, 0x4F53, 0x91CC, 0x4F55, 0x89BD, + 0x4F56, 0xFA6E, 0x4F57, 0x98C7, 0x4F59, 0x975D, 0x4F5A, 0x98C3, + 0x4F5B, 0x98C5, 0x4F5C, 0x8DEC, 0x4F5D, 0x98C6, 0x4F5E, 0x9B43, + 0x4F69, 0x98CE, 0x4F6F, 0x98D1, 0x4F70, 0x98CF, 0x4F73, 0x89C0, + 0x4F75, 0x95B9, 0x4F76, 0x98C9, 0x4F7B, 0x98CD, 0x4F7C, 0x8CF1, + 0x4F7F, 0x8E67, 0x4F83, 0x8AA4, 0x4F86, 0x98D2, 0x4F88, 0x98CA, + 0x4F8A, 0xFA70, 0x4F8B, 0x97E1, 0x4F8D, 0x8E98, 0x4F8F, 0x98CB, + 0x4F91, 0x98D0, 0x4F92, 0xFA6F, 0x4F94, 0xFA72, 0x4F96, 0x98D3, + 0x4F98, 0x98CC, 0x4F9A, 0xFA71, 0x4F9B, 0x8B9F, 0x4F9D, 0x88CB, + 0x4FA0, 0x8BA0, 0x4FA1, 0x89BF, 0x4FAB, 0x9B44, 0x4FAD, 0x9699, + 0x4FAE, 0x958E, 0x4FAF, 0x8CF2, 0x4FB5, 0x904E, 0x4FB6, 0x97B5, + 0x4FBF, 0x95D6, 0x4FC2, 0x8C57, 0x4FC3, 0x91A3, 0x4FC4, 0x89E2, + 0x4FC9, 0xFA61, 0x4FCA, 0x8F72, 0x4FCD, 0xFA73, 0x4FCE, 0x98D7, + 0x4FD0, 0x98DC, 0x4FD1, 0x98DA, 0x4FD4, 0x98D5, 0x4FD7, 0x91AD, + 0x4FD8, 0x98D8, 0x4FDA, 0x98DB, 0x4FDB, 0x98D9, 0x4FDD, 0x95DB, + 0x4FDF, 0x98D6, 0x4FE1, 0x904D, 0x4FE3, 0x9693, 0x4FE4, 0x98DD, + 0x4FE5, 0x98DE, 0x4FEE, 0x8F43, 0x4FEF, 0x98EB, 0x4FF3, 0x946F, + 0x4FF5, 0x9555, 0x4FF6, 0x98E6, 0x4FF8, 0x95EE, 0x4FFA, 0x89B4, + 0x4FFE, 0x98EA, 0x4FFF, 0xFA76, 0x5005, 0x98E4, 0x5006, 0x98ED, + 0x5009, 0x9171, 0x500B, 0x8CC2, 0x500D, 0x947B, 0x500F, 0xE0C5, + 0x5011, 0x98EC, 0x5012, 0x937C, 0x5014, 0x98E1, 0x5016, 0x8CF4, + 0x5019, 0x8CF3, 0x501A, 0x98DF, 0x501E, 0xFA77, 0x501F, 0x8ED8, + 0x5021, 0x98E7, 0x5022, 0xFA75, 0x5023, 0x95ED, 0x5024, 0x926C, + 0x5025, 0x98E3, 0x5026, 0x8C91, 0x5028, 0x98E0, 0x5029, 0x98E8, + 0x502A, 0x98E2, 0x502B, 0x97CF, 0x502C, 0x98E9, 0x502D, 0x9860, + 0x5036, 0x8BE4, 0x5039, 0x8C90, 0x5040, 0xFA74, 0x5042, 0xFA7A, + 0x5043, 0x98EE, 0x5046, 0xFA78, 0x5047, 0x98EF, 0x5048, 0x98F3, + 0x5049, 0x88CC, 0x504F, 0x95CE, 0x5050, 0x98F2, 0x5055, 0x98F1, + 0x5056, 0x98F5, 0x505A, 0x98F4, 0x505C, 0x92E2, 0x5065, 0x8C92, + 0x506C, 0x98F6, 0x5070, 0xFA79, 0x5072, 0x8EC3, 0x5074, 0x91A4, + 0x5075, 0x92E3, 0x5076, 0x8BF4, 0x5078, 0x98F7, 0x507D, 0x8B55, + 0x5080, 0x98F8, 0x5085, 0x98FA, 0x508D, 0x9654, 0x5091, 0x8C86, + 0x5094, 0xFA7B, 0x5098, 0x8E50, 0x5099, 0x94F5, 0x509A, 0x98F9, + 0x50AC, 0x8DC3, 0x50AD, 0x9762, 0x50B2, 0x98FC, 0x50B3, 0x9942, + 0x50B4, 0x98FB, 0x50B5, 0x8DC2, 0x50B7, 0x8F9D, 0x50BE, 0x8C58, + 0x50C2, 0x9943, 0x50C5, 0x8BCD, 0x50C9, 0x9940, 0x50CA, 0x9941, + 0x50CD, 0x93AD, 0x50CF, 0x919C, 0x50D1, 0x8BA1, 0x50D5, 0x966C, + 0x50D6, 0x9944, 0x50D8, 0xFA7D, 0x50DA, 0x97BB, 0x50DE, 0x9945, + 0x50E3, 0x9948, 0x50E5, 0x9946, 0x50E7, 0x916D, 0x50ED, 0x9947, + 0x50EE, 0x9949, 0x50F4, 0xFA7C, 0x50F5, 0x994B, 0x50F9, 0x994A, + 0x50FB, 0x95C6, 0x5100, 0x8B56, 0x5101, 0x994D, 0x5102, 0x994E, + 0x5104, 0x89AD, 0x5109, 0x994C, 0x5112, 0x8EF2, 0x5114, 0x9951, + 0x5115, 0x9950, 0x5116, 0x994F, 0x5118, 0x98D4, 0x511A, 0x9952, + 0x511F, 0x8F9E, 0x5121, 0x9953, 0x512A, 0x9744, 0x5132, 0x96D7, + 0x5137, 0x9955, 0x513A, 0x9954, 0x513B, 0x9957, 0x513C, 0x9956, + 0x513F, 0x9958, 0x5140, 0x9959, 0x5141, 0x88F2, 0x5143, 0x8CB3, + 0x5144, 0x8C5A, 0x5145, 0x8F5B, 0x5146, 0x929B, 0x5147, 0x8BA2, + 0x5148, 0x90E6, 0x5149, 0x8CF5, 0x514A, 0xFA7E, 0x514B, 0x8D8E, + 0x514C, 0x995B, 0x514D, 0x96C6, 0x514E, 0x9365, 0x5150, 0x8E99, + 0x5152, 0x995A, 0x5154, 0x995C, 0x515A, 0x937D, 0x515C, 0x8A95, + 0x5162, 0x995D, 0x5164, 0xFA80, 0x5165, 0x93FC, 0x5168, 0x9153, + 0x5169, 0x995F, 0x516A, 0x9960, 0x516B, 0x94AA, 0x516C, 0x8CF6, + 0x516D, 0x985A, 0x516E, 0x9961, 0x5171, 0x8BA4, 0x5175, 0x95BA, + 0x5176, 0x91B4, 0x5177, 0x8BEF, 0x5178, 0x9354, 0x517C, 0x8C93, + 0x5180, 0x9962, 0x5182, 0x9963, 0x5185, 0x93E0, 0x5186, 0x897E, + 0x5189, 0x9966, 0x518A, 0x8DFB, 0x518C, 0x9965, 0x518D, 0x8DC4, + 0x518F, 0x9967, 0x5190, 0xE3EC, 0x5191, 0x9968, 0x5192, 0x9660, + 0x5193, 0x9969, 0x5195, 0x996A, 0x5196, 0x996B, 0x5197, 0x8FE7, + 0x5199, 0x8ECA, 0x519D, 0xFA81, 0x51A0, 0x8AA5, 0x51A2, 0x996E, + 0x51A4, 0x996C, 0x51A5, 0x96BB, 0x51A6, 0x996D, 0x51A8, 0x9579, + 0x51A9, 0x996F, 0x51AA, 0x9970, 0x51AB, 0x9971, 0x51AC, 0x937E, + 0x51B0, 0x9975, 0x51B1, 0x9973, 0x51B2, 0x9974, 0x51B3, 0x9972, + 0x51B4, 0x8DE1, 0x51B5, 0x9976, 0x51B6, 0x96E8, 0x51B7, 0x97E2, + 0x51BD, 0x9977, 0x51BE, 0xFA82, 0x51C4, 0x90A6, 0x51C5, 0x9978, + 0x51C6, 0x8F79, 0x51C9, 0x9979, 0x51CB, 0x929C, 0x51CC, 0x97BD, + 0x51CD, 0x9380, 0x51D6, 0x99C3, 0x51DB, 0x997A, 0x51DC, 0xEAA3, + 0x51DD, 0x8BC3, 0x51E0, 0x997B, 0x51E1, 0x967D, 0x51E6, 0x8F88, + 0x51E7, 0x91FA, 0x51E9, 0x997D, 0x51EA, 0x93E2, 0x51EC, 0xFA83, + 0x51ED, 0x997E, 0x51F0, 0x9980, 0x51F1, 0x8A4D, 0x51F5, 0x9981, + 0x51F6, 0x8BA5, 0x51F8, 0x93CA, 0x51F9, 0x899A, 0x51FA, 0x8F6F, + 0x51FD, 0x949F, 0x51FE, 0x9982, 0x5200, 0x9381, 0x5203, 0x906E, + 0x5204, 0x9983, 0x5206, 0x95AA, 0x5207, 0x90D8, 0x5208, 0x8AA0, + 0x520A, 0x8AA7, 0x520B, 0x9984, 0x520E, 0x9986, 0x5211, 0x8C59, + 0x5214, 0x9985, 0x5215, 0xFA84, 0x5217, 0x97F1, 0x521D, 0x8F89, + 0x5224, 0x94BB, 0x5225, 0x95CA, 0x5227, 0x9987, 0x5229, 0x9798, + 0x522A, 0x9988, 0x522E, 0x9989, 0x5230, 0x939E, 0x5233, 0x998A, + 0x5236, 0x90A7, 0x5237, 0x8DFC, 0x5238, 0x8C94, 0x5239, 0x998B, + 0x523A, 0x8E68, 0x523B, 0x8D8F, 0x5243, 0x92E4, 0x5244, 0x998D, + 0x5247, 0x91A5, 0x524A, 0x8DED, 0x524B, 0x998E, 0x524C, 0x998F, + 0x524D, 0x914F, 0x524F, 0x998C, 0x5254, 0x9991, 0x5256, 0x9655, + 0x525B, 0x8D84, 0x525E, 0x9990, 0x5263, 0x8C95, 0x5264, 0x8DDC, + 0x5265, 0x948D, 0x5269, 0x9994, 0x526A, 0x9992, 0x526F, 0x959B, + 0x5270, 0x8FE8, 0x5271, 0x999B, 0x5272, 0x8A84, 0x5273, 0x9995, + 0x5274, 0x9993, 0x5275, 0x916E, 0x527D, 0x9997, 0x527F, 0x9996, + 0x5283, 0x8A63, 0x5287, 0x8C80, 0x5288, 0x999C, 0x5289, 0x97AB, + 0x528D, 0x9998, 0x5291, 0x999D, 0x5292, 0x999A, 0x5294, 0x9999, + 0x529B, 0x97CD, 0x529C, 0xFA85, 0x529F, 0x8CF7, 0x52A0, 0x89C1, + 0x52A3, 0x97F2, 0x52A6, 0xFA86, 0x52A9, 0x8F95, 0x52AA, 0x9377, + 0x52AB, 0x8D85, 0x52AC, 0x99A0, 0x52AD, 0x99A1, 0x52AF, 0xFB77, + 0x52B1, 0x97E3, 0x52B4, 0x984A, 0x52B5, 0x99A3, 0x52B9, 0x8CF8, + 0x52BC, 0x99A2, 0x52BE, 0x8A4E, 0x52C0, 0xFA87, 0x52C1, 0x99A4, + 0x52C3, 0x9675, 0x52C5, 0x92BA, 0x52C7, 0x9745, 0x52C9, 0x95D7, + 0x52CD, 0x99A5, 0x52D2, 0xE8D3, 0x52D5, 0x93AE, 0x52D7, 0x99A6, + 0x52D8, 0x8AA8, 0x52D9, 0x96B1, 0x52DB, 0xFA88, 0x52DD, 0x8F9F, + 0x52DE, 0x99A7, 0x52DF, 0x95E5, 0x52E0, 0x99AB, 0x52E2, 0x90A8, + 0x52E3, 0x99A8, 0x52E4, 0x8BCE, 0x52E6, 0x99A9, 0x52E7, 0x8AA9, + 0x52F2, 0x8C4D, 0x52F3, 0x99AC, 0x52F5, 0x99AD, 0x52F8, 0x99AE, + 0x52F9, 0x99AF, 0x52FA, 0x8ED9, 0x52FE, 0x8CF9, 0x52FF, 0x96DC, + 0x5300, 0xFA89, 0x5301, 0x96E6, 0x5302, 0x93F5, 0x5305, 0x95EF, + 0x5306, 0x99B0, 0x5307, 0xFA8A, 0x5308, 0x99B1, 0x530D, 0x99B3, + 0x530F, 0x99B5, 0x5310, 0x99B4, 0x5315, 0x99B6, 0x5316, 0x89BB, + 0x5317, 0x966B, 0x5319, 0x8DFA, 0x531A, 0x99B7, 0x531D, 0x9178, + 0x5320, 0x8FA0, 0x5321, 0x8BA7, 0x5323, 0x99B8, 0x5324, 0xFA8B, + 0x532A, 0x94D9, 0x532F, 0x99B9, 0x5331, 0x99BA, 0x5333, 0x99BB, + 0x5338, 0x99BC, 0x5339, 0x9543, 0x533A, 0x8BE6, 0x533B, 0x88E3, + 0x533F, 0x93BD, 0x5340, 0x99BD, 0x5341, 0x8F5C, 0x5343, 0x90E7, + 0x5345, 0x99BF, 0x5346, 0x99BE, 0x5347, 0x8FA1, 0x5348, 0x8CDF, + 0x5349, 0x99C1, 0x534A, 0x94BC, 0x534D, 0x99C2, 0x5351, 0x94DA, + 0x5352, 0x91B2, 0x5353, 0x91EC, 0x5354, 0x8BA6, 0x5357, 0x93EC, + 0x5358, 0x9250, 0x535A, 0x948E, 0x535C, 0x966D, 0x535E, 0x99C4, + 0x5360, 0x90E8, 0x5366, 0x8C54, 0x5369, 0x99C5, 0x536E, 0x99C6, + 0x536F, 0x894B, 0x5370, 0x88F3, 0x5371, 0x8AEB, 0x5372, 0xFA8C, + 0x5373, 0x91A6, 0x5374, 0x8B70, 0x5375, 0x9791, 0x5377, 0x99C9, + 0x5378, 0x89B5, 0x537B, 0x99C8, 0x537F, 0x8BA8, 0x5382, 0x99CA, + 0x5384, 0x96EF, 0x5393, 0xFA8D, 0x5396, 0x99CB, 0x5398, 0x97D0, + 0x539A, 0x8CFA, 0x539F, 0x8CB4, 0x53A0, 0x99CC, 0x53A5, 0x99CE, + 0x53A6, 0x99CD, 0x53A8, 0x907E, 0x53A9, 0x8958, 0x53AD, 0x897D, + 0x53AE, 0x99CF, 0x53B0, 0x99D0, 0x53B2, 0xFA8E, 0x53B3, 0x8CB5, + 0x53B6, 0x99D1, 0x53BB, 0x8B8E, 0x53C2, 0x8E51, 0x53C3, 0x99D2, + 0x53C8, 0x9694, 0x53C9, 0x8DB3, 0x53CA, 0x8B79, 0x53CB, 0x9746, + 0x53CC, 0x916F, 0x53CD, 0x94BD, 0x53CE, 0x8EFB, 0x53D4, 0x8F66, + 0x53D6, 0x8EE6, 0x53D7, 0x8EF3, 0x53D9, 0x8F96, 0x53DB, 0x94BE, + 0x53DD, 0xFA8F, 0x53DF, 0x99D5, 0x53E1, 0x8962, 0x53E2, 0x9170, + 0x53E3, 0x8CFB, 0x53E4, 0x8CC3, 0x53E5, 0x8BE5, 0x53E8, 0x99D9, + 0x53E9, 0x9240, 0x53EA, 0x91FC, 0x53EB, 0x8BA9, 0x53EC, 0x8FA2, + 0x53ED, 0x99DA, 0x53EE, 0x99D8, 0x53EF, 0x89C2, 0x53F0, 0x91E4, + 0x53F1, 0x8EB6, 0x53F2, 0x8E6A, 0x53F3, 0x8945, 0x53F6, 0x8A90, + 0x53F7, 0x8D86, 0x53F8, 0x8E69, 0x53FA, 0x99DB, 0x5401, 0x99DC, + 0x5403, 0x8B68, 0x5404, 0x8A65, 0x5408, 0x8D87, 0x5409, 0x8B67, + 0x540A, 0x92DD, 0x540B, 0x8944, 0x540C, 0x93AF, 0x540D, 0x96BC, + 0x540E, 0x8D40, 0x540F, 0x9799, 0x5410, 0x9366, 0x5411, 0x8CFC, + 0x541B, 0x8C4E, 0x541D, 0x99E5, 0x541F, 0x8BE1, 0x5420, 0x9669, + 0x5426, 0x94DB, 0x5429, 0x99E4, 0x542B, 0x8ADC, 0x542C, 0x99DF, + 0x542D, 0x99E0, 0x542E, 0x99E2, 0x5436, 0x99E3, 0x5438, 0x8B7A, + 0x5439, 0x9081, 0x543B, 0x95AB, 0x543C, 0x99E1, 0x543D, 0x99DD, + 0x543E, 0x8CE1, 0x5440, 0x99DE, 0x5442, 0x9843, 0x5446, 0x95F0, + 0x5448, 0x92E6, 0x5449, 0x8CE0, 0x544A, 0x8D90, 0x544E, 0x99E6, + 0x5451, 0x93DB, 0x545F, 0x99EA, 0x5468, 0x8EFC, 0x546A, 0x8EF4, + 0x5470, 0x99ED, 0x5471, 0x99EB, 0x5473, 0x96A1, 0x5475, 0x99E8, + 0x5476, 0x99F1, 0x5477, 0x99EC, 0x547B, 0x99EF, 0x547C, 0x8CC4, + 0x547D, 0x96BD, 0x5480, 0x99F0, 0x5484, 0x99F2, 0x5486, 0x99F4, + 0x548A, 0xFA92, 0x548B, 0x8DEE, 0x548C, 0x9861, 0x548E, 0x99E9, + 0x548F, 0x99E7, 0x5490, 0x99F3, 0x5492, 0x99EE, 0x549C, 0xFA91, + 0x54A2, 0x99F6, 0x54A4, 0x9A42, 0x54A5, 0x99F8, 0x54A8, 0x99FC, + 0x54A9, 0xFA93, 0x54AB, 0x9A40, 0x54AC, 0x99F9, 0x54AF, 0x9A5D, + 0x54B2, 0x8DE7, 0x54B3, 0x8A50, 0x54B8, 0x99F7, 0x54BC, 0x9A44, + 0x54BD, 0x88F4, 0x54BE, 0x9A43, 0x54C0, 0x88A3, 0x54C1, 0x9569, + 0x54C2, 0x9A41, 0x54C4, 0x99FA, 0x54C7, 0x99F5, 0x54C8, 0x99FB, + 0x54C9, 0x8DC6, 0x54D8, 0x9A45, 0x54E1, 0x88F5, 0x54E2, 0x9A4E, + 0x54E5, 0x9A46, 0x54E6, 0x9A47, 0x54E8, 0x8FA3, 0x54E9, 0x9689, + 0x54ED, 0x9A4C, 0x54EE, 0x9A4B, 0x54F2, 0x934E, 0x54FA, 0x9A4D, + 0x54FD, 0x9A4A, 0x54FF, 0xFA94, 0x5504, 0x8953, 0x5506, 0x8DB4, + 0x5507, 0x904F, 0x550F, 0x9A48, 0x5510, 0x9382, 0x5514, 0x9A49, + 0x5516, 0x88A0, 0x552E, 0x9A53, 0x552F, 0x9742, 0x5531, 0x8FA5, + 0x5533, 0x9A59, 0x5538, 0x9A58, 0x5539, 0x9A4F, 0x553E, 0x91C1, + 0x5540, 0x9A50, 0x5544, 0x91ED, 0x5545, 0x9A55, 0x5546, 0x8FA4, + 0x554C, 0x9A52, 0x554F, 0x96E2, 0x5553, 0x8C5B, 0x5556, 0x9A56, + 0x5557, 0x9A57, 0x555C, 0x9A54, 0x555D, 0x9A5A, 0x5563, 0x9A51, + 0x557B, 0x9A60, 0x557C, 0x9A65, 0x557E, 0x9A61, 0x5580, 0x9A5C, + 0x5583, 0x9A66, 0x5584, 0x9150, 0x5586, 0xFA95, 0x5587, 0x9A68, + 0x5589, 0x8D41, 0x558A, 0x9A5E, 0x558B, 0x929D, 0x5598, 0x9A62, + 0x5599, 0x9A5B, 0x559A, 0x8AAB, 0x559C, 0x8AEC, 0x559D, 0x8A85, + 0x559E, 0x9A63, 0x559F, 0x9A5F, 0x55A7, 0x8C96, 0x55A8, 0x9A69, + 0x55A9, 0x9A67, 0x55AA, 0x9172, 0x55AB, 0x8B69, 0x55AC, 0x8BAA, + 0x55AE, 0x9A64, 0x55B0, 0x8BF2, 0x55B6, 0x8963, 0x55C4, 0x9A6D, + 0x55C5, 0x9A6B, 0x55C7, 0x9AA5, 0x55D4, 0x9A70, 0x55DA, 0x9A6A, + 0x55DC, 0x9A6E, 0x55DF, 0x9A6C, 0x55E3, 0x8E6B, 0x55E4, 0x9A6F, + 0x55F7, 0x9A72, 0x55F9, 0x9A77, 0x55FD, 0x9A75, 0x55FE, 0x9A74, + 0x5606, 0x9251, 0x5609, 0x89C3, 0x5614, 0x9A71, 0x5616, 0x9A73, + 0x5617, 0x8FA6, 0x5618, 0x8952, 0x561B, 0x9A76, 0x5629, 0x89DC, + 0x562F, 0x9A82, 0x5631, 0x8FFA, 0x5632, 0x9A7D, 0x5634, 0x9A7B, + 0x5636, 0x9A7C, 0x5638, 0x9A7E, 0x5642, 0x895C, 0x564C, 0x9158, + 0x564E, 0x9A78, 0x5650, 0x9A79, 0x565B, 0x8A9A, 0x5664, 0x9A81, + 0x5668, 0x8AED, 0x566A, 0x9A84, 0x566B, 0x9A80, 0x566C, 0x9A83, + 0x5674, 0x95AC, 0x5678, 0x93D3, 0x567A, 0x94B6, 0x5680, 0x9A86, + 0x5686, 0x9A85, 0x5687, 0x8A64, 0x568A, 0x9A87, 0x568F, 0x9A8A, + 0x5694, 0x9A89, 0x56A0, 0x9A88, 0x56A2, 0x9458, 0x56A5, 0x9A8B, + 0x56AE, 0x9A8C, 0x56B4, 0x9A8E, 0x56B6, 0x9A8D, 0x56BC, 0x9A90, + 0x56C0, 0x9A93, 0x56C1, 0x9A91, 0x56C2, 0x9A8F, 0x56C3, 0x9A92, + 0x56C8, 0x9A94, 0x56CE, 0x9A95, 0x56D1, 0x9A96, 0x56D3, 0x9A97, + 0x56D7, 0x9A98, 0x56D8, 0x9964, 0x56DA, 0x8EFA, 0x56DB, 0x8E6C, + 0x56DE, 0x89F1, 0x56E0, 0x88F6, 0x56E3, 0x9263, 0x56EE, 0x9A99, + 0x56F0, 0x8DA2, 0x56F2, 0x88CD, 0x56F3, 0x907D, 0x56F9, 0x9A9A, + 0x56FA, 0x8CC5, 0x56FD, 0x8D91, 0x56FF, 0x9A9C, 0x5700, 0x9A9B, + 0x5703, 0x95DE, 0x5704, 0x9A9D, 0x5708, 0x9A9F, 0x5709, 0x9A9E, + 0x570B, 0x9AA0, 0x570D, 0x9AA1, 0x570F, 0x8C97, 0x5712, 0x8980, + 0x5713, 0x9AA2, 0x5716, 0x9AA4, 0x5718, 0x9AA3, 0x571C, 0x9AA6, + 0x571F, 0x9379, 0x5726, 0x9AA7, 0x5727, 0x88B3, 0x5728, 0x8DDD, + 0x572D, 0x8C5C, 0x5730, 0x926E, 0x5737, 0x9AA8, 0x5738, 0x9AA9, + 0x573B, 0x9AAB, 0x5740, 0x9AAC, 0x5742, 0x8DE2, 0x5747, 0x8BCF, + 0x574A, 0x9656, 0x574E, 0x9AAA, 0x574F, 0x9AAD, 0x5750, 0x8DBF, + 0x5751, 0x8D42, 0x5759, 0xFA96, 0x5761, 0x9AB1, 0x5764, 0x8DA3, + 0x5765, 0xFA97, 0x5766, 0x9252, 0x5769, 0x9AAE, 0x576A, 0x92D8, + 0x577F, 0x9AB2, 0x5782, 0x9082, 0x5788, 0x9AB0, 0x5789, 0x9AB3, + 0x578B, 0x8C5E, 0x5793, 0x9AB4, 0x57A0, 0x9AB5, 0x57A2, 0x8D43, + 0x57A3, 0x8A5F, 0x57A4, 0x9AB7, 0x57AA, 0x9AB8, 0x57AC, 0xFA98, + 0x57B0, 0x9AB9, 0x57B3, 0x9AB6, 0x57C0, 0x9AAF, 0x57C3, 0x9ABA, + 0x57C6, 0x9ABB, 0x57C7, 0xFA9A, 0x57C8, 0xFA99, 0x57CB, 0x9684, + 0x57CE, 0x8FE9, 0x57D2, 0x9ABD, 0x57D3, 0x9ABE, 0x57D4, 0x9ABC, + 0x57D6, 0x9AC0, 0x57DC, 0x9457, 0x57DF, 0x88E6, 0x57E0, 0x9575, + 0x57E3, 0x9AC1, 0x57F4, 0x8FFB, 0x57F7, 0x8EB7, 0x57F9, 0x947C, + 0x57FA, 0x8AEE, 0x57FC, 0x8DE9, 0x5800, 0x9678, 0x5802, 0x93B0, + 0x5805, 0x8C98, 0x5806, 0x91CD, 0x580A, 0x9ABF, 0x580B, 0x9AC2, + 0x5815, 0x91C2, 0x5819, 0x9AC3, 0x581D, 0x9AC4, 0x5821, 0x9AC6, + 0x5824, 0x92E7, 0x582A, 0x8AAC, 0x582F, 0xEA9F, 0x5830, 0x8981, + 0x5831, 0x95F1, 0x5834, 0x8FEA, 0x5835, 0x9367, 0x583A, 0x8DE4, + 0x583D, 0x9ACC, 0x5840, 0x95BB, 0x5841, 0x97DB, 0x584A, 0x89F2, + 0x584B, 0x9AC8, 0x5851, 0x9159, 0x5852, 0x9ACB, 0x5854, 0x9383, + 0x5857, 0x9368, 0x5858, 0x9384, 0x5859, 0x94B7, 0x585A, 0x92CB, + 0x585E, 0x8DC7, 0x5862, 0x9AC7, 0x5869, 0x8996, 0x586B, 0x9355, + 0x5870, 0x9AC9, 0x5872, 0x9AC5, 0x5875, 0x906F, 0x5879, 0x9ACD, + 0x587E, 0x8F6D, 0x5883, 0x8BAB, 0x5885, 0x9ACE, 0x5893, 0x95E6, + 0x5897, 0x919D, 0x589C, 0x92C4, 0x589E, 0xFA9D, 0x589F, 0x9AD0, + 0x58A8, 0x966E, 0x58AB, 0x9AD1, 0x58AE, 0x9AD6, 0x58B2, 0xFA9E, + 0x58B3, 0x95AD, 0x58B8, 0x9AD5, 0x58B9, 0x9ACF, 0x58BA, 0x9AD2, + 0x58BB, 0x9AD4, 0x58BE, 0x8DA4, 0x58C1, 0x95C7, 0x58C5, 0x9AD7, + 0x58C7, 0x9264, 0x58CA, 0x89F3, 0x58CC, 0x8FEB, 0x58D1, 0x9AD9, + 0x58D3, 0x9AD8, 0x58D5, 0x8D88, 0x58D7, 0x9ADA, 0x58D8, 0x9ADC, + 0x58D9, 0x9ADB, 0x58DC, 0x9ADE, 0x58DE, 0x9AD3, 0x58DF, 0x9AE0, + 0x58E4, 0x9ADF, 0x58E5, 0x9ADD, 0x58EB, 0x8E6D, 0x58EC, 0x9070, + 0x58EE, 0x9173, 0x58EF, 0x9AE1, 0x58F0, 0x90BA, 0x58F1, 0x88EB, + 0x58F2, 0x9484, 0x58F7, 0x92D9, 0x58F9, 0x9AE3, 0x58FA, 0x9AE2, + 0x58FB, 0x9AE4, 0x58FC, 0x9AE5, 0x58FD, 0x9AE6, 0x5902, 0x9AE7, + 0x5909, 0x95CF, 0x590A, 0x9AE8, 0x590B, 0xFA9F, 0x590F, 0x89C4, + 0x5910, 0x9AE9, 0x5915, 0x975B, 0x5916, 0x8A4F, 0x5918, 0x99C7, + 0x5919, 0x8F67, 0x591A, 0x91BD, 0x591B, 0x9AEA, 0x591C, 0x96E9, + 0x5922, 0x96B2, 0x5925, 0x9AEC, 0x5927, 0x91E5, 0x5929, 0x9356, + 0x592A, 0x91BE, 0x592B, 0x9576, 0x592C, 0x9AED, 0x592D, 0x9AEE, + 0x592E, 0x899B, 0x5931, 0x8EB8, 0x5932, 0x9AEF, 0x5937, 0x88CE, + 0x5938, 0x9AF0, 0x593E, 0x9AF1, 0x5944, 0x8982, 0x5947, 0x8AEF, + 0x5948, 0x93DE, 0x5949, 0x95F2, 0x594E, 0x9AF5, 0x594F, 0x9174, + 0x5950, 0x9AF4, 0x5951, 0x8C5F, 0x5953, 0xFAA0, 0x5954, 0x967A, + 0x5955, 0x9AF3, 0x5957, 0x9385, 0x5958, 0x9AF7, 0x595A, 0x9AF6, + 0x595B, 0xFAA1, 0x595D, 0xFAA2, 0x5960, 0x9AF9, 0x5962, 0x9AF8, + 0x5963, 0xFAA3, 0x5965, 0x899C, 0x5967, 0x9AFA, 0x5968, 0x8FA7, + 0x5969, 0x9AFC, 0x596A, 0x9244, 0x596C, 0x9AFB, 0x596E, 0x95B1, + 0x5973, 0x8F97, 0x5974, 0x937A, 0x5978, 0x9B40, 0x597D, 0x8D44, + 0x5981, 0x9B41, 0x5982, 0x9440, 0x5983, 0x94DC, 0x5984, 0x96CF, + 0x598A, 0x9444, 0x598D, 0x9B4A, 0x5993, 0x8B57, 0x5996, 0x9764, + 0x5999, 0x96AD, 0x599B, 0x9BAA, 0x599D, 0x9B42, 0x59A3, 0x9B45, + 0x59A4, 0xFAA4, 0x59A5, 0x91C3, 0x59A8, 0x9657, 0x59AC, 0x9369, + 0x59B2, 0x9B46, 0x59B9, 0x9685, 0x59BA, 0xFAA5, 0x59BB, 0x8DC8, + 0x59BE, 0x8FA8, 0x59C6, 0x9B47, 0x59C9, 0x8E6F, 0x59CB, 0x8E6E, + 0x59D0, 0x88B7, 0x59D1, 0x8CC6, 0x59D3, 0x90A9, 0x59D4, 0x88CF, + 0x59D9, 0x9B4B, 0x59DA, 0x9B4C, 0x59DC, 0x9B49, 0x59E5, 0x8957, + 0x59E6, 0x8AAD, 0x59E8, 0x9B48, 0x59EA, 0x96C3, 0x59EB, 0x9550, + 0x59F6, 0x88A6, 0x59FB, 0x88F7, 0x59FF, 0x8E70, 0x5A01, 0x88D0, + 0x5A03, 0x88A1, 0x5A09, 0x9B51, 0x5A11, 0x9B4F, 0x5A18, 0x96BA, + 0x5A1A, 0x9B52, 0x5A1C, 0x9B50, 0x5A1F, 0x9B4E, 0x5A20, 0x9050, + 0x5A25, 0x9B4D, 0x5A29, 0x95D8, 0x5A2F, 0x8CE2, 0x5A35, 0x9B56, + 0x5A36, 0x9B57, 0x5A3C, 0x8FA9, 0x5A40, 0x9B53, 0x5A41, 0x984B, + 0x5A46, 0x946B, 0x5A49, 0x9B55, 0x5A5A, 0x8DA5, 0x5A62, 0x9B58, + 0x5A66, 0x9577, 0x5A6A, 0x9B59, 0x5A6C, 0x9B54, 0x5A7F, 0x96B9, + 0x5A92, 0x947D, 0x5A9A, 0x9B5A, 0x5A9B, 0x9551, 0x5ABC, 0x9B5B, + 0x5ABD, 0x9B5F, 0x5ABE, 0x9B5C, 0x5AC1, 0x89C5, 0x5AC2, 0x9B5E, + 0x5AC9, 0x8EB9, 0x5ACB, 0x9B5D, 0x5ACC, 0x8C99, 0x5AD0, 0x9B6B, + 0x5AD6, 0x9B64, 0x5AD7, 0x9B61, 0x5AE1, 0x9284, 0x5AE3, 0x9B60, + 0x5AE6, 0x9B62, 0x5AE9, 0x9B63, 0x5AFA, 0x9B65, 0x5AFB, 0x9B66, + 0x5B09, 0x8AF0, 0x5B0B, 0x9B68, 0x5B0C, 0x9B67, 0x5B16, 0x9B69, + 0x5B22, 0x8FEC, 0x5B2A, 0x9B6C, 0x5B2C, 0x92DA, 0x5B30, 0x8964, + 0x5B32, 0x9B6A, 0x5B36, 0x9B6D, 0x5B3E, 0x9B6E, 0x5B40, 0x9B71, + 0x5B43, 0x9B6F, 0x5B45, 0x9B70, 0x5B50, 0x8E71, 0x5B51, 0x9B72, + 0x5B54, 0x8D45, 0x5B55, 0x9B73, 0x5B56, 0xFAA6, 0x5B57, 0x8E9A, + 0x5B58, 0x91B6, 0x5B5A, 0x9B74, 0x5B5B, 0x9B75, 0x5B5C, 0x8E79, + 0x5B5D, 0x8D46, 0x5B5F, 0x96D0, 0x5B63, 0x8B47, 0x5B64, 0x8CC7, + 0x5B65, 0x9B76, 0x5B66, 0x8A77, 0x5B69, 0x9B77, 0x5B6B, 0x91B7, + 0x5B70, 0x9B78, 0x5B71, 0x9BA1, 0x5B73, 0x9B79, 0x5B75, 0x9B7A, + 0x5B78, 0x9B7B, 0x5B7A, 0x9B7D, 0x5B80, 0x9B7E, 0x5B83, 0x9B80, + 0x5B85, 0x91EE, 0x5B87, 0x8946, 0x5B88, 0x8EE7, 0x5B89, 0x88C0, + 0x5B8B, 0x9176, 0x5B8C, 0x8AAE, 0x5B8D, 0x8EB3, 0x5B8F, 0x8D47, + 0x5B95, 0x9386, 0x5B97, 0x8F40, 0x5B98, 0x8AAF, 0x5B99, 0x9288, + 0x5B9A, 0x92E8, 0x5B9B, 0x88B6, 0x5B9C, 0x8B58, 0x5B9D, 0x95F3, + 0x5B9F, 0x8EC0, 0x5BA2, 0x8B71, 0x5BA3, 0x90E9, 0x5BA4, 0x8EBA, + 0x5BA5, 0x9747, 0x5BA6, 0x9B81, 0x5BAE, 0x8B7B, 0x5BB0, 0x8DC9, + 0x5BB3, 0x8A51, 0x5BB4, 0x8983, 0x5BB5, 0x8FAA, 0x5BB6, 0x89C6, + 0x5BB8, 0x9B82, 0x5BB9, 0x9765, 0x5BBF, 0x8F68, 0x5BC0, 0xFAA7, + 0x5BC2, 0x8EE2, 0x5BC3, 0x9B83, 0x5BC4, 0x8AF1, 0x5BC5, 0x93D0, + 0x5BC6, 0x96A7, 0x5BC7, 0x9B84, 0x5BC9, 0x9B85, 0x5BCC, 0x9578, + 0x5BD0, 0x9B87, 0x5BD2, 0x8AA6, 0x5BD3, 0x8BF5, 0x5BD4, 0x9B86, + 0x5BD8, 0xFAA9, 0x5BDB, 0x8AB0, 0x5BDD, 0x9051, 0x5BDE, 0x9B8B, + 0x5BDF, 0x8E40, 0x5BE1, 0x89C7, 0x5BE2, 0x9B8A, 0x5BE4, 0x9B88, + 0x5BE5, 0x9B8C, 0x5BE6, 0x9B89, 0x5BE7, 0x944A, 0x5BE8, 0x9ECB, + 0x5BE9, 0x9052, 0x5BEB, 0x9B8D, 0x5BEC, 0xFAAA, 0x5BEE, 0x97BE, + 0x5BF0, 0x9B8E, 0x5BF3, 0x9B90, 0x5BF5, 0x929E, 0x5BF6, 0x9B8F, + 0x5BF8, 0x90A1, 0x5BFA, 0x8E9B, 0x5BFE, 0x91CE, 0x5BFF, 0x8EF5, + 0x5C01, 0x9595, 0x5C02, 0x90EA, 0x5C04, 0x8ECB, 0x5C05, 0x9B91, + 0x5C06, 0x8FAB, 0x5C07, 0x9B92, 0x5C08, 0x9B93, 0x5C09, 0x88D1, + 0x5C0A, 0x91B8, 0x5C0B, 0x9071, 0x5C0D, 0x9B94, 0x5C0E, 0x93B1, + 0x5C0F, 0x8FAC, 0x5C11, 0x8FAD, 0x5C13, 0x9B95, 0x5C16, 0x90EB, + 0x5C1A, 0x8FAE, 0x5C1E, 0xFAAB, 0x5C20, 0x9B96, 0x5C22, 0x9B97, + 0x5C24, 0x96DE, 0x5C28, 0x9B98, 0x5C2D, 0x8BC4, 0x5C31, 0x8F41, + 0x5C38, 0x9B99, 0x5C39, 0x9B9A, 0x5C3A, 0x8EDA, 0x5C3B, 0x904B, + 0x5C3C, 0x93F2, 0x5C3D, 0x9073, 0x5C3E, 0x94F6, 0x5C3F, 0x9441, + 0x5C40, 0x8BC7, 0x5C41, 0x9B9B, 0x5C45, 0x8B8F, 0x5C46, 0x9B9C, + 0x5C48, 0x8BFC, 0x5C4A, 0x93CD, 0x5C4B, 0x89AE, 0x5C4D, 0x8E72, + 0x5C4E, 0x9B9D, 0x5C4F, 0x9BA0, 0x5C50, 0x9B9F, 0x5C51, 0x8BFB, + 0x5C53, 0x9B9E, 0x5C55, 0x9357, 0x5C5E, 0x91AE, 0x5C60, 0x936A, + 0x5C61, 0x8EC6, 0x5C64, 0x9177, 0x5C65, 0x979A, 0x5C6C, 0x9BA2, + 0x5C6E, 0x9BA3, 0x5C6F, 0x93D4, 0x5C71, 0x8E52, 0x5C76, 0x9BA5, + 0x5C79, 0x9BA6, 0x5C8C, 0x9BA7, 0x5C90, 0x8AF2, 0x5C91, 0x9BA8, + 0x5C94, 0x9BA9, 0x5CA1, 0x89AA, 0x5CA6, 0xFAAC, 0x5CA8, 0x915A, + 0x5CA9, 0x8AE2, 0x5CAB, 0x9BAB, 0x5CAC, 0x96A6, 0x5CB1, 0x91D0, + 0x5CB3, 0x8A78, 0x5CB6, 0x9BAD, 0x5CB7, 0x9BAF, 0x5CB8, 0x8ADD, + 0x5CBA, 0xFAAD, 0x5CBB, 0x9BAC, 0x5CBC, 0x9BAE, 0x5CBE, 0x9BB1, + 0x5CC5, 0x9BB0, 0x5CC7, 0x9BB2, 0x5CD9, 0x9BB3, 0x5CE0, 0x93BB, + 0x5CE1, 0x8BAC, 0x5CE8, 0x89E3, 0x5CE9, 0x9BB4, 0x5CEA, 0x9BB9, + 0x5CED, 0x9BB7, 0x5CEF, 0x95F5, 0x5CF0, 0x95F4, 0x5CF5, 0xFAAE, + 0x5CF6, 0x9387, 0x5CFA, 0x9BB6, 0x5CFB, 0x8F73, 0x5CFD, 0x9BB5, + 0x5D07, 0x9092, 0x5D0B, 0x9BBA, 0x5D0E, 0x8DE8, 0x5D11, 0x9BC0, + 0x5D14, 0x9BC1, 0x5D15, 0x9BBB, 0x5D16, 0x8A52, 0x5D17, 0x9BBC, + 0x5D18, 0x9BC5, 0x5D19, 0x9BC4, 0x5D1A, 0x9BC3, 0x5D1B, 0x9BBF, + 0x5D1F, 0x9BBE, 0x5D22, 0x9BC2, 0x5D27, 0xFAAF, 0x5D29, 0x95F6, + 0x5D42, 0xFAB2, 0x5D4B, 0x9BC9, 0x5D4C, 0x9BC6, 0x5D4E, 0x9BC8, + 0x5D50, 0x9792, 0x5D52, 0x9BC7, 0x5D53, 0xFAB0, 0x5D5C, 0x9BBD, + 0x5D69, 0x9093, 0x5D6C, 0x9BCA, 0x5D6D, 0xFAB3, 0x5D6F, 0x8DB5, + 0x5D73, 0x9BCB, 0x5D76, 0x9BCC, 0x5D82, 0x9BCF, 0x5D84, 0x9BCE, + 0x5D87, 0x9BCD, 0x5D8B, 0x9388, 0x5D8C, 0x9BB8, 0x5D90, 0x9BD5, + 0x5D9D, 0x9BD1, 0x5DA2, 0x9BD0, 0x5DAC, 0x9BD2, 0x5DAE, 0x9BD3, + 0x5DB7, 0x9BD6, 0x5DB8, 0xFAB4, 0x5DB9, 0xFAB5, 0x5DBA, 0x97E4, + 0x5DBC, 0x9BD7, 0x5DBD, 0x9BD4, 0x5DC9, 0x9BD8, 0x5DCC, 0x8ADE, + 0x5DCD, 0x9BD9, 0x5DD0, 0xFAB6, 0x5DD2, 0x9BDB, 0x5DD3, 0x9BDA, + 0x5DD6, 0x9BDC, 0x5DDB, 0x9BDD, 0x5DDD, 0x90EC, 0x5DDE, 0x8F42, + 0x5DE1, 0x8F84, 0x5DE3, 0x9183, 0x5DE5, 0x8D48, 0x5DE6, 0x8DB6, + 0x5DE7, 0x8D49, 0x5DE8, 0x8B90, 0x5DEB, 0x9BDE, 0x5DEE, 0x8DB7, + 0x5DF1, 0x8CC8, 0x5DF2, 0x9BDF, 0x5DF3, 0x96A4, 0x5DF4, 0x9462, + 0x5DF5, 0x9BE0, 0x5DF7, 0x8D4A, 0x5DFB, 0x8AAA, 0x5DFD, 0x9246, + 0x5DFE, 0x8BD0, 0x5E02, 0x8E73, 0x5E03, 0x957A, 0x5E06, 0x94BF, + 0x5E0B, 0x9BE1, 0x5E0C, 0x8AF3, 0x5E11, 0x9BE4, 0x5E16, 0x929F, + 0x5E19, 0x9BE3, 0x5E1A, 0x9BE2, 0x5E1B, 0x9BE5, 0x5E1D, 0x92E9, + 0x5E25, 0x9083, 0x5E2B, 0x8E74, 0x5E2D, 0x90C8, 0x5E2F, 0x91D1, + 0x5E30, 0x8B41, 0x5E33, 0x92A0, 0x5E36, 0x9BE6, 0x5E37, 0x9BE7, + 0x5E38, 0x8FED, 0x5E3D, 0x9658, 0x5E40, 0x9BEA, 0x5E43, 0x9BE9, + 0x5E44, 0x9BE8, 0x5E45, 0x959D, 0x5E47, 0x9BF1, 0x5E4C, 0x9679, + 0x5E4E, 0x9BEB, 0x5E54, 0x9BED, 0x5E55, 0x968B, 0x5E57, 0x9BEC, + 0x5E5F, 0x9BEE, 0x5E61, 0x94A6, 0x5E62, 0x9BEF, 0x5E63, 0x95BC, + 0x5E64, 0x9BF0, 0x5E72, 0x8AB1, 0x5E73, 0x95BD, 0x5E74, 0x944E, + 0x5E75, 0x9BF2, 0x5E76, 0x9BF3, 0x5E78, 0x8D4B, 0x5E79, 0x8AB2, + 0x5E7A, 0x9BF4, 0x5E7B, 0x8CB6, 0x5E7C, 0x9763, 0x5E7D, 0x9748, + 0x5E7E, 0x8AF4, 0x5E7F, 0x9BF6, 0x5E81, 0x92A1, 0x5E83, 0x8D4C, + 0x5E84, 0x8FAF, 0x5E87, 0x94DD, 0x5E8A, 0x8FB0, 0x5E8F, 0x8F98, + 0x5E95, 0x92EA, 0x5E96, 0x95F7, 0x5E97, 0x9358, 0x5E9A, 0x8D4D, + 0x5E9C, 0x957B, 0x5EA0, 0x9BF7, 0x5EA6, 0x9378, 0x5EA7, 0x8DC0, + 0x5EAB, 0x8CC9, 0x5EAD, 0x92EB, 0x5EB5, 0x88C1, 0x5EB6, 0x8F8E, + 0x5EB7, 0x8D4E, 0x5EB8, 0x9766, 0x5EC1, 0x9BF8, 0x5EC2, 0x9BF9, + 0x5EC3, 0x9470, 0x5EC8, 0x9BFA, 0x5EC9, 0x97F5, 0x5ECA, 0x984C, + 0x5ECF, 0x9BFC, 0x5ED0, 0x9BFB, 0x5ED3, 0x8A66, 0x5ED6, 0x9C40, + 0x5EDA, 0x9C43, 0x5EDB, 0x9C44, 0x5EDD, 0x9C42, 0x5EDF, 0x955F, + 0x5EE0, 0x8FB1, 0x5EE1, 0x9C46, 0x5EE2, 0x9C45, 0x5EE3, 0x9C41, + 0x5EE8, 0x9C47, 0x5EE9, 0x9C48, 0x5EEC, 0x9C49, 0x5EF0, 0x9C4C, + 0x5EF1, 0x9C4A, 0x5EF3, 0x9C4B, 0x5EF4, 0x9C4D, 0x5EF6, 0x8984, + 0x5EF7, 0x92EC, 0x5EF8, 0x9C4E, 0x5EFA, 0x8C9A, 0x5EFB, 0x89F4, + 0x5EFC, 0x9455, 0x5EFE, 0x9C4F, 0x5EFF, 0x93F9, 0x5F01, 0x95D9, + 0x5F03, 0x9C50, 0x5F04, 0x984D, 0x5F09, 0x9C51, 0x5F0A, 0x95BE, + 0x5F0B, 0x9C54, 0x5F0C, 0x989F, 0x5F0D, 0x98AF, 0x5F0F, 0x8EAE, + 0x5F10, 0x93F3, 0x5F11, 0x9C55, 0x5F13, 0x8B7C, 0x5F14, 0x92A2, + 0x5F15, 0x88F8, 0x5F16, 0x9C56, 0x5F17, 0x95A4, 0x5F18, 0x8D4F, + 0x5F1B, 0x926F, 0x5F1F, 0x92ED, 0x5F21, 0xFAB7, 0x5F25, 0x96ED, + 0x5F26, 0x8CB7, 0x5F27, 0x8CCA, 0x5F29, 0x9C57, 0x5F2D, 0x9C58, + 0x5F2F, 0x9C5E, 0x5F31, 0x8EE3, 0x5F34, 0xFAB8, 0x5F35, 0x92A3, + 0x5F37, 0x8BAD, 0x5F38, 0x9C59, 0x5F3C, 0x954A, 0x5F3E, 0x9265, + 0x5F41, 0x9C5A, 0x5F45, 0xFA67, 0x5F48, 0x9C5B, 0x5F4A, 0x8BAE, + 0x5F4C, 0x9C5C, 0x5F4E, 0x9C5D, 0x5F51, 0x9C5F, 0x5F53, 0x9396, + 0x5F56, 0x9C60, 0x5F57, 0x9C61, 0x5F59, 0x9C62, 0x5F5C, 0x9C53, + 0x5F5D, 0x9C52, 0x5F61, 0x9C63, 0x5F62, 0x8C60, 0x5F66, 0x9546, + 0x5F67, 0xFAB9, 0x5F69, 0x8DCA, 0x5F6A, 0x9556, 0x5F6B, 0x92A4, + 0x5F6C, 0x956A, 0x5F6D, 0x9C64, 0x5F70, 0x8FB2, 0x5F71, 0x8965, + 0x5F73, 0x9C65, 0x5F77, 0x9C66, 0x5F79, 0x96F0, 0x5F7C, 0x94DE, + 0x5F7F, 0x9C69, 0x5F80, 0x899D, 0x5F81, 0x90AA, 0x5F82, 0x9C68, + 0x5F83, 0x9C67, 0x5F84, 0x8C61, 0x5F85, 0x91D2, 0x5F87, 0x9C6D, + 0x5F88, 0x9C6B, 0x5F8A, 0x9C6A, 0x5F8B, 0x97A5, 0x5F8C, 0x8CE3, + 0x5F90, 0x8F99, 0x5F91, 0x9C6C, 0x5F92, 0x936B, 0x5F93, 0x8F5D, + 0x5F97, 0x93BE, 0x5F98, 0x9C70, 0x5F99, 0x9C6F, 0x5F9E, 0x9C6E, + 0x5FA0, 0x9C71, 0x5FA1, 0x8CE4, 0x5FA8, 0x9C72, 0x5FA9, 0x959C, + 0x5FAA, 0x8F7A, 0x5FAD, 0x9C73, 0x5FAE, 0x94F7, 0x5FB3, 0x93BF, + 0x5FB4, 0x92A5, 0x5FB7, 0xFABA, 0x5FB9, 0x934F, 0x5FBC, 0x9C74, + 0x5FBD, 0x8B4A, 0x5FC3, 0x9053, 0x5FC5, 0x954B, 0x5FCC, 0x8AF5, + 0x5FCD, 0x9445, 0x5FD6, 0x9C75, 0x5FD7, 0x8E75, 0x5FD8, 0x9659, + 0x5FD9, 0x965A, 0x5FDC, 0x899E, 0x5FDD, 0x9C7A, 0x5FDE, 0xFABB, + 0x5FE0, 0x9289, 0x5FE4, 0x9C77, 0x5FEB, 0x89F5, 0x5FF0, 0x9CAB, + 0x5FF1, 0x9C79, 0x5FF5, 0x944F, 0x5FF8, 0x9C78, 0x5FFB, 0x9C76, + 0x5FFD, 0x8D9A, 0x5FFF, 0x9C7C, 0x600E, 0x9C83, 0x600F, 0x9C89, + 0x6010, 0x9C81, 0x6012, 0x937B, 0x6015, 0x9C86, 0x6016, 0x957C, + 0x6019, 0x9C80, 0x601B, 0x9C85, 0x601C, 0x97E5, 0x601D, 0x8E76, + 0x6020, 0x91D3, 0x6021, 0x9C7D, 0x6025, 0x8B7D, 0x6026, 0x9C88, + 0x6027, 0x90AB, 0x6028, 0x8985, 0x6029, 0x9C82, 0x602A, 0x89F6, + 0x602B, 0x9C87, 0x602F, 0x8BAF, 0x6031, 0x9C84, 0x603A, 0x9C8A, + 0x6041, 0x9C8C, 0x6042, 0x9C96, 0x6043, 0x9C94, 0x6046, 0x9C91, + 0x604A, 0x9C90, 0x604B, 0x97F6, 0x604D, 0x9C92, 0x6050, 0x8BB0, + 0x6052, 0x8D50, 0x6055, 0x8F9A, 0x6059, 0x9C99, 0x605A, 0x9C8B, + 0x605D, 0xFABC, 0x605F, 0x9C8F, 0x6060, 0x9C7E, 0x6062, 0x89F8, + 0x6063, 0x9C93, 0x6064, 0x9C95, 0x6065, 0x9270, 0x6068, 0x8DA6, + 0x6069, 0x89B6, 0x606A, 0x9C8D, 0x606B, 0x9C98, 0x606C, 0x9C97, + 0x606D, 0x8BB1, 0x606F, 0x91A7, 0x6070, 0x8A86, 0x6075, 0x8C62, + 0x6077, 0x9C8E, 0x6081, 0x9C9A, 0x6083, 0x9C9D, 0x6084, 0x9C9F, + 0x6085, 0xFABD, 0x6089, 0x8EBB, 0x608A, 0xFABE, 0x608B, 0x9CA5, + 0x608C, 0x92EE, 0x608D, 0x9C9B, 0x6092, 0x9CA3, 0x6094, 0x89F7, + 0x6096, 0x9CA1, 0x6097, 0x9CA2, 0x609A, 0x9C9E, 0x609B, 0x9CA0, + 0x609F, 0x8CE5, 0x60A0, 0x9749, 0x60A3, 0x8AB3, 0x60A6, 0x8978, + 0x60A7, 0x9CA4, 0x60A9, 0x9459, 0x60AA, 0x88AB, 0x60B2, 0x94DF, + 0x60B3, 0x9C7B, 0x60B4, 0x9CAA, 0x60B5, 0x9CAE, 0x60B6, 0x96E3, + 0x60B8, 0x9CA7, 0x60BC, 0x9389, 0x60BD, 0x9CAC, 0x60C5, 0x8FEE, + 0x60C6, 0x9CAD, 0x60C7, 0x93D5, 0x60D1, 0x9866, 0x60D3, 0x9CA9, + 0x60D5, 0xFAC0, 0x60D8, 0x9CAF, 0x60DA, 0x8D9B, 0x60DC, 0x90C9, + 0x60DE, 0xFABF, 0x60DF, 0x88D2, 0x60E0, 0x9CA8, 0x60E1, 0x9CA6, + 0x60E3, 0x9179, 0x60E7, 0x9C9C, 0x60E8, 0x8E53, 0x60F0, 0x91C4, + 0x60F1, 0x9CBB, 0x60F2, 0xFAC2, 0x60F3, 0x917A, 0x60F4, 0x9CB6, + 0x60F6, 0x9CB3, 0x60F7, 0x9CB4, 0x60F9, 0x8EE4, 0x60FA, 0x9CB7, + 0x60FB, 0x9CBA, 0x6100, 0x9CB5, 0x6101, 0x8F44, 0x6103, 0x9CB8, + 0x6106, 0x9CB2, 0x6108, 0x96FA, 0x6109, 0x96F9, 0x610D, 0x9CBC, + 0x610E, 0x9CBD, 0x610F, 0x88D3, 0x6111, 0xFAC3, 0x6115, 0x9CB1, + 0x611A, 0x8BF0, 0x611B, 0x88A4, 0x611F, 0x8AB4, 0x6120, 0xFAC1, + 0x6121, 0x9CB9, 0x6127, 0x9CC1, 0x6128, 0x9CC0, 0x612C, 0x9CC5, + 0x6130, 0xFAC5, 0x6134, 0x9CC6, 0x6137, 0xFAC4, 0x613C, 0x9CC4, + 0x613D, 0x9CC7, 0x613E, 0x9CBF, 0x613F, 0x9CC3, 0x6142, 0x9CC8, + 0x6144, 0x9CC9, 0x6147, 0x9CBE, 0x6148, 0x8E9C, 0x614A, 0x9CC2, + 0x614B, 0x91D4, 0x614C, 0x8D51, 0x614D, 0x9CB0, 0x614E, 0x9054, + 0x6153, 0x9CD6, 0x6155, 0x95E7, 0x6158, 0x9CCC, 0x6159, 0x9CCD, + 0x615A, 0x9CCE, 0x615D, 0x9CD5, 0x615F, 0x9CD4, 0x6162, 0x969D, + 0x6163, 0x8AB5, 0x6165, 0x9CD2, 0x6167, 0x8C64, 0x6168, 0x8A53, + 0x616B, 0x9CCF, 0x616E, 0x97B6, 0x616F, 0x9CD1, 0x6170, 0x88D4, + 0x6171, 0x9CD3, 0x6173, 0x9CCA, 0x6174, 0x9CD0, 0x6175, 0x9CD7, + 0x6176, 0x8C63, 0x6177, 0x9CCB, 0x617E, 0x977C, 0x6182, 0x974A, + 0x6187, 0x9CDA, 0x618A, 0x9CDE, 0x618E, 0x919E, 0x6190, 0x97F7, + 0x6191, 0x9CDF, 0x6194, 0x9CDC, 0x6196, 0x9CD9, 0x6198, 0xFAC6, + 0x6199, 0x9CD8, 0x619A, 0x9CDD, 0x61A4, 0x95AE, 0x61A7, 0x93B2, + 0x61A9, 0x8C65, 0x61AB, 0x9CE0, 0x61AC, 0x9CDB, 0x61AE, 0x9CE1, + 0x61B2, 0x8C9B, 0x61B6, 0x89AF, 0x61BA, 0x9CE9, 0x61BE, 0x8AB6, + 0x61C3, 0x9CE7, 0x61C6, 0x9CE8, 0x61C7, 0x8DA7, 0x61C8, 0x9CE6, + 0x61C9, 0x9CE4, 0x61CA, 0x9CE3, 0x61CB, 0x9CEA, 0x61CC, 0x9CE2, + 0x61CD, 0x9CEC, 0x61D0, 0x89F9, 0x61E3, 0x9CEE, 0x61E6, 0x9CED, + 0x61F2, 0x92A6, 0x61F4, 0x9CF1, 0x61F6, 0x9CEF, 0x61F7, 0x9CE5, + 0x61F8, 0x8C9C, 0x61FA, 0x9CF0, 0x61FC, 0x9CF4, 0x61FD, 0x9CF3, + 0x61FE, 0x9CF5, 0x61FF, 0x9CF2, 0x6200, 0x9CF6, 0x6208, 0x9CF7, + 0x6209, 0x9CF8, 0x620A, 0x95E8, 0x620C, 0x9CFA, 0x620D, 0x9CF9, + 0x620E, 0x8F5E, 0x6210, 0x90AC, 0x6211, 0x89E4, 0x6212, 0x89FA, + 0x6213, 0xFAC7, 0x6214, 0x9CFB, 0x6216, 0x88BD, 0x621A, 0x90CA, + 0x621B, 0x9CFC, 0x621D, 0xE6C1, 0x621E, 0x9D40, 0x621F, 0x8C81, + 0x6221, 0x9D41, 0x6226, 0x90ED, 0x622A, 0x9D42, 0x622E, 0x9D43, + 0x622F, 0x8B59, 0x6230, 0x9D44, 0x6232, 0x9D45, 0x6233, 0x9D46, + 0x6234, 0x91D5, 0x6238, 0x8CCB, 0x623B, 0x96DF, 0x623F, 0x965B, + 0x6240, 0x8F8A, 0x6241, 0x9D47, 0x6247, 0x90EE, 0x6248, 0xE7BB, + 0x6249, 0x94E0, 0x624B, 0x8EE8, 0x624D, 0x8DCB, 0x624E, 0x9D48, + 0x6253, 0x91C5, 0x6255, 0x95A5, 0x6258, 0x91EF, 0x625B, 0x9D4B, + 0x625E, 0x9D49, 0x6260, 0x9D4C, 0x6263, 0x9D4A, 0x6268, 0x9D4D, + 0x626E, 0x95AF, 0x6271, 0x88B5, 0x6276, 0x957D, 0x6279, 0x94E1, + 0x627C, 0x9D4E, 0x627E, 0x9D51, 0x627F, 0x8FB3, 0x6280, 0x8B5A, + 0x6282, 0x9D4F, 0x6283, 0x9D56, 0x6284, 0x8FB4, 0x6289, 0x9D50, + 0x628A, 0x9463, 0x6291, 0x977D, 0x6292, 0x9D52, 0x6293, 0x9D53, + 0x6294, 0x9D57, 0x6295, 0x938A, 0x6296, 0x9D54, 0x6297, 0x8D52, + 0x6298, 0x90DC, 0x629B, 0x9D65, 0x629C, 0x94B2, 0x629E, 0x91F0, + 0x62A6, 0xFAC8, 0x62AB, 0x94E2, 0x62AC, 0x9DAB, 0x62B1, 0x95F8, + 0x62B5, 0x92EF, 0x62B9, 0x9695, 0x62BB, 0x9D5A, 0x62BC, 0x899F, + 0x62BD, 0x928A, 0x62C2, 0x9D63, 0x62C5, 0x9253, 0x62C6, 0x9D5D, + 0x62C7, 0x9D64, 0x62C8, 0x9D5F, 0x62C9, 0x9D66, 0x62CA, 0x9D62, + 0x62CC, 0x9D61, 0x62CD, 0x948F, 0x62CF, 0x9D5B, 0x62D0, 0x89FB, + 0x62D1, 0x9D59, 0x62D2, 0x8B91, 0x62D3, 0x91F1, 0x62D4, 0x9D55, + 0x62D7, 0x9D58, 0x62D8, 0x8D53, 0x62D9, 0x90D9, 0x62DB, 0x8FB5, + 0x62DC, 0x9D60, 0x62DD, 0x9471, 0x62E0, 0x8B92, 0x62E1, 0x8A67, + 0x62EC, 0x8A87, 0x62ED, 0x9040, 0x62EE, 0x9D68, 0x62EF, 0x9D6D, + 0x62F1, 0x9D69, 0x62F3, 0x8C9D, 0x62F5, 0x9D6E, 0x62F6, 0x8E41, + 0x62F7, 0x8D89, 0x62FE, 0x8F45, 0x62FF, 0x9D5C, 0x6301, 0x8E9D, + 0x6302, 0x9D6B, 0x6307, 0x8E77, 0x6308, 0x9D6C, 0x6309, 0x88C2, + 0x630C, 0x9D67, 0x6311, 0x92A7, 0x6319, 0x8B93, 0x631F, 0x8BB2, + 0x6327, 0x9D6A, 0x6328, 0x88A5, 0x632B, 0x8DC1, 0x632F, 0x9055, + 0x633A, 0x92F0, 0x633D, 0x94D2, 0x633E, 0x9D70, 0x633F, 0x917D, + 0x6349, 0x91A8, 0x634C, 0x8E4A, 0x634D, 0x9D71, 0x634F, 0x9D73, + 0x6350, 0x9D6F, 0x6355, 0x95DF, 0x6357, 0x92BB, 0x635C, 0x917B, + 0x6367, 0x95F9, 0x6368, 0x8ECC, 0x6369, 0x9D80, 0x636B, 0x9D7E, + 0x636E, 0x9098, 0x6372, 0x8C9E, 0x6376, 0x9D78, 0x6377, 0x8FB7, + 0x637A, 0x93E6, 0x637B, 0x9450, 0x6380, 0x9D76, 0x6383, 0x917C, + 0x6388, 0x8EF6, 0x6389, 0x9D7B, 0x638C, 0x8FB6, 0x638E, 0x9D75, + 0x638F, 0x9D7A, 0x6392, 0x9472, 0x6396, 0x9D74, 0x6398, 0x8C40, + 0x639B, 0x8A7C, 0x639F, 0x9D7C, 0x63A0, 0x97A9, 0x63A1, 0x8DCC, + 0x63A2, 0x9254, 0x63A3, 0x9D79, 0x63A5, 0x90DA, 0x63A7, 0x8D54, + 0x63A8, 0x9084, 0x63A9, 0x8986, 0x63AA, 0x915B, 0x63AB, 0x9D77, + 0x63AC, 0x8B64, 0x63B2, 0x8C66, 0x63B4, 0x92CD, 0x63B5, 0x9D7D, + 0x63BB, 0x917E, 0x63BE, 0x9D81, 0x63C0, 0x9D83, 0x63C3, 0x91B5, + 0x63C4, 0x9D89, 0x63C6, 0x9D84, 0x63C9, 0x9D86, 0x63CF, 0x9560, + 0x63D0, 0x92F1, 0x63D2, 0x9D87, 0x63D6, 0x974B, 0x63DA, 0x9767, + 0x63DB, 0x8AB7, 0x63E1, 0x88AC, 0x63E3, 0x9D85, 0x63E9, 0x9D82, + 0x63EE, 0x8AF6, 0x63F4, 0x8987, 0x63F5, 0xFAC9, 0x63F6, 0x9D88, + 0x63FA, 0x9768, 0x6406, 0x9D8C, 0x640D, 0x91B9, 0x640F, 0x9D93, + 0x6413, 0x9D8D, 0x6416, 0x9D8A, 0x6417, 0x9D91, 0x641C, 0x9D72, + 0x6426, 0x9D8E, 0x6428, 0x9D92, 0x642C, 0x94C0, 0x642D, 0x938B, + 0x6434, 0x9D8B, 0x6436, 0x9D8F, 0x643A, 0x8C67, 0x643E, 0x8DEF, + 0x6442, 0x90DB, 0x644E, 0x9D97, 0x6458, 0x9345, 0x6460, 0xFACA, + 0x6467, 0x9D94, 0x6469, 0x9680, 0x646F, 0x9D95, 0x6476, 0x9D96, + 0x6478, 0x96CC, 0x647A, 0x90A0, 0x6483, 0x8C82, 0x6488, 0x9D9D, + 0x6492, 0x8E54, 0x6493, 0x9D9A, 0x6495, 0x9D99, 0x649A, 0x9451, + 0x649D, 0xFACB, 0x649E, 0x93B3, 0x64A4, 0x9350, 0x64A5, 0x9D9B, + 0x64A9, 0x9D9C, 0x64AB, 0x958F, 0x64AD, 0x9464, 0x64AE, 0x8E42, + 0x64B0, 0x90EF, 0x64B2, 0x966F, 0x64B9, 0x8A68, 0x64BB, 0x9DA3, + 0x64BC, 0x9D9E, 0x64C1, 0x9769, 0x64C2, 0x9DA5, 0x64C5, 0x9DA1, + 0x64C7, 0x9DA2, 0x64CD, 0x9180, 0x64CE, 0xFACC, 0x64D2, 0x9DA0, + 0x64D4, 0x9D5E, 0x64D8, 0x9DA4, 0x64DA, 0x9D9F, 0x64E0, 0x9DA9, + 0x64E1, 0x9DAA, 0x64E2, 0x9346, 0x64E3, 0x9DAC, 0x64E6, 0x8E43, + 0x64E7, 0x9DA7, 0x64EC, 0x8B5B, 0x64EF, 0x9DAD, 0x64F1, 0x9DA6, + 0x64F2, 0x9DB1, 0x64F4, 0x9DB0, 0x64F6, 0x9DAF, 0x64FA, 0x9DB2, + 0x64FD, 0x9DB4, 0x64FE, 0x8FEF, 0x6500, 0x9DB3, 0x6505, 0x9DB7, + 0x6518, 0x9DB5, 0x651C, 0x9DB6, 0x651D, 0x9D90, 0x6523, 0x9DB9, + 0x6524, 0x9DB8, 0x652A, 0x9D98, 0x652B, 0x9DBA, 0x652C, 0x9DAE, + 0x652F, 0x8E78, 0x6534, 0x9DBB, 0x6535, 0x9DBC, 0x6536, 0x9DBE, + 0x6537, 0x9DBD, 0x6538, 0x9DBF, 0x6539, 0x89FC, 0x653B, 0x8D55, + 0x653E, 0x95FA, 0x653F, 0x90AD, 0x6545, 0x8CCC, 0x6548, 0x9DC1, + 0x654D, 0x9DC4, 0x654E, 0xFACD, 0x654F, 0x9571, 0x6551, 0x8B7E, + 0x6555, 0x9DC3, 0x6556, 0x9DC2, 0x6557, 0x9473, 0x6558, 0x9DC5, + 0x6559, 0x8BB3, 0x655D, 0x9DC7, 0x655E, 0x9DC6, 0x6562, 0x8AB8, + 0x6563, 0x8E55, 0x6566, 0x93D6, 0x656C, 0x8C68, 0x6570, 0x9094, + 0x6572, 0x9DC8, 0x6574, 0x90AE, 0x6575, 0x9347, 0x6577, 0x957E, + 0x6578, 0x9DC9, 0x6582, 0x9DCA, 0x6583, 0x9DCB, 0x6587, 0x95B6, + 0x6588, 0x9B7C, 0x6589, 0x90C4, 0x658C, 0x956B, 0x658E, 0x8DD6, + 0x6590, 0x94E3, 0x6591, 0x94C1, 0x6597, 0x936C, 0x6599, 0x97BF, + 0x659B, 0x9DCD, 0x659C, 0x8ECE, 0x659F, 0x9DCE, 0x65A1, 0x88B4, + 0x65A4, 0x8BD2, 0x65A5, 0x90CB, 0x65A7, 0x9580, 0x65AB, 0x9DCF, + 0x65AC, 0x8E61, 0x65AD, 0x9266, 0x65AF, 0x8E7A, 0x65B0, 0x9056, + 0x65B7, 0x9DD0, 0x65B9, 0x95FB, 0x65BC, 0x8997, 0x65BD, 0x8E7B, + 0x65C1, 0x9DD3, 0x65C3, 0x9DD1, 0x65C4, 0x9DD4, 0x65C5, 0x97B7, + 0x65C6, 0x9DD2, 0x65CB, 0x90F9, 0x65CC, 0x9DD5, 0x65CF, 0x91B0, + 0x65D2, 0x9DD6, 0x65D7, 0x8AF8, 0x65D9, 0x9DD8, 0x65DB, 0x9DD7, + 0x65E0, 0x9DD9, 0x65E1, 0x9DDA, 0x65E2, 0x8AF9, 0x65E5, 0x93FA, + 0x65E6, 0x9255, 0x65E7, 0x8B8C, 0x65E8, 0x8E7C, 0x65E9, 0x9181, + 0x65EC, 0x8F7B, 0x65ED, 0x88AE, 0x65F1, 0x9DDB, 0x65FA, 0x89A0, + 0x65FB, 0x9DDF, 0x6600, 0xFACE, 0x6602, 0x8D56, 0x6603, 0x9DDE, + 0x6606, 0x8DA9, 0x6607, 0x8FB8, 0x6609, 0xFAD1, 0x660A, 0x9DDD, + 0x660C, 0x8FB9, 0x660E, 0x96BE, 0x660F, 0x8DA8, 0x6613, 0x88D5, + 0x6614, 0x90CC, 0x6615, 0xFACF, 0x661C, 0x9DE4, 0x661E, 0xFAD3, + 0x661F, 0x90AF, 0x6620, 0x8966, 0x6624, 0xFAD4, 0x6625, 0x8F74, + 0x6627, 0x9686, 0x6628, 0x8DF0, 0x662D, 0x8FBA, 0x662E, 0xFAD2, + 0x662F, 0x90A5, 0x6631, 0xFA63, 0x6634, 0x9DE3, 0x6635, 0x9DE1, + 0x6636, 0x9DE2, 0x663B, 0xFAD0, 0x663C, 0x928B, 0x663F, 0x9E45, + 0x6641, 0x9DE8, 0x6642, 0x8E9E, 0x6643, 0x8D57, 0x6644, 0x9DE6, + 0x6649, 0x9DE7, 0x664B, 0x9057, 0x664F, 0x9DE5, 0x6652, 0x8E4E, + 0x6657, 0xFAD6, 0x6659, 0xFAD7, 0x665D, 0x9DEA, 0x665E, 0x9DE9, + 0x665F, 0x9DEE, 0x6662, 0x9DEF, 0x6664, 0x9DEB, 0x6665, 0xFAD5, + 0x6666, 0x8A41, 0x6667, 0x9DEC, 0x6668, 0x9DED, 0x6669, 0x94D3, + 0x666E, 0x9581, 0x666F, 0x8C69, 0x6670, 0x9DF0, 0x6673, 0xFAD9, + 0x6674, 0x90B0, 0x6676, 0x8FBB, 0x667A, 0x9271, 0x6681, 0x8BC5, + 0x6683, 0x9DF1, 0x6684, 0x9DF5, 0x6687, 0x89C9, 0x6688, 0x9DF2, + 0x6689, 0x9DF4, 0x668E, 0x9DF3, 0x6691, 0x8F8B, 0x6696, 0x9267, + 0x6697, 0x88C3, 0x6698, 0x9DF6, 0x6699, 0xFADA, 0x669D, 0x9DF7, + 0x66A0, 0xFADB, 0x66A2, 0x92A8, 0x66A6, 0x97EF, 0x66AB, 0x8E62, + 0x66AE, 0x95E9, 0x66B2, 0xFADC, 0x66B4, 0x965C, 0x66B8, 0x9E41, + 0x66B9, 0x9DF9, 0x66BC, 0x9DFC, 0x66BE, 0x9DFB, 0x66BF, 0xFADD, + 0x66C1, 0x9DF8, 0x66C4, 0x9E40, 0x66C7, 0x93DC, 0x66C9, 0x9DFA, + 0x66D6, 0x9E42, 0x66D9, 0x8F8C, 0x66DA, 0x9E43, 0x66DC, 0x976A, + 0x66DD, 0x9498, 0x66E0, 0x9E44, 0x66E6, 0x9E46, 0x66E9, 0x9E47, + 0x66F0, 0x9E48, 0x66F2, 0x8BC8, 0x66F3, 0x8967, 0x66F4, 0x8D58, + 0x66F5, 0x9E49, 0x66F7, 0x9E4A, 0x66F8, 0x8F91, 0x66F9, 0x9182, + 0x66FA, 0xFADE, 0x66FB, 0xFA66, 0x66FC, 0x99D6, 0x66FD, 0x915D, + 0x66FE, 0x915C, 0x66FF, 0x91D6, 0x6700, 0x8DC5, 0x6703, 0x98F0, + 0x6708, 0x8C8E, 0x6709, 0x974C, 0x670B, 0x95FC, 0x670D, 0x959E, + 0x670E, 0xFADF, 0x670F, 0x9E4B, 0x6714, 0x8DF1, 0x6715, 0x92BD, + 0x6716, 0x9E4C, 0x6717, 0x984E, 0x671B, 0x965D, 0x671D, 0x92A9, + 0x671E, 0x9E4D, 0x671F, 0x8AFA, 0x6726, 0x9E4E, 0x6727, 0x9E4F, + 0x6728, 0x96D8, 0x672A, 0x96A2, 0x672B, 0x9696, 0x672C, 0x967B, + 0x672D, 0x8E44, 0x672E, 0x9E51, 0x6731, 0x8EE9, 0x6734, 0x9670, + 0x6736, 0x9E53, 0x6737, 0x9E56, 0x6738, 0x9E55, 0x673A, 0x8AF7, + 0x673D, 0x8B80, 0x673F, 0x9E52, 0x6741, 0x9E54, 0x6746, 0x9E57, + 0x6749, 0x9099, 0x674E, 0x979B, 0x674F, 0x88C7, 0x6750, 0x8DDE, + 0x6751, 0x91BA, 0x6753, 0x8EDB, 0x6756, 0x8FF1, 0x6759, 0x9E5A, + 0x675C, 0x936D, 0x675E, 0x9E58, 0x675F, 0x91A9, 0x6760, 0x9E59, + 0x6761, 0x8FF0, 0x6762, 0x96DB, 0x6763, 0x9E5B, 0x6764, 0x9E5C, + 0x6765, 0x9788, 0x6766, 0xFAE1, 0x676A, 0x9E61, 0x676D, 0x8D59, + 0x676F, 0x9474, 0x6770, 0x9E5E, 0x6771, 0x938C, 0x6772, 0x9DDC, + 0x6773, 0x9DE0, 0x6775, 0x8B6E, 0x6777, 0x9466, 0x677C, 0x9E60, + 0x677E, 0x8FBC, 0x677F, 0x94C2, 0x6785, 0x9E66, 0x6787, 0x94F8, + 0x6789, 0x9E5D, 0x678B, 0x9E63, 0x678C, 0x9E62, 0x6790, 0x90CD, + 0x6795, 0x968D, 0x6797, 0x97D1, 0x679A, 0x9687, 0x679C, 0x89CA, + 0x679D, 0x8E7D, 0x67A0, 0x9867, 0x67A1, 0x9E65, 0x67A2, 0x9095, + 0x67A6, 0x9E64, 0x67A9, 0x9E5F, 0x67AF, 0x8CCD, 0x67B3, 0x9E6B, + 0x67B4, 0x9E69, 0x67B6, 0x89CB, 0x67B7, 0x9E67, 0x67B8, 0x9E6D, + 0x67B9, 0x9E73, 0x67BB, 0xFAE2, 0x67C0, 0xFAE4, 0x67C1, 0x91C6, + 0x67C4, 0x95BF, 0x67C6, 0x9E75, 0x67CA, 0x9541, 0x67CE, 0x9E74, + 0x67CF, 0x9490, 0x67D0, 0x965E, 0x67D1, 0x8AB9, 0x67D3, 0x90F5, + 0x67D4, 0x8F5F, 0x67D8, 0x92D1, 0x67DA, 0x974D, 0x67DD, 0x9E70, + 0x67DE, 0x9E6F, 0x67E2, 0x9E71, 0x67E4, 0x9E6E, 0x67E7, 0x9E76, + 0x67E9, 0x9E6C, 0x67EC, 0x9E6A, 0x67EE, 0x9E72, 0x67EF, 0x9E68, + 0x67F1, 0x928C, 0x67F3, 0x96F6, 0x67F4, 0x8EC4, 0x67F5, 0x8DF2, + 0x67FB, 0x8DB8, 0x67FE, 0x968F, 0x67FF, 0x8A60, 0x6801, 0xFAE5, + 0x6802, 0x92CC, 0x6803, 0x93C8, 0x6804, 0x8968, 0x6813, 0x90F0, + 0x6816, 0x90B2, 0x6817, 0x8C49, 0x681E, 0x9E78, 0x6821, 0x8D5A, + 0x6822, 0x8A9C, 0x6829, 0x9E7A, 0x682A, 0x8A94, 0x682B, 0x9E81, + 0x6832, 0x9E7D, 0x6834, 0x90F1, 0x6838, 0x8A6A, 0x6839, 0x8DAA, + 0x683C, 0x8A69, 0x683D, 0x8DCD, 0x6840, 0x9E7B, 0x6841, 0x8C85, + 0x6842, 0x8C6A, 0x6843, 0x938D, 0x6844, 0xFAE6, 0x6846, 0x9E79, + 0x6848, 0x88C4, 0x684D, 0x9E7C, 0x684E, 0x9E7E, 0x6850, 0x8BCB, + 0x6851, 0x8C4B, 0x6852, 0xFAE3, 0x6853, 0x8ABA, 0x6854, 0x8B6A, + 0x6859, 0x9E82, 0x685C, 0x8DF7, 0x685D, 0x9691, 0x685F, 0x8E56, + 0x6863, 0x9E83, 0x6867, 0x954F, 0x6874, 0x9E8F, 0x6876, 0x89B1, + 0x6877, 0x9E84, 0x687E, 0x9E95, 0x687F, 0x9E85, 0x6881, 0x97C0, + 0x6883, 0x9E8C, 0x6885, 0x947E, 0x688D, 0x9E94, 0x688F, 0x9E87, + 0x6893, 0x88B2, 0x6894, 0x9E89, 0x6897, 0x8D5B, 0x689B, 0x9E8B, + 0x689D, 0x9E8A, 0x689F, 0x9E86, 0x68A0, 0x9E91, 0x68A2, 0x8FBD, + 0x68A6, 0x9AEB, 0x68A7, 0x8CE6, 0x68A8, 0x979C, 0x68AD, 0x9E88, + 0x68AF, 0x92F2, 0x68B0, 0x8A42, 0x68B1, 0x8DAB, 0x68B3, 0x9E80, + 0x68B5, 0x9E90, 0x68B6, 0x8A81, 0x68B9, 0x9E8E, 0x68BA, 0x9E92, + 0x68BC, 0x938E, 0x68C4, 0x8AFC, 0x68C6, 0x9EB0, 0x68C8, 0xFA64, + 0x68C9, 0x96C7, 0x68CA, 0x9E97, 0x68CB, 0x8AFB, 0x68CD, 0x9E9E, + 0x68CF, 0xFAE7, 0x68D2, 0x965F, 0x68D4, 0x9E9F, 0x68D5, 0x9EA1, + 0x68D7, 0x9EA5, 0x68D8, 0x9E99, 0x68DA, 0x9249, 0x68DF, 0x938F, + 0x68E0, 0x9EA9, 0x68E1, 0x9E9C, 0x68E3, 0x9EA6, 0x68E7, 0x9EA0, + 0x68EE, 0x9058, 0x68EF, 0x9EAA, 0x68F2, 0x90B1, 0x68F9, 0x9EA8, + 0x68FA, 0x8ABB, 0x6900, 0x986F, 0x6901, 0x9E96, 0x6904, 0x9EA4, + 0x6905, 0x88D6, 0x6908, 0x9E98, 0x690B, 0x96B8, 0x690C, 0x9E9D, + 0x690D, 0x9041, 0x690E, 0x92C5, 0x690F, 0x9E93, 0x6912, 0x9EA3, + 0x6919, 0x909A, 0x691A, 0x9EAD, 0x691B, 0x8A91, 0x691C, 0x8C9F, + 0x6921, 0x9EAF, 0x6922, 0x9E9A, 0x6923, 0x9EAE, 0x6925, 0x9EA7, + 0x6926, 0x9E9B, 0x6928, 0x9EAB, 0x692A, 0x9EAC, 0x6930, 0x9EBD, + 0x6934, 0x93CC, 0x6936, 0x9EA2, 0x6939, 0x9EB9, 0x693D, 0x9EBB, + 0x693F, 0x92D6, 0x694A, 0x976B, 0x6953, 0x9596, 0x6954, 0x9EB6, + 0x6955, 0x91C8, 0x6959, 0x9EBC, 0x695A, 0x915E, 0x695C, 0x9EB3, + 0x695D, 0x9EC0, 0x695E, 0x9EBF, 0x6960, 0x93ED, 0x6961, 0x9EBE, + 0x6962, 0x93E8, 0x6968, 0xFAE9, 0x696A, 0x9EC2, 0x696B, 0x9EB5, + 0x696D, 0x8BC6, 0x696E, 0x9EB8, 0x696F, 0x8F7C, 0x6973, 0x9480, + 0x6974, 0x9EBA, 0x6975, 0x8BC9, 0x6977, 0x9EB2, 0x6978, 0x9EB4, + 0x6979, 0x9EB1, 0x697C, 0x984F, 0x697D, 0x8A79, 0x697E, 0x9EB7, + 0x6981, 0x9EC1, 0x6982, 0x8A54, 0x698A, 0x8DE5, 0x698E, 0x897C, + 0x6991, 0x9ED2, 0x6994, 0x9850, 0x6995, 0x9ED5, 0x6998, 0xFAEB, + 0x699B, 0x9059, 0x699C, 0x9ED4, 0x69A0, 0x9ED3, 0x69A7, 0x9ED0, + 0x69AE, 0x9EC4, 0x69B1, 0x9EE1, 0x69B2, 0x9EC3, 0x69B4, 0x9ED6, + 0x69BB, 0x9ECE, 0x69BE, 0x9EC9, 0x69BF, 0x9EC6, 0x69C1, 0x9EC7, + 0x69C3, 0x9ECF, 0x69C7, 0xEAA0, 0x69CA, 0x9ECC, 0x69CB, 0x8D5C, + 0x69CC, 0x92C6, 0x69CD, 0x9184, 0x69CE, 0x9ECA, 0x69D0, 0x9EC5, + 0x69D3, 0x9EC8, 0x69D8, 0x976C, 0x69D9, 0x968A, 0x69DD, 0x9ECD, + 0x69DE, 0x9ED7, 0x69E2, 0xFAEC, 0x69E7, 0x9EDF, 0x69E8, 0x9ED8, + 0x69EB, 0x9EE5, 0x69ED, 0x9EE3, 0x69F2, 0x9EDE, 0x69F9, 0x9EDD, + 0x69FB, 0x92CE, 0x69FD, 0x9185, 0x69FF, 0x9EDB, 0x6A02, 0x9ED9, + 0x6A05, 0x9EE0, 0x6A0A, 0x9EE6, 0x6A0B, 0x94F3, 0x6A0C, 0x9EEC, + 0x6A12, 0x9EE7, 0x6A13, 0x9EEA, 0x6A14, 0x9EE4, 0x6A17, 0x9294, + 0x6A19, 0x9557, 0x6A1B, 0x9EDA, 0x6A1E, 0x9EE2, 0x6A1F, 0x8FBE, + 0x6A21, 0x96CD, 0x6A22, 0x9EF6, 0x6A23, 0x9EE9, 0x6A29, 0x8CA0, + 0x6A2A, 0x89A1, 0x6A2B, 0x8A7E, 0x6A2E, 0x9ED1, 0x6A30, 0xFAED, + 0x6A35, 0x8FBF, 0x6A36, 0x9EEE, 0x6A38, 0x9EF5, 0x6A39, 0x8EF7, + 0x6A3A, 0x8A92, 0x6A3D, 0x924D, 0x6A44, 0x9EEB, 0x6A46, 0xFAEF, + 0x6A47, 0x9EF0, 0x6A48, 0x9EF4, 0x6A4B, 0x8BB4, 0x6A58, 0x8B6B, + 0x6A59, 0x9EF2, 0x6A5F, 0x8B40, 0x6A61, 0x93C9, 0x6A62, 0x9EF1, + 0x6A66, 0x9EF3, 0x6A6B, 0xFAEE, 0x6A72, 0x9EED, 0x6A73, 0xFAF0, + 0x6A78, 0x9EEF, 0x6A7E, 0xFAF1, 0x6A7F, 0x8A80, 0x6A80, 0x9268, + 0x6A84, 0x9EFA, 0x6A8D, 0x9EF8, 0x6A8E, 0x8CE7, 0x6A90, 0x9EF7, + 0x6A97, 0x9F40, 0x6A9C, 0x9E77, 0x6AA0, 0x9EF9, 0x6AA2, 0x9EFB, + 0x6AA3, 0x9EFC, 0x6AAA, 0x9F4B, 0x6AAC, 0x9F47, 0x6AAE, 0x9E8D, + 0x6AB3, 0x9F46, 0x6AB8, 0x9F45, 0x6ABB, 0x9F42, 0x6AC1, 0x9EE8, + 0x6AC2, 0x9F44, 0x6AC3, 0x9F43, 0x6AD1, 0x9F49, 0x6AD3, 0x9845, + 0x6ADA, 0x9F4C, 0x6ADB, 0x8BF9, 0x6ADE, 0x9F48, 0x6ADF, 0x9F4A, + 0x6AE2, 0xFAF2, 0x6AE4, 0xFAF3, 0x6AE8, 0x94A5, 0x6AEA, 0x9F4D, + 0x6AFA, 0x9F51, 0x6AFB, 0x9F4E, 0x6B04, 0x9793, 0x6B05, 0x9F4F, + 0x6B0A, 0x9EDC, 0x6B12, 0x9F52, 0x6B16, 0x9F53, 0x6B1D, 0x8954, + 0x6B1F, 0x9F55, 0x6B20, 0x8C87, 0x6B21, 0x8E9F, 0x6B23, 0x8BD3, + 0x6B27, 0x89A2, 0x6B32, 0x977E, 0x6B37, 0x9F57, 0x6B38, 0x9F56, + 0x6B39, 0x9F59, 0x6B3A, 0x8B5C, 0x6B3D, 0x8BD4, 0x6B3E, 0x8ABC, + 0x6B43, 0x9F5C, 0x6B47, 0x9F5B, 0x6B49, 0x9F5D, 0x6B4C, 0x89CC, + 0x6B4E, 0x9256, 0x6B50, 0x9F5E, 0x6B53, 0x8ABD, 0x6B54, 0x9F60, + 0x6B59, 0x9F5F, 0x6B5B, 0x9F61, 0x6B5F, 0x9F62, 0x6B61, 0x9F63, + 0x6B62, 0x8E7E, 0x6B63, 0x90B3, 0x6B64, 0x8D9F, 0x6B66, 0x9590, + 0x6B69, 0x95E0, 0x6B6A, 0x9863, 0x6B6F, 0x8E95, 0x6B73, 0x8DCE, + 0x6B74, 0x97F0, 0x6B78, 0x9F64, 0x6B79, 0x9F65, 0x6B7B, 0x8E80, + 0x6B7F, 0x9F66, 0x6B80, 0x9F67, 0x6B83, 0x9F69, 0x6B84, 0x9F68, + 0x6B86, 0x9677, 0x6B89, 0x8F7D, 0x6B8A, 0x8EEA, 0x6B8B, 0x8E63, + 0x6B8D, 0x9F6A, 0x6B95, 0x9F6C, 0x6B96, 0x9042, 0x6B98, 0x9F6B, + 0x6B9E, 0x9F6D, 0x6BA4, 0x9F6E, 0x6BAA, 0x9F6F, 0x6BAB, 0x9F70, + 0x6BAF, 0x9F71, 0x6BB1, 0x9F73, 0x6BB2, 0x9F72, 0x6BB3, 0x9F74, + 0x6BB4, 0x89A3, 0x6BB5, 0x9269, 0x6BB7, 0x9F75, 0x6BBA, 0x8E45, + 0x6BBB, 0x8A6B, 0x6BBC, 0x9F76, 0x6BBF, 0x9361, 0x6BC0, 0x9ACA, + 0x6BC5, 0x8B42, 0x6BC6, 0x9F77, 0x6BCB, 0x9F78, 0x6BCD, 0x95EA, + 0x6BCE, 0x9688, 0x6BD2, 0x93C5, 0x6BD3, 0x9F79, 0x6BD4, 0x94E4, + 0x6BD6, 0xFAF4, 0x6BD8, 0x94F9, 0x6BDB, 0x96D1, 0x6BDF, 0x9F7A, + 0x6BEB, 0x9F7C, 0x6BEC, 0x9F7B, 0x6BEF, 0x9F7E, 0x6BF3, 0x9F7D, + 0x6C08, 0x9F81, 0x6C0F, 0x8E81, 0x6C11, 0x96AF, 0x6C13, 0x9F82, + 0x6C14, 0x9F83, 0x6C17, 0x8B43, 0x6C1B, 0x9F84, 0x6C23, 0x9F86, + 0x6C24, 0x9F85, 0x6C34, 0x9085, 0x6C37, 0x9558, 0x6C38, 0x8969, + 0x6C3E, 0x94C3, 0x6C3F, 0xFAF5, 0x6C40, 0x92F3, 0x6C41, 0x8F60, + 0x6C42, 0x8B81, 0x6C4E, 0x94C4, 0x6C50, 0x8EAC, 0x6C55, 0x9F88, + 0x6C57, 0x8ABE, 0x6C5A, 0x8998, 0x6C5C, 0xFAF6, 0x6C5D, 0x93F0, + 0x6C5E, 0x9F87, 0x6C5F, 0x8D5D, 0x6C60, 0x9272, 0x6C62, 0x9F89, + 0x6C68, 0x9F91, 0x6C6A, 0x9F8A, 0x6C6F, 0xFAF8, 0x6C70, 0x91BF, + 0x6C72, 0x8B82, 0x6C73, 0x9F92, 0x6C7A, 0x8C88, 0x6C7D, 0x8B44, + 0x6C7E, 0x9F90, 0x6C81, 0x9F8E, 0x6C82, 0x9F8B, 0x6C83, 0x9780, + 0x6C86, 0xFAF7, 0x6C88, 0x92BE, 0x6C8C, 0x93D7, 0x6C8D, 0x9F8C, + 0x6C90, 0x9F94, 0x6C92, 0x9F93, 0x6C93, 0x8C42, 0x6C96, 0x89AB, + 0x6C99, 0x8DB9, 0x6C9A, 0x9F8D, 0x6C9B, 0x9F8F, 0x6CA1, 0x9676, + 0x6CA2, 0x91F2, 0x6CAB, 0x9697, 0x6CAE, 0x9F9C, 0x6CB1, 0x9F9D, + 0x6CB3, 0x89CD, 0x6CB8, 0x95A6, 0x6CB9, 0x96FB, 0x6CBA, 0x9F9F, + 0x6CBB, 0x8EA1, 0x6CBC, 0x8FC0, 0x6CBD, 0x9F98, 0x6CBE, 0x9F9E, + 0x6CBF, 0x8988, 0x6CC1, 0x8BB5, 0x6CC4, 0x9F95, 0x6CC5, 0x9F9A, + 0x6CC9, 0x90F2, 0x6CCA, 0x9491, 0x6CCC, 0x94E5, 0x6CD3, 0x9F97, + 0x6CD5, 0x9640, 0x6CD7, 0x9F99, 0x6CD9, 0x9FA2, 0x6CDA, 0xFAF9, + 0x6CDB, 0x9FA0, 0x6CDD, 0x9F9B, 0x6CE1, 0x9641, 0x6CE2, 0x9467, + 0x6CE3, 0x8B83, 0x6CE5, 0x9344, 0x6CE8, 0x928D, 0x6CEA, 0x9FA3, + 0x6CEF, 0x9FA1, 0x6CF0, 0x91D7, 0x6CF1, 0x9F96, 0x6CF3, 0x896A, + 0x6D04, 0xFAFA, 0x6D0B, 0x976D, 0x6D0C, 0x9FAE, 0x6D12, 0x9FAD, + 0x6D17, 0x90F4, 0x6D19, 0x9FAA, 0x6D1B, 0x978C, 0x6D1E, 0x93B4, + 0x6D1F, 0x9FA4, 0x6D25, 0x92C3, 0x6D29, 0x896B, 0x6D2A, 0x8D5E, + 0x6D2B, 0x9FA7, 0x6D32, 0x8F46, 0x6D33, 0x9FAC, 0x6D35, 0x9FAB, + 0x6D36, 0x9FA6, 0x6D38, 0x9FA9, 0x6D3B, 0x8A88, 0x6D3D, 0x9FA8, + 0x6D3E, 0x9468, 0x6D41, 0x97AC, 0x6D44, 0x8FF2, 0x6D45, 0x90F3, + 0x6D59, 0x9FB4, 0x6D5A, 0x9FB2, 0x6D5C, 0x956C, 0x6D63, 0x9FAF, + 0x6D64, 0x9FB1, 0x6D66, 0x8959, 0x6D69, 0x8D5F, 0x6D6A, 0x9851, + 0x6D6C, 0x8A5C, 0x6D6E, 0x9582, 0x6D6F, 0xFAFC, 0x6D74, 0x9781, + 0x6D77, 0x8A43, 0x6D78, 0x905A, 0x6D79, 0x9FB3, 0x6D85, 0x9FB8, + 0x6D87, 0xFAFB, 0x6D88, 0x8FC1, 0x6D8C, 0x974F, 0x6D8E, 0x9FB5, + 0x6D93, 0x9FB0, 0x6D95, 0x9FB6, 0x6D96, 0xFB40, 0x6D99, 0x97DC, + 0x6D9B, 0x9393, 0x6D9C, 0x93C0, 0x6DAC, 0xFB41, 0x6DAF, 0x8A55, + 0x6DB2, 0x8974, 0x6DB5, 0x9FBC, 0x6DB8, 0x9FBF, 0x6DBC, 0x97C1, + 0x6DC0, 0x9784, 0x6DC5, 0x9FC6, 0x6DC6, 0x9FC0, 0x6DC7, 0x9FBD, + 0x6DCB, 0x97D2, 0x6DCC, 0x9FC3, 0x6DCF, 0xFB42, 0x6DD1, 0x8F69, + 0x6DD2, 0x9FC5, 0x6DD5, 0x9FCA, 0x6DD8, 0x9391, 0x6DD9, 0x9FC8, + 0x6DDE, 0x9FC2, 0x6DE1, 0x9257, 0x6DE4, 0x9FC9, 0x6DE6, 0x9FBE, + 0x6DE8, 0x9FC4, 0x6DEA, 0x9FCB, 0x6DEB, 0x88FA, 0x6DEC, 0x9FC1, + 0x6DEE, 0x9FCC, 0x6DF1, 0x905B, 0x6DF2, 0xFB44, 0x6DF3, 0x8F7E, + 0x6DF5, 0x95A3, 0x6DF7, 0x8DAC, 0x6DF8, 0xFB43, 0x6DF9, 0x9FB9, + 0x6DFA, 0x9FC7, 0x6DFB, 0x9359, 0x6DFC, 0xFB45, 0x6E05, 0x90B4, + 0x6E07, 0x8A89, 0x6E08, 0x8DCF, 0x6E09, 0x8FC2, 0x6E0A, 0x9FBB, + 0x6E0B, 0x8F61, 0x6E13, 0x8C6B, 0x6E15, 0x9FBA, 0x6E19, 0x9FD0, + 0x6E1A, 0x8F8D, 0x6E1B, 0x8CB8, 0x6E1D, 0x9FDF, 0x6E1F, 0x9FD9, + 0x6E20, 0x8B94, 0x6E21, 0x936E, 0x6E23, 0x9FD4, 0x6E24, 0x9FDD, + 0x6E25, 0x88AD, 0x6E26, 0x8951, 0x6E27, 0xFB48, 0x6E29, 0x89B7, + 0x6E2B, 0x9FD6, 0x6E2C, 0x91AA, 0x6E2D, 0x9FCD, 0x6E2E, 0x9FCF, + 0x6E2F, 0x8D60, 0x6E38, 0x9FE0, 0x6E39, 0xFB46, 0x6E3A, 0x9FDB, + 0x6E3C, 0xFB49, 0x6E3E, 0x9FD3, 0x6E43, 0x9FDA, 0x6E4A, 0x96A9, + 0x6E4D, 0x9FD8, 0x6E4E, 0x9FDC, 0x6E56, 0x8CCE, 0x6E58, 0x8FC3, + 0x6E5B, 0x9258, 0x6E5C, 0xFB47, 0x6E5F, 0x9FD2, 0x6E67, 0x974E, + 0x6E6B, 0x9FD5, 0x6E6E, 0x9FCE, 0x6E6F, 0x9392, 0x6E72, 0x9FD1, + 0x6E76, 0x9FD7, 0x6E7E, 0x9870, 0x6E7F, 0x8EBC, 0x6E80, 0x969E, + 0x6E82, 0x9FE1, 0x6E8C, 0x94AC, 0x6E8F, 0x9FED, 0x6E90, 0x8CB9, + 0x6E96, 0x8F80, 0x6E98, 0x9FE3, 0x6E9C, 0x97AD, 0x6E9D, 0x8D61, + 0x6E9F, 0x9FF0, 0x6EA2, 0x88EC, 0x6EA5, 0x9FEE, 0x6EAA, 0x9FE2, + 0x6EAF, 0x9FE8, 0x6EB2, 0x9FEA, 0x6EB6, 0x976E, 0x6EB7, 0x9FE5, + 0x6EBA, 0x934D, 0x6EBD, 0x9FE7, 0x6EBF, 0xFB4A, 0x6EC2, 0x9FEF, + 0x6EC4, 0x9FE9, 0x6EC5, 0x96C5, 0x6EC9, 0x9FE4, 0x6ECB, 0x8EA0, + 0x6ECC, 0x9FFC, 0x6ED1, 0x8A8A, 0x6ED3, 0x9FE6, 0x6ED4, 0x9FEB, + 0x6ED5, 0x9FEC, 0x6EDD, 0x91EA, 0x6EDE, 0x91D8, 0x6EEC, 0x9FF4, + 0x6EEF, 0x9FFA, 0x6EF2, 0x9FF8, 0x6EF4, 0x9348, 0x6EF7, 0xE042, + 0x6EF8, 0x9FF5, 0x6EFE, 0x9FF6, 0x6EFF, 0x9FDE, 0x6F01, 0x8B99, + 0x6F02, 0x9559, 0x6F06, 0x8EBD, 0x6F09, 0x8D97, 0x6F0F, 0x9852, + 0x6F11, 0x9FF2, 0x6F13, 0xE041, 0x6F14, 0x8989, 0x6F15, 0x9186, + 0x6F20, 0x9499, 0x6F22, 0x8ABF, 0x6F23, 0x97F8, 0x6F2B, 0x969F, + 0x6F2C, 0x92D0, 0x6F31, 0x9FF9, 0x6F32, 0x9FFB, 0x6F38, 0x9151, + 0x6F3E, 0xE040, 0x6F3F, 0x9FF7, 0x6F41, 0x9FF1, 0x6F45, 0x8AC1, + 0x6F54, 0x8C89, 0x6F58, 0xE04E, 0x6F5B, 0xE049, 0x6F5C, 0x90F6, + 0x6F5F, 0x8A83, 0x6F64, 0x8F81, 0x6F66, 0xE052, 0x6F6D, 0xE04B, + 0x6F6E, 0x92AA, 0x6F6F, 0xE048, 0x6F70, 0x92D7, 0x6F74, 0xE06B, + 0x6F78, 0xE045, 0x6F7A, 0xE044, 0x6F7C, 0xE04D, 0x6F80, 0xE047, + 0x6F81, 0xE046, 0x6F82, 0xE04C, 0x6F84, 0x909F, 0x6F86, 0xE043, + 0x6F88, 0xFB4B, 0x6F8E, 0xE04F, 0x6F91, 0xE050, 0x6F97, 0x8AC0, + 0x6FA1, 0xE055, 0x6FA3, 0xE054, 0x6FA4, 0xE056, 0x6FAA, 0xE059, + 0x6FB1, 0x9362, 0x6FB3, 0xE053, 0x6FB5, 0xFB4C, 0x6FB9, 0xE057, + 0x6FC0, 0x8C83, 0x6FC1, 0x91F7, 0x6FC2, 0xE051, 0x6FC3, 0x945A, + 0x6FC6, 0xE058, 0x6FD4, 0xE05D, 0x6FD5, 0xE05B, 0x6FD8, 0xE05E, + 0x6FDB, 0xE061, 0x6FDF, 0xE05A, 0x6FE0, 0x8D8A, 0x6FE1, 0x9447, + 0x6FE4, 0x9FB7, 0x6FEB, 0x9794, 0x6FEC, 0xE05C, 0x6FEE, 0xE060, + 0x6FEF, 0x91F3, 0x6FF1, 0xE05F, 0x6FF3, 0xE04A, 0x6FF5, 0xFB4D, + 0x6FF6, 0xE889, 0x6FFA, 0xE064, 0x6FFE, 0xE068, 0x7001, 0xE066, + 0x7005, 0xFB4E, 0x7007, 0xFB4F, 0x7009, 0xE062, 0x700B, 0xE063, + 0x700F, 0xE067, 0x7011, 0xE065, 0x7015, 0x956D, 0x7018, 0xE06D, + 0x701A, 0xE06A, 0x701B, 0xE069, 0x701D, 0xE06C, 0x701E, 0x93D2, + 0x701F, 0xE06E, 0x7026, 0x9295, 0x7027, 0x91EB, 0x7028, 0xFB50, + 0x702C, 0x90A3, 0x7030, 0xE06F, 0x7032, 0xE071, 0x703E, 0xE070, + 0x704C, 0x9FF3, 0x7051, 0xE072, 0x7058, 0x93E5, 0x7063, 0xE073, + 0x706B, 0x89CE, 0x706F, 0x9394, 0x7070, 0x8A44, 0x7078, 0x8B84, + 0x707C, 0x8EDC, 0x707D, 0x8DD0, 0x7085, 0xFB51, 0x7089, 0x9846, + 0x708A, 0x9086, 0x708E, 0x898A, 0x7092, 0xE075, 0x7099, 0xE074, + 0x70AB, 0xFB52, 0x70AC, 0xE078, 0x70AD, 0x9259, 0x70AE, 0xE07B, + 0x70AF, 0xE076, 0x70B3, 0xE07A, 0x70B8, 0xE079, 0x70B9, 0x935F, + 0x70BA, 0x88D7, 0x70BB, 0xFA62, 0x70C8, 0x97F3, 0x70CB, 0xE07D, + 0x70CF, 0x8947, 0x70D9, 0xE080, 0x70DD, 0xE07E, 0x70DF, 0xE07C, + 0x70F1, 0xE077, 0x70F9, 0x9642, 0x70FD, 0xE082, 0x7104, 0xFB54, + 0x7109, 0xE081, 0x710F, 0xFB53, 0x7114, 0x898B, 0x7119, 0xE084, + 0x711A, 0x95B0, 0x711C, 0xE083, 0x7121, 0x96B3, 0x7126, 0x8FC5, + 0x7136, 0x9152, 0x713C, 0x8FC4, 0x7146, 0xFB56, 0x7147, 0xFB57, + 0x7149, 0x97F9, 0x714C, 0xE08A, 0x714E, 0x90F7, 0x7155, 0xE086, + 0x7156, 0xE08B, 0x7159, 0x898C, 0x715C, 0xFB55, 0x7162, 0xE089, + 0x7164, 0x9481, 0x7165, 0xE085, 0x7166, 0xE088, 0x7167, 0x8FC6, + 0x7169, 0x94CF, 0x716C, 0xE08C, 0x716E, 0x8ECF, 0x717D, 0x90F8, + 0x7184, 0xE08F, 0x7188, 0xE087, 0x718A, 0x8C46, 0x718F, 0xE08D, + 0x7194, 0x976F, 0x7195, 0xE090, 0x7199, 0xEAA4, 0x719F, 0x8F6E, + 0x71A8, 0xE091, 0x71AC, 0xE092, 0x71B1, 0x944D, 0x71B9, 0xE094, + 0x71BE, 0xE095, 0x71C1, 0xFB59, 0x71C3, 0x9452, 0x71C8, 0x9395, + 0x71C9, 0xE097, 0x71CE, 0xE099, 0x71D0, 0x97D3, 0x71D2, 0xE096, + 0x71D4, 0xE098, 0x71D5, 0x898D, 0x71D7, 0xE093, 0x71DF, 0x9A7A, + 0x71E0, 0xE09A, 0x71E5, 0x9187, 0x71E6, 0x8E57, 0x71E7, 0xE09C, + 0x71EC, 0xE09B, 0x71ED, 0x9043, 0x71EE, 0x99D7, 0x71F5, 0xE09D, + 0x71F9, 0xE09F, 0x71FB, 0xE08E, 0x71FC, 0xE09E, 0x71FE, 0xFB5A, + 0x71FF, 0xE0A0, 0x7206, 0x949A, 0x720D, 0xE0A1, 0x7210, 0xE0A2, + 0x721B, 0xE0A3, 0x7228, 0xE0A4, 0x722A, 0x92DC, 0x722C, 0xE0A6, + 0x722D, 0xE0A5, 0x7230, 0xE0A7, 0x7232, 0xE0A8, 0x7235, 0x8EDD, + 0x7236, 0x9583, 0x723A, 0x96EA, 0x723B, 0xE0A9, 0x723C, 0xE0AA, + 0x723D, 0x9175, 0x723E, 0x8EA2, 0x723F, 0xE0AB, 0x7240, 0xE0AC, + 0x7246, 0xE0AD, 0x7247, 0x95D0, 0x7248, 0x94C5, 0x724B, 0xE0AE, + 0x724C, 0x9476, 0x7252, 0x92AB, 0x7258, 0xE0AF, 0x7259, 0x89E5, + 0x725B, 0x8B8D, 0x725D, 0x96C4, 0x725F, 0x96B4, 0x7261, 0x89B2, + 0x7262, 0x9853, 0x7267, 0x9671, 0x7269, 0x95A8, 0x7272, 0x90B5, + 0x7274, 0xE0B0, 0x7279, 0x93C1, 0x727D, 0x8CA1, 0x727E, 0xE0B1, + 0x7280, 0x8DD2, 0x7281, 0xE0B3, 0x7282, 0xE0B2, 0x7287, 0xE0B4, + 0x7292, 0xE0B5, 0x7296, 0xE0B6, 0x72A0, 0x8B5D, 0x72A2, 0xE0B7, + 0x72A7, 0xE0B8, 0x72AC, 0x8CA2, 0x72AF, 0x94C6, 0x72B1, 0xFB5B, + 0x72B2, 0xE0BA, 0x72B6, 0x8FF3, 0x72B9, 0xE0B9, 0x72BE, 0xFB5C, + 0x72C2, 0x8BB6, 0x72C3, 0xE0BB, 0x72C4, 0xE0BD, 0x72C6, 0xE0BC, + 0x72CE, 0xE0BE, 0x72D0, 0x8CCF, 0x72D2, 0xE0BF, 0x72D7, 0x8BE7, + 0x72D9, 0x915F, 0x72DB, 0x8D9D, 0x72E0, 0xE0C1, 0x72E1, 0xE0C2, + 0x72E2, 0xE0C0, 0x72E9, 0x8EEB, 0x72EC, 0x93C6, 0x72ED, 0x8BB7, + 0x72F7, 0xE0C4, 0x72F8, 0x924B, 0x72F9, 0xE0C3, 0x72FC, 0x9854, + 0x72FD, 0x9482, 0x730A, 0xE0C7, 0x7316, 0xE0C9, 0x7317, 0xE0C6, + 0x731B, 0x96D2, 0x731C, 0xE0C8, 0x731D, 0xE0CA, 0x731F, 0x97C2, + 0x7324, 0xFB5D, 0x7325, 0xE0CE, 0x7329, 0xE0CD, 0x732A, 0x9296, + 0x732B, 0x944C, 0x732E, 0x8CA3, 0x732F, 0xE0CC, 0x7334, 0xE0CB, + 0x7336, 0x9750, 0x7337, 0x9751, 0x733E, 0xE0CF, 0x733F, 0x898E, + 0x7344, 0x8D96, 0x7345, 0x8E82, 0x734E, 0xE0D0, 0x734F, 0xE0D1, + 0x7357, 0xE0D3, 0x7363, 0x8F62, 0x7368, 0xE0D5, 0x736A, 0xE0D4, + 0x7370, 0xE0D6, 0x7372, 0x8A6C, 0x7375, 0xE0D8, 0x7377, 0xFB5F, + 0x7378, 0xE0D7, 0x737A, 0xE0DA, 0x737B, 0xE0D9, 0x7384, 0x8CBA, + 0x7387, 0x97A6, 0x7389, 0x8BCA, 0x738B, 0x89A4, 0x7396, 0x8BE8, + 0x73A9, 0x8ADF, 0x73B2, 0x97E6, 0x73B3, 0xE0DC, 0x73BB, 0xE0DE, + 0x73BD, 0xFB60, 0x73C0, 0xE0DF, 0x73C2, 0x89CF, 0x73C8, 0xE0DB, + 0x73C9, 0xFB61, 0x73CA, 0x8E58, 0x73CD, 0x92BF, 0x73CE, 0xE0DD, + 0x73D2, 0xFB64, 0x73D6, 0xFB62, 0x73DE, 0xE0E2, 0x73E0, 0x8EEC, + 0x73E3, 0xFB63, 0x73E5, 0xE0E0, 0x73EA, 0x8C5D, 0x73ED, 0x94C7, + 0x73EE, 0xE0E1, 0x73F1, 0xE0FC, 0x73F5, 0xFB66, 0x73F8, 0xE0E7, + 0x73FE, 0x8CBB, 0x7403, 0x8B85, 0x7405, 0xE0E4, 0x7406, 0x979D, + 0x7407, 0xFB65, 0x7409, 0x97AE, 0x7422, 0x91F4, 0x7425, 0xE0E6, + 0x7426, 0xFB67, 0x7429, 0xFB69, 0x742A, 0xFB68, 0x742E, 0xFB6A, + 0x7432, 0xE0E8, 0x7433, 0x97D4, 0x7434, 0x8BD5, 0x7435, 0x94FA, + 0x7436, 0x9469, 0x743A, 0xE0E9, 0x743F, 0xE0EB, 0x7441, 0xE0EE, + 0x7455, 0xE0EA, 0x7459, 0xE0ED, 0x745A, 0x8CE8, 0x745B, 0x896C, + 0x745C, 0xE0EF, 0x745E, 0x9090, 0x745F, 0xE0EC, 0x7460, 0x97DA, + 0x7462, 0xFB6B, 0x7463, 0xE0F2, 0x7464, 0xEAA2, 0x7469, 0xE0F0, + 0x746A, 0xE0F3, 0x746F, 0xE0E5, 0x7470, 0xE0F1, 0x7473, 0x8DBA, + 0x7476, 0xE0F4, 0x747E, 0xE0F5, 0x7483, 0x979E, 0x7489, 0xFB6C, + 0x748B, 0xE0F6, 0x749E, 0xE0F7, 0x749F, 0xFB6D, 0x74A2, 0xE0E3, + 0x74A7, 0xE0F8, 0x74B0, 0x8AC2, 0x74BD, 0x8EA3, 0x74CA, 0xE0F9, + 0x74CF, 0xE0FA, 0x74D4, 0xE0FB, 0x74DC, 0x895A, 0x74E0, 0xE140, + 0x74E2, 0x955A, 0x74E3, 0xE141, 0x74E6, 0x8AA2, 0x74E7, 0xE142, + 0x74E9, 0xE143, 0x74EE, 0xE144, 0x74F0, 0xE146, 0x74F1, 0xE147, + 0x74F2, 0xE145, 0x74F6, 0x9572, 0x74F7, 0xE149, 0x74F8, 0xE148, + 0x7501, 0xFB6E, 0x7503, 0xE14B, 0x7504, 0xE14A, 0x7505, 0xE14C, + 0x750C, 0xE14D, 0x750D, 0xE14F, 0x750E, 0xE14E, 0x7511, 0x8D99, + 0x7513, 0xE151, 0x7515, 0xE150, 0x7518, 0x8AC3, 0x751A, 0x9072, + 0x751C, 0x935B, 0x751E, 0xE152, 0x751F, 0x90B6, 0x7523, 0x8E59, + 0x7525, 0x8999, 0x7526, 0xE153, 0x7528, 0x9770, 0x752B, 0x95E1, + 0x752C, 0xE154, 0x752F, 0xFAA8, 0x7530, 0x9363, 0x7531, 0x9752, + 0x7532, 0x8D62, 0x7533, 0x905C, 0x7537, 0x926A, 0x7538, 0x99B2, + 0x753A, 0x92AC, 0x753B, 0x89E6, 0x753C, 0xE155, 0x7544, 0xE156, + 0x7546, 0xE15B, 0x7549, 0xE159, 0x754A, 0xE158, 0x754B, 0x9DC0, + 0x754C, 0x8A45, 0x754D, 0xE157, 0x754F, 0x88D8, 0x7551, 0x94A8, + 0x7554, 0x94C8, 0x7559, 0x97AF, 0x755A, 0xE15C, 0x755B, 0xE15A, + 0x755C, 0x927B, 0x755D, 0x90A4, 0x7560, 0x94A9, 0x7562, 0x954C, + 0x7564, 0xE15E, 0x7565, 0x97AA, 0x7566, 0x8C6C, 0x7567, 0xE15F, + 0x7569, 0xE15D, 0x756A, 0x94D4, 0x756B, 0xE160, 0x756D, 0xE161, + 0x756F, 0xFB6F, 0x7570, 0x88D9, 0x7573, 0x8FF4, 0x7574, 0xE166, + 0x7576, 0xE163, 0x7577, 0x93EB, 0x7578, 0xE162, 0x757F, 0x8B45, + 0x7582, 0xE169, 0x7586, 0xE164, 0x7587, 0xE165, 0x7589, 0xE168, + 0x758A, 0xE167, 0x758B, 0x9544, 0x758E, 0x9161, 0x758F, 0x9160, + 0x7591, 0x8B5E, 0x7594, 0xE16A, 0x759A, 0xE16B, 0x759D, 0xE16C, + 0x75A3, 0xE16E, 0x75A5, 0xE16D, 0x75AB, 0x8975, 0x75B1, 0xE176, + 0x75B2, 0x94E6, 0x75B3, 0xE170, 0x75B5, 0xE172, 0x75B8, 0xE174, + 0x75B9, 0x905D, 0x75BC, 0xE175, 0x75BD, 0xE173, 0x75BE, 0x8EBE, + 0x75C2, 0xE16F, 0x75C3, 0xE171, 0x75C5, 0x9561, 0x75C7, 0x8FC7, + 0x75CA, 0xE178, 0x75CD, 0xE177, 0x75D2, 0xE179, 0x75D4, 0x8EA4, + 0x75D5, 0x8DAD, 0x75D8, 0x9397, 0x75D9, 0xE17A, 0x75DB, 0x92C9, + 0x75DE, 0xE17C, 0x75E2, 0x979F, 0x75E3, 0xE17B, 0x75E9, 0x9189, + 0x75F0, 0xE182, 0x75F2, 0xE184, 0x75F3, 0xE185, 0x75F4, 0x9273, + 0x75FA, 0xE183, 0x75FC, 0xE180, 0x75FE, 0xE17D, 0x75FF, 0xE17E, + 0x7601, 0xE181, 0x7609, 0xE188, 0x760B, 0xE186, 0x760D, 0xE187, + 0x761F, 0xE189, 0x7620, 0xE18B, 0x7621, 0xE18C, 0x7622, 0xE18D, + 0x7624, 0xE18E, 0x7627, 0xE18A, 0x7630, 0xE190, 0x7634, 0xE18F, + 0x763B, 0xE191, 0x7642, 0x97C3, 0x7646, 0xE194, 0x7647, 0xE192, + 0x7648, 0xE193, 0x764C, 0x8AE0, 0x7652, 0x96FC, 0x7656, 0x95C8, + 0x7658, 0xE196, 0x765C, 0xE195, 0x7661, 0xE197, 0x7662, 0xE198, + 0x7667, 0xE19C, 0x7668, 0xE199, 0x7669, 0xE19A, 0x766A, 0xE19B, + 0x766C, 0xE19D, 0x7670, 0xE19E, 0x7672, 0xE19F, 0x7676, 0xE1A0, + 0x7678, 0xE1A1, 0x767A, 0x94AD, 0x767B, 0x936F, 0x767C, 0xE1A2, + 0x767D, 0x9492, 0x767E, 0x9553, 0x7680, 0xE1A3, 0x7682, 0xFB70, + 0x7683, 0xE1A4, 0x7684, 0x9349, 0x7686, 0x8A46, 0x7687, 0x8D63, + 0x7688, 0xE1A5, 0x768B, 0xE1A6, 0x768E, 0xE1A7, 0x7690, 0x8E48, + 0x7693, 0xE1A9, 0x7696, 0xE1A8, 0x7699, 0xE1AA, 0x769A, 0xE1AB, + 0x769B, 0xFB73, 0x769C, 0xFB71, 0x769E, 0xFB72, 0x76A6, 0xFB74, + 0x76AE, 0x94E7, 0x76B0, 0xE1AC, 0x76B4, 0xE1AD, 0x76B7, 0xEA89, + 0x76B8, 0xE1AE, 0x76B9, 0xE1AF, 0x76BA, 0xE1B0, 0x76BF, 0x8E4D, + 0x76C2, 0xE1B1, 0x76C3, 0x9475, 0x76C6, 0x967E, 0x76C8, 0x896D, + 0x76CA, 0x8976, 0x76CD, 0xE1B2, 0x76D2, 0xE1B4, 0x76D6, 0xE1B3, + 0x76D7, 0x9390, 0x76DB, 0x90B7, 0x76DC, 0x9F58, 0x76DE, 0xE1B5, + 0x76DF, 0x96BF, 0x76E1, 0xE1B6, 0x76E3, 0x8AC4, 0x76E4, 0x94D5, + 0x76E5, 0xE1B7, 0x76E7, 0xE1B8, 0x76EA, 0xE1B9, 0x76EE, 0x96DA, + 0x76F2, 0x96D3, 0x76F4, 0x92BC, 0x76F8, 0x918A, 0x76FB, 0xE1BB, + 0x76FE, 0x8F82, 0x7701, 0x8FC8, 0x7704, 0xE1BE, 0x7707, 0xE1BD, + 0x7708, 0xE1BC, 0x7709, 0x94FB, 0x770B, 0x8AC5, 0x770C, 0x8CA7, + 0x771B, 0xE1C4, 0x771E, 0xE1C1, 0x771F, 0x905E, 0x7720, 0x96B0, + 0x7724, 0xE1C0, 0x7725, 0xE1C2, 0x7726, 0xE1C3, 0x7729, 0xE1BF, + 0x7737, 0xE1C5, 0x7738, 0xE1C6, 0x773A, 0x92AD, 0x773C, 0x8AE1, + 0x7740, 0x9285, 0x7746, 0xFB76, 0x7747, 0xE1C7, 0x775A, 0xE1C8, + 0x775B, 0xE1CB, 0x7761, 0x9087, 0x7763, 0x93C2, 0x7765, 0xE1CC, + 0x7766, 0x9672, 0x7768, 0xE1C9, 0x776B, 0xE1CA, 0x7779, 0xE1CF, + 0x777E, 0xE1CE, 0x777F, 0xE1CD, 0x778B, 0xE1D1, 0x778E, 0xE1D0, + 0x7791, 0xE1D2, 0x779E, 0xE1D4, 0x77A0, 0xE1D3, 0x77A5, 0x95CB, + 0x77AC, 0x8F75, 0x77AD, 0x97C4, 0x77B0, 0xE1D5, 0x77B3, 0x93B5, + 0x77B6, 0xE1D6, 0x77B9, 0xE1D7, 0x77BB, 0xE1DB, 0x77BC, 0xE1D9, + 0x77BD, 0xE1DA, 0x77BF, 0xE1D8, 0x77C7, 0xE1DC, 0x77CD, 0xE1DD, + 0x77D7, 0xE1DE, 0x77DA, 0xE1DF, 0x77DB, 0x96B5, 0x77DC, 0xE1E0, + 0x77E2, 0x96EE, 0x77E3, 0xE1E1, 0x77E5, 0x926D, 0x77E7, 0x948A, + 0x77E9, 0x8BE9, 0x77ED, 0x925A, 0x77EE, 0xE1E2, 0x77EF, 0x8BB8, + 0x77F3, 0x90CE, 0x77FC, 0xE1E3, 0x7802, 0x8DBB, 0x780C, 0xE1E4, + 0x7812, 0xE1E5, 0x7814, 0x8CA4, 0x7815, 0x8DD3, 0x7820, 0xE1E7, + 0x7821, 0xFB78, 0x7825, 0x9375, 0x7826, 0x8DD4, 0x7827, 0x8B6D, + 0x7832, 0x9643, 0x7834, 0x946A, 0x783A, 0x9376, 0x783F, 0x8D7B, + 0x7845, 0xE1E9, 0x784E, 0xFB79, 0x785D, 0x8FC9, 0x7864, 0xFB7A, + 0x786B, 0x97B0, 0x786C, 0x8D64, 0x786F, 0x8CA5, 0x7872, 0x94A1, + 0x7874, 0xE1EB, 0x787A, 0xFB7B, 0x787C, 0xE1ED, 0x7881, 0x8CE9, + 0x7886, 0xE1EC, 0x7887, 0x92F4, 0x788C, 0xE1EF, 0x788D, 0x8A56, + 0x788E, 0xE1EA, 0x7891, 0x94E8, 0x7893, 0x894F, 0x7895, 0x8DEA, + 0x7897, 0x9871, 0x789A, 0xE1EE, 0x78A3, 0xE1F0, 0x78A7, 0x95C9, + 0x78A9, 0x90D7, 0x78AA, 0xE1F2, 0x78AF, 0xE1F3, 0x78B5, 0xE1F1, + 0x78BA, 0x8A6D, 0x78BC, 0xE1F9, 0x78BE, 0xE1F8, 0x78C1, 0x8EA5, + 0x78C5, 0xE1FA, 0x78C6, 0xE1F5, 0x78CA, 0xE1FB, 0x78CB, 0xE1F6, + 0x78D0, 0x94D6, 0x78D1, 0xE1F4, 0x78D4, 0xE1F7, 0x78DA, 0xE241, + 0x78E7, 0xE240, 0x78E8, 0x9681, 0x78EC, 0xE1FC, 0x78EF, 0x88E9, + 0x78F4, 0xE243, 0x78FD, 0xE242, 0x7901, 0x8FCA, 0x7907, 0xE244, + 0x790E, 0x9162, 0x7911, 0xE246, 0x7912, 0xE245, 0x7919, 0xE247, + 0x7926, 0xE1E6, 0x792A, 0xE1E8, 0x792B, 0xE249, 0x792C, 0xE248, + 0x7930, 0xFB7C, 0x793A, 0x8EA6, 0x793C, 0x97E7, 0x793E, 0x8ED0, + 0x7940, 0xE24A, 0x7941, 0x8C56, 0x7947, 0x8B5F, 0x7948, 0x8B46, + 0x7949, 0x8E83, 0x7950, 0x9753, 0x7953, 0xE250, 0x7955, 0xE24F, + 0x7956, 0x9163, 0x7957, 0xE24C, 0x795A, 0xE24E, 0x795D, 0x8F6A, + 0x795E, 0x905F, 0x795F, 0xE24D, 0x7960, 0xE24B, 0x7962, 0x9449, + 0x7965, 0x8FCB, 0x7968, 0x955B, 0x796D, 0x8DD5, 0x7977, 0x9398, + 0x797A, 0xE251, 0x797F, 0xE252, 0x7980, 0xE268, 0x7981, 0x8BD6, + 0x7984, 0x985C, 0x7985, 0x9154, 0x798A, 0xE253, 0x798D, 0x89D0, + 0x798E, 0x92F5, 0x798F, 0x959F, 0x7994, 0xFB81, 0x799B, 0xFB83, + 0x799D, 0xE254, 0x79A6, 0x8B9A, 0x79A7, 0xE255, 0x79AA, 0xE257, + 0x79AE, 0xE258, 0x79B0, 0x9448, 0x79B3, 0xE259, 0x79B9, 0xE25A, + 0x79BA, 0xE25B, 0x79BD, 0x8BD7, 0x79BE, 0x89D1, 0x79BF, 0x93C3, + 0x79C0, 0x8F47, 0x79C1, 0x8E84, 0x79C9, 0xE25C, 0x79CB, 0x8F48, + 0x79D1, 0x89C8, 0x79D2, 0x9562, 0x79D5, 0xE25D, 0x79D8, 0x94E9, + 0x79DF, 0x9164, 0x79E1, 0xE260, 0x79E3, 0xE261, 0x79E4, 0x9489, + 0x79E6, 0x9060, 0x79E7, 0xE25E, 0x79E9, 0x9281, 0x79EC, 0xE25F, + 0x79F0, 0x8FCC, 0x79FB, 0x88DA, 0x7A00, 0x8B48, 0x7A08, 0xE262, + 0x7A0B, 0x92F6, 0x7A0D, 0xE263, 0x7A0E, 0x90C5, 0x7A14, 0x96AB, + 0x7A17, 0x9542, 0x7A18, 0xE264, 0x7A19, 0xE265, 0x7A1A, 0x9274, + 0x7A1C, 0x97C5, 0x7A1F, 0xE267, 0x7A20, 0xE266, 0x7A2E, 0x8EED, + 0x7A31, 0xE269, 0x7A32, 0x88EE, 0x7A37, 0xE26C, 0x7A3B, 0xE26A, + 0x7A3C, 0x89D2, 0x7A3D, 0x8C6D, 0x7A3E, 0xE26B, 0x7A3F, 0x8D65, + 0x7A40, 0x8D92, 0x7A42, 0x95E4, 0x7A43, 0xE26D, 0x7A46, 0x9673, + 0x7A49, 0xE26F, 0x7A4D, 0x90CF, 0x7A4E, 0x896E, 0x7A4F, 0x89B8, + 0x7A50, 0x88AA, 0x7A57, 0xE26E, 0x7A61, 0xE270, 0x7A62, 0xE271, + 0x7A63, 0x8FF5, 0x7A69, 0xE272, 0x7A6B, 0x8A6E, 0x7A70, 0xE274, + 0x7A74, 0x8C8A, 0x7A76, 0x8B86, 0x7A79, 0xE275, 0x7A7A, 0x8BF3, + 0x7A7D, 0xE276, 0x7A7F, 0x90FA, 0x7A81, 0x93CB, 0x7A83, 0x90DE, + 0x7A84, 0x8DF3, 0x7A88, 0xE277, 0x7A92, 0x9282, 0x7A93, 0x918B, + 0x7A95, 0xE279, 0x7A96, 0xE27B, 0x7A97, 0xE278, 0x7A98, 0xE27A, + 0x7A9F, 0x8C41, 0x7AA9, 0xE27C, 0x7AAA, 0x8C45, 0x7AAE, 0x8B87, + 0x7AAF, 0x9771, 0x7AB0, 0xE27E, 0x7AB6, 0xE280, 0x7ABA, 0x894D, + 0x7ABF, 0xE283, 0x7AC3, 0x8A96, 0x7AC4, 0xE282, 0x7AC5, 0xE281, + 0x7AC7, 0xE285, 0x7AC8, 0xE27D, 0x7ACA, 0xE286, 0x7ACB, 0x97A7, + 0x7ACD, 0xE287, 0x7ACF, 0xE288, 0x7AD1, 0xFB84, 0x7AD2, 0x9AF2, + 0x7AD3, 0xE28A, 0x7AD5, 0xE289, 0x7AD9, 0xE28B, 0x7ADA, 0xE28C, + 0x7ADC, 0x97B3, 0x7ADD, 0xE28D, 0x7ADF, 0xE8ED, 0x7AE0, 0x8FCD, + 0x7AE1, 0xE28E, 0x7AE2, 0xE28F, 0x7AE3, 0x8F76, 0x7AE5, 0x93B6, + 0x7AE6, 0xE290, 0x7AE7, 0xFB85, 0x7AEA, 0x9247, 0x7AEB, 0xFB87, + 0x7AED, 0xE291, 0x7AEF, 0x925B, 0x7AF0, 0xE292, 0x7AF6, 0x8BA3, + 0x7AF8, 0x995E, 0x7AF9, 0x927C, 0x7AFA, 0x8EB1, 0x7AFF, 0x8AC6, + 0x7B02, 0xE293, 0x7B04, 0xE2A0, 0x7B06, 0xE296, 0x7B08, 0x8B88, + 0x7B0A, 0xE295, 0x7B0B, 0xE2A2, 0x7B0F, 0xE294, 0x7B11, 0x8FCE, + 0x7B18, 0xE298, 0x7B19, 0xE299, 0x7B1B, 0x934A, 0x7B1E, 0xE29A, + 0x7B20, 0x8A7D, 0x7B25, 0x9079, 0x7B26, 0x9584, 0x7B28, 0xE29C, + 0x7B2C, 0x91E6, 0x7B33, 0xE297, 0x7B35, 0xE29B, 0x7B36, 0xE29D, + 0x7B39, 0x8DF9, 0x7B45, 0xE2A4, 0x7B46, 0x954D, 0x7B48, 0x94A4, + 0x7B49, 0x9399, 0x7B4B, 0x8BD8, 0x7B4C, 0xE2A3, 0x7B4D, 0xE2A1, + 0x7B4F, 0x94B3, 0x7B50, 0xE29E, 0x7B51, 0x927D, 0x7B52, 0x939B, + 0x7B54, 0x939A, 0x7B56, 0x8DF4, 0x7B5D, 0xE2B6, 0x7B65, 0xE2A6, + 0x7B67, 0xE2A8, 0x7B6C, 0xE2AB, 0x7B6E, 0xE2AC, 0x7B70, 0xE2A9, + 0x7B71, 0xE2AA, 0x7B74, 0xE2A7, 0x7B75, 0xE2A5, 0x7B7A, 0xE29F, + 0x7B86, 0x95CD, 0x7B87, 0x89D3, 0x7B8B, 0xE2B3, 0x7B8D, 0xE2B0, + 0x7B8F, 0xE2B5, 0x7B92, 0xE2B4, 0x7B94, 0x9493, 0x7B95, 0x96A5, + 0x7B97, 0x8E5A, 0x7B98, 0xE2AE, 0x7B99, 0xE2B7, 0x7B9A, 0xE2B2, + 0x7B9C, 0xE2B1, 0x7B9D, 0xE2AD, 0x7B9E, 0xFB88, 0x7B9F, 0xE2AF, + 0x7BA1, 0x8AC7, 0x7BAA, 0x925C, 0x7BAD, 0x90FB, 0x7BB1, 0x94A0, + 0x7BB4, 0xE2BC, 0x7BB8, 0x94A2, 0x7BC0, 0x90DF, 0x7BC1, 0xE2B9, + 0x7BC4, 0x94CD, 0x7BC6, 0xE2BD, 0x7BC7, 0x95D1, 0x7BC9, 0x927A, + 0x7BCB, 0xE2B8, 0x7BCC, 0xE2BA, 0x7BCF, 0xE2BB, 0x7BDD, 0xE2BE, + 0x7BE0, 0x8EC2, 0x7BE4, 0x93C4, 0x7BE5, 0xE2C3, 0x7BE6, 0xE2C2, + 0x7BE9, 0xE2BF, 0x7BED, 0x9855, 0x7BF3, 0xE2C8, 0x7BF6, 0xE2CC, + 0x7BF7, 0xE2C9, 0x7C00, 0xE2C5, 0x7C07, 0xE2C6, 0x7C0D, 0xE2CB, + 0x7C11, 0xE2C0, 0x7C12, 0x99D3, 0x7C13, 0xE2C7, 0x7C14, 0xE2C1, + 0x7C17, 0xE2CA, 0x7C1F, 0xE2D0, 0x7C21, 0x8AC8, 0x7C23, 0xE2CD, + 0x7C27, 0xE2CE, 0x7C2A, 0xE2CF, 0x7C2B, 0xE2D2, 0x7C37, 0xE2D1, + 0x7C38, 0x94F4, 0x7C3D, 0xE2D3, 0x7C3E, 0x97FA, 0x7C3F, 0x95EB, + 0x7C40, 0xE2D8, 0x7C43, 0xE2D5, 0x7C4C, 0xE2D4, 0x7C4D, 0x90D0, + 0x7C4F, 0xE2D7, 0x7C50, 0xE2D9, 0x7C54, 0xE2D6, 0x7C56, 0xE2DD, + 0x7C58, 0xE2DA, 0x7C5F, 0xE2DB, 0x7C60, 0xE2C4, 0x7C64, 0xE2DC, + 0x7C65, 0xE2DE, 0x7C6C, 0xE2DF, 0x7C73, 0x95C4, 0x7C75, 0xE2E0, + 0x7C7E, 0x96E0, 0x7C81, 0x8BCC, 0x7C82, 0x8C48, 0x7C83, 0xE2E1, + 0x7C89, 0x95B2, 0x7C8B, 0x9088, 0x7C8D, 0x96AE, 0x7C90, 0xE2E2, + 0x7C92, 0x97B1, 0x7C95, 0x9494, 0x7C97, 0x9165, 0x7C98, 0x9453, + 0x7C9B, 0x8F6C, 0x7C9F, 0x88BE, 0x7CA1, 0xE2E7, 0x7CA2, 0xE2E5, + 0x7CA4, 0xE2E3, 0x7CA5, 0x8A9F, 0x7CA7, 0x8FCF, 0x7CA8, 0xE2E8, + 0x7CAB, 0xE2E6, 0x7CAD, 0xE2E4, 0x7CAE, 0xE2EC, 0x7CB1, 0xE2EB, + 0x7CB2, 0xE2EA, 0x7CB3, 0xE2E9, 0x7CB9, 0xE2ED, 0x7CBD, 0xE2EE, + 0x7CBE, 0x90B8, 0x7CC0, 0xE2EF, 0x7CC2, 0xE2F1, 0x7CC5, 0xE2F0, + 0x7CCA, 0x8CD0, 0x7CCE, 0x9157, 0x7CD2, 0xE2F3, 0x7CD6, 0x939C, + 0x7CD8, 0xE2F2, 0x7CDC, 0xE2F4, 0x7CDE, 0x95B3, 0x7CDF, 0x918C, + 0x7CE0, 0x8D66, 0x7CE2, 0xE2F5, 0x7CE7, 0x97C6, 0x7CEF, 0xE2F7, + 0x7CF2, 0xE2F8, 0x7CF4, 0xE2F9, 0x7CF6, 0xE2FA, 0x7CF8, 0x8E85, + 0x7CFA, 0xE2FB, 0x7CFB, 0x8C6E, 0x7CFE, 0x8B8A, 0x7D00, 0x8B49, + 0x7D02, 0xE340, 0x7D04, 0x96F1, 0x7D05, 0x8D67, 0x7D06, 0xE2FC, + 0x7D0A, 0xE343, 0x7D0B, 0x96E4, 0x7D0D, 0x945B, 0x7D10, 0x9552, + 0x7D14, 0x8F83, 0x7D15, 0xE342, 0x7D17, 0x8ED1, 0x7D18, 0x8D68, + 0x7D19, 0x8E86, 0x7D1A, 0x8B89, 0x7D1B, 0x95B4, 0x7D1C, 0xE341, + 0x7D20, 0x9166, 0x7D21, 0x9661, 0x7D22, 0x8DF5, 0x7D2B, 0x8E87, + 0x7D2C, 0x92DB, 0x7D2E, 0xE346, 0x7D2F, 0x97DD, 0x7D30, 0x8DD7, + 0x7D32, 0xE347, 0x7D33, 0x9061, 0x7D35, 0xE349, 0x7D39, 0x8FD0, + 0x7D3A, 0x8DAE, 0x7D3F, 0xE348, 0x7D42, 0x8F49, 0x7D43, 0x8CBC, + 0x7D44, 0x9167, 0x7D45, 0xE344, 0x7D46, 0xE34A, 0x7D48, 0xFB8A, + 0x7D4B, 0xE345, 0x7D4C, 0x8C6F, 0x7D4E, 0xE34D, 0x7D4F, 0xE351, + 0x7D50, 0x8C8B, 0x7D56, 0xE34C, 0x7D5B, 0xE355, 0x7D5C, 0xFB8B, + 0x7D5E, 0x8D69, 0x7D61, 0x978D, 0x7D62, 0x88BA, 0x7D63, 0xE352, + 0x7D66, 0x8B8B, 0x7D68, 0xE34F, 0x7D6E, 0xE350, 0x7D71, 0x939D, + 0x7D72, 0xE34E, 0x7D73, 0xE34B, 0x7D75, 0x8A47, 0x7D76, 0x90E2, + 0x7D79, 0x8CA6, 0x7D7D, 0xE357, 0x7D89, 0xE354, 0x7D8F, 0xE356, + 0x7D93, 0xE353, 0x7D99, 0x8C70, 0x7D9A, 0x91B1, 0x7D9B, 0xE358, + 0x7D9C, 0x918E, 0x7D9F, 0xE365, 0x7DA0, 0xFB8D, 0x7DA2, 0xE361, + 0x7DA3, 0xE35B, 0x7DAB, 0xE35F, 0x7DAC, 0x8EF8, 0x7DAD, 0x88DB, + 0x7DAE, 0xE35A, 0x7DAF, 0xE362, 0x7DB0, 0xE366, 0x7DB1, 0x8D6A, + 0x7DB2, 0x96D4, 0x7DB4, 0x92D4, 0x7DB5, 0xE35C, 0x7DB7, 0xFB8C, + 0x7DB8, 0xE364, 0x7DBA, 0xE359, 0x7DBB, 0x925D, 0x7DBD, 0xE35E, + 0x7DBE, 0x88BB, 0x7DBF, 0x96C8, 0x7DC7, 0xE35D, 0x7DCA, 0x8BD9, + 0x7DCB, 0x94EA, 0x7DCF, 0x918D, 0x7DD1, 0x97CE, 0x7DD2, 0x8F8F, + 0x7DD5, 0xE38E, 0x7DD6, 0xFB8E, 0x7DD8, 0xE367, 0x7DDA, 0x90FC, + 0x7DDC, 0xE363, 0x7DDD, 0xE368, 0x7DDE, 0xE36A, 0x7DE0, 0x92F7, + 0x7DE1, 0xE36D, 0x7DE4, 0xE369, 0x7DE8, 0x95D2, 0x7DE9, 0x8AC9, + 0x7DEC, 0x96C9, 0x7DEF, 0x88DC, 0x7DF2, 0xE36C, 0x7DF4, 0x97FB, + 0x7DFB, 0xE36B, 0x7E01, 0x898F, 0x7E04, 0x93EA, 0x7E05, 0xE36E, + 0x7E09, 0xE375, 0x7E0A, 0xE36F, 0x7E0B, 0xE376, 0x7E12, 0xE372, + 0x7E1B, 0x949B, 0x7E1E, 0x8EC8, 0x7E1F, 0xE374, 0x7E21, 0xE371, + 0x7E22, 0xE377, 0x7E23, 0xE370, 0x7E26, 0x8F63, 0x7E2B, 0x9644, + 0x7E2E, 0x8F6B, 0x7E31, 0xE373, 0x7E32, 0xE380, 0x7E35, 0xE37B, + 0x7E37, 0xE37E, 0x7E39, 0xE37C, 0x7E3A, 0xE381, 0x7E3B, 0xE37A, + 0x7E3D, 0xE360, 0x7E3E, 0x90D1, 0x7E41, 0x94C9, 0x7E43, 0xE37D, + 0x7E46, 0xE378, 0x7E4A, 0x9140, 0x7E4B, 0x8C71, 0x7E4D, 0x8F4A, + 0x7E52, 0xFB8F, 0x7E54, 0x9044, 0x7E55, 0x9155, 0x7E56, 0xE384, + 0x7E59, 0xE386, 0x7E5A, 0xE387, 0x7E5D, 0xE383, 0x7E5E, 0xE385, + 0x7E66, 0xE379, 0x7E67, 0xE382, 0x7E69, 0xE38A, 0x7E6A, 0xE389, + 0x7E6D, 0x969A, 0x7E70, 0x8C4A, 0x7E79, 0xE388, 0x7E7B, 0xE38C, + 0x7E7C, 0xE38B, 0x7E7D, 0xE38F, 0x7E7F, 0xE391, 0x7E82, 0x8E5B, + 0x7E83, 0xE38D, 0x7E88, 0xE392, 0x7E89, 0xE393, 0x7E8A, 0xFA5C, + 0x7E8C, 0xE394, 0x7E8E, 0xE39A, 0x7E8F, 0x935A, 0x7E90, 0xE396, + 0x7E92, 0xE395, 0x7E93, 0xE397, 0x7E94, 0xE398, 0x7E96, 0xE399, + 0x7E9B, 0xE39B, 0x7E9C, 0xE39C, 0x7F36, 0x8ACA, 0x7F38, 0xE39D, + 0x7F3A, 0xE39E, 0x7F45, 0xE39F, 0x7F47, 0xFB90, 0x7F4C, 0xE3A0, + 0x7F4D, 0xE3A1, 0x7F4E, 0xE3A2, 0x7F50, 0xE3A3, 0x7F51, 0xE3A4, + 0x7F54, 0xE3A6, 0x7F55, 0xE3A5, 0x7F58, 0xE3A7, 0x7F5F, 0xE3A8, + 0x7F60, 0xE3A9, 0x7F67, 0xE3AC, 0x7F68, 0xE3AA, 0x7F69, 0xE3AB, + 0x7F6A, 0x8DDF, 0x7F6B, 0x8C72, 0x7F6E, 0x9275, 0x7F70, 0x94B1, + 0x7F72, 0x8F90, 0x7F75, 0x946C, 0x7F77, 0x94EB, 0x7F78, 0xE3AD, + 0x7F79, 0x9CEB, 0x7F82, 0xE3AE, 0x7F83, 0xE3B0, 0x7F85, 0x9785, + 0x7F86, 0xE3AF, 0x7F87, 0xE3B2, 0x7F88, 0xE3B1, 0x7F8A, 0x9772, + 0x7F8C, 0xE3B3, 0x7F8E, 0x94FC, 0x7F94, 0xE3B4, 0x7F9A, 0xE3B7, + 0x7F9D, 0xE3B6, 0x7F9E, 0xE3B5, 0x7FA1, 0xFB91, 0x7FA3, 0xE3B8, + 0x7FA4, 0x8C51, 0x7FA8, 0x9141, 0x7FA9, 0x8B60, 0x7FAE, 0xE3BC, + 0x7FAF, 0xE3B9, 0x7FB2, 0xE3BA, 0x7FB6, 0xE3BD, 0x7FB8, 0xE3BE, + 0x7FB9, 0xE3BB, 0x7FBD, 0x8948, 0x7FC1, 0x89A5, 0x7FC5, 0xE3C0, + 0x7FC6, 0xE3C1, 0x7FCA, 0xE3C2, 0x7FCC, 0x9782, 0x7FD2, 0x8F4B, + 0x7FD4, 0xE3C4, 0x7FD5, 0xE3C3, 0x7FE0, 0x9089, 0x7FE1, 0xE3C5, + 0x7FE6, 0xE3C6, 0x7FE9, 0xE3C7, 0x7FEB, 0x8AE3, 0x7FF0, 0x8ACB, + 0x7FF3, 0xE3C8, 0x7FF9, 0xE3C9, 0x7FFB, 0x967C, 0x7FFC, 0x9783, + 0x8000, 0x9773, 0x8001, 0x9856, 0x8003, 0x8D6C, 0x8004, 0xE3CC, + 0x8005, 0x8ED2, 0x8006, 0xE3CB, 0x800B, 0xE3CD, 0x800C, 0x8EA7, + 0x8010, 0x91CF, 0x8012, 0xE3CE, 0x8015, 0x8D6B, 0x8017, 0x96D5, + 0x8018, 0xE3CF, 0x8019, 0xE3D0, 0x801C, 0xE3D1, 0x8021, 0xE3D2, + 0x8028, 0xE3D3, 0x8033, 0x8EA8, 0x8036, 0x96EB, 0x803B, 0xE3D5, + 0x803D, 0x925E, 0x803F, 0xE3D4, 0x8046, 0xE3D7, 0x804A, 0xE3D6, + 0x8052, 0xE3D8, 0x8056, 0x90B9, 0x8058, 0xE3D9, 0x805A, 0xE3DA, + 0x805E, 0x95B7, 0x805F, 0xE3DB, 0x8061, 0x918F, 0x8062, 0xE3DC, + 0x8068, 0xE3DD, 0x806F, 0x97FC, 0x8070, 0xE3E0, 0x8072, 0xE3DF, + 0x8073, 0xE3DE, 0x8074, 0x92AE, 0x8076, 0xE3E1, 0x8077, 0x9045, + 0x8079, 0xE3E2, 0x807D, 0xE3E3, 0x807E, 0x9857, 0x807F, 0xE3E4, + 0x8084, 0xE3E5, 0x8085, 0xE3E7, 0x8086, 0xE3E6, 0x8087, 0x94A3, + 0x8089, 0x93F7, 0x808B, 0x985D, 0x808C, 0x94A7, 0x8093, 0xE3E9, + 0x8096, 0x8FD1, 0x8098, 0x9549, 0x809A, 0xE3EA, 0x809B, 0xE3E8, + 0x809D, 0x8ACC, 0x80A1, 0x8CD2, 0x80A2, 0x8E88, 0x80A5, 0x94EC, + 0x80A9, 0x8CA8, 0x80AA, 0x9662, 0x80AC, 0xE3ED, 0x80AD, 0xE3EB, + 0x80AF, 0x8D6D, 0x80B1, 0x8D6E, 0x80B2, 0x88E7, 0x80B4, 0x8DE6, + 0x80BA, 0x9478, 0x80C3, 0x88DD, 0x80C4, 0xE3F2, 0x80C6, 0x925F, + 0x80CC, 0x9477, 0x80CE, 0x91D9, 0x80D6, 0xE3F4, 0x80D9, 0xE3F0, + 0x80DA, 0xE3F3, 0x80DB, 0xE3EE, 0x80DD, 0xE3F1, 0x80DE, 0x9645, + 0x80E1, 0x8CD3, 0x80E4, 0x88FB, 0x80E5, 0xE3EF, 0x80EF, 0xE3F6, + 0x80F1, 0xE3F7, 0x80F4, 0x93B7, 0x80F8, 0x8BB9, 0x80FC, 0xE445, + 0x80FD, 0x945C, 0x8102, 0x8E89, 0x8105, 0x8BBA, 0x8106, 0x90C6, + 0x8107, 0x9865, 0x8108, 0x96AC, 0x8109, 0xE3F5, 0x810A, 0x90D2, + 0x811A, 0x8B72, 0x811B, 0xE3F8, 0x8123, 0xE3FA, 0x8129, 0xE3F9, + 0x812F, 0xE3FB, 0x8131, 0x9245, 0x8133, 0x945D, 0x8139, 0x92AF, + 0x813E, 0xE442, 0x8146, 0xE441, 0x814B, 0xE3FC, 0x814E, 0x9074, + 0x8150, 0x9585, 0x8151, 0xE444, 0x8153, 0xE443, 0x8154, 0x8D6F, + 0x8155, 0x9872, 0x815F, 0xE454, 0x8165, 0xE448, 0x8166, 0xE449, + 0x816B, 0x8EEE, 0x816E, 0xE447, 0x8170, 0x8D98, 0x8171, 0xE446, + 0x8174, 0xE44A, 0x8178, 0x92B0, 0x8179, 0x95A0, 0x817A, 0x9142, + 0x817F, 0x91DA, 0x8180, 0xE44E, 0x8182, 0xE44F, 0x8183, 0xE44B, + 0x8188, 0xE44C, 0x818A, 0xE44D, 0x818F, 0x8D70, 0x8193, 0xE455, + 0x8195, 0xE451, 0x819A, 0x9586, 0x819C, 0x968C, 0x819D, 0x9547, + 0x81A0, 0xE450, 0x81A3, 0xE453, 0x81A4, 0xE452, 0x81A8, 0x9663, + 0x81A9, 0xE456, 0x81B0, 0xE457, 0x81B3, 0x9156, 0x81B5, 0xE458, + 0x81B8, 0xE45A, 0x81BA, 0xE45E, 0x81BD, 0xE45B, 0x81BE, 0xE459, + 0x81BF, 0x945E, 0x81C0, 0xE45C, 0x81C2, 0xE45D, 0x81C6, 0x89B0, + 0x81C8, 0xE464, 0x81C9, 0xE45F, 0x81CD, 0xE460, 0x81D1, 0xE461, + 0x81D3, 0x919F, 0x81D8, 0xE463, 0x81D9, 0xE462, 0x81DA, 0xE465, + 0x81DF, 0xE466, 0x81E0, 0xE467, 0x81E3, 0x9062, 0x81E5, 0x89E7, + 0x81E7, 0xE468, 0x81E8, 0x97D5, 0x81EA, 0x8EA9, 0x81ED, 0x8F4C, + 0x81F3, 0x8E8A, 0x81F4, 0x9276, 0x81FA, 0xE469, 0x81FB, 0xE46A, + 0x81FC, 0x8950, 0x81FE, 0xE46B, 0x8201, 0xE46C, 0x8202, 0xE46D, + 0x8205, 0xE46E, 0x8207, 0xE46F, 0x8208, 0x8BBB, 0x8209, 0x9DA8, + 0x820A, 0xE470, 0x820C, 0x90E3, 0x820D, 0xE471, 0x820E, 0x8EC9, + 0x8210, 0xE472, 0x8212, 0x98AE, 0x8216, 0xE473, 0x8217, 0x95DC, + 0x8218, 0x8ADA, 0x821B, 0x9143, 0x821C, 0x8F77, 0x821E, 0x9591, + 0x821F, 0x8F4D, 0x8229, 0xE474, 0x822A, 0x8D71, 0x822B, 0xE475, + 0x822C, 0x94CA, 0x822E, 0xE484, 0x8233, 0xE477, 0x8235, 0x91C7, + 0x8236, 0x9495, 0x8237, 0x8CBD, 0x8238, 0xE476, 0x8239, 0x9144, + 0x8240, 0xE478, 0x8247, 0x92F8, 0x8258, 0xE47A, 0x8259, 0xE479, + 0x825A, 0xE47C, 0x825D, 0xE47B, 0x825F, 0xE47D, 0x8262, 0xE480, + 0x8264, 0xE47E, 0x8266, 0x8ACD, 0x8268, 0xE481, 0x826A, 0xE482, + 0x826B, 0xE483, 0x826E, 0x8DAF, 0x826F, 0x97C7, 0x8271, 0xE485, + 0x8272, 0x9046, 0x8276, 0x8990, 0x8277, 0xE486, 0x8278, 0xE487, + 0x827E, 0xE488, 0x828B, 0x88F0, 0x828D, 0xE489, 0x8292, 0xE48A, + 0x8299, 0x9587, 0x829D, 0x8EC5, 0x829F, 0xE48C, 0x82A5, 0x8A48, + 0x82A6, 0x88B0, 0x82AB, 0xE48B, 0x82AC, 0xE48E, 0x82AD, 0x946D, + 0x82AF, 0x9063, 0x82B1, 0x89D4, 0x82B3, 0x9646, 0x82B8, 0x8C7C, + 0x82B9, 0x8BDA, 0x82BB, 0xE48D, 0x82BD, 0x89E8, 0x82C5, 0x8AA1, + 0x82D1, 0x8991, 0x82D2, 0xE492, 0x82D3, 0x97E8, 0x82D4, 0x91DB, + 0x82D7, 0x9563, 0x82D9, 0xE49E, 0x82DB, 0x89D5, 0x82DC, 0xE49C, + 0x82DE, 0xE49A, 0x82DF, 0xE491, 0x82E1, 0xE48F, 0x82E3, 0xE490, + 0x82E5, 0x8EE1, 0x82E6, 0x8BEA, 0x82E7, 0x9297, 0x82EB, 0x93CF, + 0x82F1, 0x8970, 0x82F3, 0xE494, 0x82F4, 0xE493, 0x82F9, 0xE499, + 0x82FA, 0xE495, 0x82FB, 0xE498, 0x8301, 0xFB93, 0x8302, 0x96CE, + 0x8303, 0xE497, 0x8304, 0x89D6, 0x8305, 0x8A9D, 0x8306, 0xE49B, + 0x8309, 0xE49D, 0x830E, 0x8C73, 0x8316, 0xE4A1, 0x8317, 0xE4AA, + 0x8318, 0xE4AB, 0x831C, 0x88A9, 0x8323, 0xE4B2, 0x8328, 0x88EF, + 0x832B, 0xE4A9, 0x832F, 0xE4A8, 0x8331, 0xE4A3, 0x8332, 0xE4A2, + 0x8334, 0xE4A0, 0x8335, 0xE49F, 0x8336, 0x9283, 0x8338, 0x91F9, + 0x8339, 0xE4A5, 0x8340, 0xE4A4, 0x8345, 0xE4A7, 0x8349, 0x9190, + 0x834A, 0x8C74, 0x834F, 0x8960, 0x8350, 0xE4A6, 0x8352, 0x8D72, + 0x8358, 0x9191, 0x8362, 0xFB94, 0x8373, 0xE4B8, 0x8375, 0xE4B9, + 0x8377, 0x89D7, 0x837B, 0x89AC, 0x837C, 0xE4B6, 0x837F, 0xFB95, + 0x8385, 0xE4AC, 0x8387, 0xE4B4, 0x8389, 0xE4BB, 0x838A, 0xE4B5, + 0x838E, 0xE4B3, 0x8393, 0xE496, 0x8396, 0xE4B1, 0x839A, 0xE4AD, + 0x839E, 0x8ACE, 0x839F, 0xE4AF, 0x83A0, 0xE4BA, 0x83A2, 0xE4B0, + 0x83A8, 0xE4BC, 0x83AA, 0xE4AE, 0x83AB, 0x949C, 0x83B1, 0x9789, + 0x83B5, 0xE4B7, 0x83BD, 0xE4CD, 0x83C1, 0xE4C5, 0x83C5, 0x909B, + 0x83C7, 0xFB96, 0x83CA, 0x8B65, 0x83CC, 0x8BDB, 0x83CE, 0xE4C0, + 0x83D3, 0x89D9, 0x83D6, 0x8FD2, 0x83D8, 0xE4C3, 0x83DC, 0x8DD8, + 0x83DF, 0x9370, 0x83E0, 0xE4C8, 0x83E9, 0x95EC, 0x83EB, 0xE4BF, + 0x83EF, 0x89D8, 0x83F0, 0x8CD4, 0x83F1, 0x9548, 0x83F2, 0xE4C9, + 0x83F4, 0xE4BD, 0x83F6, 0xFB97, 0x83F7, 0xE4C6, 0x83FB, 0xE4D0, + 0x83FD, 0xE4C1, 0x8403, 0xE4C2, 0x8404, 0x93B8, 0x8407, 0xE4C7, + 0x840B, 0xE4C4, 0x840C, 0x9647, 0x840D, 0xE4CA, 0x840E, 0x88DE, + 0x8413, 0xE4BE, 0x8420, 0xE4CC, 0x8422, 0xE4CB, 0x8429, 0x948B, + 0x842A, 0xE4D2, 0x842C, 0xE4DD, 0x8431, 0x8A9E, 0x8435, 0xE4E0, + 0x8438, 0xE4CE, 0x843C, 0xE4D3, 0x843D, 0x978E, 0x8446, 0xE4DC, + 0x8448, 0xFB98, 0x8449, 0x9774, 0x844E, 0x97A8, 0x8457, 0x9298, + 0x845B, 0x8A8B, 0x8461, 0x9592, 0x8462, 0xE4E2, 0x8463, 0x939F, + 0x8466, 0x88AF, 0x8469, 0xE4DB, 0x846B, 0xE4D7, 0x846C, 0x9192, + 0x846D, 0xE4D1, 0x846E, 0xE4D9, 0x846F, 0xE4DE, 0x8471, 0x944B, + 0x8475, 0x88A8, 0x8477, 0xE4D6, 0x8479, 0xE4DF, 0x847A, 0x9598, + 0x8482, 0xE4DA, 0x8484, 0xE4D5, 0x848B, 0x8FD3, 0x8490, 0x8F4E, + 0x8494, 0x8EAA, 0x8499, 0x96D6, 0x849C, 0x9566, 0x849F, 0xE4E5, + 0x84A1, 0xE4EE, 0x84AD, 0xE4D8, 0x84B2, 0x8A97, 0x84B4, 0xFB99, + 0x84B8, 0x8FF6, 0x84B9, 0xE4E3, 0x84BB, 0xE4E8, 0x84BC, 0x9193, + 0x84BF, 0xE4E4, 0x84C1, 0xE4EB, 0x84C4, 0x927E, 0x84C6, 0xE4EC, + 0x84C9, 0x9775, 0x84CA, 0xE4E1, 0x84CB, 0x8A57, 0x84CD, 0xE4E7, + 0x84D0, 0xE4EA, 0x84D1, 0x96AA, 0x84D6, 0xE4ED, 0x84D9, 0xE4E6, + 0x84DA, 0xE4E9, 0x84DC, 0xFA60, 0x84EC, 0x9648, 0x84EE, 0x9840, + 0x84F4, 0xE4F1, 0x84FC, 0xE4F8, 0x84FF, 0xE4F0, 0x8500, 0x8EC1, + 0x8506, 0xE4CF, 0x8511, 0x95CC, 0x8513, 0x96A0, 0x8514, 0xE4F7, + 0x8515, 0xE4F6, 0x8517, 0xE4F2, 0x8518, 0xE4F3, 0x851A, 0x8955, + 0x851F, 0xE4F5, 0x8521, 0xE4EF, 0x8526, 0x92D3, 0x852C, 0xE4F4, + 0x852D, 0x88FC, 0x8535, 0x91A0, 0x853D, 0x95C1, 0x8540, 0xE4F9, + 0x8541, 0xE540, 0x8543, 0x94D7, 0x8548, 0xE4FC, 0x8549, 0x8FD4, + 0x854A, 0x8EC7, 0x854B, 0xE542, 0x854E, 0x8BBC, 0x8553, 0xFB9A, + 0x8555, 0xE543, 0x8557, 0x9599, 0x8558, 0xE4FB, 0x8559, 0xFB9B, + 0x855A, 0xE4D4, 0x8563, 0xE4FA, 0x8568, 0x986E, 0x8569, 0x93A0, + 0x856A, 0x9593, 0x856B, 0xFB9C, 0x856D, 0xE54A, 0x8577, 0xE550, + 0x857E, 0xE551, 0x8580, 0xE544, 0x8584, 0x9496, 0x8587, 0xE54E, + 0x8588, 0xE546, 0x858A, 0xE548, 0x8590, 0xE552, 0x8591, 0xE547, + 0x8594, 0xE54B, 0x8597, 0x8992, 0x8599, 0x93E3, 0x859B, 0xE54C, + 0x859C, 0xE54F, 0x85A4, 0xE545, 0x85A6, 0x9145, 0x85A8, 0xE549, + 0x85A9, 0x8E46, 0x85AA, 0x9064, 0x85AB, 0x8C4F, 0x85AC, 0x96F2, + 0x85AE, 0x96F7, 0x85AF, 0x8F92, 0x85B0, 0xFB9E, 0x85B9, 0xE556, + 0x85BA, 0xE554, 0x85C1, 0x986D, 0x85C9, 0xE553, 0x85CD, 0x9795, + 0x85CF, 0xE555, 0x85D0, 0xE557, 0x85D5, 0xE558, 0x85DC, 0xE55B, + 0x85DD, 0xE559, 0x85E4, 0x93A1, 0x85E5, 0xE55A, 0x85E9, 0x94CB, + 0x85EA, 0xE54D, 0x85F7, 0x8F93, 0x85F9, 0xE55C, 0x85FA, 0xE561, + 0x85FB, 0x9194, 0x85FE, 0xE560, 0x8602, 0xE541, 0x8606, 0xE562, + 0x8607, 0x9168, 0x860A, 0xE55D, 0x860B, 0xE55F, 0x8613, 0xE55E, + 0x8616, 0x9F50, 0x8617, 0x9F41, 0x861A, 0xE564, 0x8622, 0xE563, + 0x862D, 0x9796, 0x862F, 0xE1BA, 0x8630, 0xE565, 0x863F, 0xE566, + 0x864D, 0xE567, 0x864E, 0x8CD5, 0x8650, 0x8B73, 0x8654, 0xE569, + 0x8655, 0x997C, 0x865A, 0x8B95, 0x865C, 0x97B8, 0x865E, 0x8BF1, + 0x865F, 0xE56A, 0x8667, 0xE56B, 0x866B, 0x928E, 0x8671, 0xE56C, + 0x8679, 0x93F8, 0x867B, 0x88B8, 0x868A, 0x89E1, 0x868B, 0xE571, + 0x868C, 0xE572, 0x8693, 0xE56D, 0x8695, 0x8E5C, 0x86A3, 0xE56E, + 0x86A4, 0x9461, 0x86A9, 0xE56F, 0x86AA, 0xE570, 0x86AB, 0xE57A, + 0x86AF, 0xE574, 0x86B0, 0xE577, 0x86B6, 0xE573, 0x86C4, 0xE575, + 0x86C6, 0xE576, 0x86C7, 0x8ED6, 0x86C9, 0xE578, 0x86CB, 0x9260, + 0x86CD, 0x8C75, 0x86CE, 0x8A61, 0x86D4, 0xE57B, 0x86D9, 0x8A5E, + 0x86DB, 0xE581, 0x86DE, 0xE57C, 0x86DF, 0xE580, 0x86E4, 0x94B8, + 0x86E9, 0xE57D, 0x86EC, 0xE57E, 0x86ED, 0x9567, 0x86EE, 0x94D8, + 0x86EF, 0xE582, 0x86F8, 0x91FB, 0x86F9, 0xE58C, 0x86FB, 0xE588, + 0x86FE, 0x89E9, 0x8700, 0xE586, 0x8702, 0x9649, 0x8703, 0xE587, + 0x8706, 0xE584, 0x8708, 0xE585, 0x8709, 0xE58A, 0x870A, 0xE58D, + 0x870D, 0xE58B, 0x8711, 0xE589, 0x8712, 0xE583, 0x8718, 0x9277, + 0x871A, 0xE594, 0x871C, 0x96A8, 0x8725, 0xE592, 0x8729, 0xE593, + 0x8734, 0xE58E, 0x8737, 0xE590, 0x873B, 0xE591, 0x873F, 0xE58F, + 0x8749, 0x90E4, 0x874B, 0x9858, 0x874C, 0xE598, 0x874E, 0xE599, + 0x8753, 0xE59F, 0x8755, 0x9049, 0x8757, 0xE59B, 0x8759, 0xE59E, + 0x875F, 0xE596, 0x8760, 0xE595, 0x8763, 0xE5A0, 0x8766, 0x89DA, + 0x8768, 0xE59C, 0x876A, 0xE5A1, 0x876E, 0xE59D, 0x8774, 0xE59A, + 0x8776, 0x92B1, 0x8778, 0xE597, 0x877F, 0x9488, 0x8782, 0xE5A5, + 0x878D, 0x975A, 0x879F, 0xE5A4, 0x87A2, 0xE5A3, 0x87AB, 0xE5AC, + 0x87AF, 0xE5A6, 0x87B3, 0xE5AE, 0x87BA, 0x9786, 0x87BB, 0xE5B1, + 0x87BD, 0xE5A8, 0x87C0, 0xE5A9, 0x87C4, 0xE5AD, 0x87C6, 0xE5B0, + 0x87C7, 0xE5AF, 0x87CB, 0xE5A7, 0x87D0, 0xE5AA, 0x87D2, 0xE5BB, + 0x87E0, 0xE5B4, 0x87EF, 0xE5B2, 0x87F2, 0xE5B3, 0x87F6, 0xE5B8, + 0x87F7, 0xE5B9, 0x87F9, 0x8A49, 0x87FB, 0x8B61, 0x87FE, 0xE5B7, + 0x8805, 0xE5A2, 0x8807, 0xFBA1, 0x880D, 0xE5B6, 0x880E, 0xE5BA, + 0x880F, 0xE5B5, 0x8811, 0xE5BC, 0x8815, 0xE5BE, 0x8816, 0xE5BD, + 0x8821, 0xE5C0, 0x8822, 0xE5BF, 0x8823, 0xE579, 0x8827, 0xE5C4, + 0x8831, 0xE5C1, 0x8836, 0xE5C2, 0x8839, 0xE5C3, 0x883B, 0xE5C5, + 0x8840, 0x8C8C, 0x8842, 0xE5C7, 0x8844, 0xE5C6, 0x8846, 0x8F4F, + 0x884C, 0x8D73, 0x884D, 0x9FA5, 0x8852, 0xE5C8, 0x8853, 0x8F70, + 0x8857, 0x8A58, 0x8859, 0xE5C9, 0x885B, 0x8971, 0x885D, 0x8FD5, + 0x885E, 0xE5CA, 0x8861, 0x8D74, 0x8862, 0xE5CB, 0x8863, 0x88DF, + 0x8868, 0x955C, 0x886B, 0xE5CC, 0x8870, 0x908A, 0x8872, 0xE5D3, + 0x8875, 0xE5D0, 0x8877, 0x928F, 0x887D, 0xE5D1, 0x887E, 0xE5CE, + 0x887F, 0x8BDC, 0x8881, 0xE5CD, 0x8882, 0xE5D4, 0x8888, 0x8C55, + 0x888B, 0x91DC, 0x888D, 0xE5DA, 0x8892, 0xE5D6, 0x8896, 0x91B3, + 0x8897, 0xE5D5, 0x8899, 0xE5D8, 0x889E, 0xE5CF, 0x88A2, 0xE5D9, + 0x88A4, 0xE5DB, 0x88AB, 0x94ED, 0x88AE, 0xE5D7, 0x88B0, 0xE5DC, + 0x88B1, 0xE5DE, 0x88B4, 0x8CD1, 0x88B5, 0xE5D2, 0x88B7, 0x88BF, + 0x88BF, 0xE5DD, 0x88C1, 0x8DD9, 0x88C2, 0x97F4, 0x88C3, 0xE5DF, + 0x88C4, 0xE5E0, 0x88C5, 0x9195, 0x88CF, 0x97A0, 0x88D4, 0xE5E1, + 0x88D5, 0x9754, 0x88D8, 0xE5E2, 0x88D9, 0xE5E3, 0x88DC, 0x95E2, + 0x88DD, 0xE5E4, 0x88DF, 0x8DBE, 0x88E1, 0x97A1, 0x88E8, 0xE5E9, + 0x88F2, 0xE5EA, 0x88F3, 0x8FD6, 0x88F4, 0xE5E8, 0x88F5, 0xFBA2, + 0x88F8, 0x9787, 0x88F9, 0xE5E5, 0x88FC, 0xE5E7, 0x88FD, 0x90BB, + 0x88FE, 0x909E, 0x8902, 0xE5E6, 0x8904, 0xE5EB, 0x8907, 0x95A1, + 0x890A, 0xE5ED, 0x890C, 0xE5EC, 0x8910, 0x8A8C, 0x8912, 0x964A, + 0x8913, 0xE5EE, 0x891C, 0xFA5D, 0x891D, 0xE5FA, 0x891E, 0xE5F0, + 0x8925, 0xE5F1, 0x892A, 0xE5F2, 0x892B, 0xE5F3, 0x8936, 0xE5F7, + 0x8938, 0xE5F8, 0x893B, 0xE5F6, 0x8941, 0xE5F4, 0x8943, 0xE5EF, + 0x8944, 0xE5F5, 0x894C, 0xE5F9, 0x894D, 0xE8B5, 0x8956, 0x89A6, + 0x895E, 0xE5FC, 0x895F, 0x8BDD, 0x8960, 0xE5FB, 0x8964, 0xE641, + 0x8966, 0xE640, 0x896A, 0xE643, 0x896D, 0xE642, 0x896F, 0xE644, + 0x8972, 0x8F50, 0x8974, 0xE645, 0x8977, 0xE646, 0x897E, 0xE647, + 0x897F, 0x90BC, 0x8981, 0x9776, 0x8983, 0xE648, 0x8986, 0x95A2, + 0x8987, 0x9465, 0x8988, 0xE649, 0x898A, 0xE64A, 0x898B, 0x8CA9, + 0x898F, 0x8B4B, 0x8993, 0xE64B, 0x8996, 0x8E8B, 0x8997, 0x9460, + 0x8998, 0xE64C, 0x899A, 0x8A6F, 0x89A1, 0xE64D, 0x89A6, 0xE64F, + 0x89A7, 0x9797, 0x89A9, 0xE64E, 0x89AA, 0x9065, 0x89AC, 0xE650, + 0x89AF, 0xE651, 0x89B2, 0xE652, 0x89B3, 0x8ACF, 0x89BA, 0xE653, + 0x89BD, 0xE654, 0x89BF, 0xE655, 0x89C0, 0xE656, 0x89D2, 0x8A70, + 0x89DA, 0xE657, 0x89DC, 0xE658, 0x89DD, 0xE659, 0x89E3, 0x89F0, + 0x89E6, 0x9047, 0x89E7, 0xE65A, 0x89F4, 0xE65B, 0x89F8, 0xE65C, + 0x8A00, 0x8CBE, 0x8A02, 0x92F9, 0x8A03, 0xE65D, 0x8A08, 0x8C76, + 0x8A0A, 0x9075, 0x8A0C, 0xE660, 0x8A0E, 0x93A2, 0x8A10, 0xE65F, + 0x8A12, 0xFBA3, 0x8A13, 0x8C50, 0x8A16, 0xE65E, 0x8A17, 0x91F5, + 0x8A18, 0x8B4C, 0x8A1B, 0xE661, 0x8A1D, 0xE662, 0x8A1F, 0x8FD7, + 0x8A23, 0x8C8D, 0x8A25, 0xE663, 0x8A2A, 0x964B, 0x8A2D, 0x90DD, + 0x8A31, 0x8B96, 0x8A33, 0x96F3, 0x8A34, 0x9169, 0x8A36, 0xE664, + 0x8A37, 0xFBA4, 0x8A3A, 0x9066, 0x8A3B, 0x9290, 0x8A3C, 0x8FD8, + 0x8A41, 0xE665, 0x8A46, 0xE668, 0x8A48, 0xE669, 0x8A50, 0x8DBC, + 0x8A51, 0x91C0, 0x8A52, 0xE667, 0x8A54, 0x8FD9, 0x8A55, 0x955D, + 0x8A5B, 0xE666, 0x8A5E, 0x8E8C, 0x8A60, 0x8972, 0x8A62, 0xE66D, + 0x8A63, 0x8C77, 0x8A66, 0x8E8E, 0x8A69, 0x8E8D, 0x8A6B, 0x986C, + 0x8A6C, 0xE66C, 0x8A6D, 0xE66B, 0x8A6E, 0x9146, 0x8A70, 0x8B6C, + 0x8A71, 0x9862, 0x8A72, 0x8A59, 0x8A73, 0x8FDA, 0x8A79, 0xFBA5, + 0x8A7C, 0xE66A, 0x8A82, 0xE66F, 0x8A84, 0xE670, 0x8A85, 0xE66E, + 0x8A87, 0x8CD6, 0x8A89, 0x975F, 0x8A8C, 0x8E8F, 0x8A8D, 0x9446, + 0x8A91, 0xE673, 0x8A93, 0x90BE, 0x8A95, 0x9261, 0x8A98, 0x9755, + 0x8A9A, 0xE676, 0x8A9E, 0x8CEA, 0x8AA0, 0x90BD, 0x8AA1, 0xE672, + 0x8AA3, 0xE677, 0x8AA4, 0x8CEB, 0x8AA5, 0xE674, 0x8AA6, 0xE675, + 0x8AA7, 0xFBA6, 0x8AA8, 0xE671, 0x8AAC, 0x90E0, 0x8AAD, 0x93C7, + 0x8AB0, 0x924E, 0x8AB2, 0x89DB, 0x8AB9, 0x94EE, 0x8ABC, 0x8B62, + 0x8ABE, 0xFBA7, 0x8ABF, 0x92B2, 0x8AC2, 0xE67A, 0x8AC4, 0xE678, + 0x8AC7, 0x926B, 0x8ACB, 0x90BF, 0x8ACC, 0x8AD0, 0x8ACD, 0xE679, + 0x8ACF, 0x907A, 0x8AD2, 0x97C8, 0x8AD6, 0x985F, 0x8ADA, 0xE67B, + 0x8ADB, 0xE687, 0x8ADC, 0x92B3, 0x8ADE, 0xE686, 0x8ADF, 0xFBA8, + 0x8AE0, 0xE683, 0x8AE1, 0xE68B, 0x8AE2, 0xE684, 0x8AE4, 0xE680, + 0x8AE6, 0x92FA, 0x8AE7, 0xE67E, 0x8AEB, 0xE67C, 0x8AED, 0x9740, + 0x8AEE, 0x8E90, 0x8AF1, 0xE681, 0x8AF3, 0xE67D, 0x8AF6, 0xFBAA, + 0x8AF7, 0xE685, 0x8AF8, 0x8F94, 0x8AFA, 0x8CBF, 0x8AFE, 0x91F8, + 0x8B00, 0x9664, 0x8B01, 0x8979, 0x8B02, 0x88E0, 0x8B04, 0x93A3, + 0x8B07, 0xE689, 0x8B0C, 0xE688, 0x8B0E, 0x93E4, 0x8B10, 0xE68D, + 0x8B14, 0xE682, 0x8B16, 0xE68C, 0x8B17, 0xE68E, 0x8B19, 0x8CAA, + 0x8B1A, 0xE68A, 0x8B1B, 0x8D75, 0x8B1D, 0x8ED3, 0x8B20, 0xE68F, + 0x8B21, 0x9777, 0x8B26, 0xE692, 0x8B28, 0xE695, 0x8B2B, 0xE693, + 0x8B2C, 0x9554, 0x8B33, 0xE690, 0x8B39, 0x8BDE, 0x8B3E, 0xE694, + 0x8B41, 0xE696, 0x8B49, 0xE69A, 0x8B4C, 0xE697, 0x8B4E, 0xE699, + 0x8B4F, 0xE698, 0x8B53, 0xFBAB, 0x8B56, 0xE69B, 0x8B58, 0x8EAF, + 0x8B5A, 0xE69D, 0x8B5B, 0xE69C, 0x8B5C, 0x9588, 0x8B5F, 0xE69F, + 0x8B66, 0x8C78, 0x8B6B, 0xE69E, 0x8B6C, 0xE6A0, 0x8B6F, 0xE6A1, + 0x8B70, 0x8B63, 0x8B71, 0xE3BF, 0x8B72, 0x8FF7, 0x8B74, 0xE6A2, + 0x8B77, 0x8CEC, 0x8B7D, 0xE6A3, 0x8B7F, 0xFBAC, 0x8B80, 0xE6A4, + 0x8B83, 0x8E5D, 0x8B8A, 0x9DCC, 0x8B8C, 0xE6A5, 0x8B8E, 0xE6A6, + 0x8B90, 0x8F51, 0x8B92, 0xE6A7, 0x8B93, 0xE6A8, 0x8B96, 0xE6A9, + 0x8B99, 0xE6AA, 0x8B9A, 0xE6AB, 0x8C37, 0x924A, 0x8C3A, 0xE6AC, + 0x8C3F, 0xE6AE, 0x8C41, 0xE6AD, 0x8C46, 0x93A4, 0x8C48, 0xE6AF, + 0x8C4A, 0x964C, 0x8C4C, 0xE6B0, 0x8C4E, 0xE6B1, 0x8C50, 0xE6B2, + 0x8C55, 0xE6B3, 0x8C5A, 0x93D8, 0x8C61, 0x8FDB, 0x8C62, 0xE6B4, + 0x8C6A, 0x8D8B, 0x8C6B, 0x98AC, 0x8C6C, 0xE6B5, 0x8C78, 0xE6B6, + 0x8C79, 0x955E, 0x8C7A, 0xE6B7, 0x8C7C, 0xE6BF, 0x8C82, 0xE6B8, + 0x8C85, 0xE6BA, 0x8C89, 0xE6B9, 0x8C8A, 0xE6BB, 0x8C8C, 0x9665, + 0x8C8D, 0xE6BC, 0x8C8E, 0xE6BD, 0x8C94, 0xE6BE, 0x8C98, 0xE6C0, + 0x8C9D, 0x8A4C, 0x8C9E, 0x92E5, 0x8CA0, 0x9589, 0x8CA1, 0x8DE0, + 0x8CA2, 0x8D76, 0x8CA7, 0x956E, 0x8CA8, 0x89DD, 0x8CA9, 0x94CC, + 0x8CAA, 0xE6C3, 0x8CAB, 0x8AD1, 0x8CAC, 0x90D3, 0x8CAD, 0xE6C2, + 0x8CAE, 0xE6C7, 0x8CAF, 0x9299, 0x8CB0, 0x96E1, 0x8CB2, 0xE6C5, + 0x8CB3, 0xE6C6, 0x8CB4, 0x8B4D, 0x8CB6, 0xE6C8, 0x8CB7, 0x9483, + 0x8CB8, 0x91DD, 0x8CBB, 0x94EF, 0x8CBC, 0x935C, 0x8CBD, 0xE6C4, + 0x8CBF, 0x9666, 0x8CC0, 0x89EA, 0x8CC1, 0xE6CA, 0x8CC2, 0x9847, + 0x8CC3, 0x92C0, 0x8CC4, 0x9864, 0x8CC7, 0x8E91, 0x8CC8, 0xE6C9, + 0x8CCA, 0x91AF, 0x8CCD, 0xE6DA, 0x8CCE, 0x9147, 0x8CD1, 0x93F6, + 0x8CD3, 0x956F, 0x8CDA, 0xE6CD, 0x8CDB, 0x8E5E, 0x8CDC, 0x8E92, + 0x8CDE, 0x8FDC, 0x8CE0, 0x9485, 0x8CE2, 0x8CAB, 0x8CE3, 0xE6CC, + 0x8CE4, 0xE6CB, 0x8CE6, 0x958A, 0x8CEA, 0x8EBF, 0x8CED, 0x9371, + 0x8CF0, 0xFBAD, 0x8CF4, 0xFBAE, 0x8CFA, 0xE6CF, 0x8CFB, 0xE6D0, + 0x8CFC, 0x8D77, 0x8CFD, 0xE6CE, 0x8D04, 0xE6D1, 0x8D05, 0xE6D2, + 0x8D07, 0xE6D4, 0x8D08, 0x91A1, 0x8D0A, 0xE6D3, 0x8D0B, 0x8AE4, + 0x8D0D, 0xE6D6, 0x8D0F, 0xE6D5, 0x8D10, 0xE6D7, 0x8D12, 0xFBAF, + 0x8D13, 0xE6D9, 0x8D14, 0xE6DB, 0x8D16, 0xE6DC, 0x8D64, 0x90D4, + 0x8D66, 0x8ECD, 0x8D67, 0xE6DD, 0x8D6B, 0x8A71, 0x8D6D, 0xE6DE, + 0x8D70, 0x9196, 0x8D71, 0xE6DF, 0x8D73, 0xE6E0, 0x8D74, 0x958B, + 0x8D76, 0xFBB0, 0x8D77, 0x8B4E, 0x8D81, 0xE6E1, 0x8D85, 0x92B4, + 0x8D8A, 0x897A, 0x8D99, 0xE6E2, 0x8DA3, 0x8EEF, 0x8DA8, 0x9096, + 0x8DB3, 0x91AB, 0x8DBA, 0xE6E5, 0x8DBE, 0xE6E4, 0x8DC2, 0xE6E3, + 0x8DCB, 0xE6EB, 0x8DCC, 0xE6E9, 0x8DCF, 0xE6E6, 0x8DD6, 0xE6E8, + 0x8DDA, 0xE6E7, 0x8DDB, 0xE6EA, 0x8DDD, 0x8B97, 0x8DDF, 0xE6EE, + 0x8DE1, 0x90D5, 0x8DE3, 0xE6EF, 0x8DE8, 0x8CD7, 0x8DEA, 0xE6EC, + 0x8DEB, 0xE6ED, 0x8DEF, 0x9848, 0x8DF3, 0x92B5, 0x8DF5, 0x9148, + 0x8DFC, 0xE6F0, 0x8DFF, 0xE6F3, 0x8E08, 0xE6F1, 0x8E09, 0xE6F2, + 0x8E0A, 0x9778, 0x8E0F, 0x93A5, 0x8E10, 0xE6F6, 0x8E1D, 0xE6F4, + 0x8E1E, 0xE6F5, 0x8E1F, 0xE6F7, 0x8E2A, 0xE748, 0x8E30, 0xE6FA, + 0x8E34, 0xE6FB, 0x8E35, 0xE6F9, 0x8E42, 0xE6F8, 0x8E44, 0x92FB, + 0x8E47, 0xE740, 0x8E48, 0xE744, 0x8E49, 0xE741, 0x8E4A, 0xE6FC, + 0x8E4C, 0xE742, 0x8E50, 0xE743, 0x8E55, 0xE74A, 0x8E59, 0xE745, + 0x8E5F, 0x90D6, 0x8E60, 0xE747, 0x8E63, 0xE749, 0x8E64, 0xE746, + 0x8E72, 0xE74C, 0x8E74, 0x8F52, 0x8E76, 0xE74B, 0x8E7C, 0xE74D, + 0x8E81, 0xE74E, 0x8E84, 0xE751, 0x8E85, 0xE750, 0x8E87, 0xE74F, + 0x8E8A, 0xE753, 0x8E8B, 0xE752, 0x8E8D, 0x96F4, 0x8E91, 0xE755, + 0x8E93, 0xE754, 0x8E94, 0xE756, 0x8E99, 0xE757, 0x8EA1, 0xE759, + 0x8EAA, 0xE758, 0x8EAB, 0x9067, 0x8EAC, 0xE75A, 0x8EAF, 0x8BEB, + 0x8EB0, 0xE75B, 0x8EB1, 0xE75D, 0x8EBE, 0xE75E, 0x8EC5, 0xE75F, + 0x8EC6, 0xE75C, 0x8EC8, 0xE760, 0x8ECA, 0x8ED4, 0x8ECB, 0xE761, + 0x8ECC, 0x8B4F, 0x8ECD, 0x8C52, 0x8ECF, 0xFBB2, 0x8ED2, 0x8CAC, + 0x8EDB, 0xE762, 0x8EDF, 0x93EE, 0x8EE2, 0x935D, 0x8EE3, 0xE763, + 0x8EEB, 0xE766, 0x8EF8, 0x8EB2, 0x8EFB, 0xE765, 0x8EFC, 0xE764, + 0x8EFD, 0x8C79, 0x8EFE, 0xE767, 0x8F03, 0x8A72, 0x8F05, 0xE769, + 0x8F09, 0x8DDA, 0x8F0A, 0xE768, 0x8F0C, 0xE771, 0x8F12, 0xE76B, + 0x8F13, 0xE76D, 0x8F14, 0x95E3, 0x8F15, 0xE76A, 0x8F19, 0xE76C, + 0x8F1B, 0xE770, 0x8F1C, 0xE76E, 0x8F1D, 0x8B50, 0x8F1F, 0xE76F, + 0x8F26, 0xE772, 0x8F29, 0x9479, 0x8F2A, 0x97D6, 0x8F2F, 0x8F53, + 0x8F33, 0xE773, 0x8F38, 0x9741, 0x8F39, 0xE775, 0x8F3B, 0xE774, + 0x8F3E, 0xE778, 0x8F3F, 0x9760, 0x8F42, 0xE777, 0x8F44, 0x8A8D, + 0x8F45, 0xE776, 0x8F46, 0xE77B, 0x8F49, 0xE77A, 0x8F4C, 0xE779, + 0x8F4D, 0x9351, 0x8F4E, 0xE77C, 0x8F57, 0xE77D, 0x8F5C, 0xE77E, + 0x8F5F, 0x8D8C, 0x8F61, 0x8C44, 0x8F62, 0xE780, 0x8F63, 0xE781, + 0x8F64, 0xE782, 0x8F9B, 0x9068, 0x8F9C, 0xE783, 0x8F9E, 0x8EAB, + 0x8F9F, 0xE784, 0x8FA3, 0xE785, 0x8FA7, 0x999F, 0x8FA8, 0x999E, + 0x8FAD, 0xE786, 0x8FAE, 0xE390, 0x8FAF, 0xE787, 0x8FB0, 0x9243, + 0x8FB1, 0x904A, 0x8FB2, 0x945F, 0x8FB7, 0xE788, 0x8FBA, 0x95D3, + 0x8FBB, 0x92D2, 0x8FBC, 0x8D9E, 0x8FBF, 0x9248, 0x8FC2, 0x8949, + 0x8FC4, 0x9698, 0x8FC5, 0x9076, 0x8FCE, 0x8C7D, 0x8FD1, 0x8BDF, + 0x8FD4, 0x95D4, 0x8FDA, 0xE789, 0x8FE2, 0xE78B, 0x8FE5, 0xE78A, + 0x8FE6, 0x89DE, 0x8FE9, 0x93F4, 0x8FEA, 0xE78C, 0x8FEB, 0x9497, + 0x8FED, 0x9352, 0x8FEF, 0xE78D, 0x8FF0, 0x8F71, 0x8FF4, 0xE78F, + 0x8FF7, 0x96C0, 0x8FF8, 0xE79E, 0x8FF9, 0xE791, 0x8FFA, 0xE792, + 0x8FFD, 0x92C7, 0x9000, 0x91DE, 0x9001, 0x9197, 0x9003, 0x93A6, + 0x9005, 0xE790, 0x9006, 0x8B74, 0x900B, 0xE799, 0x900D, 0xE796, + 0x900E, 0xE7A3, 0x900F, 0x93A7, 0x9010, 0x9280, 0x9011, 0xE793, + 0x9013, 0x92FC, 0x9014, 0x9372, 0x9015, 0xE794, 0x9016, 0xE798, + 0x9017, 0x9080, 0x9019, 0x9487, 0x901A, 0x92CA, 0x901D, 0x90C0, + 0x901E, 0xE797, 0x901F, 0x91AC, 0x9020, 0x91A2, 0x9021, 0xE795, + 0x9022, 0x88A7, 0x9023, 0x9841, 0x9027, 0xE79A, 0x902E, 0x91DF, + 0x9031, 0x8F54, 0x9032, 0x9069, 0x9035, 0xE79C, 0x9036, 0xE79B, + 0x9038, 0x88ED, 0x9039, 0xE79D, 0x903C, 0x954E, 0x903E, 0xE7A5, + 0x9041, 0x93D9, 0x9042, 0x908B, 0x9045, 0x9278, 0x9047, 0x8BF6, + 0x9049, 0xE7A4, 0x904A, 0x9756, 0x904B, 0x895E, 0x904D, 0x95D5, + 0x904E, 0x89DF, 0x904F, 0xE79F, 0x9050, 0xE7A0, 0x9051, 0xE7A1, + 0x9052, 0xE7A2, 0x9053, 0x93B9, 0x9054, 0x9242, 0x9055, 0x88E1, + 0x9056, 0xE7A6, 0x9058, 0xE7A7, 0x9059, 0xEAA1, 0x905C, 0x91BB, + 0x905E, 0xE7A8, 0x9060, 0x8993, 0x9061, 0x916B, 0x9063, 0x8CAD, + 0x9065, 0x9779, 0x9067, 0xFBB5, 0x9068, 0xE7A9, 0x9069, 0x934B, + 0x906D, 0x9198, 0x906E, 0x8ED5, 0x906F, 0xE7AA, 0x9072, 0xE7AD, + 0x9075, 0x8F85, 0x9076, 0xE7AB, 0x9077, 0x914A, 0x9078, 0x9149, + 0x907A, 0x88E2, 0x907C, 0x97C9, 0x907D, 0xE7AF, 0x907F, 0x94F0, + 0x9080, 0xE7B1, 0x9081, 0xE7B0, 0x9082, 0xE7AE, 0x9083, 0xE284, + 0x9084, 0x8AD2, 0x9087, 0xE78E, 0x9089, 0xE7B3, 0x908A, 0xE7B2, + 0x908F, 0xE7B4, 0x9091, 0x9757, 0x90A3, 0x93DF, 0x90A6, 0x964D, + 0x90A8, 0xE7B5, 0x90AA, 0x8ED7, 0x90AF, 0xE7B6, 0x90B1, 0xE7B7, + 0x90B5, 0xE7B8, 0x90B8, 0x9340, 0x90C1, 0x88E8, 0x90CA, 0x8D78, + 0x90CE, 0x9859, 0x90DB, 0xE7BC, 0x90DE, 0xFBB6, 0x90E1, 0x8C53, + 0x90E2, 0xE7B9, 0x90E4, 0xE7BA, 0x90E8, 0x9594, 0x90ED, 0x8A73, + 0x90F5, 0x9758, 0x90F7, 0x8BBD, 0x90FD, 0x9373, 0x9102, 0xE7BD, + 0x9112, 0xE7BE, 0x9115, 0xFBB8, 0x9119, 0xE7BF, 0x9127, 0xFBB9, + 0x912D, 0x9341, 0x9130, 0xE7C1, 0x9132, 0xE7C0, 0x9149, 0x93D1, + 0x914A, 0xE7C2, 0x914B, 0x8F55, 0x914C, 0x8EDE, 0x914D, 0x947A, + 0x914E, 0x9291, 0x9152, 0x8EF0, 0x9154, 0x908C, 0x9156, 0xE7C3, + 0x9158, 0xE7C4, 0x9162, 0x907C, 0x9163, 0xE7C5, 0x9165, 0xE7C6, + 0x9169, 0xE7C7, 0x916A, 0x978F, 0x916C, 0x8F56, 0x9172, 0xE7C9, + 0x9173, 0xE7C8, 0x9175, 0x8D79, 0x9177, 0x8D93, 0x9178, 0x8E5F, + 0x9182, 0xE7CC, 0x9187, 0x8F86, 0x9189, 0xE7CB, 0x918B, 0xE7CA, + 0x918D, 0x91E7, 0x9190, 0x8CED, 0x9192, 0x90C1, 0x9197, 0x94AE, + 0x919C, 0x8F58, 0x91A2, 0xE7CD, 0x91A4, 0x8FDD, 0x91AA, 0xE7D0, + 0x91AB, 0xE7CE, 0x91AF, 0xE7CF, 0x91B4, 0xE7D2, 0x91B5, 0xE7D1, + 0x91B8, 0x8FF8, 0x91BA, 0xE7D3, 0x91C0, 0xE7D4, 0x91C1, 0xE7D5, + 0x91C6, 0x94CE, 0x91C7, 0x8DD1, 0x91C8, 0x8EDF, 0x91C9, 0xE7D6, + 0x91CB, 0xE7D7, 0x91CC, 0x97A2, 0x91CD, 0x8F64, 0x91CE, 0x96EC, + 0x91CF, 0x97CA, 0x91D0, 0xE7D8, 0x91D1, 0x8BE0, 0x91D6, 0xE7D9, + 0x91D7, 0xFBBB, 0x91D8, 0x9342, 0x91DA, 0xFBBA, 0x91DB, 0xE7DC, + 0x91DC, 0x8A98, 0x91DD, 0x906A, 0x91DE, 0xFBBC, 0x91DF, 0xE7DA, + 0x91E1, 0xE7DB, 0x91E3, 0x92DE, 0x91E4, 0xFBBF, 0x91E5, 0xFBC0, + 0x91E6, 0x9674, 0x91E7, 0x8BFA, 0x91ED, 0xFBBD, 0x91EE, 0xFBBE, + 0x91F5, 0xE7DE, 0x91F6, 0xE7DF, 0x91FC, 0xE7DD, 0x91FF, 0xE7E1, + 0x9206, 0xFBC1, 0x920A, 0xFBC3, 0x920D, 0x93DD, 0x920E, 0x8A62, + 0x9210, 0xFBC2, 0x9211, 0xE7E5, 0x9214, 0xE7E2, 0x9215, 0xE7E4, + 0x921E, 0xE7E0, 0x9229, 0xE86E, 0x922C, 0xE7E3, 0x9234, 0x97E9, + 0x9237, 0x8CD8, 0x9239, 0xFBCA, 0x923A, 0xFBC4, 0x923C, 0xFBC6, + 0x923F, 0xE7ED, 0x9240, 0xFBC5, 0x9244, 0x9353, 0x9245, 0xE7E8, + 0x9248, 0xE7EB, 0x9249, 0xE7E9, 0x924B, 0xE7EE, 0x924E, 0xFBC7, + 0x9250, 0xE7EF, 0x9251, 0xFBC9, 0x9257, 0xE7E7, 0x9259, 0xFBC8, + 0x925A, 0xE7F4, 0x925B, 0x8994, 0x925E, 0xE7E6, 0x9262, 0x94AB, + 0x9264, 0xE7EA, 0x9266, 0x8FDE, 0x9267, 0xFBCB, 0x9271, 0x8D7A, + 0x9277, 0xFBCD, 0x9278, 0xFBCE, 0x927E, 0x9667, 0x9280, 0x8BE2, + 0x9283, 0x8F65, 0x9285, 0x93BA, 0x9288, 0xFA5F, 0x9291, 0x914C, + 0x9293, 0xE7F2, 0x9295, 0xE7EC, 0x9296, 0xE7F1, 0x9298, 0x96C1, + 0x929A, 0x92B6, 0x929B, 0xE7F3, 0x929C, 0xE7F0, 0x92A7, 0xFBCC, + 0x92AD, 0x914B, 0x92B7, 0xE7F7, 0x92B9, 0xE7F6, 0x92CF, 0xE7F5, + 0x92D0, 0xFBD2, 0x92D2, 0x964E, 0x92D3, 0xFBD6, 0x92D5, 0xFBD4, + 0x92D7, 0xFBD0, 0x92D9, 0xFBD1, 0x92E0, 0xFBD5, 0x92E4, 0x8F9B, + 0x92E7, 0xFBCF, 0x92E9, 0xE7F8, 0x92EA, 0x95DD, 0x92ED, 0x8973, + 0x92F2, 0x9565, 0x92F3, 0x9292, 0x92F8, 0x8B98, 0x92F9, 0xFA65, + 0x92FA, 0xE7FA, 0x92FB, 0xFBD9, 0x92FC, 0x8D7C, 0x92FF, 0xFBDC, + 0x9302, 0xFBDE, 0x9306, 0x8E4B, 0x930F, 0xE7F9, 0x9310, 0x908D, + 0x9318, 0x908E, 0x9319, 0xE840, 0x931A, 0xE842, 0x931D, 0xFBDD, + 0x931E, 0xFBDB, 0x9320, 0x8FF9, 0x9321, 0xFBD8, 0x9322, 0xE841, + 0x9323, 0xE843, 0x9325, 0xFBD7, 0x9326, 0x8BD1, 0x9328, 0x9564, + 0x932B, 0x8EE0, 0x932C, 0x9842, 0x932E, 0xE7FC, 0x932F, 0x8DF6, + 0x9332, 0x985E, 0x9335, 0xE845, 0x933A, 0xE844, 0x933B, 0xE846, + 0x9344, 0xE7FB, 0x9348, 0xFA5E, 0x934B, 0x93E7, 0x934D, 0x9374, + 0x9354, 0x92D5, 0x9356, 0xE84B, 0x9357, 0xFBE0, 0x935B, 0x9262, + 0x935C, 0xE847, 0x9360, 0xE848, 0x936C, 0x8C4C, 0x936E, 0xE84A, + 0x9370, 0xFBDF, 0x9375, 0x8CAE, 0x937C, 0xE849, 0x937E, 0x8FDF, + 0x938C, 0x8A99, 0x9394, 0xE84F, 0x9396, 0x8DBD, 0x9397, 0x9199, + 0x939A, 0x92C8, 0x93A4, 0xFBE1, 0x93A7, 0x8A5A, 0x93AC, 0xE84D, + 0x93AD, 0xE84E, 0x93AE, 0x92C1, 0x93B0, 0xE84C, 0x93B9, 0xE850, + 0x93C3, 0xE856, 0x93C6, 0xFBE2, 0x93C8, 0xE859, 0x93D0, 0xE858, + 0x93D1, 0x934C, 0x93D6, 0xE851, 0x93D7, 0xE852, 0x93D8, 0xE855, + 0x93DD, 0xE857, 0x93DE, 0xFBE3, 0x93E1, 0x8BBE, 0x93E4, 0xE85A, + 0x93E5, 0xE854, 0x93E8, 0xE853, 0x93F8, 0xFBE4, 0x9403, 0xE85E, + 0x9407, 0xE85F, 0x9410, 0xE860, 0x9413, 0xE85D, 0x9414, 0xE85C, + 0x9418, 0x8FE0, 0x9419, 0x93A8, 0x941A, 0xE85B, 0x9421, 0xE864, + 0x942B, 0xE862, 0x9431, 0xFBE5, 0x9435, 0xE863, 0x9436, 0xE861, + 0x9438, 0x91F6, 0x943A, 0xE865, 0x9441, 0xE866, 0x9444, 0xE868, + 0x9445, 0xFBE6, 0x9448, 0xFBE7, 0x9451, 0x8AD3, 0x9452, 0xE867, + 0x9453, 0x96F8, 0x945A, 0xE873, 0x945B, 0xE869, 0x945E, 0xE86C, + 0x9460, 0xE86A, 0x9462, 0xE86B, 0x946A, 0xE86D, 0x9470, 0xE86F, + 0x9475, 0xE870, 0x9477, 0xE871, 0x947C, 0xE874, 0x947D, 0xE872, + 0x947E, 0xE875, 0x947F, 0xE877, 0x9481, 0xE876, 0x9577, 0x92B7, + 0x9580, 0x96E5, 0x9582, 0xE878, 0x9583, 0x914D, 0x9587, 0xE879, + 0x9589, 0x95C2, 0x958A, 0xE87A, 0x958B, 0x8A4A, 0x958F, 0x895B, + 0x9591, 0x8AD5, 0x9592, 0xFBE8, 0x9593, 0x8AD4, 0x9594, 0xE87B, + 0x9596, 0xE87C, 0x9598, 0xE87D, 0x9599, 0xE87E, 0x95A0, 0xE880, + 0x95A2, 0x8AD6, 0x95A3, 0x8A74, 0x95A4, 0x8D7D, 0x95A5, 0x94B4, + 0x95A7, 0xE882, 0x95A8, 0xE881, 0x95AD, 0xE883, 0x95B2, 0x897B, + 0x95B9, 0xE886, 0x95BB, 0xE885, 0x95BC, 0xE884, 0x95BE, 0xE887, + 0x95C3, 0xE88A, 0x95C7, 0x88C5, 0x95CA, 0xE888, 0x95CC, 0xE88C, + 0x95CD, 0xE88B, 0x95D4, 0xE88E, 0x95D5, 0xE88D, 0x95D6, 0xE88F, + 0x95D8, 0x93AC, 0x95DC, 0xE890, 0x95E1, 0xE891, 0x95E2, 0xE893, + 0x95E5, 0xE892, 0x961C, 0x958C, 0x9621, 0xE894, 0x9628, 0xE895, + 0x962A, 0x8DE3, 0x962E, 0xE896, 0x962F, 0xE897, 0x9632, 0x9668, + 0x963B, 0x916A, 0x963F, 0x88A2, 0x9640, 0x91C9, 0x9642, 0xE898, + 0x9644, 0x958D, 0x964B, 0xE89B, 0x964C, 0xE899, 0x964D, 0x8D7E, + 0x964F, 0xE89A, 0x9650, 0x8CC0, 0x965B, 0x95C3, 0x965C, 0xE89D, + 0x965D, 0xE89F, 0x965E, 0xE89E, 0x965F, 0xE8A0, 0x9662, 0x8940, + 0x9663, 0x9077, 0x9664, 0x8F9C, 0x9665, 0x8AD7, 0x9666, 0xE8A1, + 0x966A, 0x9486, 0x966C, 0xE8A3, 0x9670, 0x8941, 0x9672, 0xE8A2, + 0x9673, 0x92C2, 0x9675, 0x97CB, 0x9676, 0x93A9, 0x9677, 0xE89C, + 0x9678, 0x97A4, 0x967A, 0x8CAF, 0x967D, 0x977A, 0x9685, 0x8BF7, + 0x9686, 0x97B2, 0x9688, 0x8C47, 0x968A, 0x91E0, 0x968B, 0xE440, + 0x968D, 0xE8A4, 0x968E, 0x8A4B, 0x968F, 0x908F, 0x9694, 0x8A75, + 0x9695, 0xE8A6, 0x9697, 0xE8A7, 0x9698, 0xE8A5, 0x9699, 0x8C84, + 0x969B, 0x8DDB, 0x969C, 0x8FE1, 0x969D, 0xFBEB, 0x96A0, 0x8942, + 0x96A3, 0x97D7, 0x96A7, 0xE8A9, 0x96A8, 0xE7AC, 0x96AA, 0xE8A8, + 0x96AF, 0xFBEC, 0x96B0, 0xE8AC, 0x96B1, 0xE8AA, 0x96B2, 0xE8AB, + 0x96B4, 0xE8AD, 0x96B6, 0xE8AE, 0x96B7, 0x97EA, 0x96B8, 0xE8AF, + 0x96B9, 0xE8B0, 0x96BB, 0x90C7, 0x96BC, 0x94B9, 0x96C0, 0x909D, + 0x96C1, 0x8AE5, 0x96C4, 0x9759, 0x96C5, 0x89EB, 0x96C6, 0x8F57, + 0x96C7, 0x8CD9, 0x96C9, 0xE8B3, 0x96CB, 0xE8B2, 0x96CC, 0x8E93, + 0x96CD, 0xE8B4, 0x96CE, 0xE8B1, 0x96D1, 0x8E47, 0x96D5, 0xE8B8, + 0x96D6, 0xE5AB, 0x96D9, 0x99D4, 0x96DB, 0x9097, 0x96DC, 0xE8B6, + 0x96E2, 0x97A3, 0x96E3, 0x93EF, 0x96E8, 0x894A, 0x96EA, 0x90E1, + 0x96EB, 0x8EB4, 0x96F0, 0x95B5, 0x96F2, 0x895F, 0x96F6, 0x97EB, + 0x96F7, 0x978B, 0x96F9, 0xE8B9, 0x96FB, 0x9364, 0x9700, 0x8EF9, + 0x9704, 0xE8BA, 0x9706, 0xE8BB, 0x9707, 0x906B, 0x9708, 0xE8BC, + 0x970A, 0x97EC, 0x970D, 0xE8B7, 0x970E, 0xE8BE, 0x970F, 0xE8C0, + 0x9711, 0xE8BF, 0x9713, 0xE8BD, 0x9716, 0xE8C1, 0x9719, 0xE8C2, + 0x971C, 0x919A, 0x971E, 0x89E0, 0x9724, 0xE8C3, 0x9727, 0x96B6, + 0x972A, 0xE8C4, 0x9730, 0xE8C5, 0x9732, 0x9849, 0x9733, 0xFBED, + 0x9738, 0x9E50, 0x9739, 0xE8C6, 0x973B, 0xFBEE, 0x973D, 0xE8C7, + 0x973E, 0xE8C8, 0x9742, 0xE8CC, 0x9743, 0xFBEF, 0x9744, 0xE8C9, + 0x9746, 0xE8CA, 0x9748, 0xE8CB, 0x9749, 0xE8CD, 0x974D, 0xFBF0, + 0x974F, 0xFBF1, 0x9751, 0xFBF2, 0x9752, 0x90C2, 0x9755, 0xFBF3, + 0x9756, 0x96F5, 0x9759, 0x90C3, 0x975C, 0xE8CE, 0x975E, 0x94F1, + 0x9760, 0xE8CF, 0x9761, 0xEA72, 0x9762, 0x96CA, 0x9764, 0xE8D0, + 0x9766, 0xE8D1, 0x9768, 0xE8D2, 0x9769, 0x8A76, 0x976B, 0xE8D4, + 0x976D, 0x9078, 0x9771, 0xE8D5, 0x9774, 0x8C43, 0x9779, 0xE8D6, + 0x977A, 0xE8DA, 0x977C, 0xE8D8, 0x9781, 0xE8D9, 0x9784, 0x8A93, + 0x9785, 0xE8D7, 0x9786, 0xE8DB, 0x978B, 0xE8DC, 0x978D, 0x88C6, + 0x978F, 0xE8DD, 0x9790, 0xE8DE, 0x9798, 0x8FE2, 0x979C, 0xE8DF, + 0x97A0, 0x8B66, 0x97A3, 0xE8E2, 0x97A6, 0xE8E1, 0x97A8, 0xE8E0, + 0x97AB, 0xE691, 0x97AD, 0x95DA, 0x97B3, 0xE8E3, 0x97B4, 0xE8E4, + 0x97C3, 0xE8E5, 0x97C6, 0xE8E6, 0x97C8, 0xE8E7, 0x97CB, 0xE8E8, + 0x97D3, 0x8AD8, 0x97DC, 0xE8E9, 0x97ED, 0xE8EA, 0x97EE, 0x9442, + 0x97F2, 0xE8EC, 0x97F3, 0x89B9, 0x97F5, 0xE8EF, 0x97F6, 0xE8EE, + 0x97FB, 0x8943, 0x97FF, 0x8BBF, 0x9801, 0x95C5, 0x9802, 0x92B8, + 0x9803, 0x8DA0, 0x9805, 0x8D80, 0x9806, 0x8F87, 0x9808, 0x907B, + 0x980C, 0xE8F1, 0x980F, 0xE8F0, 0x9810, 0x9761, 0x9811, 0x8AE6, + 0x9812, 0x94D0, 0x9813, 0x93DA, 0x9817, 0x909C, 0x9818, 0x97CC, + 0x981A, 0x8C7A, 0x9821, 0xE8F4, 0x9824, 0xE8F3, 0x982C, 0x966A, + 0x982D, 0x93AA, 0x9834, 0x896F, 0x9837, 0xE8F5, 0x9838, 0xE8F2, + 0x983B, 0x9570, 0x983C, 0x978A, 0x983D, 0xE8F6, 0x9846, 0xE8F7, + 0x984B, 0xE8F9, 0x984C, 0x91E8, 0x984D, 0x8A7A, 0x984E, 0x8A7B, + 0x984F, 0xE8F8, 0x9854, 0x8AE7, 0x9855, 0x8CB0, 0x9857, 0xFBF4, + 0x9858, 0x8AE8, 0x985B, 0x935E, 0x985E, 0x97DE, 0x9865, 0xFBF5, + 0x9867, 0x8CDA, 0x986B, 0xE8FA, 0x986F, 0xE8FB, 0x9870, 0xE8FC, + 0x9871, 0xE940, 0x9873, 0xE942, 0x9874, 0xE941, 0x98A8, 0x9597, + 0x98AA, 0xE943, 0x98AF, 0xE944, 0x98B1, 0xE945, 0x98B6, 0xE946, + 0x98C3, 0xE948, 0x98C4, 0xE947, 0x98C6, 0xE949, 0x98DB, 0x94F2, + 0x98DC, 0xE3CA, 0x98DF, 0x9048, 0x98E2, 0x8B51, 0x98E9, 0xE94A, + 0x98EB, 0xE94B, 0x98ED, 0x99AA, 0x98EE, 0x9F5A, 0x98EF, 0x94D1, + 0x98F2, 0x88F9, 0x98F4, 0x88B9, 0x98FC, 0x8E94, 0x98FD, 0x964F, + 0x98FE, 0x8FFC, 0x9903, 0xE94C, 0x9905, 0x96DD, 0x9909, 0xE94D, + 0x990A, 0x977B, 0x990C, 0x8961, 0x9910, 0x8E60, 0x9912, 0xE94E, + 0x9913, 0x89EC, 0x9914, 0xE94F, 0x9918, 0xE950, 0x991D, 0xE952, + 0x991E, 0xE953, 0x9920, 0xE955, 0x9921, 0xE951, 0x9924, 0xE954, + 0x9927, 0xFBF8, 0x9928, 0x8AD9, 0x992C, 0xE956, 0x992E, 0xE957, + 0x993D, 0xE958, 0x993E, 0xE959, 0x9942, 0xE95A, 0x9945, 0xE95C, + 0x9949, 0xE95B, 0x994B, 0xE95E, 0x994C, 0xE961, 0x9950, 0xE95D, + 0x9951, 0xE95F, 0x9952, 0xE960, 0x9955, 0xE962, 0x9957, 0x8BC0, + 0x9996, 0x8EF1, 0x9997, 0xE963, 0x9998, 0xE964, 0x9999, 0x8D81, + 0x999E, 0xFBFA, 0x99A5, 0xE965, 0x99A8, 0x8A5D, 0x99AC, 0x946E, + 0x99AD, 0xE966, 0x99AE, 0xE967, 0x99B3, 0x9279, 0x99B4, 0x93E9, + 0x99BC, 0xE968, 0x99C1, 0x949D, 0x99C4, 0x91CA, 0x99C5, 0x8977, + 0x99C6, 0x8BEC, 0x99C8, 0x8BED, 0x99D0, 0x9293, 0x99D1, 0xE96D, + 0x99D2, 0x8BEE, 0x99D5, 0x89ED, 0x99D8, 0xE96C, 0x99DB, 0xE96A, + 0x99DD, 0xE96B, 0x99DF, 0xE969, 0x99E2, 0xE977, 0x99ED, 0xE96E, + 0x99EE, 0xE96F, 0x99F1, 0xE970, 0x99F2, 0xE971, 0x99F8, 0xE973, + 0x99FB, 0xE972, 0x99FF, 0x8F78, 0x9A01, 0xE974, 0x9A05, 0xE976, + 0x9A0E, 0x8B52, 0x9A0F, 0xE975, 0x9A12, 0x919B, 0x9A13, 0x8CB1, + 0x9A19, 0xE978, 0x9A28, 0x91CB, 0x9A2B, 0xE979, 0x9A30, 0x93AB, + 0x9A37, 0xE97A, 0x9A3E, 0xE980, 0x9A40, 0xE97D, 0x9A42, 0xE97C, + 0x9A43, 0xE97E, 0x9A45, 0xE97B, 0x9A4D, 0xE982, 0x9A4E, 0xFBFB, + 0x9A55, 0xE981, 0x9A57, 0xE984, 0x9A5A, 0x8BC1, 0x9A5B, 0xE983, + 0x9A5F, 0xE985, 0x9A62, 0xE986, 0x9A64, 0xE988, 0x9A65, 0xE987, + 0x9A69, 0xE989, 0x9A6A, 0xE98B, 0x9A6B, 0xE98A, 0x9AA8, 0x8D9C, + 0x9AAD, 0xE98C, 0x9AB0, 0xE98D, 0x9AB8, 0x8A5B, 0x9ABC, 0xE98E, + 0x9AC0, 0xE98F, 0x9AC4, 0x9091, 0x9ACF, 0xE990, 0x9AD1, 0xE991, + 0x9AD3, 0xE992, 0x9AD4, 0xE993, 0x9AD8, 0x8D82, 0x9AD9, 0xFBFC, + 0x9ADC, 0xFC40, 0x9ADE, 0xE994, 0x9ADF, 0xE995, 0x9AE2, 0xE996, + 0x9AE3, 0xE997, 0x9AE6, 0xE998, 0x9AEA, 0x94AF, 0x9AEB, 0xE99A, + 0x9AED, 0x9545, 0x9AEE, 0xE99B, 0x9AEF, 0xE999, 0x9AF1, 0xE99D, + 0x9AF4, 0xE99C, 0x9AF7, 0xE99E, 0x9AFB, 0xE99F, 0x9B06, 0xE9A0, + 0x9B18, 0xE9A1, 0x9B1A, 0xE9A2, 0x9B1F, 0xE9A3, 0x9B22, 0xE9A4, + 0x9B23, 0xE9A5, 0x9B25, 0xE9A6, 0x9B27, 0xE9A7, 0x9B28, 0xE9A8, + 0x9B29, 0xE9A9, 0x9B2A, 0xE9AA, 0x9B2E, 0xE9AB, 0x9B2F, 0xE9AC, + 0x9B31, 0x9F54, 0x9B32, 0xE9AD, 0x9B3B, 0xE2F6, 0x9B3C, 0x8B53, + 0x9B41, 0x8A40, 0x9B42, 0x8DB0, 0x9B43, 0xE9AF, 0x9B44, 0xE9AE, + 0x9B45, 0x96A3, 0x9B4D, 0xE9B1, 0x9B4E, 0xE9B2, 0x9B4F, 0xE9B0, + 0x9B51, 0xE9B3, 0x9B54, 0x9682, 0x9B58, 0xE9B4, 0x9B5A, 0x8B9B, + 0x9B6F, 0x9844, 0x9B72, 0xFC42, 0x9B74, 0xE9B5, 0x9B75, 0xFC41, + 0x9B83, 0xE9B7, 0x9B8E, 0x88BC, 0x9B8F, 0xFC43, 0x9B91, 0xE9B8, + 0x9B92, 0x95A9, 0x9B93, 0xE9B6, 0x9B96, 0xE9B9, 0x9B97, 0xE9BA, + 0x9B9F, 0xE9BB, 0x9BA0, 0xE9BC, 0x9BA8, 0xE9BD, 0x9BAA, 0x968E, + 0x9BAB, 0x8E4C, 0x9BAD, 0x8DF8, 0x9BAE, 0x914E, 0x9BB1, 0xFC44, + 0x9BB4, 0xE9BE, 0x9BB9, 0xE9C1, 0x9BBB, 0xFC45, 0x9BC0, 0xE9BF, + 0x9BC6, 0xE9C2, 0x9BC9, 0x8CEF, 0x9BCA, 0xE9C0, 0x9BCF, 0xE9C3, + 0x9BD1, 0xE9C4, 0x9BD2, 0xE9C5, 0x9BD4, 0xE9C9, 0x9BD6, 0x8E49, + 0x9BDB, 0x91E2, 0x9BE1, 0xE9CA, 0x9BE2, 0xE9C7, 0x9BE3, 0xE9C6, + 0x9BE4, 0xE9C8, 0x9BE8, 0x8C7E, 0x9BF0, 0xE9CE, 0x9BF1, 0xE9CD, + 0x9BF2, 0xE9CC, 0x9BF5, 0x88B1, 0x9C00, 0xFC46, 0x9C04, 0xE9D8, + 0x9C06, 0xE9D4, 0x9C08, 0xE9D5, 0x9C09, 0xE9D1, 0x9C0A, 0xE9D7, + 0x9C0C, 0xE9D3, 0x9C0D, 0x8A82, 0x9C10, 0x986B, 0x9C12, 0xE9D6, + 0x9C13, 0xE9D2, 0x9C14, 0xE9D0, 0x9C15, 0xE9CF, 0x9C1B, 0xE9DA, + 0x9C21, 0xE9DD, 0x9C24, 0xE9DC, 0x9C25, 0xE9DB, 0x9C2D, 0x9568, + 0x9C2E, 0xE9D9, 0x9C2F, 0x88F1, 0x9C30, 0xE9DE, 0x9C32, 0xE9E0, + 0x9C39, 0x8A8F, 0x9C3A, 0xE9CB, 0x9C3B, 0x8956, 0x9C3E, 0xE9E2, + 0x9C46, 0xE9E1, 0x9C47, 0xE9DF, 0x9C48, 0x924C, 0x9C52, 0x9690, + 0x9C57, 0x97D8, 0x9C5A, 0xE9E3, 0x9C60, 0xE9E4, 0x9C67, 0xE9E5, + 0x9C76, 0xE9E6, 0x9C78, 0xE9E7, 0x9CE5, 0x92B9, 0x9CE7, 0xE9E8, + 0x9CE9, 0x94B5, 0x9CEB, 0xE9ED, 0x9CEC, 0xE9E9, 0x9CF0, 0xE9EA, + 0x9CF3, 0x9650, 0x9CF4, 0x96C2, 0x9CF6, 0x93CE, 0x9D03, 0xE9EE, + 0x9D06, 0xE9EF, 0x9D07, 0x93BC, 0x9D08, 0xE9EC, 0x9D09, 0xE9EB, + 0x9D0E, 0x89A8, 0x9D12, 0xE9F7, 0x9D15, 0xE9F6, 0x9D1B, 0x8995, + 0x9D1F, 0xE9F4, 0x9D23, 0xE9F3, 0x9D26, 0xE9F1, 0x9D28, 0x8A9B, + 0x9D2A, 0xE9F0, 0x9D2B, 0x8EB0, 0x9D2C, 0x89A7, 0x9D3B, 0x8D83, + 0x9D3E, 0xE9FA, 0x9D3F, 0xE9F9, 0x9D41, 0xE9F8, 0x9D44, 0xE9F5, + 0x9D46, 0xE9FB, 0x9D48, 0xE9FC, 0x9D50, 0xEA44, 0x9D51, 0xEA43, + 0x9D59, 0xEA45, 0x9D5C, 0x894C, 0x9D5D, 0xEA40, 0x9D5E, 0xEA41, + 0x9D60, 0x8D94, 0x9D61, 0x96B7, 0x9D64, 0xEA42, 0x9D6B, 0xFC48, + 0x9D6C, 0x9651, 0x9D6F, 0xEA4A, 0x9D70, 0xFC47, 0x9D72, 0xEA46, + 0x9D7A, 0xEA4B, 0x9D87, 0xEA48, 0x9D89, 0xEA47, 0x9D8F, 0x8C7B, + 0x9D9A, 0xEA4C, 0x9DA4, 0xEA4D, 0x9DA9, 0xEA4E, 0x9DAB, 0xEA49, + 0x9DAF, 0xE9F2, 0x9DB2, 0xEA4F, 0x9DB4, 0x92DF, 0x9DB8, 0xEA53, + 0x9DBA, 0xEA54, 0x9DBB, 0xEA52, 0x9DC1, 0xEA51, 0x9DC2, 0xEA57, + 0x9DC4, 0xEA50, 0x9DC6, 0xEA55, 0x9DCF, 0xEA56, 0x9DD3, 0xEA59, + 0x9DD9, 0xEA58, 0x9DE6, 0xEA5B, 0x9DED, 0xEA5C, 0x9DEF, 0xEA5D, + 0x9DF2, 0x9868, 0x9DF8, 0xEA5A, 0x9DF9, 0x91E9, 0x9DFA, 0x8DEB, + 0x9DFD, 0xEA5E, 0x9E19, 0xFC4A, 0x9E1A, 0xEA5F, 0x9E1B, 0xEA60, + 0x9E1E, 0xEA61, 0x9E75, 0xEA62, 0x9E78, 0x8CB2, 0x9E79, 0xEA63, + 0x9E7D, 0xEA64, 0x9E7F, 0x8EAD, 0x9E81, 0xEA65, 0x9E88, 0xEA66, + 0x9E8B, 0xEA67, 0x9E8C, 0xEA68, 0x9E91, 0xEA6B, 0x9E92, 0xEA69, + 0x9E93, 0x985B, 0x9E95, 0xEA6A, 0x9E97, 0x97ED, 0x9E9D, 0xEA6C, + 0x9E9F, 0x97D9, 0x9EA5, 0xEA6D, 0x9EA6, 0x949E, 0x9EA9, 0xEA6E, + 0x9EAA, 0xEA70, 0x9EAD, 0xEA71, 0x9EB8, 0xEA6F, 0x9EB9, 0x8D8D, + 0x9EBA, 0x96CB, 0x9EBB, 0x9683, 0x9EBC, 0x9BF5, 0x9EBE, 0x9F80, + 0x9EBF, 0x969B, 0x9EC4, 0x89A9, 0x9ECC, 0xEA73, 0x9ECD, 0x8B6F, + 0x9ECE, 0xEA74, 0x9ECF, 0xEA75, 0x9ED0, 0xEA76, 0x9ED1, 0xFC4B, + 0x9ED2, 0x8D95, 0x9ED4, 0xEA77, 0x9ED8, 0xE0D2, 0x9ED9, 0x96D9, + 0x9EDB, 0x91E1, 0x9EDC, 0xEA78, 0x9EDD, 0xEA7A, 0x9EDE, 0xEA79, + 0x9EE0, 0xEA7B, 0x9EE5, 0xEA7C, 0x9EE8, 0xEA7D, 0x9EEF, 0xEA7E, + 0x9EF4, 0xEA80, 0x9EF6, 0xEA81, 0x9EF7, 0xEA82, 0x9EF9, 0xEA83, + 0x9EFB, 0xEA84, 0x9EFC, 0xEA85, 0x9EFD, 0xEA86, 0x9F07, 0xEA87, + 0x9F08, 0xEA88, 0x9F0E, 0x9343, 0x9F13, 0x8CDB, 0x9F15, 0xEA8A, + 0x9F20, 0x916C, 0x9F21, 0xEA8B, 0x9F2C, 0xEA8C, 0x9F3B, 0x9540, + 0x9F3E, 0xEA8D, 0x9F4A, 0xEA8E, 0x9F4B, 0xE256, 0x9F4E, 0xE6D8, + 0x9F4F, 0xE8EB, 0x9F52, 0xEA8F, 0x9F54, 0xEA90, 0x9F5F, 0xEA92, + 0x9F60, 0xEA93, 0x9F61, 0xEA94, 0x9F62, 0x97EE, 0x9F63, 0xEA91, + 0x9F66, 0xEA95, 0x9F67, 0xEA96, 0x9F6A, 0xEA98, 0x9F6C, 0xEA97, + 0x9F72, 0xEA9A, 0x9F76, 0xEA9B, 0x9F77, 0xEA99, 0x9F8D, 0x97B4, + 0x9F95, 0xEA9C, 0x9F9C, 0xEA9D, 0x9F9D, 0xE273, 0x9FA0, 0xEA9E, + 0xF929, 0xFAE0, 0xF9DC, 0xFBE9, 0xFA0E, 0xFA90, 0xFA0F, 0xFA9B, + 0xFA10, 0xFA9C, 0xFA11, 0xFAB1, 0xFA12, 0xFAD8, 0xFA13, 0xFAE8, + 0xFA14, 0xFAEA, 0xFA15, 0xFB58, 0xFA16, 0xFB5E, 0xFA17, 0xFB75, + 0xFA18, 0xFB7D, 0xFA19, 0xFB7E, 0xFA1A, 0xFB80, 0xFA1B, 0xFB82, + 0xFA1C, 0xFB86, 0xFA1D, 0xFB89, 0xFA1E, 0xFB92, 0xFA1F, 0xFB9D, + 0xFA20, 0xFB9F, 0xFA21, 0xFBA0, 0xFA22, 0xFBA9, 0xFA23, 0xFBB1, + 0xFA24, 0xFBB3, 0xFA25, 0xFBB4, 0xFA26, 0xFBB7, 0xFA27, 0xFBD3, + 0xFA28, 0xFBDA, 0xFA29, 0xFBEA, 0xFA2A, 0xFBF6, 0xFA2B, 0xFBF7, + 0xFA2C, 0xFBF9, 0xFA2D, 0xFC49, 0xFF01, 0x8149, 0xFF02, 0xFA57, + 0xFF03, 0x8194, 0xFF04, 0x8190, 0xFF05, 0x8193, 0xFF06, 0x8195, + 0xFF07, 0xFA56, 0xFF08, 0x8169, 0xFF09, 0x816A, 0xFF0A, 0x8196, + 0xFF0B, 0x817B, 0xFF0C, 0x8143, 0xFF0D, 0x817C, 0xFF0E, 0x8144, + 0xFF0F, 0x815E, 0xFF10, 0x824F, 0xFF11, 0x8250, 0xFF12, 0x8251, + 0xFF13, 0x8252, 0xFF14, 0x8253, 0xFF15, 0x8254, 0xFF16, 0x8255, + 0xFF17, 0x8256, 0xFF18, 0x8257, 0xFF19, 0x8258, 0xFF1A, 0x8146, + 0xFF1B, 0x8147, 0xFF1C, 0x8183, 0xFF1D, 0x8181, 0xFF1E, 0x8184, + 0xFF1F, 0x8148, 0xFF20, 0x8197, 0xFF21, 0x8260, 0xFF22, 0x8261, + 0xFF23, 0x8262, 0xFF24, 0x8263, 0xFF25, 0x8264, 0xFF26, 0x8265, + 0xFF27, 0x8266, 0xFF28, 0x8267, 0xFF29, 0x8268, 0xFF2A, 0x8269, + 0xFF2B, 0x826A, 0xFF2C, 0x826B, 0xFF2D, 0x826C, 0xFF2E, 0x826D, + 0xFF2F, 0x826E, 0xFF30, 0x826F, 0xFF31, 0x8270, 0xFF32, 0x8271, + 0xFF33, 0x8272, 0xFF34, 0x8273, 0xFF35, 0x8274, 0xFF36, 0x8275, + 0xFF37, 0x8276, 0xFF38, 0x8277, 0xFF39, 0x8278, 0xFF3A, 0x8279, + 0xFF3B, 0x816D, 0xFF3C, 0x815F, 0xFF3D, 0x816E, 0xFF3E, 0x814F, + 0xFF3F, 0x8151, 0xFF40, 0x814D, 0xFF41, 0x8281, 0xFF42, 0x8282, + 0xFF43, 0x8283, 0xFF44, 0x8284, 0xFF45, 0x8285, 0xFF46, 0x8286, + 0xFF47, 0x8287, 0xFF48, 0x8288, 0xFF49, 0x8289, 0xFF4A, 0x828A, + 0xFF4B, 0x828B, 0xFF4C, 0x828C, 0xFF4D, 0x828D, 0xFF4E, 0x828E, + 0xFF4F, 0x828F, 0xFF50, 0x8290, 0xFF51, 0x8291, 0xFF52, 0x8292, + 0xFF53, 0x8293, 0xFF54, 0x8294, 0xFF55, 0x8295, 0xFF56, 0x8296, + 0xFF57, 0x8297, 0xFF58, 0x8298, 0xFF59, 0x8299, 0xFF5A, 0x829A, + 0xFF5B, 0x816F, 0xFF5C, 0x8162, 0xFF5D, 0x8170, 0xFF5E, 0x8160, + 0xFF61, 0x00A1, 0xFF62, 0x00A2, 0xFF63, 0x00A3, 0xFF64, 0x00A4, + 0xFF65, 0x00A5, 0xFF66, 0x00A6, 0xFF67, 0x00A7, 0xFF68, 0x00A8, + 0xFF69, 0x00A9, 0xFF6A, 0x00AA, 0xFF6B, 0x00AB, 0xFF6C, 0x00AC, + 0xFF6D, 0x00AD, 0xFF6E, 0x00AE, 0xFF6F, 0x00AF, 0xFF70, 0x00B0, + 0xFF71, 0x00B1, 0xFF72, 0x00B2, 0xFF73, 0x00B3, 0xFF74, 0x00B4, + 0xFF75, 0x00B5, 0xFF76, 0x00B6, 0xFF77, 0x00B7, 0xFF78, 0x00B8, + 0xFF79, 0x00B9, 0xFF7A, 0x00BA, 0xFF7B, 0x00BB, 0xFF7C, 0x00BC, + 0xFF7D, 0x00BD, 0xFF7E, 0x00BE, 0xFF7F, 0x00BF, 0xFF80, 0x00C0, + 0xFF81, 0x00C1, 0xFF82, 0x00C2, 0xFF83, 0x00C3, 0xFF84, 0x00C4, + 0xFF85, 0x00C5, 0xFF86, 0x00C6, 0xFF87, 0x00C7, 0xFF88, 0x00C8, + 0xFF89, 0x00C9, 0xFF8A, 0x00CA, 0xFF8B, 0x00CB, 0xFF8C, 0x00CC, + 0xFF8D, 0x00CD, 0xFF8E, 0x00CE, 0xFF8F, 0x00CF, 0xFF90, 0x00D0, + 0xFF91, 0x00D1, 0xFF92, 0x00D2, 0xFF93, 0x00D3, 0xFF94, 0x00D4, + 0xFF95, 0x00D5, 0xFF96, 0x00D6, 0xFF97, 0x00D7, 0xFF98, 0x00D8, + 0xFF99, 0x00D9, 0xFF9A, 0x00DA, 0xFF9B, 0x00DB, 0xFF9C, 0x00DC, + 0xFF9D, 0x00DD, 0xFF9E, 0x00DE, 0xFF9F, 0x00DF, 0xFFE0, 0x8191, + 0xFFE1, 0x8192, 0xFFE2, 0x81CA, 0xFFE3, 0x8150, 0xFFE4, 0xFA55, + 0xFFE5, 0x818F, 0, 0 }; #if !_TINY_TABLE @@ -1979,1745 +1978,1745 @@ const WCHAR sjis2uni[] = { 0x8386, 0x30E6, 0x8387, 0x30E7, 0x8388, 0x30E8, 0x8389, 0x30E9, 0x838A, 0x30EA, 0x838B, 0x30EB, 0x838C, 0x30EC, 0x838D, 0x30ED, 0x838E, 0x30EE, 0x838F, 0x30EF, 0x8390, 0x30F0, 0x8391, 0x30F1, - 0x8392, 0x30F2, 0x8393, 0x30F3, 0x8394, 0x30F4, - 0x8395, 0x30F5, 0x8396, 0x30F6, 0x839F, 0x0391, 0x83A0, 0x0392, - 0x83A1, 0x0393, 0x83A2, 0x0394, 0x83A3, 0x0395, 0x83A4, 0x0396, - 0x83A5, 0x0397, 0x83A6, 0x0398, 0x83A7, 0x0399, 0x83A8, 0x039A, - 0x83A9, 0x039B, 0x83AA, 0x039C, 0x83AB, 0x039D, 0x83AC, 0x039E, - 0x83AD, 0x039F, 0x83AE, 0x03A0, 0x83AF, 0x03A1, 0x83B0, 0x03A3, - 0x83B1, 0x03A4, 0x83B2, 0x03A5, 0x83B3, 0x03A6, 0x83B4, 0x03A7, - 0x83B5, 0x03A8, 0x83B6, 0x03A9, 0x83BF, 0x03B1, 0x83C0, 0x03B2, - 0x83C1, 0x03B3, 0x83C2, 0x03B4, 0x83C3, 0x03B5, 0x83C4, 0x03B6, - 0x83C5, 0x03B7, 0x83C6, 0x03B8, 0x83C7, 0x03B9, 0x83C8, 0x03BA, - 0x83C9, 0x03BB, 0x83CA, 0x03BC, 0x83CB, 0x03BD, 0x83CC, 0x03BE, - 0x83CD, 0x03BF, 0x83CE, 0x03C0, 0x83CF, 0x03C1, 0x83D0, 0x03C3, - 0x83D1, 0x03C4, 0x83D2, 0x03C5, 0x83D3, 0x03C6, 0x83D4, 0x03C7, - 0x83D5, 0x03C8, 0x83D6, 0x03C9, 0x8440, 0x0410, 0x8441, 0x0411, - 0x8442, 0x0412, 0x8443, 0x0413, 0x8444, 0x0414, 0x8445, 0x0415, - 0x8446, 0x0401, 0x8447, 0x0416, 0x8448, 0x0417, 0x8449, 0x0418, - 0x844A, 0x0419, 0x844B, 0x041A, 0x844C, 0x041B, 0x844D, 0x041C, - 0x844E, 0x041D, 0x844F, 0x041E, 0x8450, 0x041F, 0x8451, 0x0420, - 0x8452, 0x0421, 0x8453, 0x0422, 0x8454, 0x0423, 0x8455, 0x0424, - 0x8456, 0x0425, 0x8457, 0x0426, 0x8458, 0x0427, 0x8459, 0x0428, - 0x845A, 0x0429, 0x845B, 0x042A, 0x845C, 0x042B, 0x845D, 0x042C, - 0x845E, 0x042D, 0x845F, 0x042E, 0x8460, 0x042F, 0x8470, 0x0430, - 0x8471, 0x0431, 0x8472, 0x0432, 0x8473, 0x0433, 0x8474, 0x0434, - 0x8475, 0x0435, 0x8476, 0x0451, 0x8477, 0x0436, 0x8478, 0x0437, - 0x8479, 0x0438, 0x847A, 0x0439, 0x847B, 0x043A, 0x847C, 0x043B, - 0x847D, 0x043C, 0x847E, 0x043D, 0x8480, 0x043E, 0x8481, 0x043F, - 0x8482, 0x0440, 0x8483, 0x0441, 0x8484, 0x0442, 0x8485, 0x0443, - 0x8486, 0x0444, 0x8487, 0x0445, 0x8488, 0x0446, 0x8489, 0x0447, - 0x848A, 0x0448, 0x848B, 0x0449, 0x848C, 0x044A, 0x848D, 0x044B, - 0x848E, 0x044C, 0x848F, 0x044D, 0x8490, 0x044E, 0x8491, 0x044F, - 0x849F, 0x2500, 0x84A0, 0x2502, 0x84A1, 0x250C, 0x84A2, 0x2510, - 0x84A3, 0x2518, 0x84A4, 0x2514, 0x84A5, 0x251C, 0x84A6, 0x252C, - 0x84A7, 0x2524, 0x84A8, 0x2534, 0x84A9, 0x253C, 0x84AA, 0x2501, - 0x84AB, 0x2503, 0x84AC, 0x250F, 0x84AD, 0x2513, 0x84AE, 0x251B, - 0x84AF, 0x2517, 0x84B0, 0x2523, 0x84B1, 0x2533, 0x84B2, 0x252B, - 0x84B3, 0x253B, 0x84B4, 0x254B, 0x84B5, 0x2520, 0x84B6, 0x252F, - 0x84B7, 0x2528, 0x84B8, 0x2537, 0x84B9, 0x253F, 0x84BA, 0x251D, - 0x84BB, 0x2530, 0x84BC, 0x2525, 0x84BD, 0x2538, 0x84BE, 0x2542, - 0x8740, 0x2460, 0x8741, 0x2461, 0x8742, 0x2462, 0x8743, 0x2463, - 0x8744, 0x2464, 0x8745, 0x2465, 0x8746, 0x2466, 0x8747, 0x2467, - 0x8748, 0x2468, 0x8749, 0x2469, 0x874A, 0x246A, 0x874B, 0x246B, - 0x874C, 0x246C, 0x874D, 0x246D, 0x874E, 0x246E, 0x874F, 0x246F, - 0x8750, 0x2470, 0x8751, 0x2471, 0x8752, 0x2472, 0x8753, 0x2473, - 0x8754, 0x2160, 0x8755, 0x2161, 0x8756, 0x2162, 0x8757, 0x2163, - 0x8758, 0x2164, 0x8759, 0x2165, 0x875A, 0x2166, 0x875B, 0x2167, - 0x875C, 0x2168, 0x875D, 0x2169, 0x875F, 0x3349, 0x8760, 0x3314, - 0x8761, 0x3322, 0x8762, 0x334D, 0x8763, 0x3318, 0x8764, 0x3327, - 0x8765, 0x3303, 0x8766, 0x3336, 0x8767, 0x3351, 0x8768, 0x3357, - 0x8769, 0x330D, 0x876A, 0x3326, 0x876B, 0x3323, 0x876C, 0x332B, - 0x876D, 0x334A, 0x876E, 0x333B, 0x876F, 0x339C, 0x8770, 0x339D, - 0x8771, 0x339E, 0x8772, 0x338E, 0x8773, 0x338F, 0x8774, 0x33C4, - 0x8775, 0x33A1, 0x877E, 0x337B, 0x8780, 0x301D, 0x8781, 0x301F, - 0x8782, 0x2116, 0x8783, 0x33CD, 0x8784, 0x2121, 0x8785, 0x32A4, - 0x8786, 0x32A5, 0x8787, 0x32A6, 0x8788, 0x32A7, 0x8789, 0x32A8, - 0x878A, 0x3231, 0x878B, 0x3232, 0x878C, 0x3239, 0x878D, 0x337E, - 0x878E, 0x337D, 0x878F, 0x337C, 0x8793, 0x222E, 0x8794, 0x2211, - 0x8798, 0x221F, 0x8799, 0x22BF, 0x889F, 0x4E9C, 0x88A0, 0x5516, - 0x88A1, 0x5A03, 0x88A2, 0x963F, 0x88A3, 0x54C0, 0x88A4, 0x611B, - 0x88A5, 0x6328, 0x88A6, 0x59F6, 0x88A7, 0x9022, 0x88A8, 0x8475, - 0x88A9, 0x831C, 0x88AA, 0x7A50, 0x88AB, 0x60AA, 0x88AC, 0x63E1, - 0x88AD, 0x6E25, 0x88AE, 0x65ED, 0x88AF, 0x8466, 0x88B0, 0x82A6, - 0x88B1, 0x9BF5, 0x88B2, 0x6893, 0x88B3, 0x5727, 0x88B4, 0x65A1, - 0x88B5, 0x6271, 0x88B6, 0x5B9B, 0x88B7, 0x59D0, 0x88B8, 0x867B, - 0x88B9, 0x98F4, 0x88BA, 0x7D62, 0x88BB, 0x7DBE, 0x88BC, 0x9B8E, - 0x88BD, 0x6216, 0x88BE, 0x7C9F, 0x88BF, 0x88B7, 0x88C0, 0x5B89, - 0x88C1, 0x5EB5, 0x88C2, 0x6309, 0x88C3, 0x6697, 0x88C4, 0x6848, - 0x88C5, 0x95C7, 0x88C6, 0x978D, 0x88C7, 0x674F, 0x88C8, 0x4EE5, - 0x88C9, 0x4F0A, 0x88CA, 0x4F4D, 0x88CB, 0x4F9D, 0x88CC, 0x5049, - 0x88CD, 0x56F2, 0x88CE, 0x5937, 0x88CF, 0x59D4, 0x88D0, 0x5A01, - 0x88D1, 0x5C09, 0x88D2, 0x60DF, 0x88D3, 0x610F, 0x88D4, 0x6170, - 0x88D5, 0x6613, 0x88D6, 0x6905, 0x88D7, 0x70BA, 0x88D8, 0x754F, - 0x88D9, 0x7570, 0x88DA, 0x79FB, 0x88DB, 0x7DAD, 0x88DC, 0x7DEF, - 0x88DD, 0x80C3, 0x88DE, 0x840E, 0x88DF, 0x8863, 0x88E0, 0x8B02, - 0x88E1, 0x9055, 0x88E2, 0x907A, 0x88E3, 0x533B, 0x88E4, 0x4E95, - 0x88E5, 0x4EA5, 0x88E6, 0x57DF, 0x88E7, 0x80B2, 0x88E8, 0x90C1, - 0x88E9, 0x78EF, 0x88EA, 0x4E00, 0x88EB, 0x58F1, 0x88EC, 0x6EA2, - 0x88ED, 0x9038, 0x88EE, 0x7A32, 0x88EF, 0x8328, 0x88F0, 0x828B, - 0x88F1, 0x9C2F, 0x88F2, 0x5141, 0x88F3, 0x5370, 0x88F4, 0x54BD, - 0x88F5, 0x54E1, 0x88F6, 0x56E0, 0x88F7, 0x59FB, 0x88F8, 0x5F15, - 0x88F9, 0x98F2, 0x88FA, 0x6DEB, 0x88FB, 0x80E4, 0x88FC, 0x852D, - 0x8940, 0x9662, 0x8941, 0x9670, 0x8942, 0x96A0, 0x8943, 0x97FB, - 0x8944, 0x540B, 0x8945, 0x53F3, 0x8946, 0x5B87, 0x8947, 0x70CF, - 0x8948, 0x7FBD, 0x8949, 0x8FC2, 0x894A, 0x96E8, 0x894B, 0x536F, - 0x894C, 0x9D5C, 0x894D, 0x7ABA, 0x894E, 0x4E11, 0x894F, 0x7893, - 0x8950, 0x81FC, 0x8951, 0x6E26, 0x8952, 0x5618, 0x8953, 0x5504, - 0x8954, 0x6B1D, 0x8955, 0x851A, 0x8956, 0x9C3B, 0x8957, 0x59E5, - 0x8958, 0x53A9, 0x8959, 0x6D66, 0x895A, 0x74DC, 0x895B, 0x958F, - 0x895C, 0x5642, 0x895D, 0x4E91, 0x895E, 0x904B, 0x895F, 0x96F2, - 0x8960, 0x834F, 0x8961, 0x990C, 0x8962, 0x53E1, 0x8963, 0x55B6, - 0x8964, 0x5B30, 0x8965, 0x5F71, 0x8966, 0x6620, 0x8967, 0x66F3, - 0x8968, 0x6804, 0x8969, 0x6C38, 0x896A, 0x6CF3, 0x896B, 0x6D29, - 0x896C, 0x745B, 0x896D, 0x76C8, 0x896E, 0x7A4E, 0x896F, 0x9834, - 0x8970, 0x82F1, 0x8971, 0x885B, 0x8972, 0x8A60, 0x8973, 0x92ED, - 0x8974, 0x6DB2, 0x8975, 0x75AB, 0x8976, 0x76CA, 0x8977, 0x99C5, - 0x8978, 0x60A6, 0x8979, 0x8B01, 0x897A, 0x8D8A, 0x897B, 0x95B2, - 0x897C, 0x698E, 0x897D, 0x53AD, 0x897E, 0x5186, 0x8980, 0x5712, - 0x8981, 0x5830, 0x8982, 0x5944, 0x8983, 0x5BB4, 0x8984, 0x5EF6, - 0x8985, 0x6028, 0x8986, 0x63A9, 0x8987, 0x63F4, 0x8988, 0x6CBF, - 0x8989, 0x6F14, 0x898A, 0x708E, 0x898B, 0x7114, 0x898C, 0x7159, - 0x898D, 0x71D5, 0x898E, 0x733F, 0x898F, 0x7E01, 0x8990, 0x8276, - 0x8991, 0x82D1, 0x8992, 0x8597, 0x8993, 0x9060, 0x8994, 0x925B, - 0x8995, 0x9D1B, 0x8996, 0x5869, 0x8997, 0x65BC, 0x8998, 0x6C5A, - 0x8999, 0x7525, 0x899A, 0x51F9, 0x899B, 0x592E, 0x899C, 0x5965, - 0x899D, 0x5F80, 0x899E, 0x5FDC, 0x899F, 0x62BC, 0x89A0, 0x65FA, - 0x89A1, 0x6A2A, 0x89A2, 0x6B27, 0x89A3, 0x6BB4, 0x89A4, 0x738B, - 0x89A5, 0x7FC1, 0x89A6, 0x8956, 0x89A7, 0x9D2C, 0x89A8, 0x9D0E, - 0x89A9, 0x9EC4, 0x89AA, 0x5CA1, 0x89AB, 0x6C96, 0x89AC, 0x837B, - 0x89AD, 0x5104, 0x89AE, 0x5C4B, 0x89AF, 0x61B6, 0x89B0, 0x81C6, - 0x89B1, 0x6876, 0x89B2, 0x7261, 0x89B3, 0x4E59, 0x89B4, 0x4FFA, - 0x89B5, 0x5378, 0x89B6, 0x6069, 0x89B7, 0x6E29, 0x89B8, 0x7A4F, - 0x89B9, 0x97F3, 0x89BA, 0x4E0B, 0x89BB, 0x5316, 0x89BC, 0x4EEE, - 0x89BD, 0x4F55, 0x89BE, 0x4F3D, 0x89BF, 0x4FA1, 0x89C0, 0x4F73, - 0x89C1, 0x52A0, 0x89C2, 0x53EF, 0x89C3, 0x5609, 0x89C4, 0x590F, - 0x89C5, 0x5AC1, 0x89C6, 0x5BB6, 0x89C7, 0x5BE1, 0x89C8, 0x79D1, - 0x89C9, 0x6687, 0x89CA, 0x679C, 0x89CB, 0x67B6, 0x89CC, 0x6B4C, - 0x89CD, 0x6CB3, 0x89CE, 0x706B, 0x89CF, 0x73C2, 0x89D0, 0x798D, - 0x89D1, 0x79BE, 0x89D2, 0x7A3C, 0x89D3, 0x7B87, 0x89D4, 0x82B1, - 0x89D5, 0x82DB, 0x89D6, 0x8304, 0x89D7, 0x8377, 0x89D8, 0x83EF, - 0x89D9, 0x83D3, 0x89DA, 0x8766, 0x89DB, 0x8AB2, 0x89DC, 0x5629, - 0x89DD, 0x8CA8, 0x89DE, 0x8FE6, 0x89DF, 0x904E, 0x89E0, 0x971E, - 0x89E1, 0x868A, 0x89E2, 0x4FC4, 0x89E3, 0x5CE8, 0x89E4, 0x6211, - 0x89E5, 0x7259, 0x89E6, 0x753B, 0x89E7, 0x81E5, 0x89E8, 0x82BD, - 0x89E9, 0x86FE, 0x89EA, 0x8CC0, 0x89EB, 0x96C5, 0x89EC, 0x9913, - 0x89ED, 0x99D5, 0x89EE, 0x4ECB, 0x89EF, 0x4F1A, 0x89F0, 0x89E3, - 0x89F1, 0x56DE, 0x89F2, 0x584A, 0x89F3, 0x58CA, 0x89F4, 0x5EFB, - 0x89F5, 0x5FEB, 0x89F6, 0x602A, 0x89F7, 0x6094, 0x89F8, 0x6062, - 0x89F9, 0x61D0, 0x89FA, 0x6212, 0x89FB, 0x62D0, 0x89FC, 0x6539, - 0x8A40, 0x9B41, 0x8A41, 0x6666, 0x8A42, 0x68B0, 0x8A43, 0x6D77, - 0x8A44, 0x7070, 0x8A45, 0x754C, 0x8A46, 0x7686, 0x8A47, 0x7D75, - 0x8A48, 0x82A5, 0x8A49, 0x87F9, 0x8A4A, 0x958B, 0x8A4B, 0x968E, - 0x8A4C, 0x8C9D, 0x8A4D, 0x51F1, 0x8A4E, 0x52BE, 0x8A4F, 0x5916, - 0x8A50, 0x54B3, 0x8A51, 0x5BB3, 0x8A52, 0x5D16, 0x8A53, 0x6168, - 0x8A54, 0x6982, 0x8A55, 0x6DAF, 0x8A56, 0x788D, 0x8A57, 0x84CB, - 0x8A58, 0x8857, 0x8A59, 0x8A72, 0x8A5A, 0x93A7, 0x8A5B, 0x9AB8, - 0x8A5C, 0x6D6C, 0x8A5D, 0x99A8, 0x8A5E, 0x86D9, 0x8A5F, 0x57A3, - 0x8A60, 0x67FF, 0x8A61, 0x86CE, 0x8A62, 0x920E, 0x8A63, 0x5283, - 0x8A64, 0x5687, 0x8A65, 0x5404, 0x8A66, 0x5ED3, 0x8A67, 0x62E1, - 0x8A68, 0x64B9, 0x8A69, 0x683C, 0x8A6A, 0x6838, 0x8A6B, 0x6BBB, - 0x8A6C, 0x7372, 0x8A6D, 0x78BA, 0x8A6E, 0x7A6B, 0x8A6F, 0x899A, - 0x8A70, 0x89D2, 0x8A71, 0x8D6B, 0x8A72, 0x8F03, 0x8A73, 0x90ED, - 0x8A74, 0x95A3, 0x8A75, 0x9694, 0x8A76, 0x9769, 0x8A77, 0x5B66, - 0x8A78, 0x5CB3, 0x8A79, 0x697D, 0x8A7A, 0x984D, 0x8A7B, 0x984E, - 0x8A7C, 0x639B, 0x8A7D, 0x7B20, 0x8A7E, 0x6A2B, 0x8A80, 0x6A7F, - 0x8A81, 0x68B6, 0x8A82, 0x9C0D, 0x8A83, 0x6F5F, 0x8A84, 0x5272, - 0x8A85, 0x559D, 0x8A86, 0x6070, 0x8A87, 0x62EC, 0x8A88, 0x6D3B, - 0x8A89, 0x6E07, 0x8A8A, 0x6ED1, 0x8A8B, 0x845B, 0x8A8C, 0x8910, - 0x8A8D, 0x8F44, 0x8A8E, 0x4E14, 0x8A8F, 0x9C39, 0x8A90, 0x53F6, - 0x8A91, 0x691B, 0x8A92, 0x6A3A, 0x8A93, 0x9784, 0x8A94, 0x682A, - 0x8A95, 0x515C, 0x8A96, 0x7AC3, 0x8A97, 0x84B2, 0x8A98, 0x91DC, - 0x8A99, 0x938C, 0x8A9A, 0x565B, 0x8A9B, 0x9D28, 0x8A9C, 0x6822, - 0x8A9D, 0x8305, 0x8A9E, 0x8431, 0x8A9F, 0x7CA5, 0x8AA0, 0x5208, - 0x8AA1, 0x82C5, 0x8AA2, 0x74E6, 0x8AA3, 0x4E7E, 0x8AA4, 0x4F83, - 0x8AA5, 0x51A0, 0x8AA6, 0x5BD2, 0x8AA7, 0x520A, 0x8AA8, 0x52D8, - 0x8AA9, 0x52E7, 0x8AAA, 0x5DFB, 0x8AAB, 0x559A, 0x8AAC, 0x582A, - 0x8AAD, 0x59E6, 0x8AAE, 0x5B8C, 0x8AAF, 0x5B98, 0x8AB0, 0x5BDB, - 0x8AB1, 0x5E72, 0x8AB2, 0x5E79, 0x8AB3, 0x60A3, 0x8AB4, 0x611F, - 0x8AB5, 0x6163, 0x8AB6, 0x61BE, 0x8AB7, 0x63DB, 0x8AB8, 0x6562, - 0x8AB9, 0x67D1, 0x8ABA, 0x6853, 0x8ABB, 0x68FA, 0x8ABC, 0x6B3E, - 0x8ABD, 0x6B53, 0x8ABE, 0x6C57, 0x8ABF, 0x6F22, 0x8AC0, 0x6F97, - 0x8AC1, 0x6F45, 0x8AC2, 0x74B0, 0x8AC3, 0x7518, 0x8AC4, 0x76E3, - 0x8AC5, 0x770B, 0x8AC6, 0x7AFF, 0x8AC7, 0x7BA1, 0x8AC8, 0x7C21, - 0x8AC9, 0x7DE9, 0x8ACA, 0x7F36, 0x8ACB, 0x7FF0, 0x8ACC, 0x809D, - 0x8ACD, 0x8266, 0x8ACE, 0x839E, 0x8ACF, 0x89B3, 0x8AD0, 0x8ACC, - 0x8AD1, 0x8CAB, 0x8AD2, 0x9084, 0x8AD3, 0x9451, 0x8AD4, 0x9593, - 0x8AD5, 0x9591, 0x8AD6, 0x95A2, 0x8AD7, 0x9665, 0x8AD8, 0x97D3, - 0x8AD9, 0x9928, 0x8ADA, 0x8218, 0x8ADB, 0x4E38, 0x8ADC, 0x542B, - 0x8ADD, 0x5CB8, 0x8ADE, 0x5DCC, 0x8ADF, 0x73A9, 0x8AE0, 0x764C, - 0x8AE1, 0x773C, 0x8AE2, 0x5CA9, 0x8AE3, 0x7FEB, 0x8AE4, 0x8D0B, - 0x8AE5, 0x96C1, 0x8AE6, 0x9811, 0x8AE7, 0x9854, 0x8AE8, 0x9858, - 0x8AE9, 0x4F01, 0x8AEA, 0x4F0E, 0x8AEB, 0x5371, 0x8AEC, 0x559C, - 0x8AED, 0x5668, 0x8AEE, 0x57FA, 0x8AEF, 0x5947, 0x8AF0, 0x5B09, - 0x8AF1, 0x5BC4, 0x8AF2, 0x5C90, 0x8AF3, 0x5E0C, 0x8AF4, 0x5E7E, - 0x8AF5, 0x5FCC, 0x8AF6, 0x63EE, 0x8AF7, 0x673A, 0x8AF8, 0x65D7, - 0x8AF9, 0x65E2, 0x8AFA, 0x671F, 0x8AFB, 0x68CB, 0x8AFC, 0x68C4, - 0x8B40, 0x6A5F, 0x8B41, 0x5E30, 0x8B42, 0x6BC5, 0x8B43, 0x6C17, - 0x8B44, 0x6C7D, 0x8B45, 0x757F, 0x8B46, 0x7948, 0x8B47, 0x5B63, - 0x8B48, 0x7A00, 0x8B49, 0x7D00, 0x8B4A, 0x5FBD, 0x8B4B, 0x898F, - 0x8B4C, 0x8A18, 0x8B4D, 0x8CB4, 0x8B4E, 0x8D77, 0x8B4F, 0x8ECC, - 0x8B50, 0x8F1D, 0x8B51, 0x98E2, 0x8B52, 0x9A0E, 0x8B53, 0x9B3C, - 0x8B54, 0x4E80, 0x8B55, 0x507D, 0x8B56, 0x5100, 0x8B57, 0x5993, - 0x8B58, 0x5B9C, 0x8B59, 0x622F, 0x8B5A, 0x6280, 0x8B5B, 0x64EC, - 0x8B5C, 0x6B3A, 0x8B5D, 0x72A0, 0x8B5E, 0x7591, 0x8B5F, 0x7947, - 0x8B60, 0x7FA9, 0x8B61, 0x87FB, 0x8B62, 0x8ABC, 0x8B63, 0x8B70, - 0x8B64, 0x63AC, 0x8B65, 0x83CA, 0x8B66, 0x97A0, 0x8B67, 0x5409, - 0x8B68, 0x5403, 0x8B69, 0x55AB, 0x8B6A, 0x6854, 0x8B6B, 0x6A58, - 0x8B6C, 0x8A70, 0x8B6D, 0x7827, 0x8B6E, 0x6775, 0x8B6F, 0x9ECD, - 0x8B70, 0x5374, 0x8B71, 0x5BA2, 0x8B72, 0x811A, 0x8B73, 0x8650, - 0x8B74, 0x9006, 0x8B75, 0x4E18, 0x8B76, 0x4E45, 0x8B77, 0x4EC7, - 0x8B78, 0x4F11, 0x8B79, 0x53CA, 0x8B7A, 0x5438, 0x8B7B, 0x5BAE, - 0x8B7C, 0x5F13, 0x8B7D, 0x6025, 0x8B7E, 0x6551, 0x8B80, 0x673D, - 0x8B81, 0x6C42, 0x8B82, 0x6C72, 0x8B83, 0x6CE3, 0x8B84, 0x7078, - 0x8B85, 0x7403, 0x8B86, 0x7A76, 0x8B87, 0x7AAE, 0x8B88, 0x7B08, - 0x8B89, 0x7D1A, 0x8B8A, 0x7CFE, 0x8B8B, 0x7D66, 0x8B8C, 0x65E7, - 0x8B8D, 0x725B, 0x8B8E, 0x53BB, 0x8B8F, 0x5C45, 0x8B90, 0x5DE8, - 0x8B91, 0x62D2, 0x8B92, 0x62E0, 0x8B93, 0x6319, 0x8B94, 0x6E20, - 0x8B95, 0x865A, 0x8B96, 0x8A31, 0x8B97, 0x8DDD, 0x8B98, 0x92F8, - 0x8B99, 0x6F01, 0x8B9A, 0x79A6, 0x8B9B, 0x9B5A, 0x8B9C, 0x4EA8, - 0x8B9D, 0x4EAB, 0x8B9E, 0x4EAC, 0x8B9F, 0x4F9B, 0x8BA0, 0x4FA0, - 0x8BA1, 0x50D1, 0x8BA2, 0x5147, 0x8BA3, 0x7AF6, 0x8BA4, 0x5171, - 0x8BA5, 0x51F6, 0x8BA6, 0x5354, 0x8BA7, 0x5321, 0x8BA8, 0x537F, - 0x8BA9, 0x53EB, 0x8BAA, 0x55AC, 0x8BAB, 0x5883, 0x8BAC, 0x5CE1, - 0x8BAD, 0x5F37, 0x8BAE, 0x5F4A, 0x8BAF, 0x602F, 0x8BB0, 0x6050, - 0x8BB1, 0x606D, 0x8BB2, 0x631F, 0x8BB3, 0x6559, 0x8BB4, 0x6A4B, - 0x8BB5, 0x6CC1, 0x8BB6, 0x72C2, 0x8BB7, 0x72ED, 0x8BB8, 0x77EF, - 0x8BB9, 0x80F8, 0x8BBA, 0x8105, 0x8BBB, 0x8208, 0x8BBC, 0x854E, - 0x8BBD, 0x90F7, 0x8BBE, 0x93E1, 0x8BBF, 0x97FF, 0x8BC0, 0x9957, - 0x8BC1, 0x9A5A, 0x8BC2, 0x4EF0, 0x8BC3, 0x51DD, 0x8BC4, 0x5C2D, - 0x8BC5, 0x6681, 0x8BC6, 0x696D, 0x8BC7, 0x5C40, 0x8BC8, 0x66F2, - 0x8BC9, 0x6975, 0x8BCA, 0x7389, 0x8BCB, 0x6850, 0x8BCC, 0x7C81, - 0x8BCD, 0x50C5, 0x8BCE, 0x52E4, 0x8BCF, 0x5747, 0x8BD0, 0x5DFE, - 0x8BD1, 0x9326, 0x8BD2, 0x65A4, 0x8BD3, 0x6B23, 0x8BD4, 0x6B3D, - 0x8BD5, 0x7434, 0x8BD6, 0x7981, 0x8BD7, 0x79BD, 0x8BD8, 0x7B4B, - 0x8BD9, 0x7DCA, 0x8BDA, 0x82B9, 0x8BDB, 0x83CC, 0x8BDC, 0x887F, - 0x8BDD, 0x895F, 0x8BDE, 0x8B39, 0x8BDF, 0x8FD1, 0x8BE0, 0x91D1, - 0x8BE1, 0x541F, 0x8BE2, 0x9280, 0x8BE3, 0x4E5D, 0x8BE4, 0x5036, - 0x8BE5, 0x53E5, 0x8BE6, 0x533A, 0x8BE7, 0x72D7, 0x8BE8, 0x7396, - 0x8BE9, 0x77E9, 0x8BEA, 0x82E6, 0x8BEB, 0x8EAF, 0x8BEC, 0x99C6, - 0x8BED, 0x99C8, 0x8BEE, 0x99D2, 0x8BEF, 0x5177, 0x8BF0, 0x611A, - 0x8BF1, 0x865E, 0x8BF2, 0x55B0, 0x8BF3, 0x7A7A, 0x8BF4, 0x5076, - 0x8BF5, 0x5BD3, 0x8BF6, 0x9047, 0x8BF7, 0x9685, 0x8BF8, 0x4E32, - 0x8BF9, 0x6ADB, 0x8BFA, 0x91E7, 0x8BFB, 0x5C51, 0x8BFC, 0x5C48, - 0x8C40, 0x6398, 0x8C41, 0x7A9F, 0x8C42, 0x6C93, 0x8C43, 0x9774, - 0x8C44, 0x8F61, 0x8C45, 0x7AAA, 0x8C46, 0x718A, 0x8C47, 0x9688, - 0x8C48, 0x7C82, 0x8C49, 0x6817, 0x8C4A, 0x7E70, 0x8C4B, 0x6851, - 0x8C4C, 0x936C, 0x8C4D, 0x52F2, 0x8C4E, 0x541B, 0x8C4F, 0x85AB, - 0x8C50, 0x8A13, 0x8C51, 0x7FA4, 0x8C52, 0x8ECD, 0x8C53, 0x90E1, - 0x8C54, 0x5366, 0x8C55, 0x8888, 0x8C56, 0x7941, 0x8C57, 0x4FC2, - 0x8C58, 0x50BE, 0x8C59, 0x5211, 0x8C5A, 0x5144, 0x8C5B, 0x5553, - 0x8C5C, 0x572D, 0x8C5D, 0x73EA, 0x8C5E, 0x578B, 0x8C5F, 0x5951, - 0x8C60, 0x5F62, 0x8C61, 0x5F84, 0x8C62, 0x6075, 0x8C63, 0x6176, - 0x8C64, 0x6167, 0x8C65, 0x61A9, 0x8C66, 0x63B2, 0x8C67, 0x643A, - 0x8C68, 0x656C, 0x8C69, 0x666F, 0x8C6A, 0x6842, 0x8C6B, 0x6E13, - 0x8C6C, 0x7566, 0x8C6D, 0x7A3D, 0x8C6E, 0x7CFB, 0x8C6F, 0x7D4C, - 0x8C70, 0x7D99, 0x8C71, 0x7E4B, 0x8C72, 0x7F6B, 0x8C73, 0x830E, - 0x8C74, 0x834A, 0x8C75, 0x86CD, 0x8C76, 0x8A08, 0x8C77, 0x8A63, - 0x8C78, 0x8B66, 0x8C79, 0x8EFD, 0x8C7A, 0x981A, 0x8C7B, 0x9D8F, - 0x8C7C, 0x82B8, 0x8C7D, 0x8FCE, 0x8C7E, 0x9BE8, 0x8C80, 0x5287, - 0x8C81, 0x621F, 0x8C82, 0x6483, 0x8C83, 0x6FC0, 0x8C84, 0x9699, - 0x8C85, 0x6841, 0x8C86, 0x5091, 0x8C87, 0x6B20, 0x8C88, 0x6C7A, - 0x8C89, 0x6F54, 0x8C8A, 0x7A74, 0x8C8B, 0x7D50, 0x8C8C, 0x8840, - 0x8C8D, 0x8A23, 0x8C8E, 0x6708, 0x8C8F, 0x4EF6, 0x8C90, 0x5039, - 0x8C91, 0x5026, 0x8C92, 0x5065, 0x8C93, 0x517C, 0x8C94, 0x5238, - 0x8C95, 0x5263, 0x8C96, 0x55A7, 0x8C97, 0x570F, 0x8C98, 0x5805, - 0x8C99, 0x5ACC, 0x8C9A, 0x5EFA, 0x8C9B, 0x61B2, 0x8C9C, 0x61F8, - 0x8C9D, 0x62F3, 0x8C9E, 0x6372, 0x8C9F, 0x691C, 0x8CA0, 0x6A29, - 0x8CA1, 0x727D, 0x8CA2, 0x72AC, 0x8CA3, 0x732E, 0x8CA4, 0x7814, - 0x8CA5, 0x786F, 0x8CA6, 0x7D79, 0x8CA7, 0x770C, 0x8CA8, 0x80A9, - 0x8CA9, 0x898B, 0x8CAA, 0x8B19, 0x8CAB, 0x8CE2, 0x8CAC, 0x8ED2, - 0x8CAD, 0x9063, 0x8CAE, 0x9375, 0x8CAF, 0x967A, 0x8CB0, 0x9855, - 0x8CB1, 0x9A13, 0x8CB2, 0x9E78, 0x8CB3, 0x5143, 0x8CB4, 0x539F, - 0x8CB5, 0x53B3, 0x8CB6, 0x5E7B, 0x8CB7, 0x5F26, 0x8CB8, 0x6E1B, - 0x8CB9, 0x6E90, 0x8CBA, 0x7384, 0x8CBB, 0x73FE, 0x8CBC, 0x7D43, - 0x8CBD, 0x8237, 0x8CBE, 0x8A00, 0x8CBF, 0x8AFA, 0x8CC0, 0x9650, - 0x8CC1, 0x4E4E, 0x8CC2, 0x500B, 0x8CC3, 0x53E4, 0x8CC4, 0x547C, - 0x8CC5, 0x56FA, 0x8CC6, 0x59D1, 0x8CC7, 0x5B64, 0x8CC8, 0x5DF1, - 0x8CC9, 0x5EAB, 0x8CCA, 0x5F27, 0x8CCB, 0x6238, 0x8CCC, 0x6545, - 0x8CCD, 0x67AF, 0x8CCE, 0x6E56, 0x8CCF, 0x72D0, 0x8CD0, 0x7CCA, - 0x8CD1, 0x88B4, 0x8CD2, 0x80A1, 0x8CD3, 0x80E1, 0x8CD4, 0x83F0, - 0x8CD5, 0x864E, 0x8CD6, 0x8A87, 0x8CD7, 0x8DE8, 0x8CD8, 0x9237, - 0x8CD9, 0x96C7, 0x8CDA, 0x9867, 0x8CDB, 0x9F13, 0x8CDC, 0x4E94, - 0x8CDD, 0x4E92, 0x8CDE, 0x4F0D, 0x8CDF, 0x5348, 0x8CE0, 0x5449, - 0x8CE1, 0x543E, 0x8CE2, 0x5A2F, 0x8CE3, 0x5F8C, 0x8CE4, 0x5FA1, - 0x8CE5, 0x609F, 0x8CE6, 0x68A7, 0x8CE7, 0x6A8E, 0x8CE8, 0x745A, - 0x8CE9, 0x7881, 0x8CEA, 0x8A9E, 0x8CEB, 0x8AA4, 0x8CEC, 0x8B77, - 0x8CED, 0x9190, 0x8CEE, 0x4E5E, 0x8CEF, 0x9BC9, 0x8CF0, 0x4EA4, - 0x8CF1, 0x4F7C, 0x8CF2, 0x4FAF, 0x8CF3, 0x5019, 0x8CF4, 0x5016, - 0x8CF5, 0x5149, 0x8CF6, 0x516C, 0x8CF7, 0x529F, 0x8CF8, 0x52B9, - 0x8CF9, 0x52FE, 0x8CFA, 0x539A, 0x8CFB, 0x53E3, 0x8CFC, 0x5411, - 0x8D40, 0x540E, 0x8D41, 0x5589, 0x8D42, 0x5751, 0x8D43, 0x57A2, - 0x8D44, 0x597D, 0x8D45, 0x5B54, 0x8D46, 0x5B5D, 0x8D47, 0x5B8F, - 0x8D48, 0x5DE5, 0x8D49, 0x5DE7, 0x8D4A, 0x5DF7, 0x8D4B, 0x5E78, - 0x8D4C, 0x5E83, 0x8D4D, 0x5E9A, 0x8D4E, 0x5EB7, 0x8D4F, 0x5F18, - 0x8D50, 0x6052, 0x8D51, 0x614C, 0x8D52, 0x6297, 0x8D53, 0x62D8, - 0x8D54, 0x63A7, 0x8D55, 0x653B, 0x8D56, 0x6602, 0x8D57, 0x6643, - 0x8D58, 0x66F4, 0x8D59, 0x676D, 0x8D5A, 0x6821, 0x8D5B, 0x6897, - 0x8D5C, 0x69CB, 0x8D5D, 0x6C5F, 0x8D5E, 0x6D2A, 0x8D5F, 0x6D69, - 0x8D60, 0x6E2F, 0x8D61, 0x6E9D, 0x8D62, 0x7532, 0x8D63, 0x7687, - 0x8D64, 0x786C, 0x8D65, 0x7A3F, 0x8D66, 0x7CE0, 0x8D67, 0x7D05, - 0x8D68, 0x7D18, 0x8D69, 0x7D5E, 0x8D6A, 0x7DB1, 0x8D6B, 0x8015, - 0x8D6C, 0x8003, 0x8D6D, 0x80AF, 0x8D6E, 0x80B1, 0x8D6F, 0x8154, - 0x8D70, 0x818F, 0x8D71, 0x822A, 0x8D72, 0x8352, 0x8D73, 0x884C, - 0x8D74, 0x8861, 0x8D75, 0x8B1B, 0x8D76, 0x8CA2, 0x8D77, 0x8CFC, - 0x8D78, 0x90CA, 0x8D79, 0x9175, 0x8D7A, 0x9271, 0x8D7B, 0x783F, - 0x8D7C, 0x92FC, 0x8D7D, 0x95A4, 0x8D7E, 0x964D, 0x8D80, 0x9805, - 0x8D81, 0x9999, 0x8D82, 0x9AD8, 0x8D83, 0x9D3B, 0x8D84, 0x525B, - 0x8D85, 0x52AB, 0x8D86, 0x53F7, 0x8D87, 0x5408, 0x8D88, 0x58D5, - 0x8D89, 0x62F7, 0x8D8A, 0x6FE0, 0x8D8B, 0x8C6A, 0x8D8C, 0x8F5F, - 0x8D8D, 0x9EB9, 0x8D8E, 0x514B, 0x8D8F, 0x523B, 0x8D90, 0x544A, - 0x8D91, 0x56FD, 0x8D92, 0x7A40, 0x8D93, 0x9177, 0x8D94, 0x9D60, - 0x8D95, 0x9ED2, 0x8D96, 0x7344, 0x8D97, 0x6F09, 0x8D98, 0x8170, - 0x8D99, 0x7511, 0x8D9A, 0x5FFD, 0x8D9B, 0x60DA, 0x8D9C, 0x9AA8, - 0x8D9D, 0x72DB, 0x8D9E, 0x8FBC, 0x8D9F, 0x6B64, 0x8DA0, 0x9803, - 0x8DA1, 0x4ECA, 0x8DA2, 0x56F0, 0x8DA3, 0x5764, 0x8DA4, 0x58BE, - 0x8DA5, 0x5A5A, 0x8DA6, 0x6068, 0x8DA7, 0x61C7, 0x8DA8, 0x660F, - 0x8DA9, 0x6606, 0x8DAA, 0x6839, 0x8DAB, 0x68B1, 0x8DAC, 0x6DF7, - 0x8DAD, 0x75D5, 0x8DAE, 0x7D3A, 0x8DAF, 0x826E, 0x8DB0, 0x9B42, - 0x8DB1, 0x4E9B, 0x8DB2, 0x4F50, 0x8DB3, 0x53C9, 0x8DB4, 0x5506, - 0x8DB5, 0x5D6F, 0x8DB6, 0x5DE6, 0x8DB7, 0x5DEE, 0x8DB8, 0x67FB, - 0x8DB9, 0x6C99, 0x8DBA, 0x7473, 0x8DBB, 0x7802, 0x8DBC, 0x8A50, - 0x8DBD, 0x9396, 0x8DBE, 0x88DF, 0x8DBF, 0x5750, 0x8DC0, 0x5EA7, - 0x8DC1, 0x632B, 0x8DC2, 0x50B5, 0x8DC3, 0x50AC, 0x8DC4, 0x518D, - 0x8DC5, 0x6700, 0x8DC6, 0x54C9, 0x8DC7, 0x585E, 0x8DC8, 0x59BB, - 0x8DC9, 0x5BB0, 0x8DCA, 0x5F69, 0x8DCB, 0x624D, 0x8DCC, 0x63A1, - 0x8DCD, 0x683D, 0x8DCE, 0x6B73, 0x8DCF, 0x6E08, 0x8DD0, 0x707D, - 0x8DD1, 0x91C7, 0x8DD2, 0x7280, 0x8DD3, 0x7815, 0x8DD4, 0x7826, - 0x8DD5, 0x796D, 0x8DD6, 0x658E, 0x8DD7, 0x7D30, 0x8DD8, 0x83DC, - 0x8DD9, 0x88C1, 0x8DDA, 0x8F09, 0x8DDB, 0x969B, 0x8DDC, 0x5264, - 0x8DDD, 0x5728, 0x8DDE, 0x6750, 0x8DDF, 0x7F6A, 0x8DE0, 0x8CA1, - 0x8DE1, 0x51B4, 0x8DE2, 0x5742, 0x8DE3, 0x962A, 0x8DE4, 0x583A, - 0x8DE5, 0x698A, 0x8DE6, 0x80B4, 0x8DE7, 0x54B2, 0x8DE8, 0x5D0E, - 0x8DE9, 0x57FC, 0x8DEA, 0x7895, 0x8DEB, 0x9DFA, 0x8DEC, 0x4F5C, - 0x8DED, 0x524A, 0x8DEE, 0x548B, 0x8DEF, 0x643E, 0x8DF0, 0x6628, - 0x8DF1, 0x6714, 0x8DF2, 0x67F5, 0x8DF3, 0x7A84, 0x8DF4, 0x7B56, - 0x8DF5, 0x7D22, 0x8DF6, 0x932F, 0x8DF7, 0x685C, 0x8DF8, 0x9BAD, - 0x8DF9, 0x7B39, 0x8DFA, 0x5319, 0x8DFB, 0x518A, 0x8DFC, 0x5237, - 0x8E40, 0x5BDF, 0x8E41, 0x62F6, 0x8E42, 0x64AE, 0x8E43, 0x64E6, - 0x8E44, 0x672D, 0x8E45, 0x6BBA, 0x8E46, 0x85A9, 0x8E47, 0x96D1, - 0x8E48, 0x7690, 0x8E49, 0x9BD6, 0x8E4A, 0x634C, 0x8E4B, 0x9306, - 0x8E4C, 0x9BAB, 0x8E4D, 0x76BF, 0x8E4E, 0x6652, 0x8E4F, 0x4E09, - 0x8E50, 0x5098, 0x8E51, 0x53C2, 0x8E52, 0x5C71, 0x8E53, 0x60E8, - 0x8E54, 0x6492, 0x8E55, 0x6563, 0x8E56, 0x685F, 0x8E57, 0x71E6, - 0x8E58, 0x73CA, 0x8E59, 0x7523, 0x8E5A, 0x7B97, 0x8E5B, 0x7E82, - 0x8E5C, 0x8695, 0x8E5D, 0x8B83, 0x8E5E, 0x8CDB, 0x8E5F, 0x9178, - 0x8E60, 0x9910, 0x8E61, 0x65AC, 0x8E62, 0x66AB, 0x8E63, 0x6B8B, - 0x8E64, 0x4ED5, 0x8E65, 0x4ED4, 0x8E66, 0x4F3A, 0x8E67, 0x4F7F, - 0x8E68, 0x523A, 0x8E69, 0x53F8, 0x8E6A, 0x53F2, 0x8E6B, 0x55E3, - 0x8E6C, 0x56DB, 0x8E6D, 0x58EB, 0x8E6E, 0x59CB, 0x8E6F, 0x59C9, - 0x8E70, 0x59FF, 0x8E71, 0x5B50, 0x8E72, 0x5C4D, 0x8E73, 0x5E02, - 0x8E74, 0x5E2B, 0x8E75, 0x5FD7, 0x8E76, 0x601D, 0x8E77, 0x6307, - 0x8E78, 0x652F, 0x8E79, 0x5B5C, 0x8E7A, 0x65AF, 0x8E7B, 0x65BD, - 0x8E7C, 0x65E8, 0x8E7D, 0x679D, 0x8E7E, 0x6B62, 0x8E80, 0x6B7B, - 0x8E81, 0x6C0F, 0x8E82, 0x7345, 0x8E83, 0x7949, 0x8E84, 0x79C1, - 0x8E85, 0x7CF8, 0x8E86, 0x7D19, 0x8E87, 0x7D2B, 0x8E88, 0x80A2, - 0x8E89, 0x8102, 0x8E8A, 0x81F3, 0x8E8B, 0x8996, 0x8E8C, 0x8A5E, - 0x8E8D, 0x8A69, 0x8E8E, 0x8A66, 0x8E8F, 0x8A8C, 0x8E90, 0x8AEE, - 0x8E91, 0x8CC7, 0x8E92, 0x8CDC, 0x8E93, 0x96CC, 0x8E94, 0x98FC, - 0x8E95, 0x6B6F, 0x8E96, 0x4E8B, 0x8E97, 0x4F3C, 0x8E98, 0x4F8D, - 0x8E99, 0x5150, 0x8E9A, 0x5B57, 0x8E9B, 0x5BFA, 0x8E9C, 0x6148, - 0x8E9D, 0x6301, 0x8E9E, 0x6642, 0x8E9F, 0x6B21, 0x8EA0, 0x6ECB, - 0x8EA1, 0x6CBB, 0x8EA2, 0x723E, 0x8EA3, 0x74BD, 0x8EA4, 0x75D4, - 0x8EA5, 0x78C1, 0x8EA6, 0x793A, 0x8EA7, 0x800C, 0x8EA8, 0x8033, - 0x8EA9, 0x81EA, 0x8EAA, 0x8494, 0x8EAB, 0x8F9E, 0x8EAC, 0x6C50, - 0x8EAD, 0x9E7F, 0x8EAE, 0x5F0F, 0x8EAF, 0x8B58, 0x8EB0, 0x9D2B, - 0x8EB1, 0x7AFA, 0x8EB2, 0x8EF8, 0x8EB3, 0x5B8D, 0x8EB4, 0x96EB, - 0x8EB5, 0x4E03, 0x8EB6, 0x53F1, 0x8EB7, 0x57F7, 0x8EB8, 0x5931, - 0x8EB9, 0x5AC9, 0x8EBA, 0x5BA4, 0x8EBB, 0x6089, 0x8EBC, 0x6E7F, - 0x8EBD, 0x6F06, 0x8EBE, 0x75BE, 0x8EBF, 0x8CEA, 0x8EC0, 0x5B9F, - 0x8EC1, 0x8500, 0x8EC2, 0x7BE0, 0x8EC3, 0x5072, 0x8EC4, 0x67F4, - 0x8EC5, 0x829D, 0x8EC6, 0x5C61, 0x8EC7, 0x854A, 0x8EC8, 0x7E1E, - 0x8EC9, 0x820E, 0x8ECA, 0x5199, 0x8ECB, 0x5C04, 0x8ECC, 0x6368, - 0x8ECD, 0x8D66, 0x8ECE, 0x659C, 0x8ECF, 0x716E, 0x8ED0, 0x793E, - 0x8ED1, 0x7D17, 0x8ED2, 0x8005, 0x8ED3, 0x8B1D, 0x8ED4, 0x8ECA, - 0x8ED5, 0x906E, 0x8ED6, 0x86C7, 0x8ED7, 0x90AA, 0x8ED8, 0x501F, - 0x8ED9, 0x52FA, 0x8EDA, 0x5C3A, 0x8EDB, 0x6753, 0x8EDC, 0x707C, - 0x8EDD, 0x7235, 0x8EDE, 0x914C, 0x8EDF, 0x91C8, 0x8EE0, 0x932B, - 0x8EE1, 0x82E5, 0x8EE2, 0x5BC2, 0x8EE3, 0x5F31, 0x8EE4, 0x60F9, - 0x8EE5, 0x4E3B, 0x8EE6, 0x53D6, 0x8EE7, 0x5B88, 0x8EE8, 0x624B, - 0x8EE9, 0x6731, 0x8EEA, 0x6B8A, 0x8EEB, 0x72E9, 0x8EEC, 0x73E0, - 0x8EED, 0x7A2E, 0x8EEE, 0x816B, 0x8EEF, 0x8DA3, 0x8EF0, 0x9152, - 0x8EF1, 0x9996, 0x8EF2, 0x5112, 0x8EF3, 0x53D7, 0x8EF4, 0x546A, - 0x8EF5, 0x5BFF, 0x8EF6, 0x6388, 0x8EF7, 0x6A39, 0x8EF8, 0x7DAC, - 0x8EF9, 0x9700, 0x8EFA, 0x56DA, 0x8EFB, 0x53CE, 0x8EFC, 0x5468, - 0x8F40, 0x5B97, 0x8F41, 0x5C31, 0x8F42, 0x5DDE, 0x8F43, 0x4FEE, - 0x8F44, 0x6101, 0x8F45, 0x62FE, 0x8F46, 0x6D32, 0x8F47, 0x79C0, - 0x8F48, 0x79CB, 0x8F49, 0x7D42, 0x8F4A, 0x7E4D, 0x8F4B, 0x7FD2, - 0x8F4C, 0x81ED, 0x8F4D, 0x821F, 0x8F4E, 0x8490, 0x8F4F, 0x8846, - 0x8F50, 0x8972, 0x8F51, 0x8B90, 0x8F52, 0x8E74, 0x8F53, 0x8F2F, - 0x8F54, 0x9031, 0x8F55, 0x914B, 0x8F56, 0x916C, 0x8F57, 0x96C6, - 0x8F58, 0x919C, 0x8F59, 0x4EC0, 0x8F5A, 0x4F4F, 0x8F5B, 0x5145, - 0x8F5C, 0x5341, 0x8F5D, 0x5F93, 0x8F5E, 0x620E, 0x8F5F, 0x67D4, - 0x8F60, 0x6C41, 0x8F61, 0x6E0B, 0x8F62, 0x7363, 0x8F63, 0x7E26, - 0x8F64, 0x91CD, 0x8F65, 0x9283, 0x8F66, 0x53D4, 0x8F67, 0x5919, - 0x8F68, 0x5BBF, 0x8F69, 0x6DD1, 0x8F6A, 0x795D, 0x8F6B, 0x7E2E, - 0x8F6C, 0x7C9B, 0x8F6D, 0x587E, 0x8F6E, 0x719F, 0x8F6F, 0x51FA, - 0x8F70, 0x8853, 0x8F71, 0x8FF0, 0x8F72, 0x4FCA, 0x8F73, 0x5CFB, - 0x8F74, 0x6625, 0x8F75, 0x77AC, 0x8F76, 0x7AE3, 0x8F77, 0x821C, - 0x8F78, 0x99FF, 0x8F79, 0x51C6, 0x8F7A, 0x5FAA, 0x8F7B, 0x65EC, - 0x8F7C, 0x696F, 0x8F7D, 0x6B89, 0x8F7E, 0x6DF3, 0x8F80, 0x6E96, - 0x8F81, 0x6F64, 0x8F82, 0x76FE, 0x8F83, 0x7D14, 0x8F84, 0x5DE1, - 0x8F85, 0x9075, 0x8F86, 0x9187, 0x8F87, 0x9806, 0x8F88, 0x51E6, - 0x8F89, 0x521D, 0x8F8A, 0x6240, 0x8F8B, 0x6691, 0x8F8C, 0x66D9, - 0x8F8D, 0x6E1A, 0x8F8E, 0x5EB6, 0x8F8F, 0x7DD2, 0x8F90, 0x7F72, - 0x8F91, 0x66F8, 0x8F92, 0x85AF, 0x8F93, 0x85F7, 0x8F94, 0x8AF8, - 0x8F95, 0x52A9, 0x8F96, 0x53D9, 0x8F97, 0x5973, 0x8F98, 0x5E8F, - 0x8F99, 0x5F90, 0x8F9A, 0x6055, 0x8F9B, 0x92E4, 0x8F9C, 0x9664, - 0x8F9D, 0x50B7, 0x8F9E, 0x511F, 0x8F9F, 0x52DD, 0x8FA0, 0x5320, - 0x8FA1, 0x5347, 0x8FA2, 0x53EC, 0x8FA3, 0x54E8, 0x8FA4, 0x5546, - 0x8FA5, 0x5531, 0x8FA6, 0x5617, 0x8FA7, 0x5968, 0x8FA8, 0x59BE, - 0x8FA9, 0x5A3C, 0x8FAA, 0x5BB5, 0x8FAB, 0x5C06, 0x8FAC, 0x5C0F, - 0x8FAD, 0x5C11, 0x8FAE, 0x5C1A, 0x8FAF, 0x5E84, 0x8FB0, 0x5E8A, - 0x8FB1, 0x5EE0, 0x8FB2, 0x5F70, 0x8FB3, 0x627F, 0x8FB4, 0x6284, - 0x8FB5, 0x62DB, 0x8FB6, 0x638C, 0x8FB7, 0x6377, 0x8FB8, 0x6607, - 0x8FB9, 0x660C, 0x8FBA, 0x662D, 0x8FBB, 0x6676, 0x8FBC, 0x677E, - 0x8FBD, 0x68A2, 0x8FBE, 0x6A1F, 0x8FBF, 0x6A35, 0x8FC0, 0x6CBC, - 0x8FC1, 0x6D88, 0x8FC2, 0x6E09, 0x8FC3, 0x6E58, 0x8FC4, 0x713C, - 0x8FC5, 0x7126, 0x8FC6, 0x7167, 0x8FC7, 0x75C7, 0x8FC8, 0x7701, - 0x8FC9, 0x785D, 0x8FCA, 0x7901, 0x8FCB, 0x7965, 0x8FCC, 0x79F0, - 0x8FCD, 0x7AE0, 0x8FCE, 0x7B11, 0x8FCF, 0x7CA7, 0x8FD0, 0x7D39, - 0x8FD1, 0x8096, 0x8FD2, 0x83D6, 0x8FD3, 0x848B, 0x8FD4, 0x8549, - 0x8FD5, 0x885D, 0x8FD6, 0x88F3, 0x8FD7, 0x8A1F, 0x8FD8, 0x8A3C, - 0x8FD9, 0x8A54, 0x8FDA, 0x8A73, 0x8FDB, 0x8C61, 0x8FDC, 0x8CDE, - 0x8FDD, 0x91A4, 0x8FDE, 0x9266, 0x8FDF, 0x937E, 0x8FE0, 0x9418, - 0x8FE1, 0x969C, 0x8FE2, 0x9798, 0x8FE3, 0x4E0A, 0x8FE4, 0x4E08, - 0x8FE5, 0x4E1E, 0x8FE6, 0x4E57, 0x8FE7, 0x5197, 0x8FE8, 0x5270, - 0x8FE9, 0x57CE, 0x8FEA, 0x5834, 0x8FEB, 0x58CC, 0x8FEC, 0x5B22, - 0x8FED, 0x5E38, 0x8FEE, 0x60C5, 0x8FEF, 0x64FE, 0x8FF0, 0x6761, - 0x8FF1, 0x6756, 0x8FF2, 0x6D44, 0x8FF3, 0x72B6, 0x8FF4, 0x7573, - 0x8FF5, 0x7A63, 0x8FF6, 0x84B8, 0x8FF7, 0x8B72, 0x8FF8, 0x91B8, - 0x8FF9, 0x9320, 0x8FFA, 0x5631, 0x8FFB, 0x57F4, 0x8FFC, 0x98FE, - 0x9040, 0x62ED, 0x9041, 0x690D, 0x9042, 0x6B96, 0x9043, 0x71ED, - 0x9044, 0x7E54, 0x9045, 0x8077, 0x9046, 0x8272, 0x9047, 0x89E6, - 0x9048, 0x98DF, 0x9049, 0x8755, 0x904A, 0x8FB1, 0x904B, 0x5C3B, - 0x904C, 0x4F38, 0x904D, 0x4FE1, 0x904E, 0x4FB5, 0x904F, 0x5507, - 0x9050, 0x5A20, 0x9051, 0x5BDD, 0x9052, 0x5BE9, 0x9053, 0x5FC3, - 0x9054, 0x614E, 0x9055, 0x632F, 0x9056, 0x65B0, 0x9057, 0x664B, - 0x9058, 0x68EE, 0x9059, 0x699B, 0x905A, 0x6D78, 0x905B, 0x6DF1, - 0x905C, 0x7533, 0x905D, 0x75B9, 0x905E, 0x771F, 0x905F, 0x795E, - 0x9060, 0x79E6, 0x9061, 0x7D33, 0x9062, 0x81E3, 0x9063, 0x82AF, - 0x9064, 0x85AA, 0x9065, 0x89AA, 0x9066, 0x8A3A, 0x9067, 0x8EAB, - 0x9068, 0x8F9B, 0x9069, 0x9032, 0x906A, 0x91DD, 0x906B, 0x9707, - 0x906C, 0x4EBA, 0x906D, 0x4EC1, 0x906E, 0x5203, 0x906F, 0x5875, - 0x9070, 0x58EC, 0x9071, 0x5C0B, 0x9072, 0x751A, 0x9073, 0x5C3D, - 0x9074, 0x814E, 0x9075, 0x8A0A, 0x9076, 0x8FC5, 0x9077, 0x9663, - 0x9078, 0x976D, 0x9079, 0x7B25, 0x907A, 0x8ACF, 0x907B, 0x9808, - 0x907C, 0x9162, 0x907D, 0x56F3, 0x907E, 0x53A8, 0x9080, 0x9017, - 0x9081, 0x5439, 0x9082, 0x5782, 0x9083, 0x5E25, 0x9084, 0x63A8, - 0x9085, 0x6C34, 0x9086, 0x708A, 0x9087, 0x7761, 0x9088, 0x7C8B, - 0x9089, 0x7FE0, 0x908A, 0x8870, 0x908B, 0x9042, 0x908C, 0x9154, - 0x908D, 0x9310, 0x908E, 0x9318, 0x908F, 0x968F, 0x9090, 0x745E, - 0x9091, 0x9AC4, 0x9092, 0x5D07, 0x9093, 0x5D69, 0x9094, 0x6570, - 0x9095, 0x67A2, 0x9096, 0x8DA8, 0x9097, 0x96DB, 0x9098, 0x636E, - 0x9099, 0x6749, 0x909A, 0x6919, 0x909B, 0x83C5, 0x909C, 0x9817, - 0x909D, 0x96C0, 0x909E, 0x88FE, 0x909F, 0x6F84, 0x90A0, 0x647A, - 0x90A1, 0x5BF8, 0x90A2, 0x4E16, 0x90A3, 0x702C, 0x90A4, 0x755D, - 0x90A5, 0x662F, 0x90A6, 0x51C4, 0x90A7, 0x5236, 0x90A8, 0x52E2, - 0x90A9, 0x59D3, 0x90AA, 0x5F81, 0x90AB, 0x6027, 0x90AC, 0x6210, - 0x90AD, 0x653F, 0x90AE, 0x6574, 0x90AF, 0x661F, 0x90B0, 0x6674, - 0x90B1, 0x68F2, 0x90B2, 0x6816, 0x90B3, 0x6B63, 0x90B4, 0x6E05, - 0x90B5, 0x7272, 0x90B6, 0x751F, 0x90B7, 0x76DB, 0x90B8, 0x7CBE, - 0x90B9, 0x8056, 0x90BA, 0x58F0, 0x90BB, 0x88FD, 0x90BC, 0x897F, - 0x90BD, 0x8AA0, 0x90BE, 0x8A93, 0x90BF, 0x8ACB, 0x90C0, 0x901D, - 0x90C1, 0x9192, 0x90C2, 0x9752, 0x90C3, 0x9759, 0x90C4, 0x6589, - 0x90C5, 0x7A0E, 0x90C6, 0x8106, 0x90C7, 0x96BB, 0x90C8, 0x5E2D, - 0x90C9, 0x60DC, 0x90CA, 0x621A, 0x90CB, 0x65A5, 0x90CC, 0x6614, - 0x90CD, 0x6790, 0x90CE, 0x77F3, 0x90CF, 0x7A4D, 0x90D0, 0x7C4D, - 0x90D1, 0x7E3E, 0x90D2, 0x810A, 0x90D3, 0x8CAC, 0x90D4, 0x8D64, - 0x90D5, 0x8DE1, 0x90D6, 0x8E5F, 0x90D7, 0x78A9, 0x90D8, 0x5207, - 0x90D9, 0x62D9, 0x90DA, 0x63A5, 0x90DB, 0x6442, 0x90DC, 0x6298, - 0x90DD, 0x8A2D, 0x90DE, 0x7A83, 0x90DF, 0x7BC0, 0x90E0, 0x8AAC, - 0x90E1, 0x96EA, 0x90E2, 0x7D76, 0x90E3, 0x820C, 0x90E4, 0x8749, - 0x90E5, 0x4ED9, 0x90E6, 0x5148, 0x90E7, 0x5343, 0x90E8, 0x5360, - 0x90E9, 0x5BA3, 0x90EA, 0x5C02, 0x90EB, 0x5C16, 0x90EC, 0x5DDD, - 0x90ED, 0x6226, 0x90EE, 0x6247, 0x90EF, 0x64B0, 0x90F0, 0x6813, - 0x90F1, 0x6834, 0x90F2, 0x6CC9, 0x90F3, 0x6D45, 0x90F4, 0x6D17, - 0x90F5, 0x67D3, 0x90F6, 0x6F5C, 0x90F7, 0x714E, 0x90F8, 0x717D, - 0x90F9, 0x65CB, 0x90FA, 0x7A7F, 0x90FB, 0x7BAD, 0x90FC, 0x7DDA, - 0x9140, 0x7E4A, 0x9141, 0x7FA8, 0x9142, 0x817A, 0x9143, 0x821B, - 0x9144, 0x8239, 0x9145, 0x85A6, 0x9146, 0x8A6E, 0x9147, 0x8CCE, - 0x9148, 0x8DF5, 0x9149, 0x9078, 0x914A, 0x9077, 0x914B, 0x92AD, - 0x914C, 0x9291, 0x914D, 0x9583, 0x914E, 0x9BAE, 0x914F, 0x524D, - 0x9150, 0x5584, 0x9151, 0x6F38, 0x9152, 0x7136, 0x9153, 0x5168, - 0x9154, 0x7985, 0x9155, 0x7E55, 0x9156, 0x81B3, 0x9157, 0x7CCE, - 0x9158, 0x564C, 0x9159, 0x5851, 0x915A, 0x5CA8, 0x915B, 0x63AA, - 0x915C, 0x66FE, 0x915D, 0x66FD, 0x915E, 0x695A, 0x915F, 0x72D9, - 0x9160, 0x758F, 0x9161, 0x758E, 0x9162, 0x790E, 0x9163, 0x7956, - 0x9164, 0x79DF, 0x9165, 0x7C97, 0x9166, 0x7D20, 0x9167, 0x7D44, - 0x9168, 0x8607, 0x9169, 0x8A34, 0x916A, 0x963B, 0x916B, 0x9061, - 0x916C, 0x9F20, 0x916D, 0x50E7, 0x916E, 0x5275, 0x916F, 0x53CC, - 0x9170, 0x53E2, 0x9171, 0x5009, 0x9172, 0x55AA, 0x9173, 0x58EE, - 0x9174, 0x594F, 0x9175, 0x723D, 0x9176, 0x5B8B, 0x9177, 0x5C64, - 0x9178, 0x531D, 0x9179, 0x60E3, 0x917A, 0x60F3, 0x917B, 0x635C, - 0x917C, 0x6383, 0x917D, 0x633F, 0x917E, 0x63BB, 0x9180, 0x64CD, - 0x9181, 0x65E9, 0x9182, 0x66F9, 0x9183, 0x5DE3, 0x9184, 0x69CD, - 0x9185, 0x69FD, 0x9186, 0x6F15, 0x9187, 0x71E5, 0x9188, 0x4E89, - 0x9189, 0x75E9, 0x918A, 0x76F8, 0x918B, 0x7A93, 0x918C, 0x7CDF, - 0x918D, 0x7DCF, 0x918E, 0x7D9C, 0x918F, 0x8061, 0x9190, 0x8349, - 0x9191, 0x8358, 0x9192, 0x846C, 0x9193, 0x84BC, 0x9194, 0x85FB, - 0x9195, 0x88C5, 0x9196, 0x8D70, 0x9197, 0x9001, 0x9198, 0x906D, - 0x9199, 0x9397, 0x919A, 0x971C, 0x919B, 0x9A12, 0x919C, 0x50CF, - 0x919D, 0x5897, 0x919E, 0x618E, 0x919F, 0x81D3, 0x91A0, 0x8535, - 0x91A1, 0x8D08, 0x91A2, 0x9020, 0x91A3, 0x4FC3, 0x91A4, 0x5074, - 0x91A5, 0x5247, 0x91A6, 0x5373, 0x91A7, 0x606F, 0x91A8, 0x6349, - 0x91A9, 0x675F, 0x91AA, 0x6E2C, 0x91AB, 0x8DB3, 0x91AC, 0x901F, - 0x91AD, 0x4FD7, 0x91AE, 0x5C5E, 0x91AF, 0x8CCA, 0x91B0, 0x65CF, - 0x91B1, 0x7D9A, 0x91B2, 0x5352, 0x91B3, 0x8896, 0x91B4, 0x5176, - 0x91B5, 0x63C3, 0x91B6, 0x5B58, 0x91B7, 0x5B6B, 0x91B8, 0x5C0A, - 0x91B9, 0x640D, 0x91BA, 0x6751, 0x91BB, 0x905C, 0x91BC, 0x4ED6, - 0x91BD, 0x591A, 0x91BE, 0x592A, 0x91BF, 0x6C70, 0x91C0, 0x8A51, - 0x91C1, 0x553E, 0x91C2, 0x5815, 0x91C3, 0x59A5, 0x91C4, 0x60F0, - 0x91C5, 0x6253, 0x91C6, 0x67C1, 0x91C7, 0x8235, 0x91C8, 0x6955, - 0x91C9, 0x9640, 0x91CA, 0x99C4, 0x91CB, 0x9A28, 0x91CC, 0x4F53, - 0x91CD, 0x5806, 0x91CE, 0x5BFE, 0x91CF, 0x8010, 0x91D0, 0x5CB1, - 0x91D1, 0x5E2F, 0x91D2, 0x5F85, 0x91D3, 0x6020, 0x91D4, 0x614B, - 0x91D5, 0x6234, 0x91D6, 0x66FF, 0x91D7, 0x6CF0, 0x91D8, 0x6EDE, - 0x91D9, 0x80CE, 0x91DA, 0x817F, 0x91DB, 0x82D4, 0x91DC, 0x888B, - 0x91DD, 0x8CB8, 0x91DE, 0x9000, 0x91DF, 0x902E, 0x91E0, 0x968A, - 0x91E1, 0x9EDB, 0x91E2, 0x9BDB, 0x91E3, 0x4EE3, 0x91E4, 0x53F0, - 0x91E5, 0x5927, 0x91E6, 0x7B2C, 0x91E7, 0x918D, 0x91E8, 0x984C, - 0x91E9, 0x9DF9, 0x91EA, 0x6EDD, 0x91EB, 0x7027, 0x91EC, 0x5353, - 0x91ED, 0x5544, 0x91EE, 0x5B85, 0x91EF, 0x6258, 0x91F0, 0x629E, - 0x91F1, 0x62D3, 0x91F2, 0x6CA2, 0x91F3, 0x6FEF, 0x91F4, 0x7422, - 0x91F5, 0x8A17, 0x91F6, 0x9438, 0x91F7, 0x6FC1, 0x91F8, 0x8AFE, - 0x91F9, 0x8338, 0x91FA, 0x51E7, 0x91FB, 0x86F8, 0x91FC, 0x53EA, - 0x9240, 0x53E9, 0x9241, 0x4F46, 0x9242, 0x9054, 0x9243, 0x8FB0, - 0x9244, 0x596A, 0x9245, 0x8131, 0x9246, 0x5DFD, 0x9247, 0x7AEA, - 0x9248, 0x8FBF, 0x9249, 0x68DA, 0x924A, 0x8C37, 0x924B, 0x72F8, - 0x924C, 0x9C48, 0x924D, 0x6A3D, 0x924E, 0x8AB0, 0x924F, 0x4E39, - 0x9250, 0x5358, 0x9251, 0x5606, 0x9252, 0x5766, 0x9253, 0x62C5, - 0x9254, 0x63A2, 0x9255, 0x65E6, 0x9256, 0x6B4E, 0x9257, 0x6DE1, - 0x9258, 0x6E5B, 0x9259, 0x70AD, 0x925A, 0x77ED, 0x925B, 0x7AEF, - 0x925C, 0x7BAA, 0x925D, 0x7DBB, 0x925E, 0x803D, 0x925F, 0x80C6, - 0x9260, 0x86CB, 0x9261, 0x8A95, 0x9262, 0x935B, 0x9263, 0x56E3, - 0x9264, 0x58C7, 0x9265, 0x5F3E, 0x9266, 0x65AD, 0x9267, 0x6696, - 0x9268, 0x6A80, 0x9269, 0x6BB5, 0x926A, 0x7537, 0x926B, 0x8AC7, - 0x926C, 0x5024, 0x926D, 0x77E5, 0x926E, 0x5730, 0x926F, 0x5F1B, - 0x9270, 0x6065, 0x9271, 0x667A, 0x9272, 0x6C60, 0x9273, 0x75F4, - 0x9274, 0x7A1A, 0x9275, 0x7F6E, 0x9276, 0x81F4, 0x9277, 0x8718, - 0x9278, 0x9045, 0x9279, 0x99B3, 0x927A, 0x7BC9, 0x927B, 0x755C, - 0x927C, 0x7AF9, 0x927D, 0x7B51, 0x927E, 0x84C4, 0x9280, 0x9010, - 0x9281, 0x79E9, 0x9282, 0x7A92, 0x9283, 0x8336, 0x9284, 0x5AE1, - 0x9285, 0x7740, 0x9286, 0x4E2D, 0x9287, 0x4EF2, 0x9288, 0x5B99, - 0x9289, 0x5FE0, 0x928A, 0x62BD, 0x928B, 0x663C, 0x928C, 0x67F1, - 0x928D, 0x6CE8, 0x928E, 0x866B, 0x928F, 0x8877, 0x9290, 0x8A3B, - 0x9291, 0x914E, 0x9292, 0x92F3, 0x9293, 0x99D0, 0x9294, 0x6A17, - 0x9295, 0x7026, 0x9296, 0x732A, 0x9297, 0x82E7, 0x9298, 0x8457, - 0x9299, 0x8CAF, 0x929A, 0x4E01, 0x929B, 0x5146, 0x929C, 0x51CB, - 0x929D, 0x558B, 0x929E, 0x5BF5, 0x929F, 0x5E16, 0x92A0, 0x5E33, - 0x92A1, 0x5E81, 0x92A2, 0x5F14, 0x92A3, 0x5F35, 0x92A4, 0x5F6B, - 0x92A5, 0x5FB4, 0x92A6, 0x61F2, 0x92A7, 0x6311, 0x92A8, 0x66A2, - 0x92A9, 0x671D, 0x92AA, 0x6F6E, 0x92AB, 0x7252, 0x92AC, 0x753A, - 0x92AD, 0x773A, 0x92AE, 0x8074, 0x92AF, 0x8139, 0x92B0, 0x8178, - 0x92B1, 0x8776, 0x92B2, 0x8ABF, 0x92B3, 0x8ADC, 0x92B4, 0x8D85, - 0x92B5, 0x8DF3, 0x92B6, 0x929A, 0x92B7, 0x9577, 0x92B8, 0x9802, - 0x92B9, 0x9CE5, 0x92BA, 0x52C5, 0x92BB, 0x6357, 0x92BC, 0x76F4, - 0x92BD, 0x6715, 0x92BE, 0x6C88, 0x92BF, 0x73CD, 0x92C0, 0x8CC3, - 0x92C1, 0x93AE, 0x92C2, 0x9673, 0x92C3, 0x6D25, 0x92C4, 0x589C, - 0x92C5, 0x690E, 0x92C6, 0x69CC, 0x92C7, 0x8FFD, 0x92C8, 0x939A, - 0x92C9, 0x75DB, 0x92CA, 0x901A, 0x92CB, 0x585A, 0x92CC, 0x6802, - 0x92CD, 0x63B4, 0x92CE, 0x69FB, 0x92CF, 0x4F43, 0x92D0, 0x6F2C, - 0x92D1, 0x67D8, 0x92D2, 0x8FBB, 0x92D3, 0x8526, 0x92D4, 0x7DB4, - 0x92D5, 0x9354, 0x92D6, 0x693F, 0x92D7, 0x6F70, 0x92D8, 0x576A, - 0x92D9, 0x58F7, 0x92DA, 0x5B2C, 0x92DB, 0x7D2C, 0x92DC, 0x722A, - 0x92DD, 0x540A, 0x92DE, 0x91E3, 0x92DF, 0x9DB4, 0x92E0, 0x4EAD, - 0x92E1, 0x4F4E, 0x92E2, 0x505C, 0x92E3, 0x5075, 0x92E4, 0x5243, - 0x92E5, 0x8C9E, 0x92E6, 0x5448, 0x92E7, 0x5824, 0x92E8, 0x5B9A, - 0x92E9, 0x5E1D, 0x92EA, 0x5E95, 0x92EB, 0x5EAD, 0x92EC, 0x5EF7, - 0x92ED, 0x5F1F, 0x92EE, 0x608C, 0x92EF, 0x62B5, 0x92F0, 0x633A, - 0x92F1, 0x63D0, 0x92F2, 0x68AF, 0x92F3, 0x6C40, 0x92F4, 0x7887, - 0x92F5, 0x798E, 0x92F6, 0x7A0B, 0x92F7, 0x7DE0, 0x92F8, 0x8247, - 0x92F9, 0x8A02, 0x92FA, 0x8AE6, 0x92FB, 0x8E44, 0x92FC, 0x9013, - 0x9340, 0x90B8, 0x9341, 0x912D, 0x9342, 0x91D8, 0x9343, 0x9F0E, - 0x9344, 0x6CE5, 0x9345, 0x6458, 0x9346, 0x64E2, 0x9347, 0x6575, - 0x9348, 0x6EF4, 0x9349, 0x7684, 0x934A, 0x7B1B, 0x934B, 0x9069, - 0x934C, 0x93D1, 0x934D, 0x6EBA, 0x934E, 0x54F2, 0x934F, 0x5FB9, - 0x9350, 0x64A4, 0x9351, 0x8F4D, 0x9352, 0x8FED, 0x9353, 0x9244, - 0x9354, 0x5178, 0x9355, 0x586B, 0x9356, 0x5929, 0x9357, 0x5C55, - 0x9358, 0x5E97, 0x9359, 0x6DFB, 0x935A, 0x7E8F, 0x935B, 0x751C, - 0x935C, 0x8CBC, 0x935D, 0x8EE2, 0x935E, 0x985B, 0x935F, 0x70B9, - 0x9360, 0x4F1D, 0x9361, 0x6BBF, 0x9362, 0x6FB1, 0x9363, 0x7530, - 0x9364, 0x96FB, 0x9365, 0x514E, 0x9366, 0x5410, 0x9367, 0x5835, - 0x9368, 0x5857, 0x9369, 0x59AC, 0x936A, 0x5C60, 0x936B, 0x5F92, - 0x936C, 0x6597, 0x936D, 0x675C, 0x936E, 0x6E21, 0x936F, 0x767B, - 0x9370, 0x83DF, 0x9371, 0x8CED, 0x9372, 0x9014, 0x9373, 0x90FD, - 0x9374, 0x934D, 0x9375, 0x7825, 0x9376, 0x783A, 0x9377, 0x52AA, - 0x9378, 0x5EA6, 0x9379, 0x571F, 0x937A, 0x5974, 0x937B, 0x6012, - 0x937C, 0x5012, 0x937D, 0x515A, 0x937E, 0x51AC, 0x9380, 0x51CD, - 0x9381, 0x5200, 0x9382, 0x5510, 0x9383, 0x5854, 0x9384, 0x5858, - 0x9385, 0x5957, 0x9386, 0x5B95, 0x9387, 0x5CF6, 0x9388, 0x5D8B, - 0x9389, 0x60BC, 0x938A, 0x6295, 0x938B, 0x642D, 0x938C, 0x6771, - 0x938D, 0x6843, 0x938E, 0x68BC, 0x938F, 0x68DF, 0x9390, 0x76D7, - 0x9391, 0x6DD8, 0x9392, 0x6E6F, 0x9393, 0x6D9B, 0x9394, 0x706F, - 0x9395, 0x71C8, 0x9396, 0x5F53, 0x9397, 0x75D8, 0x9398, 0x7977, - 0x9399, 0x7B49, 0x939A, 0x7B54, 0x939B, 0x7B52, 0x939C, 0x7CD6, - 0x939D, 0x7D71, 0x939E, 0x5230, 0x939F, 0x8463, 0x93A0, 0x8569, - 0x93A1, 0x85E4, 0x93A2, 0x8A0E, 0x93A3, 0x8B04, 0x93A4, 0x8C46, - 0x93A5, 0x8E0F, 0x93A6, 0x9003, 0x93A7, 0x900F, 0x93A8, 0x9419, - 0x93A9, 0x9676, 0x93AA, 0x982D, 0x93AB, 0x9A30, 0x93AC, 0x95D8, - 0x93AD, 0x50CD, 0x93AE, 0x52D5, 0x93AF, 0x540C, 0x93B0, 0x5802, - 0x93B1, 0x5C0E, 0x93B2, 0x61A7, 0x93B3, 0x649E, 0x93B4, 0x6D1E, - 0x93B5, 0x77B3, 0x93B6, 0x7AE5, 0x93B7, 0x80F4, 0x93B8, 0x8404, - 0x93B9, 0x9053, 0x93BA, 0x9285, 0x93BB, 0x5CE0, 0x93BC, 0x9D07, - 0x93BD, 0x533F, 0x93BE, 0x5F97, 0x93BF, 0x5FB3, 0x93C0, 0x6D9C, - 0x93C1, 0x7279, 0x93C2, 0x7763, 0x93C3, 0x79BF, 0x93C4, 0x7BE4, - 0x93C5, 0x6BD2, 0x93C6, 0x72EC, 0x93C7, 0x8AAD, 0x93C8, 0x6803, - 0x93C9, 0x6A61, 0x93CA, 0x51F8, 0x93CB, 0x7A81, 0x93CC, 0x6934, - 0x93CD, 0x5C4A, 0x93CE, 0x9CF6, 0x93CF, 0x82EB, 0x93D0, 0x5BC5, - 0x93D1, 0x9149, 0x93D2, 0x701E, 0x93D3, 0x5678, 0x93D4, 0x5C6F, - 0x93D5, 0x60C7, 0x93D6, 0x6566, 0x93D7, 0x6C8C, 0x93D8, 0x8C5A, - 0x93D9, 0x9041, 0x93DA, 0x9813, 0x93DB, 0x5451, 0x93DC, 0x66C7, - 0x93DD, 0x920D, 0x93DE, 0x5948, 0x93DF, 0x90A3, 0x93E0, 0x5185, - 0x93E1, 0x4E4D, 0x93E2, 0x51EA, 0x93E3, 0x8599, 0x93E4, 0x8B0E, - 0x93E5, 0x7058, 0x93E6, 0x637A, 0x93E7, 0x934B, 0x93E8, 0x6962, - 0x93E9, 0x99B4, 0x93EA, 0x7E04, 0x93EB, 0x7577, 0x93EC, 0x5357, - 0x93ED, 0x6960, 0x93EE, 0x8EDF, 0x93EF, 0x96E3, 0x93F0, 0x6C5D, - 0x93F1, 0x4E8C, 0x93F2, 0x5C3C, 0x93F3, 0x5F10, 0x93F4, 0x8FE9, - 0x93F5, 0x5302, 0x93F6, 0x8CD1, 0x93F7, 0x8089, 0x93F8, 0x8679, - 0x93F9, 0x5EFF, 0x93FA, 0x65E5, 0x93FB, 0x4E73, 0x93FC, 0x5165, - 0x9440, 0x5982, 0x9441, 0x5C3F, 0x9442, 0x97EE, 0x9443, 0x4EFB, - 0x9444, 0x598A, 0x9445, 0x5FCD, 0x9446, 0x8A8D, 0x9447, 0x6FE1, - 0x9448, 0x79B0, 0x9449, 0x7962, 0x944A, 0x5BE7, 0x944B, 0x8471, - 0x944C, 0x732B, 0x944D, 0x71B1, 0x944E, 0x5E74, 0x944F, 0x5FF5, - 0x9450, 0x637B, 0x9451, 0x649A, 0x9452, 0x71C3, 0x9453, 0x7C98, - 0x9454, 0x4E43, 0x9455, 0x5EFC, 0x9456, 0x4E4B, 0x9457, 0x57DC, - 0x9458, 0x56A2, 0x9459, 0x60A9, 0x945A, 0x6FC3, 0x945B, 0x7D0D, - 0x945C, 0x80FD, 0x945D, 0x8133, 0x945E, 0x81BF, 0x945F, 0x8FB2, - 0x9460, 0x8997, 0x9461, 0x86A4, 0x9462, 0x5DF4, 0x9463, 0x628A, - 0x9464, 0x64AD, 0x9465, 0x8987, 0x9466, 0x6777, 0x9467, 0x6CE2, - 0x9468, 0x6D3E, 0x9469, 0x7436, 0x946A, 0x7834, 0x946B, 0x5A46, - 0x946C, 0x7F75, 0x946D, 0x82AD, 0x946E, 0x99AC, 0x946F, 0x4FF3, - 0x9470, 0x5EC3, 0x9471, 0x62DD, 0x9472, 0x6392, 0x9473, 0x6557, - 0x9474, 0x676F, 0x9475, 0x76C3, 0x9476, 0x724C, 0x9477, 0x80CC, - 0x9478, 0x80BA, 0x9479, 0x8F29, 0x947A, 0x914D, 0x947B, 0x500D, - 0x947C, 0x57F9, 0x947D, 0x5A92, 0x947E, 0x6885, 0x9480, 0x6973, - 0x9481, 0x7164, 0x9482, 0x72FD, 0x9483, 0x8CB7, 0x9484, 0x58F2, - 0x9485, 0x8CE0, 0x9486, 0x966A, 0x9487, 0x9019, 0x9488, 0x877F, - 0x9489, 0x79E4, 0x948A, 0x77E7, 0x948B, 0x8429, 0x948C, 0x4F2F, - 0x948D, 0x5265, 0x948E, 0x535A, 0x948F, 0x62CD, 0x9490, 0x67CF, - 0x9491, 0x6CCA, 0x9492, 0x767D, 0x9493, 0x7B94, 0x9494, 0x7C95, - 0x9495, 0x8236, 0x9496, 0x8584, 0x9497, 0x8FEB, 0x9498, 0x66DD, - 0x9499, 0x6F20, 0x949A, 0x7206, 0x949B, 0x7E1B, 0x949C, 0x83AB, - 0x949D, 0x99C1, 0x949E, 0x9EA6, 0x949F, 0x51FD, 0x94A0, 0x7BB1, - 0x94A1, 0x7872, 0x94A2, 0x7BB8, 0x94A3, 0x8087, 0x94A4, 0x7B48, - 0x94A5, 0x6AE8, 0x94A6, 0x5E61, 0x94A7, 0x808C, 0x94A8, 0x7551, - 0x94A9, 0x7560, 0x94AA, 0x516B, 0x94AB, 0x9262, 0x94AC, 0x6E8C, - 0x94AD, 0x767A, 0x94AE, 0x9197, 0x94AF, 0x9AEA, 0x94B0, 0x4F10, - 0x94B1, 0x7F70, 0x94B2, 0x629C, 0x94B3, 0x7B4F, 0x94B4, 0x95A5, - 0x94B5, 0x9CE9, 0x94B6, 0x567A, 0x94B7, 0x5859, 0x94B8, 0x86E4, - 0x94B9, 0x96BC, 0x94BA, 0x4F34, 0x94BB, 0x5224, 0x94BC, 0x534A, - 0x94BD, 0x53CD, 0x94BE, 0x53DB, 0x94BF, 0x5E06, 0x94C0, 0x642C, - 0x94C1, 0x6591, 0x94C2, 0x677F, 0x94C3, 0x6C3E, 0x94C4, 0x6C4E, - 0x94C5, 0x7248, 0x94C6, 0x72AF, 0x94C7, 0x73ED, 0x94C8, 0x7554, - 0x94C9, 0x7E41, 0x94CA, 0x822C, 0x94CB, 0x85E9, 0x94CC, 0x8CA9, - 0x94CD, 0x7BC4, 0x94CE, 0x91C6, 0x94CF, 0x7169, 0x94D0, 0x9812, - 0x94D1, 0x98EF, 0x94D2, 0x633D, 0x94D3, 0x6669, 0x94D4, 0x756A, - 0x94D5, 0x76E4, 0x94D6, 0x78D0, 0x94D7, 0x8543, 0x94D8, 0x86EE, - 0x94D9, 0x532A, 0x94DA, 0x5351, 0x94DB, 0x5426, 0x94DC, 0x5983, - 0x94DD, 0x5E87, 0x94DE, 0x5F7C, 0x94DF, 0x60B2, 0x94E0, 0x6249, - 0x94E1, 0x6279, 0x94E2, 0x62AB, 0x94E3, 0x6590, 0x94E4, 0x6BD4, - 0x94E5, 0x6CCC, 0x94E6, 0x75B2, 0x94E7, 0x76AE, 0x94E8, 0x7891, - 0x94E9, 0x79D8, 0x94EA, 0x7DCB, 0x94EB, 0x7F77, 0x94EC, 0x80A5, - 0x94ED, 0x88AB, 0x94EE, 0x8AB9, 0x94EF, 0x8CBB, 0x94F0, 0x907F, - 0x94F1, 0x975E, 0x94F2, 0x98DB, 0x94F3, 0x6A0B, 0x94F4, 0x7C38, - 0x94F5, 0x5099, 0x94F6, 0x5C3E, 0x94F7, 0x5FAE, 0x94F8, 0x6787, - 0x94F9, 0x6BD8, 0x94FA, 0x7435, 0x94FB, 0x7709, 0x94FC, 0x7F8E, - 0x9540, 0x9F3B, 0x9541, 0x67CA, 0x9542, 0x7A17, 0x9543, 0x5339, - 0x9544, 0x758B, 0x9545, 0x9AED, 0x9546, 0x5F66, 0x9547, 0x819D, - 0x9548, 0x83F1, 0x9549, 0x8098, 0x954A, 0x5F3C, 0x954B, 0x5FC5, - 0x954C, 0x7562, 0x954D, 0x7B46, 0x954E, 0x903C, 0x954F, 0x6867, - 0x9550, 0x59EB, 0x9551, 0x5A9B, 0x9552, 0x7D10, 0x9553, 0x767E, - 0x9554, 0x8B2C, 0x9555, 0x4FF5, 0x9556, 0x5F6A, 0x9557, 0x6A19, - 0x9558, 0x6C37, 0x9559, 0x6F02, 0x955A, 0x74E2, 0x955B, 0x7968, - 0x955C, 0x8868, 0x955D, 0x8A55, 0x955E, 0x8C79, 0x955F, 0x5EDF, - 0x9560, 0x63CF, 0x9561, 0x75C5, 0x9562, 0x79D2, 0x9563, 0x82D7, - 0x9564, 0x9328, 0x9565, 0x92F2, 0x9566, 0x849C, 0x9567, 0x86ED, - 0x9568, 0x9C2D, 0x9569, 0x54C1, 0x956A, 0x5F6C, 0x956B, 0x658C, - 0x956C, 0x6D5C, 0x956D, 0x7015, 0x956E, 0x8CA7, 0x956F, 0x8CD3, - 0x9570, 0x983B, 0x9571, 0x654F, 0x9572, 0x74F6, 0x9573, 0x4E0D, - 0x9574, 0x4ED8, 0x9575, 0x57E0, 0x9576, 0x592B, 0x9577, 0x5A66, - 0x9578, 0x5BCC, 0x9579, 0x51A8, 0x957A, 0x5E03, 0x957B, 0x5E9C, - 0x957C, 0x6016, 0x957D, 0x6276, 0x957E, 0x6577, 0x9580, 0x65A7, - 0x9581, 0x666E, 0x9582, 0x6D6E, 0x9583, 0x7236, 0x9584, 0x7B26, - 0x9585, 0x8150, 0x9586, 0x819A, 0x9587, 0x8299, 0x9588, 0x8B5C, - 0x9589, 0x8CA0, 0x958A, 0x8CE6, 0x958B, 0x8D74, 0x958C, 0x961C, - 0x958D, 0x9644, 0x958E, 0x4FAE, 0x958F, 0x64AB, 0x9590, 0x6B66, - 0x9591, 0x821E, 0x9592, 0x8461, 0x9593, 0x856A, 0x9594, 0x90E8, - 0x9595, 0x5C01, 0x9596, 0x6953, 0x9597, 0x98A8, 0x9598, 0x847A, - 0x9599, 0x8557, 0x959A, 0x4F0F, 0x959B, 0x526F, 0x959C, 0x5FA9, - 0x959D, 0x5E45, 0x959E, 0x670D, 0x959F, 0x798F, 0x95A0, 0x8179, - 0x95A1, 0x8907, 0x95A2, 0x8986, 0x95A3, 0x6DF5, 0x95A4, 0x5F17, - 0x95A5, 0x6255, 0x95A6, 0x6CB8, 0x95A7, 0x4ECF, 0x95A8, 0x7269, - 0x95A9, 0x9B92, 0x95AA, 0x5206, 0x95AB, 0x543B, 0x95AC, 0x5674, - 0x95AD, 0x58B3, 0x95AE, 0x61A4, 0x95AF, 0x626E, 0x95B0, 0x711A, - 0x95B1, 0x596E, 0x95B2, 0x7C89, 0x95B3, 0x7CDE, 0x95B4, 0x7D1B, - 0x95B5, 0x96F0, 0x95B6, 0x6587, 0x95B7, 0x805E, 0x95B8, 0x4E19, - 0x95B9, 0x4F75, 0x95BA, 0x5175, 0x95BB, 0x5840, 0x95BC, 0x5E63, - 0x95BD, 0x5E73, 0x95BE, 0x5F0A, 0x95BF, 0x67C4, 0x95C0, 0x4E26, - 0x95C1, 0x853D, 0x95C2, 0x9589, 0x95C3, 0x965B, 0x95C4, 0x7C73, - 0x95C5, 0x9801, 0x95C6, 0x50FB, 0x95C7, 0x58C1, 0x95C8, 0x7656, - 0x95C9, 0x78A7, 0x95CA, 0x5225, 0x95CB, 0x77A5, 0x95CC, 0x8511, - 0x95CD, 0x7B86, 0x95CE, 0x504F, 0x95CF, 0x5909, 0x95D0, 0x7247, - 0x95D1, 0x7BC7, 0x95D2, 0x7DE8, 0x95D3, 0x8FBA, 0x95D4, 0x8FD4, - 0x95D5, 0x904D, 0x95D6, 0x4FBF, 0x95D7, 0x52C9, 0x95D8, 0x5A29, - 0x95D9, 0x5F01, 0x95DA, 0x97AD, 0x95DB, 0x4FDD, 0x95DC, 0x8217, - 0x95DD, 0x92EA, 0x95DE, 0x5703, 0x95DF, 0x6355, 0x95E0, 0x6B69, - 0x95E1, 0x752B, 0x95E2, 0x88DC, 0x95E3, 0x8F14, 0x95E4, 0x7A42, - 0x95E5, 0x52DF, 0x95E6, 0x5893, 0x95E7, 0x6155, 0x95E8, 0x620A, - 0x95E9, 0x66AE, 0x95EA, 0x6BCD, 0x95EB, 0x7C3F, 0x95EC, 0x83E9, - 0x95ED, 0x5023, 0x95EE, 0x4FF8, 0x95EF, 0x5305, 0x95F0, 0x5446, - 0x95F1, 0x5831, 0x95F2, 0x5949, 0x95F3, 0x5B9D, 0x95F4, 0x5CF0, - 0x95F5, 0x5CEF, 0x95F6, 0x5D29, 0x95F7, 0x5E96, 0x95F8, 0x62B1, - 0x95F9, 0x6367, 0x95FA, 0x653E, 0x95FB, 0x65B9, 0x95FC, 0x670B, - 0x9640, 0x6CD5, 0x9641, 0x6CE1, 0x9642, 0x70F9, 0x9643, 0x7832, - 0x9644, 0x7E2B, 0x9645, 0x80DE, 0x9646, 0x82B3, 0x9647, 0x840C, - 0x9648, 0x84EC, 0x9649, 0x8702, 0x964A, 0x8912, 0x964B, 0x8A2A, - 0x964C, 0x8C4A, 0x964D, 0x90A6, 0x964E, 0x92D2, 0x964F, 0x98FD, - 0x9650, 0x9CF3, 0x9651, 0x9D6C, 0x9652, 0x4E4F, 0x9653, 0x4EA1, - 0x9654, 0x508D, 0x9655, 0x5256, 0x9656, 0x574A, 0x9657, 0x59A8, - 0x9658, 0x5E3D, 0x9659, 0x5FD8, 0x965A, 0x5FD9, 0x965B, 0x623F, - 0x965C, 0x66B4, 0x965D, 0x671B, 0x965E, 0x67D0, 0x965F, 0x68D2, - 0x9660, 0x5192, 0x9661, 0x7D21, 0x9662, 0x80AA, 0x9663, 0x81A8, - 0x9664, 0x8B00, 0x9665, 0x8C8C, 0x9666, 0x8CBF, 0x9667, 0x927E, - 0x9668, 0x9632, 0x9669, 0x5420, 0x966A, 0x982C, 0x966B, 0x5317, - 0x966C, 0x50D5, 0x966D, 0x535C, 0x966E, 0x58A8, 0x966F, 0x64B2, - 0x9670, 0x6734, 0x9671, 0x7267, 0x9672, 0x7766, 0x9673, 0x7A46, - 0x9674, 0x91E6, 0x9675, 0x52C3, 0x9676, 0x6CA1, 0x9677, 0x6B86, - 0x9678, 0x5800, 0x9679, 0x5E4C, 0x967A, 0x5954, 0x967B, 0x672C, - 0x967C, 0x7FFB, 0x967D, 0x51E1, 0x967E, 0x76C6, 0x9680, 0x6469, - 0x9681, 0x78E8, 0x9682, 0x9B54, 0x9683, 0x9EBB, 0x9684, 0x57CB, - 0x9685, 0x59B9, 0x9686, 0x6627, 0x9687, 0x679A, 0x9688, 0x6BCE, - 0x9689, 0x54E9, 0x968A, 0x69D9, 0x968B, 0x5E55, 0x968C, 0x819C, - 0x968D, 0x6795, 0x968E, 0x9BAA, 0x968F, 0x67FE, 0x9690, 0x9C52, - 0x9691, 0x685D, 0x9692, 0x4EA6, 0x9693, 0x4FE3, 0x9694, 0x53C8, - 0x9695, 0x62B9, 0x9696, 0x672B, 0x9697, 0x6CAB, 0x9698, 0x8FC4, - 0x9699, 0x4FAD, 0x969A, 0x7E6D, 0x969B, 0x9EBF, 0x969C, 0x4E07, - 0x969D, 0x6162, 0x969E, 0x6E80, 0x969F, 0x6F2B, 0x96A0, 0x8513, - 0x96A1, 0x5473, 0x96A2, 0x672A, 0x96A3, 0x9B45, 0x96A4, 0x5DF3, - 0x96A5, 0x7B95, 0x96A6, 0x5CAC, 0x96A7, 0x5BC6, 0x96A8, 0x871C, - 0x96A9, 0x6E4A, 0x96AA, 0x84D1, 0x96AB, 0x7A14, 0x96AC, 0x8108, - 0x96AD, 0x5999, 0x96AE, 0x7C8D, 0x96AF, 0x6C11, 0x96B0, 0x7720, - 0x96B1, 0x52D9, 0x96B2, 0x5922, 0x96B3, 0x7121, 0x96B4, 0x725F, - 0x96B5, 0x77DB, 0x96B6, 0x9727, 0x96B7, 0x9D61, 0x96B8, 0x690B, - 0x96B9, 0x5A7F, 0x96BA, 0x5A18, 0x96BB, 0x51A5, 0x96BC, 0x540D, - 0x96BD, 0x547D, 0x96BE, 0x660E, 0x96BF, 0x76DF, 0x96C0, 0x8FF7, - 0x96C1, 0x9298, 0x96C2, 0x9CF4, 0x96C3, 0x59EA, 0x96C4, 0x725D, - 0x96C5, 0x6EC5, 0x96C6, 0x514D, 0x96C7, 0x68C9, 0x96C8, 0x7DBF, - 0x96C9, 0x7DEC, 0x96CA, 0x9762, 0x96CB, 0x9EBA, 0x96CC, 0x6478, - 0x96CD, 0x6A21, 0x96CE, 0x8302, 0x96CF, 0x5984, 0x96D0, 0x5B5F, - 0x96D1, 0x6BDB, 0x96D2, 0x731B, 0x96D3, 0x76F2, 0x96D4, 0x7DB2, - 0x96D5, 0x8017, 0x96D6, 0x8499, 0x96D7, 0x5132, 0x96D8, 0x6728, - 0x96D9, 0x9ED9, 0x96DA, 0x76EE, 0x96DB, 0x6762, 0x96DC, 0x52FF, - 0x96DD, 0x9905, 0x96DE, 0x5C24, 0x96DF, 0x623B, 0x96E0, 0x7C7E, - 0x96E1, 0x8CB0, 0x96E2, 0x554F, 0x96E3, 0x60B6, 0x96E4, 0x7D0B, - 0x96E5, 0x9580, 0x96E6, 0x5301, 0x96E7, 0x4E5F, 0x96E8, 0x51B6, - 0x96E9, 0x591C, 0x96EA, 0x723A, 0x96EB, 0x8036, 0x96EC, 0x91CE, - 0x96ED, 0x5F25, 0x96EE, 0x77E2, 0x96EF, 0x5384, 0x96F0, 0x5F79, - 0x96F1, 0x7D04, 0x96F2, 0x85AC, 0x96F3, 0x8A33, 0x96F4, 0x8E8D, - 0x96F5, 0x9756, 0x96F6, 0x67F3, 0x96F7, 0x85AE, 0x96F8, 0x9453, - 0x96F9, 0x6109, 0x96FA, 0x6108, 0x96FB, 0x6CB9, 0x96FC, 0x7652, - 0x9740, 0x8AED, 0x9741, 0x8F38, 0x9742, 0x552F, 0x9743, 0x4F51, - 0x9744, 0x512A, 0x9745, 0x52C7, 0x9746, 0x53CB, 0x9747, 0x5BA5, - 0x9748, 0x5E7D, 0x9749, 0x60A0, 0x974A, 0x6182, 0x974B, 0x63D6, - 0x974C, 0x6709, 0x974D, 0x67DA, 0x974E, 0x6E67, 0x974F, 0x6D8C, - 0x9750, 0x7336, 0x9751, 0x7337, 0x9752, 0x7531, 0x9753, 0x7950, - 0x9754, 0x88D5, 0x9755, 0x8A98, 0x9756, 0x904A, 0x9757, 0x9091, - 0x9758, 0x90F5, 0x9759, 0x96C4, 0x975A, 0x878D, 0x975B, 0x5915, - 0x975C, 0x4E88, 0x975D, 0x4F59, 0x975E, 0x4E0E, 0x975F, 0x8A89, - 0x9760, 0x8F3F, 0x9761, 0x9810, 0x9762, 0x50AD, 0x9763, 0x5E7C, - 0x9764, 0x5996, 0x9765, 0x5BB9, 0x9766, 0x5EB8, 0x9767, 0x63DA, - 0x9768, 0x63FA, 0x9769, 0x64C1, 0x976A, 0x66DC, 0x976B, 0x694A, - 0x976C, 0x69D8, 0x976D, 0x6D0B, 0x976E, 0x6EB6, 0x976F, 0x7194, - 0x9770, 0x7528, 0x9771, 0x7AAF, 0x9772, 0x7F8A, 0x9773, 0x8000, - 0x9774, 0x8449, 0x9775, 0x84C9, 0x9776, 0x8981, 0x9777, 0x8B21, - 0x9778, 0x8E0A, 0x9779, 0x9065, 0x977A, 0x967D, 0x977B, 0x990A, - 0x977C, 0x617E, 0x977D, 0x6291, 0x977E, 0x6B32, 0x9780, 0x6C83, - 0x9781, 0x6D74, 0x9782, 0x7FCC, 0x9783, 0x7FFC, 0x9784, 0x6DC0, - 0x9785, 0x7F85, 0x9786, 0x87BA, 0x9787, 0x88F8, 0x9788, 0x6765, - 0x9789, 0x83B1, 0x978A, 0x983C, 0x978B, 0x96F7, 0x978C, 0x6D1B, - 0x978D, 0x7D61, 0x978E, 0x843D, 0x978F, 0x916A, 0x9790, 0x4E71, - 0x9791, 0x5375, 0x9792, 0x5D50, 0x9793, 0x6B04, 0x9794, 0x6FEB, - 0x9795, 0x85CD, 0x9796, 0x862D, 0x9797, 0x89A7, 0x9798, 0x5229, - 0x9799, 0x540F, 0x979A, 0x5C65, 0x979B, 0x674E, 0x979C, 0x68A8, - 0x979D, 0x7406, 0x979E, 0x7483, 0x979F, 0x75E2, 0x97A0, 0x88CF, - 0x97A1, 0x88E1, 0x97A2, 0x91CC, 0x97A3, 0x96E2, 0x97A4, 0x9678, - 0x97A5, 0x5F8B, 0x97A6, 0x7387, 0x97A7, 0x7ACB, 0x97A8, 0x844E, - 0x97A9, 0x63A0, 0x97AA, 0x7565, 0x97AB, 0x5289, 0x97AC, 0x6D41, - 0x97AD, 0x6E9C, 0x97AE, 0x7409, 0x97AF, 0x7559, 0x97B0, 0x786B, - 0x97B1, 0x7C92, 0x97B2, 0x9686, 0x97B3, 0x7ADC, 0x97B4, 0x9F8D, - 0x97B5, 0x4FB6, 0x97B6, 0x616E, 0x97B7, 0x65C5, 0x97B8, 0x865C, - 0x97B9, 0x4E86, 0x97BA, 0x4EAE, 0x97BB, 0x50DA, 0x97BC, 0x4E21, - 0x97BD, 0x51CC, 0x97BE, 0x5BEE, 0x97BF, 0x6599, 0x97C0, 0x6881, - 0x97C1, 0x6DBC, 0x97C2, 0x731F, 0x97C3, 0x7642, 0x97C4, 0x77AD, - 0x97C5, 0x7A1C, 0x97C6, 0x7CE7, 0x97C7, 0x826F, 0x97C8, 0x8AD2, - 0x97C9, 0x907C, 0x97CA, 0x91CF, 0x97CB, 0x9675, 0x97CC, 0x9818, - 0x97CD, 0x529B, 0x97CE, 0x7DD1, 0x97CF, 0x502B, 0x97D0, 0x5398, - 0x97D1, 0x6797, 0x97D2, 0x6DCB, 0x97D3, 0x71D0, 0x97D4, 0x7433, - 0x97D5, 0x81E8, 0x97D6, 0x8F2A, 0x97D7, 0x96A3, 0x97D8, 0x9C57, - 0x97D9, 0x9E9F, 0x97DA, 0x7460, 0x97DB, 0x5841, 0x97DC, 0x6D99, - 0x97DD, 0x7D2F, 0x97DE, 0x985E, 0x97DF, 0x4EE4, 0x97E0, 0x4F36, - 0x97E1, 0x4F8B, 0x97E2, 0x51B7, 0x97E3, 0x52B1, 0x97E4, 0x5DBA, - 0x97E5, 0x601C, 0x97E6, 0x73B2, 0x97E7, 0x793C, 0x97E8, 0x82D3, - 0x97E9, 0x9234, 0x97EA, 0x96B7, 0x97EB, 0x96F6, 0x97EC, 0x970A, - 0x97ED, 0x9E97, 0x97EE, 0x9F62, 0x97EF, 0x66A6, 0x97F0, 0x6B74, - 0x97F1, 0x5217, 0x97F2, 0x52A3, 0x97F3, 0x70C8, 0x97F4, 0x88C2, - 0x97F5, 0x5EC9, 0x97F6, 0x604B, 0x97F7, 0x6190, 0x97F8, 0x6F23, - 0x97F9, 0x7149, 0x97FA, 0x7C3E, 0x97FB, 0x7DF4, 0x97FC, 0x806F, - 0x9840, 0x84EE, 0x9841, 0x9023, 0x9842, 0x932C, 0x9843, 0x5442, - 0x9844, 0x9B6F, 0x9845, 0x6AD3, 0x9846, 0x7089, 0x9847, 0x8CC2, - 0x9848, 0x8DEF, 0x9849, 0x9732, 0x984A, 0x52B4, 0x984B, 0x5A41, - 0x984C, 0x5ECA, 0x984D, 0x5F04, 0x984E, 0x6717, 0x984F, 0x697C, - 0x9850, 0x6994, 0x9851, 0x6D6A, 0x9852, 0x6F0F, 0x9853, 0x7262, - 0x9854, 0x72FC, 0x9855, 0x7BED, 0x9856, 0x8001, 0x9857, 0x807E, - 0x9858, 0x874B, 0x9859, 0x90CE, 0x985A, 0x516D, 0x985B, 0x9E93, - 0x985C, 0x7984, 0x985D, 0x808B, 0x985E, 0x9332, 0x985F, 0x8AD6, - 0x9860, 0x502D, 0x9861, 0x548C, 0x9862, 0x8A71, 0x9863, 0x6B6A, - 0x9864, 0x8CC4, 0x9865, 0x8107, 0x9866, 0x60D1, 0x9867, 0x67A0, - 0x9868, 0x9DF2, 0x9869, 0x4E99, 0x986A, 0x4E98, 0x986B, 0x9C10, - 0x986C, 0x8A6B, 0x986D, 0x85C1, 0x986E, 0x8568, 0x986F, 0x6900, - 0x9870, 0x6E7E, 0x9871, 0x7897, 0x9872, 0x8155, 0x989F, 0x5F0C, - 0x98A0, 0x4E10, 0x98A1, 0x4E15, 0x98A2, 0x4E2A, 0x98A3, 0x4E31, - 0x98A4, 0x4E36, 0x98A5, 0x4E3C, 0x98A6, 0x4E3F, 0x98A7, 0x4E42, - 0x98A8, 0x4E56, 0x98A9, 0x4E58, 0x98AA, 0x4E82, 0x98AB, 0x4E85, - 0x98AC, 0x8C6B, 0x98AD, 0x4E8A, 0x98AE, 0x8212, 0x98AF, 0x5F0D, - 0x98B0, 0x4E8E, 0x98B1, 0x4E9E, 0x98B2, 0x4E9F, 0x98B3, 0x4EA0, - 0x98B4, 0x4EA2, 0x98B5, 0x4EB0, 0x98B6, 0x4EB3, 0x98B7, 0x4EB6, - 0x98B8, 0x4ECE, 0x98B9, 0x4ECD, 0x98BA, 0x4EC4, 0x98BB, 0x4EC6, - 0x98BC, 0x4EC2, 0x98BD, 0x4ED7, 0x98BE, 0x4EDE, 0x98BF, 0x4EED, - 0x98C0, 0x4EDF, 0x98C1, 0x4EF7, 0x98C2, 0x4F09, 0x98C3, 0x4F5A, - 0x98C4, 0x4F30, 0x98C5, 0x4F5B, 0x98C6, 0x4F5D, 0x98C7, 0x4F57, - 0x98C8, 0x4F47, 0x98C9, 0x4F76, 0x98CA, 0x4F88, 0x98CB, 0x4F8F, - 0x98CC, 0x4F98, 0x98CD, 0x4F7B, 0x98CE, 0x4F69, 0x98CF, 0x4F70, - 0x98D0, 0x4F91, 0x98D1, 0x4F6F, 0x98D2, 0x4F86, 0x98D3, 0x4F96, - 0x98D4, 0x5118, 0x98D5, 0x4FD4, 0x98D6, 0x4FDF, 0x98D7, 0x4FCE, - 0x98D8, 0x4FD8, 0x98D9, 0x4FDB, 0x98DA, 0x4FD1, 0x98DB, 0x4FDA, - 0x98DC, 0x4FD0, 0x98DD, 0x4FE4, 0x98DE, 0x4FE5, 0x98DF, 0x501A, - 0x98E0, 0x5028, 0x98E1, 0x5014, 0x98E2, 0x502A, 0x98E3, 0x5025, - 0x98E4, 0x5005, 0x98E5, 0x4F1C, 0x98E6, 0x4FF6, 0x98E7, 0x5021, - 0x98E8, 0x5029, 0x98E9, 0x502C, 0x98EA, 0x4FFE, 0x98EB, 0x4FEF, - 0x98EC, 0x5011, 0x98ED, 0x5006, 0x98EE, 0x5043, 0x98EF, 0x5047, - 0x98F0, 0x6703, 0x98F1, 0x5055, 0x98F2, 0x5050, 0x98F3, 0x5048, - 0x98F4, 0x505A, 0x98F5, 0x5056, 0x98F6, 0x506C, 0x98F7, 0x5078, - 0x98F8, 0x5080, 0x98F9, 0x509A, 0x98FA, 0x5085, 0x98FB, 0x50B4, - 0x98FC, 0x50B2, 0x9940, 0x50C9, 0x9941, 0x50CA, 0x9942, 0x50B3, - 0x9943, 0x50C2, 0x9944, 0x50D6, 0x9945, 0x50DE, 0x9946, 0x50E5, - 0x9947, 0x50ED, 0x9948, 0x50E3, 0x9949, 0x50EE, 0x994A, 0x50F9, - 0x994B, 0x50F5, 0x994C, 0x5109, 0x994D, 0x5101, 0x994E, 0x5102, - 0x994F, 0x5116, 0x9950, 0x5115, 0x9951, 0x5114, 0x9952, 0x511A, - 0x9953, 0x5121, 0x9954, 0x513A, 0x9955, 0x5137, 0x9956, 0x513C, - 0x9957, 0x513B, 0x9958, 0x513F, 0x9959, 0x5140, 0x995A, 0x5152, - 0x995B, 0x514C, 0x995C, 0x5154, 0x995D, 0x5162, 0x995E, 0x7AF8, - 0x995F, 0x5169, 0x9960, 0x516A, 0x9961, 0x516E, 0x9962, 0x5180, - 0x9963, 0x5182, 0x9964, 0x56D8, 0x9965, 0x518C, 0x9966, 0x5189, - 0x9967, 0x518F, 0x9968, 0x5191, 0x9969, 0x5193, 0x996A, 0x5195, - 0x996B, 0x5196, 0x996C, 0x51A4, 0x996D, 0x51A6, 0x996E, 0x51A2, - 0x996F, 0x51A9, 0x9970, 0x51AA, 0x9971, 0x51AB, 0x9972, 0x51B3, - 0x9973, 0x51B1, 0x9974, 0x51B2, 0x9975, 0x51B0, 0x9976, 0x51B5, - 0x9977, 0x51BD, 0x9978, 0x51C5, 0x9979, 0x51C9, 0x997A, 0x51DB, - 0x997B, 0x51E0, 0x997C, 0x8655, 0x997D, 0x51E9, 0x997E, 0x51ED, - 0x9980, 0x51F0, 0x9981, 0x51F5, 0x9982, 0x51FE, 0x9983, 0x5204, - 0x9984, 0x520B, 0x9985, 0x5214, 0x9986, 0x520E, 0x9987, 0x5227, - 0x9988, 0x522A, 0x9989, 0x522E, 0x998A, 0x5233, 0x998B, 0x5239, - 0x998C, 0x524F, 0x998D, 0x5244, 0x998E, 0x524B, 0x998F, 0x524C, - 0x9990, 0x525E, 0x9991, 0x5254, 0x9992, 0x526A, 0x9993, 0x5274, - 0x9994, 0x5269, 0x9995, 0x5273, 0x9996, 0x527F, 0x9997, 0x527D, - 0x9998, 0x528D, 0x9999, 0x5294, 0x999A, 0x5292, 0x999B, 0x5271, - 0x999C, 0x5288, 0x999D, 0x5291, 0x999E, 0x8FA8, 0x999F, 0x8FA7, - 0x99A0, 0x52AC, 0x99A1, 0x52AD, 0x99A2, 0x52BC, 0x99A3, 0x52B5, - 0x99A4, 0x52C1, 0x99A5, 0x52CD, 0x99A6, 0x52D7, 0x99A7, 0x52DE, - 0x99A8, 0x52E3, 0x99A9, 0x52E6, 0x99AA, 0x98ED, 0x99AB, 0x52E0, - 0x99AC, 0x52F3, 0x99AD, 0x52F5, 0x99AE, 0x52F8, 0x99AF, 0x52F9, - 0x99B0, 0x5306, 0x99B1, 0x5308, 0x99B2, 0x7538, 0x99B3, 0x530D, - 0x99B4, 0x5310, 0x99B5, 0x530F, 0x99B6, 0x5315, 0x99B7, 0x531A, - 0x99B8, 0x5323, 0x99B9, 0x532F, 0x99BA, 0x5331, 0x99BB, 0x5333, - 0x99BC, 0x5338, 0x99BD, 0x5340, 0x99BE, 0x5346, 0x99BF, 0x5345, - 0x99C0, 0x4E17, 0x99C1, 0x5349, 0x99C2, 0x534D, 0x99C3, 0x51D6, - 0x99C4, 0x535E, 0x99C5, 0x5369, 0x99C6, 0x536E, 0x99C7, 0x5918, - 0x99C8, 0x537B, 0x99C9, 0x5377, 0x99CA, 0x5382, 0x99CB, 0x5396, - 0x99CC, 0x53A0, 0x99CD, 0x53A6, 0x99CE, 0x53A5, 0x99CF, 0x53AE, - 0x99D0, 0x53B0, 0x99D1, 0x53B6, 0x99D2, 0x53C3, 0x99D3, 0x7C12, - 0x99D4, 0x96D9, 0x99D5, 0x53DF, 0x99D6, 0x66FC, 0x99D7, 0x71EE, - 0x99D8, 0x53EE, 0x99D9, 0x53E8, 0x99DA, 0x53ED, 0x99DB, 0x53FA, - 0x99DC, 0x5401, 0x99DD, 0x543D, 0x99DE, 0x5440, 0x99DF, 0x542C, - 0x99E0, 0x542D, 0x99E1, 0x543C, 0x99E2, 0x542E, 0x99E3, 0x5436, - 0x99E4, 0x5429, 0x99E5, 0x541D, 0x99E6, 0x544E, 0x99E7, 0x548F, - 0x99E8, 0x5475, 0x99E9, 0x548E, 0x99EA, 0x545F, 0x99EB, 0x5471, - 0x99EC, 0x5477, 0x99ED, 0x5470, 0x99EE, 0x5492, 0x99EF, 0x547B, - 0x99F0, 0x5480, 0x99F1, 0x5476, 0x99F2, 0x5484, 0x99F3, 0x5490, - 0x99F4, 0x5486, 0x99F5, 0x54C7, 0x99F6, 0x54A2, 0x99F7, 0x54B8, - 0x99F8, 0x54A5, 0x99F9, 0x54AC, 0x99FA, 0x54C4, 0x99FB, 0x54C8, - 0x99FC, 0x54A8, 0x9A40, 0x54AB, 0x9A41, 0x54C2, 0x9A42, 0x54A4, - 0x9A43, 0x54BE, 0x9A44, 0x54BC, 0x9A45, 0x54D8, 0x9A46, 0x54E5, - 0x9A47, 0x54E6, 0x9A48, 0x550F, 0x9A49, 0x5514, 0x9A4A, 0x54FD, - 0x9A4B, 0x54EE, 0x9A4C, 0x54ED, 0x9A4D, 0x54FA, 0x9A4E, 0x54E2, - 0x9A4F, 0x5539, 0x9A50, 0x5540, 0x9A51, 0x5563, 0x9A52, 0x554C, - 0x9A53, 0x552E, 0x9A54, 0x555C, 0x9A55, 0x5545, 0x9A56, 0x5556, - 0x9A57, 0x5557, 0x9A58, 0x5538, 0x9A59, 0x5533, 0x9A5A, 0x555D, - 0x9A5B, 0x5599, 0x9A5C, 0x5580, 0x9A5D, 0x54AF, 0x9A5E, 0x558A, - 0x9A5F, 0x559F, 0x9A60, 0x557B, 0x9A61, 0x557E, 0x9A62, 0x5598, - 0x9A63, 0x559E, 0x9A64, 0x55AE, 0x9A65, 0x557C, 0x9A66, 0x5583, - 0x9A67, 0x55A9, 0x9A68, 0x5587, 0x9A69, 0x55A8, 0x9A6A, 0x55DA, - 0x9A6B, 0x55C5, 0x9A6C, 0x55DF, 0x9A6D, 0x55C4, 0x9A6E, 0x55DC, - 0x9A6F, 0x55E4, 0x9A70, 0x55D4, 0x9A71, 0x5614, 0x9A72, 0x55F7, - 0x9A73, 0x5616, 0x9A74, 0x55FE, 0x9A75, 0x55FD, 0x9A76, 0x561B, - 0x9A77, 0x55F9, 0x9A78, 0x564E, 0x9A79, 0x5650, 0x9A7A, 0x71DF, - 0x9A7B, 0x5634, 0x9A7C, 0x5636, 0x9A7D, 0x5632, 0x9A7E, 0x5638, - 0x9A80, 0x566B, 0x9A81, 0x5664, 0x9A82, 0x562F, 0x9A83, 0x566C, - 0x9A84, 0x566A, 0x9A85, 0x5686, 0x9A86, 0x5680, 0x9A87, 0x568A, - 0x9A88, 0x56A0, 0x9A89, 0x5694, 0x9A8A, 0x568F, 0x9A8B, 0x56A5, - 0x9A8C, 0x56AE, 0x9A8D, 0x56B6, 0x9A8E, 0x56B4, 0x9A8F, 0x56C2, - 0x9A90, 0x56BC, 0x9A91, 0x56C1, 0x9A92, 0x56C3, 0x9A93, 0x56C0, - 0x9A94, 0x56C8, 0x9A95, 0x56CE, 0x9A96, 0x56D1, 0x9A97, 0x56D3, - 0x9A98, 0x56D7, 0x9A99, 0x56EE, 0x9A9A, 0x56F9, 0x9A9B, 0x5700, - 0x9A9C, 0x56FF, 0x9A9D, 0x5704, 0x9A9E, 0x5709, 0x9A9F, 0x5708, - 0x9AA0, 0x570B, 0x9AA1, 0x570D, 0x9AA2, 0x5713, 0x9AA3, 0x5718, - 0x9AA4, 0x5716, 0x9AA5, 0x55C7, 0x9AA6, 0x571C, 0x9AA7, 0x5726, - 0x9AA8, 0x5737, 0x9AA9, 0x5738, 0x9AAA, 0x574E, 0x9AAB, 0x573B, - 0x9AAC, 0x5740, 0x9AAD, 0x574F, 0x9AAE, 0x5769, 0x9AAF, 0x57C0, - 0x9AB0, 0x5788, 0x9AB1, 0x5761, 0x9AB2, 0x577F, 0x9AB3, 0x5789, - 0x9AB4, 0x5793, 0x9AB5, 0x57A0, 0x9AB6, 0x57B3, 0x9AB7, 0x57A4, - 0x9AB8, 0x57AA, 0x9AB9, 0x57B0, 0x9ABA, 0x57C3, 0x9ABB, 0x57C6, - 0x9ABC, 0x57D4, 0x9ABD, 0x57D2, 0x9ABE, 0x57D3, 0x9ABF, 0x580A, - 0x9AC0, 0x57D6, 0x9AC1, 0x57E3, 0x9AC2, 0x580B, 0x9AC3, 0x5819, - 0x9AC4, 0x581D, 0x9AC5, 0x5872, 0x9AC6, 0x5821, 0x9AC7, 0x5862, - 0x9AC8, 0x584B, 0x9AC9, 0x5870, 0x9ACA, 0x6BC0, 0x9ACB, 0x5852, - 0x9ACC, 0x583D, 0x9ACD, 0x5879, 0x9ACE, 0x5885, 0x9ACF, 0x58B9, - 0x9AD0, 0x589F, 0x9AD1, 0x58AB, 0x9AD2, 0x58BA, 0x9AD3, 0x58DE, - 0x9AD4, 0x58BB, 0x9AD5, 0x58B8, 0x9AD6, 0x58AE, 0x9AD7, 0x58C5, - 0x9AD8, 0x58D3, 0x9AD9, 0x58D1, 0x9ADA, 0x58D7, 0x9ADB, 0x58D9, - 0x9ADC, 0x58D8, 0x9ADD, 0x58E5, 0x9ADE, 0x58DC, 0x9ADF, 0x58E4, - 0x9AE0, 0x58DF, 0x9AE1, 0x58EF, 0x9AE2, 0x58FA, 0x9AE3, 0x58F9, - 0x9AE4, 0x58FB, 0x9AE5, 0x58FC, 0x9AE6, 0x58FD, 0x9AE7, 0x5902, - 0x9AE8, 0x590A, 0x9AE9, 0x5910, 0x9AEA, 0x591B, 0x9AEB, 0x68A6, - 0x9AEC, 0x5925, 0x9AED, 0x592C, 0x9AEE, 0x592D, 0x9AEF, 0x5932, - 0x9AF0, 0x5938, 0x9AF1, 0x593E, 0x9AF2, 0x7AD2, 0x9AF3, 0x5955, - 0x9AF4, 0x5950, 0x9AF5, 0x594E, 0x9AF6, 0x595A, 0x9AF7, 0x5958, - 0x9AF8, 0x5962, 0x9AF9, 0x5960, 0x9AFA, 0x5967, 0x9AFB, 0x596C, - 0x9AFC, 0x5969, 0x9B40, 0x5978, 0x9B41, 0x5981, 0x9B42, 0x599D, - 0x9B43, 0x4F5E, 0x9B44, 0x4FAB, 0x9B45, 0x59A3, 0x9B46, 0x59B2, - 0x9B47, 0x59C6, 0x9B48, 0x59E8, 0x9B49, 0x59DC, 0x9B4A, 0x598D, - 0x9B4B, 0x59D9, 0x9B4C, 0x59DA, 0x9B4D, 0x5A25, 0x9B4E, 0x5A1F, - 0x9B4F, 0x5A11, 0x9B50, 0x5A1C, 0x9B51, 0x5A09, 0x9B52, 0x5A1A, - 0x9B53, 0x5A40, 0x9B54, 0x5A6C, 0x9B55, 0x5A49, 0x9B56, 0x5A35, - 0x9B57, 0x5A36, 0x9B58, 0x5A62, 0x9B59, 0x5A6A, 0x9B5A, 0x5A9A, - 0x9B5B, 0x5ABC, 0x9B5C, 0x5ABE, 0x9B5D, 0x5ACB, 0x9B5E, 0x5AC2, - 0x9B5F, 0x5ABD, 0x9B60, 0x5AE3, 0x9B61, 0x5AD7, 0x9B62, 0x5AE6, - 0x9B63, 0x5AE9, 0x9B64, 0x5AD6, 0x9B65, 0x5AFA, 0x9B66, 0x5AFB, - 0x9B67, 0x5B0C, 0x9B68, 0x5B0B, 0x9B69, 0x5B16, 0x9B6A, 0x5B32, - 0x9B6B, 0x5AD0, 0x9B6C, 0x5B2A, 0x9B6D, 0x5B36, 0x9B6E, 0x5B3E, - 0x9B6F, 0x5B43, 0x9B70, 0x5B45, 0x9B71, 0x5B40, 0x9B72, 0x5B51, - 0x9B73, 0x5B55, 0x9B74, 0x5B5A, 0x9B75, 0x5B5B, 0x9B76, 0x5B65, - 0x9B77, 0x5B69, 0x9B78, 0x5B70, 0x9B79, 0x5B73, 0x9B7A, 0x5B75, - 0x9B7B, 0x5B78, 0x9B7C, 0x6588, 0x9B7D, 0x5B7A, 0x9B7E, 0x5B80, - 0x9B80, 0x5B83, 0x9B81, 0x5BA6, 0x9B82, 0x5BB8, 0x9B83, 0x5BC3, - 0x9B84, 0x5BC7, 0x9B85, 0x5BC9, 0x9B86, 0x5BD4, 0x9B87, 0x5BD0, - 0x9B88, 0x5BE4, 0x9B89, 0x5BE6, 0x9B8A, 0x5BE2, 0x9B8B, 0x5BDE, - 0x9B8C, 0x5BE5, 0x9B8D, 0x5BEB, 0x9B8E, 0x5BF0, 0x9B8F, 0x5BF6, - 0x9B90, 0x5BF3, 0x9B91, 0x5C05, 0x9B92, 0x5C07, 0x9B93, 0x5C08, - 0x9B94, 0x5C0D, 0x9B95, 0x5C13, 0x9B96, 0x5C20, 0x9B97, 0x5C22, - 0x9B98, 0x5C28, 0x9B99, 0x5C38, 0x9B9A, 0x5C39, 0x9B9B, 0x5C41, - 0x9B9C, 0x5C46, 0x9B9D, 0x5C4E, 0x9B9E, 0x5C53, 0x9B9F, 0x5C50, - 0x9BA0, 0x5C4F, 0x9BA1, 0x5B71, 0x9BA2, 0x5C6C, 0x9BA3, 0x5C6E, - 0x9BA4, 0x4E62, 0x9BA5, 0x5C76, 0x9BA6, 0x5C79, 0x9BA7, 0x5C8C, - 0x9BA8, 0x5C91, 0x9BA9, 0x5C94, 0x9BAA, 0x599B, 0x9BAB, 0x5CAB, - 0x9BAC, 0x5CBB, 0x9BAD, 0x5CB6, 0x9BAE, 0x5CBC, 0x9BAF, 0x5CB7, - 0x9BB0, 0x5CC5, 0x9BB1, 0x5CBE, 0x9BB2, 0x5CC7, 0x9BB3, 0x5CD9, - 0x9BB4, 0x5CE9, 0x9BB5, 0x5CFD, 0x9BB6, 0x5CFA, 0x9BB7, 0x5CED, - 0x9BB8, 0x5D8C, 0x9BB9, 0x5CEA, 0x9BBA, 0x5D0B, 0x9BBB, 0x5D15, - 0x9BBC, 0x5D17, 0x9BBD, 0x5D5C, 0x9BBE, 0x5D1F, 0x9BBF, 0x5D1B, - 0x9BC0, 0x5D11, 0x9BC1, 0x5D14, 0x9BC2, 0x5D22, 0x9BC3, 0x5D1A, - 0x9BC4, 0x5D19, 0x9BC5, 0x5D18, 0x9BC6, 0x5D4C, 0x9BC7, 0x5D52, - 0x9BC8, 0x5D4E, 0x9BC9, 0x5D4B, 0x9BCA, 0x5D6C, 0x9BCB, 0x5D73, - 0x9BCC, 0x5D76, 0x9BCD, 0x5D87, 0x9BCE, 0x5D84, 0x9BCF, 0x5D82, - 0x9BD0, 0x5DA2, 0x9BD1, 0x5D9D, 0x9BD2, 0x5DAC, 0x9BD3, 0x5DAE, - 0x9BD4, 0x5DBD, 0x9BD5, 0x5D90, 0x9BD6, 0x5DB7, 0x9BD7, 0x5DBC, - 0x9BD8, 0x5DC9, 0x9BD9, 0x5DCD, 0x9BDA, 0x5DD3, 0x9BDB, 0x5DD2, - 0x9BDC, 0x5DD6, 0x9BDD, 0x5DDB, 0x9BDE, 0x5DEB, 0x9BDF, 0x5DF2, - 0x9BE0, 0x5DF5, 0x9BE1, 0x5E0B, 0x9BE2, 0x5E1A, 0x9BE3, 0x5E19, - 0x9BE4, 0x5E11, 0x9BE5, 0x5E1B, 0x9BE6, 0x5E36, 0x9BE7, 0x5E37, - 0x9BE8, 0x5E44, 0x9BE9, 0x5E43, 0x9BEA, 0x5E40, 0x9BEB, 0x5E4E, - 0x9BEC, 0x5E57, 0x9BED, 0x5E54, 0x9BEE, 0x5E5F, 0x9BEF, 0x5E62, - 0x9BF0, 0x5E64, 0x9BF1, 0x5E47, 0x9BF2, 0x5E75, 0x9BF3, 0x5E76, - 0x9BF4, 0x5E7A, 0x9BF5, 0x9EBC, 0x9BF6, 0x5E7F, 0x9BF7, 0x5EA0, - 0x9BF8, 0x5EC1, 0x9BF9, 0x5EC2, 0x9BFA, 0x5EC8, 0x9BFB, 0x5ED0, - 0x9BFC, 0x5ECF, 0x9C40, 0x5ED6, 0x9C41, 0x5EE3, 0x9C42, 0x5EDD, - 0x9C43, 0x5EDA, 0x9C44, 0x5EDB, 0x9C45, 0x5EE2, 0x9C46, 0x5EE1, - 0x9C47, 0x5EE8, 0x9C48, 0x5EE9, 0x9C49, 0x5EEC, 0x9C4A, 0x5EF1, - 0x9C4B, 0x5EF3, 0x9C4C, 0x5EF0, 0x9C4D, 0x5EF4, 0x9C4E, 0x5EF8, - 0x9C4F, 0x5EFE, 0x9C50, 0x5F03, 0x9C51, 0x5F09, 0x9C52, 0x5F5D, - 0x9C53, 0x5F5C, 0x9C54, 0x5F0B, 0x9C55, 0x5F11, 0x9C56, 0x5F16, - 0x9C57, 0x5F29, 0x9C58, 0x5F2D, 0x9C59, 0x5F38, 0x9C5A, 0x5F41, - 0x9C5B, 0x5F48, 0x9C5C, 0x5F4C, 0x9C5D, 0x5F4E, 0x9C5E, 0x5F2F, - 0x9C5F, 0x5F51, 0x9C60, 0x5F56, 0x9C61, 0x5F57, 0x9C62, 0x5F59, - 0x9C63, 0x5F61, 0x9C64, 0x5F6D, 0x9C65, 0x5F73, 0x9C66, 0x5F77, - 0x9C67, 0x5F83, 0x9C68, 0x5F82, 0x9C69, 0x5F7F, 0x9C6A, 0x5F8A, - 0x9C6B, 0x5F88, 0x9C6C, 0x5F91, 0x9C6D, 0x5F87, 0x9C6E, 0x5F9E, - 0x9C6F, 0x5F99, 0x9C70, 0x5F98, 0x9C71, 0x5FA0, 0x9C72, 0x5FA8, - 0x9C73, 0x5FAD, 0x9C74, 0x5FBC, 0x9C75, 0x5FD6, 0x9C76, 0x5FFB, - 0x9C77, 0x5FE4, 0x9C78, 0x5FF8, 0x9C79, 0x5FF1, 0x9C7A, 0x5FDD, - 0x9C7B, 0x60B3, 0x9C7C, 0x5FFF, 0x9C7D, 0x6021, 0x9C7E, 0x6060, - 0x9C80, 0x6019, 0x9C81, 0x6010, 0x9C82, 0x6029, 0x9C83, 0x600E, - 0x9C84, 0x6031, 0x9C85, 0x601B, 0x9C86, 0x6015, 0x9C87, 0x602B, - 0x9C88, 0x6026, 0x9C89, 0x600F, 0x9C8A, 0x603A, 0x9C8B, 0x605A, - 0x9C8C, 0x6041, 0x9C8D, 0x606A, 0x9C8E, 0x6077, 0x9C8F, 0x605F, - 0x9C90, 0x604A, 0x9C91, 0x6046, 0x9C92, 0x604D, 0x9C93, 0x6063, - 0x9C94, 0x6043, 0x9C95, 0x6064, 0x9C96, 0x6042, 0x9C97, 0x606C, - 0x9C98, 0x606B, 0x9C99, 0x6059, 0x9C9A, 0x6081, 0x9C9B, 0x608D, - 0x9C9C, 0x60E7, 0x9C9D, 0x6083, 0x9C9E, 0x609A, 0x9C9F, 0x6084, - 0x9CA0, 0x609B, 0x9CA1, 0x6096, 0x9CA2, 0x6097, 0x9CA3, 0x6092, - 0x9CA4, 0x60A7, 0x9CA5, 0x608B, 0x9CA6, 0x60E1, 0x9CA7, 0x60B8, - 0x9CA8, 0x60E0, 0x9CA9, 0x60D3, 0x9CAA, 0x60B4, 0x9CAB, 0x5FF0, - 0x9CAC, 0x60BD, 0x9CAD, 0x60C6, 0x9CAE, 0x60B5, 0x9CAF, 0x60D8, - 0x9CB0, 0x614D, 0x9CB1, 0x6115, 0x9CB2, 0x6106, 0x9CB3, 0x60F6, - 0x9CB4, 0x60F7, 0x9CB5, 0x6100, 0x9CB6, 0x60F4, 0x9CB7, 0x60FA, - 0x9CB8, 0x6103, 0x9CB9, 0x6121, 0x9CBA, 0x60FB, 0x9CBB, 0x60F1, - 0x9CBC, 0x610D, 0x9CBD, 0x610E, 0x9CBE, 0x6147, 0x9CBF, 0x613E, - 0x9CC0, 0x6128, 0x9CC1, 0x6127, 0x9CC2, 0x614A, 0x9CC3, 0x613F, - 0x9CC4, 0x613C, 0x9CC5, 0x612C, 0x9CC6, 0x6134, 0x9CC7, 0x613D, - 0x9CC8, 0x6142, 0x9CC9, 0x6144, 0x9CCA, 0x6173, 0x9CCB, 0x6177, - 0x9CCC, 0x6158, 0x9CCD, 0x6159, 0x9CCE, 0x615A, 0x9CCF, 0x616B, - 0x9CD0, 0x6174, 0x9CD1, 0x616F, 0x9CD2, 0x6165, 0x9CD3, 0x6171, - 0x9CD4, 0x615F, 0x9CD5, 0x615D, 0x9CD6, 0x6153, 0x9CD7, 0x6175, - 0x9CD8, 0x6199, 0x9CD9, 0x6196, 0x9CDA, 0x6187, 0x9CDB, 0x61AC, - 0x9CDC, 0x6194, 0x9CDD, 0x619A, 0x9CDE, 0x618A, 0x9CDF, 0x6191, - 0x9CE0, 0x61AB, 0x9CE1, 0x61AE, 0x9CE2, 0x61CC, 0x9CE3, 0x61CA, - 0x9CE4, 0x61C9, 0x9CE5, 0x61F7, 0x9CE6, 0x61C8, 0x9CE7, 0x61C3, - 0x9CE8, 0x61C6, 0x9CE9, 0x61BA, 0x9CEA, 0x61CB, 0x9CEB, 0x7F79, - 0x9CEC, 0x61CD, 0x9CED, 0x61E6, 0x9CEE, 0x61E3, 0x9CEF, 0x61F6, - 0x9CF0, 0x61FA, 0x9CF1, 0x61F4, 0x9CF2, 0x61FF, 0x9CF3, 0x61FD, - 0x9CF4, 0x61FC, 0x9CF5, 0x61FE, 0x9CF6, 0x6200, 0x9CF7, 0x6208, - 0x9CF8, 0x6209, 0x9CF9, 0x620D, 0x9CFA, 0x620C, 0x9CFB, 0x6214, - 0x9CFC, 0x621B, 0x9D40, 0x621E, 0x9D41, 0x6221, 0x9D42, 0x622A, - 0x9D43, 0x622E, 0x9D44, 0x6230, 0x9D45, 0x6232, 0x9D46, 0x6233, - 0x9D47, 0x6241, 0x9D48, 0x624E, 0x9D49, 0x625E, 0x9D4A, 0x6263, - 0x9D4B, 0x625B, 0x9D4C, 0x6260, 0x9D4D, 0x6268, 0x9D4E, 0x627C, - 0x9D4F, 0x6282, 0x9D50, 0x6289, 0x9D51, 0x627E, 0x9D52, 0x6292, - 0x9D53, 0x6293, 0x9D54, 0x6296, 0x9D55, 0x62D4, 0x9D56, 0x6283, - 0x9D57, 0x6294, 0x9D58, 0x62D7, 0x9D59, 0x62D1, 0x9D5A, 0x62BB, - 0x9D5B, 0x62CF, 0x9D5C, 0x62FF, 0x9D5D, 0x62C6, 0x9D5E, 0x64D4, - 0x9D5F, 0x62C8, 0x9D60, 0x62DC, 0x9D61, 0x62CC, 0x9D62, 0x62CA, - 0x9D63, 0x62C2, 0x9D64, 0x62C7, 0x9D65, 0x629B, 0x9D66, 0x62C9, - 0x9D67, 0x630C, 0x9D68, 0x62EE, 0x9D69, 0x62F1, 0x9D6A, 0x6327, - 0x9D6B, 0x6302, 0x9D6C, 0x6308, 0x9D6D, 0x62EF, 0x9D6E, 0x62F5, - 0x9D6F, 0x6350, 0x9D70, 0x633E, 0x9D71, 0x634D, 0x9D72, 0x641C, - 0x9D73, 0x634F, 0x9D74, 0x6396, 0x9D75, 0x638E, 0x9D76, 0x6380, - 0x9D77, 0x63AB, 0x9D78, 0x6376, 0x9D79, 0x63A3, 0x9D7A, 0x638F, - 0x9D7B, 0x6389, 0x9D7C, 0x639F, 0x9D7D, 0x63B5, 0x9D7E, 0x636B, - 0x9D80, 0x6369, 0x9D81, 0x63BE, 0x9D82, 0x63E9, 0x9D83, 0x63C0, - 0x9D84, 0x63C6, 0x9D85, 0x63E3, 0x9D86, 0x63C9, 0x9D87, 0x63D2, - 0x9D88, 0x63F6, 0x9D89, 0x63C4, 0x9D8A, 0x6416, 0x9D8B, 0x6434, - 0x9D8C, 0x6406, 0x9D8D, 0x6413, 0x9D8E, 0x6426, 0x9D8F, 0x6436, - 0x9D90, 0x651D, 0x9D91, 0x6417, 0x9D92, 0x6428, 0x9D93, 0x640F, - 0x9D94, 0x6467, 0x9D95, 0x646F, 0x9D96, 0x6476, 0x9D97, 0x644E, - 0x9D98, 0x652A, 0x9D99, 0x6495, 0x9D9A, 0x6493, 0x9D9B, 0x64A5, - 0x9D9C, 0x64A9, 0x9D9D, 0x6488, 0x9D9E, 0x64BC, 0x9D9F, 0x64DA, - 0x9DA0, 0x64D2, 0x9DA1, 0x64C5, 0x9DA2, 0x64C7, 0x9DA3, 0x64BB, - 0x9DA4, 0x64D8, 0x9DA5, 0x64C2, 0x9DA6, 0x64F1, 0x9DA7, 0x64E7, - 0x9DA8, 0x8209, 0x9DA9, 0x64E0, 0x9DAA, 0x64E1, 0x9DAB, 0x62AC, - 0x9DAC, 0x64E3, 0x9DAD, 0x64EF, 0x9DAE, 0x652C, 0x9DAF, 0x64F6, - 0x9DB0, 0x64F4, 0x9DB1, 0x64F2, 0x9DB2, 0x64FA, 0x9DB3, 0x6500, - 0x9DB4, 0x64FD, 0x9DB5, 0x6518, 0x9DB6, 0x651C, 0x9DB7, 0x6505, - 0x9DB8, 0x6524, 0x9DB9, 0x6523, 0x9DBA, 0x652B, 0x9DBB, 0x6534, - 0x9DBC, 0x6535, 0x9DBD, 0x6537, 0x9DBE, 0x6536, 0x9DBF, 0x6538, - 0x9DC0, 0x754B, 0x9DC1, 0x6548, 0x9DC2, 0x6556, 0x9DC3, 0x6555, - 0x9DC4, 0x654D, 0x9DC5, 0x6558, 0x9DC6, 0x655E, 0x9DC7, 0x655D, - 0x9DC8, 0x6572, 0x9DC9, 0x6578, 0x9DCA, 0x6582, 0x9DCB, 0x6583, - 0x9DCC, 0x8B8A, 0x9DCD, 0x659B, 0x9DCE, 0x659F, 0x9DCF, 0x65AB, - 0x9DD0, 0x65B7, 0x9DD1, 0x65C3, 0x9DD2, 0x65C6, 0x9DD3, 0x65C1, - 0x9DD4, 0x65C4, 0x9DD5, 0x65CC, 0x9DD6, 0x65D2, 0x9DD7, 0x65DB, - 0x9DD8, 0x65D9, 0x9DD9, 0x65E0, 0x9DDA, 0x65E1, 0x9DDB, 0x65F1, - 0x9DDC, 0x6772, 0x9DDD, 0x660A, 0x9DDE, 0x6603, 0x9DDF, 0x65FB, - 0x9DE0, 0x6773, 0x9DE1, 0x6635, 0x9DE2, 0x6636, 0x9DE3, 0x6634, - 0x9DE4, 0x661C, 0x9DE5, 0x664F, 0x9DE6, 0x6644, 0x9DE7, 0x6649, - 0x9DE8, 0x6641, 0x9DE9, 0x665E, 0x9DEA, 0x665D, 0x9DEB, 0x6664, - 0x9DEC, 0x6667, 0x9DED, 0x6668, 0x9DEE, 0x665F, 0x9DEF, 0x6662, - 0x9DF0, 0x6670, 0x9DF1, 0x6683, 0x9DF2, 0x6688, 0x9DF3, 0x668E, - 0x9DF4, 0x6689, 0x9DF5, 0x6684, 0x9DF6, 0x6698, 0x9DF7, 0x669D, - 0x9DF8, 0x66C1, 0x9DF9, 0x66B9, 0x9DFA, 0x66C9, 0x9DFB, 0x66BE, - 0x9DFC, 0x66BC, 0x9E40, 0x66C4, 0x9E41, 0x66B8, 0x9E42, 0x66D6, - 0x9E43, 0x66DA, 0x9E44, 0x66E0, 0x9E45, 0x663F, 0x9E46, 0x66E6, - 0x9E47, 0x66E9, 0x9E48, 0x66F0, 0x9E49, 0x66F5, 0x9E4A, 0x66F7, - 0x9E4B, 0x670F, 0x9E4C, 0x6716, 0x9E4D, 0x671E, 0x9E4E, 0x6726, - 0x9E4F, 0x6727, 0x9E50, 0x9738, 0x9E51, 0x672E, 0x9E52, 0x673F, - 0x9E53, 0x6736, 0x9E54, 0x6741, 0x9E55, 0x6738, 0x9E56, 0x6737, - 0x9E57, 0x6746, 0x9E58, 0x675E, 0x9E59, 0x6760, 0x9E5A, 0x6759, - 0x9E5B, 0x6763, 0x9E5C, 0x6764, 0x9E5D, 0x6789, 0x9E5E, 0x6770, - 0x9E5F, 0x67A9, 0x9E60, 0x677C, 0x9E61, 0x676A, 0x9E62, 0x678C, - 0x9E63, 0x678B, 0x9E64, 0x67A6, 0x9E65, 0x67A1, 0x9E66, 0x6785, - 0x9E67, 0x67B7, 0x9E68, 0x67EF, 0x9E69, 0x67B4, 0x9E6A, 0x67EC, - 0x9E6B, 0x67B3, 0x9E6C, 0x67E9, 0x9E6D, 0x67B8, 0x9E6E, 0x67E4, - 0x9E6F, 0x67DE, 0x9E70, 0x67DD, 0x9E71, 0x67E2, 0x9E72, 0x67EE, - 0x9E73, 0x67B9, 0x9E74, 0x67CE, 0x9E75, 0x67C6, 0x9E76, 0x67E7, - 0x9E77, 0x6A9C, 0x9E78, 0x681E, 0x9E79, 0x6846, 0x9E7A, 0x6829, - 0x9E7B, 0x6840, 0x9E7C, 0x684D, 0x9E7D, 0x6832, 0x9E7E, 0x684E, - 0x9E80, 0x68B3, 0x9E81, 0x682B, 0x9E82, 0x6859, 0x9E83, 0x6863, - 0x9E84, 0x6877, 0x9E85, 0x687F, 0x9E86, 0x689F, 0x9E87, 0x688F, - 0x9E88, 0x68AD, 0x9E89, 0x6894, 0x9E8A, 0x689D, 0x9E8B, 0x689B, - 0x9E8C, 0x6883, 0x9E8D, 0x6AAE, 0x9E8E, 0x68B9, 0x9E8F, 0x6874, - 0x9E90, 0x68B5, 0x9E91, 0x68A0, 0x9E92, 0x68BA, 0x9E93, 0x690F, - 0x9E94, 0x688D, 0x9E95, 0x687E, 0x9E96, 0x6901, 0x9E97, 0x68CA, - 0x9E98, 0x6908, 0x9E99, 0x68D8, 0x9E9A, 0x6922, 0x9E9B, 0x6926, - 0x9E9C, 0x68E1, 0x9E9D, 0x690C, 0x9E9E, 0x68CD, 0x9E9F, 0x68D4, - 0x9EA0, 0x68E7, 0x9EA1, 0x68D5, 0x9EA2, 0x6936, 0x9EA3, 0x6912, - 0x9EA4, 0x6904, 0x9EA5, 0x68D7, 0x9EA6, 0x68E3, 0x9EA7, 0x6925, - 0x9EA8, 0x68F9, 0x9EA9, 0x68E0, 0x9EAA, 0x68EF, 0x9EAB, 0x6928, - 0x9EAC, 0x692A, 0x9EAD, 0x691A, 0x9EAE, 0x6923, 0x9EAF, 0x6921, - 0x9EB0, 0x68C6, 0x9EB1, 0x6979, 0x9EB2, 0x6977, 0x9EB3, 0x695C, - 0x9EB4, 0x6978, 0x9EB5, 0x696B, 0x9EB6, 0x6954, 0x9EB7, 0x697E, - 0x9EB8, 0x696E, 0x9EB9, 0x6939, 0x9EBA, 0x6974, 0x9EBB, 0x693D, - 0x9EBC, 0x6959, 0x9EBD, 0x6930, 0x9EBE, 0x6961, 0x9EBF, 0x695E, - 0x9EC0, 0x695D, 0x9EC1, 0x6981, 0x9EC2, 0x696A, 0x9EC3, 0x69B2, - 0x9EC4, 0x69AE, 0x9EC5, 0x69D0, 0x9EC6, 0x69BF, 0x9EC7, 0x69C1, - 0x9EC8, 0x69D3, 0x9EC9, 0x69BE, 0x9ECA, 0x69CE, 0x9ECB, 0x5BE8, - 0x9ECC, 0x69CA, 0x9ECD, 0x69DD, 0x9ECE, 0x69BB, 0x9ECF, 0x69C3, - 0x9ED0, 0x69A7, 0x9ED1, 0x6A2E, 0x9ED2, 0x6991, 0x9ED3, 0x69A0, - 0x9ED4, 0x699C, 0x9ED5, 0x6995, 0x9ED6, 0x69B4, 0x9ED7, 0x69DE, - 0x9ED8, 0x69E8, 0x9ED9, 0x6A02, 0x9EDA, 0x6A1B, 0x9EDB, 0x69FF, - 0x9EDC, 0x6B0A, 0x9EDD, 0x69F9, 0x9EDE, 0x69F2, 0x9EDF, 0x69E7, - 0x9EE0, 0x6A05, 0x9EE1, 0x69B1, 0x9EE2, 0x6A1E, 0x9EE3, 0x69ED, - 0x9EE4, 0x6A14, 0x9EE5, 0x69EB, 0x9EE6, 0x6A0A, 0x9EE7, 0x6A12, - 0x9EE8, 0x6AC1, 0x9EE9, 0x6A23, 0x9EEA, 0x6A13, 0x9EEB, 0x6A44, - 0x9EEC, 0x6A0C, 0x9EED, 0x6A72, 0x9EEE, 0x6A36, 0x9EEF, 0x6A78, - 0x9EF0, 0x6A47, 0x9EF1, 0x6A62, 0x9EF2, 0x6A59, 0x9EF3, 0x6A66, - 0x9EF4, 0x6A48, 0x9EF5, 0x6A38, 0x9EF6, 0x6A22, 0x9EF7, 0x6A90, - 0x9EF8, 0x6A8D, 0x9EF9, 0x6AA0, 0x9EFA, 0x6A84, 0x9EFB, 0x6AA2, - 0x9EFC, 0x6AA3, 0x9F40, 0x6A97, 0x9F41, 0x8617, 0x9F42, 0x6ABB, - 0x9F43, 0x6AC3, 0x9F44, 0x6AC2, 0x9F45, 0x6AB8, 0x9F46, 0x6AB3, - 0x9F47, 0x6AAC, 0x9F48, 0x6ADE, 0x9F49, 0x6AD1, 0x9F4A, 0x6ADF, - 0x9F4B, 0x6AAA, 0x9F4C, 0x6ADA, 0x9F4D, 0x6AEA, 0x9F4E, 0x6AFB, - 0x9F4F, 0x6B05, 0x9F50, 0x8616, 0x9F51, 0x6AFA, 0x9F52, 0x6B12, - 0x9F53, 0x6B16, 0x9F54, 0x9B31, 0x9F55, 0x6B1F, 0x9F56, 0x6B38, - 0x9F57, 0x6B37, 0x9F58, 0x76DC, 0x9F59, 0x6B39, 0x9F5A, 0x98EE, - 0x9F5B, 0x6B47, 0x9F5C, 0x6B43, 0x9F5D, 0x6B49, 0x9F5E, 0x6B50, - 0x9F5F, 0x6B59, 0x9F60, 0x6B54, 0x9F61, 0x6B5B, 0x9F62, 0x6B5F, - 0x9F63, 0x6B61, 0x9F64, 0x6B78, 0x9F65, 0x6B79, 0x9F66, 0x6B7F, - 0x9F67, 0x6B80, 0x9F68, 0x6B84, 0x9F69, 0x6B83, 0x9F6A, 0x6B8D, - 0x9F6B, 0x6B98, 0x9F6C, 0x6B95, 0x9F6D, 0x6B9E, 0x9F6E, 0x6BA4, - 0x9F6F, 0x6BAA, 0x9F70, 0x6BAB, 0x9F71, 0x6BAF, 0x9F72, 0x6BB2, - 0x9F73, 0x6BB1, 0x9F74, 0x6BB3, 0x9F75, 0x6BB7, 0x9F76, 0x6BBC, - 0x9F77, 0x6BC6, 0x9F78, 0x6BCB, 0x9F79, 0x6BD3, 0x9F7A, 0x6BDF, - 0x9F7B, 0x6BEC, 0x9F7C, 0x6BEB, 0x9F7D, 0x6BF3, 0x9F7E, 0x6BEF, - 0x9F80, 0x9EBE, 0x9F81, 0x6C08, 0x9F82, 0x6C13, 0x9F83, 0x6C14, - 0x9F84, 0x6C1B, 0x9F85, 0x6C24, 0x9F86, 0x6C23, 0x9F87, 0x6C5E, - 0x9F88, 0x6C55, 0x9F89, 0x6C62, 0x9F8A, 0x6C6A, 0x9F8B, 0x6C82, - 0x9F8C, 0x6C8D, 0x9F8D, 0x6C9A, 0x9F8E, 0x6C81, 0x9F8F, 0x6C9B, - 0x9F90, 0x6C7E, 0x9F91, 0x6C68, 0x9F92, 0x6C73, 0x9F93, 0x6C92, - 0x9F94, 0x6C90, 0x9F95, 0x6CC4, 0x9F96, 0x6CF1, 0x9F97, 0x6CD3, - 0x9F98, 0x6CBD, 0x9F99, 0x6CD7, 0x9F9A, 0x6CC5, 0x9F9B, 0x6CDD, - 0x9F9C, 0x6CAE, 0x9F9D, 0x6CB1, 0x9F9E, 0x6CBE, 0x9F9F, 0x6CBA, - 0x9FA0, 0x6CDB, 0x9FA1, 0x6CEF, 0x9FA2, 0x6CD9, 0x9FA3, 0x6CEA, - 0x9FA4, 0x6D1F, 0x9FA5, 0x884D, 0x9FA6, 0x6D36, 0x9FA7, 0x6D2B, - 0x9FA8, 0x6D3D, 0x9FA9, 0x6D38, 0x9FAA, 0x6D19, 0x9FAB, 0x6D35, - 0x9FAC, 0x6D33, 0x9FAD, 0x6D12, 0x9FAE, 0x6D0C, 0x9FAF, 0x6D63, - 0x9FB0, 0x6D93, 0x9FB1, 0x6D64, 0x9FB2, 0x6D5A, 0x9FB3, 0x6D79, - 0x9FB4, 0x6D59, 0x9FB5, 0x6D8E, 0x9FB6, 0x6D95, 0x9FB7, 0x6FE4, - 0x9FB8, 0x6D85, 0x9FB9, 0x6DF9, 0x9FBA, 0x6E15, 0x9FBB, 0x6E0A, - 0x9FBC, 0x6DB5, 0x9FBD, 0x6DC7, 0x9FBE, 0x6DE6, 0x9FBF, 0x6DB8, - 0x9FC0, 0x6DC6, 0x9FC1, 0x6DEC, 0x9FC2, 0x6DDE, 0x9FC3, 0x6DCC, - 0x9FC4, 0x6DE8, 0x9FC5, 0x6DD2, 0x9FC6, 0x6DC5, 0x9FC7, 0x6DFA, - 0x9FC8, 0x6DD9, 0x9FC9, 0x6DE4, 0x9FCA, 0x6DD5, 0x9FCB, 0x6DEA, - 0x9FCC, 0x6DEE, 0x9FCD, 0x6E2D, 0x9FCE, 0x6E6E, 0x9FCF, 0x6E2E, - 0x9FD0, 0x6E19, 0x9FD1, 0x6E72, 0x9FD2, 0x6E5F, 0x9FD3, 0x6E3E, - 0x9FD4, 0x6E23, 0x9FD5, 0x6E6B, 0x9FD6, 0x6E2B, 0x9FD7, 0x6E76, - 0x9FD8, 0x6E4D, 0x9FD9, 0x6E1F, 0x9FDA, 0x6E43, 0x9FDB, 0x6E3A, - 0x9FDC, 0x6E4E, 0x9FDD, 0x6E24, 0x9FDE, 0x6EFF, 0x9FDF, 0x6E1D, - 0x9FE0, 0x6E38, 0x9FE1, 0x6E82, 0x9FE2, 0x6EAA, 0x9FE3, 0x6E98, - 0x9FE4, 0x6EC9, 0x9FE5, 0x6EB7, 0x9FE6, 0x6ED3, 0x9FE7, 0x6EBD, - 0x9FE8, 0x6EAF, 0x9FE9, 0x6EC4, 0x9FEA, 0x6EB2, 0x9FEB, 0x6ED4, - 0x9FEC, 0x6ED5, 0x9FED, 0x6E8F, 0x9FEE, 0x6EA5, 0x9FEF, 0x6EC2, - 0x9FF0, 0x6E9F, 0x9FF1, 0x6F41, 0x9FF2, 0x6F11, 0x9FF3, 0x704C, - 0x9FF4, 0x6EEC, 0x9FF5, 0x6EF8, 0x9FF6, 0x6EFE, 0x9FF7, 0x6F3F, - 0x9FF8, 0x6EF2, 0x9FF9, 0x6F31, 0x9FFA, 0x6EEF, 0x9FFB, 0x6F32, - 0x9FFC, 0x6ECC, 0xE040, 0x6F3E, 0xE041, 0x6F13, 0xE042, 0x6EF7, - 0xE043, 0x6F86, 0xE044, 0x6F7A, 0xE045, 0x6F78, 0xE046, 0x6F81, - 0xE047, 0x6F80, 0xE048, 0x6F6F, 0xE049, 0x6F5B, 0xE04A, 0x6FF3, - 0xE04B, 0x6F6D, 0xE04C, 0x6F82, 0xE04D, 0x6F7C, 0xE04E, 0x6F58, - 0xE04F, 0x6F8E, 0xE050, 0x6F91, 0xE051, 0x6FC2, 0xE052, 0x6F66, - 0xE053, 0x6FB3, 0xE054, 0x6FA3, 0xE055, 0x6FA1, 0xE056, 0x6FA4, - 0xE057, 0x6FB9, 0xE058, 0x6FC6, 0xE059, 0x6FAA, 0xE05A, 0x6FDF, - 0xE05B, 0x6FD5, 0xE05C, 0x6FEC, 0xE05D, 0x6FD4, 0xE05E, 0x6FD8, - 0xE05F, 0x6FF1, 0xE060, 0x6FEE, 0xE061, 0x6FDB, 0xE062, 0x7009, - 0xE063, 0x700B, 0xE064, 0x6FFA, 0xE065, 0x7011, 0xE066, 0x7001, - 0xE067, 0x700F, 0xE068, 0x6FFE, 0xE069, 0x701B, 0xE06A, 0x701A, - 0xE06B, 0x6F74, 0xE06C, 0x701D, 0xE06D, 0x7018, 0xE06E, 0x701F, - 0xE06F, 0x7030, 0xE070, 0x703E, 0xE071, 0x7032, 0xE072, 0x7051, - 0xE073, 0x7063, 0xE074, 0x7099, 0xE075, 0x7092, 0xE076, 0x70AF, - 0xE077, 0x70F1, 0xE078, 0x70AC, 0xE079, 0x70B8, 0xE07A, 0x70B3, - 0xE07B, 0x70AE, 0xE07C, 0x70DF, 0xE07D, 0x70CB, 0xE07E, 0x70DD, - 0xE080, 0x70D9, 0xE081, 0x7109, 0xE082, 0x70FD, 0xE083, 0x711C, - 0xE084, 0x7119, 0xE085, 0x7165, 0xE086, 0x7155, 0xE087, 0x7188, - 0xE088, 0x7166, 0xE089, 0x7162, 0xE08A, 0x714C, 0xE08B, 0x7156, - 0xE08C, 0x716C, 0xE08D, 0x718F, 0xE08E, 0x71FB, 0xE08F, 0x7184, - 0xE090, 0x7195, 0xE091, 0x71A8, 0xE092, 0x71AC, 0xE093, 0x71D7, - 0xE094, 0x71B9, 0xE095, 0x71BE, 0xE096, 0x71D2, 0xE097, 0x71C9, - 0xE098, 0x71D4, 0xE099, 0x71CE, 0xE09A, 0x71E0, 0xE09B, 0x71EC, - 0xE09C, 0x71E7, 0xE09D, 0x71F5, 0xE09E, 0x71FC, 0xE09F, 0x71F9, - 0xE0A0, 0x71FF, 0xE0A1, 0x720D, 0xE0A2, 0x7210, 0xE0A3, 0x721B, - 0xE0A4, 0x7228, 0xE0A5, 0x722D, 0xE0A6, 0x722C, 0xE0A7, 0x7230, - 0xE0A8, 0x7232, 0xE0A9, 0x723B, 0xE0AA, 0x723C, 0xE0AB, 0x723F, - 0xE0AC, 0x7240, 0xE0AD, 0x7246, 0xE0AE, 0x724B, 0xE0AF, 0x7258, - 0xE0B0, 0x7274, 0xE0B1, 0x727E, 0xE0B2, 0x7282, 0xE0B3, 0x7281, - 0xE0B4, 0x7287, 0xE0B5, 0x7292, 0xE0B6, 0x7296, 0xE0B7, 0x72A2, - 0xE0B8, 0x72A7, 0xE0B9, 0x72B9, 0xE0BA, 0x72B2, 0xE0BB, 0x72C3, - 0xE0BC, 0x72C6, 0xE0BD, 0x72C4, 0xE0BE, 0x72CE, 0xE0BF, 0x72D2, - 0xE0C0, 0x72E2, 0xE0C1, 0x72E0, 0xE0C2, 0x72E1, 0xE0C3, 0x72F9, - 0xE0C4, 0x72F7, 0xE0C5, 0x500F, 0xE0C6, 0x7317, 0xE0C7, 0x730A, - 0xE0C8, 0x731C, 0xE0C9, 0x7316, 0xE0CA, 0x731D, 0xE0CB, 0x7334, - 0xE0CC, 0x732F, 0xE0CD, 0x7329, 0xE0CE, 0x7325, 0xE0CF, 0x733E, - 0xE0D0, 0x734E, 0xE0D1, 0x734F, 0xE0D2, 0x9ED8, 0xE0D3, 0x7357, - 0xE0D4, 0x736A, 0xE0D5, 0x7368, 0xE0D6, 0x7370, 0xE0D7, 0x7378, - 0xE0D8, 0x7375, 0xE0D9, 0x737B, 0xE0DA, 0x737A, 0xE0DB, 0x73C8, - 0xE0DC, 0x73B3, 0xE0DD, 0x73CE, 0xE0DE, 0x73BB, 0xE0DF, 0x73C0, - 0xE0E0, 0x73E5, 0xE0E1, 0x73EE, 0xE0E2, 0x73DE, 0xE0E3, 0x74A2, - 0xE0E4, 0x7405, 0xE0E5, 0x746F, 0xE0E6, 0x7425, 0xE0E7, 0x73F8, - 0xE0E8, 0x7432, 0xE0E9, 0x743A, 0xE0EA, 0x7455, 0xE0EB, 0x743F, - 0xE0EC, 0x745F, 0xE0ED, 0x7459, 0xE0EE, 0x7441, 0xE0EF, 0x745C, - 0xE0F0, 0x7469, 0xE0F1, 0x7470, 0xE0F2, 0x7463, 0xE0F3, 0x746A, - 0xE0F4, 0x7476, 0xE0F5, 0x747E, 0xE0F6, 0x748B, 0xE0F7, 0x749E, - 0xE0F8, 0x74A7, 0xE0F9, 0x74CA, 0xE0FA, 0x74CF, 0xE0FB, 0x74D4, - 0xE0FC, 0x73F1, 0xE140, 0x74E0, 0xE141, 0x74E3, 0xE142, 0x74E7, - 0xE143, 0x74E9, 0xE144, 0x74EE, 0xE145, 0x74F2, 0xE146, 0x74F0, - 0xE147, 0x74F1, 0xE148, 0x74F8, 0xE149, 0x74F7, 0xE14A, 0x7504, - 0xE14B, 0x7503, 0xE14C, 0x7505, 0xE14D, 0x750C, 0xE14E, 0x750E, - 0xE14F, 0x750D, 0xE150, 0x7515, 0xE151, 0x7513, 0xE152, 0x751E, - 0xE153, 0x7526, 0xE154, 0x752C, 0xE155, 0x753C, 0xE156, 0x7544, - 0xE157, 0x754D, 0xE158, 0x754A, 0xE159, 0x7549, 0xE15A, 0x755B, - 0xE15B, 0x7546, 0xE15C, 0x755A, 0xE15D, 0x7569, 0xE15E, 0x7564, - 0xE15F, 0x7567, 0xE160, 0x756B, 0xE161, 0x756D, 0xE162, 0x7578, - 0xE163, 0x7576, 0xE164, 0x7586, 0xE165, 0x7587, 0xE166, 0x7574, - 0xE167, 0x758A, 0xE168, 0x7589, 0xE169, 0x7582, 0xE16A, 0x7594, - 0xE16B, 0x759A, 0xE16C, 0x759D, 0xE16D, 0x75A5, 0xE16E, 0x75A3, - 0xE16F, 0x75C2, 0xE170, 0x75B3, 0xE171, 0x75C3, 0xE172, 0x75B5, - 0xE173, 0x75BD, 0xE174, 0x75B8, 0xE175, 0x75BC, 0xE176, 0x75B1, - 0xE177, 0x75CD, 0xE178, 0x75CA, 0xE179, 0x75D2, 0xE17A, 0x75D9, - 0xE17B, 0x75E3, 0xE17C, 0x75DE, 0xE17D, 0x75FE, 0xE17E, 0x75FF, - 0xE180, 0x75FC, 0xE181, 0x7601, 0xE182, 0x75F0, 0xE183, 0x75FA, - 0xE184, 0x75F2, 0xE185, 0x75F3, 0xE186, 0x760B, 0xE187, 0x760D, - 0xE188, 0x7609, 0xE189, 0x761F, 0xE18A, 0x7627, 0xE18B, 0x7620, - 0xE18C, 0x7621, 0xE18D, 0x7622, 0xE18E, 0x7624, 0xE18F, 0x7634, - 0xE190, 0x7630, 0xE191, 0x763B, 0xE192, 0x7647, 0xE193, 0x7648, - 0xE194, 0x7646, 0xE195, 0x765C, 0xE196, 0x7658, 0xE197, 0x7661, - 0xE198, 0x7662, 0xE199, 0x7668, 0xE19A, 0x7669, 0xE19B, 0x766A, - 0xE19C, 0x7667, 0xE19D, 0x766C, 0xE19E, 0x7670, 0xE19F, 0x7672, - 0xE1A0, 0x7676, 0xE1A1, 0x7678, 0xE1A2, 0x767C, 0xE1A3, 0x7680, - 0xE1A4, 0x7683, 0xE1A5, 0x7688, 0xE1A6, 0x768B, 0xE1A7, 0x768E, - 0xE1A8, 0x7696, 0xE1A9, 0x7693, 0xE1AA, 0x7699, 0xE1AB, 0x769A, - 0xE1AC, 0x76B0, 0xE1AD, 0x76B4, 0xE1AE, 0x76B8, 0xE1AF, 0x76B9, - 0xE1B0, 0x76BA, 0xE1B1, 0x76C2, 0xE1B2, 0x76CD, 0xE1B3, 0x76D6, - 0xE1B4, 0x76D2, 0xE1B5, 0x76DE, 0xE1B6, 0x76E1, 0xE1B7, 0x76E5, - 0xE1B8, 0x76E7, 0xE1B9, 0x76EA, 0xE1BA, 0x862F, 0xE1BB, 0x76FB, - 0xE1BC, 0x7708, 0xE1BD, 0x7707, 0xE1BE, 0x7704, 0xE1BF, 0x7729, - 0xE1C0, 0x7724, 0xE1C1, 0x771E, 0xE1C2, 0x7725, 0xE1C3, 0x7726, - 0xE1C4, 0x771B, 0xE1C5, 0x7737, 0xE1C6, 0x7738, 0xE1C7, 0x7747, - 0xE1C8, 0x775A, 0xE1C9, 0x7768, 0xE1CA, 0x776B, 0xE1CB, 0x775B, - 0xE1CC, 0x7765, 0xE1CD, 0x777F, 0xE1CE, 0x777E, 0xE1CF, 0x7779, - 0xE1D0, 0x778E, 0xE1D1, 0x778B, 0xE1D2, 0x7791, 0xE1D3, 0x77A0, - 0xE1D4, 0x779E, 0xE1D5, 0x77B0, 0xE1D6, 0x77B6, 0xE1D7, 0x77B9, - 0xE1D8, 0x77BF, 0xE1D9, 0x77BC, 0xE1DA, 0x77BD, 0xE1DB, 0x77BB, - 0xE1DC, 0x77C7, 0xE1DD, 0x77CD, 0xE1DE, 0x77D7, 0xE1DF, 0x77DA, - 0xE1E0, 0x77DC, 0xE1E1, 0x77E3, 0xE1E2, 0x77EE, 0xE1E3, 0x77FC, - 0xE1E4, 0x780C, 0xE1E5, 0x7812, 0xE1E6, 0x7926, 0xE1E7, 0x7820, - 0xE1E8, 0x792A, 0xE1E9, 0x7845, 0xE1EA, 0x788E, 0xE1EB, 0x7874, - 0xE1EC, 0x7886, 0xE1ED, 0x787C, 0xE1EE, 0x789A, 0xE1EF, 0x788C, - 0xE1F0, 0x78A3, 0xE1F1, 0x78B5, 0xE1F2, 0x78AA, 0xE1F3, 0x78AF, - 0xE1F4, 0x78D1, 0xE1F5, 0x78C6, 0xE1F6, 0x78CB, 0xE1F7, 0x78D4, - 0xE1F8, 0x78BE, 0xE1F9, 0x78BC, 0xE1FA, 0x78C5, 0xE1FB, 0x78CA, - 0xE1FC, 0x78EC, 0xE240, 0x78E7, 0xE241, 0x78DA, 0xE242, 0x78FD, - 0xE243, 0x78F4, 0xE244, 0x7907, 0xE245, 0x7912, 0xE246, 0x7911, - 0xE247, 0x7919, 0xE248, 0x792C, 0xE249, 0x792B, 0xE24A, 0x7940, - 0xE24B, 0x7960, 0xE24C, 0x7957, 0xE24D, 0x795F, 0xE24E, 0x795A, - 0xE24F, 0x7955, 0xE250, 0x7953, 0xE251, 0x797A, 0xE252, 0x797F, - 0xE253, 0x798A, 0xE254, 0x799D, 0xE255, 0x79A7, 0xE256, 0x9F4B, - 0xE257, 0x79AA, 0xE258, 0x79AE, 0xE259, 0x79B3, 0xE25A, 0x79B9, - 0xE25B, 0x79BA, 0xE25C, 0x79C9, 0xE25D, 0x79D5, 0xE25E, 0x79E7, - 0xE25F, 0x79EC, 0xE260, 0x79E1, 0xE261, 0x79E3, 0xE262, 0x7A08, - 0xE263, 0x7A0D, 0xE264, 0x7A18, 0xE265, 0x7A19, 0xE266, 0x7A20, - 0xE267, 0x7A1F, 0xE268, 0x7980, 0xE269, 0x7A31, 0xE26A, 0x7A3B, - 0xE26B, 0x7A3E, 0xE26C, 0x7A37, 0xE26D, 0x7A43, 0xE26E, 0x7A57, - 0xE26F, 0x7A49, 0xE270, 0x7A61, 0xE271, 0x7A62, 0xE272, 0x7A69, - 0xE273, 0x9F9D, 0xE274, 0x7A70, 0xE275, 0x7A79, 0xE276, 0x7A7D, - 0xE277, 0x7A88, 0xE278, 0x7A97, 0xE279, 0x7A95, 0xE27A, 0x7A98, - 0xE27B, 0x7A96, 0xE27C, 0x7AA9, 0xE27D, 0x7AC8, 0xE27E, 0x7AB0, - 0xE280, 0x7AB6, 0xE281, 0x7AC5, 0xE282, 0x7AC4, 0xE283, 0x7ABF, - 0xE284, 0x9083, 0xE285, 0x7AC7, 0xE286, 0x7ACA, 0xE287, 0x7ACD, - 0xE288, 0x7ACF, 0xE289, 0x7AD5, 0xE28A, 0x7AD3, 0xE28B, 0x7AD9, - 0xE28C, 0x7ADA, 0xE28D, 0x7ADD, 0xE28E, 0x7AE1, 0xE28F, 0x7AE2, - 0xE290, 0x7AE6, 0xE291, 0x7AED, 0xE292, 0x7AF0, 0xE293, 0x7B02, - 0xE294, 0x7B0F, 0xE295, 0x7B0A, 0xE296, 0x7B06, 0xE297, 0x7B33, - 0xE298, 0x7B18, 0xE299, 0x7B19, 0xE29A, 0x7B1E, 0xE29B, 0x7B35, - 0xE29C, 0x7B28, 0xE29D, 0x7B36, 0xE29E, 0x7B50, 0xE29F, 0x7B7A, - 0xE2A0, 0x7B04, 0xE2A1, 0x7B4D, 0xE2A2, 0x7B0B, 0xE2A3, 0x7B4C, - 0xE2A4, 0x7B45, 0xE2A5, 0x7B75, 0xE2A6, 0x7B65, 0xE2A7, 0x7B74, - 0xE2A8, 0x7B67, 0xE2A9, 0x7B70, 0xE2AA, 0x7B71, 0xE2AB, 0x7B6C, - 0xE2AC, 0x7B6E, 0xE2AD, 0x7B9D, 0xE2AE, 0x7B98, 0xE2AF, 0x7B9F, - 0xE2B0, 0x7B8D, 0xE2B1, 0x7B9C, 0xE2B2, 0x7B9A, 0xE2B3, 0x7B8B, - 0xE2B4, 0x7B92, 0xE2B5, 0x7B8F, 0xE2B6, 0x7B5D, 0xE2B7, 0x7B99, - 0xE2B8, 0x7BCB, 0xE2B9, 0x7BC1, 0xE2BA, 0x7BCC, 0xE2BB, 0x7BCF, - 0xE2BC, 0x7BB4, 0xE2BD, 0x7BC6, 0xE2BE, 0x7BDD, 0xE2BF, 0x7BE9, - 0xE2C0, 0x7C11, 0xE2C1, 0x7C14, 0xE2C2, 0x7BE6, 0xE2C3, 0x7BE5, - 0xE2C4, 0x7C60, 0xE2C5, 0x7C00, 0xE2C6, 0x7C07, 0xE2C7, 0x7C13, - 0xE2C8, 0x7BF3, 0xE2C9, 0x7BF7, 0xE2CA, 0x7C17, 0xE2CB, 0x7C0D, - 0xE2CC, 0x7BF6, 0xE2CD, 0x7C23, 0xE2CE, 0x7C27, 0xE2CF, 0x7C2A, - 0xE2D0, 0x7C1F, 0xE2D1, 0x7C37, 0xE2D2, 0x7C2B, 0xE2D3, 0x7C3D, - 0xE2D4, 0x7C4C, 0xE2D5, 0x7C43, 0xE2D6, 0x7C54, 0xE2D7, 0x7C4F, - 0xE2D8, 0x7C40, 0xE2D9, 0x7C50, 0xE2DA, 0x7C58, 0xE2DB, 0x7C5F, - 0xE2DC, 0x7C64, 0xE2DD, 0x7C56, 0xE2DE, 0x7C65, 0xE2DF, 0x7C6C, - 0xE2E0, 0x7C75, 0xE2E1, 0x7C83, 0xE2E2, 0x7C90, 0xE2E3, 0x7CA4, - 0xE2E4, 0x7CAD, 0xE2E5, 0x7CA2, 0xE2E6, 0x7CAB, 0xE2E7, 0x7CA1, - 0xE2E8, 0x7CA8, 0xE2E9, 0x7CB3, 0xE2EA, 0x7CB2, 0xE2EB, 0x7CB1, - 0xE2EC, 0x7CAE, 0xE2ED, 0x7CB9, 0xE2EE, 0x7CBD, 0xE2EF, 0x7CC0, - 0xE2F0, 0x7CC5, 0xE2F1, 0x7CC2, 0xE2F2, 0x7CD8, 0xE2F3, 0x7CD2, - 0xE2F4, 0x7CDC, 0xE2F5, 0x7CE2, 0xE2F6, 0x9B3B, 0xE2F7, 0x7CEF, - 0xE2F8, 0x7CF2, 0xE2F9, 0x7CF4, 0xE2FA, 0x7CF6, 0xE2FB, 0x7CFA, - 0xE2FC, 0x7D06, 0xE340, 0x7D02, 0xE341, 0x7D1C, 0xE342, 0x7D15, - 0xE343, 0x7D0A, 0xE344, 0x7D45, 0xE345, 0x7D4B, 0xE346, 0x7D2E, - 0xE347, 0x7D32, 0xE348, 0x7D3F, 0xE349, 0x7D35, 0xE34A, 0x7D46, - 0xE34B, 0x7D73, 0xE34C, 0x7D56, 0xE34D, 0x7D4E, 0xE34E, 0x7D72, - 0xE34F, 0x7D68, 0xE350, 0x7D6E, 0xE351, 0x7D4F, 0xE352, 0x7D63, - 0xE353, 0x7D93, 0xE354, 0x7D89, 0xE355, 0x7D5B, 0xE356, 0x7D8F, - 0xE357, 0x7D7D, 0xE358, 0x7D9B, 0xE359, 0x7DBA, 0xE35A, 0x7DAE, - 0xE35B, 0x7DA3, 0xE35C, 0x7DB5, 0xE35D, 0x7DC7, 0xE35E, 0x7DBD, - 0xE35F, 0x7DAB, 0xE360, 0x7E3D, 0xE361, 0x7DA2, 0xE362, 0x7DAF, - 0xE363, 0x7DDC, 0xE364, 0x7DB8, 0xE365, 0x7D9F, 0xE366, 0x7DB0, - 0xE367, 0x7DD8, 0xE368, 0x7DDD, 0xE369, 0x7DE4, 0xE36A, 0x7DDE, - 0xE36B, 0x7DFB, 0xE36C, 0x7DF2, 0xE36D, 0x7DE1, 0xE36E, 0x7E05, - 0xE36F, 0x7E0A, 0xE370, 0x7E23, 0xE371, 0x7E21, 0xE372, 0x7E12, - 0xE373, 0x7E31, 0xE374, 0x7E1F, 0xE375, 0x7E09, 0xE376, 0x7E0B, - 0xE377, 0x7E22, 0xE378, 0x7E46, 0xE379, 0x7E66, 0xE37A, 0x7E3B, - 0xE37B, 0x7E35, 0xE37C, 0x7E39, 0xE37D, 0x7E43, 0xE37E, 0x7E37, - 0xE380, 0x7E32, 0xE381, 0x7E3A, 0xE382, 0x7E67, 0xE383, 0x7E5D, - 0xE384, 0x7E56, 0xE385, 0x7E5E, 0xE386, 0x7E59, 0xE387, 0x7E5A, - 0xE388, 0x7E79, 0xE389, 0x7E6A, 0xE38A, 0x7E69, 0xE38B, 0x7E7C, - 0xE38C, 0x7E7B, 0xE38D, 0x7E83, 0xE38E, 0x7DD5, 0xE38F, 0x7E7D, - 0xE390, 0x8FAE, 0xE391, 0x7E7F, 0xE392, 0x7E88, 0xE393, 0x7E89, - 0xE394, 0x7E8C, 0xE395, 0x7E92, 0xE396, 0x7E90, 0xE397, 0x7E93, - 0xE398, 0x7E94, 0xE399, 0x7E96, 0xE39A, 0x7E8E, 0xE39B, 0x7E9B, - 0xE39C, 0x7E9C, 0xE39D, 0x7F38, 0xE39E, 0x7F3A, 0xE39F, 0x7F45, - 0xE3A0, 0x7F4C, 0xE3A1, 0x7F4D, 0xE3A2, 0x7F4E, 0xE3A3, 0x7F50, - 0xE3A4, 0x7F51, 0xE3A5, 0x7F55, 0xE3A6, 0x7F54, 0xE3A7, 0x7F58, - 0xE3A8, 0x7F5F, 0xE3A9, 0x7F60, 0xE3AA, 0x7F68, 0xE3AB, 0x7F69, - 0xE3AC, 0x7F67, 0xE3AD, 0x7F78, 0xE3AE, 0x7F82, 0xE3AF, 0x7F86, - 0xE3B0, 0x7F83, 0xE3B1, 0x7F88, 0xE3B2, 0x7F87, 0xE3B3, 0x7F8C, - 0xE3B4, 0x7F94, 0xE3B5, 0x7F9E, 0xE3B6, 0x7F9D, 0xE3B7, 0x7F9A, - 0xE3B8, 0x7FA3, 0xE3B9, 0x7FAF, 0xE3BA, 0x7FB2, 0xE3BB, 0x7FB9, - 0xE3BC, 0x7FAE, 0xE3BD, 0x7FB6, 0xE3BE, 0x7FB8, 0xE3BF, 0x8B71, - 0xE3C0, 0x7FC5, 0xE3C1, 0x7FC6, 0xE3C2, 0x7FCA, 0xE3C3, 0x7FD5, - 0xE3C4, 0x7FD4, 0xE3C5, 0x7FE1, 0xE3C6, 0x7FE6, 0xE3C7, 0x7FE9, - 0xE3C8, 0x7FF3, 0xE3C9, 0x7FF9, 0xE3CA, 0x98DC, 0xE3CB, 0x8006, - 0xE3CC, 0x8004, 0xE3CD, 0x800B, 0xE3CE, 0x8012, 0xE3CF, 0x8018, - 0xE3D0, 0x8019, 0xE3D1, 0x801C, 0xE3D2, 0x8021, 0xE3D3, 0x8028, - 0xE3D4, 0x803F, 0xE3D5, 0x803B, 0xE3D6, 0x804A, 0xE3D7, 0x8046, - 0xE3D8, 0x8052, 0xE3D9, 0x8058, 0xE3DA, 0x805A, 0xE3DB, 0x805F, - 0xE3DC, 0x8062, 0xE3DD, 0x8068, 0xE3DE, 0x8073, 0xE3DF, 0x8072, - 0xE3E0, 0x8070, 0xE3E1, 0x8076, 0xE3E2, 0x8079, 0xE3E3, 0x807D, - 0xE3E4, 0x807F, 0xE3E5, 0x8084, 0xE3E6, 0x8086, 0xE3E7, 0x8085, - 0xE3E8, 0x809B, 0xE3E9, 0x8093, 0xE3EA, 0x809A, 0xE3EB, 0x80AD, - 0xE3EC, 0x5190, 0xE3ED, 0x80AC, 0xE3EE, 0x80DB, 0xE3EF, 0x80E5, - 0xE3F0, 0x80D9, 0xE3F1, 0x80DD, 0xE3F2, 0x80C4, 0xE3F3, 0x80DA, - 0xE3F4, 0x80D6, 0xE3F5, 0x8109, 0xE3F6, 0x80EF, 0xE3F7, 0x80F1, - 0xE3F8, 0x811B, 0xE3F9, 0x8129, 0xE3FA, 0x8123, 0xE3FB, 0x812F, - 0xE3FC, 0x814B, 0xE440, 0x968B, 0xE441, 0x8146, 0xE442, 0x813E, - 0xE443, 0x8153, 0xE444, 0x8151, 0xE445, 0x80FC, 0xE446, 0x8171, - 0xE447, 0x816E, 0xE448, 0x8165, 0xE449, 0x8166, 0xE44A, 0x8174, - 0xE44B, 0x8183, 0xE44C, 0x8188, 0xE44D, 0x818A, 0xE44E, 0x8180, - 0xE44F, 0x8182, 0xE450, 0x81A0, 0xE451, 0x8195, 0xE452, 0x81A4, - 0xE453, 0x81A3, 0xE454, 0x815F, 0xE455, 0x8193, 0xE456, 0x81A9, - 0xE457, 0x81B0, 0xE458, 0x81B5, 0xE459, 0x81BE, 0xE45A, 0x81B8, - 0xE45B, 0x81BD, 0xE45C, 0x81C0, 0xE45D, 0x81C2, 0xE45E, 0x81BA, - 0xE45F, 0x81C9, 0xE460, 0x81CD, 0xE461, 0x81D1, 0xE462, 0x81D9, - 0xE463, 0x81D8, 0xE464, 0x81C8, 0xE465, 0x81DA, 0xE466, 0x81DF, - 0xE467, 0x81E0, 0xE468, 0x81E7, 0xE469, 0x81FA, 0xE46A, 0x81FB, - 0xE46B, 0x81FE, 0xE46C, 0x8201, 0xE46D, 0x8202, 0xE46E, 0x8205, - 0xE46F, 0x8207, 0xE470, 0x820A, 0xE471, 0x820D, 0xE472, 0x8210, - 0xE473, 0x8216, 0xE474, 0x8229, 0xE475, 0x822B, 0xE476, 0x8238, - 0xE477, 0x8233, 0xE478, 0x8240, 0xE479, 0x8259, 0xE47A, 0x8258, - 0xE47B, 0x825D, 0xE47C, 0x825A, 0xE47D, 0x825F, 0xE47E, 0x8264, - 0xE480, 0x8262, 0xE481, 0x8268, 0xE482, 0x826A, 0xE483, 0x826B, - 0xE484, 0x822E, 0xE485, 0x8271, 0xE486, 0x8277, 0xE487, 0x8278, - 0xE488, 0x827E, 0xE489, 0x828D, 0xE48A, 0x8292, 0xE48B, 0x82AB, - 0xE48C, 0x829F, 0xE48D, 0x82BB, 0xE48E, 0x82AC, 0xE48F, 0x82E1, - 0xE490, 0x82E3, 0xE491, 0x82DF, 0xE492, 0x82D2, 0xE493, 0x82F4, - 0xE494, 0x82F3, 0xE495, 0x82FA, 0xE496, 0x8393, 0xE497, 0x8303, - 0xE498, 0x82FB, 0xE499, 0x82F9, 0xE49A, 0x82DE, 0xE49B, 0x8306, - 0xE49C, 0x82DC, 0xE49D, 0x8309, 0xE49E, 0x82D9, 0xE49F, 0x8335, - 0xE4A0, 0x8334, 0xE4A1, 0x8316, 0xE4A2, 0x8332, 0xE4A3, 0x8331, - 0xE4A4, 0x8340, 0xE4A5, 0x8339, 0xE4A6, 0x8350, 0xE4A7, 0x8345, - 0xE4A8, 0x832F, 0xE4A9, 0x832B, 0xE4AA, 0x8317, 0xE4AB, 0x8318, - 0xE4AC, 0x8385, 0xE4AD, 0x839A, 0xE4AE, 0x83AA, 0xE4AF, 0x839F, - 0xE4B0, 0x83A2, 0xE4B1, 0x8396, 0xE4B2, 0x8323, 0xE4B3, 0x838E, - 0xE4B4, 0x8387, 0xE4B5, 0x838A, 0xE4B6, 0x837C, 0xE4B7, 0x83B5, - 0xE4B8, 0x8373, 0xE4B9, 0x8375, 0xE4BA, 0x83A0, 0xE4BB, 0x8389, - 0xE4BC, 0x83A8, 0xE4BD, 0x83F4, 0xE4BE, 0x8413, 0xE4BF, 0x83EB, - 0xE4C0, 0x83CE, 0xE4C1, 0x83FD, 0xE4C2, 0x8403, 0xE4C3, 0x83D8, - 0xE4C4, 0x840B, 0xE4C5, 0x83C1, 0xE4C6, 0x83F7, 0xE4C7, 0x8407, - 0xE4C8, 0x83E0, 0xE4C9, 0x83F2, 0xE4CA, 0x840D, 0xE4CB, 0x8422, - 0xE4CC, 0x8420, 0xE4CD, 0x83BD, 0xE4CE, 0x8438, 0xE4CF, 0x8506, - 0xE4D0, 0x83FB, 0xE4D1, 0x846D, 0xE4D2, 0x842A, 0xE4D3, 0x843C, - 0xE4D4, 0x855A, 0xE4D5, 0x8484, 0xE4D6, 0x8477, 0xE4D7, 0x846B, - 0xE4D8, 0x84AD, 0xE4D9, 0x846E, 0xE4DA, 0x8482, 0xE4DB, 0x8469, - 0xE4DC, 0x8446, 0xE4DD, 0x842C, 0xE4DE, 0x846F, 0xE4DF, 0x8479, - 0xE4E0, 0x8435, 0xE4E1, 0x84CA, 0xE4E2, 0x8462, 0xE4E3, 0x84B9, - 0xE4E4, 0x84BF, 0xE4E5, 0x849F, 0xE4E6, 0x84D9, 0xE4E7, 0x84CD, - 0xE4E8, 0x84BB, 0xE4E9, 0x84DA, 0xE4EA, 0x84D0, 0xE4EB, 0x84C1, - 0xE4EC, 0x84C6, 0xE4ED, 0x84D6, 0xE4EE, 0x84A1, 0xE4EF, 0x8521, - 0xE4F0, 0x84FF, 0xE4F1, 0x84F4, 0xE4F2, 0x8517, 0xE4F3, 0x8518, - 0xE4F4, 0x852C, 0xE4F5, 0x851F, 0xE4F6, 0x8515, 0xE4F7, 0x8514, - 0xE4F8, 0x84FC, 0xE4F9, 0x8540, 0xE4FA, 0x8563, 0xE4FB, 0x8558, - 0xE4FC, 0x8548, 0xE540, 0x8541, 0xE541, 0x8602, 0xE542, 0x854B, - 0xE543, 0x8555, 0xE544, 0x8580, 0xE545, 0x85A4, 0xE546, 0x8588, - 0xE547, 0x8591, 0xE548, 0x858A, 0xE549, 0x85A8, 0xE54A, 0x856D, - 0xE54B, 0x8594, 0xE54C, 0x859B, 0xE54D, 0x85EA, 0xE54E, 0x8587, - 0xE54F, 0x859C, 0xE550, 0x8577, 0xE551, 0x857E, 0xE552, 0x8590, - 0xE553, 0x85C9, 0xE554, 0x85BA, 0xE555, 0x85CF, 0xE556, 0x85B9, - 0xE557, 0x85D0, 0xE558, 0x85D5, 0xE559, 0x85DD, 0xE55A, 0x85E5, - 0xE55B, 0x85DC, 0xE55C, 0x85F9, 0xE55D, 0x860A, 0xE55E, 0x8613, - 0xE55F, 0x860B, 0xE560, 0x85FE, 0xE561, 0x85FA, 0xE562, 0x8606, - 0xE563, 0x8622, 0xE564, 0x861A, 0xE565, 0x8630, 0xE566, 0x863F, - 0xE567, 0x864D, 0xE568, 0x4E55, 0xE569, 0x8654, 0xE56A, 0x865F, - 0xE56B, 0x8667, 0xE56C, 0x8671, 0xE56D, 0x8693, 0xE56E, 0x86A3, - 0xE56F, 0x86A9, 0xE570, 0x86AA, 0xE571, 0x868B, 0xE572, 0x868C, - 0xE573, 0x86B6, 0xE574, 0x86AF, 0xE575, 0x86C4, 0xE576, 0x86C6, - 0xE577, 0x86B0, 0xE578, 0x86C9, 0xE579, 0x8823, 0xE57A, 0x86AB, - 0xE57B, 0x86D4, 0xE57C, 0x86DE, 0xE57D, 0x86E9, 0xE57E, 0x86EC, - 0xE580, 0x86DF, 0xE581, 0x86DB, 0xE582, 0x86EF, 0xE583, 0x8712, - 0xE584, 0x8706, 0xE585, 0x8708, 0xE586, 0x8700, 0xE587, 0x8703, - 0xE588, 0x86FB, 0xE589, 0x8711, 0xE58A, 0x8709, 0xE58B, 0x870D, - 0xE58C, 0x86F9, 0xE58D, 0x870A, 0xE58E, 0x8734, 0xE58F, 0x873F, - 0xE590, 0x8737, 0xE591, 0x873B, 0xE592, 0x8725, 0xE593, 0x8729, - 0xE594, 0x871A, 0xE595, 0x8760, 0xE596, 0x875F, 0xE597, 0x8778, - 0xE598, 0x874C, 0xE599, 0x874E, 0xE59A, 0x8774, 0xE59B, 0x8757, - 0xE59C, 0x8768, 0xE59D, 0x876E, 0xE59E, 0x8759, 0xE59F, 0x8753, - 0xE5A0, 0x8763, 0xE5A1, 0x876A, 0xE5A2, 0x8805, 0xE5A3, 0x87A2, - 0xE5A4, 0x879F, 0xE5A5, 0x8782, 0xE5A6, 0x87AF, 0xE5A7, 0x87CB, - 0xE5A8, 0x87BD, 0xE5A9, 0x87C0, 0xE5AA, 0x87D0, 0xE5AB, 0x96D6, - 0xE5AC, 0x87AB, 0xE5AD, 0x87C4, 0xE5AE, 0x87B3, 0xE5AF, 0x87C7, - 0xE5B0, 0x87C6, 0xE5B1, 0x87BB, 0xE5B2, 0x87EF, 0xE5B3, 0x87F2, - 0xE5B4, 0x87E0, 0xE5B5, 0x880F, 0xE5B6, 0x880D, 0xE5B7, 0x87FE, - 0xE5B8, 0x87F6, 0xE5B9, 0x87F7, 0xE5BA, 0x880E, 0xE5BB, 0x87D2, - 0xE5BC, 0x8811, 0xE5BD, 0x8816, 0xE5BE, 0x8815, 0xE5BF, 0x8822, - 0xE5C0, 0x8821, 0xE5C1, 0x8831, 0xE5C2, 0x8836, 0xE5C3, 0x8839, - 0xE5C4, 0x8827, 0xE5C5, 0x883B, 0xE5C6, 0x8844, 0xE5C7, 0x8842, - 0xE5C8, 0x8852, 0xE5C9, 0x8859, 0xE5CA, 0x885E, 0xE5CB, 0x8862, - 0xE5CC, 0x886B, 0xE5CD, 0x8881, 0xE5CE, 0x887E, 0xE5CF, 0x889E, - 0xE5D0, 0x8875, 0xE5D1, 0x887D, 0xE5D2, 0x88B5, 0xE5D3, 0x8872, - 0xE5D4, 0x8882, 0xE5D5, 0x8897, 0xE5D6, 0x8892, 0xE5D7, 0x88AE, - 0xE5D8, 0x8899, 0xE5D9, 0x88A2, 0xE5DA, 0x888D, 0xE5DB, 0x88A4, - 0xE5DC, 0x88B0, 0xE5DD, 0x88BF, 0xE5DE, 0x88B1, 0xE5DF, 0x88C3, - 0xE5E0, 0x88C4, 0xE5E1, 0x88D4, 0xE5E2, 0x88D8, 0xE5E3, 0x88D9, - 0xE5E4, 0x88DD, 0xE5E5, 0x88F9, 0xE5E6, 0x8902, 0xE5E7, 0x88FC, - 0xE5E8, 0x88F4, 0xE5E9, 0x88E8, 0xE5EA, 0x88F2, 0xE5EB, 0x8904, - 0xE5EC, 0x890C, 0xE5ED, 0x890A, 0xE5EE, 0x8913, 0xE5EF, 0x8943, - 0xE5F0, 0x891E, 0xE5F1, 0x8925, 0xE5F2, 0x892A, 0xE5F3, 0x892B, - 0xE5F4, 0x8941, 0xE5F5, 0x8944, 0xE5F6, 0x893B, 0xE5F7, 0x8936, - 0xE5F8, 0x8938, 0xE5F9, 0x894C, 0xE5FA, 0x891D, 0xE5FB, 0x8960, - 0xE5FC, 0x895E, 0xE640, 0x8966, 0xE641, 0x8964, 0xE642, 0x896D, - 0xE643, 0x896A, 0xE644, 0x896F, 0xE645, 0x8974, 0xE646, 0x8977, - 0xE647, 0x897E, 0xE648, 0x8983, 0xE649, 0x8988, 0xE64A, 0x898A, - 0xE64B, 0x8993, 0xE64C, 0x8998, 0xE64D, 0x89A1, 0xE64E, 0x89A9, - 0xE64F, 0x89A6, 0xE650, 0x89AC, 0xE651, 0x89AF, 0xE652, 0x89B2, - 0xE653, 0x89BA, 0xE654, 0x89BD, 0xE655, 0x89BF, 0xE656, 0x89C0, - 0xE657, 0x89DA, 0xE658, 0x89DC, 0xE659, 0x89DD, 0xE65A, 0x89E7, - 0xE65B, 0x89F4, 0xE65C, 0x89F8, 0xE65D, 0x8A03, 0xE65E, 0x8A16, - 0xE65F, 0x8A10, 0xE660, 0x8A0C, 0xE661, 0x8A1B, 0xE662, 0x8A1D, - 0xE663, 0x8A25, 0xE664, 0x8A36, 0xE665, 0x8A41, 0xE666, 0x8A5B, - 0xE667, 0x8A52, 0xE668, 0x8A46, 0xE669, 0x8A48, 0xE66A, 0x8A7C, - 0xE66B, 0x8A6D, 0xE66C, 0x8A6C, 0xE66D, 0x8A62, 0xE66E, 0x8A85, - 0xE66F, 0x8A82, 0xE670, 0x8A84, 0xE671, 0x8AA8, 0xE672, 0x8AA1, - 0xE673, 0x8A91, 0xE674, 0x8AA5, 0xE675, 0x8AA6, 0xE676, 0x8A9A, - 0xE677, 0x8AA3, 0xE678, 0x8AC4, 0xE679, 0x8ACD, 0xE67A, 0x8AC2, - 0xE67B, 0x8ADA, 0xE67C, 0x8AEB, 0xE67D, 0x8AF3, 0xE67E, 0x8AE7, - 0xE680, 0x8AE4, 0xE681, 0x8AF1, 0xE682, 0x8B14, 0xE683, 0x8AE0, - 0xE684, 0x8AE2, 0xE685, 0x8AF7, 0xE686, 0x8ADE, 0xE687, 0x8ADB, - 0xE688, 0x8B0C, 0xE689, 0x8B07, 0xE68A, 0x8B1A, 0xE68B, 0x8AE1, - 0xE68C, 0x8B16, 0xE68D, 0x8B10, 0xE68E, 0x8B17, 0xE68F, 0x8B20, - 0xE690, 0x8B33, 0xE691, 0x97AB, 0xE692, 0x8B26, 0xE693, 0x8B2B, - 0xE694, 0x8B3E, 0xE695, 0x8B28, 0xE696, 0x8B41, 0xE697, 0x8B4C, - 0xE698, 0x8B4F, 0xE699, 0x8B4E, 0xE69A, 0x8B49, 0xE69B, 0x8B56, - 0xE69C, 0x8B5B, 0xE69D, 0x8B5A, 0xE69E, 0x8B6B, 0xE69F, 0x8B5F, - 0xE6A0, 0x8B6C, 0xE6A1, 0x8B6F, 0xE6A2, 0x8B74, 0xE6A3, 0x8B7D, - 0xE6A4, 0x8B80, 0xE6A5, 0x8B8C, 0xE6A6, 0x8B8E, 0xE6A7, 0x8B92, - 0xE6A8, 0x8B93, 0xE6A9, 0x8B96, 0xE6AA, 0x8B99, 0xE6AB, 0x8B9A, - 0xE6AC, 0x8C3A, 0xE6AD, 0x8C41, 0xE6AE, 0x8C3F, 0xE6AF, 0x8C48, - 0xE6B0, 0x8C4C, 0xE6B1, 0x8C4E, 0xE6B2, 0x8C50, 0xE6B3, 0x8C55, - 0xE6B4, 0x8C62, 0xE6B5, 0x8C6C, 0xE6B6, 0x8C78, 0xE6B7, 0x8C7A, - 0xE6B8, 0x8C82, 0xE6B9, 0x8C89, 0xE6BA, 0x8C85, 0xE6BB, 0x8C8A, - 0xE6BC, 0x8C8D, 0xE6BD, 0x8C8E, 0xE6BE, 0x8C94, 0xE6BF, 0x8C7C, - 0xE6C0, 0x8C98, 0xE6C1, 0x621D, 0xE6C2, 0x8CAD, 0xE6C3, 0x8CAA, - 0xE6C4, 0x8CBD, 0xE6C5, 0x8CB2, 0xE6C6, 0x8CB3, 0xE6C7, 0x8CAE, - 0xE6C8, 0x8CB6, 0xE6C9, 0x8CC8, 0xE6CA, 0x8CC1, 0xE6CB, 0x8CE4, - 0xE6CC, 0x8CE3, 0xE6CD, 0x8CDA, 0xE6CE, 0x8CFD, 0xE6CF, 0x8CFA, - 0xE6D0, 0x8CFB, 0xE6D1, 0x8D04, 0xE6D2, 0x8D05, 0xE6D3, 0x8D0A, - 0xE6D4, 0x8D07, 0xE6D5, 0x8D0F, 0xE6D6, 0x8D0D, 0xE6D7, 0x8D10, - 0xE6D8, 0x9F4E, 0xE6D9, 0x8D13, 0xE6DA, 0x8CCD, 0xE6DB, 0x8D14, - 0xE6DC, 0x8D16, 0xE6DD, 0x8D67, 0xE6DE, 0x8D6D, 0xE6DF, 0x8D71, - 0xE6E0, 0x8D73, 0xE6E1, 0x8D81, 0xE6E2, 0x8D99, 0xE6E3, 0x8DC2, - 0xE6E4, 0x8DBE, 0xE6E5, 0x8DBA, 0xE6E6, 0x8DCF, 0xE6E7, 0x8DDA, - 0xE6E8, 0x8DD6, 0xE6E9, 0x8DCC, 0xE6EA, 0x8DDB, 0xE6EB, 0x8DCB, - 0xE6EC, 0x8DEA, 0xE6ED, 0x8DEB, 0xE6EE, 0x8DDF, 0xE6EF, 0x8DE3, - 0xE6F0, 0x8DFC, 0xE6F1, 0x8E08, 0xE6F2, 0x8E09, 0xE6F3, 0x8DFF, - 0xE6F4, 0x8E1D, 0xE6F5, 0x8E1E, 0xE6F6, 0x8E10, 0xE6F7, 0x8E1F, - 0xE6F8, 0x8E42, 0xE6F9, 0x8E35, 0xE6FA, 0x8E30, 0xE6FB, 0x8E34, - 0xE6FC, 0x8E4A, 0xE740, 0x8E47, 0xE741, 0x8E49, 0xE742, 0x8E4C, - 0xE743, 0x8E50, 0xE744, 0x8E48, 0xE745, 0x8E59, 0xE746, 0x8E64, - 0xE747, 0x8E60, 0xE748, 0x8E2A, 0xE749, 0x8E63, 0xE74A, 0x8E55, - 0xE74B, 0x8E76, 0xE74C, 0x8E72, 0xE74D, 0x8E7C, 0xE74E, 0x8E81, - 0xE74F, 0x8E87, 0xE750, 0x8E85, 0xE751, 0x8E84, 0xE752, 0x8E8B, - 0xE753, 0x8E8A, 0xE754, 0x8E93, 0xE755, 0x8E91, 0xE756, 0x8E94, - 0xE757, 0x8E99, 0xE758, 0x8EAA, 0xE759, 0x8EA1, 0xE75A, 0x8EAC, - 0xE75B, 0x8EB0, 0xE75C, 0x8EC6, 0xE75D, 0x8EB1, 0xE75E, 0x8EBE, - 0xE75F, 0x8EC5, 0xE760, 0x8EC8, 0xE761, 0x8ECB, 0xE762, 0x8EDB, - 0xE763, 0x8EE3, 0xE764, 0x8EFC, 0xE765, 0x8EFB, 0xE766, 0x8EEB, - 0xE767, 0x8EFE, 0xE768, 0x8F0A, 0xE769, 0x8F05, 0xE76A, 0x8F15, - 0xE76B, 0x8F12, 0xE76C, 0x8F19, 0xE76D, 0x8F13, 0xE76E, 0x8F1C, - 0xE76F, 0x8F1F, 0xE770, 0x8F1B, 0xE771, 0x8F0C, 0xE772, 0x8F26, - 0xE773, 0x8F33, 0xE774, 0x8F3B, 0xE775, 0x8F39, 0xE776, 0x8F45, - 0xE777, 0x8F42, 0xE778, 0x8F3E, 0xE779, 0x8F4C, 0xE77A, 0x8F49, - 0xE77B, 0x8F46, 0xE77C, 0x8F4E, 0xE77D, 0x8F57, 0xE77E, 0x8F5C, - 0xE780, 0x8F62, 0xE781, 0x8F63, 0xE782, 0x8F64, 0xE783, 0x8F9C, - 0xE784, 0x8F9F, 0xE785, 0x8FA3, 0xE786, 0x8FAD, 0xE787, 0x8FAF, - 0xE788, 0x8FB7, 0xE789, 0x8FDA, 0xE78A, 0x8FE5, 0xE78B, 0x8FE2, - 0xE78C, 0x8FEA, 0xE78D, 0x8FEF, 0xE78E, 0x9087, 0xE78F, 0x8FF4, - 0xE790, 0x9005, 0xE791, 0x8FF9, 0xE792, 0x8FFA, 0xE793, 0x9011, - 0xE794, 0x9015, 0xE795, 0x9021, 0xE796, 0x900D, 0xE797, 0x901E, - 0xE798, 0x9016, 0xE799, 0x900B, 0xE79A, 0x9027, 0xE79B, 0x9036, - 0xE79C, 0x9035, 0xE79D, 0x9039, 0xE79E, 0x8FF8, 0xE79F, 0x904F, - 0xE7A0, 0x9050, 0xE7A1, 0x9051, 0xE7A2, 0x9052, 0xE7A3, 0x900E, - 0xE7A4, 0x9049, 0xE7A5, 0x903E, 0xE7A6, 0x9056, 0xE7A7, 0x9058, - 0xE7A8, 0x905E, 0xE7A9, 0x9068, 0xE7AA, 0x906F, 0xE7AB, 0x9076, - 0xE7AC, 0x96A8, 0xE7AD, 0x9072, 0xE7AE, 0x9082, 0xE7AF, 0x907D, - 0xE7B0, 0x9081, 0xE7B1, 0x9080, 0xE7B2, 0x908A, 0xE7B3, 0x9089, - 0xE7B4, 0x908F, 0xE7B5, 0x90A8, 0xE7B6, 0x90AF, 0xE7B7, 0x90B1, - 0xE7B8, 0x90B5, 0xE7B9, 0x90E2, 0xE7BA, 0x90E4, 0xE7BB, 0x6248, - 0xE7BC, 0x90DB, 0xE7BD, 0x9102, 0xE7BE, 0x9112, 0xE7BF, 0x9119, - 0xE7C0, 0x9132, 0xE7C1, 0x9130, 0xE7C2, 0x914A, 0xE7C3, 0x9156, - 0xE7C4, 0x9158, 0xE7C5, 0x9163, 0xE7C6, 0x9165, 0xE7C7, 0x9169, - 0xE7C8, 0x9173, 0xE7C9, 0x9172, 0xE7CA, 0x918B, 0xE7CB, 0x9189, - 0xE7CC, 0x9182, 0xE7CD, 0x91A2, 0xE7CE, 0x91AB, 0xE7CF, 0x91AF, - 0xE7D0, 0x91AA, 0xE7D1, 0x91B5, 0xE7D2, 0x91B4, 0xE7D3, 0x91BA, - 0xE7D4, 0x91C0, 0xE7D5, 0x91C1, 0xE7D6, 0x91C9, 0xE7D7, 0x91CB, - 0xE7D8, 0x91D0, 0xE7D9, 0x91D6, 0xE7DA, 0x91DF, 0xE7DB, 0x91E1, - 0xE7DC, 0x91DB, 0xE7DD, 0x91FC, 0xE7DE, 0x91F5, 0xE7DF, 0x91F6, - 0xE7E0, 0x921E, 0xE7E1, 0x91FF, 0xE7E2, 0x9214, 0xE7E3, 0x922C, - 0xE7E4, 0x9215, 0xE7E5, 0x9211, 0xE7E6, 0x925E, 0xE7E7, 0x9257, - 0xE7E8, 0x9245, 0xE7E9, 0x9249, 0xE7EA, 0x9264, 0xE7EB, 0x9248, - 0xE7EC, 0x9295, 0xE7ED, 0x923F, 0xE7EE, 0x924B, 0xE7EF, 0x9250, - 0xE7F0, 0x929C, 0xE7F1, 0x9296, 0xE7F2, 0x9293, 0xE7F3, 0x929B, - 0xE7F4, 0x925A, 0xE7F5, 0x92CF, 0xE7F6, 0x92B9, 0xE7F7, 0x92B7, - 0xE7F8, 0x92E9, 0xE7F9, 0x930F, 0xE7FA, 0x92FA, 0xE7FB, 0x9344, - 0xE7FC, 0x932E, 0xE840, 0x9319, 0xE841, 0x9322, 0xE842, 0x931A, - 0xE843, 0x9323, 0xE844, 0x933A, 0xE845, 0x9335, 0xE846, 0x933B, - 0xE847, 0x935C, 0xE848, 0x9360, 0xE849, 0x937C, 0xE84A, 0x936E, - 0xE84B, 0x9356, 0xE84C, 0x93B0, 0xE84D, 0x93AC, 0xE84E, 0x93AD, - 0xE84F, 0x9394, 0xE850, 0x93B9, 0xE851, 0x93D6, 0xE852, 0x93D7, - 0xE853, 0x93E8, 0xE854, 0x93E5, 0xE855, 0x93D8, 0xE856, 0x93C3, - 0xE857, 0x93DD, 0xE858, 0x93D0, 0xE859, 0x93C8, 0xE85A, 0x93E4, - 0xE85B, 0x941A, 0xE85C, 0x9414, 0xE85D, 0x9413, 0xE85E, 0x9403, - 0xE85F, 0x9407, 0xE860, 0x9410, 0xE861, 0x9436, 0xE862, 0x942B, - 0xE863, 0x9435, 0xE864, 0x9421, 0xE865, 0x943A, 0xE866, 0x9441, - 0xE867, 0x9452, 0xE868, 0x9444, 0xE869, 0x945B, 0xE86A, 0x9460, - 0xE86B, 0x9462, 0xE86C, 0x945E, 0xE86D, 0x946A, 0xE86E, 0x9229, - 0xE86F, 0x9470, 0xE870, 0x9475, 0xE871, 0x9477, 0xE872, 0x947D, - 0xE873, 0x945A, 0xE874, 0x947C, 0xE875, 0x947E, 0xE876, 0x9481, - 0xE877, 0x947F, 0xE878, 0x9582, 0xE879, 0x9587, 0xE87A, 0x958A, - 0xE87B, 0x9594, 0xE87C, 0x9596, 0xE87D, 0x9598, 0xE87E, 0x9599, - 0xE880, 0x95A0, 0xE881, 0x95A8, 0xE882, 0x95A7, 0xE883, 0x95AD, - 0xE884, 0x95BC, 0xE885, 0x95BB, 0xE886, 0x95B9, 0xE887, 0x95BE, - 0xE888, 0x95CA, 0xE889, 0x6FF6, 0xE88A, 0x95C3, 0xE88B, 0x95CD, - 0xE88C, 0x95CC, 0xE88D, 0x95D5, 0xE88E, 0x95D4, 0xE88F, 0x95D6, - 0xE890, 0x95DC, 0xE891, 0x95E1, 0xE892, 0x95E5, 0xE893, 0x95E2, - 0xE894, 0x9621, 0xE895, 0x9628, 0xE896, 0x962E, 0xE897, 0x962F, - 0xE898, 0x9642, 0xE899, 0x964C, 0xE89A, 0x964F, 0xE89B, 0x964B, - 0xE89C, 0x9677, 0xE89D, 0x965C, 0xE89E, 0x965E, 0xE89F, 0x965D, - 0xE8A0, 0x965F, 0xE8A1, 0x9666, 0xE8A2, 0x9672, 0xE8A3, 0x966C, - 0xE8A4, 0x968D, 0xE8A5, 0x9698, 0xE8A6, 0x9695, 0xE8A7, 0x9697, - 0xE8A8, 0x96AA, 0xE8A9, 0x96A7, 0xE8AA, 0x96B1, 0xE8AB, 0x96B2, - 0xE8AC, 0x96B0, 0xE8AD, 0x96B4, 0xE8AE, 0x96B6, 0xE8AF, 0x96B8, - 0xE8B0, 0x96B9, 0xE8B1, 0x96CE, 0xE8B2, 0x96CB, 0xE8B3, 0x96C9, - 0xE8B4, 0x96CD, 0xE8B5, 0x894D, 0xE8B6, 0x96DC, 0xE8B7, 0x970D, - 0xE8B8, 0x96D5, 0xE8B9, 0x96F9, 0xE8BA, 0x9704, 0xE8BB, 0x9706, - 0xE8BC, 0x9708, 0xE8BD, 0x9713, 0xE8BE, 0x970E, 0xE8BF, 0x9711, - 0xE8C0, 0x970F, 0xE8C1, 0x9716, 0xE8C2, 0x9719, 0xE8C3, 0x9724, - 0xE8C4, 0x972A, 0xE8C5, 0x9730, 0xE8C6, 0x9739, 0xE8C7, 0x973D, - 0xE8C8, 0x973E, 0xE8C9, 0x9744, 0xE8CA, 0x9746, 0xE8CB, 0x9748, - 0xE8CC, 0x9742, 0xE8CD, 0x9749, 0xE8CE, 0x975C, 0xE8CF, 0x9760, - 0xE8D0, 0x9764, 0xE8D1, 0x9766, 0xE8D2, 0x9768, 0xE8D3, 0x52D2, - 0xE8D4, 0x976B, 0xE8D5, 0x9771, 0xE8D6, 0x9779, 0xE8D7, 0x9785, - 0xE8D8, 0x977C, 0xE8D9, 0x9781, 0xE8DA, 0x977A, 0xE8DB, 0x9786, - 0xE8DC, 0x978B, 0xE8DD, 0x978F, 0xE8DE, 0x9790, 0xE8DF, 0x979C, - 0xE8E0, 0x97A8, 0xE8E1, 0x97A6, 0xE8E2, 0x97A3, 0xE8E3, 0x97B3, - 0xE8E4, 0x97B4, 0xE8E5, 0x97C3, 0xE8E6, 0x97C6, 0xE8E7, 0x97C8, - 0xE8E8, 0x97CB, 0xE8E9, 0x97DC, 0xE8EA, 0x97ED, 0xE8EB, 0x9F4F, - 0xE8EC, 0x97F2, 0xE8ED, 0x7ADF, 0xE8EE, 0x97F6, 0xE8EF, 0x97F5, - 0xE8F0, 0x980F, 0xE8F1, 0x980C, 0xE8F2, 0x9838, 0xE8F3, 0x9824, - 0xE8F4, 0x9821, 0xE8F5, 0x9837, 0xE8F6, 0x983D, 0xE8F7, 0x9846, - 0xE8F8, 0x984F, 0xE8F9, 0x984B, 0xE8FA, 0x986B, 0xE8FB, 0x986F, - 0xE8FC, 0x9870, 0xE940, 0x9871, 0xE941, 0x9874, 0xE942, 0x9873, - 0xE943, 0x98AA, 0xE944, 0x98AF, 0xE945, 0x98B1, 0xE946, 0x98B6, - 0xE947, 0x98C4, 0xE948, 0x98C3, 0xE949, 0x98C6, 0xE94A, 0x98E9, - 0xE94B, 0x98EB, 0xE94C, 0x9903, 0xE94D, 0x9909, 0xE94E, 0x9912, - 0xE94F, 0x9914, 0xE950, 0x9918, 0xE951, 0x9921, 0xE952, 0x991D, - 0xE953, 0x991E, 0xE954, 0x9924, 0xE955, 0x9920, 0xE956, 0x992C, - 0xE957, 0x992E, 0xE958, 0x993D, 0xE959, 0x993E, 0xE95A, 0x9942, - 0xE95B, 0x9949, 0xE95C, 0x9945, 0xE95D, 0x9950, 0xE95E, 0x994B, - 0xE95F, 0x9951, 0xE960, 0x9952, 0xE961, 0x994C, 0xE962, 0x9955, - 0xE963, 0x9997, 0xE964, 0x9998, 0xE965, 0x99A5, 0xE966, 0x99AD, - 0xE967, 0x99AE, 0xE968, 0x99BC, 0xE969, 0x99DF, 0xE96A, 0x99DB, - 0xE96B, 0x99DD, 0xE96C, 0x99D8, 0xE96D, 0x99D1, 0xE96E, 0x99ED, - 0xE96F, 0x99EE, 0xE970, 0x99F1, 0xE971, 0x99F2, 0xE972, 0x99FB, - 0xE973, 0x99F8, 0xE974, 0x9A01, 0xE975, 0x9A0F, 0xE976, 0x9A05, - 0xE977, 0x99E2, 0xE978, 0x9A19, 0xE979, 0x9A2B, 0xE97A, 0x9A37, - 0xE97B, 0x9A45, 0xE97C, 0x9A42, 0xE97D, 0x9A40, 0xE97E, 0x9A43, - 0xE980, 0x9A3E, 0xE981, 0x9A55, 0xE982, 0x9A4D, 0xE983, 0x9A5B, - 0xE984, 0x9A57, 0xE985, 0x9A5F, 0xE986, 0x9A62, 0xE987, 0x9A65, - 0xE988, 0x9A64, 0xE989, 0x9A69, 0xE98A, 0x9A6B, 0xE98B, 0x9A6A, - 0xE98C, 0x9AAD, 0xE98D, 0x9AB0, 0xE98E, 0x9ABC, 0xE98F, 0x9AC0, - 0xE990, 0x9ACF, 0xE991, 0x9AD1, 0xE992, 0x9AD3, 0xE993, 0x9AD4, - 0xE994, 0x9ADE, 0xE995, 0x9ADF, 0xE996, 0x9AE2, 0xE997, 0x9AE3, - 0xE998, 0x9AE6, 0xE999, 0x9AEF, 0xE99A, 0x9AEB, 0xE99B, 0x9AEE, - 0xE99C, 0x9AF4, 0xE99D, 0x9AF1, 0xE99E, 0x9AF7, 0xE99F, 0x9AFB, - 0xE9A0, 0x9B06, 0xE9A1, 0x9B18, 0xE9A2, 0x9B1A, 0xE9A3, 0x9B1F, - 0xE9A4, 0x9B22, 0xE9A5, 0x9B23, 0xE9A6, 0x9B25, 0xE9A7, 0x9B27, - 0xE9A8, 0x9B28, 0xE9A9, 0x9B29, 0xE9AA, 0x9B2A, 0xE9AB, 0x9B2E, - 0xE9AC, 0x9B2F, 0xE9AD, 0x9B32, 0xE9AE, 0x9B44, 0xE9AF, 0x9B43, - 0xE9B0, 0x9B4F, 0xE9B1, 0x9B4D, 0xE9B2, 0x9B4E, 0xE9B3, 0x9B51, - 0xE9B4, 0x9B58, 0xE9B5, 0x9B74, 0xE9B6, 0x9B93, 0xE9B7, 0x9B83, - 0xE9B8, 0x9B91, 0xE9B9, 0x9B96, 0xE9BA, 0x9B97, 0xE9BB, 0x9B9F, - 0xE9BC, 0x9BA0, 0xE9BD, 0x9BA8, 0xE9BE, 0x9BB4, 0xE9BF, 0x9BC0, - 0xE9C0, 0x9BCA, 0xE9C1, 0x9BB9, 0xE9C2, 0x9BC6, 0xE9C3, 0x9BCF, - 0xE9C4, 0x9BD1, 0xE9C5, 0x9BD2, 0xE9C6, 0x9BE3, 0xE9C7, 0x9BE2, - 0xE9C8, 0x9BE4, 0xE9C9, 0x9BD4, 0xE9CA, 0x9BE1, 0xE9CB, 0x9C3A, - 0xE9CC, 0x9BF2, 0xE9CD, 0x9BF1, 0xE9CE, 0x9BF0, 0xE9CF, 0x9C15, - 0xE9D0, 0x9C14, 0xE9D1, 0x9C09, 0xE9D2, 0x9C13, 0xE9D3, 0x9C0C, - 0xE9D4, 0x9C06, 0xE9D5, 0x9C08, 0xE9D6, 0x9C12, 0xE9D7, 0x9C0A, - 0xE9D8, 0x9C04, 0xE9D9, 0x9C2E, 0xE9DA, 0x9C1B, 0xE9DB, 0x9C25, - 0xE9DC, 0x9C24, 0xE9DD, 0x9C21, 0xE9DE, 0x9C30, 0xE9DF, 0x9C47, - 0xE9E0, 0x9C32, 0xE9E1, 0x9C46, 0xE9E2, 0x9C3E, 0xE9E3, 0x9C5A, - 0xE9E4, 0x9C60, 0xE9E5, 0x9C67, 0xE9E6, 0x9C76, 0xE9E7, 0x9C78, - 0xE9E8, 0x9CE7, 0xE9E9, 0x9CEC, 0xE9EA, 0x9CF0, 0xE9EB, 0x9D09, - 0xE9EC, 0x9D08, 0xE9ED, 0x9CEB, 0xE9EE, 0x9D03, 0xE9EF, 0x9D06, - 0xE9F0, 0x9D2A, 0xE9F1, 0x9D26, 0xE9F2, 0x9DAF, 0xE9F3, 0x9D23, - 0xE9F4, 0x9D1F, 0xE9F5, 0x9D44, 0xE9F6, 0x9D15, 0xE9F7, 0x9D12, - 0xE9F8, 0x9D41, 0xE9F9, 0x9D3F, 0xE9FA, 0x9D3E, 0xE9FB, 0x9D46, - 0xE9FC, 0x9D48, 0xEA40, 0x9D5D, 0xEA41, 0x9D5E, 0xEA42, 0x9D64, - 0xEA43, 0x9D51, 0xEA44, 0x9D50, 0xEA45, 0x9D59, 0xEA46, 0x9D72, - 0xEA47, 0x9D89, 0xEA48, 0x9D87, 0xEA49, 0x9DAB, 0xEA4A, 0x9D6F, - 0xEA4B, 0x9D7A, 0xEA4C, 0x9D9A, 0xEA4D, 0x9DA4, 0xEA4E, 0x9DA9, - 0xEA4F, 0x9DB2, 0xEA50, 0x9DC4, 0xEA51, 0x9DC1, 0xEA52, 0x9DBB, - 0xEA53, 0x9DB8, 0xEA54, 0x9DBA, 0xEA55, 0x9DC6, 0xEA56, 0x9DCF, - 0xEA57, 0x9DC2, 0xEA58, 0x9DD9, 0xEA59, 0x9DD3, 0xEA5A, 0x9DF8, - 0xEA5B, 0x9DE6, 0xEA5C, 0x9DED, 0xEA5D, 0x9DEF, 0xEA5E, 0x9DFD, - 0xEA5F, 0x9E1A, 0xEA60, 0x9E1B, 0xEA61, 0x9E1E, 0xEA62, 0x9E75, - 0xEA63, 0x9E79, 0xEA64, 0x9E7D, 0xEA65, 0x9E81, 0xEA66, 0x9E88, - 0xEA67, 0x9E8B, 0xEA68, 0x9E8C, 0xEA69, 0x9E92, 0xEA6A, 0x9E95, - 0xEA6B, 0x9E91, 0xEA6C, 0x9E9D, 0xEA6D, 0x9EA5, 0xEA6E, 0x9EA9, - 0xEA6F, 0x9EB8, 0xEA70, 0x9EAA, 0xEA71, 0x9EAD, 0xEA72, 0x9761, - 0xEA73, 0x9ECC, 0xEA74, 0x9ECE, 0xEA75, 0x9ECF, 0xEA76, 0x9ED0, - 0xEA77, 0x9ED4, 0xEA78, 0x9EDC, 0xEA79, 0x9EDE, 0xEA7A, 0x9EDD, - 0xEA7B, 0x9EE0, 0xEA7C, 0x9EE5, 0xEA7D, 0x9EE8, 0xEA7E, 0x9EEF, - 0xEA80, 0x9EF4, 0xEA81, 0x9EF6, 0xEA82, 0x9EF7, 0xEA83, 0x9EF9, - 0xEA84, 0x9EFB, 0xEA85, 0x9EFC, 0xEA86, 0x9EFD, 0xEA87, 0x9F07, - 0xEA88, 0x9F08, 0xEA89, 0x76B7, 0xEA8A, 0x9F15, 0xEA8B, 0x9F21, - 0xEA8C, 0x9F2C, 0xEA8D, 0x9F3E, 0xEA8E, 0x9F4A, 0xEA8F, 0x9F52, - 0xEA90, 0x9F54, 0xEA91, 0x9F63, 0xEA92, 0x9F5F, 0xEA93, 0x9F60, - 0xEA94, 0x9F61, 0xEA95, 0x9F66, 0xEA96, 0x9F67, 0xEA97, 0x9F6C, - 0xEA98, 0x9F6A, 0xEA99, 0x9F77, 0xEA9A, 0x9F72, 0xEA9B, 0x9F76, - 0xEA9C, 0x9F95, 0xEA9D, 0x9F9C, 0xEA9E, 0x9FA0, 0xEA9F, 0x582F, - 0xEAA0, 0x69C7, 0xEAA1, 0x9059, 0xEAA2, 0x7464, 0xEAA3, 0x51DC, - 0xEAA4, 0x7199, 0xFA40, 0x2170, 0xFA41, 0x2171, 0xFA42, 0x2172, - 0xFA43, 0x2173, 0xFA44, 0x2174, 0xFA45, 0x2175, 0xFA46, 0x2176, - 0xFA47, 0x2177, 0xFA48, 0x2178, 0xFA49, 0x2179, 0xFA55, 0xFFE4, - 0xFA56, 0xFF07, 0xFA57, 0xFF02, 0xFA5C, 0x7E8A, 0xFA5D, 0x891C, - 0xFA5E, 0x9348, 0xFA5F, 0x9288, 0xFA60, 0x84DC, 0xFA61, 0x4FC9, - 0xFA62, 0x70BB, 0xFA63, 0x6631, 0xFA64, 0x68C8, 0xFA65, 0x92F9, - 0xFA66, 0x66FB, 0xFA67, 0x5F45, 0xFA68, 0x4E28, 0xFA69, 0x4EE1, - 0xFA6A, 0x4EFC, 0xFA6B, 0x4F00, 0xFA6C, 0x4F03, 0xFA6D, 0x4F39, - 0xFA6E, 0x4F56, 0xFA6F, 0x4F92, 0xFA70, 0x4F8A, 0xFA71, 0x4F9A, - 0xFA72, 0x4F94, 0xFA73, 0x4FCD, 0xFA74, 0x5040, 0xFA75, 0x5022, - 0xFA76, 0x4FFF, 0xFA77, 0x501E, 0xFA78, 0x5046, 0xFA79, 0x5070, - 0xFA7A, 0x5042, 0xFA7B, 0x5094, 0xFA7C, 0x50F4, 0xFA7D, 0x50D8, - 0xFA7E, 0x514A, 0xFA80, 0x5164, 0xFA81, 0x519D, 0xFA82, 0x51BE, - 0xFA83, 0x51EC, 0xFA84, 0x5215, 0xFA85, 0x529C, 0xFA86, 0x52A6, - 0xFA87, 0x52C0, 0xFA88, 0x52DB, 0xFA89, 0x5300, 0xFA8A, 0x5307, - 0xFA8B, 0x5324, 0xFA8C, 0x5372, 0xFA8D, 0x5393, 0xFA8E, 0x53B2, - 0xFA8F, 0x53DD, 0xFA90, 0xFA0E, 0xFA91, 0x549C, 0xFA92, 0x548A, - 0xFA93, 0x54A9, 0xFA94, 0x54FF, 0xFA95, 0x5586, 0xFA96, 0x5759, - 0xFA97, 0x5765, 0xFA98, 0x57AC, 0xFA99, 0x57C8, 0xFA9A, 0x57C7, - 0xFA9B, 0xFA0F, 0xFA9C, 0xFA10, 0xFA9D, 0x589E, 0xFA9E, 0x58B2, - 0xFA9F, 0x590B, 0xFAA0, 0x5953, 0xFAA1, 0x595B, 0xFAA2, 0x595D, - 0xFAA3, 0x5963, 0xFAA4, 0x59A4, 0xFAA5, 0x59BA, 0xFAA6, 0x5B56, - 0xFAA7, 0x5BC0, 0xFAA8, 0x752F, 0xFAA9, 0x5BD8, 0xFAAA, 0x5BEC, - 0xFAAB, 0x5C1E, 0xFAAC, 0x5CA6, 0xFAAD, 0x5CBA, 0xFAAE, 0x5CF5, - 0xFAAF, 0x5D27, 0xFAB0, 0x5D53, 0xFAB1, 0xFA11, 0xFAB2, 0x5D42, - 0xFAB3, 0x5D6D, 0xFAB4, 0x5DB8, 0xFAB5, 0x5DB9, 0xFAB6, 0x5DD0, - 0xFAB7, 0x5F21, 0xFAB8, 0x5F34, 0xFAB9, 0x5F67, 0xFABA, 0x5FB7, - 0xFABB, 0x5FDE, 0xFABC, 0x605D, 0xFABD, 0x6085, 0xFABE, 0x608A, - 0xFABF, 0x60DE, 0xFAC0, 0x60D5, 0xFAC1, 0x6120, 0xFAC2, 0x60F2, - 0xFAC3, 0x6111, 0xFAC4, 0x6137, 0xFAC5, 0x6130, 0xFAC6, 0x6198, - 0xFAC7, 0x6213, 0xFAC8, 0x62A6, 0xFAC9, 0x63F5, 0xFACA, 0x6460, - 0xFACB, 0x649D, 0xFACC, 0x64CE, 0xFACD, 0x654E, 0xFACE, 0x6600, - 0xFACF, 0x6615, 0xFAD0, 0x663B, 0xFAD1, 0x6609, 0xFAD2, 0x662E, - 0xFAD3, 0x661E, 0xFAD4, 0x6624, 0xFAD5, 0x6665, 0xFAD6, 0x6657, - 0xFAD7, 0x6659, 0xFAD8, 0xFA12, 0xFAD9, 0x6673, 0xFADA, 0x6699, - 0xFADB, 0x66A0, 0xFADC, 0x66B2, 0xFADD, 0x66BF, 0xFADE, 0x66FA, - 0xFADF, 0x670E, 0xFAE0, 0xF929, 0xFAE1, 0x6766, 0xFAE2, 0x67BB, - 0xFAE3, 0x6852, 0xFAE4, 0x67C0, 0xFAE5, 0x6801, 0xFAE6, 0x6844, - 0xFAE7, 0x68CF, 0xFAE8, 0xFA13, 0xFAE9, 0x6968, 0xFAEA, 0xFA14, - 0xFAEB, 0x6998, 0xFAEC, 0x69E2, 0xFAED, 0x6A30, 0xFAEE, 0x6A6B, - 0xFAEF, 0x6A46, 0xFAF0, 0x6A73, 0xFAF1, 0x6A7E, 0xFAF2, 0x6AE2, - 0xFAF3, 0x6AE4, 0xFAF4, 0x6BD6, 0xFAF5, 0x6C3F, 0xFAF6, 0x6C5C, - 0xFAF7, 0x6C86, 0xFAF8, 0x6C6F, 0xFAF9, 0x6CDA, 0xFAFA, 0x6D04, - 0xFAFB, 0x6D87, 0xFAFC, 0x6D6F, 0xFB40, 0x6D96, 0xFB41, 0x6DAC, - 0xFB42, 0x6DCF, 0xFB43, 0x6DF8, 0xFB44, 0x6DF2, 0xFB45, 0x6DFC, - 0xFB46, 0x6E39, 0xFB47, 0x6E5C, 0xFB48, 0x6E27, 0xFB49, 0x6E3C, - 0xFB4A, 0x6EBF, 0xFB4B, 0x6F88, 0xFB4C, 0x6FB5, 0xFB4D, 0x6FF5, - 0xFB4E, 0x7005, 0xFB4F, 0x7007, 0xFB50, 0x7028, 0xFB51, 0x7085, - 0xFB52, 0x70AB, 0xFB53, 0x710F, 0xFB54, 0x7104, 0xFB55, 0x715C, - 0xFB56, 0x7146, 0xFB57, 0x7147, 0xFB58, 0xFA15, 0xFB59, 0x71C1, - 0xFB5A, 0x71FE, 0xFB5B, 0x72B1, 0xFB5C, 0x72BE, 0xFB5D, 0x7324, - 0xFB5E, 0xFA16, 0xFB5F, 0x7377, 0xFB60, 0x73BD, 0xFB61, 0x73C9, - 0xFB62, 0x73D6, 0xFB63, 0x73E3, 0xFB64, 0x73D2, 0xFB65, 0x7407, - 0xFB66, 0x73F5, 0xFB67, 0x7426, 0xFB68, 0x742A, 0xFB69, 0x7429, - 0xFB6A, 0x742E, 0xFB6B, 0x7462, 0xFB6C, 0x7489, 0xFB6D, 0x749F, - 0xFB6E, 0x7501, 0xFB6F, 0x756F, 0xFB70, 0x7682, 0xFB71, 0x769C, - 0xFB72, 0x769E, 0xFB73, 0x769B, 0xFB74, 0x76A6, 0xFB75, 0xFA17, - 0xFB76, 0x7746, 0xFB77, 0x52AF, 0xFB78, 0x7821, 0xFB79, 0x784E, - 0xFB7A, 0x7864, 0xFB7B, 0x787A, 0xFB7C, 0x7930, 0xFB7D, 0xFA18, - 0xFB7E, 0xFA19, 0xFB80, 0xFA1A, 0xFB81, 0x7994, 0xFB82, 0xFA1B, - 0xFB83, 0x799B, 0xFB84, 0x7AD1, 0xFB85, 0x7AE7, 0xFB86, 0xFA1C, - 0xFB87, 0x7AEB, 0xFB88, 0x7B9E, 0xFB89, 0xFA1D, 0xFB8A, 0x7D48, - 0xFB8B, 0x7D5C, 0xFB8C, 0x7DB7, 0xFB8D, 0x7DA0, 0xFB8E, 0x7DD6, - 0xFB8F, 0x7E52, 0xFB90, 0x7F47, 0xFB91, 0x7FA1, 0xFB92, 0xFA1E, - 0xFB93, 0x8301, 0xFB94, 0x8362, 0xFB95, 0x837F, 0xFB96, 0x83C7, - 0xFB97, 0x83F6, 0xFB98, 0x8448, 0xFB99, 0x84B4, 0xFB9A, 0x8553, - 0xFB9B, 0x8559, 0xFB9C, 0x856B, 0xFB9D, 0xFA1F, 0xFB9E, 0x85B0, - 0xFB9F, 0xFA20, 0xFBA0, 0xFA21, 0xFBA1, 0x8807, 0xFBA2, 0x88F5, - 0xFBA3, 0x8A12, 0xFBA4, 0x8A37, 0xFBA5, 0x8A79, 0xFBA6, 0x8AA7, - 0xFBA7, 0x8ABE, 0xFBA8, 0x8ADF, 0xFBA9, 0xFA22, 0xFBAA, 0x8AF6, - 0xFBAB, 0x8B53, 0xFBAC, 0x8B7F, 0xFBAD, 0x8CF0, 0xFBAE, 0x8CF4, - 0xFBAF, 0x8D12, 0xFBB0, 0x8D76, 0xFBB1, 0xFA23, 0xFBB2, 0x8ECF, - 0xFBB3, 0xFA24, 0xFBB4, 0xFA25, 0xFBB5, 0x9067, 0xFBB6, 0x90DE, - 0xFBB7, 0xFA26, 0xFBB8, 0x9115, 0xFBB9, 0x9127, 0xFBBA, 0x91DA, - 0xFBBB, 0x91D7, 0xFBBC, 0x91DE, 0xFBBD, 0x91ED, 0xFBBE, 0x91EE, - 0xFBBF, 0x91E4, 0xFBC0, 0x91E5, 0xFBC1, 0x9206, 0xFBC2, 0x9210, - 0xFBC3, 0x920A, 0xFBC4, 0x923A, 0xFBC5, 0x9240, 0xFBC6, 0x923C, - 0xFBC7, 0x924E, 0xFBC8, 0x9259, 0xFBC9, 0x9251, 0xFBCA, 0x9239, - 0xFBCB, 0x9267, 0xFBCC, 0x92A7, 0xFBCD, 0x9277, 0xFBCE, 0x9278, - 0xFBCF, 0x92E7, 0xFBD0, 0x92D7, 0xFBD1, 0x92D9, 0xFBD2, 0x92D0, - 0xFBD3, 0xFA27, 0xFBD4, 0x92D5, 0xFBD5, 0x92E0, 0xFBD6, 0x92D3, - 0xFBD7, 0x9325, 0xFBD8, 0x9321, 0xFBD9, 0x92FB, 0xFBDA, 0xFA28, - 0xFBDB, 0x931E, 0xFBDC, 0x92FF, 0xFBDD, 0x931D, 0xFBDE, 0x9302, - 0xFBDF, 0x9370, 0xFBE0, 0x9357, 0xFBE1, 0x93A4, 0xFBE2, 0x93C6, - 0xFBE3, 0x93DE, 0xFBE4, 0x93F8, 0xFBE5, 0x9431, 0xFBE6, 0x9445, - 0xFBE7, 0x9448, 0xFBE8, 0x9592, 0xFBE9, 0xF9DC, 0xFBEA, 0xFA29, - 0xFBEB, 0x969D, 0xFBEC, 0x96AF, 0xFBED, 0x9733, 0xFBEE, 0x973B, - 0xFBEF, 0x9743, 0xFBF0, 0x974D, 0xFBF1, 0x974F, 0xFBF2, 0x9751, - 0xFBF3, 0x9755, 0xFBF4, 0x9857, 0xFBF5, 0x9865, 0xFBF6, 0xFA2A, - 0xFBF7, 0xFA2B, 0xFBF8, 0x9927, 0xFBF9, 0xFA2C, 0xFBFA, 0x999E, - 0xFBFB, 0x9A4E, 0xFBFC, 0x9AD9, 0xFC40, 0x9ADC, 0xFC41, 0x9B75, - 0xFC42, 0x9B72, 0xFC43, 0x9B8F, 0xFC44, 0x9BB1, 0xFC45, 0x9BBB, - 0xFC46, 0x9C00, 0xFC47, 0x9D70, 0xFC48, 0x9D6B, 0xFC49, 0xFA2D, - 0xFC4A, 0x9E19, 0xFC4B, 0x9ED1, 0, 0 + 0x8392, 0x30F2, 0x8393, 0x30F3, 0x8394, 0x30F4, 0x8395, 0x30F5, + 0x8396, 0x30F6, 0x839F, 0x0391, 0x83A0, 0x0392, 0x83A1, 0x0393, + 0x83A2, 0x0394, 0x83A3, 0x0395, 0x83A4, 0x0396, 0x83A5, 0x0397, + 0x83A6, 0x0398, 0x83A7, 0x0399, 0x83A8, 0x039A, 0x83A9, 0x039B, + 0x83AA, 0x039C, 0x83AB, 0x039D, 0x83AC, 0x039E, 0x83AD, 0x039F, + 0x83AE, 0x03A0, 0x83AF, 0x03A1, 0x83B0, 0x03A3, 0x83B1, 0x03A4, + 0x83B2, 0x03A5, 0x83B3, 0x03A6, 0x83B4, 0x03A7, 0x83B5, 0x03A8, + 0x83B6, 0x03A9, 0x83BF, 0x03B1, 0x83C0, 0x03B2, 0x83C1, 0x03B3, + 0x83C2, 0x03B4, 0x83C3, 0x03B5, 0x83C4, 0x03B6, 0x83C5, 0x03B7, + 0x83C6, 0x03B8, 0x83C7, 0x03B9, 0x83C8, 0x03BA, 0x83C9, 0x03BB, + 0x83CA, 0x03BC, 0x83CB, 0x03BD, 0x83CC, 0x03BE, 0x83CD, 0x03BF, + 0x83CE, 0x03C0, 0x83CF, 0x03C1, 0x83D0, 0x03C3, 0x83D1, 0x03C4, + 0x83D2, 0x03C5, 0x83D3, 0x03C6, 0x83D4, 0x03C7, 0x83D5, 0x03C8, + 0x83D6, 0x03C9, 0x8440, 0x0410, 0x8441, 0x0411, 0x8442, 0x0412, + 0x8443, 0x0413, 0x8444, 0x0414, 0x8445, 0x0415, 0x8446, 0x0401, + 0x8447, 0x0416, 0x8448, 0x0417, 0x8449, 0x0418, 0x844A, 0x0419, + 0x844B, 0x041A, 0x844C, 0x041B, 0x844D, 0x041C, 0x844E, 0x041D, + 0x844F, 0x041E, 0x8450, 0x041F, 0x8451, 0x0420, 0x8452, 0x0421, + 0x8453, 0x0422, 0x8454, 0x0423, 0x8455, 0x0424, 0x8456, 0x0425, + 0x8457, 0x0426, 0x8458, 0x0427, 0x8459, 0x0428, 0x845A, 0x0429, + 0x845B, 0x042A, 0x845C, 0x042B, 0x845D, 0x042C, 0x845E, 0x042D, + 0x845F, 0x042E, 0x8460, 0x042F, 0x8470, 0x0430, 0x8471, 0x0431, + 0x8472, 0x0432, 0x8473, 0x0433, 0x8474, 0x0434, 0x8475, 0x0435, + 0x8476, 0x0451, 0x8477, 0x0436, 0x8478, 0x0437, 0x8479, 0x0438, + 0x847A, 0x0439, 0x847B, 0x043A, 0x847C, 0x043B, 0x847D, 0x043C, + 0x847E, 0x043D, 0x8480, 0x043E, 0x8481, 0x043F, 0x8482, 0x0440, + 0x8483, 0x0441, 0x8484, 0x0442, 0x8485, 0x0443, 0x8486, 0x0444, + 0x8487, 0x0445, 0x8488, 0x0446, 0x8489, 0x0447, 0x848A, 0x0448, + 0x848B, 0x0449, 0x848C, 0x044A, 0x848D, 0x044B, 0x848E, 0x044C, + 0x848F, 0x044D, 0x8490, 0x044E, 0x8491, 0x044F, 0x849F, 0x2500, + 0x84A0, 0x2502, 0x84A1, 0x250C, 0x84A2, 0x2510, 0x84A3, 0x2518, + 0x84A4, 0x2514, 0x84A5, 0x251C, 0x84A6, 0x252C, 0x84A7, 0x2524, + 0x84A8, 0x2534, 0x84A9, 0x253C, 0x84AA, 0x2501, 0x84AB, 0x2503, + 0x84AC, 0x250F, 0x84AD, 0x2513, 0x84AE, 0x251B, 0x84AF, 0x2517, + 0x84B0, 0x2523, 0x84B1, 0x2533, 0x84B2, 0x252B, 0x84B3, 0x253B, + 0x84B4, 0x254B, 0x84B5, 0x2520, 0x84B6, 0x252F, 0x84B7, 0x2528, + 0x84B8, 0x2537, 0x84B9, 0x253F, 0x84BA, 0x251D, 0x84BB, 0x2530, + 0x84BC, 0x2525, 0x84BD, 0x2538, 0x84BE, 0x2542, 0x8740, 0x2460, + 0x8741, 0x2461, 0x8742, 0x2462, 0x8743, 0x2463, 0x8744, 0x2464, + 0x8745, 0x2465, 0x8746, 0x2466, 0x8747, 0x2467, 0x8748, 0x2468, + 0x8749, 0x2469, 0x874A, 0x246A, 0x874B, 0x246B, 0x874C, 0x246C, + 0x874D, 0x246D, 0x874E, 0x246E, 0x874F, 0x246F, 0x8750, 0x2470, + 0x8751, 0x2471, 0x8752, 0x2472, 0x8753, 0x2473, 0x8754, 0x2160, + 0x8755, 0x2161, 0x8756, 0x2162, 0x8757, 0x2163, 0x8758, 0x2164, + 0x8759, 0x2165, 0x875A, 0x2166, 0x875B, 0x2167, 0x875C, 0x2168, + 0x875D, 0x2169, 0x875F, 0x3349, 0x8760, 0x3314, 0x8761, 0x3322, + 0x8762, 0x334D, 0x8763, 0x3318, 0x8764, 0x3327, 0x8765, 0x3303, + 0x8766, 0x3336, 0x8767, 0x3351, 0x8768, 0x3357, 0x8769, 0x330D, + 0x876A, 0x3326, 0x876B, 0x3323, 0x876C, 0x332B, 0x876D, 0x334A, + 0x876E, 0x333B, 0x876F, 0x339C, 0x8770, 0x339D, 0x8771, 0x339E, + 0x8772, 0x338E, 0x8773, 0x338F, 0x8774, 0x33C4, 0x8775, 0x33A1, + 0x877E, 0x337B, 0x8780, 0x301D, 0x8781, 0x301F, 0x8782, 0x2116, + 0x8783, 0x33CD, 0x8784, 0x2121, 0x8785, 0x32A4, 0x8786, 0x32A5, + 0x8787, 0x32A6, 0x8788, 0x32A7, 0x8789, 0x32A8, 0x878A, 0x3231, + 0x878B, 0x3232, 0x878C, 0x3239, 0x878D, 0x337E, 0x878E, 0x337D, + 0x878F, 0x337C, 0x8793, 0x222E, 0x8794, 0x2211, 0x8798, 0x221F, + 0x8799, 0x22BF, 0x889F, 0x4E9C, 0x88A0, 0x5516, 0x88A1, 0x5A03, + 0x88A2, 0x963F, 0x88A3, 0x54C0, 0x88A4, 0x611B, 0x88A5, 0x6328, + 0x88A6, 0x59F6, 0x88A7, 0x9022, 0x88A8, 0x8475, 0x88A9, 0x831C, + 0x88AA, 0x7A50, 0x88AB, 0x60AA, 0x88AC, 0x63E1, 0x88AD, 0x6E25, + 0x88AE, 0x65ED, 0x88AF, 0x8466, 0x88B0, 0x82A6, 0x88B1, 0x9BF5, + 0x88B2, 0x6893, 0x88B3, 0x5727, 0x88B4, 0x65A1, 0x88B5, 0x6271, + 0x88B6, 0x5B9B, 0x88B7, 0x59D0, 0x88B8, 0x867B, 0x88B9, 0x98F4, + 0x88BA, 0x7D62, 0x88BB, 0x7DBE, 0x88BC, 0x9B8E, 0x88BD, 0x6216, + 0x88BE, 0x7C9F, 0x88BF, 0x88B7, 0x88C0, 0x5B89, 0x88C1, 0x5EB5, + 0x88C2, 0x6309, 0x88C3, 0x6697, 0x88C4, 0x6848, 0x88C5, 0x95C7, + 0x88C6, 0x978D, 0x88C7, 0x674F, 0x88C8, 0x4EE5, 0x88C9, 0x4F0A, + 0x88CA, 0x4F4D, 0x88CB, 0x4F9D, 0x88CC, 0x5049, 0x88CD, 0x56F2, + 0x88CE, 0x5937, 0x88CF, 0x59D4, 0x88D0, 0x5A01, 0x88D1, 0x5C09, + 0x88D2, 0x60DF, 0x88D3, 0x610F, 0x88D4, 0x6170, 0x88D5, 0x6613, + 0x88D6, 0x6905, 0x88D7, 0x70BA, 0x88D8, 0x754F, 0x88D9, 0x7570, + 0x88DA, 0x79FB, 0x88DB, 0x7DAD, 0x88DC, 0x7DEF, 0x88DD, 0x80C3, + 0x88DE, 0x840E, 0x88DF, 0x8863, 0x88E0, 0x8B02, 0x88E1, 0x9055, + 0x88E2, 0x907A, 0x88E3, 0x533B, 0x88E4, 0x4E95, 0x88E5, 0x4EA5, + 0x88E6, 0x57DF, 0x88E7, 0x80B2, 0x88E8, 0x90C1, 0x88E9, 0x78EF, + 0x88EA, 0x4E00, 0x88EB, 0x58F1, 0x88EC, 0x6EA2, 0x88ED, 0x9038, + 0x88EE, 0x7A32, 0x88EF, 0x8328, 0x88F0, 0x828B, 0x88F1, 0x9C2F, + 0x88F2, 0x5141, 0x88F3, 0x5370, 0x88F4, 0x54BD, 0x88F5, 0x54E1, + 0x88F6, 0x56E0, 0x88F7, 0x59FB, 0x88F8, 0x5F15, 0x88F9, 0x98F2, + 0x88FA, 0x6DEB, 0x88FB, 0x80E4, 0x88FC, 0x852D, 0x8940, 0x9662, + 0x8941, 0x9670, 0x8942, 0x96A0, 0x8943, 0x97FB, 0x8944, 0x540B, + 0x8945, 0x53F3, 0x8946, 0x5B87, 0x8947, 0x70CF, 0x8948, 0x7FBD, + 0x8949, 0x8FC2, 0x894A, 0x96E8, 0x894B, 0x536F, 0x894C, 0x9D5C, + 0x894D, 0x7ABA, 0x894E, 0x4E11, 0x894F, 0x7893, 0x8950, 0x81FC, + 0x8951, 0x6E26, 0x8952, 0x5618, 0x8953, 0x5504, 0x8954, 0x6B1D, + 0x8955, 0x851A, 0x8956, 0x9C3B, 0x8957, 0x59E5, 0x8958, 0x53A9, + 0x8959, 0x6D66, 0x895A, 0x74DC, 0x895B, 0x958F, 0x895C, 0x5642, + 0x895D, 0x4E91, 0x895E, 0x904B, 0x895F, 0x96F2, 0x8960, 0x834F, + 0x8961, 0x990C, 0x8962, 0x53E1, 0x8963, 0x55B6, 0x8964, 0x5B30, + 0x8965, 0x5F71, 0x8966, 0x6620, 0x8967, 0x66F3, 0x8968, 0x6804, + 0x8969, 0x6C38, 0x896A, 0x6CF3, 0x896B, 0x6D29, 0x896C, 0x745B, + 0x896D, 0x76C8, 0x896E, 0x7A4E, 0x896F, 0x9834, 0x8970, 0x82F1, + 0x8971, 0x885B, 0x8972, 0x8A60, 0x8973, 0x92ED, 0x8974, 0x6DB2, + 0x8975, 0x75AB, 0x8976, 0x76CA, 0x8977, 0x99C5, 0x8978, 0x60A6, + 0x8979, 0x8B01, 0x897A, 0x8D8A, 0x897B, 0x95B2, 0x897C, 0x698E, + 0x897D, 0x53AD, 0x897E, 0x5186, 0x8980, 0x5712, 0x8981, 0x5830, + 0x8982, 0x5944, 0x8983, 0x5BB4, 0x8984, 0x5EF6, 0x8985, 0x6028, + 0x8986, 0x63A9, 0x8987, 0x63F4, 0x8988, 0x6CBF, 0x8989, 0x6F14, + 0x898A, 0x708E, 0x898B, 0x7114, 0x898C, 0x7159, 0x898D, 0x71D5, + 0x898E, 0x733F, 0x898F, 0x7E01, 0x8990, 0x8276, 0x8991, 0x82D1, + 0x8992, 0x8597, 0x8993, 0x9060, 0x8994, 0x925B, 0x8995, 0x9D1B, + 0x8996, 0x5869, 0x8997, 0x65BC, 0x8998, 0x6C5A, 0x8999, 0x7525, + 0x899A, 0x51F9, 0x899B, 0x592E, 0x899C, 0x5965, 0x899D, 0x5F80, + 0x899E, 0x5FDC, 0x899F, 0x62BC, 0x89A0, 0x65FA, 0x89A1, 0x6A2A, + 0x89A2, 0x6B27, 0x89A3, 0x6BB4, 0x89A4, 0x738B, 0x89A5, 0x7FC1, + 0x89A6, 0x8956, 0x89A7, 0x9D2C, 0x89A8, 0x9D0E, 0x89A9, 0x9EC4, + 0x89AA, 0x5CA1, 0x89AB, 0x6C96, 0x89AC, 0x837B, 0x89AD, 0x5104, + 0x89AE, 0x5C4B, 0x89AF, 0x61B6, 0x89B0, 0x81C6, 0x89B1, 0x6876, + 0x89B2, 0x7261, 0x89B3, 0x4E59, 0x89B4, 0x4FFA, 0x89B5, 0x5378, + 0x89B6, 0x6069, 0x89B7, 0x6E29, 0x89B8, 0x7A4F, 0x89B9, 0x97F3, + 0x89BA, 0x4E0B, 0x89BB, 0x5316, 0x89BC, 0x4EEE, 0x89BD, 0x4F55, + 0x89BE, 0x4F3D, 0x89BF, 0x4FA1, 0x89C0, 0x4F73, 0x89C1, 0x52A0, + 0x89C2, 0x53EF, 0x89C3, 0x5609, 0x89C4, 0x590F, 0x89C5, 0x5AC1, + 0x89C6, 0x5BB6, 0x89C7, 0x5BE1, 0x89C8, 0x79D1, 0x89C9, 0x6687, + 0x89CA, 0x679C, 0x89CB, 0x67B6, 0x89CC, 0x6B4C, 0x89CD, 0x6CB3, + 0x89CE, 0x706B, 0x89CF, 0x73C2, 0x89D0, 0x798D, 0x89D1, 0x79BE, + 0x89D2, 0x7A3C, 0x89D3, 0x7B87, 0x89D4, 0x82B1, 0x89D5, 0x82DB, + 0x89D6, 0x8304, 0x89D7, 0x8377, 0x89D8, 0x83EF, 0x89D9, 0x83D3, + 0x89DA, 0x8766, 0x89DB, 0x8AB2, 0x89DC, 0x5629, 0x89DD, 0x8CA8, + 0x89DE, 0x8FE6, 0x89DF, 0x904E, 0x89E0, 0x971E, 0x89E1, 0x868A, + 0x89E2, 0x4FC4, 0x89E3, 0x5CE8, 0x89E4, 0x6211, 0x89E5, 0x7259, + 0x89E6, 0x753B, 0x89E7, 0x81E5, 0x89E8, 0x82BD, 0x89E9, 0x86FE, + 0x89EA, 0x8CC0, 0x89EB, 0x96C5, 0x89EC, 0x9913, 0x89ED, 0x99D5, + 0x89EE, 0x4ECB, 0x89EF, 0x4F1A, 0x89F0, 0x89E3, 0x89F1, 0x56DE, + 0x89F2, 0x584A, 0x89F3, 0x58CA, 0x89F4, 0x5EFB, 0x89F5, 0x5FEB, + 0x89F6, 0x602A, 0x89F7, 0x6094, 0x89F8, 0x6062, 0x89F9, 0x61D0, + 0x89FA, 0x6212, 0x89FB, 0x62D0, 0x89FC, 0x6539, 0x8A40, 0x9B41, + 0x8A41, 0x6666, 0x8A42, 0x68B0, 0x8A43, 0x6D77, 0x8A44, 0x7070, + 0x8A45, 0x754C, 0x8A46, 0x7686, 0x8A47, 0x7D75, 0x8A48, 0x82A5, + 0x8A49, 0x87F9, 0x8A4A, 0x958B, 0x8A4B, 0x968E, 0x8A4C, 0x8C9D, + 0x8A4D, 0x51F1, 0x8A4E, 0x52BE, 0x8A4F, 0x5916, 0x8A50, 0x54B3, + 0x8A51, 0x5BB3, 0x8A52, 0x5D16, 0x8A53, 0x6168, 0x8A54, 0x6982, + 0x8A55, 0x6DAF, 0x8A56, 0x788D, 0x8A57, 0x84CB, 0x8A58, 0x8857, + 0x8A59, 0x8A72, 0x8A5A, 0x93A7, 0x8A5B, 0x9AB8, 0x8A5C, 0x6D6C, + 0x8A5D, 0x99A8, 0x8A5E, 0x86D9, 0x8A5F, 0x57A3, 0x8A60, 0x67FF, + 0x8A61, 0x86CE, 0x8A62, 0x920E, 0x8A63, 0x5283, 0x8A64, 0x5687, + 0x8A65, 0x5404, 0x8A66, 0x5ED3, 0x8A67, 0x62E1, 0x8A68, 0x64B9, + 0x8A69, 0x683C, 0x8A6A, 0x6838, 0x8A6B, 0x6BBB, 0x8A6C, 0x7372, + 0x8A6D, 0x78BA, 0x8A6E, 0x7A6B, 0x8A6F, 0x899A, 0x8A70, 0x89D2, + 0x8A71, 0x8D6B, 0x8A72, 0x8F03, 0x8A73, 0x90ED, 0x8A74, 0x95A3, + 0x8A75, 0x9694, 0x8A76, 0x9769, 0x8A77, 0x5B66, 0x8A78, 0x5CB3, + 0x8A79, 0x697D, 0x8A7A, 0x984D, 0x8A7B, 0x984E, 0x8A7C, 0x639B, + 0x8A7D, 0x7B20, 0x8A7E, 0x6A2B, 0x8A80, 0x6A7F, 0x8A81, 0x68B6, + 0x8A82, 0x9C0D, 0x8A83, 0x6F5F, 0x8A84, 0x5272, 0x8A85, 0x559D, + 0x8A86, 0x6070, 0x8A87, 0x62EC, 0x8A88, 0x6D3B, 0x8A89, 0x6E07, + 0x8A8A, 0x6ED1, 0x8A8B, 0x845B, 0x8A8C, 0x8910, 0x8A8D, 0x8F44, + 0x8A8E, 0x4E14, 0x8A8F, 0x9C39, 0x8A90, 0x53F6, 0x8A91, 0x691B, + 0x8A92, 0x6A3A, 0x8A93, 0x9784, 0x8A94, 0x682A, 0x8A95, 0x515C, + 0x8A96, 0x7AC3, 0x8A97, 0x84B2, 0x8A98, 0x91DC, 0x8A99, 0x938C, + 0x8A9A, 0x565B, 0x8A9B, 0x9D28, 0x8A9C, 0x6822, 0x8A9D, 0x8305, + 0x8A9E, 0x8431, 0x8A9F, 0x7CA5, 0x8AA0, 0x5208, 0x8AA1, 0x82C5, + 0x8AA2, 0x74E6, 0x8AA3, 0x4E7E, 0x8AA4, 0x4F83, 0x8AA5, 0x51A0, + 0x8AA6, 0x5BD2, 0x8AA7, 0x520A, 0x8AA8, 0x52D8, 0x8AA9, 0x52E7, + 0x8AAA, 0x5DFB, 0x8AAB, 0x559A, 0x8AAC, 0x582A, 0x8AAD, 0x59E6, + 0x8AAE, 0x5B8C, 0x8AAF, 0x5B98, 0x8AB0, 0x5BDB, 0x8AB1, 0x5E72, + 0x8AB2, 0x5E79, 0x8AB3, 0x60A3, 0x8AB4, 0x611F, 0x8AB5, 0x6163, + 0x8AB6, 0x61BE, 0x8AB7, 0x63DB, 0x8AB8, 0x6562, 0x8AB9, 0x67D1, + 0x8ABA, 0x6853, 0x8ABB, 0x68FA, 0x8ABC, 0x6B3E, 0x8ABD, 0x6B53, + 0x8ABE, 0x6C57, 0x8ABF, 0x6F22, 0x8AC0, 0x6F97, 0x8AC1, 0x6F45, + 0x8AC2, 0x74B0, 0x8AC3, 0x7518, 0x8AC4, 0x76E3, 0x8AC5, 0x770B, + 0x8AC6, 0x7AFF, 0x8AC7, 0x7BA1, 0x8AC8, 0x7C21, 0x8AC9, 0x7DE9, + 0x8ACA, 0x7F36, 0x8ACB, 0x7FF0, 0x8ACC, 0x809D, 0x8ACD, 0x8266, + 0x8ACE, 0x839E, 0x8ACF, 0x89B3, 0x8AD0, 0x8ACC, 0x8AD1, 0x8CAB, + 0x8AD2, 0x9084, 0x8AD3, 0x9451, 0x8AD4, 0x9593, 0x8AD5, 0x9591, + 0x8AD6, 0x95A2, 0x8AD7, 0x9665, 0x8AD8, 0x97D3, 0x8AD9, 0x9928, + 0x8ADA, 0x8218, 0x8ADB, 0x4E38, 0x8ADC, 0x542B, 0x8ADD, 0x5CB8, + 0x8ADE, 0x5DCC, 0x8ADF, 0x73A9, 0x8AE0, 0x764C, 0x8AE1, 0x773C, + 0x8AE2, 0x5CA9, 0x8AE3, 0x7FEB, 0x8AE4, 0x8D0B, 0x8AE5, 0x96C1, + 0x8AE6, 0x9811, 0x8AE7, 0x9854, 0x8AE8, 0x9858, 0x8AE9, 0x4F01, + 0x8AEA, 0x4F0E, 0x8AEB, 0x5371, 0x8AEC, 0x559C, 0x8AED, 0x5668, + 0x8AEE, 0x57FA, 0x8AEF, 0x5947, 0x8AF0, 0x5B09, 0x8AF1, 0x5BC4, + 0x8AF2, 0x5C90, 0x8AF3, 0x5E0C, 0x8AF4, 0x5E7E, 0x8AF5, 0x5FCC, + 0x8AF6, 0x63EE, 0x8AF7, 0x673A, 0x8AF8, 0x65D7, 0x8AF9, 0x65E2, + 0x8AFA, 0x671F, 0x8AFB, 0x68CB, 0x8AFC, 0x68C4, 0x8B40, 0x6A5F, + 0x8B41, 0x5E30, 0x8B42, 0x6BC5, 0x8B43, 0x6C17, 0x8B44, 0x6C7D, + 0x8B45, 0x757F, 0x8B46, 0x7948, 0x8B47, 0x5B63, 0x8B48, 0x7A00, + 0x8B49, 0x7D00, 0x8B4A, 0x5FBD, 0x8B4B, 0x898F, 0x8B4C, 0x8A18, + 0x8B4D, 0x8CB4, 0x8B4E, 0x8D77, 0x8B4F, 0x8ECC, 0x8B50, 0x8F1D, + 0x8B51, 0x98E2, 0x8B52, 0x9A0E, 0x8B53, 0x9B3C, 0x8B54, 0x4E80, + 0x8B55, 0x507D, 0x8B56, 0x5100, 0x8B57, 0x5993, 0x8B58, 0x5B9C, + 0x8B59, 0x622F, 0x8B5A, 0x6280, 0x8B5B, 0x64EC, 0x8B5C, 0x6B3A, + 0x8B5D, 0x72A0, 0x8B5E, 0x7591, 0x8B5F, 0x7947, 0x8B60, 0x7FA9, + 0x8B61, 0x87FB, 0x8B62, 0x8ABC, 0x8B63, 0x8B70, 0x8B64, 0x63AC, + 0x8B65, 0x83CA, 0x8B66, 0x97A0, 0x8B67, 0x5409, 0x8B68, 0x5403, + 0x8B69, 0x55AB, 0x8B6A, 0x6854, 0x8B6B, 0x6A58, 0x8B6C, 0x8A70, + 0x8B6D, 0x7827, 0x8B6E, 0x6775, 0x8B6F, 0x9ECD, 0x8B70, 0x5374, + 0x8B71, 0x5BA2, 0x8B72, 0x811A, 0x8B73, 0x8650, 0x8B74, 0x9006, + 0x8B75, 0x4E18, 0x8B76, 0x4E45, 0x8B77, 0x4EC7, 0x8B78, 0x4F11, + 0x8B79, 0x53CA, 0x8B7A, 0x5438, 0x8B7B, 0x5BAE, 0x8B7C, 0x5F13, + 0x8B7D, 0x6025, 0x8B7E, 0x6551, 0x8B80, 0x673D, 0x8B81, 0x6C42, + 0x8B82, 0x6C72, 0x8B83, 0x6CE3, 0x8B84, 0x7078, 0x8B85, 0x7403, + 0x8B86, 0x7A76, 0x8B87, 0x7AAE, 0x8B88, 0x7B08, 0x8B89, 0x7D1A, + 0x8B8A, 0x7CFE, 0x8B8B, 0x7D66, 0x8B8C, 0x65E7, 0x8B8D, 0x725B, + 0x8B8E, 0x53BB, 0x8B8F, 0x5C45, 0x8B90, 0x5DE8, 0x8B91, 0x62D2, + 0x8B92, 0x62E0, 0x8B93, 0x6319, 0x8B94, 0x6E20, 0x8B95, 0x865A, + 0x8B96, 0x8A31, 0x8B97, 0x8DDD, 0x8B98, 0x92F8, 0x8B99, 0x6F01, + 0x8B9A, 0x79A6, 0x8B9B, 0x9B5A, 0x8B9C, 0x4EA8, 0x8B9D, 0x4EAB, + 0x8B9E, 0x4EAC, 0x8B9F, 0x4F9B, 0x8BA0, 0x4FA0, 0x8BA1, 0x50D1, + 0x8BA2, 0x5147, 0x8BA3, 0x7AF6, 0x8BA4, 0x5171, 0x8BA5, 0x51F6, + 0x8BA6, 0x5354, 0x8BA7, 0x5321, 0x8BA8, 0x537F, 0x8BA9, 0x53EB, + 0x8BAA, 0x55AC, 0x8BAB, 0x5883, 0x8BAC, 0x5CE1, 0x8BAD, 0x5F37, + 0x8BAE, 0x5F4A, 0x8BAF, 0x602F, 0x8BB0, 0x6050, 0x8BB1, 0x606D, + 0x8BB2, 0x631F, 0x8BB3, 0x6559, 0x8BB4, 0x6A4B, 0x8BB5, 0x6CC1, + 0x8BB6, 0x72C2, 0x8BB7, 0x72ED, 0x8BB8, 0x77EF, 0x8BB9, 0x80F8, + 0x8BBA, 0x8105, 0x8BBB, 0x8208, 0x8BBC, 0x854E, 0x8BBD, 0x90F7, + 0x8BBE, 0x93E1, 0x8BBF, 0x97FF, 0x8BC0, 0x9957, 0x8BC1, 0x9A5A, + 0x8BC2, 0x4EF0, 0x8BC3, 0x51DD, 0x8BC4, 0x5C2D, 0x8BC5, 0x6681, + 0x8BC6, 0x696D, 0x8BC7, 0x5C40, 0x8BC8, 0x66F2, 0x8BC9, 0x6975, + 0x8BCA, 0x7389, 0x8BCB, 0x6850, 0x8BCC, 0x7C81, 0x8BCD, 0x50C5, + 0x8BCE, 0x52E4, 0x8BCF, 0x5747, 0x8BD0, 0x5DFE, 0x8BD1, 0x9326, + 0x8BD2, 0x65A4, 0x8BD3, 0x6B23, 0x8BD4, 0x6B3D, 0x8BD5, 0x7434, + 0x8BD6, 0x7981, 0x8BD7, 0x79BD, 0x8BD8, 0x7B4B, 0x8BD9, 0x7DCA, + 0x8BDA, 0x82B9, 0x8BDB, 0x83CC, 0x8BDC, 0x887F, 0x8BDD, 0x895F, + 0x8BDE, 0x8B39, 0x8BDF, 0x8FD1, 0x8BE0, 0x91D1, 0x8BE1, 0x541F, + 0x8BE2, 0x9280, 0x8BE3, 0x4E5D, 0x8BE4, 0x5036, 0x8BE5, 0x53E5, + 0x8BE6, 0x533A, 0x8BE7, 0x72D7, 0x8BE8, 0x7396, 0x8BE9, 0x77E9, + 0x8BEA, 0x82E6, 0x8BEB, 0x8EAF, 0x8BEC, 0x99C6, 0x8BED, 0x99C8, + 0x8BEE, 0x99D2, 0x8BEF, 0x5177, 0x8BF0, 0x611A, 0x8BF1, 0x865E, + 0x8BF2, 0x55B0, 0x8BF3, 0x7A7A, 0x8BF4, 0x5076, 0x8BF5, 0x5BD3, + 0x8BF6, 0x9047, 0x8BF7, 0x9685, 0x8BF8, 0x4E32, 0x8BF9, 0x6ADB, + 0x8BFA, 0x91E7, 0x8BFB, 0x5C51, 0x8BFC, 0x5C48, 0x8C40, 0x6398, + 0x8C41, 0x7A9F, 0x8C42, 0x6C93, 0x8C43, 0x9774, 0x8C44, 0x8F61, + 0x8C45, 0x7AAA, 0x8C46, 0x718A, 0x8C47, 0x9688, 0x8C48, 0x7C82, + 0x8C49, 0x6817, 0x8C4A, 0x7E70, 0x8C4B, 0x6851, 0x8C4C, 0x936C, + 0x8C4D, 0x52F2, 0x8C4E, 0x541B, 0x8C4F, 0x85AB, 0x8C50, 0x8A13, + 0x8C51, 0x7FA4, 0x8C52, 0x8ECD, 0x8C53, 0x90E1, 0x8C54, 0x5366, + 0x8C55, 0x8888, 0x8C56, 0x7941, 0x8C57, 0x4FC2, 0x8C58, 0x50BE, + 0x8C59, 0x5211, 0x8C5A, 0x5144, 0x8C5B, 0x5553, 0x8C5C, 0x572D, + 0x8C5D, 0x73EA, 0x8C5E, 0x578B, 0x8C5F, 0x5951, 0x8C60, 0x5F62, + 0x8C61, 0x5F84, 0x8C62, 0x6075, 0x8C63, 0x6176, 0x8C64, 0x6167, + 0x8C65, 0x61A9, 0x8C66, 0x63B2, 0x8C67, 0x643A, 0x8C68, 0x656C, + 0x8C69, 0x666F, 0x8C6A, 0x6842, 0x8C6B, 0x6E13, 0x8C6C, 0x7566, + 0x8C6D, 0x7A3D, 0x8C6E, 0x7CFB, 0x8C6F, 0x7D4C, 0x8C70, 0x7D99, + 0x8C71, 0x7E4B, 0x8C72, 0x7F6B, 0x8C73, 0x830E, 0x8C74, 0x834A, + 0x8C75, 0x86CD, 0x8C76, 0x8A08, 0x8C77, 0x8A63, 0x8C78, 0x8B66, + 0x8C79, 0x8EFD, 0x8C7A, 0x981A, 0x8C7B, 0x9D8F, 0x8C7C, 0x82B8, + 0x8C7D, 0x8FCE, 0x8C7E, 0x9BE8, 0x8C80, 0x5287, 0x8C81, 0x621F, + 0x8C82, 0x6483, 0x8C83, 0x6FC0, 0x8C84, 0x9699, 0x8C85, 0x6841, + 0x8C86, 0x5091, 0x8C87, 0x6B20, 0x8C88, 0x6C7A, 0x8C89, 0x6F54, + 0x8C8A, 0x7A74, 0x8C8B, 0x7D50, 0x8C8C, 0x8840, 0x8C8D, 0x8A23, + 0x8C8E, 0x6708, 0x8C8F, 0x4EF6, 0x8C90, 0x5039, 0x8C91, 0x5026, + 0x8C92, 0x5065, 0x8C93, 0x517C, 0x8C94, 0x5238, 0x8C95, 0x5263, + 0x8C96, 0x55A7, 0x8C97, 0x570F, 0x8C98, 0x5805, 0x8C99, 0x5ACC, + 0x8C9A, 0x5EFA, 0x8C9B, 0x61B2, 0x8C9C, 0x61F8, 0x8C9D, 0x62F3, + 0x8C9E, 0x6372, 0x8C9F, 0x691C, 0x8CA0, 0x6A29, 0x8CA1, 0x727D, + 0x8CA2, 0x72AC, 0x8CA3, 0x732E, 0x8CA4, 0x7814, 0x8CA5, 0x786F, + 0x8CA6, 0x7D79, 0x8CA7, 0x770C, 0x8CA8, 0x80A9, 0x8CA9, 0x898B, + 0x8CAA, 0x8B19, 0x8CAB, 0x8CE2, 0x8CAC, 0x8ED2, 0x8CAD, 0x9063, + 0x8CAE, 0x9375, 0x8CAF, 0x967A, 0x8CB0, 0x9855, 0x8CB1, 0x9A13, + 0x8CB2, 0x9E78, 0x8CB3, 0x5143, 0x8CB4, 0x539F, 0x8CB5, 0x53B3, + 0x8CB6, 0x5E7B, 0x8CB7, 0x5F26, 0x8CB8, 0x6E1B, 0x8CB9, 0x6E90, + 0x8CBA, 0x7384, 0x8CBB, 0x73FE, 0x8CBC, 0x7D43, 0x8CBD, 0x8237, + 0x8CBE, 0x8A00, 0x8CBF, 0x8AFA, 0x8CC0, 0x9650, 0x8CC1, 0x4E4E, + 0x8CC2, 0x500B, 0x8CC3, 0x53E4, 0x8CC4, 0x547C, 0x8CC5, 0x56FA, + 0x8CC6, 0x59D1, 0x8CC7, 0x5B64, 0x8CC8, 0x5DF1, 0x8CC9, 0x5EAB, + 0x8CCA, 0x5F27, 0x8CCB, 0x6238, 0x8CCC, 0x6545, 0x8CCD, 0x67AF, + 0x8CCE, 0x6E56, 0x8CCF, 0x72D0, 0x8CD0, 0x7CCA, 0x8CD1, 0x88B4, + 0x8CD2, 0x80A1, 0x8CD3, 0x80E1, 0x8CD4, 0x83F0, 0x8CD5, 0x864E, + 0x8CD6, 0x8A87, 0x8CD7, 0x8DE8, 0x8CD8, 0x9237, 0x8CD9, 0x96C7, + 0x8CDA, 0x9867, 0x8CDB, 0x9F13, 0x8CDC, 0x4E94, 0x8CDD, 0x4E92, + 0x8CDE, 0x4F0D, 0x8CDF, 0x5348, 0x8CE0, 0x5449, 0x8CE1, 0x543E, + 0x8CE2, 0x5A2F, 0x8CE3, 0x5F8C, 0x8CE4, 0x5FA1, 0x8CE5, 0x609F, + 0x8CE6, 0x68A7, 0x8CE7, 0x6A8E, 0x8CE8, 0x745A, 0x8CE9, 0x7881, + 0x8CEA, 0x8A9E, 0x8CEB, 0x8AA4, 0x8CEC, 0x8B77, 0x8CED, 0x9190, + 0x8CEE, 0x4E5E, 0x8CEF, 0x9BC9, 0x8CF0, 0x4EA4, 0x8CF1, 0x4F7C, + 0x8CF2, 0x4FAF, 0x8CF3, 0x5019, 0x8CF4, 0x5016, 0x8CF5, 0x5149, + 0x8CF6, 0x516C, 0x8CF7, 0x529F, 0x8CF8, 0x52B9, 0x8CF9, 0x52FE, + 0x8CFA, 0x539A, 0x8CFB, 0x53E3, 0x8CFC, 0x5411, 0x8D40, 0x540E, + 0x8D41, 0x5589, 0x8D42, 0x5751, 0x8D43, 0x57A2, 0x8D44, 0x597D, + 0x8D45, 0x5B54, 0x8D46, 0x5B5D, 0x8D47, 0x5B8F, 0x8D48, 0x5DE5, + 0x8D49, 0x5DE7, 0x8D4A, 0x5DF7, 0x8D4B, 0x5E78, 0x8D4C, 0x5E83, + 0x8D4D, 0x5E9A, 0x8D4E, 0x5EB7, 0x8D4F, 0x5F18, 0x8D50, 0x6052, + 0x8D51, 0x614C, 0x8D52, 0x6297, 0x8D53, 0x62D8, 0x8D54, 0x63A7, + 0x8D55, 0x653B, 0x8D56, 0x6602, 0x8D57, 0x6643, 0x8D58, 0x66F4, + 0x8D59, 0x676D, 0x8D5A, 0x6821, 0x8D5B, 0x6897, 0x8D5C, 0x69CB, + 0x8D5D, 0x6C5F, 0x8D5E, 0x6D2A, 0x8D5F, 0x6D69, 0x8D60, 0x6E2F, + 0x8D61, 0x6E9D, 0x8D62, 0x7532, 0x8D63, 0x7687, 0x8D64, 0x786C, + 0x8D65, 0x7A3F, 0x8D66, 0x7CE0, 0x8D67, 0x7D05, 0x8D68, 0x7D18, + 0x8D69, 0x7D5E, 0x8D6A, 0x7DB1, 0x8D6B, 0x8015, 0x8D6C, 0x8003, + 0x8D6D, 0x80AF, 0x8D6E, 0x80B1, 0x8D6F, 0x8154, 0x8D70, 0x818F, + 0x8D71, 0x822A, 0x8D72, 0x8352, 0x8D73, 0x884C, 0x8D74, 0x8861, + 0x8D75, 0x8B1B, 0x8D76, 0x8CA2, 0x8D77, 0x8CFC, 0x8D78, 0x90CA, + 0x8D79, 0x9175, 0x8D7A, 0x9271, 0x8D7B, 0x783F, 0x8D7C, 0x92FC, + 0x8D7D, 0x95A4, 0x8D7E, 0x964D, 0x8D80, 0x9805, 0x8D81, 0x9999, + 0x8D82, 0x9AD8, 0x8D83, 0x9D3B, 0x8D84, 0x525B, 0x8D85, 0x52AB, + 0x8D86, 0x53F7, 0x8D87, 0x5408, 0x8D88, 0x58D5, 0x8D89, 0x62F7, + 0x8D8A, 0x6FE0, 0x8D8B, 0x8C6A, 0x8D8C, 0x8F5F, 0x8D8D, 0x9EB9, + 0x8D8E, 0x514B, 0x8D8F, 0x523B, 0x8D90, 0x544A, 0x8D91, 0x56FD, + 0x8D92, 0x7A40, 0x8D93, 0x9177, 0x8D94, 0x9D60, 0x8D95, 0x9ED2, + 0x8D96, 0x7344, 0x8D97, 0x6F09, 0x8D98, 0x8170, 0x8D99, 0x7511, + 0x8D9A, 0x5FFD, 0x8D9B, 0x60DA, 0x8D9C, 0x9AA8, 0x8D9D, 0x72DB, + 0x8D9E, 0x8FBC, 0x8D9F, 0x6B64, 0x8DA0, 0x9803, 0x8DA1, 0x4ECA, + 0x8DA2, 0x56F0, 0x8DA3, 0x5764, 0x8DA4, 0x58BE, 0x8DA5, 0x5A5A, + 0x8DA6, 0x6068, 0x8DA7, 0x61C7, 0x8DA8, 0x660F, 0x8DA9, 0x6606, + 0x8DAA, 0x6839, 0x8DAB, 0x68B1, 0x8DAC, 0x6DF7, 0x8DAD, 0x75D5, + 0x8DAE, 0x7D3A, 0x8DAF, 0x826E, 0x8DB0, 0x9B42, 0x8DB1, 0x4E9B, + 0x8DB2, 0x4F50, 0x8DB3, 0x53C9, 0x8DB4, 0x5506, 0x8DB5, 0x5D6F, + 0x8DB6, 0x5DE6, 0x8DB7, 0x5DEE, 0x8DB8, 0x67FB, 0x8DB9, 0x6C99, + 0x8DBA, 0x7473, 0x8DBB, 0x7802, 0x8DBC, 0x8A50, 0x8DBD, 0x9396, + 0x8DBE, 0x88DF, 0x8DBF, 0x5750, 0x8DC0, 0x5EA7, 0x8DC1, 0x632B, + 0x8DC2, 0x50B5, 0x8DC3, 0x50AC, 0x8DC4, 0x518D, 0x8DC5, 0x6700, + 0x8DC6, 0x54C9, 0x8DC7, 0x585E, 0x8DC8, 0x59BB, 0x8DC9, 0x5BB0, + 0x8DCA, 0x5F69, 0x8DCB, 0x624D, 0x8DCC, 0x63A1, 0x8DCD, 0x683D, + 0x8DCE, 0x6B73, 0x8DCF, 0x6E08, 0x8DD0, 0x707D, 0x8DD1, 0x91C7, + 0x8DD2, 0x7280, 0x8DD3, 0x7815, 0x8DD4, 0x7826, 0x8DD5, 0x796D, + 0x8DD6, 0x658E, 0x8DD7, 0x7D30, 0x8DD8, 0x83DC, 0x8DD9, 0x88C1, + 0x8DDA, 0x8F09, 0x8DDB, 0x969B, 0x8DDC, 0x5264, 0x8DDD, 0x5728, + 0x8DDE, 0x6750, 0x8DDF, 0x7F6A, 0x8DE0, 0x8CA1, 0x8DE1, 0x51B4, + 0x8DE2, 0x5742, 0x8DE3, 0x962A, 0x8DE4, 0x583A, 0x8DE5, 0x698A, + 0x8DE6, 0x80B4, 0x8DE7, 0x54B2, 0x8DE8, 0x5D0E, 0x8DE9, 0x57FC, + 0x8DEA, 0x7895, 0x8DEB, 0x9DFA, 0x8DEC, 0x4F5C, 0x8DED, 0x524A, + 0x8DEE, 0x548B, 0x8DEF, 0x643E, 0x8DF0, 0x6628, 0x8DF1, 0x6714, + 0x8DF2, 0x67F5, 0x8DF3, 0x7A84, 0x8DF4, 0x7B56, 0x8DF5, 0x7D22, + 0x8DF6, 0x932F, 0x8DF7, 0x685C, 0x8DF8, 0x9BAD, 0x8DF9, 0x7B39, + 0x8DFA, 0x5319, 0x8DFB, 0x518A, 0x8DFC, 0x5237, 0x8E40, 0x5BDF, + 0x8E41, 0x62F6, 0x8E42, 0x64AE, 0x8E43, 0x64E6, 0x8E44, 0x672D, + 0x8E45, 0x6BBA, 0x8E46, 0x85A9, 0x8E47, 0x96D1, 0x8E48, 0x7690, + 0x8E49, 0x9BD6, 0x8E4A, 0x634C, 0x8E4B, 0x9306, 0x8E4C, 0x9BAB, + 0x8E4D, 0x76BF, 0x8E4E, 0x6652, 0x8E4F, 0x4E09, 0x8E50, 0x5098, + 0x8E51, 0x53C2, 0x8E52, 0x5C71, 0x8E53, 0x60E8, 0x8E54, 0x6492, + 0x8E55, 0x6563, 0x8E56, 0x685F, 0x8E57, 0x71E6, 0x8E58, 0x73CA, + 0x8E59, 0x7523, 0x8E5A, 0x7B97, 0x8E5B, 0x7E82, 0x8E5C, 0x8695, + 0x8E5D, 0x8B83, 0x8E5E, 0x8CDB, 0x8E5F, 0x9178, 0x8E60, 0x9910, + 0x8E61, 0x65AC, 0x8E62, 0x66AB, 0x8E63, 0x6B8B, 0x8E64, 0x4ED5, + 0x8E65, 0x4ED4, 0x8E66, 0x4F3A, 0x8E67, 0x4F7F, 0x8E68, 0x523A, + 0x8E69, 0x53F8, 0x8E6A, 0x53F2, 0x8E6B, 0x55E3, 0x8E6C, 0x56DB, + 0x8E6D, 0x58EB, 0x8E6E, 0x59CB, 0x8E6F, 0x59C9, 0x8E70, 0x59FF, + 0x8E71, 0x5B50, 0x8E72, 0x5C4D, 0x8E73, 0x5E02, 0x8E74, 0x5E2B, + 0x8E75, 0x5FD7, 0x8E76, 0x601D, 0x8E77, 0x6307, 0x8E78, 0x652F, + 0x8E79, 0x5B5C, 0x8E7A, 0x65AF, 0x8E7B, 0x65BD, 0x8E7C, 0x65E8, + 0x8E7D, 0x679D, 0x8E7E, 0x6B62, 0x8E80, 0x6B7B, 0x8E81, 0x6C0F, + 0x8E82, 0x7345, 0x8E83, 0x7949, 0x8E84, 0x79C1, 0x8E85, 0x7CF8, + 0x8E86, 0x7D19, 0x8E87, 0x7D2B, 0x8E88, 0x80A2, 0x8E89, 0x8102, + 0x8E8A, 0x81F3, 0x8E8B, 0x8996, 0x8E8C, 0x8A5E, 0x8E8D, 0x8A69, + 0x8E8E, 0x8A66, 0x8E8F, 0x8A8C, 0x8E90, 0x8AEE, 0x8E91, 0x8CC7, + 0x8E92, 0x8CDC, 0x8E93, 0x96CC, 0x8E94, 0x98FC, 0x8E95, 0x6B6F, + 0x8E96, 0x4E8B, 0x8E97, 0x4F3C, 0x8E98, 0x4F8D, 0x8E99, 0x5150, + 0x8E9A, 0x5B57, 0x8E9B, 0x5BFA, 0x8E9C, 0x6148, 0x8E9D, 0x6301, + 0x8E9E, 0x6642, 0x8E9F, 0x6B21, 0x8EA0, 0x6ECB, 0x8EA1, 0x6CBB, + 0x8EA2, 0x723E, 0x8EA3, 0x74BD, 0x8EA4, 0x75D4, 0x8EA5, 0x78C1, + 0x8EA6, 0x793A, 0x8EA7, 0x800C, 0x8EA8, 0x8033, 0x8EA9, 0x81EA, + 0x8EAA, 0x8494, 0x8EAB, 0x8F9E, 0x8EAC, 0x6C50, 0x8EAD, 0x9E7F, + 0x8EAE, 0x5F0F, 0x8EAF, 0x8B58, 0x8EB0, 0x9D2B, 0x8EB1, 0x7AFA, + 0x8EB2, 0x8EF8, 0x8EB3, 0x5B8D, 0x8EB4, 0x96EB, 0x8EB5, 0x4E03, + 0x8EB6, 0x53F1, 0x8EB7, 0x57F7, 0x8EB8, 0x5931, 0x8EB9, 0x5AC9, + 0x8EBA, 0x5BA4, 0x8EBB, 0x6089, 0x8EBC, 0x6E7F, 0x8EBD, 0x6F06, + 0x8EBE, 0x75BE, 0x8EBF, 0x8CEA, 0x8EC0, 0x5B9F, 0x8EC1, 0x8500, + 0x8EC2, 0x7BE0, 0x8EC3, 0x5072, 0x8EC4, 0x67F4, 0x8EC5, 0x829D, + 0x8EC6, 0x5C61, 0x8EC7, 0x854A, 0x8EC8, 0x7E1E, 0x8EC9, 0x820E, + 0x8ECA, 0x5199, 0x8ECB, 0x5C04, 0x8ECC, 0x6368, 0x8ECD, 0x8D66, + 0x8ECE, 0x659C, 0x8ECF, 0x716E, 0x8ED0, 0x793E, 0x8ED1, 0x7D17, + 0x8ED2, 0x8005, 0x8ED3, 0x8B1D, 0x8ED4, 0x8ECA, 0x8ED5, 0x906E, + 0x8ED6, 0x86C7, 0x8ED7, 0x90AA, 0x8ED8, 0x501F, 0x8ED9, 0x52FA, + 0x8EDA, 0x5C3A, 0x8EDB, 0x6753, 0x8EDC, 0x707C, 0x8EDD, 0x7235, + 0x8EDE, 0x914C, 0x8EDF, 0x91C8, 0x8EE0, 0x932B, 0x8EE1, 0x82E5, + 0x8EE2, 0x5BC2, 0x8EE3, 0x5F31, 0x8EE4, 0x60F9, 0x8EE5, 0x4E3B, + 0x8EE6, 0x53D6, 0x8EE7, 0x5B88, 0x8EE8, 0x624B, 0x8EE9, 0x6731, + 0x8EEA, 0x6B8A, 0x8EEB, 0x72E9, 0x8EEC, 0x73E0, 0x8EED, 0x7A2E, + 0x8EEE, 0x816B, 0x8EEF, 0x8DA3, 0x8EF0, 0x9152, 0x8EF1, 0x9996, + 0x8EF2, 0x5112, 0x8EF3, 0x53D7, 0x8EF4, 0x546A, 0x8EF5, 0x5BFF, + 0x8EF6, 0x6388, 0x8EF7, 0x6A39, 0x8EF8, 0x7DAC, 0x8EF9, 0x9700, + 0x8EFA, 0x56DA, 0x8EFB, 0x53CE, 0x8EFC, 0x5468, 0x8F40, 0x5B97, + 0x8F41, 0x5C31, 0x8F42, 0x5DDE, 0x8F43, 0x4FEE, 0x8F44, 0x6101, + 0x8F45, 0x62FE, 0x8F46, 0x6D32, 0x8F47, 0x79C0, 0x8F48, 0x79CB, + 0x8F49, 0x7D42, 0x8F4A, 0x7E4D, 0x8F4B, 0x7FD2, 0x8F4C, 0x81ED, + 0x8F4D, 0x821F, 0x8F4E, 0x8490, 0x8F4F, 0x8846, 0x8F50, 0x8972, + 0x8F51, 0x8B90, 0x8F52, 0x8E74, 0x8F53, 0x8F2F, 0x8F54, 0x9031, + 0x8F55, 0x914B, 0x8F56, 0x916C, 0x8F57, 0x96C6, 0x8F58, 0x919C, + 0x8F59, 0x4EC0, 0x8F5A, 0x4F4F, 0x8F5B, 0x5145, 0x8F5C, 0x5341, + 0x8F5D, 0x5F93, 0x8F5E, 0x620E, 0x8F5F, 0x67D4, 0x8F60, 0x6C41, + 0x8F61, 0x6E0B, 0x8F62, 0x7363, 0x8F63, 0x7E26, 0x8F64, 0x91CD, + 0x8F65, 0x9283, 0x8F66, 0x53D4, 0x8F67, 0x5919, 0x8F68, 0x5BBF, + 0x8F69, 0x6DD1, 0x8F6A, 0x795D, 0x8F6B, 0x7E2E, 0x8F6C, 0x7C9B, + 0x8F6D, 0x587E, 0x8F6E, 0x719F, 0x8F6F, 0x51FA, 0x8F70, 0x8853, + 0x8F71, 0x8FF0, 0x8F72, 0x4FCA, 0x8F73, 0x5CFB, 0x8F74, 0x6625, + 0x8F75, 0x77AC, 0x8F76, 0x7AE3, 0x8F77, 0x821C, 0x8F78, 0x99FF, + 0x8F79, 0x51C6, 0x8F7A, 0x5FAA, 0x8F7B, 0x65EC, 0x8F7C, 0x696F, + 0x8F7D, 0x6B89, 0x8F7E, 0x6DF3, 0x8F80, 0x6E96, 0x8F81, 0x6F64, + 0x8F82, 0x76FE, 0x8F83, 0x7D14, 0x8F84, 0x5DE1, 0x8F85, 0x9075, + 0x8F86, 0x9187, 0x8F87, 0x9806, 0x8F88, 0x51E6, 0x8F89, 0x521D, + 0x8F8A, 0x6240, 0x8F8B, 0x6691, 0x8F8C, 0x66D9, 0x8F8D, 0x6E1A, + 0x8F8E, 0x5EB6, 0x8F8F, 0x7DD2, 0x8F90, 0x7F72, 0x8F91, 0x66F8, + 0x8F92, 0x85AF, 0x8F93, 0x85F7, 0x8F94, 0x8AF8, 0x8F95, 0x52A9, + 0x8F96, 0x53D9, 0x8F97, 0x5973, 0x8F98, 0x5E8F, 0x8F99, 0x5F90, + 0x8F9A, 0x6055, 0x8F9B, 0x92E4, 0x8F9C, 0x9664, 0x8F9D, 0x50B7, + 0x8F9E, 0x511F, 0x8F9F, 0x52DD, 0x8FA0, 0x5320, 0x8FA1, 0x5347, + 0x8FA2, 0x53EC, 0x8FA3, 0x54E8, 0x8FA4, 0x5546, 0x8FA5, 0x5531, + 0x8FA6, 0x5617, 0x8FA7, 0x5968, 0x8FA8, 0x59BE, 0x8FA9, 0x5A3C, + 0x8FAA, 0x5BB5, 0x8FAB, 0x5C06, 0x8FAC, 0x5C0F, 0x8FAD, 0x5C11, + 0x8FAE, 0x5C1A, 0x8FAF, 0x5E84, 0x8FB0, 0x5E8A, 0x8FB1, 0x5EE0, + 0x8FB2, 0x5F70, 0x8FB3, 0x627F, 0x8FB4, 0x6284, 0x8FB5, 0x62DB, + 0x8FB6, 0x638C, 0x8FB7, 0x6377, 0x8FB8, 0x6607, 0x8FB9, 0x660C, + 0x8FBA, 0x662D, 0x8FBB, 0x6676, 0x8FBC, 0x677E, 0x8FBD, 0x68A2, + 0x8FBE, 0x6A1F, 0x8FBF, 0x6A35, 0x8FC0, 0x6CBC, 0x8FC1, 0x6D88, + 0x8FC2, 0x6E09, 0x8FC3, 0x6E58, 0x8FC4, 0x713C, 0x8FC5, 0x7126, + 0x8FC6, 0x7167, 0x8FC7, 0x75C7, 0x8FC8, 0x7701, 0x8FC9, 0x785D, + 0x8FCA, 0x7901, 0x8FCB, 0x7965, 0x8FCC, 0x79F0, 0x8FCD, 0x7AE0, + 0x8FCE, 0x7B11, 0x8FCF, 0x7CA7, 0x8FD0, 0x7D39, 0x8FD1, 0x8096, + 0x8FD2, 0x83D6, 0x8FD3, 0x848B, 0x8FD4, 0x8549, 0x8FD5, 0x885D, + 0x8FD6, 0x88F3, 0x8FD7, 0x8A1F, 0x8FD8, 0x8A3C, 0x8FD9, 0x8A54, + 0x8FDA, 0x8A73, 0x8FDB, 0x8C61, 0x8FDC, 0x8CDE, 0x8FDD, 0x91A4, + 0x8FDE, 0x9266, 0x8FDF, 0x937E, 0x8FE0, 0x9418, 0x8FE1, 0x969C, + 0x8FE2, 0x9798, 0x8FE3, 0x4E0A, 0x8FE4, 0x4E08, 0x8FE5, 0x4E1E, + 0x8FE6, 0x4E57, 0x8FE7, 0x5197, 0x8FE8, 0x5270, 0x8FE9, 0x57CE, + 0x8FEA, 0x5834, 0x8FEB, 0x58CC, 0x8FEC, 0x5B22, 0x8FED, 0x5E38, + 0x8FEE, 0x60C5, 0x8FEF, 0x64FE, 0x8FF0, 0x6761, 0x8FF1, 0x6756, + 0x8FF2, 0x6D44, 0x8FF3, 0x72B6, 0x8FF4, 0x7573, 0x8FF5, 0x7A63, + 0x8FF6, 0x84B8, 0x8FF7, 0x8B72, 0x8FF8, 0x91B8, 0x8FF9, 0x9320, + 0x8FFA, 0x5631, 0x8FFB, 0x57F4, 0x8FFC, 0x98FE, 0x9040, 0x62ED, + 0x9041, 0x690D, 0x9042, 0x6B96, 0x9043, 0x71ED, 0x9044, 0x7E54, + 0x9045, 0x8077, 0x9046, 0x8272, 0x9047, 0x89E6, 0x9048, 0x98DF, + 0x9049, 0x8755, 0x904A, 0x8FB1, 0x904B, 0x5C3B, 0x904C, 0x4F38, + 0x904D, 0x4FE1, 0x904E, 0x4FB5, 0x904F, 0x5507, 0x9050, 0x5A20, + 0x9051, 0x5BDD, 0x9052, 0x5BE9, 0x9053, 0x5FC3, 0x9054, 0x614E, + 0x9055, 0x632F, 0x9056, 0x65B0, 0x9057, 0x664B, 0x9058, 0x68EE, + 0x9059, 0x699B, 0x905A, 0x6D78, 0x905B, 0x6DF1, 0x905C, 0x7533, + 0x905D, 0x75B9, 0x905E, 0x771F, 0x905F, 0x795E, 0x9060, 0x79E6, + 0x9061, 0x7D33, 0x9062, 0x81E3, 0x9063, 0x82AF, 0x9064, 0x85AA, + 0x9065, 0x89AA, 0x9066, 0x8A3A, 0x9067, 0x8EAB, 0x9068, 0x8F9B, + 0x9069, 0x9032, 0x906A, 0x91DD, 0x906B, 0x9707, 0x906C, 0x4EBA, + 0x906D, 0x4EC1, 0x906E, 0x5203, 0x906F, 0x5875, 0x9070, 0x58EC, + 0x9071, 0x5C0B, 0x9072, 0x751A, 0x9073, 0x5C3D, 0x9074, 0x814E, + 0x9075, 0x8A0A, 0x9076, 0x8FC5, 0x9077, 0x9663, 0x9078, 0x976D, + 0x9079, 0x7B25, 0x907A, 0x8ACF, 0x907B, 0x9808, 0x907C, 0x9162, + 0x907D, 0x56F3, 0x907E, 0x53A8, 0x9080, 0x9017, 0x9081, 0x5439, + 0x9082, 0x5782, 0x9083, 0x5E25, 0x9084, 0x63A8, 0x9085, 0x6C34, + 0x9086, 0x708A, 0x9087, 0x7761, 0x9088, 0x7C8B, 0x9089, 0x7FE0, + 0x908A, 0x8870, 0x908B, 0x9042, 0x908C, 0x9154, 0x908D, 0x9310, + 0x908E, 0x9318, 0x908F, 0x968F, 0x9090, 0x745E, 0x9091, 0x9AC4, + 0x9092, 0x5D07, 0x9093, 0x5D69, 0x9094, 0x6570, 0x9095, 0x67A2, + 0x9096, 0x8DA8, 0x9097, 0x96DB, 0x9098, 0x636E, 0x9099, 0x6749, + 0x909A, 0x6919, 0x909B, 0x83C5, 0x909C, 0x9817, 0x909D, 0x96C0, + 0x909E, 0x88FE, 0x909F, 0x6F84, 0x90A0, 0x647A, 0x90A1, 0x5BF8, + 0x90A2, 0x4E16, 0x90A3, 0x702C, 0x90A4, 0x755D, 0x90A5, 0x662F, + 0x90A6, 0x51C4, 0x90A7, 0x5236, 0x90A8, 0x52E2, 0x90A9, 0x59D3, + 0x90AA, 0x5F81, 0x90AB, 0x6027, 0x90AC, 0x6210, 0x90AD, 0x653F, + 0x90AE, 0x6574, 0x90AF, 0x661F, 0x90B0, 0x6674, 0x90B1, 0x68F2, + 0x90B2, 0x6816, 0x90B3, 0x6B63, 0x90B4, 0x6E05, 0x90B5, 0x7272, + 0x90B6, 0x751F, 0x90B7, 0x76DB, 0x90B8, 0x7CBE, 0x90B9, 0x8056, + 0x90BA, 0x58F0, 0x90BB, 0x88FD, 0x90BC, 0x897F, 0x90BD, 0x8AA0, + 0x90BE, 0x8A93, 0x90BF, 0x8ACB, 0x90C0, 0x901D, 0x90C1, 0x9192, + 0x90C2, 0x9752, 0x90C3, 0x9759, 0x90C4, 0x6589, 0x90C5, 0x7A0E, + 0x90C6, 0x8106, 0x90C7, 0x96BB, 0x90C8, 0x5E2D, 0x90C9, 0x60DC, + 0x90CA, 0x621A, 0x90CB, 0x65A5, 0x90CC, 0x6614, 0x90CD, 0x6790, + 0x90CE, 0x77F3, 0x90CF, 0x7A4D, 0x90D0, 0x7C4D, 0x90D1, 0x7E3E, + 0x90D2, 0x810A, 0x90D3, 0x8CAC, 0x90D4, 0x8D64, 0x90D5, 0x8DE1, + 0x90D6, 0x8E5F, 0x90D7, 0x78A9, 0x90D8, 0x5207, 0x90D9, 0x62D9, + 0x90DA, 0x63A5, 0x90DB, 0x6442, 0x90DC, 0x6298, 0x90DD, 0x8A2D, + 0x90DE, 0x7A83, 0x90DF, 0x7BC0, 0x90E0, 0x8AAC, 0x90E1, 0x96EA, + 0x90E2, 0x7D76, 0x90E3, 0x820C, 0x90E4, 0x8749, 0x90E5, 0x4ED9, + 0x90E6, 0x5148, 0x90E7, 0x5343, 0x90E8, 0x5360, 0x90E9, 0x5BA3, + 0x90EA, 0x5C02, 0x90EB, 0x5C16, 0x90EC, 0x5DDD, 0x90ED, 0x6226, + 0x90EE, 0x6247, 0x90EF, 0x64B0, 0x90F0, 0x6813, 0x90F1, 0x6834, + 0x90F2, 0x6CC9, 0x90F3, 0x6D45, 0x90F4, 0x6D17, 0x90F5, 0x67D3, + 0x90F6, 0x6F5C, 0x90F7, 0x714E, 0x90F8, 0x717D, 0x90F9, 0x65CB, + 0x90FA, 0x7A7F, 0x90FB, 0x7BAD, 0x90FC, 0x7DDA, 0x9140, 0x7E4A, + 0x9141, 0x7FA8, 0x9142, 0x817A, 0x9143, 0x821B, 0x9144, 0x8239, + 0x9145, 0x85A6, 0x9146, 0x8A6E, 0x9147, 0x8CCE, 0x9148, 0x8DF5, + 0x9149, 0x9078, 0x914A, 0x9077, 0x914B, 0x92AD, 0x914C, 0x9291, + 0x914D, 0x9583, 0x914E, 0x9BAE, 0x914F, 0x524D, 0x9150, 0x5584, + 0x9151, 0x6F38, 0x9152, 0x7136, 0x9153, 0x5168, 0x9154, 0x7985, + 0x9155, 0x7E55, 0x9156, 0x81B3, 0x9157, 0x7CCE, 0x9158, 0x564C, + 0x9159, 0x5851, 0x915A, 0x5CA8, 0x915B, 0x63AA, 0x915C, 0x66FE, + 0x915D, 0x66FD, 0x915E, 0x695A, 0x915F, 0x72D9, 0x9160, 0x758F, + 0x9161, 0x758E, 0x9162, 0x790E, 0x9163, 0x7956, 0x9164, 0x79DF, + 0x9165, 0x7C97, 0x9166, 0x7D20, 0x9167, 0x7D44, 0x9168, 0x8607, + 0x9169, 0x8A34, 0x916A, 0x963B, 0x916B, 0x9061, 0x916C, 0x9F20, + 0x916D, 0x50E7, 0x916E, 0x5275, 0x916F, 0x53CC, 0x9170, 0x53E2, + 0x9171, 0x5009, 0x9172, 0x55AA, 0x9173, 0x58EE, 0x9174, 0x594F, + 0x9175, 0x723D, 0x9176, 0x5B8B, 0x9177, 0x5C64, 0x9178, 0x531D, + 0x9179, 0x60E3, 0x917A, 0x60F3, 0x917B, 0x635C, 0x917C, 0x6383, + 0x917D, 0x633F, 0x917E, 0x63BB, 0x9180, 0x64CD, 0x9181, 0x65E9, + 0x9182, 0x66F9, 0x9183, 0x5DE3, 0x9184, 0x69CD, 0x9185, 0x69FD, + 0x9186, 0x6F15, 0x9187, 0x71E5, 0x9188, 0x4E89, 0x9189, 0x75E9, + 0x918A, 0x76F8, 0x918B, 0x7A93, 0x918C, 0x7CDF, 0x918D, 0x7DCF, + 0x918E, 0x7D9C, 0x918F, 0x8061, 0x9190, 0x8349, 0x9191, 0x8358, + 0x9192, 0x846C, 0x9193, 0x84BC, 0x9194, 0x85FB, 0x9195, 0x88C5, + 0x9196, 0x8D70, 0x9197, 0x9001, 0x9198, 0x906D, 0x9199, 0x9397, + 0x919A, 0x971C, 0x919B, 0x9A12, 0x919C, 0x50CF, 0x919D, 0x5897, + 0x919E, 0x618E, 0x919F, 0x81D3, 0x91A0, 0x8535, 0x91A1, 0x8D08, + 0x91A2, 0x9020, 0x91A3, 0x4FC3, 0x91A4, 0x5074, 0x91A5, 0x5247, + 0x91A6, 0x5373, 0x91A7, 0x606F, 0x91A8, 0x6349, 0x91A9, 0x675F, + 0x91AA, 0x6E2C, 0x91AB, 0x8DB3, 0x91AC, 0x901F, 0x91AD, 0x4FD7, + 0x91AE, 0x5C5E, 0x91AF, 0x8CCA, 0x91B0, 0x65CF, 0x91B1, 0x7D9A, + 0x91B2, 0x5352, 0x91B3, 0x8896, 0x91B4, 0x5176, 0x91B5, 0x63C3, + 0x91B6, 0x5B58, 0x91B7, 0x5B6B, 0x91B8, 0x5C0A, 0x91B9, 0x640D, + 0x91BA, 0x6751, 0x91BB, 0x905C, 0x91BC, 0x4ED6, 0x91BD, 0x591A, + 0x91BE, 0x592A, 0x91BF, 0x6C70, 0x91C0, 0x8A51, 0x91C1, 0x553E, + 0x91C2, 0x5815, 0x91C3, 0x59A5, 0x91C4, 0x60F0, 0x91C5, 0x6253, + 0x91C6, 0x67C1, 0x91C7, 0x8235, 0x91C8, 0x6955, 0x91C9, 0x9640, + 0x91CA, 0x99C4, 0x91CB, 0x9A28, 0x91CC, 0x4F53, 0x91CD, 0x5806, + 0x91CE, 0x5BFE, 0x91CF, 0x8010, 0x91D0, 0x5CB1, 0x91D1, 0x5E2F, + 0x91D2, 0x5F85, 0x91D3, 0x6020, 0x91D4, 0x614B, 0x91D5, 0x6234, + 0x91D6, 0x66FF, 0x91D7, 0x6CF0, 0x91D8, 0x6EDE, 0x91D9, 0x80CE, + 0x91DA, 0x817F, 0x91DB, 0x82D4, 0x91DC, 0x888B, 0x91DD, 0x8CB8, + 0x91DE, 0x9000, 0x91DF, 0x902E, 0x91E0, 0x968A, 0x91E1, 0x9EDB, + 0x91E2, 0x9BDB, 0x91E3, 0x4EE3, 0x91E4, 0x53F0, 0x91E5, 0x5927, + 0x91E6, 0x7B2C, 0x91E7, 0x918D, 0x91E8, 0x984C, 0x91E9, 0x9DF9, + 0x91EA, 0x6EDD, 0x91EB, 0x7027, 0x91EC, 0x5353, 0x91ED, 0x5544, + 0x91EE, 0x5B85, 0x91EF, 0x6258, 0x91F0, 0x629E, 0x91F1, 0x62D3, + 0x91F2, 0x6CA2, 0x91F3, 0x6FEF, 0x91F4, 0x7422, 0x91F5, 0x8A17, + 0x91F6, 0x9438, 0x91F7, 0x6FC1, 0x91F8, 0x8AFE, 0x91F9, 0x8338, + 0x91FA, 0x51E7, 0x91FB, 0x86F8, 0x91FC, 0x53EA, 0x9240, 0x53E9, + 0x9241, 0x4F46, 0x9242, 0x9054, 0x9243, 0x8FB0, 0x9244, 0x596A, + 0x9245, 0x8131, 0x9246, 0x5DFD, 0x9247, 0x7AEA, 0x9248, 0x8FBF, + 0x9249, 0x68DA, 0x924A, 0x8C37, 0x924B, 0x72F8, 0x924C, 0x9C48, + 0x924D, 0x6A3D, 0x924E, 0x8AB0, 0x924F, 0x4E39, 0x9250, 0x5358, + 0x9251, 0x5606, 0x9252, 0x5766, 0x9253, 0x62C5, 0x9254, 0x63A2, + 0x9255, 0x65E6, 0x9256, 0x6B4E, 0x9257, 0x6DE1, 0x9258, 0x6E5B, + 0x9259, 0x70AD, 0x925A, 0x77ED, 0x925B, 0x7AEF, 0x925C, 0x7BAA, + 0x925D, 0x7DBB, 0x925E, 0x803D, 0x925F, 0x80C6, 0x9260, 0x86CB, + 0x9261, 0x8A95, 0x9262, 0x935B, 0x9263, 0x56E3, 0x9264, 0x58C7, + 0x9265, 0x5F3E, 0x9266, 0x65AD, 0x9267, 0x6696, 0x9268, 0x6A80, + 0x9269, 0x6BB5, 0x926A, 0x7537, 0x926B, 0x8AC7, 0x926C, 0x5024, + 0x926D, 0x77E5, 0x926E, 0x5730, 0x926F, 0x5F1B, 0x9270, 0x6065, + 0x9271, 0x667A, 0x9272, 0x6C60, 0x9273, 0x75F4, 0x9274, 0x7A1A, + 0x9275, 0x7F6E, 0x9276, 0x81F4, 0x9277, 0x8718, 0x9278, 0x9045, + 0x9279, 0x99B3, 0x927A, 0x7BC9, 0x927B, 0x755C, 0x927C, 0x7AF9, + 0x927D, 0x7B51, 0x927E, 0x84C4, 0x9280, 0x9010, 0x9281, 0x79E9, + 0x9282, 0x7A92, 0x9283, 0x8336, 0x9284, 0x5AE1, 0x9285, 0x7740, + 0x9286, 0x4E2D, 0x9287, 0x4EF2, 0x9288, 0x5B99, 0x9289, 0x5FE0, + 0x928A, 0x62BD, 0x928B, 0x663C, 0x928C, 0x67F1, 0x928D, 0x6CE8, + 0x928E, 0x866B, 0x928F, 0x8877, 0x9290, 0x8A3B, 0x9291, 0x914E, + 0x9292, 0x92F3, 0x9293, 0x99D0, 0x9294, 0x6A17, 0x9295, 0x7026, + 0x9296, 0x732A, 0x9297, 0x82E7, 0x9298, 0x8457, 0x9299, 0x8CAF, + 0x929A, 0x4E01, 0x929B, 0x5146, 0x929C, 0x51CB, 0x929D, 0x558B, + 0x929E, 0x5BF5, 0x929F, 0x5E16, 0x92A0, 0x5E33, 0x92A1, 0x5E81, + 0x92A2, 0x5F14, 0x92A3, 0x5F35, 0x92A4, 0x5F6B, 0x92A5, 0x5FB4, + 0x92A6, 0x61F2, 0x92A7, 0x6311, 0x92A8, 0x66A2, 0x92A9, 0x671D, + 0x92AA, 0x6F6E, 0x92AB, 0x7252, 0x92AC, 0x753A, 0x92AD, 0x773A, + 0x92AE, 0x8074, 0x92AF, 0x8139, 0x92B0, 0x8178, 0x92B1, 0x8776, + 0x92B2, 0x8ABF, 0x92B3, 0x8ADC, 0x92B4, 0x8D85, 0x92B5, 0x8DF3, + 0x92B6, 0x929A, 0x92B7, 0x9577, 0x92B8, 0x9802, 0x92B9, 0x9CE5, + 0x92BA, 0x52C5, 0x92BB, 0x6357, 0x92BC, 0x76F4, 0x92BD, 0x6715, + 0x92BE, 0x6C88, 0x92BF, 0x73CD, 0x92C0, 0x8CC3, 0x92C1, 0x93AE, + 0x92C2, 0x9673, 0x92C3, 0x6D25, 0x92C4, 0x589C, 0x92C5, 0x690E, + 0x92C6, 0x69CC, 0x92C7, 0x8FFD, 0x92C8, 0x939A, 0x92C9, 0x75DB, + 0x92CA, 0x901A, 0x92CB, 0x585A, 0x92CC, 0x6802, 0x92CD, 0x63B4, + 0x92CE, 0x69FB, 0x92CF, 0x4F43, 0x92D0, 0x6F2C, 0x92D1, 0x67D8, + 0x92D2, 0x8FBB, 0x92D3, 0x8526, 0x92D4, 0x7DB4, 0x92D5, 0x9354, + 0x92D6, 0x693F, 0x92D7, 0x6F70, 0x92D8, 0x576A, 0x92D9, 0x58F7, + 0x92DA, 0x5B2C, 0x92DB, 0x7D2C, 0x92DC, 0x722A, 0x92DD, 0x540A, + 0x92DE, 0x91E3, 0x92DF, 0x9DB4, 0x92E0, 0x4EAD, 0x92E1, 0x4F4E, + 0x92E2, 0x505C, 0x92E3, 0x5075, 0x92E4, 0x5243, 0x92E5, 0x8C9E, + 0x92E6, 0x5448, 0x92E7, 0x5824, 0x92E8, 0x5B9A, 0x92E9, 0x5E1D, + 0x92EA, 0x5E95, 0x92EB, 0x5EAD, 0x92EC, 0x5EF7, 0x92ED, 0x5F1F, + 0x92EE, 0x608C, 0x92EF, 0x62B5, 0x92F0, 0x633A, 0x92F1, 0x63D0, + 0x92F2, 0x68AF, 0x92F3, 0x6C40, 0x92F4, 0x7887, 0x92F5, 0x798E, + 0x92F6, 0x7A0B, 0x92F7, 0x7DE0, 0x92F8, 0x8247, 0x92F9, 0x8A02, + 0x92FA, 0x8AE6, 0x92FB, 0x8E44, 0x92FC, 0x9013, 0x9340, 0x90B8, + 0x9341, 0x912D, 0x9342, 0x91D8, 0x9343, 0x9F0E, 0x9344, 0x6CE5, + 0x9345, 0x6458, 0x9346, 0x64E2, 0x9347, 0x6575, 0x9348, 0x6EF4, + 0x9349, 0x7684, 0x934A, 0x7B1B, 0x934B, 0x9069, 0x934C, 0x93D1, + 0x934D, 0x6EBA, 0x934E, 0x54F2, 0x934F, 0x5FB9, 0x9350, 0x64A4, + 0x9351, 0x8F4D, 0x9352, 0x8FED, 0x9353, 0x9244, 0x9354, 0x5178, + 0x9355, 0x586B, 0x9356, 0x5929, 0x9357, 0x5C55, 0x9358, 0x5E97, + 0x9359, 0x6DFB, 0x935A, 0x7E8F, 0x935B, 0x751C, 0x935C, 0x8CBC, + 0x935D, 0x8EE2, 0x935E, 0x985B, 0x935F, 0x70B9, 0x9360, 0x4F1D, + 0x9361, 0x6BBF, 0x9362, 0x6FB1, 0x9363, 0x7530, 0x9364, 0x96FB, + 0x9365, 0x514E, 0x9366, 0x5410, 0x9367, 0x5835, 0x9368, 0x5857, + 0x9369, 0x59AC, 0x936A, 0x5C60, 0x936B, 0x5F92, 0x936C, 0x6597, + 0x936D, 0x675C, 0x936E, 0x6E21, 0x936F, 0x767B, 0x9370, 0x83DF, + 0x9371, 0x8CED, 0x9372, 0x9014, 0x9373, 0x90FD, 0x9374, 0x934D, + 0x9375, 0x7825, 0x9376, 0x783A, 0x9377, 0x52AA, 0x9378, 0x5EA6, + 0x9379, 0x571F, 0x937A, 0x5974, 0x937B, 0x6012, 0x937C, 0x5012, + 0x937D, 0x515A, 0x937E, 0x51AC, 0x9380, 0x51CD, 0x9381, 0x5200, + 0x9382, 0x5510, 0x9383, 0x5854, 0x9384, 0x5858, 0x9385, 0x5957, + 0x9386, 0x5B95, 0x9387, 0x5CF6, 0x9388, 0x5D8B, 0x9389, 0x60BC, + 0x938A, 0x6295, 0x938B, 0x642D, 0x938C, 0x6771, 0x938D, 0x6843, + 0x938E, 0x68BC, 0x938F, 0x68DF, 0x9390, 0x76D7, 0x9391, 0x6DD8, + 0x9392, 0x6E6F, 0x9393, 0x6D9B, 0x9394, 0x706F, 0x9395, 0x71C8, + 0x9396, 0x5F53, 0x9397, 0x75D8, 0x9398, 0x7977, 0x9399, 0x7B49, + 0x939A, 0x7B54, 0x939B, 0x7B52, 0x939C, 0x7CD6, 0x939D, 0x7D71, + 0x939E, 0x5230, 0x939F, 0x8463, 0x93A0, 0x8569, 0x93A1, 0x85E4, + 0x93A2, 0x8A0E, 0x93A3, 0x8B04, 0x93A4, 0x8C46, 0x93A5, 0x8E0F, + 0x93A6, 0x9003, 0x93A7, 0x900F, 0x93A8, 0x9419, 0x93A9, 0x9676, + 0x93AA, 0x982D, 0x93AB, 0x9A30, 0x93AC, 0x95D8, 0x93AD, 0x50CD, + 0x93AE, 0x52D5, 0x93AF, 0x540C, 0x93B0, 0x5802, 0x93B1, 0x5C0E, + 0x93B2, 0x61A7, 0x93B3, 0x649E, 0x93B4, 0x6D1E, 0x93B5, 0x77B3, + 0x93B6, 0x7AE5, 0x93B7, 0x80F4, 0x93B8, 0x8404, 0x93B9, 0x9053, + 0x93BA, 0x9285, 0x93BB, 0x5CE0, 0x93BC, 0x9D07, 0x93BD, 0x533F, + 0x93BE, 0x5F97, 0x93BF, 0x5FB3, 0x93C0, 0x6D9C, 0x93C1, 0x7279, + 0x93C2, 0x7763, 0x93C3, 0x79BF, 0x93C4, 0x7BE4, 0x93C5, 0x6BD2, + 0x93C6, 0x72EC, 0x93C7, 0x8AAD, 0x93C8, 0x6803, 0x93C9, 0x6A61, + 0x93CA, 0x51F8, 0x93CB, 0x7A81, 0x93CC, 0x6934, 0x93CD, 0x5C4A, + 0x93CE, 0x9CF6, 0x93CF, 0x82EB, 0x93D0, 0x5BC5, 0x93D1, 0x9149, + 0x93D2, 0x701E, 0x93D3, 0x5678, 0x93D4, 0x5C6F, 0x93D5, 0x60C7, + 0x93D6, 0x6566, 0x93D7, 0x6C8C, 0x93D8, 0x8C5A, 0x93D9, 0x9041, + 0x93DA, 0x9813, 0x93DB, 0x5451, 0x93DC, 0x66C7, 0x93DD, 0x920D, + 0x93DE, 0x5948, 0x93DF, 0x90A3, 0x93E0, 0x5185, 0x93E1, 0x4E4D, + 0x93E2, 0x51EA, 0x93E3, 0x8599, 0x93E4, 0x8B0E, 0x93E5, 0x7058, + 0x93E6, 0x637A, 0x93E7, 0x934B, 0x93E8, 0x6962, 0x93E9, 0x99B4, + 0x93EA, 0x7E04, 0x93EB, 0x7577, 0x93EC, 0x5357, 0x93ED, 0x6960, + 0x93EE, 0x8EDF, 0x93EF, 0x96E3, 0x93F0, 0x6C5D, 0x93F1, 0x4E8C, + 0x93F2, 0x5C3C, 0x93F3, 0x5F10, 0x93F4, 0x8FE9, 0x93F5, 0x5302, + 0x93F6, 0x8CD1, 0x93F7, 0x8089, 0x93F8, 0x8679, 0x93F9, 0x5EFF, + 0x93FA, 0x65E5, 0x93FB, 0x4E73, 0x93FC, 0x5165, 0x9440, 0x5982, + 0x9441, 0x5C3F, 0x9442, 0x97EE, 0x9443, 0x4EFB, 0x9444, 0x598A, + 0x9445, 0x5FCD, 0x9446, 0x8A8D, 0x9447, 0x6FE1, 0x9448, 0x79B0, + 0x9449, 0x7962, 0x944A, 0x5BE7, 0x944B, 0x8471, 0x944C, 0x732B, + 0x944D, 0x71B1, 0x944E, 0x5E74, 0x944F, 0x5FF5, 0x9450, 0x637B, + 0x9451, 0x649A, 0x9452, 0x71C3, 0x9453, 0x7C98, 0x9454, 0x4E43, + 0x9455, 0x5EFC, 0x9456, 0x4E4B, 0x9457, 0x57DC, 0x9458, 0x56A2, + 0x9459, 0x60A9, 0x945A, 0x6FC3, 0x945B, 0x7D0D, 0x945C, 0x80FD, + 0x945D, 0x8133, 0x945E, 0x81BF, 0x945F, 0x8FB2, 0x9460, 0x8997, + 0x9461, 0x86A4, 0x9462, 0x5DF4, 0x9463, 0x628A, 0x9464, 0x64AD, + 0x9465, 0x8987, 0x9466, 0x6777, 0x9467, 0x6CE2, 0x9468, 0x6D3E, + 0x9469, 0x7436, 0x946A, 0x7834, 0x946B, 0x5A46, 0x946C, 0x7F75, + 0x946D, 0x82AD, 0x946E, 0x99AC, 0x946F, 0x4FF3, 0x9470, 0x5EC3, + 0x9471, 0x62DD, 0x9472, 0x6392, 0x9473, 0x6557, 0x9474, 0x676F, + 0x9475, 0x76C3, 0x9476, 0x724C, 0x9477, 0x80CC, 0x9478, 0x80BA, + 0x9479, 0x8F29, 0x947A, 0x914D, 0x947B, 0x500D, 0x947C, 0x57F9, + 0x947D, 0x5A92, 0x947E, 0x6885, 0x9480, 0x6973, 0x9481, 0x7164, + 0x9482, 0x72FD, 0x9483, 0x8CB7, 0x9484, 0x58F2, 0x9485, 0x8CE0, + 0x9486, 0x966A, 0x9487, 0x9019, 0x9488, 0x877F, 0x9489, 0x79E4, + 0x948A, 0x77E7, 0x948B, 0x8429, 0x948C, 0x4F2F, 0x948D, 0x5265, + 0x948E, 0x535A, 0x948F, 0x62CD, 0x9490, 0x67CF, 0x9491, 0x6CCA, + 0x9492, 0x767D, 0x9493, 0x7B94, 0x9494, 0x7C95, 0x9495, 0x8236, + 0x9496, 0x8584, 0x9497, 0x8FEB, 0x9498, 0x66DD, 0x9499, 0x6F20, + 0x949A, 0x7206, 0x949B, 0x7E1B, 0x949C, 0x83AB, 0x949D, 0x99C1, + 0x949E, 0x9EA6, 0x949F, 0x51FD, 0x94A0, 0x7BB1, 0x94A1, 0x7872, + 0x94A2, 0x7BB8, 0x94A3, 0x8087, 0x94A4, 0x7B48, 0x94A5, 0x6AE8, + 0x94A6, 0x5E61, 0x94A7, 0x808C, 0x94A8, 0x7551, 0x94A9, 0x7560, + 0x94AA, 0x516B, 0x94AB, 0x9262, 0x94AC, 0x6E8C, 0x94AD, 0x767A, + 0x94AE, 0x9197, 0x94AF, 0x9AEA, 0x94B0, 0x4F10, 0x94B1, 0x7F70, + 0x94B2, 0x629C, 0x94B3, 0x7B4F, 0x94B4, 0x95A5, 0x94B5, 0x9CE9, + 0x94B6, 0x567A, 0x94B7, 0x5859, 0x94B8, 0x86E4, 0x94B9, 0x96BC, + 0x94BA, 0x4F34, 0x94BB, 0x5224, 0x94BC, 0x534A, 0x94BD, 0x53CD, + 0x94BE, 0x53DB, 0x94BF, 0x5E06, 0x94C0, 0x642C, 0x94C1, 0x6591, + 0x94C2, 0x677F, 0x94C3, 0x6C3E, 0x94C4, 0x6C4E, 0x94C5, 0x7248, + 0x94C6, 0x72AF, 0x94C7, 0x73ED, 0x94C8, 0x7554, 0x94C9, 0x7E41, + 0x94CA, 0x822C, 0x94CB, 0x85E9, 0x94CC, 0x8CA9, 0x94CD, 0x7BC4, + 0x94CE, 0x91C6, 0x94CF, 0x7169, 0x94D0, 0x9812, 0x94D1, 0x98EF, + 0x94D2, 0x633D, 0x94D3, 0x6669, 0x94D4, 0x756A, 0x94D5, 0x76E4, + 0x94D6, 0x78D0, 0x94D7, 0x8543, 0x94D8, 0x86EE, 0x94D9, 0x532A, + 0x94DA, 0x5351, 0x94DB, 0x5426, 0x94DC, 0x5983, 0x94DD, 0x5E87, + 0x94DE, 0x5F7C, 0x94DF, 0x60B2, 0x94E0, 0x6249, 0x94E1, 0x6279, + 0x94E2, 0x62AB, 0x94E3, 0x6590, 0x94E4, 0x6BD4, 0x94E5, 0x6CCC, + 0x94E6, 0x75B2, 0x94E7, 0x76AE, 0x94E8, 0x7891, 0x94E9, 0x79D8, + 0x94EA, 0x7DCB, 0x94EB, 0x7F77, 0x94EC, 0x80A5, 0x94ED, 0x88AB, + 0x94EE, 0x8AB9, 0x94EF, 0x8CBB, 0x94F0, 0x907F, 0x94F1, 0x975E, + 0x94F2, 0x98DB, 0x94F3, 0x6A0B, 0x94F4, 0x7C38, 0x94F5, 0x5099, + 0x94F6, 0x5C3E, 0x94F7, 0x5FAE, 0x94F8, 0x6787, 0x94F9, 0x6BD8, + 0x94FA, 0x7435, 0x94FB, 0x7709, 0x94FC, 0x7F8E, 0x9540, 0x9F3B, + 0x9541, 0x67CA, 0x9542, 0x7A17, 0x9543, 0x5339, 0x9544, 0x758B, + 0x9545, 0x9AED, 0x9546, 0x5F66, 0x9547, 0x819D, 0x9548, 0x83F1, + 0x9549, 0x8098, 0x954A, 0x5F3C, 0x954B, 0x5FC5, 0x954C, 0x7562, + 0x954D, 0x7B46, 0x954E, 0x903C, 0x954F, 0x6867, 0x9550, 0x59EB, + 0x9551, 0x5A9B, 0x9552, 0x7D10, 0x9553, 0x767E, 0x9554, 0x8B2C, + 0x9555, 0x4FF5, 0x9556, 0x5F6A, 0x9557, 0x6A19, 0x9558, 0x6C37, + 0x9559, 0x6F02, 0x955A, 0x74E2, 0x955B, 0x7968, 0x955C, 0x8868, + 0x955D, 0x8A55, 0x955E, 0x8C79, 0x955F, 0x5EDF, 0x9560, 0x63CF, + 0x9561, 0x75C5, 0x9562, 0x79D2, 0x9563, 0x82D7, 0x9564, 0x9328, + 0x9565, 0x92F2, 0x9566, 0x849C, 0x9567, 0x86ED, 0x9568, 0x9C2D, + 0x9569, 0x54C1, 0x956A, 0x5F6C, 0x956B, 0x658C, 0x956C, 0x6D5C, + 0x956D, 0x7015, 0x956E, 0x8CA7, 0x956F, 0x8CD3, 0x9570, 0x983B, + 0x9571, 0x654F, 0x9572, 0x74F6, 0x9573, 0x4E0D, 0x9574, 0x4ED8, + 0x9575, 0x57E0, 0x9576, 0x592B, 0x9577, 0x5A66, 0x9578, 0x5BCC, + 0x9579, 0x51A8, 0x957A, 0x5E03, 0x957B, 0x5E9C, 0x957C, 0x6016, + 0x957D, 0x6276, 0x957E, 0x6577, 0x9580, 0x65A7, 0x9581, 0x666E, + 0x9582, 0x6D6E, 0x9583, 0x7236, 0x9584, 0x7B26, 0x9585, 0x8150, + 0x9586, 0x819A, 0x9587, 0x8299, 0x9588, 0x8B5C, 0x9589, 0x8CA0, + 0x958A, 0x8CE6, 0x958B, 0x8D74, 0x958C, 0x961C, 0x958D, 0x9644, + 0x958E, 0x4FAE, 0x958F, 0x64AB, 0x9590, 0x6B66, 0x9591, 0x821E, + 0x9592, 0x8461, 0x9593, 0x856A, 0x9594, 0x90E8, 0x9595, 0x5C01, + 0x9596, 0x6953, 0x9597, 0x98A8, 0x9598, 0x847A, 0x9599, 0x8557, + 0x959A, 0x4F0F, 0x959B, 0x526F, 0x959C, 0x5FA9, 0x959D, 0x5E45, + 0x959E, 0x670D, 0x959F, 0x798F, 0x95A0, 0x8179, 0x95A1, 0x8907, + 0x95A2, 0x8986, 0x95A3, 0x6DF5, 0x95A4, 0x5F17, 0x95A5, 0x6255, + 0x95A6, 0x6CB8, 0x95A7, 0x4ECF, 0x95A8, 0x7269, 0x95A9, 0x9B92, + 0x95AA, 0x5206, 0x95AB, 0x543B, 0x95AC, 0x5674, 0x95AD, 0x58B3, + 0x95AE, 0x61A4, 0x95AF, 0x626E, 0x95B0, 0x711A, 0x95B1, 0x596E, + 0x95B2, 0x7C89, 0x95B3, 0x7CDE, 0x95B4, 0x7D1B, 0x95B5, 0x96F0, + 0x95B6, 0x6587, 0x95B7, 0x805E, 0x95B8, 0x4E19, 0x95B9, 0x4F75, + 0x95BA, 0x5175, 0x95BB, 0x5840, 0x95BC, 0x5E63, 0x95BD, 0x5E73, + 0x95BE, 0x5F0A, 0x95BF, 0x67C4, 0x95C0, 0x4E26, 0x95C1, 0x853D, + 0x95C2, 0x9589, 0x95C3, 0x965B, 0x95C4, 0x7C73, 0x95C5, 0x9801, + 0x95C6, 0x50FB, 0x95C7, 0x58C1, 0x95C8, 0x7656, 0x95C9, 0x78A7, + 0x95CA, 0x5225, 0x95CB, 0x77A5, 0x95CC, 0x8511, 0x95CD, 0x7B86, + 0x95CE, 0x504F, 0x95CF, 0x5909, 0x95D0, 0x7247, 0x95D1, 0x7BC7, + 0x95D2, 0x7DE8, 0x95D3, 0x8FBA, 0x95D4, 0x8FD4, 0x95D5, 0x904D, + 0x95D6, 0x4FBF, 0x95D7, 0x52C9, 0x95D8, 0x5A29, 0x95D9, 0x5F01, + 0x95DA, 0x97AD, 0x95DB, 0x4FDD, 0x95DC, 0x8217, 0x95DD, 0x92EA, + 0x95DE, 0x5703, 0x95DF, 0x6355, 0x95E0, 0x6B69, 0x95E1, 0x752B, + 0x95E2, 0x88DC, 0x95E3, 0x8F14, 0x95E4, 0x7A42, 0x95E5, 0x52DF, + 0x95E6, 0x5893, 0x95E7, 0x6155, 0x95E8, 0x620A, 0x95E9, 0x66AE, + 0x95EA, 0x6BCD, 0x95EB, 0x7C3F, 0x95EC, 0x83E9, 0x95ED, 0x5023, + 0x95EE, 0x4FF8, 0x95EF, 0x5305, 0x95F0, 0x5446, 0x95F1, 0x5831, + 0x95F2, 0x5949, 0x95F3, 0x5B9D, 0x95F4, 0x5CF0, 0x95F5, 0x5CEF, + 0x95F6, 0x5D29, 0x95F7, 0x5E96, 0x95F8, 0x62B1, 0x95F9, 0x6367, + 0x95FA, 0x653E, 0x95FB, 0x65B9, 0x95FC, 0x670B, 0x9640, 0x6CD5, + 0x9641, 0x6CE1, 0x9642, 0x70F9, 0x9643, 0x7832, 0x9644, 0x7E2B, + 0x9645, 0x80DE, 0x9646, 0x82B3, 0x9647, 0x840C, 0x9648, 0x84EC, + 0x9649, 0x8702, 0x964A, 0x8912, 0x964B, 0x8A2A, 0x964C, 0x8C4A, + 0x964D, 0x90A6, 0x964E, 0x92D2, 0x964F, 0x98FD, 0x9650, 0x9CF3, + 0x9651, 0x9D6C, 0x9652, 0x4E4F, 0x9653, 0x4EA1, 0x9654, 0x508D, + 0x9655, 0x5256, 0x9656, 0x574A, 0x9657, 0x59A8, 0x9658, 0x5E3D, + 0x9659, 0x5FD8, 0x965A, 0x5FD9, 0x965B, 0x623F, 0x965C, 0x66B4, + 0x965D, 0x671B, 0x965E, 0x67D0, 0x965F, 0x68D2, 0x9660, 0x5192, + 0x9661, 0x7D21, 0x9662, 0x80AA, 0x9663, 0x81A8, 0x9664, 0x8B00, + 0x9665, 0x8C8C, 0x9666, 0x8CBF, 0x9667, 0x927E, 0x9668, 0x9632, + 0x9669, 0x5420, 0x966A, 0x982C, 0x966B, 0x5317, 0x966C, 0x50D5, + 0x966D, 0x535C, 0x966E, 0x58A8, 0x966F, 0x64B2, 0x9670, 0x6734, + 0x9671, 0x7267, 0x9672, 0x7766, 0x9673, 0x7A46, 0x9674, 0x91E6, + 0x9675, 0x52C3, 0x9676, 0x6CA1, 0x9677, 0x6B86, 0x9678, 0x5800, + 0x9679, 0x5E4C, 0x967A, 0x5954, 0x967B, 0x672C, 0x967C, 0x7FFB, + 0x967D, 0x51E1, 0x967E, 0x76C6, 0x9680, 0x6469, 0x9681, 0x78E8, + 0x9682, 0x9B54, 0x9683, 0x9EBB, 0x9684, 0x57CB, 0x9685, 0x59B9, + 0x9686, 0x6627, 0x9687, 0x679A, 0x9688, 0x6BCE, 0x9689, 0x54E9, + 0x968A, 0x69D9, 0x968B, 0x5E55, 0x968C, 0x819C, 0x968D, 0x6795, + 0x968E, 0x9BAA, 0x968F, 0x67FE, 0x9690, 0x9C52, 0x9691, 0x685D, + 0x9692, 0x4EA6, 0x9693, 0x4FE3, 0x9694, 0x53C8, 0x9695, 0x62B9, + 0x9696, 0x672B, 0x9697, 0x6CAB, 0x9698, 0x8FC4, 0x9699, 0x4FAD, + 0x969A, 0x7E6D, 0x969B, 0x9EBF, 0x969C, 0x4E07, 0x969D, 0x6162, + 0x969E, 0x6E80, 0x969F, 0x6F2B, 0x96A0, 0x8513, 0x96A1, 0x5473, + 0x96A2, 0x672A, 0x96A3, 0x9B45, 0x96A4, 0x5DF3, 0x96A5, 0x7B95, + 0x96A6, 0x5CAC, 0x96A7, 0x5BC6, 0x96A8, 0x871C, 0x96A9, 0x6E4A, + 0x96AA, 0x84D1, 0x96AB, 0x7A14, 0x96AC, 0x8108, 0x96AD, 0x5999, + 0x96AE, 0x7C8D, 0x96AF, 0x6C11, 0x96B0, 0x7720, 0x96B1, 0x52D9, + 0x96B2, 0x5922, 0x96B3, 0x7121, 0x96B4, 0x725F, 0x96B5, 0x77DB, + 0x96B6, 0x9727, 0x96B7, 0x9D61, 0x96B8, 0x690B, 0x96B9, 0x5A7F, + 0x96BA, 0x5A18, 0x96BB, 0x51A5, 0x96BC, 0x540D, 0x96BD, 0x547D, + 0x96BE, 0x660E, 0x96BF, 0x76DF, 0x96C0, 0x8FF7, 0x96C1, 0x9298, + 0x96C2, 0x9CF4, 0x96C3, 0x59EA, 0x96C4, 0x725D, 0x96C5, 0x6EC5, + 0x96C6, 0x514D, 0x96C7, 0x68C9, 0x96C8, 0x7DBF, 0x96C9, 0x7DEC, + 0x96CA, 0x9762, 0x96CB, 0x9EBA, 0x96CC, 0x6478, 0x96CD, 0x6A21, + 0x96CE, 0x8302, 0x96CF, 0x5984, 0x96D0, 0x5B5F, 0x96D1, 0x6BDB, + 0x96D2, 0x731B, 0x96D3, 0x76F2, 0x96D4, 0x7DB2, 0x96D5, 0x8017, + 0x96D6, 0x8499, 0x96D7, 0x5132, 0x96D8, 0x6728, 0x96D9, 0x9ED9, + 0x96DA, 0x76EE, 0x96DB, 0x6762, 0x96DC, 0x52FF, 0x96DD, 0x9905, + 0x96DE, 0x5C24, 0x96DF, 0x623B, 0x96E0, 0x7C7E, 0x96E1, 0x8CB0, + 0x96E2, 0x554F, 0x96E3, 0x60B6, 0x96E4, 0x7D0B, 0x96E5, 0x9580, + 0x96E6, 0x5301, 0x96E7, 0x4E5F, 0x96E8, 0x51B6, 0x96E9, 0x591C, + 0x96EA, 0x723A, 0x96EB, 0x8036, 0x96EC, 0x91CE, 0x96ED, 0x5F25, + 0x96EE, 0x77E2, 0x96EF, 0x5384, 0x96F0, 0x5F79, 0x96F1, 0x7D04, + 0x96F2, 0x85AC, 0x96F3, 0x8A33, 0x96F4, 0x8E8D, 0x96F5, 0x9756, + 0x96F6, 0x67F3, 0x96F7, 0x85AE, 0x96F8, 0x9453, 0x96F9, 0x6109, + 0x96FA, 0x6108, 0x96FB, 0x6CB9, 0x96FC, 0x7652, 0x9740, 0x8AED, + 0x9741, 0x8F38, 0x9742, 0x552F, 0x9743, 0x4F51, 0x9744, 0x512A, + 0x9745, 0x52C7, 0x9746, 0x53CB, 0x9747, 0x5BA5, 0x9748, 0x5E7D, + 0x9749, 0x60A0, 0x974A, 0x6182, 0x974B, 0x63D6, 0x974C, 0x6709, + 0x974D, 0x67DA, 0x974E, 0x6E67, 0x974F, 0x6D8C, 0x9750, 0x7336, + 0x9751, 0x7337, 0x9752, 0x7531, 0x9753, 0x7950, 0x9754, 0x88D5, + 0x9755, 0x8A98, 0x9756, 0x904A, 0x9757, 0x9091, 0x9758, 0x90F5, + 0x9759, 0x96C4, 0x975A, 0x878D, 0x975B, 0x5915, 0x975C, 0x4E88, + 0x975D, 0x4F59, 0x975E, 0x4E0E, 0x975F, 0x8A89, 0x9760, 0x8F3F, + 0x9761, 0x9810, 0x9762, 0x50AD, 0x9763, 0x5E7C, 0x9764, 0x5996, + 0x9765, 0x5BB9, 0x9766, 0x5EB8, 0x9767, 0x63DA, 0x9768, 0x63FA, + 0x9769, 0x64C1, 0x976A, 0x66DC, 0x976B, 0x694A, 0x976C, 0x69D8, + 0x976D, 0x6D0B, 0x976E, 0x6EB6, 0x976F, 0x7194, 0x9770, 0x7528, + 0x9771, 0x7AAF, 0x9772, 0x7F8A, 0x9773, 0x8000, 0x9774, 0x8449, + 0x9775, 0x84C9, 0x9776, 0x8981, 0x9777, 0x8B21, 0x9778, 0x8E0A, + 0x9779, 0x9065, 0x977A, 0x967D, 0x977B, 0x990A, 0x977C, 0x617E, + 0x977D, 0x6291, 0x977E, 0x6B32, 0x9780, 0x6C83, 0x9781, 0x6D74, + 0x9782, 0x7FCC, 0x9783, 0x7FFC, 0x9784, 0x6DC0, 0x9785, 0x7F85, + 0x9786, 0x87BA, 0x9787, 0x88F8, 0x9788, 0x6765, 0x9789, 0x83B1, + 0x978A, 0x983C, 0x978B, 0x96F7, 0x978C, 0x6D1B, 0x978D, 0x7D61, + 0x978E, 0x843D, 0x978F, 0x916A, 0x9790, 0x4E71, 0x9791, 0x5375, + 0x9792, 0x5D50, 0x9793, 0x6B04, 0x9794, 0x6FEB, 0x9795, 0x85CD, + 0x9796, 0x862D, 0x9797, 0x89A7, 0x9798, 0x5229, 0x9799, 0x540F, + 0x979A, 0x5C65, 0x979B, 0x674E, 0x979C, 0x68A8, 0x979D, 0x7406, + 0x979E, 0x7483, 0x979F, 0x75E2, 0x97A0, 0x88CF, 0x97A1, 0x88E1, + 0x97A2, 0x91CC, 0x97A3, 0x96E2, 0x97A4, 0x9678, 0x97A5, 0x5F8B, + 0x97A6, 0x7387, 0x97A7, 0x7ACB, 0x97A8, 0x844E, 0x97A9, 0x63A0, + 0x97AA, 0x7565, 0x97AB, 0x5289, 0x97AC, 0x6D41, 0x97AD, 0x6E9C, + 0x97AE, 0x7409, 0x97AF, 0x7559, 0x97B0, 0x786B, 0x97B1, 0x7C92, + 0x97B2, 0x9686, 0x97B3, 0x7ADC, 0x97B4, 0x9F8D, 0x97B5, 0x4FB6, + 0x97B6, 0x616E, 0x97B7, 0x65C5, 0x97B8, 0x865C, 0x97B9, 0x4E86, + 0x97BA, 0x4EAE, 0x97BB, 0x50DA, 0x97BC, 0x4E21, 0x97BD, 0x51CC, + 0x97BE, 0x5BEE, 0x97BF, 0x6599, 0x97C0, 0x6881, 0x97C1, 0x6DBC, + 0x97C2, 0x731F, 0x97C3, 0x7642, 0x97C4, 0x77AD, 0x97C5, 0x7A1C, + 0x97C6, 0x7CE7, 0x97C7, 0x826F, 0x97C8, 0x8AD2, 0x97C9, 0x907C, + 0x97CA, 0x91CF, 0x97CB, 0x9675, 0x97CC, 0x9818, 0x97CD, 0x529B, + 0x97CE, 0x7DD1, 0x97CF, 0x502B, 0x97D0, 0x5398, 0x97D1, 0x6797, + 0x97D2, 0x6DCB, 0x97D3, 0x71D0, 0x97D4, 0x7433, 0x97D5, 0x81E8, + 0x97D6, 0x8F2A, 0x97D7, 0x96A3, 0x97D8, 0x9C57, 0x97D9, 0x9E9F, + 0x97DA, 0x7460, 0x97DB, 0x5841, 0x97DC, 0x6D99, 0x97DD, 0x7D2F, + 0x97DE, 0x985E, 0x97DF, 0x4EE4, 0x97E0, 0x4F36, 0x97E1, 0x4F8B, + 0x97E2, 0x51B7, 0x97E3, 0x52B1, 0x97E4, 0x5DBA, 0x97E5, 0x601C, + 0x97E6, 0x73B2, 0x97E7, 0x793C, 0x97E8, 0x82D3, 0x97E9, 0x9234, + 0x97EA, 0x96B7, 0x97EB, 0x96F6, 0x97EC, 0x970A, 0x97ED, 0x9E97, + 0x97EE, 0x9F62, 0x97EF, 0x66A6, 0x97F0, 0x6B74, 0x97F1, 0x5217, + 0x97F2, 0x52A3, 0x97F3, 0x70C8, 0x97F4, 0x88C2, 0x97F5, 0x5EC9, + 0x97F6, 0x604B, 0x97F7, 0x6190, 0x97F8, 0x6F23, 0x97F9, 0x7149, + 0x97FA, 0x7C3E, 0x97FB, 0x7DF4, 0x97FC, 0x806F, 0x9840, 0x84EE, + 0x9841, 0x9023, 0x9842, 0x932C, 0x9843, 0x5442, 0x9844, 0x9B6F, + 0x9845, 0x6AD3, 0x9846, 0x7089, 0x9847, 0x8CC2, 0x9848, 0x8DEF, + 0x9849, 0x9732, 0x984A, 0x52B4, 0x984B, 0x5A41, 0x984C, 0x5ECA, + 0x984D, 0x5F04, 0x984E, 0x6717, 0x984F, 0x697C, 0x9850, 0x6994, + 0x9851, 0x6D6A, 0x9852, 0x6F0F, 0x9853, 0x7262, 0x9854, 0x72FC, + 0x9855, 0x7BED, 0x9856, 0x8001, 0x9857, 0x807E, 0x9858, 0x874B, + 0x9859, 0x90CE, 0x985A, 0x516D, 0x985B, 0x9E93, 0x985C, 0x7984, + 0x985D, 0x808B, 0x985E, 0x9332, 0x985F, 0x8AD6, 0x9860, 0x502D, + 0x9861, 0x548C, 0x9862, 0x8A71, 0x9863, 0x6B6A, 0x9864, 0x8CC4, + 0x9865, 0x8107, 0x9866, 0x60D1, 0x9867, 0x67A0, 0x9868, 0x9DF2, + 0x9869, 0x4E99, 0x986A, 0x4E98, 0x986B, 0x9C10, 0x986C, 0x8A6B, + 0x986D, 0x85C1, 0x986E, 0x8568, 0x986F, 0x6900, 0x9870, 0x6E7E, + 0x9871, 0x7897, 0x9872, 0x8155, 0x989F, 0x5F0C, 0x98A0, 0x4E10, + 0x98A1, 0x4E15, 0x98A2, 0x4E2A, 0x98A3, 0x4E31, 0x98A4, 0x4E36, + 0x98A5, 0x4E3C, 0x98A6, 0x4E3F, 0x98A7, 0x4E42, 0x98A8, 0x4E56, + 0x98A9, 0x4E58, 0x98AA, 0x4E82, 0x98AB, 0x4E85, 0x98AC, 0x8C6B, + 0x98AD, 0x4E8A, 0x98AE, 0x8212, 0x98AF, 0x5F0D, 0x98B0, 0x4E8E, + 0x98B1, 0x4E9E, 0x98B2, 0x4E9F, 0x98B3, 0x4EA0, 0x98B4, 0x4EA2, + 0x98B5, 0x4EB0, 0x98B6, 0x4EB3, 0x98B7, 0x4EB6, 0x98B8, 0x4ECE, + 0x98B9, 0x4ECD, 0x98BA, 0x4EC4, 0x98BB, 0x4EC6, 0x98BC, 0x4EC2, + 0x98BD, 0x4ED7, 0x98BE, 0x4EDE, 0x98BF, 0x4EED, 0x98C0, 0x4EDF, + 0x98C1, 0x4EF7, 0x98C2, 0x4F09, 0x98C3, 0x4F5A, 0x98C4, 0x4F30, + 0x98C5, 0x4F5B, 0x98C6, 0x4F5D, 0x98C7, 0x4F57, 0x98C8, 0x4F47, + 0x98C9, 0x4F76, 0x98CA, 0x4F88, 0x98CB, 0x4F8F, 0x98CC, 0x4F98, + 0x98CD, 0x4F7B, 0x98CE, 0x4F69, 0x98CF, 0x4F70, 0x98D0, 0x4F91, + 0x98D1, 0x4F6F, 0x98D2, 0x4F86, 0x98D3, 0x4F96, 0x98D4, 0x5118, + 0x98D5, 0x4FD4, 0x98D6, 0x4FDF, 0x98D7, 0x4FCE, 0x98D8, 0x4FD8, + 0x98D9, 0x4FDB, 0x98DA, 0x4FD1, 0x98DB, 0x4FDA, 0x98DC, 0x4FD0, + 0x98DD, 0x4FE4, 0x98DE, 0x4FE5, 0x98DF, 0x501A, 0x98E0, 0x5028, + 0x98E1, 0x5014, 0x98E2, 0x502A, 0x98E3, 0x5025, 0x98E4, 0x5005, + 0x98E5, 0x4F1C, 0x98E6, 0x4FF6, 0x98E7, 0x5021, 0x98E8, 0x5029, + 0x98E9, 0x502C, 0x98EA, 0x4FFE, 0x98EB, 0x4FEF, 0x98EC, 0x5011, + 0x98ED, 0x5006, 0x98EE, 0x5043, 0x98EF, 0x5047, 0x98F0, 0x6703, + 0x98F1, 0x5055, 0x98F2, 0x5050, 0x98F3, 0x5048, 0x98F4, 0x505A, + 0x98F5, 0x5056, 0x98F6, 0x506C, 0x98F7, 0x5078, 0x98F8, 0x5080, + 0x98F9, 0x509A, 0x98FA, 0x5085, 0x98FB, 0x50B4, 0x98FC, 0x50B2, + 0x9940, 0x50C9, 0x9941, 0x50CA, 0x9942, 0x50B3, 0x9943, 0x50C2, + 0x9944, 0x50D6, 0x9945, 0x50DE, 0x9946, 0x50E5, 0x9947, 0x50ED, + 0x9948, 0x50E3, 0x9949, 0x50EE, 0x994A, 0x50F9, 0x994B, 0x50F5, + 0x994C, 0x5109, 0x994D, 0x5101, 0x994E, 0x5102, 0x994F, 0x5116, + 0x9950, 0x5115, 0x9951, 0x5114, 0x9952, 0x511A, 0x9953, 0x5121, + 0x9954, 0x513A, 0x9955, 0x5137, 0x9956, 0x513C, 0x9957, 0x513B, + 0x9958, 0x513F, 0x9959, 0x5140, 0x995A, 0x5152, 0x995B, 0x514C, + 0x995C, 0x5154, 0x995D, 0x5162, 0x995E, 0x7AF8, 0x995F, 0x5169, + 0x9960, 0x516A, 0x9961, 0x516E, 0x9962, 0x5180, 0x9963, 0x5182, + 0x9964, 0x56D8, 0x9965, 0x518C, 0x9966, 0x5189, 0x9967, 0x518F, + 0x9968, 0x5191, 0x9969, 0x5193, 0x996A, 0x5195, 0x996B, 0x5196, + 0x996C, 0x51A4, 0x996D, 0x51A6, 0x996E, 0x51A2, 0x996F, 0x51A9, + 0x9970, 0x51AA, 0x9971, 0x51AB, 0x9972, 0x51B3, 0x9973, 0x51B1, + 0x9974, 0x51B2, 0x9975, 0x51B0, 0x9976, 0x51B5, 0x9977, 0x51BD, + 0x9978, 0x51C5, 0x9979, 0x51C9, 0x997A, 0x51DB, 0x997B, 0x51E0, + 0x997C, 0x8655, 0x997D, 0x51E9, 0x997E, 0x51ED, 0x9980, 0x51F0, + 0x9981, 0x51F5, 0x9982, 0x51FE, 0x9983, 0x5204, 0x9984, 0x520B, + 0x9985, 0x5214, 0x9986, 0x520E, 0x9987, 0x5227, 0x9988, 0x522A, + 0x9989, 0x522E, 0x998A, 0x5233, 0x998B, 0x5239, 0x998C, 0x524F, + 0x998D, 0x5244, 0x998E, 0x524B, 0x998F, 0x524C, 0x9990, 0x525E, + 0x9991, 0x5254, 0x9992, 0x526A, 0x9993, 0x5274, 0x9994, 0x5269, + 0x9995, 0x5273, 0x9996, 0x527F, 0x9997, 0x527D, 0x9998, 0x528D, + 0x9999, 0x5294, 0x999A, 0x5292, 0x999B, 0x5271, 0x999C, 0x5288, + 0x999D, 0x5291, 0x999E, 0x8FA8, 0x999F, 0x8FA7, 0x99A0, 0x52AC, + 0x99A1, 0x52AD, 0x99A2, 0x52BC, 0x99A3, 0x52B5, 0x99A4, 0x52C1, + 0x99A5, 0x52CD, 0x99A6, 0x52D7, 0x99A7, 0x52DE, 0x99A8, 0x52E3, + 0x99A9, 0x52E6, 0x99AA, 0x98ED, 0x99AB, 0x52E0, 0x99AC, 0x52F3, + 0x99AD, 0x52F5, 0x99AE, 0x52F8, 0x99AF, 0x52F9, 0x99B0, 0x5306, + 0x99B1, 0x5308, 0x99B2, 0x7538, 0x99B3, 0x530D, 0x99B4, 0x5310, + 0x99B5, 0x530F, 0x99B6, 0x5315, 0x99B7, 0x531A, 0x99B8, 0x5323, + 0x99B9, 0x532F, 0x99BA, 0x5331, 0x99BB, 0x5333, 0x99BC, 0x5338, + 0x99BD, 0x5340, 0x99BE, 0x5346, 0x99BF, 0x5345, 0x99C0, 0x4E17, + 0x99C1, 0x5349, 0x99C2, 0x534D, 0x99C3, 0x51D6, 0x99C4, 0x535E, + 0x99C5, 0x5369, 0x99C6, 0x536E, 0x99C7, 0x5918, 0x99C8, 0x537B, + 0x99C9, 0x5377, 0x99CA, 0x5382, 0x99CB, 0x5396, 0x99CC, 0x53A0, + 0x99CD, 0x53A6, 0x99CE, 0x53A5, 0x99CF, 0x53AE, 0x99D0, 0x53B0, + 0x99D1, 0x53B6, 0x99D2, 0x53C3, 0x99D3, 0x7C12, 0x99D4, 0x96D9, + 0x99D5, 0x53DF, 0x99D6, 0x66FC, 0x99D7, 0x71EE, 0x99D8, 0x53EE, + 0x99D9, 0x53E8, 0x99DA, 0x53ED, 0x99DB, 0x53FA, 0x99DC, 0x5401, + 0x99DD, 0x543D, 0x99DE, 0x5440, 0x99DF, 0x542C, 0x99E0, 0x542D, + 0x99E1, 0x543C, 0x99E2, 0x542E, 0x99E3, 0x5436, 0x99E4, 0x5429, + 0x99E5, 0x541D, 0x99E6, 0x544E, 0x99E7, 0x548F, 0x99E8, 0x5475, + 0x99E9, 0x548E, 0x99EA, 0x545F, 0x99EB, 0x5471, 0x99EC, 0x5477, + 0x99ED, 0x5470, 0x99EE, 0x5492, 0x99EF, 0x547B, 0x99F0, 0x5480, + 0x99F1, 0x5476, 0x99F2, 0x5484, 0x99F3, 0x5490, 0x99F4, 0x5486, + 0x99F5, 0x54C7, 0x99F6, 0x54A2, 0x99F7, 0x54B8, 0x99F8, 0x54A5, + 0x99F9, 0x54AC, 0x99FA, 0x54C4, 0x99FB, 0x54C8, 0x99FC, 0x54A8, + 0x9A40, 0x54AB, 0x9A41, 0x54C2, 0x9A42, 0x54A4, 0x9A43, 0x54BE, + 0x9A44, 0x54BC, 0x9A45, 0x54D8, 0x9A46, 0x54E5, 0x9A47, 0x54E6, + 0x9A48, 0x550F, 0x9A49, 0x5514, 0x9A4A, 0x54FD, 0x9A4B, 0x54EE, + 0x9A4C, 0x54ED, 0x9A4D, 0x54FA, 0x9A4E, 0x54E2, 0x9A4F, 0x5539, + 0x9A50, 0x5540, 0x9A51, 0x5563, 0x9A52, 0x554C, 0x9A53, 0x552E, + 0x9A54, 0x555C, 0x9A55, 0x5545, 0x9A56, 0x5556, 0x9A57, 0x5557, + 0x9A58, 0x5538, 0x9A59, 0x5533, 0x9A5A, 0x555D, 0x9A5B, 0x5599, + 0x9A5C, 0x5580, 0x9A5D, 0x54AF, 0x9A5E, 0x558A, 0x9A5F, 0x559F, + 0x9A60, 0x557B, 0x9A61, 0x557E, 0x9A62, 0x5598, 0x9A63, 0x559E, + 0x9A64, 0x55AE, 0x9A65, 0x557C, 0x9A66, 0x5583, 0x9A67, 0x55A9, + 0x9A68, 0x5587, 0x9A69, 0x55A8, 0x9A6A, 0x55DA, 0x9A6B, 0x55C5, + 0x9A6C, 0x55DF, 0x9A6D, 0x55C4, 0x9A6E, 0x55DC, 0x9A6F, 0x55E4, + 0x9A70, 0x55D4, 0x9A71, 0x5614, 0x9A72, 0x55F7, 0x9A73, 0x5616, + 0x9A74, 0x55FE, 0x9A75, 0x55FD, 0x9A76, 0x561B, 0x9A77, 0x55F9, + 0x9A78, 0x564E, 0x9A79, 0x5650, 0x9A7A, 0x71DF, 0x9A7B, 0x5634, + 0x9A7C, 0x5636, 0x9A7D, 0x5632, 0x9A7E, 0x5638, 0x9A80, 0x566B, + 0x9A81, 0x5664, 0x9A82, 0x562F, 0x9A83, 0x566C, 0x9A84, 0x566A, + 0x9A85, 0x5686, 0x9A86, 0x5680, 0x9A87, 0x568A, 0x9A88, 0x56A0, + 0x9A89, 0x5694, 0x9A8A, 0x568F, 0x9A8B, 0x56A5, 0x9A8C, 0x56AE, + 0x9A8D, 0x56B6, 0x9A8E, 0x56B4, 0x9A8F, 0x56C2, 0x9A90, 0x56BC, + 0x9A91, 0x56C1, 0x9A92, 0x56C3, 0x9A93, 0x56C0, 0x9A94, 0x56C8, + 0x9A95, 0x56CE, 0x9A96, 0x56D1, 0x9A97, 0x56D3, 0x9A98, 0x56D7, + 0x9A99, 0x56EE, 0x9A9A, 0x56F9, 0x9A9B, 0x5700, 0x9A9C, 0x56FF, + 0x9A9D, 0x5704, 0x9A9E, 0x5709, 0x9A9F, 0x5708, 0x9AA0, 0x570B, + 0x9AA1, 0x570D, 0x9AA2, 0x5713, 0x9AA3, 0x5718, 0x9AA4, 0x5716, + 0x9AA5, 0x55C7, 0x9AA6, 0x571C, 0x9AA7, 0x5726, 0x9AA8, 0x5737, + 0x9AA9, 0x5738, 0x9AAA, 0x574E, 0x9AAB, 0x573B, 0x9AAC, 0x5740, + 0x9AAD, 0x574F, 0x9AAE, 0x5769, 0x9AAF, 0x57C0, 0x9AB0, 0x5788, + 0x9AB1, 0x5761, 0x9AB2, 0x577F, 0x9AB3, 0x5789, 0x9AB4, 0x5793, + 0x9AB5, 0x57A0, 0x9AB6, 0x57B3, 0x9AB7, 0x57A4, 0x9AB8, 0x57AA, + 0x9AB9, 0x57B0, 0x9ABA, 0x57C3, 0x9ABB, 0x57C6, 0x9ABC, 0x57D4, + 0x9ABD, 0x57D2, 0x9ABE, 0x57D3, 0x9ABF, 0x580A, 0x9AC0, 0x57D6, + 0x9AC1, 0x57E3, 0x9AC2, 0x580B, 0x9AC3, 0x5819, 0x9AC4, 0x581D, + 0x9AC5, 0x5872, 0x9AC6, 0x5821, 0x9AC7, 0x5862, 0x9AC8, 0x584B, + 0x9AC9, 0x5870, 0x9ACA, 0x6BC0, 0x9ACB, 0x5852, 0x9ACC, 0x583D, + 0x9ACD, 0x5879, 0x9ACE, 0x5885, 0x9ACF, 0x58B9, 0x9AD0, 0x589F, + 0x9AD1, 0x58AB, 0x9AD2, 0x58BA, 0x9AD3, 0x58DE, 0x9AD4, 0x58BB, + 0x9AD5, 0x58B8, 0x9AD6, 0x58AE, 0x9AD7, 0x58C5, 0x9AD8, 0x58D3, + 0x9AD9, 0x58D1, 0x9ADA, 0x58D7, 0x9ADB, 0x58D9, 0x9ADC, 0x58D8, + 0x9ADD, 0x58E5, 0x9ADE, 0x58DC, 0x9ADF, 0x58E4, 0x9AE0, 0x58DF, + 0x9AE1, 0x58EF, 0x9AE2, 0x58FA, 0x9AE3, 0x58F9, 0x9AE4, 0x58FB, + 0x9AE5, 0x58FC, 0x9AE6, 0x58FD, 0x9AE7, 0x5902, 0x9AE8, 0x590A, + 0x9AE9, 0x5910, 0x9AEA, 0x591B, 0x9AEB, 0x68A6, 0x9AEC, 0x5925, + 0x9AED, 0x592C, 0x9AEE, 0x592D, 0x9AEF, 0x5932, 0x9AF0, 0x5938, + 0x9AF1, 0x593E, 0x9AF2, 0x7AD2, 0x9AF3, 0x5955, 0x9AF4, 0x5950, + 0x9AF5, 0x594E, 0x9AF6, 0x595A, 0x9AF7, 0x5958, 0x9AF8, 0x5962, + 0x9AF9, 0x5960, 0x9AFA, 0x5967, 0x9AFB, 0x596C, 0x9AFC, 0x5969, + 0x9B40, 0x5978, 0x9B41, 0x5981, 0x9B42, 0x599D, 0x9B43, 0x4F5E, + 0x9B44, 0x4FAB, 0x9B45, 0x59A3, 0x9B46, 0x59B2, 0x9B47, 0x59C6, + 0x9B48, 0x59E8, 0x9B49, 0x59DC, 0x9B4A, 0x598D, 0x9B4B, 0x59D9, + 0x9B4C, 0x59DA, 0x9B4D, 0x5A25, 0x9B4E, 0x5A1F, 0x9B4F, 0x5A11, + 0x9B50, 0x5A1C, 0x9B51, 0x5A09, 0x9B52, 0x5A1A, 0x9B53, 0x5A40, + 0x9B54, 0x5A6C, 0x9B55, 0x5A49, 0x9B56, 0x5A35, 0x9B57, 0x5A36, + 0x9B58, 0x5A62, 0x9B59, 0x5A6A, 0x9B5A, 0x5A9A, 0x9B5B, 0x5ABC, + 0x9B5C, 0x5ABE, 0x9B5D, 0x5ACB, 0x9B5E, 0x5AC2, 0x9B5F, 0x5ABD, + 0x9B60, 0x5AE3, 0x9B61, 0x5AD7, 0x9B62, 0x5AE6, 0x9B63, 0x5AE9, + 0x9B64, 0x5AD6, 0x9B65, 0x5AFA, 0x9B66, 0x5AFB, 0x9B67, 0x5B0C, + 0x9B68, 0x5B0B, 0x9B69, 0x5B16, 0x9B6A, 0x5B32, 0x9B6B, 0x5AD0, + 0x9B6C, 0x5B2A, 0x9B6D, 0x5B36, 0x9B6E, 0x5B3E, 0x9B6F, 0x5B43, + 0x9B70, 0x5B45, 0x9B71, 0x5B40, 0x9B72, 0x5B51, 0x9B73, 0x5B55, + 0x9B74, 0x5B5A, 0x9B75, 0x5B5B, 0x9B76, 0x5B65, 0x9B77, 0x5B69, + 0x9B78, 0x5B70, 0x9B79, 0x5B73, 0x9B7A, 0x5B75, 0x9B7B, 0x5B78, + 0x9B7C, 0x6588, 0x9B7D, 0x5B7A, 0x9B7E, 0x5B80, 0x9B80, 0x5B83, + 0x9B81, 0x5BA6, 0x9B82, 0x5BB8, 0x9B83, 0x5BC3, 0x9B84, 0x5BC7, + 0x9B85, 0x5BC9, 0x9B86, 0x5BD4, 0x9B87, 0x5BD0, 0x9B88, 0x5BE4, + 0x9B89, 0x5BE6, 0x9B8A, 0x5BE2, 0x9B8B, 0x5BDE, 0x9B8C, 0x5BE5, + 0x9B8D, 0x5BEB, 0x9B8E, 0x5BF0, 0x9B8F, 0x5BF6, 0x9B90, 0x5BF3, + 0x9B91, 0x5C05, 0x9B92, 0x5C07, 0x9B93, 0x5C08, 0x9B94, 0x5C0D, + 0x9B95, 0x5C13, 0x9B96, 0x5C20, 0x9B97, 0x5C22, 0x9B98, 0x5C28, + 0x9B99, 0x5C38, 0x9B9A, 0x5C39, 0x9B9B, 0x5C41, 0x9B9C, 0x5C46, + 0x9B9D, 0x5C4E, 0x9B9E, 0x5C53, 0x9B9F, 0x5C50, 0x9BA0, 0x5C4F, + 0x9BA1, 0x5B71, 0x9BA2, 0x5C6C, 0x9BA3, 0x5C6E, 0x9BA4, 0x4E62, + 0x9BA5, 0x5C76, 0x9BA6, 0x5C79, 0x9BA7, 0x5C8C, 0x9BA8, 0x5C91, + 0x9BA9, 0x5C94, 0x9BAA, 0x599B, 0x9BAB, 0x5CAB, 0x9BAC, 0x5CBB, + 0x9BAD, 0x5CB6, 0x9BAE, 0x5CBC, 0x9BAF, 0x5CB7, 0x9BB0, 0x5CC5, + 0x9BB1, 0x5CBE, 0x9BB2, 0x5CC7, 0x9BB3, 0x5CD9, 0x9BB4, 0x5CE9, + 0x9BB5, 0x5CFD, 0x9BB6, 0x5CFA, 0x9BB7, 0x5CED, 0x9BB8, 0x5D8C, + 0x9BB9, 0x5CEA, 0x9BBA, 0x5D0B, 0x9BBB, 0x5D15, 0x9BBC, 0x5D17, + 0x9BBD, 0x5D5C, 0x9BBE, 0x5D1F, 0x9BBF, 0x5D1B, 0x9BC0, 0x5D11, + 0x9BC1, 0x5D14, 0x9BC2, 0x5D22, 0x9BC3, 0x5D1A, 0x9BC4, 0x5D19, + 0x9BC5, 0x5D18, 0x9BC6, 0x5D4C, 0x9BC7, 0x5D52, 0x9BC8, 0x5D4E, + 0x9BC9, 0x5D4B, 0x9BCA, 0x5D6C, 0x9BCB, 0x5D73, 0x9BCC, 0x5D76, + 0x9BCD, 0x5D87, 0x9BCE, 0x5D84, 0x9BCF, 0x5D82, 0x9BD0, 0x5DA2, + 0x9BD1, 0x5D9D, 0x9BD2, 0x5DAC, 0x9BD3, 0x5DAE, 0x9BD4, 0x5DBD, + 0x9BD5, 0x5D90, 0x9BD6, 0x5DB7, 0x9BD7, 0x5DBC, 0x9BD8, 0x5DC9, + 0x9BD9, 0x5DCD, 0x9BDA, 0x5DD3, 0x9BDB, 0x5DD2, 0x9BDC, 0x5DD6, + 0x9BDD, 0x5DDB, 0x9BDE, 0x5DEB, 0x9BDF, 0x5DF2, 0x9BE0, 0x5DF5, + 0x9BE1, 0x5E0B, 0x9BE2, 0x5E1A, 0x9BE3, 0x5E19, 0x9BE4, 0x5E11, + 0x9BE5, 0x5E1B, 0x9BE6, 0x5E36, 0x9BE7, 0x5E37, 0x9BE8, 0x5E44, + 0x9BE9, 0x5E43, 0x9BEA, 0x5E40, 0x9BEB, 0x5E4E, 0x9BEC, 0x5E57, + 0x9BED, 0x5E54, 0x9BEE, 0x5E5F, 0x9BEF, 0x5E62, 0x9BF0, 0x5E64, + 0x9BF1, 0x5E47, 0x9BF2, 0x5E75, 0x9BF3, 0x5E76, 0x9BF4, 0x5E7A, + 0x9BF5, 0x9EBC, 0x9BF6, 0x5E7F, 0x9BF7, 0x5EA0, 0x9BF8, 0x5EC1, + 0x9BF9, 0x5EC2, 0x9BFA, 0x5EC8, 0x9BFB, 0x5ED0, 0x9BFC, 0x5ECF, + 0x9C40, 0x5ED6, 0x9C41, 0x5EE3, 0x9C42, 0x5EDD, 0x9C43, 0x5EDA, + 0x9C44, 0x5EDB, 0x9C45, 0x5EE2, 0x9C46, 0x5EE1, 0x9C47, 0x5EE8, + 0x9C48, 0x5EE9, 0x9C49, 0x5EEC, 0x9C4A, 0x5EF1, 0x9C4B, 0x5EF3, + 0x9C4C, 0x5EF0, 0x9C4D, 0x5EF4, 0x9C4E, 0x5EF8, 0x9C4F, 0x5EFE, + 0x9C50, 0x5F03, 0x9C51, 0x5F09, 0x9C52, 0x5F5D, 0x9C53, 0x5F5C, + 0x9C54, 0x5F0B, 0x9C55, 0x5F11, 0x9C56, 0x5F16, 0x9C57, 0x5F29, + 0x9C58, 0x5F2D, 0x9C59, 0x5F38, 0x9C5A, 0x5F41, 0x9C5B, 0x5F48, + 0x9C5C, 0x5F4C, 0x9C5D, 0x5F4E, 0x9C5E, 0x5F2F, 0x9C5F, 0x5F51, + 0x9C60, 0x5F56, 0x9C61, 0x5F57, 0x9C62, 0x5F59, 0x9C63, 0x5F61, + 0x9C64, 0x5F6D, 0x9C65, 0x5F73, 0x9C66, 0x5F77, 0x9C67, 0x5F83, + 0x9C68, 0x5F82, 0x9C69, 0x5F7F, 0x9C6A, 0x5F8A, 0x9C6B, 0x5F88, + 0x9C6C, 0x5F91, 0x9C6D, 0x5F87, 0x9C6E, 0x5F9E, 0x9C6F, 0x5F99, + 0x9C70, 0x5F98, 0x9C71, 0x5FA0, 0x9C72, 0x5FA8, 0x9C73, 0x5FAD, + 0x9C74, 0x5FBC, 0x9C75, 0x5FD6, 0x9C76, 0x5FFB, 0x9C77, 0x5FE4, + 0x9C78, 0x5FF8, 0x9C79, 0x5FF1, 0x9C7A, 0x5FDD, 0x9C7B, 0x60B3, + 0x9C7C, 0x5FFF, 0x9C7D, 0x6021, 0x9C7E, 0x6060, 0x9C80, 0x6019, + 0x9C81, 0x6010, 0x9C82, 0x6029, 0x9C83, 0x600E, 0x9C84, 0x6031, + 0x9C85, 0x601B, 0x9C86, 0x6015, 0x9C87, 0x602B, 0x9C88, 0x6026, + 0x9C89, 0x600F, 0x9C8A, 0x603A, 0x9C8B, 0x605A, 0x9C8C, 0x6041, + 0x9C8D, 0x606A, 0x9C8E, 0x6077, 0x9C8F, 0x605F, 0x9C90, 0x604A, + 0x9C91, 0x6046, 0x9C92, 0x604D, 0x9C93, 0x6063, 0x9C94, 0x6043, + 0x9C95, 0x6064, 0x9C96, 0x6042, 0x9C97, 0x606C, 0x9C98, 0x606B, + 0x9C99, 0x6059, 0x9C9A, 0x6081, 0x9C9B, 0x608D, 0x9C9C, 0x60E7, + 0x9C9D, 0x6083, 0x9C9E, 0x609A, 0x9C9F, 0x6084, 0x9CA0, 0x609B, + 0x9CA1, 0x6096, 0x9CA2, 0x6097, 0x9CA3, 0x6092, 0x9CA4, 0x60A7, + 0x9CA5, 0x608B, 0x9CA6, 0x60E1, 0x9CA7, 0x60B8, 0x9CA8, 0x60E0, + 0x9CA9, 0x60D3, 0x9CAA, 0x60B4, 0x9CAB, 0x5FF0, 0x9CAC, 0x60BD, + 0x9CAD, 0x60C6, 0x9CAE, 0x60B5, 0x9CAF, 0x60D8, 0x9CB0, 0x614D, + 0x9CB1, 0x6115, 0x9CB2, 0x6106, 0x9CB3, 0x60F6, 0x9CB4, 0x60F7, + 0x9CB5, 0x6100, 0x9CB6, 0x60F4, 0x9CB7, 0x60FA, 0x9CB8, 0x6103, + 0x9CB9, 0x6121, 0x9CBA, 0x60FB, 0x9CBB, 0x60F1, 0x9CBC, 0x610D, + 0x9CBD, 0x610E, 0x9CBE, 0x6147, 0x9CBF, 0x613E, 0x9CC0, 0x6128, + 0x9CC1, 0x6127, 0x9CC2, 0x614A, 0x9CC3, 0x613F, 0x9CC4, 0x613C, + 0x9CC5, 0x612C, 0x9CC6, 0x6134, 0x9CC7, 0x613D, 0x9CC8, 0x6142, + 0x9CC9, 0x6144, 0x9CCA, 0x6173, 0x9CCB, 0x6177, 0x9CCC, 0x6158, + 0x9CCD, 0x6159, 0x9CCE, 0x615A, 0x9CCF, 0x616B, 0x9CD0, 0x6174, + 0x9CD1, 0x616F, 0x9CD2, 0x6165, 0x9CD3, 0x6171, 0x9CD4, 0x615F, + 0x9CD5, 0x615D, 0x9CD6, 0x6153, 0x9CD7, 0x6175, 0x9CD8, 0x6199, + 0x9CD9, 0x6196, 0x9CDA, 0x6187, 0x9CDB, 0x61AC, 0x9CDC, 0x6194, + 0x9CDD, 0x619A, 0x9CDE, 0x618A, 0x9CDF, 0x6191, 0x9CE0, 0x61AB, + 0x9CE1, 0x61AE, 0x9CE2, 0x61CC, 0x9CE3, 0x61CA, 0x9CE4, 0x61C9, + 0x9CE5, 0x61F7, 0x9CE6, 0x61C8, 0x9CE7, 0x61C3, 0x9CE8, 0x61C6, + 0x9CE9, 0x61BA, 0x9CEA, 0x61CB, 0x9CEB, 0x7F79, 0x9CEC, 0x61CD, + 0x9CED, 0x61E6, 0x9CEE, 0x61E3, 0x9CEF, 0x61F6, 0x9CF0, 0x61FA, + 0x9CF1, 0x61F4, 0x9CF2, 0x61FF, 0x9CF3, 0x61FD, 0x9CF4, 0x61FC, + 0x9CF5, 0x61FE, 0x9CF6, 0x6200, 0x9CF7, 0x6208, 0x9CF8, 0x6209, + 0x9CF9, 0x620D, 0x9CFA, 0x620C, 0x9CFB, 0x6214, 0x9CFC, 0x621B, + 0x9D40, 0x621E, 0x9D41, 0x6221, 0x9D42, 0x622A, 0x9D43, 0x622E, + 0x9D44, 0x6230, 0x9D45, 0x6232, 0x9D46, 0x6233, 0x9D47, 0x6241, + 0x9D48, 0x624E, 0x9D49, 0x625E, 0x9D4A, 0x6263, 0x9D4B, 0x625B, + 0x9D4C, 0x6260, 0x9D4D, 0x6268, 0x9D4E, 0x627C, 0x9D4F, 0x6282, + 0x9D50, 0x6289, 0x9D51, 0x627E, 0x9D52, 0x6292, 0x9D53, 0x6293, + 0x9D54, 0x6296, 0x9D55, 0x62D4, 0x9D56, 0x6283, 0x9D57, 0x6294, + 0x9D58, 0x62D7, 0x9D59, 0x62D1, 0x9D5A, 0x62BB, 0x9D5B, 0x62CF, + 0x9D5C, 0x62FF, 0x9D5D, 0x62C6, 0x9D5E, 0x64D4, 0x9D5F, 0x62C8, + 0x9D60, 0x62DC, 0x9D61, 0x62CC, 0x9D62, 0x62CA, 0x9D63, 0x62C2, + 0x9D64, 0x62C7, 0x9D65, 0x629B, 0x9D66, 0x62C9, 0x9D67, 0x630C, + 0x9D68, 0x62EE, 0x9D69, 0x62F1, 0x9D6A, 0x6327, 0x9D6B, 0x6302, + 0x9D6C, 0x6308, 0x9D6D, 0x62EF, 0x9D6E, 0x62F5, 0x9D6F, 0x6350, + 0x9D70, 0x633E, 0x9D71, 0x634D, 0x9D72, 0x641C, 0x9D73, 0x634F, + 0x9D74, 0x6396, 0x9D75, 0x638E, 0x9D76, 0x6380, 0x9D77, 0x63AB, + 0x9D78, 0x6376, 0x9D79, 0x63A3, 0x9D7A, 0x638F, 0x9D7B, 0x6389, + 0x9D7C, 0x639F, 0x9D7D, 0x63B5, 0x9D7E, 0x636B, 0x9D80, 0x6369, + 0x9D81, 0x63BE, 0x9D82, 0x63E9, 0x9D83, 0x63C0, 0x9D84, 0x63C6, + 0x9D85, 0x63E3, 0x9D86, 0x63C9, 0x9D87, 0x63D2, 0x9D88, 0x63F6, + 0x9D89, 0x63C4, 0x9D8A, 0x6416, 0x9D8B, 0x6434, 0x9D8C, 0x6406, + 0x9D8D, 0x6413, 0x9D8E, 0x6426, 0x9D8F, 0x6436, 0x9D90, 0x651D, + 0x9D91, 0x6417, 0x9D92, 0x6428, 0x9D93, 0x640F, 0x9D94, 0x6467, + 0x9D95, 0x646F, 0x9D96, 0x6476, 0x9D97, 0x644E, 0x9D98, 0x652A, + 0x9D99, 0x6495, 0x9D9A, 0x6493, 0x9D9B, 0x64A5, 0x9D9C, 0x64A9, + 0x9D9D, 0x6488, 0x9D9E, 0x64BC, 0x9D9F, 0x64DA, 0x9DA0, 0x64D2, + 0x9DA1, 0x64C5, 0x9DA2, 0x64C7, 0x9DA3, 0x64BB, 0x9DA4, 0x64D8, + 0x9DA5, 0x64C2, 0x9DA6, 0x64F1, 0x9DA7, 0x64E7, 0x9DA8, 0x8209, + 0x9DA9, 0x64E0, 0x9DAA, 0x64E1, 0x9DAB, 0x62AC, 0x9DAC, 0x64E3, + 0x9DAD, 0x64EF, 0x9DAE, 0x652C, 0x9DAF, 0x64F6, 0x9DB0, 0x64F4, + 0x9DB1, 0x64F2, 0x9DB2, 0x64FA, 0x9DB3, 0x6500, 0x9DB4, 0x64FD, + 0x9DB5, 0x6518, 0x9DB6, 0x651C, 0x9DB7, 0x6505, 0x9DB8, 0x6524, + 0x9DB9, 0x6523, 0x9DBA, 0x652B, 0x9DBB, 0x6534, 0x9DBC, 0x6535, + 0x9DBD, 0x6537, 0x9DBE, 0x6536, 0x9DBF, 0x6538, 0x9DC0, 0x754B, + 0x9DC1, 0x6548, 0x9DC2, 0x6556, 0x9DC3, 0x6555, 0x9DC4, 0x654D, + 0x9DC5, 0x6558, 0x9DC6, 0x655E, 0x9DC7, 0x655D, 0x9DC8, 0x6572, + 0x9DC9, 0x6578, 0x9DCA, 0x6582, 0x9DCB, 0x6583, 0x9DCC, 0x8B8A, + 0x9DCD, 0x659B, 0x9DCE, 0x659F, 0x9DCF, 0x65AB, 0x9DD0, 0x65B7, + 0x9DD1, 0x65C3, 0x9DD2, 0x65C6, 0x9DD3, 0x65C1, 0x9DD4, 0x65C4, + 0x9DD5, 0x65CC, 0x9DD6, 0x65D2, 0x9DD7, 0x65DB, 0x9DD8, 0x65D9, + 0x9DD9, 0x65E0, 0x9DDA, 0x65E1, 0x9DDB, 0x65F1, 0x9DDC, 0x6772, + 0x9DDD, 0x660A, 0x9DDE, 0x6603, 0x9DDF, 0x65FB, 0x9DE0, 0x6773, + 0x9DE1, 0x6635, 0x9DE2, 0x6636, 0x9DE3, 0x6634, 0x9DE4, 0x661C, + 0x9DE5, 0x664F, 0x9DE6, 0x6644, 0x9DE7, 0x6649, 0x9DE8, 0x6641, + 0x9DE9, 0x665E, 0x9DEA, 0x665D, 0x9DEB, 0x6664, 0x9DEC, 0x6667, + 0x9DED, 0x6668, 0x9DEE, 0x665F, 0x9DEF, 0x6662, 0x9DF0, 0x6670, + 0x9DF1, 0x6683, 0x9DF2, 0x6688, 0x9DF3, 0x668E, 0x9DF4, 0x6689, + 0x9DF5, 0x6684, 0x9DF6, 0x6698, 0x9DF7, 0x669D, 0x9DF8, 0x66C1, + 0x9DF9, 0x66B9, 0x9DFA, 0x66C9, 0x9DFB, 0x66BE, 0x9DFC, 0x66BC, + 0x9E40, 0x66C4, 0x9E41, 0x66B8, 0x9E42, 0x66D6, 0x9E43, 0x66DA, + 0x9E44, 0x66E0, 0x9E45, 0x663F, 0x9E46, 0x66E6, 0x9E47, 0x66E9, + 0x9E48, 0x66F0, 0x9E49, 0x66F5, 0x9E4A, 0x66F7, 0x9E4B, 0x670F, + 0x9E4C, 0x6716, 0x9E4D, 0x671E, 0x9E4E, 0x6726, 0x9E4F, 0x6727, + 0x9E50, 0x9738, 0x9E51, 0x672E, 0x9E52, 0x673F, 0x9E53, 0x6736, + 0x9E54, 0x6741, 0x9E55, 0x6738, 0x9E56, 0x6737, 0x9E57, 0x6746, + 0x9E58, 0x675E, 0x9E59, 0x6760, 0x9E5A, 0x6759, 0x9E5B, 0x6763, + 0x9E5C, 0x6764, 0x9E5D, 0x6789, 0x9E5E, 0x6770, 0x9E5F, 0x67A9, + 0x9E60, 0x677C, 0x9E61, 0x676A, 0x9E62, 0x678C, 0x9E63, 0x678B, + 0x9E64, 0x67A6, 0x9E65, 0x67A1, 0x9E66, 0x6785, 0x9E67, 0x67B7, + 0x9E68, 0x67EF, 0x9E69, 0x67B4, 0x9E6A, 0x67EC, 0x9E6B, 0x67B3, + 0x9E6C, 0x67E9, 0x9E6D, 0x67B8, 0x9E6E, 0x67E4, 0x9E6F, 0x67DE, + 0x9E70, 0x67DD, 0x9E71, 0x67E2, 0x9E72, 0x67EE, 0x9E73, 0x67B9, + 0x9E74, 0x67CE, 0x9E75, 0x67C6, 0x9E76, 0x67E7, 0x9E77, 0x6A9C, + 0x9E78, 0x681E, 0x9E79, 0x6846, 0x9E7A, 0x6829, 0x9E7B, 0x6840, + 0x9E7C, 0x684D, 0x9E7D, 0x6832, 0x9E7E, 0x684E, 0x9E80, 0x68B3, + 0x9E81, 0x682B, 0x9E82, 0x6859, 0x9E83, 0x6863, 0x9E84, 0x6877, + 0x9E85, 0x687F, 0x9E86, 0x689F, 0x9E87, 0x688F, 0x9E88, 0x68AD, + 0x9E89, 0x6894, 0x9E8A, 0x689D, 0x9E8B, 0x689B, 0x9E8C, 0x6883, + 0x9E8D, 0x6AAE, 0x9E8E, 0x68B9, 0x9E8F, 0x6874, 0x9E90, 0x68B5, + 0x9E91, 0x68A0, 0x9E92, 0x68BA, 0x9E93, 0x690F, 0x9E94, 0x688D, + 0x9E95, 0x687E, 0x9E96, 0x6901, 0x9E97, 0x68CA, 0x9E98, 0x6908, + 0x9E99, 0x68D8, 0x9E9A, 0x6922, 0x9E9B, 0x6926, 0x9E9C, 0x68E1, + 0x9E9D, 0x690C, 0x9E9E, 0x68CD, 0x9E9F, 0x68D4, 0x9EA0, 0x68E7, + 0x9EA1, 0x68D5, 0x9EA2, 0x6936, 0x9EA3, 0x6912, 0x9EA4, 0x6904, + 0x9EA5, 0x68D7, 0x9EA6, 0x68E3, 0x9EA7, 0x6925, 0x9EA8, 0x68F9, + 0x9EA9, 0x68E0, 0x9EAA, 0x68EF, 0x9EAB, 0x6928, 0x9EAC, 0x692A, + 0x9EAD, 0x691A, 0x9EAE, 0x6923, 0x9EAF, 0x6921, 0x9EB0, 0x68C6, + 0x9EB1, 0x6979, 0x9EB2, 0x6977, 0x9EB3, 0x695C, 0x9EB4, 0x6978, + 0x9EB5, 0x696B, 0x9EB6, 0x6954, 0x9EB7, 0x697E, 0x9EB8, 0x696E, + 0x9EB9, 0x6939, 0x9EBA, 0x6974, 0x9EBB, 0x693D, 0x9EBC, 0x6959, + 0x9EBD, 0x6930, 0x9EBE, 0x6961, 0x9EBF, 0x695E, 0x9EC0, 0x695D, + 0x9EC1, 0x6981, 0x9EC2, 0x696A, 0x9EC3, 0x69B2, 0x9EC4, 0x69AE, + 0x9EC5, 0x69D0, 0x9EC6, 0x69BF, 0x9EC7, 0x69C1, 0x9EC8, 0x69D3, + 0x9EC9, 0x69BE, 0x9ECA, 0x69CE, 0x9ECB, 0x5BE8, 0x9ECC, 0x69CA, + 0x9ECD, 0x69DD, 0x9ECE, 0x69BB, 0x9ECF, 0x69C3, 0x9ED0, 0x69A7, + 0x9ED1, 0x6A2E, 0x9ED2, 0x6991, 0x9ED3, 0x69A0, 0x9ED4, 0x699C, + 0x9ED5, 0x6995, 0x9ED6, 0x69B4, 0x9ED7, 0x69DE, 0x9ED8, 0x69E8, + 0x9ED9, 0x6A02, 0x9EDA, 0x6A1B, 0x9EDB, 0x69FF, 0x9EDC, 0x6B0A, + 0x9EDD, 0x69F9, 0x9EDE, 0x69F2, 0x9EDF, 0x69E7, 0x9EE0, 0x6A05, + 0x9EE1, 0x69B1, 0x9EE2, 0x6A1E, 0x9EE3, 0x69ED, 0x9EE4, 0x6A14, + 0x9EE5, 0x69EB, 0x9EE6, 0x6A0A, 0x9EE7, 0x6A12, 0x9EE8, 0x6AC1, + 0x9EE9, 0x6A23, 0x9EEA, 0x6A13, 0x9EEB, 0x6A44, 0x9EEC, 0x6A0C, + 0x9EED, 0x6A72, 0x9EEE, 0x6A36, 0x9EEF, 0x6A78, 0x9EF0, 0x6A47, + 0x9EF1, 0x6A62, 0x9EF2, 0x6A59, 0x9EF3, 0x6A66, 0x9EF4, 0x6A48, + 0x9EF5, 0x6A38, 0x9EF6, 0x6A22, 0x9EF7, 0x6A90, 0x9EF8, 0x6A8D, + 0x9EF9, 0x6AA0, 0x9EFA, 0x6A84, 0x9EFB, 0x6AA2, 0x9EFC, 0x6AA3, + 0x9F40, 0x6A97, 0x9F41, 0x8617, 0x9F42, 0x6ABB, 0x9F43, 0x6AC3, + 0x9F44, 0x6AC2, 0x9F45, 0x6AB8, 0x9F46, 0x6AB3, 0x9F47, 0x6AAC, + 0x9F48, 0x6ADE, 0x9F49, 0x6AD1, 0x9F4A, 0x6ADF, 0x9F4B, 0x6AAA, + 0x9F4C, 0x6ADA, 0x9F4D, 0x6AEA, 0x9F4E, 0x6AFB, 0x9F4F, 0x6B05, + 0x9F50, 0x8616, 0x9F51, 0x6AFA, 0x9F52, 0x6B12, 0x9F53, 0x6B16, + 0x9F54, 0x9B31, 0x9F55, 0x6B1F, 0x9F56, 0x6B38, 0x9F57, 0x6B37, + 0x9F58, 0x76DC, 0x9F59, 0x6B39, 0x9F5A, 0x98EE, 0x9F5B, 0x6B47, + 0x9F5C, 0x6B43, 0x9F5D, 0x6B49, 0x9F5E, 0x6B50, 0x9F5F, 0x6B59, + 0x9F60, 0x6B54, 0x9F61, 0x6B5B, 0x9F62, 0x6B5F, 0x9F63, 0x6B61, + 0x9F64, 0x6B78, 0x9F65, 0x6B79, 0x9F66, 0x6B7F, 0x9F67, 0x6B80, + 0x9F68, 0x6B84, 0x9F69, 0x6B83, 0x9F6A, 0x6B8D, 0x9F6B, 0x6B98, + 0x9F6C, 0x6B95, 0x9F6D, 0x6B9E, 0x9F6E, 0x6BA4, 0x9F6F, 0x6BAA, + 0x9F70, 0x6BAB, 0x9F71, 0x6BAF, 0x9F72, 0x6BB2, 0x9F73, 0x6BB1, + 0x9F74, 0x6BB3, 0x9F75, 0x6BB7, 0x9F76, 0x6BBC, 0x9F77, 0x6BC6, + 0x9F78, 0x6BCB, 0x9F79, 0x6BD3, 0x9F7A, 0x6BDF, 0x9F7B, 0x6BEC, + 0x9F7C, 0x6BEB, 0x9F7D, 0x6BF3, 0x9F7E, 0x6BEF, 0x9F80, 0x9EBE, + 0x9F81, 0x6C08, 0x9F82, 0x6C13, 0x9F83, 0x6C14, 0x9F84, 0x6C1B, + 0x9F85, 0x6C24, 0x9F86, 0x6C23, 0x9F87, 0x6C5E, 0x9F88, 0x6C55, + 0x9F89, 0x6C62, 0x9F8A, 0x6C6A, 0x9F8B, 0x6C82, 0x9F8C, 0x6C8D, + 0x9F8D, 0x6C9A, 0x9F8E, 0x6C81, 0x9F8F, 0x6C9B, 0x9F90, 0x6C7E, + 0x9F91, 0x6C68, 0x9F92, 0x6C73, 0x9F93, 0x6C92, 0x9F94, 0x6C90, + 0x9F95, 0x6CC4, 0x9F96, 0x6CF1, 0x9F97, 0x6CD3, 0x9F98, 0x6CBD, + 0x9F99, 0x6CD7, 0x9F9A, 0x6CC5, 0x9F9B, 0x6CDD, 0x9F9C, 0x6CAE, + 0x9F9D, 0x6CB1, 0x9F9E, 0x6CBE, 0x9F9F, 0x6CBA, 0x9FA0, 0x6CDB, + 0x9FA1, 0x6CEF, 0x9FA2, 0x6CD9, 0x9FA3, 0x6CEA, 0x9FA4, 0x6D1F, + 0x9FA5, 0x884D, 0x9FA6, 0x6D36, 0x9FA7, 0x6D2B, 0x9FA8, 0x6D3D, + 0x9FA9, 0x6D38, 0x9FAA, 0x6D19, 0x9FAB, 0x6D35, 0x9FAC, 0x6D33, + 0x9FAD, 0x6D12, 0x9FAE, 0x6D0C, 0x9FAF, 0x6D63, 0x9FB0, 0x6D93, + 0x9FB1, 0x6D64, 0x9FB2, 0x6D5A, 0x9FB3, 0x6D79, 0x9FB4, 0x6D59, + 0x9FB5, 0x6D8E, 0x9FB6, 0x6D95, 0x9FB7, 0x6FE4, 0x9FB8, 0x6D85, + 0x9FB9, 0x6DF9, 0x9FBA, 0x6E15, 0x9FBB, 0x6E0A, 0x9FBC, 0x6DB5, + 0x9FBD, 0x6DC7, 0x9FBE, 0x6DE6, 0x9FBF, 0x6DB8, 0x9FC0, 0x6DC6, + 0x9FC1, 0x6DEC, 0x9FC2, 0x6DDE, 0x9FC3, 0x6DCC, 0x9FC4, 0x6DE8, + 0x9FC5, 0x6DD2, 0x9FC6, 0x6DC5, 0x9FC7, 0x6DFA, 0x9FC8, 0x6DD9, + 0x9FC9, 0x6DE4, 0x9FCA, 0x6DD5, 0x9FCB, 0x6DEA, 0x9FCC, 0x6DEE, + 0x9FCD, 0x6E2D, 0x9FCE, 0x6E6E, 0x9FCF, 0x6E2E, 0x9FD0, 0x6E19, + 0x9FD1, 0x6E72, 0x9FD2, 0x6E5F, 0x9FD3, 0x6E3E, 0x9FD4, 0x6E23, + 0x9FD5, 0x6E6B, 0x9FD6, 0x6E2B, 0x9FD7, 0x6E76, 0x9FD8, 0x6E4D, + 0x9FD9, 0x6E1F, 0x9FDA, 0x6E43, 0x9FDB, 0x6E3A, 0x9FDC, 0x6E4E, + 0x9FDD, 0x6E24, 0x9FDE, 0x6EFF, 0x9FDF, 0x6E1D, 0x9FE0, 0x6E38, + 0x9FE1, 0x6E82, 0x9FE2, 0x6EAA, 0x9FE3, 0x6E98, 0x9FE4, 0x6EC9, + 0x9FE5, 0x6EB7, 0x9FE6, 0x6ED3, 0x9FE7, 0x6EBD, 0x9FE8, 0x6EAF, + 0x9FE9, 0x6EC4, 0x9FEA, 0x6EB2, 0x9FEB, 0x6ED4, 0x9FEC, 0x6ED5, + 0x9FED, 0x6E8F, 0x9FEE, 0x6EA5, 0x9FEF, 0x6EC2, 0x9FF0, 0x6E9F, + 0x9FF1, 0x6F41, 0x9FF2, 0x6F11, 0x9FF3, 0x704C, 0x9FF4, 0x6EEC, + 0x9FF5, 0x6EF8, 0x9FF6, 0x6EFE, 0x9FF7, 0x6F3F, 0x9FF8, 0x6EF2, + 0x9FF9, 0x6F31, 0x9FFA, 0x6EEF, 0x9FFB, 0x6F32, 0x9FFC, 0x6ECC, + 0xE040, 0x6F3E, 0xE041, 0x6F13, 0xE042, 0x6EF7, 0xE043, 0x6F86, + 0xE044, 0x6F7A, 0xE045, 0x6F78, 0xE046, 0x6F81, 0xE047, 0x6F80, + 0xE048, 0x6F6F, 0xE049, 0x6F5B, 0xE04A, 0x6FF3, 0xE04B, 0x6F6D, + 0xE04C, 0x6F82, 0xE04D, 0x6F7C, 0xE04E, 0x6F58, 0xE04F, 0x6F8E, + 0xE050, 0x6F91, 0xE051, 0x6FC2, 0xE052, 0x6F66, 0xE053, 0x6FB3, + 0xE054, 0x6FA3, 0xE055, 0x6FA1, 0xE056, 0x6FA4, 0xE057, 0x6FB9, + 0xE058, 0x6FC6, 0xE059, 0x6FAA, 0xE05A, 0x6FDF, 0xE05B, 0x6FD5, + 0xE05C, 0x6FEC, 0xE05D, 0x6FD4, 0xE05E, 0x6FD8, 0xE05F, 0x6FF1, + 0xE060, 0x6FEE, 0xE061, 0x6FDB, 0xE062, 0x7009, 0xE063, 0x700B, + 0xE064, 0x6FFA, 0xE065, 0x7011, 0xE066, 0x7001, 0xE067, 0x700F, + 0xE068, 0x6FFE, 0xE069, 0x701B, 0xE06A, 0x701A, 0xE06B, 0x6F74, + 0xE06C, 0x701D, 0xE06D, 0x7018, 0xE06E, 0x701F, 0xE06F, 0x7030, + 0xE070, 0x703E, 0xE071, 0x7032, 0xE072, 0x7051, 0xE073, 0x7063, + 0xE074, 0x7099, 0xE075, 0x7092, 0xE076, 0x70AF, 0xE077, 0x70F1, + 0xE078, 0x70AC, 0xE079, 0x70B8, 0xE07A, 0x70B3, 0xE07B, 0x70AE, + 0xE07C, 0x70DF, 0xE07D, 0x70CB, 0xE07E, 0x70DD, 0xE080, 0x70D9, + 0xE081, 0x7109, 0xE082, 0x70FD, 0xE083, 0x711C, 0xE084, 0x7119, + 0xE085, 0x7165, 0xE086, 0x7155, 0xE087, 0x7188, 0xE088, 0x7166, + 0xE089, 0x7162, 0xE08A, 0x714C, 0xE08B, 0x7156, 0xE08C, 0x716C, + 0xE08D, 0x718F, 0xE08E, 0x71FB, 0xE08F, 0x7184, 0xE090, 0x7195, + 0xE091, 0x71A8, 0xE092, 0x71AC, 0xE093, 0x71D7, 0xE094, 0x71B9, + 0xE095, 0x71BE, 0xE096, 0x71D2, 0xE097, 0x71C9, 0xE098, 0x71D4, + 0xE099, 0x71CE, 0xE09A, 0x71E0, 0xE09B, 0x71EC, 0xE09C, 0x71E7, + 0xE09D, 0x71F5, 0xE09E, 0x71FC, 0xE09F, 0x71F9, 0xE0A0, 0x71FF, + 0xE0A1, 0x720D, 0xE0A2, 0x7210, 0xE0A3, 0x721B, 0xE0A4, 0x7228, + 0xE0A5, 0x722D, 0xE0A6, 0x722C, 0xE0A7, 0x7230, 0xE0A8, 0x7232, + 0xE0A9, 0x723B, 0xE0AA, 0x723C, 0xE0AB, 0x723F, 0xE0AC, 0x7240, + 0xE0AD, 0x7246, 0xE0AE, 0x724B, 0xE0AF, 0x7258, 0xE0B0, 0x7274, + 0xE0B1, 0x727E, 0xE0B2, 0x7282, 0xE0B3, 0x7281, 0xE0B4, 0x7287, + 0xE0B5, 0x7292, 0xE0B6, 0x7296, 0xE0B7, 0x72A2, 0xE0B8, 0x72A7, + 0xE0B9, 0x72B9, 0xE0BA, 0x72B2, 0xE0BB, 0x72C3, 0xE0BC, 0x72C6, + 0xE0BD, 0x72C4, 0xE0BE, 0x72CE, 0xE0BF, 0x72D2, 0xE0C0, 0x72E2, + 0xE0C1, 0x72E0, 0xE0C2, 0x72E1, 0xE0C3, 0x72F9, 0xE0C4, 0x72F7, + 0xE0C5, 0x500F, 0xE0C6, 0x7317, 0xE0C7, 0x730A, 0xE0C8, 0x731C, + 0xE0C9, 0x7316, 0xE0CA, 0x731D, 0xE0CB, 0x7334, 0xE0CC, 0x732F, + 0xE0CD, 0x7329, 0xE0CE, 0x7325, 0xE0CF, 0x733E, 0xE0D0, 0x734E, + 0xE0D1, 0x734F, 0xE0D2, 0x9ED8, 0xE0D3, 0x7357, 0xE0D4, 0x736A, + 0xE0D5, 0x7368, 0xE0D6, 0x7370, 0xE0D7, 0x7378, 0xE0D8, 0x7375, + 0xE0D9, 0x737B, 0xE0DA, 0x737A, 0xE0DB, 0x73C8, 0xE0DC, 0x73B3, + 0xE0DD, 0x73CE, 0xE0DE, 0x73BB, 0xE0DF, 0x73C0, 0xE0E0, 0x73E5, + 0xE0E1, 0x73EE, 0xE0E2, 0x73DE, 0xE0E3, 0x74A2, 0xE0E4, 0x7405, + 0xE0E5, 0x746F, 0xE0E6, 0x7425, 0xE0E7, 0x73F8, 0xE0E8, 0x7432, + 0xE0E9, 0x743A, 0xE0EA, 0x7455, 0xE0EB, 0x743F, 0xE0EC, 0x745F, + 0xE0ED, 0x7459, 0xE0EE, 0x7441, 0xE0EF, 0x745C, 0xE0F0, 0x7469, + 0xE0F1, 0x7470, 0xE0F2, 0x7463, 0xE0F3, 0x746A, 0xE0F4, 0x7476, + 0xE0F5, 0x747E, 0xE0F6, 0x748B, 0xE0F7, 0x749E, 0xE0F8, 0x74A7, + 0xE0F9, 0x74CA, 0xE0FA, 0x74CF, 0xE0FB, 0x74D4, 0xE0FC, 0x73F1, + 0xE140, 0x74E0, 0xE141, 0x74E3, 0xE142, 0x74E7, 0xE143, 0x74E9, + 0xE144, 0x74EE, 0xE145, 0x74F2, 0xE146, 0x74F0, 0xE147, 0x74F1, + 0xE148, 0x74F8, 0xE149, 0x74F7, 0xE14A, 0x7504, 0xE14B, 0x7503, + 0xE14C, 0x7505, 0xE14D, 0x750C, 0xE14E, 0x750E, 0xE14F, 0x750D, + 0xE150, 0x7515, 0xE151, 0x7513, 0xE152, 0x751E, 0xE153, 0x7526, + 0xE154, 0x752C, 0xE155, 0x753C, 0xE156, 0x7544, 0xE157, 0x754D, + 0xE158, 0x754A, 0xE159, 0x7549, 0xE15A, 0x755B, 0xE15B, 0x7546, + 0xE15C, 0x755A, 0xE15D, 0x7569, 0xE15E, 0x7564, 0xE15F, 0x7567, + 0xE160, 0x756B, 0xE161, 0x756D, 0xE162, 0x7578, 0xE163, 0x7576, + 0xE164, 0x7586, 0xE165, 0x7587, 0xE166, 0x7574, 0xE167, 0x758A, + 0xE168, 0x7589, 0xE169, 0x7582, 0xE16A, 0x7594, 0xE16B, 0x759A, + 0xE16C, 0x759D, 0xE16D, 0x75A5, 0xE16E, 0x75A3, 0xE16F, 0x75C2, + 0xE170, 0x75B3, 0xE171, 0x75C3, 0xE172, 0x75B5, 0xE173, 0x75BD, + 0xE174, 0x75B8, 0xE175, 0x75BC, 0xE176, 0x75B1, 0xE177, 0x75CD, + 0xE178, 0x75CA, 0xE179, 0x75D2, 0xE17A, 0x75D9, 0xE17B, 0x75E3, + 0xE17C, 0x75DE, 0xE17D, 0x75FE, 0xE17E, 0x75FF, 0xE180, 0x75FC, + 0xE181, 0x7601, 0xE182, 0x75F0, 0xE183, 0x75FA, 0xE184, 0x75F2, + 0xE185, 0x75F3, 0xE186, 0x760B, 0xE187, 0x760D, 0xE188, 0x7609, + 0xE189, 0x761F, 0xE18A, 0x7627, 0xE18B, 0x7620, 0xE18C, 0x7621, + 0xE18D, 0x7622, 0xE18E, 0x7624, 0xE18F, 0x7634, 0xE190, 0x7630, + 0xE191, 0x763B, 0xE192, 0x7647, 0xE193, 0x7648, 0xE194, 0x7646, + 0xE195, 0x765C, 0xE196, 0x7658, 0xE197, 0x7661, 0xE198, 0x7662, + 0xE199, 0x7668, 0xE19A, 0x7669, 0xE19B, 0x766A, 0xE19C, 0x7667, + 0xE19D, 0x766C, 0xE19E, 0x7670, 0xE19F, 0x7672, 0xE1A0, 0x7676, + 0xE1A1, 0x7678, 0xE1A2, 0x767C, 0xE1A3, 0x7680, 0xE1A4, 0x7683, + 0xE1A5, 0x7688, 0xE1A6, 0x768B, 0xE1A7, 0x768E, 0xE1A8, 0x7696, + 0xE1A9, 0x7693, 0xE1AA, 0x7699, 0xE1AB, 0x769A, 0xE1AC, 0x76B0, + 0xE1AD, 0x76B4, 0xE1AE, 0x76B8, 0xE1AF, 0x76B9, 0xE1B0, 0x76BA, + 0xE1B1, 0x76C2, 0xE1B2, 0x76CD, 0xE1B3, 0x76D6, 0xE1B4, 0x76D2, + 0xE1B5, 0x76DE, 0xE1B6, 0x76E1, 0xE1B7, 0x76E5, 0xE1B8, 0x76E7, + 0xE1B9, 0x76EA, 0xE1BA, 0x862F, 0xE1BB, 0x76FB, 0xE1BC, 0x7708, + 0xE1BD, 0x7707, 0xE1BE, 0x7704, 0xE1BF, 0x7729, 0xE1C0, 0x7724, + 0xE1C1, 0x771E, 0xE1C2, 0x7725, 0xE1C3, 0x7726, 0xE1C4, 0x771B, + 0xE1C5, 0x7737, 0xE1C6, 0x7738, 0xE1C7, 0x7747, 0xE1C8, 0x775A, + 0xE1C9, 0x7768, 0xE1CA, 0x776B, 0xE1CB, 0x775B, 0xE1CC, 0x7765, + 0xE1CD, 0x777F, 0xE1CE, 0x777E, 0xE1CF, 0x7779, 0xE1D0, 0x778E, + 0xE1D1, 0x778B, 0xE1D2, 0x7791, 0xE1D3, 0x77A0, 0xE1D4, 0x779E, + 0xE1D5, 0x77B0, 0xE1D6, 0x77B6, 0xE1D7, 0x77B9, 0xE1D8, 0x77BF, + 0xE1D9, 0x77BC, 0xE1DA, 0x77BD, 0xE1DB, 0x77BB, 0xE1DC, 0x77C7, + 0xE1DD, 0x77CD, 0xE1DE, 0x77D7, 0xE1DF, 0x77DA, 0xE1E0, 0x77DC, + 0xE1E1, 0x77E3, 0xE1E2, 0x77EE, 0xE1E3, 0x77FC, 0xE1E4, 0x780C, + 0xE1E5, 0x7812, 0xE1E6, 0x7926, 0xE1E7, 0x7820, 0xE1E8, 0x792A, + 0xE1E9, 0x7845, 0xE1EA, 0x788E, 0xE1EB, 0x7874, 0xE1EC, 0x7886, + 0xE1ED, 0x787C, 0xE1EE, 0x789A, 0xE1EF, 0x788C, 0xE1F0, 0x78A3, + 0xE1F1, 0x78B5, 0xE1F2, 0x78AA, 0xE1F3, 0x78AF, 0xE1F4, 0x78D1, + 0xE1F5, 0x78C6, 0xE1F6, 0x78CB, 0xE1F7, 0x78D4, 0xE1F8, 0x78BE, + 0xE1F9, 0x78BC, 0xE1FA, 0x78C5, 0xE1FB, 0x78CA, 0xE1FC, 0x78EC, + 0xE240, 0x78E7, 0xE241, 0x78DA, 0xE242, 0x78FD, 0xE243, 0x78F4, + 0xE244, 0x7907, 0xE245, 0x7912, 0xE246, 0x7911, 0xE247, 0x7919, + 0xE248, 0x792C, 0xE249, 0x792B, 0xE24A, 0x7940, 0xE24B, 0x7960, + 0xE24C, 0x7957, 0xE24D, 0x795F, 0xE24E, 0x795A, 0xE24F, 0x7955, + 0xE250, 0x7953, 0xE251, 0x797A, 0xE252, 0x797F, 0xE253, 0x798A, + 0xE254, 0x799D, 0xE255, 0x79A7, 0xE256, 0x9F4B, 0xE257, 0x79AA, + 0xE258, 0x79AE, 0xE259, 0x79B3, 0xE25A, 0x79B9, 0xE25B, 0x79BA, + 0xE25C, 0x79C9, 0xE25D, 0x79D5, 0xE25E, 0x79E7, 0xE25F, 0x79EC, + 0xE260, 0x79E1, 0xE261, 0x79E3, 0xE262, 0x7A08, 0xE263, 0x7A0D, + 0xE264, 0x7A18, 0xE265, 0x7A19, 0xE266, 0x7A20, 0xE267, 0x7A1F, + 0xE268, 0x7980, 0xE269, 0x7A31, 0xE26A, 0x7A3B, 0xE26B, 0x7A3E, + 0xE26C, 0x7A37, 0xE26D, 0x7A43, 0xE26E, 0x7A57, 0xE26F, 0x7A49, + 0xE270, 0x7A61, 0xE271, 0x7A62, 0xE272, 0x7A69, 0xE273, 0x9F9D, + 0xE274, 0x7A70, 0xE275, 0x7A79, 0xE276, 0x7A7D, 0xE277, 0x7A88, + 0xE278, 0x7A97, 0xE279, 0x7A95, 0xE27A, 0x7A98, 0xE27B, 0x7A96, + 0xE27C, 0x7AA9, 0xE27D, 0x7AC8, 0xE27E, 0x7AB0, 0xE280, 0x7AB6, + 0xE281, 0x7AC5, 0xE282, 0x7AC4, 0xE283, 0x7ABF, 0xE284, 0x9083, + 0xE285, 0x7AC7, 0xE286, 0x7ACA, 0xE287, 0x7ACD, 0xE288, 0x7ACF, + 0xE289, 0x7AD5, 0xE28A, 0x7AD3, 0xE28B, 0x7AD9, 0xE28C, 0x7ADA, + 0xE28D, 0x7ADD, 0xE28E, 0x7AE1, 0xE28F, 0x7AE2, 0xE290, 0x7AE6, + 0xE291, 0x7AED, 0xE292, 0x7AF0, 0xE293, 0x7B02, 0xE294, 0x7B0F, + 0xE295, 0x7B0A, 0xE296, 0x7B06, 0xE297, 0x7B33, 0xE298, 0x7B18, + 0xE299, 0x7B19, 0xE29A, 0x7B1E, 0xE29B, 0x7B35, 0xE29C, 0x7B28, + 0xE29D, 0x7B36, 0xE29E, 0x7B50, 0xE29F, 0x7B7A, 0xE2A0, 0x7B04, + 0xE2A1, 0x7B4D, 0xE2A2, 0x7B0B, 0xE2A3, 0x7B4C, 0xE2A4, 0x7B45, + 0xE2A5, 0x7B75, 0xE2A6, 0x7B65, 0xE2A7, 0x7B74, 0xE2A8, 0x7B67, + 0xE2A9, 0x7B70, 0xE2AA, 0x7B71, 0xE2AB, 0x7B6C, 0xE2AC, 0x7B6E, + 0xE2AD, 0x7B9D, 0xE2AE, 0x7B98, 0xE2AF, 0x7B9F, 0xE2B0, 0x7B8D, + 0xE2B1, 0x7B9C, 0xE2B2, 0x7B9A, 0xE2B3, 0x7B8B, 0xE2B4, 0x7B92, + 0xE2B5, 0x7B8F, 0xE2B6, 0x7B5D, 0xE2B7, 0x7B99, 0xE2B8, 0x7BCB, + 0xE2B9, 0x7BC1, 0xE2BA, 0x7BCC, 0xE2BB, 0x7BCF, 0xE2BC, 0x7BB4, + 0xE2BD, 0x7BC6, 0xE2BE, 0x7BDD, 0xE2BF, 0x7BE9, 0xE2C0, 0x7C11, + 0xE2C1, 0x7C14, 0xE2C2, 0x7BE6, 0xE2C3, 0x7BE5, 0xE2C4, 0x7C60, + 0xE2C5, 0x7C00, 0xE2C6, 0x7C07, 0xE2C7, 0x7C13, 0xE2C8, 0x7BF3, + 0xE2C9, 0x7BF7, 0xE2CA, 0x7C17, 0xE2CB, 0x7C0D, 0xE2CC, 0x7BF6, + 0xE2CD, 0x7C23, 0xE2CE, 0x7C27, 0xE2CF, 0x7C2A, 0xE2D0, 0x7C1F, + 0xE2D1, 0x7C37, 0xE2D2, 0x7C2B, 0xE2D3, 0x7C3D, 0xE2D4, 0x7C4C, + 0xE2D5, 0x7C43, 0xE2D6, 0x7C54, 0xE2D7, 0x7C4F, 0xE2D8, 0x7C40, + 0xE2D9, 0x7C50, 0xE2DA, 0x7C58, 0xE2DB, 0x7C5F, 0xE2DC, 0x7C64, + 0xE2DD, 0x7C56, 0xE2DE, 0x7C65, 0xE2DF, 0x7C6C, 0xE2E0, 0x7C75, + 0xE2E1, 0x7C83, 0xE2E2, 0x7C90, 0xE2E3, 0x7CA4, 0xE2E4, 0x7CAD, + 0xE2E5, 0x7CA2, 0xE2E6, 0x7CAB, 0xE2E7, 0x7CA1, 0xE2E8, 0x7CA8, + 0xE2E9, 0x7CB3, 0xE2EA, 0x7CB2, 0xE2EB, 0x7CB1, 0xE2EC, 0x7CAE, + 0xE2ED, 0x7CB9, 0xE2EE, 0x7CBD, 0xE2EF, 0x7CC0, 0xE2F0, 0x7CC5, + 0xE2F1, 0x7CC2, 0xE2F2, 0x7CD8, 0xE2F3, 0x7CD2, 0xE2F4, 0x7CDC, + 0xE2F5, 0x7CE2, 0xE2F6, 0x9B3B, 0xE2F7, 0x7CEF, 0xE2F8, 0x7CF2, + 0xE2F9, 0x7CF4, 0xE2FA, 0x7CF6, 0xE2FB, 0x7CFA, 0xE2FC, 0x7D06, + 0xE340, 0x7D02, 0xE341, 0x7D1C, 0xE342, 0x7D15, 0xE343, 0x7D0A, + 0xE344, 0x7D45, 0xE345, 0x7D4B, 0xE346, 0x7D2E, 0xE347, 0x7D32, + 0xE348, 0x7D3F, 0xE349, 0x7D35, 0xE34A, 0x7D46, 0xE34B, 0x7D73, + 0xE34C, 0x7D56, 0xE34D, 0x7D4E, 0xE34E, 0x7D72, 0xE34F, 0x7D68, + 0xE350, 0x7D6E, 0xE351, 0x7D4F, 0xE352, 0x7D63, 0xE353, 0x7D93, + 0xE354, 0x7D89, 0xE355, 0x7D5B, 0xE356, 0x7D8F, 0xE357, 0x7D7D, + 0xE358, 0x7D9B, 0xE359, 0x7DBA, 0xE35A, 0x7DAE, 0xE35B, 0x7DA3, + 0xE35C, 0x7DB5, 0xE35D, 0x7DC7, 0xE35E, 0x7DBD, 0xE35F, 0x7DAB, + 0xE360, 0x7E3D, 0xE361, 0x7DA2, 0xE362, 0x7DAF, 0xE363, 0x7DDC, + 0xE364, 0x7DB8, 0xE365, 0x7D9F, 0xE366, 0x7DB0, 0xE367, 0x7DD8, + 0xE368, 0x7DDD, 0xE369, 0x7DE4, 0xE36A, 0x7DDE, 0xE36B, 0x7DFB, + 0xE36C, 0x7DF2, 0xE36D, 0x7DE1, 0xE36E, 0x7E05, 0xE36F, 0x7E0A, + 0xE370, 0x7E23, 0xE371, 0x7E21, 0xE372, 0x7E12, 0xE373, 0x7E31, + 0xE374, 0x7E1F, 0xE375, 0x7E09, 0xE376, 0x7E0B, 0xE377, 0x7E22, + 0xE378, 0x7E46, 0xE379, 0x7E66, 0xE37A, 0x7E3B, 0xE37B, 0x7E35, + 0xE37C, 0x7E39, 0xE37D, 0x7E43, 0xE37E, 0x7E37, 0xE380, 0x7E32, + 0xE381, 0x7E3A, 0xE382, 0x7E67, 0xE383, 0x7E5D, 0xE384, 0x7E56, + 0xE385, 0x7E5E, 0xE386, 0x7E59, 0xE387, 0x7E5A, 0xE388, 0x7E79, + 0xE389, 0x7E6A, 0xE38A, 0x7E69, 0xE38B, 0x7E7C, 0xE38C, 0x7E7B, + 0xE38D, 0x7E83, 0xE38E, 0x7DD5, 0xE38F, 0x7E7D, 0xE390, 0x8FAE, + 0xE391, 0x7E7F, 0xE392, 0x7E88, 0xE393, 0x7E89, 0xE394, 0x7E8C, + 0xE395, 0x7E92, 0xE396, 0x7E90, 0xE397, 0x7E93, 0xE398, 0x7E94, + 0xE399, 0x7E96, 0xE39A, 0x7E8E, 0xE39B, 0x7E9B, 0xE39C, 0x7E9C, + 0xE39D, 0x7F38, 0xE39E, 0x7F3A, 0xE39F, 0x7F45, 0xE3A0, 0x7F4C, + 0xE3A1, 0x7F4D, 0xE3A2, 0x7F4E, 0xE3A3, 0x7F50, 0xE3A4, 0x7F51, + 0xE3A5, 0x7F55, 0xE3A6, 0x7F54, 0xE3A7, 0x7F58, 0xE3A8, 0x7F5F, + 0xE3A9, 0x7F60, 0xE3AA, 0x7F68, 0xE3AB, 0x7F69, 0xE3AC, 0x7F67, + 0xE3AD, 0x7F78, 0xE3AE, 0x7F82, 0xE3AF, 0x7F86, 0xE3B0, 0x7F83, + 0xE3B1, 0x7F88, 0xE3B2, 0x7F87, 0xE3B3, 0x7F8C, 0xE3B4, 0x7F94, + 0xE3B5, 0x7F9E, 0xE3B6, 0x7F9D, 0xE3B7, 0x7F9A, 0xE3B8, 0x7FA3, + 0xE3B9, 0x7FAF, 0xE3BA, 0x7FB2, 0xE3BB, 0x7FB9, 0xE3BC, 0x7FAE, + 0xE3BD, 0x7FB6, 0xE3BE, 0x7FB8, 0xE3BF, 0x8B71, 0xE3C0, 0x7FC5, + 0xE3C1, 0x7FC6, 0xE3C2, 0x7FCA, 0xE3C3, 0x7FD5, 0xE3C4, 0x7FD4, + 0xE3C5, 0x7FE1, 0xE3C6, 0x7FE6, 0xE3C7, 0x7FE9, 0xE3C8, 0x7FF3, + 0xE3C9, 0x7FF9, 0xE3CA, 0x98DC, 0xE3CB, 0x8006, 0xE3CC, 0x8004, + 0xE3CD, 0x800B, 0xE3CE, 0x8012, 0xE3CF, 0x8018, 0xE3D0, 0x8019, + 0xE3D1, 0x801C, 0xE3D2, 0x8021, 0xE3D3, 0x8028, 0xE3D4, 0x803F, + 0xE3D5, 0x803B, 0xE3D6, 0x804A, 0xE3D7, 0x8046, 0xE3D8, 0x8052, + 0xE3D9, 0x8058, 0xE3DA, 0x805A, 0xE3DB, 0x805F, 0xE3DC, 0x8062, + 0xE3DD, 0x8068, 0xE3DE, 0x8073, 0xE3DF, 0x8072, 0xE3E0, 0x8070, + 0xE3E1, 0x8076, 0xE3E2, 0x8079, 0xE3E3, 0x807D, 0xE3E4, 0x807F, + 0xE3E5, 0x8084, 0xE3E6, 0x8086, 0xE3E7, 0x8085, 0xE3E8, 0x809B, + 0xE3E9, 0x8093, 0xE3EA, 0x809A, 0xE3EB, 0x80AD, 0xE3EC, 0x5190, + 0xE3ED, 0x80AC, 0xE3EE, 0x80DB, 0xE3EF, 0x80E5, 0xE3F0, 0x80D9, + 0xE3F1, 0x80DD, 0xE3F2, 0x80C4, 0xE3F3, 0x80DA, 0xE3F4, 0x80D6, + 0xE3F5, 0x8109, 0xE3F6, 0x80EF, 0xE3F7, 0x80F1, 0xE3F8, 0x811B, + 0xE3F9, 0x8129, 0xE3FA, 0x8123, 0xE3FB, 0x812F, 0xE3FC, 0x814B, + 0xE440, 0x968B, 0xE441, 0x8146, 0xE442, 0x813E, 0xE443, 0x8153, + 0xE444, 0x8151, 0xE445, 0x80FC, 0xE446, 0x8171, 0xE447, 0x816E, + 0xE448, 0x8165, 0xE449, 0x8166, 0xE44A, 0x8174, 0xE44B, 0x8183, + 0xE44C, 0x8188, 0xE44D, 0x818A, 0xE44E, 0x8180, 0xE44F, 0x8182, + 0xE450, 0x81A0, 0xE451, 0x8195, 0xE452, 0x81A4, 0xE453, 0x81A3, + 0xE454, 0x815F, 0xE455, 0x8193, 0xE456, 0x81A9, 0xE457, 0x81B0, + 0xE458, 0x81B5, 0xE459, 0x81BE, 0xE45A, 0x81B8, 0xE45B, 0x81BD, + 0xE45C, 0x81C0, 0xE45D, 0x81C2, 0xE45E, 0x81BA, 0xE45F, 0x81C9, + 0xE460, 0x81CD, 0xE461, 0x81D1, 0xE462, 0x81D9, 0xE463, 0x81D8, + 0xE464, 0x81C8, 0xE465, 0x81DA, 0xE466, 0x81DF, 0xE467, 0x81E0, + 0xE468, 0x81E7, 0xE469, 0x81FA, 0xE46A, 0x81FB, 0xE46B, 0x81FE, + 0xE46C, 0x8201, 0xE46D, 0x8202, 0xE46E, 0x8205, 0xE46F, 0x8207, + 0xE470, 0x820A, 0xE471, 0x820D, 0xE472, 0x8210, 0xE473, 0x8216, + 0xE474, 0x8229, 0xE475, 0x822B, 0xE476, 0x8238, 0xE477, 0x8233, + 0xE478, 0x8240, 0xE479, 0x8259, 0xE47A, 0x8258, 0xE47B, 0x825D, + 0xE47C, 0x825A, 0xE47D, 0x825F, 0xE47E, 0x8264, 0xE480, 0x8262, + 0xE481, 0x8268, 0xE482, 0x826A, 0xE483, 0x826B, 0xE484, 0x822E, + 0xE485, 0x8271, 0xE486, 0x8277, 0xE487, 0x8278, 0xE488, 0x827E, + 0xE489, 0x828D, 0xE48A, 0x8292, 0xE48B, 0x82AB, 0xE48C, 0x829F, + 0xE48D, 0x82BB, 0xE48E, 0x82AC, 0xE48F, 0x82E1, 0xE490, 0x82E3, + 0xE491, 0x82DF, 0xE492, 0x82D2, 0xE493, 0x82F4, 0xE494, 0x82F3, + 0xE495, 0x82FA, 0xE496, 0x8393, 0xE497, 0x8303, 0xE498, 0x82FB, + 0xE499, 0x82F9, 0xE49A, 0x82DE, 0xE49B, 0x8306, 0xE49C, 0x82DC, + 0xE49D, 0x8309, 0xE49E, 0x82D9, 0xE49F, 0x8335, 0xE4A0, 0x8334, + 0xE4A1, 0x8316, 0xE4A2, 0x8332, 0xE4A3, 0x8331, 0xE4A4, 0x8340, + 0xE4A5, 0x8339, 0xE4A6, 0x8350, 0xE4A7, 0x8345, 0xE4A8, 0x832F, + 0xE4A9, 0x832B, 0xE4AA, 0x8317, 0xE4AB, 0x8318, 0xE4AC, 0x8385, + 0xE4AD, 0x839A, 0xE4AE, 0x83AA, 0xE4AF, 0x839F, 0xE4B0, 0x83A2, + 0xE4B1, 0x8396, 0xE4B2, 0x8323, 0xE4B3, 0x838E, 0xE4B4, 0x8387, + 0xE4B5, 0x838A, 0xE4B6, 0x837C, 0xE4B7, 0x83B5, 0xE4B8, 0x8373, + 0xE4B9, 0x8375, 0xE4BA, 0x83A0, 0xE4BB, 0x8389, 0xE4BC, 0x83A8, + 0xE4BD, 0x83F4, 0xE4BE, 0x8413, 0xE4BF, 0x83EB, 0xE4C0, 0x83CE, + 0xE4C1, 0x83FD, 0xE4C2, 0x8403, 0xE4C3, 0x83D8, 0xE4C4, 0x840B, + 0xE4C5, 0x83C1, 0xE4C6, 0x83F7, 0xE4C7, 0x8407, 0xE4C8, 0x83E0, + 0xE4C9, 0x83F2, 0xE4CA, 0x840D, 0xE4CB, 0x8422, 0xE4CC, 0x8420, + 0xE4CD, 0x83BD, 0xE4CE, 0x8438, 0xE4CF, 0x8506, 0xE4D0, 0x83FB, + 0xE4D1, 0x846D, 0xE4D2, 0x842A, 0xE4D3, 0x843C, 0xE4D4, 0x855A, + 0xE4D5, 0x8484, 0xE4D6, 0x8477, 0xE4D7, 0x846B, 0xE4D8, 0x84AD, + 0xE4D9, 0x846E, 0xE4DA, 0x8482, 0xE4DB, 0x8469, 0xE4DC, 0x8446, + 0xE4DD, 0x842C, 0xE4DE, 0x846F, 0xE4DF, 0x8479, 0xE4E0, 0x8435, + 0xE4E1, 0x84CA, 0xE4E2, 0x8462, 0xE4E3, 0x84B9, 0xE4E4, 0x84BF, + 0xE4E5, 0x849F, 0xE4E6, 0x84D9, 0xE4E7, 0x84CD, 0xE4E8, 0x84BB, + 0xE4E9, 0x84DA, 0xE4EA, 0x84D0, 0xE4EB, 0x84C1, 0xE4EC, 0x84C6, + 0xE4ED, 0x84D6, 0xE4EE, 0x84A1, 0xE4EF, 0x8521, 0xE4F0, 0x84FF, + 0xE4F1, 0x84F4, 0xE4F2, 0x8517, 0xE4F3, 0x8518, 0xE4F4, 0x852C, + 0xE4F5, 0x851F, 0xE4F6, 0x8515, 0xE4F7, 0x8514, 0xE4F8, 0x84FC, + 0xE4F9, 0x8540, 0xE4FA, 0x8563, 0xE4FB, 0x8558, 0xE4FC, 0x8548, + 0xE540, 0x8541, 0xE541, 0x8602, 0xE542, 0x854B, 0xE543, 0x8555, + 0xE544, 0x8580, 0xE545, 0x85A4, 0xE546, 0x8588, 0xE547, 0x8591, + 0xE548, 0x858A, 0xE549, 0x85A8, 0xE54A, 0x856D, 0xE54B, 0x8594, + 0xE54C, 0x859B, 0xE54D, 0x85EA, 0xE54E, 0x8587, 0xE54F, 0x859C, + 0xE550, 0x8577, 0xE551, 0x857E, 0xE552, 0x8590, 0xE553, 0x85C9, + 0xE554, 0x85BA, 0xE555, 0x85CF, 0xE556, 0x85B9, 0xE557, 0x85D0, + 0xE558, 0x85D5, 0xE559, 0x85DD, 0xE55A, 0x85E5, 0xE55B, 0x85DC, + 0xE55C, 0x85F9, 0xE55D, 0x860A, 0xE55E, 0x8613, 0xE55F, 0x860B, + 0xE560, 0x85FE, 0xE561, 0x85FA, 0xE562, 0x8606, 0xE563, 0x8622, + 0xE564, 0x861A, 0xE565, 0x8630, 0xE566, 0x863F, 0xE567, 0x864D, + 0xE568, 0x4E55, 0xE569, 0x8654, 0xE56A, 0x865F, 0xE56B, 0x8667, + 0xE56C, 0x8671, 0xE56D, 0x8693, 0xE56E, 0x86A3, 0xE56F, 0x86A9, + 0xE570, 0x86AA, 0xE571, 0x868B, 0xE572, 0x868C, 0xE573, 0x86B6, + 0xE574, 0x86AF, 0xE575, 0x86C4, 0xE576, 0x86C6, 0xE577, 0x86B0, + 0xE578, 0x86C9, 0xE579, 0x8823, 0xE57A, 0x86AB, 0xE57B, 0x86D4, + 0xE57C, 0x86DE, 0xE57D, 0x86E9, 0xE57E, 0x86EC, 0xE580, 0x86DF, + 0xE581, 0x86DB, 0xE582, 0x86EF, 0xE583, 0x8712, 0xE584, 0x8706, + 0xE585, 0x8708, 0xE586, 0x8700, 0xE587, 0x8703, 0xE588, 0x86FB, + 0xE589, 0x8711, 0xE58A, 0x8709, 0xE58B, 0x870D, 0xE58C, 0x86F9, + 0xE58D, 0x870A, 0xE58E, 0x8734, 0xE58F, 0x873F, 0xE590, 0x8737, + 0xE591, 0x873B, 0xE592, 0x8725, 0xE593, 0x8729, 0xE594, 0x871A, + 0xE595, 0x8760, 0xE596, 0x875F, 0xE597, 0x8778, 0xE598, 0x874C, + 0xE599, 0x874E, 0xE59A, 0x8774, 0xE59B, 0x8757, 0xE59C, 0x8768, + 0xE59D, 0x876E, 0xE59E, 0x8759, 0xE59F, 0x8753, 0xE5A0, 0x8763, + 0xE5A1, 0x876A, 0xE5A2, 0x8805, 0xE5A3, 0x87A2, 0xE5A4, 0x879F, + 0xE5A5, 0x8782, 0xE5A6, 0x87AF, 0xE5A7, 0x87CB, 0xE5A8, 0x87BD, + 0xE5A9, 0x87C0, 0xE5AA, 0x87D0, 0xE5AB, 0x96D6, 0xE5AC, 0x87AB, + 0xE5AD, 0x87C4, 0xE5AE, 0x87B3, 0xE5AF, 0x87C7, 0xE5B0, 0x87C6, + 0xE5B1, 0x87BB, 0xE5B2, 0x87EF, 0xE5B3, 0x87F2, 0xE5B4, 0x87E0, + 0xE5B5, 0x880F, 0xE5B6, 0x880D, 0xE5B7, 0x87FE, 0xE5B8, 0x87F6, + 0xE5B9, 0x87F7, 0xE5BA, 0x880E, 0xE5BB, 0x87D2, 0xE5BC, 0x8811, + 0xE5BD, 0x8816, 0xE5BE, 0x8815, 0xE5BF, 0x8822, 0xE5C0, 0x8821, + 0xE5C1, 0x8831, 0xE5C2, 0x8836, 0xE5C3, 0x8839, 0xE5C4, 0x8827, + 0xE5C5, 0x883B, 0xE5C6, 0x8844, 0xE5C7, 0x8842, 0xE5C8, 0x8852, + 0xE5C9, 0x8859, 0xE5CA, 0x885E, 0xE5CB, 0x8862, 0xE5CC, 0x886B, + 0xE5CD, 0x8881, 0xE5CE, 0x887E, 0xE5CF, 0x889E, 0xE5D0, 0x8875, + 0xE5D1, 0x887D, 0xE5D2, 0x88B5, 0xE5D3, 0x8872, 0xE5D4, 0x8882, + 0xE5D5, 0x8897, 0xE5D6, 0x8892, 0xE5D7, 0x88AE, 0xE5D8, 0x8899, + 0xE5D9, 0x88A2, 0xE5DA, 0x888D, 0xE5DB, 0x88A4, 0xE5DC, 0x88B0, + 0xE5DD, 0x88BF, 0xE5DE, 0x88B1, 0xE5DF, 0x88C3, 0xE5E0, 0x88C4, + 0xE5E1, 0x88D4, 0xE5E2, 0x88D8, 0xE5E3, 0x88D9, 0xE5E4, 0x88DD, + 0xE5E5, 0x88F9, 0xE5E6, 0x8902, 0xE5E7, 0x88FC, 0xE5E8, 0x88F4, + 0xE5E9, 0x88E8, 0xE5EA, 0x88F2, 0xE5EB, 0x8904, 0xE5EC, 0x890C, + 0xE5ED, 0x890A, 0xE5EE, 0x8913, 0xE5EF, 0x8943, 0xE5F0, 0x891E, + 0xE5F1, 0x8925, 0xE5F2, 0x892A, 0xE5F3, 0x892B, 0xE5F4, 0x8941, + 0xE5F5, 0x8944, 0xE5F6, 0x893B, 0xE5F7, 0x8936, 0xE5F8, 0x8938, + 0xE5F9, 0x894C, 0xE5FA, 0x891D, 0xE5FB, 0x8960, 0xE5FC, 0x895E, + 0xE640, 0x8966, 0xE641, 0x8964, 0xE642, 0x896D, 0xE643, 0x896A, + 0xE644, 0x896F, 0xE645, 0x8974, 0xE646, 0x8977, 0xE647, 0x897E, + 0xE648, 0x8983, 0xE649, 0x8988, 0xE64A, 0x898A, 0xE64B, 0x8993, + 0xE64C, 0x8998, 0xE64D, 0x89A1, 0xE64E, 0x89A9, 0xE64F, 0x89A6, + 0xE650, 0x89AC, 0xE651, 0x89AF, 0xE652, 0x89B2, 0xE653, 0x89BA, + 0xE654, 0x89BD, 0xE655, 0x89BF, 0xE656, 0x89C0, 0xE657, 0x89DA, + 0xE658, 0x89DC, 0xE659, 0x89DD, 0xE65A, 0x89E7, 0xE65B, 0x89F4, + 0xE65C, 0x89F8, 0xE65D, 0x8A03, 0xE65E, 0x8A16, 0xE65F, 0x8A10, + 0xE660, 0x8A0C, 0xE661, 0x8A1B, 0xE662, 0x8A1D, 0xE663, 0x8A25, + 0xE664, 0x8A36, 0xE665, 0x8A41, 0xE666, 0x8A5B, 0xE667, 0x8A52, + 0xE668, 0x8A46, 0xE669, 0x8A48, 0xE66A, 0x8A7C, 0xE66B, 0x8A6D, + 0xE66C, 0x8A6C, 0xE66D, 0x8A62, 0xE66E, 0x8A85, 0xE66F, 0x8A82, + 0xE670, 0x8A84, 0xE671, 0x8AA8, 0xE672, 0x8AA1, 0xE673, 0x8A91, + 0xE674, 0x8AA5, 0xE675, 0x8AA6, 0xE676, 0x8A9A, 0xE677, 0x8AA3, + 0xE678, 0x8AC4, 0xE679, 0x8ACD, 0xE67A, 0x8AC2, 0xE67B, 0x8ADA, + 0xE67C, 0x8AEB, 0xE67D, 0x8AF3, 0xE67E, 0x8AE7, 0xE680, 0x8AE4, + 0xE681, 0x8AF1, 0xE682, 0x8B14, 0xE683, 0x8AE0, 0xE684, 0x8AE2, + 0xE685, 0x8AF7, 0xE686, 0x8ADE, 0xE687, 0x8ADB, 0xE688, 0x8B0C, + 0xE689, 0x8B07, 0xE68A, 0x8B1A, 0xE68B, 0x8AE1, 0xE68C, 0x8B16, + 0xE68D, 0x8B10, 0xE68E, 0x8B17, 0xE68F, 0x8B20, 0xE690, 0x8B33, + 0xE691, 0x97AB, 0xE692, 0x8B26, 0xE693, 0x8B2B, 0xE694, 0x8B3E, + 0xE695, 0x8B28, 0xE696, 0x8B41, 0xE697, 0x8B4C, 0xE698, 0x8B4F, + 0xE699, 0x8B4E, 0xE69A, 0x8B49, 0xE69B, 0x8B56, 0xE69C, 0x8B5B, + 0xE69D, 0x8B5A, 0xE69E, 0x8B6B, 0xE69F, 0x8B5F, 0xE6A0, 0x8B6C, + 0xE6A1, 0x8B6F, 0xE6A2, 0x8B74, 0xE6A3, 0x8B7D, 0xE6A4, 0x8B80, + 0xE6A5, 0x8B8C, 0xE6A6, 0x8B8E, 0xE6A7, 0x8B92, 0xE6A8, 0x8B93, + 0xE6A9, 0x8B96, 0xE6AA, 0x8B99, 0xE6AB, 0x8B9A, 0xE6AC, 0x8C3A, + 0xE6AD, 0x8C41, 0xE6AE, 0x8C3F, 0xE6AF, 0x8C48, 0xE6B0, 0x8C4C, + 0xE6B1, 0x8C4E, 0xE6B2, 0x8C50, 0xE6B3, 0x8C55, 0xE6B4, 0x8C62, + 0xE6B5, 0x8C6C, 0xE6B6, 0x8C78, 0xE6B7, 0x8C7A, 0xE6B8, 0x8C82, + 0xE6B9, 0x8C89, 0xE6BA, 0x8C85, 0xE6BB, 0x8C8A, 0xE6BC, 0x8C8D, + 0xE6BD, 0x8C8E, 0xE6BE, 0x8C94, 0xE6BF, 0x8C7C, 0xE6C0, 0x8C98, + 0xE6C1, 0x621D, 0xE6C2, 0x8CAD, 0xE6C3, 0x8CAA, 0xE6C4, 0x8CBD, + 0xE6C5, 0x8CB2, 0xE6C6, 0x8CB3, 0xE6C7, 0x8CAE, 0xE6C8, 0x8CB6, + 0xE6C9, 0x8CC8, 0xE6CA, 0x8CC1, 0xE6CB, 0x8CE4, 0xE6CC, 0x8CE3, + 0xE6CD, 0x8CDA, 0xE6CE, 0x8CFD, 0xE6CF, 0x8CFA, 0xE6D0, 0x8CFB, + 0xE6D1, 0x8D04, 0xE6D2, 0x8D05, 0xE6D3, 0x8D0A, 0xE6D4, 0x8D07, + 0xE6D5, 0x8D0F, 0xE6D6, 0x8D0D, 0xE6D7, 0x8D10, 0xE6D8, 0x9F4E, + 0xE6D9, 0x8D13, 0xE6DA, 0x8CCD, 0xE6DB, 0x8D14, 0xE6DC, 0x8D16, + 0xE6DD, 0x8D67, 0xE6DE, 0x8D6D, 0xE6DF, 0x8D71, 0xE6E0, 0x8D73, + 0xE6E1, 0x8D81, 0xE6E2, 0x8D99, 0xE6E3, 0x8DC2, 0xE6E4, 0x8DBE, + 0xE6E5, 0x8DBA, 0xE6E6, 0x8DCF, 0xE6E7, 0x8DDA, 0xE6E8, 0x8DD6, + 0xE6E9, 0x8DCC, 0xE6EA, 0x8DDB, 0xE6EB, 0x8DCB, 0xE6EC, 0x8DEA, + 0xE6ED, 0x8DEB, 0xE6EE, 0x8DDF, 0xE6EF, 0x8DE3, 0xE6F0, 0x8DFC, + 0xE6F1, 0x8E08, 0xE6F2, 0x8E09, 0xE6F3, 0x8DFF, 0xE6F4, 0x8E1D, + 0xE6F5, 0x8E1E, 0xE6F6, 0x8E10, 0xE6F7, 0x8E1F, 0xE6F8, 0x8E42, + 0xE6F9, 0x8E35, 0xE6FA, 0x8E30, 0xE6FB, 0x8E34, 0xE6FC, 0x8E4A, + 0xE740, 0x8E47, 0xE741, 0x8E49, 0xE742, 0x8E4C, 0xE743, 0x8E50, + 0xE744, 0x8E48, 0xE745, 0x8E59, 0xE746, 0x8E64, 0xE747, 0x8E60, + 0xE748, 0x8E2A, 0xE749, 0x8E63, 0xE74A, 0x8E55, 0xE74B, 0x8E76, + 0xE74C, 0x8E72, 0xE74D, 0x8E7C, 0xE74E, 0x8E81, 0xE74F, 0x8E87, + 0xE750, 0x8E85, 0xE751, 0x8E84, 0xE752, 0x8E8B, 0xE753, 0x8E8A, + 0xE754, 0x8E93, 0xE755, 0x8E91, 0xE756, 0x8E94, 0xE757, 0x8E99, + 0xE758, 0x8EAA, 0xE759, 0x8EA1, 0xE75A, 0x8EAC, 0xE75B, 0x8EB0, + 0xE75C, 0x8EC6, 0xE75D, 0x8EB1, 0xE75E, 0x8EBE, 0xE75F, 0x8EC5, + 0xE760, 0x8EC8, 0xE761, 0x8ECB, 0xE762, 0x8EDB, 0xE763, 0x8EE3, + 0xE764, 0x8EFC, 0xE765, 0x8EFB, 0xE766, 0x8EEB, 0xE767, 0x8EFE, + 0xE768, 0x8F0A, 0xE769, 0x8F05, 0xE76A, 0x8F15, 0xE76B, 0x8F12, + 0xE76C, 0x8F19, 0xE76D, 0x8F13, 0xE76E, 0x8F1C, 0xE76F, 0x8F1F, + 0xE770, 0x8F1B, 0xE771, 0x8F0C, 0xE772, 0x8F26, 0xE773, 0x8F33, + 0xE774, 0x8F3B, 0xE775, 0x8F39, 0xE776, 0x8F45, 0xE777, 0x8F42, + 0xE778, 0x8F3E, 0xE779, 0x8F4C, 0xE77A, 0x8F49, 0xE77B, 0x8F46, + 0xE77C, 0x8F4E, 0xE77D, 0x8F57, 0xE77E, 0x8F5C, 0xE780, 0x8F62, + 0xE781, 0x8F63, 0xE782, 0x8F64, 0xE783, 0x8F9C, 0xE784, 0x8F9F, + 0xE785, 0x8FA3, 0xE786, 0x8FAD, 0xE787, 0x8FAF, 0xE788, 0x8FB7, + 0xE789, 0x8FDA, 0xE78A, 0x8FE5, 0xE78B, 0x8FE2, 0xE78C, 0x8FEA, + 0xE78D, 0x8FEF, 0xE78E, 0x9087, 0xE78F, 0x8FF4, 0xE790, 0x9005, + 0xE791, 0x8FF9, 0xE792, 0x8FFA, 0xE793, 0x9011, 0xE794, 0x9015, + 0xE795, 0x9021, 0xE796, 0x900D, 0xE797, 0x901E, 0xE798, 0x9016, + 0xE799, 0x900B, 0xE79A, 0x9027, 0xE79B, 0x9036, 0xE79C, 0x9035, + 0xE79D, 0x9039, 0xE79E, 0x8FF8, 0xE79F, 0x904F, 0xE7A0, 0x9050, + 0xE7A1, 0x9051, 0xE7A2, 0x9052, 0xE7A3, 0x900E, 0xE7A4, 0x9049, + 0xE7A5, 0x903E, 0xE7A6, 0x9056, 0xE7A7, 0x9058, 0xE7A8, 0x905E, + 0xE7A9, 0x9068, 0xE7AA, 0x906F, 0xE7AB, 0x9076, 0xE7AC, 0x96A8, + 0xE7AD, 0x9072, 0xE7AE, 0x9082, 0xE7AF, 0x907D, 0xE7B0, 0x9081, + 0xE7B1, 0x9080, 0xE7B2, 0x908A, 0xE7B3, 0x9089, 0xE7B4, 0x908F, + 0xE7B5, 0x90A8, 0xE7B6, 0x90AF, 0xE7B7, 0x90B1, 0xE7B8, 0x90B5, + 0xE7B9, 0x90E2, 0xE7BA, 0x90E4, 0xE7BB, 0x6248, 0xE7BC, 0x90DB, + 0xE7BD, 0x9102, 0xE7BE, 0x9112, 0xE7BF, 0x9119, 0xE7C0, 0x9132, + 0xE7C1, 0x9130, 0xE7C2, 0x914A, 0xE7C3, 0x9156, 0xE7C4, 0x9158, + 0xE7C5, 0x9163, 0xE7C6, 0x9165, 0xE7C7, 0x9169, 0xE7C8, 0x9173, + 0xE7C9, 0x9172, 0xE7CA, 0x918B, 0xE7CB, 0x9189, 0xE7CC, 0x9182, + 0xE7CD, 0x91A2, 0xE7CE, 0x91AB, 0xE7CF, 0x91AF, 0xE7D0, 0x91AA, + 0xE7D1, 0x91B5, 0xE7D2, 0x91B4, 0xE7D3, 0x91BA, 0xE7D4, 0x91C0, + 0xE7D5, 0x91C1, 0xE7D6, 0x91C9, 0xE7D7, 0x91CB, 0xE7D8, 0x91D0, + 0xE7D9, 0x91D6, 0xE7DA, 0x91DF, 0xE7DB, 0x91E1, 0xE7DC, 0x91DB, + 0xE7DD, 0x91FC, 0xE7DE, 0x91F5, 0xE7DF, 0x91F6, 0xE7E0, 0x921E, + 0xE7E1, 0x91FF, 0xE7E2, 0x9214, 0xE7E3, 0x922C, 0xE7E4, 0x9215, + 0xE7E5, 0x9211, 0xE7E6, 0x925E, 0xE7E7, 0x9257, 0xE7E8, 0x9245, + 0xE7E9, 0x9249, 0xE7EA, 0x9264, 0xE7EB, 0x9248, 0xE7EC, 0x9295, + 0xE7ED, 0x923F, 0xE7EE, 0x924B, 0xE7EF, 0x9250, 0xE7F0, 0x929C, + 0xE7F1, 0x9296, 0xE7F2, 0x9293, 0xE7F3, 0x929B, 0xE7F4, 0x925A, + 0xE7F5, 0x92CF, 0xE7F6, 0x92B9, 0xE7F7, 0x92B7, 0xE7F8, 0x92E9, + 0xE7F9, 0x930F, 0xE7FA, 0x92FA, 0xE7FB, 0x9344, 0xE7FC, 0x932E, + 0xE840, 0x9319, 0xE841, 0x9322, 0xE842, 0x931A, 0xE843, 0x9323, + 0xE844, 0x933A, 0xE845, 0x9335, 0xE846, 0x933B, 0xE847, 0x935C, + 0xE848, 0x9360, 0xE849, 0x937C, 0xE84A, 0x936E, 0xE84B, 0x9356, + 0xE84C, 0x93B0, 0xE84D, 0x93AC, 0xE84E, 0x93AD, 0xE84F, 0x9394, + 0xE850, 0x93B9, 0xE851, 0x93D6, 0xE852, 0x93D7, 0xE853, 0x93E8, + 0xE854, 0x93E5, 0xE855, 0x93D8, 0xE856, 0x93C3, 0xE857, 0x93DD, + 0xE858, 0x93D0, 0xE859, 0x93C8, 0xE85A, 0x93E4, 0xE85B, 0x941A, + 0xE85C, 0x9414, 0xE85D, 0x9413, 0xE85E, 0x9403, 0xE85F, 0x9407, + 0xE860, 0x9410, 0xE861, 0x9436, 0xE862, 0x942B, 0xE863, 0x9435, + 0xE864, 0x9421, 0xE865, 0x943A, 0xE866, 0x9441, 0xE867, 0x9452, + 0xE868, 0x9444, 0xE869, 0x945B, 0xE86A, 0x9460, 0xE86B, 0x9462, + 0xE86C, 0x945E, 0xE86D, 0x946A, 0xE86E, 0x9229, 0xE86F, 0x9470, + 0xE870, 0x9475, 0xE871, 0x9477, 0xE872, 0x947D, 0xE873, 0x945A, + 0xE874, 0x947C, 0xE875, 0x947E, 0xE876, 0x9481, 0xE877, 0x947F, + 0xE878, 0x9582, 0xE879, 0x9587, 0xE87A, 0x958A, 0xE87B, 0x9594, + 0xE87C, 0x9596, 0xE87D, 0x9598, 0xE87E, 0x9599, 0xE880, 0x95A0, + 0xE881, 0x95A8, 0xE882, 0x95A7, 0xE883, 0x95AD, 0xE884, 0x95BC, + 0xE885, 0x95BB, 0xE886, 0x95B9, 0xE887, 0x95BE, 0xE888, 0x95CA, + 0xE889, 0x6FF6, 0xE88A, 0x95C3, 0xE88B, 0x95CD, 0xE88C, 0x95CC, + 0xE88D, 0x95D5, 0xE88E, 0x95D4, 0xE88F, 0x95D6, 0xE890, 0x95DC, + 0xE891, 0x95E1, 0xE892, 0x95E5, 0xE893, 0x95E2, 0xE894, 0x9621, + 0xE895, 0x9628, 0xE896, 0x962E, 0xE897, 0x962F, 0xE898, 0x9642, + 0xE899, 0x964C, 0xE89A, 0x964F, 0xE89B, 0x964B, 0xE89C, 0x9677, + 0xE89D, 0x965C, 0xE89E, 0x965E, 0xE89F, 0x965D, 0xE8A0, 0x965F, + 0xE8A1, 0x9666, 0xE8A2, 0x9672, 0xE8A3, 0x966C, 0xE8A4, 0x968D, + 0xE8A5, 0x9698, 0xE8A6, 0x9695, 0xE8A7, 0x9697, 0xE8A8, 0x96AA, + 0xE8A9, 0x96A7, 0xE8AA, 0x96B1, 0xE8AB, 0x96B2, 0xE8AC, 0x96B0, + 0xE8AD, 0x96B4, 0xE8AE, 0x96B6, 0xE8AF, 0x96B8, 0xE8B0, 0x96B9, + 0xE8B1, 0x96CE, 0xE8B2, 0x96CB, 0xE8B3, 0x96C9, 0xE8B4, 0x96CD, + 0xE8B5, 0x894D, 0xE8B6, 0x96DC, 0xE8B7, 0x970D, 0xE8B8, 0x96D5, + 0xE8B9, 0x96F9, 0xE8BA, 0x9704, 0xE8BB, 0x9706, 0xE8BC, 0x9708, + 0xE8BD, 0x9713, 0xE8BE, 0x970E, 0xE8BF, 0x9711, 0xE8C0, 0x970F, + 0xE8C1, 0x9716, 0xE8C2, 0x9719, 0xE8C3, 0x9724, 0xE8C4, 0x972A, + 0xE8C5, 0x9730, 0xE8C6, 0x9739, 0xE8C7, 0x973D, 0xE8C8, 0x973E, + 0xE8C9, 0x9744, 0xE8CA, 0x9746, 0xE8CB, 0x9748, 0xE8CC, 0x9742, + 0xE8CD, 0x9749, 0xE8CE, 0x975C, 0xE8CF, 0x9760, 0xE8D0, 0x9764, + 0xE8D1, 0x9766, 0xE8D2, 0x9768, 0xE8D3, 0x52D2, 0xE8D4, 0x976B, + 0xE8D5, 0x9771, 0xE8D6, 0x9779, 0xE8D7, 0x9785, 0xE8D8, 0x977C, + 0xE8D9, 0x9781, 0xE8DA, 0x977A, 0xE8DB, 0x9786, 0xE8DC, 0x978B, + 0xE8DD, 0x978F, 0xE8DE, 0x9790, 0xE8DF, 0x979C, 0xE8E0, 0x97A8, + 0xE8E1, 0x97A6, 0xE8E2, 0x97A3, 0xE8E3, 0x97B3, 0xE8E4, 0x97B4, + 0xE8E5, 0x97C3, 0xE8E6, 0x97C6, 0xE8E7, 0x97C8, 0xE8E8, 0x97CB, + 0xE8E9, 0x97DC, 0xE8EA, 0x97ED, 0xE8EB, 0x9F4F, 0xE8EC, 0x97F2, + 0xE8ED, 0x7ADF, 0xE8EE, 0x97F6, 0xE8EF, 0x97F5, 0xE8F0, 0x980F, + 0xE8F1, 0x980C, 0xE8F2, 0x9838, 0xE8F3, 0x9824, 0xE8F4, 0x9821, + 0xE8F5, 0x9837, 0xE8F6, 0x983D, 0xE8F7, 0x9846, 0xE8F8, 0x984F, + 0xE8F9, 0x984B, 0xE8FA, 0x986B, 0xE8FB, 0x986F, 0xE8FC, 0x9870, + 0xE940, 0x9871, 0xE941, 0x9874, 0xE942, 0x9873, 0xE943, 0x98AA, + 0xE944, 0x98AF, 0xE945, 0x98B1, 0xE946, 0x98B6, 0xE947, 0x98C4, + 0xE948, 0x98C3, 0xE949, 0x98C6, 0xE94A, 0x98E9, 0xE94B, 0x98EB, + 0xE94C, 0x9903, 0xE94D, 0x9909, 0xE94E, 0x9912, 0xE94F, 0x9914, + 0xE950, 0x9918, 0xE951, 0x9921, 0xE952, 0x991D, 0xE953, 0x991E, + 0xE954, 0x9924, 0xE955, 0x9920, 0xE956, 0x992C, 0xE957, 0x992E, + 0xE958, 0x993D, 0xE959, 0x993E, 0xE95A, 0x9942, 0xE95B, 0x9949, + 0xE95C, 0x9945, 0xE95D, 0x9950, 0xE95E, 0x994B, 0xE95F, 0x9951, + 0xE960, 0x9952, 0xE961, 0x994C, 0xE962, 0x9955, 0xE963, 0x9997, + 0xE964, 0x9998, 0xE965, 0x99A5, 0xE966, 0x99AD, 0xE967, 0x99AE, + 0xE968, 0x99BC, 0xE969, 0x99DF, 0xE96A, 0x99DB, 0xE96B, 0x99DD, + 0xE96C, 0x99D8, 0xE96D, 0x99D1, 0xE96E, 0x99ED, 0xE96F, 0x99EE, + 0xE970, 0x99F1, 0xE971, 0x99F2, 0xE972, 0x99FB, 0xE973, 0x99F8, + 0xE974, 0x9A01, 0xE975, 0x9A0F, 0xE976, 0x9A05, 0xE977, 0x99E2, + 0xE978, 0x9A19, 0xE979, 0x9A2B, 0xE97A, 0x9A37, 0xE97B, 0x9A45, + 0xE97C, 0x9A42, 0xE97D, 0x9A40, 0xE97E, 0x9A43, 0xE980, 0x9A3E, + 0xE981, 0x9A55, 0xE982, 0x9A4D, 0xE983, 0x9A5B, 0xE984, 0x9A57, + 0xE985, 0x9A5F, 0xE986, 0x9A62, 0xE987, 0x9A65, 0xE988, 0x9A64, + 0xE989, 0x9A69, 0xE98A, 0x9A6B, 0xE98B, 0x9A6A, 0xE98C, 0x9AAD, + 0xE98D, 0x9AB0, 0xE98E, 0x9ABC, 0xE98F, 0x9AC0, 0xE990, 0x9ACF, + 0xE991, 0x9AD1, 0xE992, 0x9AD3, 0xE993, 0x9AD4, 0xE994, 0x9ADE, + 0xE995, 0x9ADF, 0xE996, 0x9AE2, 0xE997, 0x9AE3, 0xE998, 0x9AE6, + 0xE999, 0x9AEF, 0xE99A, 0x9AEB, 0xE99B, 0x9AEE, 0xE99C, 0x9AF4, + 0xE99D, 0x9AF1, 0xE99E, 0x9AF7, 0xE99F, 0x9AFB, 0xE9A0, 0x9B06, + 0xE9A1, 0x9B18, 0xE9A2, 0x9B1A, 0xE9A3, 0x9B1F, 0xE9A4, 0x9B22, + 0xE9A5, 0x9B23, 0xE9A6, 0x9B25, 0xE9A7, 0x9B27, 0xE9A8, 0x9B28, + 0xE9A9, 0x9B29, 0xE9AA, 0x9B2A, 0xE9AB, 0x9B2E, 0xE9AC, 0x9B2F, + 0xE9AD, 0x9B32, 0xE9AE, 0x9B44, 0xE9AF, 0x9B43, 0xE9B0, 0x9B4F, + 0xE9B1, 0x9B4D, 0xE9B2, 0x9B4E, 0xE9B3, 0x9B51, 0xE9B4, 0x9B58, + 0xE9B5, 0x9B74, 0xE9B6, 0x9B93, 0xE9B7, 0x9B83, 0xE9B8, 0x9B91, + 0xE9B9, 0x9B96, 0xE9BA, 0x9B97, 0xE9BB, 0x9B9F, 0xE9BC, 0x9BA0, + 0xE9BD, 0x9BA8, 0xE9BE, 0x9BB4, 0xE9BF, 0x9BC0, 0xE9C0, 0x9BCA, + 0xE9C1, 0x9BB9, 0xE9C2, 0x9BC6, 0xE9C3, 0x9BCF, 0xE9C4, 0x9BD1, + 0xE9C5, 0x9BD2, 0xE9C6, 0x9BE3, 0xE9C7, 0x9BE2, 0xE9C8, 0x9BE4, + 0xE9C9, 0x9BD4, 0xE9CA, 0x9BE1, 0xE9CB, 0x9C3A, 0xE9CC, 0x9BF2, + 0xE9CD, 0x9BF1, 0xE9CE, 0x9BF0, 0xE9CF, 0x9C15, 0xE9D0, 0x9C14, + 0xE9D1, 0x9C09, 0xE9D2, 0x9C13, 0xE9D3, 0x9C0C, 0xE9D4, 0x9C06, + 0xE9D5, 0x9C08, 0xE9D6, 0x9C12, 0xE9D7, 0x9C0A, 0xE9D8, 0x9C04, + 0xE9D9, 0x9C2E, 0xE9DA, 0x9C1B, 0xE9DB, 0x9C25, 0xE9DC, 0x9C24, + 0xE9DD, 0x9C21, 0xE9DE, 0x9C30, 0xE9DF, 0x9C47, 0xE9E0, 0x9C32, + 0xE9E1, 0x9C46, 0xE9E2, 0x9C3E, 0xE9E3, 0x9C5A, 0xE9E4, 0x9C60, + 0xE9E5, 0x9C67, 0xE9E6, 0x9C76, 0xE9E7, 0x9C78, 0xE9E8, 0x9CE7, + 0xE9E9, 0x9CEC, 0xE9EA, 0x9CF0, 0xE9EB, 0x9D09, 0xE9EC, 0x9D08, + 0xE9ED, 0x9CEB, 0xE9EE, 0x9D03, 0xE9EF, 0x9D06, 0xE9F0, 0x9D2A, + 0xE9F1, 0x9D26, 0xE9F2, 0x9DAF, 0xE9F3, 0x9D23, 0xE9F4, 0x9D1F, + 0xE9F5, 0x9D44, 0xE9F6, 0x9D15, 0xE9F7, 0x9D12, 0xE9F8, 0x9D41, + 0xE9F9, 0x9D3F, 0xE9FA, 0x9D3E, 0xE9FB, 0x9D46, 0xE9FC, 0x9D48, + 0xEA40, 0x9D5D, 0xEA41, 0x9D5E, 0xEA42, 0x9D64, 0xEA43, 0x9D51, + 0xEA44, 0x9D50, 0xEA45, 0x9D59, 0xEA46, 0x9D72, 0xEA47, 0x9D89, + 0xEA48, 0x9D87, 0xEA49, 0x9DAB, 0xEA4A, 0x9D6F, 0xEA4B, 0x9D7A, + 0xEA4C, 0x9D9A, 0xEA4D, 0x9DA4, 0xEA4E, 0x9DA9, 0xEA4F, 0x9DB2, + 0xEA50, 0x9DC4, 0xEA51, 0x9DC1, 0xEA52, 0x9DBB, 0xEA53, 0x9DB8, + 0xEA54, 0x9DBA, 0xEA55, 0x9DC6, 0xEA56, 0x9DCF, 0xEA57, 0x9DC2, + 0xEA58, 0x9DD9, 0xEA59, 0x9DD3, 0xEA5A, 0x9DF8, 0xEA5B, 0x9DE6, + 0xEA5C, 0x9DED, 0xEA5D, 0x9DEF, 0xEA5E, 0x9DFD, 0xEA5F, 0x9E1A, + 0xEA60, 0x9E1B, 0xEA61, 0x9E1E, 0xEA62, 0x9E75, 0xEA63, 0x9E79, + 0xEA64, 0x9E7D, 0xEA65, 0x9E81, 0xEA66, 0x9E88, 0xEA67, 0x9E8B, + 0xEA68, 0x9E8C, 0xEA69, 0x9E92, 0xEA6A, 0x9E95, 0xEA6B, 0x9E91, + 0xEA6C, 0x9E9D, 0xEA6D, 0x9EA5, 0xEA6E, 0x9EA9, 0xEA6F, 0x9EB8, + 0xEA70, 0x9EAA, 0xEA71, 0x9EAD, 0xEA72, 0x9761, 0xEA73, 0x9ECC, + 0xEA74, 0x9ECE, 0xEA75, 0x9ECF, 0xEA76, 0x9ED0, 0xEA77, 0x9ED4, + 0xEA78, 0x9EDC, 0xEA79, 0x9EDE, 0xEA7A, 0x9EDD, 0xEA7B, 0x9EE0, + 0xEA7C, 0x9EE5, 0xEA7D, 0x9EE8, 0xEA7E, 0x9EEF, 0xEA80, 0x9EF4, + 0xEA81, 0x9EF6, 0xEA82, 0x9EF7, 0xEA83, 0x9EF9, 0xEA84, 0x9EFB, + 0xEA85, 0x9EFC, 0xEA86, 0x9EFD, 0xEA87, 0x9F07, 0xEA88, 0x9F08, + 0xEA89, 0x76B7, 0xEA8A, 0x9F15, 0xEA8B, 0x9F21, 0xEA8C, 0x9F2C, + 0xEA8D, 0x9F3E, 0xEA8E, 0x9F4A, 0xEA8F, 0x9F52, 0xEA90, 0x9F54, + 0xEA91, 0x9F63, 0xEA92, 0x9F5F, 0xEA93, 0x9F60, 0xEA94, 0x9F61, + 0xEA95, 0x9F66, 0xEA96, 0x9F67, 0xEA97, 0x9F6C, 0xEA98, 0x9F6A, + 0xEA99, 0x9F77, 0xEA9A, 0x9F72, 0xEA9B, 0x9F76, 0xEA9C, 0x9F95, + 0xEA9D, 0x9F9C, 0xEA9E, 0x9FA0, 0xEA9F, 0x582F, 0xEAA0, 0x69C7, + 0xEAA1, 0x9059, 0xEAA2, 0x7464, 0xEAA3, 0x51DC, 0xEAA4, 0x7199, + 0xFA40, 0x2170, 0xFA41, 0x2171, 0xFA42, 0x2172, 0xFA43, 0x2173, + 0xFA44, 0x2174, 0xFA45, 0x2175, 0xFA46, 0x2176, 0xFA47, 0x2177, + 0xFA48, 0x2178, 0xFA49, 0x2179, 0xFA55, 0xFFE4, 0xFA56, 0xFF07, + 0xFA57, 0xFF02, 0xFA5C, 0x7E8A, 0xFA5D, 0x891C, 0xFA5E, 0x9348, + 0xFA5F, 0x9288, 0xFA60, 0x84DC, 0xFA61, 0x4FC9, 0xFA62, 0x70BB, + 0xFA63, 0x6631, 0xFA64, 0x68C8, 0xFA65, 0x92F9, 0xFA66, 0x66FB, + 0xFA67, 0x5F45, 0xFA68, 0x4E28, 0xFA69, 0x4EE1, 0xFA6A, 0x4EFC, + 0xFA6B, 0x4F00, 0xFA6C, 0x4F03, 0xFA6D, 0x4F39, 0xFA6E, 0x4F56, + 0xFA6F, 0x4F92, 0xFA70, 0x4F8A, 0xFA71, 0x4F9A, 0xFA72, 0x4F94, + 0xFA73, 0x4FCD, 0xFA74, 0x5040, 0xFA75, 0x5022, 0xFA76, 0x4FFF, + 0xFA77, 0x501E, 0xFA78, 0x5046, 0xFA79, 0x5070, 0xFA7A, 0x5042, + 0xFA7B, 0x5094, 0xFA7C, 0x50F4, 0xFA7D, 0x50D8, 0xFA7E, 0x514A, + 0xFA80, 0x5164, 0xFA81, 0x519D, 0xFA82, 0x51BE, 0xFA83, 0x51EC, + 0xFA84, 0x5215, 0xFA85, 0x529C, 0xFA86, 0x52A6, 0xFA87, 0x52C0, + 0xFA88, 0x52DB, 0xFA89, 0x5300, 0xFA8A, 0x5307, 0xFA8B, 0x5324, + 0xFA8C, 0x5372, 0xFA8D, 0x5393, 0xFA8E, 0x53B2, 0xFA8F, 0x53DD, + 0xFA90, 0xFA0E, 0xFA91, 0x549C, 0xFA92, 0x548A, 0xFA93, 0x54A9, + 0xFA94, 0x54FF, 0xFA95, 0x5586, 0xFA96, 0x5759, 0xFA97, 0x5765, + 0xFA98, 0x57AC, 0xFA99, 0x57C8, 0xFA9A, 0x57C7, 0xFA9B, 0xFA0F, + 0xFA9C, 0xFA10, 0xFA9D, 0x589E, 0xFA9E, 0x58B2, 0xFA9F, 0x590B, + 0xFAA0, 0x5953, 0xFAA1, 0x595B, 0xFAA2, 0x595D, 0xFAA3, 0x5963, + 0xFAA4, 0x59A4, 0xFAA5, 0x59BA, 0xFAA6, 0x5B56, 0xFAA7, 0x5BC0, + 0xFAA8, 0x752F, 0xFAA9, 0x5BD8, 0xFAAA, 0x5BEC, 0xFAAB, 0x5C1E, + 0xFAAC, 0x5CA6, 0xFAAD, 0x5CBA, 0xFAAE, 0x5CF5, 0xFAAF, 0x5D27, + 0xFAB0, 0x5D53, 0xFAB1, 0xFA11, 0xFAB2, 0x5D42, 0xFAB3, 0x5D6D, + 0xFAB4, 0x5DB8, 0xFAB5, 0x5DB9, 0xFAB6, 0x5DD0, 0xFAB7, 0x5F21, + 0xFAB8, 0x5F34, 0xFAB9, 0x5F67, 0xFABA, 0x5FB7, 0xFABB, 0x5FDE, + 0xFABC, 0x605D, 0xFABD, 0x6085, 0xFABE, 0x608A, 0xFABF, 0x60DE, + 0xFAC0, 0x60D5, 0xFAC1, 0x6120, 0xFAC2, 0x60F2, 0xFAC3, 0x6111, + 0xFAC4, 0x6137, 0xFAC5, 0x6130, 0xFAC6, 0x6198, 0xFAC7, 0x6213, + 0xFAC8, 0x62A6, 0xFAC9, 0x63F5, 0xFACA, 0x6460, 0xFACB, 0x649D, + 0xFACC, 0x64CE, 0xFACD, 0x654E, 0xFACE, 0x6600, 0xFACF, 0x6615, + 0xFAD0, 0x663B, 0xFAD1, 0x6609, 0xFAD2, 0x662E, 0xFAD3, 0x661E, + 0xFAD4, 0x6624, 0xFAD5, 0x6665, 0xFAD6, 0x6657, 0xFAD7, 0x6659, + 0xFAD8, 0xFA12, 0xFAD9, 0x6673, 0xFADA, 0x6699, 0xFADB, 0x66A0, + 0xFADC, 0x66B2, 0xFADD, 0x66BF, 0xFADE, 0x66FA, 0xFADF, 0x670E, + 0xFAE0, 0xF929, 0xFAE1, 0x6766, 0xFAE2, 0x67BB, 0xFAE3, 0x6852, + 0xFAE4, 0x67C0, 0xFAE5, 0x6801, 0xFAE6, 0x6844, 0xFAE7, 0x68CF, + 0xFAE8, 0xFA13, 0xFAE9, 0x6968, 0xFAEA, 0xFA14, 0xFAEB, 0x6998, + 0xFAEC, 0x69E2, 0xFAED, 0x6A30, 0xFAEE, 0x6A6B, 0xFAEF, 0x6A46, + 0xFAF0, 0x6A73, 0xFAF1, 0x6A7E, 0xFAF2, 0x6AE2, 0xFAF3, 0x6AE4, + 0xFAF4, 0x6BD6, 0xFAF5, 0x6C3F, 0xFAF6, 0x6C5C, 0xFAF7, 0x6C86, + 0xFAF8, 0x6C6F, 0xFAF9, 0x6CDA, 0xFAFA, 0x6D04, 0xFAFB, 0x6D87, + 0xFAFC, 0x6D6F, 0xFB40, 0x6D96, 0xFB41, 0x6DAC, 0xFB42, 0x6DCF, + 0xFB43, 0x6DF8, 0xFB44, 0x6DF2, 0xFB45, 0x6DFC, 0xFB46, 0x6E39, + 0xFB47, 0x6E5C, 0xFB48, 0x6E27, 0xFB49, 0x6E3C, 0xFB4A, 0x6EBF, + 0xFB4B, 0x6F88, 0xFB4C, 0x6FB5, 0xFB4D, 0x6FF5, 0xFB4E, 0x7005, + 0xFB4F, 0x7007, 0xFB50, 0x7028, 0xFB51, 0x7085, 0xFB52, 0x70AB, + 0xFB53, 0x710F, 0xFB54, 0x7104, 0xFB55, 0x715C, 0xFB56, 0x7146, + 0xFB57, 0x7147, 0xFB58, 0xFA15, 0xFB59, 0x71C1, 0xFB5A, 0x71FE, + 0xFB5B, 0x72B1, 0xFB5C, 0x72BE, 0xFB5D, 0x7324, 0xFB5E, 0xFA16, + 0xFB5F, 0x7377, 0xFB60, 0x73BD, 0xFB61, 0x73C9, 0xFB62, 0x73D6, + 0xFB63, 0x73E3, 0xFB64, 0x73D2, 0xFB65, 0x7407, 0xFB66, 0x73F5, + 0xFB67, 0x7426, 0xFB68, 0x742A, 0xFB69, 0x7429, 0xFB6A, 0x742E, + 0xFB6B, 0x7462, 0xFB6C, 0x7489, 0xFB6D, 0x749F, 0xFB6E, 0x7501, + 0xFB6F, 0x756F, 0xFB70, 0x7682, 0xFB71, 0x769C, 0xFB72, 0x769E, + 0xFB73, 0x769B, 0xFB74, 0x76A6, 0xFB75, 0xFA17, 0xFB76, 0x7746, + 0xFB77, 0x52AF, 0xFB78, 0x7821, 0xFB79, 0x784E, 0xFB7A, 0x7864, + 0xFB7B, 0x787A, 0xFB7C, 0x7930, 0xFB7D, 0xFA18, 0xFB7E, 0xFA19, + 0xFB80, 0xFA1A, 0xFB81, 0x7994, 0xFB82, 0xFA1B, 0xFB83, 0x799B, + 0xFB84, 0x7AD1, 0xFB85, 0x7AE7, 0xFB86, 0xFA1C, 0xFB87, 0x7AEB, + 0xFB88, 0x7B9E, 0xFB89, 0xFA1D, 0xFB8A, 0x7D48, 0xFB8B, 0x7D5C, + 0xFB8C, 0x7DB7, 0xFB8D, 0x7DA0, 0xFB8E, 0x7DD6, 0xFB8F, 0x7E52, + 0xFB90, 0x7F47, 0xFB91, 0x7FA1, 0xFB92, 0xFA1E, 0xFB93, 0x8301, + 0xFB94, 0x8362, 0xFB95, 0x837F, 0xFB96, 0x83C7, 0xFB97, 0x83F6, + 0xFB98, 0x8448, 0xFB99, 0x84B4, 0xFB9A, 0x8553, 0xFB9B, 0x8559, + 0xFB9C, 0x856B, 0xFB9D, 0xFA1F, 0xFB9E, 0x85B0, 0xFB9F, 0xFA20, + 0xFBA0, 0xFA21, 0xFBA1, 0x8807, 0xFBA2, 0x88F5, 0xFBA3, 0x8A12, + 0xFBA4, 0x8A37, 0xFBA5, 0x8A79, 0xFBA6, 0x8AA7, 0xFBA7, 0x8ABE, + 0xFBA8, 0x8ADF, 0xFBA9, 0xFA22, 0xFBAA, 0x8AF6, 0xFBAB, 0x8B53, + 0xFBAC, 0x8B7F, 0xFBAD, 0x8CF0, 0xFBAE, 0x8CF4, 0xFBAF, 0x8D12, + 0xFBB0, 0x8D76, 0xFBB1, 0xFA23, 0xFBB2, 0x8ECF, 0xFBB3, 0xFA24, + 0xFBB4, 0xFA25, 0xFBB5, 0x9067, 0xFBB6, 0x90DE, 0xFBB7, 0xFA26, + 0xFBB8, 0x9115, 0xFBB9, 0x9127, 0xFBBA, 0x91DA, 0xFBBB, 0x91D7, + 0xFBBC, 0x91DE, 0xFBBD, 0x91ED, 0xFBBE, 0x91EE, 0xFBBF, 0x91E4, + 0xFBC0, 0x91E5, 0xFBC1, 0x9206, 0xFBC2, 0x9210, 0xFBC3, 0x920A, + 0xFBC4, 0x923A, 0xFBC5, 0x9240, 0xFBC6, 0x923C, 0xFBC7, 0x924E, + 0xFBC8, 0x9259, 0xFBC9, 0x9251, 0xFBCA, 0x9239, 0xFBCB, 0x9267, + 0xFBCC, 0x92A7, 0xFBCD, 0x9277, 0xFBCE, 0x9278, 0xFBCF, 0x92E7, + 0xFBD0, 0x92D7, 0xFBD1, 0x92D9, 0xFBD2, 0x92D0, 0xFBD3, 0xFA27, + 0xFBD4, 0x92D5, 0xFBD5, 0x92E0, 0xFBD6, 0x92D3, 0xFBD7, 0x9325, + 0xFBD8, 0x9321, 0xFBD9, 0x92FB, 0xFBDA, 0xFA28, 0xFBDB, 0x931E, + 0xFBDC, 0x92FF, 0xFBDD, 0x931D, 0xFBDE, 0x9302, 0xFBDF, 0x9370, + 0xFBE0, 0x9357, 0xFBE1, 0x93A4, 0xFBE2, 0x93C6, 0xFBE3, 0x93DE, + 0xFBE4, 0x93F8, 0xFBE5, 0x9431, 0xFBE6, 0x9445, 0xFBE7, 0x9448, + 0xFBE8, 0x9592, 0xFBE9, 0xF9DC, 0xFBEA, 0xFA29, 0xFBEB, 0x969D, + 0xFBEC, 0x96AF, 0xFBED, 0x9733, 0xFBEE, 0x973B, 0xFBEF, 0x9743, + 0xFBF0, 0x974D, 0xFBF1, 0x974F, 0xFBF2, 0x9751, 0xFBF3, 0x9755, + 0xFBF4, 0x9857, 0xFBF5, 0x9865, 0xFBF6, 0xFA2A, 0xFBF7, 0xFA2B, + 0xFBF8, 0x9927, 0xFBF9, 0xFA2C, 0xFBFA, 0x999E, 0xFBFB, 0x9A4E, + 0xFBFC, 0x9AD9, 0xFC40, 0x9ADC, 0xFC41, 0x9B75, 0xFC42, 0x9B72, + 0xFC43, 0x9B8F, 0xFC44, 0x9BB1, 0xFC45, 0x9BBB, 0xFC46, 0x9C00, + 0xFC47, 0x9D70, 0xFC48, 0x9D6B, 0xFC49, 0xFA2D, 0xFC4A, 0x9E19, + 0xFC4B, 0x9ED1, 0, 0 }; #endif @@ -3725,7 +3724,7 @@ const WCHAR sjis2uni[] = { WCHAR ff_convert ( /* Converted code, 0 means conversion error */ WCHAR chr, /* Character code to be converted */ - UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ + UINT dir /* 0: Unicode to OEM code, 1: OEM code to Unicode */ ) { const WCHAR *p; @@ -3737,10 +3736,10 @@ WCHAR ff_convert ( /* Converted code, 0 means conversion error */ c = chr; } else { #if !_TINY_TABLE - if (dir) { /* OEMCP to unicode */ + if (dir) { /* OEM code to unicode */ p = sjis2uni; hi = sizeof sjis2uni / 4 - 1; - } else { /* Unicode to OEMCP */ + } else { /* Unicode to OEM code */ p = uni2sjis; hi = sizeof uni2sjis / 4 - 1; } @@ -3755,7 +3754,7 @@ WCHAR ff_convert ( /* Converted code, 0 means conversion error */ } c = n ? p[i * 2 + 1] : 0; #else - if (dir) { /* OEMCP to unicode (Incremental search)*/ + if (dir) { /* OEM code to unicode (Incremental search)*/ p = &uni2sjis[1]; do { c = *p; @@ -3763,7 +3762,7 @@ WCHAR ff_convert ( /* Converted code, 0 means conversion error */ } while (c && c != chr); p -= 3; c = *p; - } else { /* Unicode to OEMCP */ + } else { /* Unicode to OEM code */ li = 0; hi = sizeof uni2sjis / 4 - 1; for (n = 16; n; n--) { i = li + (hi - li) / 2; @@ -3783,16 +3782,48 @@ WCHAR ff_convert ( /* Converted code, 0 means conversion error */ -WCHAR ff_wtoupper ( /* Upper converted character */ - WCHAR chr /* Input character */ +WCHAR ff_wtoupper ( + WCHAR chr /* Unicode character to be upper converted */ ) { - static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; - static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; - int i; + static const WCHAR lower[] = { /* Lower case characters to be converted */ + /* Latin Supplement */ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, + /* Latin Extended-A */ 0x101,0x103,0x105,0x107,0x109,0x10B,0x10D,0x10F,0x111,0x113,0x115,0x117,0x119,0x11B,0x11D,0x11F,0x121,0x123,0x125,0x127,0x129,0x12B,0x12D,0x12F,0x131,0x133,0x135,0x137,0x13A,0x13C,0x13E,0x140,0x142,0x144,0x146,0x148,0x14B,0x14D,0x14F,0x151,0x153,0x155,0x157,0x159,0x15B,0x15D,0x15F,0x161,0x163,0x165,0x167,0x169,0x16B,0x16D,0x16F,0x171,0x173,0x175,0x177,0x17A,0x17C,0x17E, + /* Latin Extended-B */ 0x183,0x185,0x188,0x18C,0x192,0x199,0x1A1,0x1A3,0x1A8,0x1AD,0x1B0,0x1B4,0x1B6,0x1B9,0x1BD,0x1C6,0x1C9,0x1CC,0x1CE,0x1D0,0x1D2,0x1D4,0x1D6,0x1D8,0x1DA,0x1DC,0x1DD,0x1DF,0x1E1,0x1E3,0x1E5,0x1E7,0x1E9,0x1EB,0x1ED,0x1EF,0x1F3,0x1F5,0x1FB,0x1FD,0x1FF,0x201,0x203,0x205,0x207,0x209,0x20B,0x20D,0x20F,0x211,0x213,0x215,0x217, + /* Greek, Coptic */ 0x3B1,0x3B2,0x3B3,0x3B4,0x3B5,0x3B6,0x3B7,0x3B8,0x3B9,0x3BA,0x3BB,0x3BC,0x3BD,0x3BE,0x3BF,0x3C0,0x3C1,0x3C3,0x3C4,0x3C5,0x3C6,0x3C7,0x3C8,0x3C9,0x3CA,0x3CB,0x3CC,0x3CD,0x3CE,0x3E3,0x3E5,0x3E7,0x3E9,0x3EB, + /* Cyrillic */ 0x430,0x431,0x432,0x433,0x434,0x435,0x436,0x437,0x438,0x439,0x43A,0x43B,0x43C,0x43D,0x43E,0x43F,0x440,0x441,0x442,0x443,0x444,0x445,0x446,0x447,0x448,0x449,0x44A,0x44B,0x44C,0x44D,0x44E,0x44F,0x452,0x453,0x454,0x455,0x456,0x457,0x458,0x459,0x45A,0x45B,0x45C,0x45E,0x45F,0x461,0x463,0x465,0x467,0x469,0x46B,0x46D,0x46F,0x471,0x473,0x475,0x477,0x479,0x47B,0x47D,0x47F,0x481,0x491,0x493,0x495,0x497,0x499,0x49B,0x49D,0x49F,0x4A1,0x4A3,0x4A5,0x4A7,0x4A9,0x4AB,0x4AD,0x4AF,0x4B1,0x4B3,0x4B5,0x4B7,0x4B9,0x4BB,0x4BD,0x4BF,0x4C2,0x4C4,0x4C8,0x4D1,0x4D3,0x4D5,0x4D7,0x4D9,0x4DB,0x4DD,0x4DF,0x4E1,0x4E3,0x4E5,0x4E7,0x4E9,0x4EB,0x4ED,0x4EF,0x4F1,0x4F3,0x4F5,0x4F9, + /* Armenian */ 0x561,0x562,0x563,0x564,0x565,0x566,0x567,0x568,0x569,0x56A,0x56B,0x56C,0x56D,0x56E,0x56F,0x570,0x571,0x572,0x573,0x574,0x575,0x576,0x577,0x578,0x579,0x57A,0x57B,0x57C,0x57D,0x57E,0x57F,0x580,0x581,0x582,0x583,0x584,0x585,0x586, + /* Latin Extended Additional */ 0x1E01,0x1E03,0x1E05,0x1E07,0x1E09,0x1E0B,0x1E0D,0x1E0F,0x1E11,0x1E13,0x1E15,0x1E17,0x1E19,0x1E1B,0x1E1D,0x1E1F,0x1E21,0x1E23,0x1E25,0x1E27,0x1E29,0x1E2B,0x1E2D,0x1E2F,0x1E31,0x1E33,0x1E35,0x1E37,0x1E39,0x1E3B,0x1E3D,0x1E3F,0x1E41,0x1E43,0x1E45,0x1E47,0x1E49,0x1E4B,0x1E4D,0x1E4F,0x1E51,0x1E53,0x1E55,0x1E57,0x1E59,0x1E5B,0x1E5D,0x1E5F,0x1E61,0x1E63,0x1E65,0x1E67,0x1E69,0x1E6B,0x1E6D,0x1E6F,0x1E71,0x1E73,0x1E75,0x1E77,0x1E79,0x1E7B,0x1E7D,0x1E7F,0x1E81,0x1E83,0x1E85,0x1E87,0x1E89,0x1E8B,0x1E8D,0x1E8F,0x1E91,0x1E93,0x1E95,0x1E97,0x1E99,0x1E9B,0x1E9D,0x1E9F,0x1EA1,0x1EA3,0x1EA5,0x1EA7,0x1EA9,0x1EAB,0x1EAD,0x1EAF,0x1EB1,0x1EB3,0x1EB5,0x1EB7,0x1EB9,0x1EBB,0x1EBD,0x1EBF,0x1EC1,0x1EC3,0x1EC5,0x1EC7,0x1EC9,0x1ECB,0x1ECD,0x1ECF,0x1ED1,0x1ED3,0x1ED5,0x1ED7,0x1ED9,0x1EDB,0x1EDD,0x1EDF,0x1EE1,0x1EE3,0x1EE5,0x1EE7,0x1EE9,0x1EEB,0x1EED,0x1EEF,0x1EF1,0x1EF3,0x1EF5,0x1EF7,0x1EF9, + /* Number forms */ 0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,0x2176,0x2177,0x2178,0x2179,0x217A,0x217B,0x217C,0x217D,0x217E,0x217F, + /* Full-width */ 0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47,0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57,0xFF58,0xFF59,0xFF5A + }; + static const WCHAR upper[] = { /* Upper case characters correspond to lower[] */ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x178, + 0x100,0x102,0x104,0x106,0x108,0x10A,0x10C,0x10E,0x110,0x112,0x114,0x116,0x118,0x11A,0x11C,0x11E,0x120,0x122,0x124,0x126,0x128,0x12A,0x12C,0x12E,0x130,0x132,0x134,0x136,0x139,0x13B,0x13D,0x13F,0x141,0x143,0x145,0x147,0x14A,0x14C,0x14E,0x150,0x152,0x154,0x156,0x158,0x15A,0x15C,0x15E,0x160,0x162,0x164,0x166,0x168,0x16A,0x16C,0x16E,0x170,0x172,0x174,0x176,0x179,0x17B,0x17D, + 0x182,0x184,0x187,0x18B,0x191,0x198,0x1A0,0x1A2,0x1A7,0x1AC,0x1AF,0x1B3,0x1B5,0x1B8,0x1BC,0x1C4,0x1C7,0x1CA,0x1CD,0x1CF,0x1D1,0x1D3,0x1D5,0x1D7,0x1D9,0x1DB,0x18E,0x1DE,0x1E0,0x1E2,0x1E4,0x1E6,0x1E8,0x1EA,0x1EC,0x1EE,0x1F1,0x1F4,0x1FA,0x1FC,0x1FE,0x200,0x202,0x204,0x206,0x208,0x20A,0x20C,0x20E,0x210,0x212,0x214,0x216, + 0x391,0x392,0x393,0x394,0x395,0x396,0x397,0x398,0x399,0x39A,0x39B,0x39C,0x39D,0x39E,0x39F,0x3A0,0x3A1,0x3A3,0x3A4,0x3A5,0x3A6,0x3A7,0x3A8,0x3A9,0x3AA,0x3AB,0x38C,0x38E,0x38F,0x3E2,0x3E4,0x3E6,0x3E8,0x3EA, + 0x410,0x411,0x412,0x413,0x414,0x415,0x416,0x417,0x418,0x419,0x41A,0x41B,0x41C,0x41D,0x41E,0x41F,0x420,0x421,0x422,0x423,0x424,0x425,0x426,0x427,0x428,0x429,0x42A,0x42B,0x42C,0x42D,0x42E,0x42F,0x402,0x403,0x404,0x405,0x406,0x407,0x408,0x409,0x40A,0x40B,0x40C,0x40E,0x40F,0x460,0x462,0x464,0x466,0x468,0x46A,0x46C,0x46E,0x470,0x472,0x474,0x476,0x478,0x47A,0x47C,0x47E,0x480,0x490,0x492,0x494,0x496,0x498,0x49A,0x49C,0x49E,0x4A0,0x4A2,0x4A4,0x4A6,0x4A8,0x4AA,0x4AC,0x4AE,0x4B0,0x4B2,0x4B4,0x4B6,0x4B8,0x4BA,0x4BC,0x4BE,0x4C1,0x4C3,0x5C7,0x4D0,0x4D2,0x4D4,0x4D6,0x4D8,0x4DA,0x4DC,0x4DE,0x4E0,0x4E2,0x4E4,0x4E6,0x4E8,0x4EA,0x4EC,0x4EE,0x4F0,0x4F2,0x4F4,0x4F8, + 0x531,0x532,0x533,0x534,0x535,0x536,0x537,0x538,0x539,0x53A,0x53B,0x53C,0x53D,0x53E,0x53F,0x540,0x541,0x542,0x543,0x544,0x545,0x546,0x547,0x548,0x549,0x54A,0x54B,0x54C,0x54D,0x54E,0x54F,0x550,0x551,0x552,0x553,0x554,0x555,0x556, + 0x1E00,0x1E02,0x1E04,0x1E06,0x1E08,0x1E0A,0x1E0C,0x1E0E,0x1E10,0x1E12,0x1E14,0x1E16,0x1E18,0x1E1A,0x1E1C,0x1E1E,0x1E20,0x1E22,0x1E24,0x1E26,0x1E28,0x1E2A,0x1E2C,0x1E2E,0x1E30,0x1E32,0x1E34,0x1E36,0x1E38,0x1E3A,0x1E3C,0x1E3E,0x1E40,0x1E42,0x1E44,0x1E46,0x1E48,0x1E4A,0x1E4C,0x1E4E,0x1E50,0x1E52,0x1E54,0x1E56,0x1E58,0x1E5A,0x1E5C,0x1E5E,0x1E60,0x1E62,0x1E64,0x1E66,0x1E68,0x1E6A,0x1E6C,0x1E6E,0x1E70,0x1E72,0x1E74,0x1E76,0x1E78,0x1E7A,0x1E7C,0x1E7E,0x1E80,0x1E82,0x1E84,0x1E86,0x1E88,0x1E8A,0x1E8C,0x1E8E,0x1E90,0x1E92,0x1E94,0x1E96,0x1E98,0x1E9A,0x1E9C,0x1E9E,0x1EA0,0x1EA2,0x1EA4,0x1EA6,0x1EA8,0x1EAA,0x1EAC,0x1EAE,0x1EB0,0x1EB2,0x1EB4,0x1EB6,0x1EB8,0x1EBA,0x1EBC,0x1EBE,0x1EC0,0x1EC2,0x1EC4,0x1EC6,0x1EC8,0x1ECA,0x1ECC,0x1ECE,0x1ED0,0x1ED2,0x1ED4,0x1ED6,0x1ED8,0x1EDA,0x1EDC,0x1EDE,0x1EE0,0x1EE2,0x1EE4,0x1EE6,0x1EE8,0x1EEA,0x1EEC,0x1EEE,0x1EF0,0x1EF2,0x1EF4,0x1EF6,0x1EF8, + 0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,0x2167,0x2168,0x2169,0x216A,0x216B,0x216C,0x216D,0x216E,0x216F, + 0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28,0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30,0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38,0xFF39,0xFF3A + }; + UINT i, n, hi, li; - for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + if (chr < 0x80) { /* ASCII characters (acceleration) */ + if (chr >= 0x61 && chr <= 0x7A) chr -= 0x20; - return tbl_lower[i] ? tbl_upper[i] : chr; + } else { /* Extended characters */ + n = 12; li = 0; hi = sizeof lower / sizeof lower[0]; + do { + i = li + (hi - li) / 2; + if (chr == lower[i]) break; + if (chr > lower[i]) li = i; else hi = i; + } while (--n); + if (n) chr = upper[i]; + } + + return chr; } + diff --git a/firmware/chibios-portapack/ext/fatfs/src/option/cc936.c b/firmware/chibios-portapack/ext/fatfs/src/option/cc936.c index 84bc3297..4c20783e 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/option/cc936.c +++ b/firmware/chibios-portapack/ext/fatfs/src/option/cc936.c @@ -1,6 +1,5 @@ /*------------------------------------------------------------------------*/ -/* Unicode - OEM code bidirectional converter (C)ChaN, 2009 */ -/* */ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2015 */ /* CP936 (Simplified Chinese GBK) */ /*------------------------------------------------------------------------*/ @@ -10923,7 +10922,7 @@ const WCHAR oem2uni[] = { WCHAR ff_convert ( /* Converted code, 0 means conversion error */ WCHAR chr, /* Character code to be converted */ - UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ + UINT dir /* 0: Unicode to OEM code, 1: OEM code to Unicode */ ) { const WCHAR *p; @@ -10934,10 +10933,10 @@ WCHAR ff_convert ( /* Converted code, 0 means conversion error */ if (chr < 0x80) { /* ASCII */ c = chr; } else { - if (dir) { /* OEMCP to unicode */ + if (dir) { /* OEM code to unicode */ p = oem2uni; hi = sizeof oem2uni / 4 - 1; - } else { /* Unicode to OEMCP */ + } else { /* Unicode to OEM code */ p = uni2oem; hi = sizeof uni2oem / 4 - 1; } @@ -10958,16 +10957,48 @@ WCHAR ff_convert ( /* Converted code, 0 means conversion error */ -WCHAR ff_wtoupper ( /* Upper converted character */ - WCHAR chr /* Input character */ +WCHAR ff_wtoupper ( + WCHAR chr /* Unicode character to be upper converted */ ) { - static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; - static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; - int i; + static const WCHAR lower[] = { /* Lower case characters to be converted */ + /* Latin Supplement */ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, + /* Latin Extended-A */ 0x101,0x103,0x105,0x107,0x109,0x10B,0x10D,0x10F,0x111,0x113,0x115,0x117,0x119,0x11B,0x11D,0x11F,0x121,0x123,0x125,0x127,0x129,0x12B,0x12D,0x12F,0x131,0x133,0x135,0x137,0x13A,0x13C,0x13E,0x140,0x142,0x144,0x146,0x148,0x14B,0x14D,0x14F,0x151,0x153,0x155,0x157,0x159,0x15B,0x15D,0x15F,0x161,0x163,0x165,0x167,0x169,0x16B,0x16D,0x16F,0x171,0x173,0x175,0x177,0x17A,0x17C,0x17E, + /* Latin Extended-B */ 0x183,0x185,0x188,0x18C,0x192,0x199,0x1A1,0x1A3,0x1A8,0x1AD,0x1B0,0x1B4,0x1B6,0x1B9,0x1BD,0x1C6,0x1C9,0x1CC,0x1CE,0x1D0,0x1D2,0x1D4,0x1D6,0x1D8,0x1DA,0x1DC,0x1DD,0x1DF,0x1E1,0x1E3,0x1E5,0x1E7,0x1E9,0x1EB,0x1ED,0x1EF,0x1F3,0x1F5,0x1FB,0x1FD,0x1FF,0x201,0x203,0x205,0x207,0x209,0x20B,0x20D,0x20F,0x211,0x213,0x215,0x217, + /* Greek, Coptic */ 0x3B1,0x3B2,0x3B3,0x3B4,0x3B5,0x3B6,0x3B7,0x3B8,0x3B9,0x3BA,0x3BB,0x3BC,0x3BD,0x3BE,0x3BF,0x3C0,0x3C1,0x3C3,0x3C4,0x3C5,0x3C6,0x3C7,0x3C8,0x3C9,0x3CA,0x3CB,0x3CC,0x3CD,0x3CE,0x3E3,0x3E5,0x3E7,0x3E9,0x3EB, + /* Cyrillic */ 0x430,0x431,0x432,0x433,0x434,0x435,0x436,0x437,0x438,0x439,0x43A,0x43B,0x43C,0x43D,0x43E,0x43F,0x440,0x441,0x442,0x443,0x444,0x445,0x446,0x447,0x448,0x449,0x44A,0x44B,0x44C,0x44D,0x44E,0x44F,0x452,0x453,0x454,0x455,0x456,0x457,0x458,0x459,0x45A,0x45B,0x45C,0x45E,0x45F,0x461,0x463,0x465,0x467,0x469,0x46B,0x46D,0x46F,0x471,0x473,0x475,0x477,0x479,0x47B,0x47D,0x47F,0x481,0x491,0x493,0x495,0x497,0x499,0x49B,0x49D,0x49F,0x4A1,0x4A3,0x4A5,0x4A7,0x4A9,0x4AB,0x4AD,0x4AF,0x4B1,0x4B3,0x4B5,0x4B7,0x4B9,0x4BB,0x4BD,0x4BF,0x4C2,0x4C4,0x4C8,0x4D1,0x4D3,0x4D5,0x4D7,0x4D9,0x4DB,0x4DD,0x4DF,0x4E1,0x4E3,0x4E5,0x4E7,0x4E9,0x4EB,0x4ED,0x4EF,0x4F1,0x4F3,0x4F5,0x4F9, + /* Armenian */ 0x561,0x562,0x563,0x564,0x565,0x566,0x567,0x568,0x569,0x56A,0x56B,0x56C,0x56D,0x56E,0x56F,0x570,0x571,0x572,0x573,0x574,0x575,0x576,0x577,0x578,0x579,0x57A,0x57B,0x57C,0x57D,0x57E,0x57F,0x580,0x581,0x582,0x583,0x584,0x585,0x586, + /* Latin Extended Additional */ 0x1E01,0x1E03,0x1E05,0x1E07,0x1E09,0x1E0B,0x1E0D,0x1E0F,0x1E11,0x1E13,0x1E15,0x1E17,0x1E19,0x1E1B,0x1E1D,0x1E1F,0x1E21,0x1E23,0x1E25,0x1E27,0x1E29,0x1E2B,0x1E2D,0x1E2F,0x1E31,0x1E33,0x1E35,0x1E37,0x1E39,0x1E3B,0x1E3D,0x1E3F,0x1E41,0x1E43,0x1E45,0x1E47,0x1E49,0x1E4B,0x1E4D,0x1E4F,0x1E51,0x1E53,0x1E55,0x1E57,0x1E59,0x1E5B,0x1E5D,0x1E5F,0x1E61,0x1E63,0x1E65,0x1E67,0x1E69,0x1E6B,0x1E6D,0x1E6F,0x1E71,0x1E73,0x1E75,0x1E77,0x1E79,0x1E7B,0x1E7D,0x1E7F,0x1E81,0x1E83,0x1E85,0x1E87,0x1E89,0x1E8B,0x1E8D,0x1E8F,0x1E91,0x1E93,0x1E95,0x1E97,0x1E99,0x1E9B,0x1E9D,0x1E9F,0x1EA1,0x1EA3,0x1EA5,0x1EA7,0x1EA9,0x1EAB,0x1EAD,0x1EAF,0x1EB1,0x1EB3,0x1EB5,0x1EB7,0x1EB9,0x1EBB,0x1EBD,0x1EBF,0x1EC1,0x1EC3,0x1EC5,0x1EC7,0x1EC9,0x1ECB,0x1ECD,0x1ECF,0x1ED1,0x1ED3,0x1ED5,0x1ED7,0x1ED9,0x1EDB,0x1EDD,0x1EDF,0x1EE1,0x1EE3,0x1EE5,0x1EE7,0x1EE9,0x1EEB,0x1EED,0x1EEF,0x1EF1,0x1EF3,0x1EF5,0x1EF7,0x1EF9, + /* Number forms */ 0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,0x2176,0x2177,0x2178,0x2179,0x217A,0x217B,0x217C,0x217D,0x217E,0x217F, + /* Full-width */ 0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47,0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57,0xFF58,0xFF59,0xFF5A + }; + static const WCHAR upper[] = { /* Upper case characters correspond to lower[] */ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x178, + 0x100,0x102,0x104,0x106,0x108,0x10A,0x10C,0x10E,0x110,0x112,0x114,0x116,0x118,0x11A,0x11C,0x11E,0x120,0x122,0x124,0x126,0x128,0x12A,0x12C,0x12E,0x130,0x132,0x134,0x136,0x139,0x13B,0x13D,0x13F,0x141,0x143,0x145,0x147,0x14A,0x14C,0x14E,0x150,0x152,0x154,0x156,0x158,0x15A,0x15C,0x15E,0x160,0x162,0x164,0x166,0x168,0x16A,0x16C,0x16E,0x170,0x172,0x174,0x176,0x179,0x17B,0x17D, + 0x182,0x184,0x187,0x18B,0x191,0x198,0x1A0,0x1A2,0x1A7,0x1AC,0x1AF,0x1B3,0x1B5,0x1B8,0x1BC,0x1C4,0x1C7,0x1CA,0x1CD,0x1CF,0x1D1,0x1D3,0x1D5,0x1D7,0x1D9,0x1DB,0x18E,0x1DE,0x1E0,0x1E2,0x1E4,0x1E6,0x1E8,0x1EA,0x1EC,0x1EE,0x1F1,0x1F4,0x1FA,0x1FC,0x1FE,0x200,0x202,0x204,0x206,0x208,0x20A,0x20C,0x20E,0x210,0x212,0x214,0x216, + 0x391,0x392,0x393,0x394,0x395,0x396,0x397,0x398,0x399,0x39A,0x39B,0x39C,0x39D,0x39E,0x39F,0x3A0,0x3A1,0x3A3,0x3A4,0x3A5,0x3A6,0x3A7,0x3A8,0x3A9,0x3AA,0x3AB,0x38C,0x38E,0x38F,0x3E2,0x3E4,0x3E6,0x3E8,0x3EA, + 0x410,0x411,0x412,0x413,0x414,0x415,0x416,0x417,0x418,0x419,0x41A,0x41B,0x41C,0x41D,0x41E,0x41F,0x420,0x421,0x422,0x423,0x424,0x425,0x426,0x427,0x428,0x429,0x42A,0x42B,0x42C,0x42D,0x42E,0x42F,0x402,0x403,0x404,0x405,0x406,0x407,0x408,0x409,0x40A,0x40B,0x40C,0x40E,0x40F,0x460,0x462,0x464,0x466,0x468,0x46A,0x46C,0x46E,0x470,0x472,0x474,0x476,0x478,0x47A,0x47C,0x47E,0x480,0x490,0x492,0x494,0x496,0x498,0x49A,0x49C,0x49E,0x4A0,0x4A2,0x4A4,0x4A6,0x4A8,0x4AA,0x4AC,0x4AE,0x4B0,0x4B2,0x4B4,0x4B6,0x4B8,0x4BA,0x4BC,0x4BE,0x4C1,0x4C3,0x5C7,0x4D0,0x4D2,0x4D4,0x4D6,0x4D8,0x4DA,0x4DC,0x4DE,0x4E0,0x4E2,0x4E4,0x4E6,0x4E8,0x4EA,0x4EC,0x4EE,0x4F0,0x4F2,0x4F4,0x4F8, + 0x531,0x532,0x533,0x534,0x535,0x536,0x537,0x538,0x539,0x53A,0x53B,0x53C,0x53D,0x53E,0x53F,0x540,0x541,0x542,0x543,0x544,0x545,0x546,0x547,0x548,0x549,0x54A,0x54B,0x54C,0x54D,0x54E,0x54F,0x550,0x551,0x552,0x553,0x554,0x555,0x556, + 0x1E00,0x1E02,0x1E04,0x1E06,0x1E08,0x1E0A,0x1E0C,0x1E0E,0x1E10,0x1E12,0x1E14,0x1E16,0x1E18,0x1E1A,0x1E1C,0x1E1E,0x1E20,0x1E22,0x1E24,0x1E26,0x1E28,0x1E2A,0x1E2C,0x1E2E,0x1E30,0x1E32,0x1E34,0x1E36,0x1E38,0x1E3A,0x1E3C,0x1E3E,0x1E40,0x1E42,0x1E44,0x1E46,0x1E48,0x1E4A,0x1E4C,0x1E4E,0x1E50,0x1E52,0x1E54,0x1E56,0x1E58,0x1E5A,0x1E5C,0x1E5E,0x1E60,0x1E62,0x1E64,0x1E66,0x1E68,0x1E6A,0x1E6C,0x1E6E,0x1E70,0x1E72,0x1E74,0x1E76,0x1E78,0x1E7A,0x1E7C,0x1E7E,0x1E80,0x1E82,0x1E84,0x1E86,0x1E88,0x1E8A,0x1E8C,0x1E8E,0x1E90,0x1E92,0x1E94,0x1E96,0x1E98,0x1E9A,0x1E9C,0x1E9E,0x1EA0,0x1EA2,0x1EA4,0x1EA6,0x1EA8,0x1EAA,0x1EAC,0x1EAE,0x1EB0,0x1EB2,0x1EB4,0x1EB6,0x1EB8,0x1EBA,0x1EBC,0x1EBE,0x1EC0,0x1EC2,0x1EC4,0x1EC6,0x1EC8,0x1ECA,0x1ECC,0x1ECE,0x1ED0,0x1ED2,0x1ED4,0x1ED6,0x1ED8,0x1EDA,0x1EDC,0x1EDE,0x1EE0,0x1EE2,0x1EE4,0x1EE6,0x1EE8,0x1EEA,0x1EEC,0x1EEE,0x1EF0,0x1EF2,0x1EF4,0x1EF6,0x1EF8, + 0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,0x2167,0x2168,0x2169,0x216A,0x216B,0x216C,0x216D,0x216E,0x216F, + 0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28,0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30,0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38,0xFF39,0xFF3A + }; + UINT i, n, hi, li; - for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + if (chr < 0x80) { /* ASCII characters (acceleration) */ + if (chr >= 0x61 && chr <= 0x7A) chr -= 0x20; - return tbl_lower[i] ? tbl_upper[i] : chr; + } else { /* Extended characters */ + n = 12; li = 0; hi = sizeof lower / sizeof lower[0]; + do { + i = li + (hi - li) / 2; + if (chr == lower[i]) break; + if (chr > lower[i]) li = i; else hi = i; + } while (--n); + if (n) chr = upper[i]; + } + + return chr; } + diff --git a/firmware/chibios-portapack/ext/fatfs/src/option/cc949.c b/firmware/chibios-portapack/ext/fatfs/src/option/cc949.c index 0abda85e..f646e004 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/option/cc949.c +++ b/firmware/chibios-portapack/ext/fatfs/src/option/cc949.c @@ -1,6 +1,5 @@ /*------------------------------------------------------------------------*/ -/* Unicode - OEM code bidirectional converter (C)ChaN, 2009 */ -/* */ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2015 */ /* CP949 (Korean EUC-KR) */ /*------------------------------------------------------------------------*/ @@ -8552,7 +8551,7 @@ const WCHAR oem2uni[] = { WCHAR ff_convert ( /* Converted code, 0 means conversion error */ WCHAR chr, /* Character code to be converted */ - UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ + UINT dir /* 0: Unicode to OEM code, 1: OEM code to Unicode */ ) { const WCHAR *p; @@ -8563,10 +8562,10 @@ WCHAR ff_convert ( /* Converted code, 0 means conversion error */ if (chr < 0x80) { /* ASCII */ c = chr; } else { - if (dir) { /* OEMCP to unicode */ + if (dir) { /* OEM code to unicode */ p = oem2uni; hi = sizeof oem2uni / 4 - 1; - } else { /* Unicode to OEMCP */ + } else { /* Unicode to OEM code */ p = uni2oem; hi = sizeof uni2oem / 4 - 1; } @@ -8588,16 +8587,48 @@ WCHAR ff_convert ( /* Converted code, 0 means conversion error */ -WCHAR ff_wtoupper ( /* Upper converted character */ - WCHAR chr /* Input character */ +WCHAR ff_wtoupper ( + WCHAR chr /* Unicode character to be upper converted */ ) { - static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; - static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; - int i; + static const WCHAR lower[] = { /* Lower case characters to be converted */ + /* Latin Supplement */ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, + /* Latin Extended-A */ 0x101,0x103,0x105,0x107,0x109,0x10B,0x10D,0x10F,0x111,0x113,0x115,0x117,0x119,0x11B,0x11D,0x11F,0x121,0x123,0x125,0x127,0x129,0x12B,0x12D,0x12F,0x131,0x133,0x135,0x137,0x13A,0x13C,0x13E,0x140,0x142,0x144,0x146,0x148,0x14B,0x14D,0x14F,0x151,0x153,0x155,0x157,0x159,0x15B,0x15D,0x15F,0x161,0x163,0x165,0x167,0x169,0x16B,0x16D,0x16F,0x171,0x173,0x175,0x177,0x17A,0x17C,0x17E, + /* Latin Extended-B */ 0x183,0x185,0x188,0x18C,0x192,0x199,0x1A1,0x1A3,0x1A8,0x1AD,0x1B0,0x1B4,0x1B6,0x1B9,0x1BD,0x1C6,0x1C9,0x1CC,0x1CE,0x1D0,0x1D2,0x1D4,0x1D6,0x1D8,0x1DA,0x1DC,0x1DD,0x1DF,0x1E1,0x1E3,0x1E5,0x1E7,0x1E9,0x1EB,0x1ED,0x1EF,0x1F3,0x1F5,0x1FB,0x1FD,0x1FF,0x201,0x203,0x205,0x207,0x209,0x20B,0x20D,0x20F,0x211,0x213,0x215,0x217, + /* Greek, Coptic */ 0x3B1,0x3B2,0x3B3,0x3B4,0x3B5,0x3B6,0x3B7,0x3B8,0x3B9,0x3BA,0x3BB,0x3BC,0x3BD,0x3BE,0x3BF,0x3C0,0x3C1,0x3C3,0x3C4,0x3C5,0x3C6,0x3C7,0x3C8,0x3C9,0x3CA,0x3CB,0x3CC,0x3CD,0x3CE,0x3E3,0x3E5,0x3E7,0x3E9,0x3EB, + /* Cyrillic */ 0x430,0x431,0x432,0x433,0x434,0x435,0x436,0x437,0x438,0x439,0x43A,0x43B,0x43C,0x43D,0x43E,0x43F,0x440,0x441,0x442,0x443,0x444,0x445,0x446,0x447,0x448,0x449,0x44A,0x44B,0x44C,0x44D,0x44E,0x44F,0x452,0x453,0x454,0x455,0x456,0x457,0x458,0x459,0x45A,0x45B,0x45C,0x45E,0x45F,0x461,0x463,0x465,0x467,0x469,0x46B,0x46D,0x46F,0x471,0x473,0x475,0x477,0x479,0x47B,0x47D,0x47F,0x481,0x491,0x493,0x495,0x497,0x499,0x49B,0x49D,0x49F,0x4A1,0x4A3,0x4A5,0x4A7,0x4A9,0x4AB,0x4AD,0x4AF,0x4B1,0x4B3,0x4B5,0x4B7,0x4B9,0x4BB,0x4BD,0x4BF,0x4C2,0x4C4,0x4C8,0x4D1,0x4D3,0x4D5,0x4D7,0x4D9,0x4DB,0x4DD,0x4DF,0x4E1,0x4E3,0x4E5,0x4E7,0x4E9,0x4EB,0x4ED,0x4EF,0x4F1,0x4F3,0x4F5,0x4F9, + /* Armenian */ 0x561,0x562,0x563,0x564,0x565,0x566,0x567,0x568,0x569,0x56A,0x56B,0x56C,0x56D,0x56E,0x56F,0x570,0x571,0x572,0x573,0x574,0x575,0x576,0x577,0x578,0x579,0x57A,0x57B,0x57C,0x57D,0x57E,0x57F,0x580,0x581,0x582,0x583,0x584,0x585,0x586, + /* Latin Extended Additional */ 0x1E01,0x1E03,0x1E05,0x1E07,0x1E09,0x1E0B,0x1E0D,0x1E0F,0x1E11,0x1E13,0x1E15,0x1E17,0x1E19,0x1E1B,0x1E1D,0x1E1F,0x1E21,0x1E23,0x1E25,0x1E27,0x1E29,0x1E2B,0x1E2D,0x1E2F,0x1E31,0x1E33,0x1E35,0x1E37,0x1E39,0x1E3B,0x1E3D,0x1E3F,0x1E41,0x1E43,0x1E45,0x1E47,0x1E49,0x1E4B,0x1E4D,0x1E4F,0x1E51,0x1E53,0x1E55,0x1E57,0x1E59,0x1E5B,0x1E5D,0x1E5F,0x1E61,0x1E63,0x1E65,0x1E67,0x1E69,0x1E6B,0x1E6D,0x1E6F,0x1E71,0x1E73,0x1E75,0x1E77,0x1E79,0x1E7B,0x1E7D,0x1E7F,0x1E81,0x1E83,0x1E85,0x1E87,0x1E89,0x1E8B,0x1E8D,0x1E8F,0x1E91,0x1E93,0x1E95,0x1E97,0x1E99,0x1E9B,0x1E9D,0x1E9F,0x1EA1,0x1EA3,0x1EA5,0x1EA7,0x1EA9,0x1EAB,0x1EAD,0x1EAF,0x1EB1,0x1EB3,0x1EB5,0x1EB7,0x1EB9,0x1EBB,0x1EBD,0x1EBF,0x1EC1,0x1EC3,0x1EC5,0x1EC7,0x1EC9,0x1ECB,0x1ECD,0x1ECF,0x1ED1,0x1ED3,0x1ED5,0x1ED7,0x1ED9,0x1EDB,0x1EDD,0x1EDF,0x1EE1,0x1EE3,0x1EE5,0x1EE7,0x1EE9,0x1EEB,0x1EED,0x1EEF,0x1EF1,0x1EF3,0x1EF5,0x1EF7,0x1EF9, + /* Number forms */ 0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,0x2176,0x2177,0x2178,0x2179,0x217A,0x217B,0x217C,0x217D,0x217E,0x217F, + /* Full-width */ 0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47,0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57,0xFF58,0xFF59,0xFF5A + }; + static const WCHAR upper[] = { /* Upper case characters correspond to lower[] */ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x178, + 0x100,0x102,0x104,0x106,0x108,0x10A,0x10C,0x10E,0x110,0x112,0x114,0x116,0x118,0x11A,0x11C,0x11E,0x120,0x122,0x124,0x126,0x128,0x12A,0x12C,0x12E,0x130,0x132,0x134,0x136,0x139,0x13B,0x13D,0x13F,0x141,0x143,0x145,0x147,0x14A,0x14C,0x14E,0x150,0x152,0x154,0x156,0x158,0x15A,0x15C,0x15E,0x160,0x162,0x164,0x166,0x168,0x16A,0x16C,0x16E,0x170,0x172,0x174,0x176,0x179,0x17B,0x17D, + 0x182,0x184,0x187,0x18B,0x191,0x198,0x1A0,0x1A2,0x1A7,0x1AC,0x1AF,0x1B3,0x1B5,0x1B8,0x1BC,0x1C4,0x1C7,0x1CA,0x1CD,0x1CF,0x1D1,0x1D3,0x1D5,0x1D7,0x1D9,0x1DB,0x18E,0x1DE,0x1E0,0x1E2,0x1E4,0x1E6,0x1E8,0x1EA,0x1EC,0x1EE,0x1F1,0x1F4,0x1FA,0x1FC,0x1FE,0x200,0x202,0x204,0x206,0x208,0x20A,0x20C,0x20E,0x210,0x212,0x214,0x216, + 0x391,0x392,0x393,0x394,0x395,0x396,0x397,0x398,0x399,0x39A,0x39B,0x39C,0x39D,0x39E,0x39F,0x3A0,0x3A1,0x3A3,0x3A4,0x3A5,0x3A6,0x3A7,0x3A8,0x3A9,0x3AA,0x3AB,0x38C,0x38E,0x38F,0x3E2,0x3E4,0x3E6,0x3E8,0x3EA, + 0x410,0x411,0x412,0x413,0x414,0x415,0x416,0x417,0x418,0x419,0x41A,0x41B,0x41C,0x41D,0x41E,0x41F,0x420,0x421,0x422,0x423,0x424,0x425,0x426,0x427,0x428,0x429,0x42A,0x42B,0x42C,0x42D,0x42E,0x42F,0x402,0x403,0x404,0x405,0x406,0x407,0x408,0x409,0x40A,0x40B,0x40C,0x40E,0x40F,0x460,0x462,0x464,0x466,0x468,0x46A,0x46C,0x46E,0x470,0x472,0x474,0x476,0x478,0x47A,0x47C,0x47E,0x480,0x490,0x492,0x494,0x496,0x498,0x49A,0x49C,0x49E,0x4A0,0x4A2,0x4A4,0x4A6,0x4A8,0x4AA,0x4AC,0x4AE,0x4B0,0x4B2,0x4B4,0x4B6,0x4B8,0x4BA,0x4BC,0x4BE,0x4C1,0x4C3,0x5C7,0x4D0,0x4D2,0x4D4,0x4D6,0x4D8,0x4DA,0x4DC,0x4DE,0x4E0,0x4E2,0x4E4,0x4E6,0x4E8,0x4EA,0x4EC,0x4EE,0x4F0,0x4F2,0x4F4,0x4F8, + 0x531,0x532,0x533,0x534,0x535,0x536,0x537,0x538,0x539,0x53A,0x53B,0x53C,0x53D,0x53E,0x53F,0x540,0x541,0x542,0x543,0x544,0x545,0x546,0x547,0x548,0x549,0x54A,0x54B,0x54C,0x54D,0x54E,0x54F,0x550,0x551,0x552,0x553,0x554,0x555,0x556, + 0x1E00,0x1E02,0x1E04,0x1E06,0x1E08,0x1E0A,0x1E0C,0x1E0E,0x1E10,0x1E12,0x1E14,0x1E16,0x1E18,0x1E1A,0x1E1C,0x1E1E,0x1E20,0x1E22,0x1E24,0x1E26,0x1E28,0x1E2A,0x1E2C,0x1E2E,0x1E30,0x1E32,0x1E34,0x1E36,0x1E38,0x1E3A,0x1E3C,0x1E3E,0x1E40,0x1E42,0x1E44,0x1E46,0x1E48,0x1E4A,0x1E4C,0x1E4E,0x1E50,0x1E52,0x1E54,0x1E56,0x1E58,0x1E5A,0x1E5C,0x1E5E,0x1E60,0x1E62,0x1E64,0x1E66,0x1E68,0x1E6A,0x1E6C,0x1E6E,0x1E70,0x1E72,0x1E74,0x1E76,0x1E78,0x1E7A,0x1E7C,0x1E7E,0x1E80,0x1E82,0x1E84,0x1E86,0x1E88,0x1E8A,0x1E8C,0x1E8E,0x1E90,0x1E92,0x1E94,0x1E96,0x1E98,0x1E9A,0x1E9C,0x1E9E,0x1EA0,0x1EA2,0x1EA4,0x1EA6,0x1EA8,0x1EAA,0x1EAC,0x1EAE,0x1EB0,0x1EB2,0x1EB4,0x1EB6,0x1EB8,0x1EBA,0x1EBC,0x1EBE,0x1EC0,0x1EC2,0x1EC4,0x1EC6,0x1EC8,0x1ECA,0x1ECC,0x1ECE,0x1ED0,0x1ED2,0x1ED4,0x1ED6,0x1ED8,0x1EDA,0x1EDC,0x1EDE,0x1EE0,0x1EE2,0x1EE4,0x1EE6,0x1EE8,0x1EEA,0x1EEC,0x1EEE,0x1EF0,0x1EF2,0x1EF4,0x1EF6,0x1EF8, + 0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,0x2167,0x2168,0x2169,0x216A,0x216B,0x216C,0x216D,0x216E,0x216F, + 0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28,0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30,0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38,0xFF39,0xFF3A + }; + UINT i, n, hi, li; - for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + if (chr < 0x80) { /* ASCII characters (acceleration) */ + if (chr >= 0x61 && chr <= 0x7A) chr -= 0x20; - return tbl_lower[i] ? tbl_upper[i] : chr; + } else { /* Extended characters */ + n = 12; li = 0; hi = sizeof lower / sizeof lower[0]; + do { + i = li + (hi - li) / 2; + if (chr == lower[i]) break; + if (chr > lower[i]) li = i; else hi = i; + } while (--n); + if (n) chr = upper[i]; + } + + return chr; } + diff --git a/firmware/chibios-portapack/ext/fatfs/src/option/cc950.c b/firmware/chibios-portapack/ext/fatfs/src/option/cc950.c index d914b6d8..064f5ca5 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/option/cc950.c +++ b/firmware/chibios-portapack/ext/fatfs/src/option/cc950.c @@ -1,6 +1,5 @@ /*------------------------------------------------------------------------*/ -/* Unicode - OEM code bidirectional converter (C)ChaN, 2009 */ -/* */ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2015 */ /* CP950 (Traditional Chinese Big5) */ /*------------------------------------------------------------------------*/ @@ -6778,7 +6777,7 @@ const WCHAR oem2uni[] = { WCHAR ff_convert ( /* Converted code, 0 means conversion error */ WCHAR chr, /* Character code to be converted */ - UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ + UINT dir /* 0: Unicode to OEM code, 1: OEM code to Unicode */ ) { const WCHAR *p; @@ -6789,10 +6788,10 @@ WCHAR ff_convert ( /* Converted code, 0 means conversion error */ if (chr < 0x80) { /* ASCII */ c = chr; } else { - if (dir) { /* OEMCP to unicode */ + if (dir) { /* OEM code to unicode */ p = oem2uni; hi = sizeof oem2uni / 4 - 1; - } else { /* Unicode to OEMCP */ + } else { /* Unicode to OEM code */ p = uni2oem; hi = sizeof uni2oem / 4 - 1; } @@ -6814,16 +6813,48 @@ WCHAR ff_convert ( /* Converted code, 0 means conversion error */ -WCHAR ff_wtoupper ( /* Upper converted character */ - WCHAR chr /* Input character */ +WCHAR ff_wtoupper ( + WCHAR chr /* Unicode character to be upper converted */ ) { - static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; - static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; - int i; + static const WCHAR lower[] = { /* Lower case characters to be converted */ + /* Latin Supplement */ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, + /* Latin Extended-A */ 0x101,0x103,0x105,0x107,0x109,0x10B,0x10D,0x10F,0x111,0x113,0x115,0x117,0x119,0x11B,0x11D,0x11F,0x121,0x123,0x125,0x127,0x129,0x12B,0x12D,0x12F,0x131,0x133,0x135,0x137,0x13A,0x13C,0x13E,0x140,0x142,0x144,0x146,0x148,0x14B,0x14D,0x14F,0x151,0x153,0x155,0x157,0x159,0x15B,0x15D,0x15F,0x161,0x163,0x165,0x167,0x169,0x16B,0x16D,0x16F,0x171,0x173,0x175,0x177,0x17A,0x17C,0x17E, + /* Latin Extended-B */ 0x183,0x185,0x188,0x18C,0x192,0x199,0x1A1,0x1A3,0x1A8,0x1AD,0x1B0,0x1B4,0x1B6,0x1B9,0x1BD,0x1C6,0x1C9,0x1CC,0x1CE,0x1D0,0x1D2,0x1D4,0x1D6,0x1D8,0x1DA,0x1DC,0x1DD,0x1DF,0x1E1,0x1E3,0x1E5,0x1E7,0x1E9,0x1EB,0x1ED,0x1EF,0x1F3,0x1F5,0x1FB,0x1FD,0x1FF,0x201,0x203,0x205,0x207,0x209,0x20B,0x20D,0x20F,0x211,0x213,0x215,0x217, + /* Greek, Coptic */ 0x3B1,0x3B2,0x3B3,0x3B4,0x3B5,0x3B6,0x3B7,0x3B8,0x3B9,0x3BA,0x3BB,0x3BC,0x3BD,0x3BE,0x3BF,0x3C0,0x3C1,0x3C3,0x3C4,0x3C5,0x3C6,0x3C7,0x3C8,0x3C9,0x3CA,0x3CB,0x3CC,0x3CD,0x3CE,0x3E3,0x3E5,0x3E7,0x3E9,0x3EB, + /* Cyrillic */ 0x430,0x431,0x432,0x433,0x434,0x435,0x436,0x437,0x438,0x439,0x43A,0x43B,0x43C,0x43D,0x43E,0x43F,0x440,0x441,0x442,0x443,0x444,0x445,0x446,0x447,0x448,0x449,0x44A,0x44B,0x44C,0x44D,0x44E,0x44F,0x452,0x453,0x454,0x455,0x456,0x457,0x458,0x459,0x45A,0x45B,0x45C,0x45E,0x45F,0x461,0x463,0x465,0x467,0x469,0x46B,0x46D,0x46F,0x471,0x473,0x475,0x477,0x479,0x47B,0x47D,0x47F,0x481,0x491,0x493,0x495,0x497,0x499,0x49B,0x49D,0x49F,0x4A1,0x4A3,0x4A5,0x4A7,0x4A9,0x4AB,0x4AD,0x4AF,0x4B1,0x4B3,0x4B5,0x4B7,0x4B9,0x4BB,0x4BD,0x4BF,0x4C2,0x4C4,0x4C8,0x4D1,0x4D3,0x4D5,0x4D7,0x4D9,0x4DB,0x4DD,0x4DF,0x4E1,0x4E3,0x4E5,0x4E7,0x4E9,0x4EB,0x4ED,0x4EF,0x4F1,0x4F3,0x4F5,0x4F9, + /* Armenian */ 0x561,0x562,0x563,0x564,0x565,0x566,0x567,0x568,0x569,0x56A,0x56B,0x56C,0x56D,0x56E,0x56F,0x570,0x571,0x572,0x573,0x574,0x575,0x576,0x577,0x578,0x579,0x57A,0x57B,0x57C,0x57D,0x57E,0x57F,0x580,0x581,0x582,0x583,0x584,0x585,0x586, + /* Latin Extended Additional */ 0x1E01,0x1E03,0x1E05,0x1E07,0x1E09,0x1E0B,0x1E0D,0x1E0F,0x1E11,0x1E13,0x1E15,0x1E17,0x1E19,0x1E1B,0x1E1D,0x1E1F,0x1E21,0x1E23,0x1E25,0x1E27,0x1E29,0x1E2B,0x1E2D,0x1E2F,0x1E31,0x1E33,0x1E35,0x1E37,0x1E39,0x1E3B,0x1E3D,0x1E3F,0x1E41,0x1E43,0x1E45,0x1E47,0x1E49,0x1E4B,0x1E4D,0x1E4F,0x1E51,0x1E53,0x1E55,0x1E57,0x1E59,0x1E5B,0x1E5D,0x1E5F,0x1E61,0x1E63,0x1E65,0x1E67,0x1E69,0x1E6B,0x1E6D,0x1E6F,0x1E71,0x1E73,0x1E75,0x1E77,0x1E79,0x1E7B,0x1E7D,0x1E7F,0x1E81,0x1E83,0x1E85,0x1E87,0x1E89,0x1E8B,0x1E8D,0x1E8F,0x1E91,0x1E93,0x1E95,0x1E97,0x1E99,0x1E9B,0x1E9D,0x1E9F,0x1EA1,0x1EA3,0x1EA5,0x1EA7,0x1EA9,0x1EAB,0x1EAD,0x1EAF,0x1EB1,0x1EB3,0x1EB5,0x1EB7,0x1EB9,0x1EBB,0x1EBD,0x1EBF,0x1EC1,0x1EC3,0x1EC5,0x1EC7,0x1EC9,0x1ECB,0x1ECD,0x1ECF,0x1ED1,0x1ED3,0x1ED5,0x1ED7,0x1ED9,0x1EDB,0x1EDD,0x1EDF,0x1EE1,0x1EE3,0x1EE5,0x1EE7,0x1EE9,0x1EEB,0x1EED,0x1EEF,0x1EF1,0x1EF3,0x1EF5,0x1EF7,0x1EF9, + /* Number forms */ 0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,0x2176,0x2177,0x2178,0x2179,0x217A,0x217B,0x217C,0x217D,0x217E,0x217F, + /* Full-width */ 0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47,0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57,0xFF58,0xFF59,0xFF5A + }; + static const WCHAR upper[] = { /* Upper case characters correspond to lower[] */ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x178, + 0x100,0x102,0x104,0x106,0x108,0x10A,0x10C,0x10E,0x110,0x112,0x114,0x116,0x118,0x11A,0x11C,0x11E,0x120,0x122,0x124,0x126,0x128,0x12A,0x12C,0x12E,0x130,0x132,0x134,0x136,0x139,0x13B,0x13D,0x13F,0x141,0x143,0x145,0x147,0x14A,0x14C,0x14E,0x150,0x152,0x154,0x156,0x158,0x15A,0x15C,0x15E,0x160,0x162,0x164,0x166,0x168,0x16A,0x16C,0x16E,0x170,0x172,0x174,0x176,0x179,0x17B,0x17D, + 0x182,0x184,0x187,0x18B,0x191,0x198,0x1A0,0x1A2,0x1A7,0x1AC,0x1AF,0x1B3,0x1B5,0x1B8,0x1BC,0x1C4,0x1C7,0x1CA,0x1CD,0x1CF,0x1D1,0x1D3,0x1D5,0x1D7,0x1D9,0x1DB,0x18E,0x1DE,0x1E0,0x1E2,0x1E4,0x1E6,0x1E8,0x1EA,0x1EC,0x1EE,0x1F1,0x1F4,0x1FA,0x1FC,0x1FE,0x200,0x202,0x204,0x206,0x208,0x20A,0x20C,0x20E,0x210,0x212,0x214,0x216, + 0x391,0x392,0x393,0x394,0x395,0x396,0x397,0x398,0x399,0x39A,0x39B,0x39C,0x39D,0x39E,0x39F,0x3A0,0x3A1,0x3A3,0x3A4,0x3A5,0x3A6,0x3A7,0x3A8,0x3A9,0x3AA,0x3AB,0x38C,0x38E,0x38F,0x3E2,0x3E4,0x3E6,0x3E8,0x3EA, + 0x410,0x411,0x412,0x413,0x414,0x415,0x416,0x417,0x418,0x419,0x41A,0x41B,0x41C,0x41D,0x41E,0x41F,0x420,0x421,0x422,0x423,0x424,0x425,0x426,0x427,0x428,0x429,0x42A,0x42B,0x42C,0x42D,0x42E,0x42F,0x402,0x403,0x404,0x405,0x406,0x407,0x408,0x409,0x40A,0x40B,0x40C,0x40E,0x40F,0x460,0x462,0x464,0x466,0x468,0x46A,0x46C,0x46E,0x470,0x472,0x474,0x476,0x478,0x47A,0x47C,0x47E,0x480,0x490,0x492,0x494,0x496,0x498,0x49A,0x49C,0x49E,0x4A0,0x4A2,0x4A4,0x4A6,0x4A8,0x4AA,0x4AC,0x4AE,0x4B0,0x4B2,0x4B4,0x4B6,0x4B8,0x4BA,0x4BC,0x4BE,0x4C1,0x4C3,0x5C7,0x4D0,0x4D2,0x4D4,0x4D6,0x4D8,0x4DA,0x4DC,0x4DE,0x4E0,0x4E2,0x4E4,0x4E6,0x4E8,0x4EA,0x4EC,0x4EE,0x4F0,0x4F2,0x4F4,0x4F8, + 0x531,0x532,0x533,0x534,0x535,0x536,0x537,0x538,0x539,0x53A,0x53B,0x53C,0x53D,0x53E,0x53F,0x540,0x541,0x542,0x543,0x544,0x545,0x546,0x547,0x548,0x549,0x54A,0x54B,0x54C,0x54D,0x54E,0x54F,0x550,0x551,0x552,0x553,0x554,0x555,0x556, + 0x1E00,0x1E02,0x1E04,0x1E06,0x1E08,0x1E0A,0x1E0C,0x1E0E,0x1E10,0x1E12,0x1E14,0x1E16,0x1E18,0x1E1A,0x1E1C,0x1E1E,0x1E20,0x1E22,0x1E24,0x1E26,0x1E28,0x1E2A,0x1E2C,0x1E2E,0x1E30,0x1E32,0x1E34,0x1E36,0x1E38,0x1E3A,0x1E3C,0x1E3E,0x1E40,0x1E42,0x1E44,0x1E46,0x1E48,0x1E4A,0x1E4C,0x1E4E,0x1E50,0x1E52,0x1E54,0x1E56,0x1E58,0x1E5A,0x1E5C,0x1E5E,0x1E60,0x1E62,0x1E64,0x1E66,0x1E68,0x1E6A,0x1E6C,0x1E6E,0x1E70,0x1E72,0x1E74,0x1E76,0x1E78,0x1E7A,0x1E7C,0x1E7E,0x1E80,0x1E82,0x1E84,0x1E86,0x1E88,0x1E8A,0x1E8C,0x1E8E,0x1E90,0x1E92,0x1E94,0x1E96,0x1E98,0x1E9A,0x1E9C,0x1E9E,0x1EA0,0x1EA2,0x1EA4,0x1EA6,0x1EA8,0x1EAA,0x1EAC,0x1EAE,0x1EB0,0x1EB2,0x1EB4,0x1EB6,0x1EB8,0x1EBA,0x1EBC,0x1EBE,0x1EC0,0x1EC2,0x1EC4,0x1EC6,0x1EC8,0x1ECA,0x1ECC,0x1ECE,0x1ED0,0x1ED2,0x1ED4,0x1ED6,0x1ED8,0x1EDA,0x1EDC,0x1EDE,0x1EE0,0x1EE2,0x1EE4,0x1EE6,0x1EE8,0x1EEA,0x1EEC,0x1EEE,0x1EF0,0x1EF2,0x1EF4,0x1EF6,0x1EF8, + 0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,0x2167,0x2168,0x2169,0x216A,0x216B,0x216C,0x216D,0x216E,0x216F, + 0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28,0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30,0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38,0xFF39,0xFF3A + }; + UINT i, n, hi, li; - for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + if (chr < 0x80) { /* ASCII characters (acceleration) */ + if (chr >= 0x61 && chr <= 0x7A) chr -= 0x20; - return tbl_lower[i] ? tbl_upper[i] : chr; + } else { /* Extended characters */ + n = 12; li = 0; hi = sizeof lower / sizeof lower[0]; + do { + i = li + (hi - li) / 2; + if (chr == lower[i]) break; + if (chr > lower[i]) li = i; else hi = i; + } while (--n); + if (n) chr = upper[i]; + } + + return chr; } + diff --git a/firmware/chibios-portapack/ext/fatfs/src/option/ccsbcs.c b/firmware/chibios-portapack/ext/fatfs/src/option/ccsbcs.c index b16db303..37f763ef 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/option/ccsbcs.c +++ b/firmware/chibios-portapack/ext/fatfs/src/option/ccsbcs.c @@ -1,28 +1,24 @@ /*------------------------------------------------------------------------*/ -/* Unicode - Local code bidirectional converter (C)ChaN, 2012 */ +/* Unicode - Local code bidirectional converter (C)ChaN, 2015 */ /* (SBCS code pages) */ /*------------------------------------------------------------------------*/ -/* 437 U.S. (OEM) -/ 720 Arabic (OEM) -/ 1256 Arabic (Windows) -/ 737 Greek (OEM) -/ 1253 Greek (Windows) -/ 1250 Central Europe (Windows) -/ 775 Baltic (OEM) -/ 1257 Baltic (Windows) -/ 850 Multilingual Latin 1 (OEM) -/ 852 Latin 2 (OEM) -/ 1252 Latin 1 (Windows) -/ 855 Cyrillic (OEM) -/ 1251 Cyrillic (Windows) -/ 866 Russian (OEM) -/ 857 Turkish (OEM) -/ 1254 Turkish (Windows) -/ 858 Multilingual Latin 1 + Euro (OEM) -/ 862 Hebrew (OEM) -/ 1255 Hebrew (Windows) -/ 874 Thai (OEM, Windows) -/ 1258 Vietnam (OEM, Windows) +/* 437 U.S. +/ 720 Arabic +/ 737 Greek +/ 771 KBL +/ 775 Baltic +/ 850 Latin 1 +/ 852 Latin 2 +/ 855 Cyrillic +/ 857 Turkish +/ 860 Portuguese +/ 861 Icelandic +/ 862 Hebrew +/ 863 Canadian French +/ 864 Arabic +/ 865 Nordic +/ 866 Russian +/ 869 Greek 2 */ #include "../ff.h" @@ -32,475 +28,253 @@ #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP437(0x80-0xFF) to Unicode conversion table */ - 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, - 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, - 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, - 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, - 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, - 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, - 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, - 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, - 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, - 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, - 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 720 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP720(0x80-0xFF) to Unicode conversion table */ - 0x0000, 0x0000, 0x00E9, 0x00E2, 0x0000, 0x00E0, 0x0000, 0x00E7, - 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0651, 0x0652, 0x00F4, 0x00A4, 0x0640, 0x00FB, 0x00F9, - 0x0621, 0x0622, 0x0623, 0x0624, 0x00A3, 0x0625, 0x0626, 0x0627, - 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, - 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x00AB, 0x00BB, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, - 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, - 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0641, 0x00B5, 0x0642, - 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, - 0x2261, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x2248, - 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 + 0x0000, 0x0000, 0x00E9, 0x00E2, 0x0000, 0x00E0, 0x0000, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0651, 0x0652, 0x00F4, 0x00A4, 0x0640, 0x00FB, 0x00F9, 0x0621, 0x0622, 0x0623, 0x0624, 0x00A3, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0641, 0x00B5, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, + 0x2261, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 737 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP737(0x80-0xFF) to Unicode conversion table */ - 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, - 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, - 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, - 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, - 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, - 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, - 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, - 0x03C9, 0x03AC, 0x03AD, 0x03AE, 0x03CA, 0x03AF, 0x03CC, 0x03CD, - 0x03CB, 0x03CE, 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E, - 0x038F, 0x00B1, 0x2265, 0x2264, 0x03AA, 0x03AB, 0x00F7, 0x2248, - 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, + 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, + 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03C9, 0x03AC, 0x03AD, 0x03AE, 0x03CA, 0x03AF, 0x03CC, 0x03CD, 0x03CB, 0x03CE, 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E, + 0x038F, 0x00B1, 0x2265, 0x2264, 0x03AA, 0x03AB, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 771 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP771(0x80-0xFF) to Unicode conversion table */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x0104, 0x0105, 0x010C, 0x010D, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x0118, 0x0119, 0x0116, 0x0117, 0x012E, 0x012F, 0x0160, 0x0161, 0x0172, 0x0173, 0x016A, 0x016B, 0x017D, 0x017E, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 775 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP775(0x80-0xFF) to Unicode conversion table */ - 0x0106, 0x00FC, 0x00E9, 0x0101, 0x00E4, 0x0123, 0x00E5, 0x0107, - 0x0142, 0x0113, 0x0156, 0x0157, 0x012B, 0x0179, 0x00C4, 0x00C5, - 0x00C9, 0x00E6, 0x00C6, 0x014D, 0x00F6, 0x0122, 0x00A2, 0x015A, - 0x015B, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x00A4, - 0x0100, 0x012A, 0x00F3, 0x017B, 0x017C, 0x017A, 0x201D, 0x00A6, - 0x00A9, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x0141, 0x00AB, 0x00BB, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010C, 0x0118, - 0x0116, 0x2563, 0x2551, 0x2557, 0x255D, 0x012E, 0x0160, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0172, 0x016A, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x017D, - 0x0105, 0x010D, 0x0119, 0x0117, 0x012F, 0x0161, 0x0173, 0x016B, - 0x017E, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, - 0x00D3, 0x00DF, 0x014C, 0x0143, 0x00F5, 0x00D5, 0x00B5, 0x0144, - 0x0136, 0x0137, 0x013B, 0x013C, 0x0146, 0x0112, 0x0145, 0x2019, - 0x00AD, 0x00B1, 0x201C, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x201E, - 0x00B0, 0x2219, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 + 0x0106, 0x00FC, 0x00E9, 0x0101, 0x00E4, 0x0123, 0x00E5, 0x0107, 0x0142, 0x0113, 0x0156, 0x0157, 0x012B, 0x0179, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x014D, 0x00F6, 0x0122, 0x00A2, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x00A4, + 0x0100, 0x012A, 0x00F3, 0x017B, 0x017C, 0x017A, 0x201D, 0x00A6, 0x00A9, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x0141, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010C, 0x0118, 0x0116, 0x2563, 0x2551, 0x2557, 0x255D, 0x012E, 0x0160, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0172, 0x016A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x017D, + 0x0105, 0x010D, 0x0119, 0x0117, 0x012F, 0x0161, 0x0173, 0x016B, 0x017E, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x00D3, 0x00DF, 0x014C, 0x0143, 0x00F5, 0x00D5, 0x00B5, 0x0144, 0x0136, 0x0137, 0x013B, 0x013C, 0x0146, 0x0112, 0x0145, 0x2019, + 0x00AD, 0x00B1, 0x201C, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x201E, 0x00B0, 0x2219, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 850 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP850(0x80-0xFF) to Unicode conversion table */ - 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, - 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, - 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, - 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, - 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, - 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, - 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, - 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, - 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, - 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, - 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, - 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, - 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 852 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP852(0x80-0xFF) to Unicode conversion table */ - 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x016F, 0x0107, 0x00E7, - 0x0142, 0x00EB, 0x0150, 0x0151, 0x00EE, 0x0179, 0x00C4, 0x0106, - 0x00C9, 0x0139, 0x013A, 0x00F4, 0x00F6, 0x013D, 0x013E, 0x015A, - 0x015B, 0x00D6, 0x00DC, 0x0164, 0x0165, 0x0141, 0x00D7, 0x010D, - 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x0104, 0x0105, 0x017D, 0x017E, - 0x0118, 0x0119, 0x00AC, 0x017A, 0x010C, 0x015F, 0x00AB, 0x00BB, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x011A, - 0x015E, 0x2563, 0x2551, 0x2557, 0x255D, 0x017B, 0x017C, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0102, 0x0103, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, - 0x0111, 0x0110, 0x010E, 0x00CB, 0x010F, 0x0147, 0x00CD, 0x00CE, - 0x011B, 0x2518, 0x250C, 0x2588, 0x2584, 0x0162, 0x016E, 0x2580, - 0x00D3, 0x00DF, 0x00D4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, - 0x0154, 0x00DA, 0x0155, 0x0170, 0x00FD, 0x00DD, 0x0163, 0x00B4, - 0x00AD, 0x02DD, 0x02DB, 0x02C7, 0x02D8, 0x00A7, 0x00F7, 0x00B8, - 0x00B0, 0x00A8, 0x02D9, 0x0171, 0x0158, 0x0159, 0x25A0, 0x00A0 + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x016F, 0x0107, 0x00E7, 0x0142, 0x00EB, 0x0150, 0x0151, 0x00EE, 0x0179, 0x00C4, 0x0106, + 0x00C9, 0x0139, 0x013A, 0x00F4, 0x00F6, 0x013D, 0x013E, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x0164, 0x0165, 0x0141, 0x00D7, 0x010D, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x0104, 0x0105, 0x017D, 0x017E, 0x0118, 0x0119, 0x00AC, 0x017A, 0x010C, 0x015F, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x011A, 0x015E, 0x2563, 0x2551, 0x2557, 0x255D, 0x017B, 0x017C, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0102, 0x0103, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x0111, 0x0110, 0x010E, 0x00CB, 0x010F, 0x0147, 0x00CD, 0x00CE, 0x011B, 0x2518, 0x250C, 0x2588, 0x2584, 0x0162, 0x016E, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, 0x0154, 0x00DA, 0x0155, 0x0170, 0x00FD, 0x00DD, 0x0163, 0x00B4, + 0x00AD, 0x02DD, 0x02DB, 0x02C7, 0x02D8, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x02D9, 0x0171, 0x0158, 0x0159, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 855 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP855(0x80-0xFF) to Unicode conversion table */ - 0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, - 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, - 0x0459, 0x0409, 0x045A, 0x040A, 0x045B, 0x040B, 0x045C, 0x040C, - 0x045E, 0x040E, 0x045F, 0x040F, 0x044E, 0x042E, 0x044A, 0x042A, - 0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, - 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00AB, 0x00BB, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, - 0x0418, 0x2563, 0x2551, 0x2557, 0x255D, 0x0439, 0x0419, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x043A, 0x041A, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, - 0x043B, 0x041B, 0x043C, 0x041C, 0x043D, 0x041D, 0x043E, 0x041E, - 0x043F, 0x2518, 0x250C, 0x2588, 0x2584, 0x041F, 0x044F, 0x2580, - 0x042F, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, - 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044C, 0x042C, 0x2116, - 0x00AD, 0x044B, 0x042B, 0x0437, 0x0417, 0x0448, 0x0428, 0x044D, - 0x042D, 0x0449, 0x0429, 0x0447, 0x0427, 0x00A7, 0x25A0, 0x00A0 + 0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, + 0x0459, 0x0409, 0x045A, 0x040A, 0x045B, 0x040B, 0x045C, 0x040C, 0x045E, 0x040E, 0x045F, 0x040F, 0x044E, 0x042E, 0x044A, 0x042A, + 0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, 0x0418, 0x2563, 0x2551, 0x2557, 0x255D, 0x0439, 0x0419, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x043A, 0x041A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x043B, 0x041B, 0x043C, 0x041C, 0x043D, 0x041D, 0x043E, 0x041E, 0x043F, 0x2518, 0x250C, 0x2588, 0x2584, 0x041F, 0x044F, 0x2580, + 0x042F, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044C, 0x042C, 0x2116, + 0x00AD, 0x044B, 0x042B, 0x0437, 0x0417, 0x0448, 0x0428, 0x044D, 0x042D, 0x0449, 0x0429, 0x0447, 0x0427, 0x00A7, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 857 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP857(0x80-0xFF) to Unicode conversion table */ - 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, - 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0131, 0x00C4, 0x00C5, - 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, - 0x0130, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x015E, 0x015F, - 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x011E, 0x011F, - 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, - 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, - 0x00BA, 0x00AA, 0x00CA, 0x00CB, 0x00C8, 0x0000, 0x00CD, 0x00CE, - 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, - 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x0000, - 0x00D7, 0x00DA, 0x00DB, 0x00D9, 0x00EC, 0x00FF, 0x00AF, 0x00B4, - 0x00AD, 0x00B1, 0x0000, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, - 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0131, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x0130, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x015E, 0x015F, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x011E, 0x011F, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00BA, 0x00AA, 0x00CA, 0x00CB, 0x00C8, 0x0000, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x0000, 0x00D7, 0x00DA, 0x00DB, 0x00D9, 0x00EC, 0x00FF, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x0000, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 }; -#elif _CODE_PAGE == 858 +#elif _CODE_PAGE == 860 #define _TBLDEF 1 static -const WCHAR Tbl[] = { /* CP858(0x80-0xFF) to Unicode conversion table */ - 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, - 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, - 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, - 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, - 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, - 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, - 0x00A9, 0x2563, 0x2551, 0x2557, 0x2550, 0x00A2, 0x00A5, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, - 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x20AC, 0x00CD, 0x00CE, - 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00C6, 0x00CC, 0x2580, - 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, - 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, - 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, - 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +const WCHAR Tbl[] = { /* CP860(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E3, 0x00E0, 0x00C1, 0x00E7, 0x00EA, 0x00CA, 0x00E8, 0x00CD, 0x00D4, 0x00EC, 0x00C3, 0x00C2, + 0x00C9, 0x00C0, 0x00C8, 0x00F4, 0x00F5, 0x00F2, 0x00DA, 0x00F9, 0x00CC, 0x00D5, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x20A7, 0x00D3, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00D2, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 861 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP861(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00D0, 0x00F0, 0x00DE, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00FE, 0x00FB, 0x00DD, 0x00FD, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00C1, 0x00CD, 0x00D3, 0x00DA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 862 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP862(0x80-0xFF) to Unicode conversion table */ - 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, - 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, - 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, - 0x05E8, 0x05E9, 0x05EA, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, - 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, - 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, - 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, - 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, - 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, - 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, - 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 863 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP863(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00C2, 0x00E0, 0x00B6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x2017, 0x00C0, + 0x00C9, 0x00C8, 0x00CA, 0x00F4, 0x00CB, 0x00CF, 0x00FB, 0x00F9, 0x00A4, 0x00D4, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x00DB, 0x0192, + 0x00A6, 0x00B4, 0x00F3, 0x00FA, 0x00A8, 0x00BB, 0x00B3, 0x00AF, 0x00CE, 0x3210, 0x00AC, 0x00BD, 0x00BC, 0x00BE, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2219, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 864 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP864(0x80-0xFF) to Unicode conversion table */ + 0x00B0, 0x00B7, 0x2219, 0x221A, 0x2592, 0x2500, 0x2502, 0x253C, 0x2524, 0x252C, 0x251C, 0x2534, 0x2510, 0x250C, 0x2514, 0x2518, + 0x03B2, 0x221E, 0x03C6, 0x00B1, 0x00BD, 0x00BC, 0x2248, 0x00AB, 0x00BB, 0xFEF7, 0xFEF8, 0x0000, 0x0000, 0xFEFB, 0xFEFC, 0x0000, + 0x00A0, 0x00AD, 0xFE82, 0x00A3, 0x00A4, 0xFE84, 0x0000, 0x20AC, 0xFE8E, 0xFE8F, 0xFE95, 0xFE99, 0x060C, 0xFE9D, 0xFEA1, 0xFEA5, + 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668, 0x0669, 0xFED1, 0x061B, 0xFEB1, 0xFEB5, 0xFEB9, 0x061F, + 0x00A2, 0xFE80, 0xFE81, 0xFE83, 0xFE85, 0xFECA, 0xFE8B, 0xFE8D, 0xFE91, 0xFE93, 0xFE97, 0xFE9B, 0xFE9F, 0xFEA3, 0xFEA7, 0xFEA9, + 0xFEAB, 0xFEAD, 0xFEAF, 0xFEB3, 0xFEB7, 0xFEBB, 0xFEBF, 0xFEC1, 0xFEC5, 0xFECB, 0xFECF, 0x00A6, 0x00AC, 0x00F7, 0x00D7, 0xFEC9, + 0x0640, 0xFED3, 0xFED7, 0xFEDB, 0xFEDF, 0xFEE3, 0xFEE7, 0xFEEB, 0xFEED, 0xFEEF, 0xFEF3, 0xFEBD, 0xFECC, 0xFECE, 0xFECD, 0xFEE1, + 0xFE7D, 0x0651, 0xFEE5, 0xFEE9, 0xFEEC, 0xFEF0, 0xFEF2, 0xFED0, 0xFED5, 0xFEF5, 0xFEF6, 0xFEDD, 0xFED9, 0xFEF1, 0x25A0, 0x0000 +}; + +#elif _CODE_PAGE == 865 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP865(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C5, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00A4, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 }; #elif _CODE_PAGE == 866 #define _TBLDEF 1 static const WCHAR Tbl[] = { /* CP866(0x80-0xFF) to Unicode conversion table */ - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, - 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, - 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, - 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, - 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, - 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, - 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, - 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, - 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0 + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0 }; -#elif _CODE_PAGE == 874 +#elif _CODE_PAGE == 869 #define _TBLDEF 1 static -const WCHAR Tbl[] = { /* CP874(0x80-0xFF) to Unicode conversion table */ - 0x20AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x2026, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, - 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F, - 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, - 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F, - 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, - 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F, - 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, - 0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F, - 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, - 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F, - 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, - 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000 -}; - -#elif _CODE_PAGE == 1250 -#define _TBLDEF 1 -static -const WCHAR Tbl[] = { /* CP1250(0x80-0xFF) to Unicode conversion table */ - 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, - 0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179, - 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A, - 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B, - 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C, - 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, - 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, - 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, - 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, - 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, - 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, - 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, - 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 -}; - -#elif _CODE_PAGE == 1251 -#define _TBLDEF 1 -static -const WCHAR Tbl[] = { /* CP1251(0x80-0xFF) to Unicode conversion table */ - 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, - 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, - 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x0000, 0x2111, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, - 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, - 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407, - 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, - 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457, - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F -}; - -#elif _CODE_PAGE == 1252 -#define _TBLDEF 1 -static -const WCHAR Tbl[] = { /* CP1252(0x80-0xFF) to Unicode conversion table */ - 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, - 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000, - 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178, - 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, - 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, - 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, - 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, - 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, - 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, - 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, - 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, - 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF -}; - -#elif _CODE_PAGE == 1253 -#define _TBLDEF 1 -static -const WCHAR Tbl[] = { /* CP1253(0x80-0xFF) to Unicode conversion table */ - 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, - 0x0000, 0x2030, 0x0000, 0x2039, 0x000C, 0x0000, 0x0000, 0x0000, - 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, - 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7, - 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, - 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, - 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, - 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, - 0x03A8, 0x03A9, 0x03AA, 0x03AD, 0x03AC, 0x03AD, 0x03AE, 0x03AF, - 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, - 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, - 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, - 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000 -}; - -#elif _CODE_PAGE == 1254 -#define _TBLDEF 1 -static -const WCHAR Tbl[] = { /* CP1254(0x80-0xFF) to Unicode conversion table */ - 0x20AC, 0x0000, 0x210A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, - 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, - 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, - 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, - 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, - 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, - 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, - 0x00D8, 0x00D9, 0x00DA, 0x00BD, 0x00DC, 0x0130, 0x015E, 0x00DF, - 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, - 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, - 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, - 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF -}; - -#elif _CODE_PAGE == 1255 -#define _TBLDEF 1 -static -const WCHAR Tbl[] = { /* CP1255(0x80-0xFF) to Unicode conversion table */ - 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, - 0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, - 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, - 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, - 0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF, - 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3, - 0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, - 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, - 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, - 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000 -}; - -#elif _CODE_PAGE == 1256 -#define _TBLDEF 1 -static -const WCHAR Tbl[] = { /* CP1256(0x80-0xFF) to Unicode conversion table */ - 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, - 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, - 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA, - 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F, - 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, - 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, - 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7, - 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0640, 0x0642, 0x0643, - 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, - 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF, - 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, - 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2 -}; - -#elif _CODE_PAGE == 1257 -#define _TBLDEF 1 -static -const WCHAR Tbl[] = { /* CP1257(0x80-0xFF) to Unicode conversion table */ - 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, - 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8, - 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000, - 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7, - 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, - 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, - 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, - 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, - 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, - 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, - 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, - 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, - 0x0173, 0x014E, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9 -}; - -#elif _CODE_PAGE == 1258 -#define _TBLDEF 1 -static -const WCHAR Tbl[] = { /* CP1258(0x80-0xFF) to Unicode conversion table */ - 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, - 0x02C6, 0x2030, 0x0000, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, - 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x02DC, 0x2122, 0x0000, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, - 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, - 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7, - 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF, - 0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7, - 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF, - 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7, - 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED, 0x00EE, 0x00EF, - 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7, - 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF +const WCHAR Tbl[] = { /* CP869(0x80-0xFF) to Unicode conversion table */ + 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x0386, 0x00B7, 0x00B7, 0x00AC, 0x00A6, 0x2018, 0x2019, 0x0388, 0x2015, 0x0389, + 0x038A, 0x03AA, 0x038C, 0x00B7, 0x00B7, 0x038E, 0x03AB, 0x00A9, 0x038F, 0x00B2, 0x00B3, 0x03AC, 0x00A3, 0x03AD, 0x03AE, 0x03AF, + 0x03CA, 0x0390, 0x03CC, 0x03CD, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x00BD, 0x0398, 0x0399, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x039A, 0x039B, 0x039C, 0x039D, 0x2563, 0x2551, 0x2557, 0x255D, 0x039E, 0x039F, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0A30, 0x03A1, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x03A3, + 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x2518, 0x250C, 0x2588, 0x2584, 0x03B4, 0x03B5, 0x2580, + 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x0384, + 0x00AD, 0x00B1, 0x03C5, 0x03C6, 0x03C7, 0x00A7, 0x03C8, 0x0385, 0x00B0, 0x00A8, 0x03C9, 0x03CB, 0x03B0, 0x03CE, 0x25A0, 0x00A0 }; #endif #if !_TBLDEF || !_USE_LFN -#error This file is not needed in current configuration. Remove from the project. +#error This file is not needed at current configuration. Remove from the project. #endif + + WCHAR ff_convert ( /* Converted character, Returns zero on error */ WCHAR chr, /* Character code to be converted */ - UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ + UINT dir /* 0: Unicode to OEM code, 1: OEM code to Unicode */ ) { WCHAR c; @@ -510,10 +284,10 @@ WCHAR ff_convert ( /* Converted character, Returns zero on error */ c = chr; } else { - if (dir) { /* OEMCP to Unicode */ + if (dir) { /* OEM code to Unicode */ c = (chr >= 0x100) ? 0 : Tbl[chr - 0x80]; - } else { /* Unicode to OEMCP */ + } else { /* Unicode to OEM code */ for (c = 0; c < 0x80; c++) { if (chr == Tbl[c]) break; } @@ -525,16 +299,50 @@ WCHAR ff_convert ( /* Converted character, Returns zero on error */ } -WCHAR ff_wtoupper ( /* Upper converted character */ - WCHAR chr /* Input character */ + + +WCHAR ff_wtoupper ( /* Returns upper converted character */ + WCHAR chr /* Unicode character to be upper converted */ ) { - static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; - static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; - int i; + static const WCHAR lower[] = { /* Lower case characters to be converted */ + /* Latin Supplement */ 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, + /* Latin Extended-A */ 0x101,0x103,0x105,0x107,0x109,0x10B,0x10D,0x10F,0x111,0x113,0x115,0x117,0x119,0x11B,0x11D,0x11F,0x121,0x123,0x125,0x127,0x129,0x12B,0x12D,0x12F,0x131,0x133,0x135,0x137,0x13A,0x13C,0x13E,0x140,0x142,0x144,0x146,0x148,0x14B,0x14D,0x14F,0x151,0x153,0x155,0x157,0x159,0x15B,0x15D,0x15F,0x161,0x163,0x165,0x167,0x169,0x16B,0x16D,0x16F,0x171,0x173,0x175,0x177,0x17A,0x17C,0x17E, + /* Latin Extended-B */ 0x183,0x185,0x188,0x18C,0x192,0x199,0x1A1,0x1A3,0x1A8,0x1AD,0x1B0,0x1B4,0x1B6,0x1B9,0x1BD,0x1C6,0x1C9,0x1CC,0x1CE,0x1D0,0x1D2,0x1D4,0x1D6,0x1D8,0x1DA,0x1DC,0x1DD,0x1DF,0x1E1,0x1E3,0x1E5,0x1E7,0x1E9,0x1EB,0x1ED,0x1EF,0x1F3,0x1F5,0x1FB,0x1FD,0x1FF,0x201,0x203,0x205,0x207,0x209,0x20B,0x20D,0x20F,0x211,0x213,0x215,0x217, + /* Greek, Coptic */ 0x3B1,0x3B2,0x3B3,0x3B4,0x3B5,0x3B6,0x3B7,0x3B8,0x3B9,0x3BA,0x3BB,0x3BC,0x3BD,0x3BE,0x3BF,0x3C0,0x3C1,0x3C3,0x3C4,0x3C5,0x3C6,0x3C7,0x3C8,0x3C9,0x3CA,0x3CB,0x3CC,0x3CD,0x3CE,0x3E3,0x3E5,0x3E7,0x3E9,0x3EB, + /* Cyrillic */ 0x430,0x431,0x432,0x433,0x434,0x435,0x436,0x437,0x438,0x439,0x43A,0x43B,0x43C,0x43D,0x43E,0x43F,0x440,0x441,0x442,0x443,0x444,0x445,0x446,0x447,0x448,0x449,0x44A,0x44B,0x44C,0x44D,0x44E,0x44F,0x452,0x453,0x454,0x455,0x456,0x457,0x458,0x459,0x45A,0x45B,0x45C,0x45E,0x45F,0x461,0x463,0x465,0x467,0x469,0x46B,0x46D,0x46F,0x471,0x473,0x475,0x477,0x479,0x47B,0x47D,0x47F,0x481,0x491,0x493,0x495,0x497,0x499,0x49B,0x49D,0x49F,0x4A1,0x4A3,0x4A5,0x4A7,0x4A9,0x4AB,0x4AD,0x4AF,0x4B1,0x4B3,0x4B5,0x4B7,0x4B9,0x4BB,0x4BD,0x4BF,0x4C2,0x4C4,0x4C8,0x4D1,0x4D3,0x4D5,0x4D7,0x4D9,0x4DB,0x4DD,0x4DF,0x4E1,0x4E3,0x4E5,0x4E7,0x4E9,0x4EB,0x4ED,0x4EF,0x4F1,0x4F3,0x4F5,0x4F9, + /* Armenian */ 0x561,0x562,0x563,0x564,0x565,0x566,0x567,0x568,0x569,0x56A,0x56B,0x56C,0x56D,0x56E,0x56F,0x570,0x571,0x572,0x573,0x574,0x575,0x576,0x577,0x578,0x579,0x57A,0x57B,0x57C,0x57D,0x57E,0x57F,0x580,0x581,0x582,0x583,0x584,0x585,0x586, + /* Latin Extended Additional */ 0x1E01,0x1E03,0x1E05,0x1E07,0x1E09,0x1E0B,0x1E0D,0x1E0F,0x1E11,0x1E13,0x1E15,0x1E17,0x1E19,0x1E1B,0x1E1D,0x1E1F,0x1E21,0x1E23,0x1E25,0x1E27,0x1E29,0x1E2B,0x1E2D,0x1E2F,0x1E31,0x1E33,0x1E35,0x1E37,0x1E39,0x1E3B,0x1E3D,0x1E3F,0x1E41,0x1E43,0x1E45,0x1E47,0x1E49,0x1E4B,0x1E4D,0x1E4F,0x1E51,0x1E53,0x1E55,0x1E57,0x1E59,0x1E5B,0x1E5D,0x1E5F,0x1E61,0x1E63,0x1E65,0x1E67,0x1E69,0x1E6B,0x1E6D,0x1E6F,0x1E71,0x1E73,0x1E75,0x1E77,0x1E79,0x1E7B,0x1E7D,0x1E7F,0x1E81,0x1E83,0x1E85,0x1E87,0x1E89,0x1E8B,0x1E8D,0x1E8F,0x1E91,0x1E93,0x1E95,0x1E97,0x1E99,0x1E9B,0x1E9D,0x1E9F,0x1EA1,0x1EA3,0x1EA5,0x1EA7,0x1EA9,0x1EAB,0x1EAD,0x1EAF,0x1EB1,0x1EB3,0x1EB5,0x1EB7,0x1EB9,0x1EBB,0x1EBD,0x1EBF,0x1EC1,0x1EC3,0x1EC5,0x1EC7,0x1EC9,0x1ECB,0x1ECD,0x1ECF,0x1ED1,0x1ED3,0x1ED5,0x1ED7,0x1ED9,0x1EDB,0x1EDD,0x1EDF,0x1EE1,0x1EE3,0x1EE5,0x1EE7,0x1EE9,0x1EEB,0x1EED,0x1EEF,0x1EF1,0x1EF3,0x1EF5,0x1EF7,0x1EF9, + /* Number forms */ 0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,0x2176,0x2177,0x2178,0x2179,0x217A,0x217B,0x217C,0x217D,0x217E,0x217F, + /* Full-width */ 0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47,0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57,0xFF58,0xFF59,0xFF5A + }; + static const WCHAR upper[] = { /* Upper case characters correspond to lower[] */ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x178, + 0x100,0x102,0x104,0x106,0x108,0x10A,0x10C,0x10E,0x110,0x112,0x114,0x116,0x118,0x11A,0x11C,0x11E,0x120,0x122,0x124,0x126,0x128,0x12A,0x12C,0x12E,0x130,0x132,0x134,0x136,0x139,0x13B,0x13D,0x13F,0x141,0x143,0x145,0x147,0x14A,0x14C,0x14E,0x150,0x152,0x154,0x156,0x158,0x15A,0x15C,0x15E,0x160,0x162,0x164,0x166,0x168,0x16A,0x16C,0x16E,0x170,0x172,0x174,0x176,0x179,0x17B,0x17D, + 0x182,0x184,0x187,0x18B,0x191,0x198,0x1A0,0x1A2,0x1A7,0x1AC,0x1AF,0x1B3,0x1B5,0x1B8,0x1BC,0x1C4,0x1C7,0x1CA,0x1CD,0x1CF,0x1D1,0x1D3,0x1D5,0x1D7,0x1D9,0x1DB,0x18E,0x1DE,0x1E0,0x1E2,0x1E4,0x1E6,0x1E8,0x1EA,0x1EC,0x1EE,0x1F1,0x1F4,0x1FA,0x1FC,0x1FE,0x200,0x202,0x204,0x206,0x208,0x20A,0x20C,0x20E,0x210,0x212,0x214,0x216, + 0x391,0x392,0x393,0x394,0x395,0x396,0x397,0x398,0x399,0x39A,0x39B,0x39C,0x39D,0x39E,0x39F,0x3A0,0x3A1,0x3A3,0x3A4,0x3A5,0x3A6,0x3A7,0x3A8,0x3A9,0x3AA,0x3AB,0x38C,0x38E,0x38F,0x3E2,0x3E4,0x3E6,0x3E8,0x3EA, + 0x410,0x411,0x412,0x413,0x414,0x415,0x416,0x417,0x418,0x419,0x41A,0x41B,0x41C,0x41D,0x41E,0x41F,0x420,0x421,0x422,0x423,0x424,0x425,0x426,0x427,0x428,0x429,0x42A,0x42B,0x42C,0x42D,0x42E,0x42F,0x402,0x403,0x404,0x405,0x406,0x407,0x408,0x409,0x40A,0x40B,0x40C,0x40E,0x40F,0x460,0x462,0x464,0x466,0x468,0x46A,0x46C,0x46E,0x470,0x472,0x474,0x476,0x478,0x47A,0x47C,0x47E,0x480,0x490,0x492,0x494,0x496,0x498,0x49A,0x49C,0x49E,0x4A0,0x4A2,0x4A4,0x4A6,0x4A8,0x4AA,0x4AC,0x4AE,0x4B0,0x4B2,0x4B4,0x4B6,0x4B8,0x4BA,0x4BC,0x4BE,0x4C1,0x4C3,0x5C7,0x4D0,0x4D2,0x4D4,0x4D6,0x4D8,0x4DA,0x4DC,0x4DE,0x4E0,0x4E2,0x4E4,0x4E6,0x4E8,0x4EA,0x4EC,0x4EE,0x4F0,0x4F2,0x4F4,0x4F8, + 0x531,0x532,0x533,0x534,0x535,0x536,0x537,0x538,0x539,0x53A,0x53B,0x53C,0x53D,0x53E,0x53F,0x540,0x541,0x542,0x543,0x544,0x545,0x546,0x547,0x548,0x549,0x54A,0x54B,0x54C,0x54D,0x54E,0x54F,0x550,0x551,0x552,0x553,0x554,0x555,0x556, + 0x1E00,0x1E02,0x1E04,0x1E06,0x1E08,0x1E0A,0x1E0C,0x1E0E,0x1E10,0x1E12,0x1E14,0x1E16,0x1E18,0x1E1A,0x1E1C,0x1E1E,0x1E20,0x1E22,0x1E24,0x1E26,0x1E28,0x1E2A,0x1E2C,0x1E2E,0x1E30,0x1E32,0x1E34,0x1E36,0x1E38,0x1E3A,0x1E3C,0x1E3E,0x1E40,0x1E42,0x1E44,0x1E46,0x1E48,0x1E4A,0x1E4C,0x1E4E,0x1E50,0x1E52,0x1E54,0x1E56,0x1E58,0x1E5A,0x1E5C,0x1E5E,0x1E60,0x1E62,0x1E64,0x1E66,0x1E68,0x1E6A,0x1E6C,0x1E6E,0x1E70,0x1E72,0x1E74,0x1E76,0x1E78,0x1E7A,0x1E7C,0x1E7E,0x1E80,0x1E82,0x1E84,0x1E86,0x1E88,0x1E8A,0x1E8C,0x1E8E,0x1E90,0x1E92,0x1E94,0x1E96,0x1E98,0x1E9A,0x1E9C,0x1E9E,0x1EA0,0x1EA2,0x1EA4,0x1EA6,0x1EA8,0x1EAA,0x1EAC,0x1EAE,0x1EB0,0x1EB2,0x1EB4,0x1EB6,0x1EB8,0x1EBA,0x1EBC,0x1EBE,0x1EC0,0x1EC2,0x1EC4,0x1EC6,0x1EC8,0x1ECA,0x1ECC,0x1ECE,0x1ED0,0x1ED2,0x1ED4,0x1ED6,0x1ED8,0x1EDA,0x1EDC,0x1EDE,0x1EE0,0x1EE2,0x1EE4,0x1EE6,0x1EE8,0x1EEA,0x1EEC,0x1EEE,0x1EF0,0x1EF2,0x1EF4,0x1EF6,0x1EF8, + 0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,0x2167,0x2168,0x2169,0x216A,0x216B,0x216C,0x216D,0x216E,0x216F, + 0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28,0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30,0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38,0xFF39,0xFF3A + }; + UINT i, n, hi, li; - for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + if (chr < 0x80) { /* ASCII characters (acceleration) */ + if (chr >= 0x61 && chr <= 0x7A) chr -= 0x20; - return tbl_lower[i] ? tbl_upper[i] : chr; + } else { /* Non ASCII characters (table search) */ + n = 12; li = 0; hi = sizeof lower / sizeof lower[0]; + do { + i = li + (hi - li) / 2; + if (chr == lower[i]) break; + if (chr > lower[i]) li = i; else hi = i; + } while (--n); + if (n) chr = upper[i]; + } + + return chr; } + diff --git a/firmware/chibios-portapack/ext/fatfs/src/option/unicode.c b/firmware/chibios-portapack/ext/fatfs/src/option/unicode.c index 22e0320a..170e2e09 100644 --- a/firmware/chibios-portapack/ext/fatfs/src/option/unicode.c +++ b/firmware/chibios-portapack/ext/fatfs/src/option/unicode.c @@ -10,7 +10,7 @@ #include "cc949.c" #elif _CODE_PAGE == 950 /* Traditional Chinese Big5 */ #include "cc950.c" -#else /* Small character-set */ +#else /* Single Byte Character-Set */ #include "ccsbcs.c" #endif diff --git a/firmware/chibios-portapack/ext/fatfs/src/patch1.patch b/firmware/chibios-portapack/ext/fatfs/src/patch1.patch deleted file mode 100644 index 2082b06f..00000000 --- a/firmware/chibios-portapack/ext/fatfs/src/patch1.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- ff_patch1.c Thu Nov 13 21:16:07 2014 -+++ ff_patch1.c Wed Nov 26 19:42:01 2014 -@@ -164,6 +164,9 @@ - - /* Timestamp feature */ --#if _FS_NORTC --#define GET_FATTIME() ((DWORD)_NORTC_YEAR << 25 | (DWORD)_NORTC_MON << 21 | (DWORD)_NORTC_MDAY << 16) -+#if _FS_NORTC == 1 -+#if _NORTC_YEAR < 1980 || _NORTC_YEAR > 2107 || _NORTC_MON < 1 || _NORTC_MON > 12 || _NORTC_MDAY < 1 || _NORTC_MDAY > 31 -+#error Invalid _FS_NORTC settings -+#endif -+#define GET_FATTIME() ((DWORD)(_NORTC_YEAR - 1980) << 25 | (DWORD)_NORTC_MON << 21 | (DWORD)_NORTC_MDAY << 16) - #else - #define GET_FATTIME() get_fattime() diff --git a/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c b/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c index e02accbe..66226413 100644 --- a/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c +++ b/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c @@ -200,8 +200,8 @@ static void sdio_cclk_set_400khz(void) { } static void sdio_cclk_set_fast(void) { - /* 200MHz / (2 * 5) = 20MHz */ - sdio_cclk_set(5); + /* 200MHz / (2 * 4) = 25MHz */ + sdio_cclk_set(4); } static void sdio_width_set_1bit(void) { @@ -241,6 +241,41 @@ static void sdio_dma_interrupts_clear(void) { ; } +static bool_t sdc_llc_prepare_descriptors_chained(LPC_SDMMC_DESC_Type desc[], + const uint32_t desc_count, + const uint8_t* const buffer, + uint32_t byte_count) { + const uint32_t buffer_size = LPC_SDC_SDIO_MAX_DESCRIPTOR_BYTES; + uint32_t p = (uint32_t)buffer; + + for(uint32_t i=0; i buffer_size) ? buffer_size : byte_count; + desc[i].DESC2 = p; //(buffer_1_size == 0) ? 0 : p; + p += buffer_1_size; + byte_count -= buffer_1_size; + + uint32_t buffer_2_size = 0; + desc[i].DESC1 = + (buffer_1_size << 0) + | (buffer_2_size << 13) + ; + + desc[i].DESC3 = (uint32_t)&desc[i+1]; + + const bool_t first_descriptor = (i == 0); + const bool_t last_descriptor = (byte_count == 0); + desc[i].DESC0 = + (last_descriptor ? 0 : (1U << 1)) /* Disable interrupt on completion */ + | (last_descriptor ? (1U << 2) : 0) /* Last descriptor */ + | (first_descriptor ? (1U << 3) : 0) /* First descriptor */ + | (1U << 4) /* ! Second address chained */ + | (1U << 31) /* Descriptor is owned by DMA controller */ + ; + } + + return (byte_count == 0) ? CH_SUCCESS : CH_FAILED; +} + /** * @brief Wait end of data transaction and performs finalizations. * @@ -537,6 +572,8 @@ void sdc_lld_init(void) { void sdc_lld_start(SDCDriver *sdcp) { if (sdcp->state == BLK_STOP) { + LPC_SDMMC->CLKENA = (1U << 16); /* CCLK_LOW_POWER */ + LPC_CCU1->CLK_M4_SDIO_CFG.RUN = 1; LPC_CGU->BASE_SDIO_CLK.PD = 0; @@ -562,18 +599,6 @@ void sdc_lld_start(SDCDriver *sdcp) { ; sdio_cclk_set_400khz(); - // sdio_clkdiv_set(255, 5, 0, 0); - // LPC_SDMMC->CLKDIV = - // (255U << 0) - // | ( 5U << 8) - // | ( 0U << 16) - // | ( 0U << 24) - // ; - // sdio_update_clock_registers_only(); - // LPC_SDMMC->CLKSRC = 0; - // LPC_SDMMC->CLKENA = (1U << 16); /* CCLK_LOW_POWER */ - - // LPC_SDMMC->TMOUT = 0xffffff40U; /* TODO: Choose which interrupts to enable! */ sdio_interrupts_set_mask(0); @@ -808,8 +833,7 @@ bool_t sdc_lld_send_cmd_long_crc(SDCDriver *sdcp, uint8_t cmd, uint32_t arg, bool_t sdc_lld_read_aligned(SDCDriver *sdcp, uint32_t startblk, uint8_t *buf, uint32_t n) { - /* TODO: Documentation suggests max transfer size is 8192, but... */ - chDbgCheck((n <= (4096 / MMCSD_BLOCK_SIZE)), "max transaction size"); + chDbgCheck((n <= (LPC_SDC_SDIO_DESCRIPTOR_COUNT * LPC_SDC_SDIO_MAX_DESCRIPTOR_BYTES / MMCSD_BLOCK_SIZE)), "max transaction size"); /* TODO: Handle SDHC block indexing? */ @@ -820,19 +844,10 @@ bool_t sdc_lld_read_aligned(SDCDriver *sdcp, uint32_t startblk, sdio_reset_dma_and_fifo(); /* Prepares the DMA channel for writing.*/ - LPC_SDMMC_DESC_Type desc; - desc.DESC0 = - (1U << 2) /* Last descriptor */ - | (1U << 3) /* First descriptor */ - | (1U << 4) /* Second address chained */ - | (1U << 31) /* Descriptor is owned by DMA controller */ - ; - desc.DESC1 = - ((n * MMCSD_BLOCK_SIZE) << 0) - | (0U << 13) - ; - desc.DESC2 = (uint32_t)buf; - desc.DESC3 = 0; + LPC_SDMMC_DESC_Type desc[LPC_SDC_SDIO_DESCRIPTOR_COUNT]; + if (sdc_llc_prepare_descriptors_chained(desc, sizeof(desc) / sizeof(desc[0]), buf, n * MMCSD_BLOCK_SIZE) == TRUE) + goto error; + LPC_SDMMC->DBADDR = (uint32_t)&desc; /* DMA is now armed? */ /* Setting up data transfer.*/ @@ -883,8 +898,7 @@ error: bool_t sdc_lld_write_aligned(SDCDriver *sdcp, uint32_t startblk, const uint8_t *buf, uint32_t n) { - /* TODO: Documentation suggests max transfer size is 8192, but... */ - chDbgCheck((n <= (4096 / MMCSD_BLOCK_SIZE)), "max transaction size"); + chDbgCheck((n <= (LPC_SDC_SDIO_DESCRIPTOR_COUNT * LPC_SDC_SDIO_MAX_DESCRIPTOR_BYTES / MMCSD_BLOCK_SIZE)), "max transaction size"); /* Checks for errors and waits for the card to be ready for writing.*/ if (_sdc_wait_for_transfer_state(sdcp)) @@ -893,19 +907,10 @@ bool_t sdc_lld_write_aligned(SDCDriver *sdcp, uint32_t startblk, sdio_reset_dma_and_fifo(); /* Prepares the DMA channel for writing.*/ - LPC_SDMMC_DESC_Type desc; - desc.DESC0 = - (1U << 2) /* Last descriptor */ - | (1U << 3) /* First descriptor */ - | (1U << 4) /* Second address chained */ - | (1U << 31) /* Descriptor is owned by DMA controller */ - ; - desc.DESC1 = - ((n * MMCSD_BLOCK_SIZE) << 0) - | (0U << 13) - ; - desc.DESC2 = (uint32_t)buf; - desc.DESC3 = 0; + LPC_SDMMC_DESC_Type desc[LPC_SDC_SDIO_DESCRIPTOR_COUNT]; + if (sdc_llc_prepare_descriptors_chained(desc, sizeof(desc) / sizeof(desc[0]), buf, n * MMCSD_BLOCK_SIZE) == TRUE) + goto error; + LPC_SDMMC->DBADDR = (uint32_t)&desc; /* DMA is now armed? */ /* Setting up data transfer.*/ diff --git a/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.h b/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.h index 58d3fe93..eae0fc67 100644 --- a/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.h +++ b/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.h @@ -55,6 +55,13 @@ #define LPC_SDC_SDIO_IRQ_PRIORITY 7 #endif +/** + * @brief SDIO read/write descriptor count. + */ +#if !defined(LPC_SDC_SDIO_DESCRIPTOR_COUNT) || defined(__DOXYGEN__) +#define LPC_SDC_SDIO_DESCRIPTOR_COUNT 4 +#endif + /** @} */ /*===========================================================================*/ @@ -178,6 +185,8 @@ struct SDCDriver { #define MMCSD_R1_IS_CARD_LOCKED(r1) (((r1) >> 21) & 1) /** @} */ +#define LPC_SDC_SDIO_MAX_DESCRIPTOR_BYTES 0x1000 + /*===========================================================================*/ /* External declarations. */ /*===========================================================================*/ diff --git a/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M4/vectors.c b/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M4/vectors.c index 15881fec..7561b377 100755 --- a/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M4/vectors.c +++ b/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M4/vectors.c @@ -178,9 +178,12 @@ vectors_t _vectors = { __attribute__ ((naked)) #endif void _unhandled_exception(void) { - +#if CH_DBG_ENABLED + chDbgPanic("Unhandled"); +#else while (TRUE) ; +#endif } void NMIVector(void) __attribute__((weak, alias("_unhandled_exception"))); diff --git a/firmware/common/ais_packet.cpp b/firmware/common/ais_packet.cpp index 53159ff2..61fabd89 100644 --- a/firmware/common/ais_packet.cpp +++ b/firmware/common/ais_packet.cpp @@ -185,7 +185,7 @@ Longitude Packet::longitude(const size_t start_bit) const { bool Packet::crc_ok() const { CRCReader field_crc { packet_ }; - CRC ais_fcs { 0x1021, 0xffff, 0xffff }; + CRC<16> ais_fcs { 0x1021, 0xffff, 0xffff }; for(size_t i=0; i + #include void* operator new(size_t size) { @@ -38,3 +40,21 @@ void operator delete(void* p) noexcept { void operator delete[](void* p) noexcept { chHeapFree(p); } + +extern uint8_t __heap_base__[]; +extern uint8_t __heap_end__[]; + +namespace chibios { + +size_t heap_size() { + return __heap_end__ - __heap_base__; +} + +size_t heap_used() { + const auto core_free = chCoreStatus(); + size_t heap_free = 0; + chHeapStatus(NULL, &heap_free); + return heap_size() - (core_free + heap_free); +} + +} /* namespace chibios */ diff --git a/firmware/common/chibios_cpp.hpp b/firmware/common/chibios_cpp.hpp index dd423777..5cb4af2e 100644 --- a/firmware/common/chibios_cpp.hpp +++ b/firmware/common/chibios_cpp.hpp @@ -31,4 +31,11 @@ void* operator new[](size_t size); void operator delete(void* p); void operator delete[](void* p); +namespace chibios { + +size_t heap_size(); +size_t heap_used(); + +} /* namespace chibios */ + #endif/*__CHIBIOS_CPP_H__*/ diff --git a/firmware/common/cpu_clock.cpp b/firmware/common/cpu_clock.cpp deleted file mode 100644 index 78ccadd7..00000000 --- a/firmware/common/cpu_clock.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * 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 2, 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; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "cpu_clock.hpp" - -#include -#include - -#include "lpc43xx_cpp.hpp" -using namespace lpc43xx; - -constexpr uint32_t systick_count(const uint32_t clock_source_f) { - return clock_source_f / CH_FREQUENCY; -} - -constexpr uint32_t systick_load(const uint32_t clock_source_f) { - return systick_count(clock_source_f) - 1; -} - -constexpr auto systick_count_irc = systick_load(clock_source_irc_f); -constexpr auto systick_count_pll1 = systick_load(clock_source_pll1_f); -constexpr auto systick_count_pll1_step = systick_load(clock_source_pll1_step_f); - -static void set_clock(LPC_CGU_BASE_CLK_Type& clk, const cgu::CLK_SEL clock_source) { - clk.AUTOBLOCK = 1; - clk.CLK_SEL = toUType(clock_source); -} - -void cpu_clock_irc() { - /* Set M4 clock to safe default speed (~12MHz IRC) */ - set_clock(LPC_CGU->BASE_M4_CLK, cgu::CLK_SEL::IRC); - systick_adjust_period(systick_count_irc); - halLPCSetSystemClock(clock_source_irc_f); -} - -void cpu_xtal_start() { - LPC_CGU->XTAL_OSC_CTRL.BYPASS = 0; - LPC_CGU->XTAL_OSC_CTRL.HF = 0; - LPC_CGU->XTAL_OSC_CTRL.ENABLE = 0; - halPolledDelay(US2RTT(250)); -} - -void cpu_clock_max_speed() { - /* Incantation from LPC43xx UM10503 section 12.2.1.1, to bring the M4 - * core clock speed to the 110 - 204MHz range. - */ - cpu_clock_irc(); - - cpu_xtal_start(); - - /* Step into the 90-110MHz M4 clock range */ - cgu::pll1::ctrl({ - .pd = 0, - .bypass = 0, - .fbsel = 0, - .direct = 0, - .psel = 0, - .autoblock = 1, - .nsel = 0, - .msel = 16, - .clk_sel = cgu::CLK_SEL::XTAL, - }); - while( !cgu::pll1::is_locked() ); - - /* Switch M4 clock to PLL1 running at intermediate rate */ - set_clock(LPC_CGU->BASE_M4_CLK, cgu::CLK_SEL::PLL1); - systick_adjust_period(systick_count_pll1_step); - halLPCSetSystemClock(clock_source_pll1_step_f); - - /* Delay >50us at 90-110MHz clock speed */ - halPolledDelay(US2RTT(50)); - - /* Remove /2P divider from PLL1 output to achieve full speed */ - cgu::pll1::direct(); - systick_adjust_period(systick_count_pll1); - halLPCSetSystemClock(clock_source_pll1_f); -} - -void cpu_start_audio_pll() { - cgu::pll0audio::ctrl({ - .pd = 1, - .bypass = 0, - .directi = 0, - .directo = 0, - .clken = 0, - .frm = 0, - .autoblock = 1, - .pllfract_req = 1, - .sel_ext = 0, - .mod_pd = 0, - .clk_sel = cgu::CLK_SEL::XTAL, - }); - - /* For 12MHz clock source, 48kHz audio rate, 256Fs MCLK: - * Fout=12.288MHz, Fcco=417.792MHz - * PDEC=3, NDEC=1, PLLFRACT=0x1a1cac - */ - cgu::pll0audio::mdiv({ - .mdec = 0x5B6A, - }); - cgu::pll0audio::np_div({ - .pdec = 3, - .ndec = 1, - }); - - cgu::pll0audio::frac({ - .pllfract_ctrl = 0x1a1cac, - }); - - cgu::pll0audio::power_up(); - while( !cgu::pll0audio::is_locked() ); - cgu::pll0audio::clock_enable(); - - set_clock(LPC_CGU->BASE_AUDIO_CLK, cgu::CLK_SEL::PLL0AUDIO); -} diff --git a/firmware/common/crc.hpp b/firmware/common/crc.hpp index ab10455d..cc56597c 100644 --- a/firmware/common/crc.hpp +++ b/firmware/common/crc.hpp @@ -24,21 +24,31 @@ #include #include +#include +#include /* Inspired by * http://www.barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code * - * ...then munged into a shape resembling boost::crc_basic. + * ...then munged into a simplified implementation of boost::crc_basic and + * boost::crc_optimal. * http://www.boost.org/doc/libs/release/libs/crc/ + * + * Copyright 2001, 2004 Daryle Walker. Use, modification, and distribution are + * subject to the Boost Software License, Version 1.0. (See accompanying file + * LICENSE_1_0.txt or a copy at .) + * */ -template +template class CRC { public: + using value_type = uint32_t; + constexpr CRC( - const T truncated_polynomial, - const T initial_remainder = 0, - const T final_xor_value = 0 + const value_type truncated_polynomial, + const value_type initial_remainder = 0, + const value_type final_xor_value = 0 ) : truncated_polynomial { truncated_polynomial }, initial_remainder { initial_remainder }, final_xor_value { final_xor_value }, @@ -46,11 +56,11 @@ public: { } - T get_initial_remainder() const { + value_type get_initial_remainder() const { return initial_remainder; } - void reset(T new_initial_remainder) { + void reset(value_type new_initial_remainder) { remainder = new_initial_remainder; } @@ -59,49 +69,123 @@ public: } void process_bit(bool bit) { - remainder ^= bit << (width() - 1); - if( remainder & top_bit() ) { - remainder = (remainder << 1) ^ truncated_polynomial; + remainder ^= (bit ? top_bit() : 0U); + const auto do_poly_div = static_cast(remainder & top_bit()); + remainder <<= 1; + if( do_poly_div ) { + remainder ^= truncated_polynomial; + } + } + + void process_bits(value_type bits, size_t bit_count) { + constexpr auto digits = std::numeric_limits::digits; + constexpr auto mask = static_cast(1) << (digits - 1); + + bits <<= (std::numeric_limits::digits - bit_count); + for(size_t i=bit_count; i>0; --i, bits <<= 1) { + process_bit(static_cast(bits & mask)); + } + } + + void process_bits_lsb_first(value_type bits, size_t bit_count) { + for(size_t i=bit_count; i>0; --i, bits >>= 1) { + process_bit(static_cast(bits & 0x01)); + } + } + + void process_byte(const uint8_t byte) { + if( RevIn ) { + process_bits_lsb_first(byte, 8); } else { - remainder = (remainder << 1); + process_bits(byte, 8); } } - void process_byte(const uint8_t data) { - remainder ^= data << (width() - 8); - for(size_t bit=0; bit<8; bit++) { - if( remainder & top_bit() ) { - remainder = (remainder << 1) ^ truncated_polynomial; - } else { - remainder = (remainder << 1); - } - } - } - - void process_bytes(const uint8_t* const data, const size_t length) { + void process_bytes(const void* const data, const size_t length) { + const uint8_t* const p = reinterpret_cast(data); for(size_t i=0; i + void process_bytes(const std::array& data) { + process_bytes(data.data(), data.size()); + } + + value_type checksum() const { + return ((RevOut ? reflect(remainder) : remainder) ^ final_xor_value) & mask(); } private: - const T truncated_polynomial; - const T initial_remainder; - const T final_xor_value; - T remainder; + const value_type truncated_polynomial; + const value_type initial_remainder; + const value_type final_xor_value; + value_type remainder; static constexpr size_t width() { - return 8 * sizeof(T); + return Width; } - static constexpr T top_bit() { + static constexpr value_type top_bit() { return 1U << (width() - 1); } + + static constexpr value_type mask() { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wshift-count-overflow" + return (~(~(0UL) << width())); +#pragma GCC diagnostic pop + } + + static value_type reflect(value_type x) { + value_type reflection = 0; + for(size_t i=0; i>= 1; + } + return reflection; + } }; +class Adler32 { +public: + void feed(const uint8_t v) { + feed_one(v); + } + + void feed(const void* const data, const size_t n) { + const uint8_t* const p = reinterpret_cast(data); + for(size_t i=0; i + void feed(const T& a) { + feed(a.data(), sizeof(T)); + } + + std::array bytes() const { + return { + static_cast((b >> 8) & 0xff), + static_cast((b >> 0) & 0xff), + static_cast((a >> 8) & 0xff), + static_cast((a >> 0) & 0xff) + }; + } + +private: + static constexpr uint32_t mod = 65521; + + uint32_t a { 1 }; + uint32_t b { 0 }; + + void feed_one(const uint8_t c) { + a = (a + c) % mod; + b = (b + a) % mod; + } +}; #endif/*__CRC_H__*/ diff --git a/firmware/common/debug.cpp b/firmware/common/debug.cpp index 5ae27f7a..886abeaf 100644 --- a/firmware/common/debug.cpp +++ b/firmware/common/debug.cpp @@ -81,18 +81,27 @@ void port_halt(void) { #if defined(LPC43XX_M4) CH_IRQ_HANDLER(MemManageVector) { - CH_IRQ_PROLOGUE(); +#if CH_DBG_ENABLED + chDbgPanic("MemManage"); +#else chSysHalt(); +#endif } CH_IRQ_HANDLER(BusFaultVector) { - CH_IRQ_PROLOGUE(); +#if CH_DBG_ENABLED + chDbgPanic("BusFault"); +#else chSysHalt(); +#endif } CH_IRQ_HANDLER(UsageFaultVector) { - CH_IRQ_PROLOGUE(); +#if CH_DBG_ENABLED + chDbgPanic("UsageFault"); +#else chSysHalt(); +#endif } #endif diff --git a/firmware/common/dsp_fft.hpp b/firmware/common/dsp_fft.hpp index a360721a..65dd8098 100644 --- a/firmware/common/dsp_fft.hpp +++ b/firmware/common/dsp_fft.hpp @@ -32,6 +32,7 @@ #include "dsp_types.hpp" #include "complex.hpp" #include "hal.h" +#include "utility.hpp" namespace std { /* https://github.com/AE9RB/fftbench/blob/master/cxlr.hpp @@ -47,14 +48,6 @@ namespace std { } } /* namespace std */ -constexpr bool power_of_two(const size_t n) { - return (n & (n - 1)) == 0; -} - -constexpr size_t log_2(const size_t n, const size_t p = 0) { - return (n <= 1) ? p : log_2(n / 2, p + 1); -} - template void fft_swap(const buffer_c16_t src, std::array& dst) { static_assert(power_of_two(N), "only defined for N == power of two"); diff --git a/firmware/common/dsp_fir_taps.hpp b/firmware/common/dsp_fir_taps.hpp index 535809b8..2eb13b69 100644 --- a/firmware/common/dsp_fir_taps.hpp +++ b/firmware/common/dsp_fir_taps.hpp @@ -313,4 +313,27 @@ constexpr fir_taps_real<64> taps_64_lp_156_198 { } }, }; +// TPMS decimation filters //////////////////////////////////////////////// + +// IFIR image-reject filter: fs=2457600, pass=100000, stop=407200, decim=4, fout=614400 +static constexpr fir_taps_real<24> taps_200k_decim_0 = { + .pass_frequency_normalized = 100000.0f / 2457600.0f, + .stop_frequency_normalized = 407200.0f / 2457600.0f, + .taps = { { + 90, 94, 4, -240, -570, -776, -563, 309, + 1861, 3808, 5618, 6710, 6710, 5618, 3808, 1861, + 309, -563, -776, -570, -240, 4, 94, 90, + } }, +}; + +// IFIR prototype filter: fs=614400, pass=100000, stop=207200, decim=2, fout=307200 +static constexpr fir_taps_real<16> taps_200k_decim_1 = { + .pass_frequency_normalized = 100000.0f / 614400.0f, + .stop_frequency_normalized = 207200.0f / 614400.0f, + .taps = { { + -132, -256, 545, 834, -1507, -2401, 4666, 14583, + 14583, 4666, -2401, -1507, 834, 545, -256, -132, + } }, +}; + #endif/*__DSP_FIR_TAPS_H__*/ diff --git a/firmware/common/ert_packet.cpp b/firmware/common/ert_packet.cpp index da2a6124..3fcf0ede 100644 --- a/firmware/common/ert_packet.cpp +++ b/firmware/common/ert_packet.cpp @@ -63,6 +63,16 @@ Consumption Packet::consumption() const { return invalid_consumption; } +CommodityType Packet::commodity_type() const { + if( type() == Type::SCM ) { + return reader_.read(5, 4); + } + if( type() == Type::IDM ) { + return reader_.read(4 * 8 + 4, 4); + } + return invalid_commodity_type; +} + ManchesterFormatted Packet::symbols_formatted() const { return format_manchester(decoder_); } @@ -76,7 +86,7 @@ bool Packet::crc_ok() const { } bool Packet::crc_ok_scm() const { - CRC ert_bch { 0x6f63 }; + CRC<16> ert_bch { 0x6f63 }; size_t start_bit = 5; ert_bch.process_byte(reader_.read(0, start_bit)); for(size_t i=start_bit; i ert_crc_ccitt { 0x1021, 0xffff, 0x1d0f }; + CRC<16> ert_crc_ccitt { 0x1021, 0xffff, 0x1d0f }; for(size_t i=0; i #include #include +#include #include /* FIFO implementation inspired by Linux kfifo. */ -template +template class FIFO { public: constexpr FIFO( - ) : _in { 0 }, + T* data, + size_t k + ) : _data { data }, + _size { 1U << k }, + _in { 0 }, _out { 0 } { } @@ -150,15 +156,15 @@ public: } private: - static constexpr size_t size() { - return (1UL << K); + size_t size() const { + return _size; } static constexpr size_t esize() { return sizeof(T); } - static constexpr size_t mask() { + size_t mask() const { return size() - 1; } @@ -224,7 +230,8 @@ private: return buf_len; } - T _data[size()]; + T* const _data; + const size_t _size; volatile size_t _in; volatile size_t _out; }; diff --git a/firmware/common/lcd_ili9341.cpp b/firmware/common/lcd_ili9341.cpp index 35167557..5fa4f7c7 100644 --- a/firmware/common/lcd_ili9341.cpp +++ b/firmware/common/lcd_ili9341.cpp @@ -181,6 +181,11 @@ void lcd_ramwr_start() { io.lcd_data_write_command_and_data(0x2c, {}); } +void lcd_ramrd_start() { + io.lcd_data_write_command_and_data(0x2e, {}); + io.lcd_read_word(); +} + void lcd_caset(const uint_fast16_t start_column, uint_fast16_t end_column) { lcd_set(0x2a, start_column, end_column); } @@ -198,12 +203,27 @@ void lcd_start_ram_write( lcd_ramwr_start(); } +void lcd_start_ram_read( + const ui::Point p, + const ui::Size s +) { + lcd_caset(p.x, p.x + s.w - 1); + lcd_paset(p.y, p.y + s.h - 1); + lcd_ramrd_start(); +} + void lcd_start_ram_write( const ui::Rect& r ) { lcd_start_ram_write(r.pos, r.size); } +void lcd_start_ram_read( + const ui::Rect& r +) { + lcd_start_ram_read(r.pos, r.size); +} + void lcd_vertical_scrolling_definition( const uint_fast16_t top_fixed_area, const uint_fast16_t vertical_scrolling_area, @@ -394,6 +414,19 @@ void ILI9341::draw_pixels( io.lcd_write_pixels(colors, count); } +void ILI9341::read_pixels( + const ui::Rect r, + ui::ColorRGB888* const colors, + const size_t count +) { + /* TODO: Assert that rectangle width x height < count */ + lcd_start_ram_read(r); + io.lcd_read_bytes( + reinterpret_cast(colors), + count * sizeof(ui::ColorRGB888) + ); +} + void ILI9341::draw_bitmap( const ui::Point p, const ui::Size size, diff --git a/firmware/common/lcd_ili9341.hpp b/firmware/common/lcd_ili9341.hpp index 0f735a0d..14957d6f 100644 --- a/firmware/common/lcd_ili9341.hpp +++ b/firmware/common/lcd_ili9341.hpp @@ -69,6 +69,14 @@ public: draw_pixels(r, colors.data(), colors.size()); } + template + void read_pixels( + const ui::Rect r, + std::array& colors + ) { + read_pixels(r, colors.data(), colors.size()); + } + void draw_bitmap( const ui::Point p, const ui::Size size, @@ -105,6 +113,7 @@ private: scroll_t scroll_state; void draw_pixels(const ui::Rect r, const ui::Color* const colors, const size_t count); + void read_pixels(const ui::Rect r, ui::ColorRGB888* const colors, const size_t count); }; } /* namespace lcd */ diff --git a/firmware/common/lfsr_random.cpp b/firmware/common/lfsr_random.cpp new file mode 100644 index 00000000..ddeb044a --- /dev/null +++ b/firmware/common/lfsr_random.cpp @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "lfsr_random.hpp" + +static void lfsr_iterate_internal(lfsr_word_t& v) +{ + /* + Generated with lfsr-generator: + http://lfsr-generator.sourceforge.net + ============================================= + config : fibonacci + length : 31 + taps : (31, 18) + shift-amounts : (12, 12, 8) + shift-direction : left + */ + enum { + length = 31, + tap_0 = 31, + tap_1 = 18, + shift_amount_0 = 12, + shift_amount_1 = 12, + shift_amount_2 = 8 + }; + + const lfsr_word_t zero = 0; + v = ( + ( + v << shift_amount_0 + ) | ( + ( + (v >> (tap_0 - shift_amount_0)) ^ + (v >> (tap_1 - shift_amount_0)) + ) & ( + ~(~zero << shift_amount_0) + ) + ) + ); + v = ( + ( + v << shift_amount_1 + ) | ( + ( + (v >> (tap_0 - shift_amount_1)) ^ + (v >> (tap_1 - shift_amount_1)) + ) & ( + ~(~zero << shift_amount_1) + ) + ) + ); + v = ( + ( + v << shift_amount_2 + ) | ( + ( + (v >> (tap_0 - shift_amount_2)) ^ + (v >> (tap_1 - shift_amount_2)) + ) & ( + ~(~zero << shift_amount_2) + ) + ) + ); +} + +lfsr_word_t lfsr_iterate(lfsr_word_t v) { + lfsr_iterate_internal(v); + return v; +} + +void lfsr_fill(lfsr_word_t& v, lfsr_word_t* buffer, size_t word_count) { + while( word_count != 0 ) { + lfsr_iterate_internal(v); + *(buffer++) = v; + word_count--; + } +} + +bool lfsr_compare(lfsr_word_t& v, const lfsr_word_t* buffer, size_t word_count) { + while( word_count != 0 ) { + lfsr_iterate_internal(v); + if( *(buffer++) != v ) { + return false; + } + word_count--; + } + return true; +} diff --git a/firmware/common/cpu_clock.hpp b/firmware/common/lfsr_random.hpp similarity index 71% rename from firmware/common/cpu_clock.hpp rename to firmware/common/lfsr_random.hpp index 28909159..0eaadc19 100644 --- a/firmware/common/cpu_clock.hpp +++ b/firmware/common/lfsr_random.hpp @@ -19,17 +19,16 @@ * Boston, MA 02110-1301, USA. */ -#ifndef __CPU_CLOCK_H__ -#define __CPU_CLOCK_H__ +#ifndef __LFSR_RANDOM_HPP__ +#define __LFSR_RANDOM_HPP__ #include +#include -constexpr uint32_t clock_source_irc_f = 12000000; -constexpr uint32_t clock_source_gp_clkin = 20000000; -constexpr uint32_t clock_source_pll1_step_f = 100000000; -constexpr uint32_t clock_source_pll1_f = 200000000; +using lfsr_word_t = uint32_t; -void cpu_clock_max_speed(); -void cpu_start_audio_pll(); +lfsr_word_t lfsr_iterate(lfsr_word_t v); +void lfsr_fill(lfsr_word_t& v, lfsr_word_t* buffer, size_t word_count); +bool lfsr_compare(lfsr_word_t& v, const lfsr_word_t* buffer, size_t word_count); -#endif/*__CPU_CLOCK_H__*/ +#endif/*__LFSR_RANDOM_HPP__*/ diff --git a/firmware/common/memory_map.hpp b/firmware/common/memory_map.hpp index 6f4eae1e..8b32a0cd 100644 --- a/firmware/common/memory_map.hpp +++ b/firmware/common/memory_map.hpp @@ -69,6 +69,8 @@ constexpr region_t ahb_ram_0 { 0x20000000, 32_KiB }; constexpr region_t ahb_ram_1 { 0x20008000, 16_KiB }; constexpr region_t ahb_ram_2 { 0x2000c000, 16_KiB }; +constexpr region_t backup_ram { LPC_BACKUP_REG_BASE, 256 }; + constexpr region_t spifi_uncached { LPC_SPIFI_DATA_BASE, 1_MiB }; constexpr region_t spifi_cached { LPC_SPIFI_DATA_CACHED_BASE, spifi_uncached.size() }; diff --git a/firmware/common/message.hpp b/firmware/common/message.hpp index d3506948..1f2c7b67 100644 --- a/firmware/common/message.hpp +++ b/firmware/common/message.hpp @@ -29,6 +29,7 @@ #include "baseband_packet.hpp" #include "ert_packet.hpp" +#include "tpms_packet.hpp" #include "dsp_fir_taps.hpp" #include "dsp_iir.hpp" #include "fifo.hpp" @@ -251,10 +252,12 @@ struct ChannelSpectrum { uint32_t channel_filter_stop_frequency { 0 }; }; -using ChannelSpectrumFIFO = FIFO; +using ChannelSpectrumFIFO = FIFO; class ChannelSpectrumConfigMessage : public Message { public: + static constexpr size_t fifo_k = 2; + constexpr ChannelSpectrumConfigMessage( ChannelSpectrumFIFO* fifo ) : Message { ID::ChannelSpectrumConfig }, @@ -280,12 +283,15 @@ public: class TPMSPacketMessage : public Message { public: constexpr TPMSPacketMessage( + const tpms::SignalType signal_type, const baseband::Packet& packet ) : Message { ID::TPMSPacket }, + signal_type { signal_type }, packet { packet } { } + tpms::SignalType signal_type; baseband::Packet packet; }; diff --git a/firmware/common/message_queue.hpp b/firmware/common/message_queue.hpp index c4430a23..76404be0 100644 --- a/firmware/common/message_queue.hpp +++ b/firmware/common/message_queue.hpp @@ -32,10 +32,17 @@ using namespace lpc43xx; #include -template class MessageQueue { public: - MessageQueue() { + MessageQueue() = delete; + MessageQueue(const MessageQueue&) = delete; + MessageQueue(MessageQueue&&) = delete; + + MessageQueue( + uint8_t* const data, + size_t k + ) : fifo { data, k } + { chMtxInit(&mutex_write); } @@ -57,6 +64,19 @@ public: return result; } + template + void handle(HandlerFn handler) { + std::array message_buffer; + while(Message* const message = peek(message_buffer)) { + handler(message); + skip(); + } + } + +private: + FIFO fifo; + Mutex mutex_write; + Message* peek(std::array& buf) { Message* const p = reinterpret_cast(buf.data()); return fifo.peek_r(buf.data(), buf.size()) ? p : nullptr; @@ -79,10 +99,6 @@ public: return fifo.is_empty(); } -private: - FIFO fifo; - Mutex mutex_write; - bool push(const void* const buf, const size_t len) { chMtxLock(&mutex_write); const auto result = fifo.in_r(buf, len); diff --git a/firmware/common/png_writer.cpp b/firmware/common/png_writer.cpp new file mode 100644 index 00000000..15e1b8aa --- /dev/null +++ b/firmware/common/png_writer.cpp @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "png_writer.hpp" + +static constexpr std::array png_file_header { { + 0x89, 0x50, 0x4e, 0x47, + 0x0d, 0x0a, 0x1a, 0x0a, +} }; + +static constexpr std::array png_ihdr_screen_capture { { + 0x00, 0x00, 0x00, 0x0d, // IHDR length + 0x49, 0x48, 0x44, 0x52, // IHDR type + 0x00, 0x00, 0x00, 0xf0, // width = 240 + 0x00, 0x00, 0x01, 0x40, // height = 320 + 0x08, // bit_depth = 8 + 0x02, // color_type = 2 + 0x00, // compression_method = 0 + 0x00, // filter_method = 0 + 0x00, // interlace_method = 0 + 0x0d, 0x8a, 0x66, 0x04, // CRC +} }; + +static constexpr std::array png_idat_chunk_type { { + 0x49, 0x44, 0x41, 0x54, // IDAT type +} }; + +static constexpr std::array png_iend { { + 0x00, 0x00, 0x00, 0x00, // IEND length + 0x49, 0x45, 0x4e, 0x44, // IEND type + 0xae, 0x42, 0x60, 0x82, // CRC +} }; + +PNGWriter::PNGWriter( + const std::string& filename +) +{ + file.open_for_writing(filename); + file.write(png_file_header); + file.write(png_ihdr_screen_capture); + + write_chunk_header( + 2 + height * (5 + 1 + width * 3) + 4, + png_idat_chunk_type + ); + + constexpr std::array zlib_header { 0x78, 0x01 }; // Zlib CM, CINFO, FLG. + write_chunk_content(zlib_header); +} + +PNGWriter::~PNGWriter() { + write_chunk_content(adler_32.bytes()); + write_chunk_crc(); + + file.write(png_iend); +} + +void PNGWriter::write_scanline(const std::array& scanline) { + constexpr uint8_t scanline_filter_type = 0; + constexpr uint32_t deflate_block_length = 1 + sizeof(scanline); + + const std::array deflate_and_scanline_header { + static_cast((scanline_count == (height - 1)) ? 0x01 : 0x00), // DEFLATE header bits, bfinal=0, btype=00 + static_cast((deflate_block_length >> 0) & 0xff), // Length LSB + static_cast((deflate_block_length >> 8) & 0xff), // Length MSB + static_cast((deflate_block_length >> 0) & 0xff) ^ 0xff, // ~Length LSB + static_cast((deflate_block_length >> 8) & 0xff) ^ 0xff, // ~Length MSB + scanline_filter_type, + }; + write_chunk_content(deflate_and_scanline_header); + + adler_32.feed(scanline_filter_type); + adler_32.feed(scanline); + + // Small writes to avoid some sort of large-transfer plus block + // boundary FatFs or SDC driver bug? + write_chunk_content(&scanline[ 0], 80 * sizeof(ui::ColorRGB888)); + write_chunk_content(&scanline[ 80], 80 * sizeof(ui::ColorRGB888)); + write_chunk_content(&scanline[160], 80 * sizeof(ui::ColorRGB888)); + + scanline_count++; +} + +void PNGWriter::write_chunk_header( + const size_t length, + const std::array& type +) { + write_uint32_be(length); + crc.reset(); + write_chunk_content(type); +} + +void PNGWriter::write_chunk_content(const void* const p, const size_t count) { + file.write(p, count); + crc.process_bytes(p, count); +} + +void PNGWriter::write_chunk_crc() { + write_uint32_be(crc.checksum()); +} + +void PNGWriter::write_uint32_be(const uint32_t v) { + file.write(std::array { { + static_cast((v >> 24) & 0xff), + static_cast((v >> 16) & 0xff), + static_cast((v >> 8) & 0xff), + static_cast((v >> 0) & 0xff), + } }); +} diff --git a/firmware/common/png_writer.hpp b/firmware/common/png_writer.hpp new file mode 100644 index 00000000..90fc2086 --- /dev/null +++ b/firmware/common/png_writer.hpp @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __PNG_WRITER_H__ +#define __PNG_WRITER_H__ + +#include +#include +#include +#include + +#include "ui.hpp" +#include "file.hpp" +#include "crc.hpp" + +class PNGWriter { +public: + explicit PNGWriter(const std::string& filename); + ~PNGWriter(); + + void write_scanline(const std::array& scanline); + +private: + // TODO: These constants are baked in a few places, do not change blithely. + static constexpr int width { 240 }; + static constexpr int height { 320 }; + + File file; + int scanline_count { 0 }; + CRC<32, true, true> crc { 0x04c11db7, 0xffffffff, 0xffffffff }; + Adler32 adler_32; + + void write_chunk_header(const size_t length, const std::array& type); + void write_chunk_content(const void* const p, const size_t count); + + template + void write_chunk_content(const std::array& data) { + write_chunk_content(data.data(), sizeof(data)); + } + + void write_chunk_crc(); + void write_uint32_be(const uint32_t v); +}; + +#endif/*__PNG_WRITER_H__*/ diff --git a/firmware/common/portapack_hal.hpp b/firmware/common/portapack_hal.hpp index ccf88656..00098f23 100644 --- a/firmware/common/portapack_hal.hpp +++ b/firmware/common/portapack_hal.hpp @@ -56,10 +56,6 @@ constexpr GPIO gpio_cpld_tdo = gpio[GPIO1_8]; // P1_5 constexpr GPIO gpio_cpld_tck = gpio[GPIO3_0]; // P6_1 constexpr GPIO gpio_cpld_tdi = gpio[GPIO3_1]; // P6_2 -/* I2C0 */ - -constexpr uint8_t wm8731_i2c_address = 0x1a; - } /* namespace portapack */ #endif/*__PORTAPACK_HAL_H__*/ diff --git a/firmware/common/portapack_io.hpp b/firmware/common/portapack_io.hpp index 8f941cc6..7ec86841 100644 --- a/firmware/common/portapack_io.hpp +++ b/firmware/common/portapack_io.hpp @@ -139,13 +139,7 @@ public: uint32_t lcd_read_word() { return lcd_read_data_frame_memory(); } -/* - // NOTE: Pixels read in RGB24 format, not the RGB565 format used - // to write pixels to frame memory. This makes reading very tricky! - ui::Color lcd_read_pixel() { - return ui::Color { lcd_read_data_frame_memory() }; - } -*/ + void lcd_write_pixels(const ui::Color pixel, size_t n) { while(n--) { lcd_write_data_fast(pixel.v); @@ -158,6 +152,20 @@ public: } } + void lcd_read_bytes(uint8_t* byte, size_t byte_count) { + size_t word_count = byte_count / 2; + while(word_count) { + const auto word = lcd_read_data_frame_memory(); + *(byte++) = word >> 8; + *(byte++) = word >> 0; + word_count--; + } + if( byte_count & 1 ) { + const auto word = lcd_read_data_frame_memory(); + *(byte++) = word >> 8; + } + } + uint32_t io_read() { io_stb_assert(); dir_read(); diff --git a/firmware/common/portapack_persistent_memory.cpp b/firmware/common/portapack_persistent_memory.cpp index 6fd4d7ec..88f55dea 100644 --- a/firmware/common/portapack_persistent_memory.cpp +++ b/firmware/common/portapack_persistent_memory.cpp @@ -21,10 +21,15 @@ #include "portapack_persistent_memory.hpp" +#include "portapack.hpp" + #include "hal.h" #include "utility.hpp" +#include "memory_map.hpp" +using portapack::memory::map::backup_ram; + #include #include @@ -70,9 +75,9 @@ struct data_t { int32_t ui_config; }; -static_assert(sizeof(data_t) <= 0x100, "Persistent memory structure too large for VBAT-maintained region"); +static_assert(sizeof(data_t) <= backup_ram.size(), "Persistent memory structure too large for VBAT-maintained region"); -static data_t* const data = reinterpret_cast(LPC_BACKUP_REG_BASE); +static data_t* const data = reinterpret_cast(backup_ram.base()); rf::Frequency tuned_frequency() { rf::tuning_range.reset_if_outside(data->tuned_frequency, tuned_frequency_reset_value); @@ -89,7 +94,9 @@ ppb_t correction_ppb() { } void set_correction_ppb(const ppb_t new_value) { - data->correction_ppb = ppb_range.clip(new_value); + const auto clipped_value = ppb_range.clip(new_value); + data->correction_ppb = clipped_value; + portapack::clock_manager.set_reference_ppb(clipped_value); } int32_t afsk_mark_freq() { diff --git a/firmware/common/portapack_shared_memory.hpp b/firmware/common/portapack_shared_memory.hpp index 5361ea60..266b9493 100644 --- a/firmware/common/portapack_shared_memory.hpp +++ b/firmware/common/portapack_shared_memory.hpp @@ -23,6 +23,7 @@ #define __PORTAPACK_SHARED_MEMORY_H__ #include +#include #include "message_queue.hpp" @@ -39,8 +40,14 @@ struct JammerRange { /* NOTE: These structures must be located in the same location in both M4 and M0 binaries */ struct SharedMemory { - MessageQueue<12> baseband_queue; - MessageQueue<11> application_queue; + static constexpr size_t baseband_queue_k = 12; + static constexpr size_t application_queue_k = 11; + + MessageQueue baseband_queue; + uint8_t baseband_queue_data[1 << baseband_queue_k]; + MessageQueue application_queue; + uint8_t application_queue_data[1 << application_queue_k]; + void* FIFO_HACK; // TODO: M0 should directly configure and control DMA channel that is // acquiring ADC samples. @@ -66,11 +73,4 @@ struct SharedMemory { extern SharedMemory& shared_memory; -#if defined(LPC43XX_M0) -inline void init_message_queues() { - new (&shared_memory.baseband_queue) MessageQueue<12>(); - new (&shared_memory.application_queue) MessageQueue<11>(); -} -#endif - #endif/*__PORTAPACK_SHARED_MEMORY_H__*/ diff --git a/firmware/common/thread_wait.cpp b/firmware/common/thread_wait.cpp new file mode 100644 index 00000000..dd3aac27 --- /dev/null +++ b/firmware/common/thread_wait.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "thread_wait.hpp" + +int ThreadWait::sleep() { + chSysLock(); + thread_to_wake = chThdSelf(); + chSchGoSleepS(THD_STATE_SUSPENDED); + const auto result = chThdSelf()->p_u.rdymsg; + chSysUnlock(); + return result; +} + +bool ThreadWait::wake_from_interrupt(const int value) { + if( thread_to_wake ) { + thread_to_wake->p_u.rdymsg = value; + chSchReadyI(thread_to_wake); + thread_to_wake = nullptr; + return true; + } else { + return false; + } +} diff --git a/firmware/common/thread_wait.hpp b/firmware/common/thread_wait.hpp new file mode 100644 index 00000000..9380dc43 --- /dev/null +++ b/firmware/common/thread_wait.hpp @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __THREAD_WAIT_H__ +#define __THREAD_WAIT_H__ + +#include + +class ThreadWait { +public: + int sleep(); + bool wake_from_interrupt(const int value); + +private: + Thread* thread_to_wake { nullptr }; +}; + +#endif/*__THREAD_WAIT_H__*/ diff --git a/firmware/common/tpms_packet.cpp b/firmware/common/tpms_packet.cpp new file mode 100644 index 00000000..7b18622b --- /dev/null +++ b/firmware/common/tpms_packet.cpp @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * 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 2, 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; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "tpms_packet.hpp" + +#include "crc.hpp" + +namespace tpms { + +Timestamp Packet::received_at() const { + return packet_.timestamp(); +} + +ManchesterFormatted Packet::symbols_formatted() const { + return format_manchester(decoder_); +} + +Optional Packet::reading(const SignalType signal_type) const { + if( signal_type == SignalType::FLM ) { + const auto length = crc_valid_length(); + + switch(length) { + case 64: + return Reading { + Reading::Type::FLM_64, + reader_.read(0, 32), + Pressure { static_cast(reader_.read(32, 8)) * 4 / 3 }, + Temperature { static_cast(reader_.read(40, 8) & 0x7f) - 50 } + }; + + case 72: + return Reading { + Reading::Type::FLM_72, + reader_.read(0, 32), + Pressure { static_cast(reader_.read(40, 8)) * 4 / 3 }, + Temperature { static_cast(reader_.read(48, 8)) - 50 } + }; + + case 80: + return Reading { + Reading::Type::FLM_80, + reader_.read(8, 32), + Pressure { static_cast(reader_.read(48, 8)) * 4 / 3 }, + Temperature { static_cast(reader_.read(56, 8)) - 50 } + }; + + default: + return { }; + } + } + + if( signal_type == SignalType::Subaru ) { + return Reading { + Reading::Type::SUB_35, + reader_.read(3, 25), + Pressure { static_cast(reader_.read(28, 8)) } + }; + } + + if( signal_type == SignalType::GMC ) { + return Reading { + Reading::Type::GMC_96, + reader_.read(20, 32), + Pressure { static_cast(reader_.read(52, 8)) } + }; + } + + return { }; +} + +size_t Packet::crc_valid_length() const { + constexpr uint32_t checksum_bytes = 0b1111111; + constexpr uint32_t crc_72_bytes = 0b111111111; + constexpr uint32_t crc_80_bytes = 0b1111111110; + + std::array bytes; + for(size_t i=0; i crc_72 { 0x01, 0x00 }; + CRC<8> crc_80 { 0x01, 0x00 }; + + for(size_t i=0; i +#include + +#include "optional.hpp" + +#include "units.hpp" +using units::Temperature; +using units::Pressure; + +#include "baseband_packet.hpp" +#include "manchester.hpp" +#include "field_reader.hpp" + +namespace tpms { + +enum SignalType : uint32_t { + FLM = 1, + Subaru = 2, + GMC = 3, +}; + +class TransponderID { +public: + constexpr TransponderID( + ) : id_ { 0 } + { + } + + constexpr TransponderID( + const uint32_t id + ) : id_ { id } + { + } + + constexpr uint32_t value() const { + return id_; + } + +private: + uint32_t id_; +}; + +class Reading { +public: + enum Type { + None = 0, + FLM_64 = 1, + FLM_72 = 2, + FLM_80 = 3, + SUB_35 = 4, + GMC_96 = 5, + }; + + constexpr Reading( + ) : type_ { Type::None } + { + } + + constexpr Reading( + Type type, + TransponderID id + ) : type_ { type }, + id_ { id } + { + } + + constexpr Reading( + Type type, + TransponderID id, + Optional pressure = { }, + Optional temperature = { } + ) : type_ { type }, + id_ { id }, + pressure_ { pressure }, + temperature_ { temperature } + { + } + + Type type() const { + return type_; + } + + TransponderID id() const { + return id_; + } + + Optional pressure() const { + return pressure_; + } + + Optional temperature() const { + return temperature_; + } + +private: + Type type_ { Type::None }; + TransponderID id_ { 0 }; + Optional pressure_ { }; + Optional temperature_ { }; +}; + +class Packet { +public: + constexpr Packet( + const baseband::Packet& packet + ) : packet_ { packet }, + decoder_ { packet_, 0 }, + reader_ { decoder_ } + { + } + + Timestamp received_at() const; + + ManchesterFormatted symbols_formatted() const; + + Optional reading(const SignalType signal_type) const; + +private: + using Reader = FieldReader; + + const baseband::Packet packet_; + const ManchesterDecoder decoder_; + + const Reader reader_; + + size_t crc_valid_length() const; +}; + +} /* namespace tpms */ + +#endif/*__TPMS_PACKET_H__*/ diff --git a/firmware/common/ui.hpp b/firmware/common/ui.hpp index 035b4b8a..e04db97e 100644 --- a/firmware/common/ui.hpp +++ b/firmware/common/ui.hpp @@ -36,13 +36,7 @@ struct Color { ) : v { 0 } { } -/* - explicit constexpr Color( - const uint32_t value - ) : v { static_cast(value) } - { - } -*/ + constexpr Color( uint8_t r, uint8_t g, @@ -96,14 +90,13 @@ struct Color { return { 204, 0, 102 }; } }; -#if 0 -enum class CardinalDirection : uint8_t { - West, - South, - North, - East, + +struct ColorRGB888 { + uint8_t r; + uint8_t g; + uint8_t b; }; -#endif + struct Point { Coord x; Coord y; @@ -139,41 +132,6 @@ struct Point { y += p.y; return *this; } -#if 0 - uint32_t magnitude_squared() const { - return (x * x) + (y * y); - } - - CardinalDirection cardinal_direction() const { - /* TODO: Doesn't handle 0,0 */ - - const auto rotated = sloppy_rotate_by_45_degrees(); - - if( rotated.x > 0 ) { - if( rotated.y > 0 ) { - return CardinalDirection::East; - } else { - // y<=0 - return CardinalDirection::North; - } - } else { - // x<=0 - if( rotated.y > 0 ) { - return CardinalDirection::South; - } else { - return CardinalDirection::West; - } - } - } - -private: - Point sloppy_rotate_by_45_degrees() const { - /* Clockwise rotate (in screen coordinates), with a gain in - * magnitude of sqrt(2). - */ - return { x - y, x + y }; - } -#endif }; struct Size { @@ -224,7 +182,6 @@ struct Rect { size(size) { } - int top() const { return pos.y; diff --git a/firmware/common/ui_focus.cpp b/firmware/common/ui_focus.cpp index c1d0ed12..08310039 100644 --- a/firmware/common/ui_focus.cpp +++ b/firmware/common/ui_focus.cpp @@ -49,9 +49,6 @@ void FocusManager::set_focus_widget(Widget* const new_focus_widget) { // return; // } if( !new_focus_widget->focusable() ) { - // New widget is not focusable. Does it have a preferred child that - // can receive focus? - set_focus_widget(new_focus_widget->last_child_focus()); return; } } @@ -67,7 +64,6 @@ void FocusManager::set_focus_widget(Widget* const new_focus_widget) { if( focus_widget() ) { focus_widget()->on_focus(); focus_widget()->set_dirty(); - focus_widget()->parent()->set_last_child_focus(focus_widget()); } } diff --git a/firmware/common/ui_widget.cpp b/firmware/common/ui_widget.cpp index d6f60650..12169334 100644 --- a/firmware/common/ui_widget.cpp +++ b/firmware/common/ui_widget.cpp @@ -28,8 +28,10 @@ bool is_dirty() { /* Widget ****************************************************************/ +const std::vector Widget::no_children { }; + Point Widget::screen_pos() { - return parent() ? (parent()->screen_pos() + parent_rect.pos) : parent_rect.pos; + return screen_rect().pos; } Size Widget::size() const { @@ -112,19 +114,14 @@ bool Widget::focusable() const { return flags.focusable; } +void Widget::set_focusable(const bool value) { + flags.focusable = value; +} + bool Widget::has_focus() { return (context().focus_manager().focus_widget() == this); } -Widget* Widget::last_child_focus() const { - return nullptr; -} - -void Widget::set_last_child_focus(Widget* const child) { - // Ignore. - (void)child; -} - bool Widget::on_key(const KeyEvent event) { (void)event; return false; @@ -140,8 +137,8 @@ bool Widget::on_touch(const TouchEvent event) { return false; } -const std::vector Widget::children() const { - return { }; +const std::vector& Widget::children() const { + return no_children; } Context& Widget::context() const { @@ -182,6 +179,14 @@ void Widget::visible(bool v) { } } +bool Widget::highlighted() const { + return flags.highlighted; +} + +void Widget::set_highlighted(const bool value) { + flags.highlighted = value; +} + void Widget::dirty_overlapping_children_in_rect(const Rect& child_rect) { for(auto child : children()) { if( !child_rect.intersect(child->parent_rect).is_empty() ) { @@ -192,11 +197,6 @@ void Widget::dirty_overlapping_children_in_rect(const Rect& child_rect) { /* View ******************************************************************/ -void View::set_parent_rect(const Rect new_parent_rect) { - Widget::set_parent_rect(new_parent_rect); - dirty_screen_rect += screen_rect(); -} - void View::paint(Painter& painter) { painter.fill_rectangle( screen_rect(), @@ -223,22 +223,15 @@ void View::add_children(const std::vector& children) { void View::remove_child(Widget* const widget) { if( widget ) { children_.erase(std::remove(children_.begin(), children_.end(), widget), children_.end()); - dirty_screen_rect += widget->screen_rect(); + dirty_overlapping_children_in_rect(widget->screen_rect()); widget->set_parent(nullptr); - if( dirty_screen_rect ) { - set_dirty(); - } } } -const std::vector View::children() const { +const std::vector& View::children() const { return children_; } -Widget* View::initial_focus() { - return nullptr; -} - std::string View::title() const { return ""; }; @@ -441,7 +434,7 @@ Button::Button( ) : Widget { parent_rect }, text_ { text } { - flags.focusable = true; + set_focusable(true); } void Button::set_text(const std::string value) { @@ -456,7 +449,7 @@ std::string Button::text() const { void Button::paint(Painter& painter) { const auto r = screen_rect(); - const auto paint_style = (has_focus() || flags.highlighted) ? style().invert() : style(); + const auto paint_style = (has_focus() || highlighted()) ? style().invert() : style(); painter.draw_rectangle(r, style().foreground); @@ -492,13 +485,13 @@ bool Button::on_key(const KeyEvent key) { bool Button::on_touch(const TouchEvent event) { switch(event.type) { case TouchEvent::Type::Start: - flags.highlighted = true; + set_highlighted(true); set_dirty(); return true; case TouchEvent::Type::End: - flags.highlighted = false; + set_highlighted(false); set_dirty(); if( on_select ) { on_select(*this); @@ -575,7 +568,7 @@ void Image::set_background(const Color color) { void Image::paint(Painter& painter) { if( bitmap_ ) { // Code also handles ImageButton behavior. - const bool selected = (has_focus() || flags.highlighted); + const bool selected = (has_focus() || highlighted()); painter.draw_bitmap( screen_pos(), *bitmap_, @@ -596,7 +589,7 @@ ImageButton::ImageButton( const Color background ) : Image { parent_rect, bitmap, foreground, background } { - flags.focusable = true; + set_focusable(true); } bool ImageButton::on_key(const KeyEvent key) { @@ -613,13 +606,13 @@ bool ImageButton::on_key(const KeyEvent key) { bool ImageButton::on_touch(const TouchEvent event) { switch(event.type) { case TouchEvent::Type::Start: - flags.highlighted = true; + set_highlighted(true); set_dirty(); return true; case TouchEvent::Type::End: - flags.highlighted = false; + set_highlighted(false); set_dirty(); if( on_select ) { on_select(*this); @@ -641,7 +634,7 @@ OptionsField::OptionsField( length_ { length }, options { options } { - flags.focusable = true; + set_focusable(true); } size_t OptionsField::selected_index() const { @@ -722,7 +715,7 @@ NumberField::NumberField( length_ { length }, fill_char { fill_char } { - flags.focusable = true; + set_focusable(true); } int32_t NumberField::value() const { diff --git a/firmware/common/ui_widget.hpp b/firmware/common/ui_widget.hpp index 6c2ca658..f154b86b 100644 --- a/firmware/common/ui_widget.hpp +++ b/firmware/common/ui_widget.hpp @@ -83,9 +83,8 @@ public: virtual void blur(); virtual void on_blur(); bool focusable() const; + void set_focusable(const bool value); bool has_focus(); - virtual Widget* last_child_focus() const; - virtual void set_last_child_focus(Widget* const child); virtual void paint(Painter& painter) = 0; @@ -95,7 +94,7 @@ public: virtual bool on_key(const KeyEvent event); virtual bool on_encoder(const EncoderEvent event); virtual bool on_touch(const TouchEvent event); - virtual const std::vector children() const; + virtual const std::vector& children() const; virtual Context& context() const; @@ -110,7 +109,13 @@ public: void visible(bool v); + bool highlighted() const; + void set_highlighted(const bool value); + protected: + void dirty_overlapping_children_in_rect(const Rect& child_rect); + +private: /* Widget rectangle relative to parent pos(). */ Rect parent_rect; const Style* style_ { nullptr }; @@ -132,7 +137,7 @@ protected: .visible = false, }; - void dirty_overlapping_children_in_rect(const Rect& child_rect); + static const std::vector no_children; }; class View : public Widget { @@ -146,22 +151,17 @@ public: // TODO: ~View() should on_hide() all children? - void set_parent_rect(const Rect new_parent_rect) override; - void paint(Painter& painter) override; void add_child(Widget* const widget); void add_children(const std::vector& children); void remove_child(Widget* const widget); - const std::vector children() const override; - - virtual Widget* initial_focus(); + const std::vector& children() const override; virtual std::string title() const; protected: std::vector children_; - Rect dirty_screen_rect; void invalidate_child(Widget* const widget); }; diff --git a/firmware/common/utility.cpp b/firmware/common/utility.cpp index b09cf357..b29a9b74 100644 --- a/firmware/common/utility.cpp +++ b/firmware/common/utility.cpp @@ -22,7 +22,6 @@ #include "utility.hpp" #include -#include #if 0 uint32_t gcd(const uint32_t u, const uint32_t v) { @@ -60,11 +59,36 @@ uint32_t gcd(const uint32_t u, const uint32_t v) { } #endif -float complex16_mag_squared_to_dbv_norm(const float c16_mag_squared) { - constexpr float mag2_max = -32768.0f * -32768.0f + -32768.0f * -32768.0f; - constexpr float mag2_log10_max = std::log10(mag2_max); - constexpr float mag2_to_db_factor = 20.0f / 2.0f; - return (std::log10(c16_mag_squared) - mag2_log10_max) * mag2_to_db_factor; +float fast_log2(const float val) { + // Thank you Stack Overflow! + // http://stackoverflow.com/questions/9411823/fast-log2float-x-implementation-c + union { + float val; + int32_t x; + } u = { val }; + float log_2 = (((u.x >> 23) & 255) - 128); + u.x &= ~(255 << 23); + u.x += (127 << 23); + log_2 += ((-0.34484843f) * u.val + 2.02466578f) * u.val - 0.67487759f; + return log_2; +} + +float fast_pow2(const float val) { + union { + float f; + uint32_t n; + } u; + u.n = val * 8388608 + (0x3f800000 - 60801 * 8); + return u.f; +} + +float mag2_to_dbv_norm(const float mag2) { + constexpr float mag2_log2_max = 0.0f; //std::log2(1.0f); + constexpr float log_mag2_mag_factor = 0.5f; + constexpr float log2_log10_factor = 0.3010299956639812f; //std::log10(2.0f); + constexpr float log10_dbv_factor = 20.0f; + constexpr float mag2_to_db_factor = log_mag2_mag_factor * log2_log10_factor * log10_dbv_factor; + return (fast_log2(mag2) - mag2_log2_max) * mag2_to_db_factor; } /* GCD implementation derived from recursive implementation at diff --git a/firmware/common/utility.hpp b/firmware/common/utility.hpp index 2a2dc9f4..c6cfab94 100644 --- a/firmware/common/utility.hpp +++ b/firmware/common/utility.hpp @@ -61,7 +61,18 @@ inline constexpr T pow(const T base, unsigned const exponent) { return (exponent == 0) ? 1 : (base * pow(base, exponent - 1)); } -float complex16_mag_squared_to_dbv_norm(const float c16_mag_squared); +constexpr bool power_of_two(const size_t n) { + return (n & (n - 1)) == 0; +} + +constexpr size_t log_2(const size_t n, const size_t p = 0) { + return (n <= 1) ? p : log_2(n / 2, p + 1); +} + +float fast_log2(const float val); +float fast_pow2(const float val); + +float mag2_to_dbv_norm(const float mag2); inline float magnitude_squared(const std::complex c) { const auto r = c.real();